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-06-04 19:42:42 +0200
committerMelonai <einebeere@gmail.com>2021-06-04 19:42:42 +0200
commitc575119a90a028dd109434a4b8889adceac3df93 (patch)
treec20da8d479c2acae031b13fa23d2b0aed25a5d9b /assets/src/network/transfer/transfer.ts
parente6a567090d5e14605e6d4722fc51d7c56b9410ee (diff)
downloadrook-c575119a90a028dd109434a4b8889adceac3df93.tar.zst
rook-c575119a90a028dd109434a4b8889adceac3df93.zip
Signaling event processing
Diffstat (limited to 'assets/src/network/transfer/transfer.ts')
-rw-r--r--assets/src/network/transfer/transfer.ts82
1 files changed, 77 insertions, 5 deletions
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index 26d2534..1cc029b 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -1,4 +1,10 @@
-import { send } from "../channel/connection";
+import { onWithToken, send } from "../channel/connection";
+import type { UnregisterHandler } from "../channel/messages/handler";
+import type {
+    ShareAcceptedMessage,
+    RequestIceCandidateMessage,
+    ShareIceCandidateMessage,
+} from "../channel/messages/messages";
 
 export enum TransferType {
     OFFER,
@@ -11,20 +17,44 @@ export type Transfer = {
     type: TransferType;
 };
 
+const servers = {
+    iceServers: [
+        {
+            urls: [
+                "stun:stun1.l.google.com:19302",
+                "stun:stun2.l.google.com:19302",
+            ],
+        },
+    ],
+    iceCandidatePoolSize: 10,
+};
+
 export async function offer(request_token: string): Promise<Transfer> {
     const transfer = createTransfer(TransferType.OFFER);
 
     const offer = await transfer.pc.createOffer();
     transfer.pc.setLocalDescription(offer);
 
-    // TODO: Start waiting for remote answer
+    transfer.pc.onicecandidate = event => {
+        const candidate = event.candidate;
+        if (event.candidate !== null) {
+            send("ice_candidate", { candidate, token: request_token });
+        }
+    };
 
     send("accept_request", {
-        request: request_token,
+        token: request_token,
         sdp: offer.sdp,
         type: offer.type,
     });
 
+    onWithToken(
+        "share_accepted",
+        request_token,
+        (message: ShareAcceptedMessage, unregister) =>
+            onShareAccepted(transfer, message, unregister)
+    );
+
     return transfer;
 }
 
@@ -39,6 +69,13 @@ export async function answer(
     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 });
+        }
+    };
+
     send("accept_share", {
         sdp: offer.sdp,
         type: offer.type,
@@ -48,15 +85,50 @@ export async function answer(
 }
 
 function createTransfer(type: TransferType): Transfer {
-    const pc = new RTCPeerConnection(null);
+    const pc = new RTCPeerConnection(servers);
     const channel = pc.createDataChannel("channel", {
         negotiated: true,
         id: 0,
     });
 
+    channel.onopen = e => console.log("ooooyeeee");
+
     return {
         pc,
         channel,
         type,
     };
-}
\ No newline at end of file
+}
+
+function onShareAccepted(
+    transfer: Transfer,
+    message: ShareAcceptedMessage,
+    unregister: UnregisterHandler
+) {
+    const token = message.token;
+    transfer.pc.setRemoteDescription(message);
+
+    const unregisterIce = onWithToken(
+        "ice_candidate",
+        token,
+        (message: RequestIceCandidateMessage) =>
+            onIncomingIceCandidate(transfer, message)
+    );
+
+    transfer.pc.onicegatheringstatechange = event => {
+        const connection = event.target as any;
+        console.log(connection.iceGatheringState);
+        if (connection.iceGatheringState === "complete") {
+            unregisterIce();
+        }
+    };
+
+    unregister();
+}
+
+function onIncomingIceCandidate(
+    transfer: Transfer,
+    message: ShareIceCandidateMessage | RequestIceCandidateMessage
+) {
+    transfer.pc.addIceCandidate(message.candidate);
+}