about summary refs log tree commit diff
path: root/assets/src/network/transfer/transfer.ts
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-07-08 23:29:20 +0200
committerMelonai <einebeere@gmail.com>2021-07-08 23:29:20 +0200
commitc3b05a72b7185112ece6e42c99e9a828c8298f04 (patch)
tree317da6fbe640ffa57cf771b4b9e3b0beb80e836c /assets/src/network/transfer/transfer.ts
parent9d8ca2a653661560f471d717d188e92a79edb250 (diff)
downloadrook-c3b05a72b7185112ece6e42c99e9a828c8298f04.tar.zst
rook-c3b05a72b7185112ece6e42c99e9a828c8298f04.zip
State display for incoming and own requests
Diffstat (limited to 'assets/src/network/transfer/transfer.ts')
-rw-r--r--assets/src/network/transfer/transfer.ts44
1 files changed, 36 insertions, 8 deletions
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index 976d113..7641c17 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -1,18 +1,22 @@
+import { Writable, writable } from "svelte/store";
+import type { IncomingRequest } from "../../models/incoming_request";
+import type { OwnRequest } from "../../models/own_request";
 import type { UnregisterHandler } from "../channel/messages/handler";
 import type {
     RequestIceCandidateMessage,
     ShareIceCandidateMessage,
 } from "../channel/messages/messages";
 
-export enum TransferType {
-    OFFER,
-    ANSWER,
+export enum TransferState {
+    CONNECTING,
+    TRANSFERRING,
+    DONE,
 }
 
 export type Transfer = {
     pc: RTCPeerConnection;
     channel: RTCDataChannel;
-    type: TransferType;
+    state: Writable<TransferState>;
 };
 
 const servers = {
@@ -28,24 +32,48 @@ const servers = {
 };
 
 export function createTransfer(
-    type: TransferType,
-    onChannel: (channel: RTCDataChannel) => void
+    onChannel: (channel: RTCDataChannel, completeTransfer: () => void) => void
 ): Transfer {
     const pc = new RTCPeerConnection(servers);
     const channel = pc.createDataChannel("channel", {
         negotiated: true,
         id: 0,
     });
+    const state = writable(TransferState.CONNECTING);
 
-    channel.onopen = () => onChannel(channel);
+    channel.onopen = () => {
+        state.set(TransferState.TRANSFERRING);
+        const completeTransfer = () => state.set(TransferState.DONE);
+        onChannel(channel, completeTransfer);
+    };
 
     return {
         pc,
         channel,
-        type,
+        state,
     };
 }
 
+export function bindTransfer(
+    request: OwnRequest | IncomingRequest,
+    transferPromise: Promise<Transfer>,
+    onTransferComplete: () => void
+) {
+    transferPromise.then(transfer => {
+        request.transfer = transfer;
+
+        const unsubsribe = transfer.state.subscribe(transferState => {
+            if (transferState === TransferState.DONE) {
+                unsubsribe();
+                // Once the data has been transferred we can remove the transfer
+                request.transfer = null;
+
+                onTransferComplete();
+            }
+        });
+    });
+}
+
 export function onIncomingIceCandidate(
     transfer: Transfer,
     message: ShareIceCandidateMessage | RequestIceCandidateMessage