@webex/internal-plugin-llm 3.8.1-web-workers-keepalive.1 → 3.9.0-multipleLLM.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/dist/constants.js CHANGED
@@ -4,7 +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.LLM = void 0;
7
+ exports.LLM_DEFAULT_SESSION = exports.LLM = 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';
10
11
  //# 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"}
1
+ {"version":3,"names":["LLM","exports","LLM_DEFAULT_SESSION"],"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';\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,GAAG,GAAAC,OAAA,CAAAD,GAAA,GAAG,KAAK;AAEjB,IAAME,mBAAmB,GAAAD,OAAA,CAAAC,mBAAA,GAAG,qBAAqB"}
package/dist/llm.js CHANGED
@@ -7,6 +7,7 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  exports.default = exports.config = void 0;
10
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
10
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
11
12
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
13
  var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
@@ -65,22 +66,21 @@ var LLMChannel = exports.default = /*#__PURE__*/function (_ref) {
65
66
  }
66
67
  _this = _super.call.apply(_super, [this].concat(args));
67
68
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "namespace", _constants.LLM);
69
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "defaultSessionId", _constants.LLM_DEFAULT_SESSION);
68
70
  /**
69
- * If the LLM plugin has been registered and listening
70
- * @instance
71
- * @type {Boolean}
72
- * @public
71
+ * Map to store connection-specific data for multiple LLM connections
72
+ * @private
73
+ * @type {Map<string, {webSocketUrl?: string; binding?: string; locusUrl?: string; datachannelUrl?: string}>}
73
74
  */
74
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "webSocketUrl", void 0);
75
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "binding", void 0);
76
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "locusUrl", void 0);
77
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "datachannelUrl", void 0);
75
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "connections", new _map.default());
78
76
  /**
79
77
  * Register to the websocket
80
78
  * @param {string} llmSocketUrl
79
+ * @param {string} sessionId - Connection identifier
81
80
  * @returns {Promise<void>}
82
81
  */
83
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "register", function (llmSocketUrl) {
83
+ var sessionId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _constants.LLM_DEFAULT_SESSION;
84
84
  return _this.request({
85
85
  method: 'POST',
86
86
  url: llmSocketUrl,
@@ -88,10 +88,13 @@ var LLMChannel = exports.default = /*#__PURE__*/function (_ref) {
88
88
  deviceUrl: _this.webex.internal.device.url
89
89
  }
90
90
  }).then(function (res) {
91
- _this.webSocketUrl = res.body.webSocketUrl;
92
- _this.binding = res.body.binding;
91
+ // Get or create connection data
92
+ var sessionData = _this.connections.get(sessionId) || {};
93
+ sessionData.webSocketUrl = res.body.webSocketUrl;
94
+ sessionData.binding = res.body.binding;
95
+ _this.connections.set(sessionId, sessionData);
93
96
  }).catch(function (error) {
94
- _this.logger.error("Error connecting to websocket: ".concat(error));
97
+ _this.logger.error("Error connecting to websocket for ".concat(sessionId, ": ").concat(error));
95
98
  throw error;
96
99
  });
97
100
  });
@@ -99,57 +102,93 @@ var LLMChannel = exports.default = /*#__PURE__*/function (_ref) {
99
102
  * Register and connect to the websocket
100
103
  * @param {string} locusUrl
101
104
  * @param {string} datachannelUrl
105
+ * @param {string} sessionId - Connection identifier
102
106
  * @returns {Promise<void>}
103
107
  */
104
108
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "registerAndConnect", function (locusUrl, datachannelUrl) {
105
- return _this.register(datachannelUrl).then(function () {
109
+ var sessionId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.LLM_DEFAULT_SESSION;
110
+ return _this.register(datachannelUrl, sessionId).then(function () {
106
111
  if (!locusUrl || !datachannelUrl) return undefined;
107
- _this.locusUrl = locusUrl;
108
- _this.datachannelUrl = datachannelUrl;
109
- _this.connect(_this.webSocketUrl);
112
+
113
+ // Get or create connection data
114
+ var sessionData = _this.connections.get(sessionId) || {};
115
+ sessionData.locusUrl = locusUrl;
116
+ sessionData.datachannelUrl = datachannelUrl;
117
+ _this.connections.set(sessionId, sessionData);
118
+ return _this.connect(sessionData.webSocketUrl, sessionId);
110
119
  });
111
120
  });
112
121
  /**
113
122
  * Tells if LLM socket is connected
123
+ * @param {string} sessionId - Connection identifier
114
124
  * @returns {boolean} connected
115
125
  */
116
126
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isConnected", function () {
117
- return _this.connected;
127
+ var sessionId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.LLM_DEFAULT_SESSION;
128
+ var socket = _this.getSocket(sessionId);
129
+ return socket ? socket.connected : false;
118
130
  });
119
131
  /**
120
132
  * Tells if LLM socket is binding
133
+ * @param {string} sessionId - Connection identifier
121
134
  * @returns {string} binding
122
135
  */
123
136
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getBinding", function () {
124
- return _this.binding;
137
+ var sessionId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.LLM_DEFAULT_SESSION;
138
+ var sessionData = _this.connections.get(sessionId);
139
+ return sessionData === null || sessionData === void 0 ? void 0 : sessionData.binding;
125
140
  });
