@azure/cosmos 4.6.0 → 4.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/ClientContext.js +2 -2
- package/dist/browser/ClientContext.js.map +1 -1
- package/dist/browser/CosmosClient.d.ts.map +1 -1
- package/dist/browser/CosmosClient.js +3 -0
- package/dist/browser/CosmosClient.js.map +1 -1
- package/dist/browser/common/constants.js +1 -1
- package/dist/browser/common/constants.js.map +1 -1
- package/dist/browser/documents/ConnectionPolicy.d.ts +6 -3
- package/dist/browser/documents/ConnectionPolicy.d.ts.map +1 -1
- package/dist/browser/documents/ConnectionPolicy.js +1 -1
- package/dist/browser/documents/ConnectionPolicy.js.map +1 -1
- package/dist/browser/globalEndpointManager.d.ts +0 -6
- package/dist/browser/globalEndpointManager.d.ts.map +1 -1
- package/dist/browser/globalEndpointManager.js +51 -14
- package/dist/browser/globalEndpointManager.js.map +1 -1
- package/dist/browser/globalPartitionEndpointManager.d.ts +1 -1
- package/dist/browser/globalPartitionEndpointManager.d.ts.map +1 -1
- package/dist/browser/globalPartitionEndpointManager.js +36 -11
- package/dist/browser/globalPartitionEndpointManager.js.map +1 -1
- package/dist/browser/request/RequestHandler.js +2 -2
- package/dist/browser/request/RequestHandler.js.map +1 -1
- package/dist/browser/retry/timeoutFailoverRetryPolicy.js +1 -1
- package/dist/browser/retry/timeoutFailoverRetryPolicy.js.map +1 -1
- package/dist/commonjs/ClientContext.js +2 -2
- package/dist/commonjs/ClientContext.js.map +1 -1
- package/dist/commonjs/CosmosClient.d.ts.map +1 -1
- package/dist/commonjs/CosmosClient.js +3 -0
- package/dist/commonjs/CosmosClient.js.map +1 -1
- package/dist/commonjs/common/constants.js +1 -1
- package/dist/commonjs/common/constants.js.map +1 -1
- package/dist/commonjs/documents/ConnectionPolicy.d.ts +6 -3
- package/dist/commonjs/documents/ConnectionPolicy.d.ts.map +1 -1
- package/dist/commonjs/documents/ConnectionPolicy.js +1 -1
- package/dist/commonjs/documents/ConnectionPolicy.js.map +1 -1
- package/dist/commonjs/globalEndpointManager.d.ts +0 -6
- package/dist/commonjs/globalEndpointManager.d.ts.map +1 -1
- package/dist/commonjs/globalEndpointManager.js +51 -14
- package/dist/commonjs/globalEndpointManager.js.map +1 -1
- package/dist/commonjs/globalPartitionEndpointManager.d.ts +1 -1
- package/dist/commonjs/globalPartitionEndpointManager.d.ts.map +1 -1
- package/dist/commonjs/globalPartitionEndpointManager.js +36 -11
- package/dist/commonjs/globalPartitionEndpointManager.js.map +1 -1
- package/dist/commonjs/request/RequestHandler.js +2 -2
- package/dist/commonjs/request/RequestHandler.js.map +1 -1
- package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js +1 -1
- package/dist/commonjs/retry/timeoutFailoverRetryPolicy.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +1 -1
- package/dist/esm/ClientContext.js +2 -2
- package/dist/esm/ClientContext.js.map +1 -1
- package/dist/esm/CosmosClient.d.ts.map +1 -1
- package/dist/esm/CosmosClient.js +3 -0
- package/dist/esm/CosmosClient.js.map +1 -1
- package/dist/esm/common/constants.js +1 -1
- package/dist/esm/common/constants.js.map +1 -1
- package/dist/esm/documents/ConnectionPolicy.d.ts +6 -3
- package/dist/esm/documents/ConnectionPolicy.d.ts.map +1 -1
- package/dist/esm/documents/ConnectionPolicy.js +1 -1
- package/dist/esm/documents/ConnectionPolicy.js.map +1 -1
- package/dist/esm/globalEndpointManager.d.ts +0 -6
- package/dist/esm/globalEndpointManager.d.ts.map +1 -1
- package/dist/esm/globalEndpointManager.js +51 -14
- package/dist/esm/globalEndpointManager.js.map +1 -1
- package/dist/esm/globalPartitionEndpointManager.d.ts +1 -1
- package/dist/esm/globalPartitionEndpointManager.d.ts.map +1 -1
- package/dist/esm/globalPartitionEndpointManager.js +36 -11
- package/dist/esm/globalPartitionEndpointManager.js.map +1 -1
- package/dist/esm/request/RequestHandler.js +2 -2
- package/dist/esm/request/RequestHandler.js.map +1 -1
- package/dist/esm/retry/timeoutFailoverRetryPolicy.js +1 -1
- package/dist/esm/retry/timeoutFailoverRetryPolicy.js.map +1 -1
- package/dist/react-native/ClientContext.js +2 -2
- package/dist/react-native/ClientContext.js.map +1 -1
- package/dist/react-native/CosmosClient.d.ts.map +1 -1
- package/dist/react-native/CosmosClient.js +3 -0
- package/dist/react-native/CosmosClient.js.map +1 -1
- package/dist/react-native/common/constants.js +1 -1
- package/dist/react-native/common/constants.js.map +1 -1
- package/dist/react-native/documents/ConnectionPolicy.d.ts +6 -3
- package/dist/react-native/documents/ConnectionPolicy.d.ts.map +1 -1
- package/dist/react-native/documents/ConnectionPolicy.js +1 -1
- package/dist/react-native/documents/ConnectionPolicy.js.map +1 -1
- package/dist/react-native/globalEndpointManager.d.ts +0 -6
- package/dist/react-native/globalEndpointManager.d.ts.map +1 -1
- package/dist/react-native/globalEndpointManager.js +51 -14
- package/dist/react-native/globalEndpointManager.js.map +1 -1
- package/dist/react-native/globalPartitionEndpointManager.d.ts +1 -1
- package/dist/react-native/globalPartitionEndpointManager.d.ts.map +1 -1
- package/dist/react-native/globalPartitionEndpointManager.js +36 -11
- package/dist/react-native/globalPartitionEndpointManager.js.map +1 -1
- package/dist/react-native/request/RequestHandler.js +2 -2
- package/dist/react-native/request/RequestHandler.js.map +1 -1
- package/dist/react-native/retry/timeoutFailoverRetryPolicy.js +1 -1
- package/dist/react-native/retry/timeoutFailoverRetryPolicy.js.map +1 -1
- package/package.json +14 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalPartitionEndpointManager.js","sourceRoot":"","sources":["../../src/globalPartitionEndpointManager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { OperationType, ResourceType, isReadRequest } from \"./common/index.js\";\nimport {\n Constants,\n DiagnosticNodeInternal,\n type CosmosClientOptions,\n type GlobalEndpointManager,\n type RequestContext,\n} from \"./index.js\";\nimport { PartitionKeyRangeFailoverInfo } from \"./PartitionKeyRangeFailoverInfo.js\";\nimport { normalizeEndpoint } from \"./utils/checkURL.js\";\nimport { startBackgroundTask } from \"./utils/time.js\";\nimport { assertNotUndefined } from \"./utils/typeChecks.js\";\n\n/**\n * @hidden\n * This class is used to failover single partitions to different regions.\n */\nexport class GlobalPartitionEndpointManager {\n private readonly partitionKeyRangeToLocationForWrite: Map<string, PartitionKeyRangeFailoverInfo>;\n private readonly partitionKeyRangeToLocationForReadAndWrite: Map<\n string,\n PartitionKeyRangeFailoverInfo\n >;\n private preferredLocations: string[];\n public preferredLocationsCount: number;\n private circuitBreakerFailbackBackgroundRefresher: NodeJS.Timeout;\n\n /**\n * @internal\n */\n constructor(\n options: CosmosClientOptions,\n private globalEndpointManager: GlobalEndpointManager,\n ) {\n this.partitionKeyRangeToLocationForWrite = new Map<string, PartitionKeyRangeFailoverInfo>();\n this.partitionKeyRangeToLocationForReadAndWrite = new Map<\n string,\n PartitionKeyRangeFailoverInfo\n >();\n this.preferredLocations = options.connectionPolicy.preferredLocations;\n this.preferredLocationsCount = this.preferredLocations ? this.preferredLocations.length : 0;\n if (\n this.globalEndpointManager.enablePartitionLevelCircuitBreaker ||\n this.globalEndpointManager.enablePartitionLevelFailover\n ) {\n this.initiateCircuitBreakerFailbackLoop();\n }\n }\n\n /**\n * Checks eligibility of the request for partition failover and\n * tries to mark the endpoint unavailable for the partition key range. Future\n * requests will be routed to the next location if available.\n */\n public async tryPartitionLevelFailover(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (!(await this.isRequestEligibleForPartitionFailover(requestContext, true))) {\n return false;\n }\n\n const isRequestEligibleForPerPartitionAutomaticFailover =\n this.isRequestEligibleForPerPartitionAutomaticFailover(requestContext);\n const isRequestEligibleForPartitionLevelCircuitBreaker =\n this.isRequestEligibleForPartitionLevelCircuitBreaker(requestContext);\n\n if (\n isRequestEligibleForPerPartitionAutomaticFailover ||\n (isRequestEligibleForPartitionLevelCircuitBreaker &&\n (await this.incrementFailureCounterAndCheckFailover(\n requestContext,\n isRequestEligibleForPerPartitionAutomaticFailover,\n isRequestEligibleForPartitionLevelCircuitBreaker,\n )))\n ) {\n return this.tryMarkEndpointUnavailableForPartitionKeyRange(\n requestContext,\n diagnosticNode,\n isRequestEligibleForPerPartitionAutomaticFailover,\n isRequestEligibleForPartitionLevelCircuitBreaker,\n );\n }\n return false;\n }\n\n /**\n * Updates the DocumentServiceRequest routing location to point\n * new a location based if a partition level failover occurred.\n */\n public async tryAddPartitionLevelLocationOverride(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<RequestContext> {\n if (!(await this.isRequestEligibleForPartitionFailover(requestContext, false))) {\n return requestContext;\n }\n\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n\n if (this.isRequestEligibleForPerPartitionAutomaticFailover(requestContext)) {\n if (this.partitionKeyRangeToLocationForWrite.has(partitionKeyRangeId)) {\n const partitionFailOver = this.partitionKeyRangeToLocationForWrite.get(partitionKeyRangeId);\n requestContext.endpoint = partitionFailOver.getCurrentEndPoint();\n diagnosticNode.recordEndpointResolution(requestContext.endpoint);\n return requestContext;\n }\n } else if (this.isRequestEligibleForPartitionLevelCircuitBreaker(requestContext)) {\n if (this.partitionKeyRangeToLocationForReadAndWrite.has(partitionKeyRangeId)) {\n const partitionFailOver =\n this.partitionKeyRangeToLocationForReadAndWrite.get(partitionKeyRangeId);\n\n const canCircuitBreakerTriggerPartitionFailOver =\n await partitionFailOver.canCircuitBreakerTriggerPartitionFailOver(\n isReadRequest(requestContext.operationType),\n );\n if (canCircuitBreakerTriggerPartitionFailOver) {\n requestContext.endpoint = partitionFailOver.getCurrentEndPoint();\n diagnosticNode.recordEndpointResolution(requestContext.endpoint);\n return requestContext;\n }\n }\n }\n return requestContext;\n }\n\n /**\n * This method clears the background refresher for circuit breaker failback\n * and stops the periodic checks for unhealthy endpoints.\n */\n public dispose(): void {\n if (this.circuitBreakerFailbackBackgroundRefresher) {\n clearTimeout(this.circuitBreakerFailbackBackgroundRefresher);\n }\n }\n\n private async tryMarkEndpointUnavailableForPartitionKeyRange(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n isRequestEligibleForPerPartitionAutomaticFailover: boolean,\n isRequestEligibleForPartitionLevelCircuitBreaker: boolean,\n ): Promise<boolean> {\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n const failedEndPoint = requestContext.endpoint;\n\n const readLocations = await this.globalEndpointManager.getReadLocations();\n const readEndPoints: string[] = [];\n\n if (isRequestEligibleForPerPartitionAutomaticFailover) {\n // For any single master write accounts, the next locations to fail over will be the read regions configured at the account level.\n for (const location of readLocations) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n return this.tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId,\n failedEndPoint,\n readEndPoints,\n this.partitionKeyRangeToLocationForWrite,\n diagnosticNode,\n );\n } else if (isRequestEligibleForPartitionLevelCircuitBreaker) {\n // For the read requests or multi-master write requests, the next locations to fail over will be the preferred locations\n // configured at the account level plus any other read locations that are not already in the preferred locations.\n if (this.preferredLocations && this.preferredLocations.length > 0) {\n for (const preferredLocation of this.preferredLocations) {\n const location = readLocations.find(\n (loc) => normalizeEndpoint(loc.name) === normalizeEndpoint(preferredLocation),\n );\n if (location) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n\n // Add the rest of the locations not already added\n for (const location of readLocations) {\n if (!readEndPoints.includes(location.databaseAccountEndpoint)) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n } else {\n for (const location of readLocations) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n return this.tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId,\n failedEndPoint,\n readEndPoints,\n this.partitionKeyRangeToLocationForReadAndWrite,\n diagnosticNode,\n );\n }\n return false;\n }\n\n /**\n * Increments the failure counter for the specified partition and checks if the partition can fail over.\n * This method is used to determine if a partition should be failed over based on the number of request failures.\n */\n private async incrementFailureCounterAndCheckFailover(\n requestContext: RequestContext,\n isRequestEligibleForPerPartitionAutomaticFailover: boolean,\n isRequestEligibleForPartitionLevelCircuitBreaker: boolean,\n ): Promise<boolean> {\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n const failedEndPoint = requestContext.endpoint;\n let partitionKeyRangeFailoverInfo: PartitionKeyRangeFailoverInfo;\n\n if (isRequestEligibleForPerPartitionAutomaticFailover) {\n if (!this.partitionKeyRangeToLocationForWrite.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n this.partitionKeyRangeToLocationForWrite.set(partitionKeyRangeId, failoverInfo);\n }\n partitionKeyRangeFailoverInfo =\n this.partitionKeyRangeToLocationForWrite.get(partitionKeyRangeId);\n } else if (isRequestEligibleForPartitionLevelCircuitBreaker) {\n if (!this.partitionKeyRangeToLocationForReadAndWrite.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n this.partitionKeyRangeToLocationForReadAndWrite.set(partitionKeyRangeId, failoverInfo);\n }\n partitionKeyRangeFailoverInfo =\n this.partitionKeyRangeToLocationForReadAndWrite.get(partitionKeyRangeId);\n } else {\n return false;\n }\n\n assertNotUndefined(\n partitionKeyRangeFailoverInfo,\n \"partitionKeyRangeFailoverInfo should be set if failover flags are true.\",\n );\n\n const currentTimeInMilliseconds = Date.now();\n await partitionKeyRangeFailoverInfo.incrementRequestFailureCounts(\n isReadRequest(requestContext.operationType),\n currentTimeInMilliseconds,\n );\n\n return partitionKeyRangeFailoverInfo.canCircuitBreakerTriggerPartitionFailOver(\n isReadRequest(requestContext.operationType),\n );\n }\n\n /** Validates if the given request is eligible for partition failover. */\n private async isRequestEligibleForPartitionFailover(\n requestContext: RequestContext,\n shouldValidateFailedLocation: boolean,\n ): Promise<boolean> {\n if (\n !requestContext ||\n !requestContext.operationType ||\n !requestContext.resourceType ||\n !requestContext.partitionKeyRangeId\n ) {\n return false;\n }\n\n const canUsePartitionLevelFailoverLocations = await this.canUsePartitionLevelFailoverLocations(\n requestContext.operationType,\n requestContext.resourceType,\n );\n if (!canUsePartitionLevelFailoverLocations) {\n return false;\n }\n\n if (shouldValidateFailedLocation && !requestContext.endpoint) {\n return false;\n }\n return true;\n }\n\n /** Determines if partition level failover locations can be used for the given request. */\n private async canUsePartitionLevelFailoverLocations(\n operationType?: OperationType,\n resourceType?: ResourceType,\n ): Promise<boolean> {\n const readEndPoints = await this.globalEndpointManager.getReadEndpoints();\n if (readEndPoints.length <= 1) {\n return false;\n }\n if (\n resourceType === ResourceType.item ||\n (resourceType === ResourceType.sproc && operationType === OperationType.Execute)\n ) {\n // Right now, for single-master only reads are supported for circuit breaker, and writes are supported for automatic.\n // failover. For multi master, both reads and writes are supported. Hence return true for both the cases.\n return true;\n }\n return false;\n }\n\n /**\n * Determines if a request is eligible for per-partition automatic failover.\n * A request is eligible if it is a write request, partition level failover is enabled,\n * and the global endpoint manager cannot use multiple write locations for the request.\n */\n private isRequestEligibleForPerPartitionAutomaticFailover(\n requestContext: RequestContext,\n ): boolean {\n return (\n this.globalEndpointManager.enablePartitionLevelFailover &&\n !isReadRequest(requestContext.operationType) &&\n !this.globalEndpointManager.canUseMultipleWriteLocations(\n requestContext.resourceType,\n requestContext.operationType,\n )\n );\n }\n\n /**\n * Determines if a request is eligible for partition-level circuit breaker.\n * This method checks if partition-level circuit breaker is enabled, and if the request is a read-only request or\n * the global endpoint manager can use multiple write locations for the request.\n */\n private isRequestEligibleForPartitionLevelCircuitBreaker(\n requestContext: RequestContext,\n ): boolean {\n const enablePartitionLevelCircuitBreaker =\n this.globalEndpointManager.enablePartitionLevelCircuitBreaker ||\n this.globalEndpointManager.enablePartitionLevelFailover;\n if (!enablePartitionLevelCircuitBreaker) {\n return false;\n }\n if (isReadRequest(requestContext.operationType)) {\n return true;\n }\n return this.globalEndpointManager.canUseMultipleWriteLocations(\n requestContext.resourceType,\n requestContext.operationType,\n );\n }\n\n /**\n * Attempts to add or update the partition failover information and move to the next available location.\n * This method checks if the current location for the partition key range has failed and updates the failover\n * information to route the request to the next available location. If all locations have been tried, it removes\n * the failover information for the partition key range. Return True if the failover information was successfully\n * updated and the request was routed to a new location, otherwise false.\n */\n private async tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId: string,\n failedEndPoint: string,\n nextEndPoints: readonly string[],\n partitionKeyRangeToLocation: Map<string, PartitionKeyRangeFailoverInfo>,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (!partitionKeyRangeToLocation.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n partitionKeyRangeToLocation.set(partitionKeyRangeId, failoverInfo);\n }\n const partitionFailOver = partitionKeyRangeToLocation.get(partitionKeyRangeId);\n\n // Will return true if it was able to update to a new region\n if (\n await partitionFailOver.tryMoveNextLocation(\n nextEndPoints,\n failedEndPoint,\n diagnosticNode,\n partitionKeyRangeId,\n )\n ) {\n return true;\n }\n // All the locations have been tried. Remove the override information\n partitionKeyRangeToLocation.delete(partitionKeyRangeId);\n return false;\n }\n\n /**\n * Initiates a background loop that periodically checks for unhealthy endpoints\n * and attempts to open connections to them. If a connection is successfully\n * established, it initiates a failback to the original location for the partition key range.\n * This is useful for scenarios where a partition key range has been marked as unavailable\n * due to a circuit breaker, and we want to periodically check if the original location\n * has become healthy again.\n * The loop runs at a defined interval specified by Constants.StalePartitionUnavailabilityRefreshIntervalInMs.\n */\n private initiateCircuitBreakerFailbackLoop(): void {\n this.circuitBreakerFailbackBackgroundRefresher = startBackgroundTask(async () => {\n try {\n await this.openConnectionToUnhealthyEndpointsWithFailback();\n } catch (err) {\n console.error(\"Failed to open connection to unhealthy endpoints: \", err);\n }\n }, Constants.StalePartitionUnavailabilityRefreshIntervalInMs);\n }\n\n /**\n * Attempts to open connections to unhealthy endpoints and initiates failback if the connections are successful.\n * This method checks the partition key ranges that have failed locations and tries to re-establish connections\n * to those locations. If a connection is successfully re-established, it initiates a failback to the original\n * location for the partition key range.\n */\n private async openConnectionToUnhealthyEndpointsWithFailback(): Promise<void> {\n // If partition level circuit breaker or failover is not enabled, dispose the timer.\n const enablePartitionLevelCircuitBreaker =\n this.globalEndpointManager.enablePartitionLevelCircuitBreaker ||\n this.globalEndpointManager.enablePartitionLevelFailover;\n if (!enablePartitionLevelCircuitBreaker) {\n this.dispose();\n return;\n }\n\n for (const pkRange of this.partitionKeyRangeToLocationForReadAndWrite.keys()) {\n const partitionFailover = this.partitionKeyRangeToLocationForReadAndWrite.get(pkRange);\n if (!partitionFailover) continue;\n\n const { firstRequestFailureTime } =\n await partitionFailover.snapshotPartitionFailoverTimestamps();\n const now = new Date();\n\n if (\n now.getTime() - firstRequestFailureTime >\n Constants.AllowedPartitionUnavailabilityDurationInMs\n ) {\n // Un-deterministically marking the original failed endpoint for the PkRange back to healthy.\n // Initiate Failback to the original failed location.\n this.partitionKeyRangeToLocationForReadAndWrite.delete(pkRange);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"globalPartitionEndpointManager.js","sourceRoot":"","sources":["../../src/globalPartitionEndpointManager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { OperationType, ResourceType, isReadRequest } from \"./common/index.js\";\nimport {\n Constants,\n DiagnosticNodeInternal,\n type CosmosClientOptions,\n type GlobalEndpointManager,\n type RequestContext,\n} from \"./index.js\";\nimport { PartitionKeyRangeFailoverInfo } from \"./PartitionKeyRangeFailoverInfo.js\";\nimport { normalizeEndpoint } from \"./utils/checkURL.js\";\nimport { startBackgroundTask } from \"./utils/time.js\";\nimport { assertNotUndefined } from \"./utils/typeChecks.js\";\n\n/**\n * @hidden\n * This class is used to failover single partitions to different regions.\n */\nexport class GlobalPartitionEndpointManager {\n private readonly partitionKeyRangeToLocationForWrite: Map<string, PartitionKeyRangeFailoverInfo>;\n private readonly partitionKeyRangeToLocationForReadAndWrite: Map<\n string,\n PartitionKeyRangeFailoverInfo\n >;\n private preferredLocations: string[];\n public preferredLocationsCount: number;\n private circuitBreakerFailbackBackgroundRefresher?: NodeJS.Timeout;\n\n /**\n * @internal\n */\n constructor(\n options: CosmosClientOptions,\n private globalEndpointManager: GlobalEndpointManager,\n ) {\n this.partitionKeyRangeToLocationForWrite = new Map<string, PartitionKeyRangeFailoverInfo>();\n this.partitionKeyRangeToLocationForReadAndWrite = new Map<\n string,\n PartitionKeyRangeFailoverInfo\n >();\n this.preferredLocations = options.connectionPolicy.preferredLocations;\n this.preferredLocationsCount = this.preferredLocations ? this.preferredLocations.length : 0;\n if (this.globalEndpointManager.lastKnownPPCBEnabled) {\n this.initiateCircuitBreakerFailbackLoop();\n }\n }\n\n /**\n * Checks eligibility of the request for partition failover and\n * tries to mark the endpoint unavailable for the partition key range. Future\n * requests will be routed to the next location if available.\n */\n public async tryPartitionLevelFailover(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (!(await this.isRequestEligibleForPartitionFailover(requestContext, true))) {\n return false;\n }\n\n const isRequestEligibleForPerPartitionAutomaticFailover =\n this.isRequestEligibleForPerPartitionAutomaticFailover(requestContext);\n const isRequestEligibleForPartitionLevelCircuitBreaker =\n this.isRequestEligibleForPartitionLevelCircuitBreaker(requestContext);\n\n if (\n isRequestEligibleForPerPartitionAutomaticFailover ||\n (isRequestEligibleForPartitionLevelCircuitBreaker &&\n (await this.incrementFailureCounterAndCheckFailover(\n requestContext,\n isRequestEligibleForPerPartitionAutomaticFailover,\n isRequestEligibleForPartitionLevelCircuitBreaker,\n )))\n ) {\n return this.tryMarkEndpointUnavailableForPartitionKeyRange(\n requestContext,\n diagnosticNode,\n isRequestEligibleForPerPartitionAutomaticFailover,\n isRequestEligibleForPartitionLevelCircuitBreaker,\n );\n }\n return false;\n }\n\n /**\n * Updates the DocumentServiceRequest routing location to point\n * new a location based if a partition level failover occurred.\n */\n public async tryAddPartitionLevelLocationOverride(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<RequestContext> {\n if (!(await this.isRequestEligibleForPartitionFailover(requestContext, false))) {\n return requestContext;\n }\n\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n\n if (this.isRequestEligibleForPerPartitionAutomaticFailover(requestContext)) {\n if (this.partitionKeyRangeToLocationForWrite.has(partitionKeyRangeId)) {\n const partitionFailOver = this.partitionKeyRangeToLocationForWrite.get(partitionKeyRangeId);\n requestContext.endpoint = partitionFailOver.getCurrentEndPoint();\n diagnosticNode.recordEndpointResolution(requestContext.endpoint);\n return requestContext;\n }\n } else if (this.isRequestEligibleForPartitionLevelCircuitBreaker(requestContext)) {\n if (this.partitionKeyRangeToLocationForReadAndWrite.has(partitionKeyRangeId)) {\n const partitionFailOver =\n this.partitionKeyRangeToLocationForReadAndWrite.get(partitionKeyRangeId);\n\n const canCircuitBreakerTriggerPartitionFailOver =\n await partitionFailOver.canCircuitBreakerTriggerPartitionFailOver(\n isReadRequest(requestContext.operationType),\n );\n if (canCircuitBreakerTriggerPartitionFailOver) {\n requestContext.endpoint = partitionFailOver.getCurrentEndPoint();\n diagnosticNode.recordEndpointResolution(requestContext.endpoint);\n return requestContext;\n }\n }\n }\n return requestContext;\n }\n\n /**\n * This method clears the background refresher for circuit breaker failback\n * and stops the periodic checks for unhealthy endpoints.\n */\n public dispose(): void {\n if (this.circuitBreakerFailbackBackgroundRefresher) {\n clearTimeout(this.circuitBreakerFailbackBackgroundRefresher);\n this.circuitBreakerFailbackBackgroundRefresher = undefined;\n }\n }\n\n private async tryMarkEndpointUnavailableForPartitionKeyRange(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n isRequestEligibleForPerPartitionAutomaticFailover: boolean,\n isRequestEligibleForPartitionLevelCircuitBreaker: boolean,\n ): Promise<boolean> {\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n const failedEndPoint = requestContext.endpoint;\n\n const readLocations = await this.globalEndpointManager.getReadLocations();\n const readEndPoints: string[] = [];\n\n if (isRequestEligibleForPerPartitionAutomaticFailover) {\n // For any single master write accounts, the next locations to fail over will be the read regions configured at the account level.\n for (const location of readLocations) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n return this.tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId,\n failedEndPoint,\n readEndPoints,\n this.partitionKeyRangeToLocationForWrite,\n diagnosticNode,\n );\n } else if (isRequestEligibleForPartitionLevelCircuitBreaker) {\n // For the read requests or multi-master write requests, the next locations to fail over will be the preferred locations\n // configured at the account level plus any other read locations that are not already in the preferred locations.\n if (this.preferredLocations && this.preferredLocations.length > 0) {\n for (const preferredLocation of this.preferredLocations) {\n const location = readLocations.find(\n (loc) => normalizeEndpoint(loc.name) === normalizeEndpoint(preferredLocation),\n );\n if (location) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n\n // Add the rest of the locations not already added\n for (const location of readLocations) {\n if (!readEndPoints.includes(location.databaseAccountEndpoint)) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n } else {\n for (const location of readLocations) {\n readEndPoints.push(location.databaseAccountEndpoint);\n }\n }\n return this.tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId,\n failedEndPoint,\n readEndPoints,\n this.partitionKeyRangeToLocationForReadAndWrite,\n diagnosticNode,\n );\n }\n return false;\n }\n\n /**\n * Increments the failure counter for the specified partition and checks if the partition can fail over.\n * This method is used to determine if a partition should be failed over based on the number of request failures.\n */\n private async incrementFailureCounterAndCheckFailover(\n requestContext: RequestContext,\n isRequestEligibleForPerPartitionAutomaticFailover: boolean,\n isRequestEligibleForPartitionLevelCircuitBreaker: boolean,\n ): Promise<boolean> {\n const partitionKeyRangeId = requestContext.partitionKeyRangeId;\n const failedEndPoint = requestContext.endpoint;\n let partitionKeyRangeFailoverInfo: PartitionKeyRangeFailoverInfo;\n\n if (isRequestEligibleForPerPartitionAutomaticFailover) {\n if (!this.partitionKeyRangeToLocationForWrite.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n this.partitionKeyRangeToLocationForWrite.set(partitionKeyRangeId, failoverInfo);\n }\n partitionKeyRangeFailoverInfo =\n this.partitionKeyRangeToLocationForWrite.get(partitionKeyRangeId);\n } else if (isRequestEligibleForPartitionLevelCircuitBreaker) {\n if (!this.partitionKeyRangeToLocationForReadAndWrite.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n this.partitionKeyRangeToLocationForReadAndWrite.set(partitionKeyRangeId, failoverInfo);\n }\n partitionKeyRangeFailoverInfo =\n this.partitionKeyRangeToLocationForReadAndWrite.get(partitionKeyRangeId);\n } else {\n return false;\n }\n\n assertNotUndefined(\n partitionKeyRangeFailoverInfo,\n \"partitionKeyRangeFailoverInfo should be set if failover flags are true.\",\n );\n\n const currentTimeInMilliseconds = Date.now();\n await partitionKeyRangeFailoverInfo.incrementRequestFailureCounts(\n isReadRequest(requestContext.operationType),\n currentTimeInMilliseconds,\n );\n\n return partitionKeyRangeFailoverInfo.canCircuitBreakerTriggerPartitionFailOver(\n isReadRequest(requestContext.operationType),\n );\n }\n\n /** Validates if the given request is eligible for partition failover. */\n private async isRequestEligibleForPartitionFailover(\n requestContext: RequestContext,\n shouldValidateFailedLocation: boolean,\n ): Promise<boolean> {\n if (\n !requestContext ||\n !requestContext.operationType ||\n !requestContext.resourceType ||\n !requestContext.partitionKeyRangeId\n ) {\n return false;\n }\n\n const canUsePartitionLevelFailoverLocations = await this.canUsePartitionLevelFailoverLocations(\n requestContext.operationType,\n requestContext.resourceType,\n );\n if (!canUsePartitionLevelFailoverLocations) {\n return false;\n }\n\n if (shouldValidateFailedLocation && !requestContext.endpoint) {\n return false;\n }\n return true;\n }\n\n /** Determines if partition level failover locations can be used for the given request. */\n private async canUsePartitionLevelFailoverLocations(\n operationType?: OperationType,\n resourceType?: ResourceType,\n ): Promise<boolean> {\n const readEndPoints = await this.globalEndpointManager.getReadEndpoints();\n if (readEndPoints.length <= 1) {\n return false;\n }\n if (\n resourceType === ResourceType.item ||\n (resourceType === ResourceType.sproc && operationType === OperationType.Execute)\n ) {\n // Right now, for single-master only reads are supported for circuit breaker, and writes are supported for automatic.\n // failover. For multi master, both reads and writes are supported. Hence return true for both the cases.\n return true;\n }\n return false;\n }\n\n /**\n * Determines if a request is eligible for per-partition automatic failover.\n * A request is eligible if it is a write request, partition level failover is enabled,\n * and the global endpoint manager cannot use multiple write locations for the request.\n */\n private isRequestEligibleForPerPartitionAutomaticFailover(\n requestContext: RequestContext,\n ): boolean {\n return (\n this.isPartitionLevelAutomaticFailoverEnabled() &&\n !isReadRequest(requestContext.operationType) &&\n !this.globalEndpointManager.canUseMultipleWriteLocations(\n requestContext.resourceType,\n requestContext.operationType,\n )\n );\n }\n\n /**\n * Determines if a request is eligible for partition-level circuit breaker.\n * This method checks if partition-level circuit breaker is enabled, and if the request is a read-only request or\n * the global endpoint manager can use multiple write locations for the request.\n */\n private isRequestEligibleForPartitionLevelCircuitBreaker(\n requestContext: RequestContext,\n ): boolean {\n const enablePartitionLevelCircuitBreaker = this.isPartitionLevelCircuitBreakerEnabled();\n if (!enablePartitionLevelCircuitBreaker) {\n return false;\n }\n if (isReadRequest(requestContext.operationType)) {\n return true;\n }\n return this.globalEndpointManager.canUseMultipleWriteLocations(\n requestContext.resourceType,\n requestContext.operationType,\n );\n }\n\n /**\n * Attempts to add or update the partition failover information and move to the next available location.\n * This method checks if the current location for the partition key range has failed and updates the failover\n * information to route the request to the next available location. If all locations have been tried, it removes\n * the failover information for the partition key range. Return True if the failover information was successfully\n * updated and the request was routed to a new location, otherwise false.\n */\n private async tryAddOrUpdatePartitionFailoverInfoAndMoveToNextLocation(\n partitionKeyRangeId: string,\n failedEndPoint: string,\n nextEndPoints: readonly string[],\n partitionKeyRangeToLocation: Map<string, PartitionKeyRangeFailoverInfo>,\n diagnosticNode: DiagnosticNodeInternal,\n ): Promise<boolean> {\n if (!partitionKeyRangeToLocation.has(partitionKeyRangeId)) {\n // If the partition key range is not already in the map, add it\n const failoverInfo = new PartitionKeyRangeFailoverInfo(failedEndPoint);\n partitionKeyRangeToLocation.set(partitionKeyRangeId, failoverInfo);\n }\n const partitionFailOver = partitionKeyRangeToLocation.get(partitionKeyRangeId);\n\n // Will return true if it was able to update to a new region\n if (\n await partitionFailOver.tryMoveNextLocation(\n nextEndPoints,\n failedEndPoint,\n diagnosticNode,\n partitionKeyRangeId,\n )\n ) {\n return true;\n }\n // All the locations have been tried. Remove the override information\n partitionKeyRangeToLocation.delete(partitionKeyRangeId);\n return false;\n }\n\n /**\n * Initiates a background loop that periodically checks for unhealthy endpoints\n * and attempts to open connections to them. If a connection is successfully\n * established, it initiates a failback to the original location for the partition key range.\n * This is useful for scenarios where a partition key range has been marked as unavailable\n * due to a circuit breaker, and we want to periodically check if the original location\n * has become healthy again.\n * The loop runs at a defined interval specified by Constants.StalePartitionUnavailabilityRefreshIntervalInMs.\n */\n private initiateCircuitBreakerFailbackLoop(): void {\n this.circuitBreakerFailbackBackgroundRefresher = startBackgroundTask(async () => {\n try {\n await this.openConnectionToUnhealthyEndpointsWithFailback();\n } catch (err) {\n console.error(\"Failed to open connection to unhealthy endpoints: \", err);\n }\n }, Constants.StalePartitionUnavailabilityRefreshIntervalInMs);\n }\n\n /**\n * Attempts to open connections to unhealthy endpoints and initiates failback if the connections are successful.\n * This method checks the partition key ranges that have failed locations and tries to re-establish connections\n * to those locations. If a connection is successfully re-established, it initiates a failback to the original\n * location for the partition key range.\n */\n private async openConnectionToUnhealthyEndpointsWithFailback(): Promise<void> {\n // If partition level circuit breaker or failover is not enabled, dispose the timer.\n\n for (const pkRange of this.partitionKeyRangeToLocationForReadAndWrite.keys()) {\n const partitionFailover = this.partitionKeyRangeToLocationForReadAndWrite.get(pkRange);\n if (!partitionFailover) continue;\n\n const { firstRequestFailureTime } =\n await partitionFailover.snapshotPartitionFailoverTimestamps();\n const now = new Date();\n\n if (\n now.getTime() - firstRequestFailureTime >\n Constants.AllowedPartitionUnavailabilityDurationInMs\n ) {\n // Un-deterministically marking the original failed endpoint for the PkRange back to healthy.\n // Initiate Failback to the original failed location.\n this.partitionKeyRangeToLocationForReadAndWrite.delete(pkRange);\n }\n }\n }\n\n /**\n * @internal\n */\n public changeCircuitBreakerFailbackLoop(isEnabled: boolean): void {\n // Start or stop the circuit breaker failback loop based on PPAF/PPCB status\n if (isEnabled) {\n // Only start if not already running to prevent duplicate timers\n if (!this.circuitBreakerFailbackBackgroundRefresher) {\n this.initiateCircuitBreakerFailbackLoop();\n }\n } else {\n // Only dispose if currently running\n if (this.circuitBreakerFailbackBackgroundRefresher) {\n this.dispose();\n }\n }\n }\n /**\n * Gets a value indicating whether per-partition automatic failover is currently enabled.\n * @internal\n */\n public isPartitionLevelAutomaticFailoverEnabled(): boolean {\n return this.globalEndpointManager.lastKnownPPAFEnabled;\n }\n /**\n * Gets a value indicating whether per-partition automatic failover is currently enabled.\n * @internal\n */\n public isPartitionLevelCircuitBreakerEnabled(): boolean {\n return this.globalEndpointManager.lastKnownPPCBEnabled;\n }\n}\n"]}
|
|
@@ -40,8 +40,8 @@ async function httpRequest(requestContext, diagnosticNode) {
|
|
|
40
40
|
// If the request is a read request and partition level failover or circuit breaker is enabled,
|
|
41
41
|
// set a shorter timeout to allow for quicker failover in case of partition unavailability.
|
|
42
42
|
// This is to ensure that read requests can quickly failover to another partition if the current one is unavailable.
|
|
43
|
-
if ((requestContext.
|
|
44
|
-
requestContext.
|
|
43
|
+
if ((requestContext.globalPartitionEndpointManager?.isPartitionLevelAutomaticFailoverEnabled() ||
|
|
44
|
+
requestContext.globalPartitionEndpointManager?.isPartitionLevelCircuitBreakerEnabled()) &&
|
|
45
45
|
requestContext.partitionKeyRangeId &&
|
|
46
46
|
requestContext.resourceType === ResourceType.item &&
|
|
47
47
|
isReadRequest(requestContext.operationType)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestHandler.js","sourceRoot":"","sources":["../../../src/request/RequestHandler.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAGlC,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,MAAM,GAAgB,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;AAEjE,KAAK,UAAU,cAAc,CAC3B,cAAsC,EACtC,cAA8B;IAE9B,OAAO,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CACxB,cAA8B,EAC9B,cAAsC;IAOtC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAEjC,mEAAmE;IACnE,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;IAChF,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxC,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,cAAc,GAAG,cAAc,CAAC,gBAAgB,CAAC,cAAc,CAAC;IACpE,+FAA+F;IAC/F,2FAA2F;IAC3F,oHAAoH;IACpH,IACE,CAAC,cAAc,CAAC,qBAAqB,CAAC,4BAA4B;QAChE,cAAc,CAAC,qBAAqB,CAAC,kCAAkC,CAAC;QAC1E,cAAc,CAAC,mBAAmB;QAClC,cAAc,CAAC,YAAY,KAAK,YAAY,CAAC,IAAI;QACjD,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC,EAC3C,CAAC;QACD,cAAc,GAAG,IAAI,CAAC,GAAG,CACvB,cAAc,CAAC,gBAAgB,CAAC,cAAc,EAC9C,SAAS,CAAC,0BAA0B,CACrC,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,EAAE,cAAc,CAAC,CAAC;IAEnB,IAAI,QAA0B,CAAC;IAE/B,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,cAAc,CAAC,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,IAAI,0BAA0B,EAAE,CAAC;IAC9E,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,iBAAiB,CAAC,cAAc,CAAC,OAAc,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,qBAAqB,CAAC;QAC5C,GAAG;QACH,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,cAAc,CAAC,MAAM;QAC7B,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,cAAc,CAAC,IAAI;KAC1B,CAAC,CAAC;IACH,IAAI,cAAc,CAAC,YAAY,EAAE,CAAC;QAChC,eAAe,CAAC,KAAK,GAAG,cAAc,CAAC,YAAY,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,eAAe,CAAC,KAAK,GAAG,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC9F,eAAe,CAAC,uBAAuB,GAAG,SAAS,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC3E,CAAC;IAED,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAC;IACnD,IAAI,CAAC;QACH,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC5B,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAChC,uFAAuF;YACvF,IAAI,UAAU,IAAI,UAAU,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9C,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,YAAY,CACpB,yCAAyC,cAAc,CAAC,gBAAgB,CAAC,cAAc,KAAK,CAC7F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,EAAE;QAC9E,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAElD,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;QAChE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAChE,CAAC,CAAC,SAAS,CAAC;IAEd,cAAc,CAAC,2BAA2B,CACxC,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,SAAS,EACT,GAAG,CACJ,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAkB,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,CAAC,OAAO,CACZ,QAAQ,CAAC,MAAM;YACb,GAAG;YACH,cAAc,CAAC,QAAQ;YACvB,GAAG;YACH,cAAc,CAAC,IAAI;YACnB,GAAG;YACH,MAAM,CAAC,OAAO,CACjB,CAAC;QAEF,aAAa,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC;QACrC,aAAa,CAAC,IAAI,GAAG,MAAM,CAAC;QAC5B,aAAa,CAAC,OAAO,GAAG,eAAe,CAAC;QAExC,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,IAAI,eAAe,EAAE,CAAC;YACxD,aAAa,CAAC,UAAU,GAAG,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,SAAS,CAAC,WAAW,CAAC,SAAS,IAAI,eAAe,EAAE,CAAC;YACvD,aAAa,CAAC,SAAS,GAAG,SAAS,CAAC;QACtC,CAAC;QAED,IAAI,SAAS,CAAC,WAAW,CAAC,cAAc,IAAI,eAAe,EAAE,CAAC;YAC5D,aAAa,CAAC,cAAc,GAAG,QAAQ,CACrC,eAAe,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,EACrD,EAAE,CACH,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,0BAA0B,EAAE;gBAC/D,GAAG,EAAE,GAAG,EAAE;oBACR,OAAO,aAAa,CAAC,cAAc,CAAC;gBACtC,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,aAAa,CAAC;IACtB,CAAC;IACD,OAAO;QACL,OAAO,EAAE,eAAe;QACxB,MAAM;QACN,IAAI,EAAE,QAAQ,CAAC,MAAM;QACrB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,OAAO,CACpB,cAA8B,EAC9B,cAAsC;IAEtC,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;QACxB,cAAc,CAAC,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,OAAO,kBAAkB,CACvB,KAAK,EAAE,SAAiC,EAAE,EAAE;QAC1C,OAAO,YAAY,CAAC,OAAO,CAAC;YAC1B,cAAc,EAAE,SAAS;YACzB,cAAc;YACd,cAAc;SACf,CAAC,CAAC;IACL,CAAC,EACD,cAAc,EACd,kBAAkB,CAAC,gBAAgB,CACpC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO;CACR,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { PipelineResponse } from \"@azure/core-rest-pipeline\";\nimport { createPipelineRequest, createHttpHeaders } from \"@azure/core-rest-pipeline\";\nimport { isReadRequest, prepareURL } from \"../common/index.js\";\nimport { Constants, ResourceType } from \"../common/constants.js\";\nimport { executePlugins, PluginOn } from \"../plugins/Plugin.js\";\nimport * as RetryUtility from \"../retry/retryUtility.js\";\nimport { defaultHttpAgent, defaultHttpsAgent } from \"./defaultAgent.js\";\nimport { ErrorResponse } from \"./ErrorResponse.js\";\nimport { bodyFromData } from \"./request.js\";\nimport type { RequestContext } from \"./RequestContext.js\";\nimport type { Response as CosmosResponse } from \"./Response.js\";\nimport { TimeoutError } from \"./TimeoutError.js\";\nimport { getCachedDefaultHttpClient } from \"../utils/cachedClient.js\";\nimport type { AzureLogger } from \"@azure/logger\";\nimport { createClientLogger } from \"@azure/logger\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { DiagnosticNodeType } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { addDiagnosticChild } from \"../utils/diagnostics.js\";\nimport { getCurrentTimestampInMs } from \"../utils/time.js\";\n\nconst logger: AzureLogger = createClientLogger(\"RequestHandler\");\n\nasync function executeRequest(\n diagnosticNode: DiagnosticNodeInternal,\n requestContext: RequestContext,\n): Promise<CosmosResponse<any>> {\n return executePlugins(diagnosticNode, requestContext, httpRequest, PluginOn.request);\n}\n\n/**\n * @hidden\n */\nasync function httpRequest(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n): Promise<{\n headers: any;\n result: any;\n code: number;\n substatus: number;\n}> {\n const controller = new AbortController();\n const signal = controller.signal;\n\n // Wrap users passed abort events and call our own internal abort()\n const userSignal = requestContext.options && requestContext.options.abortSignal;\n if (userSignal) {\n if (userSignal.aborted) {\n controller.abort();\n } else {\n userSignal.addEventListener(\"abort\", () => {\n controller.abort();\n });\n }\n }\n\n let requestTimeout = requestContext.connectionPolicy.requestTimeout;\n // If the request is a read request and partition level failover or circuit breaker is enabled,\n // set a shorter timeout to allow for quicker failover in case of partition unavailability.\n // This is to ensure that read requests can quickly failover to another partition if the current one is unavailable.\n if (\n (requestContext.globalEndpointManager.enablePartitionLevelFailover ||\n requestContext.globalEndpointManager.enablePartitionLevelCircuitBreaker) &&\n requestContext.partitionKeyRangeId &&\n requestContext.resourceType === ResourceType.item &&\n isReadRequest(requestContext.operationType)\n ) {\n requestTimeout = Math.min(\n requestContext.connectionPolicy.requestTimeout,\n Constants.RequestTimeoutForReadsInMs,\n );\n }\n const timeout = setTimeout(() => {\n controller.abort();\n }, requestTimeout);\n\n let response: PipelineResponse;\n\n if (requestContext.body) {\n requestContext.body = bodyFromData(requestContext.body);\n }\n\n const httpsClient = requestContext.httpClient ?? getCachedDefaultHttpClient();\n const url = prepareURL(requestContext.endpoint, requestContext.path);\n const reqHeaders = createHttpHeaders(requestContext.headers as any);\n const pipelineRequest = createPipelineRequest({\n url,\n headers: reqHeaders,\n method: requestContext.method,\n abortSignal: signal,\n body: requestContext.body,\n });\n if (requestContext.requestAgent) {\n pipelineRequest.agent = requestContext.requestAgent;\n } else {\n const parsedUrl = new URL(url);\n pipelineRequest.agent = parsedUrl.protocol === \"http:\" ? defaultHttpAgent : defaultHttpsAgent;\n pipelineRequest.allowInsecureConnection = parsedUrl.protocol === \"http:\";\n }\n\n const startTimeUTCInMs = getCurrentTimestampInMs();\n try {\n if (requestContext.pipeline) {\n response = await requestContext.pipeline.sendRequest(httpsClient, pipelineRequest);\n } else {\n response = await httpsClient.sendRequest(pipelineRequest);\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n // If the user passed signal caused the abort, cancel the timeout and rethrow the error\n if (userSignal && userSignal.aborted === true) {\n clearTimeout(timeout);\n throw error;\n }\n throw new TimeoutError(\n `Timeout Error! Request took more than ${requestContext.connectionPolicy.requestTimeout} ms`,\n );\n }\n throw error;\n }\n\n clearTimeout(timeout);\n const result =\n response.status === 204 || response.status === 304 || response.bodyAsText === \"\"\n ? null\n : JSON.parse(response.bodyAsText);\n const responseHeaders = response.headers.toJSON();\n\n const substatus = responseHeaders[Constants.HttpHeaders.SubStatus]\n ? parseInt(responseHeaders[Constants.HttpHeaders.SubStatus], 10)\n : undefined;\n\n diagnosticNode.recordSuccessfulNetworkCall(\n startTimeUTCInMs,\n requestContext,\n response,\n substatus,\n url,\n );\n\n if (response.status >= 400) {\n const errorResponse: ErrorResponse = new ErrorResponse(result.message);\n logger.warning(\n response.status +\n \" \" +\n requestContext.endpoint +\n \" \" +\n requestContext.path +\n \" \" +\n result.message,\n );\n\n errorResponse.code = response.status;\n errorResponse.body = result;\n errorResponse.headers = responseHeaders;\n\n if (Constants.HttpHeaders.ActivityId in responseHeaders) {\n errorResponse.activityId = responseHeaders[Constants.HttpHeaders.ActivityId];\n }\n\n if (Constants.HttpHeaders.SubStatus in responseHeaders) {\n errorResponse.substatus = substatus;\n }\n\n if (Constants.HttpHeaders.RetryAfterInMs in responseHeaders) {\n errorResponse.retryAfterInMs = parseInt(\n responseHeaders[Constants.HttpHeaders.RetryAfterInMs],\n 10,\n );\n Object.defineProperty(errorResponse, \"retryAfterInMilliseconds\", {\n get: () => {\n return errorResponse.retryAfterInMs;\n },\n });\n }\n\n throw errorResponse;\n }\n return {\n headers: responseHeaders,\n result,\n code: response.status,\n substatus,\n };\n}\n\n/**\n * @hidden\n */\nasync function request<T>(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n): Promise<CosmosResponse<T>> {\n if (requestContext.body) {\n requestContext.body = bodyFromData(requestContext.body);\n if (!requestContext.body) {\n throw new Error(\"parameter data must be a javascript object, string, or Buffer\");\n }\n }\n\n return addDiagnosticChild(\n async (childNode: DiagnosticNodeInternal) => {\n return RetryUtility.execute({\n diagnosticNode: childNode,\n requestContext,\n executeRequest,\n });\n },\n diagnosticNode,\n DiagnosticNodeType.REQUEST_ATTEMPTS,\n );\n}\n\nexport const RequestHandler = {\n request,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"RequestHandler.js","sourceRoot":"","sources":["../../../src/request/RequestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { PipelineResponse } from \"@azure/core-rest-pipeline\";\nimport { createPipelineRequest, createHttpHeaders } from \"@azure/core-rest-pipeline\";\nimport { isReadRequest, prepareURL } from \"../common/index.js\";\nimport { Constants, ResourceType } from \"../common/constants.js\";\nimport { executePlugins, PluginOn } from \"../plugins/Plugin.js\";\nimport * as RetryUtility from \"../retry/retryUtility.js\";\nimport { defaultHttpAgent, defaultHttpsAgent } from \"./defaultAgent.js\";\nimport { ErrorResponse } from \"./ErrorResponse.js\";\nimport { bodyFromData } from \"./request.js\";\nimport type { RequestContext } from \"./RequestContext.js\";\nimport type { Response as CosmosResponse } from \"./Response.js\";\nimport { TimeoutError } from \"./TimeoutError.js\";\nimport { getCachedDefaultHttpClient } from \"../utils/cachedClient.js\";\nimport type { AzureLogger } from \"@azure/logger\";\nimport { createClientLogger } from \"@azure/logger\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { DiagnosticNodeType } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { addDiagnosticChild } from \"../utils/diagnostics.js\";\nimport { getCurrentTimestampInMs } from \"../utils/time.js\";\n\nconst logger: AzureLogger = createClientLogger(\"RequestHandler\");\n\nasync function executeRequest(\n diagnosticNode: DiagnosticNodeInternal,\n requestContext: RequestContext,\n): Promise<CosmosResponse<any>> {\n return executePlugins(diagnosticNode, requestContext, httpRequest, PluginOn.request);\n}\n\n/**\n * @hidden\n */\nasync function httpRequest(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n): Promise<{\n headers: any;\n result: any;\n code: number;\n substatus: number;\n}> {\n const controller = new AbortController();\n const signal = controller.signal;\n\n // Wrap users passed abort events and call our own internal abort()\n const userSignal = requestContext.options && requestContext.options.abortSignal;\n if (userSignal) {\n if (userSignal.aborted) {\n controller.abort();\n } else {\n userSignal.addEventListener(\"abort\", () => {\n controller.abort();\n });\n }\n }\n\n let requestTimeout = requestContext.connectionPolicy.requestTimeout;\n // If the request is a read request and partition level failover or circuit breaker is enabled,\n // set a shorter timeout to allow for quicker failover in case of partition unavailability.\n // This is to ensure that read requests can quickly failover to another partition if the current one is unavailable.\n if (\n (requestContext.globalPartitionEndpointManager?.isPartitionLevelAutomaticFailoverEnabled() ||\n requestContext.globalPartitionEndpointManager?.isPartitionLevelCircuitBreakerEnabled()) &&\n requestContext.partitionKeyRangeId &&\n requestContext.resourceType === ResourceType.item &&\n isReadRequest(requestContext.operationType)\n ) {\n requestTimeout = Math.min(\n requestContext.connectionPolicy.requestTimeout,\n Constants.RequestTimeoutForReadsInMs,\n );\n }\n const timeout = setTimeout(() => {\n controller.abort();\n }, requestTimeout);\n\n let response: PipelineResponse;\n\n if (requestContext.body) {\n requestContext.body = bodyFromData(requestContext.body);\n }\n\n const httpsClient = requestContext.httpClient ?? getCachedDefaultHttpClient();\n const url = prepareURL(requestContext.endpoint, requestContext.path);\n const reqHeaders = createHttpHeaders(requestContext.headers as any);\n const pipelineRequest = createPipelineRequest({\n url,\n headers: reqHeaders,\n method: requestContext.method,\n abortSignal: signal,\n body: requestContext.body,\n });\n if (requestContext.requestAgent) {\n pipelineRequest.agent = requestContext.requestAgent;\n } else {\n const parsedUrl = new URL(url);\n pipelineRequest.agent = parsedUrl.protocol === \"http:\" ? defaultHttpAgent : defaultHttpsAgent;\n pipelineRequest.allowInsecureConnection = parsedUrl.protocol === \"http:\";\n }\n\n const startTimeUTCInMs = getCurrentTimestampInMs();\n try {\n if (requestContext.pipeline) {\n response = await requestContext.pipeline.sendRequest(httpsClient, pipelineRequest);\n } else {\n response = await httpsClient.sendRequest(pipelineRequest);\n }\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n // If the user passed signal caused the abort, cancel the timeout and rethrow the error\n if (userSignal && userSignal.aborted === true) {\n clearTimeout(timeout);\n throw error;\n }\n throw new TimeoutError(\n `Timeout Error! Request took more than ${requestContext.connectionPolicy.requestTimeout} ms`,\n );\n }\n throw error;\n }\n\n clearTimeout(timeout);\n const result =\n response.status === 204 || response.status === 304 || response.bodyAsText === \"\"\n ? null\n : JSON.parse(response.bodyAsText);\n const responseHeaders = response.headers.toJSON();\n\n const substatus = responseHeaders[Constants.HttpHeaders.SubStatus]\n ? parseInt(responseHeaders[Constants.HttpHeaders.SubStatus], 10)\n : undefined;\n\n diagnosticNode.recordSuccessfulNetworkCall(\n startTimeUTCInMs,\n requestContext,\n response,\n substatus,\n url,\n );\n\n if (response.status >= 400) {\n const errorResponse: ErrorResponse = new ErrorResponse(result.message);\n logger.warning(\n response.status +\n \" \" +\n requestContext.endpoint +\n \" \" +\n requestContext.path +\n \" \" +\n result.message,\n );\n\n errorResponse.code = response.status;\n errorResponse.body = result;\n errorResponse.headers = responseHeaders;\n\n if (Constants.HttpHeaders.ActivityId in responseHeaders) {\n errorResponse.activityId = responseHeaders[Constants.HttpHeaders.ActivityId];\n }\n\n if (Constants.HttpHeaders.SubStatus in responseHeaders) {\n errorResponse.substatus = substatus;\n }\n\n if (Constants.HttpHeaders.RetryAfterInMs in responseHeaders) {\n errorResponse.retryAfterInMs = parseInt(\n responseHeaders[Constants.HttpHeaders.RetryAfterInMs],\n 10,\n );\n Object.defineProperty(errorResponse, \"retryAfterInMilliseconds\", {\n get: () => {\n return errorResponse.retryAfterInMs;\n },\n });\n }\n\n throw errorResponse;\n }\n return {\n headers: responseHeaders,\n result,\n code: response.status,\n substatus,\n };\n}\n\n/**\n * @hidden\n */\nasync function request<T>(\n requestContext: RequestContext,\n diagnosticNode: DiagnosticNodeInternal,\n): Promise<CosmosResponse<T>> {\n if (requestContext.body) {\n requestContext.body = bodyFromData(requestContext.body);\n if (!requestContext.body) {\n throw new Error(\"parameter data must be a javascript object, string, or Buffer\");\n }\n }\n\n return addDiagnosticChild(\n async (childNode: DiagnosticNodeInternal) => {\n return RetryUtility.execute({\n diagnosticNode: childNode,\n requestContext,\n executeRequest,\n });\n },\n diagnosticNode,\n DiagnosticNodeType.REQUEST_ATTEMPTS,\n );\n}\n\nexport const RequestHandler = {\n request,\n};\n"]}
|
|
@@ -75,7 +75,7 @@ export class TimeoutFailoverRetryPolicy {
|
|
|
75
75
|
const readRequest = isReadRequest(this.operationType);
|
|
76
76
|
if (!canUseMultipleWriteLocations &&
|
|
77
77
|
!readRequest &&
|
|
78
|
-
!this.
|
|
78
|
+
!this.globalPartitionEndpointManager?.isPartitionLevelAutomaticFailoverEnabled()) {
|
|
79
79
|
// Write requests on single master cannot be retried if partition level failover is disabled.
|
|
80
80
|
// This means there are no other regions available to serve the writes.
|
|
81
81
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeoutFailoverRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"timeoutFailoverRetryPolicy.js","sourceRoot":"","sources":["../../../src/retry/timeoutFailoverRetryPolicy.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { RetryPolicy } from \"./RetryPolicy.js\";\nimport { StatusCodes } from \"../common/statusCodes.js\";\nimport type { GlobalEndpointManager } from \"../globalEndpointManager.js\";\nimport { HTTPMethod, isReadRequest } from \"../common/index.js\";\nimport type { OperationType, ResourceType } from \"../common/constants.js\";\nimport { Constants } from \"../common/constants.js\";\nimport type { RetryContext } from \"./RetryContext.js\";\nimport type { CosmosHeaders } from \"../queryExecutionContext/CosmosHeaders.js\";\nimport { TimeoutErrorCode } from \"../request/TimeoutError.js\";\nimport type { ErrorResponse, RequestContext } from \"../request/index.js\";\nimport type { DiagnosticNodeInternal } from \"../diagnostics/DiagnosticNodeInternal.js\";\nimport { GlobalPartitionEndpointManager } from \"../globalPartitionEndpointManager.js\";\n\n/**\n * This class TimeoutFailoverRetryPolicy handles retries for read operations\n * (including data plane,metadata, and query plan) in case of request timeouts\n * (TimeoutError) or service unavailability (503 status code) by performing failover\n * and retrying on other regions.\n * @hidden\n */\nexport class TimeoutFailoverRetryPolicy implements RetryPolicy {\n private maxRetryAttemptCount = 120;\n private maxServiceUnavailableRetryCount = 1;\n public retryAfterInMs = 0;\n public failoverRetryCount = 0;\n public request: any;\n public locationEndpoint: any;\n\n constructor(\n private globalEndpointManager: GlobalEndpointManager,\n private headers: CosmosHeaders,\n private methodType: HTTPMethod,\n private resourceType: ResourceType,\n private operationType: OperationType,\n private enableEndPointDiscovery: boolean,\n private globalPartitionEndpointManager?: GlobalPartitionEndpointManager,\n ) {}\n\n /**\n * Checks if a timeout request is valid for the timeout failover retry policy.\n * A valid request should be a data plane, metadata, or query plan request.\n * @returns\n */\n private isValidRequestForTimeoutError(): boolean {\n const isQuery = Constants.HttpHeaders.IsQuery in this.headers;\n const isQueryPlan = Constants.HttpHeaders.IsQueryPlan in this.headers;\n if (this.methodType === HTTPMethod.get || isQuery || isQueryPlan) {\n return true;\n }\n return false;\n }\n\n public async shouldRetry(\n err: ErrorResponse,\n diagnosticNode: DiagnosticNodeInternal,\n retryContext?: RetryContext,\n locationEndpoint?: string,\n requestContext?: RequestContext,\n ): Promise<boolean> {\n if (!err) {\n return false;\n }\n if (!retryContext || !locationEndpoint) {\n return false;\n }\n if (!this.enableEndPointDiscovery) {\n return false;\n }\n // Mark the partition as unavailable.\n // Let the Retry logic decide if the request should be retried\n if (requestContext && this.globalPartitionEndpointManager) {\n await this.globalPartitionEndpointManager.tryPartitionLevelFailover(\n requestContext,\n diagnosticNode,\n );\n }\n // Check if the error is a timeout error (TimeoutErrorCode) and if it is not a valid HTTP network timeout request\n if (err.code === TimeoutErrorCode && !this.isValidRequestForTimeoutError()) {\n return false;\n }\n if (\n err.code === StatusCodes.ServiceUnavailable &&\n this.failoverRetryCount >= this.maxServiceUnavailableRetryCount\n ) {\n return false;\n }\n if (this.failoverRetryCount >= this.maxRetryAttemptCount) {\n return false;\n }\n const canUseMultipleWriteLocations = this.globalEndpointManager.canUseMultipleWriteLocations(\n this.resourceType,\n this.operationType,\n );\n const readRequest = isReadRequest(this.operationType);\n\n if (\n !canUseMultipleWriteLocations &&\n !readRequest &&\n !this.globalPartitionEndpointManager?.isPartitionLevelAutomaticFailoverEnabled()\n ) {\n // Write requests on single master cannot be retried if partition level failover is disabled.\n // This means there are no other regions available to serve the writes.\n return false;\n }\n this.failoverRetryCount++;\n // Setting the retryLocationIndex to the next available location for retry.\n // The retryLocationIndex is determined based on the failoverRetryCount, starting from zero.\n retryContext.retryLocationServerIndex = await this.findEndpointIndex(this.failoverRetryCount);\n diagnosticNode.addData({ successfulRetryPolicy: \"timeout-failover\" });\n return true;\n }\n\n /**\n * Determines index of endpoint to be used for retry based upon failoverRetryCount and avalable locations\n * @param failoverRetryCount - count of failovers\n * @returns\n */\n private async findEndpointIndex(failoverRetryCount: number): Promise<number> {\n // count of preferred locations specified by user\n const preferredLocationsCount = this.globalEndpointManager.preferredLocationsCount;\n const readRequest = isReadRequest(this.operationType);\n let endpointIndex = 0;\n // If preferredLocationsCount is not zero, it indicates that the user has specified preferred locations.\n if (preferredLocationsCount !== 0) {\n // The endpointIndex is set based on the preferred location and the failover retry count.\n endpointIndex = failoverRetryCount % preferredLocationsCount;\n } else {\n // In the absence of preferred locations, the endpoint selection is based on the failover count and the number of available locations.\n if (readRequest) {\n const getReadEndpoints = await this.globalEndpointManager.getReadEndpoints();\n if (getReadEndpoints && getReadEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getReadEndpoints.length;\n }\n } else {\n const getWriteEndpoints = await this.globalEndpointManager.getWriteEndpoints();\n if (getWriteEndpoints && getWriteEndpoints.length > 0) {\n endpointIndex = failoverRetryCount % getWriteEndpoints.length;\n }\n }\n }\n return endpointIndex;\n }\n}\n"]}
|
|
@@ -758,8 +758,8 @@ class ClientContext {
|
|
|
758
758
|
* @internal
|
|
759
759
|
*/
|
|
760
760
|
isPartitionLevelFailOverEnabled() {
|
|
761
|
-
return (this.globalEndpointManager.
|
|
762
|
-
this.globalEndpointManager.
|
|
761
|
+
return (this.globalEndpointManager.lastKnownPPAFEnabled ||
|
|
762
|
+
this.globalEndpointManager.lastKnownPPCBEnabled);
|
|
763
763
|
}
|
|
764
764
|
}
|
|
765
765
|
exports.ClientContext = ClientContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientContext.js","sourceRoot":"","sources":["../../src/ClientContext.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { HttpClient, Pipeline } from \"@azure/core-rest-pipeline\";\nimport { bearerTokenAuthenticationPolicy, createEmptyPipeline } from \"@azure/core-rest-pipeline\";\nimport type { PartitionKeyRange } from \"./client/Container/PartitionKeyRange.js\";\nimport type { Resource } from \"./client/Resource.js\";\nimport { Constants, HTTPMethod, OperationType, ResourceType } from \"./common/constants.js\";\nimport { getIdFromLink, getPathFromLink, parseLink } from \"./common/helper.js\";\nimport { StatusCodes, SubStatusCodes } from \"./common/statusCodes.js\";\nimport type { Agent, CosmosClientOptions } from \"./CosmosClientOptions.js\";\nimport type { ConnectionPolicy, PartitionKey } from \"./documents/index.js\";\nimport {\n ConsistencyLevel,\n DatabaseAccount,\n convertToInternalPartitionKey,\n} from \"./documents/index.js\";\nimport type { GlobalEndpointManager } from \"./globalEndpointManager.js\";\nimport type { PluginConfig } from \"./plugins/Plugin.js\";\nimport { PluginOn, executePlugins } from \"./plugins/Plugin.js\";\nimport type { FetchFunctionCallback, SqlQuerySpec } from \"./queryExecutionContext/index.js\";\nimport type { CosmosHeaders } from \"./queryExecutionContext/CosmosHeaders.js\";\nimport { QueryIterator } from \"./queryIterator.js\";\nimport type { ErrorResponse } from \"./request/index.js\";\nimport type { FeedOptions, RequestOptions, Response } from \"./request/index.js\";\nimport type { PartitionedQueryExecutionInfo } from \"./request/ErrorResponse.js\";\nimport { getHeaders } from \"./request/request.js\";\nimport type { RequestContext } from \"./request/RequestContext.js\";\nimport { RequestHandler } from \"./request/RequestHandler.js\";\nimport { SessionContainer } from \"./session/sessionContainer.js\";\nimport type { SessionContext } from \"./session/SessionContext.js\";\nimport type { BulkOptions } from \"./utils/batch.js\";\nimport { sanitizeEndpoint } from \"./utils/checkURL.js\";\nimport { supportedQueryFeaturesBuilder } from \"./utils/supportedQueryFeaturesBuilder.js\";\nimport type { AzureLogger } from \"@azure/logger\";\nimport { createClientLogger } from \"@azure/logger\";\nimport type { ClientConfigDiagnostic, CosmosDiagnostics } from \"./CosmosDiagnostics.js\";\nimport type { DiagnosticNodeInternal } from \"./diagnostics/DiagnosticNodeInternal.js\";\nimport type { DiagnosticWriter } from \"./diagnostics/DiagnosticWriter.js\";\nimport { LogDiagnosticWriter, NoOpDiagnosticWriter } from \"./diagnostics/DiagnosticWriter.js\";\nimport type { DiagnosticFormatter } from \"./diagnostics/DiagnosticFormatter.js\";\nimport { DefaultDiagnosticFormatter } from \"./diagnostics/DiagnosticFormatter.js\";\nimport { CosmosDbDiagnosticLevel } from \"./diagnostics/CosmosDbDiagnosticLevel.js\";\nimport { randomUUID } from \"@azure/core-util\";\nimport { getUserAgent } from \"./common/platform.js\";\nimport type { GlobalPartitionEndpointManager } from \"./globalPartitionEndpointManager.js\";\nimport type { RetryOptions } from \"./retry/retryOptions.js\";\nimport { PartitionKeyRangeCache } from \"./routing/partitionKeyRangeCache.js\";\nimport {\n AAD_DEFAULT_SCOPE,\n AAD_AUTH_PREFIX,\n AAD_RESOURCE_NOT_FOUND_ERROR,\n} from \"./common/constants.js\";\n\nconst logger: AzureLogger = createClientLogger(\"ClientContext\");\n\nconst QueryJsonContentType = \"application/query+json\";\nconst HttpHeaders = Constants.HttpHeaders;\n/**\n * @hidden\n */\nexport class ClientContext {\n private readonly sessionContainer: SessionContainer;\n private connectionPolicy: ConnectionPolicy;\n private pipeline: Pipeline;\n private diagnosticWriter: DiagnosticWriter;\n private diagnosticFormatter: DiagnosticFormatter;\n public partitionKeyDefinitionCache: { [containerUrl: string]: any }; // TODO: PartitionKeyDefinitionCache\n /** @internal */\n public partitionKeyRangeCache: PartitionKeyRangeCache;\n /** boolean flag to support operations with client-side encryption */\n public enableEncryption: boolean = false;\n\n public constructor(\n private cosmosClientOptions: CosmosClientOptions,\n private globalEndpointManager: GlobalEndpointManager,\n private clientConfig: ClientConfigDiagnostic,\n public diagnosticLevel: CosmosDbDiagnosticLevel,\n private globalPartitionEndpointManager?: GlobalPartitionEndpointManager,\n ) {\n if (cosmosClientOptions.clientEncryptionOptions) {\n this.enableEncryption = true;\n }\n this.connectionPolicy = cosmosClientOptions.connectionPolicy;\n this.sessionContainer = new SessionContainer();\n this.partitionKeyDefinitionCache = {};\n this.pipeline = null;\n if (cosmosClientOptions.aadCredentials) {\n this.pipeline = createEmptyPipeline();\n const hrefEndpoint = sanitizeEndpoint(cosmosClientOptions.endpoint);\n\n // Use custom AAD scope if provided, otherwise use account-based scope\n const accountScope = `${hrefEndpoint}/.default`;\n const primaryScope = cosmosClientOptions.aadScope || accountScope;\n const fallbackScope = AAD_DEFAULT_SCOPE;\n\n this.pipeline.addPolicy(\n bearerTokenAuthenticationPolicy({\n credential: cosmosClientOptions.aadCredentials,\n scopes: primaryScope,\n challengeCallbacks: {\n async authorizeRequest({ request, getAccessToken }) {\n try {\n const tokenResponse = await getAccessToken([primaryScope], {});\n\n const authorizationToken = `${AAD_AUTH_PREFIX}${tokenResponse.token}`;\n request.headers.set(Constants.HttpHeaders.Authorization, authorizationToken);\n } catch (error: any) {\n // If no custom scope is provided and we get AADSTS500011 error,\n // fallback to the default Cosmos scope\n if (\n !cosmosClientOptions.aadScope &&\n error?.message?.includes(AAD_RESOURCE_NOT_FOUND_ERROR)\n ) {\n try {\n const fallbackTokenResponse = await getAccessToken([fallbackScope], {});\n const authorizationToken = `${AAD_AUTH_PREFIX}${fallbackTokenResponse.token}`;\n request.headers.set(Constants.HttpHeaders.Authorization, authorizationToken);\n } catch (fallbackError) {\n // If fallback also fails, throw the original error\n throw error;\n }\n } else {\n // If custom scope is provided or error is not AADSTS500011, throw the original error\n throw error;\n }\n }\n },\n },\n }),\n );\n }\n this.initializeDiagnosticSettings(diagnosticLevel);\n this.partitionKeyRangeCache = new PartitionKeyRangeCache(this);\n }\n\n /** @hidden */\n public async read<T>({\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.get,\n path,\n operationType: OperationType.Read,\n resourceId,\n options,\n resourceType,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType,\n });\n\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n if (resourceType === ResourceType.clientencryptionkey) {\n request.headers[HttpHeaders.AllowCachedReadsHeader] = true;\n if (options.databaseRid) {\n request.headers[HttpHeaders.DatabaseRidHeader] = options.databaseRid;\n }\n }\n this.applySessionToken(request);\n\n // read will use ReadEndpoint since it uses GET operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Read, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async queryFeed<T>({\n path,\n resourceType,\n resourceId,\n resultFn,\n query,\n options,\n diagnosticNode,\n partitionKeyRangeId,\n partitionKey,\n startEpk,\n endEpk,\n correlatedActivityId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n resultFn: (result: { [key: string]: any }) => any[];\n query: SqlQuerySpec | string;\n options: FeedOptions;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n partitionKey?: PartitionKey;\n startEpk?: string | undefined;\n endEpk?: string | undefined;\n correlatedActivityId?: string;\n }): Promise<Response<T & Resource>> {\n // Query operations will use ReadEndpoint even though it uses\n // GET(for queryFeed) and POST(for regular query operations)\n\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.get,\n path,\n operationType: OperationType.Query,\n partitionKeyRangeId,\n resourceId,\n resourceType,\n options,\n body: query,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Query,\n resourceType,\n });\n const requestId = randomUUID();\n if (query !== undefined) {\n request.method = HTTPMethod.post;\n }\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n request.headers = await this.buildHeaders(request);\n\n if (startEpk !== undefined && endEpk !== undefined) {\n request.headers[HttpHeaders.StartEpk] = startEpk;\n request.headers[HttpHeaders.EndEpk] = endEpk;\n request.headers[HttpHeaders.ReadFeedKeyType] = \"EffectivePartitionKeyRange\";\n }\n\n if (query !== undefined) {\n if (correlatedActivityId !== undefined) {\n request.headers[HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n request.headers[HttpHeaders.IsQuery] = \"true\";\n request.headers[HttpHeaders.ContentType] = QueryJsonContentType;\n if (typeof query === \"string\") {\n request.body = { query }; // Converts query text to query object.\n }\n }\n this.applySessionToken(request);\n logger.info(\n \"query \" +\n requestId +\n \" started\" +\n (request.partitionKeyRangeId ? \" pkrid: \" + request.partitionKeyRangeId : \"\"),\n );\n logger.verbose(request);\n const start = Date.now();\n const response = await RequestHandler.request(request, diagnosticNode);\n logger.info(\"query \" + requestId + \" finished - \" + (Date.now() - start) + \"ms\");\n this.captureSessionToken(undefined, path, OperationType.Query, response.headers);\n return this.processQueryFeedResponse(response, !!query, resultFn);\n }\n\n public async getQueryPlan(\n path: string,\n resourceType: ResourceType,\n resourceId: string,\n query: SqlQuerySpec | string,\n options: FeedOptions = {},\n diagnosticNode: DiagnosticNodeInternal,\n correlatedActivityId?: string,\n ): Promise<Response<PartitionedQueryExecutionInfo>> {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n path,\n operationType: OperationType.Read,\n resourceId,\n resourceType,\n options,\n body: query,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType,\n });\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n request.headers = await this.buildHeaders(request);\n if (correlatedActivityId !== undefined) {\n request.headers[HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n request.headers[HttpHeaders.IsQueryPlan] = \"True\";\n request.headers[HttpHeaders.QueryVersion] = \"1.4\";\n request.headers[HttpHeaders.ContentType] = QueryJsonContentType;\n request.headers[HttpHeaders.SupportedQueryFeatures] = supportedQueryFeaturesBuilder(options);\n\n if (typeof query === \"string\") {\n request.body = { query }; // Converts query text to query object.\n }\n\n this.applySessionToken(request);\n const response = await RequestHandler.request(request, diagnosticNode);\n this.captureSessionToken(undefined, path, OperationType.Query, response.headers);\n return response as any;\n }\n\n public queryPartitionKeyRanges(\n collectionLink: string,\n query?: string | SqlQuerySpec,\n options?: FeedOptions,\n ): QueryIterator<PartitionKeyRange> {\n const path = getPathFromLink(collectionLink, ResourceType.pkranges);\n const id = getIdFromLink(collectionLink);\n const cb: FetchFunctionCallback = async (diagNode, innerOptions) => {\n const response = await this.queryFeed({\n path,\n resourceType: ResourceType.pkranges,\n resourceId: id,\n resultFn: (result) => result.PartitionKeyRanges,\n query,\n options: innerOptions,\n diagnosticNode: diagNode,\n });\n return response;\n };\n return new QueryIterator<PartitionKeyRange>(this, query, options, cb);\n }\n\n public async delete<T>({\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n method = HTTPMethod.delete,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n method?: HTTPMethod;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: method,\n operationType: OperationType.Delete,\n path,\n resourceType,\n options,\n resourceId,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Delete,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n // deleteResource will use WriteEndpoint since it uses DELETE operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n if (parseLink(path).type !== \"colls\") {\n this.captureSessionToken(undefined, path, OperationType.Delete, response.headers);\n } else {\n this.clearSessionToken(path);\n }\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async patch<T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: any;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.patch,\n operationType: OperationType.Patch,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Patch,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n\n // patch will use WriteEndpoint\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Patch, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async create<T, U = T>({\n body,\n path,\n resourceType,\n resourceId,\n diagnosticNode,\n options = {},\n partitionKey,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n diagnosticNode: DiagnosticNodeInternal;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & U & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Create,\n path,\n resourceType,\n resourceId,\n body,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Create,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n // create will use WriteEndpoint since it uses POST operation\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Create, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n private processQueryFeedResponse(\n res: Response<any>,\n isQuery: boolean,\n resultFn: (result: { [key: string]: any }) => any[],\n ): Response<any> {\n if (isQuery) {\n return {\n result: resultFn(res.result),\n headers: res.headers,\n code: res.code,\n };\n } else {\n const newResult = resultFn(res.result).map((body: any) => body);\n return {\n result: newResult,\n headers: res.headers,\n code: res.code,\n };\n }\n }\n\n private applySessionToken(requestContext: RequestContext): void {\n const request = this.getSessionParams(requestContext.path);\n\n if (requestContext.headers && requestContext.headers[HttpHeaders.SessionToken]) {\n return;\n }\n\n const sessionConsistency: ConsistencyLevel = requestContext.headers[\n HttpHeaders.ConsistencyLevel\n ] as ConsistencyLevel;\n if (!sessionConsistency) {\n return;\n }\n\n if (sessionConsistency !== ConsistencyLevel.Session) {\n return;\n }\n\n if (request.resourceAddress) {\n const sessionToken = this.sessionContainer.get(request);\n if (sessionToken) {\n requestContext.headers[HttpHeaders.SessionToken] = sessionToken;\n }\n }\n }\n\n public async replace<T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: any;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.put,\n operationType: OperationType.Replace,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Replace,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n\n // replace will use WriteEndpoint since it uses PUT operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Replace, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async upsert<T, U = T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & U & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Upsert,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Upsert,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsUpsert] = true;\n this.applySessionToken(request);\n\n // upsert will use WriteEndpoint since it uses POST operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Upsert, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async execute<T>({\n sprocLink,\n params,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n sprocLink: string;\n params?: any[];\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T>> {\n // Accept a single parameter or an array of parameters.\n // Didn't add type annotation for this because we should legacy this behavior\n if (params !== null && params !== undefined && !Array.isArray(params)) {\n params = [params];\n }\n const path = getPathFromLink(sprocLink);\n const id = getIdFromLink(sprocLink);\n\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Execute,\n path,\n resourceType: ResourceType.sproc,\n options,\n resourceId: id,\n body: params,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Execute,\n resourceType: ResourceType.sproc,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n // executeStoredProcedure will use WriteEndpoint since it uses POST operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n return response;\n }\n\n /**\n * Gets the Database account information.\n * @param options - `urlConnection` in the options is the endpoint url whose database account needs to be retrieved.\n * If not present, current client's url will be used.\n */\n public async getDatabaseAccount(\n diagnosticNode: DiagnosticNodeInternal,\n options: RequestOptions = {},\n ): Promise<Response<DatabaseAccount>> {\n const endpoint = options.urlConnection || this.cosmosClientOptions.endpoint;\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n endpoint,\n method: HTTPMethod.get,\n operationType: OperationType.Read,\n path: \"\",\n resourceType: ResourceType.none,\n options,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType: ResourceType.none,\n });\n request.headers = await this.buildHeaders(request);\n // await options.beforeOperation({ endpoint, request, headers: requestHeaders });\n const { result, headers, code, substatus, diagnostics } = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n\n const databaseAccount = new DatabaseAccount(result, headers);\n return {\n result: databaseAccount,\n headers,\n diagnostics,\n code: code,\n substatus: substatus,\n };\n }\n\n public getWriteEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string> {\n return this.globalEndpointManager.getWriteEndpoint(diagnosticNode);\n }\n\n public getReadEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string> {\n return this.globalEndpointManager.getReadEndpoint(diagnosticNode);\n }\n\n public getWriteEndpoints(): Promise<readonly string[]> {\n return this.globalEndpointManager.getWriteEndpoints();\n }\n\n public getReadEndpoints(): Promise<readonly string[]> {\n return this.globalEndpointManager.getReadEndpoints();\n }\n\n public async batch<T>({\n body,\n path,\n partitionKey,\n resourceId,\n options = {},\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n partitionKey: PartitionKey;\n resourceId: string;\n options?: RequestOptions;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<any>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Batch,\n path,\n body,\n resourceType: ResourceType.item,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Batch,\n resourceType: ResourceType.item,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchRequest] = true;\n request.headers[HttpHeaders.IsBatchAtomic] = true;\n\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);\n response.diagnostics = diagnosticNode.toDiagnostic(this.getClientConfig());\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async bulk<T>({\n body,\n path,\n partitionKeyRangeId,\n resourceId,\n bulkOptions = {},\n options = {},\n diagnosticNode,\n }: {\n body: T;\n path: string;\n partitionKeyRangeId: string;\n resourceId: string;\n bulkOptions?: BulkOptions;\n options?: RequestOptions;\n diagnosticNode: DiagnosticNodeInternal;\n }): Promise<Response<any>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Batch,\n path,\n body,\n resourceType: ResourceType.item,\n resourceId,\n options,\n };\n diagnosticNode.addData({\n operationType: OperationType.Batch,\n resourceType: ResourceType.item,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchRequest] = true;\n request.headers[HttpHeaders.PartitionKeyRangeID] = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchAtomic] = false;\n request.headers[HttpHeaders.BatchContinueOnError] = bulkOptions.continueOnError ?? true;\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n private captureSessionToken(\n err: ErrorResponse,\n path: string,\n operationType: OperationType,\n resHeaders: CosmosHeaders,\n ): void {\n const request = this.getSessionParams(path);\n request.operationType = operationType;\n if (\n !err ||\n (!this.isMasterResource(request.resourceType) &&\n (err.code === StatusCodes.PreconditionFailed ||\n err.code === StatusCodes.Conflict ||\n (err.code === StatusCodes.NotFound &&\n err.substatus !== SubStatusCodes.ReadSessionNotAvailable)))\n ) {\n this.sessionContainer.set(request, resHeaders);\n }\n }\n\n public clearSessionToken(path: string): void {\n const request = this.getSessionParams(path);\n this.sessionContainer.remove(request);\n }\n\n public recordDiagnostics(diagnostic: CosmosDiagnostics): void {\n const formatted = this.diagnosticFormatter.format(diagnostic);\n this.diagnosticWriter.write(formatted);\n }\n\n public initializeDiagnosticSettings(diagnosticLevel: CosmosDbDiagnosticLevel): void {\n this.diagnosticFormatter = new DefaultDiagnosticFormatter();\n switch (diagnosticLevel) {\n case CosmosDbDiagnosticLevel.info:\n this.diagnosticWriter = new NoOpDiagnosticWriter();\n break;\n default:\n this.diagnosticWriter = new LogDiagnosticWriter();\n }\n }\n\n // TODO: move\n private getSessionParams(resourceLink: string): SessionContext {\n const resourceId: string = null;\n let resourceAddress: string = null;\n const parserOutput = parseLink(resourceLink);\n\n resourceAddress = parserOutput.objectBody.self;\n\n const resourceType = parserOutput.type;\n return {\n resourceId,\n resourceAddress,\n resourceType,\n isNameBased: true,\n };\n }\n\n private isMasterResource(resourceType: string): boolean {\n if (\n resourceType === Constants.Path.OffersPathSegment ||\n resourceType === Constants.Path.DatabasesPathSegment ||\n resourceType === Constants.Path.UsersPathSegment ||\n resourceType === Constants.Path.PermissionsPathSegment ||\n resourceType === Constants.Path.TopologyPathSegment ||\n resourceType === Constants.Path.DatabaseAccountPathSegment ||\n resourceType === Constants.Path.PartitionKeyRangesPathSegment ||\n resourceType === Constants.Path.CollectionsPathSegment\n ) {\n return true;\n }\n\n return false;\n }\n\n private buildHeaders(requestContext: RequestContext): Promise<CosmosHeaders> {\n return getHeaders({\n clientOptions: this.cosmosClientOptions,\n defaultHeaders: {\n ...this.cosmosClientOptions.defaultHeaders,\n ...requestContext.options.initialHeaders,\n },\n verb: requestContext.method,\n path: requestContext.path,\n resourceId: requestContext.resourceId,\n resourceType: requestContext.resourceType,\n options: requestContext.options,\n partitionKeyRangeId: requestContext.partitionKeyRangeId,\n useMultipleWriteLocations: this.connectionPolicy.useMultipleWriteLocations,\n partitionKey:\n requestContext.partitionKey !== undefined\n ? convertToInternalPartitionKey(requestContext.partitionKey)\n : undefined, // TODO: Move this check from here to PartitionKey\n operationType: requestContext.operationType,\n });\n }\n\n /**\n * Returns collection of properties which are derived from the context for Request Creation.\n * These properties have client wide scope, as opposed to request specific scope.\n * @returns\n */\n private getContextDerivedPropsForRequestCreation(): {\n globalEndpointManager: GlobalEndpointManager;\n connectionPolicy: ConnectionPolicy;\n requestAgent: Agent;\n client?: ClientContext;\n pipeline?: Pipeline;\n plugins: PluginConfig[];\n httpClient?: HttpClient;\n globalPartitionEndpointManager?: GlobalPartitionEndpointManager;\n } {\n return {\n globalEndpointManager: this.globalEndpointManager,\n requestAgent: this.cosmosClientOptions.agent,\n connectionPolicy: this.connectionPolicy,\n client: this,\n plugins: this.cosmosClientOptions.plugins,\n pipeline: this.pipeline,\n httpClient: this.cosmosClientOptions.httpClient,\n globalPartitionEndpointManager: this.globalPartitionEndpointManager,\n };\n }\n\n public getClientConfig(): ClientConfigDiagnostic {\n return this.clientConfig;\n }\n\n /**\n * @internal\n */\n public refreshUserAgent(hostFramework: string): void {\n const updatedUserAgent = getUserAgent(this.cosmosClientOptions, hostFramework);\n this.cosmosClientOptions.defaultHeaders[Constants.HttpHeaders.UserAgent] = updatedUserAgent;\n this.cosmosClientOptions.defaultHeaders[Constants.HttpHeaders.CustomUserAgent] =\n updatedUserAgent;\n }\n\n /**\n * @internal\n */\n public getRetryOptions(): RetryOptions {\n return this.connectionPolicy.retryOptions;\n }\n\n /**\n * @internal\n */\n public isPartitionLevelFailOverEnabled(): boolean {\n return (\n this.globalEndpointManager.enablePartitionLevelFailover ||\n this.globalEndpointManager.enablePartitionLevelCircuitBreaker\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ClientContext.js","sourceRoot":"","sources":["../../src/ClientContext.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAGlC,kEAAiG;AAGjG,wDAA2F;AAC3F,kDAA+E;AAC/E,4DAAsE;AAGtE,mDAI8B;AAG9B,mDAA+D;AAG/D,yDAAmD;AAInD,qDAAkD;AAElD,mEAA6D;AAC7D,uEAAiE;AAGjE,qDAAuD;AACvD,+FAAyF;AAEzF,0CAAmD;AAInD,2EAA8F;AAE9F,iFAAkF;AAClF,yFAAmF;AACnF,gDAA8C;AAC9C,sDAAoD;AAGpD,mFAA6E;AAC7E,wDAI+B;AAE/B,MAAM,MAAM,GAAgB,IAAA,2BAAkB,EAAC,eAAe,CAAC,CAAC;AAEhE,MAAM,oBAAoB,GAAG,wBAAwB,CAAC;AACtD,MAAM,WAAW,GAAG,wBAAS,CAAC,WAAW,CAAC;AAC1C;;GAEG;AACH,MAAa,aAAa;IAad;IACA;IACA;IACD;IACC;IAhBO,gBAAgB,CAAmB;IAC5C,gBAAgB,CAAmB;IACnC,QAAQ,CAAW;IACnB,gBAAgB,CAAmB;IACnC,mBAAmB,CAAsB;IAC1C,2BAA2B,CAAkC,CAAC,oCAAoC;IACzG,gBAAgB;IACT,sBAAsB,CAAyB;IACtD,qEAAqE;IAC9D,gBAAgB,GAAY,KAAK,CAAC;IAEzC,YACU,mBAAwC,EACxC,qBAA4C,EAC5C,YAAoC,EACrC,eAAwC,EACvC,8BAA+D;QAJ/D,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,iBAAY,GAAZ,YAAY,CAAwB;QACrC,oBAAe,GAAf,eAAe,CAAyB;QACvC,mCAA8B,GAA9B,8BAA8B,CAAiC;QAEvE,IAAI,mBAAmB,CAAC,uBAAuB,EAAE,CAAC;YAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,gBAAgB,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,IAAI,sCAAgB,EAAE,CAAC;QAC/C,IAAI,CAAC,2BAA2B,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,mBAAmB,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,QAAQ,GAAG,IAAA,wCAAmB,GAAE,CAAC;YACtC,MAAM,YAAY,GAAG,IAAA,8BAAgB,EAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAEpE,sEAAsE;YACtE,MAAM,YAAY,GAAG,GAAG,YAAY,WAAW,CAAC;YAChD,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,IAAI,YAAY,CAAC;YAClE,MAAM,aAAa,GAAG,gCAAiB,CAAC;YAExC,IAAI,CAAC,QAAQ,CAAC,SAAS,CACrB,IAAA,oDAA+B,EAAC;gBAC9B,UAAU,EAAE,mBAAmB,CAAC,cAAc;gBAC9C,MAAM,EAAE,YAAY;gBACpB,kBAAkB,EAAE;oBAClB,KAAK,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE;wBAChD,IAAI,CAAC;4BACH,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;4BAE/D,MAAM,kBAAkB,GAAG,GAAG,8BAAe,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;4BACtE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAS,CAAC,WAAW,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;wBAC/E,CAAC;wBAAC,OAAO,KAAU,EAAE,CAAC;4BACpB,gEAAgE;4BAChE,uCAAuC;4BACvC,IACE,CAAC,mBAAmB,CAAC,QAAQ;gCAC7B,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,2CAA4B,CAAC,EACtD,CAAC;gCACD,IAAI,CAAC;oCACH,MAAM,qBAAqB,GAAG,MAAM,cAAc,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;oCACxE,MAAM,kBAAkB,GAAG,GAAG,8BAAe,GAAG,qBAAqB,CAAC,KAAK,EAAE,CAAC;oCAC9E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAS,CAAC,WAAW,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;gCAC/E,CAAC;gCAAC,OAAO,aAAa,EAAE,CAAC;oCACvB,mDAAmD;oCACnD,MAAM,KAAK,CAAC;gCACd,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,qFAAqF;gCACrF,MAAM,KAAK,CAAC;4BACd,CAAC;wBACH,CAAC;oBACH,CAAC;iBACF;aACF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,4BAA4B,CAAC,eAAe,CAAC,CAAC;QACnD,IAAI,CAAC,sBAAsB,GAAG,IAAI,kDAAsB,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,cAAc;IACP,KAAK,CAAC,IAAI,CAAI,EACnB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,cAAc,EACd,mBAAmB,GASpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,GAAG;gBACtB,IAAI;gBACJ,aAAa,EAAE,4BAAa,CAAC,IAAI;gBACjC,UAAU;gBACV,OAAO;gBACP,YAAY;gBACZ,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,IAAI;gBACjC,YAAY;aACb,CAAC,CAAC;YAEH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,IAAI,YAAY,KAAK,2BAAY,CAAC,mBAAmB,EAAE,CAAC;gBACtD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;gBAC3D,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;oBACxB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;gBACvE,CAAC;YACH,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,yDAAyD;YACzD,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,SAAS,CAAI,EACxB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,KAAK,EACL,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,oBAAoB,GAcrB;QACC,6DAA6D;QAC7D,4DAA4D;QAE5D,MAAM,OAAO,GAAmB;YAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;YAClD,MAAM,EAAE,yBAAU,CAAC,GAAG;YACtB,IAAI;YACJ,aAAa,EAAE,4BAAa,CAAC,KAAK;YAClC,mBAAmB;YACnB,UAAU;YACV,YAAY;YACZ,OAAO;YACP,IAAI,EAAE,KAAK;YACX,YAAY;SACb,CAAC;QACF,cAAc,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,4BAAa,CAAC,KAAK;YAClC,YAAY;SACb,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,sBAAU,GAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,GAAG,yBAAU,CAAC,IAAI,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;YACjF,cAAc,EAAE,cAAc;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,yBAAyB,EAAE,CAAC;YAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;SAC9C,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;YACjD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;YAC7C,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,4BAA4B,CAAC;QAC9E,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;YAC3E,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YAC9C,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAC;YAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,uCAAuC;YACnE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CACT,QAAQ;YACN,SAAS;YACT,UAAU;YACV,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAChF,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,kCAAc,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QACjF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,IAAY,EACZ,YAA0B,EAC1B,UAAkB,EAClB,KAA4B,EAC5B,UAAuB,EAAE,EACzB,cAAsC,EACtC,oBAA6B;QAE7B,MAAM,OAAO,GAAmB;YAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;YAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;YACvB,IAAI;YACJ,aAAa,EAAE,4BAAa,CAAC,IAAI;YACjC,UAAU;YACV,YAAY;YACZ,OAAO;YACP,IAAI,EAAE,KAAK;SACZ,CAAC;QACF,cAAc,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,4BAAa,CAAC,IAAI;YACjC,YAAY;SACb,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;YACjF,cAAc,EAAE,cAAc;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,yBAAyB,EAAE,CAAC;YAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;SAC9C,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;QAC3E,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAC;QAChE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,IAAA,gEAA6B,EAAC,OAAO,CAAC,CAAC;QAE7F,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,uCAAuC;QACnE,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,kCAAc,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO,QAAe,CAAC;IACzB,CAAC;IAEM,uBAAuB,CAC5B,cAAsB,EACtB,KAA6B,EAC7B,OAAqB;QAErB,MAAM,IAAI,GAAG,IAAA,2BAAe,EAAC,cAAc,EAAE,2BAAY,CAAC,QAAQ,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG,IAAA,yBAAa,EAAC,cAAc,CAAC,CAAC;QACzC,MAAM,EAAE,GAA0B,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC;gBACpC,IAAI;gBACJ,YAAY,EAAE,2BAAY,CAAC,QAAQ;gBACnC,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB;gBAC/C,KAAK;gBACL,OAAO,EAAE,YAAY;gBACrB,cAAc,EAAE,QAAQ;aACzB,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QACF,OAAO,IAAI,gCAAa,CAAoB,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,MAAM,CAAI,EACrB,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,MAAM,GAAG,yBAAU,CAAC,MAAM,EAC1B,cAAc,EACd,mBAAmB,GAUpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,IAAI;gBACJ,YAAY;gBACZ,OAAO;gBACP,UAAU;gBACV,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,YAAY;aACb,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChC,uEAAuE;YACvE,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,IAAA,qBAAS,EAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,KAAK,CAAI,EACpB,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,cAAc,EACd,mBAAmB,GAUpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,KAAK;gBACxB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,IAAI;gBACJ,YAAY;gBACZ,IAAI;gBACJ,UAAU;gBACV,OAAO;gBACP,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,YAAY;aACb,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,+BAA+B;YAC/B,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAW,EAC5B,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,mBAAmB,GAUpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;gBACvB,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,IAAI;gBACJ,YAAY;gBACZ,UAAU;gBACV,IAAI;gBACJ,OAAO;gBACP,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,YAAY;aACb,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,6DAA6D;YAC7D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,wBAAwB,CAC9B,GAAkB,EAClB,OAAgB,EAChB,QAAmD;QAEnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC5B,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAChE,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,cAA8B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE3D,IAAI,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/E,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAqB,cAAc,CAAC,OAAO,CACjE,WAAW,CAAC,gBAAgB,CACT,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,kBAAkB,KAAK,2BAAgB,CAAC,OAAO,EAAE,CAAC;YACpD,OAAO;QACT,CAAC;QAED,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAI,EACtB,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,cAAc,EACd,mBAAmB,GAUpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,GAAG;gBACtB,aAAa,EAAE,4BAAa,CAAC,OAAO;gBACpC,IAAI;gBACJ,YAAY;gBACZ,IAAI;gBACJ,UAAU;gBACV,OAAO;gBACP,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,OAAO;gBACpC,YAAY;aACb,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,6DAA6D;YAC7D,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAW,EAC5B,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,cAAc,EACd,mBAAmB,GAUpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;gBACvB,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,IAAI;gBACJ,YAAY;gBACZ,IAAI;gBACJ,UAAU;gBACV,OAAO;gBACP,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,MAAM;gBACnC,YAAY;aACb,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;YAC7C,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,6DAA6D;YAC7D,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAI,EACtB,SAAS,EACT,MAAM,EACN,OAAO,GAAG,EAAE,EACZ,YAAY,EACZ,cAAc,EACd,mBAAmB,GAQpB;QACC,uDAAuD;QACvD,6EAA6E;QAC7E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QACD,MAAM,IAAI,GAAG,IAAA,2BAAe,EAAC,SAAS,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,IAAA,yBAAa,EAAC,SAAS,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAmB;YAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;YAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;YACvB,aAAa,EAAE,4BAAa,CAAC,OAAO;YACpC,IAAI;YACJ,YAAY,EAAE,2BAAY,CAAC,KAAK;YAChC,OAAO;YACP,UAAU,EAAE,EAAE;YACd,IAAI,EAAE,MAAM;YACZ,YAAY;SACb,CAAC;QACF,cAAc,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,4BAAa,CAAC,OAAO;YACpC,YAAY,EAAE,2BAAY,CAAC,KAAK;SACjC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QAClD,6EAA6E;QAC7E,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;YACjF,cAAc,EAAE,cAAc;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,yBAAyB,EAAE,CAAC;YAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;SAC9C,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,kBAAkB,CAC7B,cAAsC,EACtC,UAA0B,EAAE;QAE5B,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;QAC5E,MAAM,OAAO,GAAmB;YAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;YAClD,QAAQ;YACR,MAAM,EAAE,yBAAU,CAAC,GAAG;YACtB,aAAa,EAAE,4BAAa,CAAC,IAAI;YACjC,IAAI,EAAE,EAAE;YACR,YAAY,EAAE,2BAAY,CAAC,IAAI;YAC/B,OAAO;SACR,CAAC;QACF,cAAc,CAAC,OAAO,CAAC;YACrB,aAAa,EAAE,4BAAa,CAAC,IAAI;YACjC,YAAY,EAAE,2BAAY,CAAC,IAAI;SAChC,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACnD,iFAAiF;QACjF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,0BAAc,EAC5E,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,0BAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,OAAO;YACL,MAAM,EAAE,eAAe;YACvB,OAAO;YACP,WAAW;YACX,IAAI,EAAE,IAAI;YACV,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;IAEM,gBAAgB,CAAC,cAAsC;QAC5D,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACrE,CAAC;IAEM,eAAe,CAAC,cAAsC;QAC3D,OAAO,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IACpE,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,EAAE,CAAC;IACxD,CAAC;IAEM,gBAAgB;QACrB,OAAO,IAAI,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,CAAC;IACvD,CAAC;IAEM,KAAK,CAAC,KAAK,CAAI,EACpB,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,UAAU,EACV,OAAO,GAAG,EAAE,EACZ,cAAc,EACd,mBAAmB,GASpB;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;gBACvB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,IAAI;gBACJ,IAAI;gBACJ,YAAY,EAAE,2BAAY,CAAC,IAAI;gBAC/B,UAAU;gBACV,OAAO;gBACP,YAAY;aACb,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,YAAY,EAAE,2BAAY,CAAC,IAAI;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;YAElD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjF,QAAQ,CAAC,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;YAC3E,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAI,EACnB,IAAI,EACJ,IAAI,EACJ,mBAAmB,EACnB,UAAU,EACV,WAAW,GAAG,EAAE,EAChB,OAAO,GAAG,EAAE,EACZ,cAAc,GASf;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,wCAAwC,EAAE;gBAClD,MAAM,EAAE,yBAAU,CAAC,IAAI;gBACvB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,IAAI;gBACJ,IAAI;gBACJ,YAAY,EAAE,2BAAY,CAAC,IAAI;gBAC/B,UAAU;gBACV,OAAO;aACR,CAAC;YACF,cAAc,CAAC,OAAO,CAAC;gBACrB,aAAa,EAAE,4BAAa,CAAC,KAAK;gBAClC,YAAY,EAAE,2BAAY,CAAC,IAAI;aAChC,CAAC,CAAC;YACH,OAAO,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;YAClD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CAAC;YACvE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;YACnD,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,WAAW,CAAC,eAAe,IAAI,IAAI,CAAC;YACxF,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEhC,OAAO,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,8BAA8B,CAAC;gBACjF,cAAc,EAAE,cAAc;gBAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,yBAAyB,EAAE,CAAC;gBAC5B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;aAC9C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAc,EACnC,cAAc,EACd,OAAO,EACP,kCAAc,CAAC,OAAO,EACtB,oBAAQ,CAAC,SAAS,CACnB,CAAC;YACF,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,EAAE,4BAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,4BAAa,CAAC,MAAM,EAAG,GAAqB,CAAC,OAAO,CAAC,CAAC;YAC1F,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,mBAAmB,CACzB,GAAkB,EAClB,IAAY,EACZ,aAA4B,EAC5B,UAAyB;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,aAAa,GAAG,aAAa,CAAC;QACtC,IACE,CAAC,GAAG;YACJ,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC;gBAC3C,CAAC,GAAG,CAAC,IAAI,KAAK,4BAAW,CAAC,kBAAkB;oBAC1C,GAAG,CAAC,IAAI,KAAK,4BAAW,CAAC,QAAQ;oBACjC,CAAC,GAAG,CAAC,IAAI,KAAK,4BAAW,CAAC,QAAQ;wBAChC,GAAG,CAAC,SAAS,KAAK,+BAAc,CAAC,uBAAuB,CAAC,CAAC,CAAC,EACjE,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,IAAY;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAEM,iBAAiB,CAAC,UAA6B;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAEM,4BAA4B,CAAC,eAAwC;QAC1E,IAAI,CAAC,mBAAmB,GAAG,IAAI,mDAA0B,EAAE,CAAC;QAC5D,QAAQ,eAAe,EAAE,CAAC;YACxB,KAAK,oDAAuB,CAAC,IAAI;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,0CAAoB,EAAE,CAAC;gBACnD,MAAM;YACR;gBACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,yCAAmB,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,aAAa;IACL,gBAAgB,CAAC,YAAoB;QAC3C,MAAM,UAAU,GAAW,IAAI,CAAC;QAChC,IAAI,eAAe,GAAW,IAAI,CAAC;QACnC,MAAM,YAAY,GAAG,IAAA,qBAAS,EAAC,YAAY,CAAC,CAAC;QAE7C,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAE/C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC;QACvC,OAAO;YACL,UAAU;YACV,eAAe;YACf,YAAY;YACZ,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,YAAoB;QAC3C,IACE,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,iBAAiB;YACjD,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,oBAAoB;YACpD,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,gBAAgB;YAChD,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,sBAAsB;YACtD,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,mBAAmB;YACnD,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,0BAA0B;YAC1D,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,6BAA6B;YAC7D,YAAY,KAAK,wBAAS,CAAC,IAAI,CAAC,sBAAsB,EACtD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,YAAY,CAAC,cAA8B;QACjD,OAAO,IAAA,uBAAU,EAAC;YAChB,aAAa,EAAE,IAAI,CAAC,mBAAmB;YACvC,cAAc,EAAE;gBACd,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc;gBAC1C,GAAG,cAAc,CAAC,OAAO,CAAC,cAAc;aACzC;YACD,IAAI,EAAE,cAAc,CAAC,MAAM;YAC3B,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,YAAY,EAAE,cAAc,CAAC,YAAY;YACzC,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,mBAAmB,EAAE,cAAc,CAAC,mBAAmB;YACvD,yBAAyB,EAAE,IAAI,CAAC,gBAAgB,CAAC,yBAAyB;YAC1E,YAAY,EACV,cAAc,CAAC,YAAY,KAAK,SAAS;gBACvC,CAAC,CAAC,IAAA,wCAA6B,EAAC,cAAc,CAAC,YAAY,CAAC;gBAC5D,CAAC,CAAC,SAAS,EAAE,kDAAkD;YACnE,aAAa,EAAE,cAAc,CAAC,aAAa;SAC5C,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,wCAAwC;QAU9C,OAAO;YACL,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;YACjD,YAAY,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK;YAC5C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,OAAO;YACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU;YAC/C,8BAA8B,EAAE,IAAI,CAAC,8BAA8B;SACpE,CAAC;IACJ,CAAC;IAEM,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,aAAqB;QAC3C,MAAM,gBAAgB,GAAG,IAAA,0BAAY,EAAC,IAAI,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;QAC/E,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,wBAAS,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC;QAC5F,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,wBAAS,CAAC,WAAW,CAAC,eAAe,CAAC;YAC5E,gBAAgB,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,+BAA+B;QACpC,OAAO,CACL,IAAI,CAAC,qBAAqB,CAAC,oBAAoB;YAC/C,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAChD,CAAC;IACJ,CAAC;CACF;AAzhCD,sCAyhCC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { HttpClient, Pipeline } from \"@azure/core-rest-pipeline\";\nimport { bearerTokenAuthenticationPolicy, createEmptyPipeline } from \"@azure/core-rest-pipeline\";\nimport type { PartitionKeyRange } from \"./client/Container/PartitionKeyRange.js\";\nimport type { Resource } from \"./client/Resource.js\";\nimport { Constants, HTTPMethod, OperationType, ResourceType } from \"./common/constants.js\";\nimport { getIdFromLink, getPathFromLink, parseLink } from \"./common/helper.js\";\nimport { StatusCodes, SubStatusCodes } from \"./common/statusCodes.js\";\nimport type { Agent, CosmosClientOptions } from \"./CosmosClientOptions.js\";\nimport type { ConnectionPolicy, PartitionKey } from \"./documents/index.js\";\nimport {\n ConsistencyLevel,\n DatabaseAccount,\n convertToInternalPartitionKey,\n} from \"./documents/index.js\";\nimport type { GlobalEndpointManager } from \"./globalEndpointManager.js\";\nimport type { PluginConfig } from \"./plugins/Plugin.js\";\nimport { PluginOn, executePlugins } from \"./plugins/Plugin.js\";\nimport type { FetchFunctionCallback, SqlQuerySpec } from \"./queryExecutionContext/index.js\";\nimport type { CosmosHeaders } from \"./queryExecutionContext/CosmosHeaders.js\";\nimport { QueryIterator } from \"./queryIterator.js\";\nimport type { ErrorResponse } from \"./request/index.js\";\nimport type { FeedOptions, RequestOptions, Response } from \"./request/index.js\";\nimport type { PartitionedQueryExecutionInfo } from \"./request/ErrorResponse.js\";\nimport { getHeaders } from \"./request/request.js\";\nimport type { RequestContext } from \"./request/RequestContext.js\";\nimport { RequestHandler } from \"./request/RequestHandler.js\";\nimport { SessionContainer } from \"./session/sessionContainer.js\";\nimport type { SessionContext } from \"./session/SessionContext.js\";\nimport type { BulkOptions } from \"./utils/batch.js\";\nimport { sanitizeEndpoint } from \"./utils/checkURL.js\";\nimport { supportedQueryFeaturesBuilder } from \"./utils/supportedQueryFeaturesBuilder.js\";\nimport type { AzureLogger } from \"@azure/logger\";\nimport { createClientLogger } from \"@azure/logger\";\nimport type { ClientConfigDiagnostic, CosmosDiagnostics } from \"./CosmosDiagnostics.js\";\nimport type { DiagnosticNodeInternal } from \"./diagnostics/DiagnosticNodeInternal.js\";\nimport type { DiagnosticWriter } from \"./diagnostics/DiagnosticWriter.js\";\nimport { LogDiagnosticWriter, NoOpDiagnosticWriter } from \"./diagnostics/DiagnosticWriter.js\";\nimport type { DiagnosticFormatter } from \"./diagnostics/DiagnosticFormatter.js\";\nimport { DefaultDiagnosticFormatter } from \"./diagnostics/DiagnosticFormatter.js\";\nimport { CosmosDbDiagnosticLevel } from \"./diagnostics/CosmosDbDiagnosticLevel.js\";\nimport { randomUUID } from \"@azure/core-util\";\nimport { getUserAgent } from \"./common/platform.js\";\nimport type { GlobalPartitionEndpointManager } from \"./globalPartitionEndpointManager.js\";\nimport type { RetryOptions } from \"./retry/retryOptions.js\";\nimport { PartitionKeyRangeCache } from \"./routing/partitionKeyRangeCache.js\";\nimport {\n AAD_DEFAULT_SCOPE,\n AAD_AUTH_PREFIX,\n AAD_RESOURCE_NOT_FOUND_ERROR,\n} from \"./common/constants.js\";\n\nconst logger: AzureLogger = createClientLogger(\"ClientContext\");\n\nconst QueryJsonContentType = \"application/query+json\";\nconst HttpHeaders = Constants.HttpHeaders;\n/**\n * @hidden\n */\nexport class ClientContext {\n private readonly sessionContainer: SessionContainer;\n private connectionPolicy: ConnectionPolicy;\n private pipeline: Pipeline;\n private diagnosticWriter: DiagnosticWriter;\n private diagnosticFormatter: DiagnosticFormatter;\n public partitionKeyDefinitionCache: { [containerUrl: string]: any }; // TODO: PartitionKeyDefinitionCache\n /** @internal */\n public partitionKeyRangeCache: PartitionKeyRangeCache;\n /** boolean flag to support operations with client-side encryption */\n public enableEncryption: boolean = false;\n\n public constructor(\n private cosmosClientOptions: CosmosClientOptions,\n private globalEndpointManager: GlobalEndpointManager,\n private clientConfig: ClientConfigDiagnostic,\n public diagnosticLevel: CosmosDbDiagnosticLevel,\n private globalPartitionEndpointManager?: GlobalPartitionEndpointManager,\n ) {\n if (cosmosClientOptions.clientEncryptionOptions) {\n this.enableEncryption = true;\n }\n this.connectionPolicy = cosmosClientOptions.connectionPolicy;\n this.sessionContainer = new SessionContainer();\n this.partitionKeyDefinitionCache = {};\n this.pipeline = null;\n if (cosmosClientOptions.aadCredentials) {\n this.pipeline = createEmptyPipeline();\n const hrefEndpoint = sanitizeEndpoint(cosmosClientOptions.endpoint);\n\n // Use custom AAD scope if provided, otherwise use account-based scope\n const accountScope = `${hrefEndpoint}/.default`;\n const primaryScope = cosmosClientOptions.aadScope || accountScope;\n const fallbackScope = AAD_DEFAULT_SCOPE;\n\n this.pipeline.addPolicy(\n bearerTokenAuthenticationPolicy({\n credential: cosmosClientOptions.aadCredentials,\n scopes: primaryScope,\n challengeCallbacks: {\n async authorizeRequest({ request, getAccessToken }) {\n try {\n const tokenResponse = await getAccessToken([primaryScope], {});\n\n const authorizationToken = `${AAD_AUTH_PREFIX}${tokenResponse.token}`;\n request.headers.set(Constants.HttpHeaders.Authorization, authorizationToken);\n } catch (error: any) {\n // If no custom scope is provided and we get AADSTS500011 error,\n // fallback to the default Cosmos scope\n if (\n !cosmosClientOptions.aadScope &&\n error?.message?.includes(AAD_RESOURCE_NOT_FOUND_ERROR)\n ) {\n try {\n const fallbackTokenResponse = await getAccessToken([fallbackScope], {});\n const authorizationToken = `${AAD_AUTH_PREFIX}${fallbackTokenResponse.token}`;\n request.headers.set(Constants.HttpHeaders.Authorization, authorizationToken);\n } catch (fallbackError) {\n // If fallback also fails, throw the original error\n throw error;\n }\n } else {\n // If custom scope is provided or error is not AADSTS500011, throw the original error\n throw error;\n }\n }\n },\n },\n }),\n );\n }\n this.initializeDiagnosticSettings(diagnosticLevel);\n this.partitionKeyRangeCache = new PartitionKeyRangeCache(this);\n }\n\n /** @hidden */\n public async read<T>({\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.get,\n path,\n operationType: OperationType.Read,\n resourceId,\n options,\n resourceType,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType,\n });\n\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n if (resourceType === ResourceType.clientencryptionkey) {\n request.headers[HttpHeaders.AllowCachedReadsHeader] = true;\n if (options.databaseRid) {\n request.headers[HttpHeaders.DatabaseRidHeader] = options.databaseRid;\n }\n }\n this.applySessionToken(request);\n\n // read will use ReadEndpoint since it uses GET operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Read, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async queryFeed<T>({\n path,\n resourceType,\n resourceId,\n resultFn,\n query,\n options,\n diagnosticNode,\n partitionKeyRangeId,\n partitionKey,\n startEpk,\n endEpk,\n correlatedActivityId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n resultFn: (result: { [key: string]: any }) => any[];\n query: SqlQuerySpec | string;\n options: FeedOptions;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n partitionKey?: PartitionKey;\n startEpk?: string | undefined;\n endEpk?: string | undefined;\n correlatedActivityId?: string;\n }): Promise<Response<T & Resource>> {\n // Query operations will use ReadEndpoint even though it uses\n // GET(for queryFeed) and POST(for regular query operations)\n\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.get,\n path,\n operationType: OperationType.Query,\n partitionKeyRangeId,\n resourceId,\n resourceType,\n options,\n body: query,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Query,\n resourceType,\n });\n const requestId = randomUUID();\n if (query !== undefined) {\n request.method = HTTPMethod.post;\n }\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n request.headers = await this.buildHeaders(request);\n\n if (startEpk !== undefined && endEpk !== undefined) {\n request.headers[HttpHeaders.StartEpk] = startEpk;\n request.headers[HttpHeaders.EndEpk] = endEpk;\n request.headers[HttpHeaders.ReadFeedKeyType] = \"EffectivePartitionKeyRange\";\n }\n\n if (query !== undefined) {\n if (correlatedActivityId !== undefined) {\n request.headers[HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n request.headers[HttpHeaders.IsQuery] = \"true\";\n request.headers[HttpHeaders.ContentType] = QueryJsonContentType;\n if (typeof query === \"string\") {\n request.body = { query }; // Converts query text to query object.\n }\n }\n this.applySessionToken(request);\n logger.info(\n \"query \" +\n requestId +\n \" started\" +\n (request.partitionKeyRangeId ? \" pkrid: \" + request.partitionKeyRangeId : \"\"),\n );\n logger.verbose(request);\n const start = Date.now();\n const response = await RequestHandler.request(request, diagnosticNode);\n logger.info(\"query \" + requestId + \" finished - \" + (Date.now() - start) + \"ms\");\n this.captureSessionToken(undefined, path, OperationType.Query, response.headers);\n return this.processQueryFeedResponse(response, !!query, resultFn);\n }\n\n public async getQueryPlan(\n path: string,\n resourceType: ResourceType,\n resourceId: string,\n query: SqlQuerySpec | string,\n options: FeedOptions = {},\n diagnosticNode: DiagnosticNodeInternal,\n correlatedActivityId?: string,\n ): Promise<Response<PartitionedQueryExecutionInfo>> {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n path,\n operationType: OperationType.Read,\n resourceId,\n resourceType,\n options,\n body: query,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType,\n });\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n request.headers = await this.buildHeaders(request);\n if (correlatedActivityId !== undefined) {\n request.headers[HttpHeaders.CorrelatedActivityId] = correlatedActivityId;\n }\n request.headers[HttpHeaders.IsQueryPlan] = \"True\";\n request.headers[HttpHeaders.QueryVersion] = \"1.4\";\n request.headers[HttpHeaders.ContentType] = QueryJsonContentType;\n request.headers[HttpHeaders.SupportedQueryFeatures] = supportedQueryFeaturesBuilder(options);\n\n if (typeof query === \"string\") {\n request.body = { query }; // Converts query text to query object.\n }\n\n this.applySessionToken(request);\n const response = await RequestHandler.request(request, diagnosticNode);\n this.captureSessionToken(undefined, path, OperationType.Query, response.headers);\n return response as any;\n }\n\n public queryPartitionKeyRanges(\n collectionLink: string,\n query?: string | SqlQuerySpec,\n options?: FeedOptions,\n ): QueryIterator<PartitionKeyRange> {\n const path = getPathFromLink(collectionLink, ResourceType.pkranges);\n const id = getIdFromLink(collectionLink);\n const cb: FetchFunctionCallback = async (diagNode, innerOptions) => {\n const response = await this.queryFeed({\n path,\n resourceType: ResourceType.pkranges,\n resourceId: id,\n resultFn: (result) => result.PartitionKeyRanges,\n query,\n options: innerOptions,\n diagnosticNode: diagNode,\n });\n return response;\n };\n return new QueryIterator<PartitionKeyRange>(this, query, options, cb);\n }\n\n public async delete<T>({\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n method = HTTPMethod.delete,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n method?: HTTPMethod;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: method,\n operationType: OperationType.Delete,\n path,\n resourceType,\n options,\n resourceId,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Delete,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n // deleteResource will use WriteEndpoint since it uses DELETE operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n if (parseLink(path).type !== \"colls\") {\n this.captureSessionToken(undefined, path, OperationType.Delete, response.headers);\n } else {\n this.clearSessionToken(path);\n }\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async patch<T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: any;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.patch,\n operationType: OperationType.Patch,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Patch,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n\n // patch will use WriteEndpoint\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Patch, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async create<T, U = T>({\n body,\n path,\n resourceType,\n resourceId,\n diagnosticNode,\n options = {},\n partitionKey,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n diagnosticNode: DiagnosticNodeInternal;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & U & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Create,\n path,\n resourceType,\n resourceId,\n body,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Create,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n // create will use WriteEndpoint since it uses POST operation\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Create, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n private processQueryFeedResponse(\n res: Response<any>,\n isQuery: boolean,\n resultFn: (result: { [key: string]: any }) => any[],\n ): Response<any> {\n if (isQuery) {\n return {\n result: resultFn(res.result),\n headers: res.headers,\n code: res.code,\n };\n } else {\n const newResult = resultFn(res.result).map((body: any) => body);\n return {\n result: newResult,\n headers: res.headers,\n code: res.code,\n };\n }\n }\n\n private applySessionToken(requestContext: RequestContext): void {\n const request = this.getSessionParams(requestContext.path);\n\n if (requestContext.headers && requestContext.headers[HttpHeaders.SessionToken]) {\n return;\n }\n\n const sessionConsistency: ConsistencyLevel = requestContext.headers[\n HttpHeaders.ConsistencyLevel\n ] as ConsistencyLevel;\n if (!sessionConsistency) {\n return;\n }\n\n if (sessionConsistency !== ConsistencyLevel.Session) {\n return;\n }\n\n if (request.resourceAddress) {\n const sessionToken = this.sessionContainer.get(request);\n if (sessionToken) {\n requestContext.headers[HttpHeaders.SessionToken] = sessionToken;\n }\n }\n }\n\n public async replace<T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: any;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.put,\n operationType: OperationType.Replace,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Replace,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n this.applySessionToken(request);\n\n // replace will use WriteEndpoint since it uses PUT operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Replace, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async upsert<T, U = T>({\n body,\n path,\n resourceType,\n resourceId,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n resourceType: ResourceType;\n resourceId: string;\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T & U & Resource>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Upsert,\n path,\n resourceType,\n body,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Upsert,\n resourceType,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsUpsert] = true;\n this.applySessionToken(request);\n\n // upsert will use WriteEndpoint since it uses POST operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Upsert, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async execute<T>({\n sprocLink,\n params,\n options = {},\n partitionKey,\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n sprocLink: string;\n params?: any[];\n options?: RequestOptions;\n partitionKey?: PartitionKey;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<T>> {\n // Accept a single parameter or an array of parameters.\n // Didn't add type annotation for this because we should legacy this behavior\n if (params !== null && params !== undefined && !Array.isArray(params)) {\n params = [params];\n }\n const path = getPathFromLink(sprocLink);\n const id = getIdFromLink(sprocLink);\n\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Execute,\n path,\n resourceType: ResourceType.sproc,\n options,\n resourceId: id,\n body: params,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Execute,\n resourceType: ResourceType.sproc,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n // executeStoredProcedure will use WriteEndpoint since it uses POST operation\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n return response;\n }\n\n /**\n * Gets the Database account information.\n * @param options - `urlConnection` in the options is the endpoint url whose database account needs to be retrieved.\n * If not present, current client's url will be used.\n */\n public async getDatabaseAccount(\n diagnosticNode: DiagnosticNodeInternal,\n options: RequestOptions = {},\n ): Promise<Response<DatabaseAccount>> {\n const endpoint = options.urlConnection || this.cosmosClientOptions.endpoint;\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n endpoint,\n method: HTTPMethod.get,\n operationType: OperationType.Read,\n path: \"\",\n resourceType: ResourceType.none,\n options,\n };\n diagnosticNode.addData({\n operationType: OperationType.Read,\n resourceType: ResourceType.none,\n });\n request.headers = await this.buildHeaders(request);\n // await options.beforeOperation({ endpoint, request, headers: requestHeaders });\n const { result, headers, code, substatus, diagnostics } = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n\n const databaseAccount = new DatabaseAccount(result, headers);\n return {\n result: databaseAccount,\n headers,\n diagnostics,\n code: code,\n substatus: substatus,\n };\n }\n\n public getWriteEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string> {\n return this.globalEndpointManager.getWriteEndpoint(diagnosticNode);\n }\n\n public getReadEndpoint(diagnosticNode: DiagnosticNodeInternal): Promise<string> {\n return this.globalEndpointManager.getReadEndpoint(diagnosticNode);\n }\n\n public getWriteEndpoints(): Promise<readonly string[]> {\n return this.globalEndpointManager.getWriteEndpoints();\n }\n\n public getReadEndpoints(): Promise<readonly string[]> {\n return this.globalEndpointManager.getReadEndpoints();\n }\n\n public async batch<T>({\n body,\n path,\n partitionKey,\n resourceId,\n options = {},\n diagnosticNode,\n partitionKeyRangeId,\n }: {\n body: T;\n path: string;\n partitionKey: PartitionKey;\n resourceId: string;\n options?: RequestOptions;\n diagnosticNode: DiagnosticNodeInternal;\n partitionKeyRangeId?: string;\n }): Promise<Response<any>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Batch,\n path,\n body,\n resourceType: ResourceType.item,\n resourceId,\n options,\n partitionKey,\n };\n diagnosticNode.addData({\n operationType: OperationType.Batch,\n resourceType: ResourceType.item,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchRequest] = true;\n request.headers[HttpHeaders.IsBatchAtomic] = true;\n\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);\n response.diagnostics = diagnosticNode.toDiagnostic(this.getClientConfig());\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n public async bulk<T>({\n body,\n path,\n partitionKeyRangeId,\n resourceId,\n bulkOptions = {},\n options = {},\n diagnosticNode,\n }: {\n body: T;\n path: string;\n partitionKeyRangeId: string;\n resourceId: string;\n bulkOptions?: BulkOptions;\n options?: RequestOptions;\n diagnosticNode: DiagnosticNodeInternal;\n }): Promise<Response<any>> {\n try {\n const request: RequestContext = {\n ...this.getContextDerivedPropsForRequestCreation(),\n method: HTTPMethod.post,\n operationType: OperationType.Batch,\n path,\n body,\n resourceType: ResourceType.item,\n resourceId,\n options,\n };\n diagnosticNode.addData({\n operationType: OperationType.Batch,\n resourceType: ResourceType.item,\n });\n request.headers = await this.buildHeaders(request);\n request.partitionKeyRangeId = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchRequest] = true;\n request.headers[HttpHeaders.PartitionKeyRangeID] = partitionKeyRangeId;\n request.headers[HttpHeaders.IsBatchAtomic] = false;\n request.headers[HttpHeaders.BatchContinueOnError] = bulkOptions.continueOnError ?? true;\n this.applySessionToken(request);\n\n request.endpoint = await this.globalEndpointManager.resolveServiceEndpointInternal({\n diagnosticNode: diagnosticNode,\n resourceType: request.resourceType,\n operationType: request.operationType,\n startServiceEndpointIndex: 0,\n excludedLocations: options?.excludedLocations,\n });\n const response = await executePlugins(\n diagnosticNode,\n request,\n RequestHandler.request,\n PluginOn.operation,\n );\n this.captureSessionToken(undefined, path, OperationType.Batch, response.headers);\n return response;\n } catch (err: any) {\n this.captureSessionToken(err, path, OperationType.Upsert, (err as ErrorResponse).headers);\n throw err;\n }\n }\n\n private captureSessionToken(\n err: ErrorResponse,\n path: string,\n operationType: OperationType,\n resHeaders: CosmosHeaders,\n ): void {\n const request = this.getSessionParams(path);\n request.operationType = operationType;\n if (\n !err ||\n (!this.isMasterResource(request.resourceType) &&\n (err.code === StatusCodes.PreconditionFailed ||\n err.code === StatusCodes.Conflict ||\n (err.code === StatusCodes.NotFound &&\n err.substatus !== SubStatusCodes.ReadSessionNotAvailable)))\n ) {\n this.sessionContainer.set(request, resHeaders);\n }\n }\n\n public clearSessionToken(path: string): void {\n const request = this.getSessionParams(path);\n this.sessionContainer.remove(request);\n }\n\n public recordDiagnostics(diagnostic: CosmosDiagnostics): void {\n const formatted = this.diagnosticFormatter.format(diagnostic);\n this.diagnosticWriter.write(formatted);\n }\n\n public initializeDiagnosticSettings(diagnosticLevel: CosmosDbDiagnosticLevel): void {\n this.diagnosticFormatter = new DefaultDiagnosticFormatter();\n switch (diagnosticLevel) {\n case CosmosDbDiagnosticLevel.info:\n this.diagnosticWriter = new NoOpDiagnosticWriter();\n break;\n default:\n this.diagnosticWriter = new LogDiagnosticWriter();\n }\n }\n\n // TODO: move\n private getSessionParams(resourceLink: string): SessionContext {\n const resourceId: string = null;\n let resourceAddress: string = null;\n const parserOutput = parseLink(resourceLink);\n\n resourceAddress = parserOutput.objectBody.self;\n\n const resourceType = parserOutput.type;\n return {\n resourceId,\n resourceAddress,\n resourceType,\n isNameBased: true,\n };\n }\n\n private isMasterResource(resourceType: string): boolean {\n if (\n resourceType === Constants.Path.OffersPathSegment ||\n resourceType === Constants.Path.DatabasesPathSegment ||\n resourceType === Constants.Path.UsersPathSegment ||\n resourceType === Constants.Path.PermissionsPathSegment ||\n resourceType === Constants.Path.TopologyPathSegment ||\n resourceType === Constants.Path.DatabaseAccountPathSegment ||\n resourceType === Constants.Path.PartitionKeyRangesPathSegment ||\n resourceType === Constants.Path.CollectionsPathSegment\n ) {\n return true;\n }\n\n return false;\n }\n\n private buildHeaders(requestContext: RequestContext): Promise<CosmosHeaders> {\n return getHeaders({\n clientOptions: this.cosmosClientOptions,\n defaultHeaders: {\n ...this.cosmosClientOptions.defaultHeaders,\n ...requestContext.options.initialHeaders,\n },\n verb: requestContext.method,\n path: requestContext.path,\n resourceId: requestContext.resourceId,\n resourceType: requestContext.resourceType,\n options: requestContext.options,\n partitionKeyRangeId: requestContext.partitionKeyRangeId,\n useMultipleWriteLocations: this.connectionPolicy.useMultipleWriteLocations,\n partitionKey:\n requestContext.partitionKey !== undefined\n ? convertToInternalPartitionKey(requestContext.partitionKey)\n : undefined, // TODO: Move this check from here to PartitionKey\n operationType: requestContext.operationType,\n });\n }\n\n /**\n * Returns collection of properties which are derived from the context for Request Creation.\n * These properties have client wide scope, as opposed to request specific scope.\n * @returns\n */\n private getContextDerivedPropsForRequestCreation(): {\n globalEndpointManager: GlobalEndpointManager;\n connectionPolicy: ConnectionPolicy;\n requestAgent: Agent;\n client?: ClientContext;\n pipeline?: Pipeline;\n plugins: PluginConfig[];\n httpClient?: HttpClient;\n globalPartitionEndpointManager?: GlobalPartitionEndpointManager;\n } {\n return {\n globalEndpointManager: this.globalEndpointManager,\n requestAgent: this.cosmosClientOptions.agent,\n connectionPolicy: this.connectionPolicy,\n client: this,\n plugins: this.cosmosClientOptions.plugins,\n pipeline: this.pipeline,\n httpClient: this.cosmosClientOptions.httpClient,\n globalPartitionEndpointManager: this.globalPartitionEndpointManager,\n };\n }\n\n public getClientConfig(): ClientConfigDiagnostic {\n return this.clientConfig;\n }\n\n /**\n * @internal\n */\n public refreshUserAgent(hostFramework: string): void {\n const updatedUserAgent = getUserAgent(this.cosmosClientOptions, hostFramework);\n this.cosmosClientOptions.defaultHeaders[Constants.HttpHeaders.UserAgent] = updatedUserAgent;\n this.cosmosClientOptions.defaultHeaders[Constants.HttpHeaders.CustomUserAgent] =\n updatedUserAgent;\n }\n\n /**\n * @internal\n */\n public getRetryOptions(): RetryOptions {\n return this.connectionPolicy.retryOptions;\n }\n\n /**\n * @internal\n */\n public isPartitionLevelFailOverEnabled(): boolean {\n return (\n this.globalEndpointManager.lastKnownPPAFEnabled ||\n this.globalEndpointManager.lastKnownPPCBEnabled\n );\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CosmosClient.d.ts","sourceRoot":"","sources":["../../src/CosmosClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;OAgBG;IACH,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC;;;;OAIG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAO1C;;OAEG;gBACS,gBAAgB,EAAE,MAAM;IACpC;;;OAGG;gBACS,OAAO,EAAE,mBAAmB;
|
|
1
|
+
{"version":3,"file":"CosmosClient.d.ts","sourceRoot":"","sources":["../../src/CosmosClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,qBAAa,YAAY;IACvB;;;;;;;;;;;;;;;;OAgBG;IACH,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC;;;;OAIG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,iBAAiB,CAAiB;IAO1C;;OAEG;gBACS,gBAAgB,EAAE,MAAM;IACpC;;;OAGG;gBACS,OAAO,EAAE,mBAAmB;IA+GxC,OAAO,CAAC,gCAAgC;IAoBxC;;OAEG;IACU,kBAAkB,CAC7B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAM7C;;OAEG;IACU,0BAA0B,CACrC,cAAc,EAAE,sBAAsB,EACtC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAW7C;;;;OAIG;IACU,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMhD;;;;OAIG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAM/C;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAItD;;;;OAIG;IACI,gBAAgB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACI,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAIrC;;;OAGG;IACI,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK;IAI/B;;OAEG;IACI,OAAO,IAAI,IAAI;YAWR,6BAA6B;CA8B5C"}
|