aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network/transfer
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-02-19 20:00:38 +0100
committerMel <einebeere@gmail.com>2022-02-19 20:00:38 +0100
commitbf1450799df0deb424a9675be89e13c29e3620d7 (patch)
tree6a5f2f7559c5946058deadf8375f6609485a3d3f /assets/src/network/transfer
parent5384c34952b031995ecb8aa58d72954b0c685e18 (diff)
downloadrook-bf1450799df0deb424a9675be89e13c29e3620d7.tar.zst
rook-bf1450799df0deb424a9675be89e13c29e3620d7.zip
Split state into stages to handle messages
Diffstat (limited to 'assets/src/network/transfer')
-rw-r--r--assets/src/network/transfer/request_transfer.ts33
-rw-r--r--assets/src/network/transfer/share_transfer.ts52
-rw-r--r--assets/src/network/transfer/transfer.ts46
3 files changed, 29 insertions, 102 deletions
diff --git a/assets/src/network/transfer/request_transfer.ts b/assets/src/network/transfer/request_transfer.ts
index e69a9a8..6e4b322 100644
--- a/assets/src/network/transfer/request_transfer.ts
+++ b/assets/src/network/transfer/request_transfer.ts
@@ -1,17 +1,13 @@
-import data from "../../stores/data";
-import { on, send } from "../channel/connection";
-import type { ShareIceCandidateMessage } from "../channel/messages/messages";
-import {
- createTransfer,
- onIncomingIceCandidate,
- Transfer,
- unregisterIceOnComplete,
-} from "./transfer";
+import data from "../../state/data";
+import type { Connection } from "../channel/connection";
+import { createTransfer, Transfer } from "./transfer";
-export async function createAnswerTransfer(
- offer: RTCSessionDescriptionInit
+export async function respondToOffer(
+ c: Connection,
+ offer: RTCSessionDescriptionInit,
+ onComplete: () => void
): Promise<Transfer> {
- const transfer = createTransfer(onChannel);
+ const transfer = createTransfer(c => onChannel(c, onComplete));
const offerDescription = new RTCSessionDescription(offer);
transfer.pc.setRemoteDescription(offerDescription);
@@ -22,19 +18,12 @@ export async function createAnswerTransfer(
transfer.pc.onicecandidate = event => {
const candidate = event.candidate;
if (event.candidate !== null) {
- send("ice_candidate", { candidate });
+ // TODO: Check whether transfer was cancelled
+ c.send("ice_candidate", { candidate });
}
};
- const unregisterIce = on(
- "share_ice_candidate",
- (message: ShareIceCandidateMessage) =>
- onIncomingIceCandidate(transfer, message)
- );
-
- unregisterIceOnComplete(transfer, unregisterIce);
-
- send("accept_share", {
+ c.send("accept_share", {
sdp: answer.sdp,
type: answer.type,
});
diff --git a/assets/src/network/transfer/share_transfer.ts b/assets/src/network/transfer/share_transfer.ts
index f641a56..85e67b0 100644
--- a/assets/src/network/transfer/share_transfer.ts
+++ b/assets/src/network/transfer/share_transfer.ts
@@ -1,22 +1,18 @@
import { get } from "svelte/store";
-import dataStore from "../../stores/data";
-import { onWithToken, send } from "../channel/connection";
-import type { UnregisterFn } from "../channel/messages/event_handler";
+import dataStore from "../../state/data";
+import type { Connection } from "../channel/connection";
import type {
RequestIceCandidateMessage,
ShareAcceptedMessage,
} from "../channel/messages/messages";
-import {
- createTransfer,
- onIncomingIceCandidate,
- Transfer,
- unregisterIceOnComplete,
-} from "./transfer";
+import { createTransfer, addRemoteIceCandidate, Transfer, TransferState } from "./transfer";
-export async function createOfferTransfer(
- request_token: string
+export async function createTranferAndSendOffer(
+ c: Connection,
+ request_token: string,
+ onComplete: () => void
): Promise<Transfer> {
- const transfer = createTransfer(onChannel);
+ const transfer = createTransfer(c => onChannel(c, onComplete));
const offer = await transfer.pc.createOffer();
transfer.pc.setLocalDescription(offer);
@@ -24,46 +20,26 @@ export async function createOfferTransfer(
transfer.pc.onicecandidate = event => {
const candidate = event.candidate;
if (event.candidate !== null) {
- send("ice_candidate", { candidate, token: request_token });
+ // TODO: Check whether transfer was cancelled and don't send if so.
+ c.send("ice_candidate", { candidate, token: request_token });
}
};
- send("accept_request", {
+ c.send("accept_request", {
token: request_token,
sdp: offer.sdp,
type: offer.type,
});
- const unregister: UnregisterFn = onWithToken(
- "share_accepted",
- request_token,
- (message: ShareAcceptedMessage) =>
- onShareAccepted(transfer, message, unregister)
- );
-
return transfer;
}
-function onShareAccepted(
+export function addRemoteDescription(
transfer: Transfer,
- message: ShareAcceptedMessage,
- unregister: UnregisterFn
+ session: RTCSessionDescriptionInit
) {
- const token = message.token;
-
- const answerDescription = new RTCSessionDescription(message);
+ const answerDescription = new RTCSessionDescription(session);
transfer.pc.setRemoteDescription(answerDescription);
-
- const unregisterIce = onWithToken(
- "request_ice_candidate",
- token,
- (message: RequestIceCandidateMessage) =>
- onIncomingIceCandidate(transfer, message)
- );
-
- unregisterIceOnComplete(transfer, unregisterIce);
-
- unregister();
}
function onChannel(channel: RTCDataChannel, completeTransfer: () => void) {
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index e950589..399250f 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -1,11 +1,4 @@
import { Writable, writable } from "svelte/store";
-import type { IncomingRequest } from "../../models/incoming_request";
-import type { OwnRequest } from "../../models/own_request";
-import type { UnregisterFn } from "../channel/messages/event_handler";
-import type {
- RequestIceCandidateMessage,
- ShareIceCandidateMessage,
-} from "../channel/messages/messages";
export enum TransferState {
CONNECTING,
@@ -49,6 +42,7 @@ export function createTransfer(
};
channel.onopen = () => {
+ console.log("Transfer channel open.");
state.set(TransferState.TRANSFERRING);
onChannel(channel, () => onTransferComplete(transfer));
};
@@ -56,43 +50,11 @@ export function createTransfer(
return transfer;
}
-export function bindTransfer(
- request: OwnRequest | IncomingRequest,
- transferPromise: Promise<Transfer>,
- completeTransfer: () => void
-) {
- transferPromise.then(transfer => {
- request.transfer = transfer;
-
- const unsubsribe = transfer.state.subscribe(transferState => {
- if (transferState === TransferState.DONE) {
- unsubsribe();
- // Once the data has been transferred we can remove the transfer
- request.transfer = null;
-
- completeTransfer();
- }
- });
- });
-}
-
-export function onIncomingIceCandidate(
+export function addRemoteIceCandidate(
transfer: Transfer,
- message: ShareIceCandidateMessage | RequestIceCandidateMessage
+ candidate: RTCIceCandidateInit
) {
- transfer.pc.addIceCandidate(message.candidate);
-}
-
-export function unregisterIceOnComplete(
- transfer: Transfer,
- unregister: UnregisterFn
-) {
- transfer.pc.onicegatheringstatechange = event => {
- const connection = event.target as any;
- if (connection.iceGatheringState === "complete") {
- unregister();
- }
- };
+ transfer.pc.addIceCandidate(candidate);
}
function onTransferComplete(transfer: Transfer) {