@azure/cosmos 4.5.0-alpha.20250718.3 → 4.5.0-alpha.20250730.2

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 (1172) hide show
  1. package/dist/browser/ChangeFeedIterator.js +17 -11
  2. package/dist/browser/ChangeFeedIterator.js.map +1 -1
  3. package/dist/browser/ChangeFeedResponse.js +8 -0
  4. package/dist/browser/ChangeFeedResponse.js.map +1 -1
  5. package/dist/browser/ClientContext.js +122 -29
  6. package/dist/browser/ClientContext.js.map +1 -1
  7. package/dist/browser/CosmosClient.js +34 -3
  8. package/dist/browser/CosmosClient.js.map +1 -1
  9. package/dist/browser/CosmosDiagnostics.js +3 -0
  10. package/dist/browser/CosmosDiagnostics.js.map +1 -1
  11. package/dist/browser/PartitionKeyRangeFailoverInfo.js +8 -5
  12. package/dist/browser/PartitionKeyRangeFailoverInfo.js.map +1 -1
  13. package/dist/browser/bulk/Batcher.js +13 -3
  14. package/dist/browser/bulk/Batcher.js.map +1 -1
  15. package/dist/browser/bulk/BulkHelper.js +26 -11
  16. package/dist/browser/bulk/BulkHelper.js.map +1 -1
  17. package/dist/browser/bulk/BulkResponse.js +22 -20
  18. package/dist/browser/bulk/BulkResponse.js.map +1 -1
  19. package/dist/browser/bulk/CongestionAlgorithm.js +11 -4
  20. package/dist/browser/bulk/CongestionAlgorithm.js.map +1 -1
  21. package/dist/browser/bulk/HelperPerPartition.js +14 -1
  22. package/dist/browser/bulk/HelperPerPartition.js.map +1 -1
  23. package/dist/browser/bulk/ItemOperationContext.js +4 -0
  24. package/dist/browser/bulk/ItemOperationContext.js.map +1 -1
  25. package/dist/browser/bulk/Limiter.js +27 -18
  26. package/dist/browser/bulk/Limiter.js.map +1 -1
  27. package/dist/browser/bulk/PartitionMetric.js +4 -0
  28. package/dist/browser/bulk/PartitionMetric.js.map +1 -1
  29. package/dist/browser/client/ChangeFeed/ChangeFeedForEpkRange.js +26 -15
  30. package/dist/browser/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  31. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js +16 -8
  32. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  33. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorBuilder.js +12 -9
  34. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorBuilder.js.map +1 -1
  35. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorResponse.js +9 -0
  36. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorResponse.js.map +1 -1
  37. package/dist/browser/client/ChangeFeed/ChangeFeedPolicy.js +1 -0
  38. package/dist/browser/client/ChangeFeed/ChangeFeedPolicy.js.map +1 -1
  39. package/dist/browser/client/ChangeFeed/ChangeFeedRange.js +20 -0
  40. package/dist/browser/client/ChangeFeed/ChangeFeedRange.js.map +1 -1
  41. package/dist/browser/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js +1 -0
  42. package/dist/browser/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js.map +1 -1
  43. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromBeginning.js +1 -0
  44. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromBeginning.js.map +1 -1
  45. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromContinuation.js +1 -0
  46. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromContinuation.js.map +1 -1
  47. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromNow.js +1 -0
  48. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromNow.js.map +1 -1
  49. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromTime.js +2 -0
  50. package/dist/browser/client/ChangeFeed/ChangeFeedStartFromTime.js.map +1 -1
  51. package/dist/browser/client/ChangeFeed/CompositeContinuationToken.js +8 -0
  52. package/dist/browser/client/ChangeFeed/CompositeContinuationToken.js.map +1 -1
  53. package/dist/browser/client/ChangeFeed/ContinuationTokenForPartitionKey.js +12 -0
  54. package/dist/browser/client/ChangeFeed/ContinuationTokenForPartitionKey.js.map +1 -1
  55. package/dist/browser/client/ChangeFeed/FeedRange.js +8 -0
  56. package/dist/browser/client/ChangeFeed/FeedRange.js.map +1 -1
  57. package/dist/browser/client/ChangeFeed/FeedRangeQueue.js +1 -0
  58. package/dist/browser/client/ChangeFeed/FeedRangeQueue.js.map +1 -1
  59. package/dist/browser/client/ChangeFeed/changeFeedUtils.js +5 -5
  60. package/dist/browser/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  61. package/dist/browser/client/ClientUtils.js +1 -1
  62. package/dist/browser/client/ClientUtils.js.map +1 -1
  63. package/dist/browser/client/Conflict/Conflict.js +4 -0
  64. package/dist/browser/client/Conflict/Conflict.js.map +1 -1
  65. package/dist/browser/client/Conflict/ConflictResponse.js +2 -0
  66. package/dist/browser/client/Conflict/ConflictResponse.js.map +1 -1
  67. package/dist/browser/client/Conflict/Conflicts.js +2 -0
  68. package/dist/browser/client/Conflict/Conflicts.js.map +1 -1
  69. package/dist/browser/client/Container/Container.js +18 -3
  70. package/dist/browser/client/Container/Container.js.map +1 -1
  71. package/dist/browser/client/Container/ContainerResponse.js +2 -0
  72. package/dist/browser/client/Container/ContainerResponse.js.map +1 -1
  73. package/dist/browser/client/Container/Containers.js +4 -2
  74. package/dist/browser/client/Container/Containers.js.map +1 -1
  75. package/dist/browser/client/Database/Database.js +33 -0
  76. package/dist/browser/client/Database/Database.js.map +1 -1
  77. package/dist/browser/client/Database/DatabaseResponse.js +2 -0
  78. package/dist/browser/client/Database/DatabaseResponse.js.map +1 -1
  79. package/dist/browser/client/Database/Databases.js +3 -0
  80. package/dist/browser/client/Database/Databases.js.map +1 -1
  81. package/dist/browser/client/Item/Item.js +4 -0
  82. package/dist/browser/client/Item/Item.js.map +1 -1
  83. package/dist/browser/client/Item/ItemResponse.js +2 -0
  84. package/dist/browser/client/Item/ItemResponse.js.map +1 -1
  85. package/dist/browser/client/Item/Items.js +3 -0
  86. package/dist/browser/client/Item/Items.js.map +1 -1
  87. package/dist/browser/client/Offer/Offer.js +3 -0
  88. package/dist/browser/client/Offer/Offer.js.map +1 -1
  89. package/dist/browser/client/Offer/OfferResponse.js +2 -0
  90. package/dist/browser/client/Offer/OfferResponse.js.map +1 -1
  91. package/dist/browser/client/Offer/Offers.js +2 -0
  92. package/dist/browser/client/Offer/Offers.js.map +1 -1
  93. package/dist/browser/client/Permission/Permission.js +3 -0
  94. package/dist/browser/client/Permission/Permission.js.map +1 -1
  95. package/dist/browser/client/Permission/PermissionResponse.js +2 -0
  96. package/dist/browser/client/Permission/PermissionResponse.js.map +1 -1
  97. package/dist/browser/client/Permission/Permissions.js +2 -0
  98. package/dist/browser/client/Permission/Permissions.js.map +1 -1
  99. package/dist/browser/client/SasToken/SasTokenProperties.js +17 -0
  100. package/dist/browser/client/SasToken/SasTokenProperties.js.map +1 -1
  101. package/dist/browser/client/Script/Scripts.js +5 -0
  102. package/dist/browser/client/Script/Scripts.js.map +1 -1
  103. package/dist/browser/client/StoredProcedure/StoredProcedure.js +3 -0
  104. package/dist/browser/client/StoredProcedure/StoredProcedure.js.map +1 -1
  105. package/dist/browser/client/StoredProcedure/StoredProcedureResponse.js +4 -0
  106. package/dist/browser/client/StoredProcedure/StoredProcedureResponse.js.map +1 -1
  107. package/dist/browser/client/StoredProcedure/StoredProcedures.js +2 -0
  108. package/dist/browser/client/StoredProcedure/StoredProcedures.js.map +1 -1
  109. package/dist/browser/client/Trigger/Trigger.js +3 -0
  110. package/dist/browser/client/Trigger/Trigger.js.map +1 -1
  111. package/dist/browser/client/Trigger/TriggerResponse.js +2 -0
  112. package/dist/browser/client/Trigger/TriggerResponse.js.map +1 -1
  113. package/dist/browser/client/Trigger/Triggers.js +2 -0
  114. package/dist/browser/client/Trigger/Triggers.js.map +1 -1
  115. package/dist/browser/client/User/User.js +9 -0
  116. package/dist/browser/client/User/User.js.map +1 -1
  117. package/dist/browser/client/User/UserResponse.js +2 -0
  118. package/dist/browser/client/User/UserResponse.js.map +1 -1
  119. package/dist/browser/client/User/Users.js +2 -0
  120. package/dist/browser/client/User/Users.js.map +1 -1
  121. package/dist/browser/client/UserDefinedFunction/UserDefinedFunction.js +3 -0
  122. package/dist/browser/client/UserDefinedFunction/UserDefinedFunction.js.map +1 -1
  123. package/dist/browser/client/UserDefinedFunction/UserDefinedFunctionResponse.js +2 -0
  124. package/dist/browser/client/UserDefinedFunction/UserDefinedFunctionResponse.js.map +1 -1
  125. package/dist/browser/client/UserDefinedFunction/UserDefinedFunctions.js +2 -0
  126. package/dist/browser/client/UserDefinedFunction/UserDefinedFunctions.js.map +1 -1
  127. package/dist/browser/diagnostics/CosmosDiagnosticsContext.js +8 -7
  128. package/dist/browser/diagnostics/CosmosDiagnosticsContext.js.map +1 -1
  129. package/dist/browser/diagnostics/DiagnosticNodeInternal.js +26 -7
  130. package/dist/browser/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  131. package/dist/browser/diagnostics/DiagnosticWriter.js +1 -3
  132. package/dist/browser/diagnostics/DiagnosticWriter.js.map +1 -1
  133. package/dist/browser/diagnostics/index.js +2 -2
  134. package/dist/browser/diagnostics/index.js.map +1 -1
  135. package/dist/browser/documents/DatabaseAccount.js +20 -4
  136. package/dist/browser/documents/DatabaseAccount.js.map +1 -1
  137. package/dist/browser/documents/PartitionKey.js +1 -3
  138. package/dist/browser/documents/PartitionKey.js.map +1 -1
  139. package/dist/browser/encryption/Cache/ClientEncryptionKeyPropertiesCache.js +2 -0
  140. package/dist/browser/encryption/Cache/ClientEncryptionKeyPropertiesCache.js.map +1 -1
  141. package/dist/browser/encryption/Cache/EncryptionSettingsCache.js +2 -0
  142. package/dist/browser/encryption/Cache/EncryptionSettingsCache.js.map +1 -1
  143. package/dist/browser/encryption/Cache/KeyEncryptionKeyCache.js +2 -0
  144. package/dist/browser/encryption/Cache/KeyEncryptionKeyCache.js.map +1 -1
  145. package/dist/browser/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js +2 -0
  146. package/dist/browser/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js.map +1 -1
  147. package/dist/browser/encryption/EncryptionItemQueryIterator.js +24 -27
  148. package/dist/browser/encryption/EncryptionItemQueryIterator.js.map +1 -1
  149. package/dist/browser/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts +0 -1
  150. package/dist/browser/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts.map +1 -1
  151. package/dist/browser/encryption/EncryptionKey/ProtectedDataEncryptionKey.js +2 -0
  152. package/dist/browser/encryption/EncryptionKey/ProtectedDataEncryptionKey.js.map +1 -1
  153. package/dist/browser/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js +6 -5
  154. package/dist/browser/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js.map +1 -1
  155. package/dist/browser/encryption/EncryptionKeyStoreProvider.js +8 -1
  156. package/dist/browser/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  157. package/dist/browser/encryption/EncryptionManager.js +6 -0
  158. package/dist/browser/encryption/EncryptionManager.js.map +1 -1
  159. package/dist/browser/encryption/EncryptionProcessor.js +5 -0
  160. package/dist/browser/encryption/EncryptionProcessor.js.map +1 -1
  161. package/dist/browser/encryption/EncryptionQueryBuilder.js +2 -0
  162. package/dist/browser/encryption/EncryptionQueryBuilder.js.map +1 -1
  163. package/dist/browser/encryption/EncryptionSettingForProperty.js +6 -0
  164. package/dist/browser/encryption/EncryptionSettingForProperty.js.map +1 -1
  165. package/dist/browser/encryption/EncryptionSettings.js +6 -3
  166. package/dist/browser/encryption/EncryptionSettings.js.map +1 -1
  167. package/dist/browser/encryption/KeyEncryptionKey.js +4 -0
  168. package/dist/browser/encryption/KeyEncryptionKey.js.map +1 -1
  169. package/dist/browser/encryption/Serializers/StringSerializer.js +1 -1
  170. package/dist/browser/encryption/Serializers/StringSerializer.js.map +1 -1
  171. package/dist/browser/extractPartitionKey.js +2 -2
  172. package/dist/browser/extractPartitionKey.js.map +1 -1
  173. package/dist/browser/globalEndpointManager.js +21 -4
  174. package/dist/browser/globalEndpointManager.js.map +1 -1
  175. package/dist/browser/globalPartitionEndpointManager.js +8 -0
  176. package/dist/browser/globalPartitionEndpointManager.js.map +1 -1
  177. package/dist/browser/queryExecutionContext/Aggregators/AverageAggregator.js +2 -0
  178. package/dist/browser/queryExecutionContext/Aggregators/AverageAggregator.js.map +1 -1
  179. package/dist/browser/queryExecutionContext/Aggregators/CountAggregator.js +1 -0
  180. package/dist/browser/queryExecutionContext/Aggregators/CountAggregator.js.map +1 -1
  181. package/dist/browser/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js +1 -0
  182. package/dist/browser/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js.map +1 -1
  183. package/dist/browser/queryExecutionContext/Aggregators/MakeListAggregator.js +1 -0
  184. package/dist/browser/queryExecutionContext/Aggregators/MakeListAggregator.js.map +1 -1
  185. package/dist/browser/queryExecutionContext/Aggregators/MakeSetAggregator.js +1 -0
  186. package/dist/browser/queryExecutionContext/Aggregators/MakeSetAggregator.js.map +1 -1
  187. package/dist/browser/queryExecutionContext/Aggregators/MaxAggregator.js +2 -0
  188. package/dist/browser/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  189. package/dist/browser/queryExecutionContext/Aggregators/MinAggregator.js +2 -0
  190. package/dist/browser/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  191. package/dist/browser/queryExecutionContext/Aggregators/StaticValueAggregator.js +1 -0
  192. package/dist/browser/queryExecutionContext/Aggregators/StaticValueAggregator.js.map +1 -1
  193. package/dist/browser/queryExecutionContext/Aggregators/SumAggregator.js +1 -0
  194. package/dist/browser/queryExecutionContext/Aggregators/SumAggregator.js.map +1 -1
  195. package/dist/browser/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js +5 -3
  196. package/dist/browser/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js.map +1 -1
  197. package/dist/browser/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js +6 -3
  198. package/dist/browser/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js.map +1 -1
  199. package/dist/browser/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js +23 -7
  200. package/dist/browser/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js.map +1 -1
  201. package/dist/browser/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js +14 -6
  202. package/dist/browser/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js.map +1 -1
  203. package/dist/browser/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js +3 -0
  204. package/dist/browser/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js.map +1 -1
  205. package/dist/browser/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js +2 -0
  206. package/dist/browser/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js.map +1 -1
  207. package/dist/browser/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js +2 -0
  208. package/dist/browser/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js.map +1 -1
  209. package/dist/browser/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js +2 -0
  210. package/dist/browser/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js.map +1 -1
  211. package/dist/browser/queryExecutionContext/FetchResult.js +4 -0
  212. package/dist/browser/queryExecutionContext/FetchResult.js.map +1 -1
  213. package/dist/browser/queryExecutionContext/defaultQueryExecutionContext.js +14 -2
  214. package/dist/browser/queryExecutionContext/defaultQueryExecutionContext.js.map +1 -1
  215. package/dist/browser/queryExecutionContext/documentProducer.js +34 -21
  216. package/dist/browser/queryExecutionContext/documentProducer.js.map +1 -1
  217. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.js +41 -27
  218. package/dist/browser/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  219. package/dist/browser/queryExecutionContext/orderByComparator.js +1 -0
  220. package/dist/browser/queryExecutionContext/orderByComparator.js.map +1 -1
  221. package/dist/browser/queryExecutionContext/orderByDocumentProducerComparator.js +1 -0
  222. package/dist/browser/queryExecutionContext/orderByDocumentProducerComparator.js.map +1 -1
  223. package/dist/browser/queryExecutionContext/orderByQueryExecutionContext.js +1 -0
  224. package/dist/browser/queryExecutionContext/orderByQueryExecutionContext.js.map +1 -1
  225. package/dist/browser/queryExecutionContext/parallelQueryExecutionContextBase.js +20 -2
  226. package/dist/browser/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  227. package/dist/browser/queryExecutionContext/pipelinedQueryExecutionContext.js +14 -4
  228. package/dist/browser/queryExecutionContext/pipelinedQueryExecutionContext.js.map +1 -1
  229. package/dist/browser/queryIterator.js +41 -33
  230. package/dist/browser/queryIterator.js.map +1 -1
  231. package/dist/browser/queryMetrics/clientSideMetrics.js +2 -1
  232. package/dist/browser/queryMetrics/clientSideMetrics.js.map +1 -1
  233. package/dist/browser/queryMetrics/queryMetrics.js +14 -1
  234. package/dist/browser/queryMetrics/queryMetrics.js.map +1 -1
  235. package/dist/browser/queryMetrics/queryPreparationTime.js +5 -1
  236. package/dist/browser/queryMetrics/queryPreparationTime.js.map +1 -1
  237. package/dist/browser/queryMetrics/runtimeExecutionTimes.js +4 -1
  238. package/dist/browser/queryMetrics/runtimeExecutionTimes.js.map +1 -1
  239. package/dist/browser/queryMetrics/timeSpan.js +4 -3
  240. package/dist/browser/queryMetrics/timeSpan.js.map +1 -1
  241. package/dist/browser/request/ErrorResponse.js +19 -0
  242. package/dist/browser/request/ErrorResponse.js.map +1 -1
  243. package/dist/browser/request/FeedResponse.js +4 -0
  244. package/dist/browser/request/FeedResponse.js.map +1 -1
  245. package/dist/browser/request/RequestHandler.js +1 -2
  246. package/dist/browser/request/RequestHandler.js.map +1 -1
  247. package/dist/browser/request/ResourceResponse.js +5 -0
  248. package/dist/browser/request/ResourceResponse.js.map +1 -1
  249. package/dist/browser/request/TimeoutError.js +1 -1
  250. package/dist/browser/request/TimeoutError.js.map +1 -1
  251. package/dist/browser/request/hybridSearchQueryResult.js +5 -0
  252. package/dist/browser/request/hybridSearchQueryResult.js.map +1 -1
  253. package/dist/browser/request/request.js +5 -1
  254. package/dist/browser/request/request.js.map +1 -1
  255. package/dist/browser/retry/bulkExecutionRetryPolicy.js +5 -2
  256. package/dist/browser/retry/bulkExecutionRetryPolicy.js.map +1 -1
  257. package/dist/browser/retry/defaultRetryPolicy.js +4 -3
  258. package/dist/browser/retry/defaultRetryPolicy.js.map +1 -1
  259. package/dist/browser/retry/endpointDiscoveryRetryPolicy.js +11 -2
  260. package/dist/browser/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  261. package/dist/browser/retry/resourceThrottleRetryPolicy.js +20 -10
  262. package/dist/browser/retry/resourceThrottleRetryPolicy.js.map +1 -1
  263. package/dist/browser/retry/retryUtility.js +2 -3
  264. package/dist/browser/retry/retryUtility.js.map +1 -1
  265. package/dist/browser/retry/sessionRetryPolicy.js +8 -4
  266. package/dist/browser/retry/sessionRetryPolicy.js.map +1 -1
  267. package/dist/browser/retry/timeoutFailoverRetryPolicy.js +14 -4
  268. package/dist/browser/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  269. package/dist/browser/routing/QueryRange.js +4 -0
  270. package/dist/browser/routing/QueryRange.js.map +1 -1
  271. package/dist/browser/routing/inMemoryCollectionRoutingMap.js +4 -0
  272. package/dist/browser/routing/inMemoryCollectionRoutingMap.js.map +1 -1
  273. package/dist/browser/routing/partitionKeyRangeCache.js +2 -0
  274. package/dist/browser/routing/partitionKeyRangeCache.js.map +1 -1
  275. package/dist/browser/routing/smartRoutingMapProvider.js +1 -0
  276. package/dist/browser/routing/smartRoutingMapProvider.js.map +1 -1
  277. package/dist/browser/session/VectorSessionToken.js +6 -2
  278. package/dist/browser/session/VectorSessionToken.js.map +1 -1
  279. package/dist/browser/session/sessionContainer.js +5 -3
  280. package/dist/browser/session/sessionContainer.js.map +1 -1
  281. package/dist/browser/utils/batch.js +15 -4
  282. package/dist/browser/utils/batch.js.map +1 -1
  283. package/dist/browser/utils/fixedSizePriorityQueue.js +4 -0
  284. package/dist/browser/utils/fixedSizePriorityQueue.js.map +1 -1
  285. package/dist/browser/utils/hashing/hash.js +1 -1
  286. package/dist/browser/utils/hashing/hash.js.map +1 -1
  287. package/dist/browser/utils/nonStreamingOrderByMap.js +2 -0
  288. package/dist/browser/utils/nonStreamingOrderByMap.js.map +1 -1
  289. package/dist/commonjs/ChangeFeedIterator.js +17 -11
  290. package/dist/commonjs/ChangeFeedIterator.js.map +1 -1
  291. package/dist/commonjs/ChangeFeedResponse.js +8 -0
  292. package/dist/commonjs/ChangeFeedResponse.js.map +1 -1
  293. package/dist/commonjs/ClientContext.js +122 -29
  294. package/dist/commonjs/ClientContext.js.map +1 -1
  295. package/dist/commonjs/CosmosClient.js +34 -3
  296. package/dist/commonjs/CosmosClient.js.map +1 -1
  297. package/dist/commonjs/CosmosDiagnostics.js +3 -0
  298. package/dist/commonjs/CosmosDiagnostics.js.map +1 -1
  299. package/dist/commonjs/PartitionKeyRangeFailoverInfo.js +8 -5
  300. package/dist/commonjs/PartitionKeyRangeFailoverInfo.js.map +1 -1
  301. package/dist/commonjs/bulk/Batcher.js +13 -3
  302. package/dist/commonjs/bulk/Batcher.js.map +1 -1
  303. package/dist/commonjs/bulk/BulkHelper.js +26 -11
  304. package/dist/commonjs/bulk/BulkHelper.js.map +1 -1
  305. package/dist/commonjs/bulk/BulkResponse.js +22 -20
  306. package/dist/commonjs/bulk/BulkResponse.js.map +1 -1
  307. package/dist/commonjs/bulk/CongestionAlgorithm.js +11 -4
  308. package/dist/commonjs/bulk/CongestionAlgorithm.js.map +1 -1
  309. package/dist/commonjs/bulk/HelperPerPartition.js +14 -1
  310. package/dist/commonjs/bulk/HelperPerPartition.js.map +1 -1
  311. package/dist/commonjs/bulk/ItemOperationContext.js +4 -0
  312. package/dist/commonjs/bulk/ItemOperationContext.js.map +1 -1
  313. package/dist/commonjs/bulk/Limiter.js +27 -18
  314. package/dist/commonjs/bulk/Limiter.js.map +1 -1
  315. package/dist/commonjs/bulk/PartitionMetric.js +4 -0
  316. package/dist/commonjs/bulk/PartitionMetric.js.map +1 -1
  317. package/dist/commonjs/client/ChangeFeed/ChangeFeedForEpkRange.js +26 -15
  318. package/dist/commonjs/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  319. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js +16 -8
  320. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  321. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorBuilder.js +12 -9
  322. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorBuilder.js.map +1 -1
  323. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorResponse.js +9 -0
  324. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorResponse.js.map +1 -1
  325. package/dist/commonjs/client/ChangeFeed/ChangeFeedPolicy.js +1 -0
  326. package/dist/commonjs/client/ChangeFeed/ChangeFeedPolicy.js.map +1 -1
  327. package/dist/commonjs/client/ChangeFeed/ChangeFeedRange.js +20 -0
  328. package/dist/commonjs/client/ChangeFeed/ChangeFeedRange.js.map +1 -1
  329. package/dist/commonjs/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js +1 -0
  330. package/dist/commonjs/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js.map +1 -1
  331. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromBeginning.js +1 -0
  332. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromBeginning.js.map +1 -1
  333. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromContinuation.js +1 -0
  334. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromContinuation.js.map +1 -1
  335. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromNow.js +1 -0
  336. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromNow.js.map +1 -1
  337. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromTime.js +2 -0
  338. package/dist/commonjs/client/ChangeFeed/ChangeFeedStartFromTime.js.map +1 -1
  339. package/dist/commonjs/client/ChangeFeed/CompositeContinuationToken.js +8 -0
  340. package/dist/commonjs/client/ChangeFeed/CompositeContinuationToken.js.map +1 -1
  341. package/dist/commonjs/client/ChangeFeed/ContinuationTokenForPartitionKey.js +12 -0
  342. package/dist/commonjs/client/ChangeFeed/ContinuationTokenForPartitionKey.js.map +1 -1
  343. package/dist/commonjs/client/ChangeFeed/FeedRange.js +8 -0
  344. package/dist/commonjs/client/ChangeFeed/FeedRange.js.map +1 -1
  345. package/dist/commonjs/client/ChangeFeed/FeedRangeQueue.js +1 -0
  346. package/dist/commonjs/client/ChangeFeed/FeedRangeQueue.js.map +1 -1
  347. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.js +5 -5
  348. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  349. package/dist/commonjs/client/ClientUtils.js +1 -1
  350. package/dist/commonjs/client/ClientUtils.js.map +1 -1
  351. package/dist/commonjs/client/Conflict/Conflict.js +4 -0
  352. package/dist/commonjs/client/Conflict/Conflict.js.map +1 -1
  353. package/dist/commonjs/client/Conflict/ConflictResponse.js +2 -0
  354. package/dist/commonjs/client/Conflict/ConflictResponse.js.map +1 -1
  355. package/dist/commonjs/client/Conflict/Conflicts.js +2 -0
  356. package/dist/commonjs/client/Conflict/Conflicts.js.map +1 -1
  357. package/dist/commonjs/client/Container/Container.js +18 -3
  358. package/dist/commonjs/client/Container/Container.js.map +1 -1
  359. package/dist/commonjs/client/Container/ContainerResponse.js +2 -0
  360. package/dist/commonjs/client/Container/ContainerResponse.js.map +1 -1
  361. package/dist/commonjs/client/Container/Containers.js +4 -2
  362. package/dist/commonjs/client/Container/Containers.js.map +1 -1
  363. package/dist/commonjs/client/Database/Database.js +33 -0
  364. package/dist/commonjs/client/Database/Database.js.map +1 -1
  365. package/dist/commonjs/client/Database/DatabaseResponse.js +2 -0
  366. package/dist/commonjs/client/Database/DatabaseResponse.js.map +1 -1
  367. package/dist/commonjs/client/Database/Databases.js +3 -0
  368. package/dist/commonjs/client/Database/Databases.js.map +1 -1
  369. package/dist/commonjs/client/Item/Item.js +4 -0
  370. package/dist/commonjs/client/Item/Item.js.map +1 -1
  371. package/dist/commonjs/client/Item/ItemResponse.js +2 -0
  372. package/dist/commonjs/client/Item/ItemResponse.js.map +1 -1
  373. package/dist/commonjs/client/Item/Items.js +3 -0
  374. package/dist/commonjs/client/Item/Items.js.map +1 -1
  375. package/dist/commonjs/client/Offer/Offer.js +3 -0
  376. package/dist/commonjs/client/Offer/Offer.js.map +1 -1
  377. package/dist/commonjs/client/Offer/OfferResponse.js +2 -0
  378. package/dist/commonjs/client/Offer/OfferResponse.js.map +1 -1
  379. package/dist/commonjs/client/Offer/Offers.js +2 -0
  380. package/dist/commonjs/client/Offer/Offers.js.map +1 -1
  381. package/dist/commonjs/client/Permission/Permission.js +3 -0
  382. package/dist/commonjs/client/Permission/Permission.js.map +1 -1
  383. package/dist/commonjs/client/Permission/PermissionResponse.js +2 -0
  384. package/dist/commonjs/client/Permission/PermissionResponse.js.map +1 -1
  385. package/dist/commonjs/client/Permission/Permissions.js +2 -0
  386. package/dist/commonjs/client/Permission/Permissions.js.map +1 -1
  387. package/dist/commonjs/client/SasToken/SasTokenProperties.js +17 -0
  388. package/dist/commonjs/client/SasToken/SasTokenProperties.js.map +1 -1
  389. package/dist/commonjs/client/Script/Scripts.js +5 -0
  390. package/dist/commonjs/client/Script/Scripts.js.map +1 -1
  391. package/dist/commonjs/client/StoredProcedure/StoredProcedure.js +3 -0
  392. package/dist/commonjs/client/StoredProcedure/StoredProcedure.js.map +1 -1
  393. package/dist/commonjs/client/StoredProcedure/StoredProcedureResponse.js +4 -0
  394. package/dist/commonjs/client/StoredProcedure/StoredProcedureResponse.js.map +1 -1
  395. package/dist/commonjs/client/StoredProcedure/StoredProcedures.js +2 -0
  396. package/dist/commonjs/client/StoredProcedure/StoredProcedures.js.map +1 -1
  397. package/dist/commonjs/client/Trigger/Trigger.js +3 -0
  398. package/dist/commonjs/client/Trigger/Trigger.js.map +1 -1
  399. package/dist/commonjs/client/Trigger/TriggerResponse.js +2 -0
  400. package/dist/commonjs/client/Trigger/TriggerResponse.js.map +1 -1
  401. package/dist/commonjs/client/Trigger/Triggers.js +2 -0
  402. package/dist/commonjs/client/Trigger/Triggers.js.map +1 -1
  403. package/dist/commonjs/client/User/User.js +9 -0
  404. package/dist/commonjs/client/User/User.js.map +1 -1
  405. package/dist/commonjs/client/User/UserResponse.js +2 -0
  406. package/dist/commonjs/client/User/UserResponse.js.map +1 -1
  407. package/dist/commonjs/client/User/Users.js +2 -0
  408. package/dist/commonjs/client/User/Users.js.map +1 -1
  409. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunction.js +3 -0
  410. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunction.js.map +1 -1
  411. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunctionResponse.js +2 -0
  412. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunctionResponse.js.map +1 -1
  413. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunctions.js +2 -0
  414. package/dist/commonjs/client/UserDefinedFunction/UserDefinedFunctions.js.map +1 -1
  415. package/dist/commonjs/diagnostics/CosmosDiagnosticsContext.js +8 -7
  416. package/dist/commonjs/diagnostics/CosmosDiagnosticsContext.js.map +1 -1
  417. package/dist/commonjs/diagnostics/DiagnosticNodeInternal.js +26 -7
  418. package/dist/commonjs/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  419. package/dist/commonjs/diagnostics/DiagnosticWriter.js +1 -3
  420. package/dist/commonjs/diagnostics/DiagnosticWriter.js.map +1 -1
  421. package/dist/commonjs/diagnostics/index.js +2 -2
  422. package/dist/commonjs/diagnostics/index.js.map +1 -1
  423. package/dist/commonjs/documents/DatabaseAccount.js +20 -4
  424. package/dist/commonjs/documents/DatabaseAccount.js.map +1 -1
  425. package/dist/commonjs/documents/PartitionKey.js +1 -3
  426. package/dist/commonjs/documents/PartitionKey.js.map +1 -1
  427. package/dist/commonjs/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js +8 -2
  428. package/dist/commonjs/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js.map +1 -1
  429. package/dist/commonjs/encryption/Cache/ClientEncryptionKeyPropertiesCache.js +2 -0
  430. package/dist/commonjs/encryption/Cache/ClientEncryptionKeyPropertiesCache.js.map +1 -1
  431. package/dist/commonjs/encryption/Cache/EncryptionSettingsCache.js +2 -0
  432. package/dist/commonjs/encryption/Cache/EncryptionSettingsCache.js.map +1 -1
  433. package/dist/commonjs/encryption/Cache/KeyEncryptionKeyCache.js +2 -0
  434. package/dist/commonjs/encryption/Cache/KeyEncryptionKeyCache.js.map +1 -1
  435. package/dist/commonjs/encryption/Cache/ProtectedDataEncryptionKeyCache.js +5 -0
  436. package/dist/commonjs/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  437. package/dist/commonjs/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js +2 -0
  438. package/dist/commonjs/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js.map +1 -1
  439. package/dist/commonjs/encryption/EncryptionItemQueryIterator.js +24 -27
  440. package/dist/commonjs/encryption/EncryptionItemQueryIterator.js.map +1 -1
  441. package/dist/commonjs/encryption/EncryptionKey/DataEncryptionKey.js +7 -2
  442. package/dist/commonjs/encryption/EncryptionKey/DataEncryptionKey.js.map +1 -1
  443. package/dist/commonjs/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts +0 -1
  444. package/dist/commonjs/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts.map +1 -1
  445. package/dist/commonjs/encryption/EncryptionKey/ProtectedDataEncryptionKey.js +2 -0
  446. package/dist/commonjs/encryption/EncryptionKey/ProtectedDataEncryptionKey.js.map +1 -1
  447. package/dist/commonjs/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js +6 -5
  448. package/dist/commonjs/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js.map +1 -1
  449. package/dist/commonjs/encryption/EncryptionKeyStoreProvider.js +8 -1
  450. package/dist/commonjs/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  451. package/dist/commonjs/encryption/EncryptionManager.js +6 -0
  452. package/dist/commonjs/encryption/EncryptionManager.js.map +1 -1
  453. package/dist/commonjs/encryption/EncryptionProcessor.js +5 -0
  454. package/dist/commonjs/encryption/EncryptionProcessor.js.map +1 -1
  455. package/dist/commonjs/encryption/EncryptionQueryBuilder.js +2 -0
  456. package/dist/commonjs/encryption/EncryptionQueryBuilder.js.map +1 -1
  457. package/dist/commonjs/encryption/EncryptionSettingForProperty.js +6 -0
  458. package/dist/commonjs/encryption/EncryptionSettingForProperty.js.map +1 -1
  459. package/dist/commonjs/encryption/EncryptionSettings.js +6 -3
  460. package/dist/commonjs/encryption/EncryptionSettings.js.map +1 -1
  461. package/dist/commonjs/encryption/KeyEncryptionKey.js +4 -0
  462. package/dist/commonjs/encryption/KeyEncryptionKey.js.map +1 -1
  463. package/dist/commonjs/encryption/Serializers/StringSerializer.js +1 -1
  464. package/dist/commonjs/encryption/Serializers/StringSerializer.js.map +1 -1
  465. package/dist/commonjs/extractPartitionKey.js +2 -2
  466. package/dist/commonjs/extractPartitionKey.js.map +1 -1
  467. package/dist/commonjs/globalEndpointManager.js +21 -4
  468. package/dist/commonjs/globalEndpointManager.js.map +1 -1
  469. package/dist/commonjs/globalPartitionEndpointManager.js +8 -0
  470. package/dist/commonjs/globalPartitionEndpointManager.js.map +1 -1
  471. package/dist/commonjs/queryExecutionContext/Aggregators/AverageAggregator.js +2 -0
  472. package/dist/commonjs/queryExecutionContext/Aggregators/AverageAggregator.js.map +1 -1
  473. package/dist/commonjs/queryExecutionContext/Aggregators/CountAggregator.js +1 -0
  474. package/dist/commonjs/queryExecutionContext/Aggregators/CountAggregator.js.map +1 -1
  475. package/dist/commonjs/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js +1 -0
  476. package/dist/commonjs/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js.map +1 -1
  477. package/dist/commonjs/queryExecutionContext/Aggregators/MakeListAggregator.js +1 -0
  478. package/dist/commonjs/queryExecutionContext/Aggregators/MakeListAggregator.js.map +1 -1
  479. package/dist/commonjs/queryExecutionContext/Aggregators/MakeSetAggregator.js +1 -0
  480. package/dist/commonjs/queryExecutionContext/Aggregators/MakeSetAggregator.js.map +1 -1
  481. package/dist/commonjs/queryExecutionContext/Aggregators/MaxAggregator.js +2 -0
  482. package/dist/commonjs/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  483. package/dist/commonjs/queryExecutionContext/Aggregators/MinAggregator.js +2 -0
  484. package/dist/commonjs/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  485. package/dist/commonjs/queryExecutionContext/Aggregators/StaticValueAggregator.js +1 -0
  486. package/dist/commonjs/queryExecutionContext/Aggregators/StaticValueAggregator.js.map +1 -1
  487. package/dist/commonjs/queryExecutionContext/Aggregators/SumAggregator.js +1 -0
  488. package/dist/commonjs/queryExecutionContext/Aggregators/SumAggregator.js.map +1 -1
  489. package/dist/commonjs/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js +5 -3
  490. package/dist/commonjs/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js.map +1 -1
  491. package/dist/commonjs/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js +6 -3
  492. package/dist/commonjs/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js.map +1 -1
  493. package/dist/commonjs/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js +23 -7
  494. package/dist/commonjs/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js.map +1 -1
  495. package/dist/commonjs/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js +14 -6
  496. package/dist/commonjs/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js.map +1 -1
  497. package/dist/commonjs/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js +3 -0
  498. package/dist/commonjs/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js.map +1 -1
  499. package/dist/commonjs/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js +2 -0
  500. package/dist/commonjs/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js.map +1 -1
  501. package/dist/commonjs/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js +2 -0
  502. package/dist/commonjs/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js.map +1 -1
  503. package/dist/commonjs/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js +2 -0
  504. package/dist/commonjs/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js.map +1 -1
  505. package/dist/commonjs/queryExecutionContext/FetchResult.js +4 -0
  506. package/dist/commonjs/queryExecutionContext/FetchResult.js.map +1 -1
  507. package/dist/commonjs/queryExecutionContext/defaultQueryExecutionContext.js +14 -2
  508. package/dist/commonjs/queryExecutionContext/defaultQueryExecutionContext.js.map +1 -1
  509. package/dist/commonjs/queryExecutionContext/documentProducer.js +34 -21
  510. package/dist/commonjs/queryExecutionContext/documentProducer.js.map +1 -1
  511. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.js +41 -27
  512. package/dist/commonjs/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  513. package/dist/commonjs/queryExecutionContext/orderByComparator.js +1 -0
  514. package/dist/commonjs/queryExecutionContext/orderByComparator.js.map +1 -1
  515. package/dist/commonjs/queryExecutionContext/orderByDocumentProducerComparator.js +1 -0
  516. package/dist/commonjs/queryExecutionContext/orderByDocumentProducerComparator.js.map +1 -1
  517. package/dist/commonjs/queryExecutionContext/orderByQueryExecutionContext.js +1 -0
  518. package/dist/commonjs/queryExecutionContext/orderByQueryExecutionContext.js.map +1 -1
  519. package/dist/commonjs/queryExecutionContext/parallelQueryExecutionContextBase.js +20 -2
  520. package/dist/commonjs/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  521. package/dist/commonjs/queryExecutionContext/pipelinedQueryExecutionContext.js +14 -4
  522. package/dist/commonjs/queryExecutionContext/pipelinedQueryExecutionContext.js.map +1 -1
  523. package/dist/commonjs/queryIterator.js +41 -33
  524. package/dist/commonjs/queryIterator.js.map +1 -1
  525. package/dist/commonjs/queryMetrics/clientSideMetrics.js +2 -1
  526. package/dist/commonjs/queryMetrics/clientSideMetrics.js.map +1 -1
  527. package/dist/commonjs/queryMetrics/queryMetrics.js +14 -1
  528. package/dist/commonjs/queryMetrics/queryMetrics.js.map +1 -1
  529. package/dist/commonjs/queryMetrics/queryPreparationTime.js +5 -1
  530. package/dist/commonjs/queryMetrics/queryPreparationTime.js.map +1 -1
  531. package/dist/commonjs/queryMetrics/runtimeExecutionTimes.js +4 -1
  532. package/dist/commonjs/queryMetrics/runtimeExecutionTimes.js.map +1 -1
  533. package/dist/commonjs/queryMetrics/timeSpan.js +4 -3
  534. package/dist/commonjs/queryMetrics/timeSpan.js.map +1 -1
  535. package/dist/commonjs/request/ErrorResponse.js +19 -0
  536. package/dist/commonjs/request/ErrorResponse.js.map +1 -1
  537. package/dist/commonjs/request/FeedResponse.js +4 -0
  538. package/dist/commonjs/request/FeedResponse.js.map +1 -1
  539. package/dist/commonjs/request/RequestHandler.js +1 -2
  540. package/dist/commonjs/request/RequestHandler.js.map +1 -1
  541. package/dist/commonjs/request/ResourceResponse.js +5 -0
  542. package/dist/commonjs/request/ResourceResponse.js.map +1 -1
  543. package/dist/commonjs/request/TimeoutError.js +1 -1
  544. package/dist/commonjs/request/TimeoutError.js.map +1 -1
  545. package/dist/commonjs/request/hybridSearchQueryResult.js +5 -0
  546. package/dist/commonjs/request/hybridSearchQueryResult.js.map +1 -1
  547. package/dist/commonjs/request/request.js +5 -1
  548. package/dist/commonjs/request/request.js.map +1 -1
  549. package/dist/commonjs/retry/bulkExecutionRetryPolicy.js +5 -2
  550. package/dist/commonjs/retry/bulkExecutionRetryPolicy.js.map +1 -1
  551. package/dist/commonjs/retry/defaultRetryPolicy.js +4 -3
  552. package/dist/commonjs/retry/defaultRetryPolicy.js.map +1 -1
  553. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.js +11 -2
  554. package/dist/commonjs/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  555. package/dist/commonjs/retry/resourceThrottleRetryPolicy.js +20 -10
  556. package/dist/commonjs/retry/resourceThrottleRetryPolicy.js.map +1 -1
  557. package/dist/commonjs/retry/retryUtility.js +2 -3
  558. package/dist/commonjs/retry/retryUtility.js.map +1 -1
  559. package/dist/commonjs/retry/sessionRetryPolicy.js +8 -4
  560. package/dist/commonjs/retry/sessionRetryPolicy.js.map +1 -1
  561. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js +14 -4
  562. package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  563. package/dist/commonjs/routing/QueryRange.js +4 -0
  564. package/dist/commonjs/routing/QueryRange.js.map +1 -1
  565. package/dist/commonjs/routing/inMemoryCollectionRoutingMap.js +4 -0
  566. package/dist/commonjs/routing/inMemoryCollectionRoutingMap.js.map +1 -1
  567. package/dist/commonjs/routing/partitionKeyRangeCache.js +2 -0
  568. package/dist/commonjs/routing/partitionKeyRangeCache.js.map +1 -1
  569. package/dist/commonjs/routing/smartRoutingMapProvider.js +1 -0
  570. package/dist/commonjs/routing/smartRoutingMapProvider.js.map +1 -1
  571. package/dist/commonjs/session/VectorSessionToken.js +6 -2
  572. package/dist/commonjs/session/VectorSessionToken.js.map +1 -1
  573. package/dist/commonjs/session/sessionContainer.js +5 -3
  574. package/dist/commonjs/session/sessionContainer.js.map +1 -1
  575. package/dist/commonjs/tsdoc-metadata.json +1 -1
  576. package/dist/commonjs/utils/batch.js +15 -4
  577. package/dist/commonjs/utils/batch.js.map +1 -1
  578. package/dist/commonjs/utils/fixedSizePriorityQueue.js +4 -0
  579. package/dist/commonjs/utils/fixedSizePriorityQueue.js.map +1 -1
  580. package/dist/commonjs/utils/hashing/hash.js +1 -1
  581. package/dist/commonjs/utils/hashing/hash.js.map +1 -1
  582. package/dist/commonjs/utils/nonStreamingOrderByMap.js +2 -0
  583. package/dist/commonjs/utils/nonStreamingOrderByMap.js.map +1 -1
  584. package/dist/esm/ChangeFeedIterator.js +17 -11
  585. package/dist/esm/ChangeFeedIterator.js.map +1 -1
  586. package/dist/esm/ChangeFeedResponse.js +8 -0
  587. package/dist/esm/ChangeFeedResponse.js.map +1 -1
  588. package/dist/esm/ClientContext.js +122 -29
  589. package/dist/esm/ClientContext.js.map +1 -1
  590. package/dist/esm/CosmosClient.js +34 -3
  591. package/dist/esm/CosmosClient.js.map +1 -1
  592. package/dist/esm/CosmosDiagnostics.js +3 -0
  593. package/dist/esm/CosmosDiagnostics.js.map +1 -1
  594. package/dist/esm/PartitionKeyRangeFailoverInfo.js +8 -5
  595. package/dist/esm/PartitionKeyRangeFailoverInfo.js.map +1 -1
  596. package/dist/esm/bulk/Batcher.js +13 -3
  597. package/dist/esm/bulk/Batcher.js.map +1 -1
  598. package/dist/esm/bulk/BulkHelper.js +26 -11
  599. package/dist/esm/bulk/BulkHelper.js.map +1 -1
  600. package/dist/esm/bulk/BulkResponse.js +22 -20
  601. package/dist/esm/bulk/BulkResponse.js.map +1 -1
  602. package/dist/esm/bulk/CongestionAlgorithm.js +11 -4
  603. package/dist/esm/bulk/CongestionAlgorithm.js.map +1 -1
  604. package/dist/esm/bulk/HelperPerPartition.js +14 -1
  605. package/dist/esm/bulk/HelperPerPartition.js.map +1 -1
  606. package/dist/esm/bulk/ItemOperationContext.js +4 -0
  607. package/dist/esm/bulk/ItemOperationContext.js.map +1 -1
  608. package/dist/esm/bulk/Limiter.js +27 -18
  609. package/dist/esm/bulk/Limiter.js.map +1 -1
  610. package/dist/esm/bulk/PartitionMetric.js +4 -0
  611. package/dist/esm/bulk/PartitionMetric.js.map +1 -1
  612. package/dist/esm/client/ChangeFeed/ChangeFeedForEpkRange.js +26 -15
  613. package/dist/esm/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  614. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js +16 -8
  615. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  616. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorBuilder.js +12 -9
  617. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorBuilder.js.map +1 -1
  618. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorResponse.js +9 -0
  619. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorResponse.js.map +1 -1
  620. package/dist/esm/client/ChangeFeed/ChangeFeedPolicy.js +1 -0
  621. package/dist/esm/client/ChangeFeed/ChangeFeedPolicy.js.map +1 -1
  622. package/dist/esm/client/ChangeFeed/ChangeFeedRange.js +20 -0
  623. package/dist/esm/client/ChangeFeed/ChangeFeedRange.js.map +1 -1
  624. package/dist/esm/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js +1 -0
  625. package/dist/esm/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js.map +1 -1
  626. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromBeginning.js +1 -0
  627. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromBeginning.js.map +1 -1
  628. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromContinuation.js +1 -0
  629. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromContinuation.js.map +1 -1
  630. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromNow.js +1 -0
  631. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromNow.js.map +1 -1
  632. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromTime.js +2 -0
  633. package/dist/esm/client/ChangeFeed/ChangeFeedStartFromTime.js.map +1 -1
  634. package/dist/esm/client/ChangeFeed/CompositeContinuationToken.js +8 -0
  635. package/dist/esm/client/ChangeFeed/CompositeContinuationToken.js.map +1 -1
  636. package/dist/esm/client/ChangeFeed/ContinuationTokenForPartitionKey.js +12 -0
  637. package/dist/esm/client/ChangeFeed/ContinuationTokenForPartitionKey.js.map +1 -1
  638. package/dist/esm/client/ChangeFeed/FeedRange.js +8 -0
  639. package/dist/esm/client/ChangeFeed/FeedRange.js.map +1 -1
  640. package/dist/esm/client/ChangeFeed/FeedRangeQueue.js +1 -0
  641. package/dist/esm/client/ChangeFeed/FeedRangeQueue.js.map +1 -1
  642. package/dist/esm/client/ChangeFeed/changeFeedUtils.js +5 -5
  643. package/dist/esm/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  644. package/dist/esm/client/ClientUtils.js +1 -1
  645. package/dist/esm/client/ClientUtils.js.map +1 -1
  646. package/dist/esm/client/Conflict/Conflict.js +4 -0
  647. package/dist/esm/client/Conflict/Conflict.js.map +1 -1
  648. package/dist/esm/client/Conflict/ConflictResponse.js +2 -0
  649. package/dist/esm/client/Conflict/ConflictResponse.js.map +1 -1
  650. package/dist/esm/client/Conflict/Conflicts.js +2 -0
  651. package/dist/esm/client/Conflict/Conflicts.js.map +1 -1
  652. package/dist/esm/client/Container/Container.js +18 -3
  653. package/dist/esm/client/Container/Container.js.map +1 -1
  654. package/dist/esm/client/Container/ContainerResponse.js +2 -0
  655. package/dist/esm/client/Container/ContainerResponse.js.map +1 -1
  656. package/dist/esm/client/Container/Containers.js +4 -2
  657. package/dist/esm/client/Container/Containers.js.map +1 -1
  658. package/dist/esm/client/Database/Database.js +33 -0
  659. package/dist/esm/client/Database/Database.js.map +1 -1
  660. package/dist/esm/client/Database/DatabaseResponse.js +2 -0
  661. package/dist/esm/client/Database/DatabaseResponse.js.map +1 -1
  662. package/dist/esm/client/Database/Databases.js +3 -0
  663. package/dist/esm/client/Database/Databases.js.map +1 -1
  664. package/dist/esm/client/Item/Item.js +4 -0
  665. package/dist/esm/client/Item/Item.js.map +1 -1
  666. package/dist/esm/client/Item/ItemResponse.js +2 -0
  667. package/dist/esm/client/Item/ItemResponse.js.map +1 -1
  668. package/dist/esm/client/Item/Items.js +3 -0
  669. package/dist/esm/client/Item/Items.js.map +1 -1
  670. package/dist/esm/client/Offer/Offer.js +3 -0
  671. package/dist/esm/client/Offer/Offer.js.map +1 -1
  672. package/dist/esm/client/Offer/OfferResponse.js +2 -0
  673. package/dist/esm/client/Offer/OfferResponse.js.map +1 -1
  674. package/dist/esm/client/Offer/Offers.js +2 -0
  675. package/dist/esm/client/Offer/Offers.js.map +1 -1
  676. package/dist/esm/client/Permission/Permission.js +3 -0
  677. package/dist/esm/client/Permission/Permission.js.map +1 -1
  678. package/dist/esm/client/Permission/PermissionResponse.js +2 -0
  679. package/dist/esm/client/Permission/PermissionResponse.js.map +1 -1
  680. package/dist/esm/client/Permission/Permissions.js +2 -0
  681. package/dist/esm/client/Permission/Permissions.js.map +1 -1
  682. package/dist/esm/client/SasToken/SasTokenProperties.js +17 -0
  683. package/dist/esm/client/SasToken/SasTokenProperties.js.map +1 -1
  684. package/dist/esm/client/Script/Scripts.js +5 -0
  685. package/dist/esm/client/Script/Scripts.js.map +1 -1
  686. package/dist/esm/client/StoredProcedure/StoredProcedure.js +3 -0
  687. package/dist/esm/client/StoredProcedure/StoredProcedure.js.map +1 -1
  688. package/dist/esm/client/StoredProcedure/StoredProcedureResponse.js +4 -0
  689. package/dist/esm/client/StoredProcedure/StoredProcedureResponse.js.map +1 -1
  690. package/dist/esm/client/StoredProcedure/StoredProcedures.js +2 -0
  691. package/dist/esm/client/StoredProcedure/StoredProcedures.js.map +1 -1
  692. package/dist/esm/client/Trigger/Trigger.js +3 -0
  693. package/dist/esm/client/Trigger/Trigger.js.map +1 -1
  694. package/dist/esm/client/Trigger/TriggerResponse.js +2 -0
  695. package/dist/esm/client/Trigger/TriggerResponse.js.map +1 -1
  696. package/dist/esm/client/Trigger/Triggers.js +2 -0
  697. package/dist/esm/client/Trigger/Triggers.js.map +1 -1
  698. package/dist/esm/client/User/User.js +9 -0
  699. package/dist/esm/client/User/User.js.map +1 -1
  700. package/dist/esm/client/User/UserResponse.js +2 -0
  701. package/dist/esm/client/User/UserResponse.js.map +1 -1
  702. package/dist/esm/client/User/Users.js +2 -0
  703. package/dist/esm/client/User/Users.js.map +1 -1
  704. package/dist/esm/client/UserDefinedFunction/UserDefinedFunction.js +3 -0
  705. package/dist/esm/client/UserDefinedFunction/UserDefinedFunction.js.map +1 -1
  706. package/dist/esm/client/UserDefinedFunction/UserDefinedFunctionResponse.js +2 -0
  707. package/dist/esm/client/UserDefinedFunction/UserDefinedFunctionResponse.js.map +1 -1
  708. package/dist/esm/client/UserDefinedFunction/UserDefinedFunctions.js +2 -0
  709. package/dist/esm/client/UserDefinedFunction/UserDefinedFunctions.js.map +1 -1
  710. package/dist/esm/diagnostics/CosmosDiagnosticsContext.js +8 -7
  711. package/dist/esm/diagnostics/CosmosDiagnosticsContext.js.map +1 -1
  712. package/dist/esm/diagnostics/DiagnosticNodeInternal.js +26 -7
  713. package/dist/esm/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  714. package/dist/esm/diagnostics/DiagnosticWriter.js +1 -3
  715. package/dist/esm/diagnostics/DiagnosticWriter.js.map +1 -1
  716. package/dist/esm/diagnostics/index.js +2 -2
  717. package/dist/esm/diagnostics/index.js.map +1 -1
  718. package/dist/esm/documents/DatabaseAccount.js +20 -4
  719. package/dist/esm/documents/DatabaseAccount.js.map +1 -1
  720. package/dist/esm/documents/PartitionKey.js +1 -3
  721. package/dist/esm/documents/PartitionKey.js.map +1 -1
  722. package/dist/esm/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js +8 -2
  723. package/dist/esm/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js.map +1 -1
  724. package/dist/esm/encryption/Cache/ClientEncryptionKeyPropertiesCache.js +2 -0
  725. package/dist/esm/encryption/Cache/ClientEncryptionKeyPropertiesCache.js.map +1 -1
  726. package/dist/esm/encryption/Cache/EncryptionSettingsCache.js +2 -0
  727. package/dist/esm/encryption/Cache/EncryptionSettingsCache.js.map +1 -1
  728. package/dist/esm/encryption/Cache/KeyEncryptionKeyCache.js +2 -0
  729. package/dist/esm/encryption/Cache/KeyEncryptionKeyCache.js.map +1 -1
  730. package/dist/esm/encryption/Cache/ProtectedDataEncryptionKeyCache.js +5 -0
  731. package/dist/esm/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  732. package/dist/esm/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js +2 -0
  733. package/dist/esm/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js.map +1 -1
  734. package/dist/esm/encryption/EncryptionItemQueryIterator.js +24 -27
  735. package/dist/esm/encryption/EncryptionItemQueryIterator.js.map +1 -1
  736. package/dist/esm/encryption/EncryptionKey/DataEncryptionKey.js +7 -2
  737. package/dist/esm/encryption/EncryptionKey/DataEncryptionKey.js.map +1 -1
  738. package/dist/esm/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts +0 -1
  739. package/dist/esm/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts.map +1 -1
  740. package/dist/esm/encryption/EncryptionKey/ProtectedDataEncryptionKey.js +2 -0
  741. package/dist/esm/encryption/EncryptionKey/ProtectedDataEncryptionKey.js.map +1 -1
  742. package/dist/esm/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js +6 -5
  743. package/dist/esm/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js.map +1 -1
  744. package/dist/esm/encryption/EncryptionKeyStoreProvider.js +8 -1
  745. package/dist/esm/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  746. package/dist/esm/encryption/EncryptionManager.js +6 -0
  747. package/dist/esm/encryption/EncryptionManager.js.map +1 -1
  748. package/dist/esm/encryption/EncryptionProcessor.js +5 -0
  749. package/dist/esm/encryption/EncryptionProcessor.js.map +1 -1
  750. package/dist/esm/encryption/EncryptionQueryBuilder.js +2 -0
  751. package/dist/esm/encryption/EncryptionQueryBuilder.js.map +1 -1
  752. package/dist/esm/encryption/EncryptionSettingForProperty.js +6 -0
  753. package/dist/esm/encryption/EncryptionSettingForProperty.js.map +1 -1
  754. package/dist/esm/encryption/EncryptionSettings.js +6 -3
  755. package/dist/esm/encryption/EncryptionSettings.js.map +1 -1
  756. package/dist/esm/encryption/KeyEncryptionKey.js +4 -0
  757. package/dist/esm/encryption/KeyEncryptionKey.js.map +1 -1
  758. package/dist/esm/encryption/Serializers/StringSerializer.js +1 -1
  759. package/dist/esm/encryption/Serializers/StringSerializer.js.map +1 -1
  760. package/dist/esm/extractPartitionKey.js +2 -2
  761. package/dist/esm/extractPartitionKey.js.map +1 -1
  762. package/dist/esm/globalEndpointManager.js +21 -4
  763. package/dist/esm/globalEndpointManager.js.map +1 -1
  764. package/dist/esm/globalPartitionEndpointManager.js +8 -0
  765. package/dist/esm/globalPartitionEndpointManager.js.map +1 -1
  766. package/dist/esm/queryExecutionContext/Aggregators/AverageAggregator.js +2 -0
  767. package/dist/esm/queryExecutionContext/Aggregators/AverageAggregator.js.map +1 -1
  768. package/dist/esm/queryExecutionContext/Aggregators/CountAggregator.js +1 -0
  769. package/dist/esm/queryExecutionContext/Aggregators/CountAggregator.js.map +1 -1
  770. package/dist/esm/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js +1 -0
  771. package/dist/esm/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js.map +1 -1
  772. package/dist/esm/queryExecutionContext/Aggregators/MakeListAggregator.js +1 -0
  773. package/dist/esm/queryExecutionContext/Aggregators/MakeListAggregator.js.map +1 -1
  774. package/dist/esm/queryExecutionContext/Aggregators/MakeSetAggregator.js +1 -0
  775. package/dist/esm/queryExecutionContext/Aggregators/MakeSetAggregator.js.map +1 -1
  776. package/dist/esm/queryExecutionContext/Aggregators/MaxAggregator.js +2 -0
  777. package/dist/esm/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  778. package/dist/esm/queryExecutionContext/Aggregators/MinAggregator.js +2 -0
  779. package/dist/esm/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  780. package/dist/esm/queryExecutionContext/Aggregators/StaticValueAggregator.js +1 -0
  781. package/dist/esm/queryExecutionContext/Aggregators/StaticValueAggregator.js.map +1 -1
  782. package/dist/esm/queryExecutionContext/Aggregators/SumAggregator.js +1 -0
  783. package/dist/esm/queryExecutionContext/Aggregators/SumAggregator.js.map +1 -1
  784. package/dist/esm/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js +5 -3
  785. package/dist/esm/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js.map +1 -1
  786. package/dist/esm/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js +6 -3
  787. package/dist/esm/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js.map +1 -1
  788. package/dist/esm/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js +23 -7
  789. package/dist/esm/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js.map +1 -1
  790. package/dist/esm/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js +14 -6
  791. package/dist/esm/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js.map +1 -1
  792. package/dist/esm/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js +3 -0
  793. package/dist/esm/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js.map +1 -1
  794. package/dist/esm/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js +2 -0
  795. package/dist/esm/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js.map +1 -1
  796. package/dist/esm/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js +2 -0
  797. package/dist/esm/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js.map +1 -1
  798. package/dist/esm/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js +2 -0
  799. package/dist/esm/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js.map +1 -1
  800. package/dist/esm/queryExecutionContext/FetchResult.js +4 -0
  801. package/dist/esm/queryExecutionContext/FetchResult.js.map +1 -1
  802. package/dist/esm/queryExecutionContext/defaultQueryExecutionContext.js +14 -2
  803. package/dist/esm/queryExecutionContext/defaultQueryExecutionContext.js.map +1 -1
  804. package/dist/esm/queryExecutionContext/documentProducer.js +34 -21
  805. package/dist/esm/queryExecutionContext/documentProducer.js.map +1 -1
  806. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.js +41 -27
  807. package/dist/esm/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  808. package/dist/esm/queryExecutionContext/orderByComparator.js +1 -0
  809. package/dist/esm/queryExecutionContext/orderByComparator.js.map +1 -1
  810. package/dist/esm/queryExecutionContext/orderByDocumentProducerComparator.js +1 -0
  811. package/dist/esm/queryExecutionContext/orderByDocumentProducerComparator.js.map +1 -1
  812. package/dist/esm/queryExecutionContext/orderByQueryExecutionContext.js +1 -0
  813. package/dist/esm/queryExecutionContext/orderByQueryExecutionContext.js.map +1 -1
  814. package/dist/esm/queryExecutionContext/parallelQueryExecutionContextBase.js +20 -2
  815. package/dist/esm/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  816. package/dist/esm/queryExecutionContext/pipelinedQueryExecutionContext.js +14 -4
  817. package/dist/esm/queryExecutionContext/pipelinedQueryExecutionContext.js.map +1 -1
  818. package/dist/esm/queryIterator.js +41 -33
  819. package/dist/esm/queryIterator.js.map +1 -1
  820. package/dist/esm/queryMetrics/clientSideMetrics.js +2 -1
  821. package/dist/esm/queryMetrics/clientSideMetrics.js.map +1 -1
  822. package/dist/esm/queryMetrics/queryMetrics.js +14 -1
  823. package/dist/esm/queryMetrics/queryMetrics.js.map +1 -1
  824. package/dist/esm/queryMetrics/queryPreparationTime.js +5 -1
  825. package/dist/esm/queryMetrics/queryPreparationTime.js.map +1 -1
  826. package/dist/esm/queryMetrics/runtimeExecutionTimes.js +4 -1
  827. package/dist/esm/queryMetrics/runtimeExecutionTimes.js.map +1 -1
  828. package/dist/esm/queryMetrics/timeSpan.js +4 -3
  829. package/dist/esm/queryMetrics/timeSpan.js.map +1 -1
  830. package/dist/esm/request/ErrorResponse.js +19 -0
  831. package/dist/esm/request/ErrorResponse.js.map +1 -1
  832. package/dist/esm/request/FeedResponse.js +4 -0
  833. package/dist/esm/request/FeedResponse.js.map +1 -1
  834. package/dist/esm/request/RequestHandler.js +1 -2
  835. package/dist/esm/request/RequestHandler.js.map +1 -1
  836. package/dist/esm/request/ResourceResponse.js +5 -0
  837. package/dist/esm/request/ResourceResponse.js.map +1 -1
  838. package/dist/esm/request/TimeoutError.js +1 -1
  839. package/dist/esm/request/TimeoutError.js.map +1 -1
  840. package/dist/esm/request/hybridSearchQueryResult.js +5 -0
  841. package/dist/esm/request/hybridSearchQueryResult.js.map +1 -1
  842. package/dist/esm/request/request.js +5 -1
  843. package/dist/esm/request/request.js.map +1 -1
  844. package/dist/esm/retry/bulkExecutionRetryPolicy.js +5 -2
  845. package/dist/esm/retry/bulkExecutionRetryPolicy.js.map +1 -1
  846. package/dist/esm/retry/defaultRetryPolicy.js +4 -3
  847. package/dist/esm/retry/defaultRetryPolicy.js.map +1 -1
  848. package/dist/esm/retry/endpointDiscoveryRetryPolicy.js +11 -2
  849. package/dist/esm/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  850. package/dist/esm/retry/resourceThrottleRetryPolicy.js +20 -10
  851. package/dist/esm/retry/resourceThrottleRetryPolicy.js.map +1 -1
  852. package/dist/esm/retry/retryUtility.js +2 -3
  853. package/dist/esm/retry/retryUtility.js.map +1 -1
  854. package/dist/esm/retry/sessionRetryPolicy.js +8 -4
  855. package/dist/esm/retry/sessionRetryPolicy.js.map +1 -1
  856. package/dist/esm/retry/timeoutFailoverRetryPolicy.js +14 -4
  857. package/dist/esm/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  858. package/dist/esm/routing/QueryRange.js +4 -0
  859. package/dist/esm/routing/QueryRange.js.map +1 -1
  860. package/dist/esm/routing/inMemoryCollectionRoutingMap.js +4 -0
  861. package/dist/esm/routing/inMemoryCollectionRoutingMap.js.map +1 -1
  862. package/dist/esm/routing/partitionKeyRangeCache.js +2 -0
  863. package/dist/esm/routing/partitionKeyRangeCache.js.map +1 -1
  864. package/dist/esm/routing/smartRoutingMapProvider.js +1 -0
  865. package/dist/esm/routing/smartRoutingMapProvider.js.map +1 -1
  866. package/dist/esm/session/VectorSessionToken.js +6 -2
  867. package/dist/esm/session/VectorSessionToken.js.map +1 -1
  868. package/dist/esm/session/sessionContainer.js +5 -3
  869. package/dist/esm/session/sessionContainer.js.map +1 -1
  870. package/dist/esm/utils/batch.js +15 -4
  871. package/dist/esm/utils/batch.js.map +1 -1
  872. package/dist/esm/utils/fixedSizePriorityQueue.js +4 -0
  873. package/dist/esm/utils/fixedSizePriorityQueue.js.map +1 -1
  874. package/dist/esm/utils/hashing/hash.js +1 -1
  875. package/dist/esm/utils/hashing/hash.js.map +1 -1
  876. package/dist/esm/utils/nonStreamingOrderByMap.js +2 -0
  877. package/dist/esm/utils/nonStreamingOrderByMap.js.map +1 -1
  878. package/dist/react-native/ChangeFeedIterator.js +17 -11
  879. package/dist/react-native/ChangeFeedIterator.js.map +1 -1
  880. package/dist/react-native/ChangeFeedResponse.js +8 -0
  881. package/dist/react-native/ChangeFeedResponse.js.map +1 -1
  882. package/dist/react-native/ClientContext.js +122 -29
  883. package/dist/react-native/ClientContext.js.map +1 -1
  884. package/dist/react-native/CosmosClient.js +34 -3
  885. package/dist/react-native/CosmosClient.js.map +1 -1
  886. package/dist/react-native/CosmosDiagnostics.js +3 -0
  887. package/dist/react-native/CosmosDiagnostics.js.map +1 -1
  888. package/dist/react-native/PartitionKeyRangeFailoverInfo.js +8 -5
  889. package/dist/react-native/PartitionKeyRangeFailoverInfo.js.map +1 -1
  890. package/dist/react-native/bulk/Batcher.js +13 -3
  891. package/dist/react-native/bulk/Batcher.js.map +1 -1
  892. package/dist/react-native/bulk/BulkHelper.js +26 -11
  893. package/dist/react-native/bulk/BulkHelper.js.map +1 -1
  894. package/dist/react-native/bulk/BulkResponse.js +22 -20
  895. package/dist/react-native/bulk/BulkResponse.js.map +1 -1
  896. package/dist/react-native/bulk/CongestionAlgorithm.js +11 -4
  897. package/dist/react-native/bulk/CongestionAlgorithm.js.map +1 -1
  898. package/dist/react-native/bulk/HelperPerPartition.js +14 -1
  899. package/dist/react-native/bulk/HelperPerPartition.js.map +1 -1
  900. package/dist/react-native/bulk/ItemOperationContext.js +4 -0
  901. package/dist/react-native/bulk/ItemOperationContext.js.map +1 -1
  902. package/dist/react-native/bulk/Limiter.js +27 -18
  903. package/dist/react-native/bulk/Limiter.js.map +1 -1
  904. package/dist/react-native/bulk/PartitionMetric.js +4 -0
  905. package/dist/react-native/bulk/PartitionMetric.js.map +1 -1
  906. package/dist/react-native/client/ChangeFeed/ChangeFeedForEpkRange.js +26 -15
  907. package/dist/react-native/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  908. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js +16 -8
  909. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  910. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorBuilder.js +12 -9
  911. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorBuilder.js.map +1 -1
  912. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorResponse.js +9 -0
  913. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorResponse.js.map +1 -1
  914. package/dist/react-native/client/ChangeFeed/ChangeFeedPolicy.js +1 -0
  915. package/dist/react-native/client/ChangeFeed/ChangeFeedPolicy.js.map +1 -1
  916. package/dist/react-native/client/ChangeFeed/ChangeFeedRange.js +20 -0
  917. package/dist/react-native/client/ChangeFeed/ChangeFeedRange.js.map +1 -1
  918. package/dist/react-native/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js +1 -0
  919. package/dist/react-native/client/ChangeFeed/ChangeFeedRetentionTimeSpan.js.map +1 -1
  920. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromBeginning.js +1 -0
  921. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromBeginning.js.map +1 -1
  922. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromContinuation.js +1 -0
  923. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromContinuation.js.map +1 -1
  924. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromNow.js +1 -0
  925. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromNow.js.map +1 -1
  926. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromTime.js +2 -0
  927. package/dist/react-native/client/ChangeFeed/ChangeFeedStartFromTime.js.map +1 -1
  928. package/dist/react-native/client/ChangeFeed/CompositeContinuationToken.js +8 -0
  929. package/dist/react-native/client/ChangeFeed/CompositeContinuationToken.js.map +1 -1
  930. package/dist/react-native/client/ChangeFeed/ContinuationTokenForPartitionKey.js +12 -0
  931. package/dist/react-native/client/ChangeFeed/ContinuationTokenForPartitionKey.js.map +1 -1
  932. package/dist/react-native/client/ChangeFeed/FeedRange.js +8 -0
  933. package/dist/react-native/client/ChangeFeed/FeedRange.js.map +1 -1
  934. package/dist/react-native/client/ChangeFeed/FeedRangeQueue.js +1 -0
  935. package/dist/react-native/client/ChangeFeed/FeedRangeQueue.js.map +1 -1
  936. package/dist/react-native/client/ChangeFeed/changeFeedUtils.js +5 -5
  937. package/dist/react-native/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  938. package/dist/react-native/client/ClientUtils.js +1 -1
  939. package/dist/react-native/client/ClientUtils.js.map +1 -1
  940. package/dist/react-native/client/Conflict/Conflict.js +4 -0
  941. package/dist/react-native/client/Conflict/Conflict.js.map +1 -1
  942. package/dist/react-native/client/Conflict/ConflictResponse.js +2 -0
  943. package/dist/react-native/client/Conflict/ConflictResponse.js.map +1 -1
  944. package/dist/react-native/client/Conflict/Conflicts.js +2 -0
  945. package/dist/react-native/client/Conflict/Conflicts.js.map +1 -1
  946. package/dist/react-native/client/Container/Container.js +18 -3
  947. package/dist/react-native/client/Container/Container.js.map +1 -1
  948. package/dist/react-native/client/Container/ContainerResponse.js +2 -0
  949. package/dist/react-native/client/Container/ContainerResponse.js.map +1 -1
  950. package/dist/react-native/client/Container/Containers.js +4 -2
  951. package/dist/react-native/client/Container/Containers.js.map +1 -1
  952. package/dist/react-native/client/Database/Database.js +33 -0
  953. package/dist/react-native/client/Database/Database.js.map +1 -1
  954. package/dist/react-native/client/Database/DatabaseResponse.js +2 -0
  955. package/dist/react-native/client/Database/DatabaseResponse.js.map +1 -1
  956. package/dist/react-native/client/Database/Databases.js +3 -0
  957. package/dist/react-native/client/Database/Databases.js.map +1 -1
  958. package/dist/react-native/client/Item/Item.js +4 -0
  959. package/dist/react-native/client/Item/Item.js.map +1 -1
  960. package/dist/react-native/client/Item/ItemResponse.js +2 -0
  961. package/dist/react-native/client/Item/ItemResponse.js.map +1 -1
  962. package/dist/react-native/client/Item/Items.js +3 -0
  963. package/dist/react-native/client/Item/Items.js.map +1 -1
  964. package/dist/react-native/client/Offer/Offer.js +3 -0
  965. package/dist/react-native/client/Offer/Offer.js.map +1 -1
  966. package/dist/react-native/client/Offer/OfferResponse.js +2 -0
  967. package/dist/react-native/client/Offer/OfferResponse.js.map +1 -1
  968. package/dist/react-native/client/Offer/Offers.js +2 -0
  969. package/dist/react-native/client/Offer/Offers.js.map +1 -1
  970. package/dist/react-native/client/Permission/Permission.js +3 -0
  971. package/dist/react-native/client/Permission/Permission.js.map +1 -1
  972. package/dist/react-native/client/Permission/PermissionResponse.js +2 -0
  973. package/dist/react-native/client/Permission/PermissionResponse.js.map +1 -1
  974. package/dist/react-native/client/Permission/Permissions.js +2 -0
  975. package/dist/react-native/client/Permission/Permissions.js.map +1 -1
  976. package/dist/react-native/client/SasToken/SasTokenProperties.js +17 -0
  977. package/dist/react-native/client/SasToken/SasTokenProperties.js.map +1 -1
  978. package/dist/react-native/client/Script/Scripts.js +5 -0
  979. package/dist/react-native/client/Script/Scripts.js.map +1 -1
  980. package/dist/react-native/client/StoredProcedure/StoredProcedure.js +3 -0
  981. package/dist/react-native/client/StoredProcedure/StoredProcedure.js.map +1 -1
  982. package/dist/react-native/client/StoredProcedure/StoredProcedureResponse.js +4 -0
  983. package/dist/react-native/client/StoredProcedure/StoredProcedureResponse.js.map +1 -1
  984. package/dist/react-native/client/StoredProcedure/StoredProcedures.js +2 -0
  985. package/dist/react-native/client/StoredProcedure/StoredProcedures.js.map +1 -1
  986. package/dist/react-native/client/Trigger/Trigger.js +3 -0
  987. package/dist/react-native/client/Trigger/Trigger.js.map +1 -1
  988. package/dist/react-native/client/Trigger/TriggerResponse.js +2 -0
  989. package/dist/react-native/client/Trigger/TriggerResponse.js.map +1 -1
  990. package/dist/react-native/client/Trigger/Triggers.js +2 -0
  991. package/dist/react-native/client/Trigger/Triggers.js.map +1 -1
  992. package/dist/react-native/client/User/User.js +9 -0
  993. package/dist/react-native/client/User/User.js.map +1 -1
  994. package/dist/react-native/client/User/UserResponse.js +2 -0
  995. package/dist/react-native/client/User/UserResponse.js.map +1 -1
  996. package/dist/react-native/client/User/Users.js +2 -0
  997. package/dist/react-native/client/User/Users.js.map +1 -1
  998. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunction.js +3 -0
  999. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunction.js.map +1 -1
  1000. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunctionResponse.js +2 -0
  1001. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunctionResponse.js.map +1 -1
  1002. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunctions.js +2 -0
  1003. package/dist/react-native/client/UserDefinedFunction/UserDefinedFunctions.js.map +1 -1
  1004. package/dist/react-native/diagnostics/CosmosDiagnosticsContext.js +8 -7
  1005. package/dist/react-native/diagnostics/CosmosDiagnosticsContext.js.map +1 -1
  1006. package/dist/react-native/diagnostics/DiagnosticNodeInternal.js +26 -7
  1007. package/dist/react-native/diagnostics/DiagnosticNodeInternal.js.map +1 -1
  1008. package/dist/react-native/diagnostics/DiagnosticWriter.js +1 -3
  1009. package/dist/react-native/diagnostics/DiagnosticWriter.js.map +1 -1
  1010. package/dist/react-native/diagnostics/index.js +2 -2
  1011. package/dist/react-native/diagnostics/index.js.map +1 -1
  1012. package/dist/react-native/documents/DatabaseAccount.js +20 -4
  1013. package/dist/react-native/documents/DatabaseAccount.js.map +1 -1
  1014. package/dist/react-native/documents/PartitionKey.js +1 -3
  1015. package/dist/react-native/documents/PartitionKey.js.map +1 -1
  1016. package/dist/react-native/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js +8 -2
  1017. package/dist/react-native/encryption/AeadAes256CbcHmacSha256Algorithm/AeadAes256CbcHmacSha256Algorithm.js.map +1 -1
  1018. package/dist/react-native/encryption/Cache/ClientEncryptionKeyPropertiesCache.js +2 -0
  1019. package/dist/react-native/encryption/Cache/ClientEncryptionKeyPropertiesCache.js.map +1 -1
  1020. package/dist/react-native/encryption/Cache/EncryptionSettingsCache.js +2 -0
  1021. package/dist/react-native/encryption/Cache/EncryptionSettingsCache.js.map +1 -1
  1022. package/dist/react-native/encryption/Cache/KeyEncryptionKeyCache.js +2 -0
  1023. package/dist/react-native/encryption/Cache/KeyEncryptionKeyCache.js.map +1 -1
  1024. package/dist/react-native/encryption/Cache/ProtectedDataEncryptionKeyCache.js +5 -0
  1025. package/dist/react-native/encryption/Cache/ProtectedDataEncryptionKeyCache.js.map +1 -1
  1026. package/dist/react-native/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js +2 -0
  1027. package/dist/react-native/encryption/ClientEncryptionKey/ClientEncryptionKeyResponse.js.map +1 -1
  1028. package/dist/react-native/encryption/EncryptionItemQueryIterator.js +24 -27
  1029. package/dist/react-native/encryption/EncryptionItemQueryIterator.js.map +1 -1
  1030. package/dist/react-native/encryption/EncryptionKey/DataEncryptionKey.js +7 -2
  1031. package/dist/react-native/encryption/EncryptionKey/DataEncryptionKey.js.map +1 -1
  1032. package/dist/react-native/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts +0 -1
  1033. package/dist/react-native/encryption/EncryptionKey/ProtectedDataEncryptionKey.d.ts.map +1 -1
  1034. package/dist/react-native/encryption/EncryptionKey/ProtectedDataEncryptionKey.js +2 -0
  1035. package/dist/react-native/encryption/EncryptionKey/ProtectedDataEncryptionKey.js.map +1 -1
  1036. package/dist/react-native/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js +6 -5
  1037. package/dist/react-native/encryption/EncryptionKeyResolver/AzureKeyVaultEncryptionKeyResolver.js.map +1 -1
  1038. package/dist/react-native/encryption/EncryptionKeyStoreProvider.js +8 -1
  1039. package/dist/react-native/encryption/EncryptionKeyStoreProvider.js.map +1 -1
  1040. package/dist/react-native/encryption/EncryptionManager.js +6 -0
  1041. package/dist/react-native/encryption/EncryptionManager.js.map +1 -1
  1042. package/dist/react-native/encryption/EncryptionProcessor.js +5 -0
  1043. package/dist/react-native/encryption/EncryptionProcessor.js.map +1 -1
  1044. package/dist/react-native/encryption/EncryptionQueryBuilder.js +2 -0
  1045. package/dist/react-native/encryption/EncryptionQueryBuilder.js.map +1 -1
  1046. package/dist/react-native/encryption/EncryptionSettingForProperty.js +6 -0
  1047. package/dist/react-native/encryption/EncryptionSettingForProperty.js.map +1 -1
  1048. package/dist/react-native/encryption/EncryptionSettings.js +6 -3
  1049. package/dist/react-native/encryption/EncryptionSettings.js.map +1 -1
  1050. package/dist/react-native/encryption/KeyEncryptionKey.js +4 -0
  1051. package/dist/react-native/encryption/KeyEncryptionKey.js.map +1 -1
  1052. package/dist/react-native/encryption/Serializers/StringSerializer.js +1 -1
  1053. package/dist/react-native/encryption/Serializers/StringSerializer.js.map +1 -1
  1054. package/dist/react-native/extractPartitionKey.js +2 -2
  1055. package/dist/react-native/extractPartitionKey.js.map +1 -1
  1056. package/dist/react-native/globalEndpointManager.js +21 -4
  1057. package/dist/react-native/globalEndpointManager.js.map +1 -1
  1058. package/dist/react-native/globalPartitionEndpointManager.js +8 -0
  1059. package/dist/react-native/globalPartitionEndpointManager.js.map +1 -1
  1060. package/dist/react-native/queryExecutionContext/Aggregators/AverageAggregator.js +2 -0
  1061. package/dist/react-native/queryExecutionContext/Aggregators/AverageAggregator.js.map +1 -1
  1062. package/dist/react-native/queryExecutionContext/Aggregators/CountAggregator.js +1 -0
  1063. package/dist/react-native/queryExecutionContext/Aggregators/CountAggregator.js.map +1 -1
  1064. package/dist/react-native/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js +1 -0
  1065. package/dist/react-native/queryExecutionContext/Aggregators/GlobalStatisticsAggregator.js.map +1 -1
  1066. package/dist/react-native/queryExecutionContext/Aggregators/MakeListAggregator.js +1 -0
  1067. package/dist/react-native/queryExecutionContext/Aggregators/MakeListAggregator.js.map +1 -1
  1068. package/dist/react-native/queryExecutionContext/Aggregators/MakeSetAggregator.js +1 -0
  1069. package/dist/react-native/queryExecutionContext/Aggregators/MakeSetAggregator.js.map +1 -1
  1070. package/dist/react-native/queryExecutionContext/Aggregators/MaxAggregator.js +2 -0
  1071. package/dist/react-native/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  1072. package/dist/react-native/queryExecutionContext/Aggregators/MinAggregator.js +2 -0
  1073. package/dist/react-native/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  1074. package/dist/react-native/queryExecutionContext/Aggregators/StaticValueAggregator.js +1 -0
  1075. package/dist/react-native/queryExecutionContext/Aggregators/StaticValueAggregator.js.map +1 -1
  1076. package/dist/react-native/queryExecutionContext/Aggregators/SumAggregator.js +1 -0
  1077. package/dist/react-native/queryExecutionContext/Aggregators/SumAggregator.js.map +1 -1
  1078. package/dist/react-native/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js +5 -3
  1079. package/dist/react-native/queryExecutionContext/EndpointComponent/GroupByEndpointComponent.js.map +1 -1
  1080. package/dist/react-native/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js +6 -3
  1081. package/dist/react-native/queryExecutionContext/EndpointComponent/GroupByValueEndpointComponent.js.map +1 -1
  1082. package/dist/react-native/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js +23 -7
  1083. package/dist/react-native/queryExecutionContext/EndpointComponent/NonStreamingOrderByDistinctEndpointComponent.js.map +1 -1
  1084. package/dist/react-native/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js +14 -6
  1085. package/dist/react-native/queryExecutionContext/EndpointComponent/NonStreamingOrderByEndpointComponent.js.map +1 -1
  1086. package/dist/react-native/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js +3 -0
  1087. package/dist/react-native/queryExecutionContext/EndpointComponent/OffsetLimitEndpointComponent.js.map +1 -1
  1088. package/dist/react-native/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js +2 -0
  1089. package/dist/react-native/queryExecutionContext/EndpointComponent/OrderByEndpointComponent.js.map +1 -1
  1090. package/dist/react-native/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js +2 -0
  1091. package/dist/react-native/queryExecutionContext/EndpointComponent/OrderedDistinctEndpointComponent.js.map +1 -1
  1092. package/dist/react-native/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js +2 -0
  1093. package/dist/react-native/queryExecutionContext/EndpointComponent/UnorderedDistinctEndpointComponent.js.map +1 -1
  1094. package/dist/react-native/queryExecutionContext/FetchResult.js +4 -0
  1095. package/dist/react-native/queryExecutionContext/FetchResult.js.map +1 -1
  1096. package/dist/react-native/queryExecutionContext/defaultQueryExecutionContext.js +14 -2
  1097. package/dist/react-native/queryExecutionContext/defaultQueryExecutionContext.js.map +1 -1
  1098. package/dist/react-native/queryExecutionContext/documentProducer.js +34 -21
  1099. package/dist/react-native/queryExecutionContext/documentProducer.js.map +1 -1
  1100. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.js +41 -27
  1101. package/dist/react-native/queryExecutionContext/hybridQueryExecutionContext.js.map +1 -1
  1102. package/dist/react-native/queryExecutionContext/orderByComparator.js +1 -0
  1103. package/dist/react-native/queryExecutionContext/orderByComparator.js.map +1 -1
  1104. package/dist/react-native/queryExecutionContext/orderByDocumentProducerComparator.js +1 -0
  1105. package/dist/react-native/queryExecutionContext/orderByDocumentProducerComparator.js.map +1 -1
  1106. package/dist/react-native/queryExecutionContext/orderByQueryExecutionContext.js +1 -0
  1107. package/dist/react-native/queryExecutionContext/orderByQueryExecutionContext.js.map +1 -1
  1108. package/dist/react-native/queryExecutionContext/parallelQueryExecutionContextBase.js +20 -2
  1109. package/dist/react-native/queryExecutionContext/parallelQueryExecutionContextBase.js.map +1 -1
  1110. package/dist/react-native/queryExecutionContext/pipelinedQueryExecutionContext.js +14 -4
  1111. package/dist/react-native/queryExecutionContext/pipelinedQueryExecutionContext.js.map +1 -1
  1112. package/dist/react-native/queryIterator.js +41 -33
  1113. package/dist/react-native/queryIterator.js.map +1 -1
  1114. package/dist/react-native/queryMetrics/clientSideMetrics.js +2 -1
  1115. package/dist/react-native/queryMetrics/clientSideMetrics.js.map +1 -1
  1116. package/dist/react-native/queryMetrics/queryMetrics.js +14 -1
  1117. package/dist/react-native/queryMetrics/queryMetrics.js.map +1 -1
  1118. package/dist/react-native/queryMetrics/queryPreparationTime.js +5 -1
  1119. package/dist/react-native/queryMetrics/queryPreparationTime.js.map +1 -1
  1120. package/dist/react-native/queryMetrics/runtimeExecutionTimes.js +4 -1
  1121. package/dist/react-native/queryMetrics/runtimeExecutionTimes.js.map +1 -1
  1122. package/dist/react-native/queryMetrics/timeSpan.js +4 -3
  1123. package/dist/react-native/queryMetrics/timeSpan.js.map +1 -1
  1124. package/dist/react-native/request/ErrorResponse.js +19 -0
  1125. package/dist/react-native/request/ErrorResponse.js.map +1 -1
  1126. package/dist/react-native/request/FeedResponse.js +4 -0
  1127. package/dist/react-native/request/FeedResponse.js.map +1 -1
  1128. package/dist/react-native/request/RequestHandler.js +1 -2
  1129. package/dist/react-native/request/RequestHandler.js.map +1 -1
  1130. package/dist/react-native/request/ResourceResponse.js +5 -0
  1131. package/dist/react-native/request/ResourceResponse.js.map +1 -1
  1132. package/dist/react-native/request/TimeoutError.js +1 -1
  1133. package/dist/react-native/request/TimeoutError.js.map +1 -1
  1134. package/dist/react-native/request/hybridSearchQueryResult.js +5 -0
  1135. package/dist/react-native/request/hybridSearchQueryResult.js.map +1 -1
  1136. package/dist/react-native/request/request.js +5 -1
  1137. package/dist/react-native/request/request.js.map +1 -1
  1138. package/dist/react-native/retry/bulkExecutionRetryPolicy.js +5 -2
  1139. package/dist/react-native/retry/bulkExecutionRetryPolicy.js.map +1 -1
  1140. package/dist/react-native/retry/defaultRetryPolicy.js +4 -3
  1141. package/dist/react-native/retry/defaultRetryPolicy.js.map +1 -1
  1142. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.js +11 -2
  1143. package/dist/react-native/retry/endpointDiscoveryRetryPolicy.js.map +1 -1
  1144. package/dist/react-native/retry/resourceThrottleRetryPolicy.js +20 -10
  1145. package/dist/react-native/retry/resourceThrottleRetryPolicy.js.map +1 -1
  1146. package/dist/react-native/retry/retryUtility.js +2 -3
  1147. package/dist/react-native/retry/retryUtility.js.map +1 -1
  1148. package/dist/react-native/retry/sessionRetryPolicy.js +8 -4
  1149. package/dist/react-native/retry/sessionRetryPolicy.js.map +1 -1
  1150. package/dist/react-native/retry/timeoutFailoverRetryPolicy.js +14 -4
  1151. package/dist/react-native/retry/timeoutFailoverRetryPolicy.js.map +1 -1
  1152. package/dist/react-native/routing/QueryRange.js +4 -0
  1153. package/dist/react-native/routing/QueryRange.js.map +1 -1
  1154. package/dist/react-native/routing/inMemoryCollectionRoutingMap.js +4 -0
  1155. package/dist/react-native/routing/inMemoryCollectionRoutingMap.js.map +1 -1
  1156. package/dist/react-native/routing/partitionKeyRangeCache.js +2 -0
  1157. package/dist/react-native/routing/partitionKeyRangeCache.js.map +1 -1
  1158. package/dist/react-native/routing/smartRoutingMapProvider.js +1 -0
  1159. package/dist/react-native/routing/smartRoutingMapProvider.js.map +1 -1
  1160. package/dist/react-native/session/VectorSessionToken.js +6 -2
  1161. package/dist/react-native/session/VectorSessionToken.js.map +1 -1
  1162. package/dist/react-native/session/sessionContainer.js +5 -3
  1163. package/dist/react-native/session/sessionContainer.js.map +1 -1
  1164. package/dist/react-native/utils/batch.js +15 -4
  1165. package/dist/react-native/utils/batch.js.map +1 -1
  1166. package/dist/react-native/utils/fixedSizePriorityQueue.js +4 -0
  1167. package/dist/react-native/utils/fixedSizePriorityQueue.js.map +1 -1
  1168. package/dist/react-native/utils/hashing/hash.js +1 -1
  1169. package/dist/react-native/utils/hashing/hash.js.map +1 -1
  1170. package/dist/react-native/utils/nonStreamingOrderByMap.js +2 -0
  1171. package/dist/react-native/utils/nonStreamingOrderByMap.js.map +1 -1
  1172. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"resourceThrottleRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/resourceThrottleRetryPolicy.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,yDAAmD;AAKnD;;;GAGG;AACH,MAAa,2BAA2B;IAoBtC,YAAY,OAAqB;;QAnBjC,mCAAmC;QAC5B,6BAAwB,GAAW,CAAC,CAAC;QAC5C,2FAA2F;QACpF,4BAAuB,GAAW,CAAC,CAAC;QAC3C,mFAAmF;QAC5E,mBAAc,GAAW,CAAC,CAAC;QAehC,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,oBAAoB,mCAAI,wBAAS,CAAC,oCAAoC,CAAC;QAC/F,IAAI,CAAC,sBAAsB;YACzB,MAAA,OAAO,CAAC,gCAAgC,mCAAI,wBAAS,CAAC,sCAAsC,CAAC;QAC/F,MAAM,gBAAgB,GACpB,MAAA,OAAO,CAAC,oBAAoB,mCAAI,wBAAS,CAAC,oCAAoC,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;IACnC,CAAC;IACD;;;OAGG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC;QAEtC,gCAAgC;QAChC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClD,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBAExB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC;gBACpD,CAAC;qBAAM,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBAC9B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;gBAC3C,CAAC;gBAED,IAAI,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBACpD,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,cAAc,CAAC;oBACpD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACtE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3DD,kEA2DC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { Constants } from \"../common/constants.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { ErrorResponse } from \"../request/index.js\";\nimport type { RetryOptions } from \"./retryOptions.js\";\n\n/**\n * This class implements the resource throttle retry policy for requests.\n * @hidden\n */\nexport class ResourceThrottleRetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount: number = 0;\n /** Cummulative wait time in milliseconds for a request while the retries are happening. */\n public cummulativeWaitTimeinMs: number = 0;\n /** Retry interval in milliseconds to wait before the next request will be sent. */\n public retryAfterInMs: number = 0;\n\n /** Max wait time in milliseconds to wait for a request while the retries are happening. */\n private timeoutInMs: number;\n /**\n * @param maxTries - Max number of retries to be performed for a request.\n * @param fixedRetryIntervalInMs - Fixed retry interval in milliseconds to wait between each\n * retry ignoring the retryAfter returned as part of the response.\n * @param timeoutInSeconds - Max wait time in seconds to wait for a request while the\n * retries are happening.\n */\n\n private maxTries: number;\n private fixedRetryIntervalInMs: number;\n constructor(options: RetryOptions) {\n this.maxTries = options.maxRetryAttemptCount ?? Constants.ThrottledRequestMaxRetryAttemptCount;\n this.fixedRetryIntervalInMs =\n options.fixedRetryIntervalInMilliseconds ?? Constants.ThrottledRequestFixedRetryIntervalInMs;\n const timeoutInSeconds =\n options.maxWaitTimeInSeconds ?? Constants.ThrottledRequestMaxWaitTimeInSeconds;\n this.timeoutInMs = timeoutInSeconds * 1000;\n this.currentRetryAttemptCount = 0;\n this.cummulativeWaitTimeinMs = 0;\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 ): Promise<boolean> {\n // TODO: any custom error object\n if (err) {\n if (this.currentRetryAttemptCount < this.maxTries) {\n this.currentRetryAttemptCount++;\n this.retryAfterInMs = 0;\n\n if (this.fixedRetryIntervalInMs) {\n this.retryAfterInMs = this.fixedRetryIntervalInMs;\n } else if (err.retryAfterInMs) {\n this.retryAfterInMs = err.retryAfterInMs;\n }\n\n if (this.cummulativeWaitTimeinMs < this.timeoutInMs) {\n this.cummulativeWaitTimeinMs += this.retryAfterInMs;\n diagnosticNode.addData({ successfulRetryPolicy: \"resourceThrottle\" });\n return true;\n }\n }\n }\n return false;\n }\n}\n"]}
