@mionjs/router 0.8.6 → 0.8.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dist/cjs/index.d.ts +1 -0
- package/.dist/cjs/index.d.ts.map +1 -0
- package/.dist/cjs/src/aot/aotCacheLoader.d.ts +1 -0
- package/.dist/cjs/src/aot/aotCacheLoader.d.ts.map +1 -0
- package/.dist/cjs/src/callContext.d.ts +1 -0
- package/.dist/cjs/src/callContext.d.ts.map +1 -0
- package/.dist/cjs/src/constants.d.ts +1 -0
- package/.dist/cjs/src/constants.d.ts.map +1 -0
- package/.dist/cjs/src/defaultRoutes.d.ts +1 -0
- package/.dist/cjs/src/defaultRoutes.d.ts.map +1 -0
- package/.dist/cjs/src/dispatch.d.ts +1 -0
- package/.dist/cjs/src/dispatch.d.ts.map +1 -0
- package/.dist/cjs/src/lib/aotEmitter.d.ts +1 -0
- package/.dist/cjs/src/lib/aotEmitter.d.ts.map +1 -0
- package/.dist/cjs/src/lib/dispatchError.d.ts +1 -0
- package/.dist/cjs/src/lib/dispatchError.d.ts.map +1 -0
- package/.dist/cjs/src/lib/handlers.d.ts +1 -0
- package/.dist/cjs/src/lib/handlers.d.ts.map +1 -0
- package/.dist/cjs/src/lib/headers.d.ts +1 -0
- package/.dist/cjs/src/lib/headers.d.ts.map +1 -0
- package/.dist/cjs/src/lib/methodsCache.d.ts +1 -0
- package/.dist/cjs/src/lib/methodsCache.d.ts.map +1 -0
- package/.dist/cjs/src/lib/queryBody.d.ts +1 -0
- package/.dist/cjs/src/lib/queryBody.d.ts.map +1 -0
- package/.dist/cjs/src/lib/reflection.d.ts +1 -0
- package/.dist/cjs/src/lib/reflection.d.ts.map +1 -0
- package/.dist/cjs/src/lib/remoteMethods.d.ts +1 -0
- package/.dist/cjs/src/lib/remoteMethods.d.ts.map +1 -0
- package/.dist/cjs/src/lib/test/aotEmitter-test-router.d.ts +1 -0
- package/.dist/cjs/src/lib/test/aotEmitter-test-router.d.ts.map +1 -0
- package/.dist/cjs/src/router.d.ts +1 -0
- package/.dist/cjs/src/router.d.ts.map +1 -0
- package/.dist/cjs/src/routes/client.routes.d.ts +1 -0
- package/.dist/cjs/src/routes/client.routes.d.ts.map +1 -0
- package/.dist/cjs/src/routes/errors.routes.d.ts +1 -0
- package/.dist/cjs/src/routes/errors.routes.d.ts.map +1 -0
- package/.dist/cjs/src/routes/mion.routes.d.ts +1 -0
- package/.dist/cjs/src/routes/mion.routes.d.ts.map +1 -0
- package/.dist/cjs/src/routes/serializer.routes.d.ts +1 -0
- package/.dist/cjs/src/routes/serializer.routes.d.ts.map +1 -0
- package/.dist/cjs/src/routesFlow.d.ts +1 -0
- package/.dist/cjs/src/routesFlow.d.ts.map +1 -0
- package/.dist/cjs/src/types/context.d.ts +1 -0
- package/.dist/cjs/src/types/context.d.ts.map +1 -0
- package/.dist/cjs/src/types/definitions.d.ts +1 -0
- package/.dist/cjs/src/types/definitions.d.ts.map +1 -0
- package/.dist/cjs/src/types/general.d.ts +1 -0
- package/.dist/cjs/src/types/general.d.ts.map +1 -0
- package/.dist/cjs/src/types/guards.d.ts +1 -0
- package/.dist/cjs/src/types/guards.d.ts.map +1 -0
- package/.dist/cjs/src/types/handlers.d.ts +1 -0
- package/.dist/cjs/src/types/handlers.d.ts.map +1 -0
- package/.dist/cjs/src/types/publicMethods.d.ts +1 -0
- package/.dist/cjs/src/types/publicMethods.d.ts.map +1 -0
- package/.dist/cjs/src/types/remoteMethods.d.ts +1 -0
- package/.dist/cjs/src/types/remoteMethods.d.ts.map +1 -0
- package/.dist/esm/index.d.ts +1 -0
- package/.dist/esm/index.d.ts.map +1 -0
- package/.dist/esm/src/aot/aotCacheLoader.d.ts +1 -0
- package/.dist/esm/src/aot/aotCacheLoader.d.ts.map +1 -0
- package/.dist/esm/src/callContext.d.ts +1 -0
- package/.dist/esm/src/callContext.d.ts.map +1 -0
- package/.dist/esm/src/constants.d.ts +1 -0
- package/.dist/esm/src/constants.d.ts.map +1 -0
- package/.dist/esm/src/defaultRoutes.d.ts +1 -0
- package/.dist/esm/src/defaultRoutes.d.ts.map +1 -0
- package/.dist/esm/src/dispatch.d.ts +1 -0
- package/.dist/esm/src/dispatch.d.ts.map +1 -0
- package/.dist/esm/src/lib/aotEmitter.d.ts +1 -0
- package/.dist/esm/src/lib/aotEmitter.d.ts.map +1 -0
- package/.dist/esm/src/lib/dispatchError.d.ts +1 -0
- package/.dist/esm/src/lib/dispatchError.d.ts.map +1 -0
- package/.dist/esm/src/lib/handlers.d.ts +1 -0
- package/.dist/esm/src/lib/handlers.d.ts.map +1 -0
- package/.dist/esm/src/lib/headers.d.ts +1 -0
- package/.dist/esm/src/lib/headers.d.ts.map +1 -0
- package/.dist/esm/src/lib/methodsCache.d.ts +1 -0
- package/.dist/esm/src/lib/methodsCache.d.ts.map +1 -0
- package/.dist/esm/src/lib/queryBody.d.ts +1 -0
- package/.dist/esm/src/lib/queryBody.d.ts.map +1 -0
- package/.dist/esm/src/lib/reflection.d.ts +1 -0
- package/.dist/esm/src/lib/reflection.d.ts.map +1 -0
- package/.dist/esm/src/lib/remoteMethods.d.ts +1 -0
- package/.dist/esm/src/lib/remoteMethods.d.ts.map +1 -0
- package/.dist/esm/src/lib/test/aotEmitter-test-router.d.ts +1 -0
- package/.dist/esm/src/lib/test/aotEmitter-test-router.d.ts.map +1 -0
- package/.dist/esm/src/router.d.ts +1 -0
- package/.dist/esm/src/router.d.ts.map +1 -0
- package/.dist/esm/src/routes/client.routes.d.ts +1 -0
- package/.dist/esm/src/routes/client.routes.d.ts.map +1 -0
- package/.dist/esm/src/routes/errors.routes.d.ts +1 -0
- package/.dist/esm/src/routes/errors.routes.d.ts.map +1 -0
- package/.dist/esm/src/routes/mion.routes.d.ts +1 -0
- package/.dist/esm/src/routes/mion.routes.d.ts.map +1 -0
- package/.dist/esm/src/routes/serializer.routes.d.ts +1 -0
- package/.dist/esm/src/routes/serializer.routes.d.ts.map +1 -0
- package/.dist/esm/src/routesFlow.d.ts +1 -0
- package/.dist/esm/src/routesFlow.d.ts.map +1 -0
- package/.dist/esm/src/types/context.d.ts +1 -0
- package/.dist/esm/src/types/context.d.ts.map +1 -0
- package/.dist/esm/src/types/definitions.d.ts +1 -0
- package/.dist/esm/src/types/definitions.d.ts.map +1 -0
- package/.dist/esm/src/types/general.d.ts +1 -0
- package/.dist/esm/src/types/general.d.ts.map +1 -0
- package/.dist/esm/src/types/guards.d.ts +1 -0
- package/.dist/esm/src/types/guards.d.ts.map +1 -0
- package/.dist/esm/src/types/handlers.d.ts +1 -0
- package/.dist/esm/src/types/handlers.d.ts.map +1 -0
- package/.dist/esm/src/types/publicMethods.d.ts +1 -0
- package/.dist/esm/src/types/publicMethods.d.ts.map +1 -0
- package/.dist/esm/src/types/remoteMethods.d.ts +1 -0
- package/.dist/esm/src/types/remoteMethods.d.ts.map +1 -0
- package/index.ts +29 -0
- package/package.json +9 -5
- package/src/aot/aotCacheLoader.ts +15 -0
- package/src/callContext.ts +193 -0
- package/src/constants.ts +45 -0
- package/src/defaultRoutes.ts +37 -0
- package/src/dispatch.ts +204 -0
- package/src/lib/aotEmitter.ts +140 -0
- package/src/lib/dispatchError.ts +60 -0
- package/src/lib/handlers.ts +75 -0
- package/src/lib/headers.ts +102 -0
- package/src/lib/methodsCache.ts +72 -0
- package/src/lib/queryBody.ts +40 -0
- package/src/lib/reflection.ts +517 -0
- package/src/lib/remoteMethods.ts +180 -0
- package/src/lib/test/aotEmitter-test-router.ts +40 -0
- package/src/router.ts +656 -0
- package/src/routes/client.routes.ts +108 -0
- package/src/routes/errors.routes.ts +51 -0
- package/src/routes/mion.routes.ts +11 -0
- package/src/routes/serializer.routes.ts +225 -0
- package/src/routesFlow.ts +320 -0
- package/src/types/context.ts +119 -0
- package/src/types/definitions.ts +53 -0
- package/src/types/general.ts +84 -0
- package/src/types/guards.ts +71 -0
- package/src/types/handlers.ts +49 -0
- package/src/types/publicMethods.ts +83 -0
- package/src/types/remoteMethods.ts +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../../../src/types/definitions.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAC,MAAM,eAAe,CAAC;AACzE,OAAO,EACH,sBAAsB,EACtB,aAAa,EACb,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,WAAW,EACd,MAAM,oBAAoB,CAAC;AAM5B,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACvF,OAAO,CAAC,EAAE,YAAY,CAAC;CAC1B,CAAC;AAKF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IAC7F,OAAO,CAAC,EAAE,eAAe,CAAC;CAC7B,CAAC;AAKF,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACzG,OAAO,CAAC,EAAE,sBAAsB,CAAC;CACpC,CAAC;AAQF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,kBAAkB,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACtG,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAChC,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../../../src/types/general.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,iBAAiB,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAChD,OAAO,EAAC,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAItD,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;AAG7B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,kBAAkB,CAAC;AAGhG,MAAM,WAAW,MAAM;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B;AAKD,MAAM,WAAW,aAAa,CAAC,GAAG,GAAG,GAAG,EAAE,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAE,SAAQ,iBAAiB;IAG9G,QAAQ,EAAE,MAAM,CAAC;IAGjB,MAAM,EAAE,MAAM,CAAC;IAEf,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAEvD,kBAAkB,CAAC,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC;IASrD,UAAU,EAAE,cAAc,CAAC;IAE3B,cAAc,EAAE,cAAc,CAAC;IAE/B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,mBAAmB,EAAE,OAAO,CAAC;IAE7B,mBAAmB,EAAE,OAAO,CAAC;IAE7B,gBAAgB,EAAE,OAAO,CAAC;IAQ1B,GAAG,EAAE,OAAO,CAAC;IASb,kBAAkB,EAAE,MAAM,CAAC;IAS3B,uBAAuB,EAAE,MAAM,CAAC;CACnC"}
|
|
@@ -15,3 +15,4 @@ export declare function isRawExecutable(entry: RemoteMethod): entry is RawMethod
|
|
|
15
15
|
export declare function isPublicExecutable(entry: RemoteMethod): entry is RemoteMethod;
|
|
16
16
|
export declare function isHeaderExecutable(entry: RemoteMethod): entry is HeadersMethod;
|
|
17
17
|
export declare function isRouteExecutable(entry: RemoteMethod): entry is RouteMethod;
|
|
18
|
+
//# sourceMappingURL=guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../../src/types/guards.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAKhD,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,QAAQ,CAEhE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,WAAW,CAEtE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,cAAc,CAE5E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,kBAAkB,CAEpF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,kBAAkB,GAAG,WAAW,GAAG,cAAc,CAE/G;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,IAAI,KAAK,CAE1D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,CAEpE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAC,GAAG,KAAK,IAAI,YAAY,CAKjG;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,SAAS,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,YAAY,CAO7E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,aAAa,CAE9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,IAAI,WAAW,CAE3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../../src/types/handlers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AACzC,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAMlD,MAAM,MAAM,OAAO,CAAC,OAAO,SAAS,WAAW,GAAG,GAAG,EAAE,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,IAAI,CAE9F,OAAO,EAAE,OAAO,EAEhB,GAAG,UAAU,EAAE,MAAM,KACpB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAIxB,MAAM,MAAM,aAAa,CACrB,OAAO,SAAS,WAAW,GAAG,GAAG,EACjC,eAAe,SAAS,aAAa,CAAC,GAAG,CAAC,GAAG,GAAG,EAChD,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAC5B,GAAG,GAAG,GAAG,IACT,CAEA,OAAO,EAAE,OAAO,EAEhB,OAAO,EAAE,eAAe,EAExB,GAAG,UAAU,EAAE,MAAM,KACpB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAGxB,MAAM,MAAM,kBAAkB,CAC1B,OAAO,SAAS,WAAW,GAAG,GAAG,EACjC,MAAM,GAAG,GAAG,EACZ,OAAO,GAAG,GAAG,EACb,IAAI,SAAS,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAC1D,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,KAAK,cAAc,CAAC;AAGrF,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,WAAW,GAAG,GAAG,EAAE,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publicMethods.d.ts","sourceRoot":"","sources":["../../../../src/types/publicMethods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remoteMethods.d.ts","sourceRoot":"","sources":["../../../../src/types/remoteMethods.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,uBAAuB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAC,MAAM,cAAc,CAAC;AAChI,OAAO,KAAK,EAAC,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,CAAE,SAAQ,gBAAgB;IAErF,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CAC1C;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACzE,IAAI,EAAE,OAAO,WAAW,CAAC,KAAK,CAAC;IAC/B,OAAO,EAAE,gBAAgB,CAAC;CAC7B;AACD,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,OAAO,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC5E,IAAI,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAC;CACrC;AACD,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACjF,IAAI,EAAE,OAAO,WAAW,CAAC,eAAe,CAAC;IACzC,YAAY,EAAE,uBAAuB,CAAC;CACzC;AACD,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,kBAAkB,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAClF,IAAI,EAAE,OAAO,WAAW,CAAC,WAAW,CAAC;IACrC,OAAO,EAAE,gBAAgB,GAAG;QACxB,cAAc,EAAE,KAAK,CAAC;QACtB,cAAc,CAAC,EAAE,KAAK,CAAC;KAC1B,CAAC;CACL;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,CAC9B,IAAI,CACA,WAAW,CAAC,SAAS,CAAC,EACtB,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CACpG,CACJ,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,OAAO,CACjC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,GAAG,aAAa,CAAC,CACtH,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,OAAO,CACxC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,GAAG,aAAa,CAAC,CACrH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC;AAEnG,MAAM,WAAW,qBAAqB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,UAAU,EAAE,cAAc,CAAC;CAC9B"}
|
package/index.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2022 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
export * from './src/types/context.ts';
|
|
9
|
+
export * from './src/types/definitions.ts';
|
|
10
|
+
export * from './src/types/remoteMethods.ts';
|
|
11
|
+
export * from './src/types/general.ts';
|
|
12
|
+
export * from './src/types/guards.ts';
|
|
13
|
+
export * from './src/types/handlers.ts';
|
|
14
|
+
export * from './src/types/publicMethods.ts';
|
|
15
|
+
export * from './src/constants.ts';
|
|
16
|
+
export * from './src/router.ts';
|
|
17
|
+
export * from './src/dispatch.ts';
|
|
18
|
+
export * from './src/callContext.ts';
|
|
19
|
+
export * from './src/lib/dispatchError.ts';
|
|
20
|
+
export * from './src/lib/headers.ts';
|
|
21
|
+
export * from './src/lib/remoteMethods.ts';
|
|
22
|
+
export * from './src/lib/handlers.ts';
|
|
23
|
+
export * from './src/lib/queryBody.ts';
|
|
24
|
+
export * from './src/lib/methodsCache.ts';
|
|
25
|
+
// Note: aotEmitter.ts is NOT exported here to avoid loading it in production.
|
|
26
|
+
// It is dynamically imported only when MION_COMPILE is set.
|
|
27
|
+
// For multi-step route registration, use: import('@mionjs/router/src/lib/aotEmitter.ts')
|
|
28
|
+
export * from './src/routes/errors.routes.ts';
|
|
29
|
+
export * from './src/routes/mion.routes.ts';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mionjs/router",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.8",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Typescript RPC Like router with automatic Validation and Serialization",
|
|
6
6
|
"keywords": [
|
|
@@ -37,7 +37,11 @@
|
|
|
37
37
|
"lib": ".dist"
|
|
38
38
|
},
|
|
39
39
|
"files": [
|
|
40
|
-
".dist"
|
|
40
|
+
".dist",
|
|
41
|
+
"index.ts",
|
|
42
|
+
"src",
|
|
43
|
+
"!src/**/*.spec.ts",
|
|
44
|
+
"!src/**/*.test.ts"
|
|
41
45
|
],
|
|
42
46
|
"repository": {
|
|
43
47
|
"type": "git",
|
|
@@ -60,8 +64,8 @@
|
|
|
60
64
|
"url": "https://github.com/MionKit/mion/issues"
|
|
61
65
|
},
|
|
62
66
|
"dependencies": {
|
|
63
|
-
"@mionjs/core": "0.8.
|
|
64
|
-
"@mionjs/run-types": "0.8.
|
|
67
|
+
"@mionjs/core": "0.8.8",
|
|
68
|
+
"@mionjs/run-types": "0.8.8"
|
|
65
69
|
},
|
|
66
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "a92a438011336a078d394b75054422f3a56f8468"
|
|
67
71
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2026 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
import {getRawAOTCaches, loadAOTCaches} from '@mionjs/core/aot-caches';
|
|
9
|
+
import {loadCompiledMethods} from '../lib/methodsCache.ts';
|
|
10
|
+
|
|
11
|
+
/** Loads pre-compiled AOT caches from virtual modules and registers them in the global caches. */
|
|
12
|
+
export function loadRouterAOTCaches(): void {
|
|
13
|
+
loadAOTCaches();
|
|
14
|
+
loadCompiledMethods(getRawAOTCaches().routerCache);
|
|
15
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2026 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
import {WORKFLOW_PATH} from './constants.ts';
|
|
9
|
+
import {getRouteExecutionChain} from './router.ts';
|
|
10
|
+
import type {
|
|
11
|
+
CallContext,
|
|
12
|
+
MionResponse,
|
|
13
|
+
MionRequest,
|
|
14
|
+
MionHeaders,
|
|
15
|
+
RawRequestBody,
|
|
16
|
+
RoutesFlowExecutionResult,
|
|
17
|
+
} from './types/context.ts';
|
|
18
|
+
import type {RouterOptions} from './types/general.ts';
|
|
19
|
+
import {Mutable, StatusCodes, SerializerModes, SerializerCode, RpcError, MION_ROUTES, getRoutePath} from '@mionjs/core';
|
|
20
|
+
import {getRoutesFlowExecutionChain} from './routesFlow.ts';
|
|
21
|
+
|
|
22
|
+
// ############# POOL STATE #############
|
|
23
|
+
|
|
24
|
+
let contextPool: CallContext[] = [];
|
|
25
|
+
|
|
26
|
+
/** Get current pool statistics for monitoring */
|
|
27
|
+
export function getContextPoolStats(): {poolSize: number} {
|
|
28
|
+
return {
|
|
29
|
+
poolSize: contextPool.length,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Clear the context pool - useful for testing */
|
|
34
|
+
export function clearContextPool(): void {
|
|
35
|
+
contextPool = [];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ############# CONTEXT CREATION #############
|
|
39
|
+
|
|
40
|
+
/** Creates a new CallContext without pooling (original behavior) */
|
|
41
|
+
export function createCallContext(
|
|
42
|
+
path: string,
|
|
43
|
+
opts: RouterOptions,
|
|
44
|
+
reqRawBody: RawRequestBody,
|
|
45
|
+
rawRequest: unknown,
|
|
46
|
+
reqHeaders: MionHeaders,
|
|
47
|
+
respHeaders: MionHeaders,
|
|
48
|
+
reqBodyType?: SerializerCode,
|
|
49
|
+
urlQuery?: string
|
|
50
|
+
): CallContext {
|
|
51
|
+
const transformedPath = opts.pathTransform?.(rawRequest, path) || path;
|
|
52
|
+
const {executionChain, routesFlowRouteIds} = getExecutionChain(path, transformedPath, urlQuery, rawRequest, opts);
|
|
53
|
+
return {
|
|
54
|
+
path: transformedPath,
|
|
55
|
+
request: {
|
|
56
|
+
headers: reqHeaders,
|
|
57
|
+
rawBody: reqRawBody,
|
|
58
|
+
bodyType: reqBodyType ?? getRequestBodyType(reqRawBody),
|
|
59
|
+
body: {},
|
|
60
|
+
thrownErrors: undefined,
|
|
61
|
+
},
|
|
62
|
+
response: {
|
|
63
|
+
statusCode: StatusCodes.OK,
|
|
64
|
+
hasErrors: false,
|
|
65
|
+
headers: respHeaders,
|
|
66
|
+
body: {},
|
|
67
|
+
rawBody: '',
|
|
68
|
+
serializer: SerializerModes.json,
|
|
69
|
+
binSerializer: undefined,
|
|
70
|
+
},
|
|
71
|
+
executionChain,
|
|
72
|
+
shared: opts.contextDataFactory ? opts.contextDataFactory() : {},
|
|
73
|
+
urlQuery,
|
|
74
|
+
routesFlowRouteIds,
|
|
75
|
+
} as CallContext;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Acquires a CallContext from the pool or creates a new one */
|
|
79
|
+
export function acquireCallContext(
|
|
80
|
+
usePooling: boolean,
|
|
81
|
+
path: string,
|
|
82
|
+
opts: RouterOptions,
|
|
83
|
+
reqRawBody: RawRequestBody,
|
|
84
|
+
rawRequest: unknown,
|
|
85
|
+
reqHeaders: MionHeaders,
|
|
86
|
+
respHeaders: MionHeaders,
|
|
87
|
+
reqBodyType?: SerializerCode,
|
|
88
|
+
urlQuery?: string
|
|
89
|
+
): CallContext {
|
|
90
|
+
if (!usePooling) return createCallContext(path, opts, reqRawBody, rawRequest, reqHeaders, respHeaders, reqBodyType, urlQuery);
|
|
91
|
+
const pooledContext = contextPool.pop();
|
|
92
|
+
const transformedPath = opts.pathTransform?.(rawRequest, path) || path;
|
|
93
|
+
|
|
94
|
+
if (pooledContext) {
|
|
95
|
+
// Reuse the pooled context shell, but create fresh body objects
|
|
96
|
+
const ctx = pooledContext as Mutable<CallContext>;
|
|
97
|
+
ctx.path = transformedPath;
|
|
98
|
+
// Reset request - reuse the request object shell
|
|
99
|
+
const req = ctx.request as Mutable<MionRequest>;
|
|
100
|
+
req.headers = reqHeaders;
|
|
101
|
+
req.rawBody = reqRawBody;
|
|
102
|
+
req.bodyType = reqBodyType ?? getRequestBodyType(reqRawBody);
|
|
103
|
+
req.body = {}; // Must be fresh - handlers write to this
|
|
104
|
+
req.thrownErrors = undefined;
|
|
105
|
+
// Reset response - reuse the response object shell
|
|
106
|
+
const resp = ctx.response as Mutable<MionResponse>;
|
|
107
|
+
resp.statusCode = StatusCodes.OK;
|
|
108
|
+
resp.hasErrors = false;
|
|
109
|
+
resp.headers = respHeaders;
|
|
110
|
+
resp.body = {}; // Must be fresh - handlers write to this
|
|
111
|
+
resp.rawBody = '';
|
|
112
|
+
resp.serializer = SerializerModes.json;
|
|
113
|
+
resp.binSerializer = undefined;
|
|
114
|
+
// Reset execution chain and routesFlow route IDs
|
|
115
|
+
const {executionChain, routesFlowRouteIds} = getExecutionChain(path, transformedPath, urlQuery, rawRequest, opts);
|
|
116
|
+
ctx.executionChain = executionChain;
|
|
117
|
+
ctx.routesFlowRouteIds = routesFlowRouteIds;
|
|
118
|
+
// Reset shared data
|
|
119
|
+
ctx.shared = opts.contextDataFactory ? opts.contextDataFactory() : {};
|
|
120
|
+
// Reset urlQuery
|
|
121
|
+
ctx.urlQuery = urlQuery;
|
|
122
|
+
return ctx;
|
|
123
|
+
}
|
|
124
|
+
// No pooled context available, create new one
|
|
125
|
+
return createCallContext(path, opts, reqRawBody, rawRequest, reqHeaders, respHeaders, reqBodyType, urlQuery);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Releases a CallContext back to the pool for reuse */
|
|
129
|
+
export function releaseCallContext(ctx: CallContext, maxPoolSize: number): void {
|
|
130
|
+
if (contextPool.length < maxPoolSize) {
|
|
131
|
+
const mutableCtx = ctx as Mutable<CallContext>;
|
|
132
|
+
const req = mutableCtx.request as Mutable<MionRequest>;
|
|
133
|
+
// Clear request data - safe to mutate since request is not returned to caller
|
|
134
|
+
req.rawBody = '';
|
|
135
|
+
req.body = null as any; // Will be set when context is acquired
|
|
136
|
+
req.thrownErrors = undefined;
|
|
137
|
+
// Create fresh response object - the old one may still be referenced by the caller
|
|
138
|
+
// IMPORTANT: We must NOT mutate the existing response object because it's returned
|
|
139
|
+
// to the platform wrapper (e.g., HTTP handler) which may still be using it
|
|
140
|
+
mutableCtx.response = {
|
|
141
|
+
statusCode: StatusCodes.OK,
|
|
142
|
+
hasErrors: false,
|
|
143
|
+
headers: null as any, // Will be set when context is acquired
|
|
144
|
+
body: null as any, // Will be set when context is acquired
|
|
145
|
+
rawBody: '',
|
|
146
|
+
serializer: SerializerModes.json,
|
|
147
|
+
binSerializer: undefined,
|
|
148
|
+
};
|
|
149
|
+
mutableCtx.shared = null as any;
|
|
150
|
+
mutableCtx.executionChain = null as any;
|
|
151
|
+
mutableCtx.routesFlowRouteIds = undefined;
|
|
152
|
+
contextPool.push(ctx);
|
|
153
|
+
}
|
|
154
|
+
// If pool is full, let the context be garbage collected
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ############# HELPER FUNCTIONS #############
|
|
158
|
+
|
|
159
|
+
function getRequestBodyType(rawBody: RawRequestBody): SerializerCode {
|
|
160
|
+
if (typeof rawBody === 'string') return SerializerModes.stringifyJson;
|
|
161
|
+
if (rawBody instanceof ArrayBuffer || rawBody instanceof Uint8Array) return SerializerModes.binary;
|
|
162
|
+
return SerializerModes.json;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Gets the execution chain for a path, handling routesFlow paths specially */
|
|
166
|
+
function getExecutionChain(
|
|
167
|
+
originalPath: string,
|
|
168
|
+
transformedPath: string,
|
|
169
|
+
urlQuery: string | undefined,
|
|
170
|
+
rawRequest: unknown,
|
|
171
|
+
opts: RouterOptions
|
|
172
|
+
): RoutesFlowExecutionResult {
|
|
173
|
+
const hasPrefix = !!opts.basePath;
|
|
174
|
+
// Handle routesFlow path - check if the original path ends with the workflow key
|
|
175
|
+
// This works with any prefix (e.g., /mion-routes-flow, /api/v1/mion-routes-flow)
|
|
176
|
+
const isRoutesFlowPath = hasPrefix ? originalPath.endsWith(WORKFLOW_PATH) : originalPath === WORKFLOW_PATH;
|
|
177
|
+
if (isRoutesFlowPath) return getRoutesFlowExecutionChain(rawRequest, opts, urlQuery);
|
|
178
|
+
|
|
179
|
+
// Normal path - get execution chain from router using transformed path
|
|
180
|
+
let executionChain = getRouteExecutionChain(transformedPath);
|
|
181
|
+
if (!executionChain) {
|
|
182
|
+
const notFoundPath = getRoutePath([MION_ROUTES.notFound], opts);
|
|
183
|
+
executionChain = getRouteExecutionChain(notFoundPath);
|
|
184
|
+
if (!executionChain) {
|
|
185
|
+
throw new RpcError({
|
|
186
|
+
statusCode: StatusCodes.UNEXPECTED_ERROR,
|
|
187
|
+
type: 'not-found',
|
|
188
|
+
publicMessage: 'Not-found route is not registered. This should never happen.',
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {executionChain};
|
|
193
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2022 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
import {RouterOptions} from './types/general.ts';
|
|
9
|
+
import {getENV, MION_ROUTES, PATH_SEPARATOR} from '@mionjs/core';
|
|
10
|
+
|
|
11
|
+
export const IS_TEST_ENV = getENV('JEST_WORKER_ID') !== undefined || getENV('NODE_ENV') === 'test';
|
|
12
|
+
|
|
13
|
+
export const ROUTE_DEFAULT_PARAMS = ['context'];
|
|
14
|
+
export const HEADER_HOOK_DEFAULT_PARAMS = ['context', 'headers'];
|
|
15
|
+
|
|
16
|
+
export const DEFAULT_ROUTE_OPTIONS = {
|
|
17
|
+
/** Prefix for all routes, i.e: api/v1. Path separator is added between the prefix and the route */
|
|
18
|
+
basePath: '',
|
|
19
|
+
/** Suffix for all routes, i.e: .json. No path separator is added between the route and the suffix */
|
|
20
|
+
suffix: '',
|
|
21
|
+
/** Function that transforms the path before finding a route */
|
|
22
|
+
pathTransform: undefined,
|
|
23
|
+
/** Default serializer mode - json as default native serializer, and minimum overhead to transform just required fields */
|
|
24
|
+
serializer: 'json',
|
|
25
|
+
/** Default run type compiling options for routes and middleFns, can't be configured by the user as would break functionality */
|
|
26
|
+
runTypeOptions: {},
|
|
27
|
+
/** set to true to generate router spec for clients. */
|
|
28
|
+
getPublicRoutesData: process.env.GENERATE_ROUTER_SPEC === 'true',
|
|
29
|
+
/** Set true to automatically generate and id for every error. */
|
|
30
|
+
autoGenerateErrorId: false,
|
|
31
|
+
/** client routes are initialized by default */
|
|
32
|
+
skipClientRoutes: IS_TEST_ENV,
|
|
33
|
+
/** AOT mode is disabled by default */
|
|
34
|
+
aot: false,
|
|
35
|
+
/** Context pooling size == 100 by default */
|
|
36
|
+
maxContextPoolSize: 100,
|
|
37
|
+
/** RoutesFlow cache size == 100 by default */
|
|
38
|
+
maxRoutesFlowsCacheSize: 100,
|
|
39
|
+
} as Readonly<RouterOptions>;
|
|
40
|
+
|
|
41
|
+
export const MAX_ROUTE_NESTING = 10;
|
|
42
|
+
export const NOT_FOUND_HOOK_NAME = '_miΦn404NΦtfΦundHΦΦk_';
|
|
43
|
+
export const NOT_FOUND_PATH = `${PATH_SEPARATOR}${MION_ROUTES.notFound}`;
|
|
44
|
+
export const WORKFLOW_KEY = `mion-routes-flow`;
|
|
45
|
+
export const WORKFLOW_PATH = `${PATH_SEPARATOR}${WORKFLOW_KEY}`;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2025 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Default routes script for AOT cache generation.
|
|
10
|
+
*
|
|
11
|
+
* This script initializes the mion router with only the built-in internal routes
|
|
12
|
+
* (error routes, metadata routes, etc.). It is used by the Vite plugin as a fallback
|
|
13
|
+
* when no user-provided startScript is configured.
|
|
14
|
+
*
|
|
15
|
+
* When run with MION_COMPILE=buildOnly, the router's emitAOTCaches() will automatically
|
|
16
|
+
* collect and send the serialized caches for these internal routes via IPC.
|
|
17
|
+
*
|
|
18
|
+
* Internal routes included:
|
|
19
|
+
* - @thrownErrors: Error serialization route
|
|
20
|
+
* - mion@notFound: Not-found handler
|
|
21
|
+
* - mion@platformError: Platform error handler
|
|
22
|
+
* - mion@methodsMetadataById: Remote methods metadata by ID
|
|
23
|
+
* - mion@methodsMetadata: Methods metadata middleware (returns metadata alongside any route response)
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import {middleFn, initMionRouter} from '@mionjs/router';
|
|
27
|
+
import type {Routes} from '@mionjs/router';
|
|
28
|
+
|
|
29
|
+
const routes = {
|
|
30
|
+
// Only required as initMionRouter needs at least one route/middleFn
|
|
31
|
+
'mion@mionEmptyMiddleFn': middleFn((): void => undefined),
|
|
32
|
+
} satisfies Routes;
|
|
33
|
+
|
|
34
|
+
// Initialize the router — this registers all internal routes and emits AOT caches
|
|
35
|
+
// skipClientRoutes must be false to ensure metadata routes are included in AOT caches
|
|
36
|
+
export const defaultApi = initMionRouter(routes, {skipClientRoutes: false});
|
|
37
|
+
export type DefaultApi = typeof defaultApi;
|
package/src/dispatch.ts
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/* ########
|
|
2
|
+
* 2022 mion
|
|
3
|
+
* Author: Ma-jerez
|
|
4
|
+
* License: MIT
|
|
5
|
+
* The software is provided "as is", without warranty of any kind.
|
|
6
|
+
* ######## */
|
|
7
|
+
|
|
8
|
+
import type {CallContext, MionResponse, MionRequest, MionHeaders, RawRequestBody} from './types/context.ts';
|
|
9
|
+
import {type RouterOptions} from './types/general.ts';
|
|
10
|
+
import {HeadersMethod, RemoteMethod, RawMethod} from './types/remoteMethods.ts';
|
|
11
|
+
import {getRouterOptions} from './router.ts';
|
|
12
|
+
import {Mutable, AnyObject, StatusCodes, HeadersSubset, SerializerModes, SerializerCode} from '@mionjs/core';
|
|
13
|
+
import {RpcError, HandlerType, ValidationError} from '@mionjs/core';
|
|
14
|
+
import {onExecutableError} from './lib/dispatchError.ts';
|
|
15
|
+
import {acquireCallContext, releaseCallContext} from './callContext.ts';
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* PERFORMANCE PROFILING NOTE:
|
|
19
|
+
* different options has been tested to improve performance but were discarded due to worst or no noticeable improvements
|
|
20
|
+
* - using promisify(setImmediate): worst or no improvement
|
|
21
|
+
* - using queueMicrotask instead of setImmediate: definitely worst
|
|
22
|
+
* - using callback instead promises: seems to be more slow but use less memory in some scenarios.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// ############# PUBLIC METHODS #############
|
|
26
|
+
|
|
27
|
+
export async function dispatchRoute<Req, Resp>(
|
|
28
|
+
path: string,
|
|
29
|
+
reqRawBody: RawRequestBody,
|
|
30
|
+
reqHeaders: MionHeaders,
|
|
31
|
+
respHeaders: MionHeaders,
|
|
32
|
+
rawRequest: Req,
|
|
33
|
+
rawResponse?: Resp,
|
|
34
|
+
reqBodyType?: SerializerCode,
|
|
35
|
+
urlQuery?: string
|
|
36
|
+
): Promise<MionResponse> {
|
|
37
|
+
const opts = getRouterOptions();
|
|
38
|
+
const usePooling = opts.maxContextPoolSize > 0;
|
|
39
|
+
const context = acquireCallContext(
|
|
40
|
+
usePooling,
|
|
41
|
+
path,
|
|
42
|
+
opts,
|
|
43
|
+
reqRawBody,
|
|
44
|
+
rawRequest,
|
|
45
|
+
reqHeaders,
|
|
46
|
+
respHeaders,
|
|
47
|
+
reqBodyType,
|
|
48
|
+
urlQuery
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
try {
|
|
52
|
+
await runExecutionChain(context, rawRequest, rawResponse, opts);
|
|
53
|
+
return context.response;
|
|
54
|
+
} catch (err: any | RpcError<string> | Error) {
|
|
55
|
+
// this should never happen, exceptions should be handled inside runExecutionChain
|
|
56
|
+
return Promise.reject(err);
|
|
57
|
+
} finally {
|
|
58
|
+
// Release context back to pool if pooling is enabled
|
|
59
|
+
if (usePooling) {
|
|
60
|
+
releaseCallContext(context, opts.maxContextPoolSize);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ############# PRIVATE METHODS #############
|
|
66
|
+
|
|
67
|
+
// runs the ExecutionChain of a route
|
|
68
|
+
async function runExecutionChain(
|
|
69
|
+
context: CallContext,
|
|
70
|
+
rawRequest: unknown,
|
|
71
|
+
rawResponse: unknown,
|
|
72
|
+
opts: RouterOptions
|
|
73
|
+
): Promise<MionResponse> {
|
|
74
|
+
const {response, request} = context;
|
|
75
|
+
const executionList = context.executionChain.methods;
|
|
76
|
+
(response as Mutable<MionResponse>).serializer = context.executionChain.serializer;
|
|
77
|
+
for (let i = 0; i < executionList.length; i++) {
|
|
78
|
+
const executable = executionList[i];
|
|
79
|
+
if (response.hasErrors && !executable.options.runOnError) continue;
|
|
80
|
+
|
|
81
|
+
try {
|
|
82
|
+
const methodCaller = executable.methodCaller || getMethodCaller(executable);
|
|
83
|
+
// runRawMiddleFn , runHeadersMiddleFn & runRouteOrMiddleFn must always accept the same parameters in the same order
|
|
84
|
+
const result = await methodCaller(context, executable, request, response, opts, rawRequest, rawResponse);
|
|
85
|
+
|
|
86
|
+
if (result === undefined || !executable.hasReturnData) continue;
|
|
87
|
+
if (executable.headersReturn && result instanceof HeadersSubset) {
|
|
88
|
+
const headersMap = result.headers;
|
|
89
|
+
for (const name in headersMap) {
|
|
90
|
+
const value = headersMap[name];
|
|
91
|
+
if (value !== undefined && value !== null) {
|
|
92
|
+
response.headers.set(name, value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
(response.body as Mutable<AnyObject>)[executable.id] = result;
|
|
98
|
+
} catch (err: any | RpcError<string> | Error) {
|
|
99
|
+
// All thrown errors are unexpected
|
|
100
|
+
onExecutableError(context, executable, err);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return context.response;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function runRawMiddleFn(
|
|
107
|
+
context: CallContext,
|
|
108
|
+
executable: RawMethod,
|
|
109
|
+
req,
|
|
110
|
+
resp,
|
|
111
|
+
opts: RouterOptions,
|
|
112
|
+
rawRequest: unknown,
|
|
113
|
+
rawResponse: unknown
|
|
114
|
+
) {
|
|
115
|
+
const result = await executable.handler(context, rawRequest, rawResponse, opts);
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function runHeadersMiddleFn(context: CallContext, executable: HeadersMethod, request: MionRequest) {
|
|
120
|
+
const headerNames = executable.headersParam.headerNames;
|
|
121
|
+
const params = deserializeBodyParamsOrThrow(request, executable as RemoteMethod);
|
|
122
|
+
const headersMap: Record<string, string> = {};
|
|
123
|
+
headerNames.forEach((name) => {
|
|
124
|
+
const value = request.headers.get(name);
|
|
125
|
+
if (value) headersMap[name] = value;
|
|
126
|
+
});
|
|
127
|
+
const headersSubset = new HeadersSubset(headersMap);
|
|
128
|
+
validateHeaderParamsOrThrow(headersSubset, executable as HeadersMethod);
|
|
129
|
+
if (executable.options.validateParams) validateParametersOrThrow(params, executable as HeadersMethod);
|
|
130
|
+
|
|
131
|
+
const result = await executable.handler(context, headersSubset, ...params);
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function runRouteOrMiddleFn(context: CallContext, executable: HeadersMethod, request: MionRequest) {
|
|
136
|
+
const params = deserializeBodyParamsOrThrow(request, executable as RemoteMethod);
|
|
137
|
+
if (executable.options.validateParams) validateParametersOrThrow(params, executable as RemoteMethod);
|
|
138
|
+
const result = await executable.handler(context, ...params);
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function getMethodCaller(executable: RemoteMethod) {
|
|
143
|
+
if (executable.type === HandlerType.rawMiddleFn) {
|
|
144
|
+
executable.methodCaller = runRawMiddleFn;
|
|
145
|
+
} else if (executable.type === HandlerType.headersMiddleFn) {
|
|
146
|
+
executable.methodCaller = runHeadersMiddleFn;
|
|
147
|
+
} else {
|
|
148
|
+
executable.methodCaller = runRouteOrMiddleFn;
|
|
149
|
+
}
|
|
150
|
+
return executable.methodCaller;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function deserializeBodyParamsOrThrow(request: MionRequest, executable: RemoteMethod): any[] {
|
|
154
|
+
const params: any[] = (request.body[executable.id] as any[]) || [];
|
|
155
|
+
// For binary requests, params are already deserialized in the serializer middleFn
|
|
156
|
+
// (deserializeBinaryRequestBody in serializer.routes.ts)
|
|
157
|
+
if (request.bodyType === SerializerModes.binary) return params;
|
|
158
|
+
|
|
159
|
+
// For JSON requests, use restoreFromJson to deserialize
|
|
160
|
+
if (executable.paramsJitFns.restoreFromJson.isNoop) return params;
|
|
161
|
+
try {
|
|
162
|
+
(request.body as Mutable<MionRequest['body']>)[executable.id] = executable.paramsJitFns.restoreFromJson.fn(params);
|
|
163
|
+
return request.body[executable.id] as any[];
|
|
164
|
+
} catch (e: any) {
|
|
165
|
+
throw new RpcError({
|
|
166
|
+
statusCode: StatusCodes.UNEXPECTED_ERROR,
|
|
167
|
+
type: 'serialization-error',
|
|
168
|
+
publicMessage: `Invalid params '${executable.id}', can not deserialize. Parameters might be of the wrong type.`,
|
|
169
|
+
originalError: e,
|
|
170
|
+
errorData: {
|
|
171
|
+
deserializeError: e?.message || 'Unknown error',
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function validateParametersOrThrow(params: any[], executable: RemoteMethod): void {
|
|
178
|
+
if (executable.paramsJitFns.isType.isNoop) return;
|
|
179
|
+
if (!executable.paramsJitFns.isType.fn(params)) {
|
|
180
|
+
const validationError: ValidationError = new RpcError({
|
|
181
|
+
statusCode: StatusCodes.UNEXPECTED_ERROR,
|
|
182
|
+
type: 'validation-error',
|
|
183
|
+
publicMessage: `Invalid params in '${executable.id}', validation failed.`,
|
|
184
|
+
errorData: {
|
|
185
|
+
typeErrors: executable.paramsJitFns.typeErrors.fn(params),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
throw validationError;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function validateHeaderParamsOrThrow(headers: HeadersSubset<string, string>, executable: HeadersMethod): void {
|
|
193
|
+
if (!executable.headersParam.jitFns.isType.fn(headers)) {
|
|
194
|
+
const validationError: ValidationError = new RpcError({
|
|
195
|
+
statusCode: StatusCodes.UNEXPECTED_ERROR,
|
|
196
|
+
type: 'validation-error',
|
|
197
|
+
publicMessage: `Invalid params in '${executable.id}', validation failed.`,
|
|
198
|
+
errorData: {
|
|
199
|
+
typeErrors: executable.headersParam.jitFns.typeErrors.fn(headers),
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
throw validationError;
|
|
203
|
+
}
|
|
204
|
+
}
|