phecda-server 5.1.0 → 5.1.1
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/README.md +10 -10
- package/bin/cli.mjs +189 -189
- package/bin/schema.json +55 -55
- package/dist/{chunk-OTHER3YM.mjs → chunk-2HKQPZDT.mjs} +1 -2
- package/dist/{chunk-GHOKWS5V.js → chunk-3BV2GRS7.js} +38 -39
- package/dist/{chunk-BZP6GKM6.mjs → chunk-665MB62T.mjs} +1 -2
- package/dist/{chunk-QG4X6H5Y.js → chunk-FSBD5R22.js} +65 -66
- package/dist/{chunk-423JPSEB.js → chunk-HMPTPTFL.js} +17 -18
- package/dist/{chunk-6MQP6OHU.mjs → chunk-UU6RHGRF.mjs} +2 -3
- package/dist/{chunk-4YVAW3L4.mjs → chunk-VLV3AO3H.mjs} +0 -1
- package/dist/{chunk-Z4YJHEXT.js → chunk-ZP7HNASU.js} +0 -1
- package/dist/index.js +39 -40
- package/dist/index.mjs +4 -5
- package/dist/rpc/bullmq/index.js +12 -13
- package/dist/rpc/bullmq/index.mjs +2 -3
- package/dist/rpc/kafka/index.js +10 -11
- package/dist/rpc/kafka/index.mjs +2 -3
- package/dist/rpc/nats/index.js +11 -12
- package/dist/rpc/nats/index.mjs +2 -3
- package/dist/rpc/rabbitmq/index.js +13 -14
- package/dist/rpc/rabbitmq/index.mjs +2 -3
- package/dist/rpc/redis/index.js +11 -12
- package/dist/rpc/redis/index.mjs +2 -3
- package/dist/server/elysia/index.js +20 -21
- package/dist/server/elysia/index.mjs +3 -4
- package/dist/server/express/index.js +18 -19
- package/dist/server/express/index.mjs +2 -3
- package/dist/server/fastify/index.js +19 -20
- package/dist/server/fastify/index.mjs +3 -4
- package/dist/server/h3/index.js +16 -17
- package/dist/server/h3/index.mjs +2 -3
- package/dist/server/hono/index.js +17 -18
- package/dist/server/hono/index.mjs +2 -3
- package/dist/server/hyper-express/index.js +17 -18
- package/dist/server/hyper-express/index.mjs +2 -3
- package/dist/server/koa/index.js +18 -19
- package/dist/server/koa/index.mjs +2 -3
- package/dist/test.js +6 -7
- package/dist/test.mjs +2 -3
- package/package.json +2 -2
- package/register/index.mjs +40 -40
- package/register/loader.mjs +354 -341
- package/register/utils.mjs +81 -81
- package/dist/chunk-423JPSEB.js.map +0 -1
- package/dist/chunk-4R55T3HG.js +0 -253
- package/dist/chunk-4R55T3HG.js.map +0 -1
- package/dist/chunk-4YVAW3L4.mjs.map +0 -1
- package/dist/chunk-5DOVDDO7.mjs +0 -295
- package/dist/chunk-5DOVDDO7.mjs.map +0 -1
- package/dist/chunk-5WQ2SMIK.js +0 -295
- package/dist/chunk-5WQ2SMIK.js.map +0 -1
- package/dist/chunk-6MQP6OHU.mjs.map +0 -1
- package/dist/chunk-6Q2PCC3A.mjs +0 -295
- package/dist/chunk-6Q2PCC3A.mjs.map +0 -1
- package/dist/chunk-6UQYEBAN.js +0 -253
- package/dist/chunk-6UQYEBAN.js.map +0 -1
- package/dist/chunk-6W7CGOZC.mjs +0 -565
- package/dist/chunk-6W7CGOZC.mjs.map +0 -1
- package/dist/chunk-7Y37NSBM.js +0 -88
- package/dist/chunk-7Y37NSBM.js.map +0 -1
- package/dist/chunk-BQBSVGMG.mjs +0 -253
- package/dist/chunk-BQBSVGMG.mjs.map +0 -1
- package/dist/chunk-BZP6GKM6.mjs.map +0 -1
- package/dist/chunk-C5JAHCS2.mjs +0 -88
- package/dist/chunk-C5JAHCS2.mjs.map +0 -1
- package/dist/chunk-DTBKDALR.mjs +0 -295
- package/dist/chunk-DTBKDALR.mjs.map +0 -1
- package/dist/chunk-GHOKWS5V.js.map +0 -1
- package/dist/chunk-H4N6SHNG.mjs +0 -76
- package/dist/chunk-H4N6SHNG.mjs.map +0 -1
- package/dist/chunk-ICYHM4UM.js +0 -565
- package/dist/chunk-ICYHM4UM.js.map +0 -1
- package/dist/chunk-LOLXPM4J.mjs +0 -529
- package/dist/chunk-LOLXPM4J.mjs.map +0 -1
- package/dist/chunk-MSS6A2TU.js +0 -585
- package/dist/chunk-MSS6A2TU.js.map +0 -1
- package/dist/chunk-NEM3FY7C.mjs +0 -537
- package/dist/chunk-NEM3FY7C.mjs.map +0 -1
- package/dist/chunk-OTHER3YM.mjs.map +0 -1
- package/dist/chunk-Q2FYFIEY.js +0 -295
- package/dist/chunk-Q2FYFIEY.js.map +0 -1
- package/dist/chunk-QG4X6H5Y.js.map +0 -1
- package/dist/chunk-QIEZ6YTG.mjs +0 -295
- package/dist/chunk-QIEZ6YTG.mjs.map +0 -1
- package/dist/chunk-QOAKHCM7.js +0 -295
- package/dist/chunk-QOAKHCM7.js.map +0 -1
- package/dist/chunk-QVUD6L5X.js +0 -565
- package/dist/chunk-QVUD6L5X.js.map +0 -1
- package/dist/chunk-RGLTGKAU.js +0 -537
- package/dist/chunk-RGLTGKAU.js.map +0 -1
- package/dist/chunk-SHRK3TVB.js +0 -295
- package/dist/chunk-SHRK3TVB.js.map +0 -1
- package/dist/chunk-TCH6S42Z.js +0 -529
- package/dist/chunk-TCH6S42Z.js.map +0 -1
- package/dist/chunk-UCGRFVHC.mjs +0 -253
- package/dist/chunk-UCGRFVHC.mjs.map +0 -1
- package/dist/chunk-VOISXWVF.mjs +0 -295
- package/dist/chunk-VOISXWVF.mjs.map +0 -1
- package/dist/chunk-W6BC5INO.mjs +0 -295
- package/dist/chunk-W6BC5INO.mjs.map +0 -1
- package/dist/chunk-X5WQRO4R.js +0 -295
- package/dist/chunk-X5WQRO4R.js.map +0 -1
- package/dist/chunk-XDMCVVD3.mjs +0 -585
- package/dist/chunk-XDMCVVD3.mjs.map +0 -1
- package/dist/chunk-XNTMYLK6.js +0 -76
- package/dist/chunk-XNTMYLK6.js.map +0 -1
- package/dist/chunk-Y6LI4FDO.js +0 -537
- package/dist/chunk-Y6LI4FDO.js.map +0 -1
- package/dist/chunk-YZ2AQ6IL.mjs +0 -537
- package/dist/chunk-YZ2AQ6IL.mjs.map +0 -1
- package/dist/chunk-Z4YJHEXT.js.map +0 -1
- package/dist/chunk-ZE336SKZ.js +0 -295
- package/dist/chunk-ZE336SKZ.js.map +0 -1
- package/dist/chunk-ZJD235TO.mjs +0 -565
- package/dist/chunk-ZJD235TO.mjs.map +0 -1
- package/dist/core-930ea883.d.ts +0 -131
- package/dist/core-eb646fe5.d.ts +0 -139
- package/dist/core-fd134ffa.d.ts +0 -130
- package/dist/helper-06d25b37.d.ts +0 -19
- package/dist/helper-48454c0b.d.ts +0 -20
- package/dist/helper-73e8d2f0.d.ts +0 -18
- package/dist/helper-867a598d.d.ts +0 -18
- package/dist/helper-88b19c66.d.ts +0 -12
- package/dist/helper-9e206c66.d.ts +0 -12
- package/dist/helper-f29f082f.d.ts +0 -19
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/rpc/bullmq/index.js.map +0 -1
- package/dist/rpc/bullmq/index.mjs.map +0 -1
- package/dist/rpc/kafka/index.js.map +0 -1
- package/dist/rpc/kafka/index.mjs.map +0 -1
- package/dist/rpc/nats/index.js.map +0 -1
- package/dist/rpc/nats/index.mjs.map +0 -1
- package/dist/rpc/rabbitmq/index.js.map +0 -1
- package/dist/rpc/rabbitmq/index.mjs.map +0 -1
- package/dist/rpc/redis/index.js.map +0 -1
- package/dist/rpc/redis/index.mjs.map +0 -1
- package/dist/server/elysia/index.js.map +0 -1
- package/dist/server/elysia/index.mjs.map +0 -1
- package/dist/server/express/index.js.map +0 -1
- package/dist/server/express/index.mjs.map +0 -1
- package/dist/server/fastify/index.js.map +0 -1
- package/dist/server/fastify/index.mjs.map +0 -1
- package/dist/server/h3/index.js.map +0 -1
- package/dist/server/h3/index.mjs.map +0 -1
- package/dist/server/hono/index.js.map +0 -1
- package/dist/server/hono/index.mjs.map +0 -1
- package/dist/server/hyper-express/index.js.map +0 -1
- package/dist/server/hyper-express/index.mjs.map +0 -1
- package/dist/server/koa/index.js.map +0 -1
- package/dist/server/koa/index.mjs.map +0 -1
- package/dist/test.js.map +0 -1
- package/dist/test.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
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":"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","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 +0,0 @@
|
|
|
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":";;;;;;;;;;;AACA,OAAOA,WAAW;AAMlB,IAAMC,QAAQD,MAAM,qBAAA;AAYpB,eAAsBE,KAAK,EAAEC,UAAUC,SAAQ,GAAgD,EAAEC,WAAWC,KAAI,GAAyCC,OAAyB,CAAC,GAAG;AACpL,QAAM,EAAEC,cAAcC,oBAAoBC,cAAcC,WAAU,IAAKJ;AAEvE,QAAMK,aAAa,oBAAIC,IAAAA;AACvB,QAAMC,UAAUC,wBAAwBT,MAAM,CAACA,UAAS;AACtD,UAAM,EAAEU,YAAYC,KAAKC,MAAMC,IAAG,IAAKb,MAAKc;AAC5C,QAAIJ,eAAe,SAASC,KAAKI,UAAUC,QAAW;AACpDrB,YAAM,oBAAoBiB,oBAAoBC,MAAM;AACpD,aAAO;IACT;EACF,CAAA;AAEAI,eAAajB,MAAM;IACjBkB,QAAQhB;IACRiB,cAAchB;EAChB,GAAG,KAAA;AAEH,iBAAeiB,kBAAkB;AAC/Bd,eAAWe,MAAK;AAChB,eAAW,CAACR,KAAKS,MAAAA,KAAWd,SAAS;AACnC,iBAAWI,QAAQU,QAAQ;AACzB,cAAMtB,QAAOQ,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,cAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCX;AACJ,YAAIW,KAAK;AACP,gBAAMI,QAAQJ,IAAII,SAASF;AAC3B,cAAIP,WAAWkB,IAAIT,KAAAA;AACjB;AACFT,qBAAWmB,IAAIV,KAAAA;AACf,gBAAMlB,SAAS6B,UAAU;YAAEC,OAAOZ;YAAOa,eAAe;UAAK,CAAA;QAC/D;MACF;IACF;EACF;AApBeR;AAsBf,QAAMA,gBAAAA;AACN,QAAMvB,SAASgC,IAAI;IACjBC,aAAa,OAAO,EAAEC,SAASC,WAAWL,OAAOM,WAAWC,MAAK,MAAO;AACtE,UAAI,CAAC5B,WAAWkB,IAAIG,KAAAA;AAClB;AAEF,YAAMb,OAAOqB,KAAKC,MAAML,QAAQM,MAAOC,SAAQ,CAAA;AAE/C,YAAM,EAAEzB,KAAKD,MAAM2B,IAAIxB,OAAOyB,aAAaC,KAAKC,KAAI,IAAK5B;AAEzD,UAAI2B,QAAQ;AACV;AACF9C,YAAM,kBAAkBiB,oBAAoBC,MAAM;AAClD,YAAMb,QAAOQ,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,YAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCX;AACJ,YAAM2C,UAAUhC,IAAKgC;AAErB,YAAMC,UAAU,IAAIC,QAAkB;QACpCC,MAAM;QACN/C;QACAC,MAAAA;QACA0C;QACAH;QACA1B;QACAD;QACAoB;QACAL;QACAM;QACAC;QAEAS;QACA5B,OAAOY;MACT,CAAA;AAEA,YAAMiB,QAAQf,IAAI;QAAE3B;QAAcC;QAAoBC;QAAcC;MAAW,GAAG,CAAC0C,eAAe;AAChG,YAAI,CAACJ,SAAS;AACZ7C,mBAASkD,KAAK;YACZrB,OAAOa;YACPS,UAAU;cACR;gBAAEZ,OAAOF,KAAKe,UAAU;kBAAEpC,MAAMiC;kBAAYR;gBAAG,CAAA;cAAG;;UAEtD,CAAA;QACF;MACF,GAAG,CAACY,QAAQ;AACV,YAAI,CAACR,SAAS;AACZ7C,mBAASkD,KAAK;YACZrB,OAAOa;YACPS,UAAU;cACR;gBACEZ,OAAOF,KAAKe,UAAU;kBACpBpC,MAAMqC;kBACNC,OAAO;kBACPb;gBACF,CAAA;cACF;;UAEJ,CAAA;QACF;MACF,CAAA;IACF;EACF,CAAA;AACF;AAzGsB3C;;;AClBtB,SAASyD,oBAAoB;AAM7B,eAAsBC,aAA4C,EAAExD,UAAUD,SAAQ,GAAgD0D,aAAgBtD,MAAyB;AAC7K,MAAIuD,UAAU;AACd,MAAIC,aAAa;AAEjB,QAAMC,MAAM,CAAC;AACb,QAAMC,UAAU,IAAIN,aAAAA;AAEpB,QAAMb,cAAcoB,eAAe3D,MAAM4D,GAAAA;AAEzC,QAAMhE,SAAS6B,UAAU;IAAEC,OAAOa;IAAaZ,eAAe;EAAK,CAAA;AACnE,aAAWkC,KAAKP,aAAa;AAC3BG,QAAII,KAAK,IAAIC,MAAM,IAAIR,YAAYO,GAAE,GAAI;MACvCvC,IAAIyC,QAAQC,GAAW;AACrB,YAAI,OAAOD,OAAOC,OAAO;AACvB,gBAAM,IAAIC,MAAM,IAAID,UAAUH,2BAA2B;AAE3D,YAAI,EAAEjD,KAAKE,OAAO4B,QAAO,IAAKqB,OAAOC,GAAE;AAEvC,eAAO,UAAUvB,SAAc;AAC7B,cAAI,CAAC3B;AACHA,oBAAQF;AAEV,gBAAM0B,KAAK,GAAGiB;AAEd1D,mBAASkD,KAAK;YACZrB,OAAOZ;YACPkC,UAAU;cACR;gBACEZ,OAAOF,KAAKe,UAAU;kBACpBT,KAAK;kBACLF;kBACA1B;kBACAE,OAAOyB;kBACP5B,MAAMqD;kBACNvB;gBACF,CAAA;cACF;;UAEJ,CAAA;AAEA,cAAIC;AACF,mBAAO;AAET,iBAAO,IAAIwB,QAAQ,CAACC,SAASC,WAAW;AACtC,gBAAIpE,MAAMqE,OAAOb,cAAcxD,KAAKqE;AAClCD,qBAAO;gBAAEvB,MAAM;cAAW,CAAA;AAE5B,gBAAIyB,QAAQ;AACZ,kBAAMC,QAAQC,WAAW,MAAM;AAC7B,kBAAI,CAACF,OAAO;AACVd;AACAE,wBAAQe,IAAInC,IAAIoC,QAAAA;AAChBN,uBAAO;kBAAEvB,MAAM;gBAAU,CAAA;cAC3B;YACF,GAAG7C,MAAM2E,WAAW,GAAA;AAEpB,qBAASD,SAAS7D,MAAWsC,OAAgB;AAC3CK;AACAc,sBAAQ;AACRM,2BAAaL,KAAAA;AACb,kBAAIpB;AACFiB,uBAAOvD,IAAAA;;AAGPsD,wBAAQtD,IAAAA;YACZ;AATS6D;AAUTlB;AACAE,oBAAQmB,KAAKvC,IAAIoC,QAAAA;UACnB,CAAA;QACF;MACF;IACF,CAAA;EACF;AACA,QAAM9E,SAASgC,IACb;IACEC,aAAa,OAAO,EAAEC,SAASJ,MAAK,MAAO;AACzC,UAAIa,gBAAgBb,SAASI,QAAQM,OAAO;AAC1C,cAAM,EAAEvB,MAAMyB,IAAIa,MAAK,IAAKjB,KAAKC,MAAML,QAAQM,MAAMC,SAAQ,CAAA;AAE7DqB,gBAAQoB,KAAKxC,IAAIzB,MAAMsC,KAAAA;MACzB;IACF;EACF,CAAA;AAGF,SAAOM;AACT;AAtFsBJ","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 +0,0 @@
|
|
|
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":";;;;;;;;;;;AACA,OAAOA,WAAW;AAMlB,IAAMC,QAAQC,MAAM,qBAAA;AAYpB,eAAsBC,KAAK,EAAEC,UAAUC,SAAQ,GAAgD,EAAEC,WAAWC,KAAI,GAAyCC,OAAyB,CAAC,GAAG;AACpL,QAAM,EAAEC,cAAcC,oBAAoBC,cAAcC,WAAU,IAAKJ;AAEvE,QAAMK,aAAa,oBAAIC,IAAAA;AACvB,QAAMC,UAAUC,wBAAwBT,MAAM,CAACA,UAAS;AACtD,UAAM,EAAEU,YAAYC,KAAKC,MAAMC,IAAG,IAAKb,MAAKc;AAC5C,QAAIJ,eAAe,SAASC,KAAKI,UAAUC,QAAW;AACpDtB,YAAM,oBAAoBkB,oBAAoBC,MAAM;AACpD,aAAO;IACT;EACF,CAAA;AAEAI,eAAajB,MAAM;IACjBkB,QAAQhB;IACRiB,cAAchB;EAChB,GAAG,KAAA;AAEH,iBAAeiB,kBAAkB;AAC/Bd,eAAWe,MAAK;AAChB,eAAW,CAACR,KAAKS,MAAAA,KAAWd,SAAS;AACnC,iBAAWI,QAAQU,QAAQ;AACzB,cAAMtB,QAAOQ,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,cAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCX;AACJ,YAAIW,KAAK;AACP,gBAAMI,QAAQJ,IAAII,SAASF;AAC3B,cAAIP,WAAWkB,IAAIT,KAAAA;AACjB;AACFT,qBAAWmB,IAAIV,KAAAA;AACf,gBAAMlB,SAAS6B,UAAU;YAAEC,OAAOZ;YAAOa,eAAe;UAAK,CAAA;QAC/D;MACF;IACF;EACF;AApBeR;AAsBf,QAAMA,gBAAAA;AACN,QAAMvB,SAASgC,IAAI;IACjBC,aAAa,OAAO,EAAEC,SAASC,WAAWL,OAAOM,WAAWC,MAAK,MAAO;AACtE,UAAI,CAAC5B,WAAWkB,IAAIG,KAAAA;AAClB;AAEF,YAAMb,OAAOqB,KAAKC,MAAML,QAAQM,MAAOC,SAAQ,CAAA;AAE/C,YAAM,EAAEzB,KAAKD,MAAM2B,IAAIxB,OAAOyB,aAAaC,KAAKC,KAAI,IAAK5B;AAEzD,UAAI2B,QAAQ;AACV;AACF/C,YAAM,kBAAkBkB,oBAAoBC,MAAM;AAClD,YAAMb,QAAOQ,QAAQe,IAAIV,GAAAA,EAAMD;AAE/B,YAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCX;AACJ,YAAM2C,UAAUhC,IAAKgC;AAErB,YAAMC,UAAU,IAAIC,QAAkB;QACpCC,MAAM;QACN/C;QACAC,MAAAA;QACA0C;QACAH;QACA1B;QACAD;QACAoB;QACAL;QACAM;QACAC;QAEAS;QACA5B,OAAOY;MACT,CAAA;AAEA,YAAMiB,QAAQf,IAAI;QAAE3B;QAAcC;QAAoBC;QAAcC;MAAW,GAAG,CAAC0C,eAAe;AAChG,YAAI,CAACJ,SAAS;AACZ7C,mBAASkD,KAAK;YACZrB,OAAOa;YACPS,UAAU;cACR;gBAAEZ,OAAOF,KAAKe,UAAU;kBAAEpC,MAAMiC;kBAAYR;gBAAG,CAAA;cAAG;;UAEtD,CAAA;QACF;MACF,GAAG,CAACY,QAAQ;AACV,YAAI,CAACR,SAAS;AACZ7C,mBAASkD,KAAK;YACZrB,OAAOa;YACPS,UAAU;cACR;gBACEZ,OAAOF,KAAKe,UAAU;kBACpBpC,MAAMqC;kBACNC,OAAO;kBACPb;gBACF,CAAA;cACF;;UAEJ,CAAA;QACF;MACF,CAAA;IACF;EACF,CAAA;AACF;AAzGsB3C;;;AClBtB,SAASyD,oBAAoB;AAM7B,eAAsBC,aAA4C,EAAEC,UAAUC,SAAQ,GAAgDC,aAAgBC,MAAyB;AAC7K,MAAIC,UAAU;AACd,MAAIC,aAAa;AAEjB,QAAMC,MAAM,CAAC;AACb,QAAMC,UAAU,IAAIC,aAAAA;AAEpB,QAAMC,cAAcC,eAAeP,MAAMQ,GAAAA;AAEzC,QAAMV,SAASW,UAAU;IAAEC,OAAOJ;IAAaK,eAAe;EAAK,CAAA;AACnE,aAAWC,KAAKb,aAAa;AAC3BI,QAAIS,KAAK,IAAIC,MAAM,IAAId,YAAYa,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;AAEV,gBAAMI,KAAK,GAAGrB;AAEdJ,mBAAS0B,KAAK;YACZb,OAAOS;YACPK,UAAU;cACR;gBACEC,OAAOC,KAAKC,UAAU;kBACpBC,KAAK;kBACLN;kBACAJ;kBACAC,OAAOb;kBACPuB,MAAMb;kBACNK;gBACF,CAAA;cACF;;UAEJ,CAAA;AAEA,cAAID;AACF,mBAAO;AAET,iBAAO,IAAIU,QAAQ,CAACC,SAASC,WAAW;AACtC,gBAAIhC,MAAMiC,OAAO/B,cAAcF,KAAKiC;AAClCD,qBAAO;gBAAEE,MAAM;cAAW,CAAA;AAE5B,gBAAIC,QAAQ;AACZ,kBAAMC,QAAQC,WAAW,MAAM;AAC7B,kBAAI,CAACF,OAAO;AACVjC;AACAE,wBAAQkC,IAAIhB,IAAIiB,QAAAA;AAChBP,uBAAO;kBAAEE,MAAM;gBAAU,CAAA;cAC3B;YACF,GAAGlC,MAAMwC,WAAW,GAAA;AAEpB,qBAASD,SAASE,MAAWC,OAAgB;AAC3CxC;AACAiC,sBAAQ;AACRQ,2BAAaP,KAAAA;AACb,kBAAIM;AACFV,uBAAOS,IAAAA;;AAGPV,wBAAQU,IAAAA;YACZ;AATSF;AAUTrC;AACAE,oBAAQwC,KAAKtB,IAAIiB,QAAAA;UACnB,CAAA;QACF;MACF;IACF,CAAA;EACF;AACA,QAAMzC,SAAS+C,IACb;IACEC,aAAa,OAAO,EAAEC,SAASrC,MAAK,MAAO;AACzC,UAAIJ,gBAAgBI,SAASqC,QAAQtB,OAAO;AAC1C,cAAM,EAAEgB,MAAMnB,IAAIoB,MAAK,IAAKhB,KAAKsB,MAAMD,QAAQtB,MAAMwB,SAAQ,CAAA;AAE7D7C,gBAAQ8C,KAAK5B,IAAImB,MAAMC,KAAAA;MACzB;IACF;EACF,CAAA;AAGF,SAAOvC;AACT;AAtFsBP;","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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/nats/bind.ts","../../../src/rpc/nats/client.ts"],"names":["StringCodec","Debug","debug","bind","nc","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","sc","subscriptionMap","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","subscribe","callback","handleRequest","_","msg","JSON","parse","decode","id","_ps","args","isEvent","respond","context","Context","type","_msg","subject","toString","run","returnData","encode","stringify","err","error","HMR","i","unsubscribe","createClient","controllers","eventId","eventCount","ret","Proxy","target","p","Error","request","Promise","resolve","reject","max","catch","then","json","handler","isEnd","timer","setTimeout","timeout","clearTimeout"],"mappings":"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","sourcesContent":["import type { Msg, NatsConnection, NatsError, Subscription } from 'nats'\r\nimport { StringCodec } from 'nats'\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/nats')\r\n\r\nexport interface NatsCtx extends RpcContext {\r\n type: 'nats'\r\n msg: any\r\n\r\n}\r\n\r\nexport async function bind(nc: NatsConnection, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n const sc = StringCodec()\r\n const subscriptionMap: Record<string, Subscription> = {}\r\n const existQueue = new Set<string>()\r\n\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 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 subscriptionMap[queue] = nc.subscribe(queue, {\r\n queue,\r\n callback: handleRequest,\r\n })\r\n }\r\n }\r\n }\r\n }\r\n async function handleRequest(_: NatsError | null, msg: Msg) {\r\n const data = JSON.parse(sc.decode(msg.data))\r\n const { tag, func, id, _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: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n if (isEvent)// nats has to have response\r\n msg.respond('{}')\r\n\r\n const context = new Context<NatsCtx>({\r\n type: 'nats',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n msg,\r\n isEvent,\r\n // @ts-expect-error nats ts problem\r\n queue: msg._msg.subject.toString(),\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n msg.respond(sc.encode(JSON.stringify({ data: returnData, id })))\r\n }, (err) => {\r\n if (!isEvent)\r\n msg.respond(sc.encode(JSON.stringify({ data: err, error: true, id })))\r\n })\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const i in subscriptionMap)\r\n subscriptionMap[i].unsubscribe()\r\n\r\n await subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { StringCodec } from 'nats'\r\nimport type { NatsConnection } from 'nats'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>(nc: NatsConnection, controllers: S, opts?: Omit<RpcClientOptions, 'key'>) {\r\n let eventId = 1\r\n let eventCount = 0\r\n const sc = StringCodec()\r\n\r\n const ret = {} as ToClientMap<S>\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\r\n const id = `${eventId++}`\r\n const request = nc.request(queue, sc.encode(JSON.stringify({\r\n _ps: 1,\r\n\r\n id,\r\n args,\r\n tag,\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 (opts?.max && eventCount >= opts.max)\r\n reject({ type: 'exceeded' })\r\n // @todo still throw global promise reject\r\n request.catch(reject)\r\n request\r\n .then((msg) => {\r\n const { data, id, error } = msg.json() as any\r\n if (id)\r\n handler(data, error)\r\n })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n reject({ type: 'timeout' })\r\n }\r\n }, opts?.timeout || 5000)\r\n\r\n function handler(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 })\r\n }\r\n },\r\n })\r\n }\r\n\r\n return ret\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/nats/bind.ts","../../../src/rpc/nats/client.ts"],"sourcesContent":["import type { Msg, NatsConnection, NatsError, Subscription } from 'nats'\r\nimport { StringCodec } from 'nats'\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/nats')\r\n\r\nexport interface NatsCtx extends RpcContext {\r\n type: 'nats'\r\n msg: any\r\n\r\n}\r\n\r\nexport async function bind(nc: NatsConnection, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n const sc = StringCodec()\r\n const subscriptionMap: Record<string, Subscription> = {}\r\n const existQueue = new Set<string>()\r\n\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 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 subscriptionMap[queue] = nc.subscribe(queue, {\r\n queue,\r\n callback: handleRequest,\r\n })\r\n }\r\n }\r\n }\r\n }\r\n async function handleRequest(_: NatsError | null, msg: Msg) {\r\n const data = JSON.parse(sc.decode(msg.data))\r\n const { tag, func, id, _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: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n if (isEvent)// nats has to have response\r\n msg.respond('{}')\r\n\r\n const context = new Context<NatsCtx>({\r\n type: 'nats',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n msg,\r\n isEvent,\r\n // @ts-expect-error nats ts problem\r\n queue: msg._msg.subject.toString(),\r\n })\r\n\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n msg.respond(sc.encode(JSON.stringify({ data: returnData, id })))\r\n }, (err) => {\r\n if (!isEvent)\r\n msg.respond(sc.encode(JSON.stringify({ data: err, error: true, id })))\r\n })\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const i in subscriptionMap)\r\n subscriptionMap[i].unsubscribe()\r\n\r\n await subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { StringCodec } from 'nats'\r\nimport type { NatsConnection } from 'nats'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>(nc: NatsConnection, controllers: S, opts?: Omit<RpcClientOptions, 'key'>) {\r\n let eventId = 1\r\n let eventCount = 0\r\n const sc = StringCodec()\r\n\r\n const ret = {} as ToClientMap<S>\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\r\n const id = `${eventId++}`\r\n const request = nc.request(queue, sc.encode(JSON.stringify({\r\n _ps: 1,\r\n\r\n id,\r\n args,\r\n tag,\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 (opts?.max && eventCount >= opts.max)\r\n reject({ type: 'exceeded' })\r\n // @todo still throw global promise reject\r\n request.catch(reject)\r\n request\r\n .then((msg) => {\r\n const { data, id, error } = msg.json() as any\r\n if (id)\r\n handler(data, error)\r\n })\r\n\r\n let isEnd = false\r\n const timer = setTimeout(() => {\r\n if (!isEnd) {\r\n eventCount--\r\n reject({ type: 'timeout' })\r\n }\r\n }, opts?.timeout || 5000)\r\n\r\n function handler(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 })\r\n }\r\n },\r\n })\r\n }\r\n\r\n return ret\r\n}\r\n"],"mappings":"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","names":["StringCodec","Debug","debug","Debug","bind","nc","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","sc","StringCodec","subscriptionMap","existQueue","Set","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","subscribeQueues","clear","record","get","has","add","subscribe","callback","handleRequest","_","msg","JSON","parse","decode","id","_ps","args","isEvent","respond","context","Context","type","_msg","subject","toString","run","returnData","encode","stringify","err","error","HMR","i","unsubscribe","StringCodec","createClient","nc","controllers","opts","eventId","eventCount","sc","StringCodec","ret","i","Proxy","get","target","p","Error","tag","queue","isEvent","args","id","request","encode","JSON","stringify","_ps","func","Promise","resolve","reject","max","type","catch","then","msg","data","error","json","handler","isEnd","timer","setTimeout","timeout","clearTimeout"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/rabbitmq/bind.ts","../../../src/rpc/rabbitmq/client.ts"],"names":["Debug","debug","bind","ch","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","existQueue","Set","subscribeQueues","clear","record","get","has","add","assertQueue","consume","handleRequest","noAck","msg","send","sendToQueue","Buffer","from","JSON","stringify","parse","content","toString","id","clientQueue","_ps","args","isEvent","context","Context","type","fields","routingKey","run","returnData","err","error","HMR","deleteQueue","EventEmitter","createClient","controllers","eventId","eventCount","ret","emitter","genClientQueue","key","emit","i","Proxy","target","p","Error","Promise","resolve","reject","max","isEnd","timer","setTimeout","off","listener","timeout","clearTimeout","once"],"mappings":"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","sourcesContent":["import type amqplib from 'amqplib'\r\nimport type { ConsumeMessage } from 'amqplib'\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\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/rabbitmq')\r\n\r\nexport interface RabbitmqCtx extends RpcContext {\r\n type: 'rabbitmq'\r\n ch: amqplib.Channel\r\n msg: amqplib.ConsumeMessage\r\n}\r\n\r\nexport async function bind(ch: amqplib.Channel, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n\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 const existQueue = new Set<string>()\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 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 ch.assertQueue(queue)\r\n\r\n ch.consume(queue, handleRequest, { noAck: true })\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function handleRequest(msg: ConsumeMessage | null) {\r\n function send(queue: string, data: any) {\r\n ch.sendToQueue(queue, Buffer.from(JSON.stringify(data)))\r\n }\r\n\r\n if (msg) {\r\n const data = JSON.parse(msg.content.toString())\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: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n const context = new Context<RabbitmqCtx>({\r\n type: 'rabbitmq',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n ch,\r\n msg,\r\n isEvent,\r\n queue: msg.fields.routingKey,\r\n })\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n send(clientQueue, { data: returnData, id })\r\n }, (err) => {\r\n if (!isEvent)\r\n\r\n send(clientQueue, { data: err, id, error: true })\r\n })\r\n }\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const queue of existQueue)\r\n await ch.deleteQueue(queue)\r\n\r\n await subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport type amqplib from 'amqplib'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>(ch: amqplib.Channel, controllers: S, opts?: RpcClientOptions) {\r\n let eventId = 1\r\n let eventCount = 0\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 ch.assertQueue(clientQueue)\r\n ch.consume(clientQueue, (msg) => {\r\n if (!msg)\r\n return\r\n const { data, id, error } = JSON.parse(msg.content.toString())\r\n emitter.emit(id, data, error)\r\n })\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\r\n const id = `${eventId++}`\r\n\r\n ch.sendToQueue(queue, Buffer.from(\r\n JSON.stringify(\r\n {\r\n _ps: 1,\r\n\r\n id,\r\n args,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\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\r\n return ret\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/rabbitmq/bind.ts","../../../src/rpc/rabbitmq/client.ts"],"sourcesContent":["import type amqplib from 'amqplib'\r\nimport type { ConsumeMessage } from 'amqplib'\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\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/rabbitmq')\r\n\r\nexport interface RabbitmqCtx extends RpcContext {\r\n type: 'rabbitmq'\r\n ch: amqplib.Channel\r\n msg: amqplib.ConsumeMessage\r\n}\r\n\r\nexport async function bind(ch: amqplib.Channel, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\r\n\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 const existQueue = new Set<string>()\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 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 ch.assertQueue(queue)\r\n\r\n ch.consume(queue, handleRequest, { noAck: true })\r\n }\r\n }\r\n }\r\n }\r\n\r\n async function handleRequest(msg: ConsumeMessage | null) {\r\n function send(queue: string, data: any) {\r\n ch.sendToQueue(queue, Buffer.from(JSON.stringify(data)))\r\n }\r\n\r\n if (msg) {\r\n const data = JSON.parse(msg.content.toString())\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: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n const context = new Context<RabbitmqCtx>({\r\n type: 'rabbitmq',\r\n moduleMap,\r\n meta,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n ch,\r\n msg,\r\n isEvent,\r\n queue: msg.fields.routingKey,\r\n })\r\n await context.run({ globalGuards, globalInterceptors, globalFilter, globalPipe }, (returnData) => {\r\n if (!isEvent)\r\n send(clientQueue, { data: returnData, id })\r\n }, (err) => {\r\n if (!isEvent)\r\n\r\n send(clientQueue, { data: err, id, error: true })\r\n })\r\n }\r\n }\r\n\r\n subscribeQueues()\r\n\r\n HMR(async () => {\r\n for (const queue of existQueue)\r\n await ch.deleteQueue(queue)\r\n\r\n await subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport { EventEmitter } from 'events'\r\nimport type amqplib from 'amqplib'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>(ch: amqplib.Channel, controllers: S, opts?: RpcClientOptions) {\r\n let eventId = 1\r\n let eventCount = 0\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 ch.assertQueue(clientQueue)\r\n ch.consume(clientQueue, (msg) => {\r\n if (!msg)\r\n return\r\n const { data, id, error } = JSON.parse(msg.content.toString())\r\n emitter.emit(id, data, error)\r\n })\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\r\n const id = `${eventId++}`\r\n\r\n ch.sendToQueue(queue, Buffer.from(\r\n JSON.stringify(\r\n {\r\n _ps: 1,\r\n\r\n id,\r\n args,\r\n tag,\r\n queue: clientQueue,\r\n func: p,\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\r\n return ret\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","ch","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","existQueue","Set","subscribeQueues","clear","record","get","has","add","assertQueue","consume","handleRequest","noAck","msg","send","sendToQueue","Buffer","from","JSON","stringify","parse","content","toString","id","clientQueue","_ps","args","isEvent","context","Context","type","fields","routingKey","run","returnData","err","error","HMR","deleteQueue","EventEmitter","createClient","ch","controllers","opts","eventId","eventCount","ret","emitter","EventEmitter","clientQueue","genClientQueue","key","assertQueue","consume","msg","data","id","error","JSON","parse","content","toString","emit","i","Proxy","get","target","p","Error","tag","queue","isEvent","args","sendToQueue","Buffer","from","stringify","_ps","func","Promise","resolve","reject","max","type","isEnd","timer","setTimeout","off","listener","timeout","clearTimeout","once"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/redis/bind.ts","../../../src/rpc/redis/client.ts"],"names":["Debug","debug","bind","sub","pub","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","existQueue","Set","subscribeQueues","clear","record","get","has","add","subscribe","on","channel","msg","JSON","parse","id","clientQueue","_ps","args","isEvent","context","Context","type","redis","run","returnData","publish","stringify","err","error","HMR","unsubscribe","EventEmitter","createClient","controllers","ret","eventId","eventCount","emitter","genClientQueue","key","i","Proxy","target","p","Error","Promise","resolve","reject","max","isEnd","timer","setTimeout","off","listener","timeout","clearTimeout","once","emit"],"mappings":";;;;;;;;;;;;AACA,OAAOA,WAAW;AAOlB,IAAMC,QAAQD,MAAM,qBAAA;AAUb,SAASE,KAAK,EAAEC,KAAKC,IAAG,GAAgC,EAAEC,WAAWC,KAAI,GAAyCC,OAAyB,CAAC,GAAG;AACpJ,QAAM,EAAEC,cAAcC,oBAAoBC,cAAcC,WAAU,IAAKJ;AACvE,QAAMK,UAAUC,wBAAwBP,MAAM,CAACA,UAAS;AACtD,UAAM,EAAEQ,YAAYC,KAAKC,MAAMC,IAAG,IAAKX,MAAKY;AAC5C,QAAIJ,eAAe,SAASC,KAAKI,UAAUC,QAAW;AACpDnB,YAAM,oBAAoBe,oBAAoBC,MAAM;AACpD,aAAO;IACT;EACF,CAAA;AAEAI,eAAaf,MAAM;IACjBgB,QAAQd;IACRe,cAAcd;EAChB,GAAG,KAAA;AAEH,QAAMe,aAAa,oBAAIC,IAAAA;AAEvB,iBAAeC,kBAAkB;AAC/BF,eAAWG,MAAK;AAEhB,eAAW,CAACV,KAAKW,MAAAA,KAAWhB,SAAS;AACnC,iBAAWI,QAAQY,QAAQ;AACzB,cAAMtB,QAAOM,QAAQiB,IAAIZ,GAAAA,EAAMD;AAC/B,cAAM,EACJE,MAAM,EACJH,IAAG,EACJ,IACCT;AACJ,YAAIS,KAAK;AACP,gBAAMI,QAAQJ,IAAII,SAASF;AAE3B,cAAIO,WAAWM,IAAIX,KAAAA;AACjB;AACFK,qBAAWO,IAAIZ,KAAAA;AACf,gBAAMhB,IAAI6B,UAAUb,KAAAA;QACtB;MACF;IACF;EACF;AArBeO;AAuBfvB,MAAI8B,GAAG,WAAW,OAAOC,SAASC,QAAQ;AACxC,QAAI,CAACX,WAAWM,IAAII,OAAAA;AAClB;AAEF,QAAIC,KAAK;AACP,YAAMjB,OAAOkB,KAAKC,MAAMF,GAAAA;AACxB,YAAM,EAAEnB,MAAMsB,IAAIrB,KAAKE,OAAOoB,aAAaC,KAAKC,KAAI,IAAKvB;AACzDjB,YAAM,kBAAkBe,oBAAoBC,MAAM;AAElD,UAAIuB,QAAQ;AACV;AACF,YAAMlC,QAAOM,QAAQiB,IAAIZ,GAAAA,EAAMD;AAE/B,YAAM,EACJE,MAAM,EAAEH,KAAK,EAAE2B,QAAO,IAAK,CAAC,EAAC,EAAE,IAC7BpC;AAEJ,YAAMqC,UAAU,IAAIC,QAAkB;QACpCC,MAAM;QACNxC;QACAyC,OAAO3C;QACPG,MAAAA;QACA6B;QACAD;QACAjB;QACAD;QACAyB;QACAH;QACAI;QACAvB,OAAOe;MAET,CAAA;AACA,YAAMS,QAAQI,IAAI;QAChBvC;QAAcC;QAAoBC;QAAcC;MAClD,GAAG,CAACqC,eAAe;AACjB,YAAI,CAACN;AACHtC,cAAI6C,QAAQV,aAAaH,KAAKc,UAAU;YAAEhC,MAAM8B;YAAYV;UAAG,CAAA,CAAA;MACnE,GAAG,CAACa,QAAQ;AACV,YAAI,CAACT,SAAS;AACZtC,cAAI6C,QAAQV,aAAaH,KAAKc,UAAU;YACtChC,MAAMiC;YACNC,OAAO;YACPd;UACF,CAAA,CAAA;QACF;MACF,CAAA;IACF;EACF,CAAA;AAEAZ,kBAAAA;AACA2B,MAAI,YAAY;AACd,eAAWlC,SAASK;AAClB,YAAMrB,IAAImD,YAAYnC,KAAAA;AAExBO,oBAAAA;EACF,CAAA;AACF;AAhGgBxB;;;ACjBhB,OAAOqD,kBAAkB;AAMzB,eAAsBC,aAA4C,EAAEpD,KAAKD,IAAG,GAAgCsD,aAAgBlD,MAAyB;AACnJ,QAAMmD,MAAM,CAAC;AACb,MAAIC,UAAU;AACd,MAAIC,aAAa;AACjB,QAAMC,UAAU,IAAIN,aAAAA;AACpB,QAAMhB,cAAcuB,eAAevD,MAAMwD,GAAAA;AAEzC,QAAM5D,IAAI6B,UAAUO,WAAAA;AAEpB,aAAWyB,KAAKP,aAAa;AAC3BC,QAAIM,KAAK,IAAIC,MAAM,IAAIR,YAAYO,GAAE,GAAI;MACvCnC,IAAIqC,QAAQC,GAAW;AACrB,YAAI,OAAOD,OAAOC,OAAO;AACvB,gBAAM,IAAIC,MAAM,IAAID,UAAUH,2BAA2B;AAE3D,YAAI,EAAE/C,KAAKE,OAAOuB,QAAO,IAAKwB,OAAOC,GAAE;AAEvC,eAAO,UAAU1B,SAAc;AAC7B,cAAI,CAACtB;AACHA,oBAAQF;AAEV,gBAAMqB,KAAK,GAAGqB;AAEdvD,cAAI6C,QAAQ9B,OAAOiB,KAAKc,UAAU;YAChCV,KAAK;YACLC;YACAH;YACAnB,OAAOoB;YACPtB;YACAD,MAAMmD;UACR,CAAA,CAAA;AACA,cAAIzB;AACF,mBAAO;AAET,iBAAO,IAAI2B,QAAQ,CAACC,SAASC,WAAW;AACtC,gBAAIhE,MAAMiE,OAAOZ,cAAcrD,KAAKiE;AAClCD,qBAAO;gBAAE1B,MAAM;cAAW,CAAA;AAE5B,gBAAI4B,QAAQ;AACZ,kBAAMC,QAAQC,WAAW,MAAM;AAC7B,kBAAI,CAACF,OAAO;AACVb;AACAC,wBAAQe,IAAItC,IAAIuC,QAAAA;AAChBN,uBAAO;kBAAE1B,MAAM;gBAAU,CAAA;cAC3B;YACF,GAAGtC,MAAMuE,WAAW,GAAA;AAEpB,qBAASD,SAAS3D,MAAWkC,OAAgB;AAC3CQ;AACAa,sBAAQ;AACRM,2BAAaL,KAAAA;AACb,kBAAItB;AACFmB,uBAAOrD,IAAAA;;AAGPoD,wBAAQpD,IAAAA;YACZ;AATS2D;AAUTjB;AACAC,oBAAQmB,KAAK1C,IAAIuC,QAAAA;UACnB,CAAA;QACF;MACF;IACF,CAAA;EACF;AAEA1E,MAAI8B,GAAG,WAAW,OAAOC,SAASC,QAAQ;AACxC,QAAID,YAAYK,eAAeJ,KAAK;AAClC,YAAM,EAAEjB,MAAMoB,IAAIc,MAAK,IAAKhB,KAAKC,MAAMF,GAAAA;AAEvC0B,cAAQoB,KAAK3C,IAAIpB,MAAMkC,KAAAA;IACzB;EACF,CAAA;AAEA,SAAOM;AACT;AA1EsBF","sourcesContent":["import type Redis from 'ioredis'\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\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/redis')\r\n\r\nexport interface RedisCtx extends RpcContext {\r\n type: 'redis'\r\n redis: Redis\r\n msg: string\r\n channel: string\r\n\r\n}\r\n\r\nexport function bind({ sub, pub }: { sub: Redis; pub: Redis }, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\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 const existQueue = new Set<string>()\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n\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 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\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n await sub.subscribe(queue)\r\n }\r\n }\r\n }\r\n }\r\n\r\n sub.on('message', async (channel, msg) => {\r\n if (!existQueue.has(channel))\r\n return\r\n\r\n if (msg) {\r\n const data = JSON.parse(msg)\r\n const { func, id, tag, queue: clientQueue, _ps, args } = data\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (_ps !== 1)\r\n return\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n const context = new Context(<RedisCtx>{\r\n type: 'redis',\r\n moduleMap,\r\n redis: sub,\r\n meta,\r\n msg,\r\n channel,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n isEvent,\r\n queue: channel,\r\n\r\n })\r\n await context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (!isEvent)\r\n pub.publish(clientQueue, JSON.stringify({ data: returnData, id }))\r\n }, (err) => {\r\n if (!isEvent) {\r\n pub.publish(clientQueue, 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 subscribeQueues()\r\n HMR(async () => {\r\n for (const queue of existQueue)\r\n await sub.unsubscribe(queue)\r\n\r\n subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport EventEmitter from 'events'\r\nimport type Redis from 'ioredis'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>({ pub, sub }: { pub: Redis; sub: Redis }, controllers: S, opts?: RpcClientOptions) {\r\n const ret = {} as ToClientMap<S>\r\n let eventId = 1\r\n let eventCount = 0\r\n const emitter = new EventEmitter()\r\n const clientQueue = genClientQueue(opts?.key)\r\n\r\n await sub.subscribe(clientQueue)\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\r\n const id = `${eventId++}`\r\n\r\n pub.publish(queue, JSON.stringify({\r\n _ps: 1,\r\n args,\r\n id,\r\n queue: clientQueue,\r\n tag,\r\n func: p,\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\r\n sub.on('message', async (channel, msg) => {\r\n if (channel === clientQueue && msg) {\r\n const { data, id, error } = JSON.parse(msg)\r\n\r\n emitter.emit(id, data, error)\r\n }\r\n })\r\n\r\n return ret\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/rpc/redis/bind.ts","../../../src/rpc/redis/client.ts"],"sourcesContent":["import type Redis from 'ioredis'\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\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/redis')\r\n\r\nexport interface RedisCtx extends RpcContext {\r\n type: 'redis'\r\n redis: Redis\r\n msg: string\r\n channel: string\r\n\r\n}\r\n\r\nexport function bind({ sub, pub }: { sub: Redis; pub: Redis }, { moduleMap, meta }: Awaited<ReturnType<typeof Factory>>, opts: RpcServerOptions = {}) {\r\n const { globalGuards, globalInterceptors, globalFilter, globalPipe } = opts\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 const existQueue = new Set<string>()\r\n\r\n async function subscribeQueues() {\r\n existQueue.clear()\r\n\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 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\r\n if (existQueue.has(queue))\r\n continue\r\n existQueue.add(queue)\r\n await sub.subscribe(queue)\r\n }\r\n }\r\n }\r\n }\r\n\r\n sub.on('message', async (channel, msg) => {\r\n if (!existQueue.has(channel))\r\n return\r\n\r\n if (msg) {\r\n const data = JSON.parse(msg)\r\n const { func, id, tag, queue: clientQueue, _ps, args } = data\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (_ps !== 1)\r\n return\r\n const meta = metaMap.get(tag)![func]\r\n\r\n const {\r\n data: { rpc: { isEvent } = {} },\r\n } = meta\r\n\r\n const context = new Context(<RedisCtx>{\r\n type: 'redis',\r\n moduleMap,\r\n redis: sub,\r\n meta,\r\n msg,\r\n channel,\r\n tag,\r\n func,\r\n args,\r\n id,\r\n isEvent,\r\n queue: channel,\r\n\r\n })\r\n await context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (!isEvent)\r\n pub.publish(clientQueue, JSON.stringify({ data: returnData, id }))\r\n }, (err) => {\r\n if (!isEvent) {\r\n pub.publish(clientQueue, 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 subscribeQueues()\r\n HMR(async () => {\r\n for (const queue of existQueue)\r\n await sub.unsubscribe(queue)\r\n\r\n subscribeQueues()\r\n })\r\n}\r\n","/* eslint-disable prefer-promise-reject-errors */\r\nimport EventEmitter from 'events'\r\nimport type Redis from 'ioredis'\r\nimport type { ToClientMap } from '../../types'\r\nimport type { RpcClientOptions } from '../helper'\r\nimport { genClientQueue } from '../helper'\r\n\r\nexport async function createClient<S extends Record<string, any>>({ pub, sub }: { pub: Redis; sub: Redis }, controllers: S, opts?: RpcClientOptions) {\r\n const ret = {} as ToClientMap<S>\r\n let eventId = 1\r\n let eventCount = 0\r\n const emitter = new EventEmitter()\r\n const clientQueue = genClientQueue(opts?.key)\r\n\r\n await sub.subscribe(clientQueue)\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\r\n const id = `${eventId++}`\r\n\r\n pub.publish(queue, JSON.stringify({\r\n _ps: 1,\r\n args,\r\n id,\r\n queue: clientQueue,\r\n tag,\r\n func: p,\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\r\n sub.on('message', async (channel, msg) => {\r\n if (channel === clientQueue && msg) {\r\n const { data, id, error } = JSON.parse(msg)\r\n\r\n emitter.emit(id, data, error)\r\n }\r\n })\r\n\r\n return ret\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","sub","pub","moduleMap","meta","opts","globalGuards","globalInterceptors","globalFilter","globalPipe","metaMap","createControllerMetaMap","controller","rpc","func","tag","data","queue","undefined","detectAopDep","guards","interceptors","existQueue","Set","subscribeQueues","clear","record","get","has","add","subscribe","on","channel","msg","JSON","parse","id","clientQueue","_ps","args","isEvent","context","Context","type","redis","run","returnData","publish","stringify","err","error","HMR","unsubscribe","EventEmitter","createClient","pub","sub","controllers","opts","ret","eventId","eventCount","emitter","EventEmitter","clientQueue","genClientQueue","key","subscribe","i","Proxy","get","target","p","Error","tag","queue","isEvent","args","id","publish","JSON","stringify","_ps","func","Promise","resolve","reject","max","type","isEnd","timer","setTimeout","off","listener","timeout","data","error","clearTimeout","once","on","channel","msg","parse","emit"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/elysia/bind.ts"],"names":["Debug","Elysia","App","debug","bind","app","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","Context","usePlugin","forEach","p","parallelRouter","post","c","body","errorHandler","e","error","filterRecord","default","set","status","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","context","index","argToReq","args","headers","run","then","ret","use","record","define","funcRouter","prefix","route","query","returnData","err","elysia","Define"],"mappings":"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","sourcesContent":["import Debug from 'debug'\r\nimport type { Context as ElysiaContext, InputSchema, LocalHook, RouteSchema, SingletonBase } from 'elysia'\r\nimport { Elysia as App } from 'elysia'\r\nimport type { BaseMacro } from 'elysia/dist/types'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\n\r\nimport { Define } from '../../decorators'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/elysia')\r\nexport interface ElysiaCtx extends HttpContext {\r\n type: 'elysia'\r\n app: App\r\n context: ElysiaContext\r\n}\r\n\r\nexport type Plugin = (app: App<any>) => void\r\n\r\nexport function bind(app: App<any>, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'elysia').forEach(p => p(app))\r\n\r\n const parallelRouter = new App()\r\n Context.usePlugin<Plugin>(parallelPlugins, 'elysia').forEach(p => p(parallelRouter))\r\n if (parallelRoute) {\r\n parallelRouter.post(parallelRoute, async (c) => {\r\n const { body } = c\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n c.set.status = error.status\r\n return error\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'elysia' as const,\r\n parallel: true,\r\n context: c,\r\n index: i,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n app,\r\n ...argToReq(params, item.args, c.headers),\r\n }\r\n const context = new Context<ElysiaCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n return ret\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\r\n app.use(parallelRouter)\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 define,\r\n\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n const funcRouter = new App()\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n Context.usePlugin<Plugin>(plugins, 'elysia').forEach(p => p(funcRouter))\r\n // @ts-expect-error todo\r\n funcRouter[http.type](http.prefix + http.route, async (c) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const contextData = {\r\n type: 'elysia' as const,\r\n context: c,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: c.query,\r\n body: c.body as any,\r\n params: c.params,\r\n headers: c.headers,\r\n app,\r\n }\r\n\r\n const context = new Context<ElysiaCtx>(contextData)\r\n if (http.headers)\r\n c.set.headers = http.headers\r\n\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, returnData => returnData, (err) => {\r\n c.set.status = err.status\r\n return err\r\n })\r\n }, define.elysia)\r\n\r\n app.use(funcRouter)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function Elysia(opts: LocalHook<InputSchema, RouteSchema, SingletonBase, Record<string, Error>, BaseMacro>) {\r\n return Define('elysia', opts)\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/elysia/bind.ts"],"sourcesContent":["import Debug from 'debug'\r\nimport type { Context as ElysiaContext, InputSchema, LocalHook, RouteSchema, SingletonBase } from 'elysia'\r\nimport { Elysia as App } from 'elysia'\r\nimport type { BaseMacro } from 'elysia/dist/types'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\n\r\nimport { Define } from '../../decorators'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/elysia')\r\nexport interface ElysiaCtx extends HttpContext {\r\n type: 'elysia'\r\n app: App\r\n context: ElysiaContext\r\n}\r\n\r\nexport type Plugin = (app: App<any>) => void\r\n\r\nexport function bind(app: App<any>, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'elysia').forEach(p => p(app))\r\n\r\n const parallelRouter = new App()\r\n Context.usePlugin<Plugin>(parallelPlugins, 'elysia').forEach(p => p(parallelRouter))\r\n if (parallelRoute) {\r\n parallelRouter.post(parallelRoute, async (c) => {\r\n const { body } = c\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n c.set.status = error.status\r\n return error\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'elysia' as const,\r\n parallel: true,\r\n context: c,\r\n index: i,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n app,\r\n ...argToReq(params, item.args, c.headers),\r\n }\r\n const context = new Context<ElysiaCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n return ret\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\r\n app.use(parallelRouter)\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 define,\r\n\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n const funcRouter = new App()\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n Context.usePlugin<Plugin>(plugins, 'elysia').forEach(p => p(funcRouter))\r\n // @ts-expect-error todo\r\n funcRouter[http.type](http.prefix + http.route, async (c) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n const contextData = {\r\n type: 'elysia' as const,\r\n context: c,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: c.query,\r\n body: c.body as any,\r\n params: c.params,\r\n headers: c.headers,\r\n app,\r\n }\r\n\r\n const context = new Context<ElysiaCtx>(contextData)\r\n if (http.headers)\r\n c.set.headers = http.headers\r\n\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, returnData => returnData, (err) => {\r\n c.set.status = err.status\r\n return err\r\n })\r\n }, define.elysia)\r\n\r\n app.use(funcRouter)\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport function Elysia(opts: LocalHook<InputSchema, RouteSchema, SingletonBase, Record<string, Error>, BaseMacro>) {\r\n return Define('elysia', opts)\r\n}\r\n"],"mappings":"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","names":["Debug","Elysia","App","debug","Debug","bind","app","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","Context","usePlugin","forEach","p","parallelRouter","App","post","c","body","errorHandler","e","error","filterRecord","default","set","status","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","context","index","argToReq","args","headers","run","then","ret","use","record","define","funcRouter","prefix","route","query","returnData","err","elysia","Elysia","Define"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/express/bind.ts"],"names":["Debug","debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","originStack","stack","slice","length","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","HMR","Context","usePlugin","forEach","p","use","post","req","res","next","body","errorHandler","e","error","filterRecord","default","status","json","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","request","index","response","app","argToReq","args","headers","context","run","then","ret","record","prefix","route","query","name","set","returnData","writableEnded","send","err"],"mappings":";;;;;;;;;;;;;AACA,OAAOA,WAAW;AASlB,IAAMC,QAAQD,MAAM,uBAAA;AAYb,SAASE,KAAKC,QAAgBC,MAA2CC,OAAoB,CAAC,GAAG;AACtG,QAAM,EAAEC,cAAcC,oBAAoBC,gBAAgB,sBAAsBC,gBAAgB,CAAA,GAAIC,kBAAkB,CAAA,GAAIC,cAAcC,WAAU,IAAKP;AACvJ,QAAM,EAAEQ,WAAWC,KAAI,IAAKV;AAE5B,QAAMW,cAAcZ,OAAOa,MAAMC,MAAM,GAAGd,OAAOa,MAAME,MAAM;AAE7D,QAAMC,UAAUC,wBAAwBN,MAAM,CAACA,UAAS;AACtD,UAAM,EAAEO,YAAYC,MAAMC,MAAMC,IAAG,IAAKV,MAAKV;AAC7C,QAAIiB,eAAe,UAAUC,MAAMG,MAAM;AACvCxB,YAAM,oBAAoBsB,oBAAoBC,MAAM;AACpD,aAAO;IACT;EACF,CAAA;AACAE,eAAaZ,MAAM;IACjBa,SAAS;SAAIlB;SAAkBC;;IAC/BkB,QAAQtB;IACRuB,cAActB;EAChB,CAAA;AAEAuB,gBAAAA;AAEAC,MAAI,YAAY;AACd5B,WAAOa,QAAQD;AACfe,kBAAAA;EACF,CAAA;AAEA,iBAAeA,gBAAgB;AAC7BE,YAAQC,UAAkBxB,eAAe,SAAA,EAAWyB,QAAQC,CAAAA,MAAKhC,OAAOiC,IAAID,CAAAA,CAAAA;AAE5E,QAAI3B,eAAe;AAChBL,aAAmBkC,KAAK7B,eAAAA,GAAkBwB,QAAQC,UAAkBvB,iBAAiB,SAAA,GAAY,OAAO4B,KAAKC,KAAKC,SAAS;AAC1H,cAAM,EAAEC,KAAI,IAAKH;AAEjB,uBAAeI,aAAaC,GAAQ;AAClC,gBAAMC,QAAQ,MAAMZ,QAAQa,aAAaC,QAAQH,CAAAA;AACjD,iBAAOJ,IAAIQ,OAAOH,MAAMG,MAAM,EAAEC,KAAKJ,KAAAA;QACvC;AAHeF;AAKf,YAAI,CAACO,MAAMC,QAAQT,IAAAA;AACjB,iBAAOC,aAAa,IAAIS,oBAAoB,gCAAA,CAAA;AAE9C,YAAI;AACF,iBAAOC,QAAQC,IAAIZ,KAAKa,IAAI,CAACC,MAAWC,MAAM;AAE5C,mBAAO,IAAIJ,QAAQ,OAAOK,YAAY;AACpC,oBAAM,EAAEjC,KAAKD,KAAI,IAAKgC;AAEtBtD,oBAAM,4BAA4BsB,oBAAoBC,MAAM;AAE5D,kBAAI,CAACL,QAAQuC,IAAIlC,GAAAA;AACf,uBAAOiC,QAAQ,MAAMzB,QAAQa,aAAaC,QAAQ,IAAIK,oBAAoB,WAAW3B,oBAAoB,CAAA,CAAA;AAE3G,oBAAMV,QAAOK,QAAQwC,IAAInC,GAAAA,EAAMD;AAC/B,kBAAI,CAACT;AACH,uBAAO2C,QAAQ,MAAMzB,QAAQa,aAAaC,QAAQ,IAAIK,oBAAoB,IAAI5B,aAAaC,oBAAoB,CAAA,CAAA;AAEjH,oBAAM,EAEJpB,MAAM,EACJwD,OAAM,EAEP,IACC9C;AAEJ,oBAAM+C,cAAc;gBAClBpC,MAAM;gBACNqC,UAAU;gBACVC,SAASzB;gBACT0B,OAAOR;gBACP1C,MAAAA;gBACAmD,UAAU1B;gBACV1B;gBACAW;gBACAD;gBACAiB;gBACA0B,KAAK/D;gBACL,GAAGgE,SAASP,QAAQL,KAAKa,MAAM9B,IAAI+B,OAAO;cAC5C;AACA,oBAAMC,UAAU,IAAItC,QAAoB6B,WAAAA;AAExCS,sBAAQC,IAAI;gBACVjE;gBAAcC;gBAAoBI;gBAAcC;cAClD,GAAG6C,SAASA,OAAAA;YACd,CAAA;UACF,CAAA,CAAA,EAAIe,KAAK,CAACC,QAAQ;AAChBlC,gBAAIS,KAAKyB,GAAAA;UACX,CAAA;QACF,SACO9B,GAAP;AACE,iBAAOD,aAAaC,CAAAA;QACtB;MACF,CAAA;IACF;AACA,eAAW,CAACnB,KAAKkD,MAAAA,KAAWvD,SAAS;AACnC,iBAAWI,QAAQmD,QAAQ;AACzB,cAAM5D,QAAOK,QAAQwC,IAAInC,GAAAA,EAAMD;AAE/B,cAAM,EACJnB,MAAM,EAEJuB,SACAL,KAAI,EACL,IACCR;AAEJ,YAAI,CAACQ,MAAMG;AACT;AAEDtB,eAAmBmB,KAAKG,MAAMH,KAAKqD,SAASrD,KAAKsD,OAAK,GAAK5C,QAAQC,UAAkBN,SAAS,SAAA,GAAY,OAAOW,KAAKC,KAAKC,SAAS;AACnIvC,gBAAM,kBAAkBsB,oBAAoBC,MAAM;AAElD,gBAAMqC,cAAc;YAClBpC,MAAM;YACNsC,SAASzB;YACTxB,MAAAA;YACAmD,UAAU1B;YACV1B;YACAW;YACAD;YACAsD,OAAOvC,IAAIuC;YACXpC,MAAMH,IAAIG;YACVmB,QAAQtB,IAAIsB;YACZS,SAAS/B,IAAI+B;YACbH,KAAK/D;YACLqC;UACF;AAEA,gBAAM8B,UAAU,IAAItC,QAAoB6B,WAAAA;AACxC,cAAIvC,KAAK+C,SAAS;AAChB,uBAAWS,QAAQxD,KAAK+C;AACtB9B,kBAAIwC,IAAID,MAAMxD,KAAK+C,QAAQS,KAAK;UACpC;AAEA,gBAAMR,QAAQC,IAAI;YAChBjE;YAAcC;YAAoBI;YAAcC;UAClD,GAAG,CAACoE,eAAe;AACjB,gBAAIzC,IAAI0C;AACN;AACF,gBAAI,OAAOD,eAAe;AACxBzC,kBAAI2C,KAAKF,UAAAA;;AAGTzC,kBAAIS,KAAKgC,UAAAA;UACb,GAAG,CAACG,QAAQ;AACV,gBAAI5C,IAAI0C;AACN;AACF1C,gBAAIQ,OAAOoC,IAAIpC,MAAM,EAAEC,KAAKmC,GAAAA;UAC9B,CAAA;QACF,CAAA;MACF;IACF;EACF;AA7HerD;AA8HjB;AAxJgB5B","sourcesContent":["import type { Express, Request, RequestHandler, Response, Router } from 'express'\r\nimport Debug from 'debug'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nimport { HMR } from '../../hmr'\r\n\r\nconst debug = Debug('phecda-server/express')\r\nexport interface ExpressCtx extends HttpContext {\r\n type: 'express'\r\n request: Request\r\n response: Response\r\n next: Function\r\n app: Router\r\n\r\n}\r\n\r\nexport type Plugin = RequestHandler\r\n\r\nexport function bind(router: Router, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n const { moduleMap, meta } = data\r\n\r\n const originStack = router.stack.slice(0, router.stack.length)\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n HMR(async () => {\r\n router.stack = originStack// router.stack.slice(0, 1)\r\n registerRoute()\r\n })\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'express').forEach(p => router.use(p))\r\n\r\n if (parallelRoute) {\r\n (router as Express).post(parallelRoute, ...Context.usePlugin<Plugin>(parallelPlugins, 'express'), async (req, res, next) => {\r\n const { body } = req\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n return res.status(error.status).json(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'express' as const,\r\n parallel: true,\r\n request: req,\r\n index: i,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n next,\r\n app: router,\r\n ...argToReq(params, item.args, req.headers),\r\n }\r\n const context = new Context<ExpressCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n res.json(ret)\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\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\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n (router as Express)[http.type](http.prefix + http.route, ...Context.usePlugin<Plugin>(plugins, 'express'), async (req, res, next) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'express' as const,\r\n request: req,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: req.query,\r\n body: req.body,\r\n params: req.params,\r\n headers: req.headers,\r\n app: router,\r\n next,\r\n }\r\n\r\n const context = new Context<ExpressCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n res.set(name, http.headers[name])\r\n }\r\n\r\n await context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (res.writableEnded)\r\n return\r\n if (typeof returnData === 'string')\r\n res.send(returnData)\r\n\r\n else\r\n res.json(returnData)\r\n }, (err) => {\r\n if (res.writableEnded)\r\n return\r\n res.status(err.status).json(err)\r\n })\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/express/bind.ts"],"sourcesContent":["import type { Express, Request, RequestHandler, Response, Router } from 'express'\r\nimport Debug from 'debug'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nimport { HMR } from '../../hmr'\r\n\r\nconst debug = Debug('phecda-server/express')\r\nexport interface ExpressCtx extends HttpContext {\r\n type: 'express'\r\n request: Request\r\n response: Response\r\n next: Function\r\n app: Router\r\n\r\n}\r\n\r\nexport type Plugin = RequestHandler\r\n\r\nexport function bind(router: Router, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n const { moduleMap, meta } = data\r\n\r\n const originStack = router.stack.slice(0, router.stack.length)\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n HMR(async () => {\r\n router.stack = originStack// router.stack.slice(0, 1)\r\n registerRoute()\r\n })\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'express').forEach(p => router.use(p))\r\n\r\n if (parallelRoute) {\r\n (router as Express).post(parallelRoute, ...Context.usePlugin<Plugin>(parallelPlugins, 'express'), async (req, res, next) => {\r\n const { body } = req\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n return res.status(error.status).json(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'express' as const,\r\n parallel: true,\r\n request: req,\r\n index: i,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n next,\r\n app: router,\r\n ...argToReq(params, item.args, req.headers),\r\n }\r\n const context = new Context<ExpressCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n res.json(ret)\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\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\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n (router as Express)[http.type](http.prefix + http.route, ...Context.usePlugin<Plugin>(plugins, 'express'), async (req, res, next) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'express' as const,\r\n request: req,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: req.query,\r\n body: req.body,\r\n params: req.params,\r\n headers: req.headers,\r\n app: router,\r\n next,\r\n }\r\n\r\n const context = new Context<ExpressCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n res.set(name, http.headers[name])\r\n }\r\n\r\n await context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (res.writableEnded)\r\n return\r\n if (typeof returnData === 'string')\r\n res.send(returnData)\r\n\r\n else\r\n res.json(returnData)\r\n }, (err) => {\r\n if (res.writableEnded)\r\n return\r\n res.status(err.status).json(err)\r\n })\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","originStack","stack","slice","length","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","HMR","Context","usePlugin","forEach","p","use","post","req","res","next","body","errorHandler","e","error","filterRecord","default","status","json","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","request","index","response","app","argToReq","args","headers","context","run","then","ret","record","prefix","route","query","name","set","returnData","writableEnded","send","err"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/fastify/bind.ts"],"names":["Debug","debug","bind","fastify","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","fastifyOpts","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","register","_","done","Context","usePlugin","forEach","p","Symbol","for","_opts","post","req","res","body","errorHandler","e","error","filterRecord","default","status","send","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","request","index","response","app","argToReq","args","headers","context","run","then","ret","record","define","prefix","route","query","name","header","returnData","sent","err","Fastify","Define"],"mappings":"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","sourcesContent":["import type { FastifyInstance, FastifyPluginCallback, FastifyPluginOptions, FastifyRegisterOptions, FastifyReply, FastifyRequest, RouteShorthandOptions } from 'fastify'\r\nimport Debug from 'debug'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport { Define } from '../../decorators'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/fastify')\r\nexport interface FastifyCtx extends HttpContext {\r\n type: 'fastify'\r\n request: FastifyRequest\r\n response: FastifyReply\r\n app: FastifyInstance\r\n\r\n}\r\n\r\nexport type Plugin = FastifyPluginCallback\r\n\r\nexport function bind(fastify: FastifyInstance, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions & { fastifyOpts?: FastifyRegisterOptions<FastifyPluginOptions> } = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe, fastifyOpts } = opts\r\n const {\r\n moduleMap, meta,\r\n } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\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 plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n fastify.register((fastify, _, done) => {\r\n Context.usePlugin<Plugin>(globalPlugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n fastify.register(p)\r\n })\r\n fastify.register((fastify, _opts, done) => {\r\n Context.usePlugin<Plugin>(parallelPlugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n fastify.register(p)\r\n })\r\n if (parallelRoute) {\r\n fastify.post(parallelRoute, async (req, res) => {\r\n const { body } = req as any\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n return res.status(error.status).send(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'fastify' as const,\r\n parallel: true,\r\n request: req,\r\n index: i,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n app: fastify,\r\n\r\n ...argToReq(params, item.args, req.headers),\r\n\r\n }\r\n const context = new Context<FastifyCtx>(contextData)\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n res.send(ret)\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\r\n done()\r\n })\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 const {\r\n data: {\r\n\r\n plugins,\r\n\r\n define,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n fastify.register((fastify, _opts, done) => {\r\n Context.usePlugin<Plugin>(plugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n\r\n fastify.register(p)\r\n })\r\n\r\n fastify[http.type](http.prefix + http.route, define?.fastify || {}, async (req, res) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'fastify' as const,\r\n request: req,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: req.query as any,\r\n body: req.body as any,\r\n params: req.params as any,\r\n headers: req.headers,\r\n app: fastify,\r\n\r\n }\r\n const context = new Context<FastifyCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n res.header(name, http.headers[name])\r\n }\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (res.sent)\r\n return\r\n return returnData\r\n }, (err) => {\r\n if (res.sent)\r\n return\r\n res.status(err.status).send(err)\r\n })\r\n })\r\n done()\r\n })\r\n }\r\n }\r\n\r\n done()\r\n }, fastifyOpts)\r\n}\r\n\r\nexport function Fastify(opts: RouteShorthandOptions) {\r\n return Define('fastify', opts)\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/fastify/bind.ts"],"sourcesContent":["import type { FastifyInstance, FastifyPluginCallback, FastifyPluginOptions, FastifyRegisterOptions, FastifyReply, FastifyRequest, RouteShorthandOptions } from 'fastify'\r\nimport Debug from 'debug'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport { Define } from '../../decorators'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/fastify')\r\nexport interface FastifyCtx extends HttpContext {\r\n type: 'fastify'\r\n request: FastifyRequest\r\n response: FastifyReply\r\n app: FastifyInstance\r\n\r\n}\r\n\r\nexport type Plugin = FastifyPluginCallback\r\n\r\nexport function bind(fastify: FastifyInstance, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions & { fastifyOpts?: FastifyRegisterOptions<FastifyPluginOptions> } = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe, fastifyOpts } = opts\r\n const {\r\n moduleMap, meta,\r\n } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\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 plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n fastify.register((fastify, _, done) => {\r\n Context.usePlugin<Plugin>(globalPlugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n fastify.register(p)\r\n })\r\n fastify.register((fastify, _opts, done) => {\r\n Context.usePlugin<Plugin>(parallelPlugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n fastify.register(p)\r\n })\r\n if (parallelRoute) {\r\n fastify.post(parallelRoute, async (req, res) => {\r\n const { body } = req as any\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n return res.status(error.status).send(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'fastify' as const,\r\n parallel: true,\r\n request: req,\r\n index: i,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n app: fastify,\r\n\r\n ...argToReq(params, item.args, req.headers),\r\n\r\n }\r\n const context = new Context<FastifyCtx>(contextData)\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n res.send(ret)\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\r\n done()\r\n })\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 const {\r\n data: {\r\n\r\n plugins,\r\n\r\n define,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n\r\n fastify.register((fastify, _opts, done) => {\r\n Context.usePlugin<Plugin>(plugins, 'fastify').forEach((p) => {\r\n (p as any)[Symbol.for('skip-override')] = true\r\n\r\n fastify.register(p)\r\n })\r\n\r\n fastify[http.type](http.prefix + http.route, define?.fastify || {}, async (req, res) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'fastify' as const,\r\n request: req,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: req.query as any,\r\n body: req.body as any,\r\n params: req.params as any,\r\n headers: req.headers,\r\n app: fastify,\r\n\r\n }\r\n const context = new Context<FastifyCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n res.header(name, http.headers[name])\r\n }\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (res.sent)\r\n return\r\n return returnData\r\n }, (err) => {\r\n if (res.sent)\r\n return\r\n res.status(err.status).send(err)\r\n })\r\n })\r\n done()\r\n })\r\n }\r\n }\r\n\r\n done()\r\n }, fastifyOpts)\r\n}\r\n\r\nexport function Fastify(opts: RouteShorthandOptions) {\r\n return Define('fastify', opts)\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","fastify","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","fastifyOpts","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","register","_","done","Context","usePlugin","forEach","p","Symbol","for","_opts","post","req","res","body","errorHandler","e","error","filterRecord","default","status","send","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","request","index","response","app","argToReq","args","headers","context","run","then","ret","record","define","prefix","route","query","name","header","returnData","sent","err","Fastify","Define"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/h3/bind.ts"],"names":["defineRequestMiddleware","eventHandler","getQuery","getRequestHeaders","getRouterParams","readBody","setHeaders","setResponseStatus","Debug","debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","post","onRequest","Context","usePlugin","map","handler","event","body","strict","errorHandler","e","error","filterRecord","default","status","Array","isArray","BadRequestException","Promise","all","item","i","resolve","has","get","params","contextData","index","parallel","app","argToReq","args","context","run","record","needBody","some","prefix","route","headers","query","undefined","returnData","err"],"mappings":"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","sourcesContent":["import type { IncomingHttpHeaders } from 'node:http'\r\nimport { defineRequestMiddleware, eventHandler, getQuery, getRequestHeaders, getRouterParams, readBody, setHeaders, setResponseStatus } from 'h3'\r\nimport type { H3Event, Router, _RequestMiddleware } from 'h3'\r\nimport Debug from 'debug'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/h3')\r\n\r\nexport interface H3Ctx extends HttpContext {\r\n type: 'h3'\r\n event: H3Event\r\n app: Router\r\n\r\n}\r\n\r\nexport type Plugin = _RequestMiddleware\r\n\r\nexport function bind(router: Router, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n if (parallelRoute) {\r\n router.post(parallelRoute, eventHandler({\r\n onRequest: Context.usePlugin<Plugin>([...globalPlugins, ...parallelPlugins], 'h3').map(defineRequestMiddleware),\r\n handler: async (event) => {\r\n const body = await readBody(event, { strict: true })\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n setResponseStatus(event, error.status)\r\n return error\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'h3' as const,\r\n index: i,\r\n event,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n parallel: true,\r\n app: router,\r\n ...argToReq(params, item.args, getRequestHeaders(event)),\r\n }\r\n const context = new Context<H3Ctx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n }))\r\n }\r\n\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n },\r\n }))\r\n }\r\n\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 const {\r\n data: {\r\n http,\r\n params,\r\n plugins,\r\n\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n const needBody = params.some(item => item.type === 'body')\r\n\r\n router[http.type](http.prefix + http.route, eventHandler({\r\n onRequest: Context.usePlugin<Plugin>([...globalPlugins, ...plugins], 'h3').map(defineRequestMiddleware),\r\n\r\n handler: async (event) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'h3' as const,\r\n meta,\r\n event,\r\n moduleMap,\r\n tag,\r\n func,\r\n headers: getRequestHeaders(event) as IncomingHttpHeaders,\r\n params: getRouterParams(event),\r\n query: getQuery(event),\r\n app: router,\r\n\r\n body: needBody ? await readBody(event, { strict: true }) : undefined,\r\n }\r\n const context = new Context<H3Ctx>(contextData)\r\n setHeaders(event, http.headers || {})\r\n\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, returnData => returnData, (err) => {\r\n setResponseStatus(event, err.status)\r\n return err\r\n })\r\n },\r\n }))\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/h3/bind.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'node:http'\r\nimport { defineRequestMiddleware, eventHandler, getQuery, getRequestHeaders, getRouterParams, readBody, setHeaders, setResponseStatus } from 'h3'\r\nimport type { H3Event, Router, _RequestMiddleware } from 'h3'\r\nimport Debug from 'debug'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/h3')\r\n\r\nexport interface H3Ctx extends HttpContext {\r\n type: 'h3'\r\n event: H3Event\r\n app: Router\r\n\r\n}\r\n\r\nexport type Plugin = _RequestMiddleware\r\n\r\nexport function bind(router: Router, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n if (parallelRoute) {\r\n router.post(parallelRoute, eventHandler({\r\n onRequest: Context.usePlugin<Plugin>([...globalPlugins, ...parallelPlugins], 'h3').map(defineRequestMiddleware),\r\n handler: async (event) => {\r\n const body = await readBody(event, { strict: true })\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n setResponseStatus(event, error.status)\r\n return error\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'h3' as const,\r\n index: i,\r\n event,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n parallel: true,\r\n app: router,\r\n ...argToReq(params, item.args, getRequestHeaders(event)),\r\n }\r\n const context = new Context<H3Ctx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n }))\r\n }\r\n\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n },\r\n }))\r\n }\r\n\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 const {\r\n data: {\r\n http,\r\n params,\r\n plugins,\r\n\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n const needBody = params.some(item => item.type === 'body')\r\n\r\n router[http.type](http.prefix + http.route, eventHandler({\r\n onRequest: Context.usePlugin<Plugin>([...globalPlugins, ...plugins], 'h3').map(defineRequestMiddleware),\r\n\r\n handler: async (event) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'h3' as const,\r\n meta,\r\n event,\r\n moduleMap,\r\n tag,\r\n func,\r\n headers: getRequestHeaders(event) as IncomingHttpHeaders,\r\n params: getRouterParams(event),\r\n query: getQuery(event),\r\n app: router,\r\n\r\n body: needBody ? await readBody(event, { strict: true }) : undefined,\r\n }\r\n const context = new Context<H3Ctx>(contextData)\r\n setHeaders(event, http.headers || {})\r\n\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, returnData => returnData, (err) => {\r\n setResponseStatus(event, err.status)\r\n return err\r\n })\r\n },\r\n }))\r\n }\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["defineRequestMiddleware","eventHandler","getQuery","getRequestHeaders","getRouterParams","readBody","setHeaders","setResponseStatus","Debug","debug","Debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","post","eventHandler","onRequest","Context","usePlugin","map","defineRequestMiddleware","handler","event","body","readBody","strict","errorHandler","e","error","filterRecord","default","setResponseStatus","status","Array","isArray","BadRequestException","Promise","all","item","i","resolve","has","get","params","contextData","index","parallel","app","argToReq","args","getRequestHeaders","context","run","record","needBody","some","prefix","route","headers","getRouterParams","query","getQuery","undefined","setHeaders","returnData","err"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/hono/bind.ts"],"names":["Debug","debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","Context","usePlugin","forEach","p","use","post","c","body","req","json","errorHandler","e","error","filterRecord","default","status","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","context","index","app","argToReq","args","header","run","then","ret","record","needBody","some","prefix","route","query","undefined","param","headers","name","returnData","Response","text","err"],"mappings":"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","sourcesContent":["import Debug from 'debug'\r\nimport type { Hono, Context as HonoContext, MiddlewareHandler } from 'hono'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\n\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/hono')\r\nexport interface HonoCtx extends HttpContext {\r\n type: 'hono'\r\n context: HonoContext\r\n app: Hono\r\n\r\n}\r\n\r\nexport type Plugin = MiddlewareHandler\r\n\r\nexport function bind(router: Hono, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'hono').forEach(p => router.use(p))\r\n if (parallelRoute) {\r\n router.post(parallelRoute, ...Context.usePlugin<Plugin>(parallelPlugins, 'hono'), async (c) => {\r\n const body = await c.req.json()\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n c.status(error.status)\r\n return c.json(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'hono' as const,\r\n parallel: true,\r\n context: c,\r\n index: i,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n app: router,\r\n ...argToReq(params, item.args, c.req.header()),\r\n }\r\n const context = new Context<HonoCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n return c.json(ret)\r\n }) as any\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\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\r\n params,\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n const needBody = params.some(item => item.type === 'body')\r\n\r\n router[http.type](http.prefix + http.route, ...Context.usePlugin<Plugin>(plugins, 'hono'), async (c) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'hono' as const,\r\n context: c,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: c.req.query(),\r\n body: needBody ? await c.req.json() : undefined,\r\n params: c.req.param() as any,\r\n headers: c.req.header(),\r\n app: router,\r\n }\r\n\r\n const context = new Context<HonoCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n c.header(name, http.headers[name])\r\n }\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (returnData instanceof Response)\r\n return returnData\r\n\r\n if (typeof returnData === 'string')\r\n return c.text(returnData)\r\n\r\n else\r\n return c.json(returnData)\r\n }, (err) => {\r\n c.status(err.status)\r\n return c.json(err)\r\n })\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/hono/bind.ts"],"sourcesContent":["import Debug from 'debug'\r\nimport type { Hono, Context as HonoContext, MiddlewareHandler } from 'hono'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\n\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\nconst debug = Debug('phecda-server/hono')\r\nexport interface HonoCtx extends HttpContext {\r\n type: 'hono'\r\n context: HonoContext\r\n app: Hono\r\n\r\n}\r\n\r\nexport type Plugin = MiddlewareHandler\r\n\r\nexport function bind(router: Hono, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'hono').forEach(p => router.use(p))\r\n if (parallelRoute) {\r\n router.post(parallelRoute, ...Context.usePlugin<Plugin>(parallelPlugins, 'hono'), async (c) => {\r\n const body = await c.req.json()\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n c.status(error.status)\r\n return c.json(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'hono' as const,\r\n parallel: true,\r\n context: c,\r\n index: i,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n app: router,\r\n ...argToReq(params, item.args, c.req.header()),\r\n }\r\n const context = new Context<HonoCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n return c.json(ret)\r\n }) as any\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\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\r\n params,\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n const needBody = params.some(item => item.type === 'body')\r\n\r\n router[http.type](http.prefix + http.route, ...Context.usePlugin<Plugin>(plugins, 'hono'), async (c) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'hono' as const,\r\n context: c,\r\n meta,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: c.req.query(),\r\n body: needBody ? await c.req.json() : undefined,\r\n params: c.req.param() as any,\r\n headers: c.req.header(),\r\n app: router,\r\n }\r\n\r\n const context = new Context<HonoCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n c.header(name, http.headers[name])\r\n }\r\n return context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (returnData instanceof Response)\r\n return returnData\r\n\r\n if (typeof returnData === 'string')\r\n return c.text(returnData)\r\n\r\n else\r\n return c.json(returnData)\r\n }, (err) => {\r\n c.status(err.status)\r\n return c.json(err)\r\n })\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["Debug","debug","Debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","Context","usePlugin","forEach","p","use","post","c","body","req","json","errorHandler","e","error","filterRecord","default","status","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","context","index","app","argToReq","args","header","run","then","ret","record","needBody","some","prefix","route","query","undefined","param","headers","name","returnData","Response","text","err"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/hyper-express/bind.ts"],"names":["Debug","debug","bind","router","data","opts","globalGuards","globalInterceptors","parallelRoute","globalPlugins","parallelPlugins","globalFilter","globalPipe","moduleMap","meta","metaMap","createControllerMetaMap","controller","http","func","tag","type","detectAopDep","plugins","guards","interceptors","registerRoute","Context","usePlugin","forEach","p","use","post","middlewares","req","res","next","body","json","errorHandler","e","error","filterRecord","default","status","Array","isArray","BadRequestException","Promise","all","map","item","i","resolve","has","get","params","contextData","parallel","request","index","response","app","argToReq","args","headers","context","run","then","ret","record","needBody","some","prefix","route","query","query_parameters","undefined","path_parameters","name","set","returnData","writableEnded","send","err"],"mappings":"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","sourcesContent":["import type { MiddlewareHandler, Request, Response, Router } from 'hyper-express'\r\nimport Debug from 'debug'\r\nimport type { HttpContext, HttpOptions } from '../helper'\r\nimport { argToReq } from '../helper'\r\nimport type { Factory } from '../../core'\r\nimport { BadRequestException } from '../../exception'\r\nimport { Context } from '../../context'\r\nimport { createControllerMetaMap, detectAopDep } from '../../helper'\r\n\r\nconst debug = Debug('phecda-server/hyper-express')\r\nexport interface HyperExpressCtx extends HttpContext {\r\n type: 'hyper-express'\r\n request: Request\r\n response: Response\r\n next: Function\r\n app: Router\r\n\r\n}\r\n\r\nexport type Plugin = MiddlewareHandler\r\n\r\nexport function bind(router: Router, data: Awaited<ReturnType<typeof Factory>>, opts: HttpOptions = {}) {\r\n const { globalGuards, globalInterceptors, parallelRoute = '/__PHECDA_SERVER__', globalPlugins = [], parallelPlugins = [], globalFilter, globalPipe } = opts\r\n\r\n const { moduleMap, meta } = data\r\n\r\n const metaMap = createControllerMetaMap(meta, (meta) => {\r\n const { controller, http, func, tag } = meta.data\r\n if (controller === 'http' && http?.type) {\r\n debug(`register method \"${func}\" in module \"${tag}\"`)\r\n return true\r\n }\r\n })\r\n detectAopDep(meta, {\r\n plugins: [...globalPlugins, ...parallelPlugins],\r\n guards: globalGuards,\r\n interceptors: globalInterceptors,\r\n })\r\n\r\n registerRoute()\r\n async function registerRoute() {\r\n Context.usePlugin<Plugin>(globalPlugins, 'hyper-express').forEach(p => router.use(p))\r\n if (parallelRoute) {\r\n router.post(parallelRoute, {\r\n middlewares: Context.usePlugin<Plugin>(parallelPlugins, 'hyper-express'),\r\n }, async (req, res, next) => {\r\n const body = await req.json()\r\n\r\n async function errorHandler(e: any) {\r\n const error = await Context.filterRecord.default(e)\r\n return res.status(error.status).json(error)\r\n }\r\n\r\n if (!Array.isArray(body))\r\n return errorHandler(new BadRequestException('data format should be an array'))\r\n\r\n try {\r\n return Promise.all(body.map((item: any, i) => {\r\n // eslint-disable-next-line no-async-promise-executor\r\n return new Promise(async (resolve) => {\r\n const { tag, func } = item\r\n debug(`(parallel)invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n if (!metaMap.has(tag))\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`module \"${tag}\" doesn't exist`)))\r\n\r\n const meta = metaMap.get(tag)![func]\r\n if (!meta)\r\n return resolve(await Context.filterRecord.default(new BadRequestException(`\"${func}\" in \"${tag}\" doesn't exist`)))\r\n\r\n const {\r\n\r\n data: {\r\n\r\n params,\r\n\r\n },\r\n } = meta\r\n\r\n const contextData = {\r\n type: 'hyper-express' as const,\r\n parallel: true,\r\n request: req,\r\n index: i,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n next,\r\n app: router,\r\n\r\n ...argToReq(params, item.args, req.headers),\r\n }\r\n const context = new Context<HyperExpressCtx>(contextData)\r\n\r\n context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, resolve, resolve)\r\n })\r\n })).then((ret) => {\r\n res.json(ret)\r\n })\r\n }\r\n catch (e) {\r\n return errorHandler(e)\r\n }\r\n })\r\n }\r\n\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 params,\r\n plugins,\r\n http,\r\n },\r\n } = meta\r\n\r\n if (!http?.type)\r\n continue\r\n const needBody = params.some(item => item.type === 'body')\r\n\r\n router[http.type](http.prefix + http.route, ...Context.usePlugin<Plugin>(plugins, 'hyper-express'), async (req, res, next) => {\r\n debug(`invoke method \"${func}\" in module \"${tag}\"`)\r\n\r\n const contextData = {\r\n type: 'hyper-express' as const,\r\n request: req,\r\n meta,\r\n response: res,\r\n moduleMap,\r\n tag,\r\n func,\r\n query: req.query_parameters,\r\n body: needBody ? await req.json({}) : undefined,\r\n app: router,\r\n\r\n params: req.path_parameters,\r\n headers: req.headers,\r\n next,\r\n }\r\n\r\n const context = new Context<HyperExpressCtx>(contextData)\r\n if (http.headers) {\r\n for (const name in http.headers)\r\n res.set(name, http.headers[name])\r\n }\r\n await context.run({\r\n globalGuards, globalInterceptors, globalFilter, globalPipe,\r\n }, (returnData) => {\r\n if (res.writableEnded)\r\n return\r\n\r\n if (typeof returnData === 'string')\r\n res.send(returnData)\r\n\r\n else\r\n res.json(returnData)\r\n }, (err) => {\r\n if (res.writableEnded)\r\n return\r\n res.status(err.status).json(err)\r\n })\r\n })\r\n }\r\n }\r\n }\r\n}\r\n"]}
|