@geekmidas/events 10.0.0-alpha.9 → 10.0.0-alpha.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +46 -1
  2. package/dist/SQSSubscriber-BEJBfNTe.mjs +264 -0
  3. package/dist/SQSSubscriber-BEJBfNTe.mjs.map +1 -0
  4. package/dist/SQSSubscriber-COTqWvOk.cjs +288 -0
  5. package/dist/SQSSubscriber-COTqWvOk.cjs.map +1 -0
  6. package/dist/basic/index.cjs +41 -11
  7. package/dist/basic/index.cjs.map +1 -1
  8. package/dist/basic/index.d.cts +11 -10
  9. package/dist/basic/index.d.cts.map +1 -1
  10. package/dist/basic/index.d.mts +11 -10
  11. package/dist/basic/index.d.mts.map +1 -1
  12. package/dist/basic/index.mjs +39 -10
  13. package/dist/basic/index.mjs.map +1 -1
  14. package/dist/index.cjs +47 -151
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +82 -26
  17. package/dist/index.d.cts.map +1 -1
  18. package/dist/index.d.mts +82 -26
  19. package/dist/index.d.mts.map +1 -1
  20. package/dist/index.mjs +34 -151
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/pgboss/index.cjs +198 -34
  23. package/dist/pgboss/index.cjs.map +1 -1
  24. package/dist/pgboss/index.d.cts +54 -12
  25. package/dist/pgboss/index.d.cts.map +1 -1
  26. package/dist/pgboss/index.d.mts +54 -12
  27. package/dist/pgboss/index.d.mts.map +1 -1
  28. package/dist/pgboss/index.mjs +193 -34
  29. package/dist/pgboss/index.mjs.map +1 -1
  30. package/dist/rabbitmq/index.cjs +173 -27
  31. package/dist/rabbitmq/index.cjs.map +1 -1
  32. package/dist/rabbitmq/index.d.cts +19 -10
  33. package/dist/rabbitmq/index.d.cts.map +1 -1
  34. package/dist/rabbitmq/index.d.mts +19 -10
  35. package/dist/rabbitmq/index.d.mts.map +1 -1
  36. package/dist/rabbitmq/index.mjs +169 -27
  37. package/dist/rabbitmq/index.mjs.map +1 -1
  38. package/dist/registry-DIx25Q5s.d.cts +255 -0
  39. package/dist/registry-DIx25Q5s.d.cts.map +1 -0
  40. package/dist/registry-DIx25Q5s.d.mts +255 -0
  41. package/dist/registry-DIx25Q5s.d.mts.map +1 -0
  42. package/dist/registry-DXLY1Xf6.mjs +99 -0
  43. package/dist/registry-DXLY1Xf6.mjs.map +1 -0
  44. package/dist/registry-DlT36229.cjs +122 -0
  45. package/dist/registry-DlT36229.cjs.map +1 -0
  46. package/dist/{chunk-CsX-DzYB.cjs → rolldown-runtime-C0BPl7ul.cjs} +17 -16
  47. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  48. package/dist/sns/index.cjs +403 -40
  49. package/dist/sns/index.cjs.map +1 -1
  50. package/dist/sns/index.d.cts +175 -11
  51. package/dist/sns/index.d.cts.map +1 -1
  52. package/dist/sns/index.d.mts +175 -11
  53. package/dist/sns/index.d.mts.map +1 -1
  54. package/dist/sns/index.mjs +372 -24
  55. package/dist/sns/index.mjs.map +1 -1
  56. package/dist/sns/snsUrl.cjs +91 -6
  57. package/dist/sns/snsUrl.cjs.map +1 -0
  58. package/dist/sns/snsUrl.d.cts +57 -2
  59. package/dist/sns/snsUrl.d.cts.map +1 -0
  60. package/dist/sns/snsUrl.d.mts +57 -2
  61. package/dist/sns/snsUrl.d.mts.map +1 -0
  62. package/dist/sns/snsUrl.mjs +81 -2
  63. package/dist/sns/snsUrl.mjs.map +1 -0
  64. package/dist/sqs/index.cjs +31 -65
  65. package/dist/sqs/index.cjs.map +1 -1
  66. package/dist/sqs/index.d.cts +28 -11
  67. package/dist/sqs/index.d.cts.map +1 -1
  68. package/dist/sqs/index.d.mts +28 -11
  69. package/dist/sqs/index.d.mts.map +1 -1
  70. package/dist/sqs/index.mjs +22 -58
  71. package/dist/sqs/index.mjs.map +1 -1
  72. package/dist/sqs/sqsUrl.cjs +92 -6
  73. package/dist/sqs/sqsUrl.cjs.map +1 -0
  74. package/dist/sqs/sqsUrl.d.cts +56 -2
  75. package/dist/sqs/sqsUrl.d.cts.map +1 -0
  76. package/dist/sqs/sqsUrl.d.mts +56 -2
  77. package/dist/sqs/sqsUrl.d.mts.map +1 -0
  78. package/dist/sqs/sqsUrl.mjs +82 -2
  79. package/dist/sqs/sqsUrl.mjs.map +1 -0
  80. package/dist/telemetry-DG3l807O.cjs +309 -0
  81. package/dist/telemetry-DG3l807O.cjs.map +1 -0
  82. package/dist/telemetry-DjjgJMul.mjs +244 -0
  83. package/dist/telemetry-DjjgJMul.mjs.map +1 -0
  84. package/package.json +8 -3
  85. package/dist/PgBossConnection-23soZ_aM.cjs +0 -80
  86. package/dist/PgBossConnection-23soZ_aM.cjs.map +0 -1
  87. package/dist/PgBossConnection-CCXhoNzb.cjs +0 -4
  88. package/dist/PgBossConnection-DvNbd4Zk.mjs +0 -74
  89. package/dist/PgBossConnection-DvNbd4Zk.mjs.map +0 -1
  90. package/dist/PgBossConnection-_gdM40JB.mjs +0 -4
  91. package/dist/RabbitMQConnection-BKEdCUro.cjs +0 -113
  92. package/dist/RabbitMQConnection-BKEdCUro.cjs.map +0 -1
  93. package/dist/RabbitMQConnection-CCOqDDnb.cjs +0 -4
  94. package/dist/RabbitMQConnection-DJEyM-Bu.mjs +0 -4
  95. package/dist/RabbitMQConnection-DJgUPc19.mjs +0 -107
  96. package/dist/RabbitMQConnection-DJgUPc19.mjs.map +0 -1
  97. package/dist/SNSConnection-B2K86hpz.cjs +0 -75
  98. package/dist/SNSConnection-B2K86hpz.cjs.map +0 -1
  99. package/dist/SNSConnection-BVo84FeW.mjs +0 -5
  100. package/dist/SNSConnection-DIHRjrQF.cjs +0 -5
  101. package/dist/SNSConnection-v9jjF99w.mjs +0 -69
  102. package/dist/SNSConnection-v9jjF99w.mjs.map +0 -1
  103. package/dist/SQSConnection-4tBMkVZE.mjs +0 -69
  104. package/dist/SQSConnection-4tBMkVZE.mjs.map +0 -1
  105. package/dist/SQSConnection-BBLAvF-1.cjs +0 -5
  106. package/dist/SQSConnection-BaC7rGhI.cjs +0 -75
  107. package/dist/SQSConnection-BaC7rGhI.cjs.map +0 -1
  108. package/dist/SQSConnection-DbavOq8_.mjs +0 -5
  109. package/dist/SQSSubscriber-BMWZ3s5q.mjs +0 -114
  110. package/dist/SQSSubscriber-BMWZ3s5q.mjs.map +0 -1
  111. package/dist/SQSSubscriber-YXPlg2rm.cjs +0 -120
  112. package/dist/SQSSubscriber-YXPlg2rm.cjs.map +0 -1
  113. package/dist/chunk-B9dir_RE.mjs +0 -11
  114. package/dist/snsUrl-ASdc0D1v.d.cts +0 -61
  115. package/dist/snsUrl-ASdc0D1v.d.cts.map +0 -1
  116. package/dist/snsUrl-CifYhPAa.mjs +0 -79
  117. package/dist/snsUrl-CifYhPAa.mjs.map +0 -1
  118. package/dist/snsUrl-FRbRcwF0.d.mts +0 -61
  119. package/dist/snsUrl-FRbRcwF0.d.mts.map +0 -1
  120. package/dist/snsUrl-f2gU3CzK.cjs +0 -114
  121. package/dist/snsUrl-f2gU3CzK.cjs.map +0 -1
  122. package/dist/sqsUrl-BV6zS-mi.d.mts +0 -60
  123. package/dist/sqsUrl-BV6zS-mi.d.mts.map +0 -1
  124. package/dist/sqsUrl-CbAsBFHI.mjs +0 -80
  125. package/dist/sqsUrl-CbAsBFHI.mjs.map +0 -1
  126. package/dist/sqsUrl-CdisN3GU.cjs +0 -115
  127. package/dist/sqsUrl-CdisN3GU.cjs.map +0 -1
  128. package/dist/sqsUrl-DZDPHxIk.d.cts +0 -60
  129. package/dist/sqsUrl-DZDPHxIk.d.cts.map +0 -1
  130. package/dist/types-BmixGrOD.d.cts +0 -67
  131. package/dist/types-BmixGrOD.d.cts.map +0 -1
  132. package/dist/types-Byv8N9ma.cjs +0 -24
  133. package/dist/types-Byv8N9ma.cjs.map +0 -1
  134. package/dist/types-CYDt-2RQ.mjs +0 -18
  135. package/dist/types-CYDt-2RQ.mjs.map +0 -1
  136. package/dist/types-DycjsYms.d.mts +0 -67
  137. package/dist/types-DycjsYms.d.mts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQSSubscriber-COTqWvOk.cjs","names":["SQSClient","chunk","publishTraced","carrierAsAttributes","SendMessageBatchCommand","ReceiveMessageCommand","consumeTraced","carrierFromAttributes","DeleteMessageCommand"],"sources":["../src/sqs/SQSConnection.ts","../src/sqs/SQSPublisher.ts","../src/sqs/SQSSubscriber.ts"],"sourcesContent":["import { SQSClient, type SQSClientConfig } from '@aws-sdk/client-sqs';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\nimport * as sqsUrl from './sqsUrl';\n\nexport interface SQSConnectionConfig {\n\tqueueUrl: string;\n\tregion?: string;\n\tendpoint?: string; // Custom endpoint (e.g., for LocalStack)\n\tcredentials?: {\n\t\taccessKeyId: string;\n\t\tsecretAccessKey: string;\n\t\tsessionToken?: string;\n\t};\n}\n\nexport class SQSConnection implements EventConnection {\n\treadonly type = EventPublisherType.SQS;\n\tprivate client: SQSClient;\n\tprivate connected = false;\n\n\tconstructor(readonly config: SQSConnectionConfig) {\n\t\tthis.config = config;\n\n\t\tconst clientConfig: SQSClientConfig = {\n\t\t\tregion: config.region,\n\t\t\tendpoint: config.endpoint,\n\t\t\tcredentials: config.credentials,\n\t\t};\n\n\t\tthis.client = new SQSClient(clientConfig);\n\t}\n\n\t/**\n\t * Create an SQSConnection from a connection string\n\t * Format: sqs://?queueUrl=https://sqs.region.amazonaws.com/accountId/queueName&region=us-east-1&endpoint=http://localhost:4566\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionString: string,\n\t): Promise<SQSConnection> {\n\t\t// Through the codec, not a second hand-rolled parse: the deploy target\n\t\t// composes these with `sqsUrl.build`, and a string it cannot read back is\n\t\t// exactly the drift one shared module rules out.\n\t\tconst { queueUrl, region, endpoint } = sqsUrl.parse(connectionString);\n\t\tconst params = new URL(connectionString).searchParams;\n\n\t\tconst config: SQSConnectionConfig = {\n\t\t\tqueueUrl,\n\t\t\tregion,\n\t\t\tendpoint,\n\t\t};\n\n\t\t// Credentials are not part of the address — see `sqsUrl` — but a caller\n\t\t// may still pin them here, so they are read beside it rather than in it.\n\t\tconst accessKeyId = params.get('accessKeyId');\n\t\tconst secretAccessKey = params.get('secretAccessKey');\n\t\tif (accessKeyId && secretAccessKey) {\n\t\t\tconfig.credentials = {\n\t\t\t\taccessKeyId,\n\t\t\t\tsecretAccessKey,\n\t\t\t\tsessionToken: params.get('sessionToken') || undefined,\n\t\t\t};\n\t\t}\n\n\t\tconst connection = new SQSConnection(config);\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\t// SQS doesn't have a traditional connection, but we mark as connected\n\t\tthis.connected = true;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.client.destroy();\n\t\tthis.connected = false;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\t/**\n\t * Get the underlying SQS client\n\t */\n\tget sqsClient(): SQSClient {\n\t\treturn this.client;\n\t}\n\n\t/**\n\t * Get the queue URL for this connection\n\t */\n\tget queueUrl(): string {\n\t\treturn this.config.queueUrl;\n\t}\n}\n","import {\n\tSendMessageBatchCommand,\n\ttype SendMessageBatchCommandInput,\n\ttype SendMessageBatchRequestEntry,\n} from '@aws-sdk/client-sqs';\nimport chunk from 'lodash.chunk';\nimport { carrierAsAttributes, publishTraced } from '../telemetry';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\n\nexport interface SQSPublisherOptions {\n\tmaxBatchSize?: number; // Default: 10 (SQS limit)\n}\n\nexport class SQSPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\treadonly options: Required<SQSPublisherOptions>;\n\n\tconstructor(\n\t\treadonly connection: SQSConnection,\n\t\toptions: SQSPublisherOptions = {},\n\t) {\n\t\tthis.options = {\n\t\t\tmaxBatchSize: options.maxBatchSize ?? 10, // SQS limit\n\t\t};\n\t}\n\n\t/**\n\t * Create an SQSPublisher from a connection string\n\t * Format: sqs://?queueUrl=https://sqs.region.amazonaws.com/accountId/queueName&region=us-east-1&endpoint=http://localhost:4566&maxBatchSize=10\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<SQSPublisher<TMessage>> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst { SQSConnection } = await import('./SQSConnection');\n\t\tconst connection =\n\t\t\tawait SQSConnection.fromConnectionString(connectionString);\n\n\t\tconst options: SQSPublisherOptions = {\n\t\t\tmaxBatchSize: params.get('maxBatchSize')\n\t\t\t\t? Number.parseInt(params.get('maxBatchSize')!, 10)\n\t\t\t\t: undefined,\n\t\t};\n\n\t\treturn new SQSPublisher<TMessage>(connection, options);\n\t}\n\n\tasync publish(messages: TMessage[]): Promise<void> {\n\t\tif (messages.length === 0) return;\n\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\t// Split messages into batches (SQS limit is 10 messages per batch)\n\t\tconst batches = chunk(messages, this.options.maxBatchSize);\n\n\t\t// Send all batches\n\t\tawait Promise.all(batches.map((batch) => this.sendBatch(batch)));\n\t}\n\n\tprivate async sendBatch(messages: TMessage[]): Promise<void> {\n\t\tconst destination = sqsQueueName(this.connection.queueUrl);\n\t\tawait publishTraced(\n\t\t\tmessages,\n\t\t\t(message) => ({ system: 'aws_sqs', destination, type: message.type }),\n\t\t\t(carriers) =>\n\t\t\t\tthis.send(\n\t\t\t\t\tmessages.map((message, index) => ({\n\t\t\t\t\t\tId: `${index}`,\n\t\t\t\t\t\tMessageBody: JSON.stringify({\n\t\t\t\t\t\t\ttype: message.type,\n\t\t\t\t\t\t\tpayload: message.payload,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t// The trace context as message attributes — SQS's own header\n\t\t\t\t\t\t// field — beside the type.\n\t\t\t\t\t\tMessageAttributes: {\n\t\t\t\t\t\t\ttype: {\n\t\t\t\t\t\t\t\tDataType: 'String',\n\t\t\t\t\t\t\t\tStringValue: message.type,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t...carrierAsAttributes(carriers[index]),\n\t\t\t\t\t\t},\n\t\t\t\t\t})),\n\t\t\t\t),\n\t\t);\n\t}\n\n\tprivate async send(entries: SendMessageBatchRequestEntry[]): Promise<void> {\n\t\tconst input: SendMessageBatchCommandInput = {\n\t\t\tQueueUrl: this.connection.queueUrl,\n\t\t\tEntries: entries,\n\t\t};\n\n\t\tconst command = new SendMessageBatchCommand(input);\n\t\tconst response = await this.connection.sqsClient.send(command);\n\n\t\t// Check for failures\n\t\tif (response.Failed && response.Failed.length > 0) {\n\t\t\tthrow new SqsBatchPartlyFailed(\n\t\t\t\tresponse.Failed.map((f) => ({\n\t\t\t\t\tid: f.Id,\n\t\t\t\t\tcode: f.Code,\n\t\t\t\t\tmessage: f.Message,\n\t\t\t\t})),\n\t\t\t);\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\t// Publisher doesn't own the connection\n\t\t// Connection should be closed by whoever created it\n\t}\n}\n\n/** SQS accepted the batch but refused some of its messages; the rest were sent. */\nexport class SqsBatchPartlyFailed extends Error {\n\tconstructor(\n\t\treadonly failed: readonly {\n\t\t\tid?: string;\n\t\t\tcode?: string;\n\t\t\tmessage?: string;\n\t\t}[],\n\t) {\n\t\tsuper(\n\t\t\t`Failed to send ${failed.length} messages: ${failed.map((f) => `${f.id}: ${f.code} - ${f.message}`).join(', ')}. The others in the batch were sent; retry only these.`,\n\t\t);\n\t\tthis.name = 'SqsBatchPartlyFailed';\n\t}\n}\n\n/** The queue's name, the last segment of its URL. */\nexport function sqsQueueName(queueUrl: string): string {\n\treturn queueUrl.split('/').filter(Boolean).pop() ?? queueUrl;\n}\n","import {\n\tDeleteMessageCommand,\n\ttype Message,\n\tReceiveMessageCommand,\n} from '@aws-sdk/client-sqs';\nimport {\n\tcarrierFromAttributes,\n\tconsumeTraced,\n\ttype TraceCarrier,\n} from '../telemetry';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\nimport { sqsQueueName } from './SQSPublisher';\n\nexport interface SQSSubscriberOptions {\n\twaitTimeSeconds?: number; // SQS long polling (default: 20)\n\tmaxMessages?: number; // Max messages per poll (default: 10)\n\texpectedTopicArn?: string; // Optional: verify messages are from specific SNS topic\n}\n\n/**\n * SQS Subscriber - receives messages from an SQS queue\n *\n * This subscriber can receive:\n * 1. Direct SQS messages\n * 2. SNS messages that were pushed to the queue (SNS → SQS pattern)\n *\n * When receiving SNS messages, it:\n * - Automatically detects and parses the SNS wrapper format\n * - Filters by TopicArn (if expectedTopicArn is provided)\n * - Filters by message type\n * - Processes the actual message payload\n */\nexport class SQSSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tprivate polling = false;\n\tprivate messageTypes: Set<TMessage['type']> = new Set();\n\tprivate listener?: (payload: TMessage) => Promise<void>;\n\tprivate options: Required<SQSSubscriberOptions>;\n\n\tconstructor(\n\t\tprivate connection: SQSConnection,\n\t\toptions: SQSSubscriberOptions = {},\n\t) {\n\t\tthis.options = {\n\t\t\twaitTimeSeconds: options.waitTimeSeconds ?? 20,\n\t\t\tmaxMessages: options.maxMessages ?? 10,\n\t\t\texpectedTopicArn: options.expectedTopicArn ?? '',\n\t\t};\n\t}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tthis.messageTypes = new Set(messages);\n\t\tthis.listener = listener;\n\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tthis.polling = true;\n\t\tthis.poll();\n\t}\n\n\tstop(): void {\n\t\tthis.polling = false;\n\t}\n\n\tprivate async poll(): Promise<void> {\n\t\twhile (this.polling) {\n\t\t\ttry {\n\t\t\t\tconst command = new ReceiveMessageCommand({\n\t\t\t\t\tQueueUrl: this.connection.queueUrl,\n\t\t\t\t\tMaxNumberOfMessages: this.options.maxMessages,\n\t\t\t\t\tWaitTimeSeconds: this.options.waitTimeSeconds,\n\t\t\t\t\tMessageAttributeNames: ['All'],\n\t\t\t\t});\n\n\t\t\t\tconst response = await this.connection.sqsClient.send(command);\n\n\t\t\t\tif (response.Messages && response.Messages.length > 0) {\n\t\t\t\t\tawait this.processMessages(response.Messages);\n\t\t\t\t}\n\t\t\t} catch (_error) {\n\t\t\t\tawait this.sleep(1000);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async processMessages(messages: Message[]): Promise<void> {\n\t\tfor (const message of messages) {\n\t\t\ttry {\n\t\t\t\tif (!message.Body) continue;\n\n\t\t\t\t// Try to parse as SNS message first\n\t\t\t\tconst parsedMessage = this.parseMessage(\n\t\t\t\t\tmessage.Body,\n\t\t\t\t\tmessage.MessageAttributes,\n\t\t\t\t);\n\n\t\t\t\tif (!parsedMessage) {\n\t\t\t\t\t// Not a valid message format\n\t\t\t\t\tawait this.deleteMessage(message.ReceiptHandle!);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst { payload, messageType, topicArn, carrier } = parsedMessage;\n\n\t\t\t\t// If expectedTopicArn is set, verify the message is from that topic\n\t\t\t\tif (this.options.expectedTopicArn && topicArn) {\n\t\t\t\t\tif (topicArn !== this.options.expectedTopicArn) {\n\t\t\t\t\t\tawait this.deleteMessage(message.ReceiptHandle!);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check if we're subscribed to this message type\n\t\t\t\tif (\n\t\t\t\t\tmessageType &&\n\t\t\t\t\tthis.messageTypes.has(messageType as TMessage['type'])\n\t\t\t\t) {\n\t\t\t\t\t// Call listener\n\t\t\t\t\tconst listener = this.listener;\n\t\t\t\t\tif (listener) {\n\t\t\t\t\t\tawait consumeTraced(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsystem: 'aws_sqs',\n\t\t\t\t\t\t\t\tdestination: sqsQueueName(this.connection.queueUrl),\n\t\t\t\t\t\t\t\ttype: messageType,\n\t\t\t\t\t\t\t\tmessageId: message.MessageId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcarrier,\n\t\t\t\t\t\t\t() => listener(payload as TMessage),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Delete message after successful processing\n\t\t\t\t\tawait this.deleteMessage(message.ReceiptHandle!);\n\t\t\t\t} else {\n\t\t\t\t\t// Delete messages we're not subscribed to\n\t\t\t\t\tawait this.deleteMessage(message.ReceiptHandle!);\n\t\t\t\t}\n\t\t\t} catch (_error) {\n\t\t\t\t// Message will become visible again\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Parse message body - handles both direct SQS messages and SNS-wrapped messages\n\t */\n\tprivate parseMessage(\n\t\tbody: string,\n\t\tattributes: Record<string, unknown> | undefined,\n\t): {\n\t\tpayload: unknown;\n\t\tmessageType: string | undefined;\n\t\ttopicArn?: string;\n\t\tcarrier?: TraceCarrier;\n\t} | null {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(body);\n\n\t\t\t// Check if this is an SNS notification wrapper\n\t\t\tif (parsed.Type === 'Notification' && parsed.Message) {\n\t\t\t\t// This is an SNS message\n\t\t\t\tconst snsMessage = JSON.parse(parsed.Message);\n\t\t\t\tconst messageType =\n\t\t\t\t\tparsed.MessageAttributes?.type?.Value || snsMessage.type;\n\n\t\t\t\treturn {\n\t\t\t\t\tpayload: snsMessage,\n\t\t\t\t\tmessageType,\n\t\t\t\t\ttopicArn: parsed.TopicArn,\n\t\t\t\t\t// SNS's message attributes, carried in its envelope.\n\t\t\t\t\tcarrier: carrierFromAttributes(parsed.MessageAttributes),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// This is a direct SQS message\n\t\t\treturn {\n\t\t\t\tpayload: parsed,\n\t\t\t\tmessageType: parsed.type,\n\t\t\t\tcarrier: carrierFromAttributes(attributes),\n\t\t\t};\n\t\t} catch (_error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async deleteMessage(receiptHandle: string): Promise<void> {\n\t\ttry {\n\t\t\tconst command = new DeleteMessageCommand({\n\t\t\t\tQueueUrl: this.connection.queueUrl,\n\t\t\t\tReceiptHandle: receiptHandle,\n\t\t\t});\n\t\t\tawait this.connection.sqsClient.send(command);\n\t\t} catch (_error) {}\n\t}\n\n\tprivate sleep(ms: number): Promise<void> {\n\t\treturn new Promise((resolve) => setTimeout(resolve, ms));\n\t}\n}\n"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- const require_chunk = require('../chunk-CsX-DzYB.cjs');
2
- const require_types = require('../types-Byv8N9ma.cjs');
3
- const node_events = require_chunk.__toESM(require("node:events"));
4
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_telemetry = require("../telemetry-DG3l807O.cjs");
3
+ let node_events = require("node:events");
5
4
  //#region src/basic/BasicConnection.ts
6
5
  var BasicConnection = class BasicConnection {
7
- type = require_types.EventPublisherType.Basic;
6
+ type = "basic";
8
7
  emitter;
9
8
  connected = false;
10
9
  constructor() {
@@ -37,35 +36,66 @@ var BasicConnection = class BasicConnection {
37
36
  return this.emitter;
38
37
  }
39
38
  };
40
-
41
39
  //#endregion
42
40
  //#region src/basic/BasicPublisher.ts
43
41
  var BasicPublisher = class {
42
+ connection;
44
43
  constructor(connection) {
45
44
  this.connection = connection;
46
45
  }
47
46
  async publish(messages) {
48
47
  const emitter = this.connection.eventEmitter;
49
- for (const message of messages) emitter.emit(message.type, message);
48
+ await require_telemetry.publishTraced(messages, (message) => ({
49
+ system: "basic",
50
+ destination: message.type,
51
+ type: message.type
52
+ }), async (carriers) => {
53
+ messages.forEach((message, i) => {
54
+ emitter.emit(message.type, message, carriers[i]);
55
+ });
56
+ });
50
57
  }
51
58
  };
52
-
53
59
  //#endregion
54
60
  //#region src/basic/BasicSubscriber.ts
55
61
  var BasicSubscriber = class {
62
+ connection;
56
63
  constructor(connection) {
57
64
  this.connection = connection;
58
65
  }
59
66
  async subscribe(messages, listener) {
60
67
  const emitter = this.connection.eventEmitter;
61
- for (const messageType of messages) emitter.on(messageType, (message) => {
62
- listener(message).catch((_error) => {});
68
+ for (const messageType of messages) emitter.on(messageType, (message, carrier) => {
69
+ require_telemetry.consumeTraced({
70
+ system: "basic",
71
+ destination: messageType,
72
+ type: messageType
73
+ }, carrier, () => listener(message)).catch((_error) => {});
63
74
  });
64
75
  }
65
76
  };
66
-
77
+ //#endregion
78
+ //#region src/basic/driver.ts
79
+ /**
80
+ * `basic://` — an in-process `EventEmitter`. Register it with
81
+ * `registerEventsDriver(basicEventsDriver)`.
82
+ */
83
+ const basicEventsDriver = {
84
+ scheme: "basic",
85
+ connect: (url) => BasicConnection.fromConnectionString(url),
86
+ async publisher(url) {
87
+ return new BasicPublisher(await BasicConnection.fromConnectionString(url));
88
+ },
89
+ publisherFor: (connection) => new BasicPublisher(connection),
90
+ async subscriber(url) {
91
+ return new BasicSubscriber(await BasicConnection.fromConnectionString(url));
92
+ },
93
+ subscriberFor: (connection) => new BasicSubscriber(connection)
94
+ };
67
95
  //#endregion
68
96
  exports.BasicConnection = BasicConnection;
69
97
  exports.BasicPublisher = BasicPublisher;
70
98
  exports.BasicSubscriber = BasicSubscriber;
99
+ exports.basicEventsDriver = basicEventsDriver;
100
+
71
101
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["EventPublisherType","EventEmitter","_connectionString: string","connection: BasicConnection","messages: TMessage[]","connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n\treadonly type = EventPublisherType.Basic;\n\tprivate emitter: EventEmitter;\n\tprivate connected = false;\n\n\tconstructor() {\n\t\tthis.emitter = new EventEmitter();\n\t}\n\n\t/**\n\t * Create a BasicConnection from a connection string\n\t * Format: basic://\n\t */\n\tstatic async fromConnectionString(\n\t\t_connectionString: string,\n\t): Promise<BasicConnection> {\n\t\t// Basic connection doesn't need any configuration\n\t\tconst connection = new BasicConnection();\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tthis.connected = true;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.emitter.removeAllListeners();\n\t\tthis.connected = false;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\t/**\n\t * Get the underlying EventEmitter\n\t * Used by BasicPublisher and BasicSubscriber\n\t */\n\tget eventEmitter(): EventEmitter {\n\t\treturn this.emitter;\n\t}\n}\n","import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync publish(messages: TMessage[]) {\n\t\tconst emitter = this.connection.eventEmitter;\n\t\tfor (const message of messages) {\n\t\t\temitter.emit(message.type, message);\n\t\t}\n\t}\n}\n","import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tconst emitter = this.connection.eventEmitter;\n\n\t\tfor (const messageType of messages) {\n\t\t\temitter.on(messageType, (message: TMessage) => {\n\t\t\t\tlistener(message).catch((_error) => {});\n\t\t\t});\n\t\t}\n\t}\n}\n"],"mappings":";;;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACvD,AAAS,OAAOA,iCAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACb,OAAK,UAAU,IAAIC;CACnB;;;;;CAMD,aAAa,qBACZC,mBAC2B;EAE3B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACP;CAED,MAAM,UAAyB;AAC9B,OAAK,YAAY;CACjB;CAED,MAAM,QAAuB;AAC5B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CACjB;CAED,cAAuB;AACtB,SAAO,KAAK;CACZ;;;;;CAMD,IAAI,eAA6B;AAChC,SAAO,KAAK;CACZ;AACD;;;;AC3CD,IAAa,iBAAb,MAEA;CACC,YAAoBC,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EACnC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACrB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEpC;AACD;;;;ACXD,IAAa,kBAAb,MAEA;CACC,YAAoBC,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACLC,UACAC,UACgB;EAChB,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACzB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC9C,YAAS,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAE,EAAC;EACvC,EAAC;CAEH;AACD"}
1
+ {"version":3,"file":"index.cjs","names":["EventEmitter","publishTraced"],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts","../../src/basic/driver.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n\treadonly type = EventPublisherType.Basic;\n\tprivate emitter: EventEmitter;\n\tprivate connected = false;\n\n\tconstructor() {\n\t\tthis.emitter = new EventEmitter();\n\t}\n\n\t/**\n\t * Create a BasicConnection from a connection string\n\t * Format: basic://\n\t */\n\tstatic async fromConnectionString(\n\t\t_connectionString: string,\n\t): Promise<BasicConnection> {\n\t\t// Basic connection doesn't need any configuration\n\t\tconst connection = new BasicConnection();\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tthis.connected = true;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.emitter.removeAllListeners();\n\t\tthis.connected = false;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\t/**\n\t * Get the underlying EventEmitter\n\t * Used by BasicPublisher and BasicSubscriber\n\t */\n\tget eventEmitter(): EventEmitter {\n\t\treturn this.emitter;\n\t}\n}\n","import { publishTraced } from '../telemetry';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync publish(messages: TMessage[]) {\n\t\tconst emitter = this.connection.eventEmitter;\n\t\t// The trace context rides beside the message, as the emitter's second\n\t\t// argument, so the message a listener receives is the one published.\n\t\tawait publishTraced(\n\t\t\tmessages,\n\t\t\t(message) => ({\n\t\t\t\tsystem: 'basic',\n\t\t\t\tdestination: message.type,\n\t\t\t\ttype: message.type,\n\t\t\t}),\n\t\t\tasync (carriers) => {\n\t\t\t\tmessages.forEach((message, i) => {\n\t\t\t\t\temitter.emit(message.type, message, carriers[i]);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t}\n}\n","import { consumeTraced, type TraceCarrier } from '../telemetry';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tconst emitter = this.connection.eventEmitter;\n\n\t\tfor (const messageType of messages) {\n\t\t\temitter.on(messageType, (message: TMessage, carrier?: TraceCarrier) => {\n\t\t\t\tconsumeTraced(\n\t\t\t\t\t{ system: 'basic', destination: messageType, type: messageType },\n\t\t\t\t\tcarrier,\n\t\t\t\t\t() => listener(message),\n\t\t\t\t).catch((_error) => {});\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { EventsDriver } from '../registry';\nimport { EventPublisherType } from '../types';\nimport { BasicConnection } from './BasicConnection';\nimport { BasicPublisher } from './BasicPublisher';\nimport { BasicSubscriber } from './BasicSubscriber';\n\n/**\n * `basic://` — an in-process `EventEmitter`. Register it with\n * `registerEventsDriver(basicEventsDriver)`.\n */\nexport const basicEventsDriver: EventsDriver = {\n\tscheme: EventPublisherType.Basic,\n\tconnect: (url) => BasicConnection.fromConnectionString(url),\n\tasync publisher(url) {\n\t\treturn new BasicPublisher(await BasicConnection.fromConnectionString(url));\n\t},\n\tpublisherFor: (connection) =>\n\t\tnew BasicPublisher(connection as BasicConnection),\n\tasync subscriber(url) {\n\t\treturn new BasicSubscriber(await BasicConnection.fromConnectionString(url));\n\t},\n\tsubscriberFor: (connection) =>\n\t\tnew BasicSubscriber(connection as BasicConnection),\n};\n"],"mappings":";;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACvD,OAAS;CACT;CACA,YAAoB;CAEpB,cAAc;EACb,KAAK,UAAU,IAAIA,YAAAA,aAAa;CACjC;;;;;CAMA,aAAa,qBACZ,mBAC2B;EAE3B,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,WAAW,QAAQ;EACzB,OAAO;CACR;CAEA,MAAM,UAAyB;EAC9B,KAAK,YAAY;CAClB;CAEA,MAAM,QAAuB;EAC5B,KAAK,QAAQ,mBAAmB;EAChC,KAAK,YAAY;CAClB;CAEA,cAAuB;EACtB,OAAO,KAAK;CACb;;;;;CAMA,IAAI,eAA6B;EAChC,OAAO,KAAK;CACb;AACD;;;AC1CA,IAAa,iBAAb,MAEA;CACqB;CAApB,YAAY,YAAqC;EAA7B,KAAA,aAAA;CAA8B;CAElD,MAAM,QAAQ,UAAsB;EACnC,MAAM,UAAU,KAAK,WAAW;EAGhC,MAAMC,kBAAAA,cACL,WACC,aAAa;GACb,QAAQ;GACR,aAAa,QAAQ;GACrB,MAAM,QAAQ;EACf,IACA,OAAO,aAAa;GACnB,SAAS,SAAS,SAAS,MAAM;IAChC,QAAQ,KAAK,QAAQ,MAAM,SAAS,SAAS,EAAE;GAChD,CAAC;EACF,CACD;CACD;AACD;;;ACvBA,IAAa,kBAAb,MAEA;CACqB;CAApB,YAAY,YAAqC;EAA7B,KAAA,aAAA;CAA8B;CAElD,MAAM,UACL,UACA,UACgB;EAChB,MAAM,UAAU,KAAK,WAAW;EAEhC,KAAK,MAAM,eAAe,UACzB,QAAQ,GAAG,cAAc,SAAmB,YAA2B;GACtE,kBAAA,cACC;IAAE,QAAQ;IAAS,aAAa;IAAa,MAAM;GAAY,GAC/D,eACM,SAAS,OAAO,CACvB,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC;EACvB,CAAC;CAEH;AACD;;;;;;;ACfA,MAAa,oBAAkC;CAC9C,QAAA;CACA,UAAU,QAAQ,gBAAgB,qBAAqB,GAAG;CAC1D,MAAM,UAAU,KAAK;EACpB,OAAO,IAAI,eAAe,MAAM,gBAAgB,qBAAqB,GAAG,CAAC;CAC1E;CACA,eAAe,eACd,IAAI,eAAe,UAA6B;CACjD,MAAM,WAAW,KAAK;EACrB,OAAO,IAAI,gBAAgB,MAAM,gBAAgB,qBAAqB,GAAG,CAAC;CAC3E;CACA,gBAAgB,eACf,IAAI,gBAAgB,UAA6B;AACnD"}
@@ -1,8 +1,7 @@
1
- import { EventConnection, EventPublisher, EventPublisherType, EventSubscriber, PublishableMessage } from "../types-BmixGrOD.cjs";
1
+ import { d as EventPublisher, f as EventPublisherType, g as PublishableMessage, p as EventSubscriber, t as EventsDriver, u as EventConnection } from "../registry-DIx25Q5s.cjs";
2
2
  import { EventEmitter } from "node:events";
3
-
4
3
  //#region src/basic/BasicConnection.d.ts
5
- declare class BasicConnection implements EventConnection {
4
+ export declare class BasicConnection implements EventConnection {
6
5
  readonly type = EventPublisherType.Basic;
7
6
  private emitter;
8
7
  private connected;
@@ -21,24 +20,26 @@ declare class BasicConnection implements EventConnection {
21
20
  */
22
21
  get eventEmitter(): EventEmitter;
23
22
  }
24
- //# sourceMappingURL=BasicConnection.d.ts.map
25
23
  //#endregion
26
24
  //#region src/basic/BasicPublisher.d.ts
27
- declare class BasicPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
25
+ export declare class BasicPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
28
26
  private connection;
29
27
  constructor(connection: BasicConnection);
30
28
  publish(messages: TMessage[]): Promise<void>;
31
29
  }
32
- //# sourceMappingURL=BasicPublisher.d.ts.map
33
30
  //#endregion
34
31
  //#region src/basic/BasicSubscriber.d.ts
35
- declare class BasicSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
32
+ export declare class BasicSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
36
33
  private connection;
37
34
  constructor(connection: BasicConnection);
38
35
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
39
36
  }
40
- //# sourceMappingURL=BasicSubscriber.d.ts.map
41
-
42
37
  //#endregion
43
- export { BasicConnection, BasicPublisher, BasicSubscriber };
38
+ //#region src/basic/driver.d.ts
39
+ /**
40
+ * `basic://` — an in-process `EventEmitter`. Register it with
41
+ * `registerEventsDriver(basicEventsDriver)`.
42
+ */
43
+ export declare const basicEventsDriver: EventsDriver;
44
+ //#endregion
44
45
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts"],"sourcesContent":[],"mappings":";;;;cAIa,eAAA,YAA2B;EAA3B,SAAA,IAAA,GACC,kBAAA,CAAA,KAAA;EADe,QAAA,OAAA;EAAA,QACf,SAAA;EAAA,WAcF,CAAA;EAAe;;;;EAwBM,OAvCO,oBAAA,CAAA,iBAAA,EAAA,MAAA,CAAA,EAepC,OAfoC,CAe5B,eAf4B,CAAA;EAAe,OAAA,CAAA,CAAA,EAsBrC,OAtBqC,CAAA,IAAA,CAAA;WA0BvC;;;AC3BhB;;;EAA+D,IACpC,YAAA,CAAA,CAAA,EDuCN,YCvCM;;;;;cADd,gCAAgC,4CACjC,eAAe;;EDAd,WAAA,CAAA,UAAgB,ECEI,eDFJ;EAAA,OAAA,CAAA,QAAA,ECIJ,QDJI,EAAA,CAAA,ECIM,ODJN,CAAA,IAAA,CAAA;;;;;cEDhB,iCAAiC,4CAClC,gBAAgB;;EFAf,WAAA,CAAA,UAAgB,EEEI,eFFJ;EAAA,SAAA,CAAA,QAAA,EEKjB,QFLiB,CAAA,MAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,OAAA,EEMP,QFNO,EAAA,GEMM,OFNN,CAAA,IAAA,CAAA,CAAA,EEOzB,OFPyB,CAAA,IAAA,CAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts","../../src/basic/driver.ts"],"mappings":";;;qBAIa,2BAA2B;WAC9B,OAAI,mBAAA;UACL;UACA;EAER;;;;;SAQa,qBACZ,4BACE,QAAQ;EAOL,WAAW;EAIX,SAAS;EAKf;;;;;MAQI,gBAAgB;;;;qBCvCR,eAAe,iBAAiB,4CACjC,eAAe;UAEN;EAApB,YAAoB,YAAY;EAE1B,QAAQ,UAAU,aAAU;;;;qBCLtB,gBAAgB,iBAAiB,4CAClC,gBAAgB;UAEP;EAApB,YAAoB,YAAY;EAE1B,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B;;;;;;;;qBCFS,mBAAmB"}
@@ -1,8 +1,7 @@
1
- import { EventConnection, EventPublisher, EventPublisherType, EventSubscriber, PublishableMessage } from "../types-DycjsYms.mjs";
1
+ import { d as EventPublisher, f as EventPublisherType, g as PublishableMessage, p as EventSubscriber, t as EventsDriver, u as EventConnection } from "../registry-DIx25Q5s.mjs";
2
2
  import { EventEmitter } from "node:events";
3
-
4
3
  //#region src/basic/BasicConnection.d.ts
5
- declare class BasicConnection implements EventConnection {
4
+ export declare class BasicConnection implements EventConnection {
6
5
  readonly type = EventPublisherType.Basic;
7
6
  private emitter;
8
7
  private connected;
@@ -21,24 +20,26 @@ declare class BasicConnection implements EventConnection {
21
20
  */
22
21
  get eventEmitter(): EventEmitter;
23
22
  }
24
- //# sourceMappingURL=BasicConnection.d.ts.map
25
23
  //#endregion
26
24
  //#region src/basic/BasicPublisher.d.ts
27
- declare class BasicPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
25
+ export declare class BasicPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
28
26
  private connection;
29
27
  constructor(connection: BasicConnection);
30
28
  publish(messages: TMessage[]): Promise<void>;
31
29
  }
32
- //# sourceMappingURL=BasicPublisher.d.ts.map
33
30
  //#endregion
34
31
  //#region src/basic/BasicSubscriber.d.ts
35
- declare class BasicSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
32
+ export declare class BasicSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
36
33
  private connection;
37
34
  constructor(connection: BasicConnection);
38
35
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
39
36
  }
40
- //# sourceMappingURL=BasicSubscriber.d.ts.map
41
-
42
37
  //#endregion
43
- export { BasicConnection, BasicPublisher, BasicSubscriber };
38
+ //#region src/basic/driver.d.ts
39
+ /**
40
+ * `basic://` — an in-process `EventEmitter`. Register it with
41
+ * `registerEventsDriver(basicEventsDriver)`.
42
+ */
43
+ export declare const basicEventsDriver: EventsDriver;
44
+ //#endregion
44
45
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts"],"sourcesContent":[],"mappings":";;;;cAIa,eAAA,YAA2B;EAA3B,SAAA,IAAA,GACC,kBAAA,CAAA,KAAA;EADe,QAAA,OAAA;EAAA,QACf,SAAA;EAAA,WAcF,CAAA;EAAe;;;;EAwBM,OAvCO,oBAAA,CAAA,iBAAA,EAAA,MAAA,CAAA,EAepC,OAfoC,CAe5B,eAf4B,CAAA;EAAe,OAAA,CAAA,CAAA,EAsBrC,OAtBqC,CAAA,IAAA,CAAA;WA0BvC;;;AC3BhB;;;EAA+D,IACpC,YAAA,CAAA,CAAA,EDuCN,YCvCM;;;;;cADd,gCAAgC,4CACjC,eAAe;;EDAd,WAAA,CAAA,UAAgB,ECEI,eDFJ;EAAA,OAAA,CAAA,QAAA,ECIJ,QDJI,EAAA,CAAA,ECIM,ODJN,CAAA,IAAA,CAAA;;;;;cEDhB,iCAAiC,4CAClC,gBAAgB;;EFAf,WAAA,CAAA,UAAgB,EEEI,eFFJ;EAAA,SAAA,CAAA,QAAA,EEKjB,QFLiB,CAAA,MAAA,CAAA,EAAA,EAAA,QAAA,EAAA,CAAA,OAAA,EEMP,QFNO,EAAA,GEMM,OFNN,CAAA,IAAA,CAAA,CAAA,EEOzB,OFPyB,CAAA,IAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts","../../src/basic/driver.ts"],"mappings":";;;qBAIa,2BAA2B;WAC9B,OAAI,mBAAA;UACL;UACA;EAER;;;;;SAQa,qBACZ,4BACE,QAAQ;EAOL,WAAW;EAIX,SAAS;EAKf;;;;;MAQI,gBAAgB;;;;qBCvCR,eAAe,iBAAiB,4CACjC,eAAe;UAEN;EAApB,YAAoB,YAAY;EAE1B,QAAQ,UAAU,aAAU;;;;qBCLtB,gBAAgB,iBAAiB,4CAClC,gBAAgB;UAEP;EAApB,YAAoB,YAAY;EAE1B,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B;;;;;;;;qBCFS,mBAAmB"}
@@ -1,9 +1,8 @@
1
- import { EventPublisherType } from "../types-CYDt-2RQ.mjs";
1
+ import { a as consumeTraced, s as publishTraced } from "../telemetry-DjjgJMul.mjs";
2
2
  import { EventEmitter } from "node:events";
3
-
4
3
  //#region src/basic/BasicConnection.ts
5
4
  var BasicConnection = class BasicConnection {
6
- type = EventPublisherType.Basic;
5
+ type = "basic";
7
6
  emitter;
8
7
  connected = false;
9
8
  constructor() {
@@ -36,33 +35,63 @@ var BasicConnection = class BasicConnection {
36
35
  return this.emitter;
37
36
  }
38
37
  };
39
-
40
38
  //#endregion
41
39
  //#region src/basic/BasicPublisher.ts
42
40
  var BasicPublisher = class {
41
+ connection;
43
42
  constructor(connection) {
44
43
  this.connection = connection;
45
44
  }
46
45
  async publish(messages) {
47
46
  const emitter = this.connection.eventEmitter;
48
- for (const message of messages) emitter.emit(message.type, message);
47
+ await publishTraced(messages, (message) => ({
48
+ system: "basic",
49
+ destination: message.type,
50
+ type: message.type
51
+ }), async (carriers) => {
52
+ messages.forEach((message, i) => {
53
+ emitter.emit(message.type, message, carriers[i]);
54
+ });
55
+ });
49
56
  }
50
57
  };
51
-
52
58
  //#endregion
53
59
  //#region src/basic/BasicSubscriber.ts
54
60
  var BasicSubscriber = class {
61
+ connection;
55
62
  constructor(connection) {
56
63
  this.connection = connection;
57
64
  }
58
65
  async subscribe(messages, listener) {
59
66
  const emitter = this.connection.eventEmitter;
60
- for (const messageType of messages) emitter.on(messageType, (message) => {
61
- listener(message).catch((_error) => {});
67
+ for (const messageType of messages) emitter.on(messageType, (message, carrier) => {
68
+ consumeTraced({
69
+ system: "basic",
70
+ destination: messageType,
71
+ type: messageType
72
+ }, carrier, () => listener(message)).catch((_error) => {});
62
73
  });
63
74
  }
64
75
  };
65
-
66
76
  //#endregion
67
- export { BasicConnection, BasicPublisher, BasicSubscriber };
77
+ //#region src/basic/driver.ts
78
+ /**
79
+ * `basic://` — an in-process `EventEmitter`. Register it with
80
+ * `registerEventsDriver(basicEventsDriver)`.
81
+ */
82
+ const basicEventsDriver = {
83
+ scheme: "basic",
84
+ connect: (url) => BasicConnection.fromConnectionString(url),
85
+ async publisher(url) {
86
+ return new BasicPublisher(await BasicConnection.fromConnectionString(url));
87
+ },
88
+ publisherFor: (connection) => new BasicPublisher(connection),
89
+ async subscriber(url) {
90
+ return new BasicSubscriber(await BasicConnection.fromConnectionString(url));
91
+ },
92
+ subscriberFor: (connection) => new BasicSubscriber(connection)
93
+ };
94
+ //#endregion
95
+ export { BasicConnection, BasicPublisher, BasicSubscriber, basicEventsDriver };
96
+
68
97
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["_connectionString: string","connection: BasicConnection","messages: TMessage[]","connection: BasicConnection","messages: TMessage['type'][]","listener: (payload: TMessage) => Promise<void>","message: TMessage"],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n\treadonly type = EventPublisherType.Basic;\n\tprivate emitter: EventEmitter;\n\tprivate connected = false;\n\n\tconstructor() {\n\t\tthis.emitter = new EventEmitter();\n\t}\n\n\t/**\n\t * Create a BasicConnection from a connection string\n\t * Format: basic://\n\t */\n\tstatic async fromConnectionString(\n\t\t_connectionString: string,\n\t): Promise<BasicConnection> {\n\t\t// Basic connection doesn't need any configuration\n\t\tconst connection = new BasicConnection();\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tthis.connected = true;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.emitter.removeAllListeners();\n\t\tthis.connected = false;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\t/**\n\t * Get the underlying EventEmitter\n\t * Used by BasicPublisher and BasicSubscriber\n\t */\n\tget eventEmitter(): EventEmitter {\n\t\treturn this.emitter;\n\t}\n}\n","import type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync publish(messages: TMessage[]) {\n\t\tconst emitter = this.connection.eventEmitter;\n\t\tfor (const message of messages) {\n\t\t\temitter.emit(message.type, message);\n\t\t}\n\t}\n}\n","import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tconst emitter = this.connection.eventEmitter;\n\n\t\tfor (const messageType of messages) {\n\t\t\temitter.on(messageType, (message: TMessage) => {\n\t\t\t\tlistener(message).catch((_error) => {});\n\t\t\t});\n\t\t}\n\t}\n}\n"],"mappings":";;;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACvD,AAAS,OAAO,mBAAmB;CACnC,AAAQ;CACR,AAAQ,YAAY;CAEpB,cAAc;AACb,OAAK,UAAU,IAAI;CACnB;;;;;CAMD,aAAa,qBACZA,mBAC2B;EAE3B,MAAM,aAAa,IAAI;AACvB,QAAM,WAAW,SAAS;AAC1B,SAAO;CACP;CAED,MAAM,UAAyB;AAC9B,OAAK,YAAY;CACjB;CAED,MAAM,QAAuB;AAC5B,OAAK,QAAQ,oBAAoB;AACjC,OAAK,YAAY;CACjB;CAED,cAAuB;AACtB,SAAO,KAAK;CACZ;;;;;CAMD,IAAI,eAA6B;AAChC,SAAO,KAAK;CACZ;AACD;;;;AC3CD,IAAa,iBAAb,MAEA;CACC,YAAoBC,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,QAAQC,UAAsB;EACnC,MAAM,UAAU,KAAK,WAAW;AAChC,OAAK,MAAM,WAAW,SACrB,SAAQ,KAAK,QAAQ,MAAM,QAAQ;CAEpC;AACD;;;;ACXD,IAAa,kBAAb,MAEA;CACC,YAAoBC,YAA6B;EAA7B;CAA+B;CAEnD,MAAM,UACLC,UACAC,UACgB;EAChB,MAAM,UAAU,KAAK,WAAW;AAEhC,OAAK,MAAM,eAAe,SACzB,SAAQ,GAAG,aAAa,CAACC,YAAsB;AAC9C,YAAS,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAE,EAAC;EACvC,EAAC;CAEH;AACD"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/basic/BasicConnection.ts","../../src/basic/BasicPublisher.ts","../../src/basic/BasicSubscriber.ts","../../src/basic/driver.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport class BasicConnection implements EventConnection {\n\treadonly type = EventPublisherType.Basic;\n\tprivate emitter: EventEmitter;\n\tprivate connected = false;\n\n\tconstructor() {\n\t\tthis.emitter = new EventEmitter();\n\t}\n\n\t/**\n\t * Create a BasicConnection from a connection string\n\t * Format: basic://\n\t */\n\tstatic async fromConnectionString(\n\t\t_connectionString: string,\n\t): Promise<BasicConnection> {\n\t\t// Basic connection doesn't need any configuration\n\t\tconst connection = new BasicConnection();\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tthis.connected = true;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.emitter.removeAllListeners();\n\t\tthis.connected = false;\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.connected;\n\t}\n\n\t/**\n\t * Get the underlying EventEmitter\n\t * Used by BasicPublisher and BasicSubscriber\n\t */\n\tget eventEmitter(): EventEmitter {\n\t\treturn this.emitter;\n\t}\n}\n","import { publishTraced } from '../telemetry';\nimport type { EventPublisher, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync publish(messages: TMessage[]) {\n\t\tconst emitter = this.connection.eventEmitter;\n\t\t// The trace context rides beside the message, as the emitter's second\n\t\t// argument, so the message a listener receives is the one published.\n\t\tawait publishTraced(\n\t\t\tmessages,\n\t\t\t(message) => ({\n\t\t\t\tsystem: 'basic',\n\t\t\t\tdestination: message.type,\n\t\t\t\ttype: message.type,\n\t\t\t}),\n\t\t\tasync (carriers) => {\n\t\t\t\tmessages.forEach((message, i) => {\n\t\t\t\t\temitter.emit(message.type, message, carriers[i]);\n\t\t\t\t});\n\t\t\t},\n\t\t);\n\t}\n}\n","import { consumeTraced, type TraceCarrier } from '../telemetry';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { BasicConnection } from './BasicConnection';\n\nexport class BasicSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(private connection: BasicConnection) {}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tconst emitter = this.connection.eventEmitter;\n\n\t\tfor (const messageType of messages) {\n\t\t\temitter.on(messageType, (message: TMessage, carrier?: TraceCarrier) => {\n\t\t\t\tconsumeTraced(\n\t\t\t\t\t{ system: 'basic', destination: messageType, type: messageType },\n\t\t\t\t\tcarrier,\n\t\t\t\t\t() => listener(message),\n\t\t\t\t).catch((_error) => {});\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { EventsDriver } from '../registry';\nimport { EventPublisherType } from '../types';\nimport { BasicConnection } from './BasicConnection';\nimport { BasicPublisher } from './BasicPublisher';\nimport { BasicSubscriber } from './BasicSubscriber';\n\n/**\n * `basic://` — an in-process `EventEmitter`. Register it with\n * `registerEventsDriver(basicEventsDriver)`.\n */\nexport const basicEventsDriver: EventsDriver = {\n\tscheme: EventPublisherType.Basic,\n\tconnect: (url) => BasicConnection.fromConnectionString(url),\n\tasync publisher(url) {\n\t\treturn new BasicPublisher(await BasicConnection.fromConnectionString(url));\n\t},\n\tpublisherFor: (connection) =>\n\t\tnew BasicPublisher(connection as BasicConnection),\n\tasync subscriber(url) {\n\t\treturn new BasicSubscriber(await BasicConnection.fromConnectionString(url));\n\t},\n\tsubscriberFor: (connection) =>\n\t\tnew BasicSubscriber(connection as BasicConnection),\n};\n"],"mappings":";;;AAIA,IAAa,kBAAb,MAAa,gBAA2C;CACvD,OAAS;CACT;CACA,YAAoB;CAEpB,cAAc;EACb,KAAK,UAAU,IAAI,aAAa;CACjC;;;;;CAMA,aAAa,qBACZ,mBAC2B;EAE3B,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,WAAW,QAAQ;EACzB,OAAO;CACR;CAEA,MAAM,UAAyB;EAC9B,KAAK,YAAY;CAClB;CAEA,MAAM,QAAuB;EAC5B,KAAK,QAAQ,mBAAmB;EAChC,KAAK,YAAY;CAClB;CAEA,cAAuB;EACtB,OAAO,KAAK;CACb;;;;;CAMA,IAAI,eAA6B;EAChC,OAAO,KAAK;CACb;AACD;;;AC1CA,IAAa,iBAAb,MAEA;CACqB;CAApB,YAAY,YAAqC;EAA7B,KAAA,aAAA;CAA8B;CAElD,MAAM,QAAQ,UAAsB;EACnC,MAAM,UAAU,KAAK,WAAW;EAGhC,MAAM,cACL,WACC,aAAa;GACb,QAAQ;GACR,aAAa,QAAQ;GACrB,MAAM,QAAQ;EACf,IACA,OAAO,aAAa;GACnB,SAAS,SAAS,SAAS,MAAM;IAChC,QAAQ,KAAK,QAAQ,MAAM,SAAS,SAAS,EAAE;GAChD,CAAC;EACF,CACD;CACD;AACD;;;ACvBA,IAAa,kBAAb,MAEA;CACqB;CAApB,YAAY,YAAqC;EAA7B,KAAA,aAAA;CAA8B;CAElD,MAAM,UACL,UACA,UACgB;EAChB,MAAM,UAAU,KAAK,WAAW;EAEhC,KAAK,MAAM,eAAe,UACzB,QAAQ,GAAG,cAAc,SAAmB,YAA2B;GACtE,cACC;IAAE,QAAQ;IAAS,aAAa;IAAa,MAAM;GAAY,GAC/D,eACM,SAAS,OAAO,CACvB,CAAC,CAAC,OAAO,WAAW,CAAC,CAAC;EACvB,CAAC;CAEH;AACD;;;;;;;ACfA,MAAa,oBAAkC;CAC9C,QAAA;CACA,UAAU,QAAQ,gBAAgB,qBAAqB,GAAG;CAC1D,MAAM,UAAU,KAAK;EACpB,OAAO,IAAI,eAAe,MAAM,gBAAgB,qBAAqB,GAAG,CAAC;CAC1E;CACA,eAAe,eACd,IAAI,eAAe,UAA6B;CACjD,MAAM,WAAW,KAAK;EACrB,OAAO,IAAI,gBAAgB,MAAM,gBAAgB,qBAAqB,GAAG,CAAC;CAC3E;CACA,gBAAgB,eACf,IAAI,gBAAgB,UAA6B;AACnD"}
package/dist/index.cjs CHANGED
@@ -1,192 +1,88 @@
1
- const require_types = require('./types-Byv8N9ma.cjs');
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_telemetry = require("./telemetry-DG3l807O.cjs");
3
+ const require_registry = require("./registry-DlT36229.cjs");
3
4
  //#region src/EventConnection.ts
4
5
  var EventConnectionFactory = class {
5
6
  /**
6
- * Create an EventConnection from a connection string
7
- * Dynamically imports the appropriate connection implementation
7
+ * Create an EventConnection from a connection string, through whichever
8
+ * driver is registered for its scheme — see `registerEventsDriver`.
9
+ *
10
+ * @throws {UnregisteredEventsScheme} when the broker's driver is not
11
+ * registered.
8
12
  */
9
13
  static async fromConnectionString(connectionStr) {
10
- const url = new URL(connectionStr);
11
- const protocol = url.protocol.replace(":", "");
12
- switch (protocol) {
13
- case require_types.EventPublisherType.Basic: {
14
- const { BasicConnection } = await Promise.resolve().then(() => require("./basic/index.cjs"));
15
- return BasicConnection.fromConnectionString(connectionStr);
16
- }
17
- case require_types.EventPublisherType.RabbitMQ: {
18
- const { RabbitMQConnection } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
19
- return RabbitMQConnection.fromConnectionString(connectionStr);
20
- }
21
- case require_types.EventPublisherType.SQS: {
22
- const { SQSConnection } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
23
- return SQSConnection.fromConnectionString(connectionStr);
24
- }
25
- case require_types.EventPublisherType.SNS: {
26
- const { SNSConnection } = await Promise.resolve().then(() => require("./sns/index.cjs"));
27
- return SNSConnection.fromConnectionString(connectionStr);
28
- }
29
- case require_types.EventPublisherType.PgBoss: {
30
- const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
31
- return PgBossConnection.fromConnectionString(connectionStr);
32
- }
33
- default: throw new Error(`Unsupported connection type: ${protocol}`);
34
- }
14
+ const scheme = new URL(connectionStr).protocol;
15
+ return require_registry.eventsDriverFor(scheme, "connection").connect(connectionStr);
35
16
  }
36
17
  };
37
-
38
18
  //#endregion
39
19
  //#region src/Publisher.ts
20
+ /**
21
+ * Publishers for a connection string or a connection, through whichever
22
+ * driver is registered for its scheme — see `registerEventsDriver`.
23
+ */
40
24
  var Publisher = class {
41
25
  /**
42
26
  * Create a publisher from a connection string
43
27
  * This creates both a connection and a publisher
28
+ *
29
+ * @throws {UnregisteredEventsScheme} when the broker's driver is not
30
+ * registered.
44
31
  */
45
- static async fromConnectionString(connectionStr) {
46
- const url = new URL(connectionStr);
47
- switch (url.protocol.replace(":", "")) {
48
- case require_types.EventPublisherType.Basic: {
49
- const { BasicConnection, BasicPublisher } = await Promise.resolve().then(() => require("./basic/index.cjs"));
50
- const connection = await BasicConnection.fromConnectionString(connectionStr);
51
- return new BasicPublisher(connection);
52
- }
53
- case require_types.EventPublisherType.RabbitMQ: {
54
- const { RabbitMQPublisher } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
55
- return RabbitMQPublisher.fromConnectionString(connectionStr);
56
- }
57
- case require_types.EventPublisherType.SQS: {
58
- const { SQSPublisher } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
59
- return SQSPublisher.fromConnectionString(connectionStr);
60
- }
61
- case require_types.EventPublisherType.SNS: {
62
- const { SNSPublisher } = await Promise.resolve().then(() => require("./sns/index.cjs"));
63
- return SNSPublisher.fromConnectionString(connectionStr);
64
- }
65
- case require_types.EventPublisherType.PgBoss: {
66
- const { PgBossPublisher } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
67
- return PgBossPublisher.fromConnectionString(connectionStr);
68
- }
69
- default: throw new Error(`Unsupported event publisher type: ${url.protocol}`);
70
- }
32
+ static async fromConnectionString(connectionStr, options = {}) {
33
+ const scheme = new URL(connectionStr).protocol;
34
+ return require_registry.eventsDriverFor(scheme, "publisher").publisher(connectionStr, options);
71
35
  }
72
36
  /**
73
37
  * Create a publisher from an existing connection
74
38
  * This allows sharing connections between publishers and subscribers
75
39
  */
76
- static async fromConnection(connection) {
77
- switch (connection.type) {
78
- case require_types.EventPublisherType.Basic: {
79
- const { BasicPublisher } = await Promise.resolve().then(() => require("./basic/index.cjs"));
80
- const { BasicConnection } = await Promise.resolve().then(() => require("./basic/index.cjs"));
81
- return new BasicPublisher(connection);
82
- }
83
- case require_types.EventPublisherType.RabbitMQ: {
84
- const { RabbitMQPublisher } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
85
- const { RabbitMQConnection } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
86
- return new RabbitMQPublisher(connection);
87
- }
88
- case require_types.EventPublisherType.SQS: {
89
- const { SQSPublisher } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
90
- const { SQSConnection } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
91
- return new SQSPublisher(connection);
92
- }
93
- case require_types.EventPublisherType.SNS: {
94
- const { SNSPublisher } = await Promise.resolve().then(() => require("./sns/index.cjs"));
95
- const { SNSConnection } = await Promise.resolve().then(() => require("./sns/index.cjs"));
96
- return new SNSPublisher(connection);
97
- }
98
- case require_types.EventPublisherType.PgBoss: {
99
- const { PgBossPublisher } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
100
- const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
101
- return new PgBossPublisher(connection);
102
- }
103
- default: throw new Error(`Unsupported connection type: ${connection.type}`);
104
- }
40
+ static async fromConnection(connection, options = {}) {
41
+ return require_registry.eventsDriverFor(connection.type, "publisher").publisherFor(connection, options);
105
42
  }
106
43
  };
107
-
108
44
  //#endregion
109
45
  //#region src/Subscriber.ts
46
+ /**
47
+ * Subscribers for a connection string or a connection, through whichever
48
+ * driver is registered for its scheme — see `registerEventsDriver`.
49
+ */
110
50
  var Subscriber = class {
111
51
  /**
112
52
  * Create a subscriber from a connection string
113
53
  * This creates both a connection and a subscriber
54
+ *
55
+ * @throws {UnregisteredEventsScheme} when the broker's driver is not
56
+ * registered.
114
57
  */
115
58
  static async fromConnectionString(connectionStr) {
116
- const url = new URL(connectionStr);
117
- switch (url.protocol.replace(":", "")) {
118
- case require_types.EventPublisherType.Basic: {
119
- const { BasicConnection, BasicSubscriber } = await Promise.resolve().then(() => require("./basic/index.cjs"));
120
- const connection = await BasicConnection.fromConnectionString(connectionStr);
121
- return new BasicSubscriber(connection);
122
- }
123
- case require_types.EventPublisherType.RabbitMQ: {
124
- const { RabbitMQSubscriber } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
125
- return RabbitMQSubscriber.fromConnectionString(connectionStr);
126
- }
127
- case require_types.EventPublisherType.SNS: {
128
- const { SNSSubscriber } = await Promise.resolve().then(() => require("./sns/index.cjs"));
129
- return SNSSubscriber.fromConnectionString(connectionStr);
130
- }
131
- case require_types.EventPublisherType.SQS: {
132
- const url$1 = new URL(connectionStr);
133
- const topicArn = url$1.searchParams.get("topicArn");
134
- if (topicArn) {
135
- const { SNSSubscriber } = await Promise.resolve().then(() => require("./sns/index.cjs"));
136
- const snsConnectionStr = connectionStr.replace("sqs://", "sns://");
137
- return SNSSubscriber.fromConnectionString(snsConnectionStr);
138
- }
139
- const { SQSSubscriber } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
140
- const { SQSConnection } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
141
- const connection = await SQSConnection.fromConnectionString(connectionStr);
142
- return new SQSSubscriber(connection);
143
- }
144
- case require_types.EventPublisherType.PgBoss: {
145
- const { PgBossSubscriber } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
146
- return PgBossSubscriber.fromConnectionString(connectionStr);
147
- }
148
- default: throw new Error(`Unsupported event subscriber type: ${url.protocol}`);
149
- }
59
+ const scheme = new URL(connectionStr).protocol;
60
+ return require_registry.eventsDriverFor(scheme, "subscriber").subscriber(connectionStr);
150
61
  }
151
62
  /**
152
63
  * Create a subscriber from an existing connection
153
64
  * This allows sharing connections between publishers and subscribers
154
65
  */
155
- static async fromConnection(connection) {
156
- switch (connection.type) {
157
- case require_types.EventPublisherType.Basic: {
158
- const { BasicSubscriber } = await Promise.resolve().then(() => require("./basic/index.cjs"));
159
- const { BasicConnection } = await Promise.resolve().then(() => require("./basic/index.cjs"));
160
- return new BasicSubscriber(connection);
161
- }
162
- case require_types.EventPublisherType.RabbitMQ: {
163
- const { RabbitMQSubscriber } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
164
- const { RabbitMQConnection } = await Promise.resolve().then(() => require("./rabbitmq/index.cjs"));
165
- return new RabbitMQSubscriber(connection);
166
- }
167
- case require_types.EventPublisherType.SNS: {
168
- const { SNSSubscriber } = await Promise.resolve().then(() => require("./sns/index.cjs"));
169
- const { SNSConnection } = await Promise.resolve().then(() => require("./sns/index.cjs"));
170
- return new SNSSubscriber(connection);
171
- }
172
- case require_types.EventPublisherType.SQS: {
173
- const { SQSSubscriber } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
174
- const { SQSConnection } = await Promise.resolve().then(() => require("./sqs/index.cjs"));
175
- return new SQSSubscriber(connection);
176
- }
177
- case require_types.EventPublisherType.PgBoss: {
178
- const { PgBossSubscriber } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
179
- const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
180
- return new PgBossSubscriber(connection);
181
- }
182
- default: throw new Error(`Unsupported connection type: ${connection.type}`);
183
- }
66
+ static async fromConnection(connection, options = {}) {
67
+ return require_registry.eventsDriverFor(connection.type, "subscriber").subscriberFor(connection, options);
184
68
  }
185
69
  };
186
-
187
70
  //#endregion
188
71
  exports.EventConnectionFactory = EventConnectionFactory;
189
- exports.EventPublisherType = require_types.EventPublisherType;
72
+ exports.EventPublisherType = require_telemetry.EventPublisherType;
190
73
  exports.Publisher = Publisher;
191
74
  exports.Subscriber = Subscriber;
75
+ exports.TRACE_CONTEXT_KEY = require_telemetry.TRACE_CONTEXT_KEY;
76
+ exports.UnregisteredEventsScheme = require_registry.UnregisteredEventsScheme;
77
+ exports.UnsupportedEventTransport = require_telemetry.UnsupportedEventTransport;
78
+ exports.carrierFromAttributes = require_telemetry.carrierFromAttributes;
79
+ exports.consumeBatchTraced = require_telemetry.consumeBatchTraced;
80
+ exports.consumeTraced = require_telemetry.consumeTraced;
81
+ exports.eventsDriverFor = require_registry.eventsDriverFor;
82
+ exports.extractTraceContext = require_telemetry.extractTraceContext;
83
+ exports.publishTraced = require_telemetry.publishTraced;
84
+ exports.registerEventsDriver = require_registry.registerEventsDriver;
85
+ exports.registeredEventsSchemes = require_registry.registeredEventsSchemes;
86
+ exports.withoutTraceKey = require_telemetry.withoutTraceKey;
87
+
192
88
  //# sourceMappingURL=index.cjs.map