@webex/internal-plugin-voicea 2.31.1 → 2.31.3

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/dist/voicea.js CHANGED
@@ -72,6 +72,33 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
72
72
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "areCaptionsEnabled", void 0);
73
73
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isTranscribingEnabled", void 0);
74
74
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "vmcDeviceId", void 0);
75
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "eventProcessor", function (e) {
76
+ e;
77
+ _this.seqNum = e.sequenceNumber + 1;
78
+
79
+ switch (e.data.relayType) {
80
+ case _constants.VOICEA_RELAY_TYPES.ANNOUNCEMENT:
81
+ _this.vmcDeviceId = e.headers.from;
82
+ _this.hasVoiceaJoined = true;
83
+
84
+ _this.processAnnouncementMessage(e.data.voiceaPayload);
85
+
86
+ break;
87
+
88
+ case _constants.VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
89
+ _this.processCaptionLanguageResponse(e.data.voiceaPayload);
90
+
91
+ break;
92
+
93
+ case _constants.VOICEA_RELAY_TYPES.TRANSCRIPTION:
94
+ _this.processTranscription(e.data.voiceaPayload);
95
+
96
+ break;
97
+
98
+ default:
99
+ break;
100
+ }
101
+ });
75
102
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "processTranscription", function (voiceaPayload) {
76
103
  switch (voiceaPayload.type) {
77
104
  case _constants.TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:
@@ -345,34 +372,16 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
345
372
  * Listen to websocket messages
346
373
  */
347
374
  function listenToEvents() {
348
- var _this2 = this;
349
-
350
- this.webex.internal.llm.on('event:relay.event', function (e) {
351
- _this2.seqNum = e.sequenceNumber + 1;
352
-
353
- switch (e.data.relayType) {
354
- case _constants.VOICEA_RELAY_TYPES.ANNOUNCEMENT:
355
- _this2.vmcDeviceId = e.headers.from;
356
- _this2.hasVoiceaJoined = true;
357
-
358
- _this2.processAnnouncementMessage(e.data.voiceaPayload);
359
-
360
- break;
361
-
362
- case _constants.VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
363
- _this2.processCaptionLanguageResponse(e.data.voiceaPayload);
364
-
365
- break;
366
-
367
- case _constants.VOICEA_RELAY_TYPES.TRANSCRIPTION:
368
- _this2.processTranscription(e.data.voiceaPayload);
369
-
370
- break;
371
-
372
- default:
373
- break;
374
- }
375
- });
375
+ this.webex.internal.llm.on('event:relay.event', this.eventProcessor);
376
+ }
377
+ }, {
378
+ key: "deregisterEvents",
379
+ value: function deregisterEvents() {
380
+ this.hasVoiceaJoined = false;
381
+ this.areCaptionsEnabled = false;
382
+ this.isTranscribingEnabled = false;
383
+ this.vmcDeviceId = undefined;
384
+ this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
376
385
  }
377
386
  }]);
378
387
  return VoiceaChannel;
