@webex/internal-plugin-voicea 2.60.0 → 2.60.1-next.10

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/constants.js CHANGED
@@ -4,8 +4,8 @@ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/defi
4
4
  _Object$defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.VOICEA_RELAY_TYPES = exports.VOICEA = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = void 0;
8
- var EVENT_TRIGGERS = {
7
+ exports.VOICEA_RELAY_TYPES = exports.VOICEA = exports.TURN_ON_CAPTION_STATUS = exports.TRANSCRIPTION_TYPE = exports.EVENT_TRIGGERS = exports.ANNOUNCE_STATUS = void 0;
8
+ var EVENT_TRIGGERS = exports.EVENT_TRIGGERS = {
9
9
  VOICEA_ANNOUNCEMENT: 'voicea:announcement',
10
10
  CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',
11
11
  SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',
@@ -16,16 +16,14 @@ var EVENT_TRIGGERS = {
16
16
  EVA_COMMAND: 'voicea:wxa',
17
17
  HIGHLIGHT_CREATED: 'voicea:highlightCreated'
18
18
  };
19
- exports.EVENT_TRIGGERS = EVENT_TRIGGERS;
20
- var VOICEA_RELAY_TYPES = {
19
+ var VOICEA_RELAY_TYPES = exports.VOICEA_RELAY_TYPES = {
21
20
  ANNOUNCEMENT: 'voicea.annc',
22
21
  CLIENT_ANNOUNCEMENT: 'client.annc',
23
22
  TRANSLATION_REQUEST: 'voicea.transl.req',
24
23
  TRANSLATION_RESPONSE: 'voicea.transl.rsp',
25
24
  TRANSCRIPTION: 'voicea.transcription'
26
25
  };
27
- exports.VOICEA_RELAY_TYPES = VOICEA_RELAY_TYPES;
28
- var TRANSCRIPTION_TYPE = {
26
+ var TRANSCRIPTION_TYPE = exports.TRANSCRIPTION_TYPE = {
29
27
  UNKNOWN: 'unknown',
30
28
  EVA_WAKE: 'eva_wake',
31
29
  EVA_THANKS: 'eva_thanks',
@@ -34,7 +32,15 @@ var TRANSCRIPTION_TYPE = {
34
32
  TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',
35
33
  TRANSCRIPT_FINAL_RESULT: 'transcript_final_result'
36
34
  };
37
- exports.TRANSCRIPTION_TYPE = TRANSCRIPTION_TYPE;
38
- var VOICEA = 'voicea';
39
- exports.VOICEA = VOICEA;
35
+ var VOICEA = exports.VOICEA = 'voicea';
36
+ var ANNOUNCE_STATUS = exports.ANNOUNCE_STATUS = {
37
+ IDLE: 'idle',
38
+ JOINED: 'joined',
39
+ JOINING: 'joining'
40
+ };
41
+ var TURN_ON_CAPTION_STATUS = exports.TURN_ON_CAPTION_STATUS = {
42
+ IDLE: 'idle',
43
+ ENABLED: 'enabled',
44
+ SENDING: 'sending'
45
+ };
40
46
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["EVENT_TRIGGERS","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","exports","VOICEA_RELAY_TYPES","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","VOICEA"],"sources":["constants.ts"],"sourcesContent":["export const EVENT_TRIGGERS = {\n VOICEA_ANNOUNCEMENT: 'voicea:announcement',\n CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',\n SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',\n CAPTIONS_TURNED_ON: 'voicea:captionOn',\n TRANSCRIBING_ON: 'voicea:transcribingOn',\n TRANSCRIBING_OFF: 'voicea:transcribingOff',\n\n NEW_CAPTION: 'voicea:newCaption',\n EVA_COMMAND: 'voicea:wxa',\n HIGHLIGHT_CREATED: 'voicea:highlightCreated',\n};\n\nexport const VOICEA_RELAY_TYPES = {\n ANNOUNCEMENT: 'voicea.annc',\n CLIENT_ANNOUNCEMENT: 'client.annc',\n TRANSLATION_REQUEST: 'voicea.transl.req',\n TRANSLATION_RESPONSE: 'voicea.transl.rsp',\n TRANSCRIPTION: 'voicea.transcription',\n};\n\nexport const TRANSCRIPTION_TYPE = {\n UNKNOWN: 'unknown',\n EVA_WAKE: 'eva_wake',\n EVA_THANKS: 'eva_thanks',\n EVA_CANCEL: 'eva_cancel',\n HIGHLIGHT_CREATED: 'highlight_created',\n TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',\n TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',\n};\n\nexport const VOICEA = 'voicea';\n"],"mappings":";;;;;;;AAAO,IAAMA,cAAc,GAAG;EAC5BC,mBAAmB,EAAE,qBAAqB;EAC1CC,uBAAuB,EAAE,8BAA8B;EACvDC,sBAAsB,EAAE,6BAA6B;EACrDC,kBAAkB,EAAE,kBAAkB;EACtCC,eAAe,EAAE,uBAAuB;EACxCC,gBAAgB,EAAE,wBAAwB;EAE1CC,WAAW,EAAE,mBAAmB;EAChCC,WAAW,EAAE,YAAY;EACzBC,iBAAiB,EAAE;AACrB,CAAC;AAACC,OAAA,CAAAV,cAAA,GAAAA,cAAA;AAEK,IAAMW,kBAAkB,GAAG;EAChCC,YAAY,EAAE,aAAa;EAC3BC,mBAAmB,EAAE,aAAa;EAClCC,mBAAmB,EAAE,mBAAmB;EACxCC,oBAAoB,EAAE,mBAAmB;EACzCC,aAAa,EAAE;AACjB,CAAC;AAACN,OAAA,CAAAC,kBAAA,GAAAA,kBAAA;AAEK,IAAMM,kBAAkB,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBZ,iBAAiB,EAAE,mBAAmB;EACtCa,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE;AAC3B,CAAC;AAACb,OAAA,CAAAO,kBAAA,GAAAA,kBAAA;AAEK,IAAMO,MAAM,GAAG,QAAQ;AAACd,OAAA,CAAAc,MAAA,GAAAA,MAAA"}
1
+ {"version":3,"names":["EVENT_TRIGGERS","exports","VOICEA_ANNOUNCEMENT","CAPTION_LANGUAGE_UPDATE","SPOKEN_LANGUAGE_UPDATE","CAPTIONS_TURNED_ON","TRANSCRIBING_ON","TRANSCRIBING_OFF","NEW_CAPTION","EVA_COMMAND","HIGHLIGHT_CREATED","VOICEA_RELAY_TYPES","ANNOUNCEMENT","CLIENT_ANNOUNCEMENT","TRANSLATION_REQUEST","TRANSLATION_RESPONSE","TRANSCRIPTION","TRANSCRIPTION_TYPE","UNKNOWN","EVA_WAKE","EVA_THANKS","EVA_CANCEL","TRANSCRIPT_INTERIM_RESULTS","TRANSCRIPT_FINAL_RESULT","VOICEA","ANNOUNCE_STATUS","IDLE","JOINED","JOINING","TURN_ON_CAPTION_STATUS","ENABLED","SENDING"],"sources":["constants.ts"],"sourcesContent":["export const EVENT_TRIGGERS = {\n VOICEA_ANNOUNCEMENT: 'voicea:announcement',\n CAPTION_LANGUAGE_UPDATE: 'voicea:captionLanguageUpdate',\n SPOKEN_LANGUAGE_UPDATE: 'voicea:spokenLanguageUpdate',\n CAPTIONS_TURNED_ON: 'voicea:captionOn',\n TRANSCRIBING_ON: 'voicea:transcribingOn',\n TRANSCRIBING_OFF: 'voicea:transcribingOff',\n\n NEW_CAPTION: 'voicea:newCaption',\n EVA_COMMAND: 'voicea:wxa',\n HIGHLIGHT_CREATED: 'voicea:highlightCreated',\n};\n\nexport const VOICEA_RELAY_TYPES = {\n ANNOUNCEMENT: 'voicea.annc',\n CLIENT_ANNOUNCEMENT: 'client.annc',\n TRANSLATION_REQUEST: 'voicea.transl.req',\n TRANSLATION_RESPONSE: 'voicea.transl.rsp',\n TRANSCRIPTION: 'voicea.transcription',\n};\n\nexport const TRANSCRIPTION_TYPE = {\n UNKNOWN: 'unknown',\n EVA_WAKE: 'eva_wake',\n EVA_THANKS: 'eva_thanks',\n EVA_CANCEL: 'eva_cancel',\n HIGHLIGHT_CREATED: 'highlight_created',\n TRANSCRIPT_INTERIM_RESULTS: 'transcript_interim_results',\n TRANSCRIPT_FINAL_RESULT: 'transcript_final_result',\n};\n\nexport const VOICEA = 'voicea';\n\nexport const ANNOUNCE_STATUS = {\n IDLE: 'idle',\n JOINED: 'joined',\n JOINING: 'joining',\n};\n\nexport const TURN_ON_CAPTION_STATUS = {\n IDLE: 'idle',\n ENABLED: 'enabled',\n SENDING: 'sending',\n};\n"],"mappings":";;;;;;;AAAO,IAAMA,cAAc,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAC5BE,mBAAmB,EAAE,qBAAqB;EAC1CC,uBAAuB,EAAE,8BAA8B;EACvDC,sBAAsB,EAAE,6BAA6B;EACrDC,kBAAkB,EAAE,kBAAkB;EACtCC,eAAe,EAAE,uBAAuB;EACxCC,gBAAgB,EAAE,wBAAwB;EAE1CC,WAAW,EAAE,mBAAmB;EAChCC,WAAW,EAAE,YAAY;EACzBC,iBAAiB,EAAE;AACrB,CAAC;AAEM,IAAMC,kBAAkB,GAAAV,OAAA,CAAAU,kBAAA,GAAG;EAChCC,YAAY,EAAE,aAAa;EAC3BC,mBAAmB,EAAE,aAAa;EAClCC,mBAAmB,EAAE,mBAAmB;EACxCC,oBAAoB,EAAE,mBAAmB;EACzCC,aAAa,EAAE;AACjB,CAAC;AAEM,IAAMC,kBAAkB,GAAAhB,OAAA,CAAAgB,kBAAA,GAAG;EAChCC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,UAAU,EAAE,YAAY;EACxBC,UAAU,EAAE,YAAY;EACxBX,iBAAiB,EAAE,mBAAmB;EACtCY,0BAA0B,EAAE,4BAA4B;EACxDC,uBAAuB,EAAE;AAC3B,CAAC;AAEM,IAAMC,MAAM,GAAAvB,OAAA,CAAAuB,MAAA,GAAG,QAAQ;AAEvB,IAAMC,eAAe,GAAAxB,OAAA,CAAAwB,eAAA,GAAG;EAC7BC,IAAI,EAAE,MAAM;EACZC,MAAM,EAAE,QAAQ;EAChBC,OAAO,EAAE;AACX,CAAC;AAEM,IAAMC,sBAAsB,GAAA5B,OAAA,CAAA4B,sBAAA,GAAG;EACpCH,IAAI,EAAE,MAAM;EACZI,OAAO,EAAE,SAAS;EAClBC,OAAO,EAAE;AACX,CAAC"}
package/dist/index.js CHANGED
@@ -8,6 +8,18 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
8
8
  _Object$defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
+ _Object$defineProperty(exports, "EVENT_TRIGGERS", {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return _constants.EVENT_TRIGGERS;
15
+ }
16
+ });
17
+ _Object$defineProperty(exports, "TURN_ON_CAPTION_STATUS", {
18
+ enumerable: true,
19
+ get: function get() {
20
+ return _constants.TURN_ON_CAPTION_STATUS;
21
+ }
22
+ });
11
23
  _Object$defineProperty(exports, "default", {
12
24
  enumerable: true,
13
25
  get: function get() {
@@ -16,7 +28,8 @@ _Object$defineProperty(exports, "default", {
16
28
  });
17
29
  var WebexCore = _interopRequireWildcard(require("@webex/webex-core"));
18
30
  var _voicea = _interopRequireDefault(require("./voicea"));
19
- function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+ var _constants = require("./constants");
32
+ function _getRequireWildcardCache(e) { if ("function" != typeof _WeakMap) return null; var r = new _WeakMap(), t = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
33
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
21
34
  WebexCore.registerInternalPlugin('voicea', _voicea.default, {});
22
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_getRequireWildcardCache","nodeInterop","_WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","default","cache","has","get","newObj","hasPropertyDescriptor","_Object$defineProperty","_Object$getOwnPropertyDescriptor","key","Object","prototype","hasOwnProperty","call","desc","set","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAqC,SAAAG,yBAAAC,WAAA,eAAAC,QAAA,kCAAAC,iBAAA,OAAAD,QAAA,QAAAE,gBAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAL,wBAAAS,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,aAAAE,OAAA,CAAAF,GAAA,yBAAAA,GAAA,4BAAAG,OAAA,EAAAH,GAAA,UAAAI,KAAA,GAAAT,wBAAA,CAAAC,WAAA,OAAAQ,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAL,GAAA,YAAAI,KAAA,CAAAE,GAAA,CAAAN,GAAA,SAAAO,MAAA,WAAAC,qBAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAf,GAAA,EAAAW,GAAA,SAAAK,IAAA,GAAAR,qBAAA,GAAAE,gCAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAK,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,sBAAA,CAAAF,MAAA,EAAAI,GAAA,EAAAK,IAAA,YAAAT,MAAA,CAAAI,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAJ,MAAA,CAAAJ,OAAA,GAAAH,GAAA,MAAAI,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAjB,GAAA,EAAAO,MAAA,YAAAA,MAAA;AAErCjB,SAAS,CAAC4B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"names":["WebexCore","_interopRequireWildcard","require","_voicea","_interopRequireDefault","_constants","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerInternalPlugin","VoiceaChannel"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\n\nimport VoiceaChannel from './voicea';\n\nWebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});\n\nexport {default} from './voicea';\nexport {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAC,sBAAA,CAAAF,OAAA;AAKA,IAAAG,UAAA,GAAAH,OAAA;AAAmE,SAAAI,yBAAAC,CAAA,6BAAAC,QAAA,mBAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,gBAAAK,OAAA,CAAAL,CAAA,0BAAAA,CAAA,WAAAM,OAAA,EAAAN,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAI,GAAA,CAAAP,CAAA,UAAAG,CAAA,CAAAK,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAlB,CAAA,EAAAc,CAAA,SAAAK,CAAA,GAAAR,CAAA,GAAAE,gCAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAK,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,sBAAA,CAAAH,CAAA,EAAAK,CAAA,EAAAK,CAAA,IAAAV,CAAA,CAAAK,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAL,CAAA,CAAAH,OAAA,GAAAN,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAiB,GAAA,CAAApB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AAHnEhB,SAAS,CAAC4B,sBAAsB,CAAC,QAAQ,EAAEC,eAAa,EAAE,CAAC,CAAC,CAAC"}
package/dist/utils.js CHANGED
@@ -6,10 +6,9 @@ _Object$defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.millisToMinutesAndSeconds = void 0;
8
8
  // eslint-disable-next-line import/prefer-default-export
9
- var millisToMinutesAndSeconds = function millisToMinutesAndSeconds(millis) {
9
+ var millisToMinutesAndSeconds = exports.millisToMinutesAndSeconds = function millisToMinutesAndSeconds(millis) {
10
10
  var minutes = Math.floor(millis / 60000);
11
11
  var seconds = (millis % 60000 / 1000).toFixed(0);
12
12
  return "".concat(minutes, ":").concat(+seconds < 10 ? '0' : '').concat(seconds);
13
13
  };
14
- exports.millisToMinutesAndSeconds = millisToMinutesAndSeconds;
15
14
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["millisToMinutesAndSeconds","millis","minutes","Math","floor","seconds","toFixed","concat","exports"],"sources":["utils.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const millisToMinutesAndSeconds = (millis: number) => {\n const minutes = Math.floor(millis / 60000);\n const seconds = ((millis % 60000) / 1000).toFixed(0);\n\n return `${minutes}:${+seconds < 10 ? '0' : ''}${seconds}`;\n};\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAIC,MAAc,EAAK;EAC3D,IAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,MAAM,GAAG,KAAK,CAAC;EAC1C,IAAMI,OAAO,GAAG,CAAEJ,MAAM,GAAG,KAAK,GAAI,IAAI,EAAEK,OAAO,CAAC,CAAC,CAAC;EAEpD,UAAAC,MAAA,CAAUL,OAAO,OAAAK,MAAA,CAAI,CAACF,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAAE,MAAA,CAAGF,OAAO;AACzD,CAAC;AAACG,OAAA,CAAAR,yBAAA,GAAAA,yBAAA"}
1
+ {"version":3,"names":["millisToMinutesAndSeconds","exports","millis","minutes","Math","floor","seconds","toFixed","concat"],"sources":["utils.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const millisToMinutesAndSeconds = (millis: number) => {\n const minutes = Math.floor(millis / 60000);\n const seconds = ((millis % 60000) / 1000).toFixed(0);\n\n return `${minutes}:${+seconds < 10 ? '0' : ''}${seconds}`;\n};\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,SAA5BA,yBAAyBA,CAAIE,MAAc,EAAK;EAC3D,IAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACH,MAAM,GAAG,KAAK,CAAC;EAC1C,IAAMI,OAAO,GAAG,CAAEJ,MAAM,GAAG,KAAK,GAAI,IAAI,EAAEK,OAAO,CAAC,CAAC,CAAC;EAEpD,UAAAC,MAAA,CAAUL,OAAO,OAAAK,MAAA,CAAI,CAACF,OAAO,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAAE,MAAA,CAAGF,OAAO;AACzD,CAAC"}
package/dist/voicea.js CHANGED
@@ -22,13 +22,13 @@ var _webexCore = require("@webex/webex-core");
22
22
  var _constants = require("./constants");
23
23
  var _utils = require("./utils");
24
24
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
25
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
25
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } // eslint-disable-next-line no-unused-vars
26
26
  /**
27
27
  * @description VoiceaChannel to hold single instance of LLM
28
28
  * @export
29
29
  * @class VoiceaChannel
30
30
  */
31
- var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
31
+ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
32
32
  (0, _inherits2.default)(VoiceaChannel, _WebexPlugin);
33
33
  var _super = _createSuper(VoiceaChannel);
34
34
  /**
@@ -44,10 +44,11 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
44
44
  _this = _super.call.apply(_super, [this].concat(args));
45
45
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.VOICEA);
46
46
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "seqNum", void 0);
47
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasVoiceaJoined", void 0);
48
47
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "areCaptionsEnabled", void 0);
49
48
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasSubscribedToEvents", false);
50
49
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "vmcDeviceId", void 0);
50
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announceStatus", void 0);
51
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "captionStatus", void 0);
51
52
  /**
52
53
  * @param {Object} e
53
54
  * @returns {undefined}
@@ -57,7 +58,7 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
57
58
  switch (e.data.relayType) {
58
59
  case _constants.VOICEA_RELAY_TYPES.ANNOUNCEMENT:
59
60
  _this.vmcDeviceId = e.headers.from;
60
- _this.hasVoiceaJoined = true;
61
+ _this.announceStatus = _constants.ANNOUNCE_STATUS.JOINED;
61
62
  _this.processAnnouncementMessage(e.data.voiceaPayload);
62
63
  break;
63
64
  case _constants.VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
@@ -94,6 +95,7 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
94
95
  }, _constants.EVENT_TRIGGERS.NEW_CAPTION, {
95
96
  isFinal: true,
96
97
  transcriptId: voiceaPayload.transcript_id,
98
+ translations: voiceaPayload.translations,
97
99
  transcript: {
98
100
  csis: voiceaPayload.csis,
99
101
  text: voiceaPayload.transcript.text,
@@ -182,8 +184,7 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
182
184
  * @returns {void}
183
185
  */
184
186
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendAnnouncement", function () {
185
- // @ts-ignore
186
- if (_this.hasVoiceaJoined || !_this.webex.internal.llm.isConnected()) return;
187
+ _this.announceStatus = _constants.ANNOUNCE_STATUS.JOINING;
187
188
  _this.listenToEvents();
188
189
  // @ts-ignore
189
190
  _this.webex.internal.llm.socket.send({
@@ -218,7 +219,9 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
218
219
  // @ts-ignore
219
220
  url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
220
221
  body: {
221
- languageCode: languageCode
222
+ transcribe: {
223
+ spokenLanguage: languageCode
224
+ }
222
225
  }
223
226
  }).then(function () {
224
227
  _pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
@@ -262,78 +265,144 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
262
265
  _this.seqNum += 1;
263
266
  });
264
267
  /**
265
- * Turn on Captions
268
+ * request turn on Captions
269
+ * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
266
270
  * @returns {Promise}
267
271
  */
268
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "turnOnCaptions", /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
269
- return _regenerator.default.wrap(function _callee$(_context) {
270
- while (1) switch (_context.prev = _context.next) {
271
- case 0:
272
- if (!(_this.hasVoiceaJoined && _this.areCaptionsEnabled)) {
273
- _context.next = 2;
274
- break;
275
- }
276
- return _context.abrupt("return", undefined);
277
- case 2:
278
- return _context.abrupt("return", _this.request({
279
- method: 'PUT',
280
- // @ts-ignore
281
- url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
282
- body: {
283
- transcribe: {
284
- caption: true
285
- }
286
- }
287
- }).then(function () {
288
- _pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
289
- file: 'voicea',
290
- function: 'turnOnCaptions'
291
- }, _constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
292
- _this.areCaptionsEnabled = true;
293
- _this.sendAnnouncement();
294
- }));
295
- case 3:
296
- case "end":
297
- return _context.stop();
298
- }
299
- }, _callee);
300
- })));
272
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "requestTurnOnCaptions", function (languageCode) {
273
+ _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.SENDING;
274
+
275
+ // only set the spoken language if it is provided
276
+ var body = {
277
+ transcribe: {
278
+ caption: true
279
+ },
280
+ languageCode: languageCode
281
+ };
282
+
283
+ // @ts-ignore
284
+ // eslint-disable-next-line newline-before-return
285
+ return _this.request({
286
+ method: 'PUT',
287
+ // @ts-ignore
288
+ url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
289
+ body: body
290
+ }).then(function () {
291
+ _pluginMeetings.TriggerProxy.trigger((0, _assertThisInitialized2.default)(_this), {
292
+ file: 'voicea',
293
+ function: 'turnOnCaptions'
294
+ }, _constants.EVENT_TRIGGERS.CAPTIONS_TURNED_ON);
295
+ _this.areCaptionsEnabled = true;
296
+ _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.ENABLED;
297
+ _this.announce();
298
+ }).catch(function () {
299
+ _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
300
+ throw new Error('turn on captions fail');
301
+ });
302
+ });
301
303
  /**
302
- * Toggle transcribing for highlights
303
- * @param {bool} activate if true transcribing is turned on
304
+ * is announce processing
305
+ * @returns {boolean}
306
+ */
307
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isAnnounceProcessing", function () {
308
+ return [_constants.ANNOUNCE_STATUS.JOINING, _constants.ANNOUNCE_STATUS.JOINED].includes(_this.announceStatus);
309
+ });
310
+ /**
311
+ * announce to voicea data chanel
312
+ * @returns {void}
313
+ */
314
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "announce", function () {
315
+ if (_this.isAnnounceProcessing()) return;
316
+ // @ts-ignore
317
+ if (!_this.webex.internal.llm.isConnected()) {
318
+ throw new Error('voicea can not announce before llm connected');
319
+ }
320
+ _this.sendAnnouncement();
321
+ });
322
+ /**
323
+ * is turn on caption processing
324
+ * @returns {boolean}
325
+ */
326
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isCaptionProcessing", function () {
327
+ return [_constants.TURN_ON_CAPTION_STATUS.SENDING, _constants.TURN_ON_CAPTION_STATUS.ENABLED].includes(_this.captionStatus);
328
+ });
329
+ /**
330
+ * Turn on Captions
331
+ * @param {string} [spokenLanguage] - Optional Spoken language code
304
332
  * @returns {Promise}
305
333
  */
