Files
webrtc-real-time-ip-phone/frontend-web-vanilla/src/SignalingServer.ts
2025-11-28 13:47:17 -05:00

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));
}
}