diff options
| author | Melonai <einebeere@gmail.com> | 2021-05-31 01:47:38 +0200 |
|---|---|---|
| committer | Melonai <einebeere@gmail.com> | 2021-05-31 01:47:38 +0200 |
| commit | 8f1f90c3e7d836a23f1cd09617c2a0fcfac3f3f4 (patch) | |
| tree | 7359e054d13a054a661c1584dae20d0698fc4c84 /assets/src/network/channel/socket.ts | |
| parent | e0cabfea7c7b442acd3636e7495958b87e253176 (diff) | |
| download | rook-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.ts | 59 |
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)); + }); +} |
