UNPKG

@4players/odin

Version:

A cross-platform SDK enabling developers to integrate real-time VoIP chat technology into their projects

222 lines (221 loc) 6.53 kB
import { __awaiter } from "tslib"; import { OdinAudioService } from './audio'; import { OdinMedia } from './media'; /** * Class describing a single peer inside an `OdinRoom`. */ export class OdinPeer { /** * Creates a new `OdinPeer` instance. * * @param _id The ID of the new peer * @param _userId The user ID of the new peer * @param _remote Indicates, whether the peer is a remote peer or not * @ignore */ constructor(_roomStream, _id, _userId, _remote) { this._roomStream = _roomStream; this._id = _id; this._userId = _userId; this._remote = _remote; /** * An instance of `EventTarget` for handling events related to this peer. */ this._eventTarget = new EventTarget(); /** * Free media IDs available to this peer. */ this._freeMediaIds = []; /** * Map of currently active media instances associated with this peer. */ this._activeMedias = new Map(); /** * User data associated with the peer. */ this._data = new Uint8Array(); this._audioService = OdinAudioService.getInstance(); } /** * The ID of the peer. */ get id() { return this._id; } /** * The identifier of the peer. */ get userId() { return this._userId; } /** * Indicates, whether the peer is a remote peer or not. */ get remote() { return this._remote; } /** * A list of media instances owned by the peer. */ get medias() { return this._activeMedias; } /** * Set updated user data for the peer. */ set data(data) { this._data = data; } /** * The arbitrary user data of the peer. */ get data() { return this._data; } /** * An event target handler for the peer. * * @ignore */ get eventTarget() { return this._eventTarget; } /** * Set the list of media IDs assigned by the server. * * @ignore */ setFreeMediaIds(ids) { if (this._freeMediaIds.length > 0) return; this._freeMediaIds = ids; } /** * Creates a local media, configures audio capture/playback and returns the new `OdinMedia` instance. */ createMedia() { if (this._activeMedias.size > 0) { throw new Error('Unable to create new media; adding more than one media per local peer is currently not supported'); } const freeMediaId = this.takeFreeMedia(); if (!freeMediaId) throw new Error('Unable to create new media; no more media IDs available'); const newMedia = new OdinMedia(freeMediaId, this._id, false); this._activeMedias.set(newMedia.id, newMedia); return newMedia; } /** * Adds a media to the list of active medias and starts decoding. * * @param media The media instance to add */ addMedia(media) { this._activeMedias.set(media.id, media); } /** * Removes a media from the list of active medias and stops decoding. * * @param media The media instance to remove */ removeMedia(media) { var _a; media.stop(); (_a = this._audioService) === null || _a === void 0 ? void 0 : _a.unregisterMedia(media); this._activeMedias.delete(media.id); } /** * Removes a media from the list of active medias by the given ID and stops decoding. * * @param id The media ID to remove */ removeMediaById(id) { const media = this._activeMedias.get(id); if (media) { this.removeMedia(media); } } /** * Pops the next media from the free medias array. */ takeFreeMedia() { return this._freeMediaIds.pop(); } /** * Starts all active medias or a list of specific active medias. * * @param mediaIds Optional list of media IDs to start */ startMedias(mediaIds) { return __awaiter(this, void 0, void 0, function* () { if (mediaIds && mediaIds.length > 0) { for (const media of this._activeMedias) { if (media[0] in mediaIds) { yield media[1].start(); } } } else { for (const media of this._activeMedias) { yield media[1].start(); } } }); } /** * Stops all active medias or a list of specific active medias. * * @param mediaIds Optional list of media IDs to stop */ stopMedias(mediaIds) { return __awaiter(this, void 0, void 0, function* () { if (mediaIds && mediaIds.length > 0) { for (const media of this._activeMedias) { if (media[0] in mediaIds) { yield media[1].stop(); } } } else { for (const media of this._activeMedias) { yield media[1].stop(); } } }); } /** * Sends a message with arbitrary data to this peer. * * @param message Byte array of arbitrary data to send */ sendMessage(message) { var _a; return __awaiter(this, void 0, void 0, function* () { if (!message) return; yield ((_a = this._roomStream) === null || _a === void 0 ? void 0 : _a.request('SendMessage', { message, target_peer_ids: [this._id] })); }); } /** * Sends user data of the peer to the server. */ update() { var _a; return __awaiter(this, void 0, void 0, function* () { if (this._remote) { throw new Error('Failed to flush peer user data update; not allowed to update remote peer'); } yield ((_a = this._roomStream) === null || _a === void 0 ? void 0 : _a.request('UpdatePeer', { user_data: this._data, })); }); } /** * Registers to peer events from `IOdinPeerEvents`. * * @param eventName The name of the event to listen to * @param handler The callback to handle the event */ addEventListener(eventName, handler) { this._eventTarget.addEventListener(eventName, handler); } }