@beignet/core 0.0.3 → 0.0.4

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 (360) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +785 -43
  3. package/dist/application/index.d.ts +28 -2
  4. package/dist/application/index.d.ts.map +1 -1
  5. package/dist/application/index.js +140 -12
  6. package/dist/application/index.js.map +1 -1
  7. package/dist/client/client.d.ts +2 -2
  8. package/dist/client/client.d.ts.map +1 -1
  9. package/dist/client/client.js +136 -48
  10. package/dist/client/client.js.map +1 -1
  11. package/dist/client/error-messages.d.ts +14 -0
  12. package/dist/client/error-messages.d.ts.map +1 -0
  13. package/dist/client/error-messages.js +23 -0
  14. package/dist/client/error-messages.js.map +1 -0
  15. package/dist/client/index.d.ts +8 -4
  16. package/dist/client/index.d.ts.map +1 -1
  17. package/dist/client/index.js +6 -2
  18. package/dist/client/index.js.map +1 -1
  19. package/dist/client/types.d.ts +35 -5
  20. package/dist/client/types.d.ts.map +1 -1
  21. package/dist/client-only.d.ts +8 -0
  22. package/dist/client-only.d.ts.map +1 -0
  23. package/dist/client-only.js +8 -0
  24. package/dist/client-only.js.map +1 -0
  25. package/dist/config/index.d.ts +5 -5
  26. package/dist/config/index.d.ts.map +1 -1
  27. package/dist/config/index.js +2 -2
  28. package/dist/config/index.js.map +1 -1
  29. package/dist/contracts/catalog-errors.d.ts +27 -0
  30. package/dist/contracts/catalog-errors.d.ts.map +1 -0
  31. package/dist/contracts/catalog-errors.js +69 -0
  32. package/dist/contracts/catalog-errors.js.map +1 -0
  33. package/dist/contracts/contract-builder.d.ts +15 -12
  34. package/dist/contracts/contract-builder.d.ts.map +1 -1
  35. package/dist/contracts/contract-builder.js +15 -41
  36. package/dist/contracts/contract-builder.js.map +1 -1
  37. package/dist/contracts/contract-group.d.ts +11 -8
  38. package/dist/contracts/contract-group.d.ts.map +1 -1
  39. package/dist/contracts/contract-group.js +13 -40
  40. package/dist/contracts/contract-group.js.map +1 -1
  41. package/dist/contracts/contract-like.d.ts +1 -1
  42. package/dist/contracts/contract-like.d.ts.map +1 -1
  43. package/dist/contracts/index.d.ts +13 -9
  44. package/dist/contracts/index.d.ts.map +1 -1
  45. package/dist/contracts/index.js +9 -5
  46. package/dist/contracts/index.js.map +1 -1
  47. package/dist/contracts/openapi-meta.d.ts +48 -0
  48. package/dist/contracts/openapi-meta.d.ts.map +1 -1
  49. package/dist/contracts/openapi-meta.js +3 -0
  50. package/dist/contracts/openapi-meta.js.map +1 -1
  51. package/dist/contracts/path-template.d.ts +1 -1
  52. package/dist/contracts/path-template.js +2 -2
  53. package/dist/contracts/path-template.js.map +1 -1
  54. package/dist/contracts/schema-shape.d.ts +37 -0
  55. package/dist/contracts/schema-shape.d.ts.map +1 -0
  56. package/dist/contracts/schema-shape.js +61 -0
  57. package/dist/contracts/schema-shape.js.map +1 -0
  58. package/dist/contracts/success-status.d.ts +32 -0
  59. package/dist/contracts/success-status.d.ts.map +1 -0
  60. package/dist/contracts/success-status.js +18 -0
  61. package/dist/contracts/success-status.js.map +1 -0
  62. package/dist/contracts/types.d.ts +25 -5
  63. package/dist/contracts/types.d.ts.map +1 -1
  64. package/dist/contracts/types.js.map +1 -1
  65. package/dist/contracts/utils.d.ts +1 -1
  66. package/dist/contracts/utils.d.ts.map +1 -1
  67. package/dist/contracts/utils.js +1 -1
  68. package/dist/contracts/utils.js.map +1 -1
  69. package/dist/domain/events.d.ts +1 -1
  70. package/dist/domain/events.d.ts.map +1 -1
  71. package/dist/domain/events.js +1 -1
  72. package/dist/domain/events.js.map +1 -1
  73. package/dist/domain/index.d.ts +3 -3
  74. package/dist/domain/index.d.ts.map +1 -1
  75. package/dist/domain/index.js +3 -3
  76. package/dist/domain/index.js.map +1 -1
  77. package/dist/errors/catalog.d.ts +9 -1
  78. package/dist/errors/catalog.d.ts.map +1 -1
  79. package/dist/errors/catalog.js +7 -1
  80. package/dist/errors/catalog.js.map +1 -1
  81. package/dist/errors/http.d.ts +10 -0
  82. package/dist/errors/http.d.ts.map +1 -1
  83. package/dist/errors/http.js +11 -1
  84. package/dist/errors/http.js.map +1 -1
  85. package/dist/errors/index.d.ts +4 -4
  86. package/dist/errors/index.d.ts.map +1 -1
  87. package/dist/errors/index.js +4 -4
  88. package/dist/errors/index.js.map +1 -1
  89. package/dist/errors/response.d.ts +4 -1
  90. package/dist/errors/response.d.ts.map +1 -1
  91. package/dist/errors/response.js.map +1 -1
  92. package/dist/events/index.d.ts +10 -12
  93. package/dist/events/index.d.ts.map +1 -1
  94. package/dist/events/index.js +10 -10
  95. package/dist/events/index.js.map +1 -1
  96. package/dist/idempotency/index.d.ts +5 -3
  97. package/dist/idempotency/index.d.ts.map +1 -1
  98. package/dist/idempotency/index.js.map +1 -1
  99. package/dist/jobs/index.d.ts +12 -14
  100. package/dist/jobs/index.d.ts.map +1 -1
  101. package/dist/jobs/index.js +13 -13
  102. package/dist/jobs/index.js.map +1 -1
  103. package/dist/notifications/index.d.ts +14 -16
  104. package/dist/notifications/index.d.ts.map +1 -1
  105. package/dist/notifications/index.js +14 -14
  106. package/dist/notifications/index.js.map +1 -1
  107. package/dist/openapi/index.d.ts +8 -3
  108. package/dist/openapi/index.d.ts.map +1 -1
  109. package/dist/openapi/index.js +41 -29
  110. package/dist/openapi/index.js.map +1 -1
  111. package/dist/openapi/schema-introspector.d.ts +37 -0
  112. package/dist/openapi/schema-introspector.d.ts.map +1 -1
  113. package/dist/openapi/schema-introspector.js +23 -17
  114. package/dist/openapi/schema-introspector.js.map +1 -1
  115. package/dist/outbox/index.d.ts +15 -6
  116. package/dist/outbox/index.d.ts.map +1 -1
  117. package/dist/outbox/index.js +60 -16
  118. package/dist/outbox/index.js.map +1 -1
  119. package/dist/ports/audit.d.ts +56 -10
  120. package/dist/ports/audit.d.ts.map +1 -1
  121. package/dist/ports/audit.js +71 -3
  122. package/dist/ports/audit.js.map +1 -1
  123. package/dist/ports/auth.d.ts +92 -0
  124. package/dist/ports/auth.d.ts.map +1 -1
  125. package/dist/ports/auth.js +92 -0
  126. package/dist/ports/auth.js.map +1 -1
  127. package/dist/ports/events.d.ts +2 -2
  128. package/dist/ports/events.d.ts.map +1 -1
  129. package/dist/ports/index.d.ts +62 -33
  130. package/dist/ports/index.d.ts.map +1 -1
  131. package/dist/ports/index.js +28 -34
  132. package/dist/ports/index.js.map +1 -1
  133. package/dist/ports/policy.d.ts +32 -3
  134. package/dist/ports/policy.d.ts.map +1 -1
  135. package/dist/ports/policy.js +13 -2
  136. package/dist/ports/policy.js.map +1 -1
  137. package/dist/ports/testing.d.ts +1030 -2
  138. package/dist/ports/testing.d.ts.map +1 -1
  139. package/dist/ports/testing.js +1031 -1
  140. package/dist/ports/testing.js.map +1 -1
  141. package/dist/ports/unbound.d.ts +21 -0
  142. package/dist/ports/unbound.d.ts.map +1 -0
  143. package/dist/ports/unbound.js +57 -0
  144. package/dist/ports/unbound.js.map +1 -0
  145. package/dist/ports/unit-of-work.d.ts +1 -1
  146. package/dist/ports/unit-of-work.d.ts.map +1 -1
  147. package/dist/ports/unit-of-work.js +1 -1
  148. package/dist/ports/unit-of-work.js.map +1 -1
  149. package/dist/providers/index.d.ts +3 -2
  150. package/dist/providers/index.d.ts.map +1 -1
  151. package/dist/providers/index.js +3 -2
  152. package/dist/providers/index.js.map +1 -1
  153. package/dist/providers/instrumentation.d.ts +45 -4
  154. package/dist/providers/instrumentation.d.ts.map +1 -1
  155. package/dist/providers/instrumentation.js +25 -6
  156. package/dist/providers/instrumentation.js.map +1 -1
  157. package/dist/providers/metadata.d.ts +39 -0
  158. package/dist/providers/metadata.d.ts.map +1 -0
  159. package/dist/providers/metadata.js +169 -0
  160. package/dist/providers/metadata.js.map +1 -0
  161. package/dist/providers/provider.d.ts +114 -9
  162. package/dist/providers/provider.d.ts.map +1 -1
  163. package/dist/providers/provider.js +3 -20
  164. package/dist/providers/provider.js.map +1 -1
  165. package/dist/schedules/index.d.ts +94 -13
  166. package/dist/schedules/index.d.ts.map +1 -1
  167. package/dist/schedules/index.js +66 -12
  168. package/dist/schedules/index.js.map +1 -1
  169. package/dist/server/audit-context.d.ts +29 -0
  170. package/dist/server/audit-context.d.ts.map +1 -0
  171. package/dist/server/audit-context.js +44 -0
  172. package/dist/server/audit-context.js.map +1 -0
  173. package/dist/server/context.d.ts +141 -0
  174. package/dist/server/context.d.ts.map +1 -0
  175. package/dist/server/context.js +39 -0
  176. package/dist/server/context.js.map +1 -0
  177. package/dist/server/contract-like.d.ts +1 -1
  178. package/dist/server/contract-like.d.ts.map +1 -1
  179. package/dist/server/contract-like.js +1 -1
  180. package/dist/server/contract-like.js.map +1 -1
  181. package/dist/server/health.d.ts +2 -2
  182. package/dist/server/health.d.ts.map +1 -1
  183. package/dist/server/hooks/auth.d.ts +49 -10
  184. package/dist/server/hooks/auth.d.ts.map +1 -1
  185. package/dist/server/hooks/auth.js +77 -37
  186. package/dist/server/hooks/auth.js.map +1 -1
  187. package/dist/server/hooks/cors.d.ts +1 -1
  188. package/dist/server/hooks/cors.d.ts.map +1 -1
  189. package/dist/server/hooks/errors.d.ts +2 -2
  190. package/dist/server/hooks/errors.d.ts.map +1 -1
  191. package/dist/server/hooks/errors.js +2 -2
  192. package/dist/server/hooks/errors.js.map +1 -1
  193. package/dist/server/hooks/idempotency.d.ts +78 -0
  194. package/dist/server/hooks/idempotency.d.ts.map +1 -0
  195. package/dist/server/hooks/idempotency.js +154 -0
  196. package/dist/server/hooks/idempotency.js.map +1 -0
  197. package/dist/server/hooks/index.d.ts +8 -7
  198. package/dist/server/hooks/index.d.ts.map +1 -1
  199. package/dist/server/hooks/index.js +6 -5
  200. package/dist/server/hooks/index.js.map +1 -1
  201. package/dist/server/hooks/logging.d.ts +2 -2
  202. package/dist/server/hooks/logging.d.ts.map +1 -1
  203. package/dist/server/hooks/logging.js +1 -1
  204. package/dist/server/hooks/logging.js.map +1 -1
  205. package/dist/server/hooks/rate-limit.d.ts +25 -7
  206. package/dist/server/hooks/rate-limit.d.ts.map +1 -1
  207. package/dist/server/hooks/rate-limit.js +47 -12
  208. package/dist/server/hooks/rate-limit.js.map +1 -1
  209. package/dist/server/hooks.d.ts +1 -1
  210. package/dist/server/hooks.d.ts.map +1 -1
  211. package/dist/server/hooks.js +1 -1
  212. package/dist/server/hooks.js.map +1 -1
  213. package/dist/server/http.d.ts +61 -35
  214. package/dist/server/http.d.ts.map +1 -1
  215. package/dist/server/http.js +1 -20
  216. package/dist/server/http.js.map +1 -1
  217. package/dist/server/index.d.ts +36 -12
  218. package/dist/server/index.d.ts.map +1 -1
  219. package/dist/server/index.js +24 -8
  220. package/dist/server/index.js.map +1 -1
  221. package/dist/server/instrumentation.d.ts +108 -0
  222. package/dist/server/instrumentation.d.ts.map +1 -0
  223. package/dist/server/instrumentation.js +297 -0
  224. package/dist/server/instrumentation.js.map +1 -0
  225. package/dist/server/openapi.d.ts +3 -3
  226. package/dist/server/openapi.d.ts.map +1 -1
  227. package/dist/server/openapi.js +1 -1
  228. package/dist/server/openapi.js.map +1 -1
  229. package/dist/server/providers/index.d.ts +3 -3
  230. package/dist/server/providers/index.d.ts.map +1 -1
  231. package/dist/server/providers/index.js +3 -3
  232. package/dist/server/providers/index.js.map +1 -1
  233. package/dist/server/providers/loadProviderConfig.d.ts +2 -2
  234. package/dist/server/providers/loadProviderConfig.d.ts.map +1 -1
  235. package/dist/server/providers/loadProviderConfig.js +2 -2
  236. package/dist/server/providers/loadProviderConfig.js.map +1 -1
  237. package/dist/server/request-context.d.ts +67 -0
  238. package/dist/server/request-context.d.ts.map +1 -0
  239. package/dist/server/request-context.js +79 -0
  240. package/dist/server/request-context.js.map +1 -0
  241. package/dist/server/server-context.d.ts +38 -0
  242. package/dist/server/server-context.d.ts.map +1 -0
  243. package/dist/server/server-context.js +38 -0
  244. package/dist/server/server-context.js.map +1 -0
  245. package/dist/server/server.d.ts +105 -33
  246. package/dist/server/server.d.ts.map +1 -1
  247. package/dist/server/server.js +434 -118
  248. package/dist/server/server.js.map +1 -1
  249. package/dist/server/types.d.ts +2 -2
  250. package/dist/server/types.d.ts.map +1 -1
  251. package/dist/server/types.js +2 -2
  252. package/dist/server/types.js.map +1 -1
  253. package/dist/server/use-case-route.d.ts +263 -0
  254. package/dist/server/use-case-route.d.ts.map +1 -0
  255. package/dist/server/use-case-route.js +77 -0
  256. package/dist/server/use-case-route.js.map +1 -0
  257. package/dist/server-only.d.ts +8 -0
  258. package/dist/server-only.d.ts.map +1 -0
  259. package/dist/server-only.js +8 -0
  260. package/dist/server-only.js.map +1 -0
  261. package/dist/tasks/index.d.ts +139 -0
  262. package/dist/tasks/index.d.ts.map +1 -0
  263. package/dist/tasks/index.js +98 -0
  264. package/dist/tasks/index.js.map +1 -0
  265. package/dist/testing/index.d.ts +607 -5
  266. package/dist/testing/index.d.ts.map +1 -1
  267. package/dist/testing/index.js +426 -4
  268. package/dist/testing/index.js.map +1 -1
  269. package/dist/tracing/index.d.ts +89 -0
  270. package/dist/tracing/index.d.ts.map +1 -0
  271. package/dist/tracing/index.js +101 -0
  272. package/dist/tracing/index.js.map +1 -0
  273. package/dist/uploads/client.d.ts +1 -1
  274. package/dist/uploads/client.d.ts.map +1 -1
  275. package/dist/uploads/index.d.ts +2 -2
  276. package/dist/uploads/index.d.ts.map +1 -1
  277. package/dist/uploads/index.js +1 -1
  278. package/dist/uploads/index.js.map +1 -1
  279. package/package.json +24 -2
  280. package/src/application/index.ts +193 -10
  281. package/src/client/client.ts +148 -150
  282. package/src/client/error-messages.ts +35 -0
  283. package/src/client/index.ts +12 -4
  284. package/src/client/types.ts +44 -5
  285. package/src/client-only.ts +7 -0
  286. package/src/config/index.ts +6 -6
  287. package/src/contracts/catalog-errors.ts +115 -0
  288. package/src/contracts/contract-builder.ts +39 -76
  289. package/src/contracts/contract-group.ts +33 -68
  290. package/src/contracts/contract-like.ts +1 -1
  291. package/src/contracts/index.ts +24 -11
  292. package/src/contracts/openapi-meta.ts +55 -0
  293. package/src/contracts/path-template.ts +2 -2
  294. package/src/contracts/schema-shape.ts +75 -0
  295. package/src/contracts/success-status.ts +68 -0
  296. package/src/contracts/types.ts +32 -5
  297. package/src/contracts/utils.ts +5 -2
  298. package/src/domain/events.ts +6 -2
  299. package/src/domain/index.ts +3 -3
  300. package/src/errors/catalog.ts +9 -1
  301. package/src/errors/http.ts +11 -1
  302. package/src/errors/index.ts +4 -4
  303. package/src/errors/response.ts +4 -1
  304. package/src/events/index.ts +12 -26
  305. package/src/idempotency/index.ts +5 -3
  306. package/src/jobs/index.ts +14 -24
  307. package/src/notifications/index.ts +17 -27
  308. package/src/openapi/index.ts +73 -38
  309. package/src/openapi/schema-introspector.ts +68 -17
  310. package/src/outbox/index.ts +84 -19
  311. package/src/ports/audit.ts +120 -11
  312. package/src/ports/auth.ts +132 -0
  313. package/src/ports/events.ts +2 -2
  314. package/src/ports/index.ts +104 -35
  315. package/src/ports/policy.ts +50 -3
  316. package/src/ports/testing.ts +2220 -33
  317. package/src/ports/unbound.ts +64 -0
  318. package/src/ports/unit-of-work.ts +6 -2
  319. package/src/providers/index.ts +16 -3
  320. package/src/providers/instrumentation.ts +86 -7
  321. package/src/providers/metadata.ts +234 -0
  322. package/src/providers/provider.ts +168 -9
  323. package/src/schedules/index.ts +173 -23
  324. package/src/server/audit-context.ts +45 -0
  325. package/src/server/context.ts +224 -0
  326. package/src/server/contract-like.ts +1 -1
  327. package/src/server/health.ts +2 -2
  328. package/src/server/hooks/auth.ts +141 -51
  329. package/src/server/hooks/cors.ts +1 -1
  330. package/src/server/hooks/errors.ts +7 -4
  331. package/src/server/hooks/idempotency.ts +263 -0
  332. package/src/server/hooks/index.ts +14 -7
  333. package/src/server/hooks/logging.ts +3 -3
  334. package/src/server/hooks/rate-limit.ts +85 -17
  335. package/src/server/hooks.ts +1 -1
  336. package/src/server/http.ts +78 -51
  337. package/src/server/index.ts +62 -12
  338. package/src/server/instrumentation.ts +470 -0
  339. package/src/server/openapi.ts +4 -4
  340. package/src/server/providers/index.ts +6 -3
  341. package/src/server/providers/loadProviderConfig.ts +4 -4
  342. package/src/server/request-context.ts +116 -0
  343. package/src/server/server-context.ts +44 -0
  344. package/src/server/server.ts +886 -238
  345. package/src/server/types.ts +2 -2
  346. package/src/server/use-case-route.ts +430 -0
  347. package/src/server-only.ts +7 -0
  348. package/src/tasks/index.ts +275 -0
  349. package/src/testing/index.ts +1142 -6
  350. package/src/tracing/index.ts +176 -0
  351. package/src/uploads/client.ts +1 -1
  352. package/src/uploads/index.ts +7 -3
  353. package/dist/ports/mailer.d.ts +0 -6
  354. package/dist/ports/mailer.d.ts.map +0 -1
  355. package/dist/ports/mailer.js +0 -2
  356. package/dist/ports/mailer.js.map +0 -1
  357. package/dist/ports/schedules.d.ts +0 -9
  358. package/dist/ports/schedules.d.ts.map +0 -1
  359. package/dist/ports/schedules.js +0 -2
  360. package/dist/ports/schedules.js.map +0 -1
