From bf1450799df0deb424a9675be89e13c29e3620d7 Mon Sep 17 00:00:00 2001 From: Mel Date: Sat, 19 Feb 2022 20:00:38 +0100 Subject: Split state into stages to handle messages --- assets/src/network/transfer/request_transfer.ts | 35 ++++++----------- assets/src/network/transfer/share_transfer.ts | 52 +++++++------------------ assets/src/network/transfer/transfer.ts | 46 ++-------------------- 3 files changed, 30 insertions(+), 103 deletions(-) (limited to 'assets/src/network/transfer') 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"; - -export async function createAnswerTransfer( - offer: RTCSessionDescriptionInit +import data from "../../state/data"; +import type { Connection } from "../channel/connection"; +import { createTransfer, Transfer } from "./transfer"; + +export async function respondToOffer( + c: Connection, + offer: RTCSessionDescriptionInit, + onComplete: () => void ): Promise { - 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 { - 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, - 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) { -- cgit 1.4.1