306
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleTranscribing", /*#__PURE__*/function () {
307
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(activate) {
308
- return _regenerator.default.wrap(function _callee2$(_context2) {
309
- while (1) switch (_context2.prev = _context2.next) {
334
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "turnOnCaptions", /*#__PURE__*/function () {
335
+ var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(spokenLanguage) {
336
+ return _regenerator.default.wrap(function _callee$(_context) {
337
+ while (1) switch (_context.prev = _context.next) {
310
338
  case 0:
311
- return _context2.abrupt("return", _this.request({
312
- method: 'PUT',
313
- // @ts-ignore
314
- url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
315
- body: {
316
- transcribe: {
317
- transcribing: activate
318
- }
319
- }
320
- }).then(function () {
321
- if (activate && !_this.areCaptionsEnabled && !_this.hasVoiceaJoined) _this.turnOnCaptions();
322
- }));
323
- case 1:
339
+ if (!_this.isCaptionProcessing()) {
340
+ _context.next = 2;
341
+ break;
342
+ }
343
+ return _context.abrupt("return", undefined);
344
+ case 2:
345
+ if (_this.webex.internal.llm.isConnected()) {
346
+ _context.next = 4;
347
+ break;
348
+ }
349
+ throw new Error('can not turn on captions before llm connected');
350
+ case 4:
351
+ return _context.abrupt("return", _this.requestTurnOnCaptions(spokenLanguage));
352
+ case 5:
324
353
  case "end":
325
- return _context2.stop();
354
+ return _context.stop();
326
355
  }
327
- }, _callee2);
356
+ }, _callee);
328
357
  }));
329
358
  return function (_x) {
330
- return _ref2.apply(this, arguments);
359
+ return _ref.apply(this, arguments);
331
360
  };
332
361
  }());
