diff options
Diffstat (limited to 'assets/src/network/transfer/transfer.ts')
| -rw-r--r-- | assets/src/network/transfer/transfer.ts | 82 |
1 files changed, 77 insertions, 5 deletions
diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts index 26d2534..1cc029b 100644 --- a/assets/src/network/transfer/transfer.ts +++ b/assets/src/network/transfer/transfer.ts @@ -1,4 +1,10 @@ -import { send } from "../channel/connection"; +import { onWithToken, send } from "../channel/connection"; +import type { UnregisterHandler } from "../channel/messages/handler"; +import type { + ShareAcceptedMessage, + RequestIceCandidateMessage, + ShareIceCandidateMessage, +} from "../channel/messages/messages"; export enum TransferType { OFFER, @@ -11,20 +17,44 @@ export type Transfer = { type: TransferType; }; +const servers = { + iceServers: [ + { + urls: [ + "stun:stun1.l.google.com:19302", + "stun:stun2.l.google.com:19302", + ], + }, + ], + iceCandidatePoolSize: 10, +}; + 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 + transfer.pc.onicecandidate = event => { + const candidate = event.candidate; + if (event.candidate !== null) { + send("ice_candidate", { candidate, token: request_token }); + } + }; send("accept_request", { - request: request_token, + token: request_token, sdp: offer.sdp, type: offer.type, }); + onWithToken( + "share_accepted", + request_token, + (message: ShareAcceptedMessage, unregister) => + onShareAccepted(transfer, message, unregister) + ); + return transfer; } @@ -39,6 +69,13 @@ export async function answer( const answer = await transfer.pc.createAnswer(); transfer.pc.setLocalDescription(answer); + transfer.pc.onicecandidate = event => { + const candidate = event.candidate; + if (event.candidate !== null) { + send("ice_candidate", { candidate }); + } + }; + send("accept_share", { sdp: offer.sdp, type: offer.type, @@ -48,15 +85,50 @@ export async function answer( } function createTransfer(type: TransferType): Transfer { - const pc = new RTCPeerConnection(null); + const pc = new RTCPeerConnection(servers); const channel = pc.createDataChannel("channel", { negotiated: true, id: 0, }); + channel.onopen = e => console.log("ooooyeeee"); + return { pc, channel, type, }; -} \ No newline at end of file +} + +function onShareAccepted( + transfer: Transfer, + message: ShareAcceptedMessage, + unregister: UnregisterHandler +) { + const token = message.token; + transfer.pc.setRemoteDescription(message); + + const unregisterIce = onWithToken( + "ice_candidate", + token, + (message: RequestIceCandidateMessage) => + onIncomingIceCandidate(transfer, message) + ); + + transfer.pc.onicegatheringstatechange = event => { + const connection = event.target as any; + console.log(connection.iceGatheringState); + if (connection.iceGatheringState === "complete") { + unregisterIce(); + } + }; + + unregister(); +} + +function onIncomingIceCandidate( + transfer: Transfer, + message: ShareIceCandidateMessage | RequestIceCandidateMessage +) { + transfer.pc.addIceCandidate(message.candidate); +} |
