about summary refs log tree commit diff
path: root/assets/src/network/transfer/transfer.ts
blob: 26d2534728970885ab0496e2e9d7e78d1fde6b95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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("accept_share", {
        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,
    };
}