aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network/channel
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network/channel')
-rw-r--r--assets/src/network/channel/connection.ts2
-rw-r--r--assets/src/network/channel/messages/handler.ts49
-rw-r--r--assets/src/network/channel/request.ts10
-rw-r--r--assets/src/network/channel/share.ts28
4 files changed, 70 insertions, 19 deletions
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<Message extends AnyMessage> = {
[token: string]: Handler<Message>;
};
-export type Handler<Message extends AnyMessage> = (message?: Message) => void;
+export type Handler<Message extends AnyMessage> = (
+ message?: Message,
+ unregister?: UnregisterHandler
+) => void;
export type UnregisterHandler = () => void;
@@ -45,17 +48,12 @@ export function registerTokenHandler<Message extends AnyMessage>(
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<Message extends AnyMessage>(
if (message["token"] !== undefined) {
const token = message["token"];
- const handler: Handler<Message> = eventHandler.tokenHandler[token];
+ const tokenHandler = eventHandler.tokenHandler;
+ const handler: Handler<Message> = 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<Message extends AnyMessage>(
+ directHandlers: Handler<Message>[],
+ handler: Handler<Message>
+): UnregisterHandler {
+ return () => {
+ const index = directHandlers.findIndex(h => h === handler);
+ directHandlers.splice(index, 1);
+ };
+}
+
+function makeTokenUnregister<Message extends AnyMessage>(
+ tokenHandler: TokenHandler<Message>,
+ 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();
+}