@depup/typesense 3.0.3-depup.0
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/LICENSE +201 -0
- package/README.md +31 -0
- package/changes.json +10 -0
- package/dist/typesense.js +13031 -0
- package/dist/typesense.js.map +1 -0
- package/dist/typesense.min.js +3 -0
- package/dist/typesense.min.js.LICENSE.txt +1 -0
- package/dist/typesense.min.js.map +1 -0
- package/lib/Typesense/Alias.d.ts +10 -0
- package/lib/Typesense/Alias.js +30 -0
- package/lib/Typesense/Alias.js.map +1 -0
- package/lib/Typesense/Aliases.d.ts +18 -0
- package/lib/Typesense/Aliases.js +36 -0
- package/lib/Typesense/Aliases.js.map +1 -0
- package/lib/Typesense/Analytics.d.ts +15 -0
- package/lib/Typesense/Analytics.js +40 -0
- package/lib/Typesense/Analytics.js.map +1 -0
- package/lib/Typesense/AnalyticsEvent.d.ts +5 -0
- package/lib/Typesense/AnalyticsEvent.js +3 -0
- package/lib/Typesense/AnalyticsEvent.js.map +1 -0
- package/lib/Typesense/AnalyticsEvents.d.ts +26 -0
- package/lib/Typesense/AnalyticsEvents.js +37 -0
- package/lib/Typesense/AnalyticsEvents.js.map +1 -0
- package/lib/Typesense/AnalyticsRule.d.ts +47 -0
- package/lib/Typesense/AnalyticsRule.js +30 -0
- package/lib/Typesense/AnalyticsRule.js.map +1 -0
- package/lib/Typesense/AnalyticsRuleV1.d.ts +35 -0
- package/lib/Typesense/AnalyticsRuleV1.js +30 -0
- package/lib/Typesense/AnalyticsRuleV1.js.map +1 -0
- package/lib/Typesense/AnalyticsRules.d.ts +16 -0
- package/lib/Typesense/AnalyticsRules.js +49 -0
- package/lib/Typesense/AnalyticsRules.js.map +1 -0
- package/lib/Typesense/AnalyticsRulesV1.d.ts +13 -0
- package/lib/Typesense/AnalyticsRulesV1.js +37 -0
- package/lib/Typesense/AnalyticsRulesV1.js.map +1 -0
- package/lib/Typesense/AnalyticsV1.d.ts +19 -0
- package/lib/Typesense/AnalyticsV1.js +49 -0
- package/lib/Typesense/AnalyticsV1.js.map +1 -0
- package/lib/Typesense/ApiCall.d.ts +99 -0
- package/lib/Typesense/ApiCall.js +777 -0
- package/lib/Typesense/ApiCall.js.map +1 -0
- package/lib/Typesense/Client.d.ts +79 -0
- package/lib/Typesense/Client.js +170 -0
- package/lib/Typesense/Client.js.map +1 -0
- package/lib/Typesense/Collection.d.ts +63 -0
- package/lib/Typesense/Collection.js +109 -0
- package/lib/Typesense/Collection.js.map +1 -0
- package/lib/Typesense/Collections.d.ts +42 -0
- package/lib/Typesense/Collections.js +34 -0
- package/lib/Typesense/Collections.js.map +1 -0
- package/lib/Typesense/Configuration.d.ts +143 -0
- package/lib/Typesense/Configuration.js +113 -0
- package/lib/Typesense/Configuration.js.map +1 -0
- package/lib/Typesense/Conversation.d.ts +22 -0
- package/lib/Typesense/Conversation.js +37 -0
- package/lib/Typesense/Conversation.js.map +1 -0
- package/lib/Typesense/ConversationModel.d.ts +30 -0
- package/lib/Typesense/ConversationModel.js +37 -0
- package/lib/Typesense/ConversationModel.js.map +1 -0
- package/lib/Typesense/ConversationModels.d.ts +10 -0
- package/lib/Typesense/ConversationModels.js +37 -0
- package/lib/Typesense/ConversationModels.js.map +1 -0
- package/lib/Typesense/Conversations.d.ts +17 -0
- package/lib/Typesense/Conversations.js +42 -0
- package/lib/Typesense/Conversations.js.map +1 -0
- package/lib/Typesense/CurationSet.d.ts +17 -0
- package/lib/Typesense/CurationSet.js +52 -0
- package/lib/Typesense/CurationSet.js.map +1 -0
- package/lib/Typesense/CurationSetItem.d.ts +15 -0
- package/lib/Typesense/CurationSetItem.js +38 -0
- package/lib/Typesense/CurationSetItem.js.map +1 -0
- package/lib/Typesense/CurationSetItems.d.ts +9 -0
- package/lib/Typesense/CurationSetItems.js +23 -0
- package/lib/Typesense/CurationSetItems.js.map +1 -0
- package/lib/Typesense/CurationSets.d.ts +56 -0
- package/lib/Typesense/CurationSets.js +19 -0
- package/lib/Typesense/CurationSets.js.map +1 -0
- package/lib/Typesense/Debug.d.ts +10 -0
- package/lib/Typesense/Debug.js +19 -0
- package/lib/Typesense/Debug.js.map +1 -0
- package/lib/Typesense/Document.d.ts +12 -0
- package/lib/Typesense/Document.js +41 -0
- package/lib/Typesense/Document.js.map +1 -0
- package/lib/Typesense/Documents.d.ts +196 -0
- package/lib/Typesense/Documents.js +204 -0
- package/lib/Typesense/Documents.js.map +1 -0
- package/lib/Typesense/Errors/HTTPError.d.ts +3 -0
- package/lib/Typesense/Errors/HTTPError.js +13 -0
- package/lib/Typesense/Errors/HTTPError.js.map +1 -0
- package/lib/Typesense/Errors/ImportError.d.ts +15 -0
- package/lib/Typesense/Errors/ImportError.js +16 -0
- package/lib/Typesense/Errors/ImportError.js.map +1 -0
- package/lib/Typesense/Errors/MissingConfigurationError.d.ts +3 -0
- package/lib/Typesense/Errors/MissingConfigurationError.js +13 -0
- package/lib/Typesense/Errors/MissingConfigurationError.js.map +1 -0
- package/lib/Typesense/Errors/ObjectAlreadyExists.d.ts +3 -0
- package/lib/Typesense/Errors/ObjectAlreadyExists.js +13 -0
- package/lib/Typesense/Errors/ObjectAlreadyExists.js.map +1 -0
- package/lib/Typesense/Errors/ObjectNotFound.d.ts +3 -0
- package/lib/Typesense/Errors/ObjectNotFound.js +13 -0
- package/lib/Typesense/Errors/ObjectNotFound.js.map +1 -0
- package/lib/Typesense/Errors/ObjectUnprocessable.d.ts +3 -0
- package/lib/Typesense/Errors/ObjectUnprocessable.js +13 -0
- package/lib/Typesense/Errors/ObjectUnprocessable.js.map +1 -0
- package/lib/Typesense/Errors/RequestMalformed.d.ts +3 -0
- package/lib/Typesense/Errors/RequestMalformed.js +13 -0
- package/lib/Typesense/Errors/RequestMalformed.js.map +1 -0
- package/lib/Typesense/Errors/RequestUnauthorized.d.ts +3 -0
- package/lib/Typesense/Errors/RequestUnauthorized.js +13 -0
- package/lib/Typesense/Errors/RequestUnauthorized.js.map +1 -0
- package/lib/Typesense/Errors/ServerError.d.ts +3 -0
- package/lib/Typesense/Errors/ServerError.js +13 -0
- package/lib/Typesense/Errors/ServerError.js.map +1 -0
- package/lib/Typesense/Errors/TypesenseError.d.ts +5 -0
- package/lib/Typesense/Errors/TypesenseError.js +19 -0
- package/lib/Typesense/Errors/TypesenseError.js.map +1 -0
- package/lib/Typesense/Errors/index.d.ts +11 -0
- package/lib/Typesense/Errors/index.js +25 -0
- package/lib/Typesense/Errors/index.js.map +1 -0
- package/lib/Typesense/Health.d.ts +9 -0
- package/lib/Typesense/Health.js +19 -0
- package/lib/Typesense/Health.js.map +1 -0
- package/lib/Typesense/Key.d.ts +33 -0
- package/lib/Typesense/Key.js +30 -0
- package/lib/Typesense/Key.js.map +1 -0
- package/lib/Typesense/Keys.d.ts +19 -0
- package/lib/Typesense/Keys.js +46 -0
- package/lib/Typesense/Keys.js.map +1 -0
- package/lib/Typesense/Metrics.d.ts +25 -0
- package/lib/Typesense/Metrics.js +19 -0
- package/lib/Typesense/Metrics.js.map +1 -0
- package/lib/Typesense/MultiSearch.d.ts +25 -0
- package/lib/Typesense/MultiSearch.js +63 -0
- package/lib/Typesense/MultiSearch.js.map +1 -0
- package/lib/Typesense/NLSearchModel.d.ts +16 -0
- package/lib/Typesense/NLSearchModel.js +37 -0
- package/lib/Typesense/NLSearchModel.js.map +1 -0
- package/lib/Typesense/NLSearchModels.d.ts +36 -0
- package/lib/Typesense/NLSearchModels.js +36 -0
- package/lib/Typesense/NLSearchModels.js.map +1 -0
- package/lib/Typesense/Operations.d.ts +12 -0
- package/lib/Typesense/Operations.js +27 -0
- package/lib/Typesense/Operations.js.map +1 -0
- package/lib/Typesense/Override.d.ts +17 -0
- package/lib/Typesense/Override.js +32 -0
- package/lib/Typesense/Override.js.map +1 -0
- package/lib/Typesense/Overrides.d.ts +43 -0
- package/lib/Typesense/Overrides.js +38 -0
- package/lib/Typesense/Overrides.js.map +1 -0
- package/lib/Typesense/Preset.d.ts +17 -0
- package/lib/Typesense/Preset.js +30 -0
- package/lib/Typesense/Preset.js.map +1 -0
- package/lib/Typesense/Presets.d.ts +18 -0
- package/lib/Typesense/Presets.js +49 -0
- package/lib/Typesense/Presets.js.map +1 -0
- package/lib/Typesense/RequestWithCache.d.ts +15 -0
- package/lib/Typesense/RequestWithCache.js +117 -0
- package/lib/Typesense/RequestWithCache.js.map +1 -0
- package/lib/Typesense/SearchClient.d.ts +13 -0
- package/lib/Typesense/SearchClient.js +45 -0
- package/lib/Typesense/SearchClient.js.map +1 -0
- package/lib/Typesense/SearchOnlyCollection.d.ts +11 -0
- package/lib/Typesense/SearchOnlyCollection.js +18 -0
- package/lib/Typesense/SearchOnlyCollection.js.map +1 -0
- package/lib/Typesense/SearchOnlyDocuments.d.ts +16 -0
- package/lib/Typesense/SearchOnlyDocuments.js +57 -0
- package/lib/Typesense/SearchOnlyDocuments.js.map +1 -0
- package/lib/Typesense/Stats.d.ts +24 -0
- package/lib/Typesense/Stats.js +19 -0
- package/lib/Typesense/Stats.js.map +1 -0
- package/lib/Typesense/Stemming.d.ts +12 -0
- package/lib/Typesense/Stemming.js +35 -0
- package/lib/Typesense/Stemming.js.map +1 -0
- package/lib/Typesense/StemmingDictionaries.d.ts +13 -0
- package/lib/Typesense/StemmingDictionaries.js +58 -0
- package/lib/Typesense/StemmingDictionaries.js.map +1 -0
- package/lib/Typesense/StemmingDictionary.d.ts +20 -0
- package/lib/Typesense/StemmingDictionary.js +30 -0
- package/lib/Typesense/StemmingDictionary.js.map +1 -0
- package/lib/Typesense/Stopword.d.ts +20 -0
- package/lib/Typesense/Stopword.js +30 -0
- package/lib/Typesense/Stopword.js.map +1 -0
- package/lib/Typesense/Stopwords.d.ts +17 -0
- package/lib/Typesense/Stopwords.js +36 -0
- package/lib/Typesense/Stopwords.js.map +1 -0
- package/lib/Typesense/Synonym.d.ts +21 -0
- package/lib/Typesense/Synonym.js +41 -0
- package/lib/Typesense/Synonym.js.map +1 -0
- package/lib/Typesense/SynonymSet.d.ts +21 -0
- package/lib/Typesense/SynonymSet.js +52 -0
- package/lib/Typesense/SynonymSet.js.map +1 -0
- package/lib/Typesense/SynonymSetItem.d.ts +14 -0
- package/lib/Typesense/SynonymSetItem.js +31 -0
- package/lib/Typesense/SynonymSetItem.js.map +1 -0
- package/lib/Typesense/SynonymSetItems.d.ts +10 -0
- package/lib/Typesense/SynonymSetItems.js +30 -0
- package/lib/Typesense/SynonymSetItems.js.map +1 -0
- package/lib/Typesense/SynonymSets.d.ts +23 -0
- package/lib/Typesense/SynonymSets.js +19 -0
- package/lib/Typesense/SynonymSets.js.map +1 -0
- package/lib/Typesense/Synonyms.d.ts +24 -0
- package/lib/Typesense/Synonyms.js +47 -0
- package/lib/Typesense/Synonyms.js.map +1 -0
- package/lib/Typesense/Types.d.ts +201 -0
- package/lib/Typesense/Types.js +22 -0
- package/lib/Typesense/Types.js.map +1 -0
- package/lib/Typesense/Utils.d.ts +11 -0
- package/lib/Typesense/Utils.js +50 -0
- package/lib/Typesense/Utils.js.map +1 -0
- package/lib/Typesense.d.ts +46 -0
- package/lib/Typesense.js +12 -0
- package/lib/Typesense.js.map +1 -0
- package/package.json +141 -0
- package/src/Typesense/Alias.ts +18 -0
- package/src/Typesense/Aliases.ts +41 -0
- package/src/Typesense/Analytics.ts +39 -0
- package/src/Typesense/AnalyticsEvent.ts +5 -0
- package/src/Typesense/AnalyticsEvents.ts +53 -0
- package/src/Typesense/AnalyticsRule.ts +63 -0
- package/src/Typesense/AnalyticsRuleV1.ts +52 -0
- package/src/Typesense/AnalyticsRules.ts +67 -0
- package/src/Typesense/AnalyticsRulesV1.ts +43 -0
- package/src/Typesense/AnalyticsV1.ts +52 -0
- package/src/Typesense/ApiCall.ts +1103 -0
- package/src/Typesense/Client.ts +225 -0
- package/src/Typesense/Collection.ts +179 -0
- package/src/Typesense/Collections.ts +68 -0
- package/src/Typesense/Configuration.ts +328 -0
- package/src/Typesense/Conversation.ts +45 -0
- package/src/Typesense/ConversationModel.ts +55 -0
- package/src/Typesense/ConversationModels.ts +38 -0
- package/src/Typesense/Conversations.ts +47 -0
- package/src/Typesense/CurationSet.ts +56 -0
- package/src/Typesense/CurationSetItem.ts +35 -0
- package/src/Typesense/CurationSetItems.ts +18 -0
- package/src/Typesense/CurationSets.ts +60 -0
- package/src/Typesense/Debug.ts +16 -0
- package/src/Typesense/Document.ts +34 -0
- package/src/Typesense/Documents.ts +445 -0
- package/src/Typesense/Errors/HTTPError.ts +3 -0
- package/src/Typesense/Errors/ImportError.ts +24 -0
- package/src/Typesense/Errors/MissingConfigurationError.ts +3 -0
- package/src/Typesense/Errors/ObjectAlreadyExists.ts +3 -0
- package/src/Typesense/Errors/ObjectNotFound.ts +3 -0
- package/src/Typesense/Errors/ObjectUnprocessable.ts +3 -0
- package/src/Typesense/Errors/RequestMalformed.ts +3 -0
- package/src/Typesense/Errors/RequestUnauthorized.ts +3 -0
- package/src/Typesense/Errors/ServerError.ts +3 -0
- package/src/Typesense/Errors/TypesenseError.ts +13 -0
- package/src/Typesense/Errors/index.ts +23 -0
- package/src/Typesense/Health.ts +15 -0
- package/src/Typesense/Key.ts +73 -0
- package/src/Typesense/Keys.ts +59 -0
- package/src/Typesense/Metrics.ts +31 -0
- package/src/Typesense/MultiSearch.ts +144 -0
- package/src/Typesense/NLSearchModel.ts +35 -0
- package/src/Typesense/NLSearchModels.ts +61 -0
- package/src/Typesense/Operations.ts +35 -0
- package/src/Typesense/Override.ts +31 -0
- package/src/Typesense/Overrides.ts +73 -0
- package/src/Typesense/Preset.ts +31 -0
- package/src/Typesense/Presets.ts +62 -0
- package/src/Typesense/RequestWithCache.ts +209 -0
- package/src/Typesense/SearchClient.ts +64 -0
- package/src/Typesense/SearchOnlyCollection.ts +24 -0
- package/src/Typesense/SearchOnlyDocuments.ts +87 -0
- package/src/Typesense/Stats.ts +31 -0
- package/src/Typesense/Stemming.ts +38 -0
- package/src/Typesense/StemmingDictionaries.ts +59 -0
- package/src/Typesense/StemmingDictionary.ts +37 -0
- package/src/Typesense/Stopword.ts +31 -0
- package/src/Typesense/Stopwords.ts +41 -0
- package/src/Typesense/Synonym.ts +42 -0
- package/src/Typesense/SynonymSet.ts +57 -0
- package/src/Typesense/SynonymSetItem.ts +28 -0
- package/src/Typesense/SynonymSetItems.ts +31 -0
- package/src/Typesense/SynonymSets.ts +30 -0
- package/src/Typesense/Synonyms.ts +55 -0
- package/src/Typesense/Types.ts +355 -0
- package/src/Typesense/Utils.ts +80 -0
- package/src/Typesense.ts +43 -0
|
@@ -0,0 +1,777 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var tslib_1 = require("tslib");
|
|
4
|
+
var axios_1 = tslib_1.__importDefault(require("axios"));
|
|
5
|
+
var http_1 = require("http");
|
|
6
|
+
var https_1 = require("https");
|
|
7
|
+
var Errors_1 = require("./Errors");
|
|
8
|
+
var TypesenseError_1 = tslib_1.__importDefault(require("./Errors/TypesenseError"));
|
|
9
|
+
var Utils_1 = require("./Utils");
|
|
10
|
+
var APIKEYHEADERNAME = "X-TYPESENSE-API-KEY";
|
|
11
|
+
var HEALTHY = true;
|
|
12
|
+
var UNHEALTHY = false;
|
|
13
|
+
var isNodeJSEnvironment = typeof process !== "undefined" &&
|
|
14
|
+
process.versions != null &&
|
|
15
|
+
process.versions.node != null &&
|
|
16
|
+
typeof window === "undefined";
|
|
17
|
+
var ApiCall = /** @class */ (function () {
|
|
18
|
+
function ApiCall(configuration) {
|
|
19
|
+
this.configuration = configuration;
|
|
20
|
+
this.apiKey = this.configuration.apiKey;
|
|
21
|
+
this.nodes =
|
|
22
|
+
this.configuration.nodes == null
|
|
23
|
+
? this.configuration.nodes
|
|
24
|
+
: JSON.parse(JSON.stringify(this.configuration.nodes)); // Make a copy, since we'll be adding additional metadata to the nodes
|
|
25
|
+
this.nearestNode =
|
|
26
|
+
this.configuration.nearestNode == null
|
|
27
|
+
? this.configuration.nearestNode
|
|
28
|
+
: JSON.parse(JSON.stringify(this.configuration.nearestNode));
|
|
29
|
+
this.connectionTimeoutSeconds = this.configuration.connectionTimeoutSeconds;
|
|
30
|
+
this.healthcheckIntervalSeconds =
|
|
31
|
+
this.configuration.healthcheckIntervalSeconds;
|
|
32
|
+
this.numRetriesPerRequest = this.configuration.numRetries;
|
|
33
|
+
this.retryIntervalSeconds = this.configuration.retryIntervalSeconds;
|
|
34
|
+
this.sendApiKeyAsQueryParam = this.configuration.sendApiKeyAsQueryParam;
|
|
35
|
+
this.additionalUserHeaders = this.configuration.additionalHeaders;
|
|
36
|
+
this.logger = this.configuration.logger;
|
|
37
|
+
this.initializeMetadataForNodes();
|
|
38
|
+
this.currentNodeIndex = -1;
|
|
39
|
+
}
|
|
40
|
+
ApiCall.prototype.get = function (endpoint_1) {
|
|
41
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (endpoint, queryParameters, _a) {
|
|
42
|
+
if (queryParameters === void 0) { queryParameters = {}; }
|
|
43
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.abortSignal, abortSignal = _c === void 0 ? null : _c, _d = _b.responseType, responseType = _d === void 0 ? undefined : _d, _e = _b.streamConfig, streamConfig = _e === void 0 ? undefined : _e, isStreamingRequest = _b.isStreamingRequest;
|
|
44
|
+
return tslib_1.__generator(this, function (_f) {
|
|
45
|
+
return [2 /*return*/, this.performRequest("get", endpoint, {
|
|
46
|
+
queryParameters: queryParameters,
|
|
47
|
+
abortSignal: abortSignal,
|
|
48
|
+
responseType: responseType,
|
|
49
|
+
streamConfig: streamConfig,
|
|
50
|
+
isStreamingRequest: isStreamingRequest,
|
|
51
|
+
})];
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
ApiCall.prototype.delete = function (endpoint_1) {
|
|
56
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (endpoint, queryParameters) {
|
|
57
|
+
if (queryParameters === void 0) { queryParameters = {}; }
|
|
58
|
+
return tslib_1.__generator(this, function (_a) {
|
|
59
|
+
return [2 /*return*/, this.performRequest("delete", endpoint, {
|
|
60
|
+
queryParameters: queryParameters,
|
|
61
|
+
isStreamingRequest: false,
|
|
62
|
+
})];
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
ApiCall.prototype.post = function (endpoint_1) {
|
|
67
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (endpoint, bodyParameters, queryParameters, additionalHeaders, _a) {
|
|
68
|
+
if (bodyParameters === void 0) { bodyParameters = {}; }
|
|
69
|
+
if (queryParameters === void 0) { queryParameters = {}; }
|
|
70
|
+
if (additionalHeaders === void 0) { additionalHeaders = {}; }
|
|
71
|
+
var _b = _a === void 0 ? {} : _a, _c = _b.abortSignal, abortSignal = _c === void 0 ? null : _c, _d = _b.responseType, responseType = _d === void 0 ? undefined : _d, _e = _b.streamConfig, streamConfig = _e === void 0 ? undefined : _e, isStreamingRequest = _b.isStreamingRequest;
|
|
72
|
+
return tslib_1.__generator(this, function (_f) {
|
|
73
|
+
return [2 /*return*/, this.performRequest("post", endpoint, {
|
|
74
|
+
queryParameters: queryParameters,
|
|
75
|
+
bodyParameters: bodyParameters,
|
|
76
|
+
additionalHeaders: additionalHeaders,
|
|
77
|
+
abortSignal: abortSignal,
|
|
78
|
+
responseType: responseType,
|
|
79
|
+
streamConfig: streamConfig,
|
|
80
|
+
isStreamingRequest: isStreamingRequest,
|
|
81
|
+
})];
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
ApiCall.prototype.put = function (endpoint_1) {
|
|
86
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (endpoint, bodyParameters, queryParameters) {
|
|
87
|
+
if (bodyParameters === void 0) { bodyParameters = {}; }
|
|
88
|
+
if (queryParameters === void 0) { queryParameters = {}; }
|
|
89
|
+
return tslib_1.__generator(this, function (_a) {
|
|
90
|
+
return [2 /*return*/, this.performRequest("put", endpoint, {
|
|
91
|
+
queryParameters: queryParameters,
|
|
92
|
+
bodyParameters: bodyParameters,
|
|
93
|
+
isStreamingRequest: false,
|
|
94
|
+
})];
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
ApiCall.prototype.patch = function (endpoint_1) {
|
|
99
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (endpoint, bodyParameters, queryParameters) {
|
|
100
|
+
if (bodyParameters === void 0) { bodyParameters = {}; }
|
|
101
|
+
if (queryParameters === void 0) { queryParameters = {}; }
|
|
102
|
+
return tslib_1.__generator(this, function (_a) {
|
|
103
|
+
return [2 /*return*/, this.performRequest("patch", endpoint, {
|
|
104
|
+
queryParameters: queryParameters,
|
|
105
|
+
bodyParameters: bodyParameters,
|
|
106
|
+
isStreamingRequest: false,
|
|
107
|
+
})];
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
ApiCall.prototype.getAdapter = function () {
|
|
112
|
+
if (!this.configuration.axiosAdapter)
|
|
113
|
+
return undefined;
|
|
114
|
+
if (typeof this.configuration.axiosAdapter === "function")
|
|
115
|
+
return this.configuration.axiosAdapter;
|
|
116
|
+
var isCloudflareWorkers = typeof navigator !== "undefined" &&
|
|
117
|
+
navigator.userAgent === "Cloudflare-Workers";
|
|
118
|
+
return isCloudflareWorkers
|
|
119
|
+
? axios_1.default.getAdapter(this.configuration.axiosAdapter).bind(globalThis)
|
|
120
|
+
: axios_1.default.getAdapter(this.configuration.axiosAdapter);
|
|
121
|
+
};
|
|
122
|
+
ApiCall.prototype.performRequest = function (requestType_1, endpoint_1, _a) {
|
|
123
|
+
return tslib_1.__awaiter(this, arguments, void 0, function (requestType, endpoint, _b) {
|
|
124
|
+
var requestNumber, lastException, wasAborted, _loop_1, this_1, numTries, state_1;
|
|
125
|
+
var _c, _d, _e, _f;
|
|
126
|
+
var _g = _b.queryParameters, queryParameters = _g === void 0 ? null : _g, _h = _b.bodyParameters, bodyParameters = _h === void 0 ? null : _h, _j = _b.additionalHeaders, additionalHeaders = _j === void 0 ? {} : _j, _k = _b.abortSignal, abortSignal = _k === void 0 ? null : _k, _l = _b.responseType, responseType = _l === void 0 ? undefined : _l, _m = _b.skipConnectionTimeout, skipConnectionTimeout = _m === void 0 ? false : _m, _o = _b.enableKeepAlive, enableKeepAlive = _o === void 0 ? undefined : _o, _p = _b.streamConfig, streamConfig = _p === void 0 ? undefined : _p, isStreamingRequest = _b.isStreamingRequest;
|
|
127
|
+
return tslib_1.__generator(this, function (_q) {
|
|
128
|
+
switch (_q.label) {
|
|
129
|
+
case 0:
|
|
130
|
+
this.configuration.validate();
|
|
131
|
+
if (isStreamingRequest) {
|
|
132
|
+
this.logger.debug("Request: Performing streaming request to ".concat(endpoint));
|
|
133
|
+
// For browser streaming, always use responseType: "stream" and adapter: "fetch"
|
|
134
|
+
if (!isNodeJSEnvironment && typeof fetch !== "undefined") {
|
|
135
|
+
this.logger.debug("Using fetch adapter for browser streaming");
|
|
136
|
+
responseType = "stream";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
requestNumber = Date.now();
|
|
140
|
+
wasAborted = false;
|
|
141
|
+
this.logger.debug("Request #".concat(requestNumber, ": Performing ").concat(requestType.toUpperCase(), " request: ").concat(endpoint));
|
|
142
|
+
_loop_1 = function (numTries) {
|
|
143
|
+
var node, abortListener, requestOptions, cancelToken, source_1, response, error_1;
|
|
144
|
+
return tslib_1.__generator(this, function (_r) {
|
|
145
|
+
switch (_r.label) {
|
|
146
|
+
case 0:
|
|
147
|
+
node = this_1.getNextNode(requestNumber);
|
|
148
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Attempting ").concat(requestType.toUpperCase(), " request Try #").concat(numTries, " to Node ").concat(node.index));
|
|
149
|
+
if (abortSignal && abortSignal.aborted) {
|
|
150
|
+
return [2 /*return*/, { value: Promise.reject(new Error("Request aborted by caller.")) }];
|
|
151
|
+
}
|
|
152
|
+
abortListener = void 0;
|
|
153
|
+
_r.label = 1;
|
|
154
|
+
case 1:
|
|
155
|
+
_r.trys.push([1, 3, 5, 6]);
|
|
156
|
+
requestOptions = {
|
|
157
|
+
method: requestType,
|
|
158
|
+
url: this_1.uriFor(endpoint, node),
|
|
159
|
+
headers: Object.assign({}, this_1.defaultHeaders(), additionalHeaders, this_1.additionalUserHeaders),
|
|
160
|
+
maxContentLength: Infinity,
|
|
161
|
+
maxBodyLength: Infinity,
|
|
162
|
+
validateStatus: function (status) {
|
|
163
|
+
/* Override default validateStatus, which only considers 2xx a success.
|
|
164
|
+
In our case, if the server returns any HTTP code, we will handle it below.
|
|
165
|
+
We do this to be able to raise custom errors based on response code.
|
|
166
|
+
*/
|
|
167
|
+
return status > 0;
|
|
168
|
+
},
|
|
169
|
+
transformResponse: [
|
|
170
|
+
function (data, headers) {
|
|
171
|
+
var transformedData = data;
|
|
172
|
+
if (headers !== undefined &&
|
|
173
|
+
typeof data === "string" &&
|
|
174
|
+
headers["content-type"] &&
|
|
175
|
+
headers["content-type"].startsWith("application/json")) {
|
|
176
|
+
transformedData = JSON.parse(data);
|
|
177
|
+
}
|
|
178
|
+
return transformedData;
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
};
|
|
182
|
+
// Use fetch adapter only for streaming requests in browser environments
|
|
183
|
+
requestOptions.adapter =
|
|
184
|
+
isStreamingRequest && !isNodeJSEnvironment
|
|
185
|
+
? "fetch"
|
|
186
|
+
: this_1.getAdapter();
|
|
187
|
+
if (skipConnectionTimeout !== true) {
|
|
188
|
+
requestOptions.timeout = this_1.connectionTimeoutSeconds * 1000;
|
|
189
|
+
}
|
|
190
|
+
if (queryParameters && Object.keys(queryParameters).length !== 0) {
|
|
191
|
+
requestOptions.params = queryParameters;
|
|
192
|
+
}
|
|
193
|
+
if (this_1.sendApiKeyAsQueryParam) {
|
|
194
|
+
requestOptions.params = requestOptions.params || {};
|
|
195
|
+
requestOptions.params["x-typesense-api-key"] = this_1.apiKey;
|
|
196
|
+
}
|
|
197
|
+
if (this_1.configuration.httpAgent) {
|
|
198
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Using custom httpAgent"));
|
|
199
|
+
requestOptions.httpAgent = this_1.configuration.httpAgent;
|
|
200
|
+
}
|
|
201
|
+
else if (enableKeepAlive === true) {
|
|
202
|
+
if (!isNodeJSEnvironment) {
|
|
203
|
+
this_1.logger.warn("Request #".concat(requestNumber, ": Cannot use custom httpAgent in a browser environment to enable keepAlive"));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Enabling KeepAlive"));
|
|
207
|
+
requestOptions.httpAgent = new http_1.Agent({ keepAlive: true });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (this_1.configuration.httpsAgent) {
|
|
211
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Using custom httpsAgent"));
|
|
212
|
+
requestOptions.httpsAgent = this_1.configuration.httpsAgent;
|
|
213
|
+
}
|
|
214
|
+
else if (enableKeepAlive === true) {
|
|
215
|
+
if (!isNodeJSEnvironment) {
|
|
216
|
+
this_1.logger.warn("Request #".concat(requestNumber, ": Cannot use custom httpAgent in a browser environment to enable keepAlive"));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Enabling keepAlive"));
|
|
220
|
+
requestOptions.httpsAgent = new https_1.Agent({ keepAlive: true });
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (this_1.configuration.paramsSerializer) {
|
|
224
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Using custom paramsSerializer"));
|
|
225
|
+
requestOptions.paramsSerializer = this_1.configuration.paramsSerializer;
|
|
226
|
+
}
|
|
227
|
+
if (bodyParameters &&
|
|
228
|
+
((typeof bodyParameters === "string" &&
|
|
229
|
+
bodyParameters.length !== 0) ||
|
|
230
|
+
(typeof bodyParameters === "object" &&
|
|
231
|
+
Object.keys(bodyParameters).length !== 0))) {
|
|
232
|
+
requestOptions.data = bodyParameters;
|
|
233
|
+
}
|
|
234
|
+
// Translate from user-provided AbortController to the Axios request cancel mechanism.
|
|
235
|
+
if (abortSignal) {
|
|
236
|
+
cancelToken = axios_1.default.CancelToken;
|
|
237
|
+
source_1 = cancelToken.source();
|
|
238
|
+
abortListener = function () {
|
|
239
|
+
wasAborted = true;
|
|
240
|
+
source_1.cancel();
|
|
241
|
+
};
|
|
242
|
+
abortSignal.addEventListener("abort", abortListener);
|
|
243
|
+
requestOptions.cancelToken = source_1.token;
|
|
244
|
+
}
|
|
245
|
+
if (isStreamingRequest) {
|
|
246
|
+
requestOptions.responseType = "stream";
|
|
247
|
+
if (!isNodeJSEnvironment) {
|
|
248
|
+
requestOptions.headers = tslib_1.__assign(tslib_1.__assign({}, requestOptions.headers), { Accept: "text/event-stream" });
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else if (responseType) {
|
|
252
|
+
requestOptions.responseType = responseType;
|
|
253
|
+
}
|
|
254
|
+
return [4 /*yield*/, (0, axios_1.default)(requestOptions)];
|
|
255
|
+
case 2:
|
|
256
|
+
response = _r.sent();
|
|
257
|
+
if (response.status >= 1 && response.status <= 499) {
|
|
258
|
+
// Treat any status code > 0 and < 500 to be an indication that node is healthy
|
|
259
|
+
// We exclude 0 since some clients return 0 when request fails
|
|
260
|
+
this_1.setNodeHealthcheck(node, HEALTHY);
|
|
261
|
+
}
|
|
262
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": Request to Node ").concat(node.index, " was made. Response Code was ").concat(response.status, "."));
|
|
263
|
+
if (response.status >= 200 && response.status < 300) {
|
|
264
|
+
if (isStreamingRequest) {
|
|
265
|
+
return [2 /*return*/, { value: this_1.handleStreamingResponse(response, streamConfig) }];
|
|
266
|
+
}
|
|
267
|
+
return [2 /*return*/, { value: Promise.resolve(response.data) }];
|
|
268
|
+
}
|
|
269
|
+
else if (response.status < 500) {
|
|
270
|
+
return [2 /*return*/, { value: Promise.reject(this_1.customErrorForResponse(response, (_c = response.data) === null || _c === void 0 ? void 0 : _c.message, requestOptions.data)) }];
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
// Retry all other HTTP errors (HTTPStatus > 500)
|
|
274
|
+
// This will get caught by the catch block below
|
|
275
|
+
throw this_1.customErrorForResponse(response, (_d = response.data) === null || _d === void 0 ? void 0 : _d.message, requestOptions.data);
|
|
276
|
+
}
|
|
277
|
+
return [3 /*break*/, 6];
|
|
278
|
+
case 3:
|
|
279
|
+
error_1 = _r.sent();
|
|
280
|
+
// This block handles retries for HTTPStatus > 500 and network layer issues like connection timeouts
|
|
281
|
+
if (!wasAborted) {
|
|
282
|
+
this_1.setNodeHealthcheck(node, UNHEALTHY);
|
|
283
|
+
}
|
|
284
|
+
lastException = error_1;
|
|
285
|
+
this_1.logger.warn("Request #".concat(requestNumber, ": Request to Node ").concat(node.index, " failed due to \"").concat((_e = error_1 === null || error_1 === void 0 ? void 0 : error_1.code) !== null && _e !== void 0 ? _e : "", " ").concat(error_1.message).concat(error_1.response == null
|
|
286
|
+
? ""
|
|
287
|
+
: " - " + JSON.stringify((_f = error_1.response) === null || _f === void 0 ? void 0 : _f.data), "\""));
|
|
288
|
+
if (wasAborted) {
|
|
289
|
+
return [2 /*return*/, { value: Promise.reject(new Error("Request aborted by caller.")) }];
|
|
290
|
+
}
|
|
291
|
+
if (isStreamingRequest) {
|
|
292
|
+
this_1.invokeOnErrorCallback(error_1, streamConfig);
|
|
293
|
+
}
|
|
294
|
+
if (numTries < this_1.numRetriesPerRequest + 1) {
|
|
295
|
+
this_1.logger.warn("Request #".concat(requestNumber, ": Sleeping for ").concat(this_1.retryIntervalSeconds, "s and then retrying request..."));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
this_1.logger.debug("Request #".concat(requestNumber, ": No retries left. Raising last error"));
|
|
299
|
+
return [2 /*return*/, { value: Promise.reject(lastException) }];
|
|
300
|
+
}
|
|
301
|
+
return [4 /*yield*/, this_1.timer(this_1.retryIntervalSeconds)];
|
|
302
|
+
case 4:
|
|
303
|
+
_r.sent();
|
|
304
|
+
return [3 /*break*/, 6];
|
|
305
|
+
case 5:
|
|
306
|
+
if (abortSignal && abortListener) {
|
|
307
|
+
abortSignal.removeEventListener("abort", abortListener);
|
|
308
|
+
}
|
|
309
|
+
return [7 /*endfinally*/];
|
|
310
|
+
case 6: return [2 /*return*/];
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
this_1 = this;
|
|
315
|
+
numTries = 1;
|
|
316
|
+
_q.label = 1;
|
|
317
|
+
case 1:
|
|
318
|
+
if (!(numTries <= this.numRetriesPerRequest + 1)) return [3 /*break*/, 4];
|
|
319
|
+
return [5 /*yield**/, _loop_1(numTries)];
|
|
320
|
+
case 2:
|
|
321
|
+
state_1 = _q.sent();
|
|
322
|
+
if (typeof state_1 === "object")
|
|
323
|
+
return [2 /*return*/, state_1.value];
|
|
324
|
+
_q.label = 3;
|
|
325
|
+
case 3:
|
|
326
|
+
numTries++;
|
|
327
|
+
return [3 /*break*/, 1];
|
|
328
|
+
case 4:
|
|
329
|
+
this.logger.debug("Request #".concat(requestNumber, ": No retries left. Raising last error"));
|
|
330
|
+
return [2 /*return*/, Promise.reject(lastException)];
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
};
|
|
335
|
+
ApiCall.prototype.processStreamingLine = function (line) {
|
|
336
|
+
if (!line.trim() || line === "data: [DONE]") {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
// Handle SSE format (data: {...})
|
|
340
|
+
if (line.startsWith("data: ")) {
|
|
341
|
+
return this.processDataLine(line.slice(6).trim());
|
|
342
|
+
}
|
|
343
|
+
// Try parsing as JSON if it starts with a brace
|
|
344
|
+
if (line.trim().startsWith("{")) {
|
|
345
|
+
try {
|
|
346
|
+
var jsonData = JSON.parse(line.trim());
|
|
347
|
+
if (jsonData && typeof jsonData === "object") {
|
|
348
|
+
if (!jsonData.conversation_id) {
|
|
349
|
+
jsonData.conversation_id = "unknown";
|
|
350
|
+
}
|
|
351
|
+
if (!jsonData.message && jsonData.message !== "") {
|
|
352
|
+
jsonData.message = "";
|
|
353
|
+
}
|
|
354
|
+
return jsonData;
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
conversation_id: "unknown",
|
|
358
|
+
message: JSON.stringify(jsonData),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
catch (_a) {
|
|
362
|
+
return {
|
|
363
|
+
conversation_id: "unknown",
|
|
364
|
+
message: line.trim(),
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
conversation_id: "unknown",
|
|
370
|
+
message: line.trim(),
|
|
371
|
+
};
|
|
372
|
+
};
|
|
373
|
+
ApiCall.prototype.processDataLine = function (dataContent) {
|
|
374
|
+
if (!dataContent) {
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
if (dataContent.startsWith("{")) {
|
|
378
|
+
try {
|
|
379
|
+
var jsonData = JSON.parse(dataContent);
|
|
380
|
+
// Ensure the required fields exist
|
|
381
|
+
if (jsonData && typeof jsonData === "object") {
|
|
382
|
+
if (!jsonData.conversation_id) {
|
|
383
|
+
jsonData.conversation_id = "unknown";
|
|
384
|
+
}
|
|
385
|
+
if (!jsonData.message && jsonData.message !== "") {
|
|
386
|
+
jsonData.message = "";
|
|
387
|
+
}
|
|
388
|
+
return jsonData;
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
conversation_id: "unknown",
|
|
392
|
+
message: JSON.stringify(jsonData),
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
catch (_a) {
|
|
396
|
+
// Not valid JSON, use as plain text
|
|
397
|
+
return {
|
|
398
|
+
conversation_id: "unknown",
|
|
399
|
+
message: dataContent,
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// For plain text
|
|
404
|
+
return {
|
|
405
|
+
conversation_id: "unknown",
|
|
406
|
+
message: dataContent,
|
|
407
|
+
};
|
|
408
|
+
};
|
|
409
|
+
ApiCall.prototype.handleStreamingResponse = function (response, streamConfig) {
|
|
410
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
411
|
+
return tslib_1.__generator(this, function (_a) {
|
|
412
|
+
this.logger.debug("Handling streaming response. Environment: ".concat(isNodeJSEnvironment ? "Node.js" : "Browser"));
|
|
413
|
+
if (isNodeJSEnvironment && response.data) {
|
|
414
|
+
return [2 /*return*/, this.handleNodeStreaming(response, streamConfig)];
|
|
415
|
+
}
|
|
416
|
+
if (!isNodeJSEnvironment) {
|
|
417
|
+
return [2 /*return*/, this.handleBrowserStreaming(response, streamConfig)];
|
|
418
|
+
}
|
|
419
|
+
this.logger.debug("Processing non-streaming response");
|
|
420
|
+
this.invokeOnCompleteCallback(response.data, streamConfig);
|
|
421
|
+
return [2 /*return*/, Promise.resolve(response.data)];
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
};
|
|
425
|
+
ApiCall.prototype.handleNodeStreaming = function (response, streamConfig) {
|
|
426
|
+
var _this = this;
|
|
427
|
+
this.logger.debug("Processing Node.js stream");
|
|
428
|
+
return new Promise(function (resolve, reject) {
|
|
429
|
+
var stream = response.data;
|
|
430
|
+
var allChunks = [];
|
|
431
|
+
var buffer = "";
|
|
432
|
+
stream.on("data", function (chunk) {
|
|
433
|
+
var _a;
|
|
434
|
+
try {
|
|
435
|
+
var data = chunk.toString();
|
|
436
|
+
buffer += data;
|
|
437
|
+
var lines = buffer.split("\n");
|
|
438
|
+
buffer = (_a = lines.pop()) !== null && _a !== void 0 ? _a : "";
|
|
439
|
+
_this.processStreamLines(lines, allChunks, streamConfig);
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
reject(error);
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
stream.on("end", function () {
|
|
446
|
+
if (buffer.trim().length > 0) {
|
|
447
|
+
var lines = buffer.split("\n");
|
|
448
|
+
_this.processStreamLines(lines, allChunks, streamConfig);
|
|
449
|
+
}
|
|
450
|
+
_this.finalizeStreamResult(allChunks, resolve, response, streamConfig);
|
|
451
|
+
});
|
|
452
|
+
stream.on("error", function (error) {
|
|
453
|
+
_this.logger.error("Stream error: ".concat(error));
|
|
454
|
+
_this.invokeOnErrorCallback(error, streamConfig);
|
|
455
|
+
reject(error);
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
};
|
|
459
|
+
ApiCall.prototype.handleBrowserStreaming = function (response, streamConfig) {
|
|
460
|
+
var _this = this;
|
|
461
|
+
this.logger.debug("Processing browser stream");
|
|
462
|
+
return new Promise(function (resolve, reject) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
463
|
+
return tslib_1.__generator(this, function (_a) {
|
|
464
|
+
try {
|
|
465
|
+
if (response.data && typeof response.data.getReader === "function") {
|
|
466
|
+
return [2 /*return*/, this.handleBrowserReadableStream(response.data, resolve, reject, response, streamConfig)];
|
|
467
|
+
}
|
|
468
|
+
if (typeof response.data === "string") {
|
|
469
|
+
return [2 /*return*/, this.handleBrowserStringResponse(response.data, resolve, response, streamConfig)];
|
|
470
|
+
}
|
|
471
|
+
if (typeof response.data === "object" && response.data !== null) {
|
|
472
|
+
this.logger.debug("No stream found, but data object is available");
|
|
473
|
+
this.invokeOnCompleteCallback(response.data, streamConfig);
|
|
474
|
+
return [2 /*return*/, resolve(response.data)];
|
|
475
|
+
}
|
|
476
|
+
this.logger.error("No usable data found in response");
|
|
477
|
+
return [2 /*return*/, reject(new Error("No usable data found in response"))];
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
this.logger.error("Error processing streaming response: ".concat(error));
|
|
481
|
+
this.invokeOnErrorCallback(error, streamConfig);
|
|
482
|
+
reject(error);
|
|
483
|
+
}
|
|
484
|
+
return [2 /*return*/];
|
|
485
|
+
});
|
|
486
|
+
}); });
|
|
487
|
+
};
|
|
488
|
+
ApiCall.prototype.handleBrowserReadableStream = function (stream, resolve, reject, response, streamConfig) {
|
|
489
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
490
|
+
var reader, allChunks, buffer, _a, done, value, lines_1, chunk, lines, error_2;
|
|
491
|
+
return tslib_1.__generator(this, function (_b) {
|
|
492
|
+
switch (_b.label) {
|
|
493
|
+
case 0:
|
|
494
|
+
this.logger.debug("Found ReadableStream in response.data");
|
|
495
|
+
reader = stream.getReader();
|
|
496
|
+
allChunks = [];
|
|
497
|
+
buffer = "";
|
|
498
|
+
_b.label = 1;
|
|
499
|
+
case 1:
|
|
500
|
+
_b.trys.push([1, 5, , 6]);
|
|
501
|
+
_b.label = 2;
|
|
502
|
+
case 2:
|
|
503
|
+
if (!true) return [3 /*break*/, 4];
|
|
504
|
+
return [4 /*yield*/, reader.read()];
|
|
505
|
+
case 3:
|
|
506
|
+
_a = _b.sent(), done = _a.done, value = _a.value;
|
|
507
|
+
if (done) {
|
|
508
|
+
this.logger.debug("Stream reading complete");
|
|
509
|
+
if (buffer.trim()) {
|
|
510
|
+
lines_1 = buffer.split("\n");
|
|
511
|
+
this.processStreamLines(lines_1, allChunks, streamConfig);
|
|
512
|
+
}
|
|
513
|
+
return [3 /*break*/, 4];
|
|
514
|
+
}
|
|
515
|
+
chunk = new TextDecoder().decode(value);
|
|
516
|
+
this.logger.debug("Received chunk: ".concat(chunk.length, " bytes"));
|
|
517
|
+
buffer += chunk;
|
|
518
|
+
lines = buffer.split("\n");
|
|
519
|
+
buffer = lines.pop() || "";
|
|
520
|
+
this.processStreamLines(lines, allChunks, streamConfig);
|
|
521
|
+
return [3 /*break*/, 2];
|
|
522
|
+
case 4:
|
|
523
|
+
this.finalizeStreamResult(allChunks, resolve, response, streamConfig);
|
|
524
|
+
return [3 /*break*/, 6];
|
|
525
|
+
case 5:
|
|
526
|
+
error_2 = _b.sent();
|
|
527
|
+
this.logger.error("Stream error: ".concat(error_2));
|
|
528
|
+
this.invokeOnErrorCallback(error_2, streamConfig);
|
|
529
|
+
reject(error_2);
|
|
530
|
+
return [3 /*break*/, 6];
|
|
531
|
+
case 6: return [2 /*return*/];
|
|
532
|
+
}
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
};
|
|
536
|
+
ApiCall.prototype.handleBrowserStringResponse = function (data, resolve, response, streamConfig) {
|
|
537
|
+
this.logger.debug("Processing text response as stream data");
|
|
538
|
+
var allChunks = [];
|
|
539
|
+
var lines = data.split("\n");
|
|
540
|
+
this.processStreamLines(lines, allChunks, streamConfig);
|
|
541
|
+
if (allChunks.length > 0) {
|
|
542
|
+
var finalResult = this.combineStreamingChunks(allChunks);
|
|
543
|
+
this.invokeOnCompleteCallback(finalResult, streamConfig);
|
|
544
|
+
resolve(finalResult);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
// If no chunks were processed, use the original response
|
|
548
|
+
this.logger.debug("No chunks processed, returning original API response");
|
|
549
|
+
this.invokeOnCompleteCallback(response.data, streamConfig);
|
|
550
|
+
resolve(response.data);
|
|
551
|
+
}
|
|
552
|
+
};
|
|
553
|
+
ApiCall.prototype.processStreamLines = function (lines, allChunks, streamConfig) {
|
|
554
|
+
for (var _i = 0, lines_2 = lines; _i < lines_2.length; _i++) {
|
|
555
|
+
var line = lines_2[_i];
|
|
556
|
+
if (line.trim() && line !== "data: [DONE]") {
|
|
557
|
+
var processed = this.processStreamingLine(line);
|
|
558
|
+
if (processed !== null) {
|
|
559
|
+
this.invokeOnChunkCallback(processed, streamConfig);
|
|
560
|
+
allChunks.push(processed);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
ApiCall.prototype.finalizeStreamResult = function (allChunks, resolve, response, streamConfig) {
|
|
566
|
+
if (allChunks.length > 0) {
|
|
567
|
+
var finalResult = this.combineStreamingChunks(allChunks);
|
|
568
|
+
this.logger.debug("Stream processing complete");
|
|
569
|
+
this.invokeOnCompleteCallback(finalResult, streamConfig);
|
|
570
|
+
resolve(finalResult);
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
this.logger.debug("No chunks processed, returning original API response");
|
|
574
|
+
this.invokeOnCompleteCallback(response.data, streamConfig);
|
|
575
|
+
resolve(response.data);
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
/**
|
|
579
|
+
* Combines multiple streaming chunks into a single coherent result
|
|
580
|
+
* This is critical for ensuring we return the complete data rather than just the last chunk
|
|
581
|
+
*/
|
|
582
|
+
ApiCall.prototype.combineStreamingChunks = function (chunks) {
|
|
583
|
+
if (chunks.length === 0)
|
|
584
|
+
return {};
|
|
585
|
+
if (chunks.length === 1)
|
|
586
|
+
return chunks[0];
|
|
587
|
+
// For conversation streams with message chunks
|
|
588
|
+
var messagesChunks = this.getMessageChunks(chunks);
|
|
589
|
+
if (messagesChunks.length > 0) {
|
|
590
|
+
return this.combineMessageChunks(chunks, messagesChunks);
|
|
591
|
+
}
|
|
592
|
+
// For regular search responses
|
|
593
|
+
var lastChunk = chunks[chunks.length - 1];
|
|
594
|
+
if (!this.isCompleteSearchResponse(lastChunk)) {
|
|
595
|
+
throw new Error("Last chunk is not a complete search response");
|
|
596
|
+
}
|
|
597
|
+
return lastChunk;
|
|
598
|
+
};
|
|
599
|
+
ApiCall.prototype.getMessageChunks = function (chunks) {
|
|
600
|
+
return chunks.filter(this.isChunkMessage);
|
|
601
|
+
};
|
|
602
|
+
ApiCall.prototype.isChunkMessage = function (chunk) {
|
|
603
|
+
return (typeof chunk === "object" &&
|
|
604
|
+
chunk !== null &&
|
|
605
|
+
"message" in chunk &&
|
|
606
|
+
"conversation_id" in chunk);
|
|
607
|
+
};
|
|
608
|
+
ApiCall.prototype.combineMessageChunks = function (chunks, messagesChunks) {
|
|
609
|
+
this.logger.debug("Found ".concat(messagesChunks.length, " message chunks to combine"));
|
|
610
|
+
var lastChunk = chunks[chunks.length - 1];
|
|
611
|
+
if (this.isCompleteSearchResponse(lastChunk)) {
|
|
612
|
+
return lastChunk;
|
|
613
|
+
}
|
|
614
|
+
var metadataChunk = chunks.find(this.isCompleteSearchResponse);
|
|
615
|
+
if (!metadataChunk) {
|
|
616
|
+
throw new Error("No metadata chunk found");
|
|
617
|
+
}
|
|
618
|
+
return metadataChunk;
|
|
619
|
+
};
|
|
620
|
+
ApiCall.prototype.isCompleteSearchResponse = function (chunk) {
|
|
621
|
+
if (typeof chunk === "object" &&
|
|
622
|
+
chunk !== null &&
|
|
623
|
+
Object.keys(chunk).length > 0) {
|
|
624
|
+
return ("results" in chunk ||
|
|
625
|
+
"found" in chunk ||
|
|
626
|
+
"hits" in chunk ||
|
|
627
|
+
"page" in chunk ||
|
|
628
|
+
"search_time_ms" in chunk);
|
|
629
|
+
}
|
|
630
|
+
return false;
|
|
631
|
+
};
|
|
632
|
+
// Attempts to find the next healthy node, looping through the list of nodes once.
|
|
633
|
+
// But if no healthy nodes are found, it will just return the next node, even if it's unhealthy
|
|
634
|
+
// so we can try the request for good measure, in case that node has become healthy since
|
|
635
|
+
ApiCall.prototype.getNextNode = function (requestNumber) {
|
|
636
|
+
if (requestNumber === void 0) { requestNumber = 0; }
|
|
637
|
+
// Check if nearestNode is set and is healthy, if so return it
|
|
638
|
+
if (this.nearestNode != null) {
|
|
639
|
+
this.logger.debug("Request #".concat(requestNumber, ": Nodes Health: Node ").concat(this.nearestNode.index, " is ").concat(this.nearestNode.isHealthy === true ? "Healthy" : "Unhealthy"));
|
|
640
|
+
if (this.nearestNode.isHealthy === true ||
|
|
641
|
+
this.nodeDueForHealthcheck(this.nearestNode, requestNumber)) {
|
|
642
|
+
this.logger.debug("Request #".concat(requestNumber, ": Updated current node to Node ").concat(this.nearestNode.index));
|
|
643
|
+
return this.nearestNode;
|
|
644
|
+
}
|
|
645
|
+
this.logger.debug("Request #".concat(requestNumber, ": Falling back to individual nodes"));
|
|
646
|
+
}
|
|
647
|
+
// Fallback to nodes as usual
|
|
648
|
+
this.logger.debug("Request #".concat(requestNumber, ": Nodes Health: ").concat(this.nodes
|
|
649
|
+
.map(function (node) {
|
|
650
|
+
return "Node ".concat(node.index, " is ").concat(node.isHealthy === true ? "Healthy" : "Unhealthy");
|
|
651
|
+
})
|
|
652
|
+
.join(" || ")));
|
|
653
|
+
var candidateNode = this.nodes[0];
|
|
654
|
+
for (var i = 0; i <= this.nodes.length; i++) {
|
|
655
|
+
this.currentNodeIndex = (this.currentNodeIndex + 1) % this.nodes.length;
|
|
656
|
+
candidateNode = this.nodes[this.currentNodeIndex];
|
|
657
|
+
if (candidateNode.isHealthy === true ||
|
|
658
|
+
this.nodeDueForHealthcheck(candidateNode, requestNumber)) {
|
|
659
|
+
this.logger.debug("Request #".concat(requestNumber, ": Updated current node to Node ").concat(candidateNode.index));
|
|
660
|
+
return candidateNode;
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
// None of the nodes are marked healthy, but some of them could have become healthy since last health check.
|
|
664
|
+
// So we will just return the next node.
|
|
665
|
+
this.logger.debug("Request #".concat(requestNumber, ": No healthy nodes were found. Returning the next node, Node ").concat(candidateNode.index));
|
|
666
|
+
return candidateNode;
|
|
667
|
+
};
|
|
668
|
+
ApiCall.prototype.nodeDueForHealthcheck = function (node, requestNumber) {
|
|
669
|
+
if (requestNumber === void 0) { requestNumber = 0; }
|
|
670
|
+
var isDueForHealthcheck = Date.now() - node.lastAccessTimestamp >
|
|
671
|
+
this.healthcheckIntervalSeconds * 1000;
|
|
672
|
+
if (isDueForHealthcheck) {
|
|
673
|
+
this.logger.debug("Request #".concat(requestNumber, ": Node ").concat(node.index, " has exceeded healtcheckIntervalSeconds of ").concat(this.healthcheckIntervalSeconds, ". Adding it back into rotation."));
|
|
674
|
+
}
|
|
675
|
+
return isDueForHealthcheck;
|
|
676
|
+
};
|
|
677
|
+
ApiCall.prototype.initializeMetadataForNodes = function () {
|
|
678
|
+
var _this = this;
|
|
679
|
+
if (this.nearestNode != null) {
|
|
680
|
+
this.nearestNode.index = "nearestNode";
|
|
681
|
+
this.setNodeHealthcheck(this.nearestNode, HEALTHY);
|
|
682
|
+
}
|
|
683
|
+
this.nodes.forEach(function (node, i) {
|
|
684
|
+
node.index = i;
|
|
685
|
+
_this.setNodeHealthcheck(node, HEALTHY);
|
|
686
|
+
});
|
|
687
|
+
};
|
|
688
|
+
ApiCall.prototype.setNodeHealthcheck = function (node, isHealthy) {
|
|
689
|
+
node.isHealthy = isHealthy;
|
|
690
|
+
node.lastAccessTimestamp = Date.now();
|
|
691
|
+
};
|
|
692
|
+
ApiCall.prototype.uriFor = function (endpoint, node) {
|
|
693
|
+
if (node.url != null) {
|
|
694
|
+
return "".concat(node.url).concat(endpoint);
|
|
695
|
+
}
|
|
696
|
+
return "".concat(node.protocol, "://").concat(node.host, ":").concat(node.port).concat(node.path).concat(endpoint);
|
|
697
|
+
};
|
|
698
|
+
ApiCall.prototype.defaultHeaders = function () {
|
|
699
|
+
var defaultHeaders = {};
|
|
700
|
+
if (!this.sendApiKeyAsQueryParam) {
|
|
701
|
+
defaultHeaders[APIKEYHEADERNAME] = this.apiKey;
|
|
702
|
+
}
|
|
703
|
+
defaultHeaders["Content-Type"] = "application/json";
|
|
704
|
+
return defaultHeaders;
|
|
705
|
+
};
|
|
706
|
+
ApiCall.prototype.timer = function (seconds) {
|
|
707
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
708
|
+
return tslib_1.__generator(this, function (_a) {
|
|
709
|
+
return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, seconds * 1000); })];
|
|
710
|
+
});
|
|
711
|
+
});
|
|
712
|
+
};
|
|
713
|
+
ApiCall.prototype.customErrorForResponse = function (response, messageFromServer, httpBody) {
|
|
714
|
+
var errorMessage = "Request failed with HTTP code ".concat(response.status);
|
|
715
|
+
if (typeof messageFromServer === "string" &&
|
|
716
|
+
messageFromServer.trim() !== "") {
|
|
717
|
+
errorMessage += " | Server said: ".concat(messageFromServer);
|
|
718
|
+
}
|
|
719
|
+
var error = new TypesenseError_1.default(errorMessage, httpBody, response.status);
|
|
720
|
+
if (response.status === 400) {
|
|
721
|
+
error = new Errors_1.RequestMalformed(errorMessage, httpBody, response.status);
|
|
722
|
+
}
|
|
723
|
+
else if (response.status === 401) {
|
|
724
|
+
error = new Errors_1.RequestUnauthorized(errorMessage, httpBody, response.status);
|
|
725
|
+
}
|
|
726
|
+
else if (response.status === 404) {
|
|
727
|
+
error = new Errors_1.ObjectNotFound(errorMessage, httpBody, response.status);
|
|
728
|
+
}
|
|
729
|
+
else if (response.status === 409) {
|
|
730
|
+
error = new Errors_1.ObjectAlreadyExists(errorMessage, httpBody, response.status);
|
|
731
|
+
}
|
|
732
|
+
else if (response.status === 422) {
|
|
733
|
+
error = new Errors_1.ObjectUnprocessable(errorMessage, httpBody, response.status);
|
|
734
|
+
}
|
|
735
|
+
else if (response.status >= 500 && response.status <= 599) {
|
|
736
|
+
error = new Errors_1.ServerError(errorMessage, httpBody, response.status);
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
error = new Errors_1.HTTPError(errorMessage, httpBody, response.status);
|
|
740
|
+
}
|
|
741
|
+
return error;
|
|
742
|
+
};
|
|
743
|
+
ApiCall.prototype.invokeOnChunkCallback = function (data, streamConfig) {
|
|
744
|
+
if (streamConfig === null || streamConfig === void 0 ? void 0 : streamConfig.onChunk) {
|
|
745
|
+
try {
|
|
746
|
+
streamConfig.onChunk(data);
|
|
747
|
+
}
|
|
748
|
+
catch (error) {
|
|
749
|
+
this.logger.warn("Error in onChunk callback: ".concat(error));
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
};
|
|
753
|
+
ApiCall.prototype.invokeOnCompleteCallback = function (data, streamConfig) {
|
|
754
|
+
if (streamConfig === null || streamConfig === void 0 ? void 0 : streamConfig.onComplete) {
|
|
755
|
+
try {
|
|
756
|
+
streamConfig.onComplete(data);
|
|
757
|
+
}
|
|
758
|
+
catch (error) {
|
|
759
|
+
this.logger.warn("Error in onComplete callback: ".concat(error));
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
};
|
|
763
|
+
ApiCall.prototype.invokeOnErrorCallback = function (error, streamConfig) {
|
|
764
|
+
if (streamConfig === null || streamConfig === void 0 ? void 0 : streamConfig.onError) {
|
|
765
|
+
var errorObj = (0, Utils_1.toErrorWithMessage)(error);
|
|
766
|
+
try {
|
|
767
|
+
streamConfig.onError(errorObj);
|
|
768
|
+
}
|
|
769
|
+
catch (callbackError) {
|
|
770
|
+
this.logger.warn("Error in onError callback: ".concat(callbackError));
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
};
|
|
774
|
+
return ApiCall;
|
|
775
|
+
}());
|
|
776
|
+
exports.default = ApiCall;
|
|
777
|
+
//# sourceMappingURL=ApiCall.js.map
|