@azure/event-hubs 6.0.1-alpha.20250619.1 → 6.0.1-alpha.20250730.1
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/batchingPartitionChannel.js +23 -17
- package/dist/browser/batchingPartitionChannel.js.map +1 -1
- package/dist/browser/connectionContext.js +18 -32
- package/dist/browser/connectionContext.js.map +1 -1
- package/dist/browser/diagnostics/instrumentEventData.js +6 -7
- package/dist/browser/diagnostics/instrumentEventData.js.map +1 -1
- package/dist/browser/eventData.js +6 -4
- package/dist/browser/eventData.js.map +1 -1
- package/dist/browser/eventDataAdapter.js +5 -2
- package/dist/browser/eventDataAdapter.js.map +1 -1
- package/dist/browser/eventDataBatch.js +61 -9
- package/dist/browser/eventDataBatch.js.map +1 -1
- package/dist/browser/eventHubBufferedProducerClient.js +65 -50
- package/dist/browser/eventHubBufferedProducerClient.js.map +1 -1
- package/dist/browser/eventHubConsumerClient.js +70 -24
- package/dist/browser/eventHubConsumerClient.js.map +1 -1
- package/dist/browser/eventHubProducerClient.js +58 -15
- package/dist/browser/eventHubProducerClient.js.map +1 -1
- package/dist/browser/eventHubSender.js +118 -35
- package/dist/browser/eventHubSender.js.map +1 -1
- package/dist/browser/eventProcessor.js +27 -5
- package/dist/browser/eventProcessor.js.map +1 -1
- package/dist/browser/impl/awaitableQueue.js +6 -2
- package/dist/browser/impl/awaitableQueue.js.map +1 -1
- package/dist/browser/impl/partitionAssigner.js +2 -4
- package/dist/browser/impl/partitionAssigner.js.map +1 -1
- package/dist/browser/impl/partitionGate.js +1 -3
- package/dist/browser/impl/partitionGate.js.map +1 -1
- package/dist/browser/inMemoryCheckpointStore.js +10 -8
- package/dist/browser/inMemoryCheckpointStore.js.map +1 -1
- package/dist/browser/loadBalancerStrategies/balancedStrategy.js +1 -0
- package/dist/browser/loadBalancerStrategies/balancedStrategy.js.map +1 -1
- package/dist/browser/loadBalancerStrategies/greedyStrategy.js +1 -0
- package/dist/browser/loadBalancerStrategies/greedyStrategy.js.map +1 -1
- package/dist/browser/managementClient.js +53 -19
- package/dist/browser/managementClient.js.map +1 -1
- package/dist/browser/partitionProcessor.js +5 -2
- package/dist/browser/partitionProcessor.js.map +1 -1
- package/dist/browser/partitionPump.js +15 -6
- package/dist/browser/partitionPump.js.map +1 -1
- package/dist/browser/partitionReceiver.js +30 -25
- package/dist/browser/partitionReceiver.js.map +1 -1
- package/dist/browser/pumpManager.js +3 -1
- package/dist/browser/pumpManager.js.map +1 -1
- package/dist/browser/util/delayWithoutThrow.js +1 -1
- package/dist/browser/util/delayWithoutThrow.js.map +1 -1
- package/dist/commonjs/batchingPartitionChannel.js +23 -17
- package/dist/commonjs/batchingPartitionChannel.js.map +1 -1
- package/dist/commonjs/connectionContext.js +18 -32
- package/dist/commonjs/connectionContext.js.map +1 -1
- package/dist/commonjs/diagnostics/instrumentEventData.js +6 -7
- package/dist/commonjs/diagnostics/instrumentEventData.js.map +1 -1
- package/dist/commonjs/eventData.js +6 -4
- package/dist/commonjs/eventData.js.map +1 -1
- package/dist/commonjs/eventDataAdapter.js +5 -2
- package/dist/commonjs/eventDataAdapter.js.map +1 -1
- package/dist/commonjs/eventDataBatch.js +61 -9
- package/dist/commonjs/eventDataBatch.js.map +1 -1
- package/dist/commonjs/eventHubBufferedProducerClient.js +65 -50
- package/dist/commonjs/eventHubBufferedProducerClient.js.map +1 -1
- package/dist/commonjs/eventHubConsumerClient.js +70 -24
- package/dist/commonjs/eventHubConsumerClient.js.map +1 -1
- package/dist/commonjs/eventHubProducerClient.js +58 -15
- package/dist/commonjs/eventHubProducerClient.js.map +1 -1
- package/dist/commonjs/eventHubSender.js +118 -35
- package/dist/commonjs/eventHubSender.js.map +1 -1
- package/dist/commonjs/eventProcessor.js +27 -5
- package/dist/commonjs/eventProcessor.js.map +1 -1
- package/dist/commonjs/impl/awaitableQueue.js +6 -2
- package/dist/commonjs/impl/awaitableQueue.js.map +1 -1
- package/dist/commonjs/impl/partitionAssigner.js +2 -4
- package/dist/commonjs/impl/partitionAssigner.js.map +1 -1
- package/dist/commonjs/impl/partitionGate.js +1 -3
- package/dist/commonjs/impl/partitionGate.js.map +1 -1
- package/dist/commonjs/inMemoryCheckpointStore.js +10 -8
- package/dist/commonjs/inMemoryCheckpointStore.js.map +1 -1
- package/dist/commonjs/loadBalancerStrategies/balancedStrategy.js +1 -0
- package/dist/commonjs/loadBalancerStrategies/balancedStrategy.js.map +1 -1
- package/dist/commonjs/loadBalancerStrategies/greedyStrategy.js +1 -0
- package/dist/commonjs/loadBalancerStrategies/greedyStrategy.js.map +1 -1
- package/dist/commonjs/managementClient.js +53 -19
- package/dist/commonjs/managementClient.js.map +1 -1
- package/dist/commonjs/partitionProcessor.js +5 -2
- package/dist/commonjs/partitionProcessor.js.map +1 -1
- package/dist/commonjs/partitionPump.js +15 -6
- package/dist/commonjs/partitionPump.js.map +1 -1
- package/dist/commonjs/partitionReceiver.js +30 -25
- package/dist/commonjs/partitionReceiver.js.map +1 -1
- package/dist/commonjs/pumpManager.js +3 -1
- package/dist/commonjs/pumpManager.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +11 -11
- package/dist/commonjs/util/delayWithoutThrow.js +1 -1
- package/dist/commonjs/util/delayWithoutThrow.js.map +1 -1
- package/dist/esm/batchingPartitionChannel.js +23 -17
- package/dist/esm/batchingPartitionChannel.js.map +1 -1
- package/dist/esm/connectionContext.js +18 -32
- package/dist/esm/connectionContext.js.map +1 -1
- package/dist/esm/diagnostics/instrumentEventData.js +6 -7
- package/dist/esm/diagnostics/instrumentEventData.js.map +1 -1
- package/dist/esm/eventData.js +6 -4
- package/dist/esm/eventData.js.map +1 -1
- package/dist/esm/eventDataAdapter.js +5 -2
- package/dist/esm/eventDataAdapter.js.map +1 -1
- package/dist/esm/eventDataBatch.js +61 -9
- package/dist/esm/eventDataBatch.js.map +1 -1
- package/dist/esm/eventHubBufferedProducerClient.js +65 -50
- package/dist/esm/eventHubBufferedProducerClient.js.map +1 -1
- package/dist/esm/eventHubConsumerClient.js +70 -24
- package/dist/esm/eventHubConsumerClient.js.map +1 -1
- package/dist/esm/eventHubProducerClient.js +58 -15
- package/dist/esm/eventHubProducerClient.js.map +1 -1
- package/dist/esm/eventHubSender.js +118 -35
- package/dist/esm/eventHubSender.js.map +1 -1
- package/dist/esm/eventProcessor.js +27 -5
- package/dist/esm/eventProcessor.js.map +1 -1
- package/dist/esm/impl/awaitableQueue.js +6 -2
- package/dist/esm/impl/awaitableQueue.js.map +1 -1
- package/dist/esm/impl/partitionAssigner.js +2 -4
- package/dist/esm/impl/partitionAssigner.js.map +1 -1
- package/dist/esm/impl/partitionGate.js +1 -3
- package/dist/esm/impl/partitionGate.js.map +1 -1
- package/dist/esm/inMemoryCheckpointStore.js +10 -8
- package/dist/esm/inMemoryCheckpointStore.js.map +1 -1
- package/dist/esm/loadBalancerStrategies/balancedStrategy.js +1 -0
- package/dist/esm/loadBalancerStrategies/balancedStrategy.js.map +1 -1
- package/dist/esm/loadBalancerStrategies/greedyStrategy.js +1 -0
- package/dist/esm/loadBalancerStrategies/greedyStrategy.js.map +1 -1
- package/dist/esm/managementClient.js +53 -19
- package/dist/esm/managementClient.js.map +1 -1
- package/dist/esm/partitionProcessor.js +5 -2
- package/dist/esm/partitionProcessor.js.map +1 -1
- package/dist/esm/partitionPump.js +15 -6
- package/dist/esm/partitionPump.js.map +1 -1
- package/dist/esm/partitionReceiver.js +30 -25
- package/dist/esm/partitionReceiver.js.map +1 -1
- package/dist/esm/pumpManager.js +3 -1
- package/dist/esm/pumpManager.js.map +1 -1
- package/dist/esm/util/delayWithoutThrow.js +1 -1
- package/dist/esm/util/delayWithoutThrow.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managementClient.js","sourceRoot":"","sources":["../../src/managementClient.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { RetryConfig, RetryOptions, SendRequestOptions } from \"@azure/core-amqp\";\nimport {\n Constants,\n RequestResponseLink,\n RetryOperationType,\n defaultCancellableLock,\n isSasTokenProvider,\n retry,\n translate,\n} from \"@azure/core-amqp\";\nimport type { EventContext, Message, ReceiverOptions, SenderOptions } from \"rhea-promise\";\nimport { ReceiverEvents, SenderEvents } from \"rhea-promise\";\nimport type { SimpleLogger } from \"./logger.js\";\nimport {\n logErrorStackTrace,\n createSimpleLogger,\n logger,\n createManagementLogPrefix,\n} from \"./logger.js\";\nimport { throwErrorIfConnectionClosed, throwTypeErrorIfParameterMissing } from \"./util/error.js\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AccessToken } from \"@azure/core-auth\";\nimport type { ConnectionContext } from \"./connectionContext.js\";\nimport type { OperationOptions } from \"./util/operationOptions.js\";\nimport { toSpanOptions, tracingClient } from \"./diagnostics/tracing.js\";\nimport { getRetryAttemptTimeoutInMs } from \"./util/retries.js\";\nimport type { TimerLoop } from \"./util/timerLoop.js\";\nimport { withAuth } from \"./withAuth.js\";\nimport { getRandomName } from \"./util/utils.js\";\n\n/**\n * Describes the runtime information of an Event Hub.\n */\nexport interface EventHubProperties {\n /**\n * The name of the event hub.\n */\n name: string;\n /**\n * The date and time the hub was created in UTC.\n */\n createdOn: Date;\n /**\n * The slice of string partition identifiers.\n */\n partitionIds: string[];\n /**\n * Whether the hub has geographical disaster recovery enabled.\n */\n isGeoDrEnabled: boolean;\n}\n\n/**\n * Describes the runtime information of an EventHub Partition.\n */\nexport interface PartitionProperties {\n /**\n * The name of the Event Hub.\n */\n eventHubName: string;\n /**\n * Identifier of the partition within the Event Hub.\n */\n partitionId: string;\n /**\n * The starting sequence number of the partition's message log.\n */\n beginningSequenceNumber: number;\n /**\n * The last sequence number of the partition's message log.\n */\n lastEnqueuedSequenceNumber: number;\n /**\n * The offset of the last enqueued message in the partition's message log.\n */\n lastEnqueuedOffset: string;\n /**\n * The time of the last enqueued message in the partition's message log in UTC.\n */\n lastEnqueuedOnUtc: Date;\n /**\n * Indicates whether the partition is empty.\n */\n isEmpty: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ManagementClientOptions {\n address?: string;\n audience?: string;\n}\n\n/**\n * @internal\n * Describes the EventHubs Management Client that talks\n * to the $management endpoint over AMQP connection.\n */\nexport class ManagementClient {\n readonly managementLock: string = getRandomName(Constants.managementRequestKey);\n /**\n * The name/path of the entity (hub name) for which the management\n * request needs to be made.\n */\n private readonly entityPath: string;\n /**\n * The reply to Guid for the management client.\n */\n private readonly replyTo: string = getRandomName();\n /**\n * $management sender, receiver on the same session.\n */\n private _mgmtReqResLink?: RequestResponseLink;\n /**\n * The address in the following form:\n * `\"$management\"`.\n */\n private readonly address: string;\n /**\n * The token audience in the following form:\n * `\"sb://<your-namespace>.servicebus.windows.net/<event-hub-name>/$management\"`.\n */\n private readonly audience: string;\n /**\n * Provides relevant information about the amqp connection,\n * cbs and $management sessions, token provider, sender and receivers.\n */\n private readonly _context: ConnectionContext;\n /**\n * The authentication loop that keeps the token refreshed.\n */\n private authLoop?: TimerLoop;\n private readonly logger: SimpleLogger;\n\n /**\n * Instantiates the management client.\n * @param context - The connection context.\n * @param address - The address for the management endpoint. For IotHub it will be\n * `/messages/events/$management`.\n */\n constructor(context: ConnectionContext, { address, audience }: ManagementClientOptions = {}) {\n this.address = address ?? Constants.management;\n this.audience = audience ?? context.config.getManagementAudience();\n this._context = context;\n const logPrefix = createManagementLogPrefix(this._context.connectionId);\n this.logger = createSimpleLogger(logger, logPrefix);\n this.entityPath = context.config.entityPath as string;\n }\n\n /**\n * Gets the security token for the management application properties.\n * @internal\n */\n async getSecurityToken(): Promise<AccessToken | null> {\n if (isSasTokenProvider(this._context.tokenCredential)) {\n // the security_token has the $management address removed from the end of the audience\n // expected audience: sb://fully.qualified.namespace/event-hub-name/$management\n const audienceParts = this.audience.split(\"/\");\n // for management links, address should be '$management'\n if (audienceParts[audienceParts.length - 1] === this.address) {\n audienceParts.pop();\n }\n const audience = audienceParts.join(\"/\");\n return this._context.tokenCredential.getToken(audience);\n }\n\n // aad credentials use the aad scope\n return this._context.tokenCredential.getToken(Constants.aadEventHubsScope);\n }\n\n /**\n * Provides the eventhub runtime information.\n */\n async getEventHubProperties(\n options: OperationOptions & { retryOptions?: RetryOptions } = {},\n ): Promise<EventHubProperties> {\n throwErrorIfConnectionClosed(this._context);\n return tracingClient.withSpan(\n \"ManagementClient.getEventHubProperties\",\n options,\n async (updatedOptions) => {\n try {\n const securityToken = await this.getSecurityToken();\n\n const request: Message = {\n body: Buffer.from(JSON.stringify([])),\n message_id: getRandomName(),\n reply_to: this.replyTo,\n application_properties: {\n operation: Constants.readOperation,\n name: this.entityPath as string,\n type: `${Constants.vendorString}:${Constants.eventHub}`,\n security_token: securityToken?.token,\n },\n };\n\n const info: any = await this._makeManagementRequest(request, {\n ...updatedOptions,\n requestName: \"getHubRuntimeInformation\",\n });\n const runtimeInfo: EventHubProperties = {\n name: info.name,\n createdOn: new Date(info.created_at),\n partitionIds: info.partition_ids,\n isGeoDrEnabled: info.georeplication_factor > 1,\n };\n logger.verbose(\"the hub runtime info is: %O\", runtimeInfo);\n\n return runtimeInfo;\n } catch (error: any) {\n logger.warning(\n `an error occurred while getting the hub runtime information: ${error?.name}: ${error?.message}`,\n );\n logErrorStackTrace(error);\n throw error;\n }\n },\n toSpanOptions(this._context.config),\n );\n }\n\n /**\n * Provides information about the specified partition.\n * @param partitionId - Partition ID for which partition information is required.\n */\n async getPartitionProperties(\n partitionId: string,\n options: OperationOptions & { retryOptions?: RetryOptions } = {},\n ): Promise<PartitionProperties> {\n throwErrorIfConnectionClosed(this._context);\n throwTypeErrorIfParameterMissing(\n this._context.connectionId,\n \"getPartitionProperties\",\n \"partitionId\",\n partitionId,\n );\n partitionId = String(partitionId);\n\n return tracingClient.withSpan(\n \"ManagementClient.getPartitionProperties\",\n options,\n async (updatedOptions) => {\n try {\n const securityToken = await this.getSecurityToken();\n const request: Message = {\n body: Buffer.from(JSON.stringify([])),\n message_id: getRandomName(),\n reply_to: this.replyTo,\n application_properties: {\n operation: Constants.readOperation,\n name: this.entityPath as string,\n type: `${Constants.vendorString}:${Constants.partition}`,\n partition: `${partitionId}`,\n security_token: securityToken?.token,\n },\n };\n\n const info: any = await this._makeManagementRequest(request, {\n ...updatedOptions,\n requestName: \"getPartitionInformation\",\n });\n\n const partitionInfo: PartitionProperties = {\n beginningSequenceNumber: info.begin_sequence_number,\n eventHubName: info.name,\n lastEnqueuedOffset: info.last_enqueued_offset,\n lastEnqueuedOnUtc: new Date(info.last_enqueued_time_utc),\n lastEnqueuedSequenceNumber: info.last_enqueued_sequence_number,\n partitionId: info.partition,\n isEmpty: info.is_partition_empty,\n };\n logger.verbose(\"the partition info is: %O.\", partitionInfo);\n return partitionInfo;\n } catch (error: any) {\n logger.warning(\n `an error occurred while getting the partition information: ${error?.name}: ${error?.message}`,\n );\n logErrorStackTrace(error);\n throw error;\n }\n },\n toSpanOptions(this._context.config),\n );\n }\n\n /**\n * Closes the AMQP management session to the Event Hub for this client,\n * returning a promise that will be resolved when disconnection is completed.\n */\n async close(): Promise<void> {\n try {\n // Always stop the auth loop when closing the management link.\n this.authLoop?.stop();\n if (this._isMgmtRequestResponseLinkOpen()) {\n const mgmtLink = this._mgmtReqResLink;\n this._mgmtReqResLink = undefined;\n await mgmtLink!.close();\n logger.info(\"successfully closed the management session.\");\n }\n } catch (err: any) {\n const msg = `an error occurred while closing the management session: ${err?.name}: ${err?.message}`;\n logger.warning(msg);\n logErrorStackTrace(err);\n throw new Error(msg);\n }\n }\n\n private async _init({\n abortSignal,\n timeoutInMs,\n }: {\n abortSignal: AbortSignalLike | undefined;\n timeoutInMs: number;\n }): Promise<void> {\n const createLink = async () => {\n const rxopt: ReceiverOptions = {\n source: { address: this.address },\n name: this.replyTo,\n target: { address: this.replyTo },\n onSessionError: (context: EventContext) => {\n const ehError = translate(context.session!.error!);\n logger.verbose(\n \"an error occurred on the session for request/response links for \" + \"$management: %O\",\n ehError,\n );\n },\n };\n const sropt: SenderOptions = {\n target: { address: this.address },\n };\n logger.verbose(\n \"creating sender/receiver links with \" + \"srOpts: %o, receiverOpts: %O.\",\n sropt,\n rxopt,\n );\n this._mgmtReqResLink = await RequestResponseLink.create(\n this._context.connection,\n sropt,\n rxopt,\n { abortSignal },\n );\n this._mgmtReqResLink.sender.on(SenderEvents.senderError, (context: EventContext) => {\n const ehError = translate(context.sender!.error!);\n logger.verbose(\"an error occurred on the $management sender link.. %O\", ehError);\n });\n this._mgmtReqResLink.receiver.on(ReceiverEvents.receiverError, (context: EventContext) => {\n const ehError = translate(context.receiver!.error!);\n logger.verbose(\"an error occurred on the $management receiver link.. %O\", ehError);\n });\n logger.verbose(\n \"created sender '%s' and receiver '%s' links\",\n this._mgmtReqResLink.sender.name,\n this._mgmtReqResLink.receiver.name,\n );\n };\n try {\n if (!this._isMgmtRequestResponseLinkOpen()) {\n // Wait for the connectionContext to be ready to open the link.\n await this._context.readyToOpenLink();\n this.authLoop = await withAuth(\n createLink,\n this._context,\n this.audience,\n timeoutInMs,\n this.logger,\n { abortSignal },\n );\n }\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n `an error occurred while establishing the links: ${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n }\n\n /**\n * Helper method to make the management request\n * @param request - The AMQP message to send\n * @param options - The options to use when sending a request over a $management link\n */\n private async _makeManagementRequest(\n request: Message,\n options: {\n retryOptions?: RetryOptions;\n abortSignal?: AbortSignalLike;\n requestName?: string;\n } = {},\n ): Promise<any> {\n const retryOptions = options.retryOptions || {};\n try {\n const abortSignal: AbortSignalLike | undefined = options && options.abortSignal;\n\n const sendOperationPromise = async (): Promise<Message> => {\n let count = 0;\n\n const retryTimeoutInMs = getRetryAttemptTimeoutInMs(options.retryOptions);\n let timeTakenByInit = 0;\n\n if (!this._isMgmtRequestResponseLinkOpen()) {\n logger.verbose(\"acquiring lock to get the management req res link.\");\n\n const initOperationStartTime = Date.now();\n try {\n await defaultCancellableLock.acquire(\n this.managementLock,\n () => {\n const acquireLockEndTime = Date.now();\n const timeoutInMs =\n retryTimeoutInMs - (acquireLockEndTime - initOperationStartTime);\n return this._init({ abortSignal, timeoutInMs });\n },\n { abortSignal, timeoutInMs: retryTimeoutInMs },\n );\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n \"an error occurred while creating the link: %s\",\n `${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n timeTakenByInit = Date.now() - initOperationStartTime;\n }\n\n const remainingOperationTimeoutInMs = retryTimeoutInMs - timeTakenByInit;\n\n const sendRequestOptions: SendRequestOptions = {\n abortSignal: options.abortSignal,\n requestName: options.requestName,\n timeoutInMs: remainingOperationTimeoutInMs,\n };\n\n count++;\n if (count !== 1) {\n // Generate a new message_id every time after the first attempt\n request.message_id = getRandomName();\n } else if (!request.message_id) {\n // Set the message_id in the first attempt only if it is not set\n request.message_id = getRandomName();\n }\n\n return this._mgmtReqResLink!.sendRequest(request, sendRequestOptions);\n };\n\n const config: RetryConfig<Message> = Object.defineProperties(\n {\n operation: sendOperationPromise,\n operationType: RetryOperationType.management,\n abortSignal: abortSignal,\n retryOptions: retryOptions,\n },\n {\n connectionId: {\n enumerable: true,\n get: () => {\n return this._context.connectionId;\n },\n },\n },\n ) as RetryConfig<Message>;\n return (await retry<Message>(config)).body;\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n \"an error occurred during send on management request-response link with address: %s\",\n `${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n }\n\n private _isMgmtRequestResponseLinkOpen(): boolean {\n return this._mgmtReqResLink! && this._mgmtReqResLink!.isOpen();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"managementClient.js","sourceRoot":"","sources":["../../src/managementClient.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAGlC,gDAQ0B;AAE1B,+CAA4D;AAE5D,2CAKqB;AACrB,8CAAiG;AAKjG,yDAAwE;AACxE,kDAA+D;AAE/D,+CAAyC;AACzC,8CAAgD;AAkEhD;;;;GAIG;AACH,MAAa,gBAAgB;IAClB,cAAc,GAAW,IAAA,wBAAa,EAAC,qBAAS,CAAC,oBAAoB,CAAC,CAAC;IAChF;;;OAGG;IACc,UAAU,CAAS;IACpC;;OAEG;IACc,OAAO,GAAW,IAAA,wBAAa,GAAE,CAAC;IACnD;;OAEG;IACK,eAAe,CAAuB;IAC9C;;;OAGG;IACc,OAAO,CAAS;IACjC;;;OAGG;IACc,QAAQ,CAAS;IAClC;;;OAGG;IACc,QAAQ,CAAoB;IAC7C;;OAEG;IACK,QAAQ,CAAa;IACZ,MAAM,CAAe;IAEtC;;;;;OAKG;IACH,YAAY,OAA0B,EAAE,EAAE,OAAO,EAAE,QAAQ,KAA8B,EAAE;QACzF,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,qBAAS,CAAC,UAAU,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QACnE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,MAAM,SAAS,GAAG,IAAA,qCAAyB,EAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,GAAG,IAAA,8BAAkB,EAAC,kBAAM,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAoB,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB;QACpB,IAAI,IAAA,8BAAkB,EAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtD,sFAAsF;YACtF,+EAA+E;YAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,wDAAwD;YACxD,IAAI,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7D,aAAa,CAAC,GAAG,EAAE,CAAC;YACtB,CAAC;YACD,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,oCAAoC;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,qBAAS,CAAC,iBAAiB,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CACzB,UAA8D,EAAE;QAEhE,IAAA,uCAA4B,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,0BAAa,CAAC,QAAQ,CAC3B,wCAAwC,EACxC,OAAO,EACP,KAAK,EAAE,cAAc,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAEpD,MAAM,OAAO,GAAY;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACrC,UAAU,EAAE,IAAA,wBAAa,GAAE;oBAC3B,QAAQ,EAAE,IAAI,CAAC,OAAO;oBACtB,sBAAsB,EAAE;wBACtB,SAAS,EAAE,qBAAS,CAAC,aAAa;wBAClC,IAAI,EAAE,IAAI,CAAC,UAAoB;wBAC/B,IAAI,EAAE,GAAG,qBAAS,CAAC,YAAY,IAAI,qBAAS,CAAC,QAAQ,EAAE;wBACvD,cAAc,EAAE,aAAa,EAAE,KAAK;qBACrC;iBACF,CAAC;gBAEF,MAAM,IAAI,GAAQ,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE;oBAC3D,GAAG,cAAc;oBACjB,WAAW,EAAE,0BAA0B;iBACxC,CAAC,CAAC;gBACH,MAAM,WAAW,GAAuB;oBACtC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;oBACpC,YAAY,EAAE,IAAI,CAAC,aAAa;oBAChC,cAAc,EAAE,IAAI,CAAC,qBAAqB,GAAG,CAAC;iBAC/C,CAAC;gBACF,kBAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,WAAW,CAAC,CAAC;gBAE3D,OAAO,WAAW,CAAC;YACrB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,kBAAM,CAAC,OAAO,CACZ,gEAAgE,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,OAAO,EAAE,CACjG,CAAC;gBACF,IAAA,8BAAkB,EAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,EACD,IAAA,0BAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CACpC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAC1B,WAAmB,EACnB,UAA8D,EAAE;QAEhE,IAAA,uCAA4B,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAA,2CAAgC,EAC9B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAC1B,wBAAwB,EACxB,aAAa,EACb,WAAW,CACZ,CAAC;QACF,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAElC,OAAO,0BAAa,CAAC,QAAQ,CAC3B,yCAAyC,EACzC,OAAO,EACP,KAAK,EAAE,cAAc,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpD,MAAM,OAAO,GAAY;oBACvB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACrC,UAAU,EAAE,IAAA,wBAAa,GAAE;oBAC3B,QAAQ,EAAE,IAAI,CAAC,OAAO;oBACtB,sBAAsB,EAAE;wBACtB,SAAS,EAAE,qBAAS,CAAC,aAAa;wBAClC,IAAI,EAAE,IAAI,CAAC,UAAoB;wBAC/B,IAAI,EAAE,GAAG,qBAAS,CAAC,YAAY,IAAI,qBAAS,CAAC,SAAS,EAAE;wBACxD,SAAS,EAAE,GAAG,WAAW,EAAE;wBAC3B,cAAc,EAAE,aAAa,EAAE,KAAK;qBACrC;iBACF,CAAC;gBAEF,MAAM,IAAI,GAAQ,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE;oBAC3D,GAAG,cAAc;oBACjB,WAAW,EAAE,yBAAyB;iBACvC,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAwB;oBACzC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB;oBACnD,YAAY,EAAE,IAAI,CAAC,IAAI;oBACvB,kBAAkB,EAAE,IAAI,CAAC,oBAAoB;oBAC7C,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;oBACxD,0BAA0B,EAAE,IAAI,CAAC,6BAA6B;oBAC9D,WAAW,EAAE,IAAI,CAAC,SAAS;oBAC3B,OAAO,EAAE,IAAI,CAAC,kBAAkB;iBACjC,CAAC;gBACF,kBAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAC;gBAC5D,OAAO,aAAa,CAAC;YACvB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,kBAAM,CAAC,OAAO,CACZ,8DAA8D,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE,OAAO,EAAE,CAC/F,CAAC;gBACF,IAAA,8BAAkB,EAAC,KAAK,CAAC,CAAC;gBAC1B,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,EACD,IAAA,0BAAa,EAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CACpC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,8DAA8D;YAC9D,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,8BAA8B,EAAE,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;gBACtC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;gBACjC,MAAM,QAAS,CAAC,KAAK,EAAE,CAAC;gBACxB,kBAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,2DAA2D,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC;YACpG,kBAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpB,IAAA,8BAAkB,EAAC,GAAG,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,EAClB,WAAW,EACX,WAAW,GAIZ;QACC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;YAC5B,MAAM,KAAK,GAAoB;gBAC7B,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;gBACjC,IAAI,EAAE,IAAI,CAAC,OAAO;gBAClB,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;gBACjC,cAAc,EAAE,CAAC,OAAqB,EAAE,EAAE;oBACxC,MAAM,OAAO,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,OAAQ,CAAC,KAAM,CAAC,CAAC;oBACnD,kBAAM,CAAC,OAAO,CACZ,kEAAkE,GAAG,iBAAiB,EACtF,OAAO,CACR,CAAC;gBACJ,CAAC;aACF,CAAC;YACF,MAAM,KAAK,GAAkB;gBAC3B,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;aAClC,CAAC;YACF,kBAAM,CAAC,OAAO,CACZ,sCAAsC,GAAG,+BAA+B,EACxE,KAAK,EACL,KAAK,CACN,CAAC;YACF,IAAI,CAAC,eAAe,GAAG,MAAM,+BAAmB,CAAC,MAAM,CACrD,IAAI,CAAC,QAAQ,CAAC,UAAU,EACxB,KAAK,EACL,KAAK,EACL,EAAE,WAAW,EAAE,CAChB,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,2BAAY,CAAC,WAAW,EAAE,CAAC,OAAqB,EAAE,EAAE;gBACjF,MAAM,OAAO,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,MAAO,CAAC,KAAM,CAAC,CAAC;gBAClD,kBAAM,CAAC,OAAO,CAAC,uDAAuD,EAAE,OAAO,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,6BAAc,CAAC,aAAa,EAAE,CAAC,OAAqB,EAAE,EAAE;gBACvF,MAAM,OAAO,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,QAAS,CAAC,KAAM,CAAC,CAAC;gBACpD,kBAAM,CAAC,OAAO,CAAC,yDAAyD,EAAE,OAAO,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,kBAAM,CAAC,OAAO,CACZ,6CAA6C,EAC7C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAChC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CACnC,CAAC;QACJ,CAAC,CAAC;QACF,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,CAAC;gBAC3C,+DAA+D;gBAC/D,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAA,sBAAQ,EAC5B,UAAU,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,QAAQ,EACb,WAAW,EACX,IAAI,CAAC,MAAM,EACX,EAAE,WAAW,EAAE,CAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,eAAe,GAAG,IAAA,qBAAS,EAAC,GAAG,CAAC,CAAC;YACvC,kBAAM,CAAC,OAAO,CACZ,mDAAmD,eAAe,EAAE,IAAI,KAAK,eAAe,EAAE,OAAO,EAAE,CACxG,CAAC;YACF,IAAA,8BAAkB,EAAC,eAAe,CAAC,CAAC;YACpC,MAAM,eAAe,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,sBAAsB,CAClC,OAAgB,EAChB,UAII,EAAE;QAEN,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,WAAW,GAAgC,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;YAEhF,MAAM,oBAAoB,GAAG,KAAK,IAAsB,EAAE;gBACxD,IAAI,KAAK,GAAG,CAAC,CAAC;gBAEd,MAAM,gBAAgB,GAAG,IAAA,uCAA0B,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC;gBAC1E,IAAI,eAAe,GAAG,CAAC,CAAC;gBAExB,IAAI,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,CAAC;oBAC3C,kBAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;oBAErE,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,kCAAsB,CAAC,OAAO,CAClC,IAAI,CAAC,cAAc,EACnB,GAAG,EAAE;4BACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BACtC,MAAM,WAAW,GACf,gBAAgB,GAAG,CAAC,kBAAkB,GAAG,sBAAsB,CAAC,CAAC;4BACnE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;wBAClD,CAAC,EACD,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAC/C,CAAC;oBACJ,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,eAAe,GAAG,IAAA,qBAAS,EAAC,GAAG,CAAC,CAAC;wBACvC,kBAAM,CAAC,OAAO,CACZ,+CAA+C,EAC/C,GAAG,eAAe,EAAE,IAAI,KAAK,eAAe,EAAE,OAAO,EAAE,CACxD,CAAC;wBACF,IAAA,8BAAkB,EAAC,eAAe,CAAC,CAAC;wBACpC,MAAM,eAAe,CAAC;oBACxB,CAAC;oBACD,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,sBAAsB,CAAC;gBACxD,CAAC;gBAED,MAAM,6BAA6B,GAAG,gBAAgB,GAAG,eAAe,CAAC;gBAEzE,MAAM,kBAAkB,GAAuB;oBAC7C,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,WAAW,EAAE,6BAA6B;iBAC3C,CAAC;gBAEF,KAAK,EAAE,CAAC;gBACR,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,+DAA+D;oBAC/D,OAAO,CAAC,UAAU,GAAG,IAAA,wBAAa,GAAE,CAAC;gBACvC,CAAC;qBAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;oBAC/B,gEAAgE;oBAChE,OAAO,CAAC,UAAU,GAAG,IAAA,wBAAa,GAAE,CAAC;gBACvC,CAAC;gBAED,OAAO,IAAI,CAAC,eAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;YACxE,CAAC,CAAC;YAEF,MAAM,MAAM,GAAyB,MAAM,CAAC,gBAAgB,CAC1D;gBACE,SAAS,EAAE,oBAAoB;gBAC/B,aAAa,EAAE,8BAAkB,CAAC,UAAU;gBAC5C,WAAW,EAAE,WAAW;gBACxB,YAAY,EAAE,YAAY;aAC3B,EACD;gBACE,YAAY,EAAE;oBACZ,UAAU,EAAE,IAAI;oBAChB,GAAG,EAAE,GAAG,EAAE;wBACR,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;oBACpC,CAAC;iBACF;aACF,CACsB,CAAC;YAC1B,OAAO,CAAC,MAAM,IAAA,iBAAK,EAAU,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,eAAe,GAAG,IAAA,qBAAS,EAAC,GAAG,CAAC,CAAC;YACvC,kBAAM,CAAC,OAAO,CACZ,oFAAoF,EACpF,GAAG,eAAe,EAAE,IAAI,KAAK,eAAe,EAAE,OAAO,EAAE,CACxD,CAAC;YACF,IAAA,8BAAkB,EAAC,eAAe,CAAC,CAAC;YACpC,MAAM,eAAe,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,8BAA8B;QACpC,OAAO,IAAI,CAAC,eAAgB,IAAI,IAAI,CAAC,eAAgB,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;CACF;AA7XD,4CA6XC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { RetryConfig, RetryOptions, SendRequestOptions } from \"@azure/core-amqp\";\nimport {\n Constants,\n RequestResponseLink,\n RetryOperationType,\n defaultCancellableLock,\n isSasTokenProvider,\n retry,\n translate,\n} from \"@azure/core-amqp\";\nimport type { EventContext, Message, ReceiverOptions, SenderOptions } from \"rhea-promise\";\nimport { ReceiverEvents, SenderEvents } from \"rhea-promise\";\nimport type { SimpleLogger } from \"./logger.js\";\nimport {\n logErrorStackTrace,\n createSimpleLogger,\n logger,\n createManagementLogPrefix,\n} from \"./logger.js\";\nimport { throwErrorIfConnectionClosed, throwTypeErrorIfParameterMissing } from \"./util/error.js\";\nimport type { AbortSignalLike } from \"@azure/abort-controller\";\nimport type { AccessToken } from \"@azure/core-auth\";\nimport type { ConnectionContext } from \"./connectionContext.js\";\nimport type { OperationOptions } from \"./util/operationOptions.js\";\nimport { toSpanOptions, tracingClient } from \"./diagnostics/tracing.js\";\nimport { getRetryAttemptTimeoutInMs } from \"./util/retries.js\";\nimport type { TimerLoop } from \"./util/timerLoop.js\";\nimport { withAuth } from \"./withAuth.js\";\nimport { getRandomName } from \"./util/utils.js\";\n\n/**\n * Describes the runtime information of an Event Hub.\n */\nexport interface EventHubProperties {\n /**\n * The name of the event hub.\n */\n name: string;\n /**\n * The date and time the hub was created in UTC.\n */\n createdOn: Date;\n /**\n * The slice of string partition identifiers.\n */\n partitionIds: string[];\n /**\n * Whether the hub has geographical disaster recovery enabled.\n */\n isGeoDrEnabled: boolean;\n}\n\n/**\n * Describes the runtime information of an EventHub Partition.\n */\nexport interface PartitionProperties {\n /**\n * The name of the Event Hub.\n */\n eventHubName: string;\n /**\n * Identifier of the partition within the Event Hub.\n */\n partitionId: string;\n /**\n * The starting sequence number of the partition's message log.\n */\n beginningSequenceNumber: number;\n /**\n * The last sequence number of the partition's message log.\n */\n lastEnqueuedSequenceNumber: number;\n /**\n * The offset of the last enqueued message in the partition's message log.\n */\n lastEnqueuedOffset: string;\n /**\n * The time of the last enqueued message in the partition's message log in UTC.\n */\n lastEnqueuedOnUtc: Date;\n /**\n * Indicates whether the partition is empty.\n */\n isEmpty: boolean;\n}\n\n/**\n * @internal\n */\nexport interface ManagementClientOptions {\n address?: string;\n audience?: string;\n}\n\n/**\n * @internal\n * Describes the EventHubs Management Client that talks\n * to the $management endpoint over AMQP connection.\n */\nexport class ManagementClient {\n readonly managementLock: string = getRandomName(Constants.managementRequestKey);\n /**\n * The name/path of the entity (hub name) for which the management\n * request needs to be made.\n */\n private readonly entityPath: string;\n /**\n * The reply to Guid for the management client.\n */\n private readonly replyTo: string = getRandomName();\n /**\n * $management sender, receiver on the same session.\n */\n private _mgmtReqResLink?: RequestResponseLink;\n /**\n * The address in the following form:\n * `\"$management\"`.\n */\n private readonly address: string;\n /**\n * The token audience in the following form:\n * `\"sb://<your-namespace>.servicebus.windows.net/<event-hub-name>/$management\"`.\n */\n private readonly audience: string;\n /**\n * Provides relevant information about the amqp connection,\n * cbs and $management sessions, token provider, sender and receivers.\n */\n private readonly _context: ConnectionContext;\n /**\n * The authentication loop that keeps the token refreshed.\n */\n private authLoop?: TimerLoop;\n private readonly logger: SimpleLogger;\n\n /**\n * Instantiates the management client.\n * @param context - The connection context.\n * @param address - The address for the management endpoint. For IotHub it will be\n * `/messages/events/$management`.\n */\n constructor(context: ConnectionContext, { address, audience }: ManagementClientOptions = {}) {\n this.address = address ?? Constants.management;\n this.audience = audience ?? context.config.getManagementAudience();\n this._context = context;\n const logPrefix = createManagementLogPrefix(this._context.connectionId);\n this.logger = createSimpleLogger(logger, logPrefix);\n this.entityPath = context.config.entityPath as string;\n }\n\n /**\n * Gets the security token for the management application properties.\n * @internal\n */\n async getSecurityToken(): Promise<AccessToken | null> {\n if (isSasTokenProvider(this._context.tokenCredential)) {\n // the security_token has the $management address removed from the end of the audience\n // expected audience: sb://fully.qualified.namespace/event-hub-name/$management\n const audienceParts = this.audience.split(\"/\");\n // for management links, address should be '$management'\n if (audienceParts[audienceParts.length - 1] === this.address) {\n audienceParts.pop();\n }\n const audience = audienceParts.join(\"/\");\n return this._context.tokenCredential.getToken(audience);\n }\n\n // aad credentials use the aad scope\n return this._context.tokenCredential.getToken(Constants.aadEventHubsScope);\n }\n\n /**\n * Provides the eventhub runtime information.\n */\n async getEventHubProperties(\n options: OperationOptions & { retryOptions?: RetryOptions } = {},\n ): Promise<EventHubProperties> {\n throwErrorIfConnectionClosed(this._context);\n return tracingClient.withSpan(\n \"ManagementClient.getEventHubProperties\",\n options,\n async (updatedOptions) => {\n try {\n const securityToken = await this.getSecurityToken();\n\n const request: Message = {\n body: Buffer.from(JSON.stringify([])),\n message_id: getRandomName(),\n reply_to: this.replyTo,\n application_properties: {\n operation: Constants.readOperation,\n name: this.entityPath as string,\n type: `${Constants.vendorString}:${Constants.eventHub}`,\n security_token: securityToken?.token,\n },\n };\n\n const info: any = await this._makeManagementRequest(request, {\n ...updatedOptions,\n requestName: \"getHubRuntimeInformation\",\n });\n const runtimeInfo: EventHubProperties = {\n name: info.name,\n createdOn: new Date(info.created_at),\n partitionIds: info.partition_ids,\n isGeoDrEnabled: info.georeplication_factor > 1,\n };\n logger.verbose(\"the hub runtime info is: %O\", runtimeInfo);\n\n return runtimeInfo;\n } catch (error: any) {\n logger.warning(\n `an error occurred while getting the hub runtime information: ${error?.name}: ${error?.message}`,\n );\n logErrorStackTrace(error);\n throw error;\n }\n },\n toSpanOptions(this._context.config),\n );\n }\n\n /**\n * Provides information about the specified partition.\n * @param partitionId - Partition ID for which partition information is required.\n */\n async getPartitionProperties(\n partitionId: string,\n options: OperationOptions & { retryOptions?: RetryOptions } = {},\n ): Promise<PartitionProperties> {\n throwErrorIfConnectionClosed(this._context);\n throwTypeErrorIfParameterMissing(\n this._context.connectionId,\n \"getPartitionProperties\",\n \"partitionId\",\n partitionId,\n );\n partitionId = String(partitionId);\n\n return tracingClient.withSpan(\n \"ManagementClient.getPartitionProperties\",\n options,\n async (updatedOptions) => {\n try {\n const securityToken = await this.getSecurityToken();\n const request: Message = {\n body: Buffer.from(JSON.stringify([])),\n message_id: getRandomName(),\n reply_to: this.replyTo,\n application_properties: {\n operation: Constants.readOperation,\n name: this.entityPath as string,\n type: `${Constants.vendorString}:${Constants.partition}`,\n partition: `${partitionId}`,\n security_token: securityToken?.token,\n },\n };\n\n const info: any = await this._makeManagementRequest(request, {\n ...updatedOptions,\n requestName: \"getPartitionInformation\",\n });\n\n const partitionInfo: PartitionProperties = {\n beginningSequenceNumber: info.begin_sequence_number,\n eventHubName: info.name,\n lastEnqueuedOffset: info.last_enqueued_offset,\n lastEnqueuedOnUtc: new Date(info.last_enqueued_time_utc),\n lastEnqueuedSequenceNumber: info.last_enqueued_sequence_number,\n partitionId: info.partition,\n isEmpty: info.is_partition_empty,\n };\n logger.verbose(\"the partition info is: %O.\", partitionInfo);\n return partitionInfo;\n } catch (error: any) {\n logger.warning(\n `an error occurred while getting the partition information: ${error?.name}: ${error?.message}`,\n );\n logErrorStackTrace(error);\n throw error;\n }\n },\n toSpanOptions(this._context.config),\n );\n }\n\n /**\n * Closes the AMQP management session to the Event Hub for this client,\n * returning a promise that will be resolved when disconnection is completed.\n */\n async close(): Promise<void> {\n try {\n // Always stop the auth loop when closing the management link.\n this.authLoop?.stop();\n if (this._isMgmtRequestResponseLinkOpen()) {\n const mgmtLink = this._mgmtReqResLink;\n this._mgmtReqResLink = undefined;\n await mgmtLink!.close();\n logger.info(\"successfully closed the management session.\");\n }\n } catch (err: any) {\n const msg = `an error occurred while closing the management session: ${err?.name}: ${err?.message}`;\n logger.warning(msg);\n logErrorStackTrace(err);\n throw new Error(msg);\n }\n }\n\n private async _init({\n abortSignal,\n timeoutInMs,\n }: {\n abortSignal: AbortSignalLike | undefined;\n timeoutInMs: number;\n }): Promise<void> {\n const createLink = async () => {\n const rxopt: ReceiverOptions = {\n source: { address: this.address },\n name: this.replyTo,\n target: { address: this.replyTo },\n onSessionError: (context: EventContext) => {\n const ehError = translate(context.session!.error!);\n logger.verbose(\n \"an error occurred on the session for request/response links for \" + \"$management: %O\",\n ehError,\n );\n },\n };\n const sropt: SenderOptions = {\n target: { address: this.address },\n };\n logger.verbose(\n \"creating sender/receiver links with \" + \"srOpts: %o, receiverOpts: %O.\",\n sropt,\n rxopt,\n );\n this._mgmtReqResLink = await RequestResponseLink.create(\n this._context.connection,\n sropt,\n rxopt,\n { abortSignal },\n );\n this._mgmtReqResLink.sender.on(SenderEvents.senderError, (context: EventContext) => {\n const ehError = translate(context.sender!.error!);\n logger.verbose(\"an error occurred on the $management sender link.. %O\", ehError);\n });\n this._mgmtReqResLink.receiver.on(ReceiverEvents.receiverError, (context: EventContext) => {\n const ehError = translate(context.receiver!.error!);\n logger.verbose(\"an error occurred on the $management receiver link.. %O\", ehError);\n });\n logger.verbose(\n \"created sender '%s' and receiver '%s' links\",\n this._mgmtReqResLink.sender.name,\n this._mgmtReqResLink.receiver.name,\n );\n };\n try {\n if (!this._isMgmtRequestResponseLinkOpen()) {\n // Wait for the connectionContext to be ready to open the link.\n await this._context.readyToOpenLink();\n this.authLoop = await withAuth(\n createLink,\n this._context,\n this.audience,\n timeoutInMs,\n this.logger,\n { abortSignal },\n );\n }\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n `an error occurred while establishing the links: ${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n }\n\n /**\n * Helper method to make the management request\n * @param request - The AMQP message to send\n * @param options - The options to use when sending a request over a $management link\n */\n private async _makeManagementRequest(\n request: Message,\n options: {\n retryOptions?: RetryOptions;\n abortSignal?: AbortSignalLike;\n requestName?: string;\n } = {},\n ): Promise<any> {\n const retryOptions = options.retryOptions || {};\n try {\n const abortSignal: AbortSignalLike | undefined = options && options.abortSignal;\n\n const sendOperationPromise = async (): Promise<Message> => {\n let count = 0;\n\n const retryTimeoutInMs = getRetryAttemptTimeoutInMs(options.retryOptions);\n let timeTakenByInit = 0;\n\n if (!this._isMgmtRequestResponseLinkOpen()) {\n logger.verbose(\"acquiring lock to get the management req res link.\");\n\n const initOperationStartTime = Date.now();\n try {\n await defaultCancellableLock.acquire(\n this.managementLock,\n () => {\n const acquireLockEndTime = Date.now();\n const timeoutInMs =\n retryTimeoutInMs - (acquireLockEndTime - initOperationStartTime);\n return this._init({ abortSignal, timeoutInMs });\n },\n { abortSignal, timeoutInMs: retryTimeoutInMs },\n );\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n \"an error occurred while creating the link: %s\",\n `${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n timeTakenByInit = Date.now() - initOperationStartTime;\n }\n\n const remainingOperationTimeoutInMs = retryTimeoutInMs - timeTakenByInit;\n\n const sendRequestOptions: SendRequestOptions = {\n abortSignal: options.abortSignal,\n requestName: options.requestName,\n timeoutInMs: remainingOperationTimeoutInMs,\n };\n\n count++;\n if (count !== 1) {\n // Generate a new message_id every time after the first attempt\n request.message_id = getRandomName();\n } else if (!request.message_id) {\n // Set the message_id in the first attempt only if it is not set\n request.message_id = getRandomName();\n }\n\n return this._mgmtReqResLink!.sendRequest(request, sendRequestOptions);\n };\n\n const config: RetryConfig<Message> = Object.defineProperties(\n {\n operation: sendOperationPromise,\n operationType: RetryOperationType.management,\n abortSignal: abortSignal,\n retryOptions: retryOptions,\n },\n {\n connectionId: {\n enumerable: true,\n get: () => {\n return this._context.connectionId;\n },\n },\n },\n ) as RetryConfig<Message>;\n return (await retry<Message>(config)).body;\n } catch (err) {\n const translatedError = translate(err);\n logger.warning(\n \"an error occurred during send on management request-response link with address: %s\",\n `${translatedError?.name}: ${translatedError?.message}`,\n );\n logErrorStackTrace(translatedError);\n throw translatedError;\n }\n }\n\n private _isMgmtRequestResponseLinkOpen(): boolean {\n return this._mgmtReqResLink! && this._mgmtReqResLink!.isOpen();\n }\n}\n"]}
|
|
@@ -15,6 +15,10 @@ const logger_js_1 = require("./logger.js");
|
|
|
15
15
|
* @internal
|
|
16
16
|
*/
|
|
17
17
|
class PartitionProcessor {
|
|
18
|
+
_eventHandlers;
|
|
19
|
+
_checkpointStore;
|
|
20
|
+
_context;
|
|
21
|
+
_lastEnqueuedEventProperties;
|
|
18
22
|
constructor(_eventHandlers, _checkpointStore, _context) {
|
|
19
23
|
this._eventHandlers = _eventHandlers;
|
|
20
24
|
this._checkpointStore = _checkpointStore;
|
|
@@ -76,8 +80,7 @@ class PartitionProcessor {
|
|
|
76
80
|
* events are received.
|
|
77
81
|
*/
|
|
78
82
|
async initialize() {
|
|
79
|
-
|
|
80
|
-
return (_b = (_a = this._eventHandlers).processInitialize) === null || _b === void 0 ? void 0 : _b.call(_a, this);
|
|
83
|
+
return this._eventHandlers.processInitialize?.(this);
|
|
81
84
|
}
|
|
82
85
|
/**
|
|
83
86
|
* This method is called before the partition processor is closed by the EventProcessor.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partitionProcessor.js","sourceRoot":"","sources":["../../src/partitionProcessor.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAWlC,2CAAqC;AAyCrC;;;;;;;;;GASG;AACH,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"partitionProcessor.js","sourceRoot":"","sources":["../../src/partitionProcessor.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;;AAWlC,2CAAqC;AAyCrC;;;;;;;;;GASG;AACH,MAAa,kBAAkB;IAInB;IACA;IACA;IALF,4BAA4B,CAA+B;IAEnE,YACU,cAAyC,EACzC,gBAAiC,EACjC,QAEP;QAJO,mBAAc,GAAd,cAAc,CAA2B;QACzC,qBAAgB,GAAhB,gBAAgB,CAAiB;QACjC,aAAQ,GAAR,QAAQ,CAEf;IACA,CAAC;IAEJ;;;;;OAKG;IACH,IAAW,2BAA2B;QACpC,OAAO,IAAI,CAAC,4BAA6B,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,IAAW,2BAA2B,CAAC,UAAuC;QAC5E,IAAI,CAAC,4BAA4B,GAAG,UAAU,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAc,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,MAAmB;QAC7B,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CAAC,MAA2B;QAC7C,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,KAAY;QAC7B,IAAI,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,kBAAM,CAAC,OAAO,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,gBAAgB,CAAC,SAA4B;QACxD,MAAM,UAAU,GAAe;YAC7B,uBAAuB,EAAE,IAAI,CAAC,QAAQ,CAAC,uBAAuB;YAC9D,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;YACxC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC;QAEF,MAAM,IAAI,CAAC,gBAAiB,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;CACF;AAtID,gDAsIC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n BasicPartitionProperties,\n PartitionContext,\n SubscriptionEventHandlers,\n} from \"./eventHubConsumerClientModels.js\";\nimport type { CheckpointStore } from \"./eventProcessor.js\";\nimport type { CloseReason } from \"./models/public.js\";\nimport type { LastEnqueuedEventProperties } from \"./partitionReceiver.js\";\nimport type { ReceivedEventData } from \"./eventData.js\";\nimport { logger } from \"./logger.js\";\n\n/**\n * A checkpoint is meant to represent the last successfully processed event by the user from a particular\n * partition of a consumer group in an Event Hub instance.\n *\n * When the `updateCheckpoint()` method on the `PartitionProcessor` class is called by the user, a\n * `Checkpoint` is created internally. It is then stored in the storage solution implemented by the\n * `CheckpointManager` chosen by the user when creating an `EventProcessor`.\n *\n * Users are never expected to interact with `Checkpoint` directly. This interface exists to support the\n * internal workings of `EventProcessor` and `CheckpointManager`.\n **/\nexport interface Checkpoint {\n /**\n * The fully qualified Event Hubs namespace. This is likely to be similar to\n * <yournamespace>.servicebus.windows.net\n */\n fullyQualifiedNamespace: string;\n /**\n * The event hub name\n */\n eventHubName: string;\n /**\n * The consumer group name\n */\n consumerGroup: string;\n /**\n * The identifier of the Event Hub partition\n */\n partitionId: string;\n /**\n * The sequence number of the event\n */\n sequenceNumber: number;\n /**\n * The offset of the event.\n */\n offset: string;\n}\n\n/**\n * The `PartitionProcessor` is responsible for processing events received from Event Hubs when using `EventProcessor`\n *\n * The EventProcessor creates a new instance of the PartitionProcessor for each partition of the event hub it starts processing. When you extend the `PartitionProcessor` in order to customize it as you see fit,\n * - Override the `processEvents()` method to add the code to process the received events. This is also a good place to update the checkpoints using the `updateCheckpoint()` method\n * - Optionally override the `processError()` method to handle any error that might have occurred when processing the events.\n * - Optionally override the `initialize()` method to implement any set up related tasks you would want to carry out before starting to receive events from the partition\n * - Optionally override the `close()` method to implement any tear down or clean up tasks you would want to carry out.\n * @internal\n */\nexport class PartitionProcessor implements PartitionContext {\n private _lastEnqueuedEventProperties?: LastEnqueuedEventProperties;\n\n constructor(\n private _eventHandlers: SubscriptionEventHandlers,\n private _checkpointStore: CheckpointStore,\n private _context: BasicPartitionProperties & {\n eventProcessorId: string;\n },\n ) {}\n\n /**\n * Information on the last enqueued event in the partition that is being processed.\n * This property is updated by the `EventProcessor` if the `trackLastEnqueuedEventProperties` option is set to true\n * when creating an instance of EventProcessor\n * @readonly\n */\n public get lastEnqueuedEventProperties(): LastEnqueuedEventProperties {\n return this._lastEnqueuedEventProperties!;\n }\n\n /**\n * Information on the last enqueued event in the partition that is being processed.\n * This property is updated by the `EventProcessor` if the `trackLastEnqueuedEventProperties` option is set to true\n * when creating an instance of EventProcessor\n */\n public set lastEnqueuedEventProperties(properties: LastEnqueuedEventProperties) {\n this._lastEnqueuedEventProperties = properties;\n }\n\n /**\n * The fully qualified namespace from where the current partition is being processed. It is set by the `EventProcessor`\n * @readonly\n */\n public get fullyQualifiedNamespace(): string {\n return this._context.fullyQualifiedNamespace;\n }\n\n /**\n * The name of the consumer group from where the current partition is being processed. It is set by the `EventProcessor`\n * @readonly\n */\n public get consumerGroup(): string {\n return this._context.consumerGroup!;\n }\n\n /**\n * The name of the event hub to which the current partition belongs. It is set by the `EventProcessor`\n * @readonly\n */\n public get eventHubName(): string {\n return this._context.eventHubName;\n }\n\n /**\n * The identifier of the Event Hub partition that is being processed. It is set by the `EventProcessor`\n * @readonly\n */\n public get partitionId(): string {\n return this._context.partitionId;\n }\n\n /**\n * The unique identifier of the `EventProcessor` that has spawned the current instance of `PartitionProcessor`. This is set by the `EventProcessor`\n */\n public get eventProcessorId(): string {\n return this._context.eventProcessorId;\n }\n\n /**\n * This method is called when the `EventProcessor` takes ownership of a new partition and before any\n * events are received.\n */\n async initialize(): Promise<void> {\n return this._eventHandlers.processInitialize?.(this);\n }\n\n /**\n * This method is called before the partition processor is closed by the EventProcessor.\n *\n * @param reason - The reason for closing this partition processor.\n */\n async close(reason: CloseReason): Promise<void> {\n if (this._eventHandlers.processClose) {\n await this._eventHandlers.processClose(reason, this);\n }\n }\n\n /**\n * This method is called when new events are received.\n *\n * This is also a good place to update checkpoints as appropriate.\n *\n * @param event - The received events to be processed.\n */\n async processEvents(events: ReceivedEventData[]): Promise<void> {\n await this._eventHandlers.processEvents(events, this);\n }\n\n /**\n * This method is called when an error occurs while receiving events from Event Hubs.\n *\n * @param error - The error to be processed.\n */\n async processError(error: Error): Promise<void> {\n if (this._eventHandlers.processError) {\n try {\n await this._eventHandlers.processError(error, this);\n } catch (err: any) {\n logger.verbose(`Error thrown from user's processError handler : ${err}`);\n }\n }\n }\n\n /**\n * Updates the checkpoint using the event data.\n *\n * A checkpoint is meant to represent the last successfully processed event by the user from a particular\n * partition of a consumer group in an Event Hub instance.\n *\n * @param eventData - The event that you want to update the checkpoint with.\n */\n public async updateCheckpoint(eventData: ReceivedEventData): Promise<void> {\n const checkpoint: Checkpoint = {\n fullyQualifiedNamespace: this._context.fullyQualifiedNamespace,\n eventHubName: this._context.eventHubName,\n consumerGroup: this._context.consumerGroup,\n partitionId: this._context.partitionId,\n sequenceNumber: eventData.sequenceNumber,\n offset: eventData.offset,\n };\n\n await this._checkpointStore!.updateCheckpoint(checkpoint);\n }\n}\n"]}
|
|
@@ -13,11 +13,17 @@ const instrumentEventData_js_1 = require("./diagnostics/instrumentEventData.js")
|
|
|
13
13
|
* @internal
|
|
14
14
|
*/
|
|
15
15
|
class PartitionPump {
|
|
16
|
+
_context;
|
|
17
|
+
_startPosition;
|
|
18
|
+
_partitionProcessor;
|
|
19
|
+
_processorOptions;
|
|
20
|
+
_receiver;
|
|
21
|
+
_isReceiving = false;
|
|
22
|
+
_isStopped = false;
|
|
23
|
+
_abortController;
|
|
16
24
|
constructor(_context, partitionProcessor, _startPosition, options) {
|
|
17
25
|
this._context = _context;
|
|
18
26
|
this._startPosition = _startPosition;
|
|
19
|
-
this._isReceiving = false;
|
|
20
|
-
this._isStopped = false;
|
|
21
27
|
this._partitionProcessor = partitionProcessor;
|
|
22
28
|
this._processorOptions = options;
|
|
23
29
|
this._abortController = new AbortController();
|
|
@@ -127,7 +133,6 @@ class PartitionPump {
|
|
|
127
133
|
}
|
|
128
134
|
}
|
|
129
135
|
async stop(reason) {
|
|
130
|
-
var _a;
|
|
131
136
|
if (this._isStopped) {
|
|
132
137
|
return;
|
|
133
138
|
}
|
|
@@ -138,11 +143,11 @@ class PartitionPump {
|
|
|
138
143
|
// otherwise the receiver will remove the listener on the abortSignal
|
|
139
144
|
// before it has a chance to be emitted.
|
|
140
145
|
this._abortController.abort();
|
|
141
|
-
await
|
|
146
|
+
await this._receiver?.close();
|
|
142
147
|
await this._partitionProcessor.close(reason);
|
|
143
148
|
}
|
|
144
149
|
catch (err) {
|
|
145
|
-
logger_js_1.logger.warning(`An error occurred while closing the receiver: ${err
|
|
150
|
+
logger_js_1.logger.warning(`An error occurred while closing the receiver: ${err?.name}: ${err?.message}`);
|
|
146
151
|
(0, logger_js_1.logErrorStackTrace)(err);
|
|
147
152
|
this._partitionProcessor.processError(err);
|
|
148
153
|
throw err;
|
|
@@ -166,6 +171,10 @@ function toProcessingSpanOptions(receivedEvents, eventHubProperties) {
|
|
|
166
171
|
});
|
|
167
172
|
}
|
|
168
173
|
}
|
|
169
|
-
return
|
|
174
|
+
return {
|
|
175
|
+
spanLinks,
|
|
176
|
+
spanKind: "consumer",
|
|
177
|
+
...(0, tracing_js_1.toSpanOptions)(eventHubProperties, "process"),
|
|
178
|
+
};
|
|
170
179
|
}
|
|
171
180
|
//# sourceMappingURL=partitionPump.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"partitionPump.js","sourceRoot":"","sources":["../../src/partitionPump.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { TracingSpanOptions, TracingSpanLink } from \"@azure/core-tracing\";\nimport { logErrorStackTrace, logger } from \"./logger.js\";\nimport { CloseReason } from \"./models/public.js\";\nimport type { CommonEventProcessorOptions } from \"./models/private.js\";\nimport type { ConnectionContext } from \"./connectionContext.js\";\nimport type { EventHubConnectionConfig } from \"./eventhubConnectionConfig.js\";\nimport type { PartitionReceiver } from \"./partitionReceiver.js\";\nimport { createReceiver } from \"./partitionReceiver.js\";\nimport type { EventPosition } from \"./eventPosition.js\";\nimport type { MessagingError } from \"@azure/core-amqp\";\nimport type { PartitionProcessor } from \"./partitionProcessor.js\";\nimport type { ReceivedEventData } from \"./eventData.js\";\nimport { toSpanOptions, tracingClient } from \"./diagnostics/tracing.js\";\nimport { extractSpanContextFromEventData } from \"./diagnostics/instrumentEventData.js\";\n\n/**\n * @internal\n */\nexport class PartitionPump {\n private _partitionProcessor: PartitionProcessor;\n private _processorOptions: CommonEventProcessorOptions;\n private _receiver: PartitionReceiver | undefined;\n private _isReceiving: boolean = false;\n private _isStopped: boolean = false;\n private _abortController: AbortController;\n constructor(\n private _context: ConnectionContext,\n partitionProcessor: PartitionProcessor,\n private readonly _startPosition: EventPosition,\n options: CommonEventProcessorOptions,\n ) {\n this._partitionProcessor = partitionProcessor;\n this._processorOptions = options;\n this._abortController = new AbortController();\n }\n\n public get isReceiving(): boolean {\n return this._isReceiving;\n }\n\n async start(): Promise<void> {\n this._isReceiving = true;\n try {\n await this._partitionProcessor.initialize();\n } catch (err) {\n // swallow the error from the user-defined code\n this._partitionProcessor.processError(err as Error);\n }\n\n // this is intentionally not await'd - the _receiveEvents loop will continue to\n // execute and can be stopped by calling .stop()\n this._receiveEvents(this._partitionProcessor.partitionId);\n logger.info(\n `Successfully started the receiver for partition \"${this._partitionProcessor.partitionId}\".`,\n );\n }\n\n /**\n * Creates a new `PartitionReceiver` and replaces any existing receiver.\n * @param partitionId - The partition the receiver should read messages from.\n * @param lastSeenSequenceNumber - The sequence number to begin receiving messages from (exclusive).\n * If `-1`, then the PartitionPump's startPosition will be used instead.\n */\n private _setOrReplaceReceiver(\n partitionId: string,\n lastSeenSequenceNumber: number,\n ): PartitionReceiver {\n // Determine what the new EventPosition should be.\n // If this PartitionPump has received events, we'll start from the last\n // seen sequenceNumber (exclusive).\n // Otherwise, use the `_startPosition`.\n const currentEventPosition: EventPosition =\n lastSeenSequenceNumber >= 0\n ? {\n sequenceNumber: lastSeenSequenceNumber,\n isInclusive: false,\n }\n : this._startPosition;\n\n // Set or replace the PartitionPump's receiver.\n this._receiver = createReceiver(\n this._context,\n this._partitionProcessor.consumerGroup,\n this._partitionProcessor.eventProcessorId,\n partitionId,\n currentEventPosition,\n {\n ownerLevel: this._processorOptions.ownerLevel,\n trackLastEnqueuedEventProperties: this._processorOptions.trackLastEnqueuedEventProperties,\n retryOptions: this._processorOptions.retryOptions,\n skipParsingBodyAsJson: this._processorOptions.skipParsingBodyAsJson,\n prefetchCount: this._processorOptions.prefetchCount,\n },\n );\n\n return this._receiver;\n }\n\n private async _receiveEvents(partitionId: string): Promise<void> {\n let lastSeenSequenceNumber = -1;\n let receiver = this._setOrReplaceReceiver(partitionId, lastSeenSequenceNumber);\n\n while (this._isReceiving) {\n try {\n // Check if the receiver was closed so we can recreate it.\n if (receiver.isClosed) {\n receiver = this._setOrReplaceReceiver(partitionId, lastSeenSequenceNumber);\n }\n\n const receivedEvents = await receiver.receiveBatch(\n this._processorOptions.maxBatchSize,\n this._processorOptions.maxWaitTimeInSeconds,\n this._abortController.signal,\n );\n\n if (\n this._processorOptions.trackLastEnqueuedEventProperties &&\n receiver.lastEnqueuedEventProperties\n ) {\n this._partitionProcessor.lastEnqueuedEventProperties =\n receiver.lastEnqueuedEventProperties;\n }\n // avoid calling user's processEvents handler if the pump was stopped while receiving events\n if (!this._isReceiving) {\n return;\n }\n\n if (receivedEvents.length) {\n lastSeenSequenceNumber = receivedEvents[receivedEvents.length - 1].sequenceNumber;\n }\n\n await tracingClient.withSpan(\n \"PartitionPump.process\",\n {},\n () => this._partitionProcessor.processEvents(receivedEvents),\n toProcessingSpanOptions(receivedEvents, this._context.config),\n );\n } catch (err: any) {\n // check if this pump is still receiving\n // it may not be if the EventProcessor was stopped during processEvents\n if (!this._isReceiving) {\n // no longer receiving, so close was called from somewhere else\n return;\n }\n\n logger.warning(\n `An error was thrown while receiving or processing events on partition \"${this._partitionProcessor.partitionId}\"`,\n );\n logErrorStackTrace(err);\n // forward error to user's processError and swallow errors they may throw\n try {\n await this._partitionProcessor.processError(err as Error);\n } catch (errorFromUser) {\n // Using verbose over warning because this error is swallowed.\n logger.verbose(\"An error was thrown by user's processError method: \", errorFromUser);\n }\n\n // close the partition processor if a non-retryable error was encountered\n if (typeof err !== \"object\" || !(err as MessagingError).retryable) {\n try {\n // If the exception indicates that the partition was stolen (i.e some other consumer with same ownerlevel\n // started consuming the partition), update the closeReason\n if (err.code === \"ReceiverDisconnectedError\") {\n return await this.stop(CloseReason.OwnershipLost);\n }\n // this will close the pump and will break us out of the while loop\n return await this.stop(CloseReason.Shutdown);\n } catch (errorFromStop) {\n // Using verbose over warning because this error is swallowed.\n logger.verbose(\n `An error occurred while closing the receiver with reason ${CloseReason.Shutdown}: `,\n errorFromStop,\n );\n }\n }\n }\n }\n }\n\n async stop(reason: CloseReason): Promise<void> {\n if (this._isStopped) {\n return;\n }\n this._isStopped = true;\n this._isReceiving = false;\n try {\n // Trigger the cancellation before closing the receiver,\n // otherwise the receiver will remove the listener on the abortSignal\n // before it has a chance to be emitted.\n this._abortController.abort();\n await this._receiver?.close();\n await this._partitionProcessor.close(reason);\n } catch (err: any) {\n logger.warning(`An error occurred while closing the receiver: ${err?.name}: ${err?.message}`);\n logErrorStackTrace(err);\n this._partitionProcessor.processError(err);\n throw err;\n }\n }\n}\n\n/**\n * @internal\n */\nexport function toProcessingSpanOptions(\n receivedEvents: ReceivedEventData[],\n eventHubProperties: Pick<EventHubConnectionConfig, \"entityPath\" | \"host\">,\n): TracingSpanOptions {\n const spanLinks: TracingSpanLink[] = [];\n for (const receivedEvent of receivedEvents) {\n const tracingContext = extractSpanContextFromEventData(receivedEvent);\n if (tracingContext) {\n spanLinks.push({\n tracingContext,\n attributes: {\n enqueuedTime: receivedEvent.enqueuedTimeUtc.getTime(),\n },\n });\n }\n }\n return {\n spanLinks,\n spanKind: \"consumer\",\n ...toSpanOptions(eventHubProperties, \"process\"),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"partitionPump.js","sourceRoot":"","sources":["../../src/partitionPump.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { TracingSpanOptions, TracingSpanLink } from \"@azure/core-tracing\";\nimport { logErrorStackTrace, logger } from \"./logger.js\";\nimport { CloseReason } from \"./models/public.js\";\nimport type { CommonEventProcessorOptions } from \"./models/private.js\";\nimport type { ConnectionContext } from \"./connectionContext.js\";\nimport type { EventHubConnectionConfig } from \"./eventhubConnectionConfig.js\";\nimport type { PartitionReceiver } from \"./partitionReceiver.js\";\nimport { createReceiver } from \"./partitionReceiver.js\";\nimport type { EventPosition } from \"./eventPosition.js\";\nimport type { MessagingError } from \"@azure/core-amqp\";\nimport type { PartitionProcessor } from \"./partitionProcessor.js\";\nimport type { ReceivedEventData } from \"./eventData.js\";\nimport { toSpanOptions, tracingClient } from \"./diagnostics/tracing.js\";\nimport { extractSpanContextFromEventData } from \"./diagnostics/instrumentEventData.js\";\n\n/**\n * @internal\n */\nexport class PartitionPump {\n private _partitionProcessor: PartitionProcessor;\n private _processorOptions: CommonEventProcessorOptions;\n private _receiver: PartitionReceiver | undefined;\n private _isReceiving: boolean = false;\n private _isStopped: boolean = false;\n private _abortController: AbortController;\n constructor(\n private _context: ConnectionContext,\n partitionProcessor: PartitionProcessor,\n private readonly _startPosition: EventPosition,\n options: CommonEventProcessorOptions,\n ) {\n this._partitionProcessor = partitionProcessor;\n this._processorOptions = options;\n this._abortController = new AbortController();\n }\n\n public get isReceiving(): boolean {\n return this._isReceiving;\n }\n\n async start(): Promise<void> {\n this._isReceiving = true;\n try {\n await this._partitionProcessor.initialize();\n } catch (err) {\n // swallow the error from the user-defined code\n this._partitionProcessor.processError(err as Error);\n }\n\n // this is intentionally not await'd - the _receiveEvents loop will continue to\n // execute and can be stopped by calling .stop()\n this._receiveEvents(this._partitionProcessor.partitionId);\n logger.info(\n `Successfully started the receiver for partition \"${this._partitionProcessor.partitionId}\".`,\n );\n }\n\n /**\n * Creates a new `PartitionReceiver` and replaces any existing receiver.\n * @param partitionId - The partition the receiver should read messages from.\n * @param lastSeenSequenceNumber - The sequence number to begin receiving messages from (exclusive).\n * If `-1`, then the PartitionPump's startPosition will be used instead.\n */\n private _setOrReplaceReceiver(\n partitionId: string,\n lastSeenSequenceNumber: number,\n ): PartitionReceiver {\n // Determine what the new EventPosition should be.\n // If this PartitionPump has received events, we'll start from the last\n // seen sequenceNumber (exclusive).\n // Otherwise, use the `_startPosition`.\n const currentEventPosition: EventPosition =\n lastSeenSequenceNumber >= 0\n ? {\n sequenceNumber: lastSeenSequenceNumber,\n isInclusive: false,\n }\n : this._startPosition;\n\n // Set or replace the PartitionPump's receiver.\n this._receiver = createReceiver(\n this._context,\n this._partitionProcessor.consumerGroup,\n this._partitionProcessor.eventProcessorId,\n partitionId,\n currentEventPosition,\n {\n ownerLevel: this._processorOptions.ownerLevel,\n trackLastEnqueuedEventProperties: this._processorOptions.trackLastEnqueuedEventProperties,\n retryOptions: this._processorOptions.retryOptions,\n skipParsingBodyAsJson: this._processorOptions.skipParsingBodyAsJson,\n prefetchCount: this._processorOptions.prefetchCount,\n },\n );\n\n return this._receiver;\n }\n\n private async _receiveEvents(partitionId: string): Promise<void> {\n let lastSeenSequenceNumber = -1;\n let receiver = this._setOrReplaceReceiver(partitionId, lastSeenSequenceNumber);\n\n while (this._isReceiving) {\n try {\n // Check if the receiver was closed so we can recreate it.\n if (receiver.isClosed) {\n receiver = this._setOrReplaceReceiver(partitionId, lastSeenSequenceNumber);\n }\n\n const receivedEvents = await receiver.receiveBatch(\n this._processorOptions.maxBatchSize,\n this._processorOptions.maxWaitTimeInSeconds,\n this._abortController.signal,\n );\n\n if (\n this._processorOptions.trackLastEnqueuedEventProperties &&\n receiver.lastEnqueuedEventProperties\n ) {\n this._partitionProcessor.lastEnqueuedEventProperties =\n receiver.lastEnqueuedEventProperties;\n }\n // avoid calling user's processEvents handler if the pump was stopped while receiving events\n if (!this._isReceiving) {\n return;\n }\n\n if (receivedEvents.length) {\n lastSeenSequenceNumber = receivedEvents[receivedEvents.length - 1].sequenceNumber;\n }\n\n await tracingClient.withSpan(\n \"PartitionPump.process\",\n {},\n () => this._partitionProcessor.processEvents(receivedEvents),\n toProcessingSpanOptions(receivedEvents, this._context.config),\n );\n } catch (err: any) {\n // check if this pump is still receiving\n // it may not be if the EventProcessor was stopped during processEvents\n if (!this._isReceiving) {\n // no longer receiving, so close was called from somewhere else\n return;\n }\n\n logger.warning(\n `An error was thrown while receiving or processing events on partition \"${this._partitionProcessor.partitionId}\"`,\n );\n logErrorStackTrace(err);\n // forward error to user's processError and swallow errors they may throw\n try {\n await this._partitionProcessor.processError(err as Error);\n } catch (errorFromUser) {\n // Using verbose over warning because this error is swallowed.\n logger.verbose(\"An error was thrown by user's processError method: \", errorFromUser);\n }\n\n // close the partition processor if a non-retryable error was encountered\n if (typeof err !== \"object\" || !(err as MessagingError).retryable) {\n try {\n // If the exception indicates that the partition was stolen (i.e some other consumer with same ownerlevel\n // started consuming the partition), update the closeReason\n if (err.code === \"ReceiverDisconnectedError\") {\n return await this.stop(CloseReason.OwnershipLost);\n }\n // this will close the pump and will break us out of the while loop\n return await this.stop(CloseReason.Shutdown);\n } catch (errorFromStop) {\n // Using verbose over warning because this error is swallowed.\n logger.verbose(\n `An error occurred while closing the receiver with reason ${CloseReason.Shutdown}: `,\n errorFromStop,\n );\n }\n }\n }\n }\n }\n\n async stop(reason: CloseReason): Promise<void> {\n if (this._isStopped) {\n return;\n }\n this._isStopped = true;\n this._isReceiving = false;\n try {\n // Trigger the cancellation before closing the receiver,\n // otherwise the receiver will remove the listener on the abortSignal\n // before it has a chance to be emitted.\n this._abortController.abort();\n await this._receiver?.close();\n await this._partitionProcessor.close(reason);\n } catch (err: any) {\n logger.warning(`An error occurred while closing the receiver: ${err?.name}: ${err?.message}`);\n logErrorStackTrace(err);\n this._partitionProcessor.processError(err);\n throw err;\n }\n }\n}\n\n/**\n * @internal\n */\nexport function toProcessingSpanOptions(\n receivedEvents: ReceivedEventData[],\n eventHubProperties: Pick<EventHubConnectionConfig, \"entityPath\" | \"host\">,\n): TracingSpanOptions {\n const spanLinks: TracingSpanLink[] = [];\n for (const receivedEvent of receivedEvents) {\n const tracingContext = extractSpanContextFromEventData(receivedEvent);\n if (tracingContext) {\n spanLinks.push({\n tracingContext,\n attributes: {\n enqueuedTime: receivedEvent.enqueuedTimeUtc.getTime(),\n },\n });\n }\n }\n return {\n spanLinks,\n spanKind: \"consumer\",\n ...toSpanOptions(eventHubProperties, \"process\"),\n };\n}\n"]}
|
|
@@ -36,16 +36,18 @@ function createReceiver(ctx, consumerGroup, consumerId, partitionId, eventPositi
|
|
|
36
36
|
lastEnqueuedEventProperties: {},
|
|
37
37
|
isClosed: false,
|
|
38
38
|
close: async () => {
|
|
39
|
-
var _a, _b;
|
|
40
39
|
clearHandlers(obj);
|
|
41
40
|
delete ctx.receivers[name];
|
|
42
41
|
logger.verbose("deleted the receiver from the client cache");
|
|
43
|
-
|
|
44
|
-
return
|
|
45
|
-
|
|
42
|
+
state.authLoop?.stop();
|
|
43
|
+
return state.link
|
|
44
|
+
?.close()
|
|
45
|
+
.catch((err) => {
|
|
46
|
+
logger.warning(`an error occurred while closing: ${err?.name}: ${err?.message}`);
|
|
46
47
|
(0, logger_js_1.logErrorStackTrace)(err);
|
|
47
48
|
throw err;
|
|
48
|
-
})
|
|
49
|
+
})
|
|
50
|
+
.finally(() => {
|
|
49
51
|
obj.isClosed = true;
|
|
50
52
|
logger.verbose("is closed");
|
|
51
53
|
state.link = undefined;
|
|
@@ -53,14 +55,12 @@ function createReceiver(ctx, consumerGroup, consumerId, partitionId, eventPositi
|
|
|
53
55
|
});
|
|
54
56
|
},
|
|
55
57
|
abort: () => {
|
|
56
|
-
|
|
57
|
-
(_a = obj._onError) === null || _a === void 0 ? void 0 : _a.call(obj, new abort_controller_1.AbortError(core_amqp_1.StandardAbortMessage));
|
|
58
|
+
obj._onError?.(new abort_controller_1.AbortError(core_amqp_1.StandardAbortMessage));
|
|
58
59
|
logger.info(abortLogMessage);
|
|
59
60
|
return obj.close();
|
|
60
61
|
},
|
|
61
62
|
isOpen: () => {
|
|
62
|
-
|
|
63
|
-
const isOpen = !!((_a = state.link) === null || _a === void 0 ? void 0 : _a.isOpen());
|
|
63
|
+
const isOpen = !!state.link?.isOpen();
|
|
64
64
|
logger.verbose(`is open? -> ${isOpen}`);
|
|
65
65
|
return isOpen;
|
|
66
66
|
},
|
|
@@ -79,14 +79,13 @@ function createReceiver(ctx, consumerGroup, consumerId, partitionId, eventPositi
|
|
|
79
79
|
catch (err) {
|
|
80
80
|
state.isConnecting = false;
|
|
81
81
|
const error = (0, core_amqp_1.translate)(err);
|
|
82
|
-
logger.error(`an error occurred while creating the receiver: ${error
|
|
82
|
+
logger.error(`an error occurred while creating the receiver: ${error?.name}: ${error?.message}`);
|
|
83
83
|
(0, logger_js_1.logErrorStackTrace)(err);
|
|
84
84
|
throw error;
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
87
|
receiveBatch: (maxMessageCount, maxWaitTimeInSeconds = 60, abortSignal) => {
|
|
88
|
-
|
|
89
|
-
const prefetchCount = (_a = options.prefetchCount) !== null && _a !== void 0 ? _a : maxMessageCount * 3;
|
|
88
|
+
const prefetchCount = options.prefetchCount ?? maxMessageCount * 3;
|
|
90
89
|
const cleanupBeforeAbort = () => {
|
|
91
90
|
logger.info(abortLogMessage);
|
|
92
91
|
return obj.close();
|
|
@@ -94,7 +93,7 @@ function createReceiver(ctx, consumerGroup, consumerId, partitionId, eventPositi
|
|
|
94
93
|
const retrieveEvents = () => {
|
|
95
94
|
const eventsToRetrieveCount = Math.max(maxMessageCount - queue.length, 0);
|
|
96
95
|
logger.verbose(`already has ${queue.length} events and wants to receive ${eventsToRetrieveCount} more events`);
|
|
97
|
-
if (abortSignal
|
|
96
|
+
if (abortSignal?.aborted) {
|
|
98
97
|
cleanupBeforeAbort();
|
|
99
98
|
return Promise.reject(new abort_controller_1.AbortError(core_amqp_1.StandardAbortMessage));
|
|
100
99
|
}
|
|
@@ -128,7 +127,7 @@ function createReceiver(ctx, consumerGroup, consumerId, partitionId, eventPositi
|
|
|
128
127
|
operation: retrieveEvents,
|
|
129
128
|
operationType: core_amqp_1.RetryOperationType.receiveMessage,
|
|
130
129
|
abortSignal: abortSignal,
|
|
131
|
-
retryOptions:
|
|
130
|
+
retryOptions: options.retryOptions ?? {},
|
|
132
131
|
}, {
|
|
133
132
|
connectionId: {
|
|
134
133
|
enumerable: true,
|
|
@@ -181,14 +180,14 @@ function waitForEvents(maxEventCount, maxWaitTimeInMs, readIntervalWaitTimeInMs,
|
|
|
181
180
|
const abortListener = () => {
|
|
182
181
|
aborter.abort();
|
|
183
182
|
};
|
|
184
|
-
clientAbortSignal
|
|
183
|
+
clientAbortSignal?.addEventListener("abort", abortListener);
|
|
185
184
|
let cleanupBeforeAbortCalled = false;
|
|
186
185
|
const updatedOptions = {
|
|
187
186
|
abortSignal: aborter.signal,
|
|
188
187
|
abortErrorMsg: core_amqp_1.StandardAbortMessage,
|
|
189
188
|
cleanupBeforeAbort: () => {
|
|
190
|
-
if (
|
|
191
|
-
cleanupBeforeAbort
|
|
189
|
+
if (clientAbortSignal?.aborted && !cleanupBeforeAbortCalled) {
|
|
190
|
+
cleanupBeforeAbort?.();
|
|
192
191
|
cleanupBeforeAbortCalled = true;
|
|
193
192
|
}
|
|
194
193
|
},
|
|
@@ -200,7 +199,7 @@ function waitForEvents(maxEventCount, maxWaitTimeInMs, readIntervalWaitTimeInMs,
|
|
|
200
199
|
delay(maxWaitTimeInMs, updatedOptions).then(receivedNone),
|
|
201
200
|
]).finally(() => {
|
|
202
201
|
aborter.abort();
|
|
203
|
-
clientAbortSignal
|
|
202
|
+
clientAbortSignal?.removeEventListener("abort", abortListener);
|
|
204
203
|
});
|
|
205
204
|
}
|
|
206
205
|
function convertAMQPMesage(data) {
|
|
@@ -251,7 +250,7 @@ function onMessage(context, obj, queue, options) {
|
|
|
251
250
|
}
|
|
252
251
|
function onError(context, obj, receiver, logger) {
|
|
253
252
|
const rheaReceiver = receiver || context.receiver;
|
|
254
|
-
const amqpError = rheaReceiver
|
|
253
|
+
const amqpError = rheaReceiver?.error;
|
|
255
254
|
logger.verbose(`'receiver_error' event occurred: ${(0, logger_js_1.logObj)(amqpError)}`);
|
|
256
255
|
if (obj._onError && amqpError) {
|
|
257
256
|
const error = (0, core_amqp_1.translate)(amqpError);
|
|
@@ -260,8 +259,7 @@ function onError(context, obj, receiver, logger) {
|
|
|
260
259
|
}
|
|
261
260
|
}
|
|
262
261
|
function onSessionError(context, obj, logger) {
|
|
263
|
-
|
|
264
|
-
const sessionError = (_a = context.session) === null || _a === void 0 ? void 0 : _a.error;
|
|
262
|
+
const sessionError = context.session?.error;
|
|
265
263
|
logger.verbose(`'session_error' event occurred: ${(0, logger_js_1.logObj)(sessionError)}`);
|
|
266
264
|
if (obj._onError && sessionError) {
|
|
267
265
|
const error = (0, core_amqp_1.translate)(sessionError);
|
|
@@ -271,7 +269,9 @@ function onSessionError(context, obj, logger) {
|
|
|
271
269
|
}
|
|
272
270
|
async function onClose(context, state, logger) {
|
|
273
271
|
const rheaReceiver = state.link || context.receiver;
|
|
274
|
-
logger.verbose(`'receiver_close' event occurred. Value for isItselfClosed on the receiver is: '${rheaReceiver
|
|
272
|
+
logger.verbose(`'receiver_close' event occurred. Value for isItselfClosed on the receiver is: '${rheaReceiver
|
|
273
|
+
?.isItselfClosed()
|
|
274
|
+
.toString()}' Value for isConnecting on the session is: '${state.isConnecting}'`);
|
|
275
275
|
if (rheaReceiver && !state.isConnecting) {
|
|
276
276
|
return rheaReceiver.close().catch((err) => {
|
|
277
277
|
logger.verbose(`error when closing after 'receiver_close' event: ${(0, logger_js_1.logObj)(err)}`);
|
|
@@ -280,7 +280,9 @@ async function onClose(context, state, logger) {
|
|
|
280
280
|
}
|
|
281
281
|
async function onSessionClose(context, state, logger) {
|
|
282
282
|
const rheaReceiver = state.link || context.receiver;
|
|
283
|
-
logger.verbose(`'session_close' event occurred. Value for isSessionItselfClosed on the session is: '${rheaReceiver
|
|
283
|
+
logger.verbose(`'session_close' event occurred. Value for isSessionItselfClosed on the session is: '${rheaReceiver
|
|
284
|
+
?.isSessionItselfClosed()
|
|
285
|
+
.toString()}' Value for isConnecting on the session is: '${state.isConnecting}'`);
|
|
284
286
|
if (rheaReceiver && !state.isConnecting) {
|
|
285
287
|
return rheaReceiver.close().catch((err) => {
|
|
286
288
|
logger.verbose(`error when closing after 'session_close' event: ${(0, logger_js_1.logObj)(err)}`);
|
|
@@ -322,14 +324,17 @@ function createRheaOptions(consumerId, name, address, obj, state, queue, eventPo
|
|
|
322
324
|
async function setupLink(consumerId, ctx, name, address, obj, state, queue, eventPosition, logger, options, abortSignal) {
|
|
323
325
|
const rheaOptions = createRheaOptions(consumerId, name, address, obj, state, queue, eventPosition, logger, options);
|
|
324
326
|
logger.verbose(`trying to be created with options ${(0, logger_js_1.logObj)(rheaOptions)}`);
|
|
325
|
-
state.link = await ctx.connection.createReceiver(
|
|
327
|
+
state.link = await ctx.connection.createReceiver({
|
|
328
|
+
...rheaOptions,
|
|
329
|
+
abortSignal,
|
|
330
|
+
});
|
|
326
331
|
state.isConnecting = false;
|
|
327
332
|
logger.verbose("is created successfully");
|
|
328
333
|
ctx.receivers[name] = obj;
|
|
329
334
|
}
|
|
330
335
|
function addCredits(receiver, creditsToAdd) {
|
|
331
336
|
if (creditsToAdd > 0) {
|
|
332
|
-
receiver
|
|
337
|
+
receiver?.addCredit(creditsToAdd);
|
|
333
338
|
}
|
|
334
339
|
}
|
|
335
340
|
//# sourceMappingURL=partitionReceiver.js.map
|