1
+ {"version":3,"file":"resourceThrottleRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/resourceThrottleRetryPolicy.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,yDAAmD;AAKnD;;;GAGG;AACH,MAAa,2BAA2B;IACtC,mCAAmC;IAC5B,wBAAwB,GAAW,CAAC,CAAC;IAC5C,2FAA2F;IACpF,uBAAuB,GAAW,CAAC,CAAC;IAC3C,mFAAmF;IAC5E,cAAc,GAAW,CAAC,CAAC;IAElC,2FAA2F;IACnF,WAAW,CAAS;IAC5B;;;;;;OAMG;IAEK,QAAQ,CAAS;IACjB,sBAAsB,CAAS;IACvC,YAAY,OAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,oBAAoB,IAAI,wBAAS,CAAC,oCAAoC,CAAC;QAC/F,IAAI,CAAC,sBAAsB;YACzB,OAAO,CAAC,gCAAgC,IAAI,wBAAS,CAAC,sCAAsC,CAAC;QAC/F,MAAM,gBAAgB,GACpB,OAAO,CAAC,oBAAoB,IAAI,wBAAS,CAAC,oCAAoC,CAAC;QACjF,IAAI,CAAC,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAAC;QAC3C,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC;IACnC,CAAC;IACD;;;OAGG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC;QAEtC,gCAAgC;QAChC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClD,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBAExB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;oBAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC;gBACpD,CAAC;qBAAM,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBAC9B,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;gBAC3C,CAAC;gBAED,IAAI,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBACpD,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,cAAc,CAAC;oBACpD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBACtE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA3DD,kEA2DC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { Constants } from \"../common/constants.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { ErrorResponse } from \"../request/index.js\";\nimport type { RetryOptions } from \"./retryOptions.js\";\n\n/**\n * This class implements the resource throttle retry policy for requests.\n * @hidden\n */\nexport class ResourceThrottleRetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount: number = 0;\n /** Cummulative wait time in milliseconds for a request while the retries are happening. */\n public cummulativeWaitTimeinMs: number = 0;\n /** Retry interval in milliseconds to wait before the next request will be sent. */\n public retryAfterInMs: number = 0;\n\n /** Max wait time in milliseconds to wait for a request while the retries are happening. */\n private timeoutInMs: number;\n /**\n * @param maxTries - Max number of retries to be performed for a request.\n * @param fixedRetryIntervalInMs - Fixed retry interval in milliseconds to wait between each\n * retry ignoring the retryAfter returned as part of the response.\n * @param timeoutInSeconds - Max wait time in seconds to wait for a request while the\n * retries are happening.\n */\n\n private maxTries: number;\n private fixedRetryIntervalInMs: number;\n constructor(options: RetryOptions) {\n this.maxTries = options.maxRetryAttemptCount ?? Constants.ThrottledRequestMaxRetryAttemptCount;\n this.fixedRetryIntervalInMs =\n options.fixedRetryIntervalInMilliseconds ?? Constants.ThrottledRequestFixedRetryIntervalInMs;\n const timeoutInSeconds =\n options.maxWaitTimeInSeconds ?? Constants.ThrottledRequestMaxWaitTimeInSeconds;\n this.timeoutInMs = timeoutInSeconds * 1000;\n this.currentRetryAttemptCount = 0;\n this.cummulativeWaitTimeinMs = 0;\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 ): Promise<boolean> {\n // TODO: any custom error object\n if (err) {\n if (this.currentRetryAttemptCount < this.maxTries) {\n this.currentRetryAttemptCount++;\n this.retryAfterInMs = 0;\n\n if (this.fixedRetryIntervalInMs) {\n this.retryAfterInMs = this.fixedRetryIntervalInMs;\n } else if (err.retryAfterInMs) {\n this.retryAfterInMs = err.retryAfterInMs;\n }\n\n if (this.cummulativeWaitTimeinMs < this.timeoutInMs) {\n this.cummulativeWaitTimeinMs += this.retryAfterInMs;\n diagnosticNode.addData({ successfulRetryPolicy: \"resourceThrottle\" });\n return true;\n }\n }\n }\n return false;\n }\n}\n"]}
@@ -21,12 +21,11 @@ const timeoutFailoverRetryPolicy_js_1 = require("./timeoutFailoverRetryPolicy.js
21
21
  async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retryPolicies, requestContext, executeRequest, }) {
22
22
  // TODO: any response
23
23
  return (0, diagnostics_js_1.addDiagnosticChild)(async (localDiagnosticNode) => {
24
- var _a;
25
24
  localDiagnosticNode.addData({ requestAttempNumber: retryContext.retryCount });
26
25
  if (!retryPolicies) {
27
26
  retryPolicies = {
28
27
  endpointDiscoveryRetryPolicy: new endpointDiscoveryRetryPolicy_js_1.EndpointDiscoveryRetryPolicy(requestContext.globalEndpointManager, requestContext.operationType, requestContext.globalPartitionEndpointManager),
29
- resourceThrottleRetryPolicy: new resourceThrottleRetryPolicy_js_1.ResourceThrottleRetryPolicy((_a = requestContext.connectionPolicy.retryOptions) !== null && _a !== void 0 ? _a : {}),
28
+ resourceThrottleRetryPolicy: new resourceThrottleRetryPolicy_js_1.ResourceThrottleRetryPolicy(requestContext.connectionPolicy.retryOptions ?? {}),
30
29
  sessionReadRetryPolicy: new sessionRetryPolicy_js_1.SessionRetryPolicy(requestContext.globalEndpointManager, requestContext.resourceType, requestContext.operationType, requestContext.connectionPolicy),
31
30
  defaultRetryPolicy: new defaultRetryPolicy_js_1.DefaultRetryPolicy(requestContext.operationType),
32
31
  timeoutFailoverRetryPolicy: new timeoutFailoverRetryPolicy_js_1.TimeoutFailoverRetryPolicy(requestContext.globalEndpointManager, requestContext.headers, requestContext.method, requestContext.resourceType, requestContext.operationType, requestContext.connectionPolicy.enableEndpointDiscovery, requestContext.connectionPolicy.enablePartitionLevelFailover, requestContext.globalPartitionEndpointManager),
@@ -94,7 +93,7 @@ async function execute({ diagnosticNode, retryContext = { retryCount: 0 }, retry
94
93
  retryPolicies.resourceThrottleRetryPolicy.currentRetryAttemptCount;
95
94
  headers[constants_js_1.Constants.ThrottleRetryWaitTimeInMs] =
96
95
  retryPolicies.resourceThrottleRetryPolicy.cummulativeWaitTimeinMs;
97
- err.headers = Object.assign(Object.assign({}, err.headers), headers);
96
+ err.headers = { ...err.headers, ...headers };
98
97
  throw err;
99
98
  }
100
99
  else {
@@ -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 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"]}
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"]}
@@ -7,6 +7,14 @@ const index_js_1 = require("../common/index.js");
7
7
  * @hidden
8
8
  */
9
9
  class SessionRetryPolicy {
10
+ globalEndpointManager;
11
+ resourceType;
12
+ operationType;
13
+ connectionPolicy;
14
+ /** Current retry attempt count. */
15
+ currentRetryAttemptCount = 0;
16
+ /** Retry interval in milliseconds. */
17
+ retryAfterInMs = 0;
10
18
  /**
11
19
  * @param globalEndpointManager - The GlobalEndpointManager instance.
12
20
  */
@@ -15,10 +23,6 @@ class SessionRetryPolicy {
15
23
  this.resourceType = resourceType;
16
24
  this.operationType = operationType;
17
25
  this.connectionPolicy = connectionPolicy;
18
- /** Current retry attempt count. */
19
- this.currentRetryAttemptCount = 0;
20
- /** Retry interval in milliseconds. */
21
- this.retryAfterInMs = 0;
22
26
  }
23
27
  /**
24
28
  * Determines whether the request should be retried or not.
@@ -1 +1 @@
1
- {"version":3,"file":"sessionRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/sessionRetryPolicy.ts"],"names":[],"mappings":";;;AAIA,iDAAmD;AAOnD;;;GAGG;AACH,MAAa,kBAAkB;IAM7B;;OAEG;IACH,YACU,qBAA4C,EAC5C,YAA0B,EAC1B,aAA4B,EAC5B,gBAAkC;QAHlC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAZ5C,mCAAmC;QAC5B,6BAAwB,GAAG,CAAC,CAAC;QACpC,sCAAsC;QAC/B,mBAAc,GAAG,CAAC,CAAC;IAUvB,CAAC;IAEJ;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC,EACtC,YAA2B;QAE3B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,IAAI,CAAC,qBAAqB,CAAC,4BAA4B,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAC9F,CAAC;YACD,iGAAiG;YACjG,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,aAAa,CAAC;gBACjD,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE;gBACrD,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC1B,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;gBAClF,YAAY,CAAC,6BAA6B;oBACxC,IAAI,CAAC,wBAAwB,KAAK,SAAS,CAAC,MAAM,CAAC;gBACrD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,wBAAwB,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC1B,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAC,kDAAkD;gBACzG,YAAY,CAAC,6BAA6B,GAAG,IAAI,CAAC;gBAClD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAtED,gDAsEC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { OperationType, ResourceType } from \"../common/index.js\";\nimport { isReadRequest } from \"../common/index.js\";\nimport type { ConnectionPolicy } from \"../documents/index.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 session consistent reads.\n * @hidden\n */\nexport class SessionRetryPolicy implements RetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount = 0;\n /** Retry interval in milliseconds. */\n public retryAfterInMs = 0;\n\n /**\n * @param globalEndpointManager - The GlobalEndpointManager instance.\n */\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private resourceType: ResourceType,\n private operationType: OperationType,\n private connectionPolicy: ConnectionPolicy,\n ) {}\n\n /**\n * Determines whether the request should be retried or not.\n * @param err - Error returned by the request.\n * @param callback - The callback function which takes bool argument which specifies whether the request\n * will be retried or not.\n */\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n ): Promise<boolean> {\n if (!err) {\n return false;\n }\n\n if (!retryContext) {\n return false;\n }\n\n if (!this.connectionPolicy.enableEndpointDiscovery) {\n return false;\n }\n\n if (\n this.globalEndpointManager.canUseMultipleWriteLocations(this.resourceType, this.operationType)\n ) {\n // If we can write to multiple locations, we should against every write endpoint until we succeed\n const endpoints = isReadRequest(this.operationType)\n ? await this.globalEndpointManager.getReadEndpoints()\n : await this.globalEndpointManager.getWriteEndpoints();\n if (this.currentRetryAttemptCount > endpoints.length) {\n return false;\n } else {\n this.currentRetryAttemptCount++;\n retryContext.retryCount++;\n retryContext.retryRequestOnPreferredLocations = this.currentRetryAttemptCount > 1;\n retryContext.clearSessionTokenNotAvailable =\n this.currentRetryAttemptCount === endpoints.length;\n diagnosticNode.addData({ successfulRetryPolicy: \"session\" });\n return true;\n }\n } else {\n if (this.currentRetryAttemptCount > 1) {\n return false;\n } else {\n this.currentRetryAttemptCount++;\n retryContext.retryCount++;\n retryContext.retryRequestOnPreferredLocations = false; // Forces all operations to primary write endpoint\n retryContext.clearSessionTokenNotAvailable = true;\n diagnosticNode.addData({ successfulRetryPolicy: \"session\" });\n return true;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"sessionRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/sessionRetryPolicy.ts"],"names":[],"mappings":";;;AAIA,iDAAmD;AAOnD;;;GAGG;AACH,MAAa,kBAAkB;IAUnB;IACA;IACA;IACA;IAZV,mCAAmC;IAC5B,wBAAwB,GAAG,CAAC,CAAC;IACpC,sCAAsC;IAC/B,cAAc,GAAG,CAAC,CAAC;IAE1B;;OAEG;IACH,YACU,qBAA4C,EAC5C,YAA0B,EAC1B,aAA4B,EAC5B,gBAAkC;QAHlC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,qBAAgB,GAAhB,gBAAgB,CAAkB;IACzC,CAAC;IAEJ;;;;;OAKG;IACI,KAAK,CAAC,WAAW,CACtB,GAAkB,EAClB,cAAsC,EACtC,YAA2B;QAE3B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IACE,IAAI,CAAC,qBAAqB,CAAC,4BAA4B,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,EAC9F,CAAC;YACD,iGAAiG;YACjG,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,IAAI,CAAC,aAAa,CAAC;gBACjD,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE;gBACrD,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;YACzD,IAAI,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC1B,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;gBAClF,YAAY,CAAC,6BAA6B;oBACxC,IAAI,CAAC,wBAAwB,KAAK,SAAS,CAAC,MAAM,CAAC;gBACrD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,wBAAwB,GAAG,CAAC,EAAE,CAAC;gBACtC,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,YAAY,CAAC,UAAU,EAAE,CAAC;gBAC1B,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAC,kDAAkD;gBACzG,YAAY,CAAC,6BAA6B,GAAG,IAAI,CAAC;gBAClD,cAAc,CAAC,OAAO,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC7D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAtED,gDAsEC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport type { OperationType, ResourceType } from \"../common/index.js\";\nimport { isReadRequest } from \"../common/index.js\";\nimport type { ConnectionPolicy } from \"../documents/index.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 session consistent reads.\n * @hidden\n */\nexport class SessionRetryPolicy implements RetryPolicy {\n /** Current retry attempt count. */\n public currentRetryAttemptCount = 0;\n /** Retry interval in milliseconds. */\n public retryAfterInMs = 0;\n\n /**\n * @param globalEndpointManager - The GlobalEndpointManager instance.\n */\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private resourceType: ResourceType,\n private operationType: OperationType,\n private connectionPolicy: ConnectionPolicy,\n ) {}\n\n /**\n * Determines whether the request should be retried or not.\n * @param err - Error returned by the request.\n * @param callback - The callback function which takes bool argument which specifies whether the request\n * will be retried or not.\n */\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n ): Promise<boolean> {\n if (!err) {\n return false;\n }\n\n if (!retryContext) {\n return false;\n }\n\n if (!this.connectionPolicy.enableEndpointDiscovery) {\n return false;\n }\n\n if (\n this.globalEndpointManager.canUseMultipleWriteLocations(this.resourceType, this.operationType)\n ) {\n // If we can write to multiple locations, we should against every write endpoint until we succeed\n const endpoints = isReadRequest(this.operationType)\n ? await this.globalEndpointManager.getReadEndpoints()\n : await this.globalEndpointManager.getWriteEndpoints();\n if (this.currentRetryAttemptCount > endpoints.length) {\n return false;\n } else {\n this.currentRetryAttemptCount++;\n retryContext.retryCount++;\n retryContext.retryRequestOnPreferredLocations = this.currentRetryAttemptCount > 1;\n retryContext.clearSessionTokenNotAvailable =\n this.currentRetryAttemptCount === endpoints.length;\n diagnosticNode.addData({ successfulRetryPolicy: \"session\" });\n return true;\n }\n } else {\n if (this.currentRetryAttemptCount > 1) {\n return false;\n } else {\n this.currentRetryAttemptCount++;\n retryContext.retryCount++;\n retryContext.retryRequestOnPreferredLocations = false; // Forces all operations to primary write endpoint\n retryContext.clearSessionTokenNotAvailable = true;\n diagnosticNode.addData({ successfulRetryPolicy: \"session\" });\n return true;\n }\n }\n }\n}\n"]}
@@ -13,6 +13,20 @@ const TimeoutError_js_1 = require("../request/TimeoutError.js");
13
13
  * @hidden
14
14
  */
15
15
  class TimeoutFailoverRetryPolicy {
16
+ globalEndpointManager;
17
+ headers;
18
+ methodType;
19
+ resourceType;
20
+ operationType;
21
+ enableEndPointDiscovery;
22
+ enablePartitionLevelFailover;
23
+ globalPartitionEndpointManager;
24
+ maxRetryAttemptCount = 120;
25
+ maxServiceUnavailableRetryCount = 1;
26
+ retryAfterInMs = 0;
27
+ failoverRetryCount = 0;
28
+ request;
29
+ locationEndpoint;
16
30
  constructor(globalEndpointManager, headers, methodType, resourceType, operationType, enableEndPointDiscovery, enablePartitionLevelFailover, globalPartitionEndpointManager) {
17
31
  this.globalEndpointManager = globalEndpointManager;
18
32
  this.headers = headers;
@@ -22,10 +36,6 @@ class TimeoutFailoverRetryPolicy {
22
36
  this.enableEndPointDiscovery = enableEndPointDiscovery;
23
37
  this.enablePartitionLevelFailover = enablePartitionLevelFailover;
24
38
  this.globalPartitionEndpointManager = globalPartitionEndpointManager;
25
- this.maxRetryAttemptCount = 120;
26
- this.maxServiceUnavailableRetryCount = 1;
27
- this.retryAfterInMs = 0;
28
- this.failoverRetryCount = 0;
29
39
  }
30
40
  /**
31
41
  * Checks if a timeout request is valid for the timeout failover retry policy.
@@ -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, 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
+ {"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, 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"]}
@@ -4,6 +4,10 @@ exports.QueryRange = void 0;
4
4
  const index_js_1 = require("../common/index.js");
5
5
  /** @hidden */
6
6
  class QueryRange {
7
+ min;
8
+ max;
9
+ isMinInclusive;
10
+ isMaxInclusive;
7
11
  /**
8
12
  * Represents a QueryRange.
9
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"QueryRange.js","sourceRoot":"","sources":["../../../src/routing/QueryRange.ts"],"names":[],"mappings":";;;AAGA,iDAA+C;AAG/C,cAAc;AACd,MAAa,UAAU;IAMrB;;;;;;;;OAQG;IACH,YACE,QAAgB,EAChB,QAAgB,EAChB,cAAuB,EACvB,cAAuB;QAEvB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IACM,QAAQ,CAAC,KAAiB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,uDAAuD;QAC5E,MAAM,MAAM,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACzD,IACE,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC;gBAChF,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,EAChF,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,WAAW;QAChB,OAAO,CACL,IAAI,CAAC,GAAG,KAAK,oBAAS,CAAC,8BAA8B,CAAC,qCAAqC;YAC3F,IAAI,CAAC,GAAG,KAAK,oBAAS,CAAC,8BAA8B,CAAC,qCAAqC;YAC3F,IAAI,CAAC,cAAc,KAAK,IAAI;YAC5B,IAAI,CAAC,cAAc,KAAK,KAAK,CAC9B,CAAC;IACJ,CAAC;IAEM,OAAO;QACZ,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;IAChF,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,sBAAsB,CAAC,iBAAoC;QACvE,OAAO,IAAI,UAAU,CACnB,iBAAiB,CAAC,oBAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAC3D,iBAAiB,CAAC,oBAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAC3D,IAAI,EACJ,KAAK,CACN,CAAC;IACJ,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,cAAkC;QAC5D,OAAO,IAAI,UAAU,CACnB,cAAc,CAAC,GAAG,EAClB,cAAc,CAAC,GAAG,EAClB,cAAc,CAAC,cAAc,EAC7B,cAAc,CAAC,cAAc,CAC9B,CAAC;IACJ,CAAC;CACF;AAtFD,gCAsFC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { PartitionKeyRange } from \"../client/Container/PartitionKeyRange.js\";\nimport { Constants } from \"../common/index.js\";\nimport type { QueryRange as ResponseQueryRange } from \"../request/ErrorResponse.js\";\n\n/** @hidden */\nexport class QueryRange {\n public min: string;\n public max: string;\n public isMinInclusive: boolean;\n public isMaxInclusive: boolean;\n\n /**\n * Represents a QueryRange.\n *\n * @param rangeMin - min\n * @param rangeMin - max\n * @param isMinInclusive - isMinInclusive\n * @param isMaxInclusive - isMaxInclusive\n * @hidden\n */\n constructor(\n rangeMin: string,\n rangeMax: string,\n isMinInclusive: boolean,\n isMaxInclusive: boolean,\n ) {\n this.min = rangeMin;\n this.max = rangeMax;\n this.isMinInclusive = isMinInclusive;\n this.isMaxInclusive = isMaxInclusive;\n }\n public overlaps(other: QueryRange): boolean {\n const range1 = this; // eslint-disable-line @typescript-eslint/no-this-alias\n const range2 = other;\n if (range1 === undefined || range2 === undefined) {\n return false;\n }\n if (range1.isEmpty() || range2.isEmpty()) {\n return false;\n }\n\n if (range1.min <= range2.max || range2.min <= range1.max) {\n if (\n (range1.min === range2.max && !(range1.isMinInclusive && range2.isMaxInclusive)) ||\n (range2.min === range1.max && !(range2.isMinInclusive && range1.isMaxInclusive))\n ) {\n return false;\n }\n return true;\n }\n return false;\n }\n\n public isFullRange(): boolean {\n return (\n this.min === Constants.EffectivePartitionKeyConstants.MinimumInclusiveEffectivePartitionKey &&\n this.max === Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey &&\n this.isMinInclusive === true &&\n this.isMaxInclusive === false\n );\n }\n\n public isEmpty(): boolean {\n return !(this.isMinInclusive && this.isMaxInclusive) && this.min === this.max;\n }\n /**\n * Parse a QueryRange from a partitionKeyRange\n * @returns QueryRange\n * @hidden\n */\n public static parsePartitionKeyRange(partitionKeyRange: PartitionKeyRange): QueryRange {\n return new QueryRange(\n partitionKeyRange[Constants.PartitionKeyRange.MinInclusive],\n partitionKeyRange[Constants.PartitionKeyRange.MaxExclusive],\n true,\n false,\n );\n }\n /**\n * Parse a QueryRange from a dictionary\n * @returns QueryRange\n * @hidden\n */\n public static parseFromDict(queryRangeDict: ResponseQueryRange): QueryRange {\n return new QueryRange(\n queryRangeDict.min,\n queryRangeDict.max,\n queryRangeDict.isMinInclusive,\n queryRangeDict.isMaxInclusive,\n );\n }\n}\n"]}
1
+ {"version":3,"file":"QueryRange.js","sourceRoot":"","sources":["../../../src/routing/QueryRange.ts"],"names":[],"mappings":";;;AAGA,iDAA+C;AAG/C,cAAc;AACd,MAAa,UAAU;IACd,GAAG,CAAS;IACZ,GAAG,CAAS;IACZ,cAAc,CAAU;IACxB,cAAc,CAAU;IAE/B;;;;;;;;OAQG;IACH,YACE,QAAgB,EAChB,QAAgB,EAChB,cAAuB,EACvB,cAAuB;QAEvB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC;QACpB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IACM,QAAQ,CAAC,KAAiB;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,uDAAuD;QAC5E,MAAM,MAAM,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACzD,IACE,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC;gBAChF,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,EAChF,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,WAAW;QAChB,OAAO,CACL,IAAI,CAAC,GAAG,KAAK,oBAAS,CAAC,8BAA8B,CAAC,qCAAqC;YAC3F,IAAI,CAAC,GAAG,KAAK,oBAAS,CAAC,8BAA8B,CAAC,qCAAqC;YAC3F,IAAI,CAAC,cAAc,KAAK,IAAI;YAC5B,IAAI,CAAC,cAAc,KAAK,KAAK,CAC9B,CAAC;IACJ,CAAC;IAEM,OAAO;QACZ,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC;IAChF,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,sBAAsB,CAAC,iBAAoC;QACvE,OAAO,IAAI,UAAU,CACnB,iBAAiB,CAAC,oBAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAC3D,iBAAiB,CAAC,oBAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAC3D,IAAI,EACJ,KAAK,CACN,CAAC;IACJ,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,aAAa,CAAC,cAAkC;QAC5D,OAAO,IAAI,UAAU,CACnB,cAAc,CAAC,GAAG,EAClB,cAAc,CAAC,GAAG,EAClB,cAAc,CAAC,cAAc,EAC7B,cAAc,CAAC,cAAc,CAC9B,CAAC;IACJ,CAAC;CACF;AAtFD,gCAsFC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { PartitionKeyRange } from \"../client/Container/PartitionKeyRange.js\";\nimport { Constants } from \"../common/index.js\";\nimport type { QueryRange as ResponseQueryRange } from \"../request/ErrorResponse.js\";\n\n/** @hidden */\nexport class QueryRange {\n public min: string;\n public max: string;\n public isMinInclusive: boolean;\n public isMaxInclusive: boolean;\n\n /**\n * Represents a QueryRange.\n *\n * @param rangeMin - min\n * @param rangeMin - max\n * @param isMinInclusive - isMinInclusive\n * @param isMaxInclusive - isMaxInclusive\n * @hidden\n */\n constructor(\n rangeMin: string,\n rangeMax: string,\n isMinInclusive: boolean,\n isMaxInclusive: boolean,\n ) {\n this.min = rangeMin;\n this.max = rangeMax;\n this.isMinInclusive = isMinInclusive;\n this.isMaxInclusive = isMaxInclusive;\n }\n public overlaps(other: QueryRange): boolean {\n const range1 = this; // eslint-disable-line @typescript-eslint/no-this-alias\n const range2 = other;\n if (range1 === undefined || range2 === undefined) {\n return false;\n }\n if (range1.isEmpty() || range2.isEmpty()) {\n return false;\n }\n\n if (range1.min <= range2.max || range2.min <= range1.max) {\n if (\n (range1.min === range2.max && !(range1.isMinInclusive && range2.isMaxInclusive)) ||\n (range2.min === range1.max && !(range2.isMinInclusive && range1.isMaxInclusive))\n ) {\n return false;\n }\n return true;\n }\n return false;\n }\n\n public isFullRange(): boolean {\n return (\n this.min === Constants.EffectivePartitionKeyConstants.MinimumInclusiveEffectivePartitionKey &&\n this.max === Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey &&\n this.isMinInclusive === true &&\n this.isMaxInclusive === false\n );\n }\n\n public isEmpty(): boolean {\n return !(this.isMinInclusive && this.isMaxInclusive) && this.min === this.max;\n }\n /**\n * Parse a QueryRange from a partitionKeyRange\n * @returns QueryRange\n * @hidden\n */\n public static parsePartitionKeyRange(partitionKeyRange: PartitionKeyRange): QueryRange {\n return new QueryRange(\n partitionKeyRange[Constants.PartitionKeyRange.MinInclusive],\n partitionKeyRange[Constants.PartitionKeyRange.MaxExclusive],\n true,\n false,\n );\n }\n /**\n * Parse a QueryRange from a dictionary\n * @returns QueryRange\n * @hidden\n */\n public static parseFromDict(queryRangeDict: ResponseQueryRange): QueryRange {\n return new QueryRange(\n queryRangeDict.min,\n queryRangeDict.max,\n queryRangeDict.isMinInclusive,\n queryRangeDict.isMaxInclusive,\n );\n }\n}\n"]}
@@ -5,6 +5,10 @@ const index_js_1 = require("../common/index.js");
5
5
  const QueryRange_js_1 = require("./QueryRange.js");
6
6
  /** @hidden */
7
7
  class InMemoryCollectionRoutingMap {
8
+ orderedPartitionKeyRanges;
9
+ orderedRanges;
10
+ // TODO: chrande made this public, even though it is implementation detail for a test
11
+ orderedPartitionInfo;
8
12
  /**
9
13
  * Represents a InMemoryCollectionRoutingMap Object,
10
14
  * Stores partition key ranges in an efficient way with some additional information and provides
@@ -1 +1 @@
1
- {"version":3,"file":"inMemoryCollectionRoutingMap.js","sourceRoot":"","sources":["../../../src/routing/inMemoryCollectionRoutingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { PartitionKeyRange } from \"../client/index.js\";\nimport { Constants } from \"../common/index.js\";\nimport { QueryRange } from \"./QueryRange.js\";\n\n/** @hidden */\nexport class InMemoryCollectionRoutingMap {\n private orderedPartitionKeyRanges: PartitionKeyRange[];\n private orderedRanges: QueryRange[];\n // TODO: chrande made this public, even though it is implementation detail for a test\n public orderedPartitionInfo: unknown;\n\n /**\n * Represents a InMemoryCollectionRoutingMap Object,\n * Stores partition key ranges in an efficient way with some additional information and provides\n * convenience methods for working with set of ranges.\n */\n constructor(orderedPartitionKeyRanges: PartitionKeyRange[], orderedPartitionInfo: unknown) {\n this.orderedPartitionKeyRanges = orderedPartitionKeyRanges;\n this.orderedRanges = orderedPartitionKeyRanges.map((pkr) => {\n return new QueryRange(\n pkr[Constants.PartitionKeyRange.MinInclusive],\n pkr[Constants.PartitionKeyRange.MaxExclusive],\n true,\n false,\n );\n });\n this.orderedPartitionInfo = orderedPartitionInfo;\n }\n public getOrderedParitionKeyRanges(): PartitionKeyRange[] {\n return this.orderedPartitionKeyRanges;\n }\n\n public getOverlappingRanges(providedQueryRanges: QueryRange | QueryRange[]): PartitionKeyRange[] {\n // TODO This code has all kinds of smells. Multiple iterations and sorts just to grab overlapping ranges\n // stfaul attempted to bring it down to one for-loop and failed\n const pqr: QueryRange[] = Array.isArray(providedQueryRanges)\n ? providedQueryRanges\n : [providedQueryRanges];\n const minToPartitionRange: any = {}; // TODO: any\n\n // this for loop doesn't invoke any async callback\n for (const queryRange of pqr) {\n if (queryRange.isEmpty()) {\n continue;\n }\n\n if (queryRange.isFullRange()) {\n return this.orderedPartitionKeyRanges;\n }\n\n const minIndex = this.orderedRanges.findIndex((range) => {\n if (queryRange.min > range.min && queryRange.min < range.max) {\n return true;\n }\n if (queryRange.min === range.min) {\n return true;\n }\n if (queryRange.min === range.max) {\n return true;\n }\n });\n\n if (minIndex < 0) {\n throw new Error(\n \"error in collection routing map, queried value is less than the start range.\",\n );\n }\n\n // Start at the end and work backwards\n let maxIndex: number;\n for (let i = this.orderedRanges.length - 1; i >= 0; i--) {\n const range = this.orderedRanges[i];\n if (queryRange.max > range.min && queryRange.max < range.max) {\n maxIndex = i;\n break;\n }\n if (queryRange.max === range.min) {\n maxIndex = i;\n break;\n }\n if (queryRange.max === range.max) {\n maxIndex = i;\n break;\n }\n }\n\n if (maxIndex > this.orderedRanges.length) {\n throw new Error(\n \"error in collection routing map, queried value is greater than the end range.\",\n );\n }\n\n for (let j = minIndex; j < maxIndex + 1; j++) {\n if (queryRange.overlaps(this.orderedRanges[j])) {\n minToPartitionRange[\n this.orderedPartitionKeyRanges[j][Constants.PartitionKeyRange.MinInclusive]\n ] = this.orderedPartitionKeyRanges[j];\n }\n }\n }\n\n const overlappingPartitionKeyRanges = Object.keys(minToPartitionRange).map(\n (k) => minToPartitionRange[k],\n );\n\n return overlappingPartitionKeyRanges.sort((a, b) => {\n return a[Constants.PartitionKeyRange.MinInclusive].localeCompare(\n b[Constants.PartitionKeyRange.MinInclusive],\n );\n });\n }\n}\n"]}
1
+ {"version":3,"file":"inMemoryCollectionRoutingMap.js","sourceRoot":"","sources":["../../../src/routing/inMemoryCollectionRoutingMap.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { PartitionKeyRange } from \"../client/index.js\";\nimport { Constants } from \"../common/index.js\";\nimport { QueryRange } from \"./QueryRange.js\";\n\n/** @hidden */\nexport class InMemoryCollectionRoutingMap {\n private orderedPartitionKeyRanges: PartitionKeyRange[];\n private orderedRanges: QueryRange[];\n // TODO: chrande made this public, even though it is implementation detail for a test\n public orderedPartitionInfo: unknown;\n\n /**\n * Represents a InMemoryCollectionRoutingMap Object,\n * Stores partition key ranges in an efficient way with some additional information and provides\n * convenience methods for working with set of ranges.\n */\n constructor(orderedPartitionKeyRanges: PartitionKeyRange[], orderedPartitionInfo: unknown) {\n this.orderedPartitionKeyRanges = orderedPartitionKeyRanges;\n this.orderedRanges = orderedPartitionKeyRanges.map((pkr) => {\n return new QueryRange(\n pkr[Constants.PartitionKeyRange.MinInclusive],\n pkr[Constants.PartitionKeyRange.MaxExclusive],\n true,\n false,\n );\n });\n this.orderedPartitionInfo = orderedPartitionInfo;\n }\n public getOrderedParitionKeyRanges(): PartitionKeyRange[] {\n return this.orderedPartitionKeyRanges;\n }\n\n public getOverlappingRanges(providedQueryRanges: QueryRange | QueryRange[]): PartitionKeyRange[] {\n // TODO This code has all kinds of smells. Multiple iterations and sorts just to grab overlapping ranges\n // stfaul attempted to bring it down to one for-loop and failed\n const pqr: QueryRange[] = Array.isArray(providedQueryRanges)\n ? providedQueryRanges\n : [providedQueryRanges];\n const minToPartitionRange: any = {}; // TODO: any\n\n // this for loop doesn't invoke any async callback\n for (const queryRange of pqr) {\n if (queryRange.isEmpty()) {\n continue;\n }\n\n if (queryRange.isFullRange()) {\n return this.orderedPartitionKeyRanges;\n }\n\n const minIndex = this.orderedRanges.findIndex((range) => {\n if (queryRange.min > range.min && queryRange.min < range.max) {\n return true;\n }\n if (queryRange.min === range.min) {\n return true;\n }\n if (queryRange.min === range.max) {\n return true;\n }\n });\n\n if (minIndex < 0) {\n throw new Error(\n \"error in collection routing map, queried value is less than the start range.\",\n );\n }\n\n // Start at the end and work backwards\n let maxIndex: number;\n for (let i = this.orderedRanges.length - 1; i >= 0; i--) {\n const range = this.orderedRanges[i];\n if (queryRange.max > range.min && queryRange.max < range.max) {\n maxIndex = i;\n break;\n }\n if (queryRange.max === range.min) {\n maxIndex = i;\n break;\n }\n if (queryRange.max === range.max) {\n maxIndex = i;\n break;\n }\n }\n\n if (maxIndex > this.orderedRanges.length) {\n throw new Error(\n \"error in collection routing map, queried value is greater than the end range.\",\n );\n }\n\n for (let j = minIndex; j < maxIndex + 1; j++) {\n if (queryRange.overlaps(this.orderedRanges[j])) {\n minToPartitionRange[\n this.orderedPartitionKeyRanges[j][Constants.PartitionKeyRange.MinInclusive]\n ] = this.orderedPartitionKeyRanges[j];\n }\n }\n }\n\n const overlappingPartitionKeyRanges = Object.keys(minToPartitionRange).map(\n (k) => minToPartitionRange[k],\n );\n\n return overlappingPartitionKeyRanges.sort((a, b) => {\n return a[Constants.PartitionKeyRange.MinInclusive].localeCompare(\n b[Constants.PartitionKeyRange.MinInclusive],\n );\n });\n }\n}\n"]}
@@ -10,6 +10,8 @@ const CollectionRoutingMapFactory_js_1 = require("./CollectionRoutingMapFactory.
10
10
  const hash_js_1 = require("../utils/hashing/hash.js");
11
11
  /** @hidden */
12
12
  class PartitionKeyRangeCache {
13
+ clientContext;
14
+ collectionRoutingMapByCollectionId;
13
15
  constructor(clientContext) {
14
16
  this.clientContext = clientContext;
15
17
  this.collectionRoutingMapByCollectionId = {};
@@ -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;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
+ {"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;IAKb;IAJZ,kCAAkC,CAExC;IAEF,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"]}
@@ -8,6 +8,7 @@ const QueryRange_js_1 = require("./QueryRange.js");
8
8
  exports.PARITIONKEYRANGE = constants_js_1.Constants.PartitionKeyRange;
9
9
  /** @hidden */
10
10
  class SmartRoutingMapProvider {
11
+ partitionKeyRangeCache;
11
12
  constructor(clientContext) {
12
13
  this.partitionKeyRangeCache = new partitionKeyRangeCache_js_1.PartitionKeyRangeCache(clientContext);
13
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"smartRoutingMapProvider.js","sourceRoot":"","sources":["../../../src/routing/smartRoutingMapProvider.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { ClientContext } from \"../ClientContext.js\";\nimport { Constants } from \"../common/constants.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { PartitionKeyRangeCache } from \"./partitionKeyRangeCache.js\";\nimport { QueryRange } from \"./QueryRange.js\";\n\n/** @hidden */\nexport const PARITIONKEYRANGE = Constants.PartitionKeyRange;\n\n/** @hidden */\nexport class SmartRoutingMapProvider {\n private partitionKeyRangeCache: PartitionKeyRangeCache;\n\n constructor(clientContext: ClientContext) {\n this.partitionKeyRangeCache = new PartitionKeyRangeCache(clientContext);\n }\n private static _secondRangeIsAfterFirstRange(range1: QueryRange, range2: QueryRange): boolean {\n if (typeof range1.max === \"undefined\") {\n throw new Error(\"range1 must have max\");\n }\n\n if (typeof range2.min === \"undefined\") {\n throw new Error(\"range2 must have min\");\n }\n\n if (range1.max > range2.min) {\n // r.min < #previous_r.max\n return false;\n } else {\n if (range1.max === range2.min && range1.isMaxInclusive && range2.isMinInclusive) {\n // the inclusive ending endpoint of previous_r is the same as the inclusive beginning endpoint of r\n // they share a point\n return false;\n }\n return true;\n }\n }\n\n private static _isSortedAndNonOverlapping(ranges: QueryRange[]): boolean {\n for (let idx = 1; idx < ranges.length; idx++) {\n const previousR = ranges[idx - 1];\n const r = ranges[idx];\n if (!this._secondRangeIsAfterFirstRange(previousR, r)) {\n return false;\n }\n }\n return true;\n }\n\n private static _stringMax(a: string, b: string): string {\n return a >= b ? a : b;\n }\n\n private static _stringCompare(a: string, b: string): 1 | 0 | -1 {\n return a === b ? 0 : a > b ? 1 : -1;\n }\n\n private static _subtractRange(r: QueryRange, partitionKeyRange: any): QueryRange {\n const left = this._stringMax(partitionKeyRange[PARITIONKEYRANGE.MaxExclusive], r.min);\n const leftInclusive = this._stringCompare(left, r.min) === 0 ? r.isMinInclusive : false;\n return new QueryRange(left, r.max, leftInclusive, r.isMaxInclusive);\n }\n\n /**\n * Given the sorted ranges and a collection, invokes the callback on the list of overlapping partition key ranges\n * @param callback - Function execute on the overlapping partition key ranges result,\n * takes two parameters error, partition key ranges\n * @hidden\n */\n public async getOverlappingRanges(\n collectionLink: string,\n sortedRanges: QueryRange[],\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<any[]> {\n // validate if the list is non- overlapping and sorted TODO: any PartitionKeyRanges\n if (!SmartRoutingMapProvider._isSortedAndNonOverlapping(sortedRanges)) {\n throw new Error(\"the list of ranges is not a non-overlapping sorted ranges\");\n }\n\n let partitionKeyRanges: any[] = []; // TODO: any ParitionKeyRanges\n\n if (sortedRanges.length === 0) {\n return partitionKeyRanges;\n }\n\n const collectionRoutingMap = await this.partitionKeyRangeCache.onCollectionRoutingMap(\n collectionLink,\n diagnosticNode,\n );\n\n let index = 0;\n let currentProvidedRange = sortedRanges[index];\n for (;;) {\n if (currentProvidedRange.isEmpty()) {\n // skip and go to the next item\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n continue;\n }\n\n let queryRange;\n if (partitionKeyRanges.length > 0) {\n queryRange = SmartRoutingMapProvider._subtractRange(\n currentProvidedRange,\n partitionKeyRanges[partitionKeyRanges.length - 1],\n );\n } else {\n queryRange = currentProvidedRange;\n }\n\n const overlappingRanges = collectionRoutingMap.getOverlappingRanges(queryRange);\n if (overlappingRanges.length <= 0) {\n throw new Error(`error: returned overlapping ranges for queryRange ${queryRange} is empty`);\n }\n partitionKeyRanges = partitionKeyRanges.concat(overlappingRanges);\n\n const lastKnownTargetRange = QueryRange.parsePartitionKeyRange(\n partitionKeyRanges[partitionKeyRanges.length - 1],\n );\n if (!lastKnownTargetRange) {\n throw new Error(\"expected lastKnowTargetRange to be truthy\");\n }\n // the overlapping ranges must contain the requested range\n\n if (\n SmartRoutingMapProvider._stringCompare(currentProvidedRange.max, lastKnownTargetRange.max) >\n 0\n ) {\n throw new Error(`error: returned overlapping ranges ${overlappingRanges} \\\n does not contain the requested range ${queryRange}`);\n }\n\n // the current range is contained in partitionKeyRanges just move forward\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n\n while (\n SmartRoutingMapProvider._stringCompare(\n currentProvidedRange.max,\n lastKnownTargetRange.max,\n ) <= 0\n ) {\n // the current range is covered too.just move forward\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"smartRoutingMapProvider.js","sourceRoot":"","sources":["../../../src/routing/smartRoutingMapProvider.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { ClientContext } from \"../ClientContext.js\";\nimport { Constants } from \"../common/constants.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { PartitionKeyRangeCache } from \"./partitionKeyRangeCache.js\";\nimport { QueryRange } from \"./QueryRange.js\";\n\n/** @hidden */\nexport const PARITIONKEYRANGE = Constants.PartitionKeyRange;\n\n/** @hidden */\nexport class SmartRoutingMapProvider {\n private partitionKeyRangeCache: PartitionKeyRangeCache;\n\n constructor(clientContext: ClientContext) {\n this.partitionKeyRangeCache = new PartitionKeyRangeCache(clientContext);\n }\n private static _secondRangeIsAfterFirstRange(range1: QueryRange, range2: QueryRange): boolean {\n if (typeof range1.max === \"undefined\") {\n throw new Error(\"range1 must have max\");\n }\n\n if (typeof range2.min === \"undefined\") {\n throw new Error(\"range2 must have min\");\n }\n\n if (range1.max > range2.min) {\n // r.min < #previous_r.max\n return false;\n } else {\n if (range1.max === range2.min && range1.isMaxInclusive && range2.isMinInclusive) {\n // the inclusive ending endpoint of previous_r is the same as the inclusive beginning endpoint of r\n // they share a point\n return false;\n }\n return true;\n }\n }\n\n private static _isSortedAndNonOverlapping(ranges: QueryRange[]): boolean {\n for (let idx = 1; idx < ranges.length; idx++) {\n const previousR = ranges[idx - 1];\n const r = ranges[idx];\n if (!this._secondRangeIsAfterFirstRange(previousR, r)) {\n return false;\n }\n }\n return true;\n }\n\n private static _stringMax(a: string, b: string): string {\n return a >= b ? a : b;\n }\n\n private static _stringCompare(a: string, b: string): 1 | 0 | -1 {\n return a === b ? 0 : a > b ? 1 : -1;\n }\n\n private static _subtractRange(r: QueryRange, partitionKeyRange: any): QueryRange {\n const left = this._stringMax(partitionKeyRange[PARITIONKEYRANGE.MaxExclusive], r.min);\n const leftInclusive = this._stringCompare(left, r.min) === 0 ? r.isMinInclusive : false;\n return new QueryRange(left, r.max, leftInclusive, r.isMaxInclusive);\n }\n\n /**\n * Given the sorted ranges and a collection, invokes the callback on the list of overlapping partition key ranges\n * @param callback - Function execute on the overlapping partition key ranges result,\n * takes two parameters error, partition key ranges\n * @hidden\n */\n public async getOverlappingRanges(\n collectionLink: string,\n sortedRanges: QueryRange[],\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<any[]> {\n // validate if the list is non- overlapping and sorted TODO: any PartitionKeyRanges\n if (!SmartRoutingMapProvider._isSortedAndNonOverlapping(sortedRanges)) {\n throw new Error(\"the list of ranges is not a non-overlapping sorted ranges\");\n }\n\n let partitionKeyRanges: any[] = []; // TODO: any ParitionKeyRanges\n\n if (sortedRanges.length === 0) {\n return partitionKeyRanges;\n }\n\n const collectionRoutingMap = await this.partitionKeyRangeCache.onCollectionRoutingMap(\n collectionLink,\n diagnosticNode,\n );\n\n let index = 0;\n let currentProvidedRange = sortedRanges[index];\n for (;;) {\n if (currentProvidedRange.isEmpty()) {\n // skip and go to the next item\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n continue;\n }\n\n let queryRange;\n if (partitionKeyRanges.length > 0) {\n queryRange = SmartRoutingMapProvider._subtractRange(\n currentProvidedRange,\n partitionKeyRanges[partitionKeyRanges.length - 1],\n );\n } else {\n queryRange = currentProvidedRange;\n }\n\n const overlappingRanges = collectionRoutingMap.getOverlappingRanges(queryRange);\n if (overlappingRanges.length <= 0) {\n throw new Error(`error: returned overlapping ranges for queryRange ${queryRange} is empty`);\n }\n partitionKeyRanges = partitionKeyRanges.concat(overlappingRanges);\n\n const lastKnownTargetRange = QueryRange.parsePartitionKeyRange(\n partitionKeyRanges[partitionKeyRanges.length - 1],\n );\n if (!lastKnownTargetRange) {\n throw new Error(\"expected lastKnowTargetRange to be truthy\");\n }\n // the overlapping ranges must contain the requested range\n\n if (\n SmartRoutingMapProvider._stringCompare(currentProvidedRange.max, lastKnownTargetRange.max) >\n 0\n ) {\n throw new Error(`error: returned overlapping ranges ${overlappingRanges} \\\n does not contain the requested range ${queryRange}`);\n }\n\n // the current range is contained in partitionKeyRanges just move forward\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n\n while (\n SmartRoutingMapProvider._stringCompare(\n currentProvidedRange.max,\n lastKnownTargetRange.max,\n ) <= 0\n ) {\n // the current range is covered too.just move forward\n if (++index >= sortedRanges.length) {\n return partitionKeyRanges;\n }\n currentProvidedRange = sortedRanges[index];\n }\n }\n }\n}\n"]}
@@ -15,6 +15,12 @@ exports.VectorSessionToken = void 0;
15
15
  *
16
16
  */
17
17
  class VectorSessionToken {
18
+ version;
19
+ globalLsn;
20
+ localLsnByregion;
21
+ sessionToken;
22
+ static SEGMENT_SEPARATOR = "#";
23
+ static REGION_PROGRESS_SEPARATOR = "=";
18
24
  constructor(version, globalLsn, localLsnByregion, sessionToken) {
19
25
  this.version = version;
20
26
  this.globalLsn = globalLsn;
@@ -111,8 +117,6 @@ class VectorSessionToken {
111
117
  }
112
118
  }
113
119
  exports.VectorSessionToken = VectorSessionToken;
114
- VectorSessionToken.SEGMENT_SEPARATOR = "#";
115
- VectorSessionToken.REGION_PROGRESS_SEPARATOR = "=";
116
120
  /**
117
121
  * @hidden
118
122
  */
@@ -1 +1 @@
1
- {"version":3,"file":"VectorSessionToken.js","sourceRoot":"","sources":["../../../src/session/VectorSessionToken.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n/**\n * Models vector clock bases session token. Session token has the following format:\n * `{Version}#{GlobalLSN}#{RegionId1}={LocalLsn1}#{RegionId2}={LocalLsn2}....#{RegionIdN}={LocalLsnN}`\n * 'Version' captures the configuration number of the partition which returned this session token.\n * 'Version' is incremented everytime topology of the partition is updated (say due to Add/Remove/Failover).\n *\n * The choice of separators '#' and '=' is important. Separators ';' and ',' are used to delimit\n * per-partitionKeyRange session token\n * @hidden\n *\n */\nexport class VectorSessionToken {\n private static readonly SEGMENT_SEPARATOR = \"#\";\n private static readonly REGION_PROGRESS_SEPARATOR = \"=\";\n\n constructor(\n private readonly version: number,\n private readonly globalLsn: number,\n private readonly localLsnByregion: Map<number, string>,\n private readonly sessionToken?: string,\n ) {\n if (!this.sessionToken) {\n const regionAndLocalLsn = [];\n for (const [key, value] of this.localLsnByregion.entries()) {\n regionAndLocalLsn.push(`${key}${VectorSessionToken.REGION_PROGRESS_SEPARATOR}${value}`);\n }\n const regionProgress = regionAndLocalLsn.join(VectorSessionToken.SEGMENT_SEPARATOR);\n if (regionProgress === \"\") {\n this.sessionToken = `${this.version}${VectorSessionToken.SEGMENT_SEPARATOR}${this.globalLsn}`;\n } else {\n this.sessionToken = `${this.version}${VectorSessionToken.SEGMENT_SEPARATOR}${this.globalLsn}${VectorSessionToken.SEGMENT_SEPARATOR}${regionProgress}`;\n }\n }\n }\n\n public static create(sessionToken: string): VectorSessionToken | null {\n const [versionStr, globalLsnStr, ...regionSegments] = sessionToken.split(\n VectorSessionToken.SEGMENT_SEPARATOR,\n );\n\n const version = parseInt(versionStr, 10);\n const globalLsn = parseFloat(globalLsnStr);\n\n if (typeof version !== \"number\" || typeof globalLsn !== \"number\") {\n return null;\n }\n\n const lsnByRegion = new Map<number, string>();\n for (const regionSegment of regionSegments) {\n const [regionIdStr, localLsnStr] = regionSegment.split(\n VectorSessionToken.REGION_PROGRESS_SEPARATOR,\n );\n\n if (!regionIdStr || !localLsnStr) {\n return null;\n }\n\n const regionId = parseInt(regionIdStr, 10);\n let localLsn: string;\n try {\n localLsn = localLsnStr;\n } catch (err: any) {\n // TODO: log error\n return null;\n }\n if (typeof regionId !== \"number\") {\n return null;\n }\n\n lsnByRegion.set(regionId, localLsn);\n }\n\n return new VectorSessionToken(version, globalLsn, lsnByRegion, sessionToken);\n }\n\n public equals(other: VectorSessionToken): boolean {\n return !other\n ? false\n : this.version === other.version &&\n this.globalLsn === other.globalLsn &&\n this.areRegionProgressEqual(other.localLsnByregion);\n }\n\n public merge(other: VectorSessionToken): VectorSessionToken {\n if (other == null) {\n throw new Error(\"other (Vector Session Token) must not be null\");\n }\n\n if (\n this.version === other.version &&\n this.localLsnByregion.size !== other.localLsnByregion.size\n ) {\n throw new Error(\n `Compared session tokens ${this.sessionToken} and ${other.sessionToken} have unexpected regions`,\n );\n }\n\n const [higherVersionSessionToken, lowerVersionSessionToken]: [\n VectorSessionToken,\n VectorSessionToken,\n ] = this.version < other.version ? [other, this] : [this, other];\n\n const highestLocalLsnByRegion = new Map<number, string>();\n\n for (const [regionId, highLocalLsn] of higherVersionSessionToken.localLsnByregion.entries()) {\n const lowLocalLsn = lowerVersionSessionToken.localLsnByregion.get(regionId);\n if (lowLocalLsn) {\n highestLocalLsnByRegion.set(regionId, max(highLocalLsn, lowLocalLsn));\n } else if (this.version === other.version) {\n throw new Error(\n `Compared session tokens have unexpected regions. Session 1: ${this.sessionToken} - Session 2: ${this.sessionToken}`,\n );\n } else {\n highestLocalLsnByRegion.set(regionId, highLocalLsn);\n }\n }\n\n return new VectorSessionToken(\n Math.max(this.version, other.version),\n Math.max(this.globalLsn, other.globalLsn),\n highestLocalLsnByRegion,\n );\n }\n\n public toString(): string | undefined {\n return this.sessionToken;\n }\n\n private areRegionProgressEqual(other: Map<number, string>): boolean {\n if (this.localLsnByregion.size !== other.size) {\n return false;\n }\n\n for (const [regionId, localLsn] of this.localLsnByregion.entries()) {\n const otherLocalLsn = other.get(regionId);\n\n if (localLsn !== otherLocalLsn) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * @hidden\n */\nfunction max(int1: string, int2: string): string {\n // NOTE: This only works for positive numbers\n if (int1.length === int2.length) {\n return int1 > int2 ? int1 : int2;\n } else if (int1.length > int2.length) {\n return int1;\n } else {\n return int2;\n }\n}\n"]}
1
+ {"version":3,"file":"VectorSessionToken.js","sourceRoot":"","sources":["../../../src/session/VectorSessionToken.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n/**\n * Models vector clock bases session token. Session token has the following format:\n * `{Version}#{GlobalLSN}#{RegionId1}={LocalLsn1}#{RegionId2}={LocalLsn2}....#{RegionIdN}={LocalLsnN}`\n * 'Version' captures the configuration number of the partition which returned this session token.\n * 'Version' is incremented everytime topology of the partition is updated (say due to Add/Remove/Failover).\n *\n * The choice of separators '#' and '=' is important. Separators ';' and ',' are used to delimit\n * per-partitionKeyRange session token\n * @hidden\n *\n */\nexport class VectorSessionToken {\n private static readonly SEGMENT_SEPARATOR = \"#\";\n private static readonly REGION_PROGRESS_SEPARATOR = \"=\";\n\n constructor(\n private readonly version: number,\n private readonly globalLsn: number,\n private readonly localLsnByregion: Map<number, string>,\n private readonly sessionToken?: string,\n ) {\n if (!this.sessionToken) {\n const regionAndLocalLsn = [];\n for (const [key, value] of this.localLsnByregion.entries()) {\n regionAndLocalLsn.push(`${key}${VectorSessionToken.REGION_PROGRESS_SEPARATOR}${value}`);\n }\n const regionProgress = regionAndLocalLsn.join(VectorSessionToken.SEGMENT_SEPARATOR);\n if (regionProgress === \"\") {\n this.sessionToken = `${this.version}${VectorSessionToken.SEGMENT_SEPARATOR}${this.globalLsn}`;\n } else {\n this.sessionToken = `${this.version}${VectorSessionToken.SEGMENT_SEPARATOR}${this.globalLsn}${VectorSessionToken.SEGMENT_SEPARATOR}${regionProgress}`;\n }\n }\n }\n\n public static create(sessionToken: string): VectorSessionToken | null {\n const [versionStr, globalLsnStr, ...regionSegments] = sessionToken.split(\n VectorSessionToken.SEGMENT_SEPARATOR,\n );\n\n const version = parseInt(versionStr, 10);\n const globalLsn = parseFloat(globalLsnStr);\n\n if (typeof version !== \"number\" || typeof globalLsn !== \"number\") {\n return null;\n }\n\n const lsnByRegion = new Map<number, string>();\n for (const regionSegment of regionSegments) {\n const [regionIdStr, localLsnStr] = regionSegment.split(\n VectorSessionToken.REGION_PROGRESS_SEPARATOR,\n );\n\n if (!regionIdStr || !localLsnStr) {\n return null;\n }\n\n const regionId = parseInt(regionIdStr, 10);\n let localLsn: string;\n try {\n localLsn = localLsnStr;\n } catch (err: any) {\n // TODO: log error\n return null;\n }\n if (typeof regionId !== \"number\") {\n return null;\n }\n\n lsnByRegion.set(regionId, localLsn);\n }\n\n return new VectorSessionToken(version, globalLsn, lsnByRegion, sessionToken);\n }\n\n public equals(other: VectorSessionToken): boolean {\n return !other\n ? false\n : this.version === other.version &&\n this.globalLsn === other.globalLsn &&\n this.areRegionProgressEqual(other.localLsnByregion);\n }\n\n public merge(other: VectorSessionToken): VectorSessionToken {\n if (other == null) {\n throw new Error(\"other (Vector Session Token) must not be null\");\n }\n\n if (\n this.version === other.version &&\n this.localLsnByregion.size !== other.localLsnByregion.size\n ) {\n throw new Error(\n `Compared session tokens ${this.sessionToken} and ${other.sessionToken} have unexpected regions`,\n );\n }\n\n const [higherVersionSessionToken, lowerVersionSessionToken]: [\n VectorSessionToken,\n VectorSessionToken,\n ] = this.version < other.version ? [other, this] : [this, other];\n\n const highestLocalLsnByRegion = new Map<number, string>();\n\n for (const [regionId, highLocalLsn] of higherVersionSessionToken.localLsnByregion.entries()) {\n const lowLocalLsn = lowerVersionSessionToken.localLsnByregion.get(regionId);\n if (lowLocalLsn) {\n highestLocalLsnByRegion.set(regionId, max(highLocalLsn, lowLocalLsn));\n } else if (this.version === other.version) {\n throw new Error(\n `Compared session tokens have unexpected regions. Session 1: ${this.sessionToken} - Session 2: ${this.sessionToken}`,\n );\n } else {\n highestLocalLsnByRegion.set(regionId, highLocalLsn);\n }\n }\n\n return new VectorSessionToken(\n Math.max(this.version, other.version),\n Math.max(this.globalLsn, other.globalLsn),\n highestLocalLsnByRegion,\n );\n }\n\n public toString(): string | undefined {\n return this.sessionToken;\n }\n\n private areRegionProgressEqual(other: Map<number, string>): boolean {\n if (this.localLsnByregion.size !== other.size) {\n return false;\n }\n\n for (const [regionId, localLsn] of this.localLsnByregion.entries()) {\n const otherLocalLsn = other.get(regionId);\n\n if (localLsn !== otherLocalLsn) {\n return false;\n }\n }\n return true;\n }\n}\n\n/**\n * @hidden\n */\nfunction max(int1: string, int2: string): string {\n // NOTE: This only works for positive numbers\n if (int1.length === int2.length) {\n return int1 > int2 ? int1 : int2;\n } else if (int1.length > int2.length) {\n return int1;\n } else {\n return int2;\n }\n}\n"]}
@@ -9,6 +9,11 @@ const index_js_1 = require("../common/index.js");
9
9
  const VectorSessionToken_js_1 = require("./VectorSessionToken.js");
10
10
  /** @hidden */
11
11
  class SessionContainer {
12
+ collectionNameToCollectionResourceId;
13
+ collectionResourceIdToSessionTokens;
14
+ static EMPTY_SESSION_TOKEN = "";
15
+ static SESSION_TOKEN_SEPARATOR = ",";
16
+ static SESSION_TOKEN_PARTITION_SPLITTER = ":";
12
17
  constructor(collectionNameToCollectionResourceId = new Map(), collectionResourceIdToSessionTokens = new Map()) {
13
18
  this.collectionNameToCollectionResourceId = collectionNameToCollectionResourceId;
14
19
  this.collectionResourceIdToSessionTokens = collectionResourceIdToSessionTokens;
@@ -131,7 +136,4 @@ class SessionContainer {
131
136
  }
132
137
  }
133
138
  exports.SessionContainer = SessionContainer;
134
- SessionContainer.EMPTY_SESSION_TOKEN = "";
135
- SessionContainer.SESSION_TOKEN_SEPARATOR = ",";
136
- SessionContainer.SESSION_TOKEN_PARTITION_SPLITTER = ":";
137
139
  //# sourceMappingURL=sessionContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessionContainer.js","sourceRoot":"","sources":["../../../src/session/sessionContainer.ts"],"names":[],"mappings":";;;;AAAA,uCAAuC;AACvC,kCAAkC;AAClC,uEAAoC;AAEpC,iDAA6F;AAG7F,mEAA6D;AAE7D,cAAc;AACd,MAAa,gBAAgB;IAI3B,YACU,uCAAuC,IAAI,GAAG,EAAkB,EAChE,sCAAsC,IAAI,GAAG,EAGlD;QAJK,yCAAoC,GAApC,oCAAoC,CAA4B;QAChE,wCAAmC,GAAnC,mCAAmC,CAGxC;IACF,CAAC;IAEG,GAAG,CAAC,OAAuB;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,cAAc,GAAG,IAAA,2BAAgB,EAAC,IAAA,sBAAW,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,gCAAgC,CAAC,cAAc,CAAC,CAAC;QAChF,OAAO,gBAAgB,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;IAC3E,CAAC;IAEM,MAAM,CAAC,OAAuB;QACnC,IAAI,oBAA4B,CAAC;QACjC,MAAM,eAAe,GAAG,IAAA,sBAAW,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,IAAA,2BAAgB,EAAC,eAAe,CAAC,CAAC;QACzD,IAAI,cAAc,EAAE,CAAC;YACnB,oBAAoB,GAAG,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACrF,IAAI,CAAC,oCAAoC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,mCAAmC,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAEM,GAAG,CAAC,OAAuB,EAAE,UAAyB;QAC3D,6EAA6E;QAC7E,IACE,CAAC,UAAU;YACX,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,EACjF,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,UAAU,CAAC,oBAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW;YAClC,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,UAAU,CAAC,oBAAS,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC;QAEpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,IAAI,aAAa,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClE,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,yBAAyB,GAAG,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxF,gBAAgB,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,OAAe;QACrC,sIAAsI;QACtI,2EAA2E;QAC3E,uGAAuG;QACvG,qDAAqD;QACrD,OAAO,IAAA,iBAAI,EAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;IACvD,CAAC;IAEO,gCAAgC,CACtC,cAAsB;QAEtB,IAAI,iBAAiB,GAAoC,IAAI,CAAC;QAC9D,IAAI,cAAc,IAAI,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACpF,iBAAiB,GAAG,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAC9D,IAAI,CAAC,oCAAoC,CAAC,GAAG,CAAC,cAAc,CAAC,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,MAAM,CAAC,6BAA6B,CAAC,MAAuC;QAClF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,gBAAgB,CAAC,mBAAmB,CAAC;QAC9C,CAAC;QAED,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM;gBACJ,KAAK;oBACL,gBAAgB,CAAC,gCAAgC;oBACjD,KAAK,CAAC,QAAQ,EAAE;oBAChB,gBAAgB,CAAC,uBAAuB,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAC/B,cAAsB,EACtB,sBAAuD;QAEvD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC;QACvF,KAAK,MAAM,aAAa,IAAI,eAAe,EAAE,CAAC;YAC5C,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;YAC7F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,QAAQ,GAAG,0CAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,aAAa,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtD,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtD,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,6DAA6D;IACrD,MAAM,CAAC,mBAAmB,CAChC,YAA0B,EAC1B,aAA4B;QAE5B,IACE,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,iBAAiB;YACjD,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,oBAAoB;YACpD,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,gBAAgB;YAChD,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,sBAAsB;YACtD,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,mBAAmB;YACnD,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,0BAA0B;YAC1D,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,6BAA6B;YAC7D,CAAC,YAAY,KAAK,oBAAS,CAAC,IAAI,CAAC,sBAAsB;gBACrD,aAAa,KAAK,wBAAa,CAAC,KAAK,CAAC,EACxC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB,CAAC,OAAuB,EAAE,OAAsB;QACtE,IAAI,aAAa,GAAG,OAAO,CAAC,oBAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,IAAA,sBAAW,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAA,2BAAgB,EAAC,aAAuB,CAAC,CAAC;IACnD,CAAC;;AAlKH,4CAmKC;AAlKyB,oCAAmB,GAAG,EAAE,CAAC;AACzB,wCAAuB,GAAG,GAAG,CAAC;AAC9B,iDAAgC,GAAG,GAAG,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport atob from \"../utils/atob.js\";\nimport type { ResourceType } from \"../common/index.js\";\nimport { Constants, getContainerLink, OperationType, trimSlashes } from \"../common/index.js\";\nimport type { CosmosHeaders } from \"../queryExecutionContext/index.js\";\nimport type { SessionContext } from \"./SessionContext.js\";\nimport { VectorSessionToken } from \"./VectorSessionToken.js\";\n\n/** @hidden */\nexport class SessionContainer {\n private static readonly EMPTY_SESSION_TOKEN = \"\";\n private static readonly SESSION_TOKEN_SEPARATOR = \",\";\n private static readonly SESSION_TOKEN_PARTITION_SPLITTER = \":\";\n constructor(\n private collectionNameToCollectionResourceId = new Map<string, string>(),\n private collectionResourceIdToSessionTokens = new Map<\n string,\n Map<string, VectorSessionToken>\n >(),\n ) {}\n\n public get(request: SessionContext): string {\n if (!request) {\n throw new Error(\"request cannot be null\");\n }\n const collectionName = getContainerLink(trimSlashes(request.resourceAddress));\n const rangeIdToTokenMap = this.getPartitionKeyRangeIdToTokenMap(collectionName);\n return SessionContainer.getCombinedSessionTokenString(rangeIdToTokenMap);\n }\n\n public remove(request: SessionContext): void {\n let collectionResourceId: string;\n const resourceAddress = trimSlashes(request.resourceAddress);\n const collectionName = getContainerLink(resourceAddress);\n if (collectionName) {\n collectionResourceId = this.collectionNameToCollectionResourceId.get(collectionName);\n this.collectionNameToCollectionResourceId.delete(collectionName);\n }\n if (collectionResourceId !== undefined) {\n this.collectionResourceIdToSessionTokens.delete(collectionResourceId);\n }\n }\n\n public set(request: SessionContext, resHeaders: CosmosHeaders): void {\n // TODO: we check the master logic a few different places. Might not need it.\n if (\n !resHeaders ||\n SessionContainer.isReadingFromMaster(request.resourceType, request.operationType)\n ) {\n return;\n }\n\n const sessionTokenString = resHeaders[Constants.HttpHeaders.SessionToken];\n if (!sessionTokenString) {\n return;\n }\n\n const containerName = this.getContainerName(request, resHeaders);\n\n const ownerId = !request.isNameBased\n ? request.resourceId\n : resHeaders[Constants.HttpHeaders.OwnerId] || request.resourceId;\n\n if (!ownerId) {\n return;\n }\n\n if (containerName && this.validateOwnerID(ownerId)) {\n if (!this.collectionResourceIdToSessionTokens.has(ownerId)) {\n this.collectionResourceIdToSessionTokens.set(ownerId, new Map());\n }\n\n if (!this.collectionNameToCollectionResourceId.has(containerName)) {\n this.collectionNameToCollectionResourceId.set(containerName, ownerId);\n }\n\n const containerSessionContainer = this.collectionResourceIdToSessionTokens.get(ownerId);\n SessionContainer.compareAndSetToken(sessionTokenString, containerSessionContainer);\n }\n }\n\n private validateOwnerID(ownerId: string): boolean {\n // If ownerId contains exactly 8 bytes it represents a unique database+collection identifier. Otherwise it represents another resource\n // The first 4 bytes are the database. The last 4 bytes are the collection.\n // Cosmos rids potentially contain \"-\" which is an invalid character in the browser atob implementation\n // See https://en.wikipedia.org/wiki/Base64#Filenames\n return atob(ownerId.replace(/-/g, \"/\")).length === 8;\n }\n\n private getPartitionKeyRangeIdToTokenMap(\n collectionName: string,\n ): Map<string, VectorSessionToken> {\n let rangeIdToTokenMap: Map<string, VectorSessionToken> = null;\n if (collectionName && this.collectionNameToCollectionResourceId.has(collectionName)) {\n rangeIdToTokenMap = this.collectionResourceIdToSessionTokens.get(\n this.collectionNameToCollectionResourceId.get(collectionName),\n );\n }\n\n return rangeIdToTokenMap;\n }\n\n private static getCombinedSessionTokenString(tokens: Map<string, VectorSessionToken>): string {\n if (!tokens || tokens.size === 0) {\n return SessionContainer.EMPTY_SESSION_TOKEN;\n }\n\n let result = \"\";\n for (const [range, token] of tokens.entries()) {\n result +=\n range +\n SessionContainer.SESSION_TOKEN_PARTITION_SPLITTER +\n token.toString() +\n SessionContainer.SESSION_TOKEN_SEPARATOR;\n }\n return result.slice(0, -1);\n }\n\n private static compareAndSetToken(\n newTokenString: string,\n containerSessionTokens: Map<string, VectorSessionToken>,\n ): void {\n if (!newTokenString) {\n return;\n }\n\n const partitionsParts = newTokenString.split(SessionContainer.SESSION_TOKEN_SEPARATOR);\n for (const partitionPart of partitionsParts) {\n const newTokenParts = partitionPart.split(SessionContainer.SESSION_TOKEN_PARTITION_SPLITTER);\n if (newTokenParts.length !== 2) {\n return;\n }\n\n const range = newTokenParts[0];\n const newToken = VectorSessionToken.create(newTokenParts[1]);\n const tokenForRange = !containerSessionTokens.get(range)\n ? newToken\n : containerSessionTokens.get(range).merge(newToken);\n containerSessionTokens.set(range, tokenForRange);\n }\n }\n\n // TODO: have a assert if the type doesn't mastch known types\n private static isReadingFromMaster(\n resourceType: ResourceType,\n operationType: OperationType,\n ): boolean {\n if (\n resourceType === Constants.Path.OffersPathSegment ||\n resourceType === Constants.Path.DatabasesPathSegment ||\n resourceType === Constants.Path.UsersPathSegment ||\n resourceType === Constants.Path.PermissionsPathSegment ||\n resourceType === Constants.Path.TopologyPathSegment ||\n resourceType === Constants.Path.DatabaseAccountPathSegment ||\n resourceType === Constants.Path.PartitionKeyRangesPathSegment ||\n (resourceType === Constants.Path.CollectionsPathSegment &&\n operationType === OperationType.Query)\n ) {\n return true;\n }\n\n return false;\n }\n\n private getContainerName(request: SessionContext, headers: CosmosHeaders): string {\n let ownerFullName = headers[Constants.HttpHeaders.OwnerFullName];\n if (!ownerFullName) {\n ownerFullName = trimSlashes(request.resourceAddress);\n }\n\n return getContainerLink(ownerFullName as string);\n }\n}\n"]}
1
+ {"version":3,"file":"sessionContainer.js","sourceRoot":"","sources":["../../../src/session/sessionContainer.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport atob from \"../utils/atob.js\";\nimport type { ResourceType } from \"../common/index.js\";\nimport { Constants, getContainerLink, OperationType, trimSlashes } from \"../common/index.js\";\nimport type { CosmosHeaders } from \"../queryExecutionContext/index.js\";\nimport type { SessionContext } from \"./SessionContext.js\";\nimport { VectorSessionToken } from \"./VectorSessionToken.js\";\n\n/** @hidden */\nexport class SessionContainer {\n private static readonly EMPTY_SESSION_TOKEN = \"\";\n private static readonly SESSION_TOKEN_SEPARATOR = \",\";\n private static readonly SESSION_TOKEN_PARTITION_SPLITTER = \":\";\n constructor(\n private collectionNameToCollectionResourceId = new Map<string, string>(),\n private collectionResourceIdToSessionTokens = new Map<\n string,\n Map<string, VectorSessionToken>\n >(),\n ) {}\n\n public get(request: SessionContext): string {\n if (!request) {\n throw new Error(\"request cannot be null\");\n }\n const collectionName = getContainerLink(trimSlashes(request.resourceAddress));\n const rangeIdToTokenMap = this.getPartitionKeyRangeIdToTokenMap(collectionName);\n return SessionContainer.getCombinedSessionTokenString(rangeIdToTokenMap);\n }\n\n public remove(request: SessionContext): void {\n let collectionResourceId: string;\n const resourceAddress = trimSlashes(request.resourceAddress);\n const collectionName = getContainerLink(resourceAddress);\n if (collectionName) {\n collectionResourceId = this.collectionNameToCollectionResourceId.get(collectionName);\n this.collectionNameToCollectionResourceId.delete(collectionName);\n }\n if (collectionResourceId !== undefined) {\n this.collectionResourceIdToSessionTokens.delete(collectionResourceId);\n }\n }\n\n public set(request: SessionContext, resHeaders: CosmosHeaders): void {\n // TODO: we check the master logic a few different places. Might not need it.\n if (\n !resHeaders ||\n SessionContainer.isReadingFromMaster(request.resourceType, request.operationType)\n ) {\n return;\n }\n\n const sessionTokenString = resHeaders[Constants.HttpHeaders.SessionToken];\n if (!sessionTokenString) {\n return;\n }\n\n const containerName = this.getContainerName(request, resHeaders);\n\n const ownerId = !request.isNameBased\n ? request.resourceId\n : resHeaders[Constants.HttpHeaders.OwnerId] || request.resourceId;\n\n if (!ownerId) {\n return;\n }\n\n if (containerName && this.validateOwnerID(ownerId)) {\n if (!this.collectionResourceIdToSessionTokens.has(ownerId)) {\n this.collectionResourceIdToSessionTokens.set(ownerId, new Map());\n }\n\n if (!this.collectionNameToCollectionResourceId.has(containerName)) {\n this.collectionNameToCollectionResourceId.set(containerName, ownerId);\n }\n\n const containerSessionContainer = this.collectionResourceIdToSessionTokens.get(ownerId);\n SessionContainer.compareAndSetToken(sessionTokenString, containerSessionContainer);\n }\n }\n\n private validateOwnerID(ownerId: string): boolean {\n // If ownerId contains exactly 8 bytes it represents a unique database+collection identifier. Otherwise it represents another resource\n // The first 4 bytes are the database. The last 4 bytes are the collection.\n // Cosmos rids potentially contain \"-\" which is an invalid character in the browser atob implementation\n // See https://en.wikipedia.org/wiki/Base64#Filenames\n return atob(ownerId.replace(/-/g, \"/\")).length === 8;\n }\n\n private getPartitionKeyRangeIdToTokenMap(\n collectionName: string,\n ): Map<string, VectorSessionToken> {\n let rangeIdToTokenMap: Map<string, VectorSessionToken> = null;\n if (collectionName && this.collectionNameToCollectionResourceId.has(collectionName)) {\n rangeIdToTokenMap = this.collectionResourceIdToSessionTokens.get(\n this.collectionNameToCollectionResourceId.get(collectionName),\n );\n }\n\n return rangeIdToTokenMap;\n }\n\n private static getCombinedSessionTokenString(tokens: Map<string, VectorSessionToken>): string {\n if (!tokens || tokens.size === 0) {\n return SessionContainer.EMPTY_SESSION_TOKEN;\n }\n\n let result = \"\";\n for (const [range, token] of tokens.entries()) {\n result +=\n range +\n SessionContainer.SESSION_TOKEN_PARTITION_SPLITTER +\n token.toString() +\n SessionContainer.SESSION_TOKEN_SEPARATOR;\n }\n return result.slice(0, -1);\n }\n\n private static compareAndSetToken(\n newTokenString: string,\n containerSessionTokens: Map<string, VectorSessionToken>,\n ): void {\n if (!newTokenString) {\n return;\n }\n\n const partitionsParts = newTokenString.split(SessionContainer.SESSION_TOKEN_SEPARATOR);\n for (const partitionPart of partitionsParts) {\n const newTokenParts = partitionPart.split(SessionContainer.SESSION_TOKEN_PARTITION_SPLITTER);\n if (newTokenParts.length !== 2) {\n return;\n }\n\n const range = newTokenParts[0];\n const newToken = VectorSessionToken.create(newTokenParts[1]);\n const tokenForRange = !containerSessionTokens.get(range)\n ? newToken\n : containerSessionTokens.get(range).merge(newToken);\n containerSessionTokens.set(range, tokenForRange);\n }\n }\n\n // TODO: have a assert if the type doesn't mastch known types\n private static isReadingFromMaster(\n resourceType: ResourceType,\n operationType: OperationType,\n ): boolean {\n if (\n resourceType === Constants.Path.OffersPathSegment ||\n resourceType === Constants.Path.DatabasesPathSegment ||\n resourceType === Constants.Path.UsersPathSegment ||\n resourceType === Constants.Path.PermissionsPathSegment ||\n resourceType === Constants.Path.TopologyPathSegment ||\n resourceType === Constants.Path.DatabaseAccountPathSegment ||\n resourceType === Constants.Path.PartitionKeyRangesPathSegment ||\n (resourceType === Constants.Path.CollectionsPathSegment &&\n operationType === OperationType.Query)\n ) {\n return true;\n }\n\n return false;\n }\n\n private getContainerName(request: SessionContext, headers: CosmosHeaders): string {\n let ownerFullName = headers[Constants.HttpHeaders.OwnerFullName];\n if (!ownerFullName) {\n ownerFullName = trimSlashes(request.resourceAddress);\n }\n\n return getContainerLink(ownerFullName as string);\n }\n}\n"]}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.52.8"
8
+ "packageVersion": "7.52.9"
9
9
  }
10
10
  ]
11
11
  }