From d22b90b715590e019f44cf8267565755f870f54b Mon Sep 17 00:00:00 2001 From: Melonai Date: Mon, 31 May 2021 01:51:57 +0200 Subject: WebRTC transfers --- assets/src/network/transfer/transfer.ts | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 assets/src/network/transfer/transfer.ts (limited to 'assets/src/network/transfer/transfer.ts') diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts new file mode 100644 index 0000000..80b6965 --- /dev/null +++ b/assets/src/network/transfer/transfer.ts @@ -0,0 +1,63 @@ +import { send } from "../channel/connection"; + +export enum TransferType { + OFFER, + ANSWER, +} + +export type Transfer = { + pc: RTCPeerConnection; + channel: RTCDataChannel; + type: TransferType; +}; + +export async function offer(request_token: string): Promise { + const transfer = createTransfer(TransferType.OFFER); + + const offer = await transfer.pc.createOffer(); + transfer.pc.setLocalDescription(offer); + + // TODO: Start waiting for remote answer + + send("accept_request", { + request: request_token, + sdp: offer.sdp, + type: offer.type, + }); + + return transfer; +} + +export async function answer( + offer: RTCSessionDescriptionInit +): Promise { + const transfer = createTransfer(TransferType.ANSWER); + + const offerDescription = new RTCSessionDescription(offer); + transfer.pc.setRemoteDescription(offerDescription); + + const answer = await transfer.pc.createAnswer(); + transfer.pc.setLocalDescription(answer); + + send("answer", { + sdp: offer.sdp, + type: offer.type, + }); + + + return transfer; +} + +function createTransfer(type: TransferType): Transfer { + const pc = new RTCPeerConnection(null); + const channel = pc.createDataChannel("channel", { + negotiated: true, + id: 0, + }); + + return { + pc, + channel, + type, + }; +} \ No newline at end of file -- cgit 1.4.1