about summary refs log tree commit diff
path: root/assets/src
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
parent30487265282a16cd5f711e6d10bf7c9e7fd0f12b (diff)
downloadrook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.tar.zst
rook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.zip
Send over data through channel
Diffstat (limited to 'assets/src')
-rw-r--r--assets/src/components/share/Request.svelte2
-rw-r--r--assets/src/network/channel/request.ts2
-rw-r--r--assets/src/network/transfer/request.ts49
-rw-r--r--assets/src/network/transfer/share.ts71
-rw-r--r--assets/src/network/transfer/transfer.ts98
5 files changed, 129 insertions, 93 deletions
diff --git a/assets/src/components/share/Request.svelte b/assets/src/components/share/Request.svelte
index 26002ae..17e8443 100644
--- a/assets/src/components/share/Request.svelte
+++ b/assets/src/components/share/Request.svelte
@@ -1,5 +1,5 @@
 <script lang="ts">
-    import { offer } from "../../network/transfer/transfer";
+    import { offer } from "../../network/transfer/share";
 
     export let token: string;
 
diff --git a/assets/src/network/channel/request.ts b/assets/src/network/channel/request.ts
index f5145fb..4a1c91f 100644
--- a/assets/src/network/channel/request.ts
+++ b/assets/src/network/channel/request.ts
@@ -1,5 +1,5 @@
 import getShareToken from "../../utils/getShareToken";
-import { answer } from "../transfer/transfer";
+import { answer } from "../transfer/request";
 import { Connection, on } from "./connection";
 import type { RequestAcceptedMessage } from "./messages/messages";
 import { joinRequestChannel } from "./socket";
diff --git a/assets/src/network/transfer/request.ts b/assets/src/network/transfer/request.ts
new file mode 100644
index 0000000..920cd9a
--- /dev/null
+++ b/assets/src/network/transfer/request.ts
@@ -0,0 +1,49 @@
+import { on, send } from "../channel/connection";
+import type { RequestIceCandidateMessage } from "../channel/messages/messages";
+import {
+    createTransfer,
+    onIncomingIceCandidate,
+    Transfer,
+    TransferType,
+    unregisterIceOnComplete,
+} from "./transfer";
+
+export async function answer(
+    offer: RTCSessionDescriptionInit
+): Promise<Transfer> {
+    const transfer = createTransfer(TransferType.ANSWER, 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) {
+    channel.onmessage = event => {
+        console.log(event.data)
+    }
+}
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);
+}
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index 25511d5..976d113 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -1,7 +1,5 @@
-import { on, onWithToken, send } from "../channel/connection";
 import type { UnregisterHandler } from "../channel/messages/handler";
 import type {
-    ShareAcceptedMessage,
     RequestIceCandidateMessage,
     ShareIceCandidateMessage,
 } from "../channel/messages/messages";
@@ -29,77 +27,17 @@ const servers = {
     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);
-
-    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;
-}
-
-export async function answer(
-    offer: RTCSessionDescriptionInit
-): Promise<Transfer> {
-    const transfer = createTransfer(TransferType.ANSWER);
-
-    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 createTransfer(type: TransferType): Transfer {
+export function createTransfer(
+    type: TransferType,
+    onChannel: (channel: RTCDataChannel) => void
+): Transfer {
     const pc = new RTCPeerConnection(servers);
     const channel = pc.createDataChannel("channel", {
         negotiated: true,
         id: 0,
     });
 
-    // TODO: Send data after channel was opened.
+    channel.onopen = () => onChannel(channel);
 
     return {
         pc,
@@ -108,36 +46,14 @@ function createTransfer(type: TransferType): 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 onIncomingIceCandidate(
+export function onIncomingIceCandidate(
     transfer: Transfer,
     message: ShareIceCandidateMessage | RequestIceCandidateMessage
 ) {
     transfer.pc.addIceCandidate(message.candidate);
 }
 
-function unregisterIceOnComplete(
+export function unregisterIceOnComplete(
     transfer: Transfer,
     unregister: UnregisterHandler
 ) {