aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network')
-rw-r--r--assets/src/network/channel/request.ts24
-rw-r--r--assets/src/network/channel/request_connection.ts48
-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.ts44
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