@azure/cosmos 4.4.1 → 4.5.0-alpha.20250718.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (489) hide show
  1. package/dist/browser/ClientContext.d.ts +19 -10
  2. package/dist/browser/ClientContext.d.ts.map +1 -1
  3. package/dist/browser/ClientContext.js +30 -11
  4. package/dist/browser/ClientContext.js.map +1 -1
  5. package/dist/browser/CosmosClient.d.ts.map +1 -1
  6. package/dist/browser/CosmosClient.js +13 -2
  7. package/dist/browser/CosmosClient.js.map +1 -1
  8. package/dist/browser/PartitionKeyRangeFailoverInfo.d.ts +49 -0
  9. package/dist/browser/PartitionKeyRangeFailoverInfo.d.ts.map +1 -0
  10. package/dist/browser/PartitionKeyRangeFailoverInfo.js +130 -0
  11. package/dist/browser/PartitionKeyRangeFailoverInfo.js.map +1 -0
  12. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  13. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js +4 -0
  14. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  15. package/dist/browser/client/ClientUtils.d.ts +3 -1
  16. package/dist/browser/client/ClientUtils.d.ts.map +1 -1
  17. package/dist/browser/client/ClientUtils.js +10 -0
  18. package/dist/browser/client/ClientUtils.js.map +1 -1
  19. package/dist/browser/client/Item/Item.d.ts.map +1 -1
  20. package/dist/browser/client/Item/Item.js +13 -0
  21. package/dist/browser/client/Item/Item.js.map +1 -1
  22. package/dist/browser/client/Item/Items.d.ts +1 -0
  23. package/dist/browser/client/Item/Items.d.ts.map +1 -1
  24. package/dist/browser/client/Item/Items.js +29 -3
  25. package/dist/browser/client/Item/Items.js.map +1 -1
  26. package/dist/browser/common/constants.d.ts +20 -0
  27. package/dist/browser/common/constants.d.ts.map +1 -1
  28. package/dist/browser/common/constants.js +23 -1
  29. package/dist/browser/common/constants.js.map +1 -1
  30. package/dist/browser/common/platform.d.ts +6 -1
  31. package/dist/browser/common/platform.d.ts.map +1 -1
  32. package/dist/browser/common/platform.js +23 -4
  33. package/dist/browser/common/platform.js.map +1 -1
  34. package/dist/browser/diagnostics/DiagnosticNodeInternal.d.ts +1 -0
  35. package/dist/browser/diagnostics/DiagnosticNodeInternal.d.ts.map +1 -1
  36. package/dist/browser/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  37. package/dist/browser/documents/ConnectionPolicy.d.ts +6 -0
  38. package/dist/browser/documents/ConnectionPolicy.d.ts.map +1 -1
  39. package/dist/browser/documents/ConnectionPolicy.js +2 -0
  40. package/dist/browser/documents/ConnectionPolicy.js.map +1 -1
  41. package/dist/browser/documents/DatabaseAccount.d.ts.map +1 -1
  42. package/dist/browser/documents/DatabaseAccount.js +3 -0
  43. package/dist/browser/documents/DatabaseAccount.js.map +1 -1
  44. package/dist/browser/documents/PartitionKeyDefinition.d.ts +1 -1
  45. package/dist/browser/documents/PartitionKeyDefinition.js.map +1 -1
  46. package/dist/browser/encryption/EncryptionKeyStoreProvider.d.ts.map +1 -1
  47. package/dist/browser/encryption/EncryptionKeyStoreProvider.js +2 -1
  48. package/dist/browser/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  49. package/dist/browser/extractPartitionKey.d.ts.map +1 -1
  50. package/dist/browser/extractPartitionKey.js +33 -20
  51. package/dist/browser/extractPartitionKey.js.map +1 -1
  52. package/dist/browser/globalEndpointManager.d.ts +6 -0
  53. package/dist/browser/globalEndpointManager.d.ts.map +1 -1
  54. package/dist/browser/globalEndpointManager.js +9 -4
  55. package/dist/browser/globalEndpointManager.js.map +1 -1
  56. package/dist/browser/globalPartitionEndpointManager.d.ts +79 -0
  57. package/dist/browser/globalPartitionEndpointManager.d.ts.map +1 -0
  58. package/dist/browser/globalPartitionEndpointManager.js +278 -0
  59. package/dist/browser/globalPartitionEndpointManager.js.map +1 -0
  60. package/dist/browser/queryExecutionContext/Aggregators/index.d.ts.map +1 -1
  61. package/dist/browser/queryExecutionContext/Aggregators/index.js +1 -0
  62. package/dist/browser/queryExecutionContext/Aggregators/index.js.map +1 -1
  63. package/dist/browser/queryExecutionContext/documentProducer.d.ts +2 -3
  64. package/dist/browser/queryExecutionContext/documentProducer.d.ts.map +1 -1
  65. package/dist/browser/queryExecutionContext/documentProducer.js +16 -21
  66. package/dist/browser/queryExecutionContext/documentProducer.js.map +1 -1
  67. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.d.ts +3 -1
  68. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.d.ts.map +1 -1
  69. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.js +10 -2
  70. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  71. package/dist/browser/queryExecutionContext/parallelQueryExecutionContextBase.d.ts.map +1 -1
  72. package/dist/browser/queryExecutionContext/parallelQueryExecutionContextBase.js +2 -1
  73. package/dist/browser/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  74. package/dist/browser/queryIterator.d.ts.map +1 -1
  75. package/dist/browser/queryIterator.js +2 -3
  76. package/dist/browser/queryIterator.js.map +1 -1
  77. package/dist/browser/request/ErrorResponse.d.ts +1 -1
  78. package/dist/browser/request/ErrorResponse.d.ts.map +1 -1
  79. package/dist/browser/request/ErrorResponse.js.map +1 -1
  80. package/dist/browser/request/RequestContext.d.ts +5 -0
  81. package/dist/browser/request/RequestContext.d.ts.map +1 -1
  82. package/dist/browser/request/RequestContext.js.map +1 -1
  83. package/dist/browser/request/RequestHandler.d.ts.map +1 -1
  84. package/dist/browser/request/RequestHandler.js +14 -4
  85. package/dist/browser/request/RequestHandler.js.map +1 -1
  86. package/dist/browser/request/request.d.ts.map +1 -1
  87. package/dist/browser/request/request.js +3 -3
  88. package/dist/browser/request/request.js.map +1 -1
  89. package/dist/browser/retry/RetryPolicy.d.ts +2 -2
  90. package/dist/browser/retry/RetryPolicy.d.ts.map +1 -1
  91. package/dist/browser/retry/RetryPolicy.js.map +1 -1
  92. package/dist/browser/retry/defaultRetryPolicy.d.ts.map +1 -1
  93. package/dist/browser/retry/defaultRetryPolicy.js +4 -8
  94. package/dist/browser/retry/defaultRetryPolicy.js.map +1 -1
  95. package/dist/browser/retry/endpointDiscoveryRetryPolicy.d.ts +5 -3
  96. package/dist/browser/retry/endpointDiscoveryRetryPolicy.d.ts.map +1 -1
  97. package/dist/browser/retry/endpointDiscoveryRetryPolicy.js +9 -2
  98. package/dist/browser/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  99. package/dist/browser/retry/retryUtility.d.ts.map +1 -1
  100. package/dist/browser/retry/retryUtility.js +11 -5
  101. package/dist/browser/retry/retryUtility.js.map +1 -1
  102. package/dist/browser/retry/timeoutFailoverRetryPolicy.d.ts +6 -3
  103. package/dist/browser/retry/timeoutFailoverRetryPolicy.d.ts.map +1 -1
  104. package/dist/browser/retry/timeoutFailoverRetryPolicy.js +15 -7
  105. package/dist/browser/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  106. package/dist/browser/routing/partitionKeyRangeCache.d.ts.map +1 -1
  107. package/dist/browser/routing/partitionKeyRangeCache.js +11 -0
  108. package/dist/browser/routing/partitionKeyRangeCache.js.map +1 -1
  109. package/dist/browser/utils/checkURL.js +6 -0
  110. package/dist/browser/utils/checkURL.js.map +1 -1
  111. package/dist/browser/utils/hashing/hash.d.ts +2 -0
  112. package/dist/browser/utils/hashing/hash.d.ts.map +1 -1
  113. package/dist/browser/utils/hashing/hash.js +19 -0
  114. package/dist/browser/utils/hashing/hash.js.map +1 -1
  115. package/dist/browser/utils/time.d.ts +8 -0
  116. package/dist/browser/utils/time.d.ts.map +1 -1
  117. package/dist/browser/utils/time.js +19 -0
  118. package/dist/browser/utils/time.js.map +1 -1
  119. package/dist/commonjs/ClientContext.d.ts +19 -10
  120. package/dist/commonjs/ClientContext.d.ts.map +1 -1
  121. package/dist/commonjs/ClientContext.js +30 -11
  122. package/dist/commonjs/ClientContext.js.map +1 -1
  123. package/dist/commonjs/CosmosClient.d.ts.map +1 -1
  124. package/dist/commonjs/CosmosClient.js +13 -2
  125. package/dist/commonjs/CosmosClient.js.map +1 -1
  126. package/dist/commonjs/PartitionKeyRangeFailoverInfo.d.ts +49 -0
  127. package/dist/commonjs/PartitionKeyRangeFailoverInfo.d.ts.map +1 -0
  128. package/dist/commonjs/PartitionKeyRangeFailoverInfo.js +135 -0
  129. package/dist/commonjs/PartitionKeyRangeFailoverInfo.js.map +1 -0
  130. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  131. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js +4 -0
  132. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  133. package/dist/commonjs/client/ClientUtils.d.ts +3 -1
  134. package/dist/commonjs/client/ClientUtils.d.ts.map +1 -1
  135. package/dist/commonjs/client/ClientUtils.js +11 -0
  136. package/dist/commonjs/client/ClientUtils.js.map +1 -1
  137. package/dist/commonjs/client/Item/Item.d.ts.map +1 -1
  138. package/dist/commonjs/client/Item/Item.js +13 -0
  139. package/dist/commonjs/client/Item/Item.js.map +1 -1
  140. package/dist/commonjs/client/Item/Items.d.ts +1 -0
  141. package/dist/commonjs/client/Item/Items.d.ts.map +1 -1
  142. package/dist/commonjs/client/Item/Items.js +27 -1
  143. package/dist/commonjs/client/Item/Items.js.map +1 -1
  144. package/dist/commonjs/common/constants.d.ts +20 -0
  145. package/dist/commonjs/common/constants.d.ts.map +1 -1
  146. package/dist/commonjs/common/constants.js +24 -2
  147. package/dist/commonjs/common/constants.js.map +1 -1
  148. package/dist/commonjs/common/platform.d.ts +6 -1
  149. package/dist/commonjs/common/platform.d.ts.map +1 -1
  150. package/dist/commonjs/common/platform.js +23 -3
  151. package/dist/commonjs/common/platform.js.map +1 -1
  152. package/dist/commonjs/diagnostics/DiagnosticNodeInternal.d.ts +1 -0
  153. package/dist/commonjs/diagnostics/DiagnosticNodeInternal.d.ts.map +1 -1
  154. package/dist/commonjs/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  155. package/dist/commonjs/documents/ConnectionPolicy.d.ts +6 -0
  156. package/dist/commonjs/documents/ConnectionPolicy.d.ts.map +1 -1
  157. package/dist/commonjs/documents/ConnectionPolicy.js +2 -0
  158. package/dist/commonjs/documents/ConnectionPolicy.js.map +1 -1
  159. package/dist/commonjs/documents/DatabaseAccount.d.ts.map +1 -1
  160. package/dist/commonjs/documents/DatabaseAccount.js +3 -0
  161. package/dist/commonjs/documents/DatabaseAccount.js.map +1 -1
  162. package/dist/commonjs/documents/PartitionKeyDefinition.d.ts +1 -1
  163. package/dist/commonjs/documents/PartitionKeyDefinition.js.map +1 -1
  164. package/dist/commonjs/encryption/Cache/ProtectedDataEncryptionKeyCache.d.ts.map +1 -1
  165. package/dist/commonjs/encryption/Cache/ProtectedDataEncryptionKeyCache.js +2 -1
  166. package/dist/commonjs/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  167. package/dist/commonjs/encryption/EncryptionKeyStoreProvider.d.ts.map +1 -1
  168. package/dist/commonjs/encryption/EncryptionKeyStoreProvider.js +2 -1
  169. package/dist/commonjs/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  170. package/dist/commonjs/extractPartitionKey.d.ts.map +1 -1
  171. package/dist/commonjs/extractPartitionKey.js +33 -20
  172. package/dist/commonjs/extractPartitionKey.js.map +1 -1
  173. package/dist/commonjs/globalEndpointManager.d.ts +6 -0
  174. package/dist/commonjs/globalEndpointManager.d.ts.map +1 -1
  175. package/dist/commonjs/globalEndpointManager.js +10 -5
  176. package/dist/commonjs/globalEndpointManager.js.map +1 -1
  177. package/dist/commonjs/globalPartitionEndpointManager.d.ts +79 -0
  178. package/dist/commonjs/globalPartitionEndpointManager.d.ts.map +1 -0
  179. package/dist/commonjs/globalPartitionEndpointManager.js +282 -0
  180. package/dist/commonjs/globalPartitionEndpointManager.js.map +1 -0
  181. package/dist/commonjs/queryExecutionContext/Aggregators/index.d.ts.map +1 -1
  182. package/dist/commonjs/queryExecutionContext/Aggregators/index.js +1 -0
  183. package/dist/commonjs/queryExecutionContext/Aggregators/index.js.map +1 -1
  184. package/dist/commonjs/queryExecutionContext/documentProducer.d.ts +2 -3
  185. package/dist/commonjs/queryExecutionContext/documentProducer.d.ts.map +1 -1
  186. package/dist/commonjs/queryExecutionContext/documentProducer.js +15 -20
  187. package/dist/commonjs/queryExecutionContext/documentProducer.js.map +1 -1
  188. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.d.ts +3 -1
  189. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.d.ts.map +1 -1
  190. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.js +10 -2
  191. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  192. package/dist/commonjs/queryExecutionContext/parallelQueryExecutionContextBase.d.ts.map +1 -1
  193. package/dist/commonjs/queryExecutionContext/parallelQueryExecutionContextBase.js +2 -1
  194. package/dist/commonjs/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  195. package/dist/commonjs/queryIterator.d.ts.map +1 -1
  196. package/dist/commonjs/queryIterator.js +2 -3
  197. package/dist/commonjs/queryIterator.js.map +1 -1
  198. package/dist/commonjs/request/ErrorResponse.d.ts +1 -1
  199. package/dist/commonjs/request/ErrorResponse.d.ts.map +1 -1
  200. package/dist/commonjs/request/ErrorResponse.js.map +1 -1
  201. package/dist/commonjs/request/RequestContext.d.ts +5 -0
  202. package/dist/commonjs/request/RequestContext.d.ts.map +1 -1
  203. package/dist/commonjs/request/RequestContext.js.map +1 -1
  204. package/dist/commonjs/request/RequestHandler.d.ts.map +1 -1
  205. package/dist/commonjs/request/RequestHandler.js +12 -2
  206. package/dist/commonjs/request/RequestHandler.js.map +1 -1
  207. package/dist/commonjs/request/defaultAgent.js +4 -4
  208. package/dist/commonjs/request/defaultAgent.js.map +1 -1
  209. package/dist/commonjs/request/request.d.ts.map +1 -1
  210. package/dist/commonjs/request/request.js +3 -3
  211. package/dist/commonjs/request/request.js.map +1 -1
  212. package/dist/commonjs/retry/RetryPolicy.d.ts +2 -2
  213. package/dist/commonjs/retry/RetryPolicy.d.ts.map +1 -1
  214. package/dist/commonjs/retry/RetryPolicy.js.map +1 -1
  215. package/dist/commonjs/retry/defaultRetryPolicy.d.ts.map +1 -1
  216. package/dist/commonjs/retry/defaultRetryPolicy.js +3 -7
  217. package/dist/commonjs/retry/defaultRetryPolicy.js.map +1 -1
  218. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.d.ts +5 -3
  219. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.d.ts.map +1 -1
  220. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.js +9 -2
  221. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  222. package/dist/commonjs/retry/retryUtility.d.ts.map +1 -1
  223. package/dist/commonjs/retry/retryUtility.js +11 -5
  224. package/dist/commonjs/retry/retryUtility.js.map +1 -1
  225. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.d.ts +6 -3
  226. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.d.ts.map +1 -1
  227. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js +15 -7
  228. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  229. package/dist/commonjs/routing/partitionKeyRangeCache.d.ts.map +1 -1
  230. package/dist/commonjs/routing/partitionKeyRangeCache.js +11 -0
  231. package/dist/commonjs/routing/partitionKeyRangeCache.js.map +1 -1
  232. package/dist/commonjs/tsdoc-metadata.json +11 -11
  233. package/dist/commonjs/utils/checkURL.js +7 -0
  234. package/dist/commonjs/utils/checkURL.js.map +1 -1
  235. package/dist/commonjs/utils/hashing/hash.d.ts +2 -0
  236. package/dist/commonjs/utils/hashing/hash.d.ts.map +1 -1
  237. package/dist/commonjs/utils/hashing/hash.js +20 -0
  238. package/dist/commonjs/utils/hashing/hash.js.map +1 -1
  239. package/dist/commonjs/utils/time.d.ts +8 -0
  240. package/dist/commonjs/utils/time.d.ts.map +1 -1
  241. package/dist/commonjs/utils/time.js +20 -0
  242. package/dist/commonjs/utils/time.js.map +1 -1
  243. package/dist/esm/ClientContext.d.ts +19 -10
  244. package/dist/esm/ClientContext.d.ts.map +1 -1
  245. package/dist/esm/ClientContext.js +30 -11
  246. package/dist/esm/ClientContext.js.map +1 -1
  247. package/dist/esm/CosmosClient.d.ts.map +1 -1
  248. package/dist/esm/CosmosClient.js +13 -2
  249. package/dist/esm/CosmosClient.js.map +1 -1
  250. package/dist/esm/PartitionKeyRangeFailoverInfo.d.ts +49 -0
  251. package/dist/esm/PartitionKeyRangeFailoverInfo.d.ts.map +1 -0
  252. package/dist/esm/PartitionKeyRangeFailoverInfo.js +130 -0
  253. package/dist/esm/PartitionKeyRangeFailoverInfo.js.map +1 -0
  254. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  255. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js +4 -0
  256. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  257. package/dist/esm/client/ClientUtils.d.ts +3 -1
  258. package/dist/esm/client/ClientUtils.d.ts.map +1 -1
  259. package/dist/esm/client/ClientUtils.js +10 -0
  260. package/dist/esm/client/ClientUtils.js.map +1 -1
  261. package/dist/esm/client/Item/Item.d.ts.map +1 -1
  262. package/dist/esm/client/Item/Item.js +13 -0
  263. package/dist/esm/client/Item/Item.js.map +1 -1
  264. package/dist/esm/client/Item/Items.d.ts +1 -0
  265. package/dist/esm/client/Item/Items.d.ts.map +1 -1
  266. package/dist/esm/client/Item/Items.js +29 -3
  267. package/dist/esm/client/Item/Items.js.map +1 -1
  268. package/dist/esm/common/constants.d.ts +20 -0
  269. package/dist/esm/common/constants.d.ts.map +1 -1
  270. package/dist/esm/common/constants.js +23 -1
  271. package/dist/esm/common/constants.js.map +1 -1
  272. package/dist/esm/common/platform.d.ts +6 -1
  273. package/dist/esm/common/platform.d.ts.map +1 -1
  274. package/dist/esm/common/platform.js +23 -4
  275. package/dist/esm/common/platform.js.map +1 -1
  276. package/dist/esm/diagnostics/DiagnosticNodeInternal.d.ts +1 -0
  277. package/dist/esm/diagnostics/DiagnosticNodeInternal.d.ts.map +1 -1
  278. package/dist/esm/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  279. package/dist/esm/documents/ConnectionPolicy.d.ts +6 -0
  280. package/dist/esm/documents/ConnectionPolicy.d.ts.map +1 -1
  281. package/dist/esm/documents/ConnectionPolicy.js +2 -0
  282. package/dist/esm/documents/ConnectionPolicy.js.map +1 -1
  283. package/dist/esm/documents/DatabaseAccount.d.ts.map +1 -1
  284. package/dist/esm/documents/DatabaseAccount.js +3 -0
  285. package/dist/esm/documents/DatabaseAccount.js.map +1 -1
  286. package/dist/esm/documents/PartitionKeyDefinition.d.ts +1 -1
  287. package/dist/esm/documents/PartitionKeyDefinition.js.map +1 -1
  288. package/dist/esm/encryption/Cache/ProtectedDataEncryptionKeyCache.d.ts.map +1 -1
  289. package/dist/esm/encryption/Cache/ProtectedDataEncryptionKeyCache.js +2 -1
  290. package/dist/esm/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  291. package/dist/esm/encryption/EncryptionKeyStoreProvider.d.ts.map +1 -1
  292. package/dist/esm/encryption/EncryptionKeyStoreProvider.js +2 -1
  293. package/dist/esm/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  294. package/dist/esm/extractPartitionKey.d.ts.map +1 -1
  295. package/dist/esm/extractPartitionKey.js +33 -20
  296. package/dist/esm/extractPartitionKey.js.map +1 -1
  297. package/dist/esm/globalEndpointManager.d.ts +6 -0
  298. package/dist/esm/globalEndpointManager.d.ts.map +1 -1
  299. package/dist/esm/globalEndpointManager.js +9 -4
  300. package/dist/esm/globalEndpointManager.js.map +1 -1
  301. package/dist/esm/globalPartitionEndpointManager.d.ts +79 -0
  302. package/dist/esm/globalPartitionEndpointManager.d.ts.map +1 -0
  303. package/dist/esm/globalPartitionEndpointManager.js +278 -0
  304. package/dist/esm/globalPartitionEndpointManager.js.map +1 -0
  305. package/dist/esm/queryExecutionContext/Aggregators/index.d.ts.map +1 -1
  306. package/dist/esm/queryExecutionContext/Aggregators/index.js +1 -0
  307. package/dist/esm/queryExecutionContext/Aggregators/index.js.map +1 -1
  308. package/dist/esm/queryExecutionContext/documentProducer.d.ts +2 -3
  309. package/dist/esm/queryExecutionContext/documentProducer.d.ts.map +1 -1
  310. package/dist/esm/queryExecutionContext/documentProducer.js +16 -21
  311. package/dist/esm/queryExecutionContext/documentProducer.js.map +1 -1
  312. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.d.ts +3 -1
  313. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.d.ts.map +1 -1
  314. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.js +10 -2
  315. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  316. package/dist/esm/queryExecutionContext/parallelQueryExecutionContextBase.d.ts.map +1 -1
  317. package/dist/esm/queryExecutionContext/parallelQueryExecutionContextBase.js +2 -1
  318. package/dist/esm/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  319. package/dist/esm/queryIterator.d.ts.map +1 -1
  320. package/dist/esm/queryIterator.js +2 -3
  321. package/dist/esm/queryIterator.js.map +1 -1
  322. package/dist/esm/request/ErrorResponse.d.ts +1 -1
  323. package/dist/esm/request/ErrorResponse.d.ts.map +1 -1
  324. package/dist/esm/request/ErrorResponse.js.map +1 -1
  325. package/dist/esm/request/RequestContext.d.ts +5 -0
  326. package/dist/esm/request/RequestContext.d.ts.map +1 -1
  327. package/dist/esm/request/RequestContext.js.map +1 -1
  328. package/dist/esm/request/RequestHandler.d.ts.map +1 -1
  329. package/dist/esm/request/RequestHandler.js +14 -4
  330. package/dist/esm/request/RequestHandler.js.map +1 -1
  331. package/dist/esm/request/defaultAgent.js +2 -2
  332. package/dist/esm/request/defaultAgent.js.map +1 -1
  333. package/dist/esm/request/request.d.ts.map +1 -1
  334. package/dist/esm/request/request.js +3 -3
  335. package/dist/esm/request/request.js.map +1 -1
  336. package/dist/esm/retry/RetryPolicy.d.ts +2 -2
  337. package/dist/esm/retry/RetryPolicy.d.ts.map +1 -1
  338. package/dist/esm/retry/RetryPolicy.js.map +1 -1
  339. package/dist/esm/retry/defaultRetryPolicy.d.ts.map +1 -1
  340. package/dist/esm/retry/defaultRetryPolicy.js +4 -8
  341. package/dist/esm/retry/defaultRetryPolicy.js.map +1 -1
  342. package/dist/esm/retry/endpointDiscoveryRetryPolicy.d.ts +5 -3
  343. package/dist/esm/retry/endpointDiscoveryRetryPolicy.d.ts.map +1 -1
  344. package/dist/esm/retry/endpointDiscoveryRetryPolicy.js +9 -2
  345. package/dist/esm/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  346. package/dist/esm/retry/retryUtility.d.ts.map +1 -1
  347. package/dist/esm/retry/retryUtility.js +11 -5
  348. package/dist/esm/retry/retryUtility.js.map +1 -1
  349. package/dist/esm/retry/timeoutFailoverRetryPolicy.d.ts +6 -3
  350. package/dist/esm/retry/timeoutFailoverRetryPolicy.d.ts.map +1 -1
  351. package/dist/esm/retry/timeoutFailoverRetryPolicy.js +15 -7
  352. package/dist/esm/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  353. package/dist/esm/routing/partitionKeyRangeCache.d.ts.map +1 -1
  354. package/dist/esm/routing/partitionKeyRangeCache.js +11 -0
  355. package/dist/esm/routing/partitionKeyRangeCache.js.map +1 -1
  356. package/dist/esm/utils/checkURL.js +6 -0
  357. package/dist/esm/utils/checkURL.js.map +1 -1
  358. package/dist/esm/utils/hashing/hash.d.ts +2 -0
  359. package/dist/esm/utils/hashing/hash.d.ts.map +1 -1
  360. package/dist/esm/utils/hashing/hash.js +19 -0
  361. package/dist/esm/utils/hashing/hash.js.map +1 -1
  362. package/dist/esm/utils/time.d.ts +8 -0
  363. package/dist/esm/utils/time.d.ts.map +1 -1
  364. package/dist/esm/utils/time.js +19 -0
  365. package/dist/esm/utils/time.js.map +1 -1
  366. package/dist/react-native/ClientContext.d.ts +19 -10
  367. package/dist/react-native/ClientContext.d.ts.map +1 -1
  368. package/dist/react-native/ClientContext.js +30 -11
  369. package/dist/react-native/ClientContext.js.map +1 -1
  370. package/dist/react-native/CosmosClient.d.ts.map +1 -1
  371. package/dist/react-native/CosmosClient.js +13 -2
  372. package/dist/react-native/CosmosClient.js.map +1 -1
  373. package/dist/react-native/PartitionKeyRangeFailoverInfo.d.ts +49 -0
  374. package/dist/react-native/PartitionKeyRangeFailoverInfo.d.ts.map +1 -0
  375. package/dist/react-native/PartitionKeyRangeFailoverInfo.js +130 -0
  376. package/dist/react-native/PartitionKeyRangeFailoverInfo.js.map +1 -0
  377. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  378. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js +4 -0
  379. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  380. package/dist/react-native/client/ClientUtils.d.ts +3 -1
  381. package/dist/react-native/client/ClientUtils.d.ts.map +1 -1
  382. package/dist/react-native/client/ClientUtils.js +10 -0
  383. package/dist/react-native/client/ClientUtils.js.map +1 -1
  384. package/dist/react-native/client/Item/Item.d.ts.map +1 -1
  385. package/dist/react-native/client/Item/Item.js +13 -0
  386. package/dist/react-native/client/Item/Item.js.map +1 -1
  387. package/dist/react-native/client/Item/Items.d.ts +1 -0
  388. package/dist/react-native/client/Item/Items.d.ts.map +1 -1
  389. package/dist/react-native/client/Item/Items.js +29 -3
  390. package/dist/react-native/client/Item/Items.js.map +1 -1
  391. package/dist/react-native/common/constants.d.ts +20 -0
  392. package/dist/react-native/common/constants.d.ts.map +1 -1
  393. package/dist/react-native/common/constants.js +23 -1
  394. package/dist/react-native/common/constants.js.map +1 -1
  395. package/dist/react-native/common/platform.d.ts +6 -1
  396. package/dist/react-native/common/platform.d.ts.map +1 -1
  397. package/dist/react-native/common/platform.js +23 -4
  398. package/dist/react-native/common/platform.js.map +1 -1
  399. package/dist/react-native/diagnostics/DiagnosticNodeInternal.d.ts +1 -0
  400. package/dist/react-native/diagnostics/DiagnosticNodeInternal.d.ts.map +1 -1
  401. package/dist/react-native/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  402. package/dist/react-native/documents/ConnectionPolicy.d.ts +6 -0
  403. package/dist/react-native/documents/ConnectionPolicy.d.ts.map +1 -1
  404. package/dist/react-native/documents/ConnectionPolicy.js +2 -0
  405. package/dist/react-native/documents/ConnectionPolicy.js.map +1 -1
  406. package/dist/react-native/documents/DatabaseAccount.d.ts.map +1 -1
  407. package/dist/react-native/documents/DatabaseAccount.js +3 -0
  408. package/dist/react-native/documents/DatabaseAccount.js.map +1 -1
  409. package/dist/react-native/documents/PartitionKeyDefinition.d.ts +1 -1
  410. package/dist/react-native/documents/PartitionKeyDefinition.js.map +1 -1
  411. package/dist/react-native/encryption/Cache/ProtectedDataEncryptionKeyCache.d.ts.map +1 -1
  412. package/dist/react-native/encryption/Cache/ProtectedDataEncryptionKeyCache.js +2 -1
  413. package/dist/react-native/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  414. package/dist/react-native/encryption/EncryptionKeyStoreProvider.d.ts.map +1 -1
  415. package/dist/react-native/encryption/EncryptionKeyStoreProvider.js +2 -1
  416. package/dist/react-native/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  417. package/dist/react-native/extractPartitionKey.d.ts.map +1 -1
  418. package/dist/react-native/extractPartitionKey.js +33 -20
  419. package/dist/react-native/extractPartitionKey.js.map +1 -1
  420. package/dist/react-native/globalEndpointManager.d.ts +6 -0
  421. package/dist/react-native/globalEndpointManager.d.ts.map +1 -1
  422. package/dist/react-native/globalEndpointManager.js +9 -4
  423. package/dist/react-native/globalEndpointManager.js.map +1 -1
  424. package/dist/react-native/globalPartitionEndpointManager.d.ts +79 -0
  425. package/dist/react-native/globalPartitionEndpointManager.d.ts.map +1 -0
  426. package/dist/react-native/globalPartitionEndpointManager.js +278 -0
  427. package/dist/react-native/globalPartitionEndpointManager.js.map +1 -0
  428. package/dist/react-native/queryExecutionContext/Aggregators/index.d.ts.map +1 -1
  429. package/dist/react-native/queryExecutionContext/Aggregators/index.js +1 -0
  430. package/dist/react-native/queryExecutionContext/Aggregators/index.js.map +1 -1
  431. package/dist/react-native/queryExecutionContext/documentProducer.d.ts +2 -3
  432. package/dist/react-native/queryExecutionContext/documentProducer.d.ts.map +1 -1
  433. package/dist/react-native/queryExecutionContext/documentProducer.js +16 -21
  434. package/dist/react-native/queryExecutionContext/documentProducer.js.map +1 -1
  435. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.d.ts +3 -1
  436. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.d.ts.map +1 -1
  437. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.js +10 -2
  438. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  439. package/dist/react-native/queryExecutionContext/parallelQueryExecutionContextBase.d.ts.map +1 -1
  440. package/dist/react-native/queryExecutionContext/parallelQueryExecutionContextBase.js +2 -1
  441. package/dist/react-native/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  442. package/dist/react-native/queryIterator.d.ts.map +1 -1
  443. package/dist/react-native/queryIterator.js +2 -3
  444. package/dist/react-native/queryIterator.js.map +1 -1
  445. package/dist/react-native/request/ErrorResponse.d.ts +1 -1
  446. package/dist/react-native/request/ErrorResponse.d.ts.map +1 -1
  447. package/dist/react-native/request/ErrorResponse.js.map +1 -1
  448. package/dist/react-native/request/RequestContext.d.ts +5 -0
  449. package/dist/react-native/request/RequestContext.d.ts.map +1 -1
  450. package/dist/react-native/request/RequestContext.js.map +1 -1
  451. package/dist/react-native/request/RequestHandler.d.ts.map +1 -1
  452. package/dist/react-native/request/RequestHandler.js +14 -4
  453. package/dist/react-native/request/RequestHandler.js.map +1 -1
  454. package/dist/react-native/request/defaultAgent.js +2 -2
  455. package/dist/react-native/request/defaultAgent.js.map +1 -1
  456. package/dist/react-native/request/request.d.ts.map +1 -1
  457. package/dist/react-native/request/request.js +3 -3
  458. package/dist/react-native/request/request.js.map +1 -1
  459. package/dist/react-native/retry/RetryPolicy.d.ts +2 -2
  460. package/dist/react-native/retry/RetryPolicy.d.ts.map +1 -1
  461. package/dist/react-native/retry/RetryPolicy.js.map +1 -1
  462. package/dist/react-native/retry/defaultRetryPolicy.d.ts.map +1 -1
  463. package/dist/react-native/retry/defaultRetryPolicy.js +4 -8
  464. package/dist/react-native/retry/defaultRetryPolicy.js.map +1 -1
  465. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.d.ts +5 -3
  466. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.d.ts.map +1 -1
  467. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.js +9 -2
  468. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  469. package/dist/react-native/retry/retryUtility.d.ts.map +1 -1
  470. package/dist/react-native/retry/retryUtility.js +11 -5
  471. package/dist/react-native/retry/retryUtility.js.map +1 -1
  472. package/dist/react-native/retry/timeoutFailoverRetryPolicy.d.ts +6 -3
  473. package/dist/react-native/retry/timeoutFailoverRetryPolicy.d.ts.map +1 -1
  474. package/dist/react-native/retry/timeoutFailoverRetryPolicy.js +15 -7
  475. package/dist/react-native/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  476. package/dist/react-native/routing/partitionKeyRangeCache.d.ts.map +1 -1
  477. package/dist/react-native/routing/partitionKeyRangeCache.js +11 -0
  478. package/dist/react-native/routing/partitionKeyRangeCache.js.map +1 -1
  479. package/dist/react-native/utils/checkURL.js +6 -0
  480. package/dist/react-native/utils/checkURL.js.map +1 -1
  481. package/dist/react-native/utils/hashing/hash.d.ts +2 -0
  482. package/dist/react-native/utils/hashing/hash.d.ts.map +1 -1
  483. package/dist/react-native/utils/hashing/hash.js +19 -0
  484. package/dist/react-native/utils/hashing/hash.js.map +1 -1
  485. package/dist/react-native/utils/time.d.ts +8 -0
  486. package/dist/react-native/utils/time.d.ts.map +1 -1
  487. package/dist/react-native/utils/time.js +19 -0
  488. package/dist/react-native/utils/time.js.map +1 -1
  489. package/package.json +11 -11
