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
63
64
65
66
67
68
69
70
71
|
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,
TransferType,
unregisterIceOnComplete,
} from "./transfer";
export async function offer(request_token: string): Promise<Transfer> {
const transfer = createTransfer(TransferType.OFFER, 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) {
const data = get(dataStore).data;
channel.send(data);
}
|