about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-02-19 19:46:36 +0100
committerMel <einebeere@gmail.com>2022-02-19 19:58:30 +0100
commitd5f7201eb7b10826e77eccb33f9cca784261091f (patch)
tree9b9bdfff59678d20bf57c2c6a873809df1a77284
parentf7b9594045cc8a77b622e4ddfadc5c2ccba85765 (diff)
downloadrook-d5f7201eb7b10826e77eccb33f9cca784261091f.tar.zst
rook-d5f7201eb7b10826e77eccb33f9cca784261091f.zip
Make connection an object and merge starts
-rw-r--r--assets/src/network/channel/connection.ts150
-rw-r--r--assets/src/network/channel/request_connection.ts52
-rw-r--r--assets/src/network/channel/share_connection.ts62
-rw-r--r--assets/src/network/channel/socket.ts2
4 files changed, 82 insertions, 184 deletions
diff --git a/assets/src/network/channel/connection.ts b/assets/src/network/channel/connection.ts
index 04ff6e8..8b49388 100644
--- a/assets/src/network/channel/connection.ts
+++ b/assets/src/network/channel/connection.ts
@@ -1,14 +1,18 @@
 import { Channel, Push, Socket } from "phoenix";
 import { get, Readable, writable, Writable } from "svelte/store";
