Обработка WebRTC SDP/ICE

This commit is contained in:
RoyceDa
2026-03-14 15:28:24 +02:00
parent ca36a8d818
commit 2707bd2a39
3 changed files with 54 additions and 88 deletions

View File

@@ -1,86 +0,0 @@
import Packet from "../packet";
import Stream from "../stream";
export enum SignalType {
CALL = 0,
KEY_EXCHANGE = 1,
ACTIVE_CALL = 2,
END_CALL = 3
}
/**
* Пакет сигналинга, для сигналов WebRTC используется отдельный пакет 27 PacketWebRTCExchange
*/
export class PacketSignal extends Packet {
private src: string = "";
/**
* Назначение
*/
private dst: string = "";
/**
* Используется если SignalType == KEY_EXCHANGE, для идентификации сессии обмена ключами
*/
private sharedPublic: string = "";
private signalType: SignalType = SignalType.CALL;
public getPacketId(): number {
return 26;
}
public _receive(stream: Stream): void {
this.signalType = stream.readInt8();
this.src = stream.readString();
this.dst = stream.readString();
if(this.signalType == SignalType.KEY_EXCHANGE){
this.sharedPublic = stream.readString();
}
}
public _send(): Promise<Stream> | Stream {
const stream = new Stream();
stream.writeInt16(this.getPacketId());
stream.writeInt8(this.signalType);
stream.writeString(this.src);
stream.writeString(this.dst);
if(this.signalType == SignalType.KEY_EXCHANGE){
stream.writeString(this.sharedPublic);
}
return stream;
}
public setDst(dst: string) {
this.dst = dst;
}
public setSharedPublic(sharedPublic: string) {
this.sharedPublic = sharedPublic;
}
public setSignalType(signalType: SignalType) {
this.signalType = signalType;
}
public getDst(): string {
return this.dst;
}
public getSharedPublic(): string {
return this.sharedPublic;
}
public getSignalType(): SignalType {
return this.signalType;
}
public getSrc(): string {
return this.src;
}
public setSrc(src: string) {
this.src = src;
}
}

View File

@@ -0,0 +1,52 @@
import Packet from "../packet";
import Stream from "../stream";
export enum WebRTCSignalType {
OFFER = 0,
ANSWER = 1,
ICE_CANDIDATE = 2
}
/**
* Пакет для обмена сигналами WebRTC, такими как оффер, ответ и ICE кандидаты.
* Используется на стадии WEB_RTC_EXCHANGE в сигналинге звонков.
*/
export class PacketWebRTC extends Packet {
private signalType: WebRTCSignalType = WebRTCSignalType.OFFER;
private sdpOrCandidate: string = "";
public getPacketId(): number {
return 27;
}
public _receive(stream: Stream): void {
this.signalType = stream.readInt8();
this.sdpOrCandidate = stream.readString();
}
public _send(): Promise<Stream> | Stream {
let stream = new Stream();
stream.writeInt16(this.getPacketId());
stream.writeInt8(this.signalType);
stream.writeString(this.sdpOrCandidate);
return stream;
}
public setSignalType(type: WebRTCSignalType) {
this.signalType = type;
}
public getSignalType(): WebRTCSignalType {
return this.signalType;
}
public setSdpOrCandidate(data: string) {
this.sdpOrCandidate = data;
}
public getSdpOrCandidate(): string {
return this.sdpOrCandidate;
}
}

View File

@@ -25,7 +25,7 @@ import { PacketDeviceNew } from "./packets/packet.device.new";
import { PacketDeviceList } from "./packets/packet.device.list";
import { PacketDeviceResolve } from "./packets/packet.device.resolve";
import { PacketSync } from "./packets/packet.sync";
import { PacketSignal } from "./packets/packet.signal";
import { PacketSignalPeer } from "./packets/packet.signal.peer";
export default class Protocol extends EventEmitter {
private serverAddress: string;
@@ -126,7 +126,7 @@ export default class Protocol extends EventEmitter {
this._supportedPackets.set(0x17, new PacketDeviceList());
this._supportedPackets.set(0x18, new PacketDeviceResolve());
this._supportedPackets.set(25, new PacketSync());
this._supportedPackets.set(26, new PacketSignal());
this._supportedPackets.set(26, new PacketSignalPeer());
}
private _findWaiters(packetId: number): ((packet: Packet) => void)[] {