diff options
Diffstat (limited to 'src/webrtc/opcodes/SelectProtocol.ts')
-rw-r--r-- | src/webrtc/opcodes/SelectProtocol.ts | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/webrtc/opcodes/SelectProtocol.ts b/src/webrtc/opcodes/SelectProtocol.ts new file mode 100644 index 00000000..913ddfff --- /dev/null +++ b/src/webrtc/opcodes/SelectProtocol.ts @@ -0,0 +1,44 @@ +import { Payload, Send, WebSocket } from "@fosscord/gateway"; +import { SelectProtocolSchema, validateSchema } from "@fosscord/util"; +import { endpoint, PublicIP, VoiceOPCodes } from "@fosscord/webrtc"; +import SemanticSDP from "semantic-sdp"; + +export async function onSelectProtocol(this: WebSocket, payload: Payload) { + const data = validateSchema("SelectProtocolSchema", payload.d) as SelectProtocolSchema; + + const offer = SemanticSDP.SDPInfo.parse("m=audio\n" + data.sdp!); + this.client.sdp!.setICE(offer.getICE()); + this.client.sdp!.setDTLS(offer.getDTLS()); + + const transport = endpoint.createTransport(this.client.sdp!); + this.client.transport = transport; + transport.setRemoteProperties(this.client.sdp!); + transport.setLocalProperties(this.client.sdp!); + + const dtls = transport.getLocalDTLSInfo(); + const ice = transport.getLocalICEInfo(); + const port = endpoint.getLocalPort(); + const fingerprint = dtls.getHash() + " " + dtls.getFingerprint(); + const candidates = transport.getLocalCandidates(); + const candidate = candidates[0]; + + const answer = `m=audio ${port} ICE/SDP +a=fingerprint:${fingerprint} +c=IN IP4 ${PublicIP} +a=rtcp:${port} +a=ice-ufrag:${ice.getUfrag()} +a=ice-pwd:${ice.getPwd()} +a=fingerprint:${fingerprint} +a=candidate:1 1 ${candidate.getTransport()} ${candidate.getFoundation()} ${candidate.getAddress()} ${candidate.getPort()} typ host +`; + + await Send(this, { + op: VoiceOPCodes.SELECT_PROTOCOL_ACK, + d: { + video_codec: "H264", + sdp: answer, + media_session_id: this.session_id, + audio_codec: "opus" + } + }); +} |