@webex/internal-plugin-llm 3.11.0 → 3.12.0-llmrefactor.1

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/README.md CHANGED
@@ -23,22 +23,73 @@ npm install --save @webex/internal-plugin-llm
23
23
 
24
24
  ```js
25
25
  import '@webex/internal-plugin-llm';
26
-
27
26
  import WebexCore from '@webex/webex-core';
28
27
 
29
28
  const webex = new WebexCore();
30
- // locusUrl is got from meeting.locusInfo.url;
31
- // datachannelUrl is got from meeting.locusInfo.info.datachannelUrl;
32
- webex.internal.llm.registerAndConnect(locusUrl, datachannelUrl);
33
-
34
- // Checks if LLM is connected
35
- webex.internal.llm.isConnected();
36
-
37
- // Disconnect LLM connection
38
- webex.internal.llm.disconnectLLM();
39
29
 
40
- // Get Locus URL
41
- webex.internal.llm.getLocusUrl();
30
+ // Create a new LLM channel (each meeting owns its own channel)
31
+ const llmChannel = webex.internal.llm.createChannel();
32
+
33
+ // locusUrl and datachannelUrl are from meeting.locusInfo
34
+ const locusUrl = meeting.locusInfo.url;
35
+ const datachannelUrl = meeting.locusInfo.info.datachannelUrl;
36
+
37
+ // Optional: set up token refresh handler before connecting
38
+ llmChannel.setRefreshHandler(async () => {
39
+ // Return shape must match plugin expectation
40
+ return {
41
+ body: {
42
+ datachannelToken: '<refreshed-jwt-token>',
43
+ datachannelTokenType: 'llm-default-session', // or 'llm-practice-session'
44
+ },
45
+ };
46
+ });
47
+
48
+ // Connect (with optional JWT token for data channel auth)
49
+ const datachannelToken = '<jwt-token>';
50
+ await llmChannel.registerAndConnect(locusUrl, datachannelUrl, datachannelToken);
51
+
52
+ // Subscribe to events directly on the channel
53
+ llmChannel.on('online', () => {
54
+ console.log('LLM connected');
55
+ });
56
+
57
+ llmChannel.on('event:relay.event', (envelope) => {
58
+ console.log('LLM event', envelope.data?.eventType);
59
+ });
60
+
61
+ // Channel status and metadata
62
+ llmChannel.isConnected();
63
+ llmChannel.isConnecting();
64
+ llmChannel.getBinding();
65
+ llmChannel.getLocusUrl();
66
+ llmChannel.getDatachannelUrl();
67
+ llmChannel.getSocket();
68
+
69
+ // Token management
70
+ llmChannel.setDatachannelToken(datachannelToken);
71
+ llmChannel.getDatachannelToken();
72
+ llmChannel.clearDatachannelToken();
73
+
74
+ // Manually trigger token refresh (if needed by your flow)
75
+ await llmChannel.refreshDataChannelToken();
76
+
77
+ // Disconnect when done (owner is responsible for cleanup)
78
+ await llmChannel.disconnect({code: 1000, reason: 'done'});
79
+
80
+ // --- Plugin-level methods ---
81
+
82
+ // Check if data channel token feature flag is enabled
83
+ await webex.internal.llm.isDataChannelTokenEnabled();
84
+
85
+ // Get all active channels (useful for diagnostics)
86
+ webex.internal.llm.getAllChannels();
87
+
88
+ // Find a channel by datachannel URL (used by interceptors)
89
+ webex.internal.llm.getChannelByDatachannelUrl(datachannelUrl);
90
+
91
+ // Disconnect all channels (useful for cleanup on logout)
92
+ await webex.internal.llm.disconnectAllChannels({code: 1000, reason: 'shutdown'});
42
93
  ```
43
94
 
44
95
  ## Maintainers
package/dist/constants.js CHANGED
@@ -4,7 +4,15 @@ 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.LLM = void 0;
7
+ exports.SUBSCRIPTION_AWARE_SUBCHANNELS_PARAM = exports.LLM_PRACTICE_SESSION = exports.LLM_DEFAULT_SESSION = exports.LLM = exports.DATA_CHNANEL_TYPE = exports.DATA_CHANNEL_WITH_JWT_TOKEN = exports.AWARE_DATA_CHANNEL = void 0;
8
8
  // eslint-disable-next-line import/prefer-default-export
9
9
  var LLM = exports.LLM = 'llm';