362
+ /**
363
+ * Toggle transcribing for highlights
364
+ * @param {bool} activate if true transcribing is turned on
365
+ * @param {string} spokenLanguage language code for spoken language
366
+ * @returns {Promise}
367
+ */
368
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "toggleTranscribing", function (activate, spokenLanguage) {
369
+ // @ts-ignore
370
+ return _this.request({
371
+ method: 'PUT',
372
+ // @ts-ignore
373
+ url: "".concat(_this.webex.internal.llm.getLocusUrl(), "/controls/"),
374
+ body: {
375
+ transcribe: {
376
+ transcribing: activate
377
+ },
378
+ spokenLanguage: spokenLanguage
379
+ }
380
+ }).then(function () {
381
+ if (activate && !_this.areCaptionsEnabled) {
382
+ return _this.turnOnCaptions(spokenLanguage);
383
+ }
384
+ return undefined;
385
+ });
386
+ });
387
+ /**
388
+ * get caption status
389
+ * @returns {string}
390
+ */
391
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getCaptionStatus", function () {
392
+ return _this.captionStatus;
393
+ });
394
+ /**
395
+ * get announce status
396
+ * @returns {string}
397
+ */
398
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getAnnounceStatus", function () {
399
+ return _this.announceStatus;
400
+ });
333
401
  _this.seqNum = 1;
