aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network
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
parent30487265282a16cd5f711e6d10bf7c9e7fd0f12b (diff)
downloadrook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.tar.zst
rook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.zip
Send over data through channel
Diffstat (limited to 'assets/src/network')
-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
4 files changed, 128 insertions, 92 deletions
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
) {