@mionjs/router 0.8.7 → 0.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/.dist/cjs/index.d.ts +1 -0
  2. package/.dist/cjs/index.d.ts.map +1 -0
  3. package/.dist/cjs/src/aot/aotCacheLoader.d.ts +1 -0
  4. package/.dist/cjs/src/aot/aotCacheLoader.d.ts.map +1 -0
  5. package/.dist/cjs/src/callContext.d.ts +1 -0
  6. package/.dist/cjs/src/callContext.d.ts.map +1 -0
  7. package/.dist/cjs/src/constants.d.ts +1 -0
  8. package/.dist/cjs/src/constants.d.ts.map +1 -0
  9. package/.dist/cjs/src/defaultRoutes.d.ts +1 -0
  10. package/.dist/cjs/src/defaultRoutes.d.ts.map +1 -0
  11. package/.dist/cjs/src/dispatch.d.ts +1 -0
  12. package/.dist/cjs/src/dispatch.d.ts.map +1 -0
  13. package/.dist/cjs/src/lib/aotEmitter.d.ts +1 -0
  14. package/.dist/cjs/src/lib/aotEmitter.d.ts.map +1 -0
  15. package/.dist/cjs/src/lib/dispatchError.d.ts +1 -0
  16. package/.dist/cjs/src/lib/dispatchError.d.ts.map +1 -0
  17. package/.dist/cjs/src/lib/handlers.d.ts +1 -0
  18. package/.dist/cjs/src/lib/handlers.d.ts.map +1 -0
  19. package/.dist/cjs/src/lib/headers.d.ts +1 -0
  20. package/.dist/cjs/src/lib/headers.d.ts.map +1 -0
  21. package/.dist/cjs/src/lib/methodsCache.d.ts +1 -0
  22. package/.dist/cjs/src/lib/methodsCache.d.ts.map +1 -0
  23. package/.dist/cjs/src/lib/queryBody.d.ts +1 -0
  24. package/.dist/cjs/src/lib/queryBody.d.ts.map +1 -0
  25. package/.dist/cjs/src/lib/reflection.d.ts +1 -0
  26. package/.dist/cjs/src/lib/reflection.d.ts.map +1 -0
  27. package/.dist/cjs/src/lib/remoteMethods.d.ts +1 -0
  28. package/.dist/cjs/src/lib/remoteMethods.d.ts.map +1 -0
  29. package/.dist/cjs/src/lib/test/aotEmitter-test-router.d.ts +1 -0
  30. package/.dist/cjs/src/lib/test/aotEmitter-test-router.d.ts.map +1 -0
  31. package/.dist/cjs/src/router.d.ts +1 -0
  32. package/.dist/cjs/src/router.d.ts.map +1 -0
  33. package/.dist/cjs/src/routes/client.routes.d.ts +1 -0
  34. package/.dist/cjs/src/routes/client.routes.d.ts.map +1 -0
  35. package/.dist/cjs/src/routes/errors.routes.d.ts +1 -0
  36. package/.dist/cjs/src/routes/errors.routes.d.ts.map +1 -0
  37. package/.dist/cjs/src/routes/mion.routes.d.ts +1 -0
  38. package/.dist/cjs/src/routes/mion.routes.d.ts.map +1 -0
  39. package/.dist/cjs/src/routes/serializer.routes.d.ts +1 -0
  40. package/.dist/cjs/src/routes/serializer.routes.d.ts.map +1 -0
  41. package/.dist/cjs/src/routesFlow.d.ts +1 -0
  42. package/.dist/cjs/src/routesFlow.d.ts.map +1 -0
  43. package/.dist/cjs/src/types/context.d.ts +1 -0
  44. package/.dist/cjs/src/types/context.d.ts.map +1 -0
  45. package/.dist/cjs/src/types/definitions.d.ts +1 -0
  46. package/.dist/cjs/src/types/definitions.d.ts.map +1 -0
  47. package/.dist/cjs/src/types/general.d.ts +1 -0
  48. package/.dist/cjs/src/types/general.d.ts.map +1 -0
  49. package/.dist/cjs/src/types/guards.d.ts +1 -0
  50. package/.dist/cjs/src/types/guards.d.ts.map +1 -0
  51. package/.dist/cjs/src/types/handlers.d.ts +1 -0
  52. package/.dist/cjs/src/types/handlers.d.ts.map +1 -0
  53. package/.dist/cjs/src/types/publicMethods.d.ts +1 -0
  54. package/.dist/cjs/src/types/publicMethods.d.ts.map +1 -0
  55. package/.dist/cjs/src/types/remoteMethods.d.ts +1 -0
  56. package/.dist/cjs/src/types/remoteMethods.d.ts.map +1 -0
  57. package/.dist/esm/index.d.ts +1 -0
  58. package/.dist/esm/index.d.ts.map +1 -0
  59. package/.dist/esm/src/aot/aotCacheLoader.d.ts +1 -0
  60. package/.dist/esm/src/aot/aotCacheLoader.d.ts.map +1 -0
  61. package/.dist/esm/src/callContext.d.ts +1 -0
  62. package/.dist/esm/src/callContext.d.ts.map +1 -0
  63. package/.dist/esm/src/constants.d.ts +1 -0
  64. package/.dist/esm/src/constants.d.ts.map +1 -0
  65. package/.dist/esm/src/defaultRoutes.d.ts +1 -0
  66. package/.dist/esm/src/defaultRoutes.d.ts.map +1 -0
  67. package/.dist/esm/src/dispatch.d.ts +1 -0
  68. package/.dist/esm/src/dispatch.d.ts.map +1 -0
  69. package/.dist/esm/src/lib/aotEmitter.d.ts +1 -0
  70. package/.dist/esm/src/lib/aotEmitter.d.ts.map +1 -0
  71. package/.dist/esm/src/lib/dispatchError.d.ts +1 -0
  72. package/.dist/esm/src/lib/dispatchError.d.ts.map +1 -0
  73. package/.dist/esm/src/lib/handlers.d.ts +1 -0
  74. package/.dist/esm/src/lib/handlers.d.ts.map +1 -0
  75. package/.dist/esm/src/lib/headers.d.ts +1 -0
  76. package/.dist/esm/src/lib/headers.d.ts.map +1 -0
  77. package/.dist/esm/src/lib/methodsCache.d.ts +1 -0
  78. package/.dist/esm/src/lib/methodsCache.d.ts.map +1 -0
  79. package/.dist/esm/src/lib/queryBody.d.ts +1 -0
  80. package/.dist/esm/src/lib/queryBody.d.ts.map +1 -0
  81. package/.dist/esm/src/lib/reflection.d.ts +1 -0
  82. package/.dist/esm/src/lib/reflection.d.ts.map +1 -0
  83. package/.dist/esm/src/lib/remoteMethods.d.ts +1 -0
  84. package/.dist/esm/src/lib/remoteMethods.d.ts.map +1 -0
  85. package/.dist/esm/src/lib/test/aotEmitter-test-router.d.ts +1 -0
  86. package/.dist/esm/src/lib/test/aotEmitter-test-router.d.ts.map +1 -0
  87. package/.dist/esm/src/router.d.ts +1 -0
  88. package/.dist/esm/src/router.d.ts.map +1 -0
  89. package/.dist/esm/src/routes/client.routes.d.ts +1 -0
  90. package/.dist/esm/src/routes/client.routes.d.ts.map +1 -0
  91. package/.dist/esm/src/routes/errors.routes.d.ts +1 -0
  92. package/.dist/esm/src/routes/errors.routes.d.ts.map +1 -0
  93. package/.dist/esm/src/routes/mion.routes.d.ts +1 -0
  94. package/.dist/esm/src/routes/mion.routes.d.ts.map +1 -0
  95. package/.dist/esm/src/routes/serializer.routes.d.ts +1 -0
  96. package/.dist/esm/src/routes/serializer.routes.d.ts.map +1 -0
  97. package/.dist/esm/src/routesFlow.d.ts +1 -0
  98. package/.dist/esm/src/routesFlow.d.ts.map +1 -0
  99. package/.dist/esm/src/types/context.d.ts +1 -0
  100. package/.dist/esm/src/types/context.d.ts.map +1 -0
  101. package/.dist/esm/src/types/definitions.d.ts +1 -0
  102. package/.dist/esm/src/types/definitions.d.ts.map +1 -0
  103. package/.dist/esm/src/types/general.d.ts +1 -0
  104. package/.dist/esm/src/types/general.d.ts.map +1 -0
  105. package/.dist/esm/src/types/guards.d.ts +1 -0
  106. package/.dist/esm/src/types/guards.d.ts.map +1 -0
  107. package/.dist/esm/src/types/handlers.d.ts +1 -0
  108. package/.dist/esm/src/types/handlers.d.ts.map +1 -0
  109. package/.dist/esm/src/types/publicMethods.d.ts +1 -0
  110. package/.dist/esm/src/types/publicMethods.d.ts.map +1 -0
  111. package/.dist/esm/src/types/remoteMethods.d.ts +1 -0
  112. package/.dist/esm/src/types/remoteMethods.d.ts.map +1 -0
  113. package/index.ts +29 -0
  114. package/package.json +9 -5
  115. package/src/aot/aotCacheLoader.ts +15 -0
  116. package/src/callContext.ts +193 -0
  117. package/src/constants.ts +45 -0
  118. package/src/defaultRoutes.ts +37 -0
  119. package/src/dispatch.ts +204 -0
  120. package/src/lib/aotEmitter.ts +140 -0
  121. package/src/lib/dispatchError.ts +60 -0
  122. package/src/lib/handlers.ts +75 -0
  123. package/src/lib/headers.ts +102 -0
  124. package/src/lib/methodsCache.ts +72 -0
  125. package/src/lib/queryBody.ts +40 -0
  126. package/src/lib/reflection.ts +517 -0
  127. package/src/lib/remoteMethods.ts +180 -0
  128. package/src/lib/test/aotEmitter-test-router.ts +40 -0
  129. package/src/router.ts +656 -0
  130. package/src/routes/client.routes.ts +108 -0
  131. package/src/routes/errors.routes.ts +51 -0
  132. package/src/routes/mion.routes.ts +11 -0
  133. package/src/routes/serializer.routes.ts +225 -0
  134. package/src/routesFlow.ts +320 -0
  135. package/src/types/context.ts +119 -0
  136. package/src/types/definitions.ts +53 -0
  137. package/src/types/general.ts +84 -0
  138. package/src/types/guards.ts +71 -0
  139. package/src/types/handlers.ts +49 -0
  140. package/src/types/publicMethods.ts +83 -0
  141. package/src/types/remoteMethods.ts +54 -0