334
- _this.hasVoiceaJoined = false;
335
402
  _this.areCaptionsEnabled = false;
336
403
  _this.vmcDeviceId = undefined;
404
+ _this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
405
+ _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
337
406
  return _this;
338
407
  }
339
408
  (0, _createClass2.default)(VoiceaChannel, [{
@@ -351,21 +420,23 @@ var VoiceaChannel = /*#__PURE__*/function (_WebexPlugin) {
351
420
  }
352
421
  }
353
422
 
354
- // @ts-ignore
423
+ /**
424
+ * Listen to websocket messages
425
+ * @returns {void}
426
+ */
355
427
  }, {
356
428
  key: "deregisterEvents",
357
429
  value: function deregisterEvents() {
358
- this.hasVoiceaJoined = false;
359
430
  this.areCaptionsEnabled = false;
360
431
  this.vmcDeviceId = undefined;
361
432
  // @ts-ignore
362
433
  this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
363
434
  this.hasSubscribedToEvents = false;
435
+ this.announceStatus = _constants.ANNOUNCE_STATUS.IDLE;
436
+ this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
364
437
  }
365
438
  }]);
366
439
  return VoiceaChannel;
367
440
  }(_webexCore.WebexPlugin);
368
- exports.VoiceaChannel = VoiceaChannel;
369
- var _default = VoiceaChannel;
370
- exports.default = _default;
441
+ var _default = exports.default = VoiceaChannel;
371
442
  //# sourceMappingURL=voicea.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_uuid","_interopRequireDefault","require","_pluginMeetings","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","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","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","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","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","areCaptionsEnabled","abrupt","undefined","transcribe","caption","CAPTIONS_TURNED_ON","sendAnnouncement","stop","_ref2","_callee2","activate","_callee2$","_context2","transcribing","turnOnCaptions","_x","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","exports","_default"],"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 * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\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 hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (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 * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n // @ts-ignore\n public deregisterEvents() {\n this.hasVoiceaJoined = false;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\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.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 // @ts-ignore\n if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;\n\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\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 // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\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 // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\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 // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\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 // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {transcribing: activate},\n },\n }).then(() => {\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":["_uuid","_interopRequireDefault","require","_pluginMeetings","_webexCore","_constants","_utils","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","VoiceaChannel","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","VOICEA","seqNum","sequenceNumber","data","relayType","VOICEA_RELAY_TYPES","ANNOUNCEMENT","vmcDeviceId","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","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","translations","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","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","spokenLanguages","ASR","spoken_languages","VOICEA_ANNOUNCEMENT","JOINING","listenToEvents","webex","internal","llm","socket","send","id","recipients","route","getBinding","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageCode","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isConnected","to","translationLanguage","TRANSLATION_REQUEST","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","includes","isAnnounceProcessing","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_callee$","_context","prev","next","isCaptionProcessing","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"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 {\n EVENT_TRIGGERS,\n VOICEA_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n} 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 * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private vmcDeviceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (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.announceStatus = ANNOUNCE_STATUS.JOINED;\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 * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.vmcDeviceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\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 translations: voiceaPayload.translations,\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 this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\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 // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n },\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 // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) return;\n // @ts-ignore\n this.webex.internal.llm.socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\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 * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\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.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessing()) return;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.isCaptionProcessing()) return undefined;\n // @ts-ignore\n if (!this.webex.internal.llm.isConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {bool} activate if true transcribing is turned on\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\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 =\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 type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\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, spokenLanguage: string) => undefined | Promise<void>;\n deregisterEvents: () => void;\n}\n\nexport type {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n Transcription,\n Highlight,\n IVoiceaChannel,\n};\n"],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,5 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-voicea",
