@azure/cosmos 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/browser/CosmosClientOptions.d.ts +1 -1
  2. package/dist/browser/CosmosClientOptions.js.map +1 -1
  3. package/dist/browser/client/ChangeFeed/ChangeFeedForEpkRange.d.ts.map +1 -1
  4. package/dist/browser/client/ChangeFeed/ChangeFeedForEpkRange.js +2 -34
  5. package/dist/browser/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  6. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  7. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js +2 -35
  8. package/dist/browser/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  9. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts +15 -0
  10. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts.map +1 -1
  11. package/dist/browser/client/ChangeFeed/ChangeFeedIteratorOptions.js.map +1 -1
  12. package/dist/browser/client/ChangeFeed/InternalChangeFeedOptions.d.ts +3 -0
  13. package/dist/browser/client/ChangeFeed/InternalChangeFeedOptions.d.ts.map +1 -1
  14. package/dist/browser/client/ChangeFeed/InternalChangeFeedOptions.js.map +1 -1
  15. package/dist/browser/client/ChangeFeed/changeFeedUtils.d.ts +6 -0
  16. package/dist/browser/client/ChangeFeed/changeFeedUtils.d.ts.map +1 -1
  17. package/dist/browser/client/ChangeFeed/changeFeedUtils.js +47 -0
  18. package/dist/browser/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  19. package/dist/browser/common/constants.js +1 -1
  20. package/dist/browser/common/constants.js.map +1 -1
  21. package/dist/browser/documents/VectorEmbeddingPolicy.d.ts +4 -0
  22. package/dist/browser/documents/VectorEmbeddingPolicy.d.ts.map +1 -1
  23. package/dist/browser/documents/VectorEmbeddingPolicy.js +4 -0
  24. package/dist/browser/documents/VectorEmbeddingPolicy.js.map +1 -1
  25. package/dist/browser/queryExecutionContext/Aggregators/MaxAggregator.d.ts.map +1 -1
  26. package/dist/browser/queryExecutionContext/Aggregators/MaxAggregator.js +4 -0
  27. package/dist/browser/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  28. package/dist/browser/queryExecutionContext/Aggregators/MinAggregator.d.ts.map +1 -1
  29. package/dist/browser/queryExecutionContext/Aggregators/MinAggregator.js +4 -0
  30. package/dist/browser/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  31. package/dist/browser/request/RequestHandler.d.ts.map +1 -1
  32. package/dist/browser/request/RequestHandler.js +10 -4
  33. package/dist/browser/request/RequestHandler.js.map +1 -1
  34. package/dist/commonjs/CosmosClientOptions.d.ts +1 -1
  35. package/dist/commonjs/CosmosClientOptions.js.map +1 -1
  36. package/dist/commonjs/client/ChangeFeed/ChangeFeedForEpkRange.d.ts.map +1 -1
  37. package/dist/commonjs/client/ChangeFeed/ChangeFeedForEpkRange.js +1 -33
  38. package/dist/commonjs/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  39. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  40. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js +1 -34
  41. package/dist/commonjs/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  42. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts +15 -0
  43. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts.map +1 -1
  44. package/dist/commonjs/client/ChangeFeed/ChangeFeedIteratorOptions.js.map +1 -1
  45. package/dist/commonjs/client/ChangeFeed/InternalChangeFeedOptions.d.ts +3 -0
  46. package/dist/commonjs/client/ChangeFeed/InternalChangeFeedOptions.d.ts.map +1 -1
  47. package/dist/commonjs/client/ChangeFeed/InternalChangeFeedOptions.js.map +1 -1
  48. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.d.ts +6 -0
  49. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.d.ts.map +1 -1
  50. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.js +48 -0
  51. package/dist/commonjs/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  52. package/dist/commonjs/common/constants.js +1 -1
  53. package/dist/commonjs/common/constants.js.map +1 -1
  54. package/dist/commonjs/documents/VectorEmbeddingPolicy.d.ts +4 -0
  55. package/dist/commonjs/documents/VectorEmbeddingPolicy.d.ts.map +1 -1
  56. package/dist/commonjs/documents/VectorEmbeddingPolicy.js +4 -0
  57. package/dist/commonjs/documents/VectorEmbeddingPolicy.js.map +1 -1
  58. package/dist/commonjs/queryExecutionContext/Aggregators/MaxAggregator.d.ts.map +1 -1
  59. package/dist/commonjs/queryExecutionContext/Aggregators/MaxAggregator.js +4 -0
  60. package/dist/commonjs/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  61. package/dist/commonjs/queryExecutionContext/Aggregators/MinAggregator.d.ts.map +1 -1
  62. package/dist/commonjs/queryExecutionContext/Aggregators/MinAggregator.js +4 -0
  63. package/dist/commonjs/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  64. package/dist/commonjs/request/RequestHandler.d.ts.map +1 -1
  65. package/dist/commonjs/request/RequestHandler.js +10 -4
  66. package/dist/commonjs/request/RequestHandler.js.map +1 -1
  67. package/dist/commonjs/tsdoc-metadata.json +1 -1
  68. package/dist/esm/CosmosClientOptions.d.ts +1 -1
  69. package/dist/esm/CosmosClientOptions.js.map +1 -1
  70. package/dist/esm/client/ChangeFeed/ChangeFeedForEpkRange.d.ts.map +1 -1
  71. package/dist/esm/client/ChangeFeed/ChangeFeedForEpkRange.js +2 -34
  72. package/dist/esm/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  73. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  74. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js +2 -35
  75. package/dist/esm/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  76. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts +15 -0
  77. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts.map +1 -1
  78. package/dist/esm/client/ChangeFeed/ChangeFeedIteratorOptions.js.map +1 -1
  79. package/dist/esm/client/ChangeFeed/InternalChangeFeedOptions.d.ts +3 -0
  80. package/dist/esm/client/ChangeFeed/InternalChangeFeedOptions.d.ts.map +1 -1
  81. package/dist/esm/client/ChangeFeed/InternalChangeFeedOptions.js.map +1 -1
  82. package/dist/esm/client/ChangeFeed/changeFeedUtils.d.ts +6 -0
  83. package/dist/esm/client/ChangeFeed/changeFeedUtils.d.ts.map +1 -1
  84. package/dist/esm/client/ChangeFeed/changeFeedUtils.js +47 -0
  85. package/dist/esm/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  86. package/dist/esm/common/constants.js +1 -1
  87. package/dist/esm/common/constants.js.map +1 -1
  88. package/dist/esm/documents/VectorEmbeddingPolicy.d.ts +4 -0
  89. package/dist/esm/documents/VectorEmbeddingPolicy.d.ts.map +1 -1
  90. package/dist/esm/documents/VectorEmbeddingPolicy.js +4 -0
  91. package/dist/esm/documents/VectorEmbeddingPolicy.js.map +1 -1
  92. package/dist/esm/queryExecutionContext/Aggregators/MaxAggregator.d.ts.map +1 -1
  93. package/dist/esm/queryExecutionContext/Aggregators/MaxAggregator.js +4 -0
  94. package/dist/esm/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  95. package/dist/esm/queryExecutionContext/Aggregators/MinAggregator.d.ts.map +1 -1
  96. package/dist/esm/queryExecutionContext/Aggregators/MinAggregator.js +4 -0
  97. package/dist/esm/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  98. package/dist/esm/request/RequestHandler.d.ts.map +1 -1
  99. package/dist/esm/request/RequestHandler.js +10 -4
  100. package/dist/esm/request/RequestHandler.js.map +1 -1
  101. package/dist/react-native/CosmosClientOptions.d.ts +1 -1
  102. package/dist/react-native/CosmosClientOptions.js.map +1 -1
  103. package/dist/react-native/client/ChangeFeed/ChangeFeedForEpkRange.d.ts.map +1 -1
  104. package/dist/react-native/client/ChangeFeed/ChangeFeedForEpkRange.js +2 -34
  105. package/dist/react-native/client/ChangeFeed/ChangeFeedForEpkRange.js.map +1 -1
  106. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.d.ts.map +1 -1
  107. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js +2 -35
  108. package/dist/react-native/client/ChangeFeed/ChangeFeedForPartitionKey.js.map +1 -1
  109. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts +15 -0
  110. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorOptions.d.ts.map +1 -1
  111. package/dist/react-native/client/ChangeFeed/ChangeFeedIteratorOptions.js.map +1 -1
  112. package/dist/react-native/client/ChangeFeed/InternalChangeFeedOptions.d.ts +3 -0
  113. package/dist/react-native/client/ChangeFeed/InternalChangeFeedOptions.d.ts.map +1 -1
  114. package/dist/react-native/client/ChangeFeed/InternalChangeFeedOptions.js.map +1 -1
  115. package/dist/react-native/client/ChangeFeed/changeFeedUtils.d.ts +6 -0
  116. package/dist/react-native/client/ChangeFeed/changeFeedUtils.d.ts.map +1 -1
  117. package/dist/react-native/client/ChangeFeed/changeFeedUtils.js +47 -0
  118. package/dist/react-native/client/ChangeFeed/changeFeedUtils.js.map +1 -1
  119. package/dist/react-native/common/constants.js +1 -1
  120. package/dist/react-native/common/constants.js.map +1 -1
  121. package/dist/react-native/documents/VectorEmbeddingPolicy.d.ts +4 -0
  122. package/dist/react-native/documents/VectorEmbeddingPolicy.d.ts.map +1 -1
  123. package/dist/react-native/documents/VectorEmbeddingPolicy.js +4 -0
  124. package/dist/react-native/documents/VectorEmbeddingPolicy.js.map +1 -1
  125. package/dist/react-native/queryExecutionContext/Aggregators/MaxAggregator.d.ts.map +1 -1
  126. package/dist/react-native/queryExecutionContext/Aggregators/MaxAggregator.js +4 -0
  127. package/dist/react-native/queryExecutionContext/Aggregators/MaxAggregator.js.map +1 -1
  128. package/dist/react-native/queryExecutionContext/Aggregators/MinAggregator.d.ts.map +1 -1
  129. package/dist/react-native/queryExecutionContext/Aggregators/MinAggregator.js +4 -0
  130. package/dist/react-native/queryExecutionContext/Aggregators/MinAggregator.js.map +1 -1
  131. package/dist/react-native/request/RequestHandler.d.ts.map +1 -1
  132. package/dist/react-native/request/RequestHandler.js +10 -4
  133. package/dist/react-native/request/RequestHandler.js.map +1 -1
  134. package/package.json +16 -15
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeFeedForEpkRange.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForEpkRange.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { ChangeFeedRange } from \"./ChangeFeedRange.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\nimport type { PartitionKeyRangeCache } from \"../../routing/index.js\";\nimport { QueryRange } from \"../../routing/index.js\";\nimport { FeedRangeQueue } from \"./FeedRangeQueue.js\";\nimport type { ClientContext } from \"../../ClientContext.js\";\nimport type { Container, Resource } from \"../../client/index.js\";\nimport { Constants, SubStatusCodes, StatusCodes, ResourceType } from \"../../common/index.js\";\nimport type { Response, FeedOptions } from \"../../request/index.js\";\nimport { ErrorResponse } from \"../../request/index.js\";\nimport { CompositeContinuationToken } from \"./CompositeContinuationToken.js\";\nimport type { ChangeFeedPullModelIterator } from \"./ChangeFeedPullModelIterator.js\";\nimport { decryptChangeFeedResponse, extractOverlappingRanges } from \"./changeFeedUtils.js\";\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport type { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { getEmptyCosmosDiagnostics, withDiagnostics } from \"../../utils/diagnostics.js\";\nimport { ChangeFeedMode } from \"./ChangeFeedMode.js\";\n/**\n * @hidden\n * Provides iterator for change feed for entire container or an epk range.\n *\n * Use `Items.getChangeFeedIterator()` to get an instance of the iterator.\n */\nexport class ChangeFeedForEpkRange<T> implements ChangeFeedPullModelIterator<T> {\n private continuationToken?: CompositeContinuationToken;\n private queue: FeedRangeQueue<ChangeFeedRange>;\n private startTime: string;\n private isInstantiated: boolean;\n private rId: string;\n private startFromNow: boolean;\n /**\n * @internal\n */\n constructor(\n private clientContext: ClientContext,\n private container: Container,\n private partitionKeyRangeCache: PartitionKeyRangeCache,\n private resourceId: string,\n private resourceLink: string,\n private url: string,\n private changeFeedOptions: InternalChangeFeedIteratorOptions,\n private epkRange: QueryRange,\n ) {\n this.queue = new FeedRangeQueue<ChangeFeedRange>();\n this.continuationToken = changeFeedOptions.continuationToken\n ? JSON.parse(changeFeedOptions.continuationToken)\n : undefined;\n this.isInstantiated = false;\n // startTime is used to store and specify time from which change feed should start reading new changes. StartFromNow flag is used to indicate fetching changes from now.\n if (changeFeedOptions.startFromNow) {\n this.startFromNow = true;\n } else if (changeFeedOptions.startTime) {\n this.startTime = changeFeedOptions.startTime.toUTCString();\n }\n }\n\n private async setIteratorRid(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n const { resource } = await this.container.readInternal(diagnosticNode);\n this.rId = resource._rid;\n }\n\n private continuationTokenRidMatchContainerRid(): boolean {\n if (this.continuationToken.rid !== this.rId) {\n return false;\n }\n return true;\n }\n\n private async fillChangeFeedQueue(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n if (this.continuationToken) {\n // fill the queue with feed ranges in continuation token.\n await this.fetchContinuationTokenFeedRanges(diagnosticNode);\n } else {\n // fill the queue with feed ranges overlapping the given epk range.\n await this.fetchOverLappingFeedRanges(diagnosticNode);\n }\n this.isInstantiated = true;\n }\n\n /**\n * Fill the queue with the feed ranges overlapping with the given epk range.\n */\n private async fetchOverLappingFeedRanges(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n try {\n const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n this.epkRange,\n diagnosticNode,\n );\n for (const overLappingRange of overLappingRanges) {\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n this.epkRange,\n overLappingRange,\n );\n const feedRange: ChangeFeedRange = new ChangeFeedRange(\n overLappingRange.minInclusive,\n overLappingRange.maxExclusive,\n \"\",\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(feedRange);\n }\n } catch (err) {\n throw new ErrorResponse(err.message);\n }\n }\n /**\n * Fill the queue with feed ranges from continuation token\n */\n private async fetchContinuationTokenFeedRanges(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<void> {\n const contToken = this.continuationToken;\n if (!this.continuationTokenRidMatchContainerRid()) {\n throw new ErrorResponse(\"The continuation token is not for the current container definition\");\n } else {\n for (const cToken of contToken.Continuation) {\n const queryRange = new QueryRange(cToken.minInclusive, cToken.maxExclusive, true, false);\n try {\n const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n );\n for (const overLappingRange of overLappingRanges) {\n // check if the epk range present in continuation token entirely covers the overlapping range.\n // If yes, minInclusive and maxExclusive of the overlapping range will be set.\n // If no, i.e. there is only partial overlap, epkMinHeader and epkMaxHeader are set as min and max of overlap.\n // This will be used when we make a call to fetch change feed.\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n queryRange,\n overLappingRange,\n );\n const feedRange: ChangeFeedRange = new ChangeFeedRange(\n overLappingRange.minInclusive,\n overLappingRange.maxExclusive,\n cToken.continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(feedRange);\n }\n } catch (err) {\n throw new ErrorResponse(err.message);\n }\n }\n }\n }\n\n /**\n * Change feed is an infinite feed. hasMoreResults is always true.\n */\n get hasMoreResults(): boolean {\n return true;\n }\n\n /**\n * Gets an async iterator which will yield change feed results.\n */\n public async *getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n do {\n const result = await this.readNext();\n yield result;\n } while (this.hasMoreResults);\n }\n\n /**\n * Gets an async iterator which will yield pages of results from Azure Cosmos DB.\n *\n * Keeps iterating over the feedranges and checks if any feed range has new result. Keeps note of the last feed range which returned non 304 result.\n *\n * When same feed range is reached and no new changes are found, a 304 (not Modified) is returned to the end user. Then starts process all over again.\n */\n public async readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n return withDiagnostics(async (diagnosticNode: DiagnosticNodeInternal) => {\n // validate if the internal queue is filled up with feed ranges.\n if (!this.isInstantiated) {\n await this.setIteratorRid(diagnosticNode);\n await this.fillChangeFeedQueue(diagnosticNode);\n }\n\n // stores the last feedRange for which statusCode is not 304 i.e. there were new changes in that feed range.\n let firstNotModifiedFeedRange: ChangeFeedRange = undefined;\n let result: ChangeFeedIteratorResponse<Array<T & Resource>>;\n do {\n const [processedFeedRange, response] = await this.fetchNext(diagnosticNode);\n result = response;\n\n if (result !== undefined) {\n {\n if (firstNotModifiedFeedRange === undefined) {\n firstNotModifiedFeedRange = processedFeedRange;\n }\n // move current feed range to end of queue to fetch result of next feed range.\n // This is done to fetch changes in breadth first manner and avoid starvation.\n this.queue.moveFirstElementToTheEnd();\n // check if there are new results for the given feed range.\n if (result.statusCode === StatusCodes.Ok) {\n result.headers[Constants.HttpHeaders.ContinuationToken] =\n this.generateContinuationToken();\n\n if (this.clientContext.enableEncryption) {\n await decryptChangeFeedResponse(\n result,\n diagnosticNode,\n this.changeFeedOptions.changeFeedMode,\n this.container.encryptionProcessor,\n );\n }\n return result;\n }\n }\n }\n } while (!this.checkedAllFeedRanges(firstNotModifiedFeedRange));\n // set the continuation token after processing.\n result.headers[Constants.HttpHeaders.ContinuationToken] = this.generateContinuationToken();\n return result;\n }, this.clientContext);\n }\n\n private generateContinuationToken = (): string => {\n return JSON.stringify(new CompositeContinuationToken(this.rId, this.queue.returnSnapshot()));\n };\n\n /**\n * Read feed and retrieves the next page of results in Azure Cosmos DB.\n */\n private async fetchNext(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<[ChangeFeedRange | undefined, ChangeFeedIteratorResponse<Array<T & Resource>>]> {\n const feedRange = this.queue.peek();\n if (feedRange) {\n // fetch results for feed range at the beginning of the queue.\n const result = await this.getFeedResponse(feedRange, diagnosticNode);\n\n // check if results need to be fetched again depending on status code returned.\n // Eg. in case of paritionSplit, results need to be fetched for the child partitions.\n const shouldRetry: boolean = await this.shouldRetryOnFailure(\n feedRange,\n result,\n diagnosticNode,\n );\n\n if (shouldRetry) {\n this.queue.dequeue();\n return this.fetchNext(diagnosticNode);\n } else {\n // update the continuation value for the current feed range.\n const continuationValueForFeedRange = result.headers[Constants.HttpHeaders.ETag];\n const newFeedRange = this.queue.peek();\n newFeedRange.continuationToken = continuationValueForFeedRange;\n return [newFeedRange, result];\n }\n } else {\n return [undefined, undefined];\n }\n }\n\n private checkedAllFeedRanges(firstNotModifiedFeedRange: ChangeFeedRange | undefined): boolean {\n if (firstNotModifiedFeedRange === undefined) {\n return false;\n }\n const feedRangeQueueFirstElement = this.queue.peek();\n return (\n firstNotModifiedFeedRange.minInclusive === feedRangeQueueFirstElement?.minInclusive &&\n firstNotModifiedFeedRange.maxExclusive === feedRangeQueueFirstElement?.maxExclusive &&\n firstNotModifiedFeedRange.epkMinHeader === feedRangeQueueFirstElement?.epkMinHeader &&\n firstNotModifiedFeedRange.epkMaxHeader === feedRangeQueueFirstElement?.epkMaxHeader\n );\n }\n\n /**\n * Checks whether the current EpkRange is split into multiple ranges or not.\n *\n * If yes, it force refreshes the partitionKeyRange cache and enqueue children epk ranges.\n */\n private async shouldRetryOnFailure(\n feedRange: ChangeFeedRange,\n response: ChangeFeedIteratorResponse<Array<T & Resource>>,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (response.statusCode === StatusCodes.Ok || response.statusCode === StatusCodes.NotModified) {\n return false;\n }\n\n const partitionSplit =\n response.statusCode === StatusCodes.Gone &&\n (response.subStatusCode === SubStatusCodes.PartitionKeyRangeGone ||\n response.subStatusCode === SubStatusCodes.CompletingSplit);\n\n if (partitionSplit) {\n const queryRange = new QueryRange(\n feedRange.epkMinHeader ? feedRange.epkMinHeader : feedRange.minInclusive,\n feedRange.epkMaxHeader ? feedRange.epkMaxHeader : feedRange.maxExclusive,\n true,\n false,\n );\n const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n true,\n );\n if (resolvedRanges.length < 1) {\n throw new ErrorResponse(\"Partition split/merge detected but no overlapping ranges found.\");\n }\n // This covers both cases of merge and split.\n // resolvedRanges.length > 1 in case of split.\n // resolvedRanges.length === 1 in case of merge. EpkRange headers will be added in this case.\n if (resolvedRanges.length >= 1) {\n await this.handleSplitOrMerge(\n false,\n resolvedRanges,\n queryRange,\n feedRange.continuationToken,\n );\n }\n return true;\n }\n return false;\n }\n /*\n * Enqueues all the children feed ranges for the given feed range.\n */\n private async handleSplitOrMerge(\n shiftLeft: boolean,\n resolvedRanges: any,\n oldFeedRange: QueryRange,\n continuationToken: string,\n ): Promise<void> {\n let flag = 0;\n if (shiftLeft) {\n // This section is only applicable when handleSplitOrMerge is called by getPartitionRangeId().\n // used only when existing partition key range cache is used to check for any overlapping ranges.\n // Modifies the first element with the first overlapping range.\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n oldFeedRange,\n resolvedRanges[0],\n );\n const newFeedRange = new ChangeFeedRange(\n resolvedRanges[0].minInclusive,\n resolvedRanges[0].maxExclusive,\n continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n\n this.queue.modifyFirstElement(newFeedRange);\n flag = 1;\n }\n // Enqueue the overlapping ranges.\n for (let i = flag; i < resolvedRanges.length; i++) {\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n oldFeedRange,\n resolvedRanges[i],\n );\n const newFeedRange = new ChangeFeedRange(\n resolvedRanges[i].minInclusive,\n resolvedRanges[i].maxExclusive,\n continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(newFeedRange);\n }\n }\n\n /**\n * Fetch the partitionKeyRangeId for the given feed range.\n *\n * This partitionKeyRangeId is passed to queryFeed to fetch the results.\n */\n private async getPartitionRangeId(\n feedRange: ChangeFeedRange,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<string> {\n const min = feedRange.epkMinHeader ? feedRange.epkMinHeader : feedRange.minInclusive;\n const max = feedRange.epkMaxHeader ? feedRange.epkMaxHeader : feedRange.maxExclusive;\n const queryRange = new QueryRange(min, max, true, false);\n const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n false,\n );\n if (resolvedRanges.length < 1) {\n throw new ErrorResponse(\"No overlapping ranges found.\");\n }\n const firstResolvedRange = resolvedRanges[0];\n const isPartitionRangeChanged =\n feedRange.minInclusive !== firstResolvedRange.minInclusive ||\n feedRange.maxExclusive !== firstResolvedRange.maxExclusive ||\n resolvedRanges.length > 1;\n // If the partition range is changed, we need to handle split/merge\n if (isPartitionRangeChanged) {\n await this.handleSplitOrMerge(true, resolvedRanges, queryRange, feedRange.continuationToken);\n }\n return firstResolvedRange.id;\n }\n\n private async getFeedResponse(\n feedRange: ChangeFeedRange,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const feedOptions: FeedOptions = {\n initialHeaders: {},\n useLatestVersionFeed: true,\n useAllVersionsAndDeletesFeed: false,\n };\n\n if (typeof this.changeFeedOptions.maxItemCount === \"number\") {\n feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;\n }\n\n if (this.changeFeedOptions.sessionToken) {\n feedOptions.sessionToken = this.changeFeedOptions.sessionToken;\n }\n\n if (this.changeFeedOptions.excludedLocations) {\n feedOptions.excludedLocations = this.changeFeedOptions.excludedLocations;\n }\n\n if (feedRange.continuationToken) {\n feedOptions.accessCondition = {\n type: Constants.HttpHeaders.IfNoneMatch,\n condition: feedRange.continuationToken,\n };\n } else if (this.startFromNow) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfNoneMatch] =\n Constants.ChangeFeedIfNoneMatchStartFromNowHeader;\n }\n\n if (this.startTime) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.startTime;\n }\n\n if (\n this.changeFeedOptions.changeFeedMode &&\n this.changeFeedOptions.changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes\n ) {\n feedOptions.useAllVersionsAndDeletesFeed = true;\n feedOptions.useLatestVersionFeed = false;\n }\n\n const rangeId = await this.getPartitionRangeId(feedRange, diagnosticNode);\n if (this.clientContext.enableEncryption) {\n await this.container.checkAndInitializeEncryption();\n feedOptions.containerRid = this.container._rid;\n }\n try {\n // startEpk and endEpk are only valid in case we want to fetch result for a part of partition and not the entire partition.\n const finalFeedRange = this.fetchFinalFeedRange();\n const response: Response<Array<T & Resource>> = await (this.clientContext.queryFeed<T>({\n path: this.resourceLink,\n resourceType: ResourceType.item,\n resourceId: this.resourceId,\n resultFn: (result) => (result ? result.Documents : []),\n query: undefined,\n options: feedOptions,\n diagnosticNode,\n partitionKey: undefined,\n partitionKeyRangeId: rangeId,\n startEpk: finalFeedRange.epkMinHeader,\n endEpk: finalFeedRange.epkMaxHeader,\n }) as Promise<any>);\n\n return new ChangeFeedIteratorResponse(\n response.result,\n response.result ? response.result.length : 0,\n response.code,\n response.headers,\n getEmptyCosmosDiagnostics(),\n );\n } catch (err) {\n // If partition split/merge is encountered, handle it gracefully and continue fetching results.\n if (err.code === StatusCodes.Gone) {\n return new ChangeFeedIteratorResponse(\n [],\n 0,\n err.code,\n err.headers,\n getEmptyCosmosDiagnostics(),\n err.substatus,\n );\n }\n // If any other errors are encountered, throw the error.\n const errorResponse = new ErrorResponse(err.message);\n errorResponse.code = err.code;\n errorResponse.headers = err.headers;\n throw errorResponse;\n }\n }\n private fetchFinalFeedRange(): ChangeFeedRange {\n // this is used to fetch the final feed range before making a call to fetch the results.\n // In case of merge, the final updated feed range is present in the queue and needs to be returned.\n const feedRange = this.queue.peek();\n if (feedRange) {\n return feedRange;\n } else {\n throw new ErrorResponse(\"No feed range found.\");\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ChangeFeedForEpkRange.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForEpkRange.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { ChangeFeedRange } from \"./ChangeFeedRange.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\nimport type { PartitionKeyRangeCache } from \"../../routing/index.js\";\nimport { QueryRange } from \"../../routing/index.js\";\nimport { FeedRangeQueue } from \"./FeedRangeQueue.js\";\nimport type { ClientContext } from \"../../ClientContext.js\";\nimport type { Container, Resource } from \"../../client/index.js\";\nimport { Constants, SubStatusCodes, StatusCodes, ResourceType } from \"../../common/index.js\";\nimport type { Response, FeedOptions } from \"../../request/index.js\";\nimport { ErrorResponse } from \"../../request/index.js\";\nimport { CompositeContinuationToken } from \"./CompositeContinuationToken.js\";\nimport type { ChangeFeedPullModelIterator } from \"./ChangeFeedPullModelIterator.js\";\nimport {\n buildFeedOptions,\n decryptChangeFeedResponse,\n extractOverlappingRanges,\n} from \"./changeFeedUtils.js\";\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport type { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { getEmptyCosmosDiagnostics, withDiagnostics } from \"../../utils/diagnostics.js\";\n/**\n * @hidden\n * Provides iterator for change feed for entire container or an epk range.\n *\n * Use `Items.getChangeFeedIterator()` to get an instance of the iterator.\n */\nexport class ChangeFeedForEpkRange<T> implements ChangeFeedPullModelIterator<T> {\n private continuationToken?: CompositeContinuationToken;\n private queue: FeedRangeQueue<ChangeFeedRange>;\n private startTime: string;\n private isInstantiated: boolean;\n private rId: string;\n private startFromNow: boolean;\n /**\n * @internal\n */\n constructor(\n private clientContext: ClientContext,\n private container: Container,\n private partitionKeyRangeCache: PartitionKeyRangeCache,\n private resourceId: string,\n private resourceLink: string,\n private url: string,\n private changeFeedOptions: InternalChangeFeedIteratorOptions,\n private epkRange: QueryRange,\n ) {\n this.queue = new FeedRangeQueue<ChangeFeedRange>();\n this.continuationToken = changeFeedOptions.continuationToken\n ? JSON.parse(changeFeedOptions.continuationToken)\n : undefined;\n this.isInstantiated = false;\n // startTime is used to store and specify time from which change feed should start reading new changes. StartFromNow flag is used to indicate fetching changes from now.\n if (changeFeedOptions.startFromNow) {\n this.startFromNow = true;\n } else if (changeFeedOptions.startTime) {\n this.startTime = changeFeedOptions.startTime.toUTCString();\n }\n }\n\n private async setIteratorRid(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n const { resource } = await this.container.readInternal(diagnosticNode);\n this.rId = resource._rid;\n }\n\n private continuationTokenRidMatchContainerRid(): boolean {\n if (this.continuationToken.rid !== this.rId) {\n return false;\n }\n return true;\n }\n\n private async fillChangeFeedQueue(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n if (this.continuationToken) {\n // fill the queue with feed ranges in continuation token.\n await this.fetchContinuationTokenFeedRanges(diagnosticNode);\n } else {\n // fill the queue with feed ranges overlapping the given epk range.\n await this.fetchOverLappingFeedRanges(diagnosticNode);\n }\n this.isInstantiated = true;\n }\n\n /**\n * Fill the queue with the feed ranges overlapping with the given epk range.\n */\n private async fetchOverLappingFeedRanges(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n try {\n const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n this.epkRange,\n diagnosticNode,\n );\n for (const overLappingRange of overLappingRanges) {\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n this.epkRange,\n overLappingRange,\n );\n const feedRange: ChangeFeedRange = new ChangeFeedRange(\n overLappingRange.minInclusive,\n overLappingRange.maxExclusive,\n \"\",\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(feedRange);\n }\n } catch (err) {\n throw new ErrorResponse(err.message);\n }\n }\n /**\n * Fill the queue with feed ranges from continuation token\n */\n private async fetchContinuationTokenFeedRanges(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<void> {\n const contToken = this.continuationToken;\n if (!this.continuationTokenRidMatchContainerRid()) {\n throw new ErrorResponse(\"The continuation token is not for the current container definition\");\n } else {\n for (const cToken of contToken.Continuation) {\n const queryRange = new QueryRange(cToken.minInclusive, cToken.maxExclusive, true, false);\n try {\n const overLappingRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n );\n for (const overLappingRange of overLappingRanges) {\n // check if the epk range present in continuation token entirely covers the overlapping range.\n // If yes, minInclusive and maxExclusive of the overlapping range will be set.\n // If no, i.e. there is only partial overlap, epkMinHeader and epkMaxHeader are set as min and max of overlap.\n // This will be used when we make a call to fetch change feed.\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n queryRange,\n overLappingRange,\n );\n const feedRange: ChangeFeedRange = new ChangeFeedRange(\n overLappingRange.minInclusive,\n overLappingRange.maxExclusive,\n cToken.continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(feedRange);\n }\n } catch (err) {\n throw new ErrorResponse(err.message);\n }\n }\n }\n }\n\n /**\n * Change feed is an infinite feed. hasMoreResults is always true.\n */\n get hasMoreResults(): boolean {\n return true;\n }\n\n /**\n * Gets an async iterator which will yield change feed results.\n */\n public async *getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n do {\n const result = await this.readNext();\n yield result;\n } while (this.hasMoreResults);\n }\n\n /**\n * Gets an async iterator which will yield pages of results from Azure Cosmos DB.\n *\n * Keeps iterating over the feedranges and checks if any feed range has new result. Keeps note of the last feed range which returned non 304 result.\n *\n * When same feed range is reached and no new changes are found, a 304 (not Modified) is returned to the end user. Then starts process all over again.\n */\n public async readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n return withDiagnostics(async (diagnosticNode: DiagnosticNodeInternal) => {\n // validate if the internal queue is filled up with feed ranges.\n if (!this.isInstantiated) {\n await this.setIteratorRid(diagnosticNode);\n await this.fillChangeFeedQueue(diagnosticNode);\n }\n\n // stores the last feedRange for which statusCode is not 304 i.e. there were new changes in that feed range.\n let firstNotModifiedFeedRange: ChangeFeedRange = undefined;\n let result: ChangeFeedIteratorResponse<Array<T & Resource>>;\n do {\n const [processedFeedRange, response] = await this.fetchNext(diagnosticNode);\n result = response;\n\n if (result !== undefined) {\n {\n if (firstNotModifiedFeedRange === undefined) {\n firstNotModifiedFeedRange = processedFeedRange;\n }\n // move current feed range to end of queue to fetch result of next feed range.\n // This is done to fetch changes in breadth first manner and avoid starvation.\n this.queue.moveFirstElementToTheEnd();\n // check if there are new results for the given feed range.\n if (result.statusCode === StatusCodes.Ok) {\n result.headers[Constants.HttpHeaders.ContinuationToken] =\n this.generateContinuationToken();\n\n if (this.clientContext.enableEncryption) {\n await decryptChangeFeedResponse(\n result,\n diagnosticNode,\n this.changeFeedOptions.changeFeedMode,\n this.container.encryptionProcessor,\n );\n }\n return result;\n }\n }\n }\n } while (!this.checkedAllFeedRanges(firstNotModifiedFeedRange));\n // set the continuation token after processing.\n result.headers[Constants.HttpHeaders.ContinuationToken] = this.generateContinuationToken();\n return result;\n }, this.clientContext);\n }\n\n private generateContinuationToken = (): string => {\n return JSON.stringify(new CompositeContinuationToken(this.rId, this.queue.returnSnapshot()));\n };\n\n /**\n * Read feed and retrieves the next page of results in Azure Cosmos DB.\n */\n private async fetchNext(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<[ChangeFeedRange | undefined, ChangeFeedIteratorResponse<Array<T & Resource>>]> {\n const feedRange = this.queue.peek();\n if (feedRange) {\n // fetch results for feed range at the beginning of the queue.\n const result = await this.getFeedResponse(feedRange, diagnosticNode);\n\n // check if results need to be fetched again depending on status code returned.\n // Eg. in case of paritionSplit, results need to be fetched for the child partitions.\n const shouldRetry: boolean = await this.shouldRetryOnFailure(\n feedRange,\n result,\n diagnosticNode,\n );\n\n if (shouldRetry) {\n this.queue.dequeue();\n return this.fetchNext(diagnosticNode);\n } else {\n // update the continuation value for the current feed range.\n const continuationValueForFeedRange = result.headers[Constants.HttpHeaders.ETag];\n const newFeedRange = this.queue.peek();\n newFeedRange.continuationToken = continuationValueForFeedRange;\n return [newFeedRange, result];\n }\n } else {\n return [undefined, undefined];\n }\n }\n\n private checkedAllFeedRanges(firstNotModifiedFeedRange: ChangeFeedRange | undefined): boolean {\n if (firstNotModifiedFeedRange === undefined) {\n return false;\n }\n const feedRangeQueueFirstElement = this.queue.peek();\n return (\n firstNotModifiedFeedRange.minInclusive === feedRangeQueueFirstElement?.minInclusive &&\n firstNotModifiedFeedRange.maxExclusive === feedRangeQueueFirstElement?.maxExclusive &&\n firstNotModifiedFeedRange.epkMinHeader === feedRangeQueueFirstElement?.epkMinHeader &&\n firstNotModifiedFeedRange.epkMaxHeader === feedRangeQueueFirstElement?.epkMaxHeader\n );\n }\n\n /**\n * Checks whether the current EpkRange is split into multiple ranges or not.\n *\n * If yes, it force refreshes the partitionKeyRange cache and enqueue children epk ranges.\n */\n private async shouldRetryOnFailure(\n feedRange: ChangeFeedRange,\n response: ChangeFeedIteratorResponse<Array<T & Resource>>,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (response.statusCode === StatusCodes.Ok || response.statusCode === StatusCodes.NotModified) {\n return false;\n }\n\n const partitionSplit =\n response.statusCode === StatusCodes.Gone &&\n (response.subStatusCode === SubStatusCodes.PartitionKeyRangeGone ||\n response.subStatusCode === SubStatusCodes.CompletingSplit);\n\n if (partitionSplit) {\n const queryRange = new QueryRange(\n feedRange.epkMinHeader ? feedRange.epkMinHeader : feedRange.minInclusive,\n feedRange.epkMaxHeader ? feedRange.epkMaxHeader : feedRange.maxExclusive,\n true,\n false,\n );\n const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n true,\n );\n if (resolvedRanges.length < 1) {\n throw new ErrorResponse(\"Partition split/merge detected but no overlapping ranges found.\");\n }\n // This covers both cases of merge and split.\n // resolvedRanges.length > 1 in case of split.\n // resolvedRanges.length === 1 in case of merge. EpkRange headers will be added in this case.\n if (resolvedRanges.length >= 1) {\n await this.handleSplitOrMerge(\n false,\n resolvedRanges,\n queryRange,\n feedRange.continuationToken,\n );\n }\n return true;\n }\n return false;\n }\n /*\n * Enqueues all the children feed ranges for the given feed range.\n */\n private async handleSplitOrMerge(\n shiftLeft: boolean,\n resolvedRanges: any,\n oldFeedRange: QueryRange,\n continuationToken: string,\n ): Promise<void> {\n let flag = 0;\n if (shiftLeft) {\n // This section is only applicable when handleSplitOrMerge is called by getPartitionRangeId().\n // used only when existing partition key range cache is used to check for any overlapping ranges.\n // Modifies the first element with the first overlapping range.\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n oldFeedRange,\n resolvedRanges[0],\n );\n const newFeedRange = new ChangeFeedRange(\n resolvedRanges[0].minInclusive,\n resolvedRanges[0].maxExclusive,\n continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n\n this.queue.modifyFirstElement(newFeedRange);\n flag = 1;\n }\n // Enqueue the overlapping ranges.\n for (let i = flag; i < resolvedRanges.length; i++) {\n const [epkMinHeader, epkMaxHeader] = await extractOverlappingRanges(\n oldFeedRange,\n resolvedRanges[i],\n );\n const newFeedRange = new ChangeFeedRange(\n resolvedRanges[i].minInclusive,\n resolvedRanges[i].maxExclusive,\n continuationToken,\n epkMinHeader,\n epkMaxHeader,\n );\n this.queue.enqueue(newFeedRange);\n }\n }\n\n /**\n * Fetch the partitionKeyRangeId for the given feed range.\n *\n * This partitionKeyRangeId is passed to queryFeed to fetch the results.\n */\n private async getPartitionRangeId(\n feedRange: ChangeFeedRange,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<string> {\n const min = feedRange.epkMinHeader ? feedRange.epkMinHeader : feedRange.minInclusive;\n const max = feedRange.epkMaxHeader ? feedRange.epkMaxHeader : feedRange.maxExclusive;\n const queryRange = new QueryRange(min, max, true, false);\n const resolvedRanges = await this.partitionKeyRangeCache.getOverlappingRanges(\n this.url,\n queryRange,\n diagnosticNode,\n false,\n );\n if (resolvedRanges.length < 1) {\n throw new ErrorResponse(\"No overlapping ranges found.\");\n }\n const firstResolvedRange = resolvedRanges[0];\n const isPartitionRangeChanged =\n feedRange.minInclusive !== firstResolvedRange.minInclusive ||\n feedRange.maxExclusive !== firstResolvedRange.maxExclusive ||\n resolvedRanges.length > 1;\n // If the partition range is changed, we need to handle split/merge\n if (isPartitionRangeChanged) {\n await this.handleSplitOrMerge(true, resolvedRanges, queryRange, feedRange.continuationToken);\n }\n return firstResolvedRange.id;\n }\n\n private async getFeedResponse(\n feedRange: ChangeFeedRange,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const feedOptions: FeedOptions = buildFeedOptions(\n this.changeFeedOptions,\n feedRange.continuationToken,\n this.startFromNow,\n this.startTime,\n );\n const rangeId = await this.getPartitionRangeId(feedRange, diagnosticNode);\n if (this.clientContext.enableEncryption) {\n await this.container.checkAndInitializeEncryption();\n feedOptions.containerRid = this.container._rid;\n }\n try {\n // startEpk and endEpk are only valid in case we want to fetch result for a part of partition and not the entire partition.\n const finalFeedRange = this.fetchFinalFeedRange();\n const response: Response<Array<T & Resource>> = await (this.clientContext.queryFeed<T>({\n path: this.resourceLink,\n resourceType: ResourceType.item,\n resourceId: this.resourceId,\n resultFn: (result) => (result ? result.Documents : []),\n query: undefined,\n options: feedOptions,\n diagnosticNode,\n partitionKey: undefined,\n partitionKeyRangeId: rangeId,\n startEpk: finalFeedRange.epkMinHeader,\n endEpk: finalFeedRange.epkMaxHeader,\n }) as Promise<any>);\n\n return new ChangeFeedIteratorResponse(\n response.result,\n response.result ? response.result.length : 0,\n response.code,\n response.headers,\n getEmptyCosmosDiagnostics(),\n );\n } catch (err) {\n // If partition split/merge is encountered, handle it gracefully and continue fetching results.\n if (err.code === StatusCodes.Gone) {\n return new ChangeFeedIteratorResponse(\n [],\n 0,\n err.code,\n err.headers,\n getEmptyCosmosDiagnostics(),\n err.substatus,\n );\n }\n // If any other errors are encountered, throw the error.\n const errorResponse = new ErrorResponse(err.message);\n errorResponse.code = err.code;\n errorResponse.headers = err.headers;\n throw errorResponse;\n }\n }\n private fetchFinalFeedRange(): ChangeFeedRange {\n // this is used to fetch the final feed range before making a call to fetch the results.\n // In case of merge, the final updated feed range is present in the queue and needs to be returned.\n const feedRange = this.queue.peek();\n if (feedRange) {\n return feedRange;\n } else {\n throw new ErrorResponse(\"No feed range found.\");\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeFeedForPartitionKey.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForPartitionKey.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAa,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAO/E;;;;;GAKG;AACH,qBAAa,yBAAyB,CAAC,CAAC,CAAE,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAU/E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAd3B,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;YAwBhB,mBAAmB;IAgCjC,OAAO,CAAC,qCAAqC;YAO/B,cAAc;IAK5B;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACW,gBAAgB,IAAI,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAOhG;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAoBjF;;OAEG;YACW,SAAS;YAWT,eAAe;CA+E9B"}
1
+ {"version":3,"file":"ChangeFeedForPartitionKey.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForPartitionKey.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAa,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAM/E;;;;;GAKG;AACH,qBAAa,yBAAyB,CAAC,CAAC,CAAE,YAAW,2BAA2B,CAAC,CAAC,CAAC;IAU/E,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,iBAAiB;IAd3B,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;YAwBhB,mBAAmB;IAgCjC,OAAO,CAAC,qCAAqC;YAO/B,cAAc;IAK5B;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACW,gBAAgB,IAAI,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAOhG;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAoBjF;;OAEG;YACW,SAAS;YAWT,eAAe;CA+C9B"}
@@ -4,8 +4,7 @@ import { ErrorResponse } from "../../request/index.js";
4
4
  import { ContinuationTokenForPartitionKey } from "./ContinuationTokenForPartitionKey.js";
