about summary refs log tree commit diff
path: root/assets/src
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-07-31 14:42:22 +0200
committerMelonai <einebeere@gmail.com>2021-07-31 14:42:22 +0200
commit9408f96de539b603124d4df37f1b69c2dbe185c6 (patch)
tree1d090a3e2ac77207ff95e6a888cb10d4173a8c7a /assets/src
parente0bf750e836477a52ef7a1c79805ad7693335578 (diff)
downloadrook-9408f96de539b603124d4df37f1b69c2dbe185c6.tar.zst
rook-9408f96de539b603124d4df37f1b69c2dbe185c6.zip
Reregister unregistered token handlers on re-use
Diffstat (limited to 'assets/src')
-rw-r--r--assets/src/network/channel/messages/event_handler.ts21
-rw-r--r--assets/src/network/transfer/share_transfer.ts1
-rw-r--r--assets/src/network/transfer/transfer.ts25
3 files changed, 31 insertions, 16 deletions
diff --git a/assets/src/network/channel/messages/event_handler.ts b/assets/src/network/channel/messages/event_handler.ts
index 749f289..fe950ea 100644
--- a/assets/src/network/channel/messages/event_handler.ts
+++ b/assets/src/network/channel/messages/event_handler.ts
@@ -87,7 +87,9 @@ export function registerHandlerForSpecificToken<M extends TokenizedMessage>(
     token: string,
     handler: Handler<M>
 ): Unregister {
-    if (typeof eventHandler[event] === "undefined") {
+    const messageHandler = eventHandler[event];
+
+    if (typeof messageHandler === "undefined") {
         // TODO: Same as above, this should probably be valid.
         // @ts-ignore
         eventHandler[event] = {
@@ -96,10 +98,15 @@ export function registerHandlerForSpecificToken<M extends TokenizedMessage>(
         };
         // @ts-ignore
         registerNewEvent<M>(channel, eventHandler[event], event);
-    } else {
-        if (eventHandler[event].type === "single") {
-            throw new Error("Event already has a handler attached to it.");
-        }
+    } else if (
+        messageHandler.type === "token" &&
+        messageHandler.handler.size === 0
+    ) {
+        // If there is already a token handler with no token, we need to register the event again
+        // @ts-ignore
+        registerNewEvent<M>(channel, messageHandler, event);
+    } else if (messageHandler.type === "single") {
+        throw new Error("Event already has a handler attached to it.");
     }
 
     // @ts-ignore This shoudl be valid, as we derive the event name from the message type.
@@ -125,7 +132,9 @@ function registerNewEvent<M extends AnyMessage>(
     event: M["event_name"]
 ): Unregister {
     const callback = (data: M) => {
-        onEvent<M>(messageHandler, data);
+        // Add event_name to message, so the type definitions match
+        const message = { event_name: event, ...data };
+        onEvent<M>(messageHandler, message);
     };
 
     const ref = channel.on(event, callback);
diff --git a/assets/src/network/transfer/share_transfer.ts b/assets/src/network/transfer/share_transfer.ts
index 16ad68a..0f88e04 100644
--- a/assets/src/network/transfer/share_transfer.ts
+++ b/assets/src/network/transfer/share_transfer.ts
@@ -6,7 +6,6 @@ import type {
     RequestIceCandidateMessage,
     ShareAcceptedMessage,
 } from "../channel/messages/messages";
-import { connectSocket } from "../channel/socket";
 import {
     createTransfer,
     onIncomingIceCandidate,
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index a0df5bb..27182be 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -39,25 +39,27 @@ export function createTransfer(
         negotiated: true,
         id: 0,
     });
-    const state = writable(TransferState.CONNECTING);
 
-    channel.onopen = () => {
-        state.set(TransferState.TRANSFERRING);
-        const completeTransfer = () => state.set(TransferState.DONE);
-        onChannel(channel, completeTransfer);
-    };
+    const state = writable(TransferState.CONNECTING);
 
-    return {
+    const transfer = {
         pc,
         channel,
         state,
     };
+
+    channel.onopen = () => {
+        state.set(TransferState.TRANSFERRING);
+        onChannel(channel, () => onTransferComplete(transfer));
+    };
+
+    return transfer;
 }
 
 export function bindTransfer(
     request: OwnRequest | IncomingRequest,
     transferPromise: Promise<Transfer>,
-    onTransferComplete: () => void
+    completeTransfer: () => void
 ) {
     transferPromise.then(transfer => {
         request.transfer = transfer;
@@ -68,7 +70,7 @@ export function bindTransfer(
                 // Once the data has been transferred we can remove the transfer
                 request.transfer = null;
 
-                onTransferComplete();
+                completeTransfer();
             }
         });
     });
@@ -92,3 +94,8 @@ export function unregisterIceOnComplete(
         }
     };
 }
+
+function onTransferComplete(transfer: Transfer) {
+    transfer.state.set(TransferState.DONE);
+    transfer.pc.close();
+}