@@ -13,33 +13,66 @@ export type {
13
13
  InferOutput,
14
14
  StandardSchema,
15
15
  StandardSchemaV1,
16
- } from "../contracts";
16
+ } from "../contracts/index.js";
17
17
  /**
18
18
  * Application error base class re-exported for server users.
19
19
  */
20
- export { AppError } from "../errors";
20
+ export { AppError } from "../errors/index.js";
21
21
  /**
22
22
  * Any-ports helper type re-exported for server users.
23
23
  */
24
- export type { AnyPorts } from "../ports";
24
+ export type { AnyPorts } from "../ports/index.js";
25
25
  /**
26
26
  * Provider type re-exported for server users.
27
27
  */
28
- export type { ServiceProvider } from "../providers";
29
- export * from "./health";
30
- export * from "./hooks";
31
- export * from "./http";
32
- export * from "./openapi";
33
- export * from "./providers";
28
+ export type { ServiceProvider } from "../providers/index.js";
29
+ /**
30
+ * Ambient audit enrichment for app audit ports.
31
+ */
32
+ export { createAmbientAuditLog } from "./audit-context.js";
33
+ /**
34
+ * Server context blueprint types.
35
+ */
36
+ export type {
37
+ ContextSeed,
38
+ RequestContextArgs,
39
+ ServerContextConfig,
40
+ ServerContextOptions,
41
+ ServiceContextArgs,
42
+ ServiceContextInputArgs,
43
+ } from "./context.js";
44
+ export * from "./health.js";
45
+ export * from "./hooks.js";
46
+ export * from "./http.js";
47
+ /**
48
+ * Server-owned request instrumentation types.
49
+ */
50
+ export type {
51
+ RequestCorrelation,
52
+ ServerInstrumentationOptions,
53
+ } from "./instrumentation.js";
54
+ export * from "./openapi.js";
55
+ export * from "./providers/index.js";
56
+ /**
57
+ * Ambient request correlation context shared with instrumentation sinks.
58
+ */
59
+ export {
60
+ type ActiveRequestContext,
61
+ clearActiveRequestContext,
62
+ enterActiveRequestContext,
63
+ getActiveRequestContext,
64
+ inheritActiveRequestContext,
65
+ } from "./request-context.js";
34
66
  /**
35
67
  * Server configuration and route types.
36
68
  */
