diff options
| author | Mel <einebeere@gmail.com> | 2022-02-19 19:46:36 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-02-19 19:58:30 +0100 |
| commit | d5f7201eb7b10826e77eccb33f9cca784261091f (patch) | |
| tree | 9b9bdfff59678d20bf57c2c6a873809df1a77284 /assets/src | |
| parent | f7b9594045cc8a77b622e4ddfadc5c2ccba85765 (diff) | |
| download | rook-d5f7201eb7b10826e77eccb33f9cca784261091f.tar.zst rook-d5f7201eb7b10826e77eccb33f9cca784261091f.zip | |
Make connection an object and merge starts
Diffstat (limited to 'assets/src')
| -rw-r--r-- | assets/src/network/channel/connection.ts | 150 | ||||
| -rw-r--r-- | assets/src/network/channel/request_connection.ts | 52 | ||||
| -rw-r--r-- | assets/src/network/channel/share_connection.ts | 62 | ||||
| -rw-r--r-- | assets/src/network/channel/socket.ts | 2 |
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 |
