@geekmidas/events 10.0.0-alpha.13 → 10.0.0-alpha.14
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/{SQSSubscriber-cpo624qU.mjs → SQSSubscriber-BXLE_1L3.mjs} +2 -2
- package/dist/{SQSSubscriber-cpo624qU.mjs.map → SQSSubscriber-BXLE_1L3.mjs.map} +1 -1
- package/dist/{SQSSubscriber-DLPZCzFE.cjs → SQSSubscriber-DtRUaZB3.cjs} +2 -2
- package/dist/{SQSSubscriber-DLPZCzFE.cjs.map → SQSSubscriber-DtRUaZB3.cjs.map} +1 -1
- package/dist/basic/index.cjs +1 -1
- package/dist/basic/index.d.cts +1 -1
- package/dist/basic/index.d.mts +1 -1
- package/dist/basic/index.mjs +1 -1
- package/dist/index.cjs +7 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/dist/pgboss/index.cjs +13 -3
- package/dist/pgboss/index.cjs.map +1 -1
- package/dist/pgboss/index.d.cts +7 -1
- package/dist/pgboss/index.d.cts.map +1 -1
- package/dist/pgboss/index.d.mts +7 -1
- package/dist/pgboss/index.d.mts.map +1 -1
- package/dist/pgboss/index.mjs +13 -4
- package/dist/pgboss/index.mjs.map +1 -1
- package/dist/rabbitmq/index.cjs +13 -3
- package/dist/rabbitmq/index.cjs.map +1 -1
- package/dist/rabbitmq/index.d.cts +7 -1
- package/dist/rabbitmq/index.d.cts.map +1 -1
- package/dist/rabbitmq/index.d.mts +7 -1
- package/dist/rabbitmq/index.d.mts.map +1 -1
- package/dist/rabbitmq/index.mjs +13 -4
- package/dist/rabbitmq/index.mjs.map +1 -1
- package/dist/sns/index.cjs +16 -3
- package/dist/sns/index.cjs.map +1 -1
- package/dist/sns/index.d.cts +9 -1
- package/dist/sns/index.d.cts.map +1 -1
- package/dist/sns/index.d.mts +9 -1
- package/dist/sns/index.d.mts.map +1 -1
- package/dist/sns/index.mjs +16 -4
- package/dist/sns/index.mjs.map +1 -1
- package/dist/sqs/index.cjs +17 -6
- package/dist/sqs/index.cjs.map +1 -1
- package/dist/sqs/index.d.cts +14 -1
- package/dist/sqs/index.d.cts.map +1 -1
- package/dist/sqs/index.d.mts +14 -1
- package/dist/sqs/index.d.mts.map +1 -1
- package/dist/sqs/index.mjs +17 -7
- package/dist/sqs/index.mjs.map +1 -1
- package/dist/types-BcZjLxVV.cjs +51 -0
- package/dist/types-BcZjLxVV.cjs.map +1 -0
- package/dist/types-Bk5JM6MP.mjs +40 -0
- package/dist/types-Bk5JM6MP.mjs.map +1 -0
- package/dist/{types-lnM-qoe_.d.cts → types-gGaoT8qc.d.cts} +11 -2
- package/dist/{types-lnM-qoe_.d.cts.map → types-gGaoT8qc.d.cts.map} +1 -1
- package/dist/{types-lnM-qoe_.d.mts → types-gGaoT8qc.d.mts} +11 -2
- package/dist/{types-lnM-qoe_.d.mts.map → types-gGaoT8qc.d.mts.map} +1 -1
- package/package.json +3 -3
- package/dist/types-C15FC0qp.mjs +0 -18
- package/dist/types-C15FC0qp.mjs.map +0 -1
- package/dist/types-DXNwyRyg.cjs +0 -23
- package/dist/types-DXNwyRyg.cjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import "./types-
|
|
2
|
+
import "./types-Bk5JM6MP.mjs";
|
|
3
3
|
import { parse } from "./sqs/sqsUrl.mjs";
|
|
4
4
|
import { DeleteMessageCommand, ReceiveMessageCommand, SQSClient } from "@aws-sdk/client-sqs";
|
|
5
5
|
//#region src/sqs/SQSConnection.ts
|
|
@@ -177,4 +177,4 @@ var SQSSubscriber = class {
|
|
|
177
177
|
//#endregion
|
|
178
178
|
export { SQSConnection as n, SQSConnection_exports as r, SQSSubscriber as t };
|
|
179
179
|
|
|
180
|
-
//# sourceMappingURL=SQSSubscriber-
|
|
180
|
+
//# sourceMappingURL=SQSSubscriber-BXLE_1L3.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQSSubscriber-cpo624qU.mjs","names":["sqsUrl.parse"],"sources":["../src/sqs/SQSConnection.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®ion=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\tDeleteMessageCommand,\n\ttype Message,\n\tReceiveMessageCommand,\n} from '@aws-sdk/client-sqs';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\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(message.Body);\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 } = 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\tif (this.listener) {\n\t\t\t\t\t\tawait this.listener(payload as TMessage);\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(body: string): {\n\t\tpayload: unknown;\n\t\tmessageType: string | undefined;\n\t\ttopicArn?: string;\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};\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};\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
|
+
{"version":3,"file":"SQSSubscriber-BXLE_1L3.mjs","names":["sqsUrl.parse"],"sources":["../src/sqs/SQSConnection.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®ion=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\tDeleteMessageCommand,\n\ttype Message,\n\tReceiveMessageCommand,\n} from '@aws-sdk/client-sqs';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\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(message.Body);\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 } = 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\tif (this.listener) {\n\t\t\t\t\t\tawait this.listener(payload as TMessage);\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(body: string): {\n\t\tpayload: unknown;\n\t\tmessageType: string | undefined;\n\t\ttopicArn?: string;\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};\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};\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,5 +1,5 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
|
|
2
|
-
require("./types-
|
|
2
|
+
require("./types-BcZjLxVV.cjs");
|
|
3
3
|
const require_sqs_sqsUrl = require("./sqs/sqsUrl.cjs");
|
|
4
4
|
let _aws_sdk_client_sqs = require("@aws-sdk/client-sqs");
|
|
5
5
|
//#region src/sqs/SQSConnection.ts
|
|
@@ -194,4 +194,4 @@ Object.defineProperty(exports, "SQSSubscriber", {
|
|
|
194
194
|
}
|
|
195
195
|
});
|
|
196
196
|
|
|
197
|
-
//# sourceMappingURL=SQSSubscriber-
|
|
197
|
+
//# sourceMappingURL=SQSSubscriber-DtRUaZB3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQSSubscriber-DLPZCzFE.cjs","names":["SQSClient","ReceiveMessageCommand","DeleteMessageCommand"],"sources":["../src/sqs/SQSConnection.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®ion=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\tDeleteMessageCommand,\n\ttype Message,\n\tReceiveMessageCommand,\n} from '@aws-sdk/client-sqs';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\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(message.Body);\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 } = 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\tif (this.listener) {\n\t\t\t\t\t\tawait this.listener(payload as TMessage);\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(body: string): {\n\t\tpayload: unknown;\n\t\tmessageType: string | undefined;\n\t\ttopicArn?: string;\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};\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};\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
|
+
{"version":3,"file":"SQSSubscriber-DtRUaZB3.cjs","names":["SQSClient","ReceiveMessageCommand","DeleteMessageCommand"],"sources":["../src/sqs/SQSConnection.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®ion=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\tDeleteMessageCommand,\n\ttype Message,\n\tReceiveMessageCommand,\n} from '@aws-sdk/client-sqs';\nimport type { EventSubscriber, PublishableMessage } from '../types';\nimport type { SQSConnection } from './SQSConnection';\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(message.Body);\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 } = 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\tif (this.listener) {\n\t\t\t\t\t\tawait this.listener(payload as TMessage);\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(body: string): {\n\t\tpayload: unknown;\n\t\tmessageType: string | undefined;\n\t\ttopicArn?: string;\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};\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};\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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"}
|
package/dist/basic/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("../types-
|
|
2
|
+
require("../types-BcZjLxVV.cjs");
|
|
3
3
|
let node_events = require("node:events");
|
|
4
4
|
//#region src/basic/BasicConnection.ts
|
|
5
5
|
var BasicConnection = class BasicConnection {
|
package/dist/basic/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-
|
|
1
|
+
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-gGaoT8qc.cjs";
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
3
|
//#region src/basic/BasicConnection.d.ts
|
|
4
4
|
export declare class BasicConnection implements EventConnection {
|
package/dist/basic/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-
|
|
1
|
+
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-gGaoT8qc.mjs";
|
|
2
2
|
import { EventEmitter } from "node:events";
|
|
3
3
|
//#region src/basic/BasicConnection.d.ts
|
|
4
4
|
export declare class BasicConnection implements EventConnection {
|
package/dist/basic/index.mjs
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_types = require("./types-
|
|
2
|
+
const require_types = require("./types-BcZjLxVV.cjs");
|
|
3
3
|
//#region src/EventConnection.ts
|
|
4
4
|
var EventConnectionFactory = class {
|
|
5
5
|
/**
|
|
@@ -29,7 +29,7 @@ var EventConnectionFactory = class {
|
|
|
29
29
|
const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
|
|
30
30
|
return PgBossConnection.fromConnectionString(connectionStr);
|
|
31
31
|
}
|
|
32
|
-
default: throw new
|
|
32
|
+
default: throw new require_types.UnsupportedEventTransport(protocol, "connection");
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
};
|
|
@@ -63,7 +63,7 @@ var Publisher = class {
|
|
|
63
63
|
const { PgBossPublisher } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
|
|
64
64
|
return PgBossPublisher.fromConnectionString(connectionStr);
|
|
65
65
|
}
|
|
66
|
-
default: throw new
|
|
66
|
+
default: throw new require_types.UnsupportedEventTransport(url.protocol.replace(":", ""), "publisher");
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
@@ -97,7 +97,7 @@ var Publisher = class {
|
|
|
97
97
|
const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
|
|
98
98
|
return new PgBossPublisher(connection);
|
|
99
99
|
}
|
|
100
|
-
default: throw new
|
|
100
|
+
default: throw new require_types.UnsupportedEventTransport(connection.type, "publisher");
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
103
|
};
|
|
@@ -137,7 +137,7 @@ var Subscriber = class {
|
|
|
137
137
|
const { PgBossSubscriber } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
|
|
138
138
|
return PgBossSubscriber.fromConnectionString(connectionStr);
|
|
139
139
|
}
|
|
140
|
-
default: throw new
|
|
140
|
+
default: throw new require_types.UnsupportedEventTransport(url.protocol.replace(":", ""), "subscriber");
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
/**
|
|
@@ -171,7 +171,7 @@ var Subscriber = class {
|
|
|
171
171
|
const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
|
|
172
172
|
return new PgBossSubscriber(connection);
|
|
173
173
|
}
|
|
174
|
-
default: throw new
|
|
174
|
+
default: throw new require_types.UnsupportedEventTransport(connection.type, "subscriber");
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
};
|
|
@@ -180,5 +180,6 @@ exports.EventConnectionFactory = EventConnectionFactory;
|
|
|
180
180
|
exports.EventPublisherType = require_types.EventPublisherType;
|
|
181
181
|
exports.Publisher = Publisher;
|
|
182
182
|
exports.Subscriber = Subscriber;
|
|
183
|
+
exports.UnsupportedEventTransport = require_types.UnsupportedEventTransport;
|
|
183
184
|
|
|
184
185
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"sourcesContent":["import type { EventConnection } from './types';\nimport { EventPublisherType } from './types';\n\nexport class EventConnectionFactory {\n\t/**\n\t * Create an EventConnection from a connection string\n\t * Dynamically imports the appropriate connection implementation\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionStr: string,\n\t): Promise<EventConnection> {\n\t\tconst url = new URL(connectionStr);\n\t\tconst protocol = url.protocol.replace(':', '') as EventPublisherType;\n\n\t\tswitch (protocol) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn BasicConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn SQSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn SNSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn PgBossConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${protocol}`);\n\t\t}\n\t}\n}\n\nexport type { EventConnection } from './types';\nexport { EventPublisherType } from './types';\n","import type {\n\tEventConnection,\n\tEventPublisher,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType } from './types';\n\nexport class Publisher {\n\t/**\n\t * Create a publisher from a connection string\n\t * This creates both a connection and a publisher\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventPublisherConnectionString,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicPublisher } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicPublisher<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\treturn SQSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\treturn SNSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\treturn PgBossPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported event publisher type: ${url.protocol}`);\n\t\t}\n\t}\n\n\t/**\n\t * Create a publisher from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicPublisher } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${connection.type}`);\n\t\t}\n\t}\n}\n\nexport type EventPublisherConnectionString =\n\t`${EventPublisherType}://${string}`;\n","import type {\n\tEventConnection,\n\tEventSubscriber,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType } from './types';\n\nexport class Subscriber {\n\t/**\n\t * Create a subscriber from a connection string\n\t * This creates both a connection and a subscriber\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventSubscriberConnectionString,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicSubscriber } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst url = new URL(connectionStr);\n\t\t\t\tconst topicArn = url.searchParams.get('topicArn');\n\n\t\t\t\t// If topicArn is present, use managed SNS→SQS subscription\n\t\t\t\tif (topicArn) {\n\t\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\t\t// Convert SQS connection string to SNS connection string\n\t\t\t\t\tconst snsConnectionStr = connectionStr.replace('sqs://', 'sns://');\n\t\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(snsConnectionStr);\n\t\t\t\t}\n\n\t\t\t\t// Direct SQS subscriber\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait SQSConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new SQSSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\treturn PgBossSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported event subscriber type: ${url.protocol}`);\n\t\t}\n\t}\n\n\t/**\n\t * Create a subscriber from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicSubscriber } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${connection.type}`);\n\t\t}\n\t}\n}\n\nexport type EventSubscriberConnectionString =\n\t`${EventPublisherType}://${string}`;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["UnsupportedEventTransport","UnsupportedEventTransport","UnsupportedEventTransport"],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"sourcesContent":["import type { EventConnection } from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class EventConnectionFactory {\n\t/**\n\t * Create an EventConnection from a connection string\n\t * Dynamically imports the appropriate connection implementation\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionStr: string,\n\t): Promise<EventConnection> {\n\t\tconst url = new URL(connectionStr);\n\t\tconst protocol = url.protocol.replace(':', '') as EventPublisherType;\n\n\t\tswitch (protocol) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn BasicConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn SQSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn SNSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn PgBossConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(protocol, 'connection');\n\t\t}\n\t}\n}\n\nexport type { EventConnection } from './types';\nexport { EventPublisherType } from './types';\n","import type {\n\tEventConnection,\n\tEventPublisher,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class Publisher {\n\t/**\n\t * Create a publisher from a connection string\n\t * This creates both a connection and a publisher\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventPublisherConnectionString,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicPublisher } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicPublisher<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\treturn SQSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\treturn SNSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\treturn PgBossPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(\n\t\t\t\t\turl.protocol.replace(':', ''),\n\t\t\t\t\t'publisher',\n\t\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a publisher from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicPublisher } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(connection.type, 'publisher');\n\t\t}\n\t}\n}\n\nexport type EventPublisherConnectionString =\n\t`${EventPublisherType}://${string}`;\n","import type {\n\tEventConnection,\n\tEventSubscriber,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class Subscriber {\n\t/**\n\t * Create a subscriber from a connection string\n\t * This creates both a connection and a subscriber\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventSubscriberConnectionString,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicSubscriber } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst url = new URL(connectionStr);\n\t\t\t\tconst topicArn = url.searchParams.get('topicArn');\n\n\t\t\t\t// If topicArn is present, use managed SNS→SQS subscription\n\t\t\t\tif (topicArn) {\n\t\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\t\t// Convert SQS connection string to SNS connection string\n\t\t\t\t\tconst snsConnectionStr = connectionStr.replace('sqs://', 'sns://');\n\t\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(snsConnectionStr);\n\t\t\t\t}\n\n\t\t\t\t// Direct SQS subscriber\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait SQSConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new SQSSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\treturn PgBossSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(\n\t\t\t\t\turl.protocol.replace(':', ''),\n\t\t\t\t\t'subscriber',\n\t\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a subscriber from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicSubscriber } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(connection.type, 'subscriber');\n\t\t}\n\t}\n}\n\nexport type EventSubscriberConnectionString =\n\t`${EventPublisherType}://${string}`;\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ExtractPublisherMessage, i as EventSubscriber, n as EventPublisher, o as MappedEvent, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "./types-
|
|
1
|
+
import { a as ExtractPublisherMessage, c as UnsupportedEventTransport, i as EventSubscriber, n as EventPublisher, o as MappedEvent, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "./types-gGaoT8qc.cjs";
|
|
2
2
|
//#region src/EventConnection.d.ts
|
|
3
3
|
export declare class EventConnectionFactory {
|
|
4
4
|
/**
|
|
@@ -38,5 +38,5 @@ export declare class Subscriber {
|
|
|
38
38
|
}
|
|
39
39
|
type EventSubscriberConnectionString = `${EventPublisherType}://${string}`;
|
|
40
40
|
//#endregion
|
|
41
|
-
export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage };
|
|
41
|
+
export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, UnsupportedEventTransport };
|
|
42
42
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;qBCHC;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,iCACb,QAAQ,eAAe;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;qBCHC;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,iCACb,QAAQ,eAAe;;;;;SAsCb,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,eAAe;;KA2Cf,oCACR;;;qBC7FS;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,kCACb,QAAQ,gBAAgB;;;;;SAqDd,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,gBAAgB;;KA2ChB,qCACR"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as ExtractPublisherMessage, i as EventSubscriber, n as EventPublisher, o as MappedEvent, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "./types-
|
|
1
|
+
import { a as ExtractPublisherMessage, c as UnsupportedEventTransport, i as EventSubscriber, n as EventPublisher, o as MappedEvent, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "./types-gGaoT8qc.mjs";
|
|
2
2
|
//#region src/EventConnection.d.ts
|
|
3
3
|
export declare class EventConnectionFactory {
|
|
4
4
|
/**
|
|
@@ -38,5 +38,5 @@ export declare class Subscriber {
|
|
|
38
38
|
}
|
|
39
39
|
type EventSubscriberConnectionString = `${EventPublisherType}://${string}`;
|
|
40
40
|
//#endregion
|
|
41
|
-
export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage };
|
|
41
|
+
export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, UnsupportedEventTransport };
|
|
42
42
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;qBCHC;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,iCACb,QAAQ,eAAe;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;qBCHC;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,iCACb,QAAQ,eAAe;;;;;SAsCb,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,eAAe;;KA2Cf,oCACR;;;qBC7FS;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,kCACb,QAAQ,gBAAgB;;;;;SAqDd,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,gBAAgB;;KA2ChB,qCACR"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as EventPublisherType } from "./types-
|
|
1
|
+
import { n as UnsupportedEventTransport, t as EventPublisherType } from "./types-Bk5JM6MP.mjs";
|
|
2
2
|
//#region src/EventConnection.ts
|
|
3
3
|
var EventConnectionFactory = class {
|
|
4
4
|
/**
|
|
@@ -28,7 +28,7 @@ var EventConnectionFactory = class {
|
|
|
28
28
|
const { PgBossConnection } = await import("./pgboss/index.mjs");
|
|
29
29
|
return PgBossConnection.fromConnectionString(connectionStr);
|
|
30
30
|
}
|
|
31
|
-
default: throw new
|
|
31
|
+
default: throw new UnsupportedEventTransport(protocol, "connection");
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
};
|
|
@@ -62,7 +62,7 @@ var Publisher = class {
|
|
|
62
62
|
const { PgBossPublisher } = await import("./pgboss/index.mjs");
|
|
63
63
|
return PgBossPublisher.fromConnectionString(connectionStr);
|
|
64
64
|
}
|
|
65
|
-
default: throw new
|
|
65
|
+
default: throw new UnsupportedEventTransport(url.protocol.replace(":", ""), "publisher");
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
@@ -96,7 +96,7 @@ var Publisher = class {
|
|
|
96
96
|
const { PgBossConnection } = await import("./pgboss/index.mjs");
|
|
97
97
|
return new PgBossPublisher(connection);
|
|
98
98
|
}
|
|
99
|
-
default: throw new
|
|
99
|
+
default: throw new UnsupportedEventTransport(connection.type, "publisher");
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
};
|
|
@@ -136,7 +136,7 @@ var Subscriber = class {
|
|
|
136
136
|
const { PgBossSubscriber } = await import("./pgboss/index.mjs");
|
|
137
137
|
return PgBossSubscriber.fromConnectionString(connectionStr);
|
|
138
138
|
}
|
|
139
|
-
default: throw new
|
|
139
|
+
default: throw new UnsupportedEventTransport(url.protocol.replace(":", ""), "subscriber");
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
/**
|
|
@@ -170,11 +170,11 @@ var Subscriber = class {
|
|
|
170
170
|
const { PgBossConnection } = await import("./pgboss/index.mjs");
|
|
171
171
|
return new PgBossSubscriber(connection);
|
|
172
172
|
}
|
|
173
|
-
default: throw new
|
|
173
|
+
default: throw new UnsupportedEventTransport(connection.type, "subscriber");
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
};
|
|
177
177
|
//#endregion
|
|
178
|
-
export { EventConnectionFactory, EventPublisherType, Publisher, Subscriber };
|
|
178
|
+
export { EventConnectionFactory, EventPublisherType, Publisher, Subscriber, UnsupportedEventTransport };
|
|
179
179
|
|
|
180
180
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"sourcesContent":["import type { EventConnection } from './types';\nimport { EventPublisherType } from './types';\n\nexport class EventConnectionFactory {\n\t/**\n\t * Create an EventConnection from a connection string\n\t * Dynamically imports the appropriate connection implementation\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionStr: string,\n\t): Promise<EventConnection> {\n\t\tconst url = new URL(connectionStr);\n\t\tconst protocol = url.protocol.replace(':', '') as EventPublisherType;\n\n\t\tswitch (protocol) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn BasicConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn SQSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn SNSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn PgBossConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${protocol}`);\n\t\t}\n\t}\n}\n\nexport type { EventConnection } from './types';\nexport { EventPublisherType } from './types';\n","import type {\n\tEventConnection,\n\tEventPublisher,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType } from './types';\n\nexport class Publisher {\n\t/**\n\t * Create a publisher from a connection string\n\t * This creates both a connection and a publisher\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventPublisherConnectionString,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicPublisher } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicPublisher<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\treturn SQSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\treturn SNSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\treturn PgBossPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported event publisher type: ${url.protocol}`);\n\t\t}\n\t}\n\n\t/**\n\t * Create a publisher from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicPublisher } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${connection.type}`);\n\t\t}\n\t}\n}\n\nexport type EventPublisherConnectionString =\n\t`${EventPublisherType}://${string}`;\n","import type {\n\tEventConnection,\n\tEventSubscriber,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType } from './types';\n\nexport class Subscriber {\n\t/**\n\t * Create a subscriber from a connection string\n\t * This creates both a connection and a subscriber\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventSubscriberConnectionString,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicSubscriber } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst url = new URL(connectionStr);\n\t\t\t\tconst topicArn = url.searchParams.get('topicArn');\n\n\t\t\t\t// If topicArn is present, use managed SNS→SQS subscription\n\t\t\t\tif (topicArn) {\n\t\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\t\t// Convert SQS connection string to SNS connection string\n\t\t\t\t\tconst snsConnectionStr = connectionStr.replace('sqs://', 'sns://');\n\t\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(snsConnectionStr);\n\t\t\t\t}\n\n\t\t\t\t// Direct SQS subscriber\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait SQSConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new SQSSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\treturn PgBossSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported event subscriber type: ${url.protocol}`);\n\t\t}\n\t}\n\n\t/**\n\t * Create a subscriber from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicSubscriber } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unsupported connection type: ${connection.type}`);\n\t\t}\n\t}\n}\n\nexport type EventSubscriberConnectionString =\n\t`${EventPublisherType}://${string}`;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"sourcesContent":["import type { EventConnection } from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class EventConnectionFactory {\n\t/**\n\t * Create an EventConnection from a connection string\n\t * Dynamically imports the appropriate connection implementation\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionStr: string,\n\t): Promise<EventConnection> {\n\t\tconst url = new URL(connectionStr);\n\t\tconst protocol = url.protocol.replace(':', '') as EventPublisherType;\n\n\t\tswitch (protocol) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn BasicConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn SQSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn SNSConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn PgBossConnection.fromConnectionString(connectionStr);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(protocol, 'connection');\n\t\t}\n\t}\n}\n\nexport type { EventConnection } from './types';\nexport { EventPublisherType } from './types';\n","import type {\n\tEventConnection,\n\tEventPublisher,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class Publisher {\n\t/**\n\t * Create a publisher from a connection string\n\t * This creates both a connection and a publisher\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventPublisherConnectionString,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicPublisher } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicPublisher<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\treturn SQSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\treturn SNSPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\treturn PgBossPublisher.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(\n\t\t\t\t\turl.protocol.replace(':', ''),\n\t\t\t\t\t'publisher',\n\t\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a publisher from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventPublisher<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicPublisher } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQPublisher } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSPublisher } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSPublisher } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossPublisher } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossPublisher<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(connection.type, 'publisher');\n\t\t}\n\t}\n}\n\nexport type EventPublisherConnectionString =\n\t`${EventPublisherType}://${string}`;\n","import type {\n\tEventConnection,\n\tEventSubscriber,\n\tPublishableMessage,\n} from './types';\nimport { EventPublisherType, UnsupportedEventTransport } from './types';\n\nexport class Subscriber {\n\t/**\n\t * Create a subscriber from a connection string\n\t * This creates both a connection and a subscriber\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(\n\t\tconnectionStr: EventSubscriberConnectionString,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionStr);\n\t\tswitch (url.protocol.replace(':', '')) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicConnection, BasicSubscriber } = await import('./basic');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait BasicConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new BasicSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\treturn RabbitMQSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst url = new URL(connectionStr);\n\t\t\t\tconst topicArn = url.searchParams.get('topicArn');\n\n\t\t\t\t// If topicArn is present, use managed SNS→SQS subscription\n\t\t\t\tif (topicArn) {\n\t\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\t\t// Convert SQS connection string to SNS connection string\n\t\t\t\t\tconst snsConnectionStr = connectionStr.replace('sqs://', 'sns://');\n\t\t\t\t\treturn SNSSubscriber.fromConnectionString<TMessage>(snsConnectionStr);\n\t\t\t\t}\n\n\t\t\t\t// Direct SQS subscriber\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\tconst connection =\n\t\t\t\t\tawait SQSConnection.fromConnectionString(connectionStr);\n\t\t\t\treturn new SQSSubscriber<TMessage>(connection);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\treturn PgBossSubscriber.fromConnectionString<TMessage>(connectionStr);\n\t\t\t}\n\t\t\t// Future implementations for EventBridge, Kafka, etc.\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(\n\t\t\t\t\turl.protocol.replace(':', ''),\n\t\t\t\t\t'subscriber',\n\t\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Create a subscriber from an existing connection\n\t * This allows sharing connections between publishers and subscribers\n\t */\n\tstatic async fromConnection<TMessage extends PublishableMessage<string, any>>(\n\t\tconnection: EventConnection,\n\t): Promise<EventSubscriber<TMessage>> {\n\t\tswitch (connection.type) {\n\t\t\tcase EventPublisherType.Basic: {\n\t\t\t\tconst { BasicSubscriber } = await import('./basic');\n\t\t\t\tconst { BasicConnection } = await import('./basic');\n\t\t\t\treturn new BasicSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof BasicConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.RabbitMQ: {\n\t\t\t\tconst { RabbitMQSubscriber } = await import('./rabbitmq');\n\t\t\t\tconst { RabbitMQConnection } = await import('./rabbitmq');\n\t\t\t\treturn new RabbitMQSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof RabbitMQConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SNS: {\n\t\t\t\tconst { SNSSubscriber } = await import('./sns');\n\t\t\t\tconst { SNSConnection } = await import('./sns');\n\t\t\t\treturn new SNSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SNSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.SQS: {\n\t\t\t\tconst { SQSSubscriber } = await import('./sqs');\n\t\t\t\tconst { SQSConnection } = await import('./sqs');\n\t\t\t\treturn new SQSSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof SQSConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase EventPublisherType.PgBoss: {\n\t\t\t\tconst { PgBossSubscriber } = await import('./pgboss');\n\t\t\t\tconst { PgBossConnection } = await import('./pgboss');\n\t\t\t\treturn new PgBossSubscriber<TMessage>(\n\t\t\t\t\tconnection as InstanceType<typeof PgBossConnection>,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new UnsupportedEventTransport(connection.type, 'subscriber');\n\t\t}\n\t}\n}\n\nexport type EventSubscriberConnectionString =\n\t`${EventPublisherType}://${string}`;\n"],"mappings":"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"}
|
package/dist/pgboss/index.cjs
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
require("../types-
|
|
2
|
+
require("../types-BcZjLxVV.cjs");
|
|
3
3
|
let pg_boss = require("pg-boss");
|
|
4
|
+
//#region src/pgboss/errors.ts
|
|
5
|
+
/** pg-boss connected but its instance never started. */
|
|
6
|
+
var PgBossNotStarted = class extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super("pg-boss did not start. Check the database in the connection string is reachable and the role may create the pg-boss schema.");
|
|
9
|
+
this.name = "PgBossNotStarted";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
4
13
|
//#region src/pgboss/PgBossConnection.ts
|
|
5
14
|
var PgBossConnection = class PgBossConnection {
|
|
6
15
|
config;
|
|
@@ -87,7 +96,7 @@ var PgBossPublisher = class PgBossPublisher {
|
|
|
87
96
|
async publish(messages) {
|
|
88
97
|
if (!this.connection.isConnected()) await this.connection.connect();
|
|
89
98
|
const boss = this.connection.instance;
|
|
90
|
-
if (!boss) throw new
|
|
99
|
+
if (!boss) throw new PgBossNotStarted();
|
|
91
100
|
const groups = /* @__PURE__ */ new Map();
|
|
92
101
|
for (const m of messages) {
|
|
93
102
|
const list = groups.get(m.type) ?? [];
|
|
@@ -127,7 +136,7 @@ var PgBossSubscriber = class PgBossSubscriber {
|
|
|
127
136
|
async subscribe(messages, listener) {
|
|
128
137
|
if (!this.connection.isConnected()) await this.connection.connect();
|
|
129
138
|
const boss = this.connection.instance;
|
|
130
|
-
if (!boss) throw new
|
|
139
|
+
if (!boss) throw new PgBossNotStarted();
|
|
131
140
|
for (const messageType of messages) {
|
|
132
141
|
await boss.createQueue(messageType);
|
|
133
142
|
await boss.work(messageType, {
|
|
@@ -145,6 +154,7 @@ var PgBossSubscriber = class PgBossSubscriber {
|
|
|
145
154
|
//#endregion
|
|
146
155
|
exports.PgBossConnection = PgBossConnection;
|
|
147
156
|
exports.PgBossConnection$1 = PgBossConnection;
|
|
157
|
+
exports.PgBossNotStarted = PgBossNotStarted;
|
|
148
158
|
exports.PgBossPublisher = PgBossPublisher;
|
|
149
159
|
exports.PgBossSubscriber = PgBossSubscriber;
|
|
150
160
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PgBoss"],"sources":["../../src/pgboss/PgBossConnection.ts","../../src/pgboss/PgBossPublisher.ts","../../src/pgboss/PgBossSubscriber.ts"],"sourcesContent":["import { PgBoss } from 'pg-boss';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface PgBossConnectionConfig {\n\tconnectionString: string;\n\tschema?: string;\n}\n\nexport class PgBossConnection implements EventConnection {\n\treadonly type = EventPublisherType.PgBoss;\n\tprivate boss?: PgBoss;\n\tprivate connecting?: Promise<void>;\n\n\tconstructor(private config: PgBossConnectionConfig) {}\n\n\t/**\n\t * Create a PgBossConnection from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionString: string,\n\t): Promise<PgBossConnection> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst postgresUrl = `postgres://${url.username ? `${url.username}:${url.password}@` : ''}${url.host}${url.pathname}`;\n\n\t\tconst config: PgBossConnectionConfig = {\n\t\t\tconnectionString: postgresUrl,\n\t\t\tschema: params.get('schema') || undefined,\n\t\t};\n\n\t\tconst connection = new PgBossConnection(config);\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.boss) return;\n\n\t\tif (this.connecting) {\n\t\t\tawait this.connecting;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connecting = (async () => {\n\t\t\ttry {\n\t\t\t\tconst boss = new PgBoss({\n\t\t\t\t\tconnectionString: this.config.connectionString,\n\t\t\t\t\t...(this.config.schema && { schema: this.config.schema }),\n\t\t\t\t});\n\n\t\t\t\tawait boss.start();\n\t\t\t\tthis.boss = boss;\n\t\t\t} catch (error) {\n\t\t\t\tthis.cleanup();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})();\n\n\t\tawait this.connecting;\n\t\tthis.connecting = undefined;\n\t}\n\n\tasync close(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.boss?.stop({ graceful: true });\n\t\t} catch {\n\t\t\t// Ignore errors during close\n\t\t} finally {\n\t\t\tthis.cleanup();\n\t\t}\n\t}\n\n\tisConnected(): boolean {\n\t\treturn !!this.boss;\n\t}\n\n\tprivate cleanup(): void {\n\t\tthis.boss = undefined;\n\t\tthis.connecting = undefined;\n\t}\n\n\t/**\n\t * Get the underlying pg-boss instance for publishing/subscribing\n\t */\n\tget instance(): PgBoss | undefined {\n\t\treturn this.boss;\n\t}\n}\n","import type { EventPublisher, PublishableMessage } from '../types';\nimport type { PgBossConnection } from './PgBossConnection';\n\nexport class PgBossPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: PgBossConnection) {}\n\n\t/**\n\t * Create a PgBossPublisher from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<PgBossPublisher<TMessage>> {\n\t\tconst { PgBossConnection } = await import('./PgBossConnection');\n\t\tconst connection =\n\t\t\tawait PgBossConnection.fromConnectionString(connectionString);\n\t\treturn new PgBossPublisher<TMessage>(connection);\n\t}\n\n\tasync publish(messages: TMessage[]): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst boss = this.connection.instance;\n\t\tif (!boss) {\n\t\t\tthrow new Error('PgBoss instance not initialized');\n\t\t}\n\n\t\t// Group jobs by queue name (v11+ requires per-queue insert calls)\n\t\tconst groups = new Map<string, { data: TMessage['payload'] }[]>();\n\t\tfor (const m of messages) {\n\t\t\tconst list = groups.get(m.type) ?? [];\n\t\t\tlist.push({ data: m.payload });\n\t\t\tgroups.set(m.type, list);\n\t\t}\n\n\t\tfor (const [name, jobs] of groups) {\n\t\t\tawait boss.createQueue(name);\n\t\t\tawait boss.insert(name, jobs);\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\t// Publisher doesn't own the connection\n\t}\n}\n","import type { EventSubscriber, PublishableMessage } from '../types';\nimport type { PgBossConnection } from './PgBossConnection';\n\nexport interface PgBossSubscriberOptions {\n\tbatchSize?: number;\n\tpollingIntervalSeconds?: number;\n}\n\nexport class PgBossSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: PgBossConnection,\n\t\tprivate options: PgBossSubscriberOptions = {},\n\t) {}\n\n\t/**\n\t * Create a PgBossSubscriber from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss&batchSize=5\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<PgBossSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst { PgBossConnection } = await import('./PgBossConnection');\n\t\tconst connection =\n\t\t\tawait PgBossConnection.fromConnectionString(connectionString);\n\n\t\tconst options: PgBossSubscriberOptions = {\n\t\t\tbatchSize: params.get('batchSize')\n\t\t\t\t? Number.parseInt(params.get('batchSize')!, 10)\n\t\t\t\t: undefined,\n\t\t\tpollingIntervalSeconds: params.get('pollingIntervalSeconds')\n\t\t\t\t? Number.parseInt(params.get('pollingIntervalSeconds')!, 10)\n\t\t\t\t: undefined,\n\t\t};\n\n\t\treturn new PgBossSubscriber<TMessage>(connection, options);\n\t}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst boss = this.connection.instance;\n\t\tif (!boss) {\n\t\t\tthrow new Error('PgBoss instance not initialized');\n\t\t}\n\n\t\tfor (const messageType of messages) {\n\t\t\tawait boss.createQueue(messageType);\n\t\t\tawait boss.work(\n\t\t\t\tmessageType,\n\t\t\t\t{\n\t\t\t\t\t...(this.options.batchSize && {\n\t\t\t\t\t\tbatchSize: this.options.batchSize,\n\t\t\t\t\t}),\n\t\t\t\t\t...(this.options.pollingIntervalSeconds && {\n\t\t\t\t\t\tpollingIntervalSeconds: this.options.pollingIntervalSeconds,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (jobs) => {\n\t\t\t\t\tfor (const job of jobs) {\n\t\t\t\t\t\tconst fullMessage = {\n\t\t\t\t\t\t\ttype: job.name,\n\t\t\t\t\t\t\tpayload: job.data,\n\t\t\t\t\t\t} as TMessage;\n\n\t\t\t\t\t\tawait listener(fullMessage);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PgBoss"],"sources":["../../src/pgboss/errors.ts","../../src/pgboss/PgBossConnection.ts","../../src/pgboss/PgBossPublisher.ts","../../src/pgboss/PgBossSubscriber.ts"],"sourcesContent":["// Beside the adapter but apart from its connection module, which imports\n// the broker's client: the publisher and subscriber load that lazily, and\n// importing an error class from it would load it eagerly.\n\n/** pg-boss connected but its instance never started. */\nexport class PgBossNotStarted extends Error {\n\tconstructor() {\n\t\tsuper(\n\t\t\t'pg-boss did not start. Check the database in the connection string is reachable and the role may create the pg-boss schema.',\n\t\t);\n\t\tthis.name = 'PgBossNotStarted';\n\t}\n}\n","import { PgBoss } from 'pg-boss';\nimport type { EventConnection } from '../types';\nimport { EventPublisherType } from '../types';\n\nexport interface PgBossConnectionConfig {\n\tconnectionString: string;\n\tschema?: string;\n}\n\nexport class PgBossConnection implements EventConnection {\n\treadonly type = EventPublisherType.PgBoss;\n\tprivate boss?: PgBoss;\n\tprivate connecting?: Promise<void>;\n\n\tconstructor(private config: PgBossConnectionConfig) {}\n\n\t/**\n\t * Create a PgBossConnection from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss\n\t */\n\tstatic async fromConnectionString(\n\t\tconnectionString: string,\n\t): Promise<PgBossConnection> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst postgresUrl = `postgres://${url.username ? `${url.username}:${url.password}@` : ''}${url.host}${url.pathname}`;\n\n\t\tconst config: PgBossConnectionConfig = {\n\t\t\tconnectionString: postgresUrl,\n\t\t\tschema: params.get('schema') || undefined,\n\t\t};\n\n\t\tconst connection = new PgBossConnection(config);\n\t\tawait connection.connect();\n\t\treturn connection;\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.boss) return;\n\n\t\tif (this.connecting) {\n\t\t\tawait this.connecting;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connecting = (async () => {\n\t\t\ttry {\n\t\t\t\tconst boss = new PgBoss({\n\t\t\t\t\tconnectionString: this.config.connectionString,\n\t\t\t\t\t...(this.config.schema && { schema: this.config.schema }),\n\t\t\t\t});\n\n\t\t\t\tawait boss.start();\n\t\t\t\tthis.boss = boss;\n\t\t\t} catch (error) {\n\t\t\t\tthis.cleanup();\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})();\n\n\t\tawait this.connecting;\n\t\tthis.connecting = undefined;\n\t}\n\n\tasync close(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.boss?.stop({ graceful: true });\n\t\t} catch {\n\t\t\t// Ignore errors during close\n\t\t} finally {\n\t\t\tthis.cleanup();\n\t\t}\n\t}\n\n\tisConnected(): boolean {\n\t\treturn !!this.boss;\n\t}\n\n\tprivate cleanup(): void {\n\t\tthis.boss = undefined;\n\t\tthis.connecting = undefined;\n\t}\n\n\t/**\n\t * Get the underlying pg-boss instance for publishing/subscribing\n\t */\n\tget instance(): PgBoss | undefined {\n\t\treturn this.boss;\n\t}\n}\n","import type { EventPublisher, PublishableMessage } from '../types';\nimport { PgBossNotStarted } from './errors';\nimport type { PgBossConnection } from './PgBossConnection';\n\nexport class PgBossPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(private connection: PgBossConnection) {}\n\n\t/**\n\t * Create a PgBossPublisher from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<PgBossPublisher<TMessage>> {\n\t\tconst { PgBossConnection } = await import('./PgBossConnection');\n\t\tconst connection =\n\t\t\tawait PgBossConnection.fromConnectionString(connectionString);\n\t\treturn new PgBossPublisher<TMessage>(connection);\n\t}\n\n\tasync publish(messages: TMessage[]): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst boss = this.connection.instance;\n\t\tif (!boss) {\n\t\t\tthrow new PgBossNotStarted();\n\t\t}\n\n\t\t// Group jobs by queue name (v11+ requires per-queue insert calls)\n\t\tconst groups = new Map<string, { data: TMessage['payload'] }[]>();\n\t\tfor (const m of messages) {\n\t\t\tconst list = groups.get(m.type) ?? [];\n\t\t\tlist.push({ data: m.payload });\n\t\t\tgroups.set(m.type, list);\n\t\t}\n\n\t\tfor (const [name, jobs] of groups) {\n\t\t\tawait boss.createQueue(name);\n\t\t\tawait boss.insert(name, jobs);\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\t// Publisher doesn't own the connection\n\t}\n}\n","import type { EventSubscriber, PublishableMessage } from '../types';\nimport { PgBossNotStarted } from './errors';\nimport type { PgBossConnection } from './PgBossConnection';\n\nexport interface PgBossSubscriberOptions {\n\tbatchSize?: number;\n\tpollingIntervalSeconds?: number;\n}\n\nexport class PgBossSubscriber<TMessage extends PublishableMessage<string, any>>\n\timplements EventSubscriber<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: PgBossConnection,\n\t\tprivate options: PgBossSubscriberOptions = {},\n\t) {}\n\n\t/**\n\t * Create a PgBossSubscriber from a connection string.\n\t * Format: pgboss://user:pass@host:5432/database?schema=pgboss&batchSize=5\n\t */\n\tstatic async fromConnectionString<\n\t\tTMessage extends PublishableMessage<string, any>,\n\t>(connectionString: string): Promise<PgBossSubscriber<TMessage>> {\n\t\tconst url = new URL(connectionString);\n\t\tconst params = url.searchParams;\n\n\t\tconst { PgBossConnection } = await import('./PgBossConnection');\n\t\tconst connection =\n\t\t\tawait PgBossConnection.fromConnectionString(connectionString);\n\n\t\tconst options: PgBossSubscriberOptions = {\n\t\t\tbatchSize: params.get('batchSize')\n\t\t\t\t? Number.parseInt(params.get('batchSize')!, 10)\n\t\t\t\t: undefined,\n\t\t\tpollingIntervalSeconds: params.get('pollingIntervalSeconds')\n\t\t\t\t? Number.parseInt(params.get('pollingIntervalSeconds')!, 10)\n\t\t\t\t: undefined,\n\t\t};\n\n\t\treturn new PgBossSubscriber<TMessage>(connection, options);\n\t}\n\n\tasync subscribe(\n\t\tmessages: TMessage['type'][],\n\t\tlistener: (payload: TMessage) => Promise<void>,\n\t): Promise<void> {\n\t\tif (!this.connection.isConnected()) {\n\t\t\tawait this.connection.connect();\n\t\t}\n\n\t\tconst boss = this.connection.instance;\n\t\tif (!boss) {\n\t\t\tthrow new PgBossNotStarted();\n\t\t}\n\n\t\tfor (const messageType of messages) {\n\t\t\tawait boss.createQueue(messageType);\n\t\t\tawait boss.work(\n\t\t\t\tmessageType,\n\t\t\t\t{\n\t\t\t\t\t...(this.options.batchSize && {\n\t\t\t\t\t\tbatchSize: this.options.batchSize,\n\t\t\t\t\t}),\n\t\t\t\t\t...(this.options.pollingIntervalSeconds && {\n\t\t\t\t\t\tpollingIntervalSeconds: this.options.pollingIntervalSeconds,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (jobs) => {\n\t\t\t\t\tfor (const job of jobs) {\n\t\t\t\t\t\tconst fullMessage = {\n\t\t\t\t\t\t\ttype: job.name,\n\t\t\t\t\t\t\tpayload: job.data,\n\t\t\t\t\t\t} as TMessage;\n\n\t\t\t\t\t\tawait listener(fullMessage);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t}\n}\n"],"mappings":"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"}
|
package/dist/pgboss/index.d.cts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-
|
|
1
|
+
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-gGaoT8qc.cjs";
|
|
2
2
|
import { PgBoss } from "pg-boss";
|
|
3
|
+
//#region src/pgboss/errors.d.ts
|
|
4
|
+
/** pg-boss connected but its instance never started. */
|
|
5
|
+
export declare class PgBossNotStarted extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
3
9
|
//#region src/pgboss/PgBossConnection.d.ts
|
|
4
10
|
interface PgBossConnectionConfig {
|
|
5
11
|
connectionString: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/pgboss/PgBossConnection.ts","../../src/pgboss/PgBossPublisher.ts","../../src/pgboss/PgBossSubscriber.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/pgboss/errors.ts","../../src/pgboss/PgBossConnection.ts","../../src/pgboss/PgBossPublisher.ts","../../src/pgboss/PgBossSubscriber.ts"],"mappings":";;;;qBAKa,yBAAyB;EAAA;;;;UCDrB;EAChB;EACA;;qBAGY,4BAA4B;UAKpB;WAJX,OAAI,mBAAA;UACL;UACA;EAEY,YAAA,QAAQ;;;;;SAMf,qBACZ,2BACE,QAAQ;EAgBL,WAAW;EA2BX,SAAS;EAUf;UAIQ;;;;MAQJ,YAAY;;;;qBCnFJ,gBAAgB,iBAAiB,4CAClC,eAAe;UAEN;EAAA,YAAA,YAAY;;;;;SAMnB,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,gBAAgB;EAO/C,QAAQ,UAAU,aAAa;EAwB/B,SAAS;;;;UC1CC;EAChB;EACA;;qBAGY,iBAAiB,iBAAiB,4CACnC,gBAAgB;UAGlB;UACA;EADA,YAAA,YAAY,kBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,iBAAiB;EAoBhD,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B"}
|
package/dist/pgboss/index.d.mts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-
|
|
1
|
+
import { i as EventSubscriber, n as EventPublisher, r as EventPublisherType, s as PublishableMessage, t as EventConnection } from "../types-gGaoT8qc.mjs";
|
|
2
2
|
import { PgBoss } from "pg-boss";
|
|
3
|
+
//#region src/pgboss/errors.d.ts
|
|
4
|
+
/** pg-boss connected but its instance never started. */
|
|
5
|
+
export declare class PgBossNotStarted extends Error {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
3
9
|
//#region src/pgboss/PgBossConnection.d.ts
|
|
4
10
|
interface PgBossConnectionConfig {
|
|
5
11
|
connectionString: string;
|