aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network
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 /assets/src/network
parentf7b9594045cc8a77b622e4ddfadc5c2ccba85765 (diff)
downloadrook-d5f7201eb7b10826e77eccb33f9cca784261091f.tar.zst
rook-d5f7201eb7b10826e77eccb33f9cca784261091f.zip
Make connection an object and merge starts
Diffstat (limited to 'assets/src/network')
-rw-r--r--assets/src/network/channel/connection.ts146
-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, 80 insertions, 182 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: {},
-};
+ handler: MessageHandler<AnyMessage>;
-export async function start() {
- await connectSocket(connection.socket);
+ constructor() {
+ this.socket = new Socket("/socket", {});
+ this.channel = null;
+ this.token = null;
+ this.state = writable(ConnectionState.CONNECTING_SOCKET);
+ this.handler = {};
+ }
- updateState(ConnectionState.FETCHING_TOKEN);
- connection.token = await fetchToken(connection.socket);
+ async start(type: RookType) {
+ // Connect to server.
+ await connectSocket(this.socket);
- return connection;
-}
+ // Fetch token for connection.
+ this.updateState(ConnectionState.FETCHING_TOKEN);
+ this.token = await fetchTokenFromSocket(this.socket);
-export function send(event: string, data: any): Push {
- if (getState() !== ConnectionState.CONNECTED) {
- throw new Error("There is no connection yet.");
- }
+ // 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;
- return connection.channel.push(event, data);
-}
+ break;
+ case RookType.SHARE:
+ const shareChannel = await joinShareChannel(
+ this.socket,
+ this.token
+ );
+ this.channel = shareChannel;
-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
- );
-}
+ break;
+ }
-export function on<M extends AnyMessage>(
- event: M["event_name"],
- handler: HandlerFn<M>
-): UnregisterFn {
- return registerHandler(
- connection.handlers,
- connection.channel,
- event,
- handler
- );
-}
+ this.updateState(ConnectionState.CONNECTED);
+
+ // Setup up event handler.
+ this.channel.onMessage = (event, payload) => {
+ console.log(event, payload);
-export function getOwnToken(): string {
- if (getState() <= ConnectionState.FETCHING_TOKEN) {
- throw new Error("There is no token yet.");
+ const payloadWithEvent = { ...payload, event_name: event };
+ routeEventToHandler(event, payloadWithEvent, this.handler);
+ return payload;
+ };
}
- return connection.token;
-}
+ send(event: string, data: any): Push {
+ if (get(this.getState()) !== ConnectionState.CONNECTED) {
+ throw new Error("There is no connection yet.");
+ }
-export function getState(): ConnectionState {
- return get(connection.state);
-}
+ return this.channel.push(event, data);
+ }
-export function updateState(state: ConnectionState) {
- connection.state.set(state);
-}
+ getOwnToken(): string {
+ if (get(this.getState()) <= ConnectionState.FETCHING_TOKEN) {
+ throw new Error("There is no token yet.");
+ }
-export function getStateStore(): Readable<ConnectionState> {
- return connection.state;
+ return this.token;
+ }
+
+ getState(): Writable<ConnectionState> {
+ return this.state;
+ }
+
+ updateState(state: ConnectionState) {
+ this.state.set(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