37
69
  export type {
38
70
  CreateServerOptions,
71
+ HandlerRouteDef,
39
72
  RouteDef,
40
73
  RouteGroup,
41
74
  ServerInstance,
42
- } from "./server";
75
+ } from "./server.js";
43
76
  /**
44
77
  * Server runtime helpers.
45
78
  */
@@ -49,5 +82,22 @@ export {
49
82
  defineRoute,
50
83
  defineRouteGroup,
51
84
  defineRoutes,
52
- } from "./server";
53
- export * from "./types";
85
+ } from "./server.js";
86
+ /**
87
+ * Server context blueprint declaration helper.
88
+ */
89
+ export { defineServerContext } from "./server-context.js";
90
+ export * from "./types.js";
91
+ /**
92
+ * Contract-aware route binder types and helpers.
93
+ */
94
+ export {
95
+ type AnyUseCaseLike,
96
+ type AnyUseCaseRouteDef,
97
+ type BinderStatusOption,
98
+ defaultBinderInput,
99
+ type UseCaseFitsRoute,
100
+ type UseCaseRouteDef,
101
+ type UseCaseRouteInput,
102
+ type UseCaseRouteInputParts,
103
+ } from "./use-case-route.js";
@@ -0,0 +1,470 @@
1
+ import {
2
+ BEIGNET_ERROR_OWNER_HEADER,
3
+ type HttpContractConfig,
4
+ } from "../contracts/index.js";
5
+ import type { AnyPorts } from "../ports/index.js";
6
+ import { redactValue } from "../ports/redaction.js";
7
+ import {
8
+ type ProviderInstrumentationEventInput,
9
+ type ProviderInstrumentationPort,
10
+ resolveProviderInstrumentationPort,
11
+ } from "../providers/instrumentation.js";
12
+ import {
13
+ createTraceContext,
14
+ parseTraceparent,
15
+ type TraceContext,
16
+ } from "../tracing/index.js";
17
+ import type { HttpRequestLike, HttpResponseLike, ServerHook } from "./http.js";
18
+ import {
19
+ clearActiveRequestContext,
20
+ enterActiveRequestContext,
21
+ readContextActor,
22
+ readContextTenant,
23
+ } from "./request-context.js";
24
+
25
+ /**
26
+ * Options for the server-owned request instrumentation pipeline.
27
+ *
28
+ * The server resolves request IDs and W3C trace context before user hooks and
29
+ * context creation run, writes them to response headers, and records request
30
+ * and error events into the resolved provider instrumentation port
31
+ * (`ports.instrumentation`, then `ports.devtools`) after responses are sent.
32
+ *
33
+ * Pass `instrumentation: false` to `createServer(...)` to disable headers and
34
+ * event recording entirely.
35
+ */
36
+ export interface ServerInstrumentationOptions<Ctx = unknown> {
37
+ /**
38
+ * Request/response header used for the request correlation ID.
39
+ *
40
+ * Pass `false` to avoid reading or writing a request ID header.
41
+ *
42
+ * @default "x-request-id"
43
+ */
44
+ requestIdHeader?: string | false;
45
+
46
+ /**
47
+ * W3C trace context header used to correlate events with distributed
48
+ * traces.
49
+ *
50
+ * Pass `false` to avoid reading or writing a trace context header.
51
+ *
52
+ * @default "traceparent"
53
+ */
54
+ traceContextHeader?: string | false;
55
+
56
+ /**
57
+ * Request path prefixes that should not enter ambient correlation or record
58
+ * events. Response headers are still written.
59
+ *
60
+ * Defaults to the devtools dashboard prefix so its polling traffic does not
61
+ * fill the event timeline.
62
+ *
63
+ * @default ["/api/devtools"]
64
+ */
65
+ ignorePaths?: readonly string[];
66
+
67
+ /**
68
+ * Apply a custom redactor to events produced by the server. Sink-level
69
+ * redaction (such as the devtools redactor) still runs when events are
70
+ * stored.
71
+ */
72
+ redact?: (
73
+ event: ProviderInstrumentationEventInput,
74
+ ) => ProviderInstrumentationEventInput;
75
+
76
+ /**
77
+ * Decide whether to capture a completed request event.
78
+ */
79
+ shouldCapture?: (args: {
80
+ req: HttpRequestLike;
81
+ ctx?: Ctx;
82
+ contract: HttpContractConfig;
83
+ response: HttpResponseLike;
84
+ error?: unknown;
85
+ }) => boolean;
86
+ }
87
+
88
+ /**
89
+ * Correlation values resolved by the server for one request or service
90
+ * context.
91
+ */
92
+ export interface RequestCorrelation {
93
+ /**
94
+ * Request correlation ID.
95
+ */
96
+ requestId: string;
97
+ /**
98
+ * W3C trace context.
99
+ */
100
+ trace: TraceContext;
101
+ }
102
+
103
+ /**
104
+ * Internal runtime created by `createServer(...)` from its `instrumentation`
105
+ * option.
106
+ */
107
+ export interface ServerInstrumentationRuntime<Ctx> {
108
+ /**
109
+ * Resolve the instrumentation sink once final ports are known.
110
+ */
111
+ attachPorts(ports: AnyPorts): void;
112
+ /**
113
+ * Resolve (and cache per request) the request ID and trace context.
114
+ */
115
+ prepareRequest(req: HttpRequestLike): RequestCorrelation;
116
+ /**
117
+ * Create fresh correlation values for a service context.
118
+ */
119
+ createServiceCorrelation(): RequestCorrelation;
120
+ /**
121
+ * Pipeline hook installed before user hooks, when instrumentation is
122
+ * enabled.
123
+ */
124
+ hook?: ServerHook<Ctx, AnyPorts>;
125
+ }
126
+
127
+ type TraceContextFields = {
128
+ traceId?: string;
129
+ spanId?: string;
130
+ parentSpanId?: string;
131
+ traceparent?: string;
132
+ };
133
+
134
+ function getContextRequestId(ctx: unknown): string | undefined {
135
+ if (!ctx || typeof ctx !== "object") return undefined;
136
+ const requestId = (ctx as { requestId?: unknown }).requestId;
137
+ return typeof requestId === "string" ? requestId : undefined;
138
+ }
139
+
140
+ function getContextTraceContext(ctx: unknown): TraceContextFields | undefined {
141
+ if (!ctx || typeof ctx !== "object") return undefined;
142
+ const context = ctx as TraceContextFields;
143
+ if (
144
+ !context.traceId &&
145
+ !context.spanId &&
146
+ !context.parentSpanId &&
147
+ !context.traceparent
148
+ ) {
149
+ return undefined;
150
+ }
151
+ return {
152
+ traceId: context.traceId,
153
+ spanId: context.spanId,
154
+ parentSpanId: context.parentSpanId,
155
+ traceparent: context.traceparent,
156
+ };
157
+ }
158
+
159
+ function getErrorMessage(error: unknown): string {
160
+ if (error instanceof Error) return error.message;
161
+ if (typeof error === "string") return error;
162
+ return "Unknown error";
163
+ }
164
+
165
+ function getErrorStack(error: unknown): string | undefined {
166
+ return error instanceof Error ? error.stack : undefined;
167
+ }
168
+
169
+ function createRequestId(): string {
170
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
171
+ return crypto.randomUUID();
172
+ }
173
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
174
+ }
175
+
176
+ function getPathname(req: HttpRequestLike): string {
177
+ try {
178
+ return new URL(req.url).pathname;
179
+ } catch {
180
+ return req.url;
181
+ }
182
+ }
183
+
184
+ function isIgnoredPath(
185
+ pathname: string,
186
+ ignorePaths: readonly string[],
187
+ ): boolean {
188
+ return ignorePaths.some((ignorePath) => {
189
+ const normalized = ignorePath.replace(/\/+$/, "");
190
+ return pathname === normalized || pathname.startsWith(`${normalized}/`);
191
+ });
192
+ }
193
+
194
+ function requestHeadersToRecord(headers: Headers): Record<string, string> {
195
+ const record: Record<string, string> = {};
196
+ headers.forEach((value, key) => {
197
+ record[key] = value;
198
+ });
199
+ return record;
200
+ }
201
+
202
+ function getResponseHeader(
203
+ headers: Record<string, string> | undefined,
204
+ name: string,
205
+ ): string | undefined {
206
+ if (!headers) return undefined;
207
+ const direct = headers[name];
208
+ if (direct !== undefined) return direct;
209
+ const normalized = name.toLowerCase();
210
+ const entry = Object.entries(headers).find(
211
+ ([key]) => key.toLowerCase() === normalized,
212
+ );
213
+ return entry?.[1];
214
+ }
215
+
216
+ function getResponseOwner(
217
+ response: HttpResponseLike,
218
+ ): "route" | "framework" | "transport" | "unknown" {
219
+ return getResponseHeader(response.headers, BEIGNET_ERROR_OWNER_HEADER) ===
220
+ "framework"
221
+ ? "framework"
222
+ : "route";
223
+ }
224
+
225
+ function isWatcherEnabled(
226
+ port: ProviderInstrumentationPort,
227
+ name: string,
228
+ ): boolean {
229
+ return port.isWatcherEnabled?.(name) ?? true;
230
+ }
231
+
232
+ /**
233
+ * Create the server-owned instrumentation runtime for `createServer(...)`.
234
+ *
235
+ * Correlation values (request ID and trace context) are always resolved so
236
+ * context factories receive stable `requestId`/`trace` arguments, even when
237
+ * instrumentation is disabled. Headers and event recording only run when
238
+ * instrumentation is enabled.
239
+ */
240
+ export function createServerInstrumentation<Ctx>(
241
+ options: ServerInstrumentationOptions<Ctx> | false | undefined,
242
+ ): ServerInstrumentationRuntime<Ctx> {
243
+ const enabled = options !== false;
244
+ const resolvedOptions =
245
+ options === false || options === undefined ? {} : options;
246
+ const requestIdHeader = resolvedOptions.requestIdHeader ?? "x-request-id";
247
+ const traceContextHeader =
248
+ resolvedOptions.traceContextHeader ?? "traceparent";
249
+ const ignorePaths = resolvedOptions.ignorePaths ?? ["/api/devtools"];
250
+
251
+ let port: ProviderInstrumentationPort | undefined;
252
+ const correlations = new WeakMap<HttpRequestLike, RequestCorrelation>();
253
+
254
+ const prepareRequest = (req: HttpRequestLike): RequestCorrelation => {
255
+ const cached = correlations.get(req);
256
+ if (cached) return cached;
257
+
258
+ const headerRequestId =
259
+ requestIdHeader === false
260
+ ? undefined
261
+ : (req.headers.get(requestIdHeader) ?? undefined);
262
+ const headerTraceparent =
263
+ traceContextHeader === false
264
+ ? undefined
265
+ : (req.headers.get(traceContextHeader) ?? undefined);
266
+
267
+ const correlation: RequestCorrelation = {
268
+ requestId: headerRequestId ?? createRequestId(),
269
+ trace: createTraceContext({
270
+ traceparent: parseTraceparent(headerTraceparent)?.traceparent,
271
+ }),
272
+ };
273
+ correlations.set(req, correlation);
274
+ return correlation;
275
+ };
276
+
277
+ const resolveRequestId = (args: {
278
+ req: HttpRequestLike;
279
+ ctx?: unknown;
280
+ }): string =>
281
+ getContextRequestId(args.ctx) ?? prepareRequest(args.req).requestId;
282
+
283
+ const resolveTraceContext = (args: {
284
+ req: HttpRequestLike;
285
+ ctx?: unknown;
286
+ }): TraceContext => {
287
+ const contextTrace = getContextTraceContext(args.ctx);
288
+ if (contextTrace) {
289
+ return createTraceContext(contextTrace);
290
+ }
291
+ return prepareRequest(args.req).trace;
292
+ };
293
+
294
+ const record = (event: ProviderInstrumentationEventInput) => {
295
+ if (!port) return;
296
+
297
+ let prepared = redactValue(event);
298
+ if (resolvedOptions.redact) {
299
+ try {
300
+ prepared = resolvedOptions.redact(prepared);
301
+ } catch (error) {
302
+ try {
303
+ port.record({
304
+ type: "error",
305
+ message: "Server instrumentation redactor failed",
306
+ owner: "framework",
307
+ details: {
308
+ message: getErrorMessage(error),
309
+ },
310
+ });
311
+ } catch {
312
+ // Instrumentation sinks must never affect responses.
313
+ }
314
+ return;
315
+ }
316
+ }
317
+
318
+ try {
319
+ port.record(prepared);
320
+ } catch {
321
+ // Instrumentation sinks must never affect responses.
322
+ }
323
+ };
324
+
325
+ const enterAmbientContext = (args: {
326
+ req: HttpRequestLike;
327
+ ctx?: unknown;
328
+ }) => {
329
+ if (isIgnoredPath(getPathname(args.req), ignorePaths)) return;
330
+ const trace = resolveTraceContext(args);
331
+ enterActiveRequestContext({
332
+ requestId: resolveRequestId(args),
333
+ traceId: trace.traceId,
334
+ spanId: trace.spanId,
335
+ parentSpanId: trace.parentSpanId,
336
+ traceparent: trace.traceparent,
337
+ actor: readContextActor(args.ctx),
338
+ tenant: readContextTenant(args.ctx),
339
+ });
340
+ };
341
+
342
+ const hook: ServerHook<Ctx, AnyPorts> = {
343
+ name: "beignet.instrumentation",
344
+ onRequest: ({ req }) => {
345
+ enterAmbientContext({ req });
346
+ return undefined;
347
+ },
348
+ beforeHandle: ({ req, ctx }) => {
349
+ // Re-enter with context values so app-owned overrides win for ambient
350
+ // correlation inheritance.
351
+ enterAmbientContext({ req, ctx });
352
+ return undefined;
353
+ },
354
+ beforeSend: ({ req, ctx, response }) => {
355
+ if (requestIdHeader === false && traceContextHeader === false) {
356
+ return undefined;
357
+ }
358
+
359
+ const requestId = resolveRequestId({ req, ctx });
360
+ const trace = resolveTraceContext({ req, ctx });
361
+ return {
362
+ ...response,
363
+ headers: {
364
+ ...response.headers,
365
+ ...(requestIdHeader === false
366
+ ? {}
367
+ : { [requestIdHeader]: requestId }),
368
+ ...(traceContextHeader === false
369
+ ? {}
370
+ : { [traceContextHeader]: trace.traceparent }),
371
+ },
372
+ };
373
+ },
374
+ afterSend: ({ req, ctx, contract, response, error, durationMs }) => {
375
+ try {
376
+ if (!port) return;
377
+
378
+ const path = getPathname(req);
379
+ if (isIgnoredPath(path, ignorePaths)) return;
380
+
381
+ const shouldCaptureRequest = isWatcherEnabled(port, "requests");
382
+ const shouldCaptureError =
383
+ Boolean(error) && isWatcherEnabled(port, "errors");
384
+ if (!shouldCaptureRequest && !shouldCaptureError) return;
385
+
386
+ if (
387
+ resolvedOptions.shouldCapture &&
388
+ !resolvedOptions.shouldCapture({
389
+ req,
390
+ ctx: ctx as Ctx | undefined,
391
+ contract,
392
+ response,
393
+ error,
394
+ })
395
+ ) {
396
+ return;
397
+ }
398
+
399
+ const requestId = resolveRequestId({ req, ctx });
400
+ const trace = resolveTraceContext({ req, ctx });
401
+ const responseOwner = getResponseOwner(response);
402
+
403
+ if (shouldCaptureRequest) {
404
+ record({
405
+ type: "request",
406
+ requestId,
407
+ traceId: trace.traceId,
408
+ spanId: trace.spanId,
409
+ parentSpanId: trace.parentSpanId,
410
+ traceparent: trace.traceparent,
411
+ method: req.method,
412
+ path,
413
+ contractName: contract.name,
414
+ responseOwner,
415
+ status: response.status,
416
+ durationMs,
417
+ details: {
418
+ headers: requestHeadersToRecord(req.headers),
419
+ route: {
420
+ contractName: contract.name,
421
+ method: req.method,
422
+ path,
423
+ },
424
+ response: {
425
+ owner: responseOwner,
426
+ status: response.status,
427
+ },
428
+ hookPhases: [
429
+ "onRequest",
430
+ "beforeHandle",
431
+ "beforeSend",
432
+ "afterSend",
433
+ ],
434
+ },
435
+ });
436
+ }
437
+
438
+ if (error && shouldCaptureError) {
439
+ record({
440
+ type: "error",
441
+ requestId,
442
+ traceId: trace.traceId,
443
+ spanId: trace.spanId,
444
+ parentSpanId: trace.parentSpanId,
445
+ traceparent: trace.traceparent,
446
+ message: getErrorMessage(error),
447
+ stack: getErrorStack(error),
448
+ contractName: contract.name,
449
+ owner: responseOwner === "framework" ? "framework" : "route",
450
+ });
451
+ }
452
+ } finally {
453
+ clearActiveRequestContext();
454
+ }
455
+ },
456
+ };
457
+
458
+ return {
459
+ attachPorts(ports) {
460
+ if (!enabled) return;
461
+ port = resolveProviderInstrumentationPort(ports);
462
+ },
463
+ prepareRequest,
464
+ createServiceCorrelation: () => ({
465
+ requestId: createRequestId(),
466
+ trace: createTraceContext(),
467
+ }),
468
+ hook: enabled ? hook : undefined,
469
+ };
470
+ }
@@ -3,9 +3,9 @@
3
3
  * OpenAPI helpers for the Beignet server runtime.