126
141
  /**
127
142
  * Get Locus URL for the connection
143
+ * @param {string} sessionId - Connection identifier
128
144
  * @returns {string} locus Url
129
145
  */
130
146
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getLocusUrl", function () {
131
- return _this.locusUrl;
147
+ var sessionId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.LLM_DEFAULT_SESSION;
148
+ var sessionData = _this.connections.get(sessionId);
149
+ return sessionData === null || sessionData === void 0 ? void 0 : sessionData.locusUrl;
132
150
  });
133
151
  /**
134
152
  * Get data channel URL for the connection
153
+ * @param {string} sessionId - Connection identifier
135
154
  * @returns {string} data channel Url
136
155
  */
137
156
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getDatachannelUrl", function () {
138
- return _this.datachannelUrl;
157
+ var sessionId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _constants.LLM_DEFAULT_SESSION;
158
+ var sessionData = _this.connections.get(sessionId);
159
+ return sessionData === null || sessionData === void 0 ? void 0 : sessionData.datachannelUrl;
139
160
  });
140
161
  /**
141
162
  * Disconnects websocket connection
142
163
  * @param {{code: number, reason: string}} options - The disconnect option object with code and reason
164
+ * @param {string} sessionId - Connection identifier
143
165
  * @returns {Promise<void>}
144
166
  */
145
167
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "disconnectLLM", function (options) {
146
- return _this.disconnect(options).then(function () {
147
- _this.locusUrl = undefined;
148
- _this.datachannelUrl = undefined;
149
- _this.binding = undefined;
150
- _this.webSocketUrl = undefined;
168
+ var sessionId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _constants.LLM_DEFAULT_SESSION;
169
+ return _this.disconnect(options, sessionId).then(function () {
170
+ // Clean up sessions data
171
+ _this.connections.delete(sessionId);
172
+ });
173
+ });
174
+ /**
175
+ * Disconnects all LLM websocket connections
176
+ * @param {{code: number, reason: string}} options - The disconnect option object with code and reason
177
+ * @returns {Promise<void>}
178
+ */
179
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "disconnectAllLLM", function (options) {
180
+ return _this.disconnectAll(options).then(function () {
181
+ // Clean up all connection data
182
+ _this.connections.clear();
151
183
  });
152
184
  });
185
+ /**
186
+ * Get all active LLM connections
187
+ * @returns {Map} Map of sessionId to session data
188
+ */
189
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getAllConnections", function () {
190
+ return new _map.default(_this.connections);
191
+ });
153
192
  return _this;
154
193
  }
155
194
  return (0, _createClass2.default)(LLMChannel);
