@astrale-os/kernel-server 0.4.17 → 0.5.0-beta.2

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 (313) hide show
  1. package/dist/capture.d.ts +3 -0
  2. package/dist/capture.d.ts.map +1 -0
  3. package/dist/capture.js +10 -0
  4. package/dist/capture.js.map +1 -0
  5. package/dist/cors/cors.d.ts +22 -0
  6. package/dist/cors/cors.d.ts.map +1 -0
  7. package/dist/cors/cors.js +136 -0
  8. package/dist/cors/cors.js.map +1 -0
  9. package/dist/cors/index.d.ts +3 -0
  10. package/dist/cors/index.d.ts.map +1 -0
  11. package/dist/cors/index.js +2 -0
  12. package/dist/cors/index.js.map +1 -0
  13. package/dist/cors/types.d.ts +12 -0
  14. package/dist/cors/types.d.ts.map +1 -0
  15. package/dist/cors/types.js +2 -0
  16. package/dist/cors/types.js.map +1 -0
  17. package/dist/errors/availability.d.ts +11 -0
  18. package/dist/errors/availability.d.ts.map +1 -0
  19. package/dist/errors/availability.js +15 -0
  20. package/dist/errors/availability.js.map +1 -0
  21. package/dist/errors/classify.d.ts +4 -0
  22. package/dist/errors/classify.d.ts.map +1 -0
  23. package/dist/errors/classify.js +316 -0
  24. package/dist/errors/classify.js.map +1 -0
  25. package/dist/errors/index.d.ts +5 -0
  26. package/dist/errors/index.d.ts.map +1 -0
  27. package/dist/errors/index.js +5 -0
  28. package/dist/errors/index.js.map +1 -0
  29. package/dist/errors/request-body.d.ts +8 -0
  30. package/dist/errors/request-body.d.ts.map +1 -0
  31. package/dist/errors/request-body.js +15 -0
  32. package/dist/errors/request-body.js.map +1 -0
  33. package/dist/errors/response-body.d.ts +5 -0
  34. package/dist/errors/response-body.d.ts.map +1 -0
  35. package/dist/errors/response-body.js +9 -0
  36. package/dist/errors/response-body.js.map +1 -0
  37. package/dist/index.d.ts +5 -11
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +4 -18
  40. package/dist/index.js.map +1 -1
  41. package/dist/invocation/context.d.ts +7 -0
  42. package/dist/invocation/context.d.ts.map +1 -0
  43. package/dist/invocation/context.js +61 -0
  44. package/dist/invocation/context.js.map +1 -0
  45. package/dist/invocation/index.d.ts +3 -2
  46. package/dist/invocation/index.d.ts.map +1 -1
  47. package/dist/invocation/index.js +2 -2
  48. package/dist/invocation/index.js.map +1 -1
  49. package/dist/invocation/publication-route.d.ts +12 -0
  50. package/dist/invocation/publication-route.d.ts.map +1 -0
  51. package/dist/invocation/publication-route.js +43 -0
  52. package/dist/invocation/publication-route.js.map +1 -0
  53. package/dist/invocation/types.d.ts +38 -0
  54. package/dist/invocation/types.d.ts.map +1 -0
  55. package/dist/invocation/types.js +2 -0
  56. package/dist/invocation/types.js.map +1 -0
  57. package/dist/issuer/exchange.d.ts +13 -0
  58. package/dist/issuer/exchange.d.ts.map +1 -0
  59. package/dist/issuer/exchange.js +135 -0
  60. package/dist/issuer/exchange.js.map +1 -0
  61. package/dist/issuer/index.d.ts +4 -0
  62. package/dist/issuer/index.d.ts.map +1 -0
  63. package/dist/issuer/index.js +2 -0
  64. package/dist/issuer/index.js.map +1 -0
  65. package/dist/issuer/routes.d.ts +14 -0
  66. package/dist/issuer/routes.d.ts.map +1 -0
  67. package/dist/issuer/routes.js +147 -0
  68. package/dist/issuer/routes.js.map +1 -0
  69. package/dist/issuer/types.d.ts +11 -0
  70. package/dist/issuer/types.d.ts.map +1 -0
  71. package/dist/issuer/types.js +2 -0
  72. package/dist/issuer/types.js.map +1 -0
  73. package/dist/lifecycle/active.d.ts +40 -0
  74. package/dist/lifecycle/active.d.ts.map +1 -0
  75. package/dist/lifecycle/active.js +200 -0
  76. package/dist/lifecycle/active.js.map +1 -0
  77. package/dist/lifecycle/index.d.ts +2 -0
  78. package/dist/lifecycle/index.d.ts.map +1 -0
  79. package/dist/lifecycle/index.js +2 -0
  80. package/dist/lifecycle/index.js.map +1 -0
  81. package/dist/publication/delivery/handler.d.ts +10 -0
  82. package/dist/publication/delivery/handler.d.ts.map +1 -0
  83. package/dist/publication/delivery/handler.js +127 -0
  84. package/dist/publication/delivery/handler.js.map +1 -0
  85. package/dist/publication/delivery/index.d.ts +3 -0
  86. package/dist/publication/delivery/index.d.ts.map +1 -0
  87. package/dist/publication/delivery/index.js +2 -0
  88. package/dist/publication/delivery/index.js.map +1 -0
  89. package/dist/publication/delivery/types.d.ts +12 -0
  90. package/dist/publication/delivery/types.d.ts.map +1 -0
  91. package/dist/publication/delivery/types.js +2 -0
  92. package/dist/publication/delivery/types.js.map +1 -0
  93. package/dist/publication/index.d.ts +4 -0
  94. package/dist/publication/index.d.ts.map +1 -0
  95. package/dist/publication/index.js +3 -0
  96. package/dist/publication/index.js.map +1 -0
  97. package/dist/publication/snapshot.d.ts +14 -0
  98. package/dist/publication/snapshot.d.ts.map +1 -0
  99. package/dist/publication/snapshot.js +30 -0
  100. package/dist/publication/snapshot.js.map +1 -0
  101. package/dist/publication/types.d.ts +19 -0
  102. package/dist/publication/types.d.ts.map +1 -0
  103. package/dist/publication/types.js +2 -0
  104. package/dist/publication/types.js.map +1 -0
  105. package/dist/routes/index.d.ts +2 -0
  106. package/dist/routes/index.d.ts.map +1 -0
  107. package/dist/routes/index.js +2 -0
  108. package/dist/routes/index.js.map +1 -0
  109. package/dist/routes/routes.d.ts +25 -0
  110. package/dist/routes/routes.d.ts.map +1 -0
  111. package/dist/routes/routes.js +448 -0
  112. package/dist/routes/routes.js.map +1 -0
  113. package/dist/server.d.ts +5 -0
  114. package/dist/server.d.ts.map +1 -0
  115. package/dist/server.js +260 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/transport/body.d.ts +5 -0
  118. package/dist/transport/body.d.ts.map +1 -0
  119. package/dist/transport/body.js +51 -0
  120. package/dist/transport/body.js.map +1 -0
  121. package/dist/transport/codecs.d.ts +5 -0
  122. package/dist/transport/codecs.d.ts.map +1 -0
  123. package/dist/transport/codecs.js +6 -0
  124. package/dist/transport/codecs.js.map +1 -0
  125. package/dist/transport/credential.d.ts +11 -0
  126. package/dist/transport/credential.d.ts.map +1 -0
  127. package/dist/transport/credential.js +29 -0
  128. package/dist/transport/credential.js.map +1 -0
  129. package/dist/transport/http/handler.d.ts +16 -0
  130. package/dist/transport/http/handler.d.ts.map +1 -0
  131. package/dist/transport/http/handler.js +177 -0
  132. package/dist/transport/http/handler.js.map +1 -0
  133. package/dist/transport/http/index.d.ts +3 -0
  134. package/dist/transport/http/index.d.ts.map +1 -0
  135. package/dist/transport/http/index.js +3 -0
  136. package/dist/transport/http/index.js.map +1 -0
  137. package/dist/transport/http/render.d.ts +29 -0
  138. package/dist/transport/http/render.d.ts.map +1 -0
  139. package/dist/transport/http/render.js +278 -0
  140. package/dist/transport/http/render.js.map +1 -0
  141. package/dist/transport/index.d.ts +10 -0
  142. package/dist/transport/index.d.ts.map +1 -0
  143. package/dist/transport/index.js +9 -0
  144. package/dist/transport/index.js.map +1 -0
  145. package/dist/transport/router.d.ts +5 -0
  146. package/dist/transport/router.d.ts.map +1 -0
  147. package/dist/transport/router.js +5 -0
  148. package/dist/transport/router.js.map +1 -0
  149. package/dist/transport/stream-error.d.ts +4 -0
  150. package/dist/transport/stream-error.d.ts.map +1 -0
  151. package/dist/transport/stream-error.js +14 -0
  152. package/dist/transport/stream-error.js.map +1 -0
  153. package/dist/transport/types.d.ts +29 -0
  154. package/dist/transport/types.d.ts.map +1 -0
  155. package/dist/transport/types.js +2 -0
  156. package/dist/transport/types.js.map +1 -0
  157. package/dist/transport/websocket/index.d.ts +3 -0
  158. package/dist/transport/websocket/index.d.ts.map +1 -0
  159. package/dist/transport/websocket/index.js +3 -0
  160. package/dist/transport/websocket/index.js.map +1 -0
  161. package/dist/transport/websocket/session.d.ts +19 -0
  162. package/dist/transport/websocket/session.d.ts.map +1 -0
  163. package/dist/transport/websocket/session.js +329 -0
  164. package/dist/transport/websocket/session.js.map +1 -0
  165. package/dist/transport/websocket/upgrade.d.ts +19 -0
  166. package/dist/transport/websocket/upgrade.d.ts.map +1 -0
  167. package/dist/transport/websocket/upgrade.js +46 -0
  168. package/dist/transport/websocket/upgrade.js.map +1 -0
  169. package/dist/types.d.ts +63 -0
  170. package/dist/types.d.ts.map +1 -0
  171. package/dist/types.js +2 -0
  172. package/dist/types.js.map +1 -0
  173. package/package.json +10 -11
  174. package/dist/app/create.d.ts +0 -48
  175. package/dist/app/create.d.ts.map +0 -1
  176. package/dist/app/create.js +0 -108
  177. package/dist/app/create.js.map +0 -1
  178. package/dist/app/index.d.ts +0 -4
  179. package/dist/app/index.d.ts.map +0 -1
  180. package/dist/app/index.js +0 -4
  181. package/dist/app/index.js.map +0 -1
  182. package/dist/app/multiplexed.d.ts +0 -53
  183. package/dist/app/multiplexed.d.ts.map +0 -1
  184. package/dist/app/multiplexed.js +0 -64
  185. package/dist/app/multiplexed.js.map +0 -1
  186. package/dist/app/ws-upgrade.d.ts +0 -34
  187. package/dist/app/ws-upgrade.d.ts.map +0 -1
  188. package/dist/app/ws-upgrade.js +0 -94
  189. package/dist/app/ws-upgrade.js.map +0 -1
  190. package/dist/capabilities/contract.d.ts +0 -8
  191. package/dist/capabilities/contract.d.ts.map +0 -1
  192. package/dist/capabilities/contract.js +0 -2
  193. package/dist/capabilities/contract.js.map +0 -1
  194. package/dist/capabilities/defer.d.ts +0 -4
  195. package/dist/capabilities/defer.d.ts.map +0 -1
  196. package/dist/capabilities/defer.js +0 -2
  197. package/dist/capabilities/defer.js.map +0 -1
  198. package/dist/capabilities/hono.d.ts +0 -8
  199. package/dist/capabilities/hono.d.ts.map +0 -1
  200. package/dist/capabilities/hono.js +0 -13
  201. package/dist/capabilities/hono.js.map +0 -1
  202. package/dist/capabilities/index.d.ts +0 -6
  203. package/dist/capabilities/index.d.ts.map +0 -1
  204. package/dist/capabilities/index.js +0 -3
  205. package/dist/capabilities/index.js.map +0 -1
  206. package/dist/capabilities/lifecycle.d.ts +0 -17
  207. package/dist/capabilities/lifecycle.d.ts.map +0 -1
  208. package/dist/capabilities/lifecycle.js +0 -37
  209. package/dist/capabilities/lifecycle.js.map +0 -1
  210. package/dist/capabilities/sleep.d.ts +0 -4
  211. package/dist/capabilities/sleep.d.ts.map +0 -1
  212. package/dist/capabilities/sleep.js +0 -8
  213. package/dist/capabilities/sleep.js.map +0 -1
  214. package/dist/cors.d.ts +0 -21
  215. package/dist/cors.d.ts.map +0 -1
  216. package/dist/cors.js +0 -17
  217. package/dist/cors.js.map +0 -1
  218. package/dist/envelope/batch.d.ts +0 -13
  219. package/dist/envelope/batch.d.ts.map +0 -1
  220. package/dist/envelope/batch.js +0 -96
  221. package/dist/envelope/batch.js.map +0 -1
  222. package/dist/envelope/codec.d.ts +0 -26
  223. package/dist/envelope/codec.d.ts.map +0 -1
  224. package/dist/envelope/codec.js +0 -52
  225. package/dist/envelope/codec.js.map +0 -1
  226. package/dist/envelope/credential.d.ts +0 -20
  227. package/dist/envelope/credential.d.ts.map +0 -1
  228. package/dist/envelope/credential.js +0 -32
  229. package/dist/envelope/credential.js.map +0 -1
  230. package/dist/envelope/http.d.ts +0 -31
  231. package/dist/envelope/http.d.ts.map +0 -1
  232. package/dist/envelope/http.js +0 -132
  233. package/dist/envelope/http.js.map +0 -1
  234. package/dist/envelope/sse.d.ts +0 -11
  235. package/dist/envelope/sse.d.ts.map +0 -1
  236. package/dist/envelope/sse.js +0 -73
  237. package/dist/envelope/sse.js.map +0 -1
  238. package/dist/envelope/ws.d.ts +0 -35
  239. package/dist/envelope/ws.d.ts.map +0 -1
  240. package/dist/envelope/ws.js +0 -142
  241. package/dist/envelope/ws.js.map +0 -1
  242. package/dist/invocation/dispatch.d.ts +0 -32
  243. package/dist/invocation/dispatch.d.ts.map +0 -1
  244. package/dist/invocation/dispatch.js +0 -68
  245. package/dist/invocation/dispatch.js.map +0 -1
  246. package/dist/invocation/dispatcher.d.ts +0 -19
  247. package/dist/invocation/dispatcher.d.ts.map +0 -1
  248. package/dist/invocation/dispatcher.js +0 -9
  249. package/dist/invocation/dispatcher.js.map +0 -1
  250. package/dist/jwks/discovery.d.ts +0 -40
  251. package/dist/jwks/discovery.d.ts.map +0 -1
  252. package/dist/jwks/discovery.js +0 -113
  253. package/dist/jwks/discovery.js.map +0 -1
  254. package/dist/jwks/index.d.ts +0 -3
  255. package/dist/jwks/index.d.ts.map +0 -1
  256. package/dist/jwks/index.js +0 -3
  257. package/dist/jwks/index.js.map +0 -1
  258. package/dist/jwks/issuers.d.ts +0 -47
  259. package/dist/jwks/issuers.d.ts.map +0 -1
  260. package/dist/jwks/issuers.js +0 -76
  261. package/dist/jwks/issuers.js.map +0 -1
  262. package/dist/jwks/keys.d.ts +0 -44
  263. package/dist/jwks/keys.d.ts.map +0 -1
  264. package/dist/jwks/keys.js +0 -56
  265. package/dist/jwks/keys.js.map +0 -1
  266. package/dist/plan/host-params.d.ts +0 -13
  267. package/dist/plan/host-params.d.ts.map +0 -1
  268. package/dist/plan/host-params.js +0 -23
  269. package/dist/plan/host-params.js.map +0 -1
  270. package/dist/plan/host.d.ts +0 -24
  271. package/dist/plan/host.d.ts.map +0 -1
  272. package/dist/plan/host.js +0 -24
  273. package/dist/plan/host.js.map +0 -1
  274. package/dist/plan/index.d.ts +0 -4
  275. package/dist/plan/index.d.ts.map +0 -1
  276. package/dist/plan/index.js +0 -4
  277. package/dist/plan/index.js.map +0 -1
  278. package/dist/plan/walk.d.ts +0 -51
  279. package/dist/plan/walk.d.ts.map +0 -1
  280. package/dist/plan/walk.js +0 -110
  281. package/dist/plan/walk.js.map +0 -1
  282. package/dist/render/binary.d.ts +0 -19
  283. package/dist/render/binary.d.ts.map +0 -1
  284. package/dist/render/binary.js +0 -33
  285. package/dist/render/binary.js.map +0 -1
  286. package/dist/render/body.d.ts +0 -10
  287. package/dist/render/body.d.ts.map +0 -1
  288. package/dist/render/body.js +0 -17
  289. package/dist/render/body.js.map +0 -1
  290. package/dist/render/index.d.ts +0 -3
  291. package/dist/render/index.d.ts.map +0 -1
  292. package/dist/render/index.js +0 -3
  293. package/dist/render/index.js.map +0 -1
  294. package/dist/routed/credential.d.ts +0 -10
  295. package/dist/routed/credential.d.ts.map +0 -1
  296. package/dist/routed/credential.js +0 -55
  297. package/dist/routed/credential.js.map +0 -1
  298. package/dist/routed/handler.d.ts +0 -38
  299. package/dist/routed/handler.d.ts.map +0 -1
  300. package/dist/routed/handler.js +0 -123
  301. package/dist/routed/handler.js.map +0 -1
  302. package/dist/routed/index.d.ts +0 -5
  303. package/dist/routed/index.d.ts.map +0 -1
  304. package/dist/routed/index.js +0 -5
  305. package/dist/routed/index.js.map +0 -1
  306. package/dist/routed/params.d.ts +0 -40
  307. package/dist/routed/params.d.ts.map +0 -1
  308. package/dist/routed/params.js +0 -146
  309. package/dist/routed/params.js.map +0 -1
  310. package/dist/routed/stream.d.ts +0 -21
  311. package/dist/routed/stream.d.ts.map +0 -1
  312. package/dist/routed/stream.js +0 -69
  313. package/dist/routed/stream.js.map +0 -1
