@geekmidas/events 10.0.0-alpha.39 → 10.0.0-alpha.40

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/index.cjs CHANGED
@@ -40,7 +40,7 @@ var Publisher = class {
40
40
  * Create a publisher from a connection string
41
41
  * This creates both a connection and a publisher
42
42
  */
43
- static async fromConnectionString(connectionStr) {
43
+ static async fromConnectionString(connectionStr, options = {}) {
44
44
  const url = new URL(connectionStr);
45
45
  switch (url.protocol.replace(":", "")) {
46
46
  case "basic": {
@@ -61,7 +61,7 @@ var Publisher = class {
61
61
  }
62
62
  case "pgboss": {
63
63
  const { PgBossPublisher } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
64
- return PgBossPublisher.fromConnectionString(connectionStr);
64
+ return PgBossPublisher.fromConnectionString(connectionStr, options);
65
65
  }
66
66
  default: throw new require_types.UnsupportedEventTransport(url.protocol.replace(":", ""), "publisher");
67
67
  }
@@ -144,7 +144,7 @@ var Subscriber = class {
144
144
  * Create a subscriber from an existing connection
145
145
  * This allows sharing connections between publishers and subscribers
146
146
  */
147
- static async fromConnection(connection) {
147
+ static async fromConnection(connection, options = {}) {
148
148
  switch (connection.type) {
149
149
  case "basic": {
150
150
  const { BasicSubscriber } = await Promise.resolve().then(() => require("./basic/index.cjs"));
@@ -169,7 +169,7 @@ var Subscriber = class {
169
169
  case "pgboss": {
170
170
  const { PgBossSubscriber } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
171
171
  const { PgBossConnection } = await Promise.resolve().then(() => require("./pgboss/index.cjs"));
172
- return new PgBossSubscriber(connection);
172
+ return new PgBossSubscriber(connection, options);
173
173
  }
174
174
  default: throw new require_types.UnsupportedEventTransport(connection.type, "subscriber");
175
175
  }
@@ -1 +1 @@
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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"}
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\n/** How a publisher is used, beyond the address it reaches. */\nexport interface PublisherOptions {\n\t/**\n\t * The topic this publisher fans out to. SNS and RabbitMQ name the topic in\n\t * their address already; pg-boss has one address for every topic and queue,\n\t * so it is told here that a message goes to every subscriber rather than to\n\t * one queue.\n\t */\n\ttopic?: string;\n}\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\toptions: PublisherOptions = {},\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>(\n\t\t\t\t\tconnectionStr,\n\t\t\t\t\toptions,\n\t\t\t\t);\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\t/**\n\t\t * Subscribing to a topic as a named subscriber. pg-boss needs both to\n\t\t * give each subscriber its own queue; the other transports carry the\n\t\t * topic in their address and ignore it.\n\t\t */\n\t\toptions: { topic?: string; subscription?: string } = {},\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\toptions,\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
@@ -9,12 +9,22 @@ export declare class EventConnectionFactory {
9
9
  }
10
10
  //#endregion
11
11
  //#region src/Publisher.d.ts
12
+ /** How a publisher is used, beyond the address it reaches. */
13
+ interface PublisherOptions {
14
+ /**
15
+ * The topic this publisher fans out to. SNS and RabbitMQ name the topic in
16
+ * their address already; pg-boss has one address for every topic and queue,
17
+ * so it is told here that a message goes to every subscriber rather than to
18
+ * one queue.
19
+ */
20
+ topic?: string;
21
+ }
12
22
  export declare class Publisher {
13
23
  /**
14
24
  * Create a publisher from a connection string
15
25
  * This creates both a connection and a publisher
16
26
  */
17
- static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionStr: EventPublisherConnectionString): Promise<EventPublisher<TMessage>>;
27
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionStr: EventPublisherConnectionString, options?: PublisherOptions): Promise<EventPublisher<TMessage>>;
18
28
  /**
19
29
  * Create a publisher from an existing connection
20
30
  * This allows sharing connections between publishers and subscribers
@@ -34,9 +44,18 @@ export declare class Subscriber {
34
44
  * Create a subscriber from an existing connection
35
45
  * This allows sharing connections between publishers and subscribers
36
46
  */
37
- static fromConnection<TMessage extends PublishableMessage<string, any>>(connection: EventConnection): Promise<EventSubscriber<TMessage>>;
47
+ static fromConnection<TMessage extends PublishableMessage<string, any>>(connection: EventConnection,
48
+ /**
49
+ * Subscribing to a topic as a named subscriber. pg-boss needs both to
50
+ * give each subscriber its own queue; the other transports carry the
51
+ * topic in their address and ignore it.
52
+ */
53
+ options?: {
54
+ topic?: string;
55
+ subscription?: string;
56
+ }): Promise<EventSubscriber<TMessage>>;
38
57
  }
39
58
  type EventSubscriberConnectionString = `${EventPublisherType}://${string}`;
40
59
  //#endregion
41
- export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, UnsupportedEventTransport };
60
+ export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, type PublisherOptions, UnsupportedEventTransport };
42
61
  //# sourceMappingURL=index.d.cts.map
@@ -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;;;;;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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;;UCFK;;;;;;;EAOhB;;qBAGY;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,gCACf,UAAS,mBACP,QAAQ,eAAe;;;;;SAyCb,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,eAAe;;KA2Cf,oCACR;;;qBC5GS;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,kCACb,QAAQ,gBAAgB;;;;;SAqDd,eAAe,iBAAiB,iCAC5C,YAAY,iBAMZ;;;;;;EAAA;IAAW;IAAgB;MACzB,QAAQ,gBAAgB;;KA4ChB,qCACR"}
package/dist/index.d.mts CHANGED
@@ -9,12 +9,22 @@ export declare class EventConnectionFactory {
9
9
  }
10
10
  //#endregion
11
11
  //#region src/Publisher.d.ts
12
+ /** How a publisher is used, beyond the address it reaches. */
13
+ interface PublisherOptions {
14
+ /**
15
+ * The topic this publisher fans out to. SNS and RabbitMQ name the topic in
16
+ * their address already; pg-boss has one address for every topic and queue,
17
+ * so it is told here that a message goes to every subscriber rather than to
18
+ * one queue.
19
+ */
20
+ topic?: string;
21
+ }
12
22
  export declare class Publisher {
13
23
  /**
14
24
  * Create a publisher from a connection string
15
25
  * This creates both a connection and a publisher
16
26
  */
17
- static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionStr: EventPublisherConnectionString): Promise<EventPublisher<TMessage>>;
27
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionStr: EventPublisherConnectionString, options?: PublisherOptions): Promise<EventPublisher<TMessage>>;
18
28
  /**
19
29
  * Create a publisher from an existing connection
20
30
  * This allows sharing connections between publishers and subscribers
@@ -34,9 +44,18 @@ export declare class Subscriber {
34
44
  * Create a subscriber from an existing connection
35
45
  * This allows sharing connections between publishers and subscribers
36
46
  */
37
- static fromConnection<TMessage extends PublishableMessage<string, any>>(connection: EventConnection): Promise<EventSubscriber<TMessage>>;
47
+ static fromConnection<TMessage extends PublishableMessage<string, any>>(connection: EventConnection,
48
+ /**
49
+ * Subscribing to a topic as a named subscriber. pg-boss needs both to
50
+ * give each subscriber its own queue; the other transports carry the
51
+ * topic in their address and ignore it.
52
+ */
53
+ options?: {
54
+ topic?: string;
55
+ subscription?: string;
56
+ }): Promise<EventSubscriber<TMessage>>;
38
57
  }
39
58
  type EventSubscriberConnectionString = `${EventPublisherType}://${string}`;
40
59
  //#endregion
41
- export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, UnsupportedEventTransport };
60
+ export { type EventConnection, type EventPublisher, type EventPublisherConnectionString, EventPublisherType, type EventSubscriber, type EventSubscriberConnectionString, type ExtractPublisherMessage, type MappedEvent, type PublishableMessage, type PublisherOptions, UnsupportedEventTransport };
42
61
  //# sourceMappingURL=index.d.mts.map
@@ -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;;;;;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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/EventConnection.ts","../src/Publisher.ts","../src/Subscriber.ts"],"mappings":";;qBAGa;;;;;SAKC,qBACZ,wBACE,QAAQ;;;;;UCFK;;;;;;;EAOhB;;qBAGY;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,gCACf,UAAS,mBACP,QAAQ,eAAe;;;;;SAyCb,eAAe,iBAAiB,iCAC5C,YAAY,kBACV,QAAQ,eAAe;;KA2Cf,oCACR;;;qBC5GS;;;;;SAKC,qBACZ,iBAAiB,iCAEjB,eAAe,kCACb,QAAQ,gBAAgB;;;;;SAqDd,eAAe,iBAAiB,iCAC5C,YAAY,iBAMZ;;;;;;EAAA;IAAW;IAAgB;MACzB,QAAQ,gBAAgB;;KA4ChB,qCACR"}
package/dist/index.mjs CHANGED
@@ -39,7 +39,7 @@ var Publisher = class {
39
39
  * Create a publisher from a connection string
40
40
  * This creates both a connection and a publisher
41
41
  */
42
- static async fromConnectionString(connectionStr) {
42
+ static async fromConnectionString(connectionStr, options = {}) {
43
43
  const url = new URL(connectionStr);
44
44
  switch (url.protocol.replace(":", "")) {
45
45
  case "basic": {
@@ -60,7 +60,7 @@ var Publisher = class {
60
60
  }
61
61
  case "pgboss": {
62
62
  const { PgBossPublisher } = await import("./pgboss/index.mjs");
63
- return PgBossPublisher.fromConnectionString(connectionStr);
63
+ return PgBossPublisher.fromConnectionString(connectionStr, options);
64
64
  }
65
65
  default: throw new UnsupportedEventTransport(url.protocol.replace(":", ""), "publisher");
66
66
  }
@@ -143,7 +143,7 @@ var Subscriber = class {
143
143
  * Create a subscriber from an existing connection
144
144
  * This allows sharing connections between publishers and subscribers
145
145
  */
146
- static async fromConnection(connection) {
146
+ static async fromConnection(connection, options = {}) {
147
147
  switch (connection.type) {
148
148
  case "basic": {
149
149
  const { BasicSubscriber } = await import("./basic/index.mjs");
@@ -168,7 +168,7 @@ var Subscriber = class {
168
168
  case "pgboss": {
169
169
  const { PgBossSubscriber } = await import("./pgboss/index.mjs");
170
170
  const { PgBossConnection } = await import("./pgboss/index.mjs");
171
- return new PgBossSubscriber(connection);
171
+ return new PgBossSubscriber(connection, options);
172
172
  }
173
173
  default: throw new UnsupportedEventTransport(connection.type, "subscriber");
174
174
  }
@@ -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, 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":";;AAGA,IAAa,yBAAb,MAAoC;;;;;CAKnC,aAAa,qBACZ,eAC2B;EAE3B,MAAM,WAAW,IADD,IAAI,aACD,CAAC,CAAC,SAAS,QAAQ,KAAK,EAAE;EAE7C,QAAQ,UAAR;GACC,KAAA,SAA+B;IAC9B,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,OAAO,gBAAgB,qBAAqB,aAAa;GAC1D;GACA,KAAA,YAAkC;IACjC,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,OAAO,mBAAmB,qBAAqB,aAAa;GAC7D;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,cAAc,qBAAqB,aAAa;GACxD;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,cAAc,qBAAqB,aAAa;GACxD;GACA,KAAA,UAAgC;IAC/B,MAAM,EAAE,qBAAqB,MAAM,OAAO;IAC1C,OAAO,iBAAiB,qBAAqB,aAAa;GAC3D;GACA,SACC,MAAM,IAAI,0BAA0B,UAAU,YAAY;EAC5D;CACD;AACD;;;AChCA,IAAa,YAAb,MAAuB;;;;;CAKtB,aAAa,qBAGZ,eACoC;EACpC,MAAM,MAAM,IAAI,IAAI,aAAa;EACjC,QAAQ,IAAI,SAAS,QAAQ,KAAK,EAAE,GAApC;GACC,KAAA,SAA+B;IAC9B,MAAM,EAAE,iBAAiB,mBAAmB,MAAM,OAAO;IAGzD,OAAO,IAAI,eAAyB,MAD7B,gBAAgB,qBAAqB,aAAa,CACX;GAC/C;GACA,KAAA,YAAkC;IACjC,MAAM,EAAE,sBAAsB,MAAM,OAAO;IAC3C,OAAO,kBAAkB,qBAA+B,aAAa;GACtE;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,iBAAiB,MAAM,OAAO;IACtC,OAAO,aAAa,qBAA+B,aAAa;GACjE;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,iBAAiB,MAAM,OAAO;IACtC,OAAO,aAAa,qBAA+B,aAAa;GACjE;GACA,KAAA,UAAgC;IAC/B,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,OAAO,gBAAgB,qBAA+B,aAAa;GACpE;GAEA,SACC,MAAM,IAAI,0BACT,IAAI,SAAS,QAAQ,KAAK,EAAE,GAC5B,WACD;EACF;CACD;;;;;CAMA,aAAa,eACZ,YACoC;EACpC,QAAQ,WAAW,MAAnB;GACC,KAAA,SAA+B;IAC9B,MAAM,EAAE,mBAAmB,MAAM,OAAO;IACxC,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,OAAO,IAAI,eACV,UACD;GACD;GACA,KAAA,YAAkC;IACjC,MAAM,EAAE,sBAAsB,MAAM,OAAO;IAC3C,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,OAAO,IAAI,kBACV,UACD;GACD;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,iBAAiB,MAAM,OAAO;IACtC,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,IAAI,aACV,UACD;GACD;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,iBAAiB,MAAM,OAAO;IACtC,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,IAAI,aACV,UACD;GACD;GACA,KAAA,UAAgC;IAC/B,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,MAAM,EAAE,qBAAqB,MAAM,OAAO;IAC1C,OAAO,IAAI,gBACV,UACD;GACD;GACA,SACC,MAAM,IAAI,0BAA0B,WAAW,MAAM,WAAW;EAClE;CACD;AACD;;;AC1FA,IAAa,aAAb,MAAwB;;;;;CAKvB,aAAa,qBAGZ,eACqC;EACrC,MAAM,MAAM,IAAI,IAAI,aAAa;EACjC,QAAQ,IAAI,SAAS,QAAQ,KAAK,EAAE,GAApC;GACC,KAAA,SAA+B;IAC9B,MAAM,EAAE,iBAAiB,oBAAoB,MAAM,OAAO;IAG1D,OAAO,IAAI,gBAA0B,MAD9B,gBAAgB,qBAAqB,aAAa,CACV;GAChD;GACA,KAAA,YAAkC;IACjC,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,OAAO,mBAAmB,qBAA+B,aAAa;GACvE;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,cAAc,qBAA+B,aAAa;GAClE;GACA,KAAA,OAA6B;IAK5B,IAHiB,IADD,IAAI,aACD,CAAC,CAAC,aAAa,IAAI,UAG3B,GAAG;KACb,MAAM,EAAE,kBAAkB,MAAM,OAAO;KAEvC,MAAM,mBAAmB,cAAc,QAAQ,UAAU,QAAQ;KACjE,OAAO,cAAc,qBAA+B,gBAAgB;IACrE;IAGA,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,EAAE,kBAAkB,MAAM,OAAO;IAGvC,OAAO,IAAI,cAAwB,MAD5B,cAAc,qBAAqB,aAAa,CACV;GAC9C;GACA,KAAA,UAAgC;IAC/B,MAAM,EAAE,qBAAqB,MAAM,OAAO;IAC1C,OAAO,iBAAiB,qBAA+B,aAAa;GACrE;GAEA,SACC,MAAM,IAAI,0BACT,IAAI,SAAS,QAAQ,KAAK,EAAE,GAC5B,YACD;EACF;CACD;;;;;CAMA,aAAa,eACZ,YACqC;EACrC,QAAQ,WAAW,MAAnB;GACC,KAAA,SAA+B;IAC9B,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,MAAM,EAAE,oBAAoB,MAAM,OAAO;IACzC,OAAO,IAAI,gBACV,UACD;GACD;GACA,KAAA,YAAkC;IACjC,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,OAAO,IAAI,mBACV,UACD;GACD;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,IAAI,cACV,UACD;GACD;GACA,KAAA,OAA6B;IAC5B,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,OAAO,IAAI,cACV,UACD;GACD;GACA,KAAA,UAAgC;IAC/B,MAAM,EAAE,qBAAqB,MAAM,OAAO;IAC1C,MAAM,EAAE,qBAAqB,MAAM,OAAO;IAC1C,OAAO,IAAI,iBACV,UACD;GACD;GACA,SACC,MAAM,IAAI,0BAA0B,WAAW,MAAM,YAAY;EACnE;CACD;AACD"}
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\n/** How a publisher is used, beyond the address it reaches. */\nexport interface PublisherOptions {\n\t/**\n\t * The topic this publisher fans out to. SNS and RabbitMQ name the topic in\n\t * their address already; pg-boss has one address for every topic and queue,\n\t * so it is told here that a message goes to every subscriber rather than to\n\t * one queue.\n\t */\n\ttopic?: string;\n}\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\toptions: PublisherOptions = {},\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>(\n\t\t\t\t\tconnectionStr,\n\t\t\t\t\toptions,\n\t\t\t\t);\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\t/**\n\t\t * Subscribing to a topic as a named subscriber. pg-boss needs both to\n\t\t * give each subscriber its own queue; the other transports carry the\n\t\t * topic in their address and ignore it.\n\t\t */\n\t\toptions: { topic?: string; subscription?: string } = {},\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\toptions,\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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"}
@@ -9,6 +9,15 @@ var PgBossNotStarted = class extends Error {
9
9
  this.name = "PgBossNotStarted";
10
10
  }
11
11
  };
12
+ /** A topic subscription with no name to give the subscriber's own queue. */
13
+ var PgBossSubscriptionNeedsName = class extends Error {
14
+ topic;
15
+ constructor(topic) {
16
+ super(`Subscribing to topic '${topic}' on pg-boss needs a subscription name: each subscriber drains a queue of its own, and that queue is named for it. Pass \`subscription\`.`);
17
+ this.topic = topic;
18
+ this.name = "PgBossSubscriptionNeedsName";
19
+ }
20
+ };
12
21
  //#endregion
13
22
  //#region src/pgboss/PgBossConnection.ts
14
23
  var PgBossConnection = class PgBossConnection {
@@ -79,24 +88,38 @@ var PgBossConnection = class PgBossConnection {
79
88
  };
80
89
  //#endregion
81
90
  //#region src/pgboss/PgBossPublisher.ts
91
+ /** The pg-boss event a topic's message type is published as. */
92
+ function topicEvent(topic, type) {
93
+ return `${topic}/${type}`;
94
+ }
82
95
  var PgBossPublisher = class PgBossPublisher {
83
96
  connection;
84
- constructor(connection) {
97
+ options;
98
+ constructor(connection, options = {}) {
85
99
  this.connection = connection;
100
+ this.options = options;
86
101
  }
87
102
  /**
88
103
  * Create a PgBossPublisher from a connection string.
89
104
  * Format: pgboss://user:pass@host:5432/database?schema=pgboss
90
105
  */
91
- static async fromConnectionString(connectionString) {
106
+ static async fromConnectionString(connectionString, options = {}) {
92
107
  const { PgBossConnection } = await Promise.resolve().then(() => require("../PgBossConnection-CywKoAZU.cjs"));
93
108
  const connection = await PgBossConnection.fromConnectionString(connectionString);
94
- return new PgBossPublisher(connection);
109
+ return new PgBossPublisher(connection, options);
95
110
  }
96
111
  async publish(messages) {
97
112
  if (!this.connection.isConnected()) await this.connection.connect();
98
113
  const boss = this.connection.instance;
99
114
  if (!boss) throw new PgBossNotStarted();
115
+ const { topic } = this.options;
116
+ if (topic) {
117
+ for (const m of messages) await boss.publish(topicEvent(topic, m.type), {
118
+ type: m.type,
119
+ payload: m.payload
120
+ });
121
+ return;
122
+ }
100
123
  const groups = /* @__PURE__ */ new Map();
101
124
  for (const m of messages) {
102
125
  const list = groups.get(m.type) ?? [];
@@ -137,12 +160,27 @@ var PgBossSubscriber = class PgBossSubscriber {
137
160
  if (!this.connection.isConnected()) await this.connection.connect();
138
161
  const boss = this.connection.instance;
139
162
  if (!boss) throw new PgBossNotStarted();
163
+ const work = {
164
+ ...this.options.batchSize && { batchSize: this.options.batchSize },
165
+ ...this.options.pollingIntervalSeconds && { pollingIntervalSeconds: this.options.pollingIntervalSeconds }
166
+ };
167
+ const { topic, subscription } = this.options;
168
+ if (topic) {
169
+ if (!subscription) throw new PgBossSubscriptionNeedsName(topic);
170
+ const queue = topicEvent(topic, subscription);
171
+ await boss.createQueue(queue);
172
+ for (const type of messages) await boss.subscribe(topicEvent(topic, type), queue);
173
+ await boss.work(queue, work, async (jobs) => {
174
+ for (const job of jobs) await listener({
175
+ type: job.data.type,
176
+ payload: job.data.payload
177
+ });
178
+ });
179
+ return;
180
+ }
140
181
  for (const messageType of messages) {
141
182
  await boss.createQueue(messageType);
142
- await boss.work(messageType, {
143
- ...this.options.batchSize && { batchSize: this.options.batchSize },
144
- ...this.options.pollingIntervalSeconds && { pollingIntervalSeconds: this.options.pollingIntervalSeconds }
145
- }, async (jobs) => {
183
+ await boss.work(messageType, work, async (jobs) => {
146
184
  for (const job of jobs) await listener({
147
185
  type: job.name,
148
186
  payload: job.data
@@ -157,5 +195,7 @@ exports.PgBossConnection$1 = PgBossConnection;
157
195
  exports.PgBossNotStarted = PgBossNotStarted;
158
196
  exports.PgBossPublisher = PgBossPublisher;
159
197
  exports.PgBossSubscriber = PgBossSubscriber;
198
+ exports.PgBossSubscriptionNeedsName = PgBossSubscriptionNeedsName;
199
+ exports.topicEvent = topicEvent;
160
200
 
161
201
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
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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"}
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\n/** A topic subscription with no name to give the subscriber's own queue. */\nexport class PgBossSubscriptionNeedsName extends Error {\n\tconstructor(readonly topic: string) {\n\t\tsuper(\n\t\t\t`Subscribing to topic '${topic}' on pg-boss needs a subscription name: ` +\n\t\t\t\t'each subscriber drains a queue of its own, and that queue is named ' +\n\t\t\t\t'for it. Pass `subscription`.',\n\t\t);\n\t\tthis.name = 'PgBossSubscriptionNeedsName';\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 interface PgBossPublisherOptions {\n\t/**\n\t * Publishing to a topic: each message is fanned out to every subscriber's\n\t * own queue rather than inserted into one shared queue. Without it, a\n\t * message goes to the queue named by its type — a work queue, one consumer.\n\t */\n\ttopic?: string;\n}\n\n/** The pg-boss event a topic's message type is published as. */\nexport function topicEvent(topic: string, type: string): string {\n\treturn `${topic}/${type}`;\n}\n\nexport class PgBossPublisher<TMessage extends PublishableMessage<string, any>>\n\timplements EventPublisher<TMessage>\n{\n\tconstructor(\n\t\tprivate connection: PgBossConnection,\n\t\tprivate options: PgBossPublisherOptions = {},\n\t) {}\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>(\n\t\tconnectionString: string,\n\t\toptions: PgBossPublisherOptions = {},\n\t): 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, options);\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// A topic: pg-boss copies the job into every queue subscribed to the\n\t\t// event — one per subscriber — so each subscriber sees each message.\n\t\t// The type rides in the data, because the job is named for the queue.\n\t\tconst { topic } = this.options;\n\t\tif (topic) {\n\t\t\tfor (const m of messages) {\n\t\t\t\tawait boss.publish(topicEvent(topic, m.type), {\n\t\t\t\t\ttype: m.type,\n\t\t\t\t\tpayload: m.payload,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\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, PgBossSubscriptionNeedsName } from './errors';\nimport type { PgBossConnection } from './PgBossConnection';\nimport { topicEvent } from './PgBossPublisher';\n\nexport interface PgBossSubscriberOptions {\n\tbatchSize?: number;\n\tpollingIntervalSeconds?: number;\n\t/**\n\t * Subscribing to a topic. Each subscriber then drains a queue of its own,\n\t * `<topic>/<subscription>`, bound to the events it names — so every\n\t * subscriber sees every message, and replicas of one subscriber share it.\n\t * Without it, messages are drained from the queue named by their type:\n\t * work shared among whoever drains it.\n\t */\n\ttopic?: string;\n\t/** The subscriber's own name on the topic. Required with `topic`. */\n\tsubscription?: string;\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\tconst work = {\n\t\t\t...(this.options.batchSize && { batchSize: this.options.batchSize }),\n\t\t\t...(this.options.pollingIntervalSeconds && {\n\t\t\t\tpollingIntervalSeconds: this.options.pollingIntervalSeconds,\n\t\t\t}),\n\t\t};\n\n\t\tconst { topic, subscription } = this.options;\n\t\tif (topic) {\n\t\t\tif (!subscription) throw new PgBossSubscriptionNeedsName(topic);\n\n\t\t\tconst queue = topicEvent(topic, subscription);\n\t\t\tawait boss.createQueue(queue);\n\t\t\tfor (const type of messages) {\n\t\t\t\tawait boss.subscribe(topicEvent(topic, type), queue);\n\t\t\t}\n\t\t\tawait boss.work<{ type: string; payload: unknown }>(\n\t\t\t\tqueue,\n\t\t\t\twork,\n\t\t\t\tasync (jobs) => {\n\t\t\t\t\tfor (const job of jobs) {\n\t\t\t\t\t\tawait listener({\n\t\t\t\t\t\t\ttype: job.data.type,\n\t\t\t\t\t\t\tpayload: job.data.payload,\n\t\t\t\t\t\t} as TMessage);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const messageType of messages) {\n\t\t\tawait boss.createQueue(messageType);\n\t\t\tawait boss.work(messageType, work, async (jobs) => {\n\t\t\t\tfor (const job of jobs) {\n\t\t\t\t\tconst fullMessage = {\n\t\t\t\t\t\ttype: job.name,\n\t\t\t\t\t\tpayload: job.data,\n\t\t\t\t\t} as TMessage;\n\n\t\t\t\t\tawait listener(fullMessage);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -5,6 +5,11 @@ import { PgBoss } from "pg-boss";
5
5
  export declare class PgBossNotStarted extends Error {
6
6
  constructor();
7
7
  }
8
+ /** A topic subscription with no name to give the subscriber's own queue. */
9
+ export declare class PgBossSubscriptionNeedsName extends Error {
10
+ readonly topic: string;
11
+ constructor(topic: string);
12
+ }
8
13
  //#endregion
9
14
  //#region src/pgboss/PgBossConnection.d.ts
10
15
  interface PgBossConnectionConfig {
@@ -33,14 +38,25 @@ export declare class PgBossConnection implements EventConnection {
33
38
  }
34
39
  //#endregion
35
40
  //#region src/pgboss/PgBossPublisher.d.ts
41
+ interface PgBossPublisherOptions {
42
+ /**
43
+ * Publishing to a topic: each message is fanned out to every subscriber's
44
+ * own queue rather than inserted into one shared queue. Without it, a
45
+ * message goes to the queue named by its type — a work queue, one consumer.
46
+ */
47
+ topic?: string;
48
+ }
49
+ /** The pg-boss event a topic's message type is published as. */
50
+ export declare function topicEvent(topic: string, type: string): string;
36
51
  export declare class PgBossPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
37
52
  private connection;
38
- constructor(connection: PgBossConnection);
53
+ private options;
54
+ constructor(connection: PgBossConnection, options?: PgBossPublisherOptions);
39
55
  /**
40
56
  * Create a PgBossPublisher from a connection string.
41
57
  * Format: pgboss://user:pass@host:5432/database?schema=pgboss
42
58
  */
43
- static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<PgBossPublisher<TMessage>>;
59
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string, options?: PgBossPublisherOptions): Promise<PgBossPublisher<TMessage>>;
44
60
  publish(messages: TMessage[]): Promise<void>;
45
61
  close(): Promise<void>;
46
62
  }
@@ -49,6 +65,16 @@ export declare class PgBossPublisher<TMessage extends PublishableMessage<string,
49
65
  interface PgBossSubscriberOptions {
50
66
  batchSize?: number;
51
67
  pollingIntervalSeconds?: number;
68
+ /**
69
+ * Subscribing to a topic. Each subscriber then drains a queue of its own,
70
+ * `<topic>/<subscription>`, bound to the events it names — so every
71
+ * subscriber sees every message, and replicas of one subscriber share it.
72
+ * Without it, messages are drained from the queue named by their type:
73
+ * work shared among whoever drains it.
74
+ */
75
+ topic?: string;
76
+ /** The subscriber's own name on the topic. Required with `topic`. */
77
+ subscription?: string;
52
78
  }
53
79
  export declare class PgBossSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
54
80
  private connection;
@@ -62,5 +88,5 @@ export declare class PgBossSubscriber<TMessage extends PublishableMessage<string
62
88
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
63
89
  }
64
90
  //#endregion
65
- export type { PgBossConnectionConfig, PgBossSubscriberOptions };
91
+ export type { PgBossConnectionConfig, PgBossPublisherOptions, PgBossSubscriberOptions };
66
92
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
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;EACrC;;;;UCFgB;EAChB;EACA;;qBAGY,4BAA4B;UAKpB;WAJX,OAAI,mBAAA;UACL;UACA;EAER,YAAoB,QAAQ;;;;;SAMf,qBACZ,2BACE,QAAQ;EAgBL,WAAW;EA2BX,SAAS;EAUf;UAIQ;;;;MAQJ,YAAY;;;;qBCnFJ,gBAAgB,iBAAiB,4CAClC,eAAe;UAEN;EAApB,YAAoB,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;EAFT,YACS,YAAY,kBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,iBAAiB;EAoBhD,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B"}
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;EACrC;;;qBASY,oCAAoC;WAC3B;EAArB,YAAqB;;;;UCZL;EAChB;EACA;;qBAGY,4BAA4B;UAKpB;WAJX,OAAI,mBAAA;UACL;UACA;EAER,YAAoB,QAAQ;;;;;SAMf,qBACZ,2BACE,QAAQ;EAgBL,WAAW;EA2BX,SAAS;EAUf;UAIQ;;;;MAQJ,YAAY;;;;UCnFA;;;;;;EAMhB;;;wBAIe,WAAW,eAAe;qBAI7B,gBAAgB,iBAAiB,4CAClC,eAAe;UAGjB;UACA;EAFT,YACS,YAAY,kBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAEjB,0BACA,UAAS,yBACP,QAAQ,gBAAgB;EAOrB,QAAQ,UAAU,aAAa;EAsC/B,SAAS;;;;UC3EC;EAChB;EACA;;;;;;;;EAQA;;EAEA;;qBAGY,iBAAiB,iBAAiB,4CACnC,gBAAgB;UAGlB;UACA;EAFT,YACS,YAAY,kBACZ,UAAS;;;;;SAOL,qBACZ,iBAAiB,iCAChB,2BAA2B,QAAQ,iBAAiB;EAoBhD,UACL,UAAU,oBACV,WAAW,SAAS,aAAa,gBAC/B"}
@@ -5,6 +5,11 @@ import { PgBoss } from "pg-boss";
5
5
  export declare class PgBossNotStarted extends Error {
6
6
  constructor();
7
7
  }
8
+ /** A topic subscription with no name to give the subscriber's own queue. */
9
+ export declare class PgBossSubscriptionNeedsName extends Error {
10
+ readonly topic: string;
11
+ constructor(topic: string);
12
+ }
8
13
  //#endregion
9
14
  //#region src/pgboss/PgBossConnection.d.ts
10
15
  interface PgBossConnectionConfig {
@@ -33,14 +38,25 @@ export declare class PgBossConnection implements EventConnection {
33
38
  }
34
39
  //#endregion
35
40
  //#region src/pgboss/PgBossPublisher.d.ts
41
+ interface PgBossPublisherOptions {
42
+ /**
43
+ * Publishing to a topic: each message is fanned out to every subscriber's
44
+ * own queue rather than inserted into one shared queue. Without it, a
45
+ * message goes to the queue named by its type — a work queue, one consumer.
46
+ */
47
+ topic?: string;
48
+ }
49
+ /** The pg-boss event a topic's message type is published as. */
50
+ export declare function topicEvent(topic: string, type: string): string;
36
51
  export declare class PgBossPublisher<TMessage extends PublishableMessage<string, any>> implements EventPublisher<TMessage> {
37
52
  private connection;
38
- constructor(connection: PgBossConnection);
53
+ private options;
54
+ constructor(connection: PgBossConnection, options?: PgBossPublisherOptions);
39
55
  /**
40
56
  * Create a PgBossPublisher from a connection string.
41
57
  * Format: pgboss://user:pass@host:5432/database?schema=pgboss
42
58
  */
43
- static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string): Promise<PgBossPublisher<TMessage>>;
59
+ static fromConnectionString<TMessage extends PublishableMessage<string, any>>(connectionString: string, options?: PgBossPublisherOptions): Promise<PgBossPublisher<TMessage>>;
44
60
  publish(messages: TMessage[]): Promise<void>;
45
61
  close(): Promise<void>;
46
62
  }
@@ -49,6 +65,16 @@ export declare class PgBossPublisher<TMessage extends PublishableMessage<string,
49
65
  interface PgBossSubscriberOptions {
50
66
  batchSize?: number;
51
67
  pollingIntervalSeconds?: number;
68
+ /**
69
+ * Subscribing to a topic. Each subscriber then drains a queue of its own,
70
+ * `<topic>/<subscription>`, bound to the events it names — so every
71
+ * subscriber sees every message, and replicas of one subscriber share it.
72
+ * Without it, messages are drained from the queue named by their type:
73
+ * work shared among whoever drains it.
74
+ */
75
+ topic?: string;
76
+ /** The subscriber's own name on the topic. Required with `topic`. */
77
+ subscription?: string;
52
78
  }
53
79
  export declare class PgBossSubscriber<TMessage extends PublishableMessage<string, any>> implements EventSubscriber<TMessage> {
54
80
  private connection;
@@ -62,5 +88,5 @@ export declare class PgBossSubscriber<TMessage extends PublishableMessage<string
62
88
  subscribe(messages: TMessage['type'][], listener: (payload: TMessage) => Promise<void>): Promise<void>;
63
89
  }
64
90
  //#endregion
65
- export type { PgBossConnectionConfig, PgBossSubscriberOptions };
91
+ export type { PgBossConnectionConfig, PgBossPublisherOptions, PgBossSubscriberOptions };
66
92
  //# sourceMappingURL=index.d.mts.map