{"id":18262843,"url":"https://github.com/midwayjs/event-bus","last_synced_at":"2025-04-04T20:30:56.196Z","repository":{"id":63069333,"uuid":"554703357","full_name":"midwayjs/event-bus","owner":"midwayjs","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-27T14:57:14.000Z","size":78,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-20T18:09:34.400Z","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/midwayjs.png","metadata":{"files":{"readme":"README.md","changelog":"History.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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}},"created_at":"2022-10-20T08:47:22.000Z","updated_at":"2024-11-27T14:57:20.000Z","dependencies_parsed_at":"2024-01-23T21:20:32.693Z","dependency_job_id":"7048b3c8-ddc2-4a41-abaf-9ce9530c4097","html_url":"https://github.com/midwayjs/event-bus","commit_stats":{"total_commits":48,"total_committers":1,"mean_commits":48.0,"dds":0.0,"last_synced_commit":"2556f10c23b87effa7bc0b67a0d2971642b1ad62"},"previous_names":["midwayjs/hub"],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Fevent-bus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Fevent-bus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Fevent-bus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/midwayjs%2Fevent-bus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/midwayjs","download_url":"https://codeload.github.com/midwayjs/event-bus/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247246179,"owners_count":20907749,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":"2024-11-05T11:09:00.189Z","updated_at":"2025-04-04T20:30:56.163Z","avatar_url":"https://github.com/midwayjs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Event-Bus\n\nEvent Bus 用来完成父子进程之间的消息传递，包括同步的调用，异步的发送，以及广播的能力，支持进程、线程、同一进程内调用三种模式。\n\n## Usage\n\n基础使用，在不同的进程间引入。\n\n如下，创建 Thread 模式的 EventBus。\n\n```ts\n/**\n * in main\n */\nimport { ThreadEventBus } from '@midwayjs/event-bus';\n\n// 创建一个 bus\nconst bus = new ThreadEventBus({\n  isWorker: false,\n});\n\n// 添加一个 worker\nconst worker = new Worker();\nbus.addWorker(worker);\n\n// 等待连接和启动\nawait bus.start();\n\n// 发布消息\nbus.publish('hello world');\n\n\n/**\n * in worker\n */\n\nimport { ThreadEventBus } from '@midwayjs/event-bus';\n// 创建 bus 客户端\nconst bus = new ThreadEventBus({\n  isWorker: true,\n});\n\n// 启动客户端，自动向 master 发送消息\nawait bus.start();\n\n// 订阅消息\nbus.subscribe(message =\u003e {\n  console.log(message.body);\n  // =\u003e 'hello world'\n});\n\n```\n\n可以创建 Cluster 模式的 EventBus，接口相同。\n\n```ts\nimport { ChildProcessEventBus } from '@midwayjs/event-bus';\n\n// in main\nconst bus = new ChildProcessEventBus({\n  isWorker: false,\n});\nawait bus.start();\n\n// in worker\nconst bus = new ChildProcessEventBus({\n  isWorker: true,\n});\n\n// 启动客户端，自动向 master 发送消息\nawait bus.start();\n```\n\n为了方便同进程研发，也提供了相同接口的 LocalEventBus。\n\n```ts\nimport { LocalEventBus } from '@midwayjs/event-bus';\n\n// in main\nconst bus = new LocalEventBus({\n  isWorker: false,\n});\nawait bus.start();\n\n// in worker\nconst bus = new LocalEventBus({\n  isWorker: true,\n});\n\nawait bus.start();\n```\n\n注意，本地模式下，需要在不同文件中，且 worker 只能有一个。\n\n\n## API\n\n**start**\n\nbus 启动后，需要调用此方法，才能正常使用。\n\nmain 调用后会等待 worker 启动，worker 调用后会向 main 发送消息。\n\n```ts\n// in main \u0026 worker\nawait bus.start();\n```\n\n如果 worker 启动错误，可以传递异常给 main。\n\n```ts\n// worker\nawait bus.start(new Error('worker error'));\n\n// main\nbus.onError(error =\u003e {\n  console.log(error.message);\n  // =\u003e 'worker error'\n});\n```\n\n\n**Publish \u0026 Subscribe**\n\n异步的发送和监听消息，支持 main 和 worker 双向发送， API 一致。\n\n```ts\nbus.subscribe(message =\u003e {\n  // message.body === {data: 'abc'}\n});\n\nbus.publish({\n  data: 'abc'\n});\n\n```\n\n指定某个 topic 发送消息。\n\n```ts\nbus.subscribe(message =\u003e {\n  // message.body === {data: 'abc'}\n}, {\n  topic: 'test'\n});\n\nbus.publish({\n  data: 'abc'\n}, {\n  topic: 'test'\n});\n\n```\n\npublish 错误。\n\n```ts\nconst err = new Error('test');\nbus.publish(err);\n```\n\n\n**publishAsync**\n\n同步的发送消息，会等待订阅方返回，包含超时参数，默认 5s。支持 main \u003c-\u003e worker 双向异步通信。\n\n从 main 发送到 worker:\n```ts\n// in worker\nbus.subscribe((message, responder) =\u003e {\n  // message.body === {data: 'abc'}\n  responder?.send({\n    data: 'hello world',\n  });\n\n  // send error\n  responder.error(new Error('test'));\n});\n\n// in main\nconst result = await bus.publishAsync({\n  data: 'abc'\n}, {\n  timeout: 5000,\n});\n\n// result =\u003e {data: 'hello world'}\n```\n\n从 worker 发送到 main:\n```ts\n// in main\nbus.subscribe((message, responder) =\u003e {\n  // message.body === {data: 'abc'}\n  responder?.send({\n    data: 'hello world',\n  });\n});\n\n// in worker\nconst result = await bus.publishAsync({\n  data: 'abc'\n}, {\n  timeout: 5000,\n});\n\n// result =\u003e {data: 'hello world'}\n```\n\n使用 try/catch 捕获错误:\n```ts\ntry {\n  await bus.publishAsync({\n    data: 'abc'\n  });\n} catch (err) {\n  // err.message =\u003e 'test'\n}\n```\n\n**publishChunk**\n\n发送消息，会等待订阅方返回多次，包含超时参数，默认 5s。\n\n此 API 仅限于 main 向 worker 发送消息。\n\n`publishChunk` 方法返回的是一个异步迭代器。\n\n```ts\n\n// subscribe\nbus.subscribe((message, responder) =\u003e {\n  responder.send('hello');\n  responder.send(' world');\n  responder.end();\n});\n\n// invoke\nconst iterator = bus.publishChunk({\n  data: 'abc'\n}, {\n  timeout: 5000,\n});\n\nlet result = '';\nfor await (const data of iterator) {\n  result += data;\n}\n```\n\n使用 try/catch 捕获错误。\n\n```ts\nconst iterator = bus.publishChunk({\n  data: 'abc'\n});\ntry {\n  let result = '';\n  for await (const data of iterator) {\n    result += data;\n  }\n} catch (err) {\n  // err.message =\u003e 'test'\n}\n```\n\n**broadcast**\n\n广播消息（一对多）。\n\n```ts\n// worker\nbus.subscribe(message =\u003e {\n  // message.body === {data: 'abc'}\n});\n\n// main\nbus.broadcast({\n  data: 'abc'\n});\n```\n\n也支持 worker 向其他 main 或者 worker 广播。\n\n```ts\n// worker\nbus.broadcast('hello world');\n```\n\n默认情况下，worker 广播之后，**main** 和 **当前 worker** 都不会收到这条消息\n\n可以通过设置属性，让当前 Worker 也同时接收这条消息。\n\n```ts\n// worker\nbus.broadcast('hello world', {\n  includeSelfFromWorker: true,\n});\n```\n\n可以通过设置属性，让 main 也同时接收这条消息。\n\n```ts\n// worker\nbus.broadcast('hello world', {\n  includeMainFromWorker: true,\n});\n```\n\n\n\n## Message 类型\n\n包含以下属性\n\n- `messageId` 用来确定消息的唯一 id\n- `workerId`  消息发送的 worker id\n- `type` 消息发送的类型，包括 inited(初始化)，request（main 向 worker 发送），response（worker 向 main 发送），invoke（同步的 main 向 worker 发送），broadcast（广播）几种类型\n- `error` 意外的报错信息\n- `messageOptions` 在发送消息时额外的参数，比如超时时间等，具体看类型定义\n\n\n## 调试\n\n使用环境变量 `NODE_DEBUG=midway:event-bus*` 开启调试输出。\n\n\n## 注意\n\n所有的消息必须可序列化，不能传递复杂对象，类，方法等。\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidwayjs%2Fevent-bus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmidwayjs%2Fevent-bus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidwayjs%2Fevent-bus/lists"}