From c3b05a72b7185112ece6e42c99e9a828c8298f04 Mon Sep 17 00:00:00 2001 From: Melonai Date: Thu, 8 Jul 2021 23:29:20 +0200 Subject: State display for incoming and own requests --- assets/src/network/transfer/request_transfer.ts | 51 +++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 assets/src/network/transfer/request_transfer.ts (limited to 'assets/src/network/transfer/request_transfer.ts') diff --git a/assets/src/network/transfer/request_transfer.ts b/assets/src/network/transfer/request_transfer.ts new file mode 100644 index 0000000..317f5e5 --- /dev/null +++ b/assets/src/network/transfer/request_transfer.ts @@ -0,0 +1,51 @@ +import data from "../../stores/data"; +import { on, send } from "../channel/connection"; +import type { RequestIceCandidateMessage } from "../channel/messages/messages"; +import { + createTransfer, + onIncomingIceCandidate, + Transfer, + unregisterIceOnComplete, +} from "./transfer"; + +export async function createAnswerTransfer( + offer: RTCSessionDescriptionInit +): Promise { + const transfer = createTransfer(onChannel); + + const offerDescription = new RTCSessionDescription(offer); + transfer.pc.setRemoteDescription(offerDescription); + + 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 }); + } + }; + + const unregisterIce = on( + "ice_candidate", + (message: RequestIceCandidateMessage) => + onIncomingIceCandidate(transfer, message) + ); + + unregisterIceOnComplete(transfer, unregisterIce); + + send("accept_share", { + sdp: answer.sdp, + type: answer.type, + }); + + return transfer; +} + +function onChannel(channel: RTCDataChannel, completeTransfer: () => void) { + channel.onmessage = event => { + data.set(event.data); + // TODO: Disconnect from channel + completeTransfer(); + }; +} -- cgit 1.4.1