@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.
Files changed (281) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +31 -0
  3. package/changes.json +10 -0
  4. package/dist/typesense.js +13031 -0
  5. package/dist/typesense.js.map +1 -0
  6. package/dist/typesense.min.js +3 -0
  7. package/dist/typesense.min.js.LICENSE.txt +1 -0
  8. package/dist/typesense.min.js.map +1 -0
  9. package/lib/Typesense/Alias.d.ts +10 -0
  10. package/lib/Typesense/Alias.js +30 -0
  11. package/lib/Typesense/Alias.js.map +1 -0
  12. package/lib/Typesense/Aliases.d.ts +18 -0
  13. package/lib/Typesense/Aliases.js +36 -0
  14. package/lib/Typesense/Aliases.js.map +1 -0
  15. package/lib/Typesense/Analytics.d.ts +15 -0
  16. package/lib/Typesense/Analytics.js +40 -0
  17. package/lib/Typesense/Analytics.js.map +1 -0
  18. package/lib/Typesense/AnalyticsEvent.d.ts +5 -0
  19. package/lib/Typesense/AnalyticsEvent.js +3 -0
  20. package/lib/Typesense/AnalyticsEvent.js.map +1 -0
  21. package/lib/Typesense/AnalyticsEvents.d.ts +26 -0
  22. package/lib/Typesense/AnalyticsEvents.js +37 -0
  23. package/lib/Typesense/AnalyticsEvents.js.map +1 -0
  24. package/lib/Typesense/AnalyticsRule.d.ts +47 -0
  25. package/lib/Typesense/AnalyticsRule.js +30 -0
  26. package/lib/Typesense/AnalyticsRule.js.map +1 -0
  27. package/lib/Typesense/AnalyticsRuleV1.d.ts +35 -0
  28. package/lib/Typesense/AnalyticsRuleV1.js +30 -0
  29. package/lib/Typesense/AnalyticsRuleV1.js.map +1 -0
  30. package/lib/Typesense/AnalyticsRules.d.ts +16 -0
  31. package/lib/Typesense/AnalyticsRules.js +49 -0
  32. package/lib/Typesense/AnalyticsRules.js.map +1 -0
  33. package/lib/Typesense/AnalyticsRulesV1.d.ts +13 -0
  34. package/lib/Typesense/AnalyticsRulesV1.js +37 -0
  35. package/lib/Typesense/AnalyticsRulesV1.js.map +1 -0
  36. package/lib/Typesense/AnalyticsV1.d.ts +19 -0
  37. package/lib/Typesense/AnalyticsV1.js +49 -0
  38. package/lib/Typesense/AnalyticsV1.js.map +1 -0
  39. package/lib/Typesense/ApiCall.d.ts +99 -0
  40. package/lib/Typesense/ApiCall.js +777 -0
  41. package/lib/Typesense/ApiCall.js.map +1 -0
  42. package/lib/Typesense/Client.d.ts +79 -0
  43. package/lib/Typesense/Client.js +170 -0
  44. package/lib/Typesense/Client.js.map +1 -0
  45. package/lib/Typesense/Collection.d.ts +63 -0
  46. package/lib/Typesense/Collection.js +109 -0
  47. package/lib/Typesense/Collection.js.map +1 -0
  48. package/lib/Typesense/Collections.d.ts +42 -0
  49. package/lib/Typesense/Collections.js +34 -0
  50. package/lib/Typesense/Collections.js.map +1 -0
  51. package/lib/Typesense/Configuration.d.ts +143 -0
  52. package/lib/Typesense/Configuration.js +113 -0
  53. package/lib/Typesense/Configuration.js.map +1 -0
  54. package/lib/Typesense/Conversation.d.ts +22 -0
  55. package/lib/Typesense/Conversation.js +37 -0
  56. package/lib/Typesense/Conversation.js.map +1 -0
  57. package/lib/Typesense/ConversationModel.d.ts +30 -0
  58. package/lib/Typesense/ConversationModel.js +37 -0
  59. package/lib/Typesense/ConversationModel.js.map +1 -0
  60. package/lib/Typesense/ConversationModels.d.ts +10 -0
  61. package/lib/Typesense/ConversationModels.js +37 -0
  62. package/lib/Typesense/ConversationModels.js.map +1 -0
  63. package/lib/Typesense/Conversations.d.ts +17 -0
  64. package/lib/Typesense/Conversations.js +42 -0
  65. package/lib/Typesense/Conversations.js.map +1 -0
  66. package/lib/Typesense/CurationSet.d.ts +17 -0
  67. package/lib/Typesense/CurationSet.js +52 -0
  68. package/lib/Typesense/CurationSet.js.map +1 -0
  69. package/lib/Typesense/CurationSetItem.d.ts +15 -0
  70. package/lib/Typesense/CurationSetItem.js +38 -0
  71. package/lib/Typesense/CurationSetItem.js.map +1 -0
  72. package/lib/Typesense/CurationSetItems.d.ts +9 -0
  73. package/lib/Typesense/CurationSetItems.js +23 -0
  74. package/lib/Typesense/CurationSetItems.js.map +1 -0
  75. package/lib/Typesense/CurationSets.d.ts +56 -0
  76. package/lib/Typesense/CurationSets.js +19 -0
  77. package/lib/Typesense/CurationSets.js.map +1 -0
  78. package/lib/Typesense/Debug.d.ts +10 -0
  79. package/lib/Typesense/Debug.js +19 -0
  80. package/lib/Typesense/Debug.js.map +1 -0
  81. package/lib/Typesense/Document.d.ts +12 -0
  82. package/lib/Typesense/Document.js +41 -0
  83. package/lib/Typesense/Document.js.map +1 -0
  84. package/lib/Typesense/Documents.d.ts +196 -0
  85. package/lib/Typesense/Documents.js +204 -0
  86. package/lib/Typesense/Documents.js.map +1 -0
  87. package/lib/Typesense/Errors/HTTPError.d.ts +3 -0
  88. package/lib/Typesense/Errors/HTTPError.js +13 -0
  89. package/lib/Typesense/Errors/HTTPError.js.map +1 -0
  90. package/lib/Typesense/Errors/ImportError.d.ts +15 -0
  91. package/lib/Typesense/Errors/ImportError.js +16 -0
  92. package/lib/Typesense/Errors/ImportError.js.map +1 -0
  93. package/lib/Typesense/Errors/MissingConfigurationError.d.ts +3 -0
  94. package/lib/Typesense/Errors/MissingConfigurationError.js +13 -0
  95. package/lib/Typesense/Errors/MissingConfigurationError.js.map +1 -0
  96. package/lib/Typesense/Errors/ObjectAlreadyExists.d.ts +3 -0
  97. package/lib/Typesense/Errors/ObjectAlreadyExists.js +13 -0
  98. package/lib/Typesense/Errors/ObjectAlreadyExists.js.map +1 -0
  99. package/lib/Typesense/Errors/ObjectNotFound.d.ts +3 -0
  100. package/lib/Typesense/Errors/ObjectNotFound.js +13 -0
  101. package/lib/Typesense/Errors/ObjectNotFound.js.map +1 -0
  102. package/lib/Typesense/Errors/ObjectUnprocessable.d.ts +3 -0
  103. package/lib/Typesense/Errors/ObjectUnprocessable.js +13 -0
  104. package/lib/Typesense/Errors/ObjectUnprocessable.js.map +1 -0
  105. package/lib/Typesense/Errors/RequestMalformed.d.ts +3 -0
  106. package/lib/Typesense/Errors/RequestMalformed.js +13 -0
  107. package/lib/Typesense/Errors/RequestMalformed.js.map +1 -0
  108. package/lib/Typesense/Errors/RequestUnauthorized.d.ts +3 -0
  109. package/lib/Typesense/Errors/RequestUnauthorized.js +13 -0
  110. package/lib/Typesense/Errors/RequestUnauthorized.js.map +1 -0
  111. package/lib/Typesense/Errors/ServerError.d.ts +3 -0
  112. package/lib/Typesense/Errors/ServerError.js +13 -0
  113. package/lib/Typesense/Errors/ServerError.js.map +1 -0
  114. package/lib/Typesense/Errors/TypesenseError.d.ts +5 -0
  115. package/lib/Typesense/Errors/TypesenseError.js +19 -0
  116. package/lib/Typesense/Errors/TypesenseError.js.map +1 -0
  117. package/lib/Typesense/Errors/index.d.ts +11 -0
  118. package/lib/Typesense/Errors/index.js +25 -0
  119. package/lib/Typesense/Errors/index.js.map +1 -0
  120. package/lib/Typesense/Health.d.ts +9 -0
  121. package/lib/Typesense/Health.js +19 -0
  122. package/lib/Typesense/Health.js.map +1 -0
  123. package/lib/Typesense/Key.d.ts +33 -0
  124. package/lib/Typesense/Key.js +30 -0
  125. package/lib/Typesense/Key.js.map +1 -0
  126. package/lib/Typesense/Keys.d.ts +19 -0
  127. package/lib/Typesense/Keys.js +46 -0
  128. package/lib/Typesense/Keys.js.map +1 -0
  129. package/lib/Typesense/Metrics.d.ts +25 -0
  130. package/lib/Typesense/Metrics.js +19 -0
  131. package/lib/Typesense/Metrics.js.map +1 -0
  132. package/lib/Typesense/MultiSearch.d.ts +25 -0
  133. package/lib/Typesense/MultiSearch.js +63 -0
  134. package/lib/Typesense/MultiSearch.js.map +1 -0
  135. package/lib/Typesense/NLSearchModel.d.ts +16 -0
  136. package/lib/Typesense/NLSearchModel.js +37 -0
  137. package/lib/Typesense/NLSearchModel.js.map +1 -0
  138. package/lib/Typesense/NLSearchModels.d.ts +36 -0
  139. package/lib/Typesense/NLSearchModels.js +36 -0
  140. package/lib/Typesense/NLSearchModels.js.map +1 -0
  141. package/lib/Typesense/Operations.d.ts +12 -0
  142. package/lib/Typesense/Operations.js +27 -0
  143. package/lib/Typesense/Operations.js.map +1 -0
  144. package/lib/Typesense/Override.d.ts +17 -0
  145. package/lib/Typesense/Override.js +32 -0
  146. package/lib/Typesense/Override.js.map +1 -0
  147. package/lib/Typesense/Overrides.d.ts +43 -0
  148. package/lib/Typesense/Overrides.js +38 -0
  149. package/lib/Typesense/Overrides.js.map +1 -0
  150. package/lib/Typesense/Preset.d.ts +17 -0
  151. package/lib/Typesense/Preset.js +30 -0
  152. package/lib/Typesense/Preset.js.map +1 -0
  153. package/lib/Typesense/Presets.d.ts +18 -0
  154. package/lib/Typesense/Presets.js +49 -0
  155. package/lib/Typesense/Presets.js.map +1 -0
  156. package/lib/Typesense/RequestWithCache.d.ts +15 -0
  157. package/lib/Typesense/RequestWithCache.js +117 -0
  158. package/lib/Typesense/RequestWithCache.js.map +1 -0
  159. package/lib/Typesense/SearchClient.d.ts +13 -0
  160. package/lib/Typesense/SearchClient.js +45 -0
  161. package/lib/Typesense/SearchClient.js.map +1 -0
  162. package/lib/Typesense/SearchOnlyCollection.d.ts +11 -0
  163. package/lib/Typesense/SearchOnlyCollection.js +18 -0
  164. package/lib/Typesense/SearchOnlyCollection.js.map +1 -0
  165. package/lib/Typesense/SearchOnlyDocuments.d.ts +16 -0
  166. package/lib/Typesense/SearchOnlyDocuments.js +57 -0
  167. package/lib/Typesense/SearchOnlyDocuments.js.map +1 -0
  168. package/lib/Typesense/Stats.d.ts +24 -0
  169. package/lib/Typesense/Stats.js +19 -0
  170. package/lib/Typesense/Stats.js.map +1 -0
  171. package/lib/Typesense/Stemming.d.ts +12 -0
  172. package/lib/Typesense/Stemming.js +35 -0
  173. package/lib/Typesense/Stemming.js.map +1 -0
  174. package/lib/Typesense/StemmingDictionaries.d.ts +13 -0
  175. package/lib/Typesense/StemmingDictionaries.js +58 -0
  176. package/lib/Typesense/StemmingDictionaries.js.map +1 -0
  177. package/lib/Typesense/StemmingDictionary.d.ts +20 -0
  178. package/lib/Typesense/StemmingDictionary.js +30 -0
  179. package/lib/Typesense/StemmingDictionary.js.map +1 -0
  180. package/lib/Typesense/Stopword.d.ts +20 -0
  181. package/lib/Typesense/Stopword.js +30 -0
  182. package/lib/Typesense/Stopword.js.map +1 -0
  183. package/lib/Typesense/Stopwords.d.ts +17 -0
  184. package/lib/Typesense/Stopwords.js +36 -0
  185. package/lib/Typesense/Stopwords.js.map +1 -0
  186. package/lib/Typesense/Synonym.d.ts +21 -0
  187. package/lib/Typesense/Synonym.js +41 -0
  188. package/lib/Typesense/Synonym.js.map +1 -0
  189. package/lib/Typesense/SynonymSet.d.ts +21 -0
  190. package/lib/Typesense/SynonymSet.js +52 -0
  191. package/lib/Typesense/SynonymSet.js.map +1 -0
  192. package/lib/Typesense/SynonymSetItem.d.ts +14 -0
  193. package/lib/Typesense/SynonymSetItem.js +31 -0
  194. package/lib/Typesense/SynonymSetItem.js.map +1 -0
  195. package/lib/Typesense/SynonymSetItems.d.ts +10 -0
  196. package/lib/Typesense/SynonymSetItems.js +30 -0
  197. package/lib/Typesense/SynonymSetItems.js.map +1 -0
  198. package/lib/Typesense/SynonymSets.d.ts +23 -0
  199. package/lib/Typesense/SynonymSets.js +19 -0
  200. package/lib/Typesense/SynonymSets.js.map +1 -0
  201. package/lib/Typesense/Synonyms.d.ts +24 -0
  202. package/lib/Typesense/Synonyms.js +47 -0
  203. package/lib/Typesense/Synonyms.js.map +1 -0
  204. package/lib/Typesense/Types.d.ts +201 -0
  205. package/lib/Typesense/Types.js +22 -0
  206. package/lib/Typesense/Types.js.map +1 -0
  207. package/lib/Typesense/Utils.d.ts +11 -0
  208. package/lib/Typesense/Utils.js +50 -0
  209. package/lib/Typesense/Utils.js.map +1 -0
  210. package/lib/Typesense.d.ts +46 -0
  211. package/lib/Typesense.js +12 -0
  212. package/lib/Typesense.js.map +1 -0
  213. package/package.json +141 -0
  214. package/src/Typesense/Alias.ts +18 -0
  215. package/src/Typesense/Aliases.ts +41 -0
  216. package/src/Typesense/Analytics.ts +39 -0
  217. package/src/Typesense/AnalyticsEvent.ts +5 -0
  218. package/src/Typesense/AnalyticsEvents.ts +53 -0
  219. package/src/Typesense/AnalyticsRule.ts +63 -0
  220. package/src/Typesense/AnalyticsRuleV1.ts +52 -0
  221. package/src/Typesense/AnalyticsRules.ts +67 -0
  222. package/src/Typesense/AnalyticsRulesV1.ts +43 -0
  223. package/src/Typesense/AnalyticsV1.ts +52 -0
  224. package/src/Typesense/ApiCall.ts +1103 -0
  225. package/src/Typesense/Client.ts +225 -0
  226. package/src/Typesense/Collection.ts +179 -0
  227. package/src/Typesense/Collections.ts +68 -0
  228. package/src/Typesense/Configuration.ts +328 -0
  229. package/src/Typesense/Conversation.ts +45 -0
  230. package/src/Typesense/ConversationModel.ts +55 -0
  231. package/src/Typesense/ConversationModels.ts +38 -0
  232. package/src/Typesense/Conversations.ts +47 -0
  233. package/src/Typesense/CurationSet.ts +56 -0
  234. package/src/Typesense/CurationSetItem.ts +35 -0
  235. package/src/Typesense/CurationSetItems.ts +18 -0
  236. package/src/Typesense/CurationSets.ts +60 -0
  237. package/src/Typesense/Debug.ts +16 -0
  238. package/src/Typesense/Document.ts +34 -0
  239. package/src/Typesense/Documents.ts +445 -0
  240. package/src/Typesense/Errors/HTTPError.ts +3 -0
  241. package/src/Typesense/Errors/ImportError.ts +24 -0
  242. package/src/Typesense/Errors/MissingConfigurationError.ts +3 -0
  243. package/src/Typesense/Errors/ObjectAlreadyExists.ts +3 -0
  244. package/src/Typesense/Errors/ObjectNotFound.ts +3 -0
  245. package/src/Typesense/Errors/ObjectUnprocessable.ts +3 -0
  246. package/src/Typesense/Errors/RequestMalformed.ts +3 -0
  247. package/src/Typesense/Errors/RequestUnauthorized.ts +3 -0
  248. package/src/Typesense/Errors/ServerError.ts +3 -0
  249. package/src/Typesense/Errors/TypesenseError.ts +13 -0
  250. package/src/Typesense/Errors/index.ts +23 -0
  251. package/src/Typesense/Health.ts +15 -0
  252. package/src/Typesense/Key.ts +73 -0
  253. package/src/Typesense/Keys.ts +59 -0
  254. package/src/Typesense/Metrics.ts +31 -0
  255. package/src/Typesense/MultiSearch.ts +144 -0
  256. package/src/Typesense/NLSearchModel.ts +35 -0
  257. package/src/Typesense/NLSearchModels.ts +61 -0
  258. package/src/Typesense/Operations.ts +35 -0
  259. package/src/Typesense/Override.ts +31 -0
  260. package/src/Typesense/Overrides.ts +73 -0
  261. package/src/Typesense/Preset.ts +31 -0
  262. package/src/Typesense/Presets.ts +62 -0
  263. package/src/Typesense/RequestWithCache.ts +209 -0
  264. package/src/Typesense/SearchClient.ts +64 -0
  265. package/src/Typesense/SearchOnlyCollection.ts +24 -0
  266. package/src/Typesense/SearchOnlyDocuments.ts +87 -0
  267. package/src/Typesense/Stats.ts +31 -0
  268. package/src/Typesense/Stemming.ts +38 -0
  269. package/src/Typesense/StemmingDictionaries.ts +59 -0
  270. package/src/Typesense/StemmingDictionary.ts +37 -0
  271. package/src/Typesense/Stopword.ts +31 -0
  272. package/src/Typesense/Stopwords.ts +41 -0
  273. package/src/Typesense/Synonym.ts +42 -0
  274. package/src/Typesense/SynonymSet.ts +57 -0
  275. package/src/Typesense/SynonymSetItem.ts +28 -0
  276. package/src/Typesense/SynonymSetItems.ts +31 -0
  277. package/src/Typesense/SynonymSets.ts +30 -0
  278. package/src/Typesense/Synonyms.ts +55 -0
  279. package/src/Typesense/Types.ts +355 -0
  280. package/src/Typesense/Utils.ts +80 -0
  281. 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