4
4
  */
5
5
 
6
- import type { HttpContractConfig } from "../contracts";
7
- import type { AppEnvironment } from "./health";
8
- import type { HttpRequestLike, HttpResponseLike } from "./types";
6
+ import type { HttpContractConfig } from "../contracts/index.js";
7
+ import type { AppEnvironment } from "./health.js";
8
+ import type { HttpRequestLike, HttpResponseLike } from "./types.js";
9
9
 
10
10
  /**
11
11
  * OpenAPI route handler configuration.
@@ -46,7 +46,7 @@ export function createOpenAPIHandler(
46
46
  if (!cachedSpec) {
47
47
  try {
48
48
  // Dynamic import to avoid hard dependency
49
- const { contractsToOpenAPI } = await import("../openapi");
49
+ const { contractsToOpenAPI } = await import("../openapi/index.js");
50
50
  cachedSpec = contractsToOpenAPI(contracts, {
51
51
  title: openapiConfig?.title ?? "Beignet API",
52
52
  version: openapiConfig?.version ?? "1.0.0",
@@ -1,3 +1,6 @@
1
- export { ConfigValidationError, readEnv } from "../../config";
2
- export { SchemaValidationError } from "../../errors";
3
- export { loadProviderConfig, parseStandardSchema } from "./loadProviderConfig";
1
+ export { ConfigValidationError, readEnv } from "../../config/index.js";
2
+ export { SchemaValidationError } from "../../errors/index.js";
3
+ export {
4
+ loadProviderConfig,
5
+ parseStandardSchema,
6
+ } from "./loadProviderConfig.js";
@@ -3,10 +3,10 @@ import {
3
3
  ConfigValidationError,
4
4
  parseStandardSchemaAsync,
5
5
  readEnv,
6
- } from "../../config";
7
- import { SchemaValidationError } from "../../errors";
8
- import type { AnyPorts } from "../../ports";
9
- import type { ServiceProvider } from "../../providers";
6
+ } from "../../config/index.js";
7
+ import { SchemaValidationError } from "../../errors/index.js";
8
+ import type { AnyPorts } from "../../ports/index.js";
9
+ import type { ServiceProvider } from "../../providers/index.js";
10
10
 
11
11
  type ProviderConfigDef<Schema extends StandardSchemaV1<unknown, unknown>> = {
12
12
  schema: Schema;