about summary refs log tree commit diff
path: root/assets/src/network/channel/socket.ts
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-05-31 01:47:38 +0200
committerMelonai <einebeere@gmail.com>2021-05-31 01:47:38 +0200
commit8f1f90c3e7d836a23f1cd09617c2a0fcfac3f3f4 (patch)
tree7359e054d13a054a661c1584dae20d0698fc4c84 /assets/src/network/channel/socket.ts
parente0cabfea7c7b442acd3636e7495958b87e253176 (diff)
downloadrook-8f1f90c3e7d836a23f1cd09617c2a0fcfac3f3f4.tar.zst
rook-8f1f90c3e7d836a23f1cd09617c2a0fcfac3f3f4.zip
Socket connection with managed state
Diffstat (limited to 'assets/src/network/channel/socket.ts')
-rw-r--r--assets/src/network/channel/socket.ts59
1 files changed, 59 insertions, 0 deletions
diff --git a/assets/src/network/channel/socket.ts b/assets/src/network/channel/socket.ts
new file mode 100644
index 0000000..7d14842
--- /dev/null
+++ b/assets/src/network/channel/socket.ts
@@ -0,0 +1,59 @@
+import type { Channel, Socket } from "phoenix";
+
+export function connectSocket(socket: Socket): Promise<void> {
+    return new Promise((resolve, _reject) => {
+        socket.connect();
+        socket.onOpen(() => {
+            resolve();
+        });
+    });
+}
+
+export function fetchToken(socket: Socket): Promise<string> {
+    let tokenChannel = socket.channel("token", {});
+    return new Promise((resolve, reject) => {
+        tokenChannel
+            .join()
+            .receive("ok", () => {
+                tokenChannel
+                    .push("get_token", {}, 5000)
+                    .receive("ok", ({ token }) => resolve(token))
+                    .receive("error", err => reject(err))
+                    .receive("timeout", err => reject(err));
+            })
+            .receive("error", err => reject(err));
+    });
+}
+
+export function joinShareChannel(
+    socket: Socket,
+    token: string
+): Promise<Channel> {
+    return joinChannel(socket, `share:${token}`);
+}
+
+export function joinRequestChannel(
+    socket: Socket,
+    request_token: string,
+    share_token: string
+): Promise<Channel> {
+    return joinChannel(socket, `request:${request_token}`, {
+        share: share_token,
+    });
+}
+
+function joinChannel(
+    socket: Socket,
+    topic: string,
+    opts?: object
+): Promise<Channel> {
+    let channel = socket.channel(topic, opts);
+
+    return new Promise((resolve, reject) => {
+        channel
+            .join()
+            .receive("ok", () => resolve(channel))
+            .receive("error", err => reject(err))
+            .receive("timeout", err => reject(err));
+    });
+}