diff options
| author | Melonai <einebeere@gmail.com> | 2021-06-13 23:38:21 +0200 |
|---|---|---|
| committer | Melonai <einebeere@gmail.com> | 2021-06-13 23:38:21 +0200 |
| commit | 29573488ada5c5b1f291f7b50dc5a7a7cf76fd29 (patch) | |
| tree | c77e96c87680af172a25f95aa400bb873d3c7022 /assets/src | |
| parent | 30487265282a16cd5f711e6d10bf7c9e7fd0f12b (diff) | |
| download | rook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.tar.zst rook-29573488ada5c5b1f291f7b50dc5a7a7cf76fd29.zip | |
Send over data through channel
Diffstat (limited to 'assets/src')
| -rw-r--r-- | assets/src/components/share/Request.svelte | 2 | ||||
| -rw-r--r-- | assets/src/network/channel/request.ts | 2 | ||||
| -rw-r--r-- | assets/src/network/transfer/request.ts | 49 | ||||
| -rw-r--r-- | assets/src/network/transfer/share.ts | 71 | ||||
| -rw-r--r-- | assets/src/network/transfer/transfer.ts | 98 |
5 files changed, 129 insertions, 93 deletions
diff --git a/assets/src/components/share/Request.svelte b/assets/src/components/share/Request.svelte index 26002ae..17e8443 100644 --- a/assets/src/components/share/Request.svelte +++ b/assets/src/components/share/Request.svelte @@ -1,5 +1,5 @@ <script lang="ts"> - import { offer } from "../../network/transfer/transfer"; + import { offer } from "../../network/transfer/share"; export let token: string; diff --git a/assets/src/network/channel/request.ts b/assets/src/network/channel/request.ts index f5145fb..4a1c91f 100644 --- a/assets/src/network/channel/request.ts +++ b/assets/src/network/channel/request.ts @@ -1,5 +1,5 @@ import getShareToken from "../../utils/getShareToken"; -import { answer } from "../transfer/transfer"; +import { answer } from "../transfer/request"; import { Connection, on } from "./connection"; import type { RequestAcceptedMessage } from "./messages/messages"; import { joinRequestChannel } from "./socket"; diff --git a/assets/src/network/transfer/request.ts b/assets/src/network/transfer/request.ts new file mode 100644 index 0000000..920cd9a --- /dev/null +++ b/assets/src/network/transfer/request.ts @@ -0,0 +1,49 @@ +import { on, send } from "../channel/connection"; +import type { RequestIceCandidateMessage } from "../channel/messages/messages"; +import { + createTransfer, + onIncomingIceCandidate, + Transfer, + TransferType, + unregisterIceOnComplete, +} from "./transfer"; + +export async function answer( + offer: RTCSessionDescriptionInit +): Promise<Transfer> { + const transfer = createTransfer(TransferType.ANSWER, onChannel); + + const offerDescription = new RTCSessionDescription(offer); + transfer.pc.setRemoteDescription(offerDescription); + + 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 }); + } + }; + + const unregisterIce = on( + "ice_candidate", + (message: RequestIceCandidateMessage) => + onIncomingIceCandidate(transfer, message) + ); + + unregisterIceOnComplete(transfer, unregisterIce); + + send("accept_share", { + sdp: answer.sdp, + type: answer.type, + }); + + return transfer; +} + +function onChannel(channel: RTCDataChannel) { + channel.onmessage = event => { + console.log(event.data) + } +} diff --git a/assets/src/network/transfer/share.ts b/assets/src/network/transfer/share.ts new file mode 100644 index 0000000..5e43df0 --- /dev/null +++ b/assets/src/network/transfer/share.ts @@ -0,0 +1,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); +} diff --git a/assets/src/network/transfer/transfer.ts b/assets/src/network/transfer/transfer.ts index 25511d5..976d113 100644 --- a/assets/src/network/transfer/transfer.ts +++ b/assets/src/network/transfer/transfer.ts @@ -1,7 +1,5 @@ -import { on, onWithToken, send } from "../channel/connection"; import type { UnregisterHandler } from "../channel/messages/handler"; import type { - ShareAcceptedMessage, RequestIceCandidateMessage, ShareIceCandidateMessage, } from "../channel/messages/messages"; @@ -29,77 +27,17 @@ const servers = { 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); - - 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; -} - -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); - - transfer.pc.onicecandidate = event => { - const candidate = event.candidate; - if (event.candidate !== null) { - send("ice_candidate", { candidate }); - } - }; - - const unregisterIce = on( - "ice_candidate", - (message: RequestIceCandidateMessage) => - onIncomingIceCandidate(transfer, message) - ); - - unregisterIceOnComplete(transfer, unregisterIce); - - send("accept_share", { - sdp: answer.sdp, - type: answer.type, - }); - - return transfer; -} - -function createTransfer(type: TransferType): Transfer { +export function createTransfer( + type: TransferType, + onChannel: (channel: RTCDataChannel) => void +): Transfer { const pc = new RTCPeerConnection(servers); const channel = pc.createDataChannel("channel", { negotiated: true, id: 0, }); - // TODO: Send data after channel was opened. + channel.onopen = () => onChannel(channel); return { pc, @@ -108,36 +46,14 @@ function createTransfer(type: TransferType): 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 onIncomingIceCandidate( +export function onIncomingIceCandidate( transfer: Transfer, message: ShareIceCandidateMessage | RequestIceCandidateMessage ) { transfer.pc.addIceCandidate(message.candidate); } -function unregisterIceOnComplete( +export function unregisterIceOnComplete( transfer: Transfer, unregister: UnregisterHandler ) { |
