@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,147 @@
1
+ import { issuer as issuerDiscovery } from '@astrale-os/kernel-protocol';
2
+ import { IssuerKeysUnavailableError } from '../errors/index.js';
3
+ import { mount } from './exchange.js';
4
+ export function issuerRouteReservations(input, tokenExchange = false) {
5
+ const paths = issuerDiscovery.paths(input.issuer);
6
+ const reservations = [
7
+ Object.freeze({ path: paths.configuration, methods: Object.freeze(['GET']) }),
8
+ Object.freeze({ path: paths.keys, methods: Object.freeze(['GET']) }),
9
+ ];
10
+ if (tokenExchange) {
11
+ reservations.push(Object.freeze({ path: paths.tokenExchange, methods: Object.freeze(['POST']) }));
12
+ }
13
+ if (input.loadIssuerPublicKeys !== undefined) {
14
+ const base = new URL(input.issuer).pathname.replace(/\/+$/u, '');
15
+ reservations.push(Object.freeze({
16
+ path: `${base}/iss/{thumbprint}/.well-known/openid-configuration`,
17
+ methods: Object.freeze(['GET']),
18
+ }), Object.freeze({
19
+ path: `${base}/iss/{thumbprint}/.well-known/jwks.json`,
20
+ methods: Object.freeze(['GET']),
21
+ }));
22
+ }
23
+ return Object.freeze(reservations);
24
+ }
25
+ export function mountIssuer(app, input, cors, active, timeoutMs, tokenExchange) {
26
+ const issuer = input.issuer;
27
+ const paths = issuerDiscovery.paths(issuer);
28
+ const headers = (request) => ({
29
+ ...cors.response(request),
30
+ 'cache-control': 'no-cache',
31
+ });
32
+ const algorithm = input.signingAlgorithm ?? 'ES256';
33
+ const configuration = issuerDiscovery.configuration(issuer, [algorithm], {
34
+ tokenExchange: tokenExchange !== undefined,
35
+ });
36
+ app.get(paths.configuration, (context) => context.json(configuration, 200, headers(context.req.raw)));
37
+ if (cors.enabled) {
38
+ app.options(paths.configuration, (context) => cors.preflight(context.req.raw, { methods: ['GET'] }));
39
+ app.options(paths.keys, (context) => cors.preflight(context.req.raw, { methods: ['GET'] }));
40
+ }
41
+ app.get(paths.keys, async (context) => {
42
+ const operation = active.begin(timeoutMs, context.req.raw.signal);
43
+ if (operation === undefined) {
44
+ return context.json({ error: 'Issuer is unavailable while draining.' }, 503, headers(context.req.raw));
45
+ }
46
+ try {
47
+ const keys = await input.loadPublicKeys(operation.signal);
48
+ return context.json(issuerDiscovery.keySet(keys, [algorithm]), 200, headers(context.req.raw));
49
+ }
50
+ catch (cause) {
51
+ if (operation.signal.aborted || cause instanceof IssuerKeysUnavailableError) {
52
+ return context.json({ error: 'Issuer keys are unavailable.' }, 503, headers(context.req.raw));
53
+ }
54
+ throw cause;
55
+ }
56
+ finally {
57
+ operation.settle();
58
+ }
59
+ });
60
+ if (tokenExchange !== undefined) {
61
+ mount(app, issuer, tokenExchange, cors, active, timeoutMs);
62
+ }
63
+ const loadIssuerPublicKeys = input.loadIssuerPublicKeys;
64
+ if (loadIssuerPublicKeys !== undefined) {
65
+ const base = new URL(issuer).pathname.replace(/\/+$/, '');
66
+ if (cors.enabled) {
67
+ app.options(`${base}/iss/:thumbprint/.well-known/openid-configuration`, (context) => cors.preflight(context.req.raw, { methods: ['GET'] }));
68
+ app.options(`${base}/iss/:thumbprint/.well-known/jwks.json`, (context) => cors.preflight(context.req.raw, { methods: ['GET'] }));
69
+ }
70
+ app.get(`${base}/iss/:thumbprint/.well-known/openid-configuration`, async (context) => {
71
+ const hostedIssuer = issuerDiscovery.hosted(issuer, context.req.param('thumbprint'));
72
+ if (hostedIssuer === undefined)
73
+ return context.json({ error: 'Issuer not found.' }, 404, headers(context.req.raw));
74
+ const operation = active.begin(timeoutMs, context.req.raw.signal);
75
+ if (operation === undefined) {
76
+ return context.json({ error: 'Issuer is unavailable while draining.' }, 503, headers(context.req.raw));
77
+ }
78
+ try {
79
+ const keys = await hostedKeys(loadIssuerPublicKeys, hostedIssuer, operation.signal, algorithm);
80
+ if (keys.length === 0)
81
+ return context.json({ error: 'Issuer not found.' }, 404, headers(context.req.raw));
82
+ return context.json(issuerDiscovery.configuration(hostedIssuer, [algorithm]), 200, headers(context.req.raw));
83
+ }
84
+ catch (cause) {
85
+ if (operation.signal.aborted || cause instanceof IssuerKeysUnavailableError) {
86
+ return context.json({ error: 'Issuer keys are unavailable.' }, 503, headers(context.req.raw));
87
+ }
88
+ throw cause;
89
+ }
90
+ finally {
91
+ operation.settle();
92
+ }
93
+ });
94
+ app.get(`${base}/iss/:thumbprint/.well-known/jwks.json`, async (context) => {
95
+ const hostedIssuer = issuerDiscovery.hosted(issuer, context.req.param('thumbprint'));
96
+ if (hostedIssuer === undefined)
97
+ return context.json({ error: 'Issuer not found.' }, 404, headers(context.req.raw));
98
+ const operation = active.begin(timeoutMs, context.req.raw.signal);
99
+ if (operation === undefined) {
100
+ return context.json({ error: 'Issuer is unavailable while draining.' }, 503, headers(context.req.raw));
101
+ }
102
+ try {
103
+ const keys = await hostedKeys(loadIssuerPublicKeys, hostedIssuer, operation.signal, algorithm);
104
+ if (keys.length === 0)
105
+ return context.json({ error: 'Issuer not found.' }, 404, headers(context.req.raw));
106
+ return context.json({ keys }, 200, headers(context.req.raw));
107
+ }
108
+ catch (cause) {
109
+ if (operation.signal.aborted || cause instanceof IssuerKeysUnavailableError) {
110
+ return context.json({ error: 'Issuer keys are unavailable.' }, 503, headers(context.req.raw));
111
+ }
112
+ throw cause;
113
+ }
114
+ finally {
115
+ operation.settle();
116
+ }
117
+ });
118
+ }
119
+ }
120
+ async function hostedKeys(load, issuer, signal, algorithm) {
121
+ return issuerDiscovery.keySet(await load(issuer, signal), [algorithm]).keys;
122
+ }
123
+ /** Admit static discovery configuration before Runtime Boot performs any durable work. */
124
+ export function admitIssuer(input) {
125
+ const signingAlgorithm = input.signingAlgorithm ?? 'ES256';
126
+ const issuer = issuerDiscovery.configuration(input.issuer, [signingAlgorithm]).issuer;
127
+ if (typeof input.loadPublicKeys !== 'function') {
128
+ throw new TypeError('Issuer public-key loader is invalid.');
129
+ }
130
+ if (input.loadIssuerPublicKeys !== undefined &&
131
+ typeof input.loadIssuerPublicKeys !== 'function') {
132
+ throw new TypeError('Hosted issuer discovery loader is invalid.');
133
+ }
134
+ const loadPublicKeys = input.loadPublicKeys;
135
+ const loadIssuerPublicKeys = input.loadIssuerPublicKeys;
136
+ return Object.freeze({
137
+ issuer,
138
+ signingAlgorithm,
139
+ loadPublicKeys: (signal) => loadPublicKeys.call(input, signal),
140
+ ...(loadIssuerPublicKeys === undefined
141
+ ? {}
142
+ : {
143
+ loadIssuerPublicKeys: (hostedIssuer, signal) => loadIssuerPublicKeys.call(input, hostedIssuer, signal),
144
+ }),
145
+ });
146
+ }
147
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../issuer/routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { IssuerId, JsonWebKey } from '@astrale-os/kernel-core/auth';
2
+ /** Public issuer material; Server never receives private signing material. */
3
+ export interface Issuer {
4
+ readonly issuer: IssuerId;
5
+ readonly signingAlgorithm?: string;
6
+ /** Bounded request-time read; cancellation is owned by Server. */
7
+ loadPublicKeys(signal: AbortSignal): Promise<readonly JsonWebKey[]>;
8
+ /** Optional hosted-key discovery for issuers below `<issuer>/iss/:thumbprint`. */
9
+ readonly loadIssuerPublicKeys?: (issuer: IssuerId, signal: AbortSignal) => Promise<readonly JsonWebKey[]>;
10
+ }
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../issuer/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAExE,8EAA8E;AAC9E,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAA;IACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,kEAAkE;IAClE,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAA;IACnE,kFAAkF;IAClF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAAA;CACpC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../issuer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ type CancelWork = (reason: string) => void | Promise<void>;
2
+ type BackgroundTask = () => void | PromiseLike<unknown>;
3
+ /** Minimal close capability retained by Server lifecycle without importing transport. */
4
+ export interface ActiveSocket {
5
+ close(code?: number, reason?: string): void;
6
+ }
7
+ /** One Server-owned operation from body admission through terminal result settlement. */
8
+ export interface ActiveOperation {
9
+ readonly deadline: number;
10
+ readonly signal: AbortSignal;
11
+ readonly timedOut: boolean;
12
+ /** Register cooperative cleanup and return an idempotent unregistration function. */
13
+ onCancel(cancel: CancelWork): () => void;
14
+ cancel(reason: string): void;
15
+ settle(): void;
16
+ readonly finished: Promise<void>;
17
+ }
18
+ export declare class ActiveOperations {
19
+ private readonly maximumConcurrentOperations;
20
+ private accepting;
21
+ private closed;
22
+ private readonly operations;
23
+ private readonly sockets;
24
+ private readonly backgroundTasks;
25
+ private closing?;
26
+ private changed;
27
+ constructor(maximumConcurrentOperations: number);
28
+ get isAccepting(): boolean;
29
+ begin(timeoutMs: number, externalSignal?: AbortSignal): ActiveOperation | undefined;
30
+ attachSocket(socket: ActiveSocket): boolean;
31
+ detachSocket(socket: ActiveSocket): void;
32
+ background(task: BackgroundTask, retain?: (promise: Promise<unknown>) => void): void;
33
+ drain(): void;
34
+ close(deadline: number): Promise<void>;
35
+ private closeOnce;
36
+ private waitUntilIdleOr;
37
+ private closeSockets;
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=active.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active.d.ts","sourceRoot":"","sources":["../../lifecycle/active.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAC1D,KAAK,cAAc,GAAG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAEvD,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5C;AAED,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,CAAA;IACxC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,MAAM,IAAI,IAAI,CAAA;IACd,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACjC;AAED,qBAAa,gBAAgB;IASf,OAAO,CAAC,QAAQ,CAAC,2BAA2B;IARxD,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,OAAO,CAA0B;IAEzC,YAA6B,2BAA2B,EAAE,MAAM,EAAI;IAEpE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,CAWlF;IAED,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAI1C;IAED,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAEvC;IAED,UAAU,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI,CAuBnF;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrC;YAEa,SAAS;YAkBT,eAAe;IAe7B,OAAO,CAAC,YAAY;CAUrB"}
@@ -0,0 +1,200 @@
1
+ export class ActiveOperations {
2
+ maximumConcurrentOperations;
3
+ accepting = true;
4
+ closed = false;
5
+ operations = new Set();
6
+ sockets = new Set();
7
+ backgroundTasks = new Set();
8
+ closing;
9
+ changed;
10
+ constructor(maximumConcurrentOperations) {
11
+ this.maximumConcurrentOperations = maximumConcurrentOperations;
12
+ }
13
+ get isAccepting() {
14
+ return this.accepting;
15
+ }
16
+ begin(timeoutMs, externalSignal) {
17
+ if (!this.accepting || this.operations.size >= this.maximumConcurrentOperations) {
18
+ return undefined;
19
+ }
20
+ const operation = new Operation(Date.now() + timeoutMs, () => {
21
+ this.operations.delete(operation);
22
+ this.changed?.();
23
+ });
24
+ this.operations.add(operation);
25
+ operation.link(externalSignal);
26
+ return operation;
27
+ }
28
+ attachSocket(socket) {
29
+ if (!this.accepting)
30
+ return false;
31
+ this.sockets.add(socket);
32
+ return true;
33
+ }
34
+ detachSocket(socket) {
35
+ this.sockets.delete(socket);
36
+ }
37
+ background(task, retain) {
38
+ if (typeof task !== 'function')
39
+ throw new TypeError('Background task must be a function.');
40
+ if (this.closed)
41
+ throw new Error('Server is closed.');
42
+ const tracked = Promise.resolve()
43
+ .then(task)
44
+ .then(() => undefined, (cause) => {
45
+ // Background work has no response channel; report without creating an unhandled rejection.
46
+ // oxlint-disable-next-line no-console
47
+ console.error('[server] background task failed:', cause);
48
+ })
49
+ .finally(() => {
50
+ this.backgroundTasks.delete(tracked);
51
+ this.changed?.();
52
+ });
53
+ this.backgroundTasks.add(tracked);
54
+ try {
55
+ retain?.(tracked);
56
+ }
57
+ catch {
58
+ // Server retention remains authoritative when a platform bridge refuses the registration.
59
+ }
60
+ }
61
+ drain() {
62
+ this.accepting = false;
63
+ }
64
+ close(deadline) {
65
+ this.drain();
66
+ this.closing ??= this.closeOnce(deadline);
67
+ return this.closing;
68
+ }
69
+ async closeOnce(deadline) {
70
+ await this.waitUntilIdleOr(deadline);
71
+ if (this.operations.size > 0) {
72
+ for (const operation of this.operations)
73
+ operation.cancel('server closing');
74
+ }
75
+ this.closeSockets();
76
+ // Give cooperative cancellation and iterator returns one turn to settle. The absolute deadline
77
+ // has already elapsed; an uncooperative operation must reject close rather than pin Host forever.
78
+ await Promise.resolve();
79
+ if (this.operations.size > 0 || this.backgroundTasks.size > 0) {
80
+ this.closed = true;
81
+ throw new Error(`Server close deadline elapsed with ${this.operations.size} active operation(s) and ${this.backgroundTasks.size} background task(s).`);
82
+ }
83
+ this.closed = true;
84
+ }
85
+ async waitUntilIdleOr(deadline) {
86
+ while (this.operations.size > 0 || this.backgroundTasks.size > 0) {
87
+ const remaining = deadline - Date.now();
88
+ if (remaining <= 0)
89
+ return;
90
+ await new Promise((resolve) => {
91
+ const timer = setTimeout(resolve, Math.min(remaining, 2_147_483_647));
92
+ this.changed = () => {
93
+ clearTimeout(timer);
94
+ resolve();
95
+ };
96
+ });
97
+ this.changed = undefined;
98
+ }
99
+ }
100
+ closeSockets() {
101
+ for (const socket of this.sockets) {
102
+ try {
103
+ socket.close(1012, 'Server restarting');
104
+ }
105
+ catch {
106
+ // The platform already owns a broken socket; no further work is possible.
107
+ }
108
+ }
109
+ this.sockets.clear();
110
+ }
111
+ }
112
+ class Operation {
113
+ deadline;
114
+ onSettled;
115
+ controller = new AbortController();
116
+ cancelWork = new Set();
117
+ timer;
118
+ external;
119
+ settled = false;
120
+ cancelled = false;
121
+ timeout = false;
122
+ resolveFinished;
123
+ finished;
124
+ constructor(deadline, onSettled) {
125
+ this.deadline = deadline;
126
+ this.onSettled = onSettled;
127
+ this.finished = new Promise((resolve) => {
128
+ this.resolveFinished = resolve;
129
+ });
130
+ this.timer = setTimeout(() => {
131
+ this.timeout = true;
132
+ this.cancel('invocation deadline exceeded');
133
+ }, Math.min(Math.max(0, deadline - Date.now()), 2_147_483_647));
134
+ }
135
+ link(signal) {
136
+ if (signal === undefined)
137
+ return;
138
+ const abort = () => this.cancel('transport disconnected');
139
+ this.external = [signal, abort];
140
+ if (signal.aborted)
141
+ abort();
142
+ else
143
+ signal.addEventListener('abort', abort, { once: true });
144
+ }
145
+ get signal() {
146
+ return this.controller.signal;
147
+ }
148
+ get timedOut() {
149
+ return this.timeout;
150
+ }
151
+ onCancel(cancel) {
152
+ if (this.cancelled) {
153
+ void settleCancellation(cancel, abortReason(this.controller.signal));
154
+ return () => undefined;
155
+ }
156
+ this.cancelWork.add(cancel);
157
+ return () => {
158
+ this.cancelWork.delete(cancel);
159
+ };
160
+ }
161
+ cancel(reason) {
162
+ if (this.cancelled || this.settled)
163
+ return;
164
+ this.cancelled = true;
165
+ clearTimeout(this.timer);
166
+ this.detachExternal();
167
+ this.controller.abort(new Error(reason));
168
+ for (const cancel of this.cancelWork)
169
+ void settleCancellation(cancel, reason);
170
+ this.cancelWork.clear();
171
+ }
172
+ settle() {
173
+ if (this.settled)
174
+ return;
175
+ this.settled = true;
176
+ clearTimeout(this.timer);
177
+ this.detachExternal();
178
+ this.cancelWork.clear();
179
+ this.onSettled();
180
+ this.resolveFinished();
181
+ }
182
+ detachExternal() {
183
+ if (this.external === undefined)
184
+ return;
185
+ this.external[0].removeEventListener('abort', this.external[1]);
186
+ this.external = undefined;
187
+ }
188
+ }
189
+ async function settleCancellation(cancel, reason) {
190
+ try {
191
+ await cancel(reason);
192
+ }
193
+ catch {
194
+ // Cancellation is best-effort; the owning operation still settles through its execution path.
195
+ }
196
+ }
197
+ function abortReason(signal) {
198
+ return signal.reason instanceof Error ? signal.reason.message : 'operation cancelled';
199
+ }
200
+ //# sourceMappingURL=active.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active.js","sourceRoot":"","sources":["../../lifecycle/active.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { ActiveOperations, type ActiveOperation, type ActiveSocket } from './active.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lifecycle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { ActiveOperations } from './active.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lifecycle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA2C,MAAM,aAAa,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { ActiveOperations } from '../../lifecycle/index.js';
2
+ import type { PreparedPublicationSnapshot } from '../snapshot.js';
3
+ import type { Provider } from './types.js';
4
+ export interface Limits {
5
+ readonly maximumDeliveryBytes: number;
6
+ readonly invocationTimeoutMs: number;
7
+ }
8
+ /** Serve one delivery request against the exact Publication snapshot that selected its URL. */
9
+ export declare function handleDelivery(request: Request, snapshot: PreparedPublicationSnapshot, provider: Provider | undefined, active: ActiveOperations, limits: Limits, cors: Readonly<Record<string, string>>): Promise<Response>;
10
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../publication/delivery/handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAQ1C,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;CACrC;AAED,+FAA+F;AAC/F,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,2BAA2B,EACrC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACrC,OAAO,CAAC,QAAQ,CAAC,CAkGnB"}
@@ -0,0 +1,127 @@
1
+ import { codecs, publication as protocolPublication } from '@astrale-os/kernel-protocol';
2
+ import { DeliveryUnavailableError } from '../../errors/index.js';
3
+ import { RequestBodyInvalidError, RequestBodyTooLargeError } from '../../errors/index.js';
4
+ import { readBoundedBody } from '../../transport/index.js';
5
+ const delivery = protocolPublication.delivery;
6
+ /** Serve one delivery request against the exact Publication snapshot that selected its URL. */
7
+ export async function handleDelivery(request, snapshot, provider, active, limits, cors) {
8
+ if (request.method !== 'POST') {
9
+ return response({ error: 'Delivery requires POST.' }, 405, cors);
10
+ }
11
+ if (provider === undefined) {
12
+ return response({ error: 'Delivery is unavailable.' }, 503, cors);
13
+ }
14
+ const advertised = snapshot.publication.delivery;
15
+ if (advertised === undefined) {
16
+ return response({ error: 'Delivery is unavailable.' }, 404, cors);
17
+ }
18
+ const operation = active.begin(limits.invocationTimeoutMs, request.signal);
19
+ if (operation === undefined)
20
+ return response({ error: 'Server is draining.' }, 503, cors);
21
+ try {
22
+ const authorization = request.headers.get('authorization');
23
+ const token = bearer(authorization);
24
+ if (advertised.authentication.kind === 'bearer' && token === undefined) {
25
+ return response({ error: 'Bearer authentication is required.' }, 401, cors);
26
+ }
27
+ if (advertised.authentication.kind === 'public' && authorization !== null) {
28
+ return response({ error: 'This delivery endpoint is public.' }, 400, cors);
29
+ }
30
+ let body;
31
+ try {
32
+ body = await readBoundedBody(request, limits.maximumDeliveryBytes, operation.signal);
33
+ }
34
+ catch (cause) {
35
+ if (cause instanceof RequestBodyTooLargeError) {
36
+ return response({ error: 'Delivery request is too large.' }, 413, cors);
37
+ }
38
+ if (cause instanceof RequestBodyInvalidError) {
39
+ return response({ error: 'Delivery request is invalid.' }, 400, cors);
40
+ }
41
+ if (operation.signal.aborted) {
42
+ return response({ error: 'Delivery request was cancelled.' }, 503, cors);
43
+ }
44
+ throw cause;
45
+ }
46
+ let decoded;
47
+ try {
48
+ decoded = codecs.json.decode(body);
49
+ }
50
+ catch (cause) {
51
+ if (cause instanceof codecs.DecodeError) {
52
+ return response({ error: 'Delivery request is invalid.' }, 400, cors);
53
+ }
54
+ throw cause;
55
+ }
56
+ let input;
57
+ try {
58
+ input = delivery.acceptRequest(decoded);
59
+ }
60
+ catch (cause) {
61
+ if (cause instanceof delivery.Error && cause.code === 'DELIVERY_REQUEST_INVALID') {
62
+ return response({ error: 'Delivery request is invalid.' }, 400, cors);
63
+ }
64
+ throw cause;
65
+ }
66
+ if (input.etag !== snapshot.publication.etag) {
67
+ return response({ error: 'Publication ETag differs from request.' }, 409, cors);
68
+ }
69
+ let candidate;
70
+ try {
71
+ candidate = await provider.create(input, {
72
+ ...(token === undefined ? {} : { token: Object.freeze({ kind: 'bearer', token }) }),
73
+ signal: operation.signal,
74
+ });
75
+ }
76
+ catch (cause) {
77
+ if (cause instanceof DeliveryUnavailableError) {
78
+ return response({ error: 'Delivery provider is unavailable.' }, 503, cors);
79
+ }
80
+ throw cause;
81
+ }
82
+ let created;
83
+ try {
84
+ created = delivery.accept(candidate);
85
+ }
86
+ catch (cause) {
87
+ if (cause instanceof delivery.Error) {
88
+ return response({ error: 'Delivery provider returned an invalid response.' }, 500, cors);
89
+ }
90
+ throw cause;
91
+ }
92
+ if (created.publication.etag !== snapshot.publication.etag) {
93
+ return response({ error: 'Delivery provider returned a different Publication.' }, 500, cors);
94
+ }
95
+ const encoded = codecs.json.encode(created);
96
+ if (encodedSize(encoded) > limits.maximumDeliveryBytes) {
97
+ return response({ error: 'Delivery response exceeds its serving limit.' }, 500, cors);
98
+ }
99
+ return new Response(encodedBody(encoded), {
100
+ headers: { ...cors, 'content-type': 'application/json' },
101
+ });
102
+ }
103
+ finally {
104
+ operation.settle();
105
+ }
106
+ }
107
+ function bearer(input) {
108
+ if (input === null)
109
+ return undefined;
110
+ return /^Bearer[ \t]+([^\s]+)$/iu.exec(input.trim())?.[1];
111
+ }
112
+ function response(body, status, cors) {
113
+ return new Response(encodedBody(codecs.json.encode(body)), {
114
+ status,
115
+ headers: { ...cors, 'content-type': 'application/json' },
116
+ });
117
+ }
118
+ function encodedBody(input) {
119
+ return typeof input === 'string' ? input : toBody(input);
120
+ }
121
+ function encodedSize(input) {
122
+ return typeof input === 'string' ? new TextEncoder().encode(input).byteLength : input.byteLength;
123
+ }
124
+ function toBody(input) {
125
+ return input.buffer.slice(input.byteOffset, input.byteOffset + input.byteLength);
126
+ }
127
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../publication/delivery/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { handleDelivery, type Limits } from './handler.js';
2
+ export type { Context, Provider } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../publication/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1D,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { handleDelivery } from './handler.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../publication/delivery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,cAAc,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { publication } from '@astrale-os/kernel-protocol';
2
+ export interface Context {
3
+ /** Omitted for a public endpoint; otherwise the exact admitted retrieval credential. */
4
+ readonly token?: publication.delivery.Token;
5
+ readonly signal: AbortSignal;
6
+ }
7
+ /** Provider-owned retrieval, construction, and attestation signing. */
8
+ export interface Provider {
9
+ /** Throw DeliveryUnavailableError only for an expected dependency outage. */
10
+ create(request: publication.delivery.Request, context: Context): Promise<publication.delivery.Delivery>;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map