package/dist/llm.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_internalPluginMercury","_interopRequireDefault","require","_constants","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","config","exports","llm","pingInterval","process","env","MERCURY_PING_INTERVAL","pongTimeout","MERCURY_PONG_TIMEOUT","backoffTimeMax","MERCURY_BACKOFF_TIME_MAX","backoffTimeReset","MERCURY_BACKOFF_TIME_RESET","forceCloseDelay","MERCURY_FORCE_CLOSE_DELAY","LLMChannel","_ref","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","LLM","llmSocketUrl","request","method","url","body","deviceUrl","webex","internal","device","then","res","webSocketUrl","binding","catch","error","logger","locusUrl","datachannelUrl","register","undefined","connect","connected","options","disconnect","_createClass2","Mercury"],"sources":["llm.ts"],"sourcesContent":["/* eslint-disable consistent-return */\n\nimport Mercury from '@webex/internal-plugin-mercury';\n\nimport {LLM} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {ILLMChannel} from './llm.types';\n\nexport const config = {\n llm: {\n /**\n * Milliseconds between pings sent up the socket\n * @type {number}\n */\n pingInterval: process.env.MERCURY_PING_INTERVAL || 15000,\n /**\n * Milliseconds to wait for a pong before declaring the connection dead\n * @type {number}\n */\n pongTimeout: process.env.MERCURY_PONG_TIMEOUT || 14000,\n /**\n * Maximum milliseconds between connection attempts\n * @type {Number}\n */\n backoffTimeMax: process.env.MERCURY_BACKOFF_TIME_MAX || 32000,\n /**\n * Initial milliseconds between connection attempts\n * @type {Number}\n */\n backoffTimeReset: process.env.MERCURY_BACKOFF_TIME_RESET || 1000,\n /**\n * Milliseconds to wait for a close frame before declaring the socket dead and\n * discarding it\n * @type {[type]}\n */\n forceCloseDelay: process.env.MERCURY_FORCE_CLOSE_DELAY || 2000,\n },\n};\n\n/**\n * LLMChannel to provide socket connections\n */\nexport default class LLMChannel extends (Mercury as any) implements ILLMChannel {\n namespace = LLM;\n\n /**\n * If the LLM plugin has been registered and listening\n * @instance\n * @type {Boolean}\n * @public\n */\n\n private webSocketUrl?: string;\n\n private binding?: string;\n\n private locusUrl?: string;\n\n private datachannelUrl?: string;\n\n /**\n * Register to the websocket\n * @param {string} llmSocketUrl\n * @returns {Promise<void>}\n */\n private register = (llmSocketUrl: string): Promise<void> =>\n this.request({\n method: 'POST',\n url: llmSocketUrl,\n body: {deviceUrl: this.webex.internal.device.url},\n })\n .then((res: {body: {webSocketUrl: string; binding: string}}) => {\n this.webSocketUrl = res.body.webSocketUrl;\n this.binding = res.body.binding;\n })\n .catch((error: any) => {\n this.logger.error(`Error connecting to websocket: ${error}`);\n throw error;\n });\n\n /**\n * Register and connect to the websocket\n * @param {string} locusUrl\n * @param {string} datachannelUrl\n * @returns {Promise<void>}\n */\n public registerAndConnect = (locusUrl: string, datachannelUrl: string): Promise<void> =>\n this.register(datachannelUrl).then(() => {\n if (!locusUrl || !datachannelUrl) return undefined;\n this.locusUrl = locusUrl;\n this.datachannelUrl = datachannelUrl;\n this.connect(this.webSocketUrl);\n });\n\n /**\n * Tells if LLM socket is connected\n * @returns {boolean} connected\n */\n public isConnected = (): boolean => this.connected;\n\n /**\n * Tells if LLM socket is binding\n * @returns {string} binding\n */\n public getBinding = (): string => this.binding;\n\n /**\n * Get Locus URL for the connection\n * @returns {string} locus Url\n */\n public getLocusUrl = (): string => this.locusUrl;\n\n /**\n * Get data channel URL for the connection\n * @returns {string} data channel Url\n */\n public getDatachannelUrl = (): string => this.datachannelUrl;\n\n /**\n * Disconnects websocket connection\n * @param {{code: number, reason: string}} options - The disconnect option object with code and reason\n * @returns {Promise<void>}\n */\n public disconnectLLM = (options: object): Promise<void> =>\n this.disconnect(options).then(() => {\n this.locusUrl = undefined;\n this.datachannelUrl = undefined;\n this.binding = undefined;\n this.webSocketUrl = undefined;\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_internalPluginMercury","_interopRequireDefault","require","_constants","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","config","exports","llm","pingInterval","process","env","MERCURY_PING_INTERVAL","pongTimeout","MERCURY_PONG_TIMEOUT","backoffTimeMax","MERCURY_BACKOFF_TIME_MAX","backoffTimeReset","MERCURY_BACKOFF_TIME_RESET","forceCloseDelay","MERCURY_FORCE_CLOSE_DELAY","LLMChannel","_ref","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","LLM","LLM_DEFAULT_SESSION","_map","llmSocketUrl","sessionId","undefined","request","method","url","body","deviceUrl","webex","internal","device","then","res","sessionData","connections","get","webSocketUrl","binding","set","catch","error","logger","locusUrl","datachannelUrl","register","connect","socket","getSocket","connected","options","disconnect","delete","disconnectAll","clear","_createClass2","Mercury"],"sources":["llm.ts"],"sourcesContent":["/* eslint-disable consistent-return */\n\nimport Mercury from '@webex/internal-plugin-mercury';\n\nimport {LLM, LLM_DEFAULT_SESSION} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {ILLMChannel} from './llm.types';\n\nexport const config = {\n llm: {\n /**\n * Milliseconds between pings sent up the socket\n * @type {number}\n */\n pingInterval: process.env.MERCURY_PING_INTERVAL || 15000,\n /**\n * Milliseconds to wait for a pong before declaring the connection dead\n * @type {number}\n */\n pongTimeout: process.env.MERCURY_PONG_TIMEOUT || 14000,\n /**\n * Maximum milliseconds between connection attempts\n * @type {Number}\n */\n backoffTimeMax: process.env.MERCURY_BACKOFF_TIME_MAX || 32000,\n /**\n * Initial milliseconds between connection attempts\n * @type {Number}\n */\n backoffTimeReset: process.env.MERCURY_BACKOFF_TIME_RESET || 1000,\n /**\n * Milliseconds to wait for a close frame before declaring the socket dead and\n * discarding it\n * @type {[type]}\n */\n forceCloseDelay: process.env.MERCURY_FORCE_CLOSE_DELAY || 2000,\n },\n};\n\n/**\n * LLMChannel to provide socket connections\n */\nexport default class LLMChannel extends (Mercury as any) implements ILLMChannel {\n namespace = LLM;\n defaultSessionId = LLM_DEFAULT_SESSION;\n /**\n * Map to store connection-specific data for multiple LLM connections\n * @private\n * @type {Map<string, {webSocketUrl?: string; binding?: string; locusUrl?: string; datachannelUrl?: string}>}\n */\n private connections: Map<\n string,\n {\n webSocketUrl?: string;\n binding?: string;\n locusUrl?: string;\n datachannelUrl?: string;\n }\n > = new Map();\n\n /**\n * Register to the websocket\n * @param {string} llmSocketUrl\n * @param {string} sessionId - Connection identifier\n * @returns {Promise<void>}\n */\n private register = (\n llmSocketUrl: string,\n sessionId: string = LLM_DEFAULT_SESSION\n ): Promise<void> =>\n this.request({\n method: 'POST',\n url: llmSocketUrl,\n body: {deviceUrl: this.webex.internal.device.url},\n })\n .then((res: {body: {webSocketUrl: string; binding: string}}) => {\n // Get or create connection data\n const sessionData = this.connections.get(sessionId) || {};\n sessionData.webSocketUrl = res.body.webSocketUrl;\n sessionData.binding = res.body.binding;\n this.connections.set(sessionId, sessionData);\n })\n .catch((error: any) => {\n this.logger.error(`Error connecting to websocket for ${sessionId}: ${error}`);\n throw error;\n });\n\n /**\n * Register and connect to the websocket\n * @param {string} locusUrl\n * @param {string} datachannelUrl\n * @param {string} sessionId - Connection identifier\n * @returns {Promise<void>}\n */\n public registerAndConnect = (\n locusUrl: string,\n datachannelUrl: string,\n sessionId: string = LLM_DEFAULT_SESSION\n ): Promise<void> =>\n this.register(datachannelUrl, sessionId).then(() => {\n if (!locusUrl || !datachannelUrl) return undefined;\n\n // Get or create connection data\n const sessionData = this.connections.get(sessionId) || {};\n sessionData.locusUrl = locusUrl;\n sessionData.datachannelUrl = datachannelUrl;\n this.connections.set(sessionId, sessionData);\n\n return this.connect(sessionData.webSocketUrl, sessionId);\n });\n\n /**\n * Tells if LLM socket is connected\n * @param {string} sessionId - Connection identifier\n * @returns {boolean} connected\n */\n public isConnected = (sessionId = LLM_DEFAULT_SESSION): boolean => {\n const socket = this.getSocket(sessionId);\n\n return socket ? socket.connected : false;\n };\n\n /**\n * Tells if LLM socket is binding\n * @param {string} sessionId - Connection identifier\n * @returns {string} binding\n */\n public getBinding = (sessionId = LLM_DEFAULT_SESSION): string => {\n const sessionData = this.connections.get(sessionId);\n\n return sessionData?.binding;\n };\n\n /**\n * Get Locus URL for the connection\n * @param {string} sessionId - Connection identifier\n * @returns {string} locus Url\n */\n public getLocusUrl = (sessionId = LLM_DEFAULT_SESSION): string => {\n const sessionData = this.connections.get(sessionId);\n\n return sessionData?.locusUrl;\n };\n\n /**\n * Get data channel URL for the connection\n * @param {string} sessionId - Connection identifier\n * @returns {string} data channel Url\n */\n public getDatachannelUrl = (sessionId = LLM_DEFAULT_SESSION): string => {\n const sessionData = this.connections.get(sessionId);\n\n return sessionData?.datachannelUrl;\n };\n\n /**\n * Disconnects websocket connection\n * @param {{code: number, reason: string}} options - The disconnect option object with code and reason\n * @param {string} sessionId - Connection identifier\n * @returns {Promise<void>}\n */\n public disconnectLLM = (\n options: {code: number; reason: string},\n sessionId: string = LLM_DEFAULT_SESSION\n ): Promise<void> =>\n this.disconnect(options, sessionId).then(() => {\n // Clean up sessions data\n this.connections.delete(sessionId);\n });\n\n /**\n * Disconnects all LLM websocket connections\n * @param {{code: number, reason: string}} options - The disconnect option object with code and reason\n * @returns {Promise<void>}\n */\n public disconnectAllLLM = (options?: {code: number; reason: string}): Promise<void> =>\n this.disconnectAll(options).then(() => {\n // Clean up all connection data\n this.connections.clear();\n });\n\n /**\n * Get all active LLM connections\n * @returns {Map} Map of sessionId to session data\n */\n public getAllConnections = (): Map<\n string,\n {\n webSocketUrl?: string;\n binding?: string;\n locusUrl?: string;\n datachannelUrl?: string;\n }\n > => new Map(this.connections);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAEA,IAAAA,sBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AAAqD,SAAAE,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA,sBAJrD;AAKA;;AAGO,IAAMC,MAAM,GAAAC,OAAA,CAAAD,MAAA,GAAG;EACpBE,GAAG,EAAE;IACH;AACJ;AACA;AACA;IACIC,YAAY,EAAEC,OAAO,CAACC,GAAG,CAACC,qBAAqB,IAAI,KAAK;IACxD;AACJ;AACA;AACA;IACIC,WAAW,EAAEH,OAAO,CAACC,GAAG,CAACG,oBAAoB,IAAI,KAAK;IACtD;AACJ;AACA;AACA;IACIC,cAAc,EAAEL,OAAO,CAACC,GAAG,CAACK,wBAAwB,IAAI,KAAK;IAC7D;AACJ;AACA;AACA;IACIC,gBAAgB,EAAEP,OAAO,CAACC,GAAG,CAACO,0BAA0B,IAAI,IAAI;IAChE;AACJ;AACA;AACA;AACA;IACIC,eAAe,EAAET,OAAO,CAACC,GAAG,CAACS,yBAAyB,IAAI;EAC5D;AACF,CAAC;;AAED;AACA;AACA;AAFA,IAGqBC,UAAU,GAAAd,OAAA,CAAAjB,OAAA,0BAAAgC,IAAA;EAAA,IAAAC,UAAA,CAAAjC,OAAA,EAAA+B,UAAA,EAAAC,IAAA;EAAA,IAAAE,MAAA,GAAAzC,YAAA,CAAAsC,UAAA;EAAA,SAAAA,WAAA;IAAA,IAAAI,KAAA;IAAA,IAAAC,gBAAA,CAAApC,OAAA,QAAA+B,UAAA;IAAA,SAAAM,IAAA,GAAAhC,SAAA,CAAAiC,MAAA,EAAAC,IAAA,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;MAAAF,IAAA,CAAAE,IAAA,IAAApC,SAAA,CAAAoC,IAAA;IAAA;IAAAN,KAAA,GAAAD,MAAA,CAAApB,IAAA,CAAAR,KAAA,CAAA4B,MAAA,SAAAQ,MAAA,CAAAH,IAAA;IAAA,IAAAI,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,gBACjBU,cAAG;IAAA,IAAAF,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,uBACIW,8BAAmB;IACtC;AACF;AACA;AACA;AACA;IAJE,IAAAH,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,kBAaI,IAAAY,IAAA,CAAA/C,OAAA,CAAQ,CAAC;IAEb;AACF;AACA;AACA;AACA;AACA;IALE,IAAA2C,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,eAMmB,UACjBa,YAAoB;MAAA,IACpBC,SAAiB,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MAAA,OAEvCX,KAAA,CAAKgB,OAAO,CAAC;QACXC,MAAM,EAAE,MAAM;QACdC,GAAG,EAAEL,YAAY;QACjBM,IAAI,EAAE;UAACC,SAAS,EAAEpB,KAAA,CAAKqB,KAAK,CAACC,QAAQ,CAACC,MAAM,CAACL;QAAG;MAClD,CAAC,CAAC,CACCM,IAAI,CAAC,UAACC,GAAoD,EAAK;QAC9D;QACA,IAAMC,WAAW,GAAG1B,KAAA,CAAK2B,WAAW,CAACC,GAAG,CAACd,SAAS,CAAC,IAAI,CAAC,CAAC;QACzDY,WAAW,CAACG,YAAY,GAAGJ,GAAG,CAACN,IAAI,CAACU,YAAY;QAChDH,WAAW,CAACI,OAAO,GAAGL,GAAG,CAACN,IAAI,CAACW,OAAO;QACtC9B,KAAA,CAAK2B,WAAW,CAACI,GAAG,CAACjB,SAAS,EAAEY,WAAW,CAAC;MAC9C,CAAC,CAAC,CACDM,KAAK,CAAC,UAACC,KAAU,EAAK;QACrBjC,KAAA,CAAKkC,MAAM,CAACD,KAAK,sCAAA1B,MAAA,CAAsCO,SAAS,QAAAP,MAAA,CAAK0B,KAAK,CAAE,CAAC;QAC7E,MAAMA,KAAK;MACb,CAAC,CAAC;IAAA;IAEN;AACF;AACA;AACA;AACA;AACA;AACA;IANE,IAAAzB,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,yBAO4B,UAC1BmC,QAAgB,EAChBC,cAAsB;MAAA,IACtBtB,SAAiB,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MAAA,OAEvCX,KAAA,CAAKqC,QAAQ,CAACD,cAAc,EAAEtB,SAAS,CAAC,CAACU,IAAI,CAAC,YAAM;QAClD,IAAI,CAACW,QAAQ,IAAI,CAACC,cAAc,EAAE,OAAOrB,SAAS;;QAElD;QACA,IAAMW,WAAW,GAAG1B,KAAA,CAAK2B,WAAW,CAACC,GAAG,CAACd,SAAS,CAAC,IAAI,CAAC,CAAC;QACzDY,WAAW,CAACS,QAAQ,GAAGA,QAAQ;QAC/BT,WAAW,CAACU,cAAc,GAAGA,cAAc;QAC3CpC,KAAA,CAAK2B,WAAW,CAACI,GAAG,CAACjB,SAAS,EAAEY,WAAW,CAAC;QAE5C,OAAO1B,KAAA,CAAKsC,OAAO,CAACZ,WAAW,CAACG,YAAY,EAAEf,SAAS,CAAC;MAC1D,CAAC,CAAC;IAAA;IAEJ;AACF;AACA;AACA;AACA;IAJE,IAAAN,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,kBAKqB,YAA8C;MAAA,IAA7Cc,SAAS,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MACnD,IAAM4B,MAAM,GAAGvC,KAAA,CAAKwC,SAAS,CAAC1B,SAAS,CAAC;MAExC,OAAOyB,MAAM,GAAGA,MAAM,CAACE,SAAS,GAAG,KAAK;IAC1C,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAjC,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,iBAKoB,YAA6C;MAAA,IAA5Cc,SAAS,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MAClD,IAAMe,WAAW,GAAG1B,KAAA,CAAK2B,WAAW,CAACC,GAAG,CAACd,SAAS,CAAC;MAEnD,OAAOY,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEI,OAAO;IAC7B,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAtB,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,kBAKqB,YAA6C;MAAA,IAA5Cc,SAAS,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MACnD,IAAMe,WAAW,GAAG1B,KAAA,CAAK2B,WAAW,CAACC,GAAG,CAACd,SAAS,CAAC;MAEnD,OAAOY,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAES,QAAQ;IAC9B,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA3B,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,wBAK2B,YAA6C;MAAA,IAA5Cc,SAAS,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MACzD,IAAMe,WAAW,GAAG1B,KAAA,CAAK2B,WAAW,CAACC,GAAG,CAACd,SAAS,CAAC;MAEnD,OAAOY,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEU,cAAc;IACpC,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAA5B,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,oBAMuB,UACrB0C,OAAuC;MAAA,IACvC5B,SAAiB,GAAA5C,SAAA,CAAAiC,MAAA,QAAAjC,SAAA,QAAA6C,SAAA,GAAA7C,SAAA,MAAGyC,8BAAmB;MAAA,OAEvCX,KAAA,CAAK2C,UAAU,CAACD,OAAO,EAAE5B,SAAS,CAAC,CAACU,IAAI,CAAC,YAAM;QAC7C;QACAxB,KAAA,CAAK2B,WAAW,CAACiB,MAAM,CAAC9B,SAAS,CAAC;MACpC,CAAC,CAAC;IAAA;IAEJ;AACF;AACA;AACA;AACA;IAJE,IAAAN,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,uBAK0B,UAAC0C,OAAwC;MAAA,OACjE1C,KAAA,CAAK6C,aAAa,CAACH,OAAO,CAAC,CAAClB,IAAI,CAAC,YAAM;QACrC;QACAxB,KAAA,CAAK2B,WAAW,CAACmB,KAAK,CAAC,CAAC;MAC1B,CAAC,CAAC;IAAA;IAEJ;AACF;AACA;AACA;IAHE,IAAAtC,gBAAA,CAAA3C,OAAA,MAAA4C,uBAAA,CAAA5C,OAAA,EAAAmC,KAAA,wBAI2B;MAAA,OAQtB,IAAAY,IAAA,CAAA/C,OAAA,CAAQmC,KAAA,CAAK2B,WAAW,CAAC;IAAA;IAAA,OAAA3B,KAAA;EAAA;EAAA,WAAA+C,aAAA,CAAAlF,OAAA,EAAA+B,UAAA;AAAA,EAvJSoD,8BAAO"}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["llm.types.ts"],"sourcesContent":["interface ILLMChannel {\n registerAndConnect: (locusUrl: string, datachannelUrl: string) => Promise<void>;\n isConnected: () => boolean;\n getBinding: () => string;\n getLocusUrl: () => string;\n disconnectLLM: (options: {code: number; reason: string}) => Promise<void>;\n}\n// eslint-disable-next-line import/prefer-default-export\nexport type {ILLMChannel};\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["llm.types.ts"],"sourcesContent":["interface ILLMChannel {\n registerAndConnect: (\n locusUrl: string,\n datachannelUrl: string,\n sessionId?: string\n ) => Promise<void>;\n isConnected: (sessionId?: string) => boolean;\n getBinding: (sessionId?: string) => string;\n getLocusUrl: (sessionId?: string) => string;\n getDatachannelUrl: (sessionId?: string) => string;\n disconnectLLM: (options: {code: number; reason: string}, sessionId?: string) => Promise<void>;\n disconnectAllLLM: (options?: {code: number; reason: string}) => Promise<void>;\n getAllConnections: () => Map<\n string,\n {\n webSocketUrl?: string;\n binding?: string;\n locusUrl?: string;\n datachannelUrl?: string;\n }\n >;\n}\n// eslint-disable-next-line import/prefer-default-export\nexport type {ILLMChannel};\n"],"mappings":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-llm",
3
3
  "description": "",
4
- "license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
4
+ "license": "Cisco's General Terms (https://www.cisco.com/site/us/en/about/legal/contract-experience/index.html)",
5
5
  "main": "dist/index.js",
6
6
  "devMain": "src/index.ts",
7
7
  "repository": {
@@ -13,7 +13,7 @@
13
13
  "node": ">=16"
14
14
  },
15
15
  "dependencies": {
16
- "@webex/internal-plugin-mercury": "3.8.1-web-workers-keepalive.1"
16
+ "@webex/internal-plugin-mercury": "3.9.0-multipleLLM.1"
17
17
  },
18
18
  "browserify": {
19
19
  "transform": [
@@ -27,10 +27,10 @@
27
27
  "@webex/eslint-config-legacy": "0.0.0",
28
28
  "@webex/jest-config-legacy": "0.0.0",
29
29
  "@webex/legacy-tools": "0.0.0",
30
- "@webex/test-helper-chai": "3.8.1-web-workers-keepalive.1",
31
- "@webex/test-helper-mocha": "3.8.1-web-workers-keepalive.1",
32
- "@webex/test-helper-mock-webex": "3.8.1-web-workers-keepalive.1",
33
- "@webex/test-helper-test-users": "3.8.1-web-workers-keepalive.1",
30
+ "@webex/test-helper-chai": "3.9.0-multipleLLM.0",
31
+ "@webex/test-helper-mocha": "3.9.0-multipleLLM.0",
32
+ "@webex/test-helper-mock-webex": "3.9.0-multipleLLM.0",
33
+ "@webex/test-helper-test-users": "3.9.0-multipleLLM.0",
34
34
  "eslint": "^8.24.0",
35
35
  "prettier": "^2.7.1",
36
36
  "sinon": "^9.2.4"
@@ -44,5 +44,5 @@
44
44
  "test:style": "eslint ./src/**/*.*",
45
45
  "test:unit": "webex-legacy-tools test --unit --runner jest"
46
46
  },
47
- "version": "3.8.1-web-workers-keepalive.1"
47
+ "version": "3.9.0-multipleLLM.1"
48
48
  }
package/src/constants.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  // eslint-disable-next-line import/prefer-default-export
2
2
  export const LLM = 'llm';
3
+
4
+ export const LLM_DEFAULT_SESSION = 'llm-default-session';
package/src/llm.ts CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import Mercury from '@webex/internal-plugin-mercury';
4
4
 
5
- import {LLM} from './constants';
5
+ import {LLM, LLM_DEFAULT_SESSION} from './constants';
6
6
  // eslint-disable-next-line no-unused-vars
7
7
  import {ILLMChannel} from './llm.types';
8
8
 
@@ -42,39 +42,46 @@ export const config = {
42
42
  */
43
43
  export default class LLMChannel extends (Mercury as any) implements ILLMChannel {
44
44
  namespace = LLM;
45
-
45
+ defaultSessionId = LLM_DEFAULT_SESSION;
46
46
  /**
47
- * If the LLM plugin has been registered and listening
48
- * @instance
49
- * @type {Boolean}
50
- * @public
47
+ * Map to store connection-specific data for multiple LLM connections
48
+ * @private
49
+ * @type {Map<string, {webSocketUrl?: string; binding?: string; locusUrl?: string; datachannelUrl?: string}>}
51
50
  */
52
-
53
- private webSocketUrl?: string;
54
-
55
- private binding?: string;
56
-
57
- private locusUrl?: string;
58
-
59
- private datachannelUrl?: string;
51
+ private connections: Map<
52
+ string,
53
+ {
54
+ webSocketUrl?: string;
55
+ binding?: string;
56
+ locusUrl?: string;
57
+ datachannelUrl?: string;
58
+ }
59
+ > = new Map();
60
60
 
61
61
  /**
62
62
  * Register to the websocket
63
63
  * @param {string} llmSocketUrl
64
+ * @param {string} sessionId - Connection identifier
64
65
  * @returns {Promise<void>}
65
66
  */
66
- private register = (llmSocketUrl: string): Promise<void> =>
67
+ private register = (
68
+ llmSocketUrl: string,
69
+ sessionId: string = LLM_DEFAULT_SESSION
70
+ ): Promise<void> =>
67
71
  this.request({
68
72
  method: 'POST',
69
73
  url: llmSocketUrl,
70
74
  body: {deviceUrl: this.webex.internal.device.url},
71
75
  })
72
76
  .then((res: {body: {webSocketUrl: string; binding: string}}) => {
73
- this.webSocketUrl = res.body.webSocketUrl;
74
- this.binding = res.body.binding;
77
+ // Get or create connection data
78
+ const sessionData = this.connections.get(sessionId) || {};
79
+ sessionData.webSocketUrl = res.body.webSocketUrl;
80
+ sessionData.binding = res.body.binding;
81
+ this.connections.set(sessionId, sessionData);
75
82
  })
76
83
  .catch((error: any) => {
77
- this.logger.error(`Error connecting to websocket: ${error}`);
84
+ this.logger.error(`Error connecting to websocket for ${sessionId}: ${error}`);
78
85
  throw error;
79
86
  });
80
87
 
@@ -82,50 +89,107 @@ export default class LLMChannel extends (Mercury as any) implements ILLMChannel
82
89
  * Register and connect to the websocket
83
90
  * @param {string} locusUrl
84
91
  * @param {string} datachannelUrl
92
+ * @param {string} sessionId - Connection identifier
85
93
  * @returns {Promise<void>}
86
94
  */
87
- public registerAndConnect = (locusUrl: string, datachannelUrl: string): Promise<void> =>
88
- this.register(datachannelUrl).then(() => {
95
+ public registerAndConnect = (
96
+ locusUrl: string,
97
+ datachannelUrl: string,
98
+ sessionId: string = LLM_DEFAULT_SESSION
99
+ ): Promise<void> =>
100
+ this.register(datachannelUrl, sessionId).then(() => {
89
101
  if (!locusUrl || !datachannelUrl) return undefined;
90
- this.locusUrl = locusUrl;
91
- this.datachannelUrl = datachannelUrl;
92
- this.connect(this.webSocketUrl);
102
+
103
+ // Get or create connection data
104
+ const sessionData = this.connections.get(sessionId) || {};
105
+ sessionData.locusUrl = locusUrl;
106
+ sessionData.datachannelUrl = datachannelUrl;
107
+ this.connections.set(sessionId, sessionData);
108
+
109
+ return this.connect(sessionData.webSocketUrl, sessionId);
93
110
  });
94
111
 
95
112
  /**
96
113
  * Tells if LLM socket is connected
114
+ * @param {string} sessionId - Connection identifier
97
115
  * @returns {boolean} connected
98
116
  */
99
- public isConnected = (): boolean => this.connected;
117
+ public isConnected = (sessionId = LLM_DEFAULT_SESSION): boolean => {
118
+ const socket = this.getSocket(sessionId);
119
+
120
+ return socket ? socket.connected : false;
121
+ };
100
122
 
101
123
  /**
102
124
  * Tells if LLM socket is binding
125
+ * @param {string} sessionId - Connection identifier
103
126
  * @returns {string} binding
104
127
  */
105
- public getBinding = (): string => this.binding;
128
+ public getBinding = (sessionId = LLM_DEFAULT_SESSION): string => {
129
+ const sessionData = this.connections.get(sessionId);
130
+
131
+ return sessionData?.binding;
132
+ };
106
133
 
107
134
  /**
108
135
  * Get Locus URL for the connection
136
+ * @param {string} sessionId - Connection identifier
109
137
  * @returns {string} locus Url
110
138
  */
111
- public getLocusUrl = (): string => this.locusUrl;
139
+ public getLocusUrl = (sessionId = LLM_DEFAULT_SESSION): string => {
140
+ const sessionData = this.connections.get(sessionId);
141
+
142
+ return sessionData?.locusUrl;
143
+ };
112
144
 
113
145
  /**
114
146
  * Get data channel URL for the connection
147
+ * @param {string} sessionId - Connection identifier
115
148
  * @returns {string} data channel Url
116
149
  */
117
- public getDatachannelUrl = (): string => this.datachannelUrl;
150
+ public getDatachannelUrl = (sessionId = LLM_DEFAULT_SESSION): string => {
151
+ const sessionData = this.connections.get(sessionId);
152
+
153
+ return sessionData?.datachannelUrl;
154
+ };
118
155
 
119
156
  /**
120
157
  * Disconnects websocket connection
121
158
  * @param {{code: number, reason: string}} options - The disconnect option object with code and reason
159
+ * @param {string} sessionId - Connection identifier
160
+ * @returns {Promise<void>}
161
+ */
162
+ public disconnectLLM = (
163
+ options: {code: number; reason: string},
164
+ sessionId: string = LLM_DEFAULT_SESSION
165
+ ): Promise<void> =>
166
+ this.disconnect(options, sessionId).then(() => {
167
+ // Clean up sessions data
168
+ this.connections.delete(sessionId);
169
+ });
170
+
171
+ /**
172
+ * Disconnects all LLM websocket connections
173
+ * @param {{code: number, reason: string}} options - The disconnect option object with code and reason
122
174
  * @returns {Promise<void>}
123
175
  */
124
- public disconnectLLM = (options: object): Promise<void> =>
125
- this.disconnect(options).then(() => {
126
- this.locusUrl = undefined;
127
- this.datachannelUrl = undefined;
128
- this.binding = undefined;
129
- this.webSocketUrl = undefined;
176
+ public disconnectAllLLM = (options?: {code: number; reason: string}): Promise<void> =>
177
+ this.disconnectAll(options).then(() => {
178
+ // Clean up all connection data
179
+ this.connections.clear();
130
180
  });
181
+
182
+ /**
183
+ * Get all active LLM connections
184
+ * @returns {Map} Map of sessionId to session data
185
+ */
186
+ public getAllConnections = (): Map<
187
+ string,
188
+ {
189
+ webSocketUrl?: string;
190
+ binding?: string;
191
+ locusUrl?: string;
192
+ datachannelUrl?: string;
193
+ }
194
+ > => new Map(this.connections);
131
195
  }
package/src/llm.types.ts CHANGED
@@ -1,9 +1,24 @@
1
1
  interface ILLMChannel {
2
- registerAndConnect: (locusUrl: string, datachannelUrl: string) => Promise<void>;
3
- isConnected: () => boolean;
4
- getBinding: () => string;
5
- getLocusUrl: () => string;
6
- disconnectLLM: (options: {code: number; reason: string}) => Promise<void>;
2
+ registerAndConnect: (
3
+ locusUrl: string,
4
+ datachannelUrl: string,
5
+ sessionId?: string
6
+ ) => Promise<void>;
7
+ isConnected: (sessionId?: string) => boolean;
8
+ getBinding: (sessionId?: string) => string;
9
+ getLocusUrl: (sessionId?: string) => string;
10
+ getDatachannelUrl: (sessionId?: string) => string;
11
+ disconnectLLM: (options: {code: number; reason: string}, sessionId?: string) => Promise<void>;
12
+ disconnectAllLLM: (options?: {code: number; reason: string}) => Promise<void>;
13
+ getAllConnections: () => Map<
14
+ string,
15
+ {
16
+ webSocketUrl?: string;
17
+ binding?: string;
18
+ locusUrl?: string;
19
+ datachannelUrl?: string;
20
+ }
21
+ >;
7
22
  }
8
23
  // eslint-disable-next-line import/prefer-default-export
9
24
  export type {ILLMChannel};
@@ -21,7 +21,8 @@ describe('plugin-llm', () => {
21
21
 
22
22
  llmService = webex.internal.llm;
23
23
  llmService.connect = sinon.stub().callsFake(() => {
24
- llmService.connected = true;
24
+ // Simulate a successful connection by stubbing getSocket to return connected: true
25
+ llmService.getSocket = sinon.stub().returns({connected: true});
25
26
  });
26
27
  llmService.disconnect = sinon.stub().resolves(true);
27
28
  llmService.request = sinon.stub().resolves({