diff options
Diffstat (limited to 'assets/src')
| -rw-r--r-- | assets/src/network/transfer/transfer.ts | 63 |
1 files changed, 63 insertions, 0 deletions
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<Transfer> { + 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<Transfer> { + 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 |
