about summary refs log tree commit diff
path: root/assets/src/network/transfer/request_transfer.ts
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network/transfer/request_transfer.ts')
-rw-r--r--assets/src/network/transfer/request_transfer.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/assets/src/network/transfer/request_transfer.ts b/assets/src/network/transfer/request_transfer.ts
new file mode 100644
index 0000000..317f5e5
--- /dev/null
+++ b/assets/src/network/transfer/request_transfer.ts
@@ -0,0 +1,51 @@
+import data from "../../stores/data";
+import { on, send } from "../channel/connection";
+import type { RequestIceCandidateMessage } from "../channel/messages/messages";
+import {
+    createTransfer,
+    onIncomingIceCandidate,
+    Transfer,
+    unregisterIceOnComplete,
+} from "./transfer";
+
+export async function createAnswerTransfer(
+    offer: RTCSessionDescriptionInit
+): Promise<Transfer> {
+    const transfer = createTransfer(onChannel);
+
+    const offerDescription = new RTCSessionDescription(offer);
+    transfer.pc.setRemoteDescription(offerDescription);
+
+    const answer = await transfer.pc.createAnswer();
+    transfer.pc.setLocalDescription(answer);
+
+    transfer.pc.onicecandidate = event => {
+        const candidate = event.candidate;
+        if (event.candidate !== null) {
+            send("ice_candidate", { candidate });
+        }
+    };
+
+    const unregisterIce = on(
+        "ice_candidate",
+        (message: RequestIceCandidateMessage) =>
+            onIncomingIceCandidate(transfer, message)
+    );
+
+    unregisterIceOnComplete(transfer, unregisterIce);
+
+    send("accept_share", {
+        sdp: answer.sdp,
+        type: answer.type,
+    });
+
+    return transfer;
+}
+
+function onChannel(channel: RTCDataChannel, completeTransfer: () => void) {
+    channel.onmessage = event => {
+        data.set(event.data);
+        // TODO: Disconnect from channel
+        completeTransfer();
+    };
+}