@@ -1 +1 @@
1
- {"version":3,"names":["VoiceaChannel","args","VOICEA","voiceaPayload","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","Trigger","trigger","file","function","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","hasVoiceaJoined","webex","internal","llm","isConnected","listenToEvents","socket","send","id","seqNum","recipients","route","getBinding","headers","data","clientPayload","version","eventType","relayType","VOICEA_RELAY_TYPES","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","then","SPOKEN_LANGUAGE_UPDATE","to","vmcDeviceId","translationLanguage","TRANSLATION_REQUEST","areCaptionsEnabled","undefined","transcribe","caption","CAPTIONS_TURNED_ON","sendAnnouncement","activate","isTranscribingEnabled","transcribing","TRANSCRIBING_ON","TRANSCRIBING_OFF","turnOnCaptions","on","e","sequenceNumber","ANNOUNCEMENT","from","processAnnouncementMessage","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","WebexPlugin"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {TriggerProxy as Trigger} from '@webex/plugin-meetings';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {EVENT_TRIGGERS, VOICEA_RELAY_TYPES, TRANSCRIPTION_TYPE, VOICEA} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * VoiceaChannel to hold single instance of LLM\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private hasVoiceaJoined: boolean;\n\n private areCaptionsEnabled: boolean;\n\n private isTranscribingEnabled: boolean;\n\n private vmcDeviceId: string;\n\n /**\n * Listen to websocket messages\n */\n private listenToEvents() {\n this.webex.internal.llm.on('event:relay.event', (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.hasVoiceaJoined = true;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n });\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.hasVoiceaJoined = false;\n this.areCaptionsEnabled = false;\n this.isTranscribingEnabled = false;\n this.vmcDeviceId = undefined;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.HIGHLIGHT_CREATED,\n {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: false,\n text: voiceaPayload.command_response,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n }\n );\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: 200}\n );\n } else {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}\n );\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processAnnouncementMessage',\n },\n EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,\n voiceaLanguageOptions\n );\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;\n\n this.listenToEvents();\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n languageCode,\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'setSpokenLanguage',\n },\n EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,\n {languageCode}\n );\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n if (!this.webex.internal.llm.isConnected()) return;\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Turn on Captions\n * @returns {Promise}\n */\n public turnOnCaptions = async (): undefined | Promise<void> => {\n if (this.hasVoiceaJoined && this.areCaptionsEnabled) return undefined;\n\n return this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {caption: true},\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'turnOnCaptions',\n },\n EVENT_TRIGGERS.CAPTIONS_TURNED_ON\n );\n this.areCaptionsEnabled = true;\n this.sendAnnouncement();\n });\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @returns {Promise}\n */\n public toggleTranscribing = async (activate: boolean): undefined | Promise<void> => {\n if (this.isTranscribingEnabled === activate) return undefined;\n\n return this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {transcribing: activate},\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'toggleTranscribing',\n },\n activate ? EVENT_TRIGGERS.TRANSCRIBING_ON : EVENT_TRIGGERS.TRANSCRIBING_OFF\n );\n this.isTranscribingEnabled = activate;\n if (activate && !this.areCaptionsEnabled && !this.hasVoiceaJoined) this.turnOnCaptions();\n });\n };\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
1
+ {"version":3,"names":["VoiceaChannel","args","VOICEA","e","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","hasVoiceaJoined","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","type","TRANSCRIPTION_TYPE","TRANSCRIPT_INTERIM_RESULTS","Trigger","trigger","file","function","EVENT_TRIGGERS","NEW_CAPTION","isFinal","transcriptId","transcript_id","transcripts","TRANSCRIPT_FINAL_RESULT","transcript","csis","text","transcriptLanguageCode","transcript_language_code","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","highlight","highlightId","highlight_id","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","listenToEvents","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","then","SPOKEN_LANGUAGE_UPDATE","to","translationLanguage","TRANSLATION_REQUEST","areCaptionsEnabled","undefined","transcribe","caption","CAPTIONS_TURNED_ON","sendAnnouncement","activate","isTranscribingEnabled","transcribing","TRANSCRIBING_ON","TRANSCRIBING_OFF","turnOnCaptions","on","eventProcessor","off","WebexPlugin"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {TriggerProxy as Trigger} from '@webex/plugin-meetings';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {EVENT_TRIGGERS, VOICEA_RELAY_TYPES, TRANSCRIPTION_TYPE, VOICEA} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * VoiceaChannel to hold single instance of LLM\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private hasVoiceaJoined: boolean;\n\n private areCaptionsEnabled: boolean;\n\n private isTranscribingEnabled: boolean;\n\n private vmcDeviceId?: string;\n\n private eventProcessor = (e) => {\n e;\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case VOICEA_RELAY_TYPES.ANNOUNCEMENT:\n this.vmcDeviceId = e.headers.from;\n this.hasVoiceaJoined = true;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case VOICEA_RELAY_TYPES.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n default:\n break;\n }\n };\n /**\n * Listen to websocket messages\n */\n private listenToEvents() {\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n }\n\n public deregisterEvents() {\n this.hasVoiceaJoined = false;\n this.areCaptionsEnabled = false;\n this.isTranscribingEnabled = false;\n this.vmcDeviceId = undefined;\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.hasVoiceaJoined = false;\n this.areCaptionsEnabled = false;\n this.isTranscribingEnabled = false;\n this.vmcDeviceId = undefined;\n }\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.NEW_CAPTION,\n {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcript: {\n csis: voiceaPayload.csis,\n text: voiceaPayload.transcript.text,\n transcriptLanguageCode: voiceaPayload.transcript.transcript_language_code,\n },\n timestamp: millisToMinutesAndSeconds(voiceaPayload.transcript.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.HIGHLIGHT_CREATED,\n {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: false,\n text: voiceaPayload.command_response,\n }\n );\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processTranscription',\n },\n EVENT_TRIGGERS.EVA_COMMAND,\n {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n }\n );\n break;\n\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: 200}\n );\n } else {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processCaptionLanguageResponse',\n },\n EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE,\n {statusCode: voiceaPayload.errorCode, errorMessage: voiceaPayload.message}\n );\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n };\n\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'processAnnouncementMessage',\n },\n EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT,\n voiceaLanguageOptions\n );\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;\n this.listenToEvents();\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @returns {Promise}\n */\n public setSpokenLanguage = (languageCode: string): Promise<void> =>\n this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n languageCode,\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'setSpokenLanguage',\n },\n EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE,\n {languageCode}\n );\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n if (!this.webex.internal.llm.isConnected()) return;\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n route: this.webex.internal.llm.getBinding(),\n },\n headers: {\n to: this.vmcDeviceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: VOICEA_RELAY_TYPES.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Turn on Captions\n * @returns {Promise}\n */\n public turnOnCaptions = async (): undefined | Promise<void> => {\n if (this.hasVoiceaJoined && this.areCaptionsEnabled) return undefined;\n\n return this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {caption: true},\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'turnOnCaptions',\n },\n EVENT_TRIGGERS.CAPTIONS_TURNED_ON\n );\n this.areCaptionsEnabled = true;\n this.sendAnnouncement();\n });\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @returns {Promise}\n */\n public toggleTranscribing = async (activate: boolean): undefined | Promise<void> => {\n if (this.isTranscribingEnabled === activate) return undefined;\n\n return this.request({\n method: 'PUT',\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {transcribing: activate},\n },\n }).then(() => {\n Trigger.trigger(\n this,\n {\n file: 'voicea',\n function: 'toggleTranscribing',\n },\n activate ? EVENT_TRIGGERS.TRANSCRIBING_ON : EVENT_TRIGGERS.TRANSCRIBING_OFF\n );\n this.isTranscribingEnabled = activate;\n if (activate && !this.areCaptionsEnabled && !this.hasVoiceaJoined) this.turnOnCaptions();\n });\n };\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation:{\n max_languages: number;\n allowed_languages: string[]\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES = 'unknown'|\n'eva_wake' |\n'eva_thanks' |\n'eva_cancel' |\n'highlight_created'|\n'transcript_interim_results'|\n'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis:number;\n end_millis:number;\n text:string;\n transcript_language_code: string;\n translations:{[x:string]:string};\n csis:number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\n interface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis:number;\n end_millis:number;\n csis:number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x:string]:string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data:string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode:number;\n message:string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate:boolean) => undefined|Promise<void>;\n}\nexport {AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, IVoiceaChannel};\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["voicea.types.ts"],"sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable no-undef */\n\n/**\n * Type for payload\n */\ninterface AnnouncementPayload {\n translation: {\n max_languages: number;\n allowed_languages: string[];\n };\n\n ASR: {\n spoken_languages: string[];\n };\n}\n\n// eslint-disable-next-line no-undef\ntype TRANSCRIPTION_TYPES =\n | 'unknown'\n | 'eva_wake'\n | 'eva_thanks'\n | 'eva_cancel'\n | 'highlight_created'\n | 'transcript_interim_results'\n | 'transcript_final_result';\n\n/**\n * Class for an Transcription Object\n */\ninterface Transcription {\n start_millis: number;\n end_millis: number;\n text: string;\n transcript_language_code: string;\n translations: {[x: string]: string};\n csis: number[];\n last_packet_timestamp_ms: number;\n}\n\n/**\n * Highlights\n */\ninterface Highlight {\n highlight_id: string;\n transcript: string;\n highlight_label: string;\n highlight_source: string;\n start_millis: number;\n end_millis: number;\n csis: number[];\n}\n/**\n * Type for Transcription message\n */\ninterface TranscriptionResponse {\n type: TRANSCRIPTION_TYPES;\n transcript_id: string;\n translations?: {[x: string]: string};\n transcripts?: Transcription[];\n transcript?: Transcription;\n highlight?: Highlight;\n csis: number[];\n data: string;\n command_response: string;\n}\n/**\n * Type for CaptionLanguageResponse\n */\ninterface CaptionLanguageResponse {\n requestId: string;\n statusCode: number;\n errorCode: number;\n message: string;\n}\n\ninterface IVoiceaChannel {\n setSpokenLanguage: (languageCode: string) => Promise<void>;\n requestLanguage: (languageCode: string) => void;\n turnOnCaptions: () => undefined | Promise<void>;\n toggleTranscribing: (activate: boolean) => undefined | Promise<void>;\n deregisterEvents: () => undefined | Promise<void>;\n}\n\nexport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-voicea",
3
- "version": "2.31.1",
3
+ "version": "2.31.3",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -10,11 +10,11 @@
10
10
  "node": ">=14"
11
11
  },
