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/connection.ts | 69 ++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 assets/src/network/channel/connection.ts (limited to 'assets/src/network/channel/connection.ts') diff --git a/assets/src/network/channel/connection.ts b/assets/src/network/channel/connection.ts new file mode 100644 index 0000000..52d85d1 --- /dev/null +++ b/assets/src/network/channel/connection.ts @@ -0,0 +1,69 @@ +import { Channel, Push, Socket } from "phoenix"; +import { startRequest } from "./request"; +import { startShare } from "./share"; +import { connectSocket, fetchToken } from "./socket"; + +export enum Type { + NONE, + REQUEST, + SHARE, +} + +enum ConnectionState { + CONNECTING_SOCKET, + FETCHING_TOKEN, + CONNECTING_CHANNEL, + + CONNECTED, +} + +export type Connection = { + socket: Socket; + channel: Channel | null; + token: string | null; + state: ConnectionState; + type: Type; +}; + +const connection: Connection = { + socket: new Socket("/socket", {}), + channel: null, + token: null, + state: ConnectionState.CONNECTING_SOCKET, + type: Type.NONE, +}; + +export async function start(type: Type.REQUEST | Type.SHARE) { + connection.type = type; + + await connectSocket(connection.socket); + + updateState(ConnectionState.FETCHING_TOKEN); + connection.token = await fetchToken(connection.socket); + + updateState(ConnectionState.CONNECTING_CHANNEL); + type === Type.SHARE + ? await startShare(connection) + : await startRequest(connection); +} + +export function send(event: string, data: any): Push { + if (connection.state !== ConnectionState.CONNECTED) { + throw new Error("There is no connection yet."); + } + + return connection.channel.push(event, data); +} + +export function getOwnToken(): string { + if (connection.state <= ConnectionState.FETCHING_TOKEN) { + throw new Error("There is no token yet."); + } + + return connection.token; +} + +function updateState(state: ConnectionState) { + // TODO: Notify state listeners + connection.state = state; +} -- cgit 1.4.1