@nifrajs/core 2.14.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +25 -0
  2. package/dist/assurance.d.ts +16 -8
  3. package/dist/assurance.d.ts.map +1 -1
  4. package/dist/assurance.js +33 -0
  5. package/dist/assurance.js.map +1 -1
  6. package/dist/durable-adapters.d.ts.map +1 -1
  7. package/dist/durable-adapters.js +26 -3
  8. package/dist/durable-adapters.js.map +1 -1
  9. package/dist/durable-approval.d.ts +56 -0
  10. package/dist/durable-approval.d.ts.map +1 -0
  11. package/dist/durable-approval.js +233 -0
  12. package/dist/durable-approval.js.map +1 -0
  13. package/dist/durable-effect.d.ts +42 -0
  14. package/dist/durable-effect.d.ts.map +1 -0
  15. package/dist/durable-effect.js +234 -0
  16. package/dist/durable-effect.js.map +1 -0
  17. package/dist/durable-execution.d.ts +8 -346
  18. package/dist/durable-execution.d.ts.map +1 -1
  19. package/dist/durable-execution.js +7 -1150
  20. package/dist/durable-execution.js.map +1 -1
  21. package/dist/durable-saga.d.ts +94 -0
  22. package/dist/durable-saga.d.ts.map +1 -0
  23. package/dist/durable-saga.js +550 -0
  24. package/dist/durable-saga.js.map +1 -0
  25. package/dist/edge-kit.d.ts +27 -0
  26. package/dist/edge-kit.d.ts.map +1 -0
  27. package/dist/edge-kit.js +24 -0
  28. package/dist/edge-kit.js.map +1 -0
  29. package/dist/errors.d.ts +1 -1
  30. package/dist/errors.d.ts.map +1 -1
  31. package/dist/errors.js.map +1 -1
  32. package/dist/index.d.ts +23 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +18 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/internal/durable-approval-protocol.d.ts +1 -1
  37. package/dist/internal/durable-approval-protocol.d.ts.map +1 -1
  38. package/dist/internal/durable-effect-protocol.d.ts +1 -1
  39. package/dist/internal/durable-effect-protocol.d.ts.map +1 -1
  40. package/dist/internal/durable-saga-protocol.d.ts +1 -1
  41. package/dist/internal/durable-saga-protocol.d.ts.map +1 -1
  42. package/dist/internal/durable-shared.d.ts +26 -0
  43. package/dist/internal/durable-shared.d.ts.map +1 -0
  44. package/dist/internal/durable-shared.js +131 -0
  45. package/dist/internal/durable-shared.js.map +1 -0
  46. package/dist/internal/durable-types.d.ts +159 -0
  47. package/dist/internal/durable-types.d.ts.map +1 -0
  48. package/dist/internal/durable-types.js +2 -0
  49. package/dist/internal/durable-types.js.map +1 -0
  50. package/dist/internal/route-compiler.d.ts +61 -0
  51. package/dist/internal/route-compiler.d.ts.map +1 -0
  52. package/dist/internal/route-compiler.js +121 -0
  53. package/dist/internal/route-compiler.js.map +1 -0
  54. package/dist/internal/route-execution.d.ts +17 -9
  55. package/dist/internal/route-execution.d.ts.map +1 -1
  56. package/dist/internal/route-execution.js +4 -18
  57. package/dist/internal/route-execution.js.map +1 -1
  58. package/dist/internal/route-lanes.d.ts +35 -0
  59. package/dist/internal/route-lanes.d.ts.map +1 -0
  60. package/dist/internal/route-lanes.js +150 -0
  61. package/dist/internal/route-lanes.js.map +1 -0
  62. package/dist/internal/route-program.d.ts +67 -0
  63. package/dist/internal/route-program.d.ts.map +1 -0
  64. package/dist/internal/route-program.js +199 -0
  65. package/dist/internal/route-program.js.map +1 -0
  66. package/dist/response-observer.d.ts +25 -0
  67. package/dist/response-observer.d.ts.map +1 -0
  68. package/dist/response-observer.js +40 -0
  69. package/dist/response-observer.js.map +1 -0
  70. package/dist/security/baseline.d.ts +68 -0
  71. package/dist/security/baseline.d.ts.map +1 -0
  72. package/dist/security/baseline.js +118 -0
  73. package/dist/security/baseline.js.map +1 -0
  74. package/dist/server/bare-error-lane.d.ts +26 -0
  75. package/dist/server/bare-error-lane.d.ts.map +1 -0
  76. package/dist/server/bare-error-lane.js +60 -0
  77. package/dist/server/bare-error-lane.js.map +1 -0
  78. package/dist/server/body-lane.d.ts +13 -0
  79. package/dist/server/body-lane.d.ts.map +1 -0
  80. package/dist/server/body-lane.js +134 -0
  81. package/dist/server/body-lane.js.map +1 -0
  82. package/dist/server/body.d.ts +7 -0
  83. package/dist/server/body.d.ts.map +1 -1
  84. package/dist/server/body.js +7 -0
  85. package/dist/server/body.js.map +1 -1
  86. package/dist/server/bridge-markers.d.ts +25 -0
  87. package/dist/server/bridge-markers.d.ts.map +1 -0
  88. package/dist/server/bridge-markers.js +25 -0
  89. package/dist/server/bridge-markers.js.map +1 -0
  90. package/dist/server/context.d.ts +6 -1
  91. package/dist/server/context.d.ts.map +1 -1
  92. package/dist/server/contract.d.ts +40 -14
  93. package/dist/server/contract.d.ts.map +1 -1
  94. package/dist/server/contract.js +7 -0
  95. package/dist/server/contract.js.map +1 -1
  96. package/dist/server/cookies.d.ts.map +1 -1
  97. package/dist/server/cookies.js +16 -2
  98. package/dist/server/cookies.js.map +1 -1
  99. package/dist/server/header-case.d.ts.map +1 -1
  100. package/dist/server/header-case.js +2 -1
  101. package/dist/server/header-case.js.map +1 -1
  102. package/dist/server/http.d.ts +36 -3
  103. package/dist/server/http.d.ts.map +1 -1
  104. package/dist/server/http.js +49 -3
  105. package/dist/server/http.js.map +1 -1
  106. package/dist/server/install.d.ts +6 -8
  107. package/dist/server/install.d.ts.map +1 -1
  108. package/dist/server/install.js +7 -0
  109. package/dist/server/install.js.map +1 -1
  110. package/dist/server/node-outcome-hook.d.ts +2 -1
  111. package/dist/server/node-outcome-hook.d.ts.map +1 -1
  112. package/dist/server/node-outcome-hook.js.map +1 -1
  113. package/dist/server/node-outcome.d.ts +17 -2
  114. package/dist/server/node-outcome.d.ts.map +1 -1
  115. package/dist/server/node-outcome.js +37 -3
  116. package/dist/server/node-outcome.js.map +1 -1
  117. package/dist/server/plugin.d.ts +2 -2
  118. package/dist/server/plugin.d.ts.map +1 -1
  119. package/dist/server/plugin.js +6 -1
  120. package/dist/server/plugin.js.map +1 -1
  121. package/dist/server/query.d.ts +7 -1
  122. package/dist/server/query.d.ts.map +1 -1
  123. package/dist/server/query.js +8 -3
  124. package/dist/server/query.js.map +1 -1
  125. package/dist/server/registry.d.ts +40 -12
  126. package/dist/server/registry.d.ts.map +1 -1
  127. package/dist/server/request-context.d.ts +2 -13
  128. package/dist/server/request-context.d.ts.map +1 -1
  129. package/dist/server/request-context.js +18 -159
  130. package/dist/server/request-context.js.map +1 -1
  131. package/dist/server/respond.d.ts.map +1 -1
  132. package/dist/server/respond.js +58 -4
  133. package/dist/server/respond.js.map +1 -1
  134. package/dist/server/response-contract-lane.d.ts.map +1 -1
  135. package/dist/server/response-contract-lane.js +5 -2
  136. package/dist/server/response-contract-lane.js.map +1 -1
  137. package/dist/server/response-observer-runtime.d.ts +20 -0
  138. package/dist/server/response-observer-runtime.d.ts.map +1 -0
  139. package/dist/server/response-observer-runtime.js +95 -0
  140. package/dist/server/response-observer-runtime.js.map +1 -0
  141. package/dist/server/runtime-core.d.ts +76 -0
  142. package/dist/server/runtime-core.d.ts.map +1 -1
  143. package/dist/server/runtime-core.js +42 -1
  144. package/dist/server/runtime-core.js.map +1 -1
  145. package/dist/server/server-types.d.ts +6 -1
  146. package/dist/server/server-types.d.ts.map +1 -1
  147. package/dist/server/server.d.ts +158 -116
  148. package/dist/server/server.d.ts.map +1 -1
  149. package/dist/server/server.js +707 -844
  150. package/dist/server/server.js.map +1 -1
  151. package/dist/server/validation.d.ts +5 -0
  152. package/dist/server/validation.d.ts.map +1 -0
  153. package/dist/server/validation.js +13 -0
  154. package/dist/server/validation.js.map +1 -0
  155. package/dist/server/websocket.d.ts +20 -4
  156. package/dist/server/websocket.d.ts.map +1 -1
  157. package/dist/server/websocket.js +81 -11
  158. package/dist/server/websocket.js.map +1 -1
  159. package/dist/server/ws-bun.d.ts +12 -4
  160. package/dist/server/ws-bun.d.ts.map +1 -1
  161. package/dist/server/ws-bun.js +50 -16
  162. package/dist/server/ws-bun.js.map +1 -1
  163. package/dist/server/ws-hook.d.ts +3 -2
  164. package/dist/server/ws-hook.d.ts.map +1 -1
  165. package/dist/server.d.ts +3 -2
  166. package/dist/server.d.ts.map +1 -1
  167. package/dist/server.js +2 -1
  168. package/dist/server.js.map +1 -1
  169. package/dist/single-copy-register.d.ts +2 -0
  170. package/dist/single-copy-register.d.ts.map +1 -0
  171. package/dist/single-copy-register.js +24 -0
  172. package/dist/single-copy-register.js.map +1 -0
  173. package/dist/single-copy.d.ts +156 -0
  174. package/dist/single-copy.d.ts.map +1 -0
  175. package/dist/single-copy.js +472 -0
  176. package/dist/single-copy.js.map +1 -0
  177. package/package.json +28 -3
  178. package/src/assurance.ts +58 -1
  179. package/src/durable-adapters.ts +20 -0
  180. package/src/durable-approval.ts +281 -0
  181. package/src/durable-effect.ts +300 -0
  182. package/src/durable-execution.ts +8 -1627
  183. package/src/durable-saga.ts +744 -0
  184. package/src/edge-kit.ts +27 -0
  185. package/src/errors.ts +1 -0
  186. package/src/index.ts +129 -2
  187. package/src/internal/durable-approval-protocol.ts +1 -1
  188. package/src/internal/durable-effect-protocol.ts +1 -1
  189. package/src/internal/durable-saga-protocol.ts +1 -1
  190. package/src/internal/durable-shared.ts +157 -0
  191. package/src/internal/durable-types.ts +194 -0
  192. package/src/internal/route-compiler.ts +234 -0
  193. package/src/internal/route-execution.ts +53 -96
  194. package/src/internal/route-lanes.ts +221 -0
  195. package/src/internal/route-program.ts +404 -0
  196. package/src/response-observer.ts +64 -0
  197. package/src/security/baseline.ts +172 -0
  198. package/src/server/bare-error-lane.ts +77 -0
  199. package/src/server/body-lane.ts +203 -0
  200. package/src/server/body.ts +8 -0
  201. package/src/server/bridge-markers.ts +24 -0
  202. package/src/server/context.ts +6 -1
  203. package/src/server/contract.ts +70 -20
  204. package/src/server/cookies.ts +16 -2
  205. package/src/server/header-case.ts +3 -1
  206. package/src/server/http.ts +53 -3
  207. package/src/server/install.ts +14 -0
  208. package/src/server/node-outcome-hook.ts +2 -1
  209. package/src/server/node-outcome.ts +44 -3
  210. package/src/server/plugin.ts +11 -5
  211. package/src/server/query.ts +10 -4
  212. package/src/server/registry.ts +71 -16
  213. package/src/server/request-context.ts +13 -216
  214. package/src/server/respond.ts +71 -3
  215. package/src/server/response-contract-lane.ts +6 -2
  216. package/src/server/response-observer-runtime.ts +135 -0
  217. package/src/server/runtime-core.ts +124 -1
  218. package/src/server/server-types.ts +6 -1
  219. package/src/server/server.ts +1446 -1485
  220. package/src/server/validation.ts +19 -0
  221. package/src/server/websocket.ts +127 -17
  222. package/src/server/ws-bun.ts +67 -15
  223. package/src/server/ws-hook.ts +3 -2
  224. package/src/server.ts +8 -2
  225. package/src/single-copy-register.ts +24 -0
  226. package/src/single-copy.ts +526 -0
