summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/api/socket.js
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-web/opendc-web-ui/src/api/socket.js')
-rw-r--r--opendc-web/opendc-web-ui/src/api/socket.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/opendc-web/opendc-web-ui/src/api/socket.js b/opendc-web/opendc-web-ui/src/api/socket.js
new file mode 100644
index 00000000..1c432167
--- /dev/null
+++ b/opendc-web/opendc-web-ui/src/api/socket.js
@@ -0,0 +1,50 @@
+import io from 'socket.io-client'
+import { getAuthToken } from '../auth/index'
+
+let socket
+let requestIdCounter = 0
+const callbacks = {}
+
+export function setupSocketConnection(onConnect) {
+ const apiUrl =
+ process.env.REACT_APP_API_BASE_URL ||
+ `${window.location.protocol}//${window.location.hostname}:${window.location.port}`
+
+ socket = io.connect(apiUrl)
+ socket.on('connect', onConnect)
+ socket.on('response', onSocketResponse)
+}
+
+export function sendSocketRequest(request, callback) {
+ if (!socket.connected) {
+ console.error('Attempted to send request over unconnected socket')
+ return
+ }
+
+ const newId = requestIdCounter++
+ callbacks[newId] = callback
+
+ request.id = newId
+ request.token = getAuthToken()
+
+ if (!request.isRootRoute) {
+ request.path = '/v2' + request.path
+ }
+
+ socket.emit('request', request)
+
+ if (process.env.NODE_ENV !== 'production') {
+ console.log('Sent socket request:', request)
+ }
+}
+
+function onSocketResponse(json) {
+ const response = JSON.parse(json)
+
+ if (process.env.NODE_ENV !== 'production') {
+ console.log('Received socket response:', response)
+ }
+
+ callbacks[response.id](response)
+ delete callbacks[response.id]
+}