+import { RookType } from "../../models/rook_type";
+import getShareToken from "../../utils/getShareToken";
+import type { AnyMessage } from "./messages/messages";
 import {
-    HandlerFn,
-    EventHandler,
-    registerHandlerForSpecificToken,
-    UnregisterFn,
-    registerHandler,
-} from "./messages/event_handler";
-import type { AnyMessage, TokenizedMessage } from "./messages/messages";
-import { connectSocket, fetchToken } from "./socket";
+    MessageHandler,
+    routeEventToHandler,
+} from "./messages/message_handler";
+import {
+    connectSocket,
+    fetchTokenFromSocket,
+    joinRequestChannel,
+    joinShareChannel,
+} from "./socket";
 
 export enum ConnectionState {
     CONNECTING_SOCKET,
@@ -18,81 +22,89 @@ export enum ConnectionState {
     CONNECTED,
 }
 
-export type Connection = {
+export class Connection {
     socket: Socket;
     channel: Channel | null;
     token: string | null;
     state: Writable<ConnectionState>;
-    handlers: EventHandler;
-};
-
-const connection: Connection = {
-    socket: new Socket("/socket", {}),
-    channel: null,
-    token: null,
-    state: writable(ConnectionState.CONNECTING_SOCKET),
-    handlers: {},
-};
 
-export async function start() {
-    await connectSocket(connection.socket);
+    handler: MessageHandler<AnyMessage>;
 
-    updateState(ConnectionState.FETCHING_TOKEN);
-    connection.token = await fetchToken(connection.socket);
-
-    return connection;
-}
+    constructor() {
+        this.socket = new Socket("/socket", {});
+        this.channel = null;
+        this.token = null;
+        this.state = writable(ConnectionState.CONNECTING_SOCKET);
+        this.handler = {};
+    }
 
-export function send(event: string, data: any): Push {
-    if (getState() !== ConnectionState.CONNECTED) {
-        throw new Error("There is no connection yet.");
+    async start(type: RookType) {
+        // Connect to server.
+        await connectSocket(this.socket);
+
+        // Fetch token for connection.
+        this.updateState(ConnectionState.FETCHING_TOKEN);
+        this.token = await fetchTokenFromSocket(this.socket);
+
+        // Connect to the correct channel.
+        this.updateState(ConnectionState.CONNECTING_CHANNEL);
+        switch (type) {
+            case RookType.REQUEST:
+                const requestChannel = await joinRequestChannel(
+                    this.socket,
+                    this.token,
+                    getShareToken()
+                );
+                this.channel = requestChannel;
+
+                break;
+            case RookType.SHARE:
+                const shareChannel = await joinShareChannel(
+                    this.socket,
+                    this.token
+                );
+                this.channel = shareChannel;
+
+                break;
+        }
+
+        this.updateState(ConnectionState.CONNECTED);
+
+        // Setup up event handler.
+        this.channel.onMessage = (event, payload) => {
+            console.log(event, payload);
+
+            const payloadWithEvent = { ...payload, event_name: event };
+            routeEventToHandler(event, payloadWithEvent, this.handler);
+            return payload;
+        };
     }
 
-    return connection.channel.push(event, data);
-}
+    send(event: string, data: any): Push {
+        if (get(this.getState()) !== ConnectionState.CONNECTED) {
+            throw new Error("There is no connection yet.");
+        }
 
-export function onWithToken<M extends TokenizedMessage>(
-    event: M["event_name"],
-    token: string | null,
-    handler: HandlerFn<M>
-): UnregisterFn {
-    return registerHandlerForSpecificToken(
-        connection.handlers,
-        connection.channel,
-        event,
-        token,
-        handler
-    );
-}
+        return this.channel.push(event, data);
+    }
 
-export function on<M extends AnyMessage>(
-    event: M["event_name"],
-    handler: HandlerFn<M>
-): UnregisterFn {
-    return registerHandler(
-        connection.handlers,
-        connection.channel,
-        event,
-        handler
-    );
-}
+    getOwnToken(): string {
+        if (get(this.getState()) <= ConnectionState.FETCHING_TOKEN) {
+            throw new Error("There is no token yet.");
+        }
 
-export function getOwnToken(): string {
-    if (getState() <= ConnectionState.FETCHING_TOKEN) {
-        throw new Error("There is no token yet.");
+        return this.token;
     }
 
-    return connection.token;
-}
-
-export function getState(): ConnectionState {
-    return get(connection.state);
-}
+    getState(): Writable<ConnectionState> {
+        return this.state;
+    }
 
-export function updateState(state: ConnectionState) {
-    connection.state.set(state);
-}
+    updateState(state: ConnectionState) {
+        this.state.set(state);
+    }
 
-export function getStateStore(): Readable<ConnectionState> {
-    return connection.state;
+    setChannelMessageHandler(handler: MessageHandler<AnyMessage>) {
+        this.handler = handler;
+    }
 }
diff --git a/assets/src/network/channel/request_connection.ts b/assets/src/network/channel/request_connection.ts
deleted file mode 100644
index aef5300..0000000
--- a/assets/src/network/channel/request_connection.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-import {
-    requestAccepted,
-    OwnRequest,
-    OwnRequestState,
-} from "../../models/own_request";
-import getShareToken from "../../utils/getShareToken";
-import { ConnectionState, on, start, updateState } from "./connection";
-import type {
-    RequestAcceptedMessage,
-    ShareCancelledMessage,
-} from "./messages/messages";
-import { joinRequestChannel } from "./socket";
-
-export async function startRequestConnection(ownRequest: OwnRequest) {
-    const connection = await start();
-
-    updateState(ConnectionState.CONNECTING_CHANNEL);
-
-    const requestChannel = await joinRequestChannel(
-        connection.socket,
-        connection.token,
-        getShareToken()
-    );
-    connection.channel = requestChannel;
-
-    on("request_accepted", (message: RequestAcceptedMessage) =>
-        onRequestAccepted(message, ownRequest)
-    );
-
-    on("new_request", (message) => {
-        message.event_name
-    });
-
-    on("share_cancelled", (message: ShareCancelledMessage) =>
-        onShareCancelled(message, ownRequest)
-    );
-
-    updateState(ConnectionState.CONNECTED);
-}
-
-// Events which can happen without prior triggers during a request's lifetime
-
-function onRequestAccepted(
-    message: RequestAcceptedMessage,
-    request: OwnRequest
-) {
-    requestAccepted(request, message);
-}
-
-function onShareCancelled(message: ShareCancelledMessage, request: OwnRequest) {
-    request.state.set(OwnRequestState.SHARE_CANCELLED);
-}
\ No newline at end of file
diff --git a/assets/src/network/channel/share_connection.ts b/assets/src/network/channel/share_connection.ts
deleted file mode 100644
index ac6dfbf..0000000
--- a/assets/src/network/channel/share_connection.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { newIncomingRequest } from "../../models/incoming_request";
-import requests from "../../stores/received_requests";
-import {
-    ConnectionState,
-    on,
-    onWithToken,
-    start,
-    updateState,
-} from "./connection";
-import type { UnregisterFn } from "./messages/event_handler";
-import type {
-    NewRequestMessage,
-    RequestCancelledMessage,
-} from "./messages/messages";
-import { joinShareChannel } from "./socket";
-
-export async function startShareConnection() {
-    const connection = await start();
-
-    updateState(ConnectionState.CONNECTING_CHANNEL);
-
-    const shareChannel = await joinShareChannel(
-        connection.socket,
-        connection.token
-    );
-    connection.channel = shareChannel;
-
-    on("new_request", onNewRequest);
-
-    updateState(ConnectionState.CONNECTED);
-}
-
-// Events which can happen without prior triggers during a share's lifetime
-
-function onNewRequest(message: NewRequestMessage) {
-    const token = message.token;
-
-    const request = newIncomingRequest(
-        token,
-        message.ip,
-        message.location,
-        message.client
-    );
-    requests.addRequest(request);
-
-    const unregister = onWithToken(
-        "request_cancelled",
-        token,
-        (message: RequestCancelledMessage) => {
-            onRequestCancelled(message, unregister);
-        }
-    );
-}
-
-function onRequestCancelled(
-    message: RequestCancelledMessage,
-    unregister: UnregisterFn
-) {
-    const token = message.token;
-    requests.removeRequest(token);
-    unregister();
-}
diff --git a/assets/src/network/channel/socket.ts b/assets/src/network/channel/socket.ts
index 9d95577..73414ca 100644
--- a/assets/src/network/channel/socket.ts
+++ b/assets/src/network/channel/socket.ts
@@ -9,7 +9,7 @@ export function connectSocket(socket: Socket): Promise<void> {
     });
 }
 
-export function fetchToken(socket: Socket): Promise<string> {
+export function fetchTokenFromSocket(socket: Socket): Promise<string> {
     let tokenChannel = socket.channel("token", {});
     return new Promise((resolve, reject) => {
         tokenChannel