@@ -10,9 +10,10 @@ class EndpointDiscoveryRetryPolicy {
10
10
  /**
11
11
  * @param globalEndpointManager - The GlobalEndpointManager instance.
12
12
  */
13
- constructor(globalEndpointManager, operationType) {
13
+ constructor(globalEndpointManager, operationType, globalPartitionEndpointManager) {
14
14
  this.globalEndpointManager = globalEndpointManager;
15
15
  this.operationType = operationType;
16
+ this.globalPartitionEndpointManager = globalPartitionEndpointManager;
16
17
  this.maxTries = EndpointDiscoveryRetryPolicy.maxTries;
17
18
  this.currentRetryAttemptCount = 0;
18
19
  this.retryAfterInMs = EndpointDiscoveryRetryPolicy.retryAfterInMs;
@@ -21,7 +22,7 @@ class EndpointDiscoveryRetryPolicy {
21
22
  * Determines whether the request should be retried or not.
22
23
  * @param err - Error returned by the request.
23
24
  */
24
- async shouldRetry(err, diagnosticNode, retryContext, locationEndpoint) {
25
+ async shouldRetry(err, diagnosticNode, retryContext, locationEndpoint, requestContext) {
25
26
  if (!err) {
26
27
  return false;
27
28
  }
@@ -31,6 +32,12 @@ class EndpointDiscoveryRetryPolicy {
31
32
  if (!this.globalEndpointManager.enableEndpointDiscovery) {
32
33
  return false;
33
34
  }
35
+ if (this.globalPartitionEndpointManager) {
36
+ const didFailover = await this.globalPartitionEndpointManager.tryPartitionLevelFailover(requestContext, diagnosticNode);
37
+ if (didFailover) {
38
+ return true;
39
+ }
40
+ }
34
41
  if (this.currentRetryAttemptCount >= this.maxTries) {
35
42
  return false;
36
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"endpointDiscoveryRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/endpointDiscoveryRetryPolicy.ts"],"names":[],"mappings":";;;AAIA,mDAAoD;AAMpD;;;GAGG;AACH,MAAa,4BAA4B;IAWvC;;OAEG;IACH,YACU,qBAA4C,EAC5C,aAA4B;QAD5B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,kBAAa,GAAb,aAAa,CAAe;QAEpC,IAAI,CAAC,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC;QACtD,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,4BAA4B,CAAC,cAAc,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC,EACtC,YAA2B,EAC3B,gBAAyB;QAEzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,IAAA,yBAAa,EAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,qBAAqB,CAAC,qCAAqC,CACpE,cAAc,EACd,gBAAgB,CACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,qBAAqB,CAAC,sCAAsC,CACrE,cAAc,EACd,gBAAgB,CACjB,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC;QACxD,YAAY,CAAC,6BAA6B,GAAG,KAAK,CAAC;QACnD,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC;QACtD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;;AApEH,oEAqEC;AA7DyB,qCAAQ,GAAG,GAAG,CAAC,CAAC,kBAAkB;AAClC,2CAAc,GAAG,IAAI,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { OperationType } from \"../common/index.js\";\nimport { isReadRequest } from \"../common/helper.js\";\nimport type { GlobalEndpointManager } from \"../globalEndpointManager.js\";\nimport type { ErrorResponse } from \"../request/index.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\n\n/**\n * This class implements the retry policy for endpoint discovery.\n * @hidden\n */\nexport class EndpointDiscoveryRetryPolicy implements RetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount: number;\n /** Retry interval in milliseconds. */\n public retryAfterInMs: number;\n\n /** Max number of retry attempts to perform. */\n private maxTries: number;\n private static readonly maxTries = 120; // TODO: Constant?\n private static readonly retryAfterInMs = 1000;\n\n /**\n * @param globalEndpointManager - The GlobalEndpointManager instance.\n */\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private operationType: OperationType,\n ) {\n this.maxTries = EndpointDiscoveryRetryPolicy.maxTries;\n this.currentRetryAttemptCount = 0;\n this.retryAfterInMs = EndpointDiscoveryRetryPolicy.retryAfterInMs;\n }\n\n /**\n * Determines whether the request should be retried or not.\n * @param err - Error returned by the request.\n */\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n locationEndpoint?: string,\n ): Promise<boolean | [boolean, string]> {\n if (!err) {\n return false;\n }\n\n if (!retryContext || !locationEndpoint) {\n return false;\n }\n\n if (!this.globalEndpointManager.enableEndpointDiscovery) {\n return false;\n }\n\n if (this.currentRetryAttemptCount >= this.maxTries) {\n return false;\n }\n\n this.currentRetryAttemptCount++;\n\n if (isReadRequest(this.operationType)) {\n await this.globalEndpointManager.markCurrentLocationUnavailableForRead(\n diagnosticNode,\n locationEndpoint,\n );\n } else {\n await this.globalEndpointManager.markCurrentLocationUnavailableForWrite(\n diagnosticNode,\n locationEndpoint,\n );\n }\n\n retryContext.retryCount = this.currentRetryAttemptCount;\n retryContext.clearSessionTokenNotAvailable = false;\n retryContext.retryRequestOnPreferredLocations = false;\n diagnosticNode.addData({ successfulRetryPolicy: \"endpointDiscovery\" });\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"endpointDiscoveryRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/endpointDiscoveryRetryPolicy.ts"],"names":[],"mappings":";;;AAIA,mDAAoD;AAOpD;;;GAGG;AACH,MAAa,4BAA4B;IAWvC;;OAEG;IACH,YACU,qBAA4C,EAC5C,aAA4B,EAC5B,8BAA+D;QAF/D,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,kBAAa,GAAb,aAAa,CAAe;QAC5B,mCAA8B,GAA9B,8BAA8B,CAAiC;QAEvE,IAAI,CAAC,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC;QACtD,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,4BAA4B,CAAC,cAAc,CAAC;IACpE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC,EACtC,YAA2B,EAC3B,gBAAyB,EACzB,cAA+B;QAE/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,8BAA8B,CAAC,yBAAyB,CACrF,cAAc,EACd,cAAc,CACf,CAAC;YACF,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAEhC,IAAI,IAAA,yBAAa,EAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,qBAAqB,CAAC,qCAAqC,CACpE,cAAc,EACd,gBAAgB,CACjB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,qBAAqB,CAAC,sCAAsC,CACrE,cAAc,EACd,gBAAgB,CACjB,CAAC;QACJ,CAAC;QAED,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC;QACxD,YAAY,CAAC,6BAA6B,GAAG,KAAK,CAAC;QACnD,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC;QACtD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;;AAhFH,oEAiFC;AAzEyB,qCAAQ,GAAG,GAAG,CAAC,CAAC,kBAAkB;AAClC,2CAAc,GAAG,IAAI,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { OperationType } from \"../common/index.js\";\nimport { isReadRequest } from \"../common/helper.js\";\nimport type { GlobalEndpointManager } from \"../globalEndpointManager.js\";\nimport type { ErrorResponse, RequestContext } from \"../request/index.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { GlobalPartitionEndpointManager } from \"../globalPartitionEndpointManager.js\";\n\n/**\n * This class implements the retry policy for endpoint discovery.\n * @hidden\n */\nexport class EndpointDiscoveryRetryPolicy implements RetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount: number;\n /** Retry interval in milliseconds. */\n public retryAfterInMs: number;\n\n /** Max number of retry attempts to perform. */\n private maxTries: number;\n private static readonly maxTries = 120; // TODO: Constant?\n private static readonly retryAfterInMs = 1000;\n\n /**\n * @param globalEndpointManager - The GlobalEndpointManager instance.\n */\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private operationType: OperationType,\n private globalPartitionEndpointManager?: GlobalPartitionEndpointManager,\n ) {\n this.maxTries = EndpointDiscoveryRetryPolicy.maxTries;\n this.currentRetryAttemptCount = 0;\n this.retryAfterInMs = EndpointDiscoveryRetryPolicy.retryAfterInMs;\n }\n\n /**\n * Determines whether the request should be retried or not.\n * @param err - Error returned by the request.\n */\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n locationEndpoint?: string,\n requestContext?: RequestContext,\n ): Promise<boolean | [boolean, string]> {\n if (!err) {\n return false;\n }\n\n if (!retryContext || !locationEndpoint) {\n return false;\n }\n\n if (!this.globalEndpointManager.enableEndpointDiscovery) {\n return false;\n }\n\n if (this.globalPartitionEndpointManager) {\n const didFailover = await this.globalPartitionEndpointManager.tryPartitionLevelFailover(\n requestContext,\n diagnosticNode,\n );\n if (didFailover) {\n return true;\n }\n }\n\n if (this.currentRetryAttemptCount >= this.maxTries) {\n return false;\n }\n\n this.currentRetryAttemptCount++;\n\n if (isReadRequest(this.operationType)) {\n await this.globalEndpointManager.markCurrentLocationUnavailableForRead(\n diagnosticNode,\n locationEndpoint,\n );\n } else {\n await this.globalEndpointManager.markCurrentLocationUnavailableForWrite(\n diagnosticNode,\n locationEndpoint,\n );\n }\n\n retryContext.retryCount = this.currentRetryAttemptCount;\n retryContext.clearSessionTokenNotAvailable = false;\n retryContext.retryRequestOnPreferredLocations = false;\n diagnosticNode.addData({ successfulRetryPolicy: \"endpointDiscovery\" });\n return true;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"retryUtility.d.ts","sourceRoot":"","sources":["../../../src/retry/retryUtility.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;GAEG;AACH,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,CACd,cAAc,EAAE,sBAAsB,EACtC,cAAc,EAAE,cAAc,KAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D,2BAA2B,EAAE,2BAA2B,CAAC;IACzD,sBAAsB,EAAE,kBAAkB,CAAC;IAC3C,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,0BAA0B,EAAE,0BAA0B,CAAC;CACxD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,EAC5B,cAAc,EACd,YAAgC,EAChC,aAAa,EACb,cAAc,EACd,cAAc,GACf,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAkItC"}
1
+ {"version":3,"file":"retryUtility.d.ts","sourceRoot":"","sources":["../../../src/retry/retryUtility.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;GAEG;AACH,UAAU,WAAW;IACnB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,cAAc,EAAE,sBAAsB,CAAC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,CACd,cAAc,EAAE,sBAAsB,EACtC,cAAc,EAAE,cAAc,KAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D,2BAA2B,EAAE,2BAA2B,CAAC;IACzD,sBAAsB,EAAE,kBAAkB,CAAC;IAC3C,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,0BAA0B,EAAE,0BAA0B,CAAC;CACxD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,EAC5B,cAAc,EACd,YAAgC,EAChC,aAAa,EACb,cAAc,EACd,cAAc,GACf,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAkJtC"}
@@ -25,11 +25,11 @@ async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retry
25
25
  localDiagnosticNode.addData({ requestAttempNumber: retryContext.retryCount });
26
26
  if (!retryPolicies) {
27
27
  retryPolicies = {
28
- endpointDiscoveryRetryPolicy: new endpointDiscoveryRetryPolicy_js_1.EndpointDiscoveryRetryPolicy(requestContext.globalEndpointManager, requestContext.operationType),
28
+ endpointDiscoveryRetryPolicy: new endpointDiscoveryRetryPolicy_js_1.EndpointDiscoveryRetryPolicy(requestContext.globalEndpointManager, requestContext.operationType, requestContext.globalPartitionEndpointManager),
29
29
  resourceThrottleRetryPolicy: new resourceThrottleRetryPolicy_js_1.ResourceThrottleRetryPolicy((_a = requestContext.connectionPolicy.retryOptions) !== null && _a !== void 0 ? _a : {}),
30
30
  sessionReadRetryPolicy: new sessionRetryPolicy_js_1.SessionRetryPolicy(requestContext.globalEndpointManager, requestContext.resourceType, requestContext.operationType, requestContext.connectionPolicy),
31
31
  defaultRetryPolicy: new defaultRetryPolicy_js_1.DefaultRetryPolicy(requestContext.operationType),
32
- timeoutFailoverRetryPolicy: new timeoutFailoverRetryPolicy_js_1.TimeoutFailoverRetryPolicy(requestContext.globalEndpointManager, requestContext.headers, requestContext.method, requestContext.resourceType, requestContext.operationType, requestContext.connectionPolicy.enableEndpointDiscovery),
32
+ timeoutFailoverRetryPolicy: new timeoutFailoverRetryPolicy_js_1.TimeoutFailoverRetryPolicy(requestContext.globalEndpointManager, requestContext.headers, requestContext.method, requestContext.resourceType, requestContext.operationType, requestContext.connectionPolicy.enableEndpointDiscovery, requestContext.connectionPolicy.enablePartitionLevelFailover, requestContext.globalPartitionEndpointManager),
33
33
  };
34
34
  }
35
35
  if (retryContext && retryContext.clearSessionTokenNotAvailable) {
@@ -44,6 +44,13 @@ async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retry
44
44
  }
45
45
  const startTimeUTCInMs = (0, time_js_1.getCurrentTimestampInMs)();
46
46
  const correlatedActivityId = requestContext.headers[constants_js_1.Constants.HttpHeaders.CorrelatedActivityId];
47
+ if (requestContext.globalPartitionEndpointManager) {
48
+ // Try partition level location override
49
+ // This is used to override the partition level location for the request
50
+ // if there has been a partition level failover
51
+ requestContext =
52
+ await requestContext.globalPartitionEndpointManager.tryAddPartitionLevelLocationOverride(requestContext, localDiagnosticNode);
53
+ }
47
54
  try {
48
55
  const response = await executeRequest(localDiagnosticNode, requestContext);
49
56
  response.headers[constants_js_1.Constants.ThrottleRetryCount] =
@@ -62,8 +69,7 @@ async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retry
62
69
  if (correlatedActivityId) {
63
70
  headers[constants_js_1.Constants.HttpHeaders.CorrelatedActivityId] = correlatedActivityId;
64
71
  }
65
- if (err.code === statusCodes_js_1.StatusCodes.ENOTFOUND ||
66
- err.code === "REQUEST_SEND_ERROR" ||
72
+ if (err.code === "REQUEST_SEND_ERROR" ||
67
73
  (err.code === statusCodes_js_1.StatusCodes.Forbidden &&
68
74
  (err.substatus === statusCodes_js_1.SubStatusCodes.DatabaseAccountNotFound ||
69
75
  err.substatus === statusCodes_js_1.SubStatusCodes.WriteForbidden))) {
@@ -82,7 +88,7 @@ async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retry
82
88
  else {
83
89
  retryPolicy = retryPolicies.defaultRetryPolicy;
84
90
  }
85
- const results = await retryPolicy.shouldRetry(err, localDiagnosticNode, retryContext, requestContext.endpoint);
91
+ const results = await retryPolicy.shouldRetry(err, localDiagnosticNode, retryContext, requestContext.endpoint, requestContext);
86
92
  if (!results) {
87
93
  headers[constants_js_1.Constants.ThrottleRetryCount] =
88
94
  retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;
@@ -1 +1 @@
1
- {"version":3,"file":"retryUtility.js","sourceRoot":"","sources":["../../../src/retry/retryUtility.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { Constants } from \"../common/constants.js\";\nimport { sleep } from \"../common/helper.js\";\nimport { StatusCodes, SubStatusCodes } from \"../common/statusCodes.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { DiagnosticNodeType } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { Response } from \"../request/index.js\";\nimport type { RequestContext } from \"../request/RequestContext.js\";\nimport { TimeoutErrorCode } from \"../request/TimeoutError.js\";\nimport { addDiagnosticChild } from \"../utils/diagnostics.js\";\nimport { getCurrentTimestampInMs } from \"../utils/time.js\";\nimport { DefaultRetryPolicy } from \"./defaultRetryPolicy.js\";\nimport { EndpointDiscoveryRetryPolicy } from \"./endpointDiscoveryRetryPolicy.js\";\nimport { ResourceThrottleRetryPolicy } from \"./resourceThrottleRetryPolicy.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { SessionRetryPolicy } from \"./sessionRetryPolicy.js\";\nimport { TimeoutFailoverRetryPolicy } from \"./timeoutFailoverRetryPolicy.js\";\n\n/**\n * @hidden\n */\ninterface ExecuteArgs {\n retryContext?: RetryContext;\n diagnosticNode: DiagnosticNodeInternal;\n retryPolicies?: RetryPolicies;\n requestContext: RequestContext;\n executeRequest: (\n diagnosticNode: DiagnosticNodeInternal,\n requestContext: RequestContext,\n ) => Promise<Response<any>>;\n}\n\n/**\n * @hidden\n */\ninterface RetryPolicies {\n endpointDiscoveryRetryPolicy: EndpointDiscoveryRetryPolicy;\n resourceThrottleRetryPolicy: ResourceThrottleRetryPolicy;\n sessionReadRetryPolicy: SessionRetryPolicy;\n defaultRetryPolicy: DefaultRetryPolicy;\n timeoutFailoverRetryPolicy: TimeoutFailoverRetryPolicy;\n}\n\n/**\n * @hidden\n */\nexport async function execute({\n diagnosticNode,\n retryContext = { retryCount: 0 },\n retryPolicies,\n requestContext,\n executeRequest,\n}: ExecuteArgs): Promise<Response<any>> {\n // TODO: any response\n return addDiagnosticChild(\n async (localDiagnosticNode: DiagnosticNodeInternal) => {\n localDiagnosticNode.addData({ requestAttempNumber: retryContext.retryCount });\n if (!retryPolicies) {\n retryPolicies = {\n endpointDiscoveryRetryPolicy: new EndpointDiscoveryRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.operationType,\n ),\n resourceThrottleRetryPolicy: new ResourceThrottleRetryPolicy(\n requestContext.connectionPolicy.retryOptions ?? {},\n ),\n sessionReadRetryPolicy: new SessionRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.resourceType,\n requestContext.operationType,\n requestContext.connectionPolicy,\n ),\n defaultRetryPolicy: new DefaultRetryPolicy(requestContext.operationType),\n timeoutFailoverRetryPolicy: new TimeoutFailoverRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.headers,\n requestContext.method,\n requestContext.resourceType,\n requestContext.operationType,\n requestContext.connectionPolicy.enableEndpointDiscovery,\n ),\n };\n }\n if (retryContext && retryContext.clearSessionTokenNotAvailable) {\n requestContext.client.clearSessionToken(requestContext.path);\n delete requestContext.headers[\"x-ms-session-token\"];\n }\n if (retryContext && retryContext.retryLocationServerIndex) {\n requestContext.endpoint = await requestContext.globalEndpointManager.resolveServiceEndpoint(\n localDiagnosticNode,\n requestContext.resourceType,\n requestContext.operationType,\n retryContext.retryLocationServerIndex,\n );\n } else {\n requestContext.endpoint = await requestContext.globalEndpointManager.resolveServiceEndpoint(\n localDiagnosticNode,\n requestContext.resourceType,\n requestContext.operationType,\n );\n }\n const startTimeUTCInMs = getCurrentTimestampInMs();\n const correlatedActivityId =\n requestContext.headers[Constants.HttpHeaders.CorrelatedActivityId];\n try {\n const response = await executeRequest(localDiagnosticNode, requestContext);\n response.headers[Constants.ThrottleRetryCount] =\n retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;\n response.headers[Constants.ThrottleRetryWaitTimeInMs] =\n retryPolicies.resourceThrottleRetryPolicy.cummulativeWaitTimeinMs;\n if (correlatedActivityId) {\n response.headers[Constants.HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n return response;\n } catch (err: any) {\n // TODO: any error\n let retryPolicy: RetryPolicy = null;\n const headers = err.headers || {};\n if (correlatedActivityId) {\n headers[Constants.HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n if (\n err.code === StatusCodes.ENOTFOUND ||\n err.code === \"REQUEST_SEND_ERROR\" ||\n (err.code === StatusCodes.Forbidden &&\n (err.substatus === SubStatusCodes.DatabaseAccountNotFound ||\n err.substatus === SubStatusCodes.WriteForbidden))\n ) {\n retryPolicy = retryPolicies.endpointDiscoveryRetryPolicy;\n } else if (err.code === StatusCodes.TooManyRequests && !isBulkRequest(requestContext)) {\n retryPolicy = retryPolicies.resourceThrottleRetryPolicy;\n } else if (\n err.code === StatusCodes.NotFound &&\n err.substatus === SubStatusCodes.ReadSessionNotAvailable\n ) {\n retryPolicy = retryPolicies.sessionReadRetryPolicy;\n } else if (err.code === StatusCodes.ServiceUnavailable || err.code === TimeoutErrorCode) {\n retryPolicy = retryPolicies.timeoutFailoverRetryPolicy;\n } else {\n retryPolicy = retryPolicies.defaultRetryPolicy;\n }\n const results = await retryPolicy.shouldRetry(\n err,\n localDiagnosticNode,\n retryContext,\n requestContext.endpoint,\n );\n if (!results) {\n headers[Constants.ThrottleRetryCount] =\n retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;\n headers[Constants.ThrottleRetryWaitTimeInMs] =\n retryPolicies.resourceThrottleRetryPolicy.cummulativeWaitTimeinMs;\n err.headers = { ...err.headers, ...headers };\n throw err;\n } else {\n requestContext.retryCount++;\n const newUrl = (results as any)[1]; // TODO: any hack\n if (newUrl !== undefined) {\n requestContext.endpoint = newUrl;\n }\n localDiagnosticNode.recordFailedNetworkCall(\n startTimeUTCInMs,\n requestContext,\n retryContext.retryCount,\n err.code,\n err.subsstatusCode,\n headers,\n );\n await sleep(retryPolicy.retryAfterInMs);\n return execute({\n diagnosticNode,\n executeRequest,\n requestContext,\n retryContext,\n retryPolicies,\n });\n }\n }\n },\n diagnosticNode,\n DiagnosticNodeType.HTTP_REQUEST,\n );\n}\n\n/**\n * @hidden\n */\nfunction isBulkRequest(requestContext: RequestContext): boolean {\n return (\n requestContext.operationType === \"batch\" &&\n !requestContext.headers[Constants.HttpHeaders.IsBatchAtomic]\n );\n}\n"]}
1
+ {"version":3,"file":"retryUtility.js","sourceRoot":"","sources":["../../../src/retry/retryUtility.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { Constants } from \"../common/constants.js\";\nimport { sleep } from \"../common/helper.js\";\nimport { StatusCodes, SubStatusCodes } from \"../common/statusCodes.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { DiagnosticNodeType } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { Response } from \"../request/index.js\";\nimport type { RequestContext } from \"../request/RequestContext.js\";\nimport { TimeoutErrorCode } from \"../request/TimeoutError.js\";\nimport { addDiagnosticChild } from \"../utils/diagnostics.js\";\nimport { getCurrentTimestampInMs } from \"../utils/time.js\";\nimport { DefaultRetryPolicy } from \"./defaultRetryPolicy.js\";\nimport { EndpointDiscoveryRetryPolicy } from \"./endpointDiscoveryRetryPolicy.js\";\nimport { ResourceThrottleRetryPolicy } from \"./resourceThrottleRetryPolicy.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { SessionRetryPolicy } from \"./sessionRetryPolicy.js\";\nimport { TimeoutFailoverRetryPolicy } from \"./timeoutFailoverRetryPolicy.js\";\n\n/**\n * @hidden\n */\ninterface ExecuteArgs {\n retryContext?: RetryContext;\n diagnosticNode: DiagnosticNodeInternal;\n retryPolicies?: RetryPolicies;\n requestContext: RequestContext;\n executeRequest: (\n diagnosticNode: DiagnosticNodeInternal,\n requestContext: RequestContext,\n ) => Promise<Response<any>>;\n}\n\n/**\n * @hidden\n */\ninterface RetryPolicies {\n endpointDiscoveryRetryPolicy: EndpointDiscoveryRetryPolicy;\n resourceThrottleRetryPolicy: ResourceThrottleRetryPolicy;\n sessionReadRetryPolicy: SessionRetryPolicy;\n defaultRetryPolicy: DefaultRetryPolicy;\n timeoutFailoverRetryPolicy: TimeoutFailoverRetryPolicy;\n}\n\n/**\n * @hidden\n */\nexport async function execute({\n diagnosticNode,\n retryContext = { retryCount: 0 },\n retryPolicies,\n requestContext,\n executeRequest,\n}: ExecuteArgs): Promise<Response<any>> {\n // TODO: any response\n return addDiagnosticChild(\n async (localDiagnosticNode: DiagnosticNodeInternal) => {\n localDiagnosticNode.addData({ requestAttempNumber: retryContext.retryCount });\n if (!retryPolicies) {\n retryPolicies = {\n endpointDiscoveryRetryPolicy: new EndpointDiscoveryRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.operationType,\n requestContext.globalPartitionEndpointManager,\n ),\n resourceThrottleRetryPolicy: new ResourceThrottleRetryPolicy(\n requestContext.connectionPolicy.retryOptions ?? {},\n ),\n sessionReadRetryPolicy: new SessionRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.resourceType,\n requestContext.operationType,\n requestContext.connectionPolicy,\n ),\n defaultRetryPolicy: new DefaultRetryPolicy(requestContext.operationType),\n timeoutFailoverRetryPolicy: new TimeoutFailoverRetryPolicy(\n requestContext.globalEndpointManager,\n requestContext.headers,\n requestContext.method,\n requestContext.resourceType,\n requestContext.operationType,\n requestContext.connectionPolicy.enableEndpointDiscovery,\n requestContext.connectionPolicy.enablePartitionLevelFailover,\n requestContext.globalPartitionEndpointManager,\n ),\n };\n }\n if (retryContext && retryContext.clearSessionTokenNotAvailable) {\n requestContext.client.clearSessionToken(requestContext.path);\n delete requestContext.headers[\"x-ms-session-token\"];\n }\n if (retryContext && retryContext.retryLocationServerIndex) {\n requestContext.endpoint = await requestContext.globalEndpointManager.resolveServiceEndpoint(\n localDiagnosticNode,\n requestContext.resourceType,\n requestContext.operationType,\n retryContext.retryLocationServerIndex,\n );\n } else {\n requestContext.endpoint = await requestContext.globalEndpointManager.resolveServiceEndpoint(\n localDiagnosticNode,\n requestContext.resourceType,\n requestContext.operationType,\n );\n }\n const startTimeUTCInMs = getCurrentTimestampInMs();\n const correlatedActivityId =\n requestContext.headers[Constants.HttpHeaders.CorrelatedActivityId];\n\n if (requestContext.globalPartitionEndpointManager) {\n // Try partition level location override\n // This is used to override the partition level location for the request\n // if there has been a partition level failover\n requestContext =\n await requestContext.globalPartitionEndpointManager.tryAddPartitionLevelLocationOverride(\n requestContext,\n localDiagnosticNode,\n );\n }\n\n try {\n const response = await executeRequest(localDiagnosticNode, requestContext);\n response.headers[Constants.ThrottleRetryCount] =\n retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;\n response.headers[Constants.ThrottleRetryWaitTimeInMs] =\n retryPolicies.resourceThrottleRetryPolicy.cummulativeWaitTimeinMs;\n if (correlatedActivityId) {\n response.headers[Constants.HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n return response;\n } catch (err: any) {\n // TODO: any error\n let retryPolicy: RetryPolicy = null;\n const headers = err.headers || {};\n if (correlatedActivityId) {\n headers[Constants.HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n\n if (\n err.code === \"REQUEST_SEND_ERROR\" ||\n (err.code === StatusCodes.Forbidden &&\n (err.substatus === SubStatusCodes.DatabaseAccountNotFound ||\n err.substatus === SubStatusCodes.WriteForbidden))\n ) {\n retryPolicy = retryPolicies.endpointDiscoveryRetryPolicy;\n } else if (err.code === StatusCodes.TooManyRequests && !isBulkRequest(requestContext)) {\n retryPolicy = retryPolicies.resourceThrottleRetryPolicy;\n } else if (\n err.code === StatusCodes.NotFound &&\n err.substatus === SubStatusCodes.ReadSessionNotAvailable\n ) {\n retryPolicy = retryPolicies.sessionReadRetryPolicy;\n } else if (err.code === StatusCodes.ServiceUnavailable || err.code === TimeoutErrorCode) {\n retryPolicy = retryPolicies.timeoutFailoverRetryPolicy;\n } else {\n retryPolicy = retryPolicies.defaultRetryPolicy;\n }\n const results = await retryPolicy.shouldRetry(\n err,\n localDiagnosticNode,\n retryContext,\n requestContext.endpoint,\n requestContext,\n );\n if (!results) {\n headers[Constants.ThrottleRetryCount] =\n retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;\n headers[Constants.ThrottleRetryWaitTimeInMs] =\n retryPolicies.resourceThrottleRetryPolicy.cummulativeWaitTimeinMs;\n err.headers = { ...err.headers, ...headers };\n throw err;\n } else {\n requestContext.retryCount++;\n const newUrl = (results as any)[1]; // TODO: any hack\n if (newUrl !== undefined) {\n requestContext.endpoint = newUrl;\n }\n localDiagnosticNode.recordFailedNetworkCall(\n startTimeUTCInMs,\n requestContext,\n retryContext.retryCount,\n err.code,\n err.subsstatusCode,\n headers,\n );\n await sleep(retryPolicy.retryAfterInMs);\n return execute({\n diagnosticNode,\n executeRequest,\n requestContext,\n retryContext,\n retryPolicies,\n });\n }\n }\n },\n diagnosticNode,\n DiagnosticNodeType.HTTP_REQUEST,\n );\n}\n\n/**\n * @hidden\n */\nfunction isBulkRequest(requestContext: RequestContext): boolean {\n return (\n requestContext.operationType === \"batch\" &&\n !requestContext.headers[Constants.HttpHeaders.IsBatchAtomic]\n );\n}\n"]}
@@ -4,8 +4,9 @@ import { HTTPMethod } from "../common/index.js";
4
4
  import type { OperationType, ResourceType } from "../common/constants.js";
5
5
  import type { RetryContext } from "./RetryContext.js";
6
6
  import type { CosmosHeaders } from "../queryExecutionContext/CosmosHeaders.js";
7
- import type { ErrorResponse } from "../request/index.js";
7
+ import type { ErrorResponse, RequestContext } from "../request/index.js";
8
8
  import type { DiagnosticNodeInternal } from "../diagnostics/DiagnosticNodeInternal.js";
9
+ import { GlobalPartitionEndpointManager } from "../globalPartitionEndpointManager.js";
9
10
  /**
10
11
  * This class TimeoutFailoverRetryPolicy handles retries for read operations
11
12
  * (including data plane,metadata, and query plan) in case of request timeouts
@@ -20,20 +21,22 @@ export declare class TimeoutFailoverRetryPolicy implements RetryPolicy {
20
21
  private resourceType;
21
22
  private operationType;
22
23
  private enableEndPointDiscovery;
24
+ private enablePartitionLevelFailover;
25
+ private globalPartitionEndpointManager?;
23
26
  private maxRetryAttemptCount;
24
27
  private maxServiceUnavailableRetryCount;
25
28
  retryAfterInMs: number;
26
29
  failoverRetryCount: number;
27
30
  request: any;
28
31
  locationEndpoint: any;
29
- constructor(globalEndpointManager: GlobalEndpointManager, headers: CosmosHeaders, methodType: HTTPMethod, resourceType: ResourceType, operationType: OperationType, enableEndPointDiscovery: boolean);
32
+ constructor(globalEndpointManager: GlobalEndpointManager, headers: CosmosHeaders, methodType: HTTPMethod, resourceType: ResourceType, operationType: OperationType, enableEndPointDiscovery: boolean, enablePartitionLevelFailover: boolean, globalPartitionEndpointManager?: GlobalPartitionEndpointManager);
30
33
  /**
31
34
  * Checks if a timeout request is valid for the timeout failover retry policy.
32
35
  * A valid request should be a data plane, metadata, or query plan request.
33
36
  * @returns
34
37
  */
35
38
  private isValidRequestForTimeoutError;
36
- shouldRetry(err: ErrorResponse, diagnosticNode: DiagnosticNodeInternal, retryContext?: RetryContext, locationEndpoint?: string): Promise<boolean>;
39
+ shouldRetry(err: ErrorResponse, diagnosticNode: DiagnosticNodeInternal, retryContext?: RetryContext, locationEndpoint?: string, requestContext?: RequestContext): Promise<boolean>;
37
40
  /**
38
41
  * Determines index of endpoint to be used for retry based upon failoverRetryCount and avalable locations
39
42
  * @param failoverRetryCount - count of failovers
@@ -1 +1 @@
1
- {"version":3,"file":"timeoutFailoverRetryPolicy.d.ts","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAEvF;;;;;;GAMG;AACH,qBAAa,0BAA2B,YAAW,WAAW;IAS1D,OAAO,CAAC,qBAAqB;IAC7B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,uBAAuB;IAbjC,OAAO,CAAC,oBAAoB,CAAO;IACnC,OAAO,CAAC,+BAA+B,CAAK;IACrC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,gBAAgB,EAAE,GAAG,CAAC;gBAGnB,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,uBAAuB,EAAE,OAAO;IAG1C;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IASxB,WAAW,CACtB,GAAG,EAAE,aAAa,EAClB,cAAc,EAAE,sBAAsB,EACtC,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC;IAyCnB;;;;OAIG;YACW,iBAAiB;CAyBhC"}
1
+ {"version":3,"file":"timeoutFailoverRetryPolicy.d.ts","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,UAAU,EAAiB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAEtF;;;;;;GAMG;AACH,qBAAa,0BAA2B,YAAW,WAAW;IAS1D,OAAO,CAAC,qBAAqB;IAC7B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,uBAAuB;IAC/B,OAAO,CAAC,4BAA4B;IACpC,OAAO,CAAC,8BAA8B,CAAC;IAfzC,OAAO,CAAC,oBAAoB,CAAO;IACnC,OAAO,CAAC,+BAA+B,CAAK;IACrC,cAAc,SAAK;IACnB,kBAAkB,SAAK;IACvB,OAAO,EAAE,GAAG,CAAC;IACb,gBAAgB,EAAE,GAAG,CAAC;gBAGnB,qBAAqB,EAAE,qBAAqB,EAC5C,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,uBAAuB,EAAE,OAAO,EAChC,4BAA4B,EAAE,OAAO,EACrC,8BAA8B,CAAC,EAAE,8BAA8B;IAGzE;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;IASxB,WAAW,CACtB,GAAG,EAAE,aAAa,EAClB,cAAc,EAAE,sBAAsB,EACtC,YAAY,CAAC,EAAE,YAAY,EAC3B,gBAAgB,CAAC,EAAE,MAAM,EACzB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,OAAO,CAAC;IAkDnB;;;;OAIG;YACW,iBAAiB;CAyBhC"}
@@ -13,13 +13,15 @@ const TimeoutError_js_1 = require("../request/TimeoutError.js");
13
13
  * @hidden
14
14
  */
15
15
  class TimeoutFailoverRetryPolicy {
16
- constructor(globalEndpointManager, headers, methodType, resourceType, operationType, enableEndPointDiscovery) {
16
+ constructor(globalEndpointManager, headers, methodType, resourceType, operationType, enableEndPointDiscovery, enablePartitionLevelFailover, globalPartitionEndpointManager) {
17
17
  this.globalEndpointManager = globalEndpointManager;
18
18
  this.headers = headers;
19
19
  this.methodType = methodType;
20
20
  this.resourceType = resourceType;
21
21
  this.operationType = operationType;
22
22
  this.enableEndPointDiscovery = enableEndPointDiscovery;
23
+ this.enablePartitionLevelFailover = enablePartitionLevelFailover;
24
+ this.globalPartitionEndpointManager = globalPartitionEndpointManager;
23
25
  this.maxRetryAttemptCount = 120;
24
26
  this.maxServiceUnavailableRetryCount = 1;
25
27
  this.retryAfterInMs = 0;
@@ -38,18 +40,23 @@ class TimeoutFailoverRetryPolicy {
38
40
  }
39
41
  return false;
40
42
  }
41
- async shouldRetry(err, diagnosticNode, retryContext, locationEndpoint) {
43
+ async shouldRetry(err, diagnosticNode, retryContext, locationEndpoint, requestContext) {
42
44
  if (!err) {
43
45
  return false;
44
46
  }
45
47
  if (!retryContext || !locationEndpoint) {
46
48
  return false;
47
49
  }
48
- // Check if the error is a timeout error (TimeoutErrorCode) and if it is not a valid HTTP network timeout request
49
- if (err.code === TimeoutError_js_1.TimeoutErrorCode && !this.isValidRequestForTimeoutError()) {
50
+ if (!this.enableEndPointDiscovery) {
50
51
  return false;
51
52
  }
52
- if (!this.enableEndPointDiscovery) {
53
+ // Mark the partition as unavailable.
54
+ // Let the Retry logic decide if the request should be retried
55
+ if (requestContext && this.globalPartitionEndpointManager) {
56
+ await this.globalPartitionEndpointManager.tryPartitionLevelFailover(requestContext, diagnosticNode);
57
+ }
58
+ // Check if the error is a timeout error (TimeoutErrorCode) and if it is not a valid HTTP network timeout request
59
+ if (err.code === TimeoutError_js_1.TimeoutErrorCode && !this.isValidRequestForTimeoutError()) {
53
60
  return false;
54
61
  }
55
62
  if (err.code === statusCodes_js_1.StatusCodes.ServiceUnavailable &&
@@ -61,8 +68,9 @@ class TimeoutFailoverRetryPolicy {
61
68
  }
62
69
  const canUseMultipleWriteLocations = this.globalEndpointManager.canUseMultipleWriteLocations(this.resourceType, this.operationType);
63
70
  const readRequest = (0, index_js_1.isReadRequest)(this.operationType);
64
- if (!canUseMultipleWriteLocations && !readRequest) {
65
- // Write requests on single master cannot be retried, no other regions available
71
+ if (!canUseMultipleWriteLocations && !readRequest && !this.enablePartitionLevelFailover) {
72
+ // Write requests on single master cannot be retried if partition level failover is disabled.
73
+ // This means there are no other regions available to serve the writes.
66
74
  return false;
67
75
  }
68
76
  this.failoverRetryCount++;
@@ -1 +1 @@
1
- {"version":3,"file":"timeoutFailoverRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { StatusCodes } from \"../common/statusCodes.js\";\nimport type { GlobalEndpointManager } from \"../globalEndpointManager.js\";\nimport { HTTPMethod, isReadRequest } from \"../common/index.js\";\nimport type { OperationType, ResourceType } from \"../common/constants.js\";\nimport { Constants } from \"../common/constants.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { CosmosHeaders } from \"../queryExecutionContext/CosmosHeaders.js\";\nimport { TimeoutErrorCode } from \"../request/TimeoutError.js\";\nimport type { ErrorResponse } from \"../request/index.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\n\n/**\n * This class TimeoutFailoverRetryPolicy handles retries for read operations\n * (including data plane,metadata, and query plan) in case of request timeouts\n * (TimeoutError) or service unavailability (503 status code) by performing failover\n * and retrying on other regions.\n * @hidden\n */\nexport class TimeoutFailoverRetryPolicy implements RetryPolicy {\n private maxRetryAttemptCount = 120;\n private maxServiceUnavailableRetryCount = 1;\n public retryAfterInMs = 0;\n public failoverRetryCount = 0;\n public request: any;\n public locationEndpoint: any;\n\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private headers: CosmosHeaders,\n private methodType: HTTPMethod,\n private resourceType: ResourceType,\n private operationType: OperationType,\n private enableEndPointDiscovery: boolean,\n ) {}\n\n /**\n * Checks if a timeout request is valid for the timeout failover retry policy.\n * A valid request should be a data plane, metadata, or query plan request.\n * @returns\n */\n private isValidRequestForTimeoutError(): boolean {\n const isQuery = Constants.HttpHeaders.IsQuery in this.headers;\n const isQueryPlan = Constants.HttpHeaders.IsQueryPlan in this.headers;\n if (this.methodType === HTTPMethod.get || isQuery || isQueryPlan) {\n return true;\n }\n return false;\n }\n\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n locationEndpoint?: string,\n ): Promise<boolean> {\n if (!err) {\n return false;\n }\n if (!retryContext || !locationEndpoint) {\n return false;\n }\n // Check if the error is a timeout error (TimeoutErrorCode) and if it is not a valid HTTP network timeout request\n if (err.code === TimeoutErrorCode && !this.isValidRequestForTimeoutError()) {\n return false;\n }\n if (!this.enableEndPointDiscovery) {\n return false;\n }\n if (\n err.code === StatusCodes.ServiceUnavailable &&\n this.failoverRetryCount >= this.maxServiceUnavailableRetryCount\n ) {\n return false;\n }\n if (this.failoverRetryCount >= this.maxRetryAttemptCount) {\n return false;\n }\n const canUseMultipleWriteLocations = this.globalEndpointManager.canUseMultipleWriteLocations(\n this.resourceType,\n this.operationType,\n );\n const readRequest = isReadRequest(this.operationType);\n\n if (!canUseMultipleWriteLocations && !readRequest) {\n // Write requests on single master cannot be retried, no other regions available\n return false;\n }\n this.failoverRetryCount++;\n // Setting the retryLocationIndex to the next available location for retry.\n // The retryLocationIndex is determined based on the failoverRetryCount, starting from zero.\n retryContext.retryLocationServerIndex = await this.findEndpointIndex(this.failoverRetryCount);\n diagnosticNode.addData({ successfulRetryPolicy: \"timeout-failover\" });\n return true;\n }\n\n /**\n * Determines index of endpoint to be used for retry based upon failoverRetryCount and avalable locations\n * @param failoverRetryCount - count of failovers\n * @returns\n */\n private async findEndpointIndex(failoverRetryCount: number): Promise<number> {\n // count of preferred locations specified by user\n const preferredLocationsCount = this.globalEndpointManager.preferredLocationsCount;\n const readRequest = isReadRequest(this.operationType);\n let endpointIndex = 0;\n // If preferredLocationsCount is not zero, it indicates that the user has specified preferred locations.\n if (preferredLocationsCount !== 0) {\n // The endpointIndex is set based on the preferred location and the failover retry count.\n endpointIndex = failoverRetryCount % preferredLocationsCount;\n } else {\n // In the absence of preferred locations, the endpoint selection is based on the failover count and the number of available locations.\n if (readRequest) {\n const getReadEndpoints = await this.globalEndpointManager.getReadEndpoints();\n if (getReadEndpoints && getReadEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getReadEndpoints.length;\n }\n } else {\n const getWriteEndpoints = await this.globalEndpointManager.getWriteEndpoints();\n if (getWriteEndpoints && getWriteEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getWriteEndpoints.length;\n }\n }\n }\n return endpointIndex;\n }\n}\n"]}
1
+ {"version":3,"file":"timeoutFailoverRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":";;;AAGA,6DAAuD;AAEvD,iDAA+D;AAE/D,yDAAmD;AAGnD,gEAA8D;AAK9D;;;;;;GAMG;AACH,MAAa,0BAA0B;IAQrC,YACU,qBAA4C,EAC5C,OAAsB,EACtB,UAAsB,EACtB,YAA0B,EAC1B,aAA4B,EAC5B,uBAAgC,EAChC,4BAAqC,EACrC,8BAA+D;QAP/D,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,YAAO,GAAP,OAAO,CAAe;QACtB,eAAU,GAAV,UAAU,CAAY;QACtB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,4BAAuB,GAAvB,uBAAuB,CAAS;QAChC,iCAA4B,GAA5B,4BAA4B,CAAS;QACrC,mCAA8B,GAA9B,8BAA8B,CAAiC;QAfjE,yBAAoB,GAAG,GAAG,CAAC;QAC3B,oCAA+B,GAAG,CAAC,CAAC;QACrC,mBAAc,GAAG,CAAC,CAAC;QACnB,uBAAkB,GAAG,CAAC,CAAC;IAa3B,CAAC;IAEJ;;;;OAIG;IACK,6BAA6B;QACnC,MAAM,OAAO,GAAG,wBAAS,CAAC,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC9D,MAAM,WAAW,GAAG,wBAAS,CAAC,WAAW,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC;QACtE,IAAI,IAAI,CAAC,UAAU,KAAK,qBAAU,CAAC,GAAG,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC,EACtC,YAA2B,EAC3B,gBAAyB,EACzB,cAA+B;QAE/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,qCAAqC;QACrC,8DAA8D;QAC9D,IAAI,cAAc,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YAC1D,MAAM,IAAI,CAAC,8BAA8B,CAAC,yBAAyB,CACjE,cAAc,EACd,cAAc,CACf,CAAC;QACJ,CAAC;QACD,iHAAiH;QACjH,IAAI,GAAG,CAAC,IAAI,KAAK,kCAAgB,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IACE,GAAG,CAAC,IAAI,KAAK,4BAAW,CAAC,kBAAkB;YAC3C,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,+BAA+B,EAC/D,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,4BAA4B,GAAG,IAAI,CAAC,qBAAqB,CAAC,4BAA4B,CAC1F,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,aAAa,CACnB,CAAC;QACF,MAAM,WAAW,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEtD,IAAI,CAAC,4BAA4B,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACxF,6FAA6F;YAC7F,uEAAuE;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,2EAA2E;QAC3E,4FAA4F;QAC5F,YAAY,CAAC,wBAAwB,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC9F,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB,CAAC,kBAA0B;QACxD,iDAAiD;QACjD,MAAM,uBAAuB,GAAG,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC;QACnF,MAAM,WAAW,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,wGAAwG;QACxG,IAAI,uBAAuB,KAAK,CAAC,EAAE,CAAC;YAClC,yFAAyF;YACzF,aAAa,GAAG,kBAAkB,GAAG,uBAAuB,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,sIAAsI;YACtI,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;gBAC7E,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpD,aAAa,GAAG,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC;gBAC/D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;gBAC/E,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,aAAa,GAAG,kBAAkB,GAAG,iBAAiB,CAAC,MAAM,CAAC;gBAChE,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AAvHD,gEAuHC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { StatusCodes } from \"../common/statusCodes.js\";\nimport type { GlobalEndpointManager } from \"../globalEndpointManager.js\";\nimport { HTTPMethod, isReadRequest } from \"../common/index.js\";\nimport type { OperationType, ResourceType } from \"../common/constants.js\";\nimport { Constants } from \"../common/constants.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { CosmosHeaders } from \"../queryExecutionContext/CosmosHeaders.js\";\nimport { TimeoutErrorCode } from \"../request/TimeoutError.js\";\nimport type { ErrorResponse, RequestContext } from \"../request/index.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { GlobalPartitionEndpointManager } from \"../globalPartitionEndpointManager.js\";\n\n/**\n * This class TimeoutFailoverRetryPolicy handles retries for read operations\n * (including data plane,metadata, and query plan) in case of request timeouts\n * (TimeoutError) or service unavailability (503 status code) by performing failover\n * and retrying on other regions.\n * @hidden\n */\nexport class TimeoutFailoverRetryPolicy implements RetryPolicy {\n private maxRetryAttemptCount = 120;\n private maxServiceUnavailableRetryCount = 1;\n public retryAfterInMs = 0;\n public failoverRetryCount = 0;\n public request: any;\n public locationEndpoint: any;\n\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private headers: CosmosHeaders,\n private methodType: HTTPMethod,\n private resourceType: ResourceType,\n private operationType: OperationType,\n private enableEndPointDiscovery: boolean,\n private enablePartitionLevelFailover: boolean,\n private globalPartitionEndpointManager?: GlobalPartitionEndpointManager,\n ) {}\n\n /**\n * Checks if a timeout request is valid for the timeout failover retry policy.\n * A valid request should be a data plane, metadata, or query plan request.\n * @returns\n */\n private isValidRequestForTimeoutError(): boolean {\n const isQuery = Constants.HttpHeaders.IsQuery in this.headers;\n const isQueryPlan = Constants.HttpHeaders.IsQueryPlan in this.headers;\n if (this.methodType === HTTPMethod.get || isQuery || isQueryPlan) {\n return true;\n }\n return false;\n }\n\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n locationEndpoint?: string,\n requestContext?: RequestContext,\n ): Promise<boolean> {\n if (!err) {\n return false;\n }\n if (!retryContext || !locationEndpoint) {\n return false;\n }\n if (!this.enableEndPointDiscovery) {\n return false;\n }\n // Mark the partition as unavailable.\n // Let the Retry logic decide if the request should be retried\n if (requestContext && this.globalPartitionEndpointManager) {\n await this.globalPartitionEndpointManager.tryPartitionLevelFailover(\n requestContext,\n diagnosticNode,\n );\n }\n // Check if the error is a timeout error (TimeoutErrorCode) and if it is not a valid HTTP network timeout request\n if (err.code === TimeoutErrorCode && !this.isValidRequestForTimeoutError()) {\n return false;\n }\n if (\n err.code === StatusCodes.ServiceUnavailable &&\n this.failoverRetryCount >= this.maxServiceUnavailableRetryCount\n ) {\n return false;\n }\n if (this.failoverRetryCount >= this.maxRetryAttemptCount) {\n return false;\n }\n const canUseMultipleWriteLocations = this.globalEndpointManager.canUseMultipleWriteLocations(\n this.resourceType,\n this.operationType,\n );\n const readRequest = isReadRequest(this.operationType);\n\n if (!canUseMultipleWriteLocations && !readRequest && !this.enablePartitionLevelFailover) {\n // Write requests on single master cannot be retried if partition level failover is disabled.\n // This means there are no other regions available to serve the writes.\n return false;\n }\n this.failoverRetryCount++;\n // Setting the retryLocationIndex to the next available location for retry.\n // The retryLocationIndex is determined based on the failoverRetryCount, starting from zero.\n retryContext.retryLocationServerIndex = await this.findEndpointIndex(this.failoverRetryCount);\n diagnosticNode.addData({ successfulRetryPolicy: \"timeout-failover\" });\n return true;\n }\n\n /**\n * Determines index of endpoint to be used for retry based upon failoverRetryCount and avalable locations\n * @param failoverRetryCount - count of failovers\n * @returns\n */\n private async findEndpointIndex(failoverRetryCount: number): Promise<number> {\n // count of preferred locations specified by user\n const preferredLocationsCount = this.globalEndpointManager.preferredLocationsCount;\n const readRequest = isReadRequest(this.operationType);\n let endpointIndex = 0;\n // If preferredLocationsCount is not zero, it indicates that the user has specified preferred locations.\n if (preferredLocationsCount !== 0) {\n // The endpointIndex is set based on the preferred location and the failover retry count.\n endpointIndex = failoverRetryCount % preferredLocationsCount;\n } else {\n // In the absence of preferred locations, the endpoint selection is based on the failover count and the number of available locations.\n if (readRequest) {\n const getReadEndpoints = await this.globalEndpointManager.getReadEndpoints();\n if (getReadEndpoints && getReadEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getReadEndpoints.length;\n }\n } else {\n const getWriteEndpoints = await this.globalEndpointManager.getWriteEndpoints();\n if (getWriteEndpoints && getWriteEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getWriteEndpoints.length;\n }\n }\n }\n return endpointIndex;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"partitionKeyRangeCache.d.ts","sourceRoot":"","sources":["../../../src/routing/partitionKeyRangeCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAGvF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,cAAc;AACd,qBAAa,sBAAsB;IAKrB,OAAO,CAAC,aAAa;IAJjC,OAAO,CAAC,kCAAkC,CAExC;gBAEkB,aAAa,EAAE,aAAa;IAGhD;;;;OAIG;IACU,sBAAsB,CACjC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,sBAAsB,EACtC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAWxC;;;OAGG;IACU,oBAAoB,CAC/B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,sBAAsB,EACtC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAKjB,2BAA2B;CAe1C"}
1
+ {"version":3,"file":"partitionKeyRangeCache.d.ts","sourceRoot":"","sources":["../../../src/routing/partitionKeyRangeCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAGvF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,cAAc;AACd,qBAAa,sBAAsB;IAKrB,OAAO,CAAC,aAAa;IAJjC,OAAO,CAAC,kCAAkC,CAExC;gBAEkB,aAAa,EAAE,aAAa;IAGhD;;;;OAIG;IACU,sBAAsB,CACjC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,sBAAsB,EACtC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,4BAA4B,CAAC;IAWxC;;;OAGG;IACU,oBAAoB,CAC/B,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,sBAAsB,EACtC,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAKjB,2BAA2B;CAqC1C"}
@@ -7,6 +7,7 @@ const CosmosDiagnostics_js_1 = require("../CosmosDiagnostics.js");
7
7
  const helper_js_1 = require("../common/helper.js");
8
8
  const diagnostics_js_1 = require("../utils/diagnostics.js");
9
9
  const CollectionRoutingMapFactory_js_1 = require("./CollectionRoutingMapFactory.js");
10
+ const hash_js_1 = require("../utils/hashing/hash.js");
10
11
  /** @hidden */
11
12
  class PartitionKeyRangeCache {
12
13
  constructor(clientContext) {
@@ -41,6 +42,16 @@ class PartitionKeyRangeCache {
41
42
  }, diagnosticNode, CosmosDiagnostics_js_1.MetadataLookUpType.PartitionKeyRangeLookUp);
42
43
  return (0, CollectionRoutingMapFactory_js_1.createCompleteRoutingMap)(resources.map((r) => [r, true]));
43
44
  }
45
+ /**
46
+ * Given a partition key, returns the partition key range id
47
+ * @internal
48
+ */
49
+ async getPartitionKeyRangeIdFromPartitionKey(collectionLink, partitionKey, partitionKeyDefinition, diagnosticNode) {
50
+ const hashedPartitionKey = (0, hash_js_1.hashPartitionKey)(partitionKey, partitionKeyDefinition);
51
+ const partitionKeyRanges = (await this.onCollectionRoutingMap(collectionLink, diagnosticNode)).getOrderedParitionKeyRanges();
52
+ const partitionKeyRangeId = (0, hash_js_1.binarySearchOnPartitionKeyRanges)(partitionKeyRanges, hashedPartitionKey);
53
+ return partitionKeyRangeId;
54
+ }
44
55
  }
45
56
  exports.PartitionKeyRangeCache = PartitionKeyRangeCache;
46
57
  //# sourceMappingURL=partitionKeyRangeCache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"partitionKeyRangeCache.js","sourceRoot":"","sources":["../../../src/routing/partitionKeyRangeCache.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,kEAA6D;AAG7D,mDAAoD;AAEpD,4DAAkE;AAClE,qFAA4E;AAI5E,cAAc;AACd,MAAa,sBAAsB;IAKjC,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAC9C,IAAI,CAAC,kCAAkC,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD;;;;OAIG;IACI,KAAK,CAAC,sBAAsB,CACjC,cAAsB,EACtB,cAAsC,EACtC,eAAwB,KAAK;QAE7B,MAAM,YAAY,GAAG,IAAA,yBAAa,EAAC,cAAc,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACxF,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,2BAA2B,CACtF,cAAc,EACd,cAAc,CACf,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,oBAAoB,CAC/B,cAAsB,EACtB,UAAsB,EACtB,cAAsC,EACtC,eAAwB,KAAK;QAE7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;QAC5F,OAAO,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,2BAA2B,CACvC,cAAsB,EACtB,cAAsC;QAEtC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,wCAAuB,EACjD,KAAK,EAAE,mBAA2C,EAAE,EAAE;YACpD,OAAO,IAAI,CAAC,aAAa;iBACtB,uBAAuB,CAAC,cAAc,CAAC;iBACvC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAC3C,CAAC,EACD,cAAc,EACd,yCAAkB,CAAC,uBAAuB,CAC3C,CAAC;QACF,OAAO,IAAA,yDAAwB,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;CACF;AAzDD,wDAyDC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { MetadataLookUpType } from \"../CosmosDiagnostics.js\";\nimport type { PartitionKeyRange } from \"../client/Container/PartitionKeyRange.js\";\nimport type { ClientContext } from \"../ClientContext.js\";\nimport { getIdFromLink } from \"../common/helper.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { withMetadataDiagnostics } from \"../utils/diagnostics.js\";\nimport { createCompleteRoutingMap } from \"./CollectionRoutingMapFactory.js\";\nimport type { InMemoryCollectionRoutingMap } from \"./inMemoryCollectionRoutingMap.js\";\nimport type { QueryRange } from \"./QueryRange.js\";\n\n/** @hidden */\nexport class PartitionKeyRangeCache {\n private collectionRoutingMapByCollectionId: {\n [key: string]: Promise<InMemoryCollectionRoutingMap>;\n };\n\n constructor(private clientContext: ClientContext) {\n this.collectionRoutingMapByCollectionId = {};\n }\n /**\n * Finds or Instantiates the requested Collection Routing Map\n * @param collectionLink - Requested collectionLink\n * @hidden\n */\n public async onCollectionRoutingMap(\n collectionLink: string,\n diagnosticNode: DiagnosticNodeInternal,\n forceRefresh: boolean = false,\n ): Promise<InMemoryCollectionRoutingMap> {\n const collectionId = getIdFromLink(collectionLink);\n if (this.collectionRoutingMapByCollectionId[collectionId] === undefined || forceRefresh) {\n this.collectionRoutingMapByCollectionId[collectionId] = this.requestCollectionRoutingMap(\n collectionLink,\n diagnosticNode,\n );\n }\n return this.collectionRoutingMapByCollectionId[collectionId];\n }\n\n /**\n * Given the query ranges and a collection, invokes the callback on the list of overlapping partition key ranges\n * @hidden\n */\n public async getOverlappingRanges(\n collectionLink: string,\n queryRange: QueryRange,\n diagnosticNode: DiagnosticNodeInternal,\n forceRefresh: boolean = false,\n ): Promise<PartitionKeyRange[]> {\n const crm = await this.onCollectionRoutingMap(collectionLink, diagnosticNode, forceRefresh);\n return crm.getOverlappingRanges(queryRange);\n }\n\n private async requestCollectionRoutingMap(\n collectionLink: string,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<InMemoryCollectionRoutingMap> {\n const { resources } = await withMetadataDiagnostics(\n async (metadataDiagnostics: DiagnosticNodeInternal) => {\n return this.clientContext\n .queryPartitionKeyRanges(collectionLink)\n .fetchAllInternal(metadataDiagnostics);\n },\n diagnosticNode,\n MetadataLookUpType.PartitionKeyRangeLookUp,\n );\n return createCompleteRoutingMap(resources.map((r) => [r, true]));\n }\n}\n"]}
1
+ {"version":3,"file":"partitionKeyRangeCache.js","sourceRoot":"","sources":["../../../src/routing/partitionKeyRangeCache.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,kEAA6D;AAG7D,mDAAoD;AAEpD,4DAAkE;AAClE,qFAA4E;AAK5E,sDAA8F;AAE9F,cAAc;AACd,MAAa,sBAAsB;IAKjC,YAAoB,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAC9C,IAAI,CAAC,kCAAkC,GAAG,EAAE,CAAC;IAC/C,CAAC;IACD;;;;OAIG;IACI,KAAK,CAAC,sBAAsB,CACjC,cAAsB,EACtB,cAAsC,EACtC,eAAwB,KAAK;QAE7B,MAAM,YAAY,GAAG,IAAA,yBAAa,EAAC,cAAc,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACxF,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,2BAA2B,CACtF,cAAc,EACd,cAAc,CACf,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,kCAAkC,CAAC,YAAY,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,oBAAoB,CAC/B,cAAsB,EACtB,UAAsB,EACtB,cAAsC,EACtC,eAAwB,KAAK;QAE7B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;QAC5F,OAAO,GAAG,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,2BAA2B,CACvC,cAAsB,EACtB,cAAsC;QAEtC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,wCAAuB,EACjD,KAAK,EAAE,mBAA2C,EAAE,EAAE;YACpD,OAAO,IAAI,CAAC,aAAa;iBACtB,uBAAuB,CAAC,cAAc,CAAC;iBACvC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;QAC3C,CAAC,EACD,cAAc,EACd,yCAAkB,CAAC,uBAAuB,CAC3C,CAAC;QACF,OAAO,IAAA,yDAAwB,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,sCAAsC,CACjD,cAAsB,EACtB,YAAkC,EAClC,sBAA8C,EAC9C,cAAsC;QAEtC,MAAM,kBAAkB,GAAG,IAAA,0BAAgB,EAAC,YAAY,EAAE,sBAAsB,CAAC,CAAC;QAClF,MAAM,kBAAkB,GAAG,CACzB,MAAM,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,CAClE,CAAC,2BAA2B,EAAE,CAAC;QAEhC,MAAM,mBAAmB,GAAG,IAAA,0CAAgC,EAC1D,kBAAkB,EAClB,kBAAkB,CACnB,CAAC;QACF,OAAO,mBAAmB,CAAC;IAC7B,CAAC;CACF;AA/ED,wDA+EC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { MetadataLookUpType } from \"../CosmosDiagnostics.js\";\nimport type { PartitionKeyRange } from \"../client/Container/PartitionKeyRange.js\";\nimport type { ClientContext } from \"../ClientContext.js\";\nimport { getIdFromLink } from \"../common/helper.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { withMetadataDiagnostics } from \"../utils/diagnostics.js\";\nimport { createCompleteRoutingMap } from \"./CollectionRoutingMapFactory.js\";\nimport type { InMemoryCollectionRoutingMap } from \"./inMemoryCollectionRoutingMap.js\";\nimport type { QueryRange } from \"./QueryRange.js\";\nimport type { PartitionKeyDefinition } from \"../documents/PartitionKeyDefinition.js\";\nimport type { PartitionKeyInternal } from \"../documents/PartitionKeyInternal.js\";\nimport { hashPartitionKey, binarySearchOnPartitionKeyRanges } from \"../utils/hashing/hash.js\";\n\n/** @hidden */\nexport class PartitionKeyRangeCache {\n private collectionRoutingMapByCollectionId: {\n [key: string]: Promise<InMemoryCollectionRoutingMap>;\n };\n\n constructor(private clientContext: ClientContext) {\n this.collectionRoutingMapByCollectionId = {};\n }\n /**\n * Finds or Instantiates the requested Collection Routing Map\n * @param collectionLink - Requested collectionLink\n * @hidden\n */\n public async onCollectionRoutingMap(\n collectionLink: string,\n diagnosticNode: DiagnosticNodeInternal,\n forceRefresh: boolean = false,\n ): Promise<InMemoryCollectionRoutingMap> {\n const collectionId = getIdFromLink(collectionLink);\n if (this.collectionRoutingMapByCollectionId[collectionId] === undefined || forceRefresh) {\n this.collectionRoutingMapByCollectionId[collectionId] = this.requestCollectionRoutingMap(\n collectionLink,\n diagnosticNode,\n );\n }\n return this.collectionRoutingMapByCollectionId[collectionId];\n }\n\n /**\n * Given the query ranges and a collection, invokes the callback on the list of overlapping partition key ranges\n * @hidden\n */\n public async getOverlappingRanges(\n collectionLink: string,\n queryRange: QueryRange,\n diagnosticNode: DiagnosticNodeInternal,\n forceRefresh: boolean = false,\n ): Promise<PartitionKeyRange[]> {\n const crm = await this.onCollectionRoutingMap(collectionLink, diagnosticNode, forceRefresh);\n return crm.getOverlappingRanges(queryRange);\n }\n\n private async requestCollectionRoutingMap(\n collectionLink: string,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<InMemoryCollectionRoutingMap> {\n const { resources } = await withMetadataDiagnostics(\n async (metadataDiagnostics: DiagnosticNodeInternal) => {\n return this.clientContext\n .queryPartitionKeyRanges(collectionLink)\n .fetchAllInternal(metadataDiagnostics);\n },\n diagnosticNode,\n MetadataLookUpType.PartitionKeyRangeLookUp,\n );\n return createCompleteRoutingMap(resources.map((r) => [r, true]));\n }\n\n /**\n * Given a partition key, returns the partition key range id\n * @internal\n */\n public async getPartitionKeyRangeIdFromPartitionKey(\n collectionLink: string,\n partitionKey: PartitionKeyInternal,\n partitionKeyDefinition: PartitionKeyDefinition,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<string | undefined> {\n const hashedPartitionKey = hashPartitionKey(partitionKey, partitionKeyDefinition);\n const partitionKeyRanges = (\n await this.onCollectionRoutingMap(collectionLink, diagnosticNode)\n ).getOrderedParitionKeyRanges();\n\n const partitionKeyRangeId = binarySearchOnPartitionKeyRanges(\n partitionKeyRanges,\n hashedPartitionKey,\n );\n return partitionKeyRangeId;\n }\n}\n"]}
@@ -1,11 +1,11 @@
1
- // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
- // It should be published with your NPM package. It should not be tracked by Git.
3
- {
4
- "tsdocVersion": "0.12",
5
- "toolPackages": [
6
- {
7
- "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.52.7"
9
- }
10
- ]
11
- }
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.52.8"
9
+ }
10
+ ]
11
+ }
@@ -4,10 +4,17 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.checkURL = checkURL;
6
6
  exports.sanitizeEndpoint = sanitizeEndpoint;
7
+ exports.normalizeEndpoint = normalizeEndpoint;
7
8
  function checkURL(testString) {
8
9
  return new URL(testString);
9
10
  }
10
11
  function sanitizeEndpoint(url) {
11
12
  return new URL(url).href.replace(/\/$/, "");
12
13
  }
14
+ /**
15
+ * @internal
16
+ */
17
+ function normalizeEndpoint(endpoint) {
18
+ return endpoint.replace(/\s+/g, "").toLowerCase();
19
+ }
13
20
  //# sourceMappingURL=checkURL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkURL.js","sourceRoot":"","sources":["../../../src/utils/checkURL.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAElC,4BAEC;AAED,4CAEC;AAND,SAAgB,QAAQ,CAAC,UAAkB;IACzC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport function checkURL(testString: string): URL {\n return new URL(testString);\n}\n\nexport function sanitizeEndpoint(url: string): string {\n return new URL(url).href.replace(/\\/$/, \"\");\n}\n"]}
1
+ {"version":3,"file":"checkURL.js","sourceRoot":"","sources":["../../../src/utils/checkURL.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAElC,4BAEC;AAED,4CAEC;AAKD,8CAEC;AAbD,SAAgB,QAAQ,CAAC,UAAkB;IACzC,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAgB;IAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpD,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nexport function checkURL(testString: string): URL {\n return new URL(testString);\n}\n\nexport function sanitizeEndpoint(url: string): string {\n return new URL(url).href.replace(/\\/$/, \"\");\n}\n\n/**\n * @internal\n */\nexport function normalizeEndpoint(endpoint: string): string {\n return endpoint.replace(/\\s+/g, \"\").toLowerCase();\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { PartitionKeyRange } from "../../client/index.js";
1
2
  import type { PartitionKeyDefinition, PrimitivePartitionKeyValue } from "../../documents/index.js";
2
3
  /**
3
4
  * Generate hash of a PartitonKey based on it PartitionKeyDefinition.
@@ -6,4 +7,5 @@ import type { PartitionKeyDefinition, PrimitivePartitionKeyValue } from "../../d
6
7
  * @returns
7
8
  */
8
9
  export declare function hashPartitionKey(partitionKey: PrimitivePartitionKeyValue[], partitionDefinition: PartitionKeyDefinition): string;
10
+ export declare function binarySearchOnPartitionKeyRanges(partitionKeyRanges: PartitionKeyRange[], hashedPartitionKey: string): string | undefined;
9
11
  //# sourceMappingURL=hash.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashing/hash.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAMnG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,0BAA0B,EAAE,EAC1C,mBAAmB,EAAE,sBAAsB,GAC1C,MAAM,CAYR"}
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../../src/utils/hashing/hash.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAOnG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,0BAA0B,EAAE,EAC1C,mBAAmB,EAAE,sBAAsB,GAC1C,MAAM,CAYR;AAED,wBAAgB,gCAAgC,CAC9C,kBAAkB,EAAE,iBAAiB,EAAE,EACvC,kBAAkB,EAAE,MAAM,GACzB,MAAM,GAAG,SAAS,CAiBpB"}
@@ -3,7 +3,9 @@
3
3
  // Licensed under the MIT License.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.hashPartitionKey = hashPartitionKey;
6
+ exports.binarySearchOnPartitionKeyRanges = binarySearchOnPartitionKeyRanges;
6
7
  const index_js_1 = require("../../documents/index.js");
8
+ const batch_js_1 = require("../batch.js");
7
9
  const multiHash_js_1 = require("./multiHash.js");
8
10
  const v1_js_1 = require("./v1.js");
9
11
  const v2_js_1 = require("./v2.js");
@@ -25,4 +27,22 @@ function hashPartitionKey(partitionKey, partitionDefinition) {
25
27
  return (0, multiHash_js_1.hashMultiHashPartitionKey)(partitionKey);
26
28
  }
27
29
  }
30
+ function binarySearchOnPartitionKeyRanges(partitionKeyRanges, hashedPartitionKey) {
31
+ let low = 0;
32
+ let high = partitionKeyRanges.length - 1;
33
+ while (low <= high) {
34
+ const mid = Math.floor((low + high) / 2);
35
+ const range = partitionKeyRanges[mid];
36
+ if ((0, batch_js_1.isKeyInRange)(range.minInclusive, range.maxExclusive, hashedPartitionKey)) {
37
+ return range.id;
38
+ }
39
+ else if (hashedPartitionKey.localeCompare(range.minInclusive) < 0) {
40
+ high = mid - 1;
41
+ }
42
+ else {
43
+ low = mid + 1;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
28
48
  //# sourceMappingURL=hash.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../../src/utils/hashing/hash.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAclC,4CAeC;AA1BD,uDAA2F;AAC3F,iDAA2D;AAC3D,mCAA6C;AAC7C,mCAA6C;AAE7C;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC9B,YAA0C,EAC1C,mBAA2C;IAE3C,MAAM,IAAI,GAAqB,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,IAAI,KAAI,2BAAgB,CAAC,IAAI,CAAC,CAAC,iBAAiB;IACpG,MAAM,IAAI,GACR,mBAAmB;QACnB,mBAAmB,CAAC,OAAO;QAC3B,mBAAmB,CAAC,OAAO,KAAK,wCAA6B,CAAC,EAAE,CAAC;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,2BAAgB,CAAC,IAAI;YACxB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,0BAAkB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,0BAAkB,EAAC,YAAY,CAAC,CAAC;QACpF,KAAK,2BAAgB,CAAC,SAAS;YAC7B,OAAO,IAAA,wCAAyB,EAAC,YAAY,CAAC,CAAC;IACnD,CAAC;AACH,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { PartitionKeyDefinition, PrimitivePartitionKeyValue } from \"../../documents/index.js\";\nimport { PartitionKeyDefinitionVersion, PartitionKeyKind } from \"../../documents/index.js\";\nimport { hashMultiHashPartitionKey } from \"./multiHash.js\";\nimport { hashV1PartitionKey } from \"./v1.js\";\nimport { hashV2PartitionKey } from \"./v2.js\";\n\n/**\n * Generate hash of a PartitonKey based on it PartitionKeyDefinition.\n * @param partitionKey - to be hashed.\n * @param partitionDefinition - container's partitionKey definition\n * @returns\n */\nexport function hashPartitionKey(\n partitionKey: PrimitivePartitionKeyValue[],\n partitionDefinition: PartitionKeyDefinition,\n): string {\n const kind: PartitionKeyKind = partitionDefinition?.kind || PartitionKeyKind.Hash; // Default value.\n const isV2 =\n partitionDefinition &&\n partitionDefinition.version &&\n partitionDefinition.version === PartitionKeyDefinitionVersion.V2;\n switch (kind) {\n case PartitionKeyKind.Hash:\n return isV2 ? hashV2PartitionKey(partitionKey) : hashV1PartitionKey(partitionKey);\n case PartitionKeyKind.MultiHash:\n return hashMultiHashPartitionKey(partitionKey);\n }\n}\n"]}
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../../src/utils/hashing/hash.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAgBlC,4CAeC;AAED,4EAoBC;AAjDD,uDAA2F;AAC3F,0CAA2C;AAC3C,iDAA2D;AAC3D,mCAA6C;AAC7C,mCAA6C;AAE7C;;;;;GAKG;AACH,SAAgB,gBAAgB,CAC9B,YAA0C,EAC1C,mBAA2C;IAE3C,MAAM,IAAI,GAAqB,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,IAAI,KAAI,2BAAgB,CAAC,IAAI,CAAC,CAAC,iBAAiB;IACpG,MAAM,IAAI,GACR,mBAAmB;QACnB,mBAAmB,CAAC,OAAO;QAC3B,mBAAmB,CAAC,OAAO,KAAK,wCAA6B,CAAC,EAAE,CAAC;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,2BAAgB,CAAC,IAAI;YACxB,OAAO,IAAI,CAAC,CAAC,CAAC,IAAA,0BAAkB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,0BAAkB,EAAC,YAAY,CAAC,CAAC;QACpF,KAAK,2BAAgB,CAAC,SAAS;YAC7B,OAAO,IAAA,wCAAyB,EAAC,YAAY,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAgB,gCAAgC,CAC9C,kBAAuC,EACvC,kBAA0B;IAE1B,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;IAEzC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEtC,IAAI,IAAA,uBAAY,EAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,kBAAkB,CAAC,EAAE,CAAC;YAC7E,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,CAAC;aAAM,IAAI,kBAAkB,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACpE,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { PartitionKeyRange } from \"../../client/index.js\";\nimport type { PartitionKeyDefinition, PrimitivePartitionKeyValue } from \"../../documents/index.js\";\nimport { PartitionKeyDefinitionVersion, PartitionKeyKind } from \"../../documents/index.js\";\nimport { isKeyInRange } from \"../batch.js\";\nimport { hashMultiHashPartitionKey } from \"./multiHash.js\";\nimport { hashV1PartitionKey } from \"./v1.js\";\nimport { hashV2PartitionKey } from \"./v2.js\";\n\n/**\n * Generate hash of a PartitonKey based on it PartitionKeyDefinition.\n * @param partitionKey - to be hashed.\n * @param partitionDefinition - container's partitionKey definition\n * @returns\n */\nexport function hashPartitionKey(\n partitionKey: PrimitivePartitionKeyValue[],\n partitionDefinition: PartitionKeyDefinition,\n): string {\n const kind: PartitionKeyKind = partitionDefinition?.kind || PartitionKeyKind.Hash; // Default value.\n const isV2 =\n partitionDefinition &&\n partitionDefinition.version &&\n partitionDefinition.version === PartitionKeyDefinitionVersion.V2;\n switch (kind) {\n case PartitionKeyKind.Hash:\n return isV2 ? hashV2PartitionKey(partitionKey) : hashV1PartitionKey(partitionKey);\n case PartitionKeyKind.MultiHash:\n return hashMultiHashPartitionKey(partitionKey);\n }\n}\n\nexport function binarySearchOnPartitionKeyRanges(\n partitionKeyRanges: PartitionKeyRange[],\n hashedPartitionKey: string,\n): string | undefined {\n let low = 0;\n let high = partitionKeyRanges.length - 1;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const range = partitionKeyRanges[mid];\n\n if (isKeyInRange(range.minInclusive, range.maxExclusive, hashedPartitionKey)) {\n return range.id;\n } else if (hashedPartitionKey.localeCompare(range.minInclusive) < 0) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n return undefined;\n}\n"]}
@@ -4,4 +4,12 @@
4
4
  * @returns
5
5
  */
6
6
  export declare function getCurrentTimestampInMs(): number;
7
+ /**
8
+ * @hidden
9
+ * Utility function to start a background task that runs at specified intervals.
10
+ * @param action - A function that returns a Promise, representing the task to be executed.
11
+ * @param intervalMs - The interval in milliseconds at which the task should run.
12
+ * @returns A NodeJS.Timeout object representing the timer for the background task.
13
+ */
14
+ export declare function startBackgroundTask(action: () => Promise<void>, intervalMs: number): NodeJS.Timeout;
7
15
  //# sourceMappingURL=time.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,UAAU,EAAE,MAAM,GACjB,MAAM,CAAC,OAAO,CAWhB"}
@@ -3,6 +3,7 @@
3
3
  // Licensed under the MIT License.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.getCurrentTimestampInMs = getCurrentTimestampInMs;
6
+ exports.startBackgroundTask = startBackgroundTask;
6
7
  /**
7
8
  * @hidden
8
9
  * Utility function to get currentTime in UTC milliseconds.
@@ -11,4 +12,23 @@ exports.getCurrentTimestampInMs = getCurrentTimestampInMs;
11
12
  function getCurrentTimestampInMs() {
12
13
  return Date.now();
13
14
  }
15
+ /**
16
+ * @hidden
17
+ * Utility function to start a background task that runs at specified intervals.
18
+ * @param action - A function that returns a Promise, representing the task to be executed.
19
+ * @param intervalMs - The interval in milliseconds at which the task should run.
20
+ * @returns A NodeJS.Timeout object representing the timer for the background task.
21
+ */
22
+ function startBackgroundTask(action, intervalMs) {
23
+ const timer = setInterval(() => {
24
+ (async () => {
25
+ await action();
26
+ })();
27
+ }, intervalMs);
28
+ // Unref the timer if available to prevent it from keeping the Node.js event loop alive
29
+ if (timer.unref && typeof timer.unref === "function") {
30
+ timer.unref();
31
+ }
32
+ return timer;
33
+ }
14
34
  //# sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAQlC,0DAEC;AARD;;;;GAIG;AAEH,SAAgB,uBAAuB;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @hidden\n * Utility function to get currentTime in UTC milliseconds.\n * @returns\n */\n\nexport function getCurrentTimestampInMs(): number {\n return Date.now();\n}\n"]}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AAQlC,0DAEC;AASD,kDAcC;AA/BD;;;;GAIG;AAEH,SAAgB,uBAAuB;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,MAA2B,EAC3B,UAAkB;IAElB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,CAAC,KAAK,IAAI,EAAE;YACV,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,uFAAuF;IACvF,IAAI,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACrD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * @hidden\n * Utility function to get currentTime in UTC milliseconds.\n * @returns\n */\n\nexport function getCurrentTimestampInMs(): number {\n return Date.now();\n}\n\n/**\n * @hidden\n * Utility function to start a background task that runs at specified intervals.\n * @param action - A function that returns a Promise, representing the task to be executed.\n * @param intervalMs - The interval in milliseconds at which the task should run.\n * @returns A NodeJS.Timeout object representing the timer for the background task.\n */\nexport function startBackgroundTask(\n action: () => Promise<void>,\n intervalMs: number,\n): NodeJS.Timeout {\n const timer = setInterval(() => {\n (async () => {\n await action();\n })();\n }, intervalMs);\n // Unref the timer if available to prevent it from keeping the Node.js event loop alive\n if (timer.unref && typeof timer.unref === \"function\") {\n timer.unref();\n }\n return timer;\n}\n"]}