3
- "version": "2.60.0",
4
3
  "description": "",
5
4
  "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
6
5
  "main": "dist/index.js",
@@ -11,13 +10,13 @@
11
10
  "directory": "packages/@webex/internal-plugin-voicea"
12
11
  },
13
12
  "engines": {
14
- "node": ">=14"
13
+ "node": ">=16"
15
14
  },
16
15
  "dependencies": {
17
- "@webex/internal-plugin-llm": "2.60.0",
18
- "@webex/internal-plugin-mercury": "2.60.0",
19
- "@webex/plugin-meetings": "2.60.0",
20
- "@webex/webex-core": "2.60.0",
16
+ "@webex/internal-plugin-llm": "2.60.1-next.9",
17
+ "@webex/internal-plugin-mercury": "2.60.1-next.9",
18
+ "@webex/plugin-meetings": "2.60.1-next.10",
19
+ "@webex/webex-core": "2.60.1-next.9",
21
20
  "uuid": "^3.3.2"
22
21
  },
23
22
  "browserify": {
@@ -28,15 +27,15 @@
28
27
  },
29
28
  "devDependencies": {
30
29
  "@babel/core": "^7.17.10",
31
- "@webex/babel-config-legacy": "2.60.0",
32
- "@webex/eslint-config-legacy": "2.60.0",
33
- "@webex/jest-config-legacy": "2.60.0",
34
- "@webex/legacy-tools": "2.60.0",
35
- "@webex/test-helper-chai": "2.60.0",
36
- "@webex/test-helper-mocha": "2.60.0",
37
- "@webex/test-helper-mock-web-socket": "2.60.0",
38
- "@webex/test-helper-mock-webex": "2.60.0",
39
- "@webex/test-helper-test-users": "2.60.0",
30
+ "@webex/babel-config-legacy": "0.0.0",
31
+ "@webex/eslint-config-legacy": "0.0.0",
32
+ "@webex/jest-config-legacy": "0.0.0",
33
+ "@webex/legacy-tools": "0.0.0",
34
+ "@webex/test-helper-chai": "2.60.1-next.9",
35
+ "@webex/test-helper-mocha": "2.60.1-next.9",
36
+ "@webex/test-helper-mock-web-socket": "2.60.1-next.9",
37
+ "@webex/test-helper-mock-webex": "2.60.1-next.9",
38
+ "@webex/test-helper-test-users": "2.60.1-next.9",
40
39
  "eslint": "^8.24.0",
41
40
  "prettier": "^2.7.1",
42
41
  "sinon": "^9.2.4"
@@ -44,10 +43,12 @@
44
43
  "scripts": {
45
44
  "build": "yarn build:src",
46
45
  "build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
46
+ "deploy:npm": "yarn npm publish",
47
47
  "test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
48
48
  "test:browser:broken": "webex-legacy-tools test --integration --unit --runner karma",
49
49
  "test:integration": "webex-legacy-tools test --integration --runner mocha",
50
50
  "test:style": "eslint ./src/**/*.*",
51
51
  "test:unit": "webex-legacy-tools test --unit --runner jest"
52
- }
53
- }
52
+ },
53
+ "version": "2.60.1-next.10"
54
+ }
package/src/constants.ts CHANGED
@@ -30,3 +30,15 @@ export const TRANSCRIPTION_TYPE = {
30
30
  };
31
31
 
32
32
  export const VOICEA = 'voicea';
33
+
34
+ export const ANNOUNCE_STATUS = {
35
+ IDLE: 'idle',
36
+ JOINED: 'joined',
37
+ JOINING: 'joining',
38
+ };
39
+
40
+ export const TURN_ON_CAPTION_STATUS = {
41
+ IDLE: 'idle',
42
+ ENABLED: 'enabled',
43
+ SENDING: 'sending',
44
+ };
package/src/index.ts CHANGED
@@ -5,3 +5,4 @@ import VoiceaChannel from './voicea';
5
5
  WebexCore.registerInternalPlugin('voicea', VoiceaChannel, {});
