about summary refs log tree commit diff
path: root/assets/src/network/transfer/share.ts
diff options
context:
space:
mode:
authorMelonai <einebeere@gmail.com>2021-06-13 23:38:21 +0200
committerMelonai <einebeere@gmail.com>2021-06-13 23:38:21 +0200
commit29573488ada5c5b1f291f7b50dc5a7a7cf76fd29 (patch)
treec77e96c87680af172a25f95aa400bb873d3c7022 /assets/src/network/transfer/share.ts
parent30487265282a16cd5f711e6d10bf7c9e7fd0f12b (diff)
downloadrook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.tar.zst
rook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.zip
Send over data through channel
Diffstat (limited to 'assets/src/network/transfer/share.ts')
-rw-r--r--assets/src/network/transfer/share.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/assets/src/network/transfer/share.ts b/assets/src/network/transfer/share.ts
new file mode 100644
index 0000000..5e43df0
--- /dev/null
+++ b/assets/src/network/transfer/share.ts
@@ -0,0 +1,71 @@
+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,
+    TransferType,
+    unregisterIceOnComplete,
+} from "./transfer";
+
+export async function offer(request_token: string): Promise<Transfer> {
+    const transfer = createTransfer(TransferType.OFFER, 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) {
+    const data = get(dataStore).data;
+    channel.send(data);
+}