48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
import type { ICandidateMessage, IAnswerMessage, IOfferMessage, IMessage } from "./messaging/IMessage";
|
|
import { MessageKind } from "./messaging/MessageKind";
|
|
import type { ISignalingClient } from "./interfaces/ISignalingClient";
|
|
|
|
export default class SignalingServer implements ISignalingClient {
|
|
private readonly _webSocket: WebSocket;
|
|
|
|
constructor(webSocket: WebSocket) {
|
|
this._webSocket = webSocket;
|
|
}
|
|
|
|
public on<T>(kind: MessageKind, callback: (message: IMessage<T>) => Promise<void>): void {
|
|
this._webSocket.addEventListener('message', (event) => {
|
|
const message = JSON.parse(event.data) as IMessage<T>;
|
|
|
|
if (message.type === kind) {
|
|
callback(message);
|
|
}
|
|
});
|
|
}
|
|
|
|
public async sendOffer(offer: RTCSessionDescriptionInit): Promise<void> {
|
|
const message: IOfferMessage = {
|
|
type: MessageKind.Offer,
|
|
payload: offer
|
|
};
|
|
|
|
this._webSocket.send(JSON.stringify(message));
|
|
}
|
|
|
|
public async sendAnswer(answer: RTCSessionDescriptionInit): Promise<void> {
|
|
const message: IAnswerMessage = {
|
|
type: MessageKind.Answer,
|
|
payload: answer
|
|
};
|
|
|
|
this._webSocket.send(JSON.stringify(message));
|
|
}
|
|
|
|
public async sendCandidate(candidate: RTCIceCandidateInit): Promise<void> {
|
|
const message: ICandidateMessage = {
|
|
type: MessageKind.Candidate,
|
|
payload: candidate
|
|
};
|
|
|
|
this._webSocket.send(JSON.stringify(message));
|
|
}
|
|
} |