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/share_transfer.ts | |
| 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/share_transfer.ts')
| -rw-r--r-- | assets/src/network/transfer/share_transfer.ts | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/assets/src/network/transfer/share_transfer.ts b/assets/src/network/transfer/share_transfer.ts new file mode 100644 index 0000000..fc6df9c --- /dev/null +++ b/assets/src/network/transfer/share_transfer.ts @@ -0,0 +1,74 @@ +import { get } from "svelte/store"; +import dataStore from "../../stores/data"; +import { onWithToken, send } from "../channel/connection"; +import type { UnregisterHandler } from "../channel/messages/handler"; +import type { + RequestIceCandidateMessage, + ShareAcceptedMessage, +} from "../channel/messages/messages"; +import { + createTransfer, + onIncomingIceCandidate, + Transfer, + unregisterIceOnComplete, +} from "./transfer"; + +export async function createOfferTransfer( + request_token: string +): Promise<Transfer> { + const transfer = createTransfer(onChannel); + + const offer = await transfer.pc.createOffer(); + transfer.pc.setLocalDescription(offer); + + transfer.pc.onicecandidate = event => { + const candidate = event.candidate; + if (event.candidate !== null) { + send("ice_candidate", { candidate, token: request_token }); + } + }; + + send("accept_request", { + token: request_token, + sdp: offer.sdp, + type: offer.type, + }); + + onWithToken( + "share_accepted", + request_token, + (message: ShareAcceptedMessage, unregister) => + onShareAccepted(transfer, message, unregister) + ); + + return transfer; +} + +function onShareAccepted( + transfer: Transfer, + message: ShareAcceptedMessage, + unregister: UnregisterHandler +) { + const token = message.token; + + const answerDescription = new RTCSessionDescription(message); + transfer.pc.setRemoteDescription(answerDescription); + + const unregisterIce = onWithToken( + "ice_candidate", + token, + (message: RequestIceCandidateMessage) => + onIncomingIceCandidate(transfer, message) + ); + + unregisterIceOnComplete(transfer, unregisterIce); + + unregister(); +} + +function onChannel(channel: RTCDataChannel, completeTransfer: () => void) { + const data = get(dataStore).data; + channel.send(data); + // TODO: Add retransmission possibility in case of transfer failure? + completeTransfer(); +} |