@@ -0,0 +1,5 @@
1
+ import type { Server, ServerConfig, ServerOptions, PreparedServer } from './types.js';
2
+ export declare function createServer(config: ServerConfig): Server;
3
+ /** Validate all static transport configuration before a Host starts Runtime recovery/bootstrap. */
4
+ export declare function prepareServer(options: ServerOptions): PreparedServer;
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,aAAa,EACb,cAAc,EAGf,MAAM,YAAY,CAAA;AAUnB,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAGzD;AAED,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAKpE"}
package/dist/server.js ADDED
@@ -0,0 +1,260 @@
1
+ import { publication as protocolPublication } from '@astrale-os/kernel-protocol';
2
+ import { captureMethod } from './capture.js';
3
+ import { prepareCors } from './cors/index.js';
4
+ import { capture as captureExchangeProvider } from './issuer/exchange.js';
5
+ import { admitIssuer, issuerRouteReservations, mountIssuer } from './issuer/index.js';
6
+ import { ActiveOperations } from './lifecycle/index.js';
7
+ import { currentPublicationSnapshot, mountRoutes } from './routes/index.js';
8
+ import { createHttpHandler, createServerRouter, handleWebSocketUpgrade } from './transport/index.js';
9
+ export function createServer(config) {
10
+ const { handler, ...options } = config;
11
+ return prepareServer(options).create(handler);
12
+ }
13
+ /** Validate all static transport configuration before a Host starts Runtime recovery/bootstrap. */
14
+ export function prepareServer(options) {
15
+ const prepared = admitOptions(options);
16
+ return Object.freeze({
17
+ create: (handler) => createPreparedServer(handler, prepared),
18
+ });
19
+ }
20
+ function createPreparedServer(input, config) {
21
+ const handler = captureHandler(input);
22
+ const active = new ActiveOperations(config.limits.maximumConcurrentOperations);
23
+ const app = createServerRouter();
24
+ const hosts = new WeakMap();
25
+ const externalIssuer = config.issuer?.issuer;
26
+ const externalOrigin = externalIssuer === undefined ? undefined : new URL(externalIssuer).origin;
27
+ const handleHttp = createHttpHandler({
28
+ handler,
29
+ active,
30
+ ...config.limits,
31
+ cors: config.cors,
32
+ websocket: config.websocket !== undefined,
33
+ ...(config.publication === undefined
34
+ ? {}
35
+ : {
36
+ currentPublication: (request) => currentPublicationSnapshot(config.publication, config.limits, {
37
+ origin: externalOrigin ?? new URL(request.url).origin,
38
+ ...(externalIssuer === undefined ? {} : { issuer: externalIssuer }),
39
+ reservations: config.routeReservations,
40
+ })?.snapshot,
41
+ }),
42
+ });
43
+ if (config.websocket !== undefined) {
44
+ app.get(config.path, (context) => handleWebSocketUpgrade({
45
+ request: context.req.raw,
46
+ adapter: config.websocket,
47
+ handler,
48
+ active,
49
+ ...config.limits,
50
+ cors: config.cors,
51
+ ...(config.publication === undefined
52
+ ? {}
53
+ : {
54
+ currentPublication: () => currentPublicationSnapshot(config.publication, config.limits, {
55
+ origin: externalOrigin ?? new URL(context.req.raw.url).origin,
56
+ ...(externalIssuer === undefined ? {} : { issuer: externalIssuer }),
57
+ reservations: config.routeReservations,
58
+ })?.snapshot,
59
+ }),
60
+ host: hosts.get(context.req.raw),
61
+ }));
62
+ }
63
+ app.all(config.path, (context) => handleHttp(context.req.raw, hosts.get(context.req.raw)));
64
+ if (config.health !== undefined) {
65
+ app.get(config.health.path, (context) => {
66
+ const ready = active.isAccepting && config.health.probe.check();
67
+ return context.json({ status: ready ? 'ready' : 'not-ready' }, ready ? 200 : 503, {
68
+ ...config.cors.response(context.req.raw),
69
+ 'cache-control': 'no-store',
70
+ });
71
+ });
72
+ if (config.cors.enabled) {
73
+ app.options(config.health.path, (context) => config.cors.preflight(context.req.raw, { methods: ['GET'] }));
74
+ }
75
+ }
76
+ if (config.issuer !== undefined) {
77
+ mountIssuer(app, config.issuer, config.cors, active, config.limits.invocationTimeoutMs, config.tokenExchange);
78
+ }
79
+ if (config.publication !== undefined) {
80
+ mountRoutes(app, config.publication, config.delivery, handler, active, config.limits, config.cors, (request) => hosts.get(request), config.routeReservations, externalIssuer);
81
+ }
82
+ app.onError((_error, context) => new Response('{"error":"Internal server error."}', {
83
+ status: 500,
84
+ headers: {
85
+ ...config.cors.response(context.req.raw),
86
+ 'content-type': 'application/json',
87
+ },
88
+ }));
89
+ return Object.freeze({
90
+ app: Object.freeze({
91
+ async fetch(request, host) {
92
+ const admitted = host === undefined ? undefined : captureApplicationHost(host);
93
+ if (admitted !== undefined)
94
+ hosts.set(request, admitted);
95
+ try {
96
+ return await app.fetch(request);
97
+ }
98
+ finally {
99
+ hosts.delete(request);
100
+ }
101
+ },
102
+ }),
103
+ drain() {
104
+ active.drain();
105
+ },
106
+ close(options) {
107
+ if (!Number.isFinite(options.deadline)) {
108
+ return Promise.reject(new TypeError('Server close deadline must be finite.'));
109
+ }
110
+ return active.close(options.deadline);
111
+ },
112
+ });
113
+ }
114
+ function captureApplicationHost(input) {
115
+ const waitUntil = captureMethod(input, 'waitUntil', 'Application host is invalid.');
116
+ const sleep = input.sleep === undefined
117
+ ? undefined
118
+ : captureMethod(input, 'sleep', 'Application host is invalid.');
119
+ return Object.freeze({
120
+ waitUntil,
121
+ ...(sleep === undefined ? {} : { sleep }),
122
+ });
123
+ }
124
+ function captureHandler(input) {
125
+ const dispatch = captureMethod(input, 'dispatch', 'Server handler is invalid.');
126
+ return Object.freeze({ dispatch });
127
+ }
128
+ function admitOptions(config) {
129
+ const limits = admitLimits(config.limits);
130
+ const path = admitRoute(config.path ?? '/', 'invocation path');
131
+ const issuer = config.issuer === undefined ? undefined : admitIssuer(config.issuer);
132
+ const tokenExchange = config.tokenExchange === undefined ? undefined : captureExchangeProvider(config.tokenExchange);
133
+ if (tokenExchange !== undefined && issuer === undefined) {
134
+ throw new TypeError('Token exchange requires issuer configuration.');
135
+ }
136
+ const health = config.health === undefined || config.health === false
137
+ ? undefined
138
+ : Object.freeze({
139
+ path: admitRoute(config.health.path ?? '/health', 'Health path'),
140
+ probe: captureHealthProbe(config.health.probe),
141
+ });
142
+ const websocket = config.websocket === undefined ? undefined : captureWebSocket(config.websocket);
143
+ const publication = config.publication === undefined ? undefined : capturePublicationSource(config.publication);
144
+ const delivery = config.delivery === undefined ? undefined : captureDeliveryProvider(config.delivery);
145
+ if (delivery !== undefined && publication === undefined) {
146
+ throw new TypeError('Publication Delivery requires a Publication source.');
147
+ }
148
+ const publicationPath = publication === undefined
149
+ ? undefined
150
+ : issuer === undefined
151
+ ? protocolPublicationPath()
152
+ : protocolPublicationPath(issuer.issuer);
153
+ if (health?.path === path)
154
+ throw new TypeError('Health and invocation paths must be distinct.');
155
+ if (publicationPath === path) {
156
+ throw new TypeError('Publication and invocation paths must be distinct.');
157
+ }
158
+ if (health !== undefined && publicationPath === health.path) {
159
+ throw new TypeError('Health and Publication paths must be distinct.');
160
+ }
161
+ if (issuer !== undefined) {
162
+ const issuerReservations = issuerRouteReservations(issuer, tokenExchange !== undefined);
163
+ const issuerPaths = issuerReservations.map(({ path }) => path);
164
+ if (health !== undefined && issuerPaths.includes(health.path)) {
165
+ throw new TypeError('Health and issuer paths must be distinct.');
166
+ }
167
+ if (websocket !== undefined && issuerPaths.includes(path)) {
168
+ throw new TypeError('WebSocket invocation and issuer paths must be distinct.');
169
+ }
170
+ if (websocket === undefined &&
171
+ issuerReservations.some((reservation) => reservation.path === path && reservation.methods.includes('POST'))) {
172
+ throw new TypeError('Invocation and token-exchange paths must be distinct.');
173
+ }
174
+ }
175
+ return Object.freeze({
176
+ limits,
177
+ path,
178
+ cors: prepareCors(config.cors),
179
+ ...(health === undefined ? {} : { health }),
180
+ ...(issuer === undefined ? {} : { issuer }),
181
+ ...(tokenExchange === undefined ? {} : { tokenExchange }),
182
+ ...(publication === undefined ? {} : { publication }),
183
+ ...(delivery === undefined ? {} : { delivery }),
184
+ routeReservations: routeReservations(path, health?.path, issuer, websocket !== undefined, tokenExchange !== undefined, publicationPath),
185
+ ...(websocket === undefined ? {} : { websocket }),
186
+ });
187
+ }
188
+ function routeReservations(invocationPath, healthPath, issuer, websocket, tokenExchange, publicationPath) {
189
+ const reservations = [
190
+ Object.freeze({
191
+ path: invocationPath,
192
+ methods: Object.freeze(websocket ? ['GET', 'POST'] : ['POST']),
193
+ }),
194
+ ];
195
+ if (healthPath !== undefined) {
196
+ reservations.push(Object.freeze({ path: healthPath, methods: Object.freeze(['GET']) }));
197
+ }
198
+ if (issuer !== undefined) {
199
+ reservations.push(...issuerRouteReservations(issuer, tokenExchange));
200
+ }
201
+ if (publicationPath !== undefined) {
202
+ reservations.push(Object.freeze({ path: publicationPath, methods: Object.freeze(['GET']) }));
203
+ }
204
+ return Object.freeze(reservations);
205
+ }
206
+ function protocolPublicationPath(issuer) {
207
+ if (issuer === undefined)
208
+ return protocolPublication.PATH;
209
+ return new URL(protocolPublication.url(issuer)).pathname;
210
+ }
211
+ function captureHealthProbe(probe) {
212
+ const check = captureMethod(probe, 'check', 'Health probe is invalid.');
213
+ return Object.freeze({ check });
214
+ }
215
+ function captureWebSocket(adapter) {
216
+ const upgrade = captureMethod(adapter, 'upgrade', 'WebSocket adapter is invalid.');
217
+ return Object.freeze({ upgrade });
218
+ }
219
+ function capturePublicationSource(input) {
220
+ const current = captureMethod(input, 'current', 'Publication source is invalid.');
221
+ return Object.freeze({ current });
222
+ }
223
+ function captureDeliveryProvider(input) {
224
+ const create = captureMethod(input, 'create', 'Publication Delivery provider is invalid.');
225
+ return Object.freeze({ create });
226
+ }
227
+ function admitLimits(limits) {
228
+ if (!Number.isSafeInteger(limits.maximumRequestBytes) || limits.maximumRequestBytes <= 0) {
229
+ throw new TypeError('maximumRequestBytes must be a positive safe integer.');
230
+ }
231
+ if (!Number.isSafeInteger(limits.invocationTimeoutMs) || limits.invocationTimeoutMs <= 0) {
232
+ throw new TypeError('invocationTimeoutMs must be a positive safe integer.');
233
+ }
234
+ if (limits.invocationTimeoutMs > 2_147_483_647) {
235
+ throw new TypeError('invocationTimeoutMs exceeds the platform timer range.');
236
+ }
237
+ return Object.freeze({
238
+ maximumRequestBytes: limits.maximumRequestBytes,
239
+ maximumResponseBytes: admitOptionalLimit(limits.maximumResponseBytes, 16 * 1024 * 1024, 'maximumResponseBytes'),
240
+ maximumConcurrentOperations: admitOptionalLimit(limits.maximumConcurrentOperations, 1_024, 'maximumConcurrentOperations'),
241
+ maximumPublicationBytes: admitOptionalLimit(limits.maximumPublicationBytes, limits.maximumRequestBytes, 'maximumPublicationBytes'),
242
+ maximumBundleBytes: admitOptionalLimit(limits.maximumBundleBytes, 16 * 1024 * 1024, 'maximumBundleBytes'),
243
+ maximumDeliveryBytes: admitOptionalLimit(limits.maximumDeliveryBytes, limits.maximumRequestBytes, 'maximumDeliveryBytes'),
244
+ invocationTimeoutMs: limits.invocationTimeoutMs,
245
+ });
246
+ }
247
+ function admitOptionalLimit(input, fallback, label) {
248
+ const value = input ?? fallback;
249
+ if (!Number.isSafeInteger(value) || value <= 0) {
250
+ throw new TypeError(`${label} must be a positive safe integer.`);
251
+ }
252
+ return value;
253
+ }
254
+ function admitRoute(path, label) {
255
+ if (!path.startsWith('/') || path.includes('?') || path.includes('#')) {
256
+ throw new TypeError(`${label} must be an absolute path without query or fragment.`);
257
+ }
258
+ return path;
259
+ }
260
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { RequestBodyInvalidError, RequestBodyTooLargeError } from '../errors/index.js';
2
+ /** Read a request body while enforcing the limit before retaining excess bytes. */
3
+ export declare function readBoundedBody(request: Request, maximumBytes: number, signal: AbortSignal): Promise<Uint8Array>;
4
+ export declare function byteLength(input: string | Uint8Array): number;
5
+ //# sourceMappingURL=body.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../transport/body.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAEtF,mFAAmF;AACnF,wBAAsB,eAAe,CACnC,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CA0CrB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE7D"}
@@ -0,0 +1,51 @@
1
+ import { RequestBodyInvalidError, RequestBodyTooLargeError } from '../errors/index.js';
2
+ export { RequestBodyInvalidError, RequestBodyTooLargeError } from '../errors/index.js';
3
+ /** Read a request body while enforcing the limit before retaining excess bytes. */
4
+ export async function readBoundedBody(request, maximumBytes, signal) {
5
+ const declared = request.headers.get('content-length');
6
+ if (declared !== null) {
7
+ const length = Number(declared);
8
+ if (!Number.isSafeInteger(length) || length < 0) {
9
+ throw new RequestBodyInvalidError('Content-Length is invalid.');
10
+ }
11
+ if (length > maximumBytes)
12
+ throw new RequestBodyTooLargeError(maximumBytes);
13
+ }
14
+ const reader = request.body?.getReader();
15
+ if (reader === undefined)
16
+ return new Uint8Array();
17
+ const chunks = [];
18
+ let total = 0;
19
+ const abort = () => void reader.cancel(signal.reason).catch(() => undefined);
20
+ signal.addEventListener('abort', abort, { once: true });
21
+ try {
22
+ while (true) {
23
+ if (signal.aborted)
24
+ throw signal.reason;
25
+ const { done, value } = await reader.read();
26
+ if (done)
27
+ break;
28
+ total += value.byteLength;
29
+ if (total > maximumBytes) {
30
+ await reader.cancel('request body too large').catch(() => undefined);
31
+ throw new RequestBodyTooLargeError(maximumBytes);
32
+ }
33
+ chunks.push(value);
34
+ }
35
+ }
36
+ finally {
37
+ signal.removeEventListener('abort', abort);
38
+ reader.releaseLock();
39
+ }
40
+ const body = new Uint8Array(total);
41
+ let offset = 0;
42
+ for (const chunk of chunks) {
43
+ body.set(chunk, offset);
44
+ offset += chunk.byteLength;
45
+ }
46
+ return body;
47
+ }
48
+ export function byteLength(input) {
49
+ return typeof input === 'string' ? new TextEncoder().encode(input).byteLength : input.byteLength;
50
+ }
51
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../transport/body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAEtF,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAEtF,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,YAAoB,EACpB,MAAmB;IAEnB,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACtD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,uBAAuB,CAAC,4BAA4B,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,MAAM,GAAG,YAAY;YAAE,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,CAAA;IACxC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,UAAU,EAAE,CAAA;IAEjD,MAAM,MAAM,GAAiB,EAAE,CAAA;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAA;YACvC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI;gBAAE,MAAK;YACf,KAAK,IAAI,KAAK,CAAC,UAAU,CAAA;YACzB,IAAI,KAAK,GAAG,YAAY,EAAE,CAAC;gBACzB,MAAM,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;gBACpE,MAAM,IAAI,wBAAwB,CAAC,YAAY,CAAC,CAAA;YAClD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,WAAW,EAAE,CAAA;IACtB,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACvB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;IAC5B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAA0B;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAA;AAClG,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { codecs } from '@astrale-os/kernel-protocol';
2
+ export type LoadedCodec = codecs.Codec;
3
+ /** Load the built-in Server representation set before pure Protocol binding selection. */
4
+ export declare function loadCodecs(): Promise<readonly [codecs.Codec, codecs.Codec]>;
5
+ //# sourceMappingURL=codecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../../transport/codecs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAA;AAEtC,0FAA0F;AAC1F,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAEjF"}
@@ -0,0 +1,6 @@
1
+ import { codecs } from '@astrale-os/kernel-protocol';
2
+ /** Load the built-in Server representation set before pure Protocol binding selection. */
3
+ export async function loadCodecs() {
4
+ return Object.freeze([codecs.json, await codecs.loadMsgpack()]);
5
+ }
6
+ //# sourceMappingURL=codecs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../transport/codecs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAIpD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,MAAM,CAAC,WAAW,EAAE,CAAU,CAAC,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { errors } from '@astrale-os/kernel-protocol';
2
+ export type CredentialResult = {
3
+ readonly ok: true;
4
+ readonly credential: string | undefined;
5
+ } | {
6
+ readonly ok: false;
7
+ readonly error: errors.ErrorPayload;
8
+ };
9
+ /** Resolve exactly zero or one untrusted credential channel without authenticating it. */
10
+ export declare function resolveCredential(envelope: string | undefined, authorization: string | null): CredentialResult;
11
+ //# sourceMappingURL=credential.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.d.ts","sourceRoot":"","sources":["../../transport/credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAEpD,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAA;CAAE,CAAA;AAE/D,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,gBAAgB,CAkBlB"}
@@ -0,0 +1,29 @@
1
+ import { errors } from '@astrale-os/kernel-protocol';
2
+ /** Resolve exactly zero or one untrusted credential channel without authenticating it. */
3
+ export function resolveCredential(envelope, authorization) {
4
+ if (envelope !== undefined && authorization !== null) {
5
+ return failure('Credential must be supplied in either the envelope or Authorization, not both.');
6
+ }
7
+ if (envelope !== undefined)
8
+ return { ok: true, credential: envelope };
9
+ if (authorization === null)
10
+ return { ok: true, credential: undefined };
11
+ const match = /^Bearer[ \t]+([^\s]+)$/i.exec(authorization.trim());
12
+ if (match === null) {
13
+ return {
14
+ ok: false,
15
+ error: {
16
+ code: errors.CODES.AUTH_INVALID,
17
+ message: 'Authorization must use one Bearer credential.',
18
+ },
19
+ };
20
+ }
21
+ return { ok: true, credential: match[1] };
22
+ }
23
+ function failure(message) {
24
+ return {
25
+ ok: false,
26
+ error: { code: errors.CODES.INVALID_REQUEST, message },
27
+ };
28
+ }
29
+ //# sourceMappingURL=credential.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential.js","sourceRoot":"","sources":["../../transport/credential.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AAMpD,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,aAA4B;IAE5B,IAAI,QAAQ,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC,gFAAgF,CAAC,CAAA;IAClG,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;IACrE,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;IAEtE,MAAM,KAAK,GAAG,yBAAyB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAA;IAClE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;gBAC/B,OAAO,EAAE,+CAA+C;aACzD;SACF,CAAA;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAA;AAC5C,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,OAAO,EAAE;KACvD,CAAA;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { CorsPolicy } from '../../cors/index.js';
2
+ import type { ActiveOperations } from '../../lifecycle/index.js';
3
+ import type { PublicationSnapshot } from '../../publication/index.js';
4
+ import { type ApplicationHost, type Handler } from '../../invocation/index.js';
5
+ export interface HttpHandlerConfig {
6
+ readonly handler: Handler;
7
+ readonly active: ActiveOperations;
8
+ readonly maximumRequestBytes: number;
9
+ readonly maximumResponseBytes: number;
10
+ readonly invocationTimeoutMs: number;
11
+ readonly cors: CorsPolicy;
12
+ readonly websocket: boolean;
13
+ readonly currentPublication?: (request: Request) => PublicationSnapshot | undefined;
14
+ }
15
+ export declare function createHttpHandler(config: HttpHandlerConfig): (request: Request, host?: ApplicationHost) => Promise<Response>;
16
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../transport/http/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAOrE,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,OAAO,EACb,MAAM,2BAA2B,CAAA;AAMlC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,mBAAmB,GAAG,SAAS,CAAA;CACpF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,aAClC,OAAO,SAAS,eAAe,KAAG,OAAO,CAAC,QAAQ,CAAC,CAyO3E"}
@@ -0,0 +1,177 @@
1
+ import { codecs, errors, invocation as protocol } from '@astrale-os/kernel-protocol';
2
+ import { classifyError, RequestBodyInvalidError, RequestBodyTooLargeError, } from '../../errors/index.js';
3
+ import { invocationContext, publicationRouteDecision, } from '../../invocation/index.js';
4
+ import { readBoundedBody } from '../body.js';
5
+ import { loadCodecs } from '../codecs.js';
6
+ import { resolveCredential } from '../credential.js';
7
+ import { renderHttpError, renderHttpResult } from './render.js';
8
+ export function createHttpHandler(config) {
9
+ return async (request, host) => {
10
+ const cors = (exposedHeaders) => config.cors.response(request, exposedHeaders);
11
+ const renderError = (id, error, codec, options = {}) => renderHttpError(id, error, codec, cors, {
12
+ ...options,
13
+ maximumResponseBytes: config.maximumResponseBytes,
14
+ });
15
+ const allow = [
16
+ ...(config.websocket ? ['GET'] : []),
17
+ 'POST',
18
+ ...(config.cors.enabled ? ['OPTIONS'] : []),
19
+ ];
20
+ if (request.method === 'OPTIONS' && config.cors.enabled) {
21
+ return noStore(config.cors.preflight(request, {
22
+ methods: ['POST'],
23
+ headers: [
24
+ 'authorization',
25
+ 'content-type',
26
+ protocol.http.TRACEPARENT_FIELD,
27
+ protocol.http.TRACESTATE_FIELD,
28
+ ],
29
+ }));
30
+ }
31
+ if (request.method !== 'POST') {
32
+ return new Response(null, {
33
+ status: 405,
34
+ headers: { ...cors(), allow: allow.join(', '), 'cache-control': 'no-store' },
35
+ });
36
+ }
37
+ const operation = config.active.begin(config.invocationTimeoutMs, request.signal);
38
+ if (operation === undefined) {
39
+ return renderError(null, {
40
+ code: errors.CODES.BACKEND_UNAVAILABLE,
41
+ message: 'server is unavailable.',
42
+ }, codecs.json, { status: 503, negotiated: false });
43
+ }
44
+ let handedOff = false;
45
+ try {
46
+ const supported = await loadCodecs();
47
+ const contentType = request.headers.get('content-type');
48
+ const incoming = contentType === null || contentType.trim() === ''
49
+ ? codecs.json
50
+ : protocol.http.codecForContentType(contentType, supported);
51
+ if (incoming === undefined) {
52
+ return renderError(null, {
53
+ code: errors.CODES.UNSUPPORTED,
54
+ message: 'Unsupported request Content-Type.',
55
+ }, codecs.json, { status: 415, negotiated: false });
56
+ }
57
+ const outgoing = protocol.http.negotiateResponseCodec(request.headers.get('accept'), incoming, supported);
58
+ if (outgoing === undefined) {
59
+ return renderError(null, {
60
+ code: errors.CODES.UNSUPPORTED,
61
+ message: 'No acceptable response codec is available.',
62
+ }, incoming, { status: 406 });
63
+ }
64
+ let body;
65
+ try {
66
+ body = await readBoundedBody(request, config.maximumRequestBytes, operation.signal);
67
+ }
68
+ catch (input) {
69
+ const payload = input instanceof RequestBodyTooLargeError
70
+ ? classifyError(input)
71
+ : input instanceof RequestBodyInvalidError
72
+ ? { code: errors.CODES.PARSE_ERROR, message: 'Request body is invalid.' }
73
+ : operation.timedOut
74
+ ? {
75
+ code: errors.CODES.DEADLINE_EXCEEDED,
76
+ message: 'Invocation deadline exceeded.',
77
+ }
78
+ : operation.signal.aborted
79
+ ? { code: errors.CODES.CANCELLED, message: 'Invocation was cancelled.' }
80
+ : undefined;
81
+ if (payload === undefined)
82
+ throw input;
83
+ return renderError(null, payload, outgoing, {
84
+ status: input instanceof RequestBodyTooLargeError ? 413 : errors.httpStatusOf(payload),
85
+ });
86
+ }
87
+ let decoded;
88
+ try {
89
+ decoded = incoming.decode(body);
90
+ }
91
+ catch (input) {
92
+ if (!(input instanceof codecs.DecodeError))
93
+ throw input;
94
+ return renderError(null, { code: errors.CODES.PARSE_ERROR, message: 'Request body is invalid.' }, outgoing);
95
+ }
96
+ let invocation;
97
+ try {
98
+ invocation = protocol.decodeRequest(decoded);
99
+ }
100
+ catch (input) {
101
+ return renderError(null, classifyError(input), outgoing);
102
+ }
103
+ const publication = config.currentPublication?.(request);
104
+ if (config.currentPublication !== undefined && publication === undefined) {
105
+ return renderError(invocation.id, {
106
+ code: errors.CODES.BACKEND_UNAVAILABLE,
107
+ message: 'Publication is unavailable.',
108
+ }, outgoing, { status: 503 });
109
+ }
110
+ if (invocation.routing?.kind === 'via') {
111
+ if (publication === undefined) {
112
+ return renderError(invocation.id, {
113
+ code: errors.CODES.INVALID_REQUEST,
114
+ message: 'Publication routing requires a Publication-backed destination.',
115
+ }, outgoing);
116
+ }
117
+ const decision = publicationRouteDecision(publication.publication, invocation.routing.publication);
118
+ if (decision.kind === 'rejected') {
119
+ return renderError(invocation.id, decision.error, outgoing);
120
+ }
121
+ }
122
+ const credential = resolveCredential(invocation.credential, request.headers.get('authorization'));
123
+ if (!credential.ok) {
124
+ return renderError(invocation.id, credential.error, outgoing);
125
+ }
126
+ const trace = protocol.http.decodeTraceHeaders(request.headers.get(protocol.http.TRACEPARENT_FIELD), request.headers.get(protocol.http.TRACESTATE_FIELD));
127
+ try {
128
+ const result = await config.handler.dispatch(Object.freeze({
129
+ call: invocation.call,
130
+ ...(trace === undefined ? {} : { trace }),
131
+ ...(credential.credential === undefined ? {} : { credential: credential.credential }),
132
+ ...(invocation.delegate === undefined ? {} : { delegate: invocation.delegate }),
133
+ ...(invocation.routing?.kind === 'via' ? { via: invocation.routing } : {}),
134
+ ...(invocation.schema === undefined ? {} : { schema: invocation.schema }),
135
+ ...(publication === undefined ? {} : { publication }),
136
+ context: invocationContext(operation, config.active, host, undefined, invocation.idempotencyKey),
137
+ }));
138
+ const response = renderHttpResult(result, {
139
+ id: invocation.id,
140
+ codec: outgoing,
141
+ cors,
142
+ operation,
143
+ maximumResponseBytes: config.maximumResponseBytes,
144
+ });
145
+ handedOff = result.kind === 'stream';
146
+ return response;
147
+ }
148
+ catch (input) {
149
+ if (operation.timedOut) {
150
+ return renderError(invocation.id, {
151
+ code: errors.CODES.DEADLINE_EXCEEDED,
152
+ message: 'Invocation deadline exceeded.',
153
+ }, outgoing, { status: 504 });
154
+ }
155
+ if (operation.signal.aborted) {
156
+ return renderError(invocation.id, { code: errors.CODES.CANCELLED, message: 'Invocation was cancelled.' }, outgoing, { status: 408 });
157
+ }
158
+ return renderError(invocation.id, classifyError(input), outgoing);
159
+ }
160
+ }
161
+ catch (input) {
162
+ return renderError(null, classifyError(input), codecs.json, {
163
+ negotiated: false,
164
+ });
165
+ }
166
+ finally {
167
+ if (!handedOff)
168
+ operation.settle();
169
+ }
170
+ };
171
+ }
172
+ function noStore(response) {
173
+ const headers = new Headers(response.headers);
174
+ headers.set('cache-control', 'no-store');
175
+ return new Response(response.body, { status: response.status, headers });
176
+ }
177
+ //# sourceMappingURL=handler.js.map