aboutsummaryrefslogtreecommitdiff
path: root/assets/src/network/transfer
diff options
context:
space:
mode:
Diffstat (limited to 'assets/src/network/transfer')
-rw-r--r--assets/src/network/transfer/transfer.ts82
1 files changed, 77 insertions, 5 deletions
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts
index 26d2534..1cc029b 100644
--- a/assets/src/network/transfer/transfer.ts
+++ b/assets/src/network/transfer/transfer.ts
@@ -1,4 +1,10 @@
-import { send } from "../channel/connection";
+import { onWithToken, send } from "../channel/connection";
+import type { UnregisterHandler } from "../channel/messages/handler";
+import type {
+ ShareAcceptedMessage,
+ RequestIceCandidateMessage,
+ ShareIceCandidateMessage,
+} from "../channel/messages/messages";
export enum TransferType {
OFFER,
@@ -11,20 +17,44 @@ export type Transfer = {
type: TransferType;
};
+const servers = {
+ iceServers: [
+ {
+ urls: [
+ "stun:stun1.l.google.com:19302",
+ "stun:stun2.l.google.com:19302",
+ ],
+ },
+ ],
+ iceCandidatePoolSize: 10,
+};
+
export async function offer(request_token: string): Promise<Transfer> {
const transfer = createTransfer(TransferType.OFFER);
const offer = await transfer.pc.createOffer();
transfer.pc.setLocalDescription(offer);
- // TODO: Start waiting for remote answer
+ transfer.pc.onicecandidate = event => {
+ const candidate = event.candidate;
+ if (event.candidate !== null) {
+ send("ice_candidate", { candidate, token: request_token });
+ }
+ };
send("accept_request", {
- request: request_token,
+ token: request_token,
sdp: offer.sdp,
type: offer.type,
});
+ onWithToken(
+ "share_accepted",
+ request_token,
+ (message: ShareAcceptedMessage, unregister) =>
+ onShareAccepted(transfer, message, unregister)
+ );
+
return transfer;
}
@@ -39,6 +69,13 @@ export async function answer(
const answer = await transfer.pc.createAnswer();
transfer.pc.setLocalDescription(answer);
+ transfer.pc.onicecandidate = event => {
+ const candidate = event.candidate;
+ if (event.candidate !== null) {
+ send("ice_candidate", { candidate });
+ }
+ };
+
send("accept_share", {
sdp: offer.sdp,
type: offer.type,
@@ -48,15 +85,50 @@ export async function answer(
}
function createTransfer(type: TransferType): Transfer {
- const pc = new RTCPeerConnection(null);
+ const pc = new RTCPeerConnection(servers);
const channel = pc.createDataChannel("channel", {
negotiated: true,
id: 0,
});
+ channel.onopen = e => console.log("ooooyeeee");
+
return {
pc,
channel,
type,
};
-} \ No newline at end of file
+}
+
+function onShareAccepted(
+ transfer: Transfer,
+ message: ShareAcceptedMessage,
+ unregister: UnregisterHandler
+) {
+ const token = message.token;
+ transfer.pc.setRemoteDescription(message);
+
+ const unregisterIce = onWithToken(
+ "ice_candidate",
+ token,
+ (message: RequestIceCandidateMessage) =>
+ onIncomingIceCandidate(transfer, message)
+ );
+
+ transfer.pc.onicegatheringstatechange = event => {
+ const connection = event.target as any;
+ console.log(connection.iceGatheringState);
+ if (connection.iceGatheringState === "complete") {
+ unregisterIce();
+ }
+ };
+
+ unregister();
+}
+
+function onIncomingIceCandidate(
+ transfer: Transfer,
+ message: ShareIceCandidateMessage | RequestIceCandidateMessage
+) {
+ transfer.pc.addIceCandidate(message.candidate);
+}