about summary refs log tree commit diff
path: root/assets/src/network/transfer/share_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/share_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/share_transfer.ts')
-rw-r--r--assets/src/network/transfer/share_transfer.ts74
1 files changed, 74 insertions, 0 deletions
diff --git a/assets/src/network/transfer/share_transfer.ts b/assets/src/network/transfer/share_transfer.ts
new file mode 100644
index 0000000..fc6df9c
--- /dev/null
+++ b/assets/src/network/transfer/share_transfer.ts
@@ -0,0 +1,74 @@
+import { get } from "svelte/store";
+import dataStore from "../../stores/data";
+import { onWithToken, send } from "../channel/connection";
+import type { UnregisterHandler } from "../channel/messages/handler";
+import type {
+    RequestIceCandidateMessage,
+    ShareAcceptedMessage,
+} from "../channel/messages/messages";
+import {
+    createTransfer,
+    onIncomingIceCandidate,
+    Transfer,
+    unregisterIceOnComplete,
+} from "./transfer";
+
+export async function createOfferTransfer(
+    request_token: string
+): Promise<Transfer> {
+    const transfer = createTransfer(onChannel);
+
+    const offer = await transfer.pc.createOffer();
+    transfer.pc.setLocalDescription(offer);
+
+    transfer.pc.onicecandidate = event => {
+        const candidate = event.candidate;
+        if (event.candidate !== null) {
+            send("ice_candidate", { candidate, token: request_token });
+        }
+    };
+
+    send("accept_request", {
+        token: request_token,
+        sdp: offer.sdp,
+        type: offer.type,
+    });
+
+    onWithToken(
+        "share_accepted",
+        request_token,
+        (message: ShareAcceptedMessage, unregister) =>
+            onShareAccepted(transfer, message, unregister)
+    );
+
+    return transfer;
+}
+
+function onShareAccepted(
+    transfer: Transfer,
+    message: ShareAcceptedMessage,
+    unregister: UnregisterHandler
+) {
+    const token = message.token;
+
+    const answerDescription = new RTCSessionDescription(message);
+    transfer.pc.setRemoteDescription(answerDescription);
+
+    const unregisterIce = onWithToken(
+        "ice_candidate",
+        token,
+        (message: RequestIceCandidateMessage) =>
+            onIncomingIceCandidate(transfer, message)
+    );
+
+    unregisterIceOnComplete(transfer, unregisterIce);
+
+    unregister();
+}
+
+function onChannel(channel: RTCDataChannel, completeTransfer: () => void) {
+    const data = get(dataStore).data;
+    channel.send(data);
+    // TODO: Add retransmission possibility in case of transfer failure?
+    completeTransfer();
+}