{"id":29943346,"url":"https://github.com/sourcefuse/loopback4-message-bus-connector","last_synced_at":"2026-01-20T17:17:10.240Z","repository":{"id":271180022,"uuid":"862207790","full_name":"sourcefuse/loopback4-message-bus-connector","owner":"sourcefuse","description":"loopback4-message-bus-queue-connector","archived":false,"fork":false,"pushed_at":"2025-12-15T06:22:45.000Z","size":1039,"stargazers_count":0,"open_issues_count":3,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-12-18T02:54:36.031Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sourcefuse.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-24T08:09:55.000Z","updated_at":"2025-10-28T05:42:44.000Z","dependencies_parsed_at":"2025-01-06T05:03:29.605Z","dependency_job_id":"f079da71-eaab-4d49-a872-7703a0c3b51b","html_url":"https://github.com/sourcefuse/loopback4-message-bus-connector","commit_stats":null,"previous_names":["sourcefuse/loopback4-message-bus-queue-connector","sourcefuse/loopback4-message-bus-connector"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/sourcefuse/loopback4-message-bus-connector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Floopback4-message-bus-connector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Floopback4-message-bus-connector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Floopback4-message-bus-connector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Floopback4-message-bus-connector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sourcefuse","download_url":"https://codeload.github.com/sourcefuse/loopback4-message-bus-connector/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcefuse%2Floopback4-message-bus-connector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28607625,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T16:10:39.856Z","status":"ssl_error","status_checked_at":"2026-01-20T16:10:39.493Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-03T02:15:03.223Z","updated_at":"2026-01-20T17:17:10.224Z","avatar_url":"https://github.com/sourcefuse.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://sourcefuse.github.io/arc-docs/arc-api-docs\" target=\"_blank\"\u003e\u003cimg src=\"https://github.com/sourcefuse/loopback4-microservice-catalog/blob/master/docs/assets/logo-dark-bg.png?raw=true\" alt=\"ARC By SourceFuse logo\" title=\"ARC By SourceFuse\" align=\"right\" width=\"150\" /\u003e\u003c/a\u003e\n\n# [loopback4-message-bus-connector](https://github.com/sourcefuse/loopback4-message-bus-connector)\n\n\u003cp align=\"left\"\u003e\n\u003ca href=\"https://www.npmjs.com/package/loopback4-message-bus-connector\"\u003e\n\u003cimg src=\"https://img.shields.io/npm/v/loopback4-message-bus-connector.svg\" alt=\"npm version\" /\u003e\n\u003c/a\u003e\n\u003ca href=\"https://sonarcloud.io/summary/new_code?id=sourcefuse_loopback4-message-bus-connector\" target=\"_blank\"\u003e\n\u003cimg alt=\"Sonar Quality Gate\" src=\"https://img.shields.io/sonar/quality_gate/sourcefuse_loopback4-message-bus-connector?server=https%3A%2F%2Fsonarcloud.io\"\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://github.com/sourcefuse/loopback4-message-bus-connector/graphs/contributors\" target=\"_blank\"\u003e\n\u003cimg alt=\"GitHub contributors\" src=\"https://img.shields.io/github/contributors/sourcefuse/loopback4-message-bus-connector?\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://www.npmjs.com/package/loopback4-message-bus-connector\" target=\"_blank\"\u003e\n\u003cimg alt=\"downloads\" src=\"https://img.shields.io/npm/dw/loopback4-message-bus-connector.svg\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/sourcefuse/loopback4-message-bus-connector/blob/master/LICENSE\"\u003e\n\u003cimg src=\"https://img.shields.io/github/license/sourcefuse/loopback4-message-bus-connector.svg\" alt=\"License\" /\u003e\n\u003c/a\u003e\n\u003ca href=\"https://loopback.io/\" target=\"_blank\"\u003e\n\u003cimg alt=\"Powered By LoopBack 4\" src=\"https://img.shields.io/badge/Powered%20by-LoopBack 4-brightgreen\" /\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\n# Overview\n\nThis is a LoopBack 4 extension for adding message queue and event based communication to your LoopBack applications. It provides a unified and extensible interface for working with different queuing systems.\n\n✅ **Supported Connectors**\n\n- [SQSConnector](/src/strategies/sqs) – Integrates with AWS SQS using @aws-sdk/client-sqs. Supports both message sending and consumption with polling, visibility timeout, etc.\n\n- [BullMQConnector](/src/strategies/bullmq) – Integrates with BullMQ (Redis-based queue). Supports advanced job options like retries, backoff, consumer concurrency, and job polling.\n\n- [EventBridge](/src/strategies/event-bridge) - Allows sending events to AWS EventBridge with support for event buses and schemas. Provides the HTTPS endpoint for receiving events.\n\n🧩 **Core Features**\n- **Component Based Approach**\nCentral registry for components, enabling multi-bus usage in a single application.\n\n- **@producer()** Decorator\nInjects a producer for sending single or multiple typed events to any configured bus.\n\n- **@consumer** Decorator\nRegisters a service class as a consumer for a specific event and queue, handling messages automatically.\n\n- **IProducer** Interface\nExposes send() and sendMultiple() methods to send messages to buses.\n\n- **IConsumer** Interface\nAllows you to implement a handler for a specific event type and bus, supporting strongly typed data flow.\n\n- **Typed Event Streams**\nEncourages defining typed contracts for all events, improving consistency and type safety between producers and consumers.\n\nYou can configure one or more of the supported queue types in your application. For each, you simply provide the required connection and queue configuration. The rest—producer/consumer setup, bindings, and event handling—is abstracted and managed by the extension.\n\n## Installation\n\nInstall EventStreamConnectorComponent using `npm`;\n\n```sh\n$ [npm install | yarn add] loopback4-message-bus-connector\n```\n## Flow Diagram\n\n![screencapture-kzmkc5owuvsij9sl8eox-lite-vusercontent-net-2025-06-29-09_06_14](https://github.com/user-attachments/assets/3084cf3c-fbc2-4059-be30-8baa9dd07621)\n\n## Basic Use\n\nConfigure and load EventStreamConnectorComponent in the application constructor\nas shown below.\n\n```ts\nimport {\n  EventStreamConnectorComponent\n} from 'loopback4-message-bus-connector';\n\n// ...\nexport class MyApplication extends BootMixin(\n  ServiceMixin(RepositoryMixin(RestApplication)),\n) {\n  constructor(options: ApplicationConfig = {}) {\n    super();\n    this.component(EventStreamConnectorComponent);\n    // ...\n  }\n  // ...\n}\n```\n\n### SQS\n\nTo use SQS as their message queue, bind its required config and connector component in your application.\n\n```ts\nimport {\n  SQSConnector,\n  SQSBindings,\n  EventStreamConnectorComponent\n} from 'loopback4-message-bus-connector';\n\n// ...\nexport class MyApplication extends BootMixin(\n  ServiceMixin(RepositoryMixin(RestApplication)),\n) {\n  constructor(options: ApplicationConfig = {}) {\n    super();\n\n    this.component(EventStreamConnectorComponent);\n    // SQS Config and its connector\n    this.bind(SQSBindings.Config).to({\n      queueConfig: {\n        QueueUrl: 'http://127.0.0.1:4566/000000000000/my-test-queue',\n        MessageRetentionPeriod: 60, // at least 60 seconds\n        MaximumMessageSize: 262144,\n        ReceiveMessageWaitTimeSeconds: 20, // typical polling time\n        VisibilityTimeout: 30, // 30 seconds\n      },\n      Credentials: {\n        region: 'us-east-1',\n        accessKeyId: 'test',\n        secretAccessKey: 'test',\n      },\n      ConsumerConfig: {\n        MaxNumberOfMessages: 10,\n        WaitTimeSeconds: 20,\n        maxConsumers: 2,\n      },\n    });\n\n    this.component(SQSConnector);\n\n    // ...\n  }\n  // ...\n}\n```\n\nto make the application as consumer, pass 'isConsumer' flag to be true in SQS config. like\n\n```ts\nconst config = {\n  // rest of ur config\n  isConsumer: true,\n};\n```\n\nPlease follow the [AWS SDK for JavaScript](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/sqs-examples-send-receive-messages.html) for more information on the configuration.\n\n### BullMQ\n\nTo use BullMq as their message queue, bind its required config and connector component in your application.\n\n```ts\nimport {\n  BullMQConnector,\n  BullMQBindings,\n  EventStreamConnectorComponent,\n} from 'loopback4-message-bus-connector';\n\n// ...\nexport class MyApplication extends BootMixin(\n  ServiceMixin(RepositoryMixin(RestApplication)),\n) {\n  constructor(options: ApplicationConfig = {}) {\n    super();\n\n    this.component(EventStreamConnectorComponent);\n\n    // Bull Mq config and connector\n    this.bind(BullMQBindings.Config).to({\n      QueueName: process.env.QUEUE_NAME ?? 'default-queue',\n      redisConfig: {\n        host: process.env.REDIS_HOST ?? 'localhost',\n        port: parseInt(process.env.REDIS_PORT ?? '6379'),\n        password: process.env.REDIS_PASSWORD ?? undefined,\n      },\n      producerConfig: {\n        defaultJobOptions: {\n          attempts: 3,\n          backoff: 5000,\n        },\n      },\n      consumerConfig: {\n        MinConsumers: 1,\n        MaxConsumers: 5,\n        QueuePollInterval: 2000,\n      },\n    });\n    this.component(BullMQConnector);\n    // ...\n  }\n  // ...\n}\n```\n\nto make the application as consumer, pass 'isConsumer' flag to be true in Bull config. like\n\n```ts\nconst config = {\n  // rest of ur config\n  isConsumer: true,\n};\n```\n\n## Integration\n\n loopback4-message-bus-connector provides a decorator '@producer()' that can be used to access the producer of each msg queue. It expects one arguement defining the type of queue, of which producer u want to use. like\n\n ```ts \n @injectable({scope: BindingScope.TRANSIENT})\nexport class EventConnector implements IEventConnector\u003cPublishedEvents\u003e {\n  constructor(\n    @producer(QueueType.EventBridge)\n    private producer: Producer,\n    @producer(QueueType.SQS)\n    private sqsProducer: Producer,\n    @producer(QueueType.BullMQ)\n    private bullMqProducer: Producer,\n  ) {}\n\n  // rest of implementation\n\n}\n ```\n\n Producer provider two ways of sending events - single event at a time and multiple event at a time.\n\n ```ts\n export type Producer\u003cStream extends AnyObject = AnyObject\u003e = {\n    send: \u003cEvent extends keyof Stream\u003e(data: Stream[Event], topic?: Event) =\u003e Promise\u003cvoid\u003e;\n    sendMultiple: \u003cEvent extends keyof Stream\u003e(data: Stream[Event][], topic?: Event) =\u003e Promise\u003cvoid\u003e;\n};\n ```\n\nIt provides '@consumer' decorator to make a service as consumer. consumer needs to follow an interface.\n\n```ts\nexport interface IConsumer\u003cStream extends AnyObject, Event extends keyof Stream\u003e {\n    event: Event;\n    queue: QueueType;\n    handle(data: Stream[Event]): Promise\u003cvoid\u003e;\n}\n```\n\nand can be used as \n\n```ts\nimport {\n  IConsumer,\n  QueueType,\n  consumer,\n} from 'loopback4-message-bus-connector';\nimport { OrchestratorStream, EventTypes, ProvisioningInputs } from '../../types';\n\n@consumer\nexport class TenantProvisioningConsumerForEventSQS\n  implements IConsumer\u003cOrchestratorStream, EventTypes.TENANT_PROVISIONING\u003e\n{\n  constructor(\n  ) {}\n  event: EventTypes.TENANT_PROVISIONING = EventTypes.TENANT_PROVISIONING;\n  queue: QueueType = QueueType.SQS;\n  async handle(data: ProvisioningInputs): Promise\u003cvoid\u003e {    \n    console.log(`SQS: ${this.event} Event Recieved ` + JSON.stringify(data));\n    return;\n  }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcefuse%2Floopback4-message-bus-connector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsourcefuse%2Floopback4-message-bus-connector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcefuse%2Floopback4-message-bus-connector/lists"}