package/dist/errors.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare class FrameworkError extends Error {
8
8
  constructor(code: string, message: string);
9
9
  }
10
10
  /** Stable codes for boot-time (L2) route configuration failures. */
11
- export type RouteConfigErrorCode = "DUPLICATE_ROUTE" | "DUPLICATE_PARAM" | "PARAM_NAME_CONFLICT" | "INVALID_PATH" | "INVALID_PARAM_NAME" | "WILDCARD_NOT_LAST" | "INVALID_METHOD" | "INVALID_ASSURANCE" | "INVALID_IDEMPOTENCY" | "INVALID_BODY_LIMIT";
11
+ export type RouteConfigErrorCode = "DUPLICATE_ROUTE" | "DUPLICATE_PARAM" | "PARAM_NAME_CONFLICT" | "INVALID_PATH" | "INVALID_PARAM_NAME" | "WILDCARD_NOT_LAST" | "INVALID_METHOD" | "INVALID_ASSURANCE" | "INVALID_IDEMPOTENCY" | "INVALID_WS_SEND_VALIDATION" | "INVALID_BODY_LIMIT";
12
12
  /**
13
13
  * Thrown at route registration when a route is misconfigured. This is the
14
14
  * boot-time rejection layer: loud and early,
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAET,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,oBAAoB,CAAA;AAExB;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAElD,SAAiB,IAAI,EAAE,oBAAoB,CAAA;gBAE/B,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAIxD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;gBAET,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAED,oEAAoE;AACpE,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,iBAAiB,GACjB,qBAAqB,GACrB,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,4BAA4B,GAC5B,oBAAoB,CAAA;AAExB;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,cAAc;IAElD,SAAiB,IAAI,EAAE,oBAAoB,CAAA;gBAE/B,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAIxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAQ;IAErB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAeD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAIlD,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAQ;IAErB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAgBD;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,cAAc;IAIlD,YAAY,IAA0B,EAAE,OAAe;QACrD,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAA;IAChC,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -3,13 +3,34 @@
3
3
  *
4
4
  * Nifra 2.0 keeps the package root intentionally lean. Optional systems live at documented
5
5
  * subpaths so importing the root cannot activate unrelated runtimes.
6
+ *
7
+ * Every named export below is re-exported in a SINGLE hop from the module that defines it -
8
+ * deliberately not `export * from "./server.js"`. A root binding that travels through a chained
9
+ * barrel can be dropped by a bundler that rewrites module loads (the single-copy plugin does
10
+ * exactly that), which surfaces as a runtime `ReferenceError` only in bundled output. The list
11
+ * must stay identical to `./server.ts`; `server-entry.test.ts` enforces the parity.
6
12
  */
