phecda-server 5.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +10 -108
  2. package/bin/cli.mjs +189 -186
  3. package/bin/schema.json +55 -55
  4. package/dist/{chunk-F5YWXY5W.js → chunk-423JPSEB.js} +18 -17
  5. package/dist/chunk-423JPSEB.js.map +1 -0
  6. package/dist/chunk-4R55T3HG.js +253 -0
  7. package/dist/chunk-4R55T3HG.js.map +1 -0
  8. package/dist/chunk-4YVAW3L4.mjs +76 -0
  9. package/dist/chunk-4YVAW3L4.mjs.map +1 -0
  10. package/dist/{chunk-W5EOVGQD.mjs → chunk-5DOVDDO7.mjs} +3 -2
  11. package/dist/chunk-5DOVDDO7.mjs.map +1 -0
  12. package/dist/{chunk-BXLBWRHS.js → chunk-5WQ2SMIK.js} +39 -38
  13. package/dist/chunk-5WQ2SMIK.js.map +1 -0
  14. package/dist/chunk-6MQP6OHU.mjs +295 -0
  15. package/dist/chunk-6MQP6OHU.mjs.map +1 -0
  16. package/dist/chunk-6Q2PCC3A.mjs +295 -0
  17. package/dist/chunk-6Q2PCC3A.mjs.map +1 -0
  18. package/dist/chunk-6UQYEBAN.js +253 -0
  19. package/dist/chunk-6UQYEBAN.js.map +1 -0
  20. package/dist/chunk-6W7CGOZC.mjs +565 -0
  21. package/dist/chunk-6W7CGOZC.mjs.map +1 -0
  22. package/dist/{chunk-YR5Q5F2K.js → chunk-7Y37NSBM.js} +1 -0
  23. package/dist/chunk-7Y37NSBM.js.map +1 -0
  24. package/dist/{chunk-RCTOVYZY.mjs → chunk-BQBSVGMG.mjs} +2 -1
  25. package/dist/chunk-BQBSVGMG.mjs.map +1 -0
  26. package/dist/chunk-BZP6GKM6.mjs +565 -0
  27. package/dist/chunk-BZP6GKM6.mjs.map +1 -0
  28. package/dist/{chunk-ITTD2GBR.mjs → chunk-C5JAHCS2.mjs} +1 -0
  29. package/dist/chunk-C5JAHCS2.mjs.map +1 -0
  30. package/dist/chunk-DTBKDALR.mjs +295 -0
  31. package/dist/chunk-DTBKDALR.mjs.map +1 -0
  32. package/dist/chunk-GHOKWS5V.js +295 -0
  33. package/dist/chunk-GHOKWS5V.js.map +1 -0
  34. package/dist/chunk-H4N6SHNG.mjs +76 -0
  35. package/dist/chunk-H4N6SHNG.mjs.map +1 -0
  36. package/dist/chunk-ICYHM4UM.js +565 -0
  37. package/dist/chunk-ICYHM4UM.js.map +1 -0
  38. package/dist/chunk-LOLXPM4J.mjs +529 -0
  39. package/dist/chunk-LOLXPM4J.mjs.map +1 -0
  40. package/dist/chunk-MSS6A2TU.js +585 -0
  41. package/dist/chunk-MSS6A2TU.js.map +1 -0
  42. package/dist/{chunk-AB4OX3WV.mjs → chunk-NEM3FY7C.mjs} +2 -1
  43. package/dist/chunk-NEM3FY7C.mjs.map +1 -0
  44. package/dist/chunk-OTHER3YM.mjs +253 -0
  45. package/dist/chunk-OTHER3YM.mjs.map +1 -0
  46. package/dist/chunk-Q2FYFIEY.js +295 -0
  47. package/dist/chunk-Q2FYFIEY.js.map +1 -0
  48. package/dist/chunk-QG4X6H5Y.js +565 -0
  49. package/dist/chunk-QG4X6H5Y.js.map +1 -0
  50. package/dist/chunk-QIEZ6YTG.mjs +295 -0
  51. package/dist/chunk-QIEZ6YTG.mjs.map +1 -0
  52. package/dist/chunk-QOAKHCM7.js +295 -0
  53. package/dist/chunk-QOAKHCM7.js.map +1 -0
  54. package/dist/chunk-QVUD6L5X.js +565 -0
  55. package/dist/chunk-QVUD6L5X.js.map +1 -0
  56. package/dist/{chunk-YERBWZCS.js → chunk-RGLTGKAU.js} +64 -63
  57. package/dist/chunk-RGLTGKAU.js.map +1 -0
  58. package/dist/chunk-SHRK3TVB.js +295 -0
  59. package/dist/chunk-SHRK3TVB.js.map +1 -0
  60. package/dist/chunk-TCH6S42Z.js +529 -0
  61. package/dist/chunk-TCH6S42Z.js.map +1 -0
  62. package/dist/chunk-UCGRFVHC.mjs +253 -0
  63. package/dist/chunk-UCGRFVHC.mjs.map +1 -0
  64. package/dist/chunk-VOISXWVF.mjs +295 -0
  65. package/dist/chunk-VOISXWVF.mjs.map +1 -0
  66. package/dist/chunk-W6BC5INO.mjs +295 -0
  67. package/dist/chunk-W6BC5INO.mjs.map +1 -0
  68. package/dist/chunk-X5WQRO4R.js +295 -0
  69. package/dist/chunk-X5WQRO4R.js.map +1 -0
  70. package/dist/chunk-XDMCVVD3.mjs +585 -0
  71. package/dist/chunk-XDMCVVD3.mjs.map +1 -0
  72. package/dist/chunk-XNTMYLK6.js +76 -0
  73. package/dist/chunk-XNTMYLK6.js.map +1 -0
  74. package/dist/chunk-Y6LI4FDO.js +537 -0
  75. package/dist/chunk-Y6LI4FDO.js.map +1 -0
  76. package/dist/chunk-YZ2AQ6IL.mjs +537 -0
  77. package/dist/chunk-YZ2AQ6IL.mjs.map +1 -0
  78. package/dist/chunk-Z4YJHEXT.js +76 -0
  79. package/dist/chunk-Z4YJHEXT.js.map +1 -0
  80. package/dist/chunk-ZE336SKZ.js +295 -0
  81. package/dist/chunk-ZE336SKZ.js.map +1 -0
  82. package/dist/chunk-ZJD235TO.mjs +565 -0
  83. package/dist/chunk-ZJD235TO.mjs.map +1 -0
  84. package/dist/core-39f27fe8.d.ts +131 -0
  85. package/dist/core-930ea883.d.ts +131 -0
  86. package/dist/core-eb646fe5.d.ts +139 -0
  87. package/dist/helper-06d25b37.d.ts +19 -0
  88. package/dist/helper-48454c0b.d.ts +20 -0
  89. package/dist/helper-6133f78f.d.ts +18 -0
  90. package/dist/helper-867a598d.d.ts +18 -0
  91. package/dist/helper-88b19c66.d.ts +12 -0
  92. package/dist/helper-9e206c66.d.ts +12 -0
  93. package/dist/helper-fcbf6aa8.d.ts +20 -0
  94. package/dist/index.d.ts +27 -32
  95. package/dist/index.js +45 -40
  96. package/dist/index.js.map +1 -0
  97. package/dist/index.mjs +15 -10
  98. package/dist/index.mjs.map +1 -0
  99. package/dist/rpc/bullmq/index.d.ts +10 -6
  100. package/dist/rpc/bullmq/index.js +33 -53
  101. package/dist/rpc/bullmq/index.js.map +1 -0
  102. package/dist/rpc/bullmq/index.mjs +27 -47
  103. package/dist/rpc/bullmq/index.mjs.map +1 -0
  104. package/dist/rpc/kafka/index.d.ts +10 -4
  105. package/dist/rpc/kafka/index.js +21 -37
  106. package/dist/rpc/kafka/index.js.map +1 -0
  107. package/dist/rpc/kafka/index.mjs +16 -32
  108. package/dist/rpc/kafka/index.mjs.map +1 -0
  109. package/dist/rpc/nats/index.d.ts +2 -2
  110. package/dist/rpc/nats/index.js +21 -34
  111. package/dist/rpc/nats/index.js.map +1 -0
  112. package/dist/rpc/nats/index.mjs +14 -27
  113. package/dist/rpc/nats/index.mjs.map +1 -0
  114. package/dist/rpc/rabbitmq/index.d.ts +2 -2
  115. package/dist/rpc/rabbitmq/index.js +24 -37
  116. package/dist/rpc/rabbitmq/index.js.map +1 -0
  117. package/dist/rpc/rabbitmq/index.mjs +15 -28
  118. package/dist/rpc/rabbitmq/index.mjs.map +1 -0
  119. package/dist/rpc/redis/index.d.ts +10 -4
  120. package/dist/rpc/redis/index.js +24 -37
  121. package/dist/rpc/redis/index.js.map +1 -0
  122. package/dist/rpc/redis/index.mjs +17 -30
  123. package/dist/rpc/redis/index.mjs.map +1 -0
  124. package/dist/server/elysia/index.d.ts +4 -3
  125. package/dist/server/elysia/index.js +78 -94
  126. package/dist/server/elysia/index.js.map +1 -0
  127. package/dist/server/elysia/index.mjs +75 -91
  128. package/dist/server/elysia/index.mjs.map +1 -0
  129. package/dist/server/express/index.d.ts +5 -4
  130. package/dist/server/express/index.js +80 -93
  131. package/dist/server/express/index.js.map +1 -0
  132. package/dist/server/express/index.mjs +78 -91
  133. package/dist/server/express/index.mjs.map +1 -0
  134. package/dist/server/fastify/index.d.ts +8 -5
  135. package/dist/server/fastify/index.js +84 -102
  136. package/dist/server/fastify/index.js.map +1 -0
  137. package/dist/server/fastify/index.mjs +80 -98
  138. package/dist/server/fastify/index.mjs.map +1 -0
  139. package/dist/server/h3/index.d.ts +5 -4
  140. package/dist/server/h3/index.js +82 -97
  141. package/dist/server/h3/index.js.map +1 -0
  142. package/dist/server/h3/index.mjs +81 -96
  143. package/dist/server/h3/index.mjs.map +1 -0
  144. package/dist/server/hono/index.d.ts +5 -4
  145. package/dist/server/hono/index.js +74 -90
  146. package/dist/server/hono/index.js.map +1 -0
  147. package/dist/server/hono/index.mjs +73 -89
  148. package/dist/server/hono/index.mjs.map +1 -0
  149. package/dist/server/hyper-express/index.d.ts +6 -5
  150. package/dist/server/hyper-express/index.js +79 -96
  151. package/dist/server/hyper-express/index.js.map +1 -0
  152. package/dist/server/hyper-express/index.mjs +78 -95
  153. package/dist/server/hyper-express/index.mjs.map +1 -0
  154. package/dist/server/koa/index.d.ts +5 -4
  155. package/dist/server/koa/index.js +80 -92
  156. package/dist/server/koa/index.js.map +1 -0
  157. package/dist/server/koa/index.mjs +77 -89
  158. package/dist/server/koa/index.mjs.map +1 -0
  159. package/dist/test.d.ts +1 -1
  160. package/dist/test.js +7 -6
  161. package/dist/test.js.map +1 -0
  162. package/dist/test.mjs +3 -2
  163. package/dist/test.mjs.map +1 -0
  164. package/package.json +8 -7
  165. package/register/index.mjs +40 -40
  166. package/register/loader.mjs +341 -340
  167. package/register/utils.mjs +81 -81
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/rpc/bullmq/bind.ts","../../../src/rpc/bullmq/client.ts"],"names":["Queue","Worker","Debug","debug","create","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","workerOpts","queueOpts","workerMap","queueMap","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","handleRequest","job","args","id","clientQueue","_ps","isEvent","context","Context","type","queueName","run","returnData","err","error","HMR","i","close","EventEmitter","createClient","controllers","eventId","eventCount","max","timeout","key","ret","emitter","genClientQueue","emit","Proxy","target","p","Error","Promise","resolve","reject","isEnd","timer","setTimeout","off","listener","clearTimeout","once"],"mappings":"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","sourcesContent":["import type { Job, QueueOptions, WorkerOptions } from 'bullmq'\r\nimport { Queue, Worker } from 'bullmq'\r\nimport Debug from 'debug'\r\nimport type { Factory } from '../../core'\r\nimport { Context } from '../../context'\r\nimport type { RpcContext, RpcServerOptions } from '../helper'\r\nimport { HMR } from '../../hmr'\r\n\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/bullmq')\r\n\r\nexport interface BullmqCtx extends RpcContext {\r\n type: 'bullmq'\r\n}\r\n\r\nexport interface BullmqOptions {\r\n workerOpts?: WorkerOptions\r\n queueOpts?: QueueOptions\r\n}\r\n\r\nexport async function create({ moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: BullmqOptions & RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe, workerOpts, queueOpts } = opts\r\n\r\n const workerMap: Record<string, Worker> = {}\r\n const queueMap: Record<string, Queue> = {}\r\n const existQueue = new Set<string>()\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, rpc, func, tag } = meta.data\r\n if (controller === 'rpc' && rpc?.queue !== undefined) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n\r\n detectAopDep(meta, {\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n }, 'rpc')\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n for (const [tag, record] of metaMap) {\r\n for (const func in record) {\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n\r\n if (rpc) {\r\n const queue = rpc.queue || tag\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n workerMap[queue] = new Worker(queue, handleRequest, workerOpts)\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function handleRequest(job: Job) {\r\n const { data } = job\r\n const { tag, func, args, id, queue: clientQueue, _ps } = data\r\n if (_ps !== 1)\r\n return\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n\r\n rpc: { isEvent } = {},\r\n },\r\n } = meta\r\n\r\n if (!isEvent && !(clientQueue in queueMap))\r\n queueMap[clientQueue] = new Queue(clientQueue, queueOpts)\r\n\r\n const context = new Context<BullmqCtx>({\r\n type: 'bullmq',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n data,\r\n args,\r\n id,\r\n queue: job.queueName,\r\n isEvent,\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n\r\n queueMap[clientQueue].add(`${tag}-${func}`, { data: returnData, id })\r\n }, (err) => {\r\n if (!isEvent) {\r\n queueMap[clientQueue].add(`${tag}-${func}`, {\r\n data: err,\r\n error: true,\r\n id,\r\n })\r\n }\r\n })\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const i in workerMap)\r\n await workerMap[i].close(true)\r\n for (const i in queueMap)\r\n await queueMap[i].close()\r\n\r\n await subscribeQueues()\r\n })\r\n\r\n return { workerMap, queueMap }\r\n}\r\n","/* eslint-disable no-new */\r\n/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport { Queue, Worker } from 'bullmq'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\nimport { BullmqOptions } from './bind'\r\n\r\nexport async function createClient<S extends Record<string, any>>(controllers: S, opts: RpcClientOptions & BullmqOptions = {}) {\r\n let eventId = 1\r\n let eventCount = 0\r\n const { max, workerOpts, queueOpts, timeout, key } = opts\r\n const ret = {} as ToClientMap<S>\r\n const emitter = new EventEmitter()\r\n\r\n const clientQueue = genClientQueue(key)\r\n\r\n const queueMap: Record<string, Queue> = {}\r\n\r\n new Worker(clientQueue, async (job) => {\r\n const { data, id, error } = job.data\r\n emitter.emit(id, data, error)\r\n }, workerOpts)\r\n\r\n for (const i in controllers) {\r\n ret[i] = new Proxy(new controllers[i](), {\r\n get(target, p: string) {\r\n if (typeof target[p] !== 'function')\r\n throw new Error(`\"${p}\" in \"${i}\" is not an exposed rpc `)\r\n\r\n let { tag, queue, isEvent } = target[p]()\r\n\r\n return async (...args: any) => {\r\n if (!queue)\r\n queue = tag\r\n if (!(queue in queueMap))\r\n queueMap[queue] = new Queue(queue, queueOpts)\r\n\r\n const id = `${eventId++}`\r\n\r\n queueMap[queue].add(`${tag}-${p}`, {\r\n _ps: 1,\r\n id,\r\n args,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\r\n })\r\n\r\n if (isEvent)\r\n return null\r\n\r\n return new Promise((resolve, reject) => {\r\n if (max && eventCount >= max)\r\n reject({ type: 'exceeded' })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n emitter.off(id, listener)\r\n reject({ type: 'timeout' })\r\n }\r\n }, timeout || 5000)\r\n\r\n function listener(data: any, error: boolean) {\r\n eventCount--\r\n isEnd = true\r\n clearTimeout(timer)\r\n if (error)\r\n reject(data)\r\n\r\n else\r\n resolve(data)\r\n }\r\n eventCount++\r\n emitter.once(id, listener)\r\n })\r\n }\r\n },\r\n })\r\n }\r\n\r\n return ret\r\n}\r\n"]}
@@ -1,38 +1,34 @@
1
1
  import {
2
2
  Context,
3
3
  HMR,
4
+ createControllerMetaMap,
4
5
  detectAopDep,
5
6
  genClientQueue
6
- } from "../../chunk-AB4OX3WV.mjs";
7
+ } from "../../chunk-ZJD235TO.mjs";
7
8
  import {
8
9
  __name
9
- } from "../../chunk-ITTD2GBR.mjs";
10
+ } from "../../chunk-H4N6SHNG.mjs";
10
11
 