12
12
  "dependencies": {
13
- "@webex/internal-plugin-llm": "2.31.1",
14
- "@webex/internal-plugin-mercury": "2.31.1",
15
- "@webex/internal-plugin-voicea": "2.31.1",
16
- "@webex/plugin-meetings": "2.31.1",
17
- "@webex/webex-core": "2.31.1",
13
+ "@webex/internal-plugin-llm": "2.31.3",
14
+ "@webex/internal-plugin-mercury": "2.31.3",
15
+ "@webex/internal-plugin-voicea": "2.31.3",
16
+ "@webex/plugin-meetings": "2.31.3",
17
+ "@webex/webex-core": "2.31.3",
18
18
  "uuid": "^3.3.2"
19
19
  },
20
20
  "browserify": {
@@ -24,9 +24,9 @@
24
24
  ]
25
25
  },
26
26
  "devDependencies": {
27
- "@webex/test-helper-chai": "2.31.1",
28
- "@webex/test-helper-mock-web-socket": "2.31.1",
29
- "@webex/test-helper-mock-webex": "2.31.1",
27
+ "@webex/test-helper-chai": "2.31.3",
28
+ "@webex/test-helper-mock-web-socket": "2.31.3",
29
+ "@webex/test-helper-mock-webex": "2.31.3",
30
30
  "sinon": "^9.2.4"
31
31
  }
