@techsee/techsee-media-service 2.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/MediaConstants.d.ts +4 -0
- package/lib/MediaConstants.d.ts.map +1 -1
- package/lib/MediaConstants.js +8 -1
- package/lib/MediaConstants.js.map +1 -1
- package/lib/MediaUtils/index.d.ts +1 -0
- package/lib/MediaUtils/index.d.ts.map +1 -0
- package/lib/MediaUtils/index.js +16 -0
- package/lib/MediaUtils/index.js.map +1 -0
- package/lib/MultiParty/Contracts.d.ts +3 -2
- package/lib/MultiParty/Contracts.d.ts.map +1 -1
- package/lib/MultiParty/{MediaCapabilitiesHelper.d.ts → MediaCapabilitiesService.d.ts} +3 -3
- package/lib/MultiParty/MediaCapabilitiesService.d.ts.map +1 -0
- package/lib/MultiParty/{MediaCapabilitiesHelper.js → MediaCapabilitiesService.js} +70 -109
- package/lib/MultiParty/MediaCapabilitiesService.js.map +1 -0
- package/lib/MultiParty/MediaCapabilitiesUtils.d.ts +5 -0
- package/lib/MultiParty/MediaCapabilitiesUtils.d.ts.map +1 -0
- package/lib/MultiParty/MediaCapabilitiesUtils.js +305 -0
- package/lib/MultiParty/MediaCapabilitiesUtils.js.map +1 -0
- package/lib/MultiParty/{MultiParty.d.ts → MultiPartyService.d.ts} +4 -15
- package/lib/MultiParty/MultiPartyService.d.ts.map +1 -0
- package/lib/MultiParty/{MultiParty.js → MultiPartyService.js} +9 -192
- package/lib/MultiParty/MultiPartyService.js.map +1 -0
- package/lib/MultiParty/MultiPartyServiceFactory.d.ts +4 -0
- package/lib/MultiParty/MultiPartyServiceFactory.d.ts.map +1 -0
- package/lib/MultiParty/MultiPartyServiceFactory.js +21 -0
- package/lib/MultiParty/MultiPartyServiceFactory.js.map +1 -0
- package/lib/MultiParty/{OpentokMultiparty.d.ts → OpentokMultiPartyService.d.ts} +4 -8
- package/lib/MultiParty/OpentokMultiPartyService.d.ts.map +1 -0
- package/lib/MultiParty/{OpentokMultiparty.js → OpentokMultiPartyService.js} +240 -266
- package/lib/MultiParty/OpentokMultiPartyService.js.map +1 -0
- package/lib/MultiParty/index.d.ts +3 -0
- package/lib/MultiParty/index.d.ts.map +1 -0
- package/lib/MultiParty/index.js +52 -0
- package/lib/MultiParty/index.js.map +1 -0
- package/package.json +2 -2
- package/lib/MultiParty/MediaCapabilitiesHelper.d.ts.map +0 -1
- package/lib/MultiParty/MediaCapabilitiesHelper.js.map +0 -1
- package/lib/MultiParty/MultiParty.d.ts.map +0 -1
- package/lib/MultiParty/MultiParty.js.map +0 -1
- package/lib/MultiParty/MultipartyFactory.d.ts +0 -4
- package/lib/MultiParty/MultipartyFactory.d.ts.map +0 -1
- package/lib/MultiParty/MultipartyFactory.js +0 -21
- package/lib/MultiParty/MultipartyFactory.js.map +0 -1
- package/lib/MultiParty/OpentokMultiparty.d.ts.map +0 -1
- package/lib/MultiParty/OpentokMultiparty.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createMultiPartyService = void 0;
|
|
7
|
+
|
|
8
|
+
var MediaConstants_1 = require("../MediaConstants");
|
|
9
|
+
|
|
10
|
+
var OpentokMultiPartyService_1 = require("./OpentokMultiPartyService");
|
|
11
|
+
|
|
12
|
+
var createMultiPartyService = function createMultiPartyService(settings, getParticipantDomId) {
|
|
13
|
+
if (settings.mediaServiceType === MediaConstants_1.MediaServiceType.OPENTOK) {
|
|
14
|
+
return new OpentokMultiPartyService_1.OpentokMultiPartyService(settings, getParticipantDomId);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
throw new Error('NOT_SUPPORTED');
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
exports.createMultiPartyService = createMultiPartyService;
|
|
21
|
+
//# sourceMappingURL=MultiPartyServiceFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MultiParty/MultiPartyServiceFactory.js"],"names":["Object","defineProperty","exports","value","createMultiPartyService","MediaConstants_1","require","OpentokMultiPartyService_1","settings","getParticipantDomId","mediaServiceType","MediaServiceType","OPENTOK","OpentokMultiPartyService","Error"],"mappings":"AAAA;;AACAA,MAAM,CAACC,cAAP,CAAsBC,OAAtB,EAA+B,YAA/B,EAA6C;AAAEC,EAAAA,KAAK,EAAE;AAAT,CAA7C;AACAD,OAAO,CAACE,uBAAR,GAAkC,KAAK,CAAvC;;AACA,IAAIC,gBAAgB,GAAGC,OAAO,CAAC,mBAAD,CAA9B;;AACA,IAAIC,0BAA0B,GAAGD,OAAO,CAAC,4BAAD,CAAxC;;AACA,IAAIF,uBAAuB,GAAG,SAA1BA,uBAA0B,CAAUI,QAAV,EAAoBC,mBAApB,EAAyC;AACnE,MAAID,QAAQ,CAACE,gBAAT,KAA8BL,gBAAgB,CAACM,gBAAjB,CAAkCC,OAApE,EAA6E;AACzE,WAAO,IAAIL,0BAA0B,CAACM,wBAA/B,CAAwDL,QAAxD,EAAkEC,mBAAlE,CAAP;AACH;;AACD,QAAM,IAAIK,KAAJ,CAAU,eAAV,CAAN;AACH,CALD;;AAMAZ,OAAO,CAACE,uBAAR,GAAkCA,uBAAlC","file":"MultiPartyServiceFactory.js","sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createMultiPartyService = void 0;\nvar MediaConstants_1 = require(\"../MediaConstants\");\nvar OpentokMultiPartyService_1 = require(\"./OpentokMultiPartyService\");\nvar createMultiPartyService = function (settings, getParticipantDomId) {\n if (settings.mediaServiceType === MediaConstants_1.MediaServiceType.OPENTOK) {\n return new OpentokMultiPartyService_1.OpentokMultiPartyService(settings, getParticipantDomId);\n }\n throw new Error('NOT_SUPPORTED');\n};\nexports.createMultiPartyService = createMultiPartyService;\n\n//# sourceMappingURL=MultiPartyServiceFactory.js.map\n"]}
|
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MultiPartyService, Subscriber } from './MultiPartyService';
|
|
2
2
|
import { SessionClientRole } from '../MediaConstants';
|
|
3
3
|
import { BrandingSettings, Credentials, SessionSettings } from './Contracts';
|
|
4
|
-
export declare class
|
|
4
|
+
export declare class OpentokMultiPartyService extends MultiPartyService {
|
|
5
5
|
subscribers: Array<Subscriber>;
|
|
6
6
|
session?: any;
|
|
7
7
|
currentPublisher?: any;
|
|
8
8
|
branding?: BrandingSettings;
|
|
9
9
|
getParticipantId: (clientRole: SessionClientRole, connectionId: string) => string;
|
|
10
|
-
/** @FIXME not used atm, should be refactored */
|
|
11
|
-
credentials?: Credentials;
|
|
12
10
|
participantCount: number;
|
|
13
11
|
constructor(settings: SessionSettings, getParticipantDomId: (clientRole: SessionClientRole, connectionId: string) => string);
|
|
14
12
|
get ownConnectionId(): string | undefined;
|
|
15
13
|
connect: (credentials: Credentials) => void;
|
|
16
14
|
disconnect: () => void;
|
|
17
|
-
|
|
18
|
-
couldStartPublishAudio: (settings: SessionSettings) => Promise<boolean | Error>;
|
|
19
|
-
createPublisher: (settingsForPublisher: SessionSettings) => Promise<void>;
|
|
15
|
+
private createPublisher;
|
|
20
16
|
publishAudio: (shouldMute: boolean) => Promise<void>;
|
|
21
17
|
publishVideo: (shouldPublishVideo: boolean) => Promise<void>;
|
|
22
18
|
switchCamera: () => Promise<void>;
|
|
23
19
|
private getClientRole;
|
|
24
|
-
initPublisher: (settings: SessionSettings) => void
|
|
20
|
+
initPublisher: (settings: SessionSettings) => Promise<void>;
|
|
25
21
|
private getParticipantIdForStream;
|
|
26
22
|
streamCreatedHandler: (event: any) => Promise<void>;
|
|
27
23
|
streamPropertyChangedHandler: (event: any) => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MultiParty/OpentokMultiPartyService.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,iBAAiB,EAAE,UAAU,EAAqB,MAAM,qBAAqB,CAAC;AACjI,OAAO,EAAwB,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,aAAa,CAAC;AAa3E,qBAAa,wBAAyB,SAAQ,iBAAiB;IAC3D,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,CAAM;IACpC,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,gBAAgB,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAElF,gBAAgB,SAAK;gBAET,QAAQ,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM;IAO3H,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAExC;IAED,OAAO,gBAAiB,WAAW,KAAG,IAAI,CA6BxC;IAEF,UAAU,QAAO,IAAI,CAYnB;IAEF,OAAO,CAAC,eAAe,CAwBrB;IAEK,YAAY,eAAsB,OAAO,KAAG,QAAQ,IAAI,CAAC,CAmB9D;IAEK,YAAY,uBAA8B,OAAO,KAAG,QAAQ,IAAI,CAAC,CAiBtE;IAEK,YAAY,QAAa,QAAQ,IAAI,CAAC,CAkC3C;IAEF,OAAO,CAAC,aAAa;IAIrB,aAAa,aAAoB,eAAe,KAAG,QAAQ,IAAI,CAAC,CA6E9D;IAEF,OAAO,CAAC,yBAAyB;IAMjC,oBAAoB,kBAEhB,QAAQ,IAAI,CAAC,CAgDf;IAEF,4BAA4B,UAAW,GAAG,KAAG,IAAI,CAY/C;IAEF,sBAAsB,kBAGlB,IAAI,CAON;IAEF,wBAAwB,kBAEpB,IAAI,CAmBN;IAEF,0BAA0B,kBAGtB,IAAI,CAcN;IAEF,kBAAkB,iCAAoB,IAAI,CAExC;IAEF,OAAO,CAAC,0BAA0B,CAGjC;CACJ","file":"OpentokMultiPartyService.d.ts","sourcesContent":["import {maxParticipantsNumber, MULTI_PARTY_EVENTS, MultiPartyService, Subscriber, DEFAULT_AVATAR_URI} from './MultiPartyService';\nimport {MultiPartyCameraTypes, SessionClientRole} from '../MediaConstants';\nimport {BrandingSettings, Credentials, SessionSettings} from './Contracts';\nimport {getMediaTracer} from '../MediaUtils';\nimport {checkAudioCapabilities, checkVideoCapabilities, checkIsMobile} from './MediaCapabilitiesUtils';\nimport {MediaCapabilitiesService} from './MediaCapabilitiesService';\n\nconst trace = getMediaTracer('Multiparty');\n\n// The preferred camera position to use for the video source\nenum OpentokFacingMode {\n USER = 'user',\n ENVIRONMENT = 'environment'\n}\n\nexport class OpentokMultiPartyService extends MultiPartyService {\n subscribers: Array<Subscriber> = [];\n session?: any;\n currentPublisher?: any;\n branding?: BrandingSettings;\n getParticipantId: (clientRole: SessionClientRole, connectionId: string) => string;\n\n participantCount = 0;\n\n constructor(settings: SessionSettings, getParticipantDomId: (clientRole: SessionClientRole, connectionId: string) => string) {\n super(settings);\n\n this.branding = settings.branding;\n this.getParticipantId = getParticipantDomId;\n }\n\n get ownConnectionId(): string | undefined {\n return this.session?.connection?.connectionId;\n }\n\n connect = (credentials: Credentials): void => {\n try {\n this.session = window?.OT.initSession(credentials.apiKey, credentials.sessionId);\n } catch (err) {\n trace.error(JSON.stringify(err));\n this.emit(MULTI_PARTY_EVENTS.connectFailed, {meta: {err: JSON.stringify(err)}});\n\n return;\n }\n\n this.session.on('connectionCreated', this.connectionCreatedHandler);\n this.session.on('connectionDestroyed', this.connectionDestroyedHandler);\n this.session.on('streamCreated', this.streamCreatedHandler);\n this.session.on('streamDestroyed', this.streamDestroyedHandler);\n this.session.on('streamPropertyChanged', this.streamPropertyChangedHandler);\n this.session.on('sessionDisconnected', this.sessionDisconnectedHandler);\n\n this.session.connect(credentials.token, async (error?: any) => {\n if (error) {\n this.session?.off();\n this.session = null;\n this.traceErrorCallback(error);\n this.emit(MULTI_PARTY_EVENTS.connectFailed, {meta: {err: JSON.stringify(error)}});\n\n return;\n }\n\n await this.createPublisher(this.settings);\n });\n };\n\n disconnect = (): void => {\n try {\n trace.info('Disconnecting from session');\n\n if (this.session) {\n this.session.disconnect();\n this.participantCount = 0;\n trace.info('Disconnection from session completed');\n }\n } catch (err) {\n trace.error(JSON.stringify(err));\n }\n };\n\n private createPublisher = async (settings: Readonly<SessionSettings>): Promise<void> => {\n const canStartWithAudio = await checkAudioCapabilities();\n const canStartWithVideo = await checkVideoCapabilities();\n\n if (!canStartWithAudio && !canStartWithVideo) {\n // FIXME: use emitter\n trace.error('Did not create publisher due to lack of media capabilities.');\n\n return;\n }\n\n if (!this.currentPublisher) {\n await this.initPublisher({\n ...settings,\n cameraEnabled: settings.cameraEnabled && canStartWithVideo,\n startWithAudioMuted: settings.startWithAudioMuted && canStartWithAudio\n });\n\n if (!this.currentPublisher) {\n throw new Error('Creating session requires initialized publisher');\n }\n\n this.currentPublisher && this.session?.publish(this.currentPublisher, this.traceErrorCallback);\n }\n };\n\n public publishAudio = async (shouldMute: boolean): Promise<void> => {\n const canPublishAudio = await checkAudioCapabilities();\n\n // why do we care about audio if 'shouldMute' is true?\n if (shouldMute && !canPublishAudio) {\n trace.error('could not publish audio');\n\n return;\n }\n\n if (!this.currentPublisher) {\n await this.createPublisher({\n ...this.settings,\n // so if 'shouldMute' is true then we DON't mute?\n startWithAudioMuted: !shouldMute\n });\n } else {\n this.currentPublisher.publishAudio(shouldMute);\n }\n };\n\n public publishVideo = async (shouldPublishVideo: boolean): Promise<void> => {\n const canPublishVideo = await checkVideoCapabilities();\n\n if (shouldPublishVideo && !canPublishVideo) {\n trace.error('could not publish video');\n\n return;\n }\n\n if (!this.currentPublisher) {\n await this.createPublisher({\n ...this.settings,\n cameraEnabled: shouldPublishVideo\n });\n } else {\n this.currentPublisher.publishVideo(shouldPublishVideo);\n }\n };\n\n public switchCamera = async (): Promise<void> => {\n try {\n const mediaCapabilitiesService = await MediaCapabilitiesService.getInstance();\n\n if (!mediaCapabilitiesService.supportSwitchCamera) {\n throw new Error('Not Support switch camera');\n }\n\n let deviceId = '';\n let cameraType: MultiPartyCameraTypes;\n\n switch (this.settings.selectedCamera) {\n case MultiPartyCameraTypes.BACK:\n cameraType = MultiPartyCameraTypes.FRONT;\n deviceId = mediaCapabilitiesService.frontCameraDeviceId;\n break;\n case MultiPartyCameraTypes.FRONT:\n cameraType = MultiPartyCameraTypes.BACK;\n deviceId = mediaCapabilitiesService.backCameraDeviceId;\n break;\n default:\n throw new Error(`cameraType not valid: ${this.settings.selectedCamera}`);\n }\n\n return this.currentPublisher?.setVideoSource(deviceId)\n .then(() => {\n this.settings.selectedCamera = cameraType;\n this.emit(MULTI_PARTY_EVENTS.cameraSourceChanged, {cameraSource: cameraType});\n trace.info(`Success to switch camera to cameraType: ${cameraType}`);\n });\n } catch (err) {\n trace.error(JSON.stringify(err));\n throw err;\n }\n };\n\n private getClientRole(connection?: any): SessionClientRole {\n return (connection?.data && JSON.parse(connection.data).clientRole) || SessionClientRole.USER;\n }\n\n initPublisher = async (settings: SessionSettings): Promise<void> => {\n try {\n const {selectedCamera} = settings;\n const isMobile = checkIsMobile();\n\n const mediaCapabilitiesService = await MediaCapabilitiesService.getInstance();\n const {frontCameraDeviceId, backCameraDeviceId} = mediaCapabilitiesService;\n\n const videoSourceId = (selectedCamera === MultiPartyCameraTypes.FRONT ? frontCameraDeviceId : backCameraDeviceId) || undefined;\n const mobileCameraType = settings.selectedCamera === MultiPartyCameraTypes.FRONT ? OpentokFacingMode.USER : OpentokFacingMode.ENVIRONMENT;\n\n const properties = {\n insertMode: 'append',\n fitMode: 'cover',\n width: '100%',\n height: '100%',\n style: {\n buttonDisplayMode: 'off',\n archiveStatusDisplayMode: 'off',\n audioLevelDisplayMode: 'off',\n backgroundImageURI: this.branding?.backgroundImageURI || DEFAULT_AVATAR_URI\n },\n publishAudio: !settings.startWithAudioMuted,\n publishVideo: settings.cameraEnabled,\n videoSource: !isMobile ? videoSourceId : undefined,\n facingMode: isMobile || !videoSourceId ? mobileCameraType : undefined\n };\n\n this.currentPublisher = window?.OT.initPublisher(this.getParticipantIdForStream(this.session?.connection),\n properties, this.traceErrorCallback);\n if (!this.currentPublisher) {\n trace.error('failed to init publisher');\n } else {\n this.currentPublisher.on('videoElementCreated', (event: any) => {\n trace.info('videoElementCreated', event);\n this.emit(MULTI_PARTY_EVENTS.videoElementCreated, event);\n });\n this.currentPublisher.on('streamDestroyed', (event: any) => {\n trace.info('Publisher stream destroyed', event);\n this.emit(MULTI_PARTY_EVENTS.streamDestroyed, {event: event,\n participantId: this.getParticipantIdForStream(event?.stream?.connection)});\n });\n this.currentPublisher.on('accessDenied', (event: any) => {\n trace.info('Publisher denied media permissions', event);\n const connection = this.session?.connection;\n const connectionId = connection?.connectionId;\n const participantId = this.getParticipantIdForStream(connection);\n const isOwnConnection = this.ownConnectionId === connectionId;\n\n this.emit(MULTI_PARTY_EVENTS.mediaDeviceAccessDenied, {\n connectionId,\n isOwnConnection,\n participantId\n });\n });\n this.currentPublisher.on('streamCreated', async (event: any) => {\n await MediaCapabilitiesService.setDevicesList();\n\n const participantId = this.getParticipantIdForStream(event?.stream?.connection);\n\n this.emit(MULTI_PARTY_EVENTS.streamCreated,\n {event: event, participantId: participantId,\n startWithAudioMuted: this.settings.startWithAudioMuted,\n hasAudio: event?.stream?.hasAudio,\n hasVideo: event?.stream?.hasVideo,\n isOwnConnection: this.ownConnectionId === event?.stream?.connection?.connectionId,\n });\n\n trace.info('publisher stream created', {event,\n hasAudio: this.currentPublisher?.['stream.hasAudio'],\n participantId});\n });\n }\n } catch (err) {\n trace.error(JSON.stringify(err));\n throw err;\n }\n };\n\n private getParticipantIdForStream(connection: any) {\n const clientRole = this.getClientRole(connection);\n\n return this.getParticipantId(clientRole, connection.connectionId);\n }\n\n streamCreatedHandler = async (event: any & {\n stream: any;\n }): Promise<void> => {\n trace.info('streamCreatedHandler', event.stream);\n\n const {stream} = event;\n const {connection} = stream;\n const participantId = this.getParticipantIdForStream(connection);\n\n await MediaCapabilitiesService.setDevicesList();\n\n this.emit(MULTI_PARTY_EVENTS.streamCreated,\n {event: event, participantId: participantId,\n startWithAudioMuted: this.settings.startWithAudioMuted,\n isOwnConnection: this.ownConnectionId === (event?.stream?.connection?.connectionId) as string,\n hasVideo: event?.stream?.hasVideo,\n hasAudio: event?.stream?.hasAudio});\n\n if (!this.ownConnectionId || !stream || connection.connectionId === this.ownConnectionId) {\n return;\n }\n\n if (this.subscribers.length >= maxParticipantsNumber - 1) {\n trace.info(`a new subscriber cannot be added, as the number of participants reached its limit: ${maxParticipantsNumber}`);\n } else {\n const properties = {\n insertMode: 'append',\n fitMode: 'cover',\n width: '100%',\n height: '100%',\n style: {\n buttonDisplayMode: 'off',\n audioLevelDisplayMode: 'off',\n backgroundImageURI: this.branding?.backgroundImageURI || DEFAULT_AVATAR_URI\n },\n };\n\n const subscriber = event.target.subscribe(event.stream, participantId, properties, (err: any) => {\n this.traceErrorCallback(err);\n subscriber?.on('videoElementCreated', (event: any) => {\n trace.info('videoElementCreated', event);\n });\n });\n\n this.subscribers.push({\n subscriber,\n connectionId: connection.connectionId,\n clientRole: this.getClientRole(connection)\n });\n }\n };\n\n streamPropertyChangedHandler = (event: any): void => {\n trace.info('streamPropertyChangedHandler', event);\n\n const {stream} = event;\n\n this.emit(MULTI_PARTY_EVENTS.videoAudioStatus, {\n hasVideo: stream?.hasVideo,\n hasAudio: stream?.hasAudio,\n participantId: this.getParticipantIdForStream(stream?.connection),\n isOwnConnection: this.ownConnectionId === stream?.connection?.connectionId,\n stream\n });\n };\n\n streamDestroyedHandler = (event: any & {\n stream: any;\n reason: string;\n }): void => {\n trace.info('streamDestroyedHandler', event);\n const {stream} = event;\n const destroyedConnectionId = stream && stream.connection && stream.connection.connectionId;\n\n this.emit(MULTI_PARTY_EVENTS.streamDestroyed, {event: event, participantId: this.getParticipantIdForStream(event?.stream?.connection)});\n this.subscribers = this.subscribers.filter((subscriber) => subscriber.connectionId !== destroyedConnectionId);\n };\n\n connectionCreatedHandler = (event: any & {\n connection: any;\n }): void => {\n trace.info('connectionCreatedHandler', event);\n\n const {connection} = event;\n\n if (!this.ownConnectionId || !connection) {\n return;\n }\n\n ++this.participantCount;\n this.emit(MULTI_PARTY_EVENTS.participantsNumberChanged, this.participantCount);\n\n const clientRole = this.getClientRole(connection);\n\n this.emit(MULTI_PARTY_EVENTS.connectionCreated, {\n clientRole, event,\n participantId: this.getParticipantIdForStream(connection),\n isOwnConnection: this.ownConnectionId === connection.connectionId\n });\n };\n\n connectionDestroyedHandler = (event: any & {\n connection: any;\n reason: string;\n }): void => {\n const {connection} = event;\n const clientRole = this.getClientRole(connection);\n\n trace.info('connectionDestroyedHandler', event);\n this.emit(MULTI_PARTY_EVENTS.connectionDestroyed, {clientRole, event, participantId: this.getParticipantIdForStream(event?.connection)});\n\n if (!this.ownConnectionId || !connection || connection.connectionId !== this.ownConnectionId) {\n return;\n }\n\n --this.participantCount;\n this.emit(MULTI_PARTY_EVENTS.participantsNumberChanged, this.participantCount);\n this.session = null;\n };\n\n traceErrorCallback = (error?: Error): void => {\n trace.error(JSON.stringify(error));\n };\n\n private sessionDisconnectedHandler = (event: any) => {\n trace.info('sessionDisconnectedHandler', event);\n this?.session?.signal({retryAfterReconnect: true});\n }\n}\n"]}
|