@nlxai/core 1.2.4-alpha.9 → 1.2.4
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 +107 -29
- package/docs/README.md +212 -9
- package/lib/index.cjs +86 -77
- package/lib/index.d.ts +30 -26
- package/lib/index.esm.js +86 -77
- package/lib/index.umd.js +2 -2
- package/package.json +4 -3
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.4
|
|
7
|
+
var version$1 = "1.2.4";
|
|
8
8
|
var description = "Low-level SDK for building NLX experiences";
|
|
9
9
|
var type = "module";
|
|
10
10
|
var main = "lib/index.cjs";
|
|
@@ -20,7 +20,7 @@ var exports = {
|
|
|
20
20
|
};
|
|
21
21
|
var scripts = {
|
|
22
22
|
build: "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
|
|
23
|
-
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
|
|
23
|
+
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0 && markdown-link-check README.md",
|
|
24
24
|
lint: "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
|
|
25
25
|
prepublish: "npm run build",
|
|
26
26
|
test: "typedoc --emit none",
|
|
@@ -32,6 +32,7 @@ var scripts = {
|
|
|
32
32
|
var author = "Peter Szerzo <peter@nlx.ai>";
|
|
33
33
|
var license = "MIT";
|
|
34
34
|
var devDependencies = {
|
|
35
|
+
"@boillodmanuel/markdown-link-check": "^4.7.0",
|
|
35
36
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
36
37
|
"@rollup/plugin-json": "^6.0.1",
|
|
37
38
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
@@ -60,7 +61,7 @@ var dependencies = {
|
|
|
60
61
|
var publishConfig = {
|
|
61
62
|
access: "public"
|
|
62
63
|
};
|
|
63
|
-
var gitHead = "
|
|
64
|
+
var gitHead = "bbfa1fad3f009a0f509903d6db4f51bec17b1f6c";
|
|
64
65
|
var packageJson = {
|
|
65
66
|
name: name,
|
|
66
67
|
version: version$1,
|
|
@@ -150,48 +151,81 @@ const safeJsonParse = (val) => {
|
|
|
150
151
|
return null;
|
|
151
152
|
}
|
|
152
153
|
};
|
|
153
|
-
const
|
|
154
|
+
const getHost = (url) => url.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0] ?? "apps.nlx.ai";
|
|
154
155
|
/**
|
|
155
|
-
*
|
|
156
|
-
* @param
|
|
157
|
-
* @returns
|
|
156
|
+
* Parse configuration into structured connection information, taking into account `applicationUrl`-based configs.
|
|
157
|
+
* @param config - client configuration.
|
|
158
|
+
* @returns connection - connection information, or `null` if the configuration is invalid.
|
|
158
159
|
*/
|
|
159
|
-
const
|
|
160
|
+
const parseConnection = (config) => {
|
|
161
|
+
const applicationUrl = config.applicationUrl ?? "";
|
|
162
|
+
const apiKey = config.apiKey ?? config.headers?.["nlx-api-key"] ?? "";
|
|
163
|
+
const protocol = config.protocol ??
|
|
164
|
+
/**
|
|
165
|
+
* Backwards-compatibility: if a websocket URL was specified, assume it's websocket. Otherwise, look at the legacy experimental streamsetting
|
|
166
|
+
* and only assume non-streaming if it's explicitly set to false.
|
|
167
|
+
*/
|
|
168
|
+
(isWebsocketUrl(applicationUrl)
|
|
169
|
+
? Protocol.Websocket
|
|
170
|
+
: config.experimental?.streamHttp === false
|
|
171
|
+
? Protocol.Https
|
|
172
|
+
: Protocol.HttpsWithStreaming);
|
|
173
|
+
if (config.host != null &&
|
|
174
|
+
config.channelKey != null &&
|
|
175
|
+
config.deploymentKey != null) {
|
|
176
|
+
return {
|
|
177
|
+
protocol,
|
|
178
|
+
apiKey,
|
|
179
|
+
host: config.host,
|
|
180
|
+
channelKey: config.channelKey,
|
|
181
|
+
deploymentKey: config.deploymentKey,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// `applicationUrl`-based definition: websocket case
|
|
160
185
|
if (isWebsocketUrl(applicationUrl)) {
|
|
161
|
-
|
|
186
|
+
const host = getHost(applicationUrl);
|
|
187
|
+
const url = new URL(applicationUrl);
|
|
188
|
+
const params = new URLSearchParams(url.search);
|
|
189
|
+
const channelKey = params.get("channelKey");
|
|
190
|
+
const deploymentKey = params.get("deploymentKey");
|
|
191
|
+
if (channelKey != null && deploymentKey != null) {
|
|
192
|
+
return { protocol, channelKey, deploymentKey, host, apiKey };
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
162
195
|
}
|
|
163
|
-
|
|
164
|
-
const
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return applicationUrl;
|
|
196
|
+
// `applicationUrl`-based definition: http case
|
|
197
|
+
const host = getHost(applicationUrl);
|
|
198
|
+
const parseResult = new URLPattern({
|
|
199
|
+
pathname: "/c/:deploymentKey/:channelKey",
|
|
200
|
+
}).exec(applicationUrl);
|
|
201
|
+
if (parseResult?.pathname.groups.channelKey != null &&
|
|
202
|
+
parseResult?.pathname.groups.deploymentKey != null) {
|
|
203
|
+
return {
|
|
204
|
+
protocol,
|
|
205
|
+
channelKey: parseResult.pathname.groups.channelKey,
|
|
206
|
+
deploymentKey: parseResult.pathname.groups.deploymentKey,
|
|
207
|
+
host,
|
|
208
|
+
apiKey,
|
|
209
|
+
};
|
|
178
210
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
211
|
+
return null;
|
|
212
|
+
};
|
|
213
|
+
const toWebsocketUrl = (connection) => {
|
|
214
|
+
return `wss://us-east-1-ws.${connection.host}?deploymentKey=${connection.deploymentKey}&channelKey=${connection.channelKey}&apiKey=${connection.apiKey}`;
|
|
215
|
+
};
|
|
216
|
+
const toHttpUrl = (connection) => {
|
|
217
|
+
return `https://${connection.host}/c/${connection.deploymentKey}/${connection.channelKey}`;
|
|
185
218
|
};
|
|
186
219
|
const isWebsocketUrl = (url) => {
|
|
187
220
|
return url.indexOf("wss://") === 0;
|
|
188
221
|
};
|
|
189
|
-
const fetchUserMessage = async ({ fullApplicationUrl, headers, body, stream, eventListeners, }) => {
|
|
222
|
+
const fetchUserMessage = async ({ fullApplicationUrl, apiKey, headers, body, stream, eventListeners, }) => {
|
|
190
223
|
const streamRequest = async (body) => {
|
|
191
224
|
const response = await fetch(fullApplicationUrl, {
|
|
192
225
|
method: "POST",
|
|
193
226
|
headers: {
|
|
194
227
|
...headers,
|
|
228
|
+
"nlx-api-key": apiKey,
|
|
195
229
|
"Content-Type": "application/json",
|
|
196
230
|
// Legacy header
|
|
197
231
|
"nlx-sdk-version": packageJson.version,
|
|
@@ -277,6 +311,7 @@ const fetchUserMessage = async ({ fullApplicationUrl, headers, body, stream, eve
|
|
|
277
311
|
method: "POST",
|
|
278
312
|
headers: {
|
|
279
313
|
...(headers ?? {}),
|
|
314
|
+
"nlx-api-key": apiKey,
|
|
280
315
|
Accept: "application/json",
|
|
281
316
|
"Content-Type": "application/json",
|
|
282
317
|
// Legacy header
|
|
@@ -316,31 +351,13 @@ function createConversation(configuration) {
|
|
|
316
351
|
let voicePlusSocket;
|
|
317
352
|
let voicePlusSocketMessageQueue = [];
|
|
318
353
|
let voicePlusSocketMessageQueueCheckInterval = null;
|
|
319
|
-
const
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
(
|
|
325
|
-
|
|
326
|
-
: configuration.experimental?.streamHttp === false
|
|
327
|
-
? Protocol.Https
|
|
328
|
-
: Protocol.HttpsWithStreaming);
|
|
329
|
-
/**
|
|
330
|
-
* TODO: Instead of re-serializing the host/deploymentKey/channelKey combo and normalizing them again into various socket and HTTP URL's,
|
|
331
|
-
* parse them out of the `applicationUrl` if specified, and use them to build up the URL's in use. This way we avoid serializing and then
|
|
332
|
-
* parsing again.
|
|
333
|
-
*/
|
|
334
|
-
const applicationUrl = (() => {
|
|
335
|
-
if (configuration.host != null &&
|
|
336
|
-
configuration.deploymentKey != null &&
|
|
337
|
-
configuration.channelKey != null) {
|
|
338
|
-
return `https://${configuration.host}/c/${configuration.deploymentKey}/${configuration.channelKey}`;
|
|
339
|
-
}
|
|
340
|
-
return configuration.applicationUrl ?? "";
|
|
341
|
-
})();
|
|
342
|
-
const websocketApplicationUrl = normalizeToWebsocket(applicationUrl);
|
|
343
|
-
const httpApplicationUrl = normalizeToHttp(applicationUrl);
|
|
354
|
+
const connection = parseConnection(configuration);
|
|
355
|
+
const websocketApplicationUrl = connection != null
|
|
356
|
+
? toWebsocketUrl(connection)
|
|
357
|
+
: configuration.applicationUrl ?? "";
|
|
358
|
+
const httpApplicationUrl = connection != null
|
|
359
|
+
? toHttpUrl(connection)
|
|
360
|
+
: configuration.applicationUrl ?? "";
|
|
344
361
|
// Check if the application URL has a language code appended to it
|
|
345
362
|
if (/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(httpApplicationUrl)) {
|
|
346
363
|
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.");
|
|
@@ -450,7 +467,7 @@ function createConversation(configuration) {
|
|
|
450
467
|
channelType: configuration.experimental?.channelType,
|
|
451
468
|
environment: configuration.environment,
|
|
452
469
|
};
|
|
453
|
-
if (protocol === Protocol.Websocket) {
|
|
470
|
+
if (connection?.protocol === Protocol.Websocket) {
|
|
454
471
|
if (socket?.readyState === 1) {
|
|
455
472
|
socket.send(JSON.stringify(bodyWithContext));
|
|
456
473
|
}
|
|
@@ -462,8 +479,9 @@ function createConversation(configuration) {
|
|
|
462
479
|
try {
|
|
463
480
|
const json = await fetchUserMessage({
|
|
464
481
|
fullApplicationUrl: fullApplicationHttpUrl(),
|
|
482
|
+
apiKey: connection?.apiKey ?? "",
|
|
465
483
|
headers: configuration.headers ?? {},
|
|
466
|
-
stream: protocol === Protocol.HttpsWithStreaming,
|
|
484
|
+
stream: connection?.protocol === Protocol.HttpsWithStreaming,
|
|
467
485
|
eventListeners,
|
|
468
486
|
body: bodyWithContext,
|
|
469
487
|
});
|
|
@@ -498,10 +516,6 @@ function createConversation(configuration) {
|
|
|
498
516
|
url.searchParams.set("channelKey", `${url.searchParams.get("channelKey") ?? ""}-${state.languageCode}`);
|
|
499
517
|
}
|
|
500
518
|
url.searchParams.set("conversationId", state.conversationId);
|
|
501
|
-
const apiKey = configuration.headers["nlx-api-key"];
|
|
502
|
-
if (apiKey != null) {
|
|
503
|
-
url.searchParams.set("apiKey", apiKey);
|
|
504
|
-
}
|
|
505
519
|
socket = new ReconnectingWebSocket(url.href);
|
|
506
520
|
socketMessageQueueCheckInterval = setInterval(() => {
|
|
507
521
|
void checkSocketQueue();
|
|
@@ -525,9 +539,8 @@ function createConversation(configuration) {
|
|
|
525
539
|
}
|
|
526
540
|
url.searchParams.set("conversationId", state.conversationId);
|
|
527
541
|
url.searchParams.set("type", "voice-plus");
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
url.searchParams.set("apiKey", apiKey);
|
|
542
|
+
if (connection?.apiKey != null) {
|
|
543
|
+
url.searchParams.set("apiKey", connection.apiKey);
|
|
531
544
|
}
|
|
532
545
|
voicePlusSocket = new ReconnectingWebSocket(url.href);
|
|
533
546
|
voicePlusSocketMessageQueueCheckInterval = setInterval(() => {
|
|
@@ -564,7 +577,7 @@ function createConversation(configuration) {
|
|
|
564
577
|
voicePlusSocket = undefined;
|
|
565
578
|
}
|
|
566
579
|
};
|
|
567
|
-
if (protocol === Protocol.Websocket) {
|
|
580
|
+
if (connection?.protocol === Protocol.Websocket) {
|
|
568
581
|
setupWebsocket();
|
|
569
582
|
}
|
|
570
583
|
setupCommandWebsocket();
|
|
@@ -647,7 +660,7 @@ function createConversation(configuration) {
|
|
|
647
660
|
request: {
|
|
648
661
|
structured: {
|
|
649
662
|
nodeId: metadata?.nodeId,
|
|
650
|
-
intentId: metadata?.intentId,
|
|
663
|
+
intentId: metadata?.flowId ?? metadata?.intentId,
|
|
651
664
|
choiceId,
|
|
652
665
|
},
|
|
653
666
|
},
|
|
@@ -670,6 +683,7 @@ function createConversation(configuration) {
|
|
|
670
683
|
method: "POST",
|
|
671
684
|
headers: {
|
|
672
685
|
...(configuration.headers ?? {}),
|
|
686
|
+
"nlx-api-key": connection?.apiKey ?? "",
|
|
673
687
|
Accept: "application/json",
|
|
674
688
|
"Content-Type": "application/json",
|
|
675
689
|
"nlx-conversation-id": state.conversationId,
|
|
@@ -755,7 +769,7 @@ function createConversation(configuration) {
|
|
|
755
769
|
Console.warn("Attempted to set language code to the one already active.");
|
|
756
770
|
return;
|
|
757
771
|
}
|
|
758
|
-
if (protocol === Protocol.Websocket) {
|
|
772
|
+
if (connection?.protocol === Protocol.Websocket) {
|
|
759
773
|
setupWebsocket();
|
|
760
774
|
}
|
|
761
775
|
setupCommandWebsocket();
|
|
@@ -769,6 +783,7 @@ function createConversation(configuration) {
|
|
|
769
783
|
method: "POST",
|
|
770
784
|
headers: {
|
|
771
785
|
...(configuration.headers ?? {}),
|
|
786
|
+
"nlx-api-key": connection?.apiKey ?? "",
|
|
772
787
|
Accept: "application/json",
|
|
773
788
|
"Content-Type": "application/json",
|
|
774
789
|
"nlx-conversation-id": state.conversationId,
|
|
@@ -804,14 +819,14 @@ function createConversation(configuration) {
|
|
|
804
819
|
conversationId: v4(),
|
|
805
820
|
responses: options?.clearResponses === true ? [] : state.responses,
|
|
806
821
|
});
|
|
807
|
-
if (protocol === Protocol.Websocket) {
|
|
822
|
+
if (connection?.protocol === Protocol.Websocket) {
|
|
808
823
|
setupWebsocket();
|
|
809
824
|
}
|
|
810
825
|
setupCommandWebsocket();
|
|
811
826
|
},
|
|
812
827
|
destroy: () => {
|
|
813
828
|
subscribers = [];
|
|
814
|
-
if (protocol === Protocol.Websocket) {
|
|
829
|
+
if (connection?.protocol === Protocol.Websocket) {
|
|
815
830
|
teardownWebsocket();
|
|
816
831
|
}
|
|
817
832
|
teardownCommandWebsocket();
|
|
@@ -836,13 +851,7 @@ function createConversation(configuration) {
|
|
|
836
851
|
* @returns Whether the configuration is valid?
|
|
837
852
|
*/
|
|
838
853
|
const isConfigValid = (configuration) => {
|
|
839
|
-
|
|
840
|
-
configuration.deploymentKey != null &&
|
|
841
|
-
configuration.channelKey != null) {
|
|
842
|
-
return true;
|
|
843
|
-
}
|
|
844
|
-
const applicationUrl = configuration.applicationUrl ?? "";
|
|
845
|
-
return applicationUrl.length > 0;
|
|
854
|
+
return parseConnection(configuration) != null;
|
|
846
855
|
};
|
|
847
856
|
/**
|
|
848
857
|
* Helper method to decide when a new {@link Config} requires creating a new {@link ConversationHandler} or whether the old `Config`'s
|
package/lib/index.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nlx={})}(this,(function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||"undefined"!=typeof global&&global||{},r="URLSearchParams"in n,o="Symbol"in n&&"iterator"in Symbol,s="FileReader"in n&&"Blob"in n&&function(){try{return new Blob,!0}catch(e){return!1}}(),i="FormData"in n,a="ArrayBuffer"in n;if(a)var c=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],u=ArrayBuffer.isView||function(e){return e&&c.indexOf(Object.prototype.toString.call(e))>-1};function l(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(e)||""===e)throw new TypeError('Invalid character in header field name: "'+e+'"');return e.toLowerCase()}function d(e){return"string"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return o&&(t[Symbol.iterator]=function(){return t}),t}function f(e){this.map={},e instanceof f?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){if(2!=e.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+e.length);this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function h(e){if(!e._noBody)return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function y(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function g(e){var t=new FileReader,n=y(t);return t.readAsArrayBuffer(e),n}function m(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(e){var t;this.bodyUsed=this.bodyUsed,this._bodyInit=e,e?"string"==typeof e?this._bodyText=e:s&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:i&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:r&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():a&&s&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=m(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(e)||u(e))?this._bodyArrayBuffer=m(e):this._bodyText=e=Object.prototype.toString.call(e):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},s&&(this.blob=function(){var e=h(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var e=h(this);return e||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}if(s)return this.blob().then(g);throw new Error("could not read as ArrayBuffer")},this.text=function(){var e,t,n,r,o,s=h(this);if(s)return s;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=y(t),r=/charset=([A-Za-z0-9_-]+)/.exec(e.type),o=r?r[1]:"utf-8",t.readAsText(e,o),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}f.prototype.append=function(e,t){e=l(e),t=d(t);var n=this.map[e];this.map[e]=n?n+", "+t:t},f.prototype.delete=function(e){delete this.map[l(e)]},f.prototype.get=function(e){return e=l(e),this.has(e)?this.map[e]:null},f.prototype.has=function(e){return this.map.hasOwnProperty(l(e))},f.prototype.set=function(e,t){this.map[l(e)]=d(t)},f.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},f.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},f.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},f.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},o&&(f.prototype[Symbol.iterator]=f.prototype.entries);var v=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function _(e,t){if(!(this instanceof _))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');var r,o,s=(t=t||{}).body;if(e instanceof _){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new f(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,s||null==e._bodyInit||(s=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",!t.headers&&this.headers||(this.headers=new f(t.headers)),this.method=(r=t.method||this.method||"GET",o=r.toUpperCase(),v.indexOf(o)>-1?o:r),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal||function(){if("AbortController"in n)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&s)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(s),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==t.cache&&"no-cache"!==t.cache)){var i=/([?&])_=[^&]*/;if(i.test(this.url))this.url=this.url.replace(i,"$1_="+(new Date).getTime());else{this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}}function w(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function T(e,t){if(!(this instanceof T))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===t.statusText?"":""+t.statusText,this.headers=new f(t.headers),this.url=t.url||"",this._initBody(e)}_.prototype.clone=function(){return new _(this,{body:this._bodyInit})},b.call(_.prototype),b.call(T.prototype),T.prototype.clone=function(){return new T(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new f(this.headers),url:this.url})},T.error=function(){var e=new T(null,{status:200,statusText:""});return e.ok=!1,e.status=0,e.type="error",e};var x=[301,302,303,307,308];T.redirect=function(e,t){if(-1===x.indexOf(t))throw new RangeError("Invalid status code");return new T(null,{status:t,headers:{location:e}})};var E=n.DOMException;try{new E}catch(e){E=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},E.prototype=Object.create(Error.prototype),E.prototype.constructor=E}function O(e,t){return new Promise((function(r,o){var i=new _(e,t);if(i.signal&&i.signal.aborted)return o(new E("Aborted","AbortError"));var c=new XMLHttpRequest;function u(){c.abort()}if(c.onload=function(){var e,t,n={statusText:c.statusText,headers:(e=c.getAllResponseHeaders()||"",t=new f,e.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(e){return 0===e.indexOf("\n")?e.substr(1,e.length):e})).forEach((function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();try{t.append(r,o)}catch(e){console.warn("Response "+e.message)}}})),t)};0===i.url.indexOf("file://")&&(c.status<200||c.status>599)?n.status=200:n.status=c.status,n.url="responseURL"in c?c.responseURL:n.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout((function(){r(new T(o,n))}),0)},c.onerror=function(){setTimeout((function(){o(new TypeError("Network request failed"))}),0)},c.ontimeout=function(){setTimeout((function(){o(new TypeError("Network request timed out"))}),0)},c.onabort=function(){setTimeout((function(){o(new E("Aborted","AbortError"))}),0)},c.open(i.method,function(e){try{return""===e&&n.location.href?n.location.href:e}catch(t){return e}}(i.url),!0),"include"===i.credentials?c.withCredentials=!0:"omit"===i.credentials&&(c.withCredentials=!1),"responseType"in c&&(s?c.responseType="blob":a&&(c.responseType="arraybuffer")),t&&"object"==typeof t.headers&&!(t.headers instanceof f||n.Headers&&t.headers instanceof n.Headers)){var p=[];Object.getOwnPropertyNames(t.headers).forEach((function(e){p.push(l(e)),c.setRequestHeader(e,d(t.headers[e]))})),i.headers.forEach((function(e,t){-1===p.indexOf(t)&&c.setRequestHeader(t,e)}))}else i.headers.forEach((function(e,t){c.setRequestHeader(t,e)}));i.signal&&(i.signal.addEventListener("abort",u),c.onreadystatechange=function(){4===c.readyState&&i.signal.removeEventListener("abort",u)}),c.send(void 0===i._bodyInit?null:i._bodyInit)}))}O.polyfill=!0,n.fetch||(n.fetch=O,n.Headers=f,n.Request=_,n.Response=T);var I=t(self.fetch.bind(self));function A(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function C(e){return function t(n){return 0===arguments.length||A(n)?t:e.apply(this,arguments)}}function P(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return A(n)?t:C((function(t){return e(n,t)}));default:return A(n)&&A(r)?t:A(n)?C((function(t){return e(t,r)})):A(r)?C((function(t){return e(n,t)})):e(n,r)}}}function S(e){return function t(n,r,o){switch(arguments.length){case 0:return t;case 1:return A(n)?t:P((function(t,r){return e(n,t,r)}));case 2:return A(n)&&A(r)?t:A(n)?P((function(t,n){return e(t,r,n)})):A(r)?P((function(t,r){return e(n,t,r)})):C((function(t){return e(n,r,t)}));default:return A(n)&&A(r)&&A(o)?t:A(n)&&A(r)?P((function(t,n){return e(t,n,o)})):A(n)&&A(o)?P((function(t,n){return e(t,r,n)})):A(r)&&A(o)?P((function(t,r){return e(n,t,r)})):A(n)?C((function(t){return e(t,r,o)})):A(r)?C((function(t){return e(n,t,o)})):A(o)?C((function(t){return e(n,r,t)})):e(n,r,o)}}}var U=S((function(e,t,n){var r=n.length;if(e>=r||e<-r)return n;var o=(r+e)%r,s=function(e,t){var n;t=t||[];var r=(e=e||[]).length,o=t.length,s=[];for(n=0;n<r;)s[s.length]=e[n],n+=1;for(n=0;n<o;)s[s.length]=t[n],n+=1;return s}(n);return s[o]=t(n[o]),s}));function R(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function j(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+=1}return!1}function L(e,t){return Object.prototype.hasOwnProperty.call(t,e)}var D="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},k=Object.prototype.toString,N=function(){return"[object Arguments]"===k.call(arguments)?function(e){return"[object Arguments]"===k.call(e)}:function(e){return L("callee",e)}}(),B=!{toString:null}.propertyIsEnumerable("toString"),q=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],F=function(){return arguments.propertyIsEnumerable("length")}(),$=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1},W="function"!=typeof Object.keys||F?C((function(e){if(Object(e)!==e)return[];var t,n,r=[],o=F&&N(e);for(t in e)!L(t,e)||o&&"length"===t||(r[r.length]=t);if(B)for(n=q.length-1;n>=0;)L(t=q[n],e)&&!$(r,t)&&(r[r.length]=t),n-=1;return r})):C((function(e){return Object(e)!==e?[]:Object.keys(e)})),H=C((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));function M(e,t,n,r){var o=R(e);function s(e,t){return K(e,t,n.slice(),r.slice())}return!j((function(e,t){return!j(s,t,e)}),R(t),o)}function K(e,t,n,r){if(D(e,t))return!0;var o,s,i=H(e);if(i!==H(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(o=e.constructor,null==(s=String(o).match(/^function (\w*)/))?"":s[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!D(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!D(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var a=n.length-1;a>=0;){if(n[a]===e)return r[a]===t;a-=1}switch(i){case"Map":return e.size===t.size&&M(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&M(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=W(e);if(c.length!==W(t).length)return!1;var u=n.concat([e]),l=r.concat([t]);for(a=c.length-1;a>=0;){var d=c[a];if(!L(d,t)||!K(t[d],e[d],u,l))return!1;a-=1}return!0}var G=P((function(e,t){return K(e,t,[],[])})),V=function(e,t){return V=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},V(e,t)};
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).nlx={})}(this,(function(e){"use strict";function t(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||"undefined"!=typeof global&&global||{},r="URLSearchParams"in n,o="Symbol"in n&&"iterator"in Symbol,s="FileReader"in n&&"Blob"in n&&function(){try{return new Blob,!0}catch(e){return!1}}(),i="FormData"in n,a="ArrayBuffer"in n;if(a)var c=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],u=ArrayBuffer.isView||function(e){return e&&c.indexOf(Object.prototype.toString.call(e))>-1};function l(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(e)||""===e)throw new TypeError('Invalid character in header field name: "'+e+'"');return e.toLowerCase()}function d(e){return"string"!=typeof e&&(e=String(e)),e}function p(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return o&&(t[Symbol.iterator]=function(){return t}),t}function h(e){this.map={},e instanceof h?e.forEach((function(e,t){this.append(t,e)}),this):Array.isArray(e)?e.forEach((function(e){if(2!=e.length)throw new TypeError("Headers constructor: expected name/value pair to be length 2, found"+e.length);this.append(e[0],e[1])}),this):e&&Object.getOwnPropertyNames(e).forEach((function(t){this.append(t,e[t])}),this)}function f(e){if(!e._noBody)return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function y(e){return new Promise((function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}}))}function m(e){var t=new FileReader,n=y(t);return t.readAsArrayBuffer(e),n}function g(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function b(){return this.bodyUsed=!1,this._initBody=function(e){var t;this.bodyUsed=this.bodyUsed,this._bodyInit=e,e?"string"==typeof e?this._bodyText=e:s&&Blob.prototype.isPrototypeOf(e)?this._bodyBlob=e:i&&FormData.prototype.isPrototypeOf(e)?this._bodyFormData=e:r&&URLSearchParams.prototype.isPrototypeOf(e)?this._bodyText=e.toString():a&&s&&((t=e)&&DataView.prototype.isPrototypeOf(t))?(this._bodyArrayBuffer=g(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):a&&(ArrayBuffer.prototype.isPrototypeOf(e)||u(e))?this._bodyArrayBuffer=g(e):this._bodyText=e=Object.prototype.toString.call(e):(this._noBody=!0,this._bodyText=""),this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):r&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},s&&(this.blob=function(){var e=f(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))}),this.arrayBuffer=function(){if(this._bodyArrayBuffer){var e=f(this);return e||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer))}if(s)return this.blob().then(m);throw new Error("could not read as ArrayBuffer")},this.text=function(){var e,t,n,r,o,s=f(this);if(s)return s;if(this._bodyBlob)return e=this._bodyBlob,t=new FileReader,n=y(t),r=/charset=([A-Za-z0-9_-]+)/.exec(e.type),o=r?r[1]:"utf-8",t.readAsText(e,o),n;if(this._bodyArrayBuffer)return Promise.resolve(function(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},i&&(this.formData=function(){return this.text().then(w)}),this.json=function(){return this.text().then(JSON.parse)},this}h.prototype.append=function(e,t){e=l(e),t=d(t);var n=this.map[e];this.map[e]=n?n+", "+t:t},h.prototype.delete=function(e){delete this.map[l(e)]},h.prototype.get=function(e){return e=l(e),this.has(e)?this.map[e]:null},h.prototype.has=function(e){return this.map.hasOwnProperty(l(e))},h.prototype.set=function(e,t){this.map[l(e)]=d(t)},h.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},h.prototype.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),p(e)},h.prototype.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),p(e)},h.prototype.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),p(e)},o&&(h.prototype[Symbol.iterator]=h.prototype.entries);var v=["CONNECT","DELETE","GET","HEAD","OPTIONS","PATCH","POST","PUT","TRACE"];function _(e,t){if(!(this instanceof _))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');var r,o,s=(t=t||{}).body;if(e instanceof _){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new h(e.headers)),this.method=e.method,this.mode=e.mode,this.signal=e.signal,s||null==e._bodyInit||(s=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"same-origin",!t.headers&&this.headers||(this.headers=new h(t.headers)),this.method=(r=t.method||this.method||"GET",o=r.toUpperCase(),v.indexOf(o)>-1?o:r),this.mode=t.mode||this.mode||null,this.signal=t.signal||this.signal||function(){if("AbortController"in n)return(new AbortController).signal}(),this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&s)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(s),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==t.cache&&"no-cache"!==t.cache)){var i=/([?&])_=[^&]*/;if(i.test(this.url))this.url=this.url.replace(i,"$1_="+(new Date).getTime());else{this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}}function w(e){var t=new FormData;return e.trim().split("&").forEach((function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}})),t}function T(e,t){if(!(this instanceof T))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');if(t||(t={}),this.type="default",this.status=void 0===t.status?200:t.status,this.status<200||this.status>599)throw new RangeError("Failed to construct 'Response': The status provided (0) is outside the range [200, 599].");this.ok=this.status>=200&&this.status<300,this.statusText=void 0===t.statusText?"":""+t.statusText,this.headers=new h(t.headers),this.url=t.url||"",this._initBody(e)}_.prototype.clone=function(){return new _(this,{body:this._bodyInit})},b.call(_.prototype),b.call(T.prototype),T.prototype.clone=function(){return new T(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new h(this.headers),url:this.url})},T.error=function(){var e=new T(null,{status:200,statusText:""});return e.ok=!1,e.status=0,e.type="error",e};var x=[301,302,303,307,308];T.redirect=function(e,t){if(-1===x.indexOf(t))throw new RangeError("Invalid status code");return new T(null,{status:t,headers:{location:e}})};var E=n.DOMException;try{new E}catch(e){E=function(e,t){this.message=e,this.name=t;var n=Error(e);this.stack=n.stack},E.prototype=Object.create(Error.prototype),E.prototype.constructor=E}function O(e,t){return new Promise((function(r,o){var i=new _(e,t);if(i.signal&&i.signal.aborted)return o(new E("Aborted","AbortError"));var c=new XMLHttpRequest;function u(){c.abort()}if(c.onload=function(){var e,t,n={statusText:c.statusText,headers:(e=c.getAllResponseHeaders()||"",t=new h,e.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(e){return 0===e.indexOf("\n")?e.substr(1,e.length):e})).forEach((function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();try{t.append(r,o)}catch(e){console.warn("Response "+e.message)}}})),t)};0===i.url.indexOf("file://")&&(c.status<200||c.status>599)?n.status=200:n.status=c.status,n.url="responseURL"in c?c.responseURL:n.headers.get("X-Request-URL");var o="response"in c?c.response:c.responseText;setTimeout((function(){r(new T(o,n))}),0)},c.onerror=function(){setTimeout((function(){o(new TypeError("Network request failed"))}),0)},c.ontimeout=function(){setTimeout((function(){o(new TypeError("Network request timed out"))}),0)},c.onabort=function(){setTimeout((function(){o(new E("Aborted","AbortError"))}),0)},c.open(i.method,function(e){try{return""===e&&n.location.href?n.location.href:e}catch(t){return e}}(i.url),!0),"include"===i.credentials?c.withCredentials=!0:"omit"===i.credentials&&(c.withCredentials=!1),"responseType"in c&&(s?c.responseType="blob":a&&(c.responseType="arraybuffer")),t&&"object"==typeof t.headers&&!(t.headers instanceof h||n.Headers&&t.headers instanceof n.Headers)){var p=[];Object.getOwnPropertyNames(t.headers).forEach((function(e){p.push(l(e)),c.setRequestHeader(e,d(t.headers[e]))})),i.headers.forEach((function(e,t){-1===p.indexOf(t)&&c.setRequestHeader(t,e)}))}else i.headers.forEach((function(e,t){c.setRequestHeader(t,e)}));i.signal&&(i.signal.addEventListener("abort",u),c.onreadystatechange=function(){4===c.readyState&&i.signal.removeEventListener("abort",u)}),c.send(void 0===i._bodyInit?null:i._bodyInit)}))}O.polyfill=!0,n.fetch||(n.fetch=O,n.Headers=h,n.Request=_,n.Response=T);var I=t(self.fetch.bind(self));function A(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function C(e){return function t(n){return 0===arguments.length||A(n)?t:e.apply(this,arguments)}}function P(e){return function t(n,r){switch(arguments.length){case 0:return t;case 1:return A(n)?t:C((function(t){return e(n,t)}));default:return A(n)&&A(r)?t:A(n)?C((function(t){return e(t,r)})):A(r)?C((function(t){return e(n,t)})):e(n,r)}}}function S(e){return function t(n,r,o){switch(arguments.length){case 0:return t;case 1:return A(n)?t:P((function(t,r){return e(n,t,r)}));case 2:return A(n)&&A(r)?t:A(n)?P((function(t,n){return e(t,r,n)})):A(r)?P((function(t,r){return e(n,t,r)})):C((function(t){return e(n,r,t)}));default:return A(n)&&A(r)&&A(o)?t:A(n)&&A(r)?P((function(t,n){return e(t,n,o)})):A(n)&&A(o)?P((function(t,n){return e(t,r,n)})):A(r)&&A(o)?P((function(t,r){return e(n,t,r)})):A(n)?C((function(t){return e(t,r,o)})):A(r)?C((function(t){return e(n,t,o)})):A(o)?C((function(t){return e(n,r,t)})):e(n,r,o)}}}var U=S((function(e,t,n){var r=n.length;if(e>=r||e<-r)return n;var o=(r+e)%r,s=function(e,t){var n;t=t||[];var r=(e=e||[]).length,o=t.length,s=[];for(n=0;n<r;)s[s.length]=e[n],n+=1;for(n=0;n<o;)s[s.length]=t[n],n+=1;return s}(n);return s[o]=t(n[o]),s}));function R(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function j(e,t,n){for(var r=0,o=n.length;r<o;){if(e(t,n[r]))return!0;r+=1}return!1}function L(e,t){return Object.prototype.hasOwnProperty.call(t,e)}var D="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},k=Object.prototype.toString,N=function(){return"[object Arguments]"===k.call(arguments)?function(e){return"[object Arguments]"===k.call(e)}:function(e){return L("callee",e)}}(),B=!{toString:null}.propertyIsEnumerable("toString"),K=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],q=function(){return arguments.propertyIsEnumerable("length")}(),F=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1},$="function"!=typeof Object.keys||q?C((function(e){if(Object(e)!==e)return[];var t,n,r=[],o=q&&N(e);for(t in e)!L(t,e)||o&&"length"===t||(r[r.length]=t);if(B)for(n=K.length-1;n>=0;)L(t=K[n],e)&&!F(r,t)&&(r[r.length]=t),n-=1;return r})):C((function(e){return Object(e)!==e?[]:Object.keys(e)})),W=C((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));function H(e,t,n,r){var o=R(e);function s(e,t){return M(e,t,n.slice(),r.slice())}return!j((function(e,t){return!j(s,t,e)}),R(t),o)}function M(e,t,n,r){if(D(e,t))return!0;var o,s,i=W(e);if(i!==W(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(i){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(o=e.constructor,null==(s=String(o).match(/^function (\w*)/))?"":s[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!D(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!D(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var a=n.length-1;a>=0;){if(n[a]===e)return r[a]===t;a-=1}switch(i){case"Map":return e.size===t.size&&H(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&H(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var c=$(e);if(c.length!==$(t).length)return!1;var u=n.concat([e]),l=r.concat([t]);for(a=c.length-1;a>=0;){var d=c[a];if(!L(d,t)||!M(t[d],e[d],u,l))return!1;a-=1}return!0}var G=P((function(e,t){return M(e,t,[],[])})),V=function(e,t){return V=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},V(e,t)};
|
|
2
2
|
/*! *****************************************************************************
|
|
3
3
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
4
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
@@ -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 J(e,t){function n(){this.constructor=e}V(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function z(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 J(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 J(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(z(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.4-alpha.9";const ue=ce,le=console;var de,pe;e.Protocol=void 0,(de=e.Protocol||(e.Protocol={})).Https="https",de.HttpsWithStreaming="httpsWithStreaming",de.Websocket="websocket",e.ResponseType=void 0,(pe=e.ResponseType||(e.ResponseType={})).Application="bot",pe.User="user",pe.Failure="failure";const fe="NLX.Welcome",he=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),ye=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?he(e.slots):e.slots}),ge=e=>e.responses,me=e=>{try{return JSON.parse(e)}catch(e){return null}},be=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",ve=e=>0===e.indexOf("wss://"),_e=async({fullApplicationUrl:e,headers:t,body:n,stream:r,eventListeners:o})=>{if(r)return await(async n=>{const r=await I(e,{method:"POST",headers:{...t,"Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({...n,stream:!0})});if(!r.ok||null==r.body)throw new Error(`HTTP Error: ${r.status}`);const s=r.body.getReader(),i=new TextDecoder;let a="";const c=[];let u={};for(;;){const{done:e,value:t}=await s.read();if(e)break;for(a+=i.decode(t,{stream:!0});;){const e=a.indexOf("{");if(-1===e)break;let t=!1;for(let n=0;n<a.length;n++)if("}"===a[n]){const r=a.substring(e,n+1);try{const e=JSON.parse(r);if("interim"===e.type){const t=e.text;"string"==typeof t&&o.interimMessage.forEach((e=>{e(t)}))}else"message"===e.type?c.push({text:e.text,choices:e.choices??[],messageId:e.messageId,metadata:e.metadata}):"final_response"===e.type&&(u=e.data);a=a.substring(n+1),t=!0;break}catch(e){}}if(!t)break}}return o.interimMessage.forEach((e=>{e(void 0)})),{...u,messages:[...c,...(u.messages??[]).map((e=>({text:e.text,choices:e.choices??[],messageId:e.messageId,metadata:e.metadata})))]}})(n);{const r=await I(e,{method:"POST",headers:{...t??{},Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify(n)});if(!r.ok||null==r.body)throw new Error(`HTTP Error: ${r.status}`);return await r.json()}};const we=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const c=t.protocol??(ve(t.applicationUrl??"")?e.Protocol.Websocket:!1===t.experimental?.streamHttp?e.Protocol.Https:e.Protocol.HttpsWithStreaming),u=null!=t.host&&null!=t.deploymentKey&&null!=t.channelKey?`https://${t.host}/c/${t.deploymentKey}/${t.channelKey}`:t.applicationUrl??"",l=(e=>{if(ve(e))return e;const t=be(e),n=new URL(e).pathname.split("/");return`wss://us-east-1-ws.${t}?deploymentKey=${n[2]}&channelKey=${n[3]}`})(u),d=(e=>{if(!ve(e))return e;const t=be(e),n=new URL(e),r=new URLSearchParams(n.search),o=r.get("channelKey");return`https://${t}/c/${r.get("deploymentKey")}/${o}`})(u);/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(d)&&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 p={voicePlusCommand:[],interimMessage:[]},f=t.conversationId??ae();let h={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:f};const y=()=>`${d}${!0===t.experimental?.completeApplicationUrl?"":`-${h.languageCode}`}`,g=(e,t)=>{h={...h,...e},T.forEach((e=>{e(ge(h),t)}))},m=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};g({responses:[...h.responses,n]},n)},b=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??[]})))}};g({responses:[...h.responses,n]},n),t.metadata.hasPendingDataRequest&&(C({poll:!0}),setTimeout((()=>{w({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),m()};let v;const _=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},w=async r=>{if(null!=v)return void v(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};g({responses:[...h.responses,n]},n)}));const s={userId:h.userId,conversationId:h.conversationId,...r,languageCode:h.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(c===e.Protocol.Websocket)1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const n=await _e({fullApplicationUrl:y(),headers:t.headers??{},stream:c===e.Protocol.HttpsWithStreaming,eventListeners:p,body:s});b(n)}catch(e){le.warn(e),m()}};let T=[];const x=()=>{O();const e=new URL(l);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",h.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${h.languageCode}`)),e.searchParams.set("conversationId",h.conversationId);const r=t.headers["nlx-api-key"];null!=r&&e.searchParams.set("apiKey",r),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await w(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&b(me(e.data))}},E=()=>{if(A(),!0!==t.bidirectional)return;const e=new URL(l);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",h.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${h.languageCode}`)),e.searchParams.set("conversationId",h.conversationId),e.searchParams.set("type","voice-plus");const n=t.headers["nlx-api-key"];null!=n&&e.searchParams.set("apiKey",n),r=new te(e.href),a=setInterval((()=>{1===r?.readyState&&null!=i[0]&&(_(i[0]),i=i.slice(1))}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=me(e.data);null!=t&&p.voicePlusCommand.forEach((e=>{e(t)}))}}},O=()=>{null!=s&&clearInterval(s),null!=n&&(n.onmessage=null,n.close(),n=void 0)},A=()=>{null!=a&&clearInterval(a),null!=r&&(r.onmessage=null,r.close(),r=void 0)};c===e.Protocol.Websocket&&x(),E();const C=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...ye(t),context:n}};g({responses:[...h.responses,r]},r)},P=(e,t)=>{C({intentId:e},t),w({context:t,request:{structured:{intentId:e}}})},S=e=>{T=T.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}};g({responses:[...h.responses,r]},r),w({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await I(`${y()}/context`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":h.conversationId,"nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.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()};g({responses:[...h.responses,t]},t)},sendStructured:(e,t)=>{C(e,t),w({context:t,request:{structured:ye(e)}})},sendSlots:(e,t)=>{C({slots:e},t),w({context:t,request:{structured:{slots:he(e)}}})},sendFlow:P,sendIntent:(e,t)=>{le.warn("Calling `sendIntent` is deprecated and will be removed in a future version of the SDK. Use `sendFlow` instead."),P(e,t)},sendWelcomeFlow:e=>{P(fe,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),P(fe,e)},sendChoice:(t,n,r)=>{let o=[...h.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=U(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:U(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],g({responses:o},s),w({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.intentId,choiceId:t}}})},submitFeedback:async(e,t)=>{const n=await I(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.userId,...t})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},currentConversationId:()=>h.conversationId,setLanguageCode:t=>{t!==h.languageCode?(c===e.Protocol.Websocket&&x(),E(),g({languageCode:t})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>h.languageCode,getVoiceCredentials:async(e,n)=>{const r=await I(`${d}-${h.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":h.conversationId,"nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(r.status>=400)throw new Error(`Responded with ${r.status}`);const o=await r.json();if(null==o?.url)throw new Error("Invalid response");return o},subscribe:e=>(T=[...T,e],e(ge(h)),()=>{S(e)}),unsubscribe:S,unsubscribeAll:()=>{T=[]},reset:t=>{g({conversationId:ae(),responses:!0===t?.clearResponses?[]:h.responses}),c===e.Protocol.Websocket&&x(),E()},destroy:()=>{T=[],c===e.Protocol.Websocket&&O(),A()},setRequestOverride:e=>{v=e},addEventListener:(e,t)=>{p[e]=[...p[e],t]},removeEventListener:(e,t)=>{p[e]=p[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{_({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=>{if(null!=e.host&&null!=e.deploymentKey&&null!=e.channelKey)return!0;return(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.sendVoicePlusStep=async({apiKey:e,workspaceId:t,conversationId:n,scriptId:r,languageCode:o,step:s,context:i,debug:a=!1,dev:c=!1})=>{if(null==r)throw new Error("Voice+ scriptId is not defined.");if("string"!=typeof n||0===n.length)throw new Error("Voice+ conversationId is not defined.");const[u,l]="string"==typeof s?[s,void 0]:[s.stepId,s.stepTriggerDescription];if(!we.test(u))throw new Error("Invalid stepId. It should be formatted as a UUID.");const d={stepId:u,context:i,conversationId:n,journeyId:r,languageCode:o,stepTriggerDescription:l};try{await I(`https://${c?"dev.":""}mm.nlx.ai/v1/track`,{method:"POST",headers:{"x-api-key":e,"x-nlx-id":t,"Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify(d)}),a&&le.info(`✓ step: ${u}`,d)}catch(e){throw a&&le.error(`× step: ${u}`,e,d),e}},e.shouldReinitialize=(e,t)=>!G(e,t),e.version=ue}));
|
|
15
|
+
***************************************************************************** */function J(e,t){function n(){this.constructor=e}V(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function z(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 J(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 J(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(z(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.4";const ue=ce,le=console;var de,pe;e.Protocol=void 0,(de=e.Protocol||(e.Protocol={})).Https="https",de.HttpsWithStreaming="httpsWithStreaming",de.Websocket="websocket",e.ResponseType=void 0,(pe=e.ResponseType||(e.ResponseType={})).Application="bot",pe.User="user",pe.Failure="failure";const he="NLX.Welcome",fe=e=>Array.isArray(e)?e:Object.entries(e).map((([e,t])=>({slotId:e,value:t}))),ye=e=>({...e,intentId:e.flowId??e.intentId,slots:null!=e.slots?fe(e.slots):e.slots}),me=e=>e.responses,ge=e=>{try{return JSON.parse(e)}catch(e){return null}},be=e=>e.match(/(bots\.dev\.studio\.nlx\.ai|bots\.studio\.nlx\.ai|apps\.nlx\.ai|dev\.apps\.nlx\.ai)/g)?.[0]??"apps.nlx.ai",ve=t=>{const n=t.applicationUrl??"",r=t.apiKey??t.headers?.["nlx-api-key"]??"",o=t.protocol??(_e(n)?e.Protocol.Websocket:!1===t.experimental?.streamHttp?e.Protocol.Https:e.Protocol.HttpsWithStreaming);if(null!=t.host&&null!=t.channelKey&&null!=t.deploymentKey)return{protocol:o,apiKey:r,host:t.host,channelKey:t.channelKey,deploymentKey:t.deploymentKey};if(_e(n)){const e=be(n),t=new URL(n),s=new URLSearchParams(t.search),i=s.get("channelKey"),a=s.get("deploymentKey");return null!=i&&null!=a?{protocol:o,channelKey:i,deploymentKey:a,host:e,apiKey:r}:null}const s=be(n),i=new URLPattern({pathname:"/c/:deploymentKey/:channelKey"}).exec(n);return null!=i?.pathname.groups.channelKey&&null!=i?.pathname.groups.deploymentKey?{protocol:o,channelKey:i.pathname.groups.channelKey,deploymentKey:i.pathname.groups.deploymentKey,host:s,apiKey:r}:null},_e=e=>0===e.indexOf("wss://"),we=async({fullApplicationUrl:e,apiKey:t,headers:n,body:r,stream:o,eventListeners:s})=>{if(o)return await(async r=>{const o=await I(e,{method:"POST",headers:{...n,"nlx-api-key":t,"Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({...r,stream:!0})});if(!o.ok||null==o.body)throw new Error(`HTTP Error: ${o.status}`);const i=o.body.getReader(),a=new TextDecoder;let c="";const u=[];let l={};for(;;){const{done:e,value:t}=await i.read();if(e)break;for(c+=a.decode(t,{stream:!0});;){const e=c.indexOf("{");if(-1===e)break;let t=!1;for(let n=0;n<c.length;n++)if("}"===c[n]){const r=c.substring(e,n+1);try{const e=JSON.parse(r);if("interim"===e.type){const t=e.text;"string"==typeof t&&s.interimMessage.forEach((e=>{e(t)}))}else"message"===e.type?u.push({text:e.text,choices:e.choices??[],messageId:e.messageId,metadata:e.metadata}):"final_response"===e.type&&(l=e.data);c=c.substring(n+1),t=!0;break}catch(e){}}if(!t)break}}return s.interimMessage.forEach((e=>{e(void 0)})),{...l,messages:[...u,...(l.messages??[]).map((e=>({text:e.text,choices:e.choices??[],messageId:e.messageId,metadata:e.metadata})))]}})(r);{const o=await I(e,{method:"POST",headers:{...n??{},"nlx-api-key":t,Accept:"application/json","Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify(r)});if(!o.ok||null==o.body)throw new Error(`HTTP Error: ${o.status}`);return await o.json()}};const Te=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;e.createConversation=function(t){let n,r,o=[],s=null,i=[],a=null;const c=ve(t),u=null!=c?(e=>`wss://us-east-1-ws.${e.host}?deploymentKey=${e.deploymentKey}&channelKey=${e.channelKey}&apiKey=${e.apiKey}`)(c):t.applicationUrl??"",l=null!=c?(e=>`https://${e.host}/c/${e.deploymentKey}/${e.channelKey}`)(c):t.applicationUrl??"";/[-|_][a-z]{2,}[-|_][A-Z]{2,}$/.test(l)&&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 d={voicePlusCommand:[],interimMessage:[]},p=t.conversationId??ae();let h={responses:t.responses??[],languageCode:t.languageCode,userId:t.userId,conversationId:p};const f=()=>`${l}${!0===t.experimental?.completeApplicationUrl?"":`-${h.languageCode}`}`,y=(e,t)=>{h={...h,...e},w.forEach((e=>{e(me(h),t)}))},m=()=>{const n={type:e.ResponseType.Failure,receivedAt:(new Date).getTime(),payload:{text:t.failureMessage??"We encountered an issue. Please try again soon."}};y({responses:[...h.responses,n]},n)},g=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??[]})))}};y({responses:[...h.responses,n]},n),t.metadata.hasPendingDataRequest&&(A({poll:!0}),setTimeout((()=>{_({request:{structured:{poll:!0}}})}),1500))}else le.warn("Invalid message structure, expected object with field 'messages'."),m()};let b;const v=e=>{1===r?.readyState?r.send(JSON.stringify(e)):i=[...i,e]},_=async r=>{if(null!=b)return void b(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};y({responses:[...h.responses,n]},n)}));const s={userId:h.userId,conversationId:h.conversationId,...r,languageCode:h.languageCode,channelType:t.experimental?.channelType,environment:t.environment};if(c?.protocol===e.Protocol.Websocket)1===n?.readyState?n.send(JSON.stringify(s)):o=[...o,s];else try{const n=await we({fullApplicationUrl:f(),apiKey:c?.apiKey??"",headers:t.headers??{},stream:c?.protocol===e.Protocol.HttpsWithStreaming,eventListeners:d,body:s});g(n)}catch(e){le.warn(e),m()}};let w=[];const T=()=>{E();const e=new URL(u);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",h.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${h.languageCode}`)),e.searchParams.set("conversationId",h.conversationId),n=new te(e.href),s=setInterval((()=>{(async()=>{1===n?.readyState&&null!=o[0]&&(await _(o[0]),o=o.slice(1))})()}),500),n.onmessage=function(e){"string"==typeof e?.data&&g(ge(e.data))}},x=()=>{if(O(),!0!==t.bidirectional)return;const e=new URL(u);!0!==t.experimental?.completeApplicationUrl&&(e.searchParams.set("languageCode",h.languageCode),e.searchParams.set("channelKey",`${e.searchParams.get("channelKey")??""}-${h.languageCode}`)),e.searchParams.set("conversationId",h.conversationId),e.searchParams.set("type","voice-plus"),null!=c?.apiKey&&e.searchParams.set("apiKey",c.apiKey),r=new te(e.href),a=setInterval((()=>{1===r?.readyState&&null!=i[0]&&(v(i[0]),i=i.slice(1))}),500),r.onmessage=e=>{if("string"==typeof e?.data){const t=ge(e.data);null!=t&&d.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)};c?.protocol===e.Protocol.Websocket&&T(),x();const A=(t,n)=>{const r={type:e.ResponseType.User,receivedAt:(new Date).getTime(),payload:{type:"structured",...ye(t),context:n}};y({responses:[...h.responses,r]},r)},C=(e,t)=>{A({intentId:e},t),_({context:t,request:{structured:{intentId:e}}})},P=e=>{w=w.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}};y({responses:[...h.responses,r]},r),_({context:n,request:{unstructured:{text:t}}})},sendContext:async e=>{const n=await I(`${f()}/context`,{method:"POST",headers:{...t.headers??{},"nlx-api-key":c?.apiKey??"",Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":h.conversationId,"nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.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()};y({responses:[...h.responses,t]},t)},sendStructured:(e,t)=>{A(e,t),_({context:t,request:{structured:ye(e)}})},sendSlots:(e,t)=>{A({slots:e},t),_({context:t,request:{structured:{slots:fe(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(he,e)},sendWelcomeIntent:e=>{le.warn("Calling `sendWelcomeIntent` is deprecated and will be removed in a future version of the SDK. Use `sendWelcomeFlow` instead."),C(he,e)},sendChoice:(t,n,r)=>{let o=[...h.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=U(i,(n=>n.type===e.ResponseType.Application?{...n,payload:{...n.payload,messages:U(a,(e=>({...e,selectedChoiceId:t})),n.payload.messages)}}:n),o)),o=[...o,s],y({responses:o},s),_({context:n,request:{structured:{nodeId:r?.nodeId,intentId:r?.flowId??r?.intentId,choiceId:t}}})},submitFeedback:async(e,t)=>{const n=await I(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.userId,...t})});if(n.status>=400)throw new Error(`Responded with ${n.status}`)},currentConversationId:()=>h.conversationId,setLanguageCode:t=>{t!==h.languageCode?(c?.protocol===e.Protocol.Websocket&&T(),x(),y({languageCode:t})):le.warn("Attempted to set language code to the one already active.")},currentLanguageCode:()=>h.languageCode,getVoiceCredentials:async(e,n)=>{const r=await I(`${l}-${h.languageCode}/requestToken`,{method:"POST",headers:{...t.headers??{},"nlx-api-key":c?.apiKey??"",Accept:"application/json","Content-Type":"application/json","nlx-conversation-id":h.conversationId,"nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify({languageCode:h.languageCode,conversationId:h.conversationId,userId:h.userId,requestToken:!0,context:e,autoTriggerWelcomeFlow:n?.autoTriggerWelcomeFlow??!0})});if(r.status>=400)throw new Error(`Responded with ${r.status}`);const o=await r.json();if(null==o?.url)throw new Error("Invalid response");return o},subscribe:e=>(w=[...w,e],e(me(h)),()=>{P(e)}),unsubscribe:P,unsubscribeAll:()=>{w=[]},reset:t=>{y({conversationId:ae(),responses:!0===t?.clearResponses?[]:h.responses}),c?.protocol===e.Protocol.Websocket&&T(),x()},destroy:()=>{w=[],c?.protocol===e.Protocol.Websocket&&E(),O()},setRequestOverride:e=>{b=e},addEventListener:(e,t)=>{d[e]=[...d[e],t]},removeEventListener:(e,t)=>{d[e]=d[e].filter((e=>e!==t))},sendVoicePlusContext:e=>{v({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=>null!=ve(e),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.sendVoicePlusStep=async({apiKey:e,workspaceId:t,conversationId:n,scriptId:r,languageCode:o,step:s,context:i,debug:a=!1,dev:c=!1})=>{if(null==r)throw new Error("Voice+ scriptId is not defined.");if("string"!=typeof n||0===n.length)throw new Error("Voice+ conversationId is not defined.");const[u,l]="string"==typeof s?[s,void 0]:[s.stepId,s.stepTriggerDescription];if(!Te.test(u))throw new Error("Invalid stepId. It should be formatted as a UUID.");const d={stepId:u,context:i,conversationId:n,journeyId:r,languageCode:o,stepTriggerDescription:l};try{await I(`https://${c?"dev.":""}mm.nlx.ai/v1/track`,{method:"POST",headers:{"x-api-key":e,"x-nlx-id":t,"Content-Type":"application/json","nlx-sdk-version":ce,"nlx-core-version":ce},body:JSON.stringify(d)}),a&&le.info(`✓ step: ${u}`,d)}catch(e){throw a&&le.error(`× step: ${u}`,e,d),e}},e.shouldReinitialize=(e,t)=>!G(e,t),e.version=ue}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nlxai/core",
|
|
3
|
-
"version": "1.2.4
|
|
3
|
+
"version": "1.2.4",
|
|
4
4
|
"description": "Low-level SDK for building NLX experiences",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.cjs",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "rm -rf lib && rollup -c --configPlugin typescript --configImportAttributesKey with",
|
|
19
|
-
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0",
|
|
19
|
+
"lint:check": "eslint src/ --ext .ts,.tsx,.js,.jsx --max-warnings 0 && markdown-link-check README.md",
|
|
20
20
|
"lint": "eslint src/ --ext .ts,.tsx,.js,.jsx --fix",
|
|
21
21
|
"prepublish": "npm run build",
|
|
22
22
|
"test": "typedoc --emit none",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"author": "Peter Szerzo <peter@nlx.ai>",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"devDependencies": {
|
|
31
|
+
"@boillodmanuel/markdown-link-check": "^4.7.0",
|
|
31
32
|
"@rollup/plugin-commonjs": "^25.0.7",
|
|
32
33
|
"@rollup/plugin-json": "^6.0.1",
|
|
33
34
|
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
@@ -56,5 +57,5 @@
|
|
|
56
57
|
"publishConfig": {
|
|
57
58
|
"access": "public"
|
|
58
59
|
},
|
|
59
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "bbfa1fad3f009a0f509903d6db4f51bec17b1f6c"
|
|
60
61
|
}
|