diff options
| author | Melonai <einebeere@gmail.com> | 2021-07-08 23:29:20 +0200 |
|---|---|---|
| committer | Melonai <einebeere@gmail.com> | 2021-07-08 23:29:20 +0200 |
| commit | c3b05a72b7185112ece6e42c99e9a828c8298f04 (patch) | |
| tree | 317da6fbe640ffa57cf771b4b9e3b0beb80e836c /assets/src/network/transfer | |
| parent | 9d8ca2a653661560f471d717d188e92a79edb250 (diff) | |
| download | rook-c3b05a72b7185112ece6e42c99e9a828c8298f04.tar.zst rook-c3b05a72b7185112ece6e42c99e9a828c8298f04.zip | |
State display for incoming and own requests
Diffstat (limited to 'assets/src/network/transfer')
| -rw-r--r-- | assets/src/network/transfer/request_transfer.ts (renamed from assets/src/network/transfer/request.ts) | 14 | ||||
| -rw-r--r-- | assets/src/network/transfer/share_transfer.ts (renamed from assets/src/network/transfer/share.ts) | 11 | ||||
| -rw-r--r-- | assets/src/network/transfer/transfer.ts | 44 |
3 files changed, 51 insertions, 18 deletions
diff --git a/assets/src/network/transfer/request.ts b/assets/src/network/transfer/request_transfer.ts index 920cd9a..317f5e5 100644 --- a/assets/src/network/transfer/request.ts +++ b/assets/src/network/transfer/request_transfer.ts @@ -1,17 +1,17 @@ +import data from "../../stores/data"; 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( +export async function createAnswerTransfer( offer: RTCSessionDescriptionInit ): Promise<Transfer> { - const transfer = createTransfer(TransferType.ANSWER, onChannel); + const transfer = createTransfer(onChannel); const offerDescription = new RTCSessionDescription(offer); transfer.pc.setRemoteDescription(offerDescription); @@ -42,8 +42,10 @@ export async function answer( return transfer; } -function onChannel(channel: RTCDataChannel) { +function onChannel(channel: RTCDataChannel, completeTransfer: () => void) { channel.onmessage = event => { - console.log(event.data) - } + data.set(event.data); + // TODO: Disconnect from channel + completeTransfer(); + }; } diff --git a/assets/src/network/transfer/share.ts b/assets/src/network/transfer/share_transfer.ts index 5e43df0..fc6df9c 100644 --- a/assets/src/network/transfer/share.ts +++ b/assets/src/network/transfer/share_transfer.ts @@ -10,12 +10,13 @@ import { createTransfer, onIncomingIceCandidate, Transfer, - TransferType, unregisterIceOnComplete, } from "./transfer"; -export async function offer(request_token: string): Promise<Transfer> { - const transfer = createTransfer(TransferType.OFFER, onChannel); +export async function createOfferTransfer( + request_token: string +): Promise<Transfer> { + const transfer = createTransfer(onChannel); const offer = await transfer.pc.createOffer(); transfer.pc.setLocalDescription(offer); @@ -65,7 +66,9 @@ function onShareAccepted( unregister(); } -function onChannel(channel: RTCDataChannel) { +function onChannel(channel: RTCDataChannel, completeTransfer: () => void) { const data = get(dataStore).data; channel.send(data); + // TODO: Add retransmission possibility in case of transfer failure? + completeTransfer(); } diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts index 976d113..7641c17 100644 --- a/assets/src/network/transfer/transfer.ts +++ b/assets/src/network/transfer/transfer.ts @@ -1,18 +1,22 @@ +import { Writable, writable } from "svelte/store"; +import type { IncomingRequest } from "../../models/incoming_request"; +import type { OwnRequest } from "../../models/own_request"; import type { UnregisterHandler } from "../channel/messages/handler"; import type { RequestIceCandidateMessage, ShareIceCandidateMessage, } from "../channel/messages/messages"; -export enum TransferType { - OFFER, - ANSWER, +export enum TransferState { + CONNECTING, + TRANSFERRING, + DONE, } export type Transfer = { pc: RTCPeerConnection; channel: RTCDataChannel; - type: TransferType; + state: Writable<TransferState>; }; const servers = { @@ -28,24 +32,48 @@ const servers = { }; export function createTransfer( - type: TransferType, - onChannel: (channel: RTCDataChannel) => void + onChannel: (channel: RTCDataChannel, completeTransfer: () => void) => void ): Transfer { const pc = new RTCPeerConnection(servers); const channel = pc.createDataChannel("channel", { negotiated: true, id: 0, }); + const state = writable(TransferState.CONNECTING); - channel.onopen = () => onChannel(channel); + channel.onopen = () => { + state.set(TransferState.TRANSFERRING); + const completeTransfer = () => state.set(TransferState.DONE); + onChannel(channel, completeTransfer); + }; return { pc, channel, - type, + state, }; } +export function bindTransfer( + request: OwnRequest | IncomingRequest, + transferPromise: Promise<Transfer>, + onTransferComplete: () => 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; + + onTransferComplete(); + } + }); + }); +} + export function onIncomingIceCandidate( transfer: Transfer, message: ShareIceCandidateMessage | RequestIceCandidateMessage |
