@nlxai/core 1.2.3-alpha.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1877 -34
- package/lib/index.cjs +90 -55
- package/lib/index.d.ts +255 -213
- package/lib/index.esm.js +90 -55
- package/lib/index.umd.js +1 -1
- package/package.json +12 -12
- package/typedoc.cjs +9 -2
package/lib/index.esm.js
CHANGED
|
@@ -4,7 +4,7 @@ import ReconnectingWebSocket from 'reconnecting-websocket';
|
|
|
4
4
|
import { v4 } from 'uuid';
|
|
5
5
|
|
|
6
6
|
var name = "@nlxai/core";
|
|
7
|
-
var version$1 = "1.2.3
|
|
7
|
+
var version$1 = "1.2.3";
|
|
8
8
|
var description = "Low-level SDK for building NLX experiences";
|
|
9
9
|
var type = "module";
|
|
10
10
|
var main = "lib/index.cjs";
|
|
@@ -20,40 +20,40 @@ var exports = {
|
|
|
20
20
|
};
|
|
21
21
|
var scripts = {
|
|
22
22
|
build: "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
|
|
23
|
-
docs: "rm -rf docs/ && typedoc && concat-md --decrease-title-levels --dir-name-as-title docs/ > docs/index.md",
|
|
24
23
|
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
|
|
25
24
|
lint: "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
|
|
26
25
|
prepublish: "npm run build",
|
|
27
|
-
"preview-docs": "npm run docs && comrak --unsafe --gfm -o docs/index.html docs/index.md && open docs/index.html",
|
|
28
|
-
"publish-docs": "npm run docs && mv docs/index.md ../website/src/content/headless-api-reference.md",
|
|
29
26
|
test: "typedoc --emit none",
|
|
30
|
-
tsc: "tsc"
|
|
27
|
+
tsc: "tsc",
|
|
28
|
+
"update-readme:docs": "rm -rf docs/ && typedoc",
|
|
29
|
+
"update-readme:merge": "../../scripts/transclude-markdown.js",
|
|
30
|
+
"update-readme": "npm run update-readme:docs && npm run update-readme:merge"
|
|
31
31
|
};
|
|
32
32
|
var author = "Peter Szerzo <peter@nlx.ai>";
|
|
33
33
|
var license = "MIT";
|
|
34
34
|
var devDependencies = {
|
|
35
|
-
"@types/isomorphic-fetch": "^0.0.
|
|
36
|
-
"@types/node": "^
|
|
37
|
-
"@types/ramda": "0.
|
|
35
|
+
"@types/isomorphic-fetch": "^0.0.39",
|
|
36
|
+
"@types/node": "^24.10.1",
|
|
37
|
+
"@types/ramda": "0.31.1",
|
|
38
38
|
"@types/uuid": "^9.0.7",
|
|
39
39
|
"concat-md": "^0.5.1",
|
|
40
40
|
"eslint-config-nlx": "*",
|
|
41
41
|
prettier: "^3.1.0",
|
|
42
42
|
"rollup-config-nlx": "*",
|
|
43
|
-
typedoc: "^0.
|
|
44
|
-
"typedoc-plugin-markdown": "^
|
|
43
|
+
typedoc: "^0.28.14",
|
|
44
|
+
"typedoc-plugin-markdown": "^4.9.0",
|
|
45
45
|
typescript: "^5.5.4"
|
|
46
46
|
};
|
|
47
47
|
var dependencies = {
|
|
48
48
|
"isomorphic-fetch": "^3.0.0",
|
|
49
|
-
ramda: "^0.
|
|
49
|
+
ramda: "^0.32.0",
|
|
50
50
|
"reconnecting-websocket": "^4.4.0",
|
|
51
51
|
uuid: "^9.0.1"
|
|
52
52
|
};
|
|
53
53
|
var publishConfig = {
|
|
54
54
|
access: "public"
|
|
55
55
|
};
|
|
56
|
-
var gitHead = "
|
|
56
|
+
var gitHead = "3902161e95745dd4a9cfb68bb469755a62b421f5";
|
|
57
57
|
var packageJson = {
|
|
58
58
|
name: name,
|
|
59
59
|
version: version$1,
|
|
@@ -125,18 +125,6 @@ const safeJsonParse = (val) => {
|
|
|
125
125
|
return null;
|
|
126
126
|
}
|
|
127
127
|
};
|
|
128
|
-
/**
|
|
129
|
-
* Helper method to decide when a new {@link Config} requires creating a new {@link ConversationHandler} or whether the old `Config`'s
|
|
130
|
-
* `ConversationHandler` can be used.
|
|
131
|
-
*
|
|
132
|
-
* The order of configs doesn't matter.
|
|
133
|
-
* @param config1 -
|
|
134
|
-
* @param config2 -
|
|
135
|
-
* @returns true if `createConversation` should be called again
|
|
136
|
-
*/
|
|
137
|
-
const shouldReinitialize = (config1, config2) => {
|
|
138
|
-
return !equals(config1, config2);
|
|
139
|
-
};
|
|
140
128
|
const getBaseDomain = (url) => url.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0] ?? "apps.nlx.ai";
|
|
141
129
|
/**
|
|
142
130
|
* When a HTTP URL is provided, deduce the websocket URL. Otherwise, return the argument.
|
|
@@ -173,41 +161,45 @@ const normalizeToHttp = (applicationUrl) => {
|
|
|
173
161
|
const isWebsocketUrl = (url) => {
|
|
174
162
|
return url.indexOf("wss://") === 0;
|
|
175
163
|
};
|
|
176
|
-
/**
|
|
177
|
-
* Check whether a configuration is value.
|
|
178
|
-
* @param config - Chat configuration
|
|
179
|
-
* @returns isValid - Whether the configuration is valid
|
|
180
|
-
*/
|
|
181
|
-
const isConfigValid = (config) => {
|
|
182
|
-
const applicationUrl = config.applicationUrl ?? "";
|
|
183
|
-
return applicationUrl.length > 0;
|
|
184
|
-
};
|
|
185
164
|
/**
|
|
186
165
|
* Call this to create a conversation handler.
|
|
187
|
-
* @param
|
|
166
|
+
* @param configuration - The necessary configuration to create the conversation.
|
|
188
167
|
* @returns The {@link ConversationHandler} is a bundle of functions to interact with the conversation.
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* import { createConversation } from "@nlx/core";
|
|
171
|
+
*
|
|
172
|
+
* const conversation = createConversation({
|
|
173
|
+
* applicationUrl: "https://apps.nlx.ai/c/cfab3-243ad-232dc",
|
|
174
|
+
* headers: {
|
|
175
|
+
* "nlx-api-key": "4393029032-dwsd",
|
|
176
|
+
* },
|
|
177
|
+
* userId: "abcd-1234",
|
|
178
|
+
* languageCode: "en-US",
|
|
179
|
+
* });
|
|
180
|
+
* ```
|
|
189
181
|
*/
|
|
190
|
-
function createConversation(
|
|
182
|
+
function createConversation(configuration) {
|
|
191
183
|
let socket;
|
|
192
184
|
let socketMessageQueue = [];
|
|
193
185
|
let socketMessageQueueCheckInterval = null;
|
|
194
186
|
let voicePlusSocket;
|
|
195
187
|
let voicePlusSocketMessageQueue = [];
|
|
196
188
|
let voicePlusSocketMessageQueueCheckInterval = null;
|
|
197
|
-
const applicationUrl =
|
|
189
|
+
const applicationUrl = configuration.applicationUrl ?? "";
|
|
198
190
|
// Check if the application URL has a language code appended to it
|
|
199
191
|
if (/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(applicationUrl)) {
|
|
200
192
|
Console.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");
|
|
201
193
|
}
|
|
202
194
|
const eventListeners = { voicePlusCommand: [] };
|
|
203
|
-
const initialConversationId =
|
|
195
|
+
const initialConversationId = configuration.conversationId ?? v4();
|
|
204
196
|
let state = {
|
|
205
|
-
responses:
|
|
206
|
-
languageCode:
|
|
207
|
-
userId:
|
|
197
|
+
responses: configuration.responses ?? [],
|
|
198
|
+
languageCode: configuration.languageCode,
|
|
199
|
+
userId: configuration.userId,
|
|
208
200
|
conversationId: initialConversationId,
|
|
209
201
|
};
|
|
210
|
-
const fullApplicationHttpUrl = () => `${normalizeToHttp(applicationUrl)}${
|
|
202
|
+
const fullApplicationHttpUrl = () => `${normalizeToHttp(applicationUrl)}${configuration.experimental?.completeApplicationUrl === true
|
|
211
203
|
? ""
|
|
212
204
|
: `-${state.languageCode}`}`;
|
|
213
205
|
const setState = (change,
|
|
@@ -226,7 +218,7 @@ function createConversation(config) {
|
|
|
226
218
|
type: ResponseType.Failure,
|
|
227
219
|
receivedAt: new Date().getTime(),
|
|
228
220
|
payload: {
|
|
229
|
-
text:
|
|
221
|
+
text: configuration.failureMessage ?? defaultFailureMessage,
|
|
230
222
|
},
|
|
231
223
|
};
|
|
232
224
|
setState({
|
|
@@ -298,8 +290,8 @@ function createConversation(config) {
|
|
|
298
290
|
conversationId: state.conversationId,
|
|
299
291
|
...body,
|
|
300
292
|
languageCode: state.languageCode,
|
|
301
|
-
channelType:
|
|
302
|
-
environment:
|
|
293
|
+
channelType: configuration.experimental?.channelType,
|
|
294
|
+
environment: configuration.environment,
|
|
303
295
|
};
|
|
304
296
|
if (isWebsocketUrl(applicationUrl)) {
|
|
305
297
|
if (socket?.readyState === 1) {
|
|
@@ -314,7 +306,7 @@ function createConversation(config) {
|
|
|
314
306
|
const res = await fetch(fullApplicationHttpUrl(), {
|
|
315
307
|
method: "POST",
|
|
316
308
|
headers: {
|
|
317
|
-
...(
|
|
309
|
+
...(configuration.headers ?? {}),
|
|
318
310
|
Accept: "application/json",
|
|
319
311
|
"Content-Type": "application/json",
|
|
320
312
|
"nlx-sdk-version": packageJson.version,
|
|
@@ -351,7 +343,7 @@ function createConversation(config) {
|
|
|
351
343
|
// If the socket is already set up, tear it down first
|
|
352
344
|
teardownWebsocket();
|
|
353
345
|
const url = new URL(applicationUrl);
|
|
354
|
-
if (
|
|
346
|
+
if (configuration.experimental?.completeApplicationUrl !== true) {
|
|
355
347
|
url.searchParams.set("languageCode", state.languageCode);
|
|
356
348
|
url.searchParams.set("channelKey", `${url.searchParams.get("channelKey") ?? ""}-${state.languageCode}`);
|
|
357
349
|
}
|
|
@@ -384,17 +376,17 @@ function createConversation(config) {
|
|
|
384
376
|
const setupCommandWebsocket = () => {
|
|
385
377
|
// If the socket is already set up, tear it down first
|
|
386
378
|
teardownCommandWebsocket();
|
|
387
|
-
if (
|
|
379
|
+
if (configuration.bidirectional !== true) {
|
|
388
380
|
return;
|
|
389
381
|
}
|
|
390
382
|
const url = new URL(normalizeToWebsocket(applicationUrl));
|
|
391
|
-
if (
|
|
383
|
+
if (configuration.experimental?.completeApplicationUrl !== true) {
|
|
392
384
|
url.searchParams.set("languageCode", state.languageCode);
|
|
393
385
|
url.searchParams.set("channelKey", `${url.searchParams.get("channelKey") ?? ""}-${state.languageCode}`);
|
|
394
386
|
}
|
|
395
387
|
url.searchParams.set("conversationId", state.conversationId);
|
|
396
388
|
url.searchParams.set("type", "voice-plus");
|
|
397
|
-
const apiKey =
|
|
389
|
+
const apiKey = configuration.headers["nlx-api-key"];
|
|
398
390
|
if (!isWebsocketUrl(applicationUrl) && apiKey != null) {
|
|
399
391
|
url.searchParams.set("apiKey", apiKey);
|
|
400
392
|
}
|
|
@@ -538,7 +530,7 @@ function createConversation(config) {
|
|
|
538
530
|
const res = await fetch(`${fullApplicationHttpUrl()}/context`, {
|
|
539
531
|
method: "POST",
|
|
540
532
|
headers: {
|
|
541
|
-
...(
|
|
533
|
+
...(configuration.headers ?? {}),
|
|
542
534
|
Accept: "application/json",
|
|
543
535
|
"Content-Type": "application/json",
|
|
544
536
|
"nlx-conversation-id": state.conversationId,
|
|
@@ -619,7 +611,7 @@ function createConversation(config) {
|
|
|
619
611
|
const res = await fetch(`${url}-${state.languageCode}/requestToken`, {
|
|
620
612
|
method: "POST",
|
|
621
613
|
headers: {
|
|
622
|
-
...(
|
|
614
|
+
...(configuration.headers ?? {}),
|
|
623
615
|
Accept: "application/json",
|
|
624
616
|
"Content-Type": "application/json",
|
|
625
617
|
"nlx-conversation-id": state.conversationId,
|
|
@@ -680,9 +672,52 @@ function createConversation(config) {
|
|
|
680
672
|
};
|
|
681
673
|
}
|
|
682
674
|
/**
|
|
683
|
-
*
|
|
684
|
-
* @param
|
|
685
|
-
* @returns
|
|
675
|
+
* Check whether a configuration is valid.
|
|
676
|
+
* @param configuration - Conversation configuration
|
|
677
|
+
* @returns Whether the configuration is valid?
|
|
678
|
+
*/
|
|
679
|
+
const isConfigValid = (configuration) => {
|
|
680
|
+
const applicationUrl = configuration.applicationUrl ?? "";
|
|
681
|
+
return applicationUrl.length > 0;
|
|
682
|
+
};
|
|
683
|
+
/**
|
|
684
|
+
* Helper method to decide when a new {@link Config} requires creating a new {@link ConversationHandler} or whether the old `Config`'s
|
|
685
|
+
* `ConversationHandler` can be used.
|
|
686
|
+
*
|
|
687
|
+
* The order of configs doesn't matter.
|
|
688
|
+
* @param config1 -
|
|
689
|
+
* @param config2 -
|
|
690
|
+
* @returns true if `createConversation` should be called again
|
|
691
|
+
*/
|
|
692
|
+
const shouldReinitialize = (config1, config2) => {
|
|
693
|
+
return !equals(config1, config2);
|
|
694
|
+
};
|
|
695
|
+
/**
|
|
696
|
+
* Get current expiration timestamp from a list of responses. Can be used to determine if a conversation has timed out.
|
|
697
|
+
* @example
|
|
698
|
+
* ```typescript
|
|
699
|
+
* import { useState } from "react";
|
|
700
|
+
* import { getCurrentExpirationTimestamp } from "@nlxai/core";
|
|
701
|
+
*
|
|
702
|
+
* const [isTimedOut, setIsTimedOut] = useState(false);
|
|
703
|
+
*
|
|
704
|
+
* conversation.subscribe((responses) => {
|
|
705
|
+
* const expirationTimestamp = getCurrentExpirationTimestamp(responses);
|
|
706
|
+
* if (expirationTimestamp != null && expirationTimestamp < new Date().getTime()) {
|
|
707
|
+
* setIsTimedOut(true);
|
|
708
|
+
* }
|
|
709
|
+
* });
|
|
710
|
+
*
|
|
711
|
+
* return (<div>
|
|
712
|
+
* {isTimedOut ? (
|
|
713
|
+
* <p>Your session has timed out. Please start a new conversation.</p>
|
|
714
|
+
* ) : (
|
|
715
|
+
* <p>Your session is active.</p>
|
|
716
|
+
* )}
|
|
717
|
+
* </div>
|
|
718
|
+
* ```
|
|
719
|
+
* @param responses - The current list of user and application responses (first argument in the subscribe callback)
|
|
720
|
+
* @returns An expiration timestamp in Unix Epoch (`new Date().getTime()`), or `null` if this is not known (typically occurs if the application has not responded yet)
|
|
686
721
|
*/
|
|
687
722
|
const getCurrentExpirationTimestamp = (responses) => {
|
|
688
723
|
let expirationTimestamp = null;
|
|
@@ -710,7 +745,7 @@ const getCurrentExpirationTimestamp = (responses) => {
|
|
|
710
745
|
* console.log(response);
|
|
711
746
|
* });
|
|
712
747
|
* ```
|
|
713
|
-
* @typeParam
|
|
748
|
+
* @typeParam Params - the type of the function's params, e.g. for `sendText` it's `text: string, context?: Context`
|
|
714
749
|
* @param fn - the function to wrap (e.g. `convo.sendText`, `convo.sendChoice`, etc.)
|
|
715
750
|
* @param convo - the `ConversationHandler` (from {@link createConversation})
|
|
716
751
|
* @param timeout - the timeout in milliseconds
|
package/lib/index.umd.js
CHANGED
|
@@ -12,4 +12,4 @@
|
|
|
12
12
|
|
|
13
13
|
See the Apache Version 2.0 License for specific language governing permissions
|
|
14
14
|
and limitations under the License.
|
|
15
|
-
***************************************************************************** */function V(e,t){function n(){this.constructor=e}z(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function J(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,s=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=s.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return i}var Q=function(e,t){this.target=t,this.type=e},X=function(e){function t(t,n){var r=e.call(this,"error",n)||this;return r.message=t.message,r.error=t,r}return V(t,e),t}(Q),Z=function(e){function t(t,n,r){void 0===t&&(t=1e3),void 0===n&&(n="");var o=e.call(this,"close",r)||this;return o.wasClean=!0,o.code=t,o.reason=n,o}return V(t,e),t}(Q),Y=function(){if("undefined"!=typeof WebSocket)return WebSocket},ee={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0},te=function(){function e(e,t,n){var r=this;void 0===n&&(n={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,n=void 0===t?ee.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),n),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=n,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,n=void 0===t?ee.maxEnqueuedMessages:t;this._messageQueue.length<n&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,n,r=this._listeners[e.type];if(r)try{for(var o=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}(r),s=o.next();!s.done;s=o.next()){var i=s.value;this._callEventListener(e,i)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(J(arguments[t]));return e}(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,n=void 0===t?ee.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,o=void 0===r?ee.minReconnectionDelay:r,s=e.maxReconnectionDelay,i=void 0===s?ee.maxReconnectionDelay:s,a=0;return this._retryCount>0&&(a=o*Math.pow(n,this._retryCount-1))>i&&(a=i),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,n=t.maxRetries,r=void 0===n?ee.maxRetries:n,o=t.connectionTimeout,s=void 0===o?ee.connectionTimeout:o,i=t.WebSocket,a=void 0===i?Y():i;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(c=a)||!c||2!==c.CLOSING)throw Error("No valid WebSocket class provided");var c;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),s))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new X(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new Z(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();let ne;const re=new Uint8Array(16);function oe(){if(!ne&&(ne="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ne))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ne(re)}const se=[];for(let e=0;e<256;++e)se.push((e+256).toString(16).slice(1));var ie={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function ae(e,t,n){if(ie.randomUUID&&!e)return ie.randomUUID();const r=(e=e||{}).random||(e.rng||oe)();return r[6]=15&r[6]|64,r[8]=63&r[8]|128,function(e,t=0){return se[e[t+0]]+se[e[t+1]]+se[e[t+2]]+se[e[t+3]]+"-"+se[e[t+4]]+se[e[t+5]]+"-"+se[e[t+6]]+se[e[t+7]]+"-"+se[e[t+8]]+se[e[t+9]]+"-"+se[e[t+10]]+se[e[t+11]]+se[e[t+12]]+se[e[t+13]]+se[e[t+14]]+se[e[t+15]]}(r)}var ce="1.2.3-alpha.2";const ue=ce,le=console;var de;e.ResponseType=void 0,(de=e.ResponseType||(e.ResponseType={})).Application="bot",de.User="user",de.Failure="failure";const fe="NLX.Welcome",pe=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),he=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?pe(e.slots):e.slots}),ye=e=>e.responses,ge=e=>{try{return JSON.parse(e)}catch(e){return null}},me=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",be=e=>{if(!ve(e))return e;const t=me(e),n=new URL(e),r=new URLSearchParams(n.search),o=r.get("channelKey");return`https://${t}/c/${r.get("deploymentKey")}/${o}`},ve=e=>0===e.indexOf("wss://");e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const c=t.applicationUrl??"";/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(c)&&le.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");const u={voicePlusCommand:[]},l=t.conversationId??ae();let d={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:l};const f=()=>`${be(c)}${!0===t.experimental?.completeApplicationUrl?"":`-${d.languageCode}`}`,p=(e,t)=>{d={...d,...e},v.forEach((e=>{e(ye(d),t)}))},h=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};p({responses:[...d.responses,n]},n)},y=t=>{if(t?.messages.length>0){const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:{...t,messages:t.messages.map((e=>({nodeId:e.nodeId,messageId:e.messageId,text:e.text,choices:e.choices??[]})))}};p({responses:[...d.responses,n]},n),t.metadata.hasPendingDataRequest&&(x({poll:!0}),setTimeout((()=>{b({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),h()};let g;const m=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},b=async r=>{if(null!=g)return void g(r,(t=>{le.warn("Using the second argument in `setRequestOverride` is deprecated. Use `conversationHandler.appendMessageToTranscript` instead.");const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:t};p({responses:[...d.responses,n]},n)}));const s={userId:d.userId,conversationId:d.conversationId,...r,languageCode:d.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(ve(c))1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const e=await A(f(),{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ce},body:JSON.stringify(s)});if(e.status>=400)throw new Error(`Responded with ${e.status}`);const n=await e.json();y(n)}catch(e){le.warn(e),h()}};let v=[];const _=()=>{1===r?.readyState&&null!=i[0]&&(m(i[0]),i=i.slice(1))},w=()=>{E();const e=new URL(c);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await b(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&y(ge(e.data))},e.searchParams.set("voice-plus","true"),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},T=()=>{if(O(),!0!==t.bidirectional)return;const e=new URL((e=>{if(ve(e))return e;const t=me(e),n=new URL(e).pathname.split("/");return`wss://us-east-1-ws.${t}?deploymentKey=${n[2]}&channelKey=${n[3]}`})(c));!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),e.searchParams.set("type","voice-plus");const n=t.headers["nlx-api-key"];ve(c)||null==n||e.searchParams.set("apiKey",n),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},E=()=>{null!=s&&clearInterval(s),null!=n&&(n.onmessage=null,n.close(),n=void 0)},O=()=>{null!=a&&clearInterval(a),null!=r&&(r.onmessage=null,r.close(),r=void 0)};ve(c)&&w(),T();const x=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...he(t),context:n}};p({responses:[...d.responses,r]},r)},C=(e,t)=>{x({intentId:e},t),b({context:t,request:{structured:{intentId:e}}})},I=e=>{v=v.filter((t=>t!==e))};return{sendText:(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"text",text:t,context:n}};p({responses:[...d.responses,r]},r),b({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await A(`${f()}/context`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,context:e})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},appendMessageToTranscript:e=>{const t={...e,receivedAt:e.receivedAt??(new Date).getTime()};p({responses:[...d.responses,t]},t)},sendStructured:(e,t)=>{x(e,t),b({context:t,request:{structured:he(e)}})},sendSlots:(e,t)=>{x({slots:e},t),b({context:t,request:{structured:{slots:pe(e)}}})},sendFlow:C,sendIntent:(e,t)=>{le.warn("Calling `sendIntent` is deprecated and will be removed in a future version of the SDK. Use `sendFlow` instead."),C(e,t)},sendWelcomeFlow:e=>{C(fe,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),C(fe,e)},sendChoice:(t,n,r)=>{let o=[...d.responses];const s={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"choice",choiceId:t}},i=r?.responseIndex??-1,a=r?.messageIndex??-1;i>-1&&a>-1&&(o=S(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:S(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],p({responses:o},s),b({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.intentId,choiceId:t}}})},currentConversationId:()=>d.conversationId,setLanguageCode:e=>{e!==d.languageCode?(ve(c)&&w(),T(),p({languageCode:e})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>d.languageCode,getVoiceCredentials:async(e,n)=>{const r=be(c),o=await A(`${r}-${d.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(o.status>=400)throw new Error(`Responded with ${o.status}`);const s=await o.json();if(null==s?.url)throw new Error("Invalid response");return s},subscribe:e=>(v=[...v,e],e(ye(d)),()=>{I(e)}),unsubscribe:I,unsubscribeAll:()=>{v=[]},reset:e=>{p({conversationId:ae(),responses:!0===e?.clearResponses?[]:d.responses}),ve(c)&&w(),T()},destroy:()=>{v=[],ve(c)&&E(),O()},setRequestOverride:e=>{g=e},addEventListener:(e,t)=>{u[e]=[...u[e],t]},removeEventListener:(e,t)=>{u[e]=u[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{m({context:e})}}},e.getCurrentExpirationTimestamp=t=>{let n=null;return t.forEach((t=>{t.type===e.ResponseType.Application&&null!=t.payload.expirationTimestamp&&(n=t.payload.expirationTimestamp)})),n},e.isConfigValid=e=>(e.applicationUrl??"").length>0,e.promisify=function(t,n,r=1e4){return async o=>await new Promise(((s,i)=>{const a=setTimeout((()=>{i(new Error("The request timed out.")),n.unsubscribe(c)}),r),c=(t,r)=>{r?.type!==e.ResponseType.Application&&r?.type!==e.ResponseType.Failure||(clearTimeout(a),n.unsubscribe(c),s(r))};n.subscribe(c),t(o)}))},e.shouldReinitialize=(e,t)=>!K(e,t),e.version=ue}));
|
|
15
|
+
***************************************************************************** */function V(e,t){function n(){this.constructor=e}z(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function J(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,s=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=s.next()).done;)i.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=s.return)&&n.call(s)}finally{if(o)throw o.error}}return i}var Q=function(e,t){this.target=t,this.type=e},X=function(e){function t(t,n){var r=e.call(this,"error",n)||this;return r.message=t.message,r.error=t,r}return V(t,e),t}(Q),Z=function(e){function t(t,n,r){void 0===t&&(t=1e3),void 0===n&&(n="");var o=e.call(this,"close",r)||this;return o.wasClean=!0,o.code=t,o.reason=n,o}return V(t,e),t}(Q),Y=function(){if("undefined"!=typeof WebSocket)return WebSocket},ee={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0},te=function(){function e(e,t,n){var r=this;void 0===n&&(n={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,n=void 0===t?ee.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),n),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=n,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,n=void 0===t?ee.maxEnqueuedMessages:t;this._messageQueue.length<n&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,n,r=this._listeners[e.type];if(r)try{for(var o=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;return t?t.call(e):{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}(r),s=o.next();!s.done;s=o.next()){var i=s.value;this._callEventListener(e,i)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,function(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(J(arguments[t]));return e}(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,n=void 0===t?ee.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,o=void 0===r?ee.minReconnectionDelay:r,s=e.maxReconnectionDelay,i=void 0===s?ee.maxReconnectionDelay:s,a=0;return this._retryCount>0&&(a=o*Math.pow(n,this._retryCount-1))>i&&(a=i),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,n=t.maxRetries,r=void 0===n?ee.maxRetries:n,o=t.connectionTimeout,s=void 0===o?ee.connectionTimeout:o,i=t.WebSocket,a=void 0===i?Y():i;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(c=a)||!c||2!==c.CLOSING)throw Error("No valid WebSocket class provided");var c;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),s))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new X(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new Z(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();let ne;const re=new Uint8Array(16);function oe(){if(!ne&&(ne="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!ne))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ne(re)}const se=[];for(let e=0;e<256;++e)se.push((e+256).toString(16).slice(1));var ie={randomUUID:"undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function ae(e,t,n){if(ie.randomUUID&&!e)return ie.randomUUID();const r=(e=e||{}).random||(e.rng||oe)();return r[6]=15&r[6]|64,r[8]=63&r[8]|128,function(e,t=0){return se[e[t+0]]+se[e[t+1]]+se[e[t+2]]+se[e[t+3]]+"-"+se[e[t+4]]+se[e[t+5]]+"-"+se[e[t+6]]+se[e[t+7]]+"-"+se[e[t+8]]+se[e[t+9]]+"-"+se[e[t+10]]+se[e[t+11]]+se[e[t+12]]+se[e[t+13]]+se[e[t+14]]+se[e[t+15]]}(r)}var ce="1.2.3";const ue=ce,le=console;var de;e.ResponseType=void 0,(de=e.ResponseType||(e.ResponseType={})).Application="bot",de.User="user",de.Failure="failure";const fe="NLX.Welcome",pe=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),he=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?pe(e.slots):e.slots}),ye=e=>e.responses,ge=e=>{try{return JSON.parse(e)}catch(e){return null}},me=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",be=e=>{if(!ve(e))return e;const t=me(e),n=new URL(e),r=new URLSearchParams(n.search),o=r.get("channelKey");return`https://${t}/c/${r.get("deploymentKey")}/${o}`},ve=e=>0===e.indexOf("wss://");e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const c=t.applicationUrl??"";/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(c)&&le.warn("Since v1.0.0, the language code is no longer added at the end of the application URL. Please remove the modifier (e.g. '-en-US') from the URL, and specify it in the `languageCode` parameter instead.");const u={voicePlusCommand:[]},l=t.conversationId??ae();let d={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:l};const f=()=>`${be(c)}${!0===t.experimental?.completeApplicationUrl?"":`-${d.languageCode}`}`,p=(e,t)=>{d={...d,...e},v.forEach((e=>{e(ye(d),t)}))},h=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};p({responses:[...d.responses,n]},n)},y=t=>{if(t?.messages.length>0){const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:{...t,messages:t.messages.map((e=>({nodeId:e.nodeId,messageId:e.messageId,text:e.text,choices:e.choices??[]})))}};p({responses:[...d.responses,n]},n),t.metadata.hasPendingDataRequest&&(x({poll:!0}),setTimeout((()=>{b({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),h()};let g;const m=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},b=async r=>{if(null!=g)return void g(r,(t=>{le.warn("Using the second argument in `setRequestOverride` is deprecated. Use `conversationHandler.appendMessageToTranscript` instead.");const n={type:e.ResponseType.Application,receivedAt:(new Date).getTime(),payload:t};p({responses:[...d.responses,n]},n)}));const s={userId:d.userId,conversationId:d.conversationId,...r,languageCode:d.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(ve(c))1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const e=await A(f(),{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ce},body:JSON.stringify(s)});if(e.status>=400)throw new Error(`Responded with ${e.status}`);const n=await e.json();y(n)}catch(e){le.warn(e),h()}};let v=[];const _=()=>{1===r?.readyState&&null!=i[0]&&(m(i[0]),i=i.slice(1))},w=()=>{E();const e=new URL(c);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await b(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&y(ge(e.data))},e.searchParams.set("voice-plus","true"),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},T=()=>{if(O(),!0!==t.bidirectional)return;const e=new URL((e=>{if(ve(e))return e;const t=me(e),n=new URL(e).pathname.split("/");return`wss://us-east-1-ws.${t}?deploymentKey=${n[2]}&channelKey=${n[3]}`})(c));!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",d.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${d.languageCode}`)),e.searchParams.set("conversationId",d.conversationId),e.searchParams.set("type","voice-plus");const n=t.headers["nlx-api-key"];ve(c)||null==n||e.searchParams.set("apiKey",n),r=new te(e.href),a=setInterval((()=>{_()}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&u.voicePlusCommand.forEach((e=>{e(t)}))}}},E=()=>{null!=s&&clearInterval(s),null!=n&&(n.onmessage=null,n.close(),n=void 0)},O=()=>{null!=a&&clearInterval(a),null!=r&&(r.onmessage=null,r.close(),r=void 0)};ve(c)&&w(),T();const x=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...he(t),context:n}};p({responses:[...d.responses,r]},r)},C=(e,t)=>{x({intentId:e},t),b({context:t,request:{structured:{intentId:e}}})},I=e=>{v=v.filter((t=>t!==e))};return{sendText:(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"text",text:t,context:n}};p({responses:[...d.responses,r]},r),b({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await A(`${f()}/context`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,context:e})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},appendMessageToTranscript:e=>{const t={...e,receivedAt:e.receivedAt??(new Date).getTime()};p({responses:[...d.responses,t]},t)},sendStructured:(e,t)=>{x(e,t),b({context:t,request:{structured:he(e)}})},sendSlots:(e,t)=>{x({slots:e},t),b({context:t,request:{structured:{slots:pe(e)}}})},sendFlow:C,sendIntent:(e,t)=>{le.warn("Calling `sendIntent` is deprecated and will be removed in a future version of the SDK. Use `sendFlow` instead."),C(e,t)},sendWelcomeFlow:e=>{C(fe,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),C(fe,e)},sendChoice:(t,n,r)=>{let o=[...d.responses];const s={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"choice",choiceId:t}},i=r?.responseIndex??-1,a=r?.messageIndex??-1;i>-1&&a>-1&&(o=S(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:S(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],p({responses:o},s),b({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.intentId,choiceId:t}}})},currentConversationId:()=>d.conversationId,setLanguageCode:e=>{e!==d.languageCode?(ve(c)&&w(),T(),p({languageCode:e})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>d.languageCode,getVoiceCredentials:async(e,n)=>{const r=be(c),o=await A(`${r}-${d.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":d.conversationId,"nlx-sdk-version":ce},body:JSON.stringify({languageCode:d.languageCode,conversationId:d.conversationId,userId:d.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(o.status>=400)throw new Error(`Responded with ${o.status}`);const s=await o.json();if(null==s?.url)throw new Error("Invalid response");return s},subscribe:e=>(v=[...v,e],e(ye(d)),()=>{I(e)}),unsubscribe:I,unsubscribeAll:()=>{v=[]},reset:e=>{p({conversationId:ae(),responses:!0===e?.clearResponses?[]:d.responses}),ve(c)&&w(),T()},destroy:()=>{v=[],ve(c)&&E(),O()},setRequestOverride:e=>{g=e},addEventListener:(e,t)=>{u[e]=[...u[e],t]},removeEventListener:(e,t)=>{u[e]=u[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{m({context:e})}}},e.getCurrentExpirationTimestamp=t=>{let n=null;return t.forEach((t=>{t.type===e.ResponseType.Application&&null!=t.payload.expirationTimestamp&&(n=t.payload.expirationTimestamp)})),n},e.isConfigValid=e=>(e.applicationUrl??"").length>0,e.promisify=function(t,n,r=1e4){return async o=>await new Promise(((s,i)=>{const a=setTimeout((()=>{i(new Error("The request timed out.")),n.unsubscribe(c)}),r),c=(t,r)=>{r?.type!==e.ResponseType.Application&&r?.type!==e.ResponseType.Failure||(clearTimeout(a),n.unsubscribe(c),s(r))};n.subscribe(c),t(o)}))},e.shouldReinitialize=(e,t)=>!K(e,t),e.version=ue}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlxai/core",
|
|
3
|
-
"version": "1.2.3
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Low-level SDK for building NLX experiences",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.cjs",
|
|
@@ -16,38 +16,38 @@
|
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
|
|
19
|
-
"docs": "rm -rf docs/ && typedoc && concat-md --decrease-title-levels --dir-name-as-title docs/ > docs/index.md",
|
|
20
19
|
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
|
|
21
20
|
"lint": "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
|
|
22
21
|
"prepublish": "npm run build",
|
|
23
|
-
"preview-docs": "npm run docs && comrak --unsafe --gfm -o docs/index.html docs/index.md && open docs/index.html",
|
|
24
|
-
"publish-docs": "npm run docs && mv docs/index.md ../website/src/content/headless-api-reference.md",
|
|
25
22
|
"test": "typedoc --emit none",
|
|
26
|
-
"tsc": "tsc"
|
|
23
|
+
"tsc": "tsc",
|
|
24
|
+
"update-readme:docs": "rm -rf docs/ && typedoc",
|
|
25
|
+
"update-readme:merge": "../../scripts/transclude-markdown.js",
|
|
26
|
+
"update-readme": "npm run update-readme:docs && npm run update-readme:merge"
|
|
27
27
|
},
|
|
28
28
|
"author": "Peter Szerzo <peter@nlx.ai>",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/isomorphic-fetch": "^0.0.
|
|
32
|
-
"@types/node": "^
|
|
33
|
-
"@types/ramda": "0.
|
|
31
|
+
"@types/isomorphic-fetch": "^0.0.39",
|
|
32
|
+
"@types/node": "^24.10.1",
|
|
33
|
+
"@types/ramda": "0.31.1",
|
|
34
34
|
"@types/uuid": "^9.0.7",
|
|
35
35
|
"concat-md": "^0.5.1",
|
|
36
36
|
"eslint-config-nlx": "*",
|
|
37
37
|
"prettier": "^3.1.0",
|
|
38
38
|
"rollup-config-nlx": "*",
|
|
39
|
-
"typedoc": "^0.
|
|
40
|
-
"typedoc-plugin-markdown": "^
|
|
39
|
+
"typedoc": "^0.28.14",
|
|
40
|
+
"typedoc-plugin-markdown": "^4.9.0",
|
|
41
41
|
"typescript": "^5.5.4"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"isomorphic-fetch": "^3.0.0",
|
|
45
|
-
"ramda": "^0.
|
|
45
|
+
"ramda": "^0.32.0",
|
|
46
46
|
"reconnecting-websocket": "^4.4.0",
|
|
47
47
|
"uuid": "^9.0.1"
|
|
48
48
|
},
|
|
49
49
|
"publishConfig": {
|
|
50
50
|
"access": "public"
|
|
51
51
|
},
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "3902161e95745dd4a9cfb68bb469755a62b421f5"
|
|
53
53
|
}
|
package/typedoc.cjs
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/** @type { import('typedoc').TypeDocOptions & { hideInPageTOC?: boolean, hideBreadcrumbs?: boolean} } */
|
|
2
2
|
module.exports = {
|
|
3
3
|
entryPoints: ["./src/index.ts"],
|
|
4
|
+
hidePageHeader: true,
|
|
5
|
+
hidePageTitle: true,
|
|
4
6
|
hideBreadcrumbs: true,
|
|
5
|
-
|
|
7
|
+
formatWithPrettier: true,
|
|
8
|
+
readme: "none",
|
|
6
9
|
out: "docs",
|
|
10
|
+
useCodeBlocks: true,
|
|
7
11
|
plugin: ["typedoc-plugin-markdown"],
|
|
8
|
-
|
|
12
|
+
router: "module",
|
|
13
|
+
excludeInternal: true,
|
|
14
|
+
disableSources: true,
|
|
15
|
+
groupOrder: ["Functions", "Variables", "Interfaces", "*"],
|
|
9
16
|
sort: ["source-order", "kind", "instance-first", "alphabetical"],
|
|
10
17
|
treatValidationWarningsAsErrors: true,
|
|
11
18
|
treatWarningsAsErrors: true,
|