7
13
  /**
8
14
  * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't
9
15
  * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
10
16
  * `check:publish` asserts it equals `@nifrajs/core`'s package version.
11
17
  */
12
- export declare const VERSION: "2.14.1";
18
+ export declare const VERSION: "3.2.0";
13
19
  export type Version = typeof VERSION;
14
- export * from "./server.js";
20
+ export { FrameworkError, RouteConfigError, type RouteConfigErrorCode } from "./errors.js";
21
+ export { FRAMEWORK_NAME, type FrameworkName } from "./internal/brand.js";
22
+ export { isSameOriginRequest } from "./internal/same-origin.js";
23
+ export { METHODS, type Method, Router, type RouterMatch } from "./router/router.js";
24
+ export type { InferInput, InferOutput, StandardIssue, StandardResult, StandardSchemaV1, StandardTypes, ValidationOutcome, } from "./schema/standard.js";
25
+ export type { Context, Params, Platform, Prettify, ResponseControls, RouteSchema, } from "./server/context.js";
26
+ export { type CookieOptions, type CookieSecret, cookieNamePrefix, parseCookies, serializeCookie, signValue, unsignValue, } from "./server/cookies.js";
27
+ export { type DurableObjectNamespaceLike, type ExecutionContext, type ScheduledController, type ScheduledHandler, toFetchHandler, } from "./server/edge.js";
28
+ export { isSameOriginPath, pathnameOf, type UrlParts, urlPartsOf } from "./server/http.js";
29
+ export { commonSecretPatterns, jsonLogger, type LogFields, type Logger, type RedactOptions, redactLogFields, silentLogger, } from "./server/logger.js";
30
+ export { type FetchApp, type LambdaEvent, type LambdaHandler, type LambdaResponse, type LambdaV1Event, type LambdaV2Event, type NetlifyEvent, type NetlifyHandler, type PlatformResponse, toLambdaHandler, toNetlifyHandler, toVercelHandler, type VercelHandler, } from "./server/platform-adapters.js";
31
+ export type { Registry, ResponseMapFor, RouteInfo, RouteInfoFor } from "./server/registry.js";
32
+ export { type PlainRender, type ResponseResult, type StatusResponse, status, } from "./server/runtime-core.js";
33
+ export { type AdmissionController, type AdmissionDecision, type AnyServer, type ContextPlugin, type DefinePluginResult, defineContextPlugin, defineIdentityPlugin, definePlugin, defineRouterPlugin, type Handler, type IdentityPlugin, type McpPromptDescriptor, type McpResourceDescriptor, type Middleware, type NifraFeatureVersion, type NifraPlugin, type NodeRequestContext, type NodeRequestHook, type NodeResponseContext, type NodeResponseHook, type NodeServeOutcome, type OnRequestResult, type PluginTypeCollapsed, type PromptArgument, type PromptMessage, type ResponseBodyHook, type ResponseBodyReplacement, type ResponseFinalization, type ResponseHeadersHook, type ResponseHeadersView, type RouteDescriptor, type RunningServer, Server, type ServerOptions, server, type ToolAnnotations, } from "./server/server.js";
34
+ export type { SSEContext, SSEInit, SSEMessage, SSEStream, TypedSSEStream, } from "./server/sse.js";
35
+ export type { NifraWebSocket, StandardWebSocket, WebSocketContext, WebSocketData, WebSocketHandler, WebSocketUpgradeOutcome, } from "./server/websocket.js";
15
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAG,QAAiB,CAAA;AAExC,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAA;AAEpC,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,12 +3,28 @@
3
3
  *
