@nifrajs/core 3.1.0 → 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 (146) hide show
  1. package/README.md +21 -0
  2. package/dist/durable-adapters.d.ts.map +1 -1
  3. package/dist/durable-adapters.js +26 -3
  4. package/dist/durable-adapters.js.map +1 -1
  5. package/dist/durable-approval.d.ts +56 -0
  6. package/dist/durable-approval.d.ts.map +1 -0
  7. package/dist/durable-approval.js +233 -0
  8. package/dist/durable-approval.js.map +1 -0
  9. package/dist/durable-effect.d.ts +42 -0
  10. package/dist/durable-effect.d.ts.map +1 -0
  11. package/dist/durable-effect.js +234 -0
  12. package/dist/durable-effect.js.map +1 -0
  13. package/dist/durable-execution.d.ts +8 -346
  14. package/dist/durable-execution.d.ts.map +1 -1
  15. package/dist/durable-execution.js +7 -1150
  16. package/dist/durable-execution.js.map +1 -1
  17. package/dist/durable-saga.d.ts +94 -0
  18. package/dist/durable-saga.d.ts.map +1 -0
  19. package/dist/durable-saga.js +550 -0
  20. package/dist/durable-saga.js.map +1 -0
  21. package/dist/edge-kit.d.ts +2 -2
  22. package/dist/edge-kit.d.ts.map +1 -1
  23. package/dist/edge-kit.js +2 -2
  24. package/dist/edge-kit.js.map +1 -1
  25. package/dist/index.d.ts +23 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +18 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal/durable-approval-protocol.d.ts +1 -1
  30. package/dist/internal/durable-approval-protocol.d.ts.map +1 -1
  31. package/dist/internal/durable-effect-protocol.d.ts +1 -1
  32. package/dist/internal/durable-effect-protocol.d.ts.map +1 -1
  33. package/dist/internal/durable-saga-protocol.d.ts +1 -1
  34. package/dist/internal/durable-saga-protocol.d.ts.map +1 -1
  35. package/dist/internal/durable-shared.d.ts +26 -0
  36. package/dist/internal/durable-shared.d.ts.map +1 -0
  37. package/dist/internal/durable-shared.js +131 -0
  38. package/dist/internal/durable-shared.js.map +1 -0
  39. package/dist/internal/durable-types.d.ts +159 -0
  40. package/dist/internal/durable-types.d.ts.map +1 -0
  41. package/dist/internal/durable-types.js +2 -0
  42. package/dist/internal/durable-types.js.map +1 -0
  43. package/dist/internal/route-compiler.d.ts +61 -0
  44. package/dist/internal/route-compiler.d.ts.map +1 -0
  45. package/dist/internal/route-compiler.js +121 -0
  46. package/dist/internal/route-compiler.js.map +1 -0
  47. package/dist/internal/route-execution.d.ts +6 -4
  48. package/dist/internal/route-execution.d.ts.map +1 -1
  49. package/dist/internal/route-execution.js +2 -17
  50. package/dist/internal/route-execution.js.map +1 -1
  51. package/dist/internal/route-lanes.d.ts +35 -0
  52. package/dist/internal/route-lanes.d.ts.map +1 -0
  53. package/dist/internal/route-lanes.js +150 -0
  54. package/dist/internal/route-lanes.js.map +1 -0
  55. package/dist/internal/route-program.d.ts +67 -0
  56. package/dist/internal/route-program.d.ts.map +1 -0
  57. package/dist/internal/route-program.js +199 -0
  58. package/dist/internal/route-program.js.map +1 -0
  59. package/dist/server/bare-error-lane.d.ts +1 -1
  60. package/dist/server/bare-error-lane.d.ts.map +1 -1
  61. package/dist/server/bare-error-lane.js +3 -3
  62. package/dist/server/bare-error-lane.js.map +1 -1
  63. package/dist/server/body-lane.d.ts +13 -0
  64. package/dist/server/body-lane.d.ts.map +1 -0
  65. package/dist/server/body-lane.js +134 -0
  66. package/dist/server/body-lane.js.map +1 -0
  67. package/dist/server/contract.d.ts +40 -14
  68. package/dist/server/contract.d.ts.map +1 -1
  69. package/dist/server/contract.js +7 -0
  70. package/dist/server/contract.js.map +1 -1
  71. package/dist/server/cookies.d.ts.map +1 -1
  72. package/dist/server/cookies.js +16 -2
  73. package/dist/server/cookies.js.map +1 -1
  74. package/dist/server/plugin.d.ts +2 -2
  75. package/dist/server/plugin.d.ts.map +1 -1
  76. package/dist/server/plugin.js +6 -1
  77. package/dist/server/plugin.js.map +1 -1
  78. package/dist/server/registry.d.ts +40 -12
  79. package/dist/server/registry.d.ts.map +1 -1
  80. package/dist/server/request-context.d.ts +4 -28
  81. package/dist/server/request-context.d.ts.map +1 -1
  82. package/dist/server/request-context.js +10 -185
  83. package/dist/server/request-context.js.map +1 -1
  84. package/dist/server/respond.d.ts.map +1 -1
  85. package/dist/server/respond.js +39 -2
  86. package/dist/server/respond.js.map +1 -1
  87. package/dist/server/runtime-core.d.ts +18 -2
  88. package/dist/server/runtime-core.d.ts.map +1 -1
  89. package/dist/server/runtime-core.js +0 -23
  90. package/dist/server/runtime-core.js.map +1 -1
  91. package/dist/server/server-types.d.ts +3 -0
  92. package/dist/server/server-types.d.ts.map +1 -1
  93. package/dist/server/server.d.ts +113 -84
  94. package/dist/server/server.d.ts.map +1 -1
  95. package/dist/server/server.js +506 -639
  96. package/dist/server/server.js.map +1 -1
  97. package/dist/server/validation.d.ts +5 -0
  98. package/dist/server/validation.d.ts.map +1 -0
  99. package/dist/server/validation.js +13 -0
  100. package/dist/server/validation.js.map +1 -0
  101. package/dist/server/ws-bun.d.ts +11 -3
  102. package/dist/server/ws-bun.d.ts.map +1 -1
  103. package/dist/server/ws-bun.js +42 -12
  104. package/dist/server/ws-bun.js.map +1 -1
  105. package/dist/server/ws-hook.d.ts +3 -2
  106. package/dist/server/ws-hook.d.ts.map +1 -1
  107. package/dist/server.d.ts +2 -2
  108. package/dist/server.d.ts.map +1 -1
  109. package/dist/server.js +1 -1
  110. package/dist/server.js.map +1 -1
  111. package/dist/single-copy.d.ts.map +1 -1
  112. package/dist/single-copy.js +3 -1
  113. package/dist/single-copy.js.map +1 -1
  114. package/package.json +6 -3
  115. package/src/durable-adapters.ts +20 -0
  116. package/src/durable-approval.ts +281 -0
  117. package/src/durable-effect.ts +300 -0
  118. package/src/durable-execution.ts +8 -1627
  119. package/src/durable-saga.ts +744 -0
  120. package/src/edge-kit.ts +2 -2
  121. package/src/index.ts +129 -2
  122. package/src/internal/durable-approval-protocol.ts +1 -1
  123. package/src/internal/durable-effect-protocol.ts +1 -1
  124. package/src/internal/durable-saga-protocol.ts +1 -1
  125. package/src/internal/durable-shared.ts +157 -0
  126. package/src/internal/durable-types.ts +194 -0
  127. package/src/internal/route-compiler.ts +234 -0
  128. package/src/internal/route-execution.ts +34 -84
  129. package/src/internal/route-lanes.ts +221 -0
  130. package/src/internal/route-program.ts +404 -0
  131. package/src/server/bare-error-lane.ts +3 -2
  132. package/src/server/body-lane.ts +203 -0
  133. package/src/server/contract.ts +70 -20
  134. package/src/server/cookies.ts +16 -2
  135. package/src/server/plugin.ts +11 -5
  136. package/src/server/registry.ts +71 -16
  137. package/src/server/request-context.ts +7 -262
  138. package/src/server/respond.ts +45 -2
  139. package/src/server/runtime-core.ts +28 -2
  140. package/src/server/server-types.ts +3 -0
  141. package/src/server/server.ts +1152 -1260
  142. package/src/server/validation.ts +19 -0
  143. package/src/server/ws-bun.ts +44 -11
  144. package/src/server/ws-hook.ts +3 -2
  145. package/src/server.ts +7 -2
  146. package/src/single-copy.ts +3 -1
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Registration-compiled general route program.
3
+ *
4
+ * This is deliberately a data-and-control-flow compiler, not source generation: user functions and
5
+ * schemas remain opaque references and no request value is ever converted into executable code. The
6
+ * program is frozen at registration so the request path walks one immutable stage sequence instead
7
+ * of rediscovering which lifecycle features are present.
8
+ */
9
+ import { CONTEXT_SET, EMPTY_RESPONSE_CONTROLS, isResponseResult, } from "../server/runtime-core.js";
10
+ /** Build the immutable stage sequence once, while the server is still configurable. */
11
+ export function compileRouteProgram(input) {
12
+ const stages = [];
13
+ const validationStages = [];
14
+ const schema = input.schema;
15
+ if (schema?.headers !== undefined) {
16
+ const stage = { kind: "headers", schema: schema.headers };
17
+ stages.push(stage);
18
+ validationStages.push(stage);
19
+ }
20
+ if (schema?.params !== undefined) {
21
+ const stage = { kind: "params", schema: schema.params };
22
+ stages.push(stage);
23
+ validationStages.push(stage);
24
+ }
25
+ if (schema?.body !== undefined) {
26
+ const stage = { kind: "body", schema: schema.body };
27
+ stages.push(stage);
28
+ validationStages.push(stage);
29
+ }
30
+ if (schema?.query !== undefined) {
31
+ const stage = { kind: "query", schema: schema.query };
32
+ stages.push(stage);
33
+ validationStages.push(stage);
34
+ }
35
+ for (const derive of input.derives)
36
+ stages.push({ kind: "derive", run: derive });
37
+ for (const before of input.beforeHandle)
38
+ stages.push({ kind: "before", run: before });
39
+ stages.push({ kind: "handler", run: input.handler });
40
+ for (const after of input.afterHandle)
41
+ stages.push({ kind: "after", run: after });
42
+ return Object.freeze({
43
+ stages: Object.freeze(stages),
44
+ validationStages: Object.freeze(validationStages),
45
+ derives: Object.freeze([...input.derives]),
46
+ beforeHandle: Object.freeze([...input.beforeHandle]),
47
+ afterHandle: Object.freeze([...input.afterHandle]),
48
+ onError: Object.freeze([...input.onError]),
49
+ handler: input.handler,
50
+ decorations: Object.freeze({ ...input.decorations }),
51
+ hasDecorations: input.hasDecorations,
52
+ bodySchema: input.bodySchema,
53
+ bodyLimit: input.bodyLimit,
54
+ responseContract: input.responseContract,
55
+ });
56
+ }
57
+ function responseSet(ctx) {
58
+ return ctx[CONTEXT_SET]() ?? EMPTY_RESPONSE_CONTROLS;
59
+ }
60
+ function isEarly(value) {
61
+ return value instanceof Response || isResponseResult(value);
62
+ }
63
+ /** Execute the general program. The first synchronous stage sequence stays synchronous. */
64
+ export function executeRouteProgram(runtime, entry, program, source, ctx, finalize, wrapResponse) {
65
+ const host = runtime;
66
+ try {
67
+ if (program.hasDecorations)
68
+ Object.assign(ctx, program.decorations);
69
+ return runSync(host, entry, program, source, ctx, finalize, wrapResponse, 0, undefined);
70
+ }
71
+ catch (error) {
72
+ return host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
73
+ }
74
+ }
75
+ function runSync(host, entry, program, source, ctx, finalize, wrapResponse, validationIndex, initial) {
76
+ const validations = program.validationStages;
77
+ for (let i = validationIndex; i < validations.length; i++) {
78
+ const stage = validations[i];
79
+ const outcome = stage.kind === "body"
80
+ ? host.readProgramBody(entry, source, ctx)
81
+ : host.validateProgramStage(entry, stage, source, ctx);
82
+ if (outcome instanceof Promise) {
83
+ return continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, { kind: "validation", next: i + 1 }, outcome, initial);
84
+ }
85
+ if (outcome !== undefined)
86
+ return wrapResponse(outcome);
87
+ }
88
+ return runHooksSync(host, entry, program, source, ctx, finalize, wrapResponse, 0, 0, 0, initial);
89
+ }
90
+ function runHooksSync(host, entry, program, source, ctx, finalize, wrapResponse, deriveIndex, beforeIndex, afterIndex, initial) {
91
+ for (let i = deriveIndex; i < program.derives.length; i++) {
92
+ const outcome = program.derives[i](ctx);
93
+ if (outcome instanceof Promise) {
94
+ return continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, { kind: "derive", next: i + 1 }, outcome, initial);
95
+ }
96
+ if (isEarly(outcome))
97
+ return finalize(outcome, responseSet(ctx));
98
+ Object.assign(ctx, outcome);
99
+ }
100
+ for (let i = beforeIndex; i < program.beforeHandle.length; i++) {
101
+ const outcome = program.beforeHandle[i](ctx);
102
+ if (outcome instanceof Promise) {
103
+ return continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, { kind: "before", next: i + 1 }, outcome, initial);
104
+ }
105
+ if (outcome !== undefined)
106
+ return finalize(outcome, responseSet(ctx));
107
+ }
108
+ const output = program.handler(ctx);
109
+ if (output instanceof Promise) {
110
+ return continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, { kind: "handler" }, output, initial);
111
+ }
112
+ let result = output;
113
+ for (let i = afterIndex; i < program.afterHandle.length; i++) {
114
+ const outcome = program.afterHandle[i](result, ctx);
115
+ if (outcome instanceof Promise) {
116
+ return continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, { kind: "after", next: i + 1 }, outcome, result);
117
+ }
118
+ result = outcome;
119
+ }
120
+ return host.finishProgramResult(entry, ctx, result, finalize, wrapResponse);
121
+ }
122
+ async function continueProgram(host, entry, program, source, ctx, finalize, wrapResponse, pendingPhase, pending, initial) {
123
+ try {
124
+ const settled = await pending;
125
+ let result = initial;
126
+ if (pendingPhase.kind === "validation") {
127
+ if (settled !== undefined)
128
+ return wrapResponse(settled);
129
+ }
130
+ else if (pendingPhase.kind === "derive") {
131
+ if (isEarly(settled))
132
+ return finalize(settled, responseSet(ctx));
133
+ Object.assign(ctx, settled);
134
+ }
135
+ else if (pendingPhase.kind === "before") {
136
+ if (settled !== undefined)
137
+ return finalize(settled, responseSet(ctx));
138
+ }
139
+ else if (pendingPhase.kind === "handler") {
140
+ result = settled;
141
+ }
142
+ else {
143
+ result = settled;
144
+ }
145
+ return await runAsyncStages(host, entry, program, source, ctx, finalize, wrapResponse, pendingPhase, result);
146
+ }
147
+ catch (error) {
148
+ return await host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
149
+ }
150
+ }
151
+ async function runAsyncStages(host, entry, program, source, ctx, finalize, wrapResponse, pendingPhase, result) {
152
+ try {
153
+ if (pendingPhase.kind === "validation") {
154
+ const validations = program.validationStages;
155
+ for (let i = pendingPhase.next; i < validations.length; i++) {
156
+ const stage = validations[i];
157
+ const outcome = stage.kind === "body"
158
+ ? await host.readProgramBody(entry, source, ctx)
159
+ : host.validateProgramStage(entry, stage, source, ctx);
160
+ const settled = outcome instanceof Promise ? await outcome : outcome;
161
+ if (settled !== undefined)
162
+ return wrapResponse(settled);
163
+ }
164
+ }
165
+ const deriveStart = pendingPhase.kind === "derive" ? pendingPhase.next : 0;
166
+ if (pendingPhase.kind === "validation" || pendingPhase.kind === "derive") {
167
+ for (let i = deriveStart; i < program.derives.length; i++) {
168
+ const outcome = program.derives[i](ctx);
169
+ const settled = outcome instanceof Promise ? await outcome : outcome;
170
+ if (isEarly(settled))
171
+ return finalize(settled, responseSet(ctx));
172
+ Object.assign(ctx, settled);
173
+ }
174
+ }
175
+ const beforeStart = pendingPhase.kind === "before" ? pendingPhase.next : 0;
176
+ if (pendingPhase.kind === "validation" ||
177
+ pendingPhase.kind === "derive" ||
178
+ pendingPhase.kind === "before") {
179
+ for (let i = beforeStart; i < program.beforeHandle.length; i++) {
180
+ const outcome = program.beforeHandle[i](ctx);
181
+ const settled = outcome instanceof Promise ? await outcome : outcome;
182
+ if (settled !== undefined)
183
+ return finalize(settled, responseSet(ctx));
184
+ }
185
+ const output = program.handler(ctx);
186
+ result = output instanceof Promise ? await output : output;
187
+ }
188
+ const afterStart = pendingPhase.kind === "after" ? pendingPhase.next : 0;
189
+ for (let i = afterStart; i < program.afterHandle.length; i++) {
190
+ const outcome = program.afterHandle[i](result, ctx);
191
+ result = outcome instanceof Promise ? await outcome : outcome;
192
+ }
193
+ return await host.finishProgramResult(entry, ctx, result, finalize, wrapResponse);
194
+ }
195
+ catch (error) {
196
+ return await host.handleProgramError(entry, error, ctx, finalize, wrapResponse);
197
+ }
198
+ }
199
+ //# sourceMappingURL=route-program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-program.js","sourceRoot":"","sources":["../../src/internal/route-program.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export type ErrorLogDetail = "full" | "message" | "none";
14
14
  * back to `server.ts` (`responseSet` reaches into the context's set symbol; `logError` closes over the
15
15
  * server's logger). Both run only on the throw path, so the closures cost nothing on the hot lane.
16
16
  */
17
- export declare function renderBareError<T>(err: unknown, ctx: RawContext, finalize: (result: unknown, set: CtxSet, ctx: RawContext) => T, wrapResponse: (response: Response | ResponseResult) => T, responseSet: (ctx: RawContext) => CtxSet, logError: (err: unknown, ctx: RawContext) => void): T;
17
+ export declare function renderBareError<T>(err: unknown, ctx: RawContext, finalize: (result: unknown, set: CtxSet, ctx: RawContext) => T, wrapResponse: (response: Response | ResponseResult) => T, responseSet: (ctx: RawContext) => CtxSet, logError: (err: unknown, ctx: RawContext) => void, internalError: () => T): T;
18
18
  /**
19
19
  * Write an unhandled request error to the log. An error's own text can quote the input that produced
20
20
  * it, so how much of it reaches the sink is the app's call (`detail`). The default keeps it: a 500
@@ -1 +1 @@
1
- {"version":3,"file":"bare-error-lane.d.ts","sourceRoot":"","sources":["../../src/server/bare-error-lane.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,6FAA6F;AAC7F,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,KAAK,CAAC,EAC9D,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,EACxD,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,EACxC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,GAChD,CAAC,CAKH;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,UAAU,GACd,IAAI,CAWN"}
1
+ {"version":3,"file":"bare-error-lane.d.ts","sourceRoot":"","sources":["../../src/server/bare-error-lane.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErD,6FAA6F;AAC7F,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;AAExD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,KAAK,CAAC,EAC9D,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,EACxD,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,MAAM,EACxC,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,KAAK,IAAI,EACjD,aAAa,EAAE,MAAM,CAAC,GACrB,CAAC,CAKH;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,UAAU,GACd,IAAI,CAWN"}
@@ -17,7 +17,7 @@
17
17
  * which lane caught it. Both the generic bare lane and the fused body runner route here, so that
18
18
  * decision lives in exactly one place.
19
19
  */
20
- import { pathnameOf, plainError } from "./http.js";
20
+ import { pathnameOf } from "./http.js";
21
21
  import { isResponseResult } from "./runtime-core.js";
22
22
  /**
23
23
  * Render a value thrown on the bare lane. Three shapes, in the order the lane means them:
@@ -30,13 +30,13 @@ import { isResponseResult } from "./runtime-core.js";
30
30
  * back to `server.ts` (`responseSet` reaches into the context's set symbol; `logError` closes over the
31
31
  * server's logger). Both run only on the throw path, so the closures cost nothing on the hot lane.
32
32
  */
33
- export function renderBareError(err, ctx, finalize, wrapResponse, responseSet, logError) {
33
+ export function renderBareError(err, ctx, finalize, wrapResponse, responseSet, logError, internalError) {
34
34
  if (err instanceof Response)
35
35
  return wrapResponse(err);
36
36
  if (isResponseResult(err))
37
37
  return finalize(err, responseSet(ctx), ctx);
38
38
  logError(err, ctx);
39
- return wrapResponse(plainError(500, "internal_error"));
39
+ return internalError();
40
40
  }
41
41
  /**
42
42
  * Write an unhandled request error to the log. An error's own text can quote the input that produced
@@ -1 +1 @@
1
- {"version":3,"file":"bare-error-lane.js","sourceRoot":"","sources":["../../src/server/bare-error-lane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAElD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,mBAAmB,CAAA;AAMzE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAY,EACZ,GAAe,EACf,QAA8D,EAC9D,YAAwD,EACxD,WAAwC,EACxC,QAAiD;IAEjD,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAA;IACrD,IAAI,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACtE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAClB,OAAO,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAA;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,MAAsB,EACtB,GAAY,EACZ,GAAe;IAEf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;QACtC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM;QACtB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QAC/C,+FAA+F;QAC/F,+FAA+F;QAC/F,0FAA0F;QAC1F,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"bare-error-lane.js","sourceRoot":"","sources":["../../src/server/bare-error-lane.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,mBAAmB,CAAA;AAMzE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAY,EACZ,GAAe,EACf,QAA8D,EAC9D,YAAwD,EACxD,WAAwC,EACxC,QAAiD,EACjD,aAAsB;IAEtB,IAAI,GAAG,YAAY,QAAQ;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC,CAAA;IACrD,IAAI,gBAAgB,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACtE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAClB,OAAO,aAAa,EAAE,CAAA;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,MAAsB,EACtB,GAAY,EACZ,GAAe;IAEf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;QACtC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM;QACtB,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7B,IAAI,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;QAC/C,+FAA+F;QAC/F,+FAA+F;QAC/F,0FAA0F;QAC1F,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type ProtoPoisoning } from "./proto-guard.js";
2
+ import { type ResponseResult } from "./runtime-core.js";
3
+ import type { MaybePromise, RequestSource } from "./server.js";
4
+ type JsonResultContinuation<T> = (result: unknown | ResponseResult) => T | Promise<T>;
5
+ type JsonErrorContinuation<T> = (error: unknown) => T | Promise<T>;
6
+ /** Read a JSON source with the declared-length precheck, delivered-byte recheck, streaming cap, and
7
+ * prototype-poisoning guard in one lane. */
8
+ export declare function readBoundedJsonSource(req: RequestSource, maxBytes: number, protoPoisoning?: ProtoPoisoning): Promise<unknown | ResponseResult>;
9
+ export declare function readBoundedJsonSource<T>(req: RequestSource, maxBytes: number, protoPoisoning: ProtoPoisoning, onResult: JsonResultContinuation<T>, onError: JsonErrorContinuation<T>): Promise<T>;
10
+ /** The shared content-type dispatcher around the JSON and urlencoded lanes. */
11
+ export declare function readBodyFramed<T>(source: RequestSource, maxBodyBytes: number, protoPoisoning: ProtoPoisoning, onParsed: (parsed: unknown) => MaybePromise<T>, wrapResponse: (response: Response | ResponseResult) => T, onError: (err: unknown) => MaybePromise<T>): Promise<T>;
12
+ export {};
13
+ //# sourceMappingURL=body-lane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-lane.d.ts","sourceRoot":"","sources":["../../src/server/body-lane.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,cAAc,EAAoB,MAAM,kBAAkB,CAAA;AAE1F,OAAO,EAKL,KAAK,cAAc,EAEpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE9D,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACrF,KAAK,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAYlE;4CAC4C;AAC5C,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,OAAO,GAAG,cAAc,CAAC,CAAA;AACpC,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,EACnC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC,CAAA;AA+Hb,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,EAC9C,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,KAAK,CAAC,EACxD,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The shared framed body parser. Kept separate from RequestContext so compact edge consumers can
3
+ * reuse the exact trust-boundary lane without bundling the full context implementation (cookies,
4
+ * deferred responses, and request helpers).
5
+ */
6
+ import { drainCapped, hasTrustedBodyFraming, parseContentLength, RAW_BODY_READERS } from "./body.js";
7
+ import { plainError } from "./http.js";
8
+ import { guardParsedValue, parseJsonGuarded } from "./proto-guard.js";
9
+ import { isUrlEncodedForm, readBoundedForm } from "./query.js";
10
+ import { headerOf, isResponseResult, PRE_DECODED_BODY, TEXT_DECODER, } from "./runtime-core.js";
11
+ const INVALID_JSON = () => plainError(400, "invalid_json");
12
+ export function readBoundedJsonSource(req, maxBytes, protoPoisoning = "reject", onResult, onError) {
13
+ const preDecoded = req[PRE_DECODED_BODY];
14
+ if (preDecoded !== undefined) {
15
+ return onResult === undefined
16
+ ? Promise.resolve(preDecoded.value)
17
+ : Promise.resolve(preDecoded.value).then(onResult);
18
+ }
19
+ const raw = (req[RAW_BODY_READERS] ??
20
+ req);
21
+ const declared = headerOf(req, "content-length");
22
+ if (declared !== null) {
23
+ const length = parseContentLength(declared);
24
+ if (length === undefined)
25
+ return onResult === undefined
26
+ ? Promise.resolve(plainError(400, "invalid_content_length"))
27
+ : Promise.resolve(plainError(400, "invalid_content_length")).then(onResult);
28
+ if (length > maxBytes)
29
+ return onResult === undefined
30
+ ? Promise.resolve(plainError(413, "payload_too_large"))
31
+ : Promise.resolve(plainError(413, "payload_too_large")).then(onResult);
32
+ if (hasTrustedBodyFraming(req)) {
33
+ return raw.json().then((parsed) => {
34
+ try {
35
+ const guarded = guardParsedValue(parsed, protoPoisoning);
36
+ return onResult === undefined ? guarded : onResult(guarded);
37
+ }
38
+ catch {
39
+ return onResult === undefined
40
+ ? plainError(400, "invalid_json")
41
+ : onResult(plainError(400, "invalid_json"));
42
+ }
43
+ }, () => (onResult === undefined ? INVALID_JSON() : onResult(INVALID_JSON())));
44
+ }
45
+ if (headerOf(req, "transfer-encoding") === null) {
46
+ const jsonWithByteLength = raw.jsonWithByteLength;
47
+ if (jsonWithByteLength !== undefined) {
48
+ return jsonWithByteLength.call(raw).then(({ value, byteLength }) => {
49
+ if (byteLength > length || byteLength > maxBytes) {
50
+ return onResult === undefined
51
+ ? plainError(413, "payload_too_large")
52
+ : onResult(plainError(413, "payload_too_large"));
53
+ }
54
+ try {
55
+ const guarded = guardParsedValue(value, protoPoisoning);
56
+ return onResult === undefined ? guarded : onResult(guarded);
57
+ }
58
+ catch {
59
+ return onResult === undefined
60
+ ? plainError(400, "invalid_json")
61
+ : onResult(plainError(400, "invalid_json"));
62
+ }
63
+ }, () => (onResult === undefined ? INVALID_JSON() : onResult(INVALID_JSON())));
64
+ }
65
+ const bytesReader = raw.bytes;
66
+ if (bytesReader !== undefined) {
67
+ return bytesReader.call(raw).then((bytes) => {
68
+ if (bytes.byteLength > length || bytes.byteLength > maxBytes) {
69
+ return onResult === undefined
70
+ ? plainError(413, "payload_too_large")
71
+ : onResult(plainError(413, "payload_too_large"));
72
+ }
73
+ try {
74
+ const parsed = parseJsonGuarded(TEXT_DECODER.decode(bytes), protoPoisoning);
75
+ return onResult === undefined ? parsed : onResult(parsed);
76
+ }
77
+ catch {
78
+ return onResult === undefined
79
+ ? plainError(400, "invalid_json")
80
+ : onResult(plainError(400, "invalid_json"));
81
+ }
82
+ }, () => (onResult === undefined ? INVALID_JSON() : onResult(INVALID_JSON())));
83
+ }
84
+ return raw.arrayBuffer().then((buffer) => {
85
+ const bytes = new Uint8Array(buffer);
86
+ if (bytes.byteLength > length || bytes.byteLength > maxBytes) {
87
+ return onResult === undefined
88
+ ? plainError(413, "payload_too_large")
89
+ : onResult(plainError(413, "payload_too_large"));
90
+ }
91
+ try {
92
+ const parsed = parseJsonGuarded(TEXT_DECODER.decode(bytes), protoPoisoning);
93
+ return onResult === undefined ? parsed : onResult(parsed);
94
+ }
95
+ catch {
96
+ return onResult === undefined
97
+ ? plainError(400, "invalid_json")
98
+ : onResult(plainError(400, "invalid_json"));
99
+ }
100
+ }, () => (onResult === undefined ? INVALID_JSON() : onResult(INVALID_JSON())));
101
+ }
102
+ }
103
+ const body = raw.body;
104
+ const streamed = body === null
105
+ ? Promise.resolve(plainError(400, "invalid_json"))
106
+ : drainCapped(body, maxBytes).then((drained) => {
107
+ if (!drained.ok)
108
+ return plainError(413, "payload_too_large");
109
+ try {
110
+ return parseJsonGuarded(TEXT_DECODER.decode(drained.bytes), protoPoisoning);
111
+ }
112
+ catch {
113
+ return plainError(400, "invalid_json");
114
+ }
115
+ });
116
+ return onResult === undefined ? streamed : streamed.then(onResult, onError);
117
+ }
118
+ /** The shared content-type dispatcher around the JSON and urlencoded lanes. */
119
+ export function readBodyFramed(source, maxBodyBytes, protoPoisoning, onParsed, wrapResponse, onError) {
120
+ const contentType = headerOf(source, "content-type") ?? "";
121
+ if (contentType !== "application/json" && !contentType.includes("application/json")) {
122
+ if (isUrlEncodedForm(contentType)) {
123
+ return readBoundedForm(source, maxBodyBytes).then((form) => (isResponseResult(form) ? wrapResponse(form) : onParsed(form)), onError);
124
+ }
125
+ return Promise.resolve(wrapResponse(plainError(415, "unsupported_media_type")));
126
+ }
127
+ try {
128
+ return readBoundedJsonSource(source, maxBodyBytes, protoPoisoning, (parsed) => (isResponseResult(parsed) ? wrapResponse(parsed) : onParsed(parsed)), onError);
129
+ }
130
+ catch (err) {
131
+ return Promise.resolve(onError(err));
132
+ }
133
+ }
134
+ //# sourceMappingURL=body-lane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-lane.js","sourceRoot":"","sources":["../../src/server/body-lane.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,9 @@ import type { DataClassification } from "../classification.js";
2
2
  import { type Method } from "../router/router.js";
3
3
  import type { InferInput, InferOutput, StandardSchemaV1 } from "../schema/standard.js";
4
4
  import type { Context, IdempotencyConfig, Params, RouteSchema } from "./context.js";
5
- import type { EmptyRegistry, OutputOf, Registry } from "./registry.js";
5
+ import type { EmptyRegistry, OutputOf, Registry, RouteInfoFor } from "./registry.js";
6
6
  import { Server } from "./server.js";
7
+ type EmptyResponseMap = NonNullable<unknown>;
7
8
  /** An additional (non-success) response a contract operation can document, e.g. a `404`. */
8
9
  export interface ResponseDef {
9
10
  readonly description?: string;
@@ -75,7 +76,9 @@ type OpResponse<O extends OperationDef> = O extends {
75
76
  } ? InferOutput<R> : unknown;
76
77
  /** The body types of a contract op's declared **non-2xx** `responses` (schema-bearing ones), keyed by status. */
77
78
  type OpErrorBodies<Rs extends Record<string, ResponseDef>> = {
78
- [K in keyof Rs as K extends `2${string}` ? never : K extends `${infer N extends number}` ? N : never]: Rs[K] extends {
79
+ [K in keyof Rs as K extends `2${string}` ? never : K extends `${infer N extends number}` ? Rs[K] extends {
80
+ schema: StandardSchemaV1;
81
+ } ? N : never : never]: Rs[K] extends {
79
82
  schema: infer S extends StandardSchemaV1;
80
83
  } ? InferOutput<S> : never;
81
84
  };
@@ -84,6 +87,21 @@ type OpErrorBodies<Rs extends Record<string, ResponseDef>> = {
84
87
  type OpErrors<O extends OperationDef> = O extends {
85
88
  responses: infer Rs extends Record<string, ResponseDef>;
86
89
  } ? [keyof OpErrorBodies<Rs>] extends [never] ? unknown : OpErrorBodies<Rs> : unknown;
90
+ /** The schema-bearing status map a contract consumer can use for success and failure narrowing. */
91
+ type OpAdditionalResponseMap<O extends OperationDef> = O extends {
92
+ responses: infer Rs extends Record<string, ResponseDef>;
93
+ } ? {
94
+ [K in keyof Rs as K extends `${infer N extends number}` ? Rs[K] extends {
95
+ schema: StandardSchemaV1;
96
+ } ? N : never : never]: Rs[K] extends {
97
+ schema: infer S extends StandardSchemaV1;
98
+ } ? InferOutput<S> : never;
99
+ } : EmptyResponseMap;
100
+ type OpResponseMap<O extends OperationDef> = Omit<OpAdditionalResponseMap<O>, 200> & (O extends {
101
+ response: infer R extends StandardSchemaV1;
102
+ } ? {
103
+ 200: InferOutput<R>;
104
+ } : EmptyResponseMap);
87
105
  /**
88
106
  * RouteInfo as a *decoupled consumer* sees it from the contract alone: the
89
107
  * `output` is the declared `response` schema's type, or `unknown` when none is
@@ -96,6 +114,7 @@ type RouteInfoForOp<O extends OperationDef> = {
96
114
  readonly query: OpQuery<O>;
97
115
  readonly body: OpBody<O>;
98
116
  readonly output: OpResponse<O>;
117
+ readonly responses: OpResponseMap<O>;
99
118
  readonly errors: OpErrors<O>;
100
119
  readonly sse: never;
101
120
  };
@@ -123,6 +142,22 @@ type SchemaForOp<O extends OperationDef> = (O extends {
123
142
  } ? {
124
143
  params: P;
125
144
  } : Record<never, never>);
145
+ type OpResponseSchemas<O extends OperationDef> = O extends {
146
+ responses: infer Rs extends Record<string, ResponseDef>;
147
+ } ? {
148
+ [K in keyof Rs as K extends `2${string}` ? never : Rs[K] extends {
149
+ schema: StandardSchemaV1;
150
+ } ? K extends `${infer N extends number}` ? N : never : never]: Rs[K] extends {
151
+ schema: infer S extends StandardSchemaV1;
152
+ } ? S : never;
153
+ } : EmptyResponseMap;
154
+ type RouteSchemaForOp<O extends OperationDef> = SchemaForOp<O> & RouteSchema & (O extends {
155
+ response: infer R extends StandardSchemaV1;
156
+ } ? {
157
+ response: R;
158
+ } : EmptyResponseMap) & (keyof OpResponseSchemas<O> extends never ? EmptyResponseMap : {
159
+ errors: OpResponseSchemas<O>;
160
+ });
126
161
  /**
127
162
  * The handler context for an op - identical to the inline `Context<Path, S>`, so a
128
163
  * handler written for an inline route type-checks unchanged under `implement`
@@ -164,18 +199,9 @@ type AnyFn = (...args: never[]) => unknown;
164
199
  * the implemented server stays route-for-route identical to the equivalent inline server (the
165
200
  * mode-conformance guarantee), and a contract-typed client and a `typeof app`-typed client agree.
166
201
  */
167
- export type RegistryFromImpl<C extends ContractShape, H extends HandlersFor<C, Ctx>, Ctx = NonNullable<unknown>> = {
202
+ export type RegistryFromImpl<C extends ContractShape, H extends HandlersFor<C, Ctx>, Ctx = NonNullable<unknown>, HookOutput = never> = {
168
203
  [P in C[keyof C]["path"]]: {
169
- [K in keyof C as C[K]["path"] extends P ? C[K]["method"] : never]: {
170
- readonly params: Params<C[K]["path"]>;
171
- readonly query: OpQuery<C[K]>;
172
- readonly body: OpBody<C[K]>;
173
- readonly output: C[K] extends {
174
- response: infer R extends StandardSchemaV1;
175
- } ? InferOutput<R> : H[K] extends AnyFn ? OutputOf<H[K]> : unknown;
176
- readonly errors: OpErrors<C[K]>;
177
- readonly sse: never;
178
- };
204
+ [K in keyof C as C[K]["path"] extends P ? C[K]["method"] : never]: H[K] extends AnyFn ? RouteInfoFor<C[K]["path"], RouteSchemaForOp<C[K]>, OutputOf<H[K]>, HookOutput> : RouteInfoFor<C[K]["path"], RouteSchemaForOp<C[K]>, unknown, HookOutput>;
179
205
  };
180
206
  };
181
207
  /**
@@ -198,6 +224,6 @@ export type RegistryFromImpl<C extends ContractShape, H extends HandlersFor<C, C
198
224
  * ({@link withRouteAssurance}), and only a plugin installed *before* registration is captured. Handlers
199
225
  * then see the app's `Ctx`, and the returned server keeps any routes the app already had.
200
226
  */
201
- export declare function implement<const C extends ContractShape, H extends HandlersFor<C, Ctx>, R extends Registry = EmptyRegistry, Ctx = NonNullable<unknown>>(contract: C, handlers: H, app?: Server<R, Ctx>): Server<R & RegistryFromImpl<C, H, Ctx>, Ctx>;
227
+ export declare function implement<const C extends ContractShape, H extends HandlersFor<C, Ctx>, R extends Registry = EmptyRegistry, Ctx = NonNullable<unknown>, HookOutput = never>(contract: C, handlers: H, app?: Server<R, Ctx, HookOutput>): Server<R & RegistryFromImpl<C, H, Ctx, HookOutput>, Ctx, HookOutput>;
202
228
  export {};
203
229
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/server/contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/server/contract.ts"],"names":[],"mappings":"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"}
@@ -70,6 +70,11 @@ export function defineContract(contract) {
70
70
  export function implement(contract, handlers, app) {
71
71
  const target = (app ?? new Server());
72
72
  const routes = Object.entries(contract).map(([name, op]) => {
73
+ const errors = op.responses === undefined
74
+ ? undefined
75
+ : Object.fromEntries(Object.entries(op.responses)
76
+ .filter(([status, response]) => !status.startsWith("2") && response.schema !== undefined)
77
+ .map(([status, response]) => [Number(status), response.schema]));
73
78
  // body/query are validated at the request boundary; `response` is a type + introspection contract
74
79
  // ONLY - never validated at runtime and never read on the request hot path (the lifecycle reads
75
80
  // schema.body/query by name; the `bare`/bodyOnly/queryOnly fast-path gates ignore `response`). Built
@@ -80,6 +85,7 @@ export function implement(contract, handlers, app) {
80
85
  op.body !== undefined ||
81
86
  op.query !== undefined ||
82
87
  op.response !== undefined ||
88
+ (errors !== undefined && Object.keys(errors).length > 0) ||
83
89
  op.capabilities !== undefined ||
84
90
  op.idempotency !== undefined ||
85
91
  op.bodyLimit !== undefined ||
@@ -92,6 +98,7 @@ export function implement(contract, handlers, app) {
92
98
  ...(op.body !== undefined ? { body: op.body } : {}),
93
99
  ...(op.query !== undefined ? { query: op.query } : {}),
94
100
  ...(op.response !== undefined ? { response: op.response } : {}),
101
+ ...(errors !== undefined && Object.keys(errors).length > 0 ? { errors } : {}),
95
102
  ...(op.capabilities !== undefined ? { capabilities: op.capabilities } : {}),
96
103
  ...(op.idempotency !== undefined ? { idempotency: op.idempotency } : {}),
97
104
  ...(op.bodyLimit !== undefined ? { bodyLimit: op.bodyLimit } : {}),