10
+ var LLM_DEFAULT_SESSION = exports.LLM_DEFAULT_SESSION = 'llm-default-session';
11
+ var LLM_PRACTICE_SESSION = exports.LLM_PRACTICE_SESSION = 'llm-practice-session';
12
+ var DATA_CHANNEL_WITH_JWT_TOKEN = exports.DATA_CHANNEL_WITH_JWT_TOKEN = 'data-channel-with-jwt-token';
13
+ var SUBSCRIPTION_AWARE_SUBCHANNELS_PARAM = exports.SUBSCRIPTION_AWARE_SUBCHANNELS_PARAM = 'subscriptionAwareSubchannels';
14
+ var DATA_CHNANEL_TYPE = exports.DATA_CHNANEL_TYPE = {
15
+ TRANSCRIPTION: 'transcription'
16
+ };
17
+ var AWARE_DATA_CHANNEL = exports.AWARE_DATA_CHANNEL = [DATA_CHNANEL_TYPE.TRANSCRIPTION];
10
18
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["LLM","exports"],"sources":["constants.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const LLM = 'llm';\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,GAAG,GAAAC,OAAA,CAAAD,GAAA,GAAG,KAAK","ignoreList":[]}
1
+ {"version":3,"names":["LLM","exports","LLM_DEFAULT_SESSION","LLM_PRACTICE_SESSION","DATA_CHANNEL_WITH_JWT_TOKEN","SUBSCRIPTION_AWARE_SUBCHANNELS_PARAM","DATA_CHNANEL_TYPE","TRANSCRIPTION","AWARE_DATA_CHANNEL"],"sources":["constants.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const LLM = 'llm';\n\nexport const LLM_DEFAULT_SESSION = 'llm-default-session';\nexport const LLM_PRACTICE_SESSION = 'llm-practice-session';\n\nexport const DATA_CHANNEL_WITH_JWT_TOKEN = 'data-channel-with-jwt-token';\n\nexport const SUBSCRIPTION_AWARE_SUBCHANNELS_PARAM = 'subscriptionAwareSubchannels';\n\nexport const DATA_CHNANEL_TYPE = {\n TRANSCRIPTION: 'transcription',\n};\n\nexport const AWARE_DATA_CHANNEL = [DATA_CHNANEL_TYPE.TRANSCRIPTION];\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,GAAG,GAAAC,OAAA,CAAAD,GAAA,GAAG,KAAK;AAEjB,IAAME,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,GAAG,qBAAqB;AACjD,IAAMC,oBAAoB,GAAAF,OAAA,CAAAE,oBAAA,GAAG,sBAAsB;AAEnD,IAAMC,2BAA2B,GAAAH,OAAA,CAAAG,2BAAA,GAAG,6BAA6B;AAEjE,IAAMC,oCAAoC,GAAAJ,OAAA,CAAAI,oCAAA,GAAG,8BAA8B;AAE3E,IAAMC,iBAAiB,GAAAL,OAAA,CAAAK,iBAAA,GAAG;EAC/BC,aAAa,EAAE;AACjB,CAAC;AAEM,IAAMC,kBAAkB,GAAAP,OAAA,CAAAO,kBAAA,GAAG,CAACF,iBAAiB,CAACC,aAAa,CAAC","ignoreList":[]}
package/dist/index.js CHANGED
@@ -4,19 +4,50 @@ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
4
  var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
5
5
  var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
6
  var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
7
8
  _Object$defineProperty(exports, "__esModule", {
8
9
  value: true
9
10
  });
11
+ _Object$defineProperty(exports, "DataChannelTokenType", {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return _llm.DataChannelTokenType;
15
+ }
16
+ });
17
+ _Object$defineProperty(exports, "LLMPlugin", {
18
+ enumerable: true,
19
+ get: function get() {
20
+ return _llmPlugin.default;
21
+ }
22
+ });
23
+ _Object$defineProperty(exports, "LLM_DEFAULT_SESSION", {
24
+ enumerable: true,
25
+ get: function get() {
26
+ return _constants.LLM_DEFAULT_SESSION;
27
+ }
28
+ });
29
+ _Object$defineProperty(exports, "LLM_PRACTICE_SESSION", {
30
+ enumerable: true,
31
+ get: function get() {
32
+ return _constants.LLM_PRACTICE_SESSION;
33
+ }
34
+ });
10
35
  _Object$defineProperty(exports, "default", {
11
36
  enumerable: true,
12
37
  get: function get() {
13
- return _llm.default;
38
+ return _llm2.default;
14
39
  }
15
40
  });
