From c575119a90a028dd109434a4b8889adceac3df93 Mon Sep 17 00:00:00 2001 From: Melonai Date: Fri, 4 Jun 2021 19:42:42 +0200 Subject: Signaling event processing --- assets/src/network/channel/connection.ts | 2 ++ assets/src/network/channel/messages/handler.ts | 49 +++++++++++++++++--------- assets/src/network/channel/request.ts | 10 +++++- assets/src/network/channel/share.ts | 28 +++++++++++++-- 4 files changed, 70 insertions(+), 19 deletions(-) (limited to 'assets/src/network/channel') diff --git a/assets/src/network/channel/connection.ts b/assets/src/network/channel/connection.ts index 59eb633..e1ed2d1 100644 --- a/assets/src/network/channel/connection.ts +++ b/assets/src/network/channel/connection.ts @@ -54,6 +54,8 @@ export async function start(type: Type.REQUEST | Type.SHARE) { type === Type.SHARE ? await startShare(connection) : await startRequest(connection); + + updateState(ConnectionState.CONNECTED) } export function send(event: string, data: any): Push { diff --git a/assets/src/network/channel/messages/handler.ts b/assets/src/network/channel/messages/handler.ts index f7a00d2..cc8f005 100644 --- a/assets/src/network/channel/messages/handler.ts +++ b/assets/src/network/channel/messages/handler.ts @@ -1,4 +1,4 @@ -import { getChannel } from "../connection"; +import type { Channel } from "phoenix"; import type { AnyMessage } from "./messages"; export type Handlers = { @@ -14,7 +14,10 @@ export type TokenHandler = { [token: string]: Handler; }; -export type Handler = (message?: Message) => void; +export type Handler = ( + message?: Message, + unregister?: UnregisterHandler +) => void; export type UnregisterHandler = () => void; @@ -45,17 +48,12 @@ export function registerTokenHandler( const directHandlers = eventHandler.directHandlers; directHandlers.push(handler); - unregister = () => { - const index = directHandlers.findIndex(h => h === handler); - directHandlers.splice(index, 1); - }; + unregister = makeDirectUnregister(directHandlers, handler); } else { const tokenHandler = eventHandler.tokenHandler; tokenHandler[token] = handler; - unregister = () => { - delete tokenHandler[token]; - }; + unregister = makeTokenUnregister(tokenHandler, token); } return unregister; @@ -80,16 +78,35 @@ function handleEvent( if (message["token"] !== undefined) { const token = message["token"]; - const handler: Handler = eventHandler.tokenHandler[token]; + const tokenHandler = eventHandler.tokenHandler; + const handler: Handler = tokenHandler[token]; - if (handler === undefined) { - throw new Error("Received message for an unknown token."); + if (handler !== undefined) { + handler(message, makeTokenUnregister(tokenHandler, token)); } - - handler(message); } - for (const handler of eventHandler.directHandlers) { - handler(message); + const directHandlers = eventHandler.directHandlers; + for (const handler of directHandlers) { + handler(message, makeDirectUnregister(directHandlers, handler)); } } + +function makeDirectUnregister( + directHandlers: Handler[], + handler: Handler +): UnregisterHandler { + return () => { + const index = directHandlers.findIndex(h => h === handler); + directHandlers.splice(index, 1); + }; +} + +function makeTokenUnregister( + tokenHandler: TokenHandler, + token: string +): UnregisterHandler { + return () => { + delete tokenHandler[token]; + }; +} diff --git a/assets/src/network/channel/request.ts b/assets/src/network/channel/request.ts index dd18aab..f5145fb 100644 --- a/assets/src/network/channel/request.ts +++ b/assets/src/network/channel/request.ts @@ -1,5 +1,7 @@ import getShareToken from "../../utils/getShareToken"; -import type { Connection } from "./connection"; +import { answer } from "../transfer/transfer"; +import { Connection, on } from "./connection"; +import type { RequestAcceptedMessage } from "./messages/messages"; import { joinRequestChannel } from "./socket"; export async function startRequest(connection: Connection) { @@ -9,4 +11,10 @@ export async function startRequest(connection: Connection) { getShareToken() ); connection.channel = requestChannel; + + on("request_accepted", onRequestAccepted); +} + +async function onRequestAccepted(message: RequestAcceptedMessage) { + await answer(message); } diff --git a/assets/src/network/channel/share.ts b/assets/src/network/channel/share.ts index f93e8cb..6dbf0cd 100644 --- a/assets/src/network/channel/share.ts +++ b/assets/src/network/channel/share.ts @@ -1,5 +1,10 @@ import requests from "../../stores/requests"; -import type { Connection } from "./connection"; +import { Connection, on, onWithToken } from "./connection"; +import type { UnregisterHandler } from "./messages/handler"; +import type { + NewRequestMessage, + RequestCancelledMessage, +} from "./messages/messages"; import { joinShareChannel } from "./socket"; export async function startShare(connection: Connection) { @@ -8,4 +13,23 @@ export async function startShare(connection: Connection) { connection.token ); connection.channel = shareChannel; -} \ No newline at end of file + + on("new_request", onNewRequest); +} + +function onNewRequest(message: NewRequestMessage) { + const token = message.token; + + requests.addRequest(token); + + onWithToken("request_cancelled", token, onRequestCancelled); +} + +function onRequestCancelled( + message: RequestCancelledMessage, + unregister: UnregisterHandler +) { + const token = message.token; + requests.removeRequest(token); + unregister(); +} -- cgit 1.4.1