5
5
  import { convertToInternalPartitionKey } from "../../documents/index.js";
6
6
  import { getEmptyCosmosDiagnostics, withDiagnostics } from "../../utils/diagnostics.js";
7
- import { ChangeFeedMode } from "./ChangeFeedMode.js";
8
- import { decryptChangeFeedResponse } from "./changeFeedUtils.js";
7
+ import { buildFeedOptions, decryptChangeFeedResponse } from "./changeFeedUtils.js";
9
8
  import { computePartitionKeyRangeId } from "../ClientUtils.js";
10
9
  /**
11
10
  * @hidden
@@ -120,39 +119,7 @@ export class ChangeFeedForPartitionKey {
120
119
  return response;
121
120
  }
122
121
  async getFeedResponse(diagnosticNode) {
123
- const feedOptions = {
124
- initialHeaders: {},
125
- useLatestVersionFeed: true,
126
- useAllVersionsAndDeletesFeed: false,
127
- };
128
- if (typeof this.changeFeedOptions.maxItemCount === "number") {
129
- feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;
130
- }
131
- if (this.changeFeedOptions.sessionToken) {
132
- feedOptions.sessionToken = this.changeFeedOptions.sessionToken;
133
- }
134
- if (this.changeFeedOptions.excludedLocations) {
135
- feedOptions.excludedLocations = this.changeFeedOptions.excludedLocations;
136
- }
137
- const continuation = this.continuationToken.Continuation;
138
- if (continuation) {
139
- feedOptions.accessCondition = {
140
- type: Constants.HttpHeaders.IfNoneMatch,
141
- condition: continuation,
142
- };
143
- }
144
- else if (this.startFromNow) {
145
- feedOptions.initialHeaders[Constants.HttpHeaders.IfNoneMatch] =
146
- Constants.ChangeFeedIfNoneMatchStartFromNowHeader;
147
- }
148
- if (this.startTime) {
149
- feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.startTime;
150
- }
151
- if (this.changeFeedOptions.changeFeedMode &&
152
- this.changeFeedOptions.changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes) {
153
- feedOptions.useAllVersionsAndDeletesFeed = true;
154
- feedOptions.useLatestVersionFeed = false;
155
- }
122
+ const feedOptions = buildFeedOptions(this.changeFeedOptions, this.continuationToken?.Continuation, this.startFromNow, this.startTime);
156
123
  if (this.clientContext.enableEncryption) {
157
124
  feedOptions.containerRid = this.container._rid;
158
125
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeFeedForPartitionKey.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForPartitionKey.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\nimport { Container, Resource } from \"../../client/index.js\";\nimport { ClientContext } from \"../../ClientContext.js\";\nimport { Constants, copyObject, ResourceType, StatusCodes } from \"../../common/index.js\";\nimport { FeedOptions, Response, ErrorResponse } from \"../../request/index.js\";\nimport { ContinuationTokenForPartitionKey } from \"./ContinuationTokenForPartitionKey.js\";\nimport { ChangeFeedPullModelIterator } from \"./ChangeFeedPullModelIterator.js\";\nimport { PartitionKey, convertToInternalPartitionKey } from \"../../documents/index.js\";\nimport { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { getEmptyCosmosDiagnostics, withDiagnostics } from \"../../utils/diagnostics.js\";\nimport { ChangeFeedMode } from \"./ChangeFeedMode.js\";\nimport { decryptChangeFeedResponse } from \"./changeFeedUtils.js\";\nimport { computePartitionKeyRangeId } from \"../ClientUtils.js\";\n/**\n * @hidden\n * Provides iterator for change feed for one partition key.\n *\n * Use `Items.getChangeFeedIterator()` to get an instance of the iterator.\n */\nexport class ChangeFeedForPartitionKey<T> implements ChangeFeedPullModelIterator<T> {\n private continuationToken: ContinuationTokenForPartitionKey;\n private startTime: string;\n private rId: string;\n private isInstantiated: boolean;\n private startFromNow: boolean;\n /**\n * @internal\n */\n constructor(\n private clientContext: ClientContext,\n private container: Container,\n private resourceId: string,\n private resourceLink: string,\n private partitionKey: PartitionKey,\n private changeFeedOptions: InternalChangeFeedIteratorOptions,\n ) {\n this.continuationToken = changeFeedOptions.continuationToken\n ? JSON.parse(changeFeedOptions.continuationToken)\n : undefined;\n this.isInstantiated = false;\n // startTime is used to store and specify time from which change feed should start reading new changes. StartFromNow flag is used to indicate fetching changes from now.\n if (changeFeedOptions.startFromNow) {\n this.startFromNow = true;\n } else if (changeFeedOptions.startTime) {\n this.startTime = changeFeedOptions.startTime.toUTCString();\n }\n }\n\n private async instantiateIterator(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n await this.setIteratorRid(diagnosticNode);\n if (this.clientContext.enableEncryption) {\n await this.container.checkAndInitializeEncryption();\n // returns copy of object to avoid encryption of original partition key passed\n this.partitionKey = copyObject(this.partitionKey);\n diagnosticNode.beginEncryptionDiagnostics(Constants.Encryption.DiagnosticsEncryptOperation);\n const { partitionKeyList, encryptedCount } =\n await this.container.encryptionProcessor.getEncryptedPartitionKeyValue(\n convertToInternalPartitionKey(this.partitionKey),\n );\n this.partitionKey = partitionKeyList;\n diagnosticNode.endEncryptionDiagnostics(\n Constants.Encryption.DiagnosticsEncryptOperation,\n encryptedCount,\n );\n }\n if (this.continuationToken) {\n if (!this.continuationTokenRidMatchContainerRid()) {\n throw new ErrorResponse(\"The continuation is not for the current container definition.\");\n }\n } else {\n this.continuationToken = new ContinuationTokenForPartitionKey(\n this.rId,\n this.partitionKey,\n \"\",\n );\n }\n\n this.isInstantiated = true;\n }\n\n private continuationTokenRidMatchContainerRid(): boolean {\n if (this.continuationToken.rid !== this.rId) {\n return false;\n }\n return true;\n }\n\n private async setIteratorRid(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n const { resource } = await this.container.readInternal(diagnosticNode);\n this.rId = resource._rid;\n }\n\n /**\n * Change feed is an infinite feed. hasMoreResults is always true.\n */\n get hasMoreResults(): boolean {\n return true;\n }\n\n /**\n * Gets an async iterator which will yield change feed results.\n */\n public async *getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n do {\n const result = await this.readNext();\n yield result;\n } while (this.hasMoreResults);\n }\n\n /**\n * Returns the result of change feed from Azure Cosmos DB.\n */\n public async readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n return withDiagnostics(async (diagnosticNode: DiagnosticNodeInternal) => {\n if (!this.isInstantiated) {\n await this.instantiateIterator(diagnosticNode);\n }\n const result = await this.fetchNext(diagnosticNode);\n if (result.statusCode === StatusCodes.Ok) {\n if (this.clientContext.enableEncryption) {\n await decryptChangeFeedResponse(\n result,\n diagnosticNode,\n this.changeFeedOptions.changeFeedMode,\n this.container.encryptionProcessor,\n );\n }\n }\n return result;\n }, this.clientContext);\n }\n\n /**\n * Read feed and retrieves the next set of results in Azure Cosmos DB.\n */\n private async fetchNext(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const response = await this.getFeedResponse(diagnosticNode);\n this.continuationToken.Continuation = response.headers[Constants.HttpHeaders.ETag];\n response.headers[Constants.HttpHeaders.ContinuationToken] = JSON.stringify(\n this.continuationToken,\n );\n return response;\n }\n\n private async getFeedResponse(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const feedOptions: FeedOptions = {\n initialHeaders: {},\n useLatestVersionFeed: true,\n useAllVersionsAndDeletesFeed: false,\n };\n if (typeof this.changeFeedOptions.maxItemCount === \"number\") {\n feedOptions.maxItemCount = this.changeFeedOptions.maxItemCount;\n }\n\n if (this.changeFeedOptions.sessionToken) {\n feedOptions.sessionToken = this.changeFeedOptions.sessionToken;\n }\n\n if (this.changeFeedOptions.excludedLocations) {\n feedOptions.excludedLocations = this.changeFeedOptions.excludedLocations;\n }\n\n const continuation = this.continuationToken.Continuation;\n if (continuation) {\n feedOptions.accessCondition = {\n type: Constants.HttpHeaders.IfNoneMatch,\n condition: continuation,\n };\n } else if (this.startFromNow) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfNoneMatch] =\n Constants.ChangeFeedIfNoneMatchStartFromNowHeader;\n }\n\n if (this.startTime) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = this.startTime;\n }\n if (\n this.changeFeedOptions.changeFeedMode &&\n this.changeFeedOptions.changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes\n ) {\n feedOptions.useAllVersionsAndDeletesFeed = true;\n feedOptions.useLatestVersionFeed = false;\n }\n if (this.clientContext.enableEncryption) {\n feedOptions.containerRid = this.container._rid;\n }\n try {\n const isPartitionLevelFailOverEnabled = this.clientContext.isPartitionLevelFailOverEnabled();\n const partitionKeyRangeId = await computePartitionKeyRangeId(\n diagnosticNode,\n convertToInternalPartitionKey(this.partitionKey),\n this.clientContext.partitionKeyRangeCache,\n isPartitionLevelFailOverEnabled,\n this.container,\n );\n const response: Response<Array<T & Resource>> = await (this.clientContext.queryFeed<T>({\n path: this.resourceLink,\n resourceType: ResourceType.item,\n resourceId: this.resourceId,\n resultFn: (result) => (result ? result.Documents : []),\n diagnosticNode,\n query: undefined,\n options: feedOptions,\n partitionKey: this.partitionKey,\n partitionKeyRangeId,\n }) as Promise<any>);\n return new ChangeFeedIteratorResponse(\n response.result,\n response.result ? response.result.length : 0,\n response.code,\n response.headers,\n getEmptyCosmosDiagnostics(),\n );\n } catch (err) {\n // If any errors are encountered, throw the error.\n const errorResponse = new ErrorResponse(err.message);\n errorResponse.code = err.code;\n errorResponse.headers = err.headers;\n throw errorResponse;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ChangeFeedForPartitionKey.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedForPartitionKey.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\nimport { Container, Resource } from \"../../client/index.js\";\nimport { ClientContext } from \"../../ClientContext.js\";\nimport { Constants, copyObject, ResourceType, StatusCodes } from \"../../common/index.js\";\nimport { FeedOptions, Response, ErrorResponse } from \"../../request/index.js\";\nimport { ContinuationTokenForPartitionKey } from \"./ContinuationTokenForPartitionKey.js\";\nimport { ChangeFeedPullModelIterator } from \"./ChangeFeedPullModelIterator.js\";\nimport { PartitionKey, convertToInternalPartitionKey } from \"../../documents/index.js\";\nimport { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { getEmptyCosmosDiagnostics, withDiagnostics } from \"../../utils/diagnostics.js\";\nimport { buildFeedOptions, decryptChangeFeedResponse } from \"./changeFeedUtils.js\";\nimport { computePartitionKeyRangeId } from \"../ClientUtils.js\";\n/**\n * @hidden\n * Provides iterator for change feed for one partition key.\n *\n * Use `Items.getChangeFeedIterator()` to get an instance of the iterator.\n */\nexport class ChangeFeedForPartitionKey<T> implements ChangeFeedPullModelIterator<T> {\n private continuationToken: ContinuationTokenForPartitionKey;\n private startTime: string;\n private rId: string;\n private isInstantiated: boolean;\n private startFromNow: boolean;\n /**\n * @internal\n */\n constructor(\n private clientContext: ClientContext,\n private container: Container,\n private resourceId: string,\n private resourceLink: string,\n private partitionKey: PartitionKey,\n private changeFeedOptions: InternalChangeFeedIteratorOptions,\n ) {\n this.continuationToken = changeFeedOptions.continuationToken\n ? JSON.parse(changeFeedOptions.continuationToken)\n : undefined;\n this.isInstantiated = false;\n // startTime is used to store and specify time from which change feed should start reading new changes. StartFromNow flag is used to indicate fetching changes from now.\n if (changeFeedOptions.startFromNow) {\n this.startFromNow = true;\n } else if (changeFeedOptions.startTime) {\n this.startTime = changeFeedOptions.startTime.toUTCString();\n }\n }\n\n private async instantiateIterator(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n await this.setIteratorRid(diagnosticNode);\n if (this.clientContext.enableEncryption) {\n await this.container.checkAndInitializeEncryption();\n // returns copy of object to avoid encryption of original partition key passed\n this.partitionKey = copyObject(this.partitionKey);\n diagnosticNode.beginEncryptionDiagnostics(Constants.Encryption.DiagnosticsEncryptOperation);\n const { partitionKeyList, encryptedCount } =\n await this.container.encryptionProcessor.getEncryptedPartitionKeyValue(\n convertToInternalPartitionKey(this.partitionKey),\n );\n this.partitionKey = partitionKeyList;\n diagnosticNode.endEncryptionDiagnostics(\n Constants.Encryption.DiagnosticsEncryptOperation,\n encryptedCount,\n );\n }\n if (this.continuationToken) {\n if (!this.continuationTokenRidMatchContainerRid()) {\n throw new ErrorResponse(\"The continuation is not for the current container definition.\");\n }\n } else {\n this.continuationToken = new ContinuationTokenForPartitionKey(\n this.rId,\n this.partitionKey,\n \"\",\n );\n }\n\n this.isInstantiated = true;\n }\n\n private continuationTokenRidMatchContainerRid(): boolean {\n if (this.continuationToken.rid !== this.rId) {\n return false;\n }\n return true;\n }\n\n private async setIteratorRid(diagnosticNode: DiagnosticNodeInternal): Promise<void> {\n const { resource } = await this.container.readInternal(diagnosticNode);\n this.rId = resource._rid;\n }\n\n /**\n * Change feed is an infinite feed. hasMoreResults is always true.\n */\n get hasMoreResults(): boolean {\n return true;\n }\n\n /**\n * Gets an async iterator which will yield change feed results.\n */\n public async *getAsyncIterator(): AsyncIterable<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n do {\n const result = await this.readNext();\n yield result;\n } while (this.hasMoreResults);\n }\n\n /**\n * Returns the result of change feed from Azure Cosmos DB.\n */\n public async readNext(): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n return withDiagnostics(async (diagnosticNode: DiagnosticNodeInternal) => {\n if (!this.isInstantiated) {\n await this.instantiateIterator(diagnosticNode);\n }\n const result = await this.fetchNext(diagnosticNode);\n if (result.statusCode === StatusCodes.Ok) {\n if (this.clientContext.enableEncryption) {\n await decryptChangeFeedResponse(\n result,\n diagnosticNode,\n this.changeFeedOptions.changeFeedMode,\n this.container.encryptionProcessor,\n );\n }\n }\n return result;\n }, this.clientContext);\n }\n\n /**\n * Read feed and retrieves the next set of results in Azure Cosmos DB.\n */\n private async fetchNext(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const response = await this.getFeedResponse(diagnosticNode);\n this.continuationToken.Continuation = response.headers[Constants.HttpHeaders.ETag];\n response.headers[Constants.HttpHeaders.ContinuationToken] = JSON.stringify(\n this.continuationToken,\n );\n return response;\n }\n\n private async getFeedResponse(\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<ChangeFeedIteratorResponse<Array<T & Resource>>> {\n const feedOptions: FeedOptions = buildFeedOptions(\n this.changeFeedOptions,\n this.continuationToken?.Continuation,\n this.startFromNow,\n this.startTime,\n );\n if (this.clientContext.enableEncryption) {\n feedOptions.containerRid = this.container._rid;\n }\n try {\n const isPartitionLevelFailOverEnabled = this.clientContext.isPartitionLevelFailOverEnabled();\n const partitionKeyRangeId = await computePartitionKeyRangeId(\n diagnosticNode,\n convertToInternalPartitionKey(this.partitionKey),\n this.clientContext.partitionKeyRangeCache,\n isPartitionLevelFailOverEnabled,\n this.container,\n );\n const response: Response<Array<T & Resource>> = await (this.clientContext.queryFeed<T>({\n path: this.resourceLink,\n resourceType: ResourceType.item,\n resourceId: this.resourceId,\n resultFn: (result) => (result ? result.Documents : []),\n diagnosticNode,\n query: undefined,\n options: feedOptions,\n partitionKey: this.partitionKey,\n partitionKeyRangeId,\n }) as Promise<any>);\n return new ChangeFeedIteratorResponse(\n response.result,\n response.result ? response.result.length : 0,\n response.code,\n response.headers,\n getEmptyCosmosDiagnostics(),\n );\n } catch (err) {\n // If any errors are encountered, throw the error.\n const errorResponse = new ErrorResponse(err.message);\n errorResponse.code = err.code;\n errorResponse.headers = err.headers;\n throw errorResponse;\n }\n }\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { ChangeFeedStartFrom } from "./ChangeFeedStartFrom.js";
2
2
  import type { ChangeFeedMode } from "./ChangeFeedMode.js";
3
+ import type { PriorityLevel } from "../../documents/PriorityLevel.js";
3
4
  /**
4
5
  * Specifies options for the change feed
5
6
  *
@@ -27,5 +28,19 @@ export interface ChangeFeedIteratorOptions {
27
28
  * <p>This option is only applied when enableEndPointDiscovery is set to true.</p>
28
29
  */
29
30
  excludedLocations?: string[];
31
+ /**
32
+ * Priority Level (Low/High) for each request.
33
+ * Low priority requests are always throttled before any high priority requests.
34
+ *
35
+ * <p>Default value is null. By default all requests are of High priority</p>
36
+ */
37
+ priorityLevel?: PriorityLevel;
38
+ /**
39
+ * Throughput Bucket for a request.
40
+ *
41
+ * <p>Default value is null. In this case, the request can use 100% of the partition throughput. </p>
42
+ * For more information, visit [Cosmos DB throughput Bucketing](https://aka.ms/cosmsodb-bucketing).
43
+ */
44
+ throughputBucket?: number;
30
45
  }
31
46
  //# sourceMappingURL=ChangeFeedIteratorOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeFeedIteratorOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B"}
1
+ {"version":3,"file":"ChangeFeedIteratorOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChangeFeedIteratorOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChangeFeedStartFrom } from \"./ChangeFeedStartFrom.js\";\nimport type { ChangeFeedMode } from \"./ChangeFeedMode.js\";\n/**\n * Specifies options for the change feed\n *\n * If none of those options are set, it will start reading changes from now for the entire container.\n */\nexport interface ChangeFeedIteratorOptions {\n /**\n * Max amount of items to return per page\n */\n maxItemCount?: number;\n /**\n * The session token to use. If not specified, will use the most recent captured session token to start with.\n */\n sessionToken?: string;\n /**\n * Signals where to start from in the change feed.\n */\n changeFeedStartFrom?: ChangeFeedStartFrom;\n /**\n * Signals the mode in which the change feed needs to start.\n */\n changeFeedMode?: ChangeFeedMode;\n\n /**\n * Excludes one or more Azure regions for the operation.\n * <p>This option is only applied when enableEndPointDiscovery is set to true.</p>\n */\n excludedLocations?: string[];\n}\n"]}
1
+ {"version":3,"file":"ChangeFeedIteratorOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/ChangeFeedIteratorOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChangeFeedStartFrom } from \"./ChangeFeedStartFrom.js\";\nimport type { ChangeFeedMode } from \"./ChangeFeedMode.js\";\nimport type { PriorityLevel } from \"../../documents/PriorityLevel.js\";\n/**\n * Specifies options for the change feed\n *\n * If none of those options are set, it will start reading changes from now for the entire container.\n */\nexport interface ChangeFeedIteratorOptions {\n /**\n * Max amount of items to return per page\n */\n maxItemCount?: number;\n /**\n * The session token to use. If not specified, will use the most recent captured session token to start with.\n */\n sessionToken?: string;\n /**\n * Signals where to start from in the change feed.\n */\n changeFeedStartFrom?: ChangeFeedStartFrom;\n /**\n * Signals the mode in which the change feed needs to start.\n */\n changeFeedMode?: ChangeFeedMode;\n\n /**\n * Excludes one or more Azure regions for the operation.\n * <p>This option is only applied when enableEndPointDiscovery is set to true.</p>\n */\n excludedLocations?: string[];\n\n /**\n * Priority Level (Low/High) for each request.\n * Low priority requests are always throttled before any high priority requests.\n *\n * <p>Default value is null. By default all requests are of High priority</p>\n */\n priorityLevel?: PriorityLevel;\n /**\n * Throughput Bucket for a request.\n *\n * <p>Default value is null. In this case, the request can use 100% of the partition throughput. </p>\n * For more information, visit [Cosmos DB throughput Bucketing](https://aka.ms/cosmsodb-bucketing).\n */\n throughputBucket?: number;\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { ChangeFeedMode } from "./ChangeFeedMode.js";
2
+ import type { PriorityLevel } from "../../documents/PriorityLevel.js";
2
3
  /**
3
4
  * @hidden
4
5
  * Internal Change Feed Iterator Options used only by ChangeFeedForEpkRange and ChangeFeedForPartitionKey.
@@ -11,5 +12,7 @@ export interface InternalChangeFeedIteratorOptions {
11
12
  changeFeedMode?: ChangeFeedMode;
12
13
  startFromNow?: boolean;
13
14
  excludedLocations?: string[];
15
+ priorityLevel?: PriorityLevel;
16
+ throughputBucket?: number;
14
17
  }
15
18
  //# sourceMappingURL=InternalChangeFeedOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InternalChangeFeedOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B"}
1
+ {"version":3,"file":"InternalChangeFeedOptions.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,EAAE,IAAI,CAAC;IAEjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"InternalChangeFeedOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChangeFeedMode } from \"./ChangeFeedMode.js\";\n\n/**\n * @hidden\n * Internal Change Feed Iterator Options used only by ChangeFeedForEpkRange and ChangeFeedForPartitionKey.\n */\nexport interface InternalChangeFeedIteratorOptions {\n maxItemCount?: number;\n\n sessionToken?: string;\n\n continuationToken?: string;\n\n startTime?: Date;\n\n changeFeedMode?: ChangeFeedMode;\n\n startFromNow?: boolean;\n\n excludedLocations?: string[];\n}\n"]}
1
+ {"version":3,"file":"InternalChangeFeedOptions.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/InternalChangeFeedOptions.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { ChangeFeedMode } from \"./ChangeFeedMode.js\";\nimport type { PriorityLevel } from \"../../documents/PriorityLevel.js\";\n\n/**\n * @hidden\n * Internal Change Feed Iterator Options used only by ChangeFeedForEpkRange and ChangeFeedForPartitionKey.\n */\nexport interface InternalChangeFeedIteratorOptions {\n maxItemCount?: number;\n\n sessionToken?: string;\n\n continuationToken?: string;\n\n startTime?: Date;\n\n changeFeedMode?: ChangeFeedMode;\n\n startFromNow?: boolean;\n\n excludedLocations?: string[];\n\n priorityLevel?: PriorityLevel;\n throughputBucket?: number;\n}\n"]}
@@ -8,6 +8,7 @@ import { DiagnosticNodeInternal } from "../../diagnostics/DiagnosticNodeInternal
8
8
  import { EncryptionProcessor } from "../../encryption/index.js";
