From 8f1f90c3e7d836a23f1cd09617c2a0fcfac3f3f4 Mon Sep 17 00:00:00 2001 From: Melonai Date: Mon, 31 May 2021 01:47:38 +0200 Subject: Socket connection with managed state --- assets/src/network/channel/socket.ts | 59 ++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 assets/src/network/channel/socket.ts (limited to 'assets/src/network/channel/socket.ts') 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 { + return new Promise((resolve, _reject) => { + socket.connect(); + socket.onOpen(() => { + resolve(); + }); + }); +} + +export function fetchToken(socket: Socket): Promise { + 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 { + return joinChannel(socket, `share:${token}`); +} + +export function joinRequestChannel( + socket: Socket, + request_token: string, + share_token: string +): Promise { + return joinChannel(socket, `request:${request_token}`, { + share: share_token, + }); +} + +function joinChannel( + socket: Socket, + topic: string, + opts?: object +): Promise { + 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)); + }); +} -- cgit 1.4.1