diff options
Diffstat (limited to 'assets/src/network')
| -rw-r--r-- | assets/src/network/channel/request.ts | 24 | ||||
| -rw-r--r-- | assets/src/network/channel/request_connection.ts | 48 | ||||
| -rw-r--r-- | assets/src/network/channel/share_connection.ts (renamed from assets/src/network/channel/share.ts) | 14 | ||||
| -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 |
6 files changed, 109 insertions, 46 deletions
diff --git a/assets/src/network/channel/request.ts b/assets/src/network/channel/request.ts deleted file mode 100644 index 693e408..0000000 --- a/assets/src/network/channel/request.ts +++ /dev/null @@ -1,24 +0,0 @@ -import getShareToken from "../../utils/getShareToken"; -import { answer } from "../transfer/request"; -import { Connection, ConnectionState, on, updateState } from "./connection"; -import type { RequestAcceptedMessage } from "./messages/messages"; -import { joinRequestChannel } from "./socket"; - -export async function startRequest(connection: Connection) { - updateState(ConnectionState.CONNECTING_CHANNEL); - - const requestChannel = await joinRequestChannel( - connection.socket, - connection.token, - getShareToken() - ); - connection.channel = requestChannel; - - on("request_accepted", onRequestAccepted); - - updateState(ConnectionState.CONNECTED); -} - -async function onRequestAccepted(message: RequestAcceptedMessage) { - await answer(message); -} diff --git a/assets/src/network/channel/request_connection.ts b/assets/src/network/channel/request_connection.ts new file mode 100644 index 0000000..1b873d3 --- /dev/null +++ b/assets/src/network/channel/request_connection.ts @@ -0,0 +1,48 @@ +import { + requestAccepted, + OwnRequest, + OwnRequestState, +} from "../../models/own_request"; +import getShareToken from "../../utils/getShareToken"; +import { ConnectionState, on, start, updateState } from "./connection"; +import type { + RequestAcceptedMessage, + ShareCancelledMessage, +} from "./messages/messages"; +import { joinRequestChannel } from "./socket"; + +export async function startRequestConnection(ownRequest: OwnRequest) { + const connection = await start(); + + updateState(ConnectionState.CONNECTING_CHANNEL); + + const requestChannel = await joinRequestChannel( + connection.socket, + connection.token, + getShareToken() + ); + connection.channel = requestChannel; + + on("request_accepted", (message: RequestAcceptedMessage) => + onRequestAccepted(message, ownRequest) + ); + + on("share_cancelled", (message: ShareCancelledMessage) => + onShareCancelled(message, ownRequest) + ); + + updateState(ConnectionState.CONNECTED); +} + +// Events which can happen without prior triggers during a request's lifetime + +function onRequestAccepted( + message: RequestAcceptedMessage, + request: OwnRequest +) { + requestAccepted(request, message); +} + +function onShareCancelled(message: ShareCancelledMessage, request: OwnRequest) { + request.state.set(OwnRequestState.SHARE_CANCELLED); +} \ No newline at end of file diff --git a/assets/src/network/channel/share.ts b/assets/src/network/channel/share_connection.ts index 81942af..415cb7f 100644 --- a/assets/src/network/channel/share.ts +++ b/assets/src/network/channel/share_connection.ts @@ -1,9 +1,10 @@ -import requests from "../../stores/requests"; +import { newIncomingRequest } from "../../models/incoming_request"; +import requests from "../../stores/received_requests"; import { - Connection, ConnectionState, on, onWithToken, + start, updateState, } from "./connection"; import type { UnregisterHandler } from "./messages/handler"; @@ -13,7 +14,9 @@ import type { } from "./messages/messages"; import { joinShareChannel } from "./socket"; -export async function startShare(connection: Connection) { +export async function startShareConnection() { + const connection = await start(); + updateState(ConnectionState.CONNECTING_CHANNEL); const shareChannel = await joinShareChannel( @@ -27,10 +30,13 @@ export async function startShare(connection: Connection) { updateState(ConnectionState.CONNECTED); } +// Events which can happen without prior triggers during a share's lifetime + function onNewRequest(message: NewRequestMessage) { const token = message.token; - requests.addRequest(token); + const request = newIncomingRequest(token); + requests.addRequest(request); onWithToken("request_cancelled", token, onRequestCancelled); } 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 |