9
9
  import { ChangeFeedMode } from "./ChangeFeedMode.js";
10
10
  import { ChangeFeedIteratorResponse } from "./ChangeFeedIteratorResponse.js";
11
+ import type { FeedOptions } from "../../request/FeedOptions.js";
11
12
  /**
12
13
  * @hidden
13
14
  * Validates the change feed options passed by the user
@@ -49,4 +50,9 @@ export declare function getEffectivePartitionKeyForMultiHashPartitioning(partiti
49
50
  * @hidden
50
51
  */
51
52
  export declare function decryptChangeFeedResponse(result: ChangeFeedIteratorResponse<any>, diagnosticNode: DiagnosticNodeInternal, changeFeedMode: ChangeFeedMode, encryptionProcessor: EncryptionProcessor): Promise<void>;
53
+ /**
54
+ * @hidden
55
+ * Logic for building FeedOptions from change feed iterator options
56
+ */
57
+ export declare function buildFeedOptions(changeFeedOptions: InternalChangeFeedIteratorOptions, continuationToken?: string, startFromNow?: boolean, startTime?: string): FeedOptions;
52
58
  //# sourceMappingURL=changeFeedUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"changeFeedUtils.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/changeFeedUtils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAExF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAU1F;AAYD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,UAAU,EACpB,gBAAgB,EAAE,iBAAiB,GAClC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwB3B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWhD;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,yBAAyB,EAClC,iBAAiB,CAAC,EAAE,MAAM,EAC1B,SAAS,CAAC,EAAE,IAAI,EAChB,YAAY,CAAC,EAAE,OAAO,GACrB,iCAAiC,CAcnC;AACD;;GAEG;AACH,wBAAgB,cAAc,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAMzF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,oBAAoB,EAAE,oBAAoB,GACzC,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED;;GAEG;AACH,wBAAgB,gDAAgD,CAC9D,oBAAoB,EAAE,oBAAoB,GACzC,MAAM,CAGR;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,0BAA0B,CAAC,GAAG,CAAC,EACvC,cAAc,EAAE,sBAAsB,EACtC,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EAAE,mBAAmB,GACvC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
