Обработка WebRTC SDP/ICE
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -25,7 +25,7 @@ import { PacketDeviceNew } from "./packets/packet.device.new";
|
|||||||
import { PacketDeviceList } from "./packets/packet.device.list";
|
import { PacketDeviceList } from "./packets/packet.device.list";
|
||||||
import { PacketDeviceResolve } from "./packets/packet.device.resolve";
|
import { PacketDeviceResolve } from "./packets/packet.device.resolve";
|
||||||
import { PacketSync } from "./packets/packet.sync";
|
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 {
|
export default class Protocol extends EventEmitter {
|
||||||
private serverAddress: string;
|
private serverAddress: string;
|
||||||
@@ -126,7 +126,7 @@ export default class Protocol extends EventEmitter {
|
|||||||
this._supportedPackets.set(0x17, new PacketDeviceList());
|
this._supportedPackets.set(0x17, new PacketDeviceList());
|
||||||
this._supportedPackets.set(0x18, new PacketDeviceResolve());
|
this._supportedPackets.set(0x18, new PacketDeviceResolve());
|
||||||
this._supportedPackets.set(25, new PacketSync());
|
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)[] {
|
private _findWaiters(packetId: number): ((packet: Packet) => void)[] {
|
||||||
|
|||||||
Reference in New Issue
Block a user