From 6408d15e0f97f9763687626ac586b9a03d6e4b46 Mon Sep 17 00:00:00 2001 From: Faiq Naufal <43695578+faiq-naufal@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:29:30 +0700 Subject: [PATCH] fix: handle channel not found (#72) * feat: get client method to get client data * refactor: no longer importing node fetch * feat: get client response body type * fix: handle channel not found and update event names * refactor: change peer event names * doc: add get client method information * refactor: CHANNEL_CLOSED with reasons data * refactor: change peer event names * refactor: change closed to peer_closed event * refactor: move to dev dependencies --- package-lock.json | 56 ++++++------------- package.json | 6 +- packages/room/README.md | 4 ++ packages/room/api/api-types.d.ts | 16 ++++++ packages/room/api/api.js | 36 ++++++++++++ packages/room/api/fetcher.js | 15 ----- .../bandwidth-controller.js | 8 +-- packages/room/channel/channel-types.d.ts | 4 +- packages/room/channel/channel.js | 44 ++++++++++++--- packages/room/facade/facade.js | 9 +-- packages/room/peer/peer-types.d.ts | 4 +- packages/room/peer/peer.js | 8 +-- 12 files changed, 127 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe86ca95..4ceccfbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,11 +13,9 @@ "camelcase-keys": "^8.0.2", "lit": "^2.6.1", "lodash-es": "^4.17.21", - "mocha-explorer-launcher-scripts": "^0.4.0", "node-fetch": "^2.6.1", "shaka-player": "^4.3.4", - "snakecase-keys": "^5.4.4", - "tsc-files": "^1.1.3" + "snakecase-keys": "^5.4.4" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.4", @@ -42,6 +40,7 @@ "husky": "^8.0.1", "lint-staged": "^13.0.3", "mocha": "^10.0.0", + "mocha-explorer-launcher-scripts": "^0.4.0", "nock": "^13.2.9", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -50,6 +49,7 @@ "rollup-plugin-dts": "^6.0.1", "semantic-release": "^21.0.1", "sinon": "^14.0.0", + "tsc-files": "^1.1.3", "typescript": "^5.2.2" }, "engines": { @@ -620,11 +620,6 @@ "tslib": "^2.4.1" } }, - "node_modules/@fingerprintjs/fingerprintjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", @@ -2994,11 +2989,6 @@ "tslib": "^2.0.3" } }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -5001,11 +4991,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5406,6 +5391,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/mocha-explorer-launcher-scripts/-/mocha-explorer-launcher-scripts-0.4.0.tgz", "integrity": "sha512-cik/K4r+7WlhpzRmaecA5MWBPOgFRqCdZ95Tvbc5HBohj1I8vgRvBSfAIKdLVJes0PooFlrOzn7Alh4lEELSjg==", + "dev": true, "dependencies": { "vscode-test-adapter-remoting-util": "^0.13.0" } @@ -5519,11 +5505,6 @@ "tslib": "^2.0.3" } }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, "node_modules/nock": { "version": "13.2.9", "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.9.tgz", @@ -9823,12 +9804,6 @@ "tslib": "^2.1.0" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -10512,11 +10487,6 @@ "tslib": "^2.0.3" } }, - "node_modules/snake-case/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, "node_modules/snakecase-keys": { "version": "5.4.4", "resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-5.4.4.tgz", @@ -10619,6 +10589,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, "dependencies": { "through": "2" }, @@ -10904,7 +10875,8 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/through2": { "version": "4.0.2", @@ -10990,6 +10962,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/tsc-files/-/tsc-files-1.1.3.tgz", "integrity": "sha512-G6uXkTNofGU9EE1fYBaCpR72x/aqXW4PDAuznWj4JYlDwhcaKnUn4CiCHBMc89lDxLmikK+hhaEWLoTPEKKvXg==", + "dev": true, "bin": { "tsc-files": "lib/index.js" }, @@ -10997,6 +10970,11 @@ "typescript": ">=3" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -11043,6 +11021,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11164,6 +11143,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/vscode-test-adapter-api/-/vscode-test-adapter-api-1.9.0.tgz", "integrity": "sha512-lltjehUP0J9H3R/HBctjlqeUCwn2t9Lbhj2Y500ib+j5Y4H3hw+hVTzuSsfw16LtxY37knlU39QIlasa7svzOQ==", + "dev": true, "engines": { "vscode": "^1.23.0" } @@ -11172,17 +11152,13 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/vscode-test-adapter-remoting-util/-/vscode-test-adapter-remoting-util-0.13.0.tgz", "integrity": "sha512-7yI+A+v4K24j+X/pJLgIlAGCIY1tOs9B/lBpPXMvukfPSJibMGts5t2BNb2Kh1wLe2tJBOADs4pu5oWnXKPvzQ==", + "dev": true, "dependencies": { "split": "^1.0.1", "tslib": "^2.0.0", "vscode-test-adapter-api": "^1.9.0" } }, - "node_modules/vscode-test-adapter-remoting-util/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 2a4ba8f6..b7c858f7 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "husky": "^8.0.1", "lint-staged": "^13.0.3", "mocha": "^10.0.0", + "mocha-explorer-launcher-scripts": "^0.4.0", "nock": "^13.2.9", "nyc": "^15.1.0", "prettier": "^2.7.1", @@ -59,6 +60,7 @@ "rollup-plugin-dts": "^6.0.1", "semantic-release": "^21.0.1", "sinon": "^14.0.0", + "tsc-files": "^1.1.3", "typescript": "^5.2.2" }, "dependencies": { @@ -66,11 +68,9 @@ "camelcase-keys": "^8.0.2", "lit": "^2.6.1", "lodash-es": "^4.17.21", - "mocha-explorer-launcher-scripts": "^0.4.0", "node-fetch": "^2.6.1", "shaka-player": "^4.3.4", - "snakecase-keys": "^5.4.4", - "tsc-files": "^1.1.3" + "snakecase-keys": "^5.4.4" }, "engines": { "node": " >=14.16 || >=16.0.0" diff --git a/packages/room/README.md b/packages/room/README.md index 9da98ab1..ccdc31be 100644 --- a/packages/room/README.md +++ b/packages/room/README.md @@ -72,6 +72,10 @@ await room.endRoom(roomData.data.roomId); A method to create and register a new client to the room. It expects two parameters. The `roomId` is required. The second parameter is an optional config to set a custom client data. This method will return a promise. +- `room.getClient(roomId: string, clientId: string)` + + A method to get the client data. It expects a `roomId` and `clientId` as parameters. This method will return a promise. + - `room.setClientName(roomId: string, clientId: string, clientName: string)` A method to set a client name based on `clientId`. This is useful for setting a friendly name or label on a specific client. It requires `roomId`, `clientId` and `clientName` parameters to be set. This method will return a promise. diff --git a/packages/room/api/api-types.d.ts b/packages/room/api/api-types.d.ts index c889d13f..90371605 100644 --- a/packages/room/api/api-types.d.ts +++ b/packages/room/api/api-types.d.ts @@ -71,6 +71,22 @@ export declare namespace RoomAPIType { } } + type GetClientResponseBody = BaseResponseBody & { + data: { + id: string + name: string + peer_connection_state: RTCPeerConnectionState + ice_peer_connection_state: RTCIceConnectionState + events: { + [key: string]: { + name: string + timestamp: number + data: { [key: string]: string | null } + } + } + } + } + type SetClientNameResponse = BaseResponseBody & { data: { client_id: string diff --git a/packages/room/api/api.js b/packages/room/api/api.js index 5bcb913d..a5164a76 100644 --- a/packages/room/api/api.js +++ b/packages/room/api/api.js @@ -141,6 +141,41 @@ export const createApi = ({ fetcher }) => { return client } + /** + * @param {string} roomId + * @param {string} clientId + */ + getClient = async (roomId, clientId) => { + if (roomId.trim().length === 0) { + throw new Error('Room ID must be a valid string') + } + + if (clientId.trim().length === 0) { + throw new Error('Client ID must be a valid string') + } + + /** @type {import('./api-types.js').RoomAPIType.GetClientResponseBody} */ + const response = await this._fetcher.get( + `/rooms/${roomId}/client/${clientId}` + ) + + const data = response.data || {} + const events = data.events || {} + + return { + code: response.code || 500, + ok: response.ok || false, + message: response.message || '', + data: { + clientId: data.id || '', + clientName: data.name || '', + connectionState: data.peer_connection_state || '', + iceConnectionState: data.ice_peer_connection_state || '', + events: events, + }, + } + } + /** * * @param {string} roomId @@ -460,6 +495,7 @@ export const createApi = ({ fetcher }) => { createRoom: api.createRoom, getRoom: api.getRoom, registerClient: api.registerClient, + getClient: api.getClient, setClientName: api.setClientName, sendIceCandidate: api.sendIceCandidate, checkNegotiateAllowed: api.checkNegotiateAllowed, diff --git a/packages/room/api/fetcher.js b/packages/room/api/fetcher.js index 4c59e0c1..7c3665af 100644 --- a/packages/room/api/fetcher.js +++ b/packages/room/api/fetcher.js @@ -1,18 +1,3 @@ -import nodeFetch, { - Headers as NodeHeaders, - Request as NodeRequest, - Response as NodeResponse, -} from 'node-fetch' - -if (!('fetch' in globalThis)) { - Object.assign(globalThis, { - fetch: nodeFetch, - Headers: NodeHeaders, - Request: NodeRequest, - Response: NodeResponse, - }) -} - export const createFetcher = () => { const Fetcher = class { _baseUrl diff --git a/packages/room/bandwidth-controller/bandwidth-controller.js b/packages/room/bandwidth-controller/bandwidth-controller.js index 4a740988..1d147865 100644 --- a/packages/room/bandwidth-controller/bandwidth-controller.js +++ b/packages/room/bandwidth-controller/bandwidth-controller.js @@ -27,15 +27,15 @@ export class BandwidthController { this.#statsInterval = null this.#internalDataChannel = null - this.#event.on(PeerEvents.PEER_CONNECTED, this.#onPeerConnected) - this.#event.on(PeerEvents.PEER_DISCONNECTED, this.#onPeerDisconnected) + this.#event.on(PeerEvents.PEER_OPENED, this.#onPeerOpened) + this.#event.on(PeerEvents.PEER_CLOSED, this.#onPeerClosed) this.#event.on( PeerEvents._INTERNAL_DATACHANNEL_AVAILABLE, this.#onInternalDataChannelAvailable ) } - #onPeerConnected = () => { + #onPeerOpened = () => { if (this.#statsInterval) { clearInterval(this.#statsInterval) this.#statsInterval = null @@ -44,7 +44,7 @@ export class BandwidthController { this.#statsInterval = setInterval(this.#updateStats, 3000) } - #onPeerDisconnected = () => { + #onPeerClosed = () => { if (this.#statsInterval) { clearInterval(this.#statsInterval) this.#statsInterval = null diff --git a/packages/room/channel/channel-types.d.ts b/packages/room/channel/channel-types.d.ts index d3293bb9..e58512c3 100644 --- a/packages/room/channel/channel-types.d.ts +++ b/packages/room/channel/channel-types.d.ts @@ -17,8 +17,8 @@ export declare namespace RoomChannelType { } type ChannelEvents = { - CHANNEL_CONNECTED: 'channelConnected' - CHANNEL_DISCONNECTED: 'channelDisconnected' + CHANNEL_OPENED: 'channelOpened' + CHANNEL_CLOSED: 'channelClosed' } type TrackSource = { diff --git a/packages/room/channel/channel.js b/packages/room/channel/channel.js index 263fc45f..092ba489 100644 --- a/packages/room/channel/channel.js +++ b/packages/room/channel/channel.js @@ -2,8 +2,14 @@ import { PeerEvents } from '../peer/peer.js' /** @type {import('./channel-types.js').RoomChannelType.ChannelEvents} */ export const ChannelEvents = { - CHANNEL_CONNECTED: 'channelConnected', - CHANNEL_DISCONNECTED: 'channelDisconnected', + CHANNEL_OPENED: 'channelOpened', + CHANNEL_CLOSED: 'channelClosed', +} + +export const REASONS = { + PEER_CLOSED: 'peerClosed', + NOT_FOUND: 'notfound', + RECONNECT: 'reconnect', } /** @@ -35,8 +41,8 @@ export const createChannel = ({ api, event, peer, streams }) => { this._startTime = 0 this._reconnecting = false - this._event.on(PeerEvents.PEER_CONNECTED, this._onPeerConnected) - this._event.on(PeerEvents.PEER_DISCONNECTED, this._onPeerDisconnected) + this._event.on(PeerEvents.PEER_OPENED, this._onPeerOpened) + this._event.on(PeerEvents.PEER_CLOSED, this._onPeerClosed) } /** @@ -57,7 +63,6 @@ export const createChannel = ({ api, event, peer, streams }) => { this._startTime = Date.now() this._channel = channel this._addEventListener() - this._event.emit(ChannelEvents.CHANNEL_CONNECTED) } /** @@ -69,12 +74,12 @@ export const createChannel = ({ api, event, peer, streams }) => { this._removeEventListener() this._channel.close() this._channel = null - this._event.emit(ChannelEvents.CHANNEL_DISCONNECTED) } _addEventListener = () => { if (!this._channel) return + this._channel.addEventListener('open', this._onOpen) this._channel.addEventListener('error', this._onError) this._channel.addEventListener('candidate', this._onCandidate) this._channel.addEventListener('offer', this._onOffer) @@ -88,6 +93,7 @@ export const createChannel = ({ api, event, peer, streams }) => { _removeEventListener = () => { if (!this._channel) return + this._channel.removeEventListener('open', this._onOpen) this._channel.removeEventListener('error', this._onError) this._channel.removeEventListener('candidate', this._onCandidate) this._channel.removeEventListener('offer', this._onOffer) @@ -105,15 +111,32 @@ export const createChannel = ({ api, event, peer, streams }) => { ) { this._reconnecting = true this.disconnect() + this._event.emit(ChannelEvents.CHANNEL_CLOSED, { + reason: REASONS.RECONNECT, + }) this.connect(this._roomId, this._clientId) this._reconnecting = false } } - _onError = () => { + _onOpen = () => { + this._event.emit(ChannelEvents.CHANNEL_OPENED) + } + + _onError = async () => { const errorTime = Date.now() if (this._roomId && this._clientId) { + const response = await this._api.getClient(this._roomId, this._clientId) + + if (response.code === 404) { + this.disconnect() + this._event.emit(ChannelEvents.CHANNEL_CLOSED, { + reason: REASONS.NOT_FOUND, + }) + return + } + // Reconnect if (errorTime - this._startTime < 1000) { setTimeout(() => { @@ -128,7 +151,7 @@ export const createChannel = ({ api, event, peer, streams }) => { /** * @param {{ roomId: string, clientId: string }} data */ - _onPeerConnected = (data) => { + _onPeerOpened = (data) => { if (!data) { throw new Error('Channel failed to connect') } @@ -136,8 +159,11 @@ export const createChannel = ({ api, event, peer, streams }) => { this.connect(data.roomId, data.clientId) } - _onPeerDisconnected = () => { + _onPeerClosed = () => { this.disconnect() + this._event.emit(ChannelEvents.CHANNEL_CLOSED, { + reason: REASONS.PEER_CLOSED, + }) } /** diff --git a/packages/room/facade/facade.js b/packages/room/facade/facade.js index 828113b0..b61eedca 100644 --- a/packages/room/facade/facade.js +++ b/packages/room/facade/facade.js @@ -55,6 +55,7 @@ export const createFacade = ({ createRoom: api.createRoom, getRoom: api.getRoom, createClient: api.registerClient, + getClient: api.getClient, setClientName: api.setClientName, createPeer: /** @@ -70,10 +71,10 @@ export const createFacade = ({ leaveRoom: api.leaveRoom, endRoom: api.endRoom, event: Object.freeze({ - CHANNEL_CONNECTED: roomEvents.channel.CHANNEL_CONNECTED, - CHANNEL_DISCONNECTED: roomEvents.channel.CHANNEL_DISCONNECTED, - PEER_CONNECTED: roomEvents.peer.PEER_CONNECTED, - PEER_DISCONNECTED: roomEvents.peer.PEER_DISCONNECTED, + CHANNEL_OPENED: roomEvents.channel.CHANNEL_OPENED, + CHANNEL_CLOSED: roomEvents.channel.CHANNEL_CLOSED, + PEER_OPENED: roomEvents.peer.PEER_OPENED, + PEER_CLOSED: roomEvents.peer.PEER_CLOSED, STREAM_AVAILABLE: roomEvents.peer.STREAM_AVAILABLE, STREAM_REMOVED: roomEvents.peer.STREAM_REMOVED, }), diff --git a/packages/room/peer/peer-types.d.ts b/packages/room/peer/peer-types.d.ts index c5f861d3..d1f870db 100644 --- a/packages/room/peer/peer-types.d.ts +++ b/packages/room/peer/peer-types.d.ts @@ -39,8 +39,8 @@ export declare namespace RoomPeerType { } type PeerEvents = { - PEER_CONNECTED: 'peerConnected' - PEER_DISCONNECTED: 'peerDisconnected' + PEER_OPENED: 'peerOpened' + PEER_CLOSED: 'peerClosed' STREAM_AVAILABLE: 'streamAvailable' STREAM_REMOVED: 'streamRemoved' _STREAM_ADDED: 'streamAdded' diff --git a/packages/room/peer/peer.js b/packages/room/peer/peer.js index 15193012..5432276b 100644 --- a/packages/room/peer/peer.js +++ b/packages/room/peer/peer.js @@ -10,8 +10,8 @@ import { BandwidthController } from '../bandwidth-controller/bandwidth-controlle /** @type {import('./peer-types.js').RoomPeerType.PeerEvents} */ export const PeerEvents = { - PEER_CONNECTED: 'peerConnected', - PEER_DISCONNECTED: 'peerDisconnected', + PEER_OPENED: 'peerOpened', + PEER_CLOSED: 'peerClosed', STREAM_AVAILABLE: 'streamAvailable', STREAM_REMOVED: 'streamRemoved', _STREAM_ADDED: 'streamAdded', @@ -70,7 +70,7 @@ export const createPeer = ({ api, createStream, event, streams, config }) => { }) this._addEventListener() - this._event.emit(PeerEvents.PEER_CONNECTED, { + this._event.emit(PeerEvents.PEER_OPENED, { roomId: this._roomId, clientId: this._clientId, }) @@ -93,7 +93,7 @@ export const createPeer = ({ api, createStream, event, streams, config }) => { this._peerConnection = null this._roomId = '' this._clientId = '' - this._event.emit(PeerEvents.PEER_DISCONNECTED) + this._event.emit(PeerEvents.PEER_CLOSED) } getClientId = () => {