@@ -18,3 +18,4 @@ export declare type __ΩMiddleFnDef = any[];
18
18
  export declare type __ΩHeadersMiddleFnDef = any[];
19
19
  export declare type __ΩRawMiddleFnDef = any[];
20
20
  export declare type __ΩAnyHandlerDef = any[];
21
+ //# sourceMappingURL=definitions.d.ts.map
@@ -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"}
@@ -26,3 +26,4 @@ export declare type __ΩRoute = any[];
26
26
  export declare type __ΩRouterEntry = any[];
27
27
  export declare type __ΩRoutes = any[];
28
28
  export declare type __ΩRouterOptions = any[];
29
+ //# sourceMappingURL=general.d.ts.map
@@ -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"}
@@ -10,3 +10,4 @@ export declare type __ΩHandler = any[];
10
10
  export declare type __ΩHeaderHandler = any[];
11
11
  export declare type __ΩRawMiddleFnHandler = any[];
12
12
  export declare type __ΩAnyHandler = any[];
13
+ //# sourceMappingURL=handlers.d.ts.map
@@ -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"}
@@ -43,3 +43,4 @@ export declare type __ΩPublicRoute = any[];
43
43
  export declare type __ΩPublicMiddleFn = any[];
44
44
  export declare type __ΩPublicHeadersFn = any[];
45
45
  export declare type __ΩPublicHandler = any[];
46
+ //# sourceMappingURL=publicMethods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicMethods.d.ts","sourceRoot":"","sources":["../../../../src/types/publicMethods.ts"],"names":[],"mappings":"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"}
@@ -42,3 +42,4 @@ export declare type __ΩMiddleFnOptions = any[];
42
42
  export declare type __ΩHeadersMiddleFnOptions = any[];
43
43
  export declare type __ΩRawMiddleFnOptions = any[];
44
44
  export declare type __ΩMethodsExecutionChain = any[];
45
+ //# sourceMappingURL=remoteMethods.d.ts.map
@@ -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.7",
3
+ "version": "0.8.10",
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.7",
64
- "@mionjs/run-types": "0.8.7"
67
+ "@mionjs/core": "0.8.10",
68
+ "@mionjs/run-types": "0.8.10"
65
69
  },
66
- "gitHead": "03190d1125582fe2e37c9168f6e406a91b3c4cff"
70
+ "gitHead": "3e2b3b633ceb0b054fc1f1aad914d779ddd6c8b0"
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
+ }
@@ -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;
@@ -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
+ }