16
41
  var WebexCore = _interopRequireWildcard(require("@webex/webex-core"));
17
- var _llm = _interopRequireWildcard(require("./llm"));
42
+ var _llmPlugin = _interopRequireWildcard(require("./llm-plugin"));
43
+ var _llm = require("./llm.types");
44
+ var _constants = require("./constants");
45
+ var _llm2 = _interopRequireDefault(require("./llm"));
18
46
  function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
19
- WebexCore.registerInternalPlugin('llm', _llm.default, {
20
- config: _llm.config
47
+ WebexCore.registerInternalPlugin('llm', _llmPlugin.default, {
48
+ config: _llmPlugin.config,
49
+ onBeforeLogout: function onBeforeLogout() {
50
+ return this.disconnectAllChannels();
51
+ }
21
52
  });
22
53
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["WebexCore","_interopRequireWildcard","require","_llm","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","registerInternalPlugin","LLMChannel","config"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\nimport LLMChannel, {config} from './llm';\n\nWebexCore.registerInternalPlugin('llm', LLMChannel, {\n config,\n});\n\nexport {default} from './llm';\n"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,IAAA,GAAAF,uBAAA,CAAAC,OAAA;AAAyC,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,QAAA,MAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAL,uBAAA,YAAAA,wBAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,gBAAAW,OAAA,CAAAX,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAM,GAAA,CAAAZ,CAAA,UAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,GAAAM,CAAA,CAAAQ,GAAA,CAAAd,CAAA,EAAAQ,CAAA,cAAAO,EAAA,IAAAf,CAAA,gBAAAe,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,EAAA,OAAAR,CAAA,IAAAD,CAAA,GAAAY,sBAAA,KAAAC,gCAAA,CAAAnB,CAAA,EAAAe,EAAA,OAAAR,CAAA,CAAAM,GAAA,IAAAN,CAAA,CAAAO,GAAA,IAAAR,CAAA,CAAAE,CAAA,EAAAO,EAAA,EAAAR,CAAA,IAAAC,CAAA,CAAAO,EAAA,IAAAf,CAAA,CAAAe,EAAA,WAAAP,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAEzCL,SAAS,CAACwB,sBAAsB,CAAC,KAAK,EAAEC,YAAU,EAAE;EAClDC,MAAM,EAANA;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["WebexCore","_interopRequireWildcard","require","_llmPlugin","_llm","_constants","_llm2","_interopRequireDefault","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","registerInternalPlugin","LLMPlugin","config","onBeforeLogout","disconnectAllChannels"],"sources":["index.ts"],"sourcesContent":["import * as WebexCore from '@webex/webex-core';\nimport LLMPlugin, {config} from './llm-plugin';\nimport {DataChannelTokenType} from './llm.types';\n\nexport type {RegisterAndConnectTiming} from './llm.types';\n\nWebexCore.registerInternalPlugin('llm', LLMPlugin, {\n config,\n onBeforeLogout() {\n return this.disconnectAllChannels();\n },\n});\n\nexport {DataChannelTokenType};\nexport {LLM_DEFAULT_SESSION, LLM_PRACTICE_SESSION} from './constants';\nexport {default} from './llm';\nexport {default as LLMPlugin} from './llm-plugin';\nexport type {ILLMChannel, ILLMPlugin} from './llm.types';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,uBAAA,CAAAC,OAAA;AACA,IAAAE,IAAA,GAAAF,OAAA;AAYA,IAAAG,UAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAC,sBAAA,CAAAL,OAAA;AAA8B,SAAAD,wBAAAO,CAAA,EAAAC,CAAA,6BAAAC,QAAA,MAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAT,uBAAA,YAAAA,wBAAAO,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,gBAAAW,OAAA,CAAAX,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAM,GAAA,CAAAZ,CAAA,UAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,GAAAM,CAAA,CAAAQ,GAAA,CAAAd,CAAA,EAAAQ,CAAA,cAAAO,EAAA,IAAAf,CAAA,gBAAAe,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAe,EAAA,OAAAR,CAAA,IAAAD,CAAA,GAAAY,sBAAA,KAAAC,gCAAA,CAAAnB,CAAA,EAAAe,EAAA,OAAAR,CAAA,CAAAM,GAAA,IAAAN,CAAA,CAAAO,GAAA,IAAAR,CAAA,CAAAE,CAAA,EAAAO,EAAA,EAAAR,CAAA,IAAAC,CAAA,CAAAO,EAAA,IAAAf,CAAA,CAAAe,EAAA,WAAAP,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAT9BT,SAAS,CAAC4B,sBAAsB,CAAC,KAAK,EAAEC,kBAAS,EAAE;EACjDC,MAAM,EAANA,iBAAM;EACNC,cAAc,WAAdA,cAAcA,CAAA,EAAG;IACf,OAAO,IAAI,CAACC,qBAAqB,CAAC,CAAC;EACrC;AACF,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
5
+ var _Array$from2 = require("@babel/runtime-corejs2/core-js/array/from");
6
+ var _Symbol = require("@babel/runtime-corejs2/core-js/symbol");
7
+ var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator");
8
+ var _Array$isArray = require("@babel/runtime-corejs2/core-js/array/is-array");
9
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
10
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
11
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
12
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
13
+ _Object$defineProperty(exports, "__esModule", {
14
+ value: true
15
+ });
16
+ exports.LLMPlugin = void 0;
17
+ _Object$defineProperty(exports, "config", {
18
+ enumerable: true,
19
+ get: function get() {
20
+ return _llm.config;
21
+ }
22
+ });
23
+ exports.default = void 0;
24
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
25
+ var _set = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/set"));
26
+ var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));
27
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
28
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
29
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
30
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
31
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
32
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
33
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
34
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
35
+ var _webexCore = require("@webex/webex-core");
36
+ var _llm = _interopRequireWildcard(require("./llm"));
37
+ var _constants = require("./constants");
38
+ function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
39
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && r[_Symbol$iterator] || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
40
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from2(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
41
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
42
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
43
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /* eslint-disable require-jsdoc */
44
+ /**
45
+ * LLMPlugin — registered as `webex.internal.llm`.
46
+ *
47
+ * Factory for creating LLMChannel instances. Each Meeting creates and owns
48
+ * its own LLMChannel(s), allowing multiple independent connections without
49
+ * the need for session IDs or ownership tracking.
50
+ *
51
+ * This is a breaking API change from the previous design where the plugin
52
+ * maintained a Map of sessions and exposed session-keyed methods.
53
+ *
54
+ * Old usage (no longer supported):
55
+ * webex.internal.llm.isConnected()
56
+ * webex.internal.llm.registerAndConnect(url, dcUrl, token, sessionId)
57
+ *
58
+ * New usage:
59
+ * const llm = webex.internal.llm.createChannel();
60
+ * await llm.registerAndConnect(url, dcUrl, token);
61
+ * llm.isConnected();
62
+ * // When done:
63
+ * await llm.disconnect();
64
+ */
65
+ var LLMPlugin = exports.LLMPlugin = /*#__PURE__*/function (_ref) {
66
+ function LLMPlugin() {
67
+ var _this;
68
+ (0, _classCallCheck2.default)(this, LLMPlugin);
69
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
70
+ args[_key] = arguments[_key];
71
+ }
72
+ _this = _callSuper(this, LLMPlugin, [].concat(args));
73
+ (0, _defineProperty2.default)(_this, "namespace", 'llm');
74
+ /**
75
+ * Registry of active LLM channels for interceptor lookup.
76
+ * Channels are registered when created and unregistered on disconnect.
77
+ */
78
+ (0, _defineProperty2.default)(_this, "channels", new _set.default());
79
+ return _this;
80
+ }
81
+ (0, _inherits2.default)(LLMPlugin, _ref);
82
+ return (0, _createClass2.default)(LLMPlugin, [{
83
+ key: "createChannel",
84
+ value:
85
+ /**
86
+ * Creates a new LLMChannel instance. The caller owns the channel and is
87
+ * responsible for connecting, disconnecting, and cleaning it up.
88
+ *
89
+ * @example
90
+ * const llm = webex.internal.llm.createChannel();
91
+ * llm.setRefreshHandler(() => meeting.refreshDataChannelToken());
92
+ * await llm.registerAndConnect(locusUrl, datachannelUrl, token);
93
+ *
94
+ * // Subscribe to events directly on the channel
95
+ * llm.on('event:relay.event', handler);
96
+ * llm.on('online', onlineHandler);
97
+ *
98
+ * // When done
99
+ * await llm.disconnect();
100
+ *
101
+ * @returns {LLMChannel} A new LLM channel instance
102
+ */
103
+ function createChannel() {
104
+ var _this2 = this;
105
+ // @ts-ignore — WebexPlugin children require {parent: this.webex}
106
+ var channel = new _llm.default({
107
+ parent: this.webex
108
+ });
109
+ this.channels.add(channel);
110
+ channel.on('disconnected', function () {
111
+ return _this2.channels.delete(channel);
112
+ });
113
+ return channel;
114
+ }
115
+
116
+ /**
117
+ * Returns true if the data channel token feature flag is enabled.
118
+ * This is a global check, not per-connection.
119
+ * @returns {Promise<boolean>}
120
+ */
121
+ }, {
122
+ key: "isDataChannelTokenEnabled",
123
+ value: function isDataChannelTokenEnabled() {
124
+ // @ts-ignore
125
+ return this.webex.internal.feature.getFeature('developer', _constants.DATA_CHANNEL_WITH_JWT_TOKEN);
126
+ }
127
+
128
+ /**
129
+ * Find a channel by its datachannel URL. Used by the interceptor to
130
+ * route token refresh requests to the correct channel.
131
+ * @param {string} url - The request URL to match
132
+ * @returns {LLMChannel | undefined}
133
+ */
134
+ }, {
135
+ key: "getChannelByDatachannelUrl",
136
+ value: function getChannelByDatachannelUrl(url) {
137
+ var _iterator = _createForOfIteratorHelper(this.channels),
138
+ _step;
139
+ try {
140
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
141
+ var channel = _step.value;
142
+ var datachannelUrl = channel.getDatachannelUrl();
143
+ if (datachannelUrl && _llm.default.matchesDatachannelRequestUrl(url, datachannelUrl)) {
144
+ return channel;
145
+ }
146
+ }
147
+ } catch (err) {
148
+ _iterator.e(err);
149
+ } finally {
150
+ _iterator.f();
151
+ }
152
+ return undefined;
153
+ }
154
+
155
+ /**
156
+ * Get all active channels. Useful for diagnostics/debugging.
157
+ * @returns {Set<LLMChannel>}
158
+ */
159
+ }, {
160
+ key: "getAllChannels",
161
+ value: function getAllChannels() {
162
+ return new _set.default(this.channels);
163
+ }
164
+
165
+ /**
166
+ * Disconnect all active channels. Useful for cleanup on logout.
167
+ * @param {object} [options] - Disconnect options
168
+ * @param {number} [options.code] - WebSocket close code
169
+ * @param {string} [options.reason] - WebSocket close reason
170
+ * @returns {Promise<void>}
171
+ */
172
+ }, {
173
+ key: "disconnectAllChannels",
174
+ value: (function () {
175
+ var _disconnectAllChannels = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(options) {
176
+ var promises;
177
+ return _regenerator.default.wrap(function (_context) {
178
+ while (1) switch (_context.prev = _context.next) {
179
+ case 0:
180
+ promises = (0, _from.default)(this.channels).map(function (channel) {
181
+ return channel.disconnect(options);
182
+ });
183
+ _context.next = 1;
184
+ return _promise.default.all(promises);
185
+ case 1:
186
+ case "end":
187
+ return _context.stop();
188
+ }
189
+ }, _callee, this);
190
+ }));
191
+ function disconnectAllChannels(_x) {
192
+ return _disconnectAllChannels.apply(this, arguments);
193
+ }
194
+ return disconnectAllChannels;
195
+ }())
196
+ }]);
197
+ }(_webexCore.WebexPlugin);
198
+ var _default = exports.default = LLMPlugin;
199
+ //# sourceMappingURL=llm-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_webexCore","require","_llm","_interopRequireWildcard","_constants","e","t","_WeakMap","r","n","__esModule","o","i","f","__proto__","default","_typeof","has","get","set","_t","hasOwnProperty","call","_Object$defineProperty","_Object$getOwnPropertyDescriptor","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","done","value","TypeError","a","u","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from2","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","apply","Boolean","prototype","valueOf","LLMPlugin","exports","_ref","_this","_classCallCheck2","_len","arguments","args","_key","concat","_defineProperty2","_set","_inherits2","_createClass2","key","createChannel","_this2","channel","LLMChannel","parent","webex","channels","add","on","delete","isDataChannelTokenEnabled","internal","feature","getFeature","DATA_CHANNEL_WITH_JWT_TOKEN","getChannelByDatachannelUrl","url","_iterator","_step","datachannelUrl","getDatachannelUrl","matchesDatachannelRequestUrl","err","undefined","getAllChannels","_disconnectAllChannels","_asyncToGenerator2","_regenerator","mark","_callee","options","promises","wrap","_context","prev","_from","map","disconnect","_promise","all","stop","disconnectAllChannels","_x","WebexPlugin","_default"],"sources":["llm-plugin.ts"],"sourcesContent":["/* eslint-disable require-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\nimport LLMChannel, {config} from './llm';\nimport {DATA_CHANNEL_WITH_JWT_TOKEN} from './constants';\n\n/**\n * LLMPlugin — registered as `webex.internal.llm`.\n *\n * Factory for creating LLMChannel instances. Each Meeting creates and owns\n * its own LLMChannel(s), allowing multiple independent connections without\n * the need for session IDs or ownership tracking.\n *\n * This is a breaking API change from the previous design where the plugin\n * maintained a Map of sessions and exposed session-keyed methods.\n *\n * Old usage (no longer supported):\n * webex.internal.llm.isConnected()\n * webex.internal.llm.registerAndConnect(url, dcUrl, token, sessionId)\n *\n * New usage:\n * const llm = webex.internal.llm.createChannel();\n * await llm.registerAndConnect(url, dcUrl, token);\n * llm.isConnected();\n * // When done:\n * await llm.disconnect();\n */\nexport class LLMPlugin extends (WebexPlugin as any) {\n namespace = 'llm';\n\n /**\n * Registry of active LLM channels for interceptor lookup.\n * Channels are registered when created and unregistered on disconnect.\n */\n private channels = new Set<LLMChannel>();\n\n /**\n * Creates a new LLMChannel instance. The caller owns the channel and is\n * responsible for connecting, disconnecting, and cleaning it up.\n *\n * @example\n * const llm = webex.internal.llm.createChannel();\n * llm.setRefreshHandler(() => meeting.refreshDataChannelToken());\n * await llm.registerAndConnect(locusUrl, datachannelUrl, token);\n *\n * // Subscribe to events directly on the channel\n * llm.on('event:relay.event', handler);\n * llm.on('online', onlineHandler);\n *\n * // When done\n * await llm.disconnect();\n *\n * @returns {LLMChannel} A new LLM channel instance\n */\n public createChannel(): LLMChannel {\n // @ts-ignore — WebexPlugin children require {parent: this.webex}\n const channel = new LLMChannel({parent: this.webex});\n\n this.channels.add(channel);\n channel.on('disconnected', () => this.channels.delete(channel));\n\n return channel;\n }\n\n /**\n * Returns true if the data channel token feature flag is enabled.\n * This is a global check, not per-connection.\n * @returns {Promise<boolean>}\n */\n public isDataChannelTokenEnabled(): Promise<boolean> {\n // @ts-ignore\n return this.webex.internal.feature.getFeature('developer', DATA_CHANNEL_WITH_JWT_TOKEN);\n }\n\n /**\n * Find a channel by its datachannel URL. Used by the interceptor to\n * route token refresh requests to the correct channel.\n * @param {string} url - The request URL to match\n * @returns {LLMChannel | undefined}\n */\n public getChannelByDatachannelUrl(url: string): LLMChannel | undefined {\n for (const channel of this.channels) {\n const datachannelUrl = channel.getDatachannelUrl();\n\n if (datachannelUrl && LLMChannel.matchesDatachannelRequestUrl(url, datachannelUrl)) {\n return channel;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get all active channels. Useful for diagnostics/debugging.\n * @returns {Set<LLMChannel>}\n */\n public getAllChannels(): Set<LLMChannel> {\n return new Set(this.channels);\n }\n\n /**\n * Disconnect all active channels. Useful for cleanup on logout.\n * @param {object} [options] - Disconnect options\n * @param {number} [options.code] - WebSocket close code\n * @param {string} [options.reason] - WebSocket close reason\n * @returns {Promise<void>}\n */\n public async disconnectAllChannels(options?: {code: number; reason: string}): Promise<void> {\n const promises = Array.from(this.channels).map((channel) => channel.disconnect(options));\n\n await Promise.all(promises);\n }\n}\n\nexport {config};\nexport default LLMPlugin;\n"],"mappings":"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","ignoreList":[]}