4
4
  * Nifra 2.0 keeps the package root intentionally lean. Optional systems live at documented
5
5
  * subpaths so importing the root cannot activate unrelated runtimes.
6
+ *
7
+ * Every named export below is re-exported in a SINGLE hop from the module that defines it -
8
+ * deliberately not `export * from "./server.ts"`. A root binding that travels through a chained
9
+ * barrel can be dropped by a bundler that rewrites module loads (the single-copy plugin does
10
+ * exactly that), which surfaces as a runtime `ReferenceError` only in bundled output. The list
11
+ * must stay identical to `./server.ts`; `server-entry.test.ts` enforces the parity.
6
12
  */
7
13
  /**
8
14
  * Current package version. A hardcoded literal on purpose - core runs on the edge (no fs), so it can't
9
15
  * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
10
16
  * `check:publish` asserts it equals `@nifrajs/core`'s package version.
11
17
  */
12
- export const VERSION = "2.14.1";
13
- export * from "./server.js";
18
+ export const VERSION = "3.2.0";
19
+ export { FrameworkError, RouteConfigError } from "./errors.js";
20
+ export { FRAMEWORK_NAME } from "./internal/brand.js";
21
+ export { isSameOriginRequest } from "./internal/same-origin.js";
22
+ export { METHODS, Router } from "./router/router.js";
23
+ export { cookieNamePrefix, parseCookies, serializeCookie, signValue, unsignValue, } from "./server/cookies.js";
24
+ export { toFetchHandler, } from "./server/edge.js";
25
+ export { isSameOriginPath, pathnameOf, urlPartsOf } from "./server/http.js";
26
+ export { commonSecretPatterns, jsonLogger, redactLogFields, silentLogger, } from "./server/logger.js";
27
+ export { toLambdaHandler, toNetlifyHandler, toVercelHandler, } from "./server/platform-adapters.js";
28
+ export { status, } from "./server/runtime-core.js";
29
+ export { defineContextPlugin, defineIdentityPlugin, definePlugin, defineRouterPlugin, Server, server, } from "./server/server.js";
14
30
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAiB,CAAA;AAIxC,cAAc,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAgB,CAAA;AAIvC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA6B,MAAM,aAAa,CAAA;AACzF,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,OAAO,EAAe,MAAM,EAAoB,MAAM,oBAAoB,CAAA;AAkBnF,OAAO,EAGL,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAKL,cAAc,GACf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAiB,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC1F,OAAO,EACL,oBAAoB,EACpB,UAAU,EAIV,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAUL,eAAe,EACf,gBAAgB,EAChB,eAAe,GAEhB,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAIL,MAAM,GACP,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAML,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAwBlB,MAAM,EAEN,MAAM,GAEP,MAAM,oBAAoB,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { ApprovalConsumeResult, ApprovalRecord, ApprovalStore } from "../durable-execution.js";
1
+ import type { ApprovalConsumeResult, ApprovalRecord, ApprovalStore } from "./durable-types.js";
2
2
  export type DurableApprovalDecisionInput = Parameters<ApprovalStore["decide"]>[0];
3
3
  export type DurableApprovalConsumeInput = Parameters<ApprovalStore["consume"]>[0];