6
6
 
7
7
  export {default} from './voicea';
8
+ export {EVENT_TRIGGERS, TURN_ON_CAPTION_STATUS} from './constants';
package/src/voicea.ts CHANGED
@@ -2,7 +2,14 @@ import uuid from 'uuid';
2
2
  import {TriggerProxy as Trigger} from '@webex/plugin-meetings';
3
3
  import {WebexPlugin, config} from '@webex/webex-core';
4
4
 
5
- import {EVENT_TRIGGERS, VOICEA_RELAY_TYPES, TRANSCRIPTION_TYPE, VOICEA} from './constants';
5
+ import {
6
+ EVENT_TRIGGERS,
7
+ VOICEA_RELAY_TYPES,
8
+ TRANSCRIPTION_TYPE,
9
+ VOICEA,
10
+ ANNOUNCE_STATUS,
11
+ TURN_ON_CAPTION_STATUS,
12
+ } from './constants';
6
13
  // eslint-disable-next-line no-unused-vars
7
14
  import {
8
15
  AnnouncementPayload,
@@ -22,14 +29,16 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
22
29
 
23
30
  private seqNum: number;
24
31
 
25
- private hasVoiceaJoined: boolean;
26
-
27
32
  private areCaptionsEnabled: boolean;
28
33
 
29
34
  private hasSubscribedToEvents = false;
30
35
 
31
36
  private vmcDeviceId?: string;
32
37
 
38
+ private announceStatus: string;
39
+
40
+ private captionStatus: string;
41
+
33
42
  /**
34
43
  * @param {Object} e
35
44
  * @returns {undefined}
@@ -40,7 +49,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
40
49
  switch (e.data.relayType) {
41
50
  case VOICEA_RELAY_TYPES.ANNOUNCEMENT:
42
51
  this.vmcDeviceId = e.headers.from;
43
- this.hasVoiceaJoined = true;
52
+ this.announceStatus = ANNOUNCE_STATUS.JOINED;
44
53
  this.processAnnouncementMessage(e.data.voiceaPayload);
45
54
  break;
46
55
  case VOICEA_RELAY_TYPES.TRANSLATION_RESPONSE:
@@ -66,14 +75,18 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
66
75
  }
67
76
  }
68
77
 
69
- // @ts-ignore
78
+ /**
79
+ * Listen to websocket messages
80
+ * @returns {void}
81
+ */
70
82
  public deregisterEvents() {
71
- this.hasVoiceaJoined = false;
72
83
  this.areCaptionsEnabled = false;
73
84
  this.vmcDeviceId = undefined;
74
85
  // @ts-ignore
75
86
  this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
76
87
  this.hasSubscribedToEvents = false;
88
+ this.announceStatus = ANNOUNCE_STATUS.IDLE;
89
+ this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
77
90
  }
78
91
 
79
92
  /**
@@ -83,9 +96,10 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
83
96
  constructor(...args) {
84
97
  super(...args);
85
98
  this.seqNum = 1;
86
- this.hasVoiceaJoined = false;
87
99
  this.areCaptionsEnabled = false;
88
100
  this.vmcDeviceId = undefined;
101
+ this.announceStatus = ANNOUNCE_STATUS.IDLE;
102
+ this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
89
103
  }
90
104
 
91
105
  /**
@@ -122,6 +136,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
122
136
  {
123
137
  isFinal: true,
124
138
  transcriptId: voiceaPayload.transcript_id,
139
+ translations: voiceaPayload.translations,
125
140
  transcript: {
126
141
  csis: voiceaPayload.csis,
127
142
  text: voiceaPayload.transcript.text,
@@ -243,9 +258,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
243
258
  * @returns {void}
244
259
  */
245
260
  private sendAnnouncement = (): void => {
246
- // @ts-ignore
247
- if (this.hasVoiceaJoined || !this.webex.internal.llm.isConnected()) return;
248
-
261
+ this.announceStatus = ANNOUNCE_STATUS.JOINING;
249
262
  this.listenToEvents();
250
263
  // @ts-ignore
251
264
  this.webex.internal.llm.socket.send({
@@ -280,7 +293,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
280
293
  // @ts-ignore
281
294
  url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
282
295
  body: {
283
- languageCode,
296
+ transcribe: {
297
+ spokenLanguage: languageCode,
298
+ },
284
299
  },
285
300
  }).then(() => {
286
301
  Trigger.trigger(
@@ -327,52 +342,129 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
327
342
  };
328
343
 
329
344
  /**
330
- * Turn on Captions
345
+ * request turn on Captions
346
+ * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English
331
347
  * @returns {Promise}
332
348
  */
333
- public turnOnCaptions = async (): undefined | Promise<void> => {
334
- if (this.hasVoiceaJoined && this.areCaptionsEnabled) return undefined;
349
+ private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {
350
+ this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;
351
+
352
+ // only set the spoken language if it is provided
353
+ const body = {
354
+ transcribe: {caption: true},
355
+ languageCode,
356
+ };
357
+
335
358
  // @ts-ignore
336
359
  // eslint-disable-next-line newline-before-return
337
360
  return this.request({
338
361
  method: 'PUT',
339
362
  // @ts-ignore
340
363
  url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
341
- body: {
342
- transcribe: {caption: true},
343
- },
344
- }).then(() => {
345
- Trigger.trigger(
346
- this,
347
- {
348
- file: 'voicea',
349
- function: 'turnOnCaptions',
350
- },
351
- EVENT_TRIGGERS.CAPTIONS_TURNED_ON
352
- );
353
- this.areCaptionsEnabled = true;
354
- this.sendAnnouncement();
355
- });
364
+ body,
365
+ })
366
+ .then(() => {
367
+ Trigger.trigger(
368
+ this,
369
+ {
370
+ file: 'voicea',
371
+ function: 'turnOnCaptions',
372
+ },
373
+ EVENT_TRIGGERS.CAPTIONS_TURNED_ON
374
+ );
375
+ this.areCaptionsEnabled = true;
376
+ this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;
377
+ this.announce();
378
+ })
379
+ .catch(() => {
380
+ this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
381
+ throw new Error('turn on captions fail');
382
+ });
383
+ };
384
+
385
+ /**
386
+ * is announce processing
387
+ * @returns {boolean}
388
+ */
389
+ private isAnnounceProcessing = () =>
390
+ [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);
391
+
392
+ /**
393
+ * announce to voicea data chanel
394
+ * @returns {void}
395
+ */
396
+ public announce = () => {
397
+ if (this.isAnnounceProcessing()) return;
398
+ // @ts-ignore
399
+ if (!this.webex.internal.llm.isConnected()) {
400
+ throw new Error('voicea can not announce before llm connected');
401
+ }
402
+ this.sendAnnouncement();
403
+ };
404
+
405
+ /**
406
+ * is turn on caption processing
407
+ * @returns {boolean}
408
+ */
409
+ private isCaptionProcessing = () =>
410
+ [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);
411
+
412
+ /**
413
+ * Turn on Captions
414
+ * @param {string} [spokenLanguage] - Optional Spoken language code
415
+ * @returns {Promise}
416
+ */
417
+ public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {
418
+ if (this.isCaptionProcessing()) return undefined;
419
+ // @ts-ignore
420
+ if (!this.webex.internal.llm.isConnected()) {
421
+ throw new Error('can not turn on captions before llm connected');
422
+ }
423
+
424
+ return this.requestTurnOnCaptions(spokenLanguage);
356
425
  };
357
426
 
358
427
  /**
359
428
  * Toggle transcribing for highlights
360
429
  * @param {bool} activate if true transcribing is turned on
430
+ * @param {string} spokenLanguage language code for spoken language
361
431
  * @returns {Promise}
362
432
  */
363
- public toggleTranscribing = async (activate: boolean): undefined | Promise<void> => {
433
+ public toggleTranscribing = (
434
+ activate: boolean,
435
+ spokenLanguage?: string
436
+ ): undefined | Promise<void> => {
364
437
  // @ts-ignore
365
438
  return this.request({
366
439
  method: 'PUT',
367
440
  // @ts-ignore
368
441
  url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,
369
442
  body: {
370
- transcribe: {transcribing: activate},
443
+ transcribe: {
444
+ transcribing: activate,
445
+ },
446
+ spokenLanguage,
371
447
  },
372
- }).then(() => {
373
- if (activate && !this.areCaptionsEnabled && !this.hasVoiceaJoined) this.turnOnCaptions();
448
+ }).then((): undefined | Promise<void> => {
449
+ if (activate && !this.areCaptionsEnabled) {
450
+ return this.turnOnCaptions(spokenLanguage);
451
+ }
452
+
453
+ return undefined;
374
454
  });
375
455
  };
456
+
457
+ /**
458
+ * get caption status
459
+ * @returns {string}
460
+ */
461
+ public getCaptionStatus = () => this.captionStatus;
462
+
463
+ /**
464
+ * get announce status
465
+ * @returns {string}
466
+ */
467
+ public getAnnounceStatus = () => this.announceStatus;
376
468
  }
377
469
 
378
470
  export default VoiceaChannel;
@@ -78,8 +78,8 @@ interface IVoiceaChannel {
78
78
  setSpokenLanguage: (languageCode: string) => Promise<void>;
79
79
  requestLanguage: (languageCode: string) => void;
80
80
  turnOnCaptions: () => undefined | Promise<void>;
81
- toggleTranscribing: (activate: boolean) => undefined | Promise<void>;
82
- deregisterEvents: () => undefined | Promise<void>;
81
+ toggleTranscribing: (activate: boolean, spokenLanguage: string) => undefined | Promise<void>;
82
+ deregisterEvents: () => void;
83
83
  }
84
84
 
85
85
  export type {
@@ -1,6 +1,7 @@
1
+ import 'jsdom-global/register';
1
2
  import MockWebex from '@webex/test-helper-mock-webex';
2
3
  import MockWebSocket from '@webex/test-helper-mock-web-socket';
3
- import {assert} from '@webex/test-helper-chai';
4
+ import {assert, expect} from '@webex/test-helper-chai';
4
5
  import sinon from 'sinon';
5
6
  import Mercury from '@webex/internal-plugin-mercury';
6
7
  import LLMChannel from '@webex/internal-plugin-llm';
@@ -41,17 +42,26 @@ describe('plugin-voicea', () => {
41
42
  });
42
43
  });
43
44
 
45
+ describe("#constructor", () => {
46
+ it('should init status', () => {
47
+ assert.equal(voiceaService.announceStatus, 'idle');
48
+ assert.equal(voiceaService.captionStatus, 'idle');
49
+ });
50
+ });
51
+
44
52
  describe('#sendAnnouncement', () => {
45
53
  beforeEach(async () => {
46
54
  const mockWebSocket = new MockWebSocket();
47
55
 
48
56
  voiceaService.webex.internal.llm.socket = mockWebSocket;
57
+ voiceaService.announceStatus = "idle";
49
58
  });
50
59
 
51
60
  it("sends announcement if voicea hasn't joined", () => {
52
61
  const spy = sinon.spy(voiceaService, 'listenToEvents');
53
62
 
54
63
  voiceaService.sendAnnouncement();
64
+ assert.equal(voiceaService.announceStatus, 'joining');
55
65
  assert.calledOnce(spy);
56
66
 
57
67
  assert.calledOnceWithExactly(voiceaService.webex.internal.llm.socket.send, {
@@ -98,14 +108,14 @@ describe('plugin-voicea', () => {
98
108
  data: {relayType: 'voicea.annc', voiceaPayload: {}},
99
109
  });
100
110
 
101
- assert.equal(voiceaService.hasVoiceaJoined, true);
102
111
  assert.equal(voiceaService.areCaptionsEnabled, true);
103
112
  assert.equal(voiceaService.vmcDeviceId, 'ws');
104
113
 
105
114
  voiceaService.deregisterEvents();
106
- assert.equal(voiceaService.hasVoiceaJoined, false);
107
115
  assert.equal(voiceaService.areCaptionsEnabled, false);
108
116
  assert.equal(voiceaService.vmcDeviceId, undefined);
117
+ assert.equal(voiceaService.announceStatus, 'idle');
118
+ assert.equal(voiceaService.captionStatus, 'idle');
109
119
  });
110
120
  });
111
121
  describe('#processAnnouncementMessage', () => {
@@ -192,28 +202,38 @@ describe('plugin-voicea', () => {
192
202
  sinon.match({
193
203
  method: 'PUT',
194
204
  url: `${locusUrl}/controls/`,
195
- body: {languageCode},
205
+ body: {
206
+ transcribe: {
207
+ spokenLanguage: languageCode
208
+ }
209
+ },
196
210
  })
197
211
  );
198
212
  });
199
213
  });
200
214
 
201
- describe('#turnOnCaptions', () => {
215
+ describe('#requestTurnOnCaptions', () => {
202
216
  beforeEach(async () => {
203
217
  const mockWebSocket = new MockWebSocket();
204
218
 
205
219
  voiceaService.webex.internal.llm.socket = mockWebSocket;
220
+ voiceaService.captionStatus = 'idle';
206
221
  });
207
222
 
223
+ afterEach( () => {
224
+ voiceaService.captionStatus = 'idle';
225
+ })
226
+
208
227
  it('turns on captions', async () => {
209
- const announcementSpy = sinon.spy(voiceaService, 'sendAnnouncement');
228
+ const announcementSpy = sinon.spy(voiceaService, 'announce');
210
229
 
211
230
  const triggerSpy = sinon.spy();
212
231
 
213
232
  voiceaService.on(EVENT_TRIGGERS.CAPTIONS_TURNED_ON, triggerSpy);
214
233
  voiceaService.listenToEvents();
215
234
 
216
- await voiceaService.turnOnCaptions();
235
+ await voiceaService.requestTurnOnCaptions();
236
+ assert.equal(voiceaService.captionStatus, 'enabled');
217
237
  sinon.assert.calledWith(
218
238
  voiceaService.request,
219
239
  sinon.match({
@@ -228,18 +248,119 @@ describe('plugin-voicea', () => {
228
248
  assert.calledOnce(announcementSpy);
229
249
  });
230
250
 
231
- it("doesn't call API on captions", async () => {
232
- await voiceaService.turnOnCaptions();
251
+ it("should handle request fail", async () => {
252
+ voiceaService.captionStatus = 'sending';
253
+ voiceaService.request = sinon.stub().rejects();
254
+
255
+ try {
256
+ await voiceaService.requestTurnOnCaptions();
257
+ } catch (error) {
258
+ expect(error.message).to.include('turn on captions fail');
259
+ return;
260
+ }
261
+ assert.equal(voiceaService.captionStatus, 'idle');
262
+ });
263
+ });
233
264
 
234
- // eslint-disable-next-line no-underscore-dangle
235
- voiceaService.webex.internal.llm._emit('event:relay.event', {
236
- headers: {from: 'ws'},
237
- data: {relayType: 'voicea.annc', voiceaPayload: {}},
265
+ describe("#isAnnounceProcessing", () => {
266
+ afterEach(() => {
267
+ voiceaService.announceStatus = 'idle';
268
+ });
269
+
270
+ ['joining', 'joined'].forEach((status) => {
271
+ it(`should return true when status is ${status}`, () => {
272
+ voiceaService.announceStatus = status;
273
+ assert.equal(voiceaService.isAnnounceProcessing(), true);
238
274
  });
275
+ });
276
+
277
+ it('should return false when status is not processing status', () => {
278
+ voiceaService.announceStatus = 'idle';
279
+ assert.equal(voiceaService.isAnnounceProcessing(), false);
280
+ });
281
+ });
282
+
283
+ describe("#announce", () => {
284
+ let isAnnounceProcessing, sendAnnouncement;
285
+ beforeEach(() => {
286
+ voiceaService.webex.internal.llm.isConnected.returns(true);
287
+ sendAnnouncement = sinon.stub(voiceaService, 'sendAnnouncement');
288
+ isAnnounceProcessing = sinon.stub(voiceaService, 'isAnnounceProcessing').returns(false)
289
+ });
239
290
 
240
- const response = await voiceaService.turnOnCaptions();
291
+ afterEach(() => {
292
+ voiceaService.webex.internal.llm.isConnected.returns(true);
293
+ isAnnounceProcessing.restore();
294
+ sendAnnouncement.restore();
295
+ });
241
296
 
242
- assert.equal(response, undefined);
297
+ it('announce to llm data channel', ()=> {
298
+ voiceaService.announce();
299
+ assert.calledOnce(sendAnnouncement);
300
+ });
301
+
302
+ it('announce to llm data channel before llm connected', ()=> {
303
+ voiceaService.webex.internal.llm.isConnected.returns(false);
304
+ assert.throws(() => voiceaService.announce(), "voicea can not announce before llm connected");
305
+ assert.notCalled(sendAnnouncement);
306
+ });
307
+
308
+ it('should not announce duplicate', () => {
309
+ isAnnounceProcessing.returns(true);
310
+ voiceaService.announce();
311
+ assert.notCalled(sendAnnouncement);
312
+ })
313
+ });
314
+
315
+ describe("#isCaptionProcessing", () => {
316
+ afterEach(() => {
317
+ voiceaService.captionStatus = 'idle';
318
+ });
319
+
320
+ ['sending', 'enabled'].forEach((status) => {
321
+ it(`should return true when status is ${status}`, () => {
322
+ voiceaService.captionStatus = status;
323
+ assert.equal(voiceaService.isCaptionProcessing(), true);
324
+ });
325
+ });
326
+
327
+ it('should return false when status is not processing status', () => {
328
+ voiceaService.captionStatus = 'idle';
329
+ assert.equal(voiceaService.isCaptionProcessing(), false);
330
+ });
331
+ });
332
+
333
+ describe('#turnOnCaptions', () => {
334
+ let requestTurnOnCaptions, isCaptionProcessing;
335
+ beforeEach(() => {
336
+ requestTurnOnCaptions = sinon.stub(voiceaService, 'requestTurnOnCaptions');
337
+ isCaptionProcessing = sinon.stub(voiceaService, 'isCaptionProcessing').returns(false);
338
+ voiceaService.webex.internal.llm.isConnected.returns(true);
339
+ });
340
+
341
+ afterEach(() => {
342
+ requestTurnOnCaptions.restore();
343
+ isCaptionProcessing.restore();
344
+ voiceaService.webex.internal.llm.isConnected.returns(true);
345
+ });
346
+
347
+ it('call request turn on captions', () => {
348
+ isCaptionProcessing.returns(false);
349
+ voiceaService.turnOnCaptions();
350
+ assert.calledOnce(requestTurnOnCaptions);
351
+ });
352
+
353
+ it("turns on captions before llm connected", () => {
354
+ isCaptionProcessing.returns(false);
355
+ voiceaService.webex.internal.llm.isConnected.returns(true);
356
+ // assert.throws(() => voiceaService.turnOnCaptions(), "can not turn on captions before llm connected");
357
+ assert.notCalled(requestTurnOnCaptions);
358
+ });
359
+
360
+ it('should not turn on duplicate when processing', () => {
361
+ isCaptionProcessing.returns(true);
362
+ voiceaService.turnOnCaptions();
363
+ assert.notCalled(voiceaService.requestTurnOnCaptions);
243
364
  });
244
365
  });
245
366
 
@@ -430,6 +551,9 @@ describe('plugin-voicea', () => {
430
551
  transcript_id: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
431
552
  ts: 1611653204.3147924,
432
553
  type: 'transcript_final_result',
554
+ translations: {
555
+ en: "Hello?",
556
+ },
433
557
  transcript: {
434
558
  alignments: [
435
559
  {
@@ -479,6 +603,9 @@ describe('plugin-voicea', () => {
479
603
  assert.calledOnceWithExactly(triggerSpy, {
480
604
  isFinal: true,
481
605
  transcriptId: '3ec73890-bffb-f28b-e77f-99dc13caea7e',
606
+ translations: {
607
+ en: "Hello?"
608
+ },
482
609
  transcript: {
483
610
  csis: [3556942592],
484
611
  text: 'Hello?',
@@ -613,5 +740,19 @@ describe('plugin-voicea', () => {
613
740
  });
614
741
  });
615
742
  });
743
+
744
+ describe("#getCaptionStatus", () => {
745
+ it('works correctly', () => {
746
+ voiceaService.captionStatus = "enabled"
747
+ assert.equal(voiceaService.getCaptionStatus(), "enabled");
748
+ });
749
+ });
750
+
751
+ describe("#getAnnounceStatus", () => {
752
+ it('works correctly', () => {
753
+ voiceaService.announceStatus = "joined"
754
+ assert.equal(voiceaService.getAnnounceStatus(), "joined");
755
+ });
756
+ });
616
757
  });
617
758
  });