11
12
  // src/rpc/bullmq/bind.ts
12
13
  import { Queue, Worker } from "bullmq";
13
14
  import Debug from "debug";
14
15
  var debug = Debug("phecda-server/bullmq");
15
- async function bind(connectOpts, { moduleMap, meta }, opts = {}) {
16
- const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts;
17
- const metaMap = /* @__PURE__ */ new Map();
16
+ async function create({ moduleMap, meta }, opts = {}) {
17
+ const { globalGuards, globalInterceptors, globalFilter, globalPipe, workerOpts, queueOpts } = opts;
18
18
  const workerMap = {};
19
19
  const queueMap = {};
20
20
  const existQueue = /* @__PURE__ */ new Set();
21
- function handleMeta() {
22
- metaMap.clear();
23
- for (const item of meta) {
24
- const { tag, func, controller, rpc } = item.data;
25
- if (controller !== "rpc" || rpc?.queue === void 0)
26
- continue;
27
- if (metaMap.has(tag))
28
- metaMap.get(tag)[func] = item;
29
- else
30
- metaMap.set(tag, {
31
- [func]: item
32
- });
21
+ const metaMap = createControllerMetaMap(meta, (meta2) => {
22
+ const { controller, rpc, func, tag } = meta2.data;
23
+ if (controller === "rpc" && rpc?.queue !== void 0) {
24
+ debug(`register method "${func}" in module "${tag}"`);
25
+ return true;
33
26
  }
34
- }
35
- __name(handleMeta, "handleMeta");
27
+ });
28
+ detectAopDep(meta, {
29
+ guards: globalGuards,
30
+ interceptors: globalInterceptors
31
+ }, "rpc");
36
32
  async function subscribeQueues() {
37
33
  existQueue.clear();
38
34
  for (const [tag, record] of metaMap) {
@@ -44,9 +40,7 @@ async function bind(connectOpts, { moduleMap, meta }, opts = {}) {
44
40
  if (existQueue.has(queue))
45
41
  continue;
46
42
  existQueue.add(queue);
47
- workerMap[queue] = new Worker(queue, handleRequest, {
48
- connection: connectOpts
49
- });
43
+ workerMap[queue] = new Worker(queue, handleRequest, workerOpts);
50
44
  }
51
45
  }
52
46
  }
@@ -61,9 +55,7 @@ async function bind(connectOpts, { moduleMap, meta }, opts = {}) {
61
55
  const meta2 = metaMap.get(tag)[func];
62
56
  const { data: { rpc: { isEvent } = {} } } = meta2;
63
57
  if (!isEvent && !(clientQueue in queueMap))
64
- queueMap[clientQueue] = new Queue(clientQueue, {
65
- connection: connectOpts
66
- });
58
+ queueMap[clientQueue] = new Queue(clientQueue, queueOpts);
67
59
  const context = new Context({
68
60
  type: "bullmq",
69
61
  moduleMap,
@@ -98,18 +90,8 @@ async function bind(connectOpts, { moduleMap, meta }, opts = {}) {
98
90
  });
99
91
  }
100
92
  __name(handleRequest, "handleRequest");
101
- detectAopDep(meta, {
102
- guards: globalGuards,
103
- interceptors: globalInterceptors
104
- }, "rpc");
105
- handleMeta();
106
93
  subscribeQueues();
107
94
  HMR(async () => {
108
- detectAopDep(meta, {
109
- guards: globalGuards,
110
- interceptors: globalInterceptors
111
- }, "rpc");
112
- handleMeta();
113
95
  for (const i in workerMap)
114
96
  await workerMap[i].close(true);
115
97
  for (const i in queueMap)
@@ -121,24 +103,23 @@ async function bind(connectOpts, { moduleMap, meta }, opts = {}) {
121
103
  queueMap
122
104
  };
123
105
  }
124
- __name(bind, "bind");
106
+ __name(create, "create");
125
107
 
126
108
  // src/rpc/bullmq/client.ts
127
109
  import { EventEmitter } from "events";
128
110
  import { Queue as Queue2, Worker as Worker2 } from "bullmq";
129
- async function createClient(connectOpts, controllers, opts) {
111
+ async function createClient(controllers, opts = {}) {
130
112
  let eventId = 1;
131
113
  let eventCount = 0;
114
+ const { max, workerOpts, queueOpts, timeout, key } = opts;
132
115
  const ret = {};
133
116
  const emitter = new EventEmitter();
134
- const clientQueue = genClientQueue(opts?.key);
117
+ const clientQueue = genClientQueue(key);
135
118
  const queueMap = {};
136
119
  new Worker2(clientQueue, async (job) => {
137
120
  const { data, id, error } = job.data;
138
121
  emitter.emit(id, data, error);
139
- }, {
140
- connection: connectOpts
141
- });
122
+ }, workerOpts);
142
123
  for (const i in controllers) {
143
124
  ret[i] = new Proxy(new controllers[i](), {
144
125
  get(target, p) {
@@ -149,9 +130,7 @@ async function createClient(connectOpts, controllers, opts) {
149
130
  if (!queue)
150
131
  queue = tag;
151
132
  if (!(queue in queueMap))
152
- queueMap[queue] = new Queue2(queue, {
153
- connection: connectOpts
154
- });
133
+ queueMap[queue] = new Queue2(queue, queueOpts);
155
134
  const id = `${eventId++}`;
156
135
  queueMap[queue].add(`${tag}-${p}`, {
157
136
  _ps: 1,
@@ -164,7 +143,7 @@ async function createClient(connectOpts, controllers, opts) {
164
143
  if (isEvent)
165
144
  return null;
166
145
  return new Promise((resolve, reject) => {
167
- if (opts?.max && eventCount >= opts.max)
146
+ if (max && eventCount >= max)
168
147
  reject({
169
148
  type: "exceeded"
170
149
  });
@@ -177,7 +156,7 @@ async function createClient(connectOpts, controllers, opts) {
177
156
  type: "timeout"
178
157
  });
179
158
  }
180
- }, opts?.timeout || 5e3);
159
+ }, timeout || 5e3);
181
160
  function listener(data, error) {
182
161
  eventCount--;
183
162
  isEnd = true;
@@ -199,6 +178,7 @@ async function createClient(connectOpts, controllers, opts) {
199
178
  }
200
179
  __name(createClient, "createClient");
201
180
  export {
202
- bind,
181
+ create,
203
182
  createClient
204
183
  };
184
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/rpc/bullmq/bind.ts","../../../src/rpc/bullmq/client.ts"],"sourcesContent":["import type { Job, QueueOptions, WorkerOptions } from 'bullmq'\r\nimport { Queue, Worker } from 'bullmq'\r\nimport Debug from 'debug'\r\nimport type { Factory } from '../../core'\r\nimport { Context } from '../../context'\r\nimport type { RpcContext, RpcServerOptions } from '../helper'\r\nimport { HMR } from '../../hmr'\r\n\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/bullmq')\r\n\r\nexport interface BullmqCtx extends RpcContext {\r\n type: 'bullmq'\r\n}\r\n\r\nexport interface BullmqOptions {\r\n workerOpts?: WorkerOptions\r\n queueOpts?: QueueOptions\r\n}\r\n\r\nexport async function create({ moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: BullmqOptions & RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe, workerOpts, queueOpts } = opts\r\n\r\n const workerMap: Record<string, Worker> = {}\r\n const queueMap: Record<string, Queue> = {}\r\n const existQueue = new Set<string>()\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, rpc, func, tag } = meta.data\r\n if (controller === 'rpc' && rpc?.queue !== undefined) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n\r\n detectAopDep(meta, {\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n }, 'rpc')\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n for (const [tag, record] of metaMap) {\r\n for (const func in record) {\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n\r\n if (rpc) {\r\n const queue = rpc.queue || tag\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n workerMap[queue] = new Worker(queue, handleRequest, workerOpts)\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function handleRequest(job: Job) {\r\n const { data } = job\r\n const { tag, func, args, id, queue: clientQueue, _ps } = data\r\n if (_ps !== 1)\r\n return\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n\r\n rpc: { isEvent } = {},\r\n },\r\n } = meta\r\n\r\n if (!isEvent && !(clientQueue in queueMap))\r\n queueMap[clientQueue] = new Queue(clientQueue, queueOpts)\r\n\r\n const context = new Context<BullmqCtx>({\r\n type: 'bullmq',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n data,\r\n args,\r\n id,\r\n queue: job.queueName,\r\n isEvent,\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n\r\n queueMap[clientQueue].add(`${tag}-${func}`, { data: returnData, id })\r\n }, (err) => {\r\n if (!isEvent) {\r\n queueMap[clientQueue].add(`${tag}-${func}`, {\r\n data: err,\r\n error: true,\r\n id,\r\n })\r\n }\r\n })\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const i in workerMap)\r\n await workerMap[i].close(true)\r\n for (const i in queueMap)\r\n await queueMap[i].close()\r\n\r\n await subscribeQueues()\r\n })\r\n\r\n return { workerMap, queueMap }\r\n}\r\n","/* eslint-disable no-new */\r\n/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport { Queue, Worker } from 'bullmq'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\nimport { BullmqOptions } from './bind'\r\n\r\nexport async function createClient<S extends Record<string, any>>(controllers: S, opts: RpcClientOptions & BullmqOptions = {}) {\r\n let eventId = 1\r\n let eventCount = 0\r\n const { max, workerOpts, queueOpts, timeout, key } = opts\r\n const ret = {} as ToClientMap<S>\r\n const emitter = new EventEmitter()\r\n\r\n const clientQueue = genClientQueue(key)\r\n\r\n const queueMap: Record<string, Queue> = {}\r\n\r\n new Worker(clientQueue, async (job) => {\r\n const { data, id, error } = job.data\r\n emitter.emit(id, data, error)\r\n }, workerOpts)\r\n\r\n for (const i in controllers) {\r\n ret[i] = new Proxy(new controllers[i](), {\r\n get(target, p: string) {\r\n if (typeof target[p] !== 'function')\r\n throw new Error(`\"${p}\" in \"${i}\" is not an exposed rpc `)\r\n\r\n let { tag, queue, isEvent } = target[p]()\r\n\r\n return async (...args: any) => {\r\n if (!queue)\r\n queue = tag\r\n if (!(queue in queueMap))\r\n queueMap[queue] = new Queue(queue, queueOpts)\r\n\r\n const id = `${eventId++}`\r\n\r\n queueMap[queue].add(`${tag}-${p}`, {\r\n _ps: 1,\r\n id,\r\n args,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\r\n })\r\n\r\n if (isEvent)\r\n return null\r\n\r\n return new Promise((resolve, reject) => {\r\n if (max && eventCount >= max)\r\n reject({ type: 'exceeded' })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n emitter.off(id, listener)\r\n reject({ type: 'timeout' })\r\n }\r\n }, timeout || 5000)\r\n\r\n function listener(data: any, error: boolean) {\r\n eventCount--\r\n isEnd = true\r\n clearTimeout(timer)\r\n if (error)\r\n reject(data)\r\n\r\n else\r\n resolve(data)\r\n }\r\n eventCount++\r\n emitter.once(id, listener)\r\n })\r\n }\r\n },\r\n })\r\n }\r\n\r\n return ret\r\n}\r\n"],"mappings":";;;;;;;;;;;;AACA,SAASA,OAAOC,cAAc;AAC9B,OAAOC,WAAW;AAQlB,IAAMC,QAAQC,MAAM,sBAAA;AAWpB,eAAsBC,OAAO,EAAEC,WAAWC,KAAI,GAAyCC,OAAyC,CAAC,GAAG;AAClI,QAAM,EAAEC,cAAcC,oBAAoBC,cAAcC,YAAYC,YAAYC,UAAS,IAAKN;AAE9F,QAAMO,YAAoC,CAAC;AAC3C,QAAMC,WAAkC,CAAC;AACzC,QAAMC,aAAa,oBAAIC,IAAAA;AACvB,QAAMC,UAAUC,wBAAwBb,MAAM,CAACA,UAAS;AACtD,UAAM,EAAEc,YAAYC,KAAKC,MAAMC,IAAG,IAAKjB,MAAKkB;AAC5C,QAAIJ,eAAe,SAASC,KAAKI,UAAUC,QAAW;AACpDxB,YAAM,oBAAoBoB,oBAAoBC,MAAM;AACpD,aAAO;IACT;EACF,CAAA;AAEAI,eAAarB,MAAM;IACjBsB,QAAQpB;IACRqB,cAAcpB;EAChB,GAAG,KAAA;AAEH,iBAAeqB,kBAAkB;AAC/Bd,eAAWe,MAAK;AAChB,eAAW,CAACR,KAAKS,MAAAA,KAAWd,SAAS;AACnC,iBAAWI,QAAQU,QAAQ;AACzB,cAAM1B,QAAOY,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,cAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCf;AAEJ,YAAIe,KAAK;AACP,gBAAMI,QAAQJ,IAAII,SAASF;AAC3B,cAAIP,WAAWkB,IAAIT,KAAAA;AACjB;AACFT,qBAAWmB,IAAIV,KAAAA;AACfX,oBAAUW,SAAS,IAAIW,OAAOX,OAAOY,eAAezB,UAAAA;QACtD;MACF;IACF;EACF;AArBekB;AAuBf,iBAAeO,cAAcC,KAAU;AACrC,UAAM,EAAEd,KAAI,IAAKc;AACjB,UAAM,EAAEf,KAAKD,MAAMiB,MAAMC,IAAIf,OAAOgB,aAAaC,IAAG,IAAKlB;AACzD,QAAIkB,QAAQ;AACV;AACFxC,UAAM,kBAAkBoB,oBAAoBC,MAAM;AAClD,UAAMjB,QAAOY,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,UAAM,EACJE,MAAM,EAEJH,KAAK,EAAEsB,QAAO,IAAK,CAAC,EAAC,EACtB,IACCrC;AAEJ,QAAI,CAACqC,WAAW,EAAEF,eAAe1B;AAC/BA,eAAS0B,eAAe,IAAIG,MAAMH,aAAa5B,SAAAA;AAEjD,UAAMgC,UAAU,IAAIC,QAAmB;MACrCC,MAAM;MACN1C;MACAC,MAAAA;MACAiB;MACAD;MACAE;MACAe;MACAC;MACAf,OAAOa,IAAIU;MACXL;IACF,CAAA;AAEA,UAAME,QAAQI,IAAI;MAAEzC;MAAcC;MAAoBC;MAAcC;IAAW,GAAG,CAACuC,eAAe;AAChG,UAAI,CAACP;AAEH5B,iBAAS0B,aAAaN,IAAI,GAAGZ,OAAOD,QAAQ;UAAEE,MAAM0B;UAAYV;QAAG,CAAA;IACvE,GAAG,CAACW,QAAQ;AACV,UAAI,CAACR,SAAS;AACZ5B,iBAAS0B,aAAaN,IAAI,GAAGZ,OAAOD,QAAQ;UAC1CE,MAAM2B;UACNC,OAAO;UACPZ;QACF,CAAA;MACF;IACF,CAAA;EACF;AA5CeH;AA8CfP,kBAAAA;AAEAuB,MAAI,YAAY;AACd,eAAWC,KAAKxC;AACd,YAAMA,UAAUwC,GAAGC,MAAM,IAAI;AAC/B,eAAWD,KAAKvC;AACd,YAAMA,SAASuC,GAAGC,MAAK;AAEzB,UAAMzB,gBAAAA;EACR,CAAA;AAEA,SAAO;IAAEhB;IAAWC;EAAS;AAC/B;AApGsBX;;;ACnBtB,SAASoD,oBAAoB;AAC7B,SAASC,SAAAA,QAAOC,UAAAA,eAAc;AAM9B,eAAsBC,aAA4CC,aAAgBC,OAAyC,CAAC,GAAG;AAC7H,MAAIC,UAAU;AACd,MAAIC,aAAa;AACjB,QAAM,EAAEC,KAAKC,YAAYC,WAAWC,SAASC,IAAG,IAAKP;AACrD,QAAMQ,MAAM,CAAC;AACb,QAAMC,UAAU,IAAIC,aAAAA;AAEpB,QAAMC,cAAcC,eAAeL,GAAAA;AAEnC,QAAMM,WAAkC,CAAC;AAEzC,MAAIC,QAAOH,aAAa,OAAOI,QAAQ;AACrC,UAAM,EAAEC,MAAMC,IAAIC,MAAK,IAAKH,IAAIC;AAChCP,YAAQU,KAAKF,IAAID,MAAME,KAAAA;EACzB,GAAGd,UAAAA;AAEH,aAAWgB,KAAKrB,aAAa;AAC3BS,QAAIY,KAAK,IAAIC,MAAM,IAAItB,YAAYqB,GAAE,GAAI;MACvCE,IAAIC,QAAQC,GAAW;AACrB,YAAI,OAAOD,OAAOC,OAAO;AACvB,gBAAM,IAAIC,MAAM,IAAID,UAAUJ,2BAA2B;AAE3D,YAAI,EAAEM,KAAKC,OAAOC,QAAO,IAAKL,OAAOC,GAAE;AAEvC,eAAO,UAAUK,SAAc;AAC7B,cAAI,CAACF;AACHA,oBAAQD;AACV,cAAI,EAAEC,SAASd;AACbA,qBAASc,SAAS,IAAIG,OAAMH,OAAOtB,SAAAA;AAErC,gBAAMY,KAAK,GAAGhB;AAEdY,mBAASc,OAAOI,IAAI,GAAGL,OAAOF,KAAK;YACjCQ,KAAK;YACLf;YACAY;YACAH;YACAC,OAAOhB;YACPsB,MAAMT;UACR,CAAA;AAEA,cAAII;AACF,mBAAO;AAET,iBAAO,IAAIM,QAAQ,CAACC,SAASC,WAAW;AACtC,gBAAIjC,OAAOD,cAAcC;AACvBiC,qBAAO;gBAAEC,MAAM;cAAW,CAAA;AAE5B,gBAAIC,QAAQ;AACZ,kBAAMC,QAAQC,WAAW,MAAM;AAC7B,kBAAI,CAACF,OAAO;AACVpC;AACAO,wBAAQgC,IAAIxB,IAAIyB,QAAAA;AAChBN,uBAAO;kBAAEC,MAAM;gBAAU,CAAA;cAC3B;YACF,GAAG/B,WAAW,GAAA;AAEd,qBAASoC,SAAS1B,MAAWE,OAAgB;AAC3ChB;AACAoC,sBAAQ;AACRK,2BAAaJ,KAAAA;AACb,kBAAIrB;AACFkB,uBAAOpB,IAAAA;;AAGPmB,wBAAQnB,IAAAA;YACZ;AATS0B;AAUTxC;AACAO,oBAAQmC,KAAK3B,IAAIyB,QAAAA;UACnB,CAAA;QACF;MACF;IACF,CAAA;EACF;AAEA,SAAOlC;AACT;AA5EsBV;","names":["Queue","Worker","Debug","debug","Debug","create","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","workerOpts","queueOpts","workerMap","queueMap","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","Worker","handleRequest","job","args","id","clientQueue","_ps","isEvent","Queue","context","Context","type","queueName","run","returnData","err","error","HMR","i","close","EventEmitter","Queue","Worker","createClient","controllers","opts","eventId","eventCount","max","workerOpts","queueOpts","timeout","key","ret","emitter","EventEmitter","clientQueue","genClientQueue","queueMap","Worker","job","data","id","error","emit","i","Proxy","get","target","p","Error","tag","queue","isEvent","args","Queue","add","_ps","func","Promise","resolve","reject","type","isEnd","timer","setTimeout","off","listener","clearTimeout","once"]}
@@ -1,6 +1,6 @@
1
1
  import { Consumer, Producer } from 'kafkajs';
2
- import { F as Factory, T as ToClientMap } from '../../core-fd134ffa.js';
3
- import { b as RpcContext, R as RpcServerOptions, a as RpcClientOptions } from '../../helper-73e8d2f0.js';
2
+ import { F as Factory, T as ToClientMap } from '../../core-39f27fe8.js';
3
+ import { b as RpcContext, R as RpcServerOptions, a as RpcClientOptions } from '../../helper-6133f78f.js';
4
4
  import 'phecda-core';
5
5
 
6
6
  interface KafkaCtx extends RpcContext {
@@ -10,8 +10,14 @@ interface KafkaCtx extends RpcContext {
10
10
  heartbeat(): Promise<void>;
11
11
  pause(): () => void;
12
12
  }
13
- declare function bind(consumer: Consumer, producer: Producer, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): Promise<void>;
13
+ declare function bind({ consumer, producer }: {
14
+ consumer: Consumer;
15
+ producer: Producer;
16
+ }, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts?: RpcServerOptions): Promise<void>;
14
17
 
15
- declare function createClient<S extends Record<string, any>>(producer: Producer, consumer: Consumer, controllers: S, opts?: RpcClientOptions): Promise<ToClientMap<S>>;
18
+ declare function createClient<S extends Record<string, any>>({ producer, consumer }: {
19
+ producer: Producer;
20
+ consumer: Consumer;
21
+ }, controllers: S, opts?: RpcClientOptions): Promise<ToClientMap<S>>;
16
22
 
17
23
  export { KafkaCtx, bind, createClient };
@@ -3,33 +3,28 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkYERBWZCSjs = require('../../chunk-YERBWZCS.js');
6
+ var _chunkQG4X6H5Yjs = require('../../chunk-QG4X6H5Y.js');
7
7
 
8
8
 
9
- var _chunkYR5Q5F2Kjs = require('../../chunk-YR5Q5F2K.js');
9
+ var _chunkXNTMYLK6js = require('../../chunk-XNTMYLK6.js');
10
10
 
11
11
  // src/rpc/kafka/bind.ts
12
12
  var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug);
13
13
  var debug = _debug2.default.call(void 0, "phecda-server/kafka");
14
- async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
14
+ async function bind({ consumer, producer }, { moduleMap, meta }, opts = {}) {
15
15
  const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts;
16
- const metaMap = /* @__PURE__ */ new Map();
17
16
  const existQueue = /* @__PURE__ */ new Set();
18
- function handleMeta() {
19
- metaMap.clear();
20
- for (const item of meta) {
21
- const { tag, func, controller, rpc } = item.data;
22
- if (controller !== "rpc" || _optionalChain([rpc, 'optionalAccess', _ => _.queue]) === void 0)
23
- continue;
24
- if (metaMap.has(tag))
25
- metaMap.get(tag)[func] = item;
26
- else
27
- metaMap.set(tag, {
28
- [func]: item
29
- });
17
+ const metaMap = _chunkQG4X6H5Yjs.createControllerMetaMap.call(void 0, meta, (meta2) => {
18
+ const { controller, rpc, func, tag } = meta2.data;
19
+ if (controller === "rpc" && _optionalChain([rpc, 'optionalAccess', _ => _.queue]) !== void 0) {
20
+ debug(`register method "${func}" in module "${tag}"`);
21
+ return true;
30
22
  }
31
- }
32
- _chunkYR5Q5F2Kjs.__name.call(void 0, handleMeta, "handleMeta");
23
+ });
24
+ _chunkQG4X6H5Yjs.detectAopDep.call(void 0, meta, {
25
+ guards: globalGuards,
26
+ interceptors: globalInterceptors
27
+ }, "rpc");
33
28
  async function subscribeQueues() {
34
29
  existQueue.clear();
35
30
  for (const [tag, record] of metaMap) {
@@ -49,12 +44,7 @@ async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
49
44
  }
50
45
  }
51
46
  }
52
- _chunkYR5Q5F2Kjs.__name.call(void 0, subscribeQueues, "subscribeQueues");
53
- _chunkYERBWZCSjs.detectAopDep.call(void 0, meta, {
54
- guards: globalGuards,
55
- interceptors: globalInterceptors
56
- }, "rpc");
57
- handleMeta();
47
+ _chunkXNTMYLK6js.__name.call(void 0, subscribeQueues, "subscribeQueues");
58
48
  await subscribeQueues();
59
49
  await consumer.run({
60
50
  eachMessage: async ({ message, partition, topic, heartbeat, pause }) => {
@@ -68,7 +58,7 @@ async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
68
58
  const meta2 = metaMap.get(tag)[func];
69
59
  const { data: { rpc } } = meta2;
70
60
  const isEvent = rpc.isEvent;
71
- const context = new (0, _chunkYERBWZCSjs.Context)({
61
+ const context = new (0, _chunkQG4X6H5Yjs.Context)({
72
62
  type: "kafka",
73
63
  moduleMap,
74
64
  meta: meta2,
@@ -120,24 +110,17 @@ async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
120
110
  });
121
111
  }
122
112
  });
123
- _chunkYERBWZCSjs.HMR.call(void 0, async () => {
124
- _chunkYERBWZCSjs.detectAopDep.call(void 0, meta, {
125
- guards: globalGuards,
126
- interceptors: globalInterceptors
127
- }, "rpc");
128
- handleMeta();
129
- });
130
113
  }
131
- _chunkYR5Q5F2Kjs.__name.call(void 0, bind, "bind");
114
+ _chunkXNTMYLK6js.__name.call(void 0, bind, "bind");
132
115
 
133
116
  // src/rpc/kafka/client.ts
134
117
  var _events = require('events');
135
- async function createClient(producer, consumer, controllers, opts) {
118
+ async function createClient({ producer, consumer }, controllers, opts) {
136
119
  let eventId = 1;
137
120
  let eventCount = 1;
138
121
  const ret = {};
139
122
  const emitter = new (0, _events.EventEmitter)();
140
- const clientQueue = _chunkYERBWZCSjs.genClientQueue.call(void 0, _optionalChain([opts, 'optionalAccess', _2 => _2.key]));
123
+ const clientQueue = _chunkQG4X6H5Yjs.genClientQueue.call(void 0, _optionalChain([opts, 'optionalAccess', _2 => _2.key]));
141
124
  await consumer.subscribe({
142
125
  topic: clientQueue,
143
126
  fromBeginning: true
@@ -193,7 +176,7 @@ async function createClient(producer, consumer, controllers, opts) {
193
176
  else
194
177
  resolve(data);
195
178
  }
196
- _chunkYR5Q5F2Kjs.__name.call(void 0, listener, "listener");
179
+ _chunkXNTMYLK6js.__name.call(void 0, listener, "listener");
197
180
  eventCount++;
198
181
  emitter.once(id, listener);
199
182
  });
@@ -211,8 +194,9 @@ async function createClient(producer, consumer, controllers, opts) {
211
194
  });
212
195
  return ret;
213
196
  }
214
- _chunkYR5Q5F2Kjs.__name.call(void 0, createClient, "createClient");
197
+ _chunkXNTMYLK6js.__name.call(void 0, createClient, "createClient");
215
198
 
216
199
 
217
200
 
218
201
  exports.bind = bind; exports.createClient = createClient;
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/rpc/kafka/bind.ts","../../../src/rpc/kafka/client.ts"],"names":["Debug","debug","bind","consumer","producer","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","subscribe","topic","fromBeginning","run","eachMessage","message","partition","heartbeat","pause","JSON","parse","value","toString","id","clientQueue","_ps","args","isEvent","context","Context","type","returnData","send","messages","stringify","err","error","EventEmitter","createClient","controllers","eventId","eventCount","ret","emitter","genClientQueue","key","i","Proxy","target","p","Error","Promise","resolve","reject","max","isEnd","timer","setTimeout","off","listener","timeout","clearTimeout","once","emit"],"mappings":"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","sourcesContent":["import type { Consumer, Producer } from 'kafkajs'\r\nimport Debug from 'debug'\r\nimport type { Factory } from '../../core'\r\nimport { Context } from '../../context'\r\nimport type { RpcContext, RpcServerOptions } from '../helper'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/kafka')\r\n\r\nexport interface KafkaCtx extends RpcContext {\r\n type: 'kafka'\r\n topic: string\r\n partition: number\r\n heartbeat(): Promise<void>\r\n pause(): () => void\r\n\r\n}\r\n// @experiment\r\n\r\nexport async function bind({ consumer, producer }: { consumer: Consumer; producer: Producer }, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n\r\n const existQueue = new Set<string>()\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, rpc, func, tag } = meta.data\r\n if (controller === 'rpc' && rpc?.queue !== undefined) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n\r\n detectAopDep(meta, {\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n }, 'rpc')\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n for (const [tag, record] of metaMap) {\r\n for (const func in record) {\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n if (rpc) {\r\n const queue = rpc.queue || tag\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n await consumer.subscribe({ topic: queue, fromBeginning: true })\r\n }\r\n }\r\n }\r\n }\r\n\r\n await subscribeQueues()\r\n await consumer.run({\r\n eachMessage: async ({ message, partition, topic, heartbeat, pause }) => {\r\n if (!existQueue.has(topic))\r\n return\r\n\r\n const data = JSON.parse(message.value!.toString())\r\n\r\n const { tag, func, id, queue: clientQueue, _ps, args } = data\r\n\r\n if (_ps !== 1)\r\n return\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n const isEvent = rpc!.isEvent\r\n\r\n const context = new Context<KafkaCtx>({\r\n type: 'kafka',\r\n moduleMap,\r\n meta,\r\n args,\r\n id,\r\n tag,\r\n func,\r\n partition,\r\n topic,\r\n heartbeat,\r\n pause,\r\n\r\n isEvent,\r\n queue: topic,\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent) {\r\n producer.send({\r\n topic: clientQueue,\r\n messages: [\r\n { value: JSON.stringify({ data: returnData, id }) },\r\n ],\r\n })\r\n }\r\n }, (err) => {\r\n if (!isEvent) {\r\n producer.send({\r\n topic: clientQueue,\r\n messages: [\r\n {\r\n value: JSON.stringify({\r\n data: err,\r\n error: true,\r\n id,\r\n }),\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n },\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport type { Consumer, Producer } from 'kafkajs'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n// @experiment\r\nexport async function createClient<S extends Record<string, any>>({ producer, consumer }: { producer: Producer; consumer: Consumer }, controllers: S, opts?: RpcClientOptions) {\r\n let eventId = 1\r\n let eventCount = 1\r\n\r\n const ret = {} as ToClientMap<S>\r\n const emitter = new EventEmitter()\r\n\r\n const clientQueue = genClientQueue(opts?.key)\r\n\r\n await consumer.subscribe({ topic: clientQueue, fromBeginning: true })\r\n for (const i in controllers) {\r\n ret[i] = new Proxy(new controllers[i](), {\r\n get(target, p: string) {\r\n if (typeof target[p] !== 'function')\r\n throw new Error(`\"${p}\" in \"${i}\" is not an exposed rpc `)\r\n\r\n let { tag, queue, isEvent } = target[p]()\r\n\r\n return async (...args: any) => {\r\n if (!queue)\r\n queue = tag\r\n\r\n const id = `${eventId++}`\r\n\r\n producer.send({\r\n topic: queue,\r\n messages: [\r\n {\r\n value: JSON.stringify({\r\n _ps: 1,\r\n id,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\r\n args,\r\n }),\r\n },\r\n ],\r\n })\r\n\r\n if (isEvent)\r\n return null\r\n\r\n return new Promise((resolve, reject) => {\r\n if (opts?.max && eventCount >= opts.max)\r\n reject({ type: 'exceeded' })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n emitter.off(id, listener)\r\n reject({ type: 'timeout' })\r\n }\r\n }, opts?.timeout || 5000)\r\n\r\n function listener(data: any, error: boolean) {\r\n eventCount--\r\n isEnd = true\r\n clearTimeout(timer)\r\n if (error)\r\n reject(data)\r\n\r\n else\r\n resolve(data)\r\n }\r\n eventCount++\r\n emitter.once(id, listener)\r\n })\r\n }\r\n },\r\n })\r\n }\r\n await consumer.run(\r\n {\r\n eachMessage: async ({ message, topic }) => {\r\n if (clientQueue === topic && message.value) {\r\n const { data, id, error } = JSON.parse(message.value.toString())\r\n\r\n emitter.emit(id, data, error)\r\n }\r\n },\r\n },\r\n )\r\n\r\n return ret\r\n}\r\n"]}
@@ -1,35 +1,30 @@
1
1
  import {
2
2
  Context,
3
- HMR,
3
+ createControllerMetaMap,
4
4
  detectAopDep,
5
5
  genClientQueue
6
- } from "../../chunk-AB4OX3WV.mjs";
6
+ } from "../../chunk-ZJD235TO.mjs";
7
7
  import {
8
8
  __name
9
- } from "../../chunk-ITTD2GBR.mjs";
9
+ } from "../../chunk-H4N6SHNG.mjs";
10
10
 
11
11
  // src/rpc/kafka/bind.ts
12
12
  import Debug from "debug";
13
13
  var debug = Debug("phecda-server/kafka");
14
- async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
14
+ async function bind({ consumer, producer }, { moduleMap, meta }, opts = {}) {
15
15
  const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts;
16
- const metaMap = /* @__PURE__ */ new Map();
17
16
  const existQueue = /* @__PURE__ */ new Set();
18
- function handleMeta() {
19
- metaMap.clear();
20
- for (const item of meta) {
21
- const { tag, func, controller, rpc } = item.data;
22
- if (controller !== "rpc" || rpc?.queue === void 0)
23
- continue;
24
- if (metaMap.has(tag))
25
- metaMap.get(tag)[func] = item;
26
- else
27
- metaMap.set(tag, {
28
- [func]: item
29
- });
17
+ const metaMap = createControllerMetaMap(meta, (meta2) => {
18
+ const { controller, rpc, func, tag } = meta2.data;
19
+ if (controller === "rpc" && rpc?.queue !== void 0) {
20
+ debug(`register method "${func}" in module "${tag}"`);
21
+ return true;
30
22
  }
31
- }
32
- __name(handleMeta, "handleMeta");
23
+ });
24
+ detectAopDep(meta, {
25
+ guards: globalGuards,
26
+ interceptors: globalInterceptors
27
+ }, "rpc");
33
28
  async function subscribeQueues() {
34
29
  existQueue.clear();
35
30
  for (const [tag, record] of metaMap) {
@@ -50,11 +45,6 @@ async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
50
45
  }
51
46
  }
52
47
  __name(subscribeQueues, "subscribeQueues");
53
- detectAopDep(meta, {
54
- guards: globalGuards,
55
- interceptors: globalInterceptors
56
- }, "rpc");
57
- handleMeta();
58
48
  await subscribeQueues();
59
49
  await consumer.run({
60
50
  eachMessage: async ({ message, partition, topic, heartbeat, pause }) => {
@@ -120,19 +110,12 @@ async function bind(consumer, producer, { moduleMap, meta }, opts = {}) {
120
110
  });
121
111
  }
122
112
  });
123
- HMR(async () => {
124
- detectAopDep(meta, {
125
- guards: globalGuards,
126
- interceptors: globalInterceptors
127
- }, "rpc");
128
- handleMeta();
129
- });
130
113
  }
131
114
  __name(bind, "bind");
132
115
 
133
116
  // src/rpc/kafka/client.ts
134
117
  import { EventEmitter } from "events";
135
- async function createClient(producer, consumer, controllers, opts) {
118
+ async function createClient({ producer, consumer }, controllers, opts) {
136
119
  let eventId = 1;
137
120
  let eventCount = 1;
138
121
  const ret = {};
@@ -216,3 +199,4 @@ export {
216
199
  bind,
217
200
  createClient
218
201
  };
202
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/rpc/kafka/bind.ts","../../../src/rpc/kafka/client.ts"],"sourcesContent":["import type { Consumer, Producer } from 'kafkajs'\r\nimport Debug from 'debug'\r\nimport type { Factory } from '../../core'\r\nimport { Context } from '../../context'\r\nimport type { RpcContext, RpcServerOptions } from '../helper'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/kafka')\r\n\r\nexport interface KafkaCtx extends RpcContext {\r\n type: 'kafka'\r\n topic: string\r\n partition: number\r\n heartbeat(): Promise<void>\r\n pause(): () => void\r\n\r\n}\r\n// @experiment\r\n\r\nexport async function bind({ consumer, producer }: { consumer: Consumer; producer: Producer }, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n\r\n const existQueue = new Set<string>()\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, rpc, func, tag } = meta.data\r\n if (controller === 'rpc' && rpc?.queue !== undefined) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n\r\n detectAopDep(meta, {\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n }, 'rpc')\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n for (const [tag, record] of metaMap) {\r\n for (const func in record) {\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n if (rpc) {\r\n const queue = rpc.queue || tag\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n await consumer.subscribe({ topic: queue, fromBeginning: true })\r\n }\r\n }\r\n }\r\n }\r\n\r\n await subscribeQueues()\r\n await consumer.run({\r\n eachMessage: async ({ message, partition, topic, heartbeat, pause }) => {\r\n if (!existQueue.has(topic))\r\n return\r\n\r\n const data = JSON.parse(message.value!.toString())\r\n\r\n const { tag, func, id, queue: clientQueue, _ps, args } = data\r\n\r\n if (_ps !== 1)\r\n return\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: {\r\n rpc,\r\n },\r\n } = meta\r\n const isEvent = rpc!.isEvent\r\n\r\n const context = new Context<KafkaCtx>({\r\n type: 'kafka',\r\n moduleMap,\r\n meta,\r\n args,\r\n id,\r\n tag,\r\n func,\r\n partition,\r\n topic,\r\n heartbeat,\r\n pause,\r\n\r\n isEvent,\r\n queue: topic,\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent) {\r\n producer.send({\r\n topic: clientQueue,\r\n messages: [\r\n { value: JSON.stringify({ data: returnData, id }) },\r\n ],\r\n })\r\n }\r\n }, (err) => {\r\n if (!isEvent) {\r\n producer.send({\r\n topic: clientQueue,\r\n messages: [\r\n {\r\n value: JSON.stringify({\r\n data: err,\r\n error: true,\r\n id,\r\n }),\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n },\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport type { Consumer, Producer } from 'kafkajs'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n// @experiment\r\nexport async function createClient<S extends Record<string, any>>({ producer, consumer }: { producer: Producer; consumer: Consumer }, controllers: S, opts?: RpcClientOptions) {\r\n let eventId = 1\r\n let eventCount = 1\r\n\r\n const ret = {} as ToClientMap<S>\r\n const emitter = new EventEmitter()\r\n\r\n const clientQueue = genClientQueue(opts?.key)\r\n\r\n await consumer.subscribe({ topic: clientQueue, fromBeginning: true })\r\n for (const i in controllers) {\r\n ret[i] = new Proxy(new controllers[i](), {\r\n get(target, p: string) {\r\n if (typeof target[p] !== 'function')\r\n throw new Error(`\"${p}\" in \"${i}\" is not an exposed rpc `)\r\n\r\n let { tag, queue, isEvent } = target[p]()\r\n\r\n return async (...args: any) => {\r\n if (!queue)\r\n queue = tag\r\n\r\n const id = `${eventId++}`\r\n\r\n producer.send({\r\n topic: queue,\r\n messages: [\r\n {\r\n value: JSON.stringify({\r\n _ps: 1,\r\n id,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\r\n args,\r\n }),\r\n },\r\n ],\r\n })\r\n\r\n if (isEvent)\r\n return null\r\n\r\n return new Promise((resolve, reject) => {\r\n if (opts?.max && eventCount >= opts.max)\r\n reject({ type: 'exceeded' })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n emitter.off(id, listener)\r\n reject({ type: 'timeout' })\r\n }\r\n }, opts?.timeout || 5000)\r\n\r\n function listener(data: any, error: boolean) {\r\n eventCount--\r\n isEnd = true\r\n clearTimeout(timer)\r\n if (error)\r\n reject(data)\r\n\r\n else\r\n resolve(data)\r\n }\r\n eventCount++\r\n emitter.once(id, listener)\r\n })\r\n }\r\n },\r\n })\r\n }\r\n await consumer.run(\r\n {\r\n eachMessage: async ({ message, topic }) => {\r\n if (clientQueue === topic && message.value) {\r\n const { data, id, error } = JSON.parse(message.value.toString())\r\n\r\n emitter.emit(id, data, error)\r\n }\r\n },\r\n },\r\n )\r\n\r\n return ret\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","consumer","producer","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","subscribe","topic","fromBeginning","run","eachMessage","message","partition","heartbeat","pause","JSON","parse","value","toString","id","clientQueue","_ps","args","isEvent","context","Context","type","returnData","send","messages","stringify","err","error","EventEmitter","createClient","producer","consumer","controllers","opts","eventId","eventCount","ret","emitter","EventEmitter","clientQueue","genClientQueue","key","subscribe","topic","fromBeginning","i","Proxy","get","target","p","Error","tag","queue","isEvent","args","id","send","messages","value","JSON","stringify","_ps","func","Promise","resolve","reject","max","type","isEnd","timer","setTimeout","off","listener","timeout","data","error","clearTimeout","once","run","eachMessage","message","parse","toString","emit"]}
@@ -1,6 +1,6 @@
1
1
  import { NatsConnection } from 'nats';
2
- import { F as Factory, T as ToClientMap } from '../../core-fd134ffa.js';
3
- import { b as RpcContext, R as RpcServerOptions, a as RpcClientOptions } from '../../helper-73e8d2f0.js';
2
+ import { F as Factory, T as ToClientMap } from '../../core-39f27fe8.js';
3
+ import { b as RpcContext, R as RpcServerOptions, a as RpcClientOptions } from '../../helper-6133f78f.js';
4
4
  import 'phecda-core';
5
5
 
6
6
  interface NatsCtx extends RpcContext {
@@ -2,10 +2,11 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkYERBWZCSjs = require('../../chunk-YERBWZCS.js');
6
5
 
6
+ var _chunkQG4X6H5Yjs = require('../../chunk-QG4X6H5Y.js');
7
7
 
8
- var _chunkYR5Q5F2Kjs = require('../../chunk-YR5Q5F2K.js');
8
+
9
+ var _chunkXNTMYLK6js = require('../../chunk-XNTMYLK6.js');
9
10
 
10
11
  // src/rpc/nats/bind.ts
11
12
  var _nats = require('nats');
@@ -15,23 +16,18 @@ async function bind(nc, { moduleMap, meta }, opts = {}) {
15
16
  const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts;
16
17
  const sc = _nats.StringCodec.call(void 0, );
17
18
  const subscriptionMap = {};
18
- const metaMap = /* @__PURE__ */ new Map();
19
19
  const existQueue = /* @__PURE__ */ new Set();
20
- function handleMeta() {
21
- metaMap.clear();
22
- for (const item of meta) {
23
- const { tag, func, controller, rpc } = item.data;
24
- if (controller !== "rpc" || _optionalChain([rpc, 'optionalAccess', _2 => _2.queue]) === void 0)
25
- continue;
26
- if (metaMap.has(tag))
27
- metaMap.get(tag)[func] = item;
28
- else
29
- metaMap.set(tag, {
30
- [func]: item
31
- });
20
+ const metaMap = _chunkQG4X6H5Yjs.createControllerMetaMap.call(void 0, meta, (meta2) => {
21
+ const { controller, rpc, func, tag } = meta2.data;
22
+ if (controller === "rpc" && _optionalChain([rpc, 'optionalAccess', _2 => _2.queue]) !== void 0) {
23
+ debug(`register method "${func}" in module "${tag}"`);
24
+ return true;
32
25
  }
33
- }
34
- _chunkYR5Q5F2Kjs.__name.call(void 0, handleMeta, "handleMeta");
26
+ });
27
+ _chunkQG4X6H5Yjs.detectAopDep.call(void 0, meta, {
28
+ guards: globalGuards,
29
+ interceptors: globalInterceptors
30
+ }, "rpc");
35
31
  async function subscribeQueues() {
36
32
  existQueue.clear();
37
33
  for (const [tag, record] of metaMap) {
@@ -51,7 +47,7 @@ async function bind(nc, { moduleMap, meta }, opts = {}) {
51
47
  }
52
48
  }
53
49
  }
54
- _chunkYR5Q5F2Kjs.__name.call(void 0, subscribeQueues, "subscribeQueues");
50
+ _chunkXNTMYLK6js.__name.call(void 0, subscribeQueues, "subscribeQueues");
55
51
  async function handleRequest(_, msg) {
56
52
  const data = JSON.parse(sc.decode(msg.data));
57
53
  const { tag, func, id, _ps, args } = data;
@@ -62,7 +58,7 @@ async function bind(nc, { moduleMap, meta }, opts = {}) {
62
58
  const { data: { rpc: { isEvent } = {} } } = meta2;
63
59
  if (isEvent)
64
60
  msg.respond("{}");
65
- const context = new (0, _chunkYERBWZCSjs.Context)({
61
+ const context = new (0, _chunkQG4X6H5Yjs.Context)({
66
62
  type: "nats",
67
63
  moduleMap,
68
64
  meta: meta2,
@@ -94,25 +90,15 @@ async function bind(nc, { moduleMap, meta }, opts = {}) {
94
90
  })));
95
91
  });
96
92
  }
97
- _chunkYR5Q5F2Kjs.__name.call(void 0, handleRequest, "handleRequest");
98
- _chunkYERBWZCSjs.detectAopDep.call(void 0, meta, {
99
- guards: globalGuards,
100
- interceptors: globalInterceptors
101
- }, "rpc");
102
- handleMeta();
93
+ _chunkXNTMYLK6js.__name.call(void 0, handleRequest, "handleRequest");
103
94
  subscribeQueues();
104
- _chunkYERBWZCSjs.HMR.call(void 0, async () => {
105
- _chunkYERBWZCSjs.detectAopDep.call(void 0, meta, {
106
- guards: globalGuards,
107
- interceptors: globalInterceptors
108
- }, "rpc");
109
- handleMeta();
95
+ _chunkQG4X6H5Yjs.HMR.call(void 0, async () => {
110
96
  for (const i in subscriptionMap)
111
97
  subscriptionMap[i].unsubscribe();
112
98
  await subscribeQueues();
113
99
  });
114
100
  }
115
- _chunkYR5Q5F2Kjs.__name.call(void 0, bind, "bind");
101
+ _chunkXNTMYLK6js.__name.call(void 0, bind, "bind");
116
102
 
117
103
  // src/rpc/nats/client.ts
118
104
 
@@ -169,7 +155,7 @@ async function createClient(nc, controllers, opts) {
169
155
  else
170
156
  resolve(data);
171
157
  }
172
- _chunkYR5Q5F2Kjs.__name.call(void 0, handler, "handler");
158
+ _chunkXNTMYLK6js.__name.call(void 0, handler, "handler");
173
159
  eventCount++;
174
160
  });
175
161
  };
@@ -178,8 +164,9 @@ async function createClient(nc, controllers, opts) {
178
164
  }
179
165
  return ret;
180
166
  }
181
- _chunkYR5Q5F2Kjs.__name.call(void 0, createClient, "createClient");
167
+ _chunkXNTMYLK6js.__name.call(void 0, createClient, "createClient");
182
168
 
183
169
 
184
170
 
185
171
  exports.bind = bind; exports.createClient = createClient;
172
+ //# sourceMappingURL=index.js.map