4
4
  export interface DurableApprovalConsumeTransition {
@@ -1 +1 @@
1
- {"version":3,"file":"durable-approval-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-approval-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAGnG,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CACJ,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,4BAA4B,GAClC,cAAc,GAAG,SAAS,CAAA;IAC7B,OAAO,CACL,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,2BAA2B,GACjC,gCAAgC,CAAA;CACpC;AAoED,eAAO,MAAM,uBAAuB,EAAE,uBAGpC,CAAA"}
1
+ {"version":3,"file":"durable-approval-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-approval-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG9F,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACjF,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CACJ,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,4BAA4B,GAClC,cAAc,GAAG,SAAS,CAAA;IAC7B,OAAO,CACL,OAAO,EAAE,cAAc,GAAG,SAAS,EACnC,KAAK,EAAE,2BAA2B,GACjC,gCAAgC,CAAA;CACpC;AAoED,eAAO,MAAM,uBAAuB,EAAE,uBAGpC,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { DurableEffectRecord, DurableEffectState } from "../durable-execution.js";
1
+ import type { DurableEffectRecord, DurableEffectState } from "./durable-types.js";
2
2
  export interface DurableEffectTransitionInput {
3
3
  readonly effectId: string;
4
4
  readonly version: number;
@@ -1 +1 @@
1
- {"version":3,"file":"durable-effect-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-effect-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAEtF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CACR,OAAO,EAAE,mBAAmB,GAAG,SAAS,EACxC,KAAK,EAAE,4BAA4B,GAClC,mBAAmB,GAAG,SAAS,CAAA;CACnC;AAkBD,eAAO,MAAM,qBAAqB,EAAE,qBAElC,CAAA"}
1
+ {"version":3,"file":"durable-effect-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-effect-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEjF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAA;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CACR,OAAO,EAAE,mBAAmB,GAAG,SAAS,EACxC,KAAK,EAAE,4BAA4B,GAClC,mBAAmB,GAAG,SAAS,CAAA;CACnC;AAkBD,eAAO,MAAM,qBAAqB,EAAE,qBAElC,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { SagaRecord, SagaState, SagaStepRecord, SagaStore } from "../durable-execution.js";
1
+ import type { SagaRecord, SagaState, SagaStepRecord, SagaStore } from "./durable-types.js";
2
2
  export type DurableSagaTransitionInput = Parameters<SagaStore["compareAndSet"]>[0];
3
3
  export interface DurableSagaProtocol {
4
4
  transition(current: SagaRecord | undefined, input: DurableSagaTransitionInput): SagaRecord | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"durable-saga-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-saga-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAE/F,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAElF,MAAM,WAAW,mBAAmB;IAClC,UAAU,CACR,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,KAAK,EAAE,0BAA0B,GAChC,UAAU,GAAG,SAAS,CAAA;IACzB,QAAQ,CACN,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;CAC/B;AAmCD,eAAO,MAAM,mBAAmB,EAAE,mBAGhC,CAAA"}
1
+ {"version":3,"file":"durable-saga-protocol.d.ts","sourceRoot":"","sources":["../../src/internal/durable-saga-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE1F,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAElF,MAAM,WAAW,mBAAmB;IAClC,UAAU,CACR,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,KAAK,EAAE,0BAA0B,GAChC,UAAU,GAAG,SAAS,CAAA;IACzB,QAAQ,CACN,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;CAC/B;AAmCD,eAAO,MAAM,mBAAmB,EAAE,mBAGhC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import type { ReconciliationScanOptions, ReconciliationScanPage } from "./durable-types.js";
2
+ export declare const TOKEN: RegExp;
3
+ export declare const ERROR_CODE: RegExp;
4
+ export declare const encoder: TextEncoder;
5
+ export declare function assertToken(value: string, label: string, maxLength?: number): void;
6
+ export declare function assertPositiveMs(value: number, label: string): void;
7
+ export declare function assertTimestamp(value: number, label: string): void;
8
+ export declare function readClock(clock: () => number, label: string): number;
9
+ export declare function addDuration(timestamp: number, duration: number, label: string): number;
10
+ export declare function bytesToBase64Url(bytes: Uint8Array): string;
11
+ export declare function sha256(value: string): Promise<string>;
12
+ export declare function cloneValue<T>(value: T): T;
13
+ export declare const DEFAULT_RECONCILIATION_LIMIT = 100;
14
+ export declare const MAX_RECONCILIATION_LIMIT = 1000;
15
+ export declare function reconciliationLimit(value?: number): number;
16
+ export declare function cursorOffset(cursor?: string): number;
17
+ export declare function memoryScan<Record extends {
18
+ readonly state: State;
19
+ readonly updatedAt: number;
20
+ }, State extends string>(source: Iterable<Record>, input: ReconciliationScanOptions<State>): ReconciliationScanPage<Record>;
21
+ export declare function bucketAdd<State extends string>(byState: Map<State, Set<string>>, state: State, id: string): void;
22
+ export declare function bucketMove<State extends string>(byState: Map<State, Set<string>>, from: State, to: State, id: string): void;
23
+ export declare function indexedScan<Record extends {
24
+ readonly updatedAt: number;
25
+ }, State extends string>(byState: Map<State, Set<string>>, resolve: (id: string) => Record | undefined, input: ReconciliationScanOptions<State>): ReconciliationScanPage<Record>;
26
+ //# sourceMappingURL=durable-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-shared.d.ts","sourceRoot":"","sources":["../../src/internal/durable-shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAE3F,eAAO,MAAM,KAAK,QAAa,CAAA;AAC/B,eAAO,MAAM,UAAU,QAA6B,CAAA;AACpD,eAAO,MAAM,OAAO,aAAoB,CAAA;AAExC,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,IAAI,CAS/E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGlE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAItF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAI1D;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAI3D;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEzC;AAED,eAAO,MAAM,4BAA4B,MAAM,CAAA;AAC/C,eAAO,MAAM,wBAAwB,OAAQ,CAAA;AAE7C,wBAAgB,mBAAmB,CAAC,KAAK,SAA+B,GAAG,MAAM,CAKhF;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,UAAU,CACxB,MAAM,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EACpE,KAAK,SAAS,MAAM,EAEpB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,GACtC,sBAAsB,CAAC,MAAM,CAAC,CAqBhC;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAChC,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,GACT,IAAI,CAON;AAED,wBAAgB,UAAU,CAAC,KAAK,SAAS,MAAM,EAC7C,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAChC,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,KAAK,EACT,EAAE,EAAE,MAAM,GACT,IAAI,CAIN;AAED,wBAAgB,WAAW,CAAC,MAAM,SAAS;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,SAAS,MAAM,EAC7F,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAChC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC3C,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,GACtC,sBAAsB,CAAC,MAAM,CAAC,CA0BhC"}
@@ -0,0 +1,131 @@
1
+ export const TOKEN = /^[!-~]+$/;
2
+ export const ERROR_CODE = /^[a-z][a-z0-9_.-]{0,63}$/;
3
+ export const encoder = new TextEncoder();
4
+ export function assertToken(value, label, maxLength = 255) {
5
+ if (typeof value !== "string" ||
6
+ value.length === 0 ||
7
+ value.length > maxLength ||
8
+ !TOKEN.test(value)) {
9
+ throw new TypeError(`${label} must be a bounded printable token`);
10
+ }
11
+ }
12
+ export function assertPositiveMs(value, label) {
13
+ if (!Number.isSafeInteger(value) || value < 1)
14
+ throw new RangeError(`${label} must be a positive safe integer`);
15
+ }
16
+ export function assertTimestamp(value, label) {
17
+ if (!Number.isSafeInteger(value) || value < 0)
18
+ throw new RangeError(`${label} must be a non-negative safe integer timestamp`);
19
+ }
20
+ export function readClock(clock, label) {
21
+ const value = clock();
22
+ assertTimestamp(value, label);
23
+ return value;
24
+ }
25
+ export function addDuration(timestamp, duration, label) {
26
+ const result = timestamp + duration;
27
+ assertTimestamp(result, label);
28
+ return result;
29
+ }
30
+ export function bytesToBase64Url(bytes) {
31
+ let binary = "";
32
+ for (const byte of bytes)
33
+ binary += String.fromCharCode(byte);
34
+ return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/u, "");
35
+ }
36
+ export async function sha256(value) {
37
+ return bytesToBase64Url(new Uint8Array(await crypto.subtle.digest("SHA-256", encoder.encode(value))));
38
+ }
39
+ export function cloneValue(value) {
40
+ return structuredClone(value);
41
+ }
42
+ export const DEFAULT_RECONCILIATION_LIMIT = 100;
43
+ export const MAX_RECONCILIATION_LIMIT = 1_000;
44
+ export function reconciliationLimit(value = DEFAULT_RECONCILIATION_LIMIT) {
45
+ if (!Number.isSafeInteger(value) || value < 1 || value > MAX_RECONCILIATION_LIMIT) {
46
+ throw new RangeError(`reconciliation limit must be between 1 and ${MAX_RECONCILIATION_LIMIT}`);
47
+ }
48
+ return value;
49
+ }
50
+ export function cursorOffset(cursor) {
51
+ if (cursor === undefined)
52
+ return 0;
53
+ if (!/^(?:0|[1-9][0-9]*)$/u.test(cursor))
54
+ throw new TypeError("invalid reconciliation cursor");
55
+ const offset = Number(cursor);
56
+ if (!Number.isSafeInteger(offset))
57
+ throw new TypeError("invalid reconciliation cursor");
58
+ return offset;
59
+ }
60
+ export function memoryScan(source, input) {
61
+ const states = new Set(input.states);
62
+ const offset = cursorOffset(input.cursor);
63
+ const end = offset + input.limit;
64
+ const records = [];
65
+ let seen = 0;
66
+ let more = false;
67
+ for (const record of source) {
68
+ if (!states.has(record.state))
69
+ continue;
70
+ if (input.updatedBefore !== undefined && record.updatedAt > input.updatedBefore)
71
+ continue;
72
+ if (seen >= end) {
73
+ more = true;
74
+ break;
75
+ }
76
+ if (seen >= offset)
77
+ records.push(cloneValue(record));
78
+ seen++;
79
+ }
80
+ return Object.freeze({
81
+ records: Object.freeze(records),
82
+ ...(more ? { cursor: String(offset + records.length) } : {}),
83
+ });
84
+ }
85
+ export function bucketAdd(byState, state, id) {
86
+ let bucket = byState.get(state);
87
+ if (bucket === undefined) {
88
+ bucket = new Set();
89
+ byState.set(state, bucket);
90
+ }
91
+ bucket.add(id);
92
+ }
93
+ export function bucketMove(byState, from, to, id) {
94
+ if (from === to)
95
+ return;
96
+ byState.get(from)?.delete(id);
97
+ bucketAdd(byState, to, id);
98
+ }
99
+ export function indexedScan(byState, resolve, input) {
100
+ const offset = cursorOffset(input.cursor);
101
+ const end = offset + input.limit;
102
+ const records = [];
103
+ let seen = 0;
104
+ let more = false;
105
+ for (const state of new Set(input.states)) {
106
+ if (more)
107
+ break;
108
+ const bucket = byState.get(state);
109
+ if (bucket === undefined)
110
+ continue;
111
+ for (const id of bucket) {
112
+ const record = resolve(id);
113
+ if (record === undefined)
114
+ continue;
115
+ if (input.updatedBefore !== undefined && record.updatedAt > input.updatedBefore)
116
+ continue;
117
+ if (seen >= end) {
118
+ more = true;
119
+ break;
120
+ }
121
+ if (seen >= offset)
122
+ records.push(cloneValue(record));
123
+ seen++;
124
+ }
125
+ }
126
+ return Object.freeze({
127
+ records: Object.freeze(records),
128
+ ...(more ? { cursor: String(offset + records.length) } : {}),
129
+ });
130
+ }
131
+ //# sourceMappingURL=durable-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-shared.js","sourceRoot":"","sources":["../../src/internal/durable-shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /** Type-only records and transition contracts shared by durable execution domains. */
2
+ export type DurableEffectState = "admission" | "executing" | "committed" | "failed" | "unknown";
3
+ export interface ReconciliationScanOptions<State extends string> {
4
+ readonly states: readonly State[];
5
+ readonly updatedBefore?: number;
6
+ readonly cursor?: string;
7
+ readonly limit: number;
8
+ }
9
+ export interface ReconciliationScanPage<Record> {
10
+ readonly records: readonly Record[];
11
+ readonly cursor?: string;
12
+ }
13
+ export interface ReconciliationPage<Finding> {
14
+ readonly findings: readonly Finding[];
15
+ readonly cursor?: string;
16
+ }
17
+ export interface DurableEffectRecord {
18
+ readonly effectId: string;
19
+ readonly capability: string;
20
+ readonly target?: string;
21
+ readonly digest?: string;
22
+ readonly tenantId?: string;
23
+ readonly principalId?: string;
24
+ readonly state: DurableEffectState;
25
+ readonly createdAt: number;
26
+ readonly updatedAt: number;
27
+ readonly errorCode?: string;
28
+ readonly version: number;
29
+ }
30
+ export interface DurableEffectStore {
31
+ readonly durability?: "memory" | "durable";
32
+ create(record: DurableEffectRecord): boolean | Promise<boolean>;
33
+ get(effectId: string): DurableEffectRecord | undefined | Promise<DurableEffectRecord | undefined>;
34
+ /** Atomic compare-and-set; exactly one caller may advance the supplied `version` and `from` state. */
35
+ transition(input: {
36
+ readonly effectId: string;
37
+ readonly version: number;
38
+ readonly from: DurableEffectState;
39
+ readonly to: DurableEffectState;
40
+ readonly updatedAt: number;
41
+ readonly errorCode?: string;
42
+ }): boolean | Promise<boolean>;
43
+ /** Bounded operational scan. Transition-only stores do not need to implement reconciliation. */
44
+ scan?(input: ReconciliationScanOptions<DurableEffectState>): ReconciliationScanPage<DurableEffectRecord> | Promise<ReconciliationScanPage<DurableEffectRecord>>;
45
+ /** @deprecated Compatibility fallback; production reconciliation should implement `scan`. */
46
+ list?(): readonly DurableEffectRecord[] | Promise<readonly DurableEffectRecord[]>;
47
+ }
48
+ export type ApprovalState = "pending" | "approved" | "denied" | "consumed" | "expired";
49
+ export interface ApprovalRecord {
50
+ readonly approvalId: string;
51
+ readonly effectId: string;
52
+ readonly capability: string;
53
+ readonly target?: string;
54
+ readonly digest?: string;
55
+ readonly tenantId: string;
56
+ readonly principalId: string;
57
+ readonly tokenHash: string;
58
+ readonly state: ApprovalState;
59
+ readonly createdAt: number;
60
+ readonly expiresAt: number;
61
+ readonly updatedAt: number;
62
+ readonly decidedBy?: string;
63
+ readonly version: number;
64
+ }
65
+ export type ApprovalConsumeResult = {
66
+ readonly state: "consumed";
67
+ } | {
68
+ readonly state: "missing" | "pending" | "denied" | "expired" | "replay" | "binding" | "token";
69
+ };
70
+ export interface ApprovalStore {
71
+ readonly durability?: "memory" | "durable";
72
+ create(record: ApprovalRecord): boolean | Promise<boolean>;
73
+ get(approvalId: string): ApprovalRecord | undefined | Promise<ApprovalRecord | undefined>;
74
+ decide(input: {
75
+ readonly approvalId: string;
76
+ readonly tenantId: string;
77
+ readonly decision: "approved" | "denied";
78
+ readonly decidedBy: string;
79
+ readonly now: number;
80
+ }): boolean | Promise<boolean>;
81
+ /**
82
+ * Atomically validate binding/token/state and change `approved` to `consumed`. Two concurrent
83
+ * callers with one token must yield exactly one `consumed` and one `replay` result.
84
+ */
85
+ consume(input: {
86
+ readonly approvalId: string;
87
+ readonly tenantId: string;
88
+ readonly principalId: string;
89
+ readonly capability: string;
90
+ readonly target?: string;
91
+ readonly digest?: string;
92
+ readonly tokenHash: string;
93
+ readonly now: number;
94
+ }): ApprovalConsumeResult | Promise<ApprovalConsumeResult>;
95
+ }
96
+ export type SagaState = "running" | "compensating" | "completed" | "compensated" | "manual-review";
97
+ export type SagaStepState = "executing" | "committed" | "failed" | "ambiguous" | "compensating" | "compensation-failed" | "compensated";
98
+ export interface SagaStepRecord {
99
+ readonly name: string;
100
+ readonly effectId: string;
101
+ readonly compensationEffectId: string;
102
+ readonly state: SagaStepState;
103
+ readonly compensationArgs: unknown;
104
+ readonly result?: unknown;
105
+ readonly attempts: number;
106
+ readonly nextAttemptAt?: number;
107
+ readonly errorCode?: string;
108
+ }
109
+ export interface SagaRecord {
110
+ readonly sagaId: string;
111
+ readonly definition: string;
112
+ readonly state: SagaState;
113
+ readonly input: unknown;
114
+ readonly steps: readonly SagaStepRecord[];
115
+ readonly createdAt: number;
116
+ readonly updatedAt: number;
117
+ readonly version: number;
118
+ }
119
+ export interface SagaStore {
120
+ readonly durability?: "memory" | "durable";
121
+ create(record: SagaRecord): boolean | Promise<boolean>;
122
+ get(sagaId: string): SagaRecord | undefined | Promise<SagaRecord | undefined>;
123
+ /** Atomic version compare-and-set; this is the saga engine's crash/concurrency boundary. */
124
+ compareAndSet(input: {
125
+ readonly sagaId: string;
126
+ readonly version: number;
127
+ readonly record: SagaRecord;
128
+ }): boolean | Promise<boolean>;
129
+ /** Bounded operational scan. Transition-only stores do not need to implement reconciliation. */
130
+ scan?(input: ReconciliationScanOptions<SagaState>): ReconciliationScanPage<SagaRecord> | Promise<ReconciliationScanPage<SagaRecord>>;
131
+ /** @deprecated Compatibility fallback; production reconciliation should implement `scan`. */
132
+ list?(): readonly SagaRecord[] | Promise<readonly SagaRecord[]>;
133
+ }
134
+ export interface SagaStepExecutionContext {
135
+ readonly effectId: string;
136
+ readonly signal: AbortSignal;
137
+ }
138
+ export interface SagaCompensationContext {
139
+ readonly effectId: string;
140
+ readonly sagaId: string;
141
+ readonly attempt: number;
142
+ readonly signal: AbortSignal;
143
+ }
144
+ export interface SagaRunContext<C extends Record<string, unknown>> {
145
+ step<K extends keyof C & string, T>(name: K, compensationArgs: C[K], execute: (context: SagaStepExecutionContext) => T | PromiseLike<T>): Promise<T>;
146
+ }
147
+ export interface SagaDefinition<I, C extends Record<string, unknown>> {
148
+ readonly name: string;
149
+ readonly capability?: string;
150
+ readonly run: (context: SagaRunContext<C>, input: I) => void | PromiseLike<void>;
151
+ readonly compensators: {
152
+ readonly [K in keyof C]: (args: C[K], context: SagaCompensationContext) => void | PromiseLike<void>;
153
+ };
154
+ readonly retry?: {
155
+ readonly maxAttempts?: number;
156
+ readonly backoffMs?: (attempt: number) => number;
157
+ };
158
+ }
159
+ //# sourceMappingURL=durable-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-types.d.ts","sourceRoot":"","sources":["../../src/internal/durable-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=durable-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-types.js","sourceRoot":"","sources":["../../src/internal/durable-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Registration-time route compilation.
3
+ *
4
+ * This module owns the policy decisions that turn a route declaration into the immutable facts the
5
+ * execution-plan builder and the route catalog consume. It deliberately runs only from `Server.register`
6
+ * and `Server.registerBatch`; no function here is reachable from the request path.
7
+ *
8
+ * The public Server remains the fluent registration surface. This module is the deep implementation seam
9
+ * behind that surface: body limits, capability and assurance evidence, optional runtimes, decorations, and
10
+ * lane selection are resolved once, together, so adding a new route policy does not require editing the
11
+ * kernel's dispatch code.
12
+ */
13
+ import type { EffectLifecycleObserver } from "../effect-lifecycle.js";
14
+ import { type CompiledRoutePattern } from "../router/pattern.js";
15
+ import type { Method } from "../router/router.js";
16
+ import type { StandardSchemaV1 } from "../schema/standard.js";
17
+ import type { RouteSchema } from "../server/context.js";
18
+ import type { IdempotencyRuntime, ResolvedIdempotency } from "../server/idempotency-lane.js";
19
+ import type { EffectLedgerRuntime, ResolvedEffectLedger } from "../server/ledger-lane.js";
20
+ import type { ResponseContractRuntime } from "../server/response-contract-lane.js";
21
+ import { type CapabilityUseEvent, type RegisteredCapabilityInterceptor } from "./capability-runtime.js";
22
+ import { type AssuranceDeclaration } from "./route-assurance.js";
23
+ import type { RawAfterHandle, RawAround, RawBeforeHandle, RawDerive, RawErrorHandler } from "./route-execution.js";
24
+ import { type RouteLaneSelection } from "./route-lanes.js";
25
+ export interface RouteCompilerContext {
26
+ readonly maxBodyBytes: number;
27
+ readonly activeAssurance: readonly AssuranceDeclaration[];
28
+ readonly globalAssurance: readonly AssuranceDeclaration[];
29
+ readonly decorations: Record<string, unknown>;
30
+ readonly onCapabilityUse: ((event: CapabilityUseEvent) => void) | undefined;
31
+ readonly capabilityInterceptors: readonly RegisteredCapabilityInterceptor[];
32
+ readonly capabilityObservers: readonly EffectLifecycleObserver[];
33
+ readonly effectLedgerRuntime: EffectLedgerRuntime | undefined;
34
+ readonly idempotencyRuntime: IdempotencyRuntime | undefined;
35
+ readonly responseContractRuntime: ResponseContractRuntime | undefined;
36
+ readonly derives: readonly RawDerive[];
37
+ readonly beforeHandleHooks: readonly RawBeforeHandle[];
38
+ readonly afterHandleHooks: readonly RawAfterHandle[];
39
+ readonly onErrorHooks: readonly RawErrorHandler[];
40
+ readonly aroundHooks: readonly RawAround[];
41
+ readonly defaultOnValidationError: RouteSchema["onValidationError"] | undefined;
42
+ }
43
+ export interface CompiledRouteOptions {
44
+ readonly pattern: CompiledRoutePattern;
45
+ readonly bodyLimit: number | undefined;
46
+ readonly capabilities: readonly string[];
47
+ readonly handlerAssurance: readonly AssuranceDeclaration[];
48
+ readonly routeDecorations: Record<PropertyKey, unknown>;
49
+ readonly hasDecorations: boolean;
50
+ readonly idempotent: ResolvedIdempotency | undefined;
51
+ readonly ledgered: ResolvedEffectLedger | undefined;
52
+ readonly responseContract: {
53
+ readonly runtime: ResponseContractRuntime;
54
+ readonly schema: StandardSchemaV1;
55
+ } | undefined;
56
+ readonly lanes: RouteLaneSelection;
57
+ readonly routeAssurance: readonly AssuranceDeclaration[];
58
+ }
59
+ /** Resolve all registration-time policy and lane facts for one route. */
60
+ export declare function compileRouteOptions(context: RouteCompilerContext, method: Method, path: string, schema: RouteSchema | undefined, handler: (context: never) => unknown): CompiledRouteOptions;
61
+ //# sourceMappingURL=route-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-compiler.d.ts","sourceRoot":"","sources":["../../src/internal/route-compiler.ts"],"names":[],"mappings":"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"}