1
+ {"version":3,"file":"changeFeedUtils.d.ts","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/changeFeedUtils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEhF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AAExF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAIpE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAU1F;AAYD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,UAAU,EACpB,gBAAgB,EAAE,iBAAiB,GAClC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwB3B;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAWhD;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,yBAAyB,EAClC,iBAAiB,CAAC,EAAE,MAAM,EAC1B,SAAS,CAAC,EAAE,IAAI,EAChB,YAAY,CAAC,EAAE,OAAO,GACrB,iCAAiC,CAgBnC;AACD;;GAEG;AACH,wBAAgB,cAAc,CAAC,mBAAmB,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAMzF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CACpD,oBAAoB,EAAE,oBAAoB,GACzC,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED;;GAEG;AACH,wBAAgB,gDAAgD,CAC9D,oBAAoB,EAAE,oBAAoB,GACzC,MAAM,CAGR;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,0BAA0B,CAAC,GAAG,CAAC,EACvC,cAAc,EAAE,sBAAsB,EACtC,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EAAE,mBAAmB,GACvC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,iBAAiB,EAAE,iCAAiC,EACpD,iBAAiB,CAAC,EAAE,MAAM,EAC1B,YAAY,CAAC,EAAE,OAAO,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CAkDb"}
@@ -81,6 +81,8 @@ export function buildInternalChangeFeedOptions(options, continuationToken, start
81
81
  internalCfOptions.continuationToken = continuationToken;
82
82
  internalCfOptions.changeFeedMode = options?.changeFeedMode;
83
83
  internalCfOptions.excludedLocations = options?.excludedLocations;
84
+ internalCfOptions.priorityLevel = options?.priorityLevel;
85
+ internalCfOptions.throughputBucket = options?.throughputBucket;
84
86
  // Default option of changefeed is to start from now.
85
87
  if (startFromNow) {
86
88
  internalCfOptions.startFromNow = true;
@@ -149,4 +151,49 @@ export async function decryptChangeFeedResponse(result, diagnosticNode, changeFe
149
151
  }
150
152
  diagnosticNode.endEncryptionDiagnostics(Constants.Encryption.DiagnosticsDecryptOperation, count);
151
153
  }
154
+ /**
155
+ * @hidden
156
+ * Logic for building FeedOptions from change feed iterator options
157
+ */
158
+ export function buildFeedOptions(changeFeedOptions, continuationToken, startFromNow, startTime) {
159
+ const feedOptions = {
160
+ initialHeaders: {},
161
+ useLatestVersionFeed: true,
162
+ useAllVersionsAndDeletesFeed: false,
163
+ };
164
+ if (typeof changeFeedOptions.maxItemCount === "number") {
165
+ feedOptions.maxItemCount = changeFeedOptions.maxItemCount;
166
+ }
167
+ if (changeFeedOptions.sessionToken) {
168
+ feedOptions.sessionToken = changeFeedOptions.sessionToken;
169
+ }
170
+ if (changeFeedOptions.excludedLocations) {
171
+ feedOptions.excludedLocations = changeFeedOptions.excludedLocations;
172
+ }
173
+ if (continuationToken) {
174
+ feedOptions.accessCondition = {
175
+ type: Constants.HttpHeaders.IfNoneMatch,
176
+ condition: continuationToken,
177
+ };
178
+ }
179
+ else if (startFromNow) {
180
+ feedOptions.initialHeaders[Constants.HttpHeaders.IfNoneMatch] =
181
+ Constants.ChangeFeedIfNoneMatchStartFromNowHeader;
182
+ }
183
+ if (startTime) {
184
+ feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = startTime;
185
+ }
186
+ if (changeFeedOptions.changeFeedMode &&
187
+ changeFeedOptions.changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes) {
188
+ feedOptions.useAllVersionsAndDeletesFeed = true;
189
+ feedOptions.useLatestVersionFeed = false;
190
+ }
191
+ if (changeFeedOptions.throughputBucket) {
192
+ feedOptions.throughputBucket = changeFeedOptions.throughputBucket;
193
+ }
194
+ if (changeFeedOptions.priorityLevel) {
195
+ feedOptions.priorityLevel = changeFeedOptions.priorityLevel;
196
+ }
197
+ return feedOptions;
198
+ }
152
199
  //# sourceMappingURL=changeFeedUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"changeFeedUtils.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/changeFeedUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { ChangeFeedIteratorOptions } from \"./ChangeFeedIteratorOptions.js\";\nimport { ErrorResponse } from \"../../request/index.js\";\nimport type { PartitionKeyRange } from \"../Container/index.js\";\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport { isPrimitivePartitionKeyValue } from \"../../utils/typeChecks.js\";\nimport type { ChangeFeedStartFrom } from \"./ChangeFeedStartFrom.js\";\nimport { ChangeFeedStartFromBeginning } from \"./ChangeFeedStartFromBeginning.js\";\nimport { Constants } from \"../../common/index.js\";\nimport { ChangeFeedStartFromTime } from \"./ChangeFeedStartFromTime.js\";\nimport { QueryRange } from \"../../routing/index.js\";\nimport { FeedRangeInternal } from \"./FeedRange.js\";\nimport { hashV2PartitionKey } from \"../../utils/hashing/v2.js\";\nimport { PartitionKeyInternal } from \"../../documents/PartitionKeyInternal.js\";\nimport { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { EncryptionProcessor } from \"../../encryption/index.js\";\nimport { ChangeFeedMode } from \"./ChangeFeedMode.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\n\n/**\n * @hidden\n * Validates the change feed options passed by the user\n */\nexport function validateChangeFeedIteratorOptions(options: ChangeFeedIteratorOptions): void {\n if (!isChangeFeedIteratorOptions(options)) {\n throw new ErrorResponse(\"Invalid Changefeed Iterator Options.\");\n }\n if (options?.maxItemCount && typeof options?.maxItemCount !== \"number\") {\n throw new ErrorResponse(\"maxItemCount must be number\");\n }\n if (options?.maxItemCount !== undefined && options?.maxItemCount < 1) {\n throw new ErrorResponse(\"maxItemCount must be a positive number\");\n }\n}\n\nfunction isChangeFeedIteratorOptions(options: unknown): options is ChangeFeedIteratorOptions {\n if (typeof options !== \"object\") {\n return false;\n }\n if (Object.keys(options).length === 0 && JSON.stringify(options) === \"{}\") {\n return true;\n }\n return options && !(isPrimitivePartitionKeyValue(options) || Array.isArray(options));\n}\n\n/**\n * @hidden\n * Checks if pkRange entirely covers the given overLapping range or there is only partial overlap.\n *\n * If no complete overlap, exact range which overlaps is retured which is used to set minEpk and maxEpk headers while quering change feed.\n */\nexport async function extractOverlappingRanges(\n epkRange: QueryRange,\n overLappingRange: PartitionKeyRange,\n): Promise<[string, string]> {\n if (\n overLappingRange.minInclusive >= epkRange.min &&\n overLappingRange.maxExclusive <= epkRange.max\n ) {\n return [undefined, undefined];\n } else if (\n overLappingRange.minInclusive <= epkRange.min &&\n overLappingRange.maxExclusive >= epkRange.max\n ) {\n return [epkRange.min, epkRange.max];\n }\n // Right Side of overlapping range is covered\n else if (\n overLappingRange.minInclusive <= epkRange.min &&\n overLappingRange.maxExclusive <= epkRange.max &&\n overLappingRange.maxExclusive >= epkRange.min\n ) {\n return [epkRange.min, overLappingRange.maxExclusive];\n }\n // Left Side of overlapping range is covered\n else {\n return [overLappingRange.minInclusive, epkRange.max];\n }\n}\n\n/**\n * @hidden\n * Checks if the object is a valid EpkRange\n */\nexport function isEpkRange(obj: unknown): boolean {\n return (\n obj instanceof FeedRangeInternal &&\n typeof obj.minInclusive === \"string\" &&\n typeof obj.maxExclusive === \"string\" &&\n obj.minInclusive >=\n Constants.EffectivePartitionKeyConstants.MinimumInclusiveEffectivePartitionKey &&\n obj.maxExclusive <=\n Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey &&\n obj.maxExclusive > obj.minInclusive\n );\n}\n\n/**\n * @hidden\n */\nexport function buildInternalChangeFeedOptions(\n options: ChangeFeedIteratorOptions,\n continuationToken?: string,\n startTime?: Date,\n startFromNow?: boolean,\n): InternalChangeFeedIteratorOptions {\n const internalCfOptions = {} as InternalChangeFeedIteratorOptions;\n internalCfOptions.maxItemCount = options?.maxItemCount;\n internalCfOptions.sessionToken = options?.sessionToken;\n internalCfOptions.continuationToken = continuationToken;\n internalCfOptions.changeFeedMode = options?.changeFeedMode;\n internalCfOptions.excludedLocations = options?.excludedLocations;\n // Default option of changefeed is to start from now.\n if (startFromNow) {\n internalCfOptions.startFromNow = true;\n } else {\n internalCfOptions.startTime = startTime;\n }\n return internalCfOptions;\n}\n/**\n * @hidden\n */\nexport function fetchStartTime(changeFeedStartFrom: ChangeFeedStartFrom): Date | undefined {\n if (changeFeedStartFrom instanceof ChangeFeedStartFromBeginning) {\n return undefined;\n } else if (changeFeedStartFrom instanceof ChangeFeedStartFromTime) {\n return changeFeedStartFrom.getStartTime();\n }\n}\n\n/**\n * @hidden\n */\nexport function isNullOrEmpty(text: string | null | undefined): boolean {\n return text === null || text === undefined || text.trim() === \"\";\n}\n\n/**\n * @hidden\n */\nexport async function getEPKRangeForPrefixPartitionKey(\n internalPartitionKey: PartitionKeyInternal,\n): Promise<QueryRange> {\n const minEPK = getEffectivePartitionKeyForMultiHashPartitioning(internalPartitionKey);\n const maxEPK =\n minEPK + Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey;\n return new QueryRange(minEPK, maxEPK, true, false);\n}\n\n/**\n * @hidden\n */\nexport function getEffectivePartitionKeyForMultiHashPartitioning(\n partitionKeyInternal: PartitionKeyInternal,\n): string {\n const hashArray = partitionKeyInternal.map((item) => hashV2PartitionKey([item]));\n return hashArray.join(\"\");\n}\n\n/**\n * @hidden\n */\nexport async function decryptChangeFeedResponse(\n result: ChangeFeedIteratorResponse<any>,\n diagnosticNode: DiagnosticNodeInternal,\n changeFeedMode: ChangeFeedMode,\n encryptionProcessor: EncryptionProcessor,\n): Promise<void> {\n let count = 0;\n diagnosticNode.beginEncryptionDiagnostics(Constants.Encryption.DiagnosticsDecryptOperation);\n for (let item of result.result) {\n if (changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes) {\n if (\"current\" in item && item.current !== null) {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item.current);\n item.current = body;\n count += propertiesDecryptedCount;\n }\n if (\"previous\" in item && item.previous !== null) {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item.previous);\n item.previous = body;\n count += propertiesDecryptedCount;\n }\n } else {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item);\n item = body;\n count += propertiesDecryptedCount;\n }\n }\n diagnosticNode.endEncryptionDiagnostics(Constants.Encryption.DiagnosticsDecryptOperation, count);\n}\n"]}
1
+ {"version":3,"file":"changeFeedUtils.js","sourceRoot":"","sources":["../../../../src/client/ChangeFeed/changeFeedUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { ChangeFeedIteratorOptions } from \"./ChangeFeedIteratorOptions.js\";\nimport { ErrorResponse } from \"../../request/index.js\";\nimport type { PartitionKeyRange } from \"../Container/index.js\";\nimport type { InternalChangeFeedIteratorOptions } from \"./InternalChangeFeedOptions.js\";\nimport { isPrimitivePartitionKeyValue } from \"../../utils/typeChecks.js\";\nimport type { ChangeFeedStartFrom } from \"./ChangeFeedStartFrom.js\";\nimport { ChangeFeedStartFromBeginning } from \"./ChangeFeedStartFromBeginning.js\";\nimport { Constants } from \"../../common/index.js\";\nimport { ChangeFeedStartFromTime } from \"./ChangeFeedStartFromTime.js\";\nimport { QueryRange } from \"../../routing/index.js\";\nimport { FeedRangeInternal } from \"./FeedRange.js\";\nimport { hashV2PartitionKey } from \"../../utils/hashing/v2.js\";\nimport { PartitionKeyInternal } from \"../../documents/PartitionKeyInternal.js\";\nimport { DiagnosticNodeInternal } from \"../../diagnostics/DiagnosticNodeInternal.js\";\nimport { EncryptionProcessor } from \"../../encryption/index.js\";\nimport { ChangeFeedMode } from \"./ChangeFeedMode.js\";\nimport { ChangeFeedIteratorResponse } from \"./ChangeFeedIteratorResponse.js\";\nimport type { FeedOptions } from \"../../request/FeedOptions.js\";\n\n/**\n * @hidden\n * Validates the change feed options passed by the user\n */\nexport function validateChangeFeedIteratorOptions(options: ChangeFeedIteratorOptions): void {\n if (!isChangeFeedIteratorOptions(options)) {\n throw new ErrorResponse(\"Invalid Changefeed Iterator Options.\");\n }\n if (options?.maxItemCount && typeof options?.maxItemCount !== \"number\") {\n throw new ErrorResponse(\"maxItemCount must be number\");\n }\n if (options?.maxItemCount !== undefined && options?.maxItemCount < 1) {\n throw new ErrorResponse(\"maxItemCount must be a positive number\");\n }\n}\n\nfunction isChangeFeedIteratorOptions(options: unknown): options is ChangeFeedIteratorOptions {\n if (typeof options !== \"object\") {\n return false;\n }\n if (Object.keys(options).length === 0 && JSON.stringify(options) === \"{}\") {\n return true;\n }\n return options && !(isPrimitivePartitionKeyValue(options) || Array.isArray(options));\n}\n\n/**\n * @hidden\n * Checks if pkRange entirely covers the given overLapping range or there is only partial overlap.\n *\n * If no complete overlap, exact range which overlaps is retured which is used to set minEpk and maxEpk headers while quering change feed.\n */\nexport async function extractOverlappingRanges(\n epkRange: QueryRange,\n overLappingRange: PartitionKeyRange,\n): Promise<[string, string]> {\n if (\n overLappingRange.minInclusive >= epkRange.min &&\n overLappingRange.maxExclusive <= epkRange.max\n ) {\n return [undefined, undefined];\n } else if (\n overLappingRange.minInclusive <= epkRange.min &&\n overLappingRange.maxExclusive >= epkRange.max\n ) {\n return [epkRange.min, epkRange.max];\n }\n // Right Side of overlapping range is covered\n else if (\n overLappingRange.minInclusive <= epkRange.min &&\n overLappingRange.maxExclusive <= epkRange.max &&\n overLappingRange.maxExclusive >= epkRange.min\n ) {\n return [epkRange.min, overLappingRange.maxExclusive];\n }\n // Left Side of overlapping range is covered\n else {\n return [overLappingRange.minInclusive, epkRange.max];\n }\n}\n\n/**\n * @hidden\n * Checks if the object is a valid EpkRange\n */\nexport function isEpkRange(obj: unknown): boolean {\n return (\n obj instanceof FeedRangeInternal &&\n typeof obj.minInclusive === \"string\" &&\n typeof obj.maxExclusive === \"string\" &&\n obj.minInclusive >=\n Constants.EffectivePartitionKeyConstants.MinimumInclusiveEffectivePartitionKey &&\n obj.maxExclusive <=\n Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey &&\n obj.maxExclusive > obj.minInclusive\n );\n}\n\n/**\n * @hidden\n */\nexport function buildInternalChangeFeedOptions(\n options: ChangeFeedIteratorOptions,\n continuationToken?: string,\n startTime?: Date,\n startFromNow?: boolean,\n): InternalChangeFeedIteratorOptions {\n const internalCfOptions = {} as InternalChangeFeedIteratorOptions;\n internalCfOptions.maxItemCount = options?.maxItemCount;\n internalCfOptions.sessionToken = options?.sessionToken;\n internalCfOptions.continuationToken = continuationToken;\n internalCfOptions.changeFeedMode = options?.changeFeedMode;\n internalCfOptions.excludedLocations = options?.excludedLocations;\n internalCfOptions.priorityLevel = options?.priorityLevel;\n internalCfOptions.throughputBucket = options?.throughputBucket;\n // Default option of changefeed is to start from now.\n if (startFromNow) {\n internalCfOptions.startFromNow = true;\n } else {\n internalCfOptions.startTime = startTime;\n }\n return internalCfOptions;\n}\n/**\n * @hidden\n */\nexport function fetchStartTime(changeFeedStartFrom: ChangeFeedStartFrom): Date | undefined {\n if (changeFeedStartFrom instanceof ChangeFeedStartFromBeginning) {\n return undefined;\n } else if (changeFeedStartFrom instanceof ChangeFeedStartFromTime) {\n return changeFeedStartFrom.getStartTime();\n }\n}\n\n/**\n * @hidden\n */\nexport function isNullOrEmpty(text: string | null | undefined): boolean {\n return text === null || text === undefined || text.trim() === \"\";\n}\n\n/**\n * @hidden\n */\nexport async function getEPKRangeForPrefixPartitionKey(\n internalPartitionKey: PartitionKeyInternal,\n): Promise<QueryRange> {\n const minEPK = getEffectivePartitionKeyForMultiHashPartitioning(internalPartitionKey);\n const maxEPK =\n minEPK + Constants.EffectivePartitionKeyConstants.MaximumExclusiveEffectivePartitionKey;\n return new QueryRange(minEPK, maxEPK, true, false);\n}\n\n/**\n * @hidden\n */\nexport function getEffectivePartitionKeyForMultiHashPartitioning(\n partitionKeyInternal: PartitionKeyInternal,\n): string {\n const hashArray = partitionKeyInternal.map((item) => hashV2PartitionKey([item]));\n return hashArray.join(\"\");\n}\n\n/**\n * @hidden\n */\nexport async function decryptChangeFeedResponse(\n result: ChangeFeedIteratorResponse<any>,\n diagnosticNode: DiagnosticNodeInternal,\n changeFeedMode: ChangeFeedMode,\n encryptionProcessor: EncryptionProcessor,\n): Promise<void> {\n let count = 0;\n diagnosticNode.beginEncryptionDiagnostics(Constants.Encryption.DiagnosticsDecryptOperation);\n for (let item of result.result) {\n if (changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes) {\n if (\"current\" in item && item.current !== null) {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item.current);\n item.current = body;\n count += propertiesDecryptedCount;\n }\n if (\"previous\" in item && item.previous !== null) {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item.previous);\n item.previous = body;\n count += propertiesDecryptedCount;\n }\n } else {\n const { body, propertiesDecryptedCount } = await encryptionProcessor.decrypt(item);\n item = body;\n count += propertiesDecryptedCount;\n }\n }\n diagnosticNode.endEncryptionDiagnostics(Constants.Encryption.DiagnosticsDecryptOperation, count);\n}\n\n/**\n * @hidden\n * Logic for building FeedOptions from change feed iterator options\n */\nexport function buildFeedOptions(\n changeFeedOptions: InternalChangeFeedIteratorOptions,\n continuationToken?: string,\n startFromNow?: boolean,\n startTime?: string,\n): FeedOptions {\n const feedOptions: FeedOptions = {\n initialHeaders: {},\n useLatestVersionFeed: true,\n useAllVersionsAndDeletesFeed: false,\n };\n\n if (typeof changeFeedOptions.maxItemCount === \"number\") {\n feedOptions.maxItemCount = changeFeedOptions.maxItemCount;\n }\n\n if (changeFeedOptions.sessionToken) {\n feedOptions.sessionToken = changeFeedOptions.sessionToken;\n }\n\n if (changeFeedOptions.excludedLocations) {\n feedOptions.excludedLocations = changeFeedOptions.excludedLocations;\n }\n\n if (continuationToken) {\n feedOptions.accessCondition = {\n type: Constants.HttpHeaders.IfNoneMatch,\n condition: continuationToken,\n };\n } else if (startFromNow) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfNoneMatch] =\n Constants.ChangeFeedIfNoneMatchStartFromNowHeader;\n }\n\n if (startTime) {\n feedOptions.initialHeaders[Constants.HttpHeaders.IfModifiedSince] = startTime;\n }\n\n if (\n changeFeedOptions.changeFeedMode &&\n changeFeedOptions.changeFeedMode === ChangeFeedMode.AllVersionsAndDeletes\n ) {\n feedOptions.useAllVersionsAndDeletesFeed = true;\n feedOptions.useLatestVersionFeed = false;\n }\n\n if (changeFeedOptions.throughputBucket) {\n feedOptions.throughputBucket = changeFeedOptions.throughputBucket;\n }\n\n if (changeFeedOptions.priorityLevel) {\n feedOptions.priorityLevel = changeFeedOptions.priorityLevel;\n }\n\n return feedOptions;\n}\n"]}
@@ -188,7 +188,7 @@ export const Constants = {
188
188
  AzureNamespace: "Azure.Cosmos",
189
189
  AzurePackageName: "@azure/cosmos",
190
190
  SDKName: "azure-cosmos-js",
191
- SDKVersion: "4.7.0",
191
+ SDKVersion: "4.8.0",
192
192
  // Diagnostics
193
193
  CosmosDbDiagnosticLevelEnvVarName: "AZURE_COSMOSDB_DIAGNOSTICS_LEVEL",
194
194
  // Bulk Operations