@webex/internal-plugin-llm 3.11.0 → 3.12.0-llmrefactor.2
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 +63 -12
- package/dist/constants.js +9 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +35 -4
- package/dist/index.js.map +1 -1
- package/dist/llm-plugin.js +199 -0
- package/dist/llm-plugin.js.map +1 -0
- package/dist/llm.js +280 -48
- package/dist/llm.js.map +1 -1
- package/dist/llm.types.js +18 -0
- package/dist/llm.types.js.map +1 -1
- package/package.json +6 -6
- package/src/constants.ts +13 -0
- package/src/index.ts +12 -2
- package/src/llm-plugin.ts +115 -0
- package/src/llm.ts +229 -42
- package/src/llm.types.ts +92 -5
- package/test/unit/spec/llm-plugin.js +391 -0
- package/test/unit/spec/llm.js +473 -85
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
|
-
//
|
|
41
|
-
webex.internal.llm.
|
|
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
|
package/dist/constants.js.map
CHANGED
|
@@ -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
|
|
38
|
+
return _llm2.default;
|
|
14
39
|
}
|
|
15
40
|
});
|
|
16
41
|
var WebexCore = _interopRequireWildcard(require("@webex/webex-core"));
|
|
17
|
-
var
|
|
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',
|
|
20
|
-
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","
|
|
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":[]}
|