32
32
  }
package/src/voicea.ts CHANGED
@@ -26,30 +26,40 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
26
26
 
27
27
  private isTranscribingEnabled: boolean;
28
28
 
29
- private vmcDeviceId: string;
29
+ private vmcDeviceId?: string;
30
30
 
31
+ private eventProcessor = (e) => {
32
+ e;
33
+ this.seqNum = e.sequenceNumber + 1;
34
+ switch (e.data.relayType) {
35
+ case VOICEA_RELAY_TYPES.ANNOUNCEMENT:
36
+ this.vmcDeviceId = e.headers.from;
37
+ this.hasVoiceaJoined = true;
38
+ this.processAnnouncementMessage(e.data.voiceaPayload);
39
+ break;
40
+ case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
41
+ this.processCaptionLanguageResponse(e.data.voiceaPayload);
42
+ break;
43
+ case VOICEA_RELAY_TYPES.TRANSCRIPTION:
44
+ this.processTranscription(e.data.voiceaPayload);
45
+ break;
46
+ default:
47
+ break;
48
+ }
49
+ };
31
50
  /**
32
51
  * Listen to websocket messages
33
52
  */
34
53
  private listenToEvents() {
35
- this.webex.internal.llm.on('event:relay.event', (e) => {
36
- this.seqNum = e.sequenceNumber + 1;
37
- switch (e.data.relayType) {
38
- case VOICEA_RELAY_TYPES.ANNOUNCEMENT:
39
- this.vmcDeviceId = e.headers.from;
40
- this.hasVoiceaJoined = true;
41
- this.processAnnouncementMessage(e.data.voiceaPayload);
42
- break;
43
- case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
44
- this.processCaptionLanguageResponse(e.data.voiceaPayload);
45
- break;
46
- case VOICEA_RELAY_TYPES.TRANSCRIPTION:
47
- this.processTranscription(e.data.voiceaPayload);
48
- break;
49
- default:
50
- break;
51
- }
52
- });
54
+ this.webex.internal.llm.on('event:relay.event', this.eventProcessor);
55
+ }
56
+
57
+ public deregisterEvents() {
58
+ this.hasVoiceaJoined = false;
59
+ this.areCaptionsEnabled = false;
60
+ this.isTranscribingEnabled = false;
61
+ this.vmcDeviceId = undefined;
62
+ this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
53
63
  }
54
64
 
55
65
  /**
@@ -221,7 +231,6 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
221
231
  */
222
232
  private sendAnnouncement = (): void => {
223
233
  if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;
224
-
225
234
  this.listenToEvents();
226
235
  this.webex.internal.llm.socket.send({
227
236
  id: `${this.seqNum}`,
@@ -5,9 +5,9 @@
5
5
  * Type for payload
6
6
  */
7
7
  interface AnnouncementPayload {
8
- translation:{
8
+ translation: {
9
9
  max_languages: number;
10
- allowed_languages: string[]
10
+ allowed_languages: string[];
11
11
  };
12
12
 
13
13
  ASR: {
@@ -16,38 +16,39 @@ interface AnnouncementPayload {
16
16
  }
17
17
 
18
18
  // eslint-disable-next-line no-undef
19
- type TRANSCRIPTION_TYPES = 'unknown'|
20
- 'eva_wake' |
21
- 'eva_thanks' |
22
- 'eva_cancel' |
23
- 'highlight_created'|
24
- 'transcript_interim_results'|
25
- 'transcript_final_result';
19
+ type TRANSCRIPTION_TYPES =
20
+ | 'unknown'
21
+ | 'eva_wake'
22
+ | 'eva_thanks'
23
+ | 'eva_cancel'
24
+ | 'highlight_created'
25
+ | 'transcript_interim_results'
26
+ | 'transcript_final_result';
26
27
 
27
28
  /**
28
29
  * Class for an Transcription Object
29
30
  */
30
31
  interface Transcription {
31
- start_millis:number;
32
- end_millis:number;
33
- text:string;
32
+ start_millis: number;
33
+ end_millis: number;
34
+ text: string;
34
35
  transcript_language_code: string;
35
- translations:{[x:string]:string};
36
- csis:number[];
36
+ translations: {[x: string]: string};
37
+ csis: number[];
37
38
  last_packet_timestamp_ms: number;
38
39
  }
39
40
 
40
41
  /**
41
42
  * Highlights
42
43
  */
43
- interface Highlight {
44
+ interface Highlight {
44
45
  highlight_id: string;
45
46
  transcript: string;
46
47
  highlight_label: string;
47
48
  highlight_source: string;
48
- start_millis:number;
49
- end_millis:number;
50
- csis:number[];
49
+ start_millis: number;
50
+ end_millis: number;
51
+ csis: number[];
51
52
  }
52
53
  /**
53
54
  * Type for Transcription message
@@ -55,12 +56,12 @@ interface Transcription {
55
56
  interface TranscriptionResponse {
56
57
  type: TRANSCRIPTION_TYPES;
57
58
  transcript_id: string;
58
- translations?: {[x:string]:string};
59
+ translations?: {[x: string]: string};
59
60
  transcripts?: Transcription[];
60
61
  transcript?: Transcription;
61
62
  highlight?: Highlight;
62
63
  csis: number[];
63
- data:string;
64
+ data: string;
64
65
  command_response: string;
65
66
  }
66
67
  /**
@@ -69,14 +70,23 @@ interface TranscriptionResponse {
69
70
  interface CaptionLanguageResponse {
70
71
  requestId: string;
71
72
  statusCode: number;
72
- errorCode:number;
73
- message:string;
73
+ errorCode: number;
74
+ message: string;
74
75
  }
75
76
 
76
77
  interface IVoiceaChannel {
77
78
  setSpokenLanguage: (languageCode: string) => Promise<void>;
78
79
  requestLanguage: (languageCode: string) => void;
79
80
  turnOnCaptions: () => undefined | Promise<void>;
80
- toggleTranscribing: (activate:boolean) => undefined|Promise<void>;
81
+ toggleTranscribing: (activate: boolean) => undefined | Promise<void>;
82
+ deregisterEvents: () => undefined | Promise<void>;
81
83
  }
82
- export {AnnouncementPayload, CaptionLanguageResponse, TranscriptionResponse, Transcription, Highlight, IVoiceaChannel};
84
+
85
+ export {
86
+ AnnouncementPayload,
87
+ CaptionLanguageResponse,
88
+ TranscriptionResponse,
89
+ Transcription,
90
+ Highlight,
91
+ IVoiceaChannel,
92
+ };
@@ -71,6 +71,35 @@ describe('plugin-voicea', () => {
71
71
  });
72
72
  });
73
73
 
74
+ describe('#deregisterEvents', () => {
75
+ beforeEach(async () => {
76
+ const mockWebSocket = new MockWebSocket();
77
+
78
+ voiceaService.webex.internal.llm.socket = mockWebSocket;
79
+ });
80
+
81
+ it('deregisters voicea service', async () => {
82
+ voiceaService.listenToEvents();
83
+ await voiceaService.toggleTranscribing(true);
84
+
85
+ // eslint-disable-next-line no-underscore-dangle
86
+ voiceaService.webex.internal.llm._emit('event:relay.event', {
87
+ headers: {from: 'ws'},
88
+ data: {relayType: 'voicea.annc', voiceaPayload: {}},
89
+ });
90
+
91
+ assert.equal(voiceaService.hasVoiceaJoined, true);
92
+ assert.equal(voiceaService.areCaptionsEnabled, true);
93
+ assert.equal(voiceaService.isTranscribingEnabled, true);
94
+ assert.equal(voiceaService.vmcDeviceId, 'ws');
95
+
96
+ voiceaService.deregisterEvents();
97
+ assert.equal(voiceaService.hasVoiceaJoined, false);
98
+ assert.equal(voiceaService.areCaptionsEnabled, false);
99
+ assert.equal(voiceaService.isTranscribingEnabled, false);
100
+ assert.equal(voiceaService.vmcDeviceId, undefined);
101
+ });
102
+ });
74
103
  describe('#processAnnouncementMessage', () => {
75
104
  it('works on non-empty payload', async () => {
76
105
  const voiceaPayload = {