@astrale-os/kernel-server 0.5.0-beta.7 → 0.5.0-beta.71

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 (215) hide show
  1. package/dist/capture.d.ts +0 -1
  2. package/dist/capture.js +0 -1
  3. package/dist/cors/cors.d.ts +0 -1
  4. package/dist/cors/cors.js +11 -4
  5. package/dist/cors/index.d.ts +0 -1
  6. package/dist/cors/index.js +0 -1
  7. package/dist/cors/types.d.ts +0 -1
  8. package/dist/cors/types.js +0 -1
  9. package/dist/errors/admission.d.ts +7 -0
  10. package/dist/errors/admission.js +22 -0
  11. package/dist/errors/availability.d.ts +0 -1
  12. package/dist/errors/availability.js +0 -1
  13. package/dist/errors/classify.d.ts +8 -1
  14. package/dist/errors/classify.js +15 -1
  15. package/dist/errors/index.d.ts +2 -2
  16. package/dist/errors/index.js +2 -2
  17. package/dist/errors/request-body.d.ts +0 -1
  18. package/dist/errors/request-body.js +0 -1
  19. package/dist/errors/response-body.d.ts +0 -1
  20. package/dist/errors/response-body.js +0 -1
  21. package/dist/index.d.ts +8 -4
  22. package/dist/index.js +7 -3
  23. package/dist/invocation/context.d.ts +3 -3
  24. package/dist/invocation/context.js +2 -2
  25. package/dist/invocation/identity.d.ts +1 -2
  26. package/dist/invocation/identity.js +1 -2
  27. package/dist/invocation/index.d.ts +1 -2
  28. package/dist/invocation/index.js +1 -2
  29. package/dist/invocation/legacy/index.d.ts +20 -0
  30. package/dist/invocation/legacy/index.js +20 -0
  31. package/dist/invocation/{publication-route.d.ts → legacy/publication-route.d.ts} +7 -5
  32. package/dist/invocation/{publication-route.js → legacy/publication-route.js} +7 -13
  33. package/dist/invocation/release-route.d.ts +26 -0
  34. package/dist/invocation/release-route.js +55 -0
  35. package/dist/invocation/types.d.ts +20 -7
  36. package/dist/invocation/types.js +0 -1
  37. package/dist/issuer/exchange.d.ts +0 -1
  38. package/dist/issuer/exchange.js +20 -10
  39. package/dist/issuer/index.d.ts +0 -1
  40. package/dist/issuer/index.js +0 -1
  41. package/dist/issuer/routes.d.ts +0 -1
  42. package/dist/issuer/routes.js +33 -5
  43. package/dist/issuer/types.d.ts +5 -1
  44. package/dist/issuer/types.js +0 -1
  45. package/dist/lifecycle/active.d.ts +4 -1
  46. package/dist/lifecycle/active.js +48 -11
  47. package/dist/lifecycle/index.d.ts +0 -1
  48. package/dist/lifecycle/index.js +0 -1
  49. package/dist/release/delivery/handler.d.ts +13 -0
  50. package/dist/{publication → release}/delivery/handler.js +42 -15
  51. package/dist/{publication → release}/delivery/index.d.ts +0 -1
  52. package/dist/{publication → release}/delivery/index.js +0 -1
  53. package/dist/release/delivery/types.d.ts +21 -0
  54. package/dist/release/delivery/types.js +1 -0
  55. package/dist/release/index.d.ts +3 -0
  56. package/dist/release/index.js +2 -0
  57. package/dist/release/legacy/delivery.d.ts +18 -0
  58. package/dist/release/legacy/delivery.js +2 -0
  59. package/dist/release/legacy/index.d.ts +39 -0
  60. package/dist/release/legacy/index.js +38 -0
  61. package/dist/release/legacy/snapshot.d.ts +26 -0
  62. package/dist/release/legacy/snapshot.js +55 -0
  63. package/dist/release/legacy/table.d.ts +5 -0
  64. package/dist/{publication → release/legacy}/table.js +5 -6
  65. package/dist/release/legacy/types.d.ts +31 -0
  66. package/dist/release/legacy/types.js +1 -0
  67. package/dist/release/served.d.ts +30 -0
  68. package/dist/release/served.js +14 -0
  69. package/dist/release/snapshot.d.ts +26 -0
  70. package/dist/release/snapshot.js +54 -0
  71. package/dist/release/table.d.ts +4 -0
  72. package/dist/release/table.js +11 -0
  73. package/dist/release/types.d.ts +33 -0
  74. package/dist/release/types.js +1 -0
  75. package/dist/routes/index.d.ts +1 -2
  76. package/dist/routes/index.js +1 -2
  77. package/dist/routes/routes.d.ts +9 -7
  78. package/dist/routes/routes.js +314 -123
  79. package/dist/server.d.ts +0 -1
  80. package/dist/server.js +110 -48
  81. package/dist/transport/body.d.ts +0 -1
  82. package/dist/transport/body.js +0 -1
  83. package/dist/transport/codecs.d.ts +2 -3
  84. package/dist/transport/codecs.js +4 -4
  85. package/dist/transport/credential.d.ts +0 -1
  86. package/dist/transport/credential.js +0 -1
  87. package/dist/transport/http/binary-request.d.ts +11 -0
  88. package/dist/transport/http/binary-request.js +102 -0
  89. package/dist/transport/http/handler.d.ts +8 -3
  90. package/dist/transport/http/handler.js +95 -45
  91. package/dist/transport/http/index.d.ts +0 -1
  92. package/dist/transport/http/index.js +0 -1
  93. package/dist/transport/http/render.d.ts +9 -4
  94. package/dist/transport/http/render.js +150 -5
  95. package/dist/transport/index.d.ts +0 -1
  96. package/dist/transport/index.js +0 -1
  97. package/dist/transport/router.d.ts +0 -1
  98. package/dist/transport/router.js +0 -1
  99. package/dist/transport/stream-error.d.ts +0 -1
  100. package/dist/transport/stream-error.js +0 -1
  101. package/dist/transport/types.d.ts +1 -2
  102. package/dist/transport/types.js +0 -1
  103. package/dist/transport/websocket/index.d.ts +0 -1
  104. package/dist/transport/websocket/index.js +0 -1
  105. package/dist/transport/websocket/session.d.ts +3 -3
  106. package/dist/transport/websocket/session.js +30 -30
  107. package/dist/transport/websocket/upgrade.d.ts +2 -3
  108. package/dist/transport/websocket/upgrade.js +7 -7
  109. package/dist/types.d.ts +32 -6
  110. package/dist/types.js +0 -1
  111. package/package.json +12 -15
  112. package/dist/capture.d.ts.map +0 -1
  113. package/dist/capture.js.map +0 -1
  114. package/dist/cors/cors.d.ts.map +0 -1
  115. package/dist/cors/cors.js.map +0 -1
  116. package/dist/cors/index.d.ts.map +0 -1
  117. package/dist/cors/index.js.map +0 -1
  118. package/dist/cors/types.d.ts.map +0 -1
  119. package/dist/cors/types.js.map +0 -1
  120. package/dist/errors/availability.d.ts.map +0 -1
  121. package/dist/errors/availability.js.map +0 -1
  122. package/dist/errors/classify.d.ts.map +0 -1
  123. package/dist/errors/classify.js.map +0 -1
  124. package/dist/errors/index.d.ts.map +0 -1
  125. package/dist/errors/index.js.map +0 -1
  126. package/dist/errors/request-body.d.ts.map +0 -1
  127. package/dist/errors/request-body.js.map +0 -1
  128. package/dist/errors/response-body.d.ts.map +0 -1
  129. package/dist/errors/response-body.js.map +0 -1
  130. package/dist/index.d.ts.map +0 -1
  131. package/dist/index.js.map +0 -1
  132. package/dist/invocation/context.d.ts.map +0 -1
  133. package/dist/invocation/context.js.map +0 -1
  134. package/dist/invocation/identity.d.ts.map +0 -1
  135. package/dist/invocation/identity.js.map +0 -1
  136. package/dist/invocation/index.d.ts.map +0 -1
  137. package/dist/invocation/index.js.map +0 -1
  138. package/dist/invocation/publication-route.d.ts.map +0 -1
  139. package/dist/invocation/publication-route.js.map +0 -1
  140. package/dist/invocation/types.d.ts.map +0 -1
  141. package/dist/invocation/types.js.map +0 -1
  142. package/dist/issuer/exchange.d.ts.map +0 -1
  143. package/dist/issuer/exchange.js.map +0 -1
  144. package/dist/issuer/index.d.ts.map +0 -1
  145. package/dist/issuer/index.js.map +0 -1
  146. package/dist/issuer/routes.d.ts.map +0 -1
  147. package/dist/issuer/routes.js.map +0 -1
  148. package/dist/issuer/types.d.ts.map +0 -1
  149. package/dist/issuer/types.js.map +0 -1
  150. package/dist/lifecycle/active.d.ts.map +0 -1
  151. package/dist/lifecycle/active.js.map +0 -1
  152. package/dist/lifecycle/index.d.ts.map +0 -1
  153. package/dist/lifecycle/index.js.map +0 -1
  154. package/dist/publication/delivery/handler.d.ts +0 -10
  155. package/dist/publication/delivery/handler.d.ts.map +0 -1
  156. package/dist/publication/delivery/handler.js.map +0 -1
  157. package/dist/publication/delivery/index.d.ts.map +0 -1
  158. package/dist/publication/delivery/index.js.map +0 -1
  159. package/dist/publication/delivery/types.d.ts +0 -12
  160. package/dist/publication/delivery/types.d.ts.map +0 -1
  161. package/dist/publication/delivery/types.js +0 -2
  162. package/dist/publication/delivery/types.js.map +0 -1
  163. package/dist/publication/index.d.ts +0 -4
  164. package/dist/publication/index.d.ts.map +0 -1
  165. package/dist/publication/index.js +0 -3
  166. package/dist/publication/index.js.map +0 -1
  167. package/dist/publication/snapshot.d.ts +0 -16
  168. package/dist/publication/snapshot.d.ts.map +0 -1
  169. package/dist/publication/snapshot.js +0 -39
  170. package/dist/publication/snapshot.js.map +0 -1
  171. package/dist/publication/table.d.ts +0 -4
  172. package/dist/publication/table.d.ts.map +0 -1
  173. package/dist/publication/table.js.map +0 -1
  174. package/dist/publication/types.d.ts +0 -23
  175. package/dist/publication/types.d.ts.map +0 -1
  176. package/dist/publication/types.js +0 -2
  177. package/dist/publication/types.js.map +0 -1
  178. package/dist/publication/validator.d.ts +0 -4
  179. package/dist/publication/validator.d.ts.map +0 -1
  180. package/dist/publication/validator.js +0 -17
  181. package/dist/publication/validator.js.map +0 -1
  182. package/dist/routes/index.d.ts.map +0 -1
  183. package/dist/routes/index.js.map +0 -1
  184. package/dist/routes/routes.d.ts.map +0 -1
  185. package/dist/routes/routes.js.map +0 -1
  186. package/dist/server.d.ts.map +0 -1
  187. package/dist/server.js.map +0 -1
  188. package/dist/transport/body.d.ts.map +0 -1
  189. package/dist/transport/body.js.map +0 -1
  190. package/dist/transport/codecs.d.ts.map +0 -1
  191. package/dist/transport/codecs.js.map +0 -1
  192. package/dist/transport/credential.d.ts.map +0 -1
  193. package/dist/transport/credential.js.map +0 -1
  194. package/dist/transport/http/handler.d.ts.map +0 -1
  195. package/dist/transport/http/handler.js.map +0 -1
  196. package/dist/transport/http/index.d.ts.map +0 -1
  197. package/dist/transport/http/index.js.map +0 -1
  198. package/dist/transport/http/render.d.ts.map +0 -1
  199. package/dist/transport/http/render.js.map +0 -1
  200. package/dist/transport/index.d.ts.map +0 -1
  201. package/dist/transport/index.js.map +0 -1
  202. package/dist/transport/router.d.ts.map +0 -1
  203. package/dist/transport/router.js.map +0 -1
  204. package/dist/transport/stream-error.d.ts.map +0 -1
  205. package/dist/transport/stream-error.js.map +0 -1
  206. package/dist/transport/types.d.ts.map +0 -1
  207. package/dist/transport/types.js.map +0 -1
  208. package/dist/transport/websocket/index.d.ts.map +0 -1
  209. package/dist/transport/websocket/index.js.map +0 -1
  210. package/dist/transport/websocket/session.d.ts.map +0 -1
  211. package/dist/transport/websocket/session.js.map +0 -1
  212. package/dist/transport/websocket/upgrade.d.ts.map +0 -1
  213. package/dist/transport/websocket/upgrade.js.map +0 -1
  214. package/dist/types.d.ts.map +0 -1
  215. package/dist/types.js.map +0 -1
package/dist/capture.d.ts CHANGED
@@ -1,3 +1,2 @@
1
1
  /** Capture one receiver-bound method while preserving the capability's exact method type. */
2
2
  export declare function captureMethod<Receiver extends object, Name extends keyof Receiver>(input: Receiver, name: Name, invalidMessage: string): Receiver[Name];
3
- //# sourceMappingURL=capture.d.ts.map
package/dist/capture.js CHANGED
@@ -7,4 +7,3 @@ export function captureMethod(input, name, invalidMessage) {
7
7
  throw new TypeError(invalidMessage);
8
8
  return method.bind(input);
9
9
  }
10
- //# sourceMappingURL=capture.js.map
@@ -19,4 +19,3 @@ export interface CorsPolicy {
19
19
  }
20
20
  /** Admit one immutable policy. `false` delegates the complete concern to an outer application. */
21
21
  export declare function prepareCors(input: CorsConfig | false | undefined): CorsPolicy;
22
- //# sourceMappingURL=cors.d.ts.map
package/dist/cors/cors.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /** Request-aware CORS admission shared by every Server-owned HTTP surface. */
2
2
  const TOKEN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u;
3
+ const PREFLIGHT_MAX_AGE_SECONDS = 24 * 60 * 60;
3
4
  /** Admit one immutable policy. `false` delegates the complete concern to an outer application. */
4
5
  export function prepareCors(input) {
5
6
  if (input === false)
@@ -61,11 +62,18 @@ export function prepareCors(input) {
61
62
  return new Response(null, { status: 403, headers: response(request) });
62
63
  }
63
64
  const allowedMethods = [...routeMethods].filter((method) => methods?.has(method) ?? true);
64
- const allowedHeaders = requestedHeaders.length > 0 ? requestedHeaders : [...routeHeaders];
65
+ // Advertise the whole header allowance, not an echo of the request: Chromium and WebKit keep
66
+ // one preflight result per origin and URL, so an echo would preflight again whenever a later
67
+ // call adds a permitted header. Requested names, already admitted, add only what a
68
+ // wildcard-header route cannot enumerate.
69
+ const allowedHeaders = new Set([...routeHeaders].filter((name) => headers?.has(name) ?? true));
70
+ for (const name of requestedHeaders)
71
+ allowedHeaders.add(name);
65
72
  const output = new Headers(response(request));
66
73
  output.set('access-control-allow-methods', [...allowedMethods, 'OPTIONS'].join(', '));
67
- if (allowedHeaders.length > 0) {
68
- output.set('access-control-allow-headers', allowedHeaders.join(', '));
74
+ output.set('access-control-max-age', String(PREFLIGHT_MAX_AGE_SECONDS));
75
+ if (allowedHeaders.size > 0) {
76
+ output.set('access-control-allow-headers', [...allowedHeaders].join(', '));
69
77
  }
70
78
  appendVary(output, 'access-control-request-method');
71
79
  appendVary(output, 'access-control-request-headers');
@@ -133,4 +141,3 @@ function appendVary(headers, value) {
133
141
  names.add(value);
134
142
  headers.set('vary', [...names].join(', '));
135
143
  }
136
- //# sourceMappingURL=cors.js.map
@@ -1,3 +1,2 @@
1
1
  export { prepareCors, type CorsPolicy, type CorsRoute } from './cors.js';
2
2
  export type { CorsConfig } from './types.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1 @@
1
1
  export { prepareCors } from './cors.js';
2
- //# sourceMappingURL=index.js.map
@@ -9,4 +9,3 @@ export interface CorsConfig {
9
9
  /** Emit Access-Control-Allow-Credentials; requires one explicit origin rather than `*`. */
10
10
  readonly credentials?: boolean;
11
11
  }
12
- //# sourceMappingURL=types.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ import * as errors from '@astrale-os/kernel-protocol/errors';
2
+ /** Advisory delay before a request the Server did not admit is sent again. */
3
+ export declare const ADMISSION_RETRY_AFTER_MS = 1000;
4
+ /** Public refusal of an operation the Server did not admit; nothing ran. */
5
+ export declare function admissionRefusal(accepting: boolean): errors.ErrorPayload;
6
+ /** HTTP presentation of a public error's retry delay, when it has one. */
7
+ export declare function retryAfterHeaders(error: errors.ErrorPayload): Readonly<Record<string, string>>;
@@ -0,0 +1,22 @@
1
+ import * as errors from '@astrale-os/kernel-protocol/errors';
2
+ /** Advisory delay before a request the Server did not admit is sent again. */
3
+ export const ADMISSION_RETRY_AFTER_MS = 1_000;
4
+ /** Public refusal of an operation the Server did not admit; nothing ran. */
5
+ export function admissionRefusal(accepting) {
6
+ return accepting
7
+ ? {
8
+ code: errors.CODES.BACKEND_UNAVAILABLE,
9
+ message: 'Server is at capacity; retry later.',
10
+ data: errors.retryReason(errors.RETRY_REASONS.CAPACITY_EXHAUSTED, ADMISSION_RETRY_AFTER_MS),
11
+ }
12
+ : {
13
+ code: errors.CODES.BACKEND_UNAVAILABLE,
14
+ message: 'Server is draining; retry later.',
15
+ data: errors.retryReason(errors.RETRY_REASONS.SERVER_DRAINING, ADMISSION_RETRY_AFTER_MS),
16
+ };
17
+ }
18
+ /** HTTP presentation of a public error's retry delay, when it has one. */
19
+ export function retryAfterHeaders(error) {
20
+ const retryAfterMs = errors.retryAfterOf(error);
21
+ return retryAfterMs === undefined ? {} : { 'retry-after': errors.retryAfterField(retryAfterMs) };
22
+ }
@@ -8,4 +8,3 @@ export declare class IssuerKeysUnavailableError extends Error {
8
8
  readonly name = "IssuerKeysUnavailableError";
9
9
  constructor(message?: string, options?: ErrorOptions);
10
10
  }
11
- //# sourceMappingURL=availability.d.ts.map
@@ -12,4 +12,3 @@ export class IssuerKeysUnavailableError extends Error {
12
12
  super(message, options);
13
13
  }
14
14
  }
15
- //# sourceMappingURL=availability.js.map
@@ -1,4 +1,11 @@
1
1
  import * as errors from '@astrale-os/kernel-protocol/errors';
2
2
  /** Convert only errors owned by an admitted Server or Protocol boundary into safe public data. */
3
3
  export declare function classifyError(input: unknown): errors.ErrorPayload;
4
- //# sourceMappingURL=classify.d.ts.map
4
+ /**
5
+ * Classify the failure of one request. Its own deadline or cancellation names the failure, except an
6
+ * outcome already unknown: ending the request proves nothing about an effect.
7
+ */
8
+ export declare function classifyRequestError(input: unknown, request: {
9
+ readonly timedOut: boolean;
10
+ readonly signal: AbortSignal;
11
+ }): errors.ErrorPayload;
@@ -17,6 +17,21 @@ export function classifyError(input) {
17
17
  }
18
18
  return internal(input);
19
19
  }
20
+ /**
21
+ * Classify the failure of one request. Its own deadline or cancellation names the failure, except an
22
+ * outcome already unknown: ending the request proves nothing about an effect.
23
+ */
24
+ export function classifyRequestError(input, request) {
25
+ if (input instanceof errors.ProtocolError &&
26
+ input.payload.code === errors.CODES.OUTCOME_UNKNOWN) {
27
+ return input.payload;
28
+ }
29
+ if (request.timedOut)
30
+ return publicError('DEADLINE_EXCEEDED', 'Invocation deadline exceeded.');
31
+ if (request.signal.aborted)
32
+ return publicError('CANCELLED', 'Invocation was cancelled.');
33
+ return classifyError(input);
34
+ }
20
35
  function publicError(name, message) {
21
36
  return { code: errors.CODES[name], message };
22
37
  }
@@ -39,4 +54,3 @@ function reportInternal(input) {
39
54
  code: stableCode(input),
40
55
  });
41
56
  }
42
- //# sourceMappingURL=classify.js.map
@@ -1,5 +1,5 @@
1
+ export { ADMISSION_RETRY_AFTER_MS, admissionRefusal, retryAfterHeaders } from './admission.js';
1
2
  export { DeliveryUnavailableError, IssuerKeysUnavailableError } from './availability.js';
2
- export { classifyError } from './classify.js';
3
+ export { classifyError, classifyRequestError } from './classify.js';
3
4
  export { RequestBodyInvalidError, RequestBodyTooLargeError } from './request-body.js';
4
5
  export { ResponseBodyTooLargeError } from './response-body.js';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
+ export { ADMISSION_RETRY_AFTER_MS, admissionRefusal, retryAfterHeaders } from './admission.js';
1
2
  export { DeliveryUnavailableError, IssuerKeysUnavailableError } from './availability.js';
2
- export { classifyError } from './classify.js';
3
+ export { classifyError, classifyRequestError } from './classify.js';
3
4
  export { RequestBodyInvalidError, RequestBodyTooLargeError } from './request-body.js';
4
5
  export { ResponseBodyTooLargeError } from './response-body.js';
5
- //# sourceMappingURL=index.js.map
@@ -5,4 +5,3 @@ export declare class RequestBodyTooLargeError extends Error {
5
5
  export declare class RequestBodyInvalidError extends Error {
6
6
  constructor(message: string);
7
7
  }
8
- //# sourceMappingURL=request-body.d.ts.map
@@ -12,4 +12,3 @@ export class RequestBodyInvalidError extends Error {
12
12
  this.name = 'RequestBodyInvalidError';
13
13
  }
14
14
  }
15
- //# sourceMappingURL=request-body.js.map
@@ -2,4 +2,3 @@ export declare class ResponseBodyTooLargeError extends Error {
2
2
  readonly maximumBytes: number;
3
3
  constructor(maximumBytes: number);
4
4
  }
5
- //# sourceMappingURL=response-body.d.ts.map
@@ -6,4 +6,3 @@ export class ResponseBodyTooLargeError extends Error {
6
6
  this.name = 'ResponseBodyTooLargeError';
7
7
  }
8
8
  }
9
- //# sourceMappingURL=response-body.js.map
package/dist/index.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  export { createServer, prepareServer } from './server.js';
2
2
  export { DeliveryUnavailableError, IssuerKeysUnavailableError } from './errors/index.js';
3
- export { preparePublicationSnapshot } from './publication/index.js';
4
- export * as publication from './publication/index.js';
5
- export type { Application, ApplicationHost, CorsConfig, ExecutionControl, Handler, HandlerRequest, HandlerResult, HandlerStream, HealthProbe, InvocationContext, InvocationSource, RequestBackground, RequestEvidence, RequestSleep, Issuer, exchange, PreparedServer, PublicationSnapshot, PublicationSnapshotInput, PublicationSource, Server, ServerCloseOptions, ServerConfig, ServerLimits, ServerOptions, WebSocketAdapter, WebSocketHandlers, WebSocketLike, WebSocketUpgradeOptions, } from './types.js';
6
- //# sourceMappingURL=index.d.ts.map
3
+ export { releaseProjectionRouteDecision, releaseRouteDecision, type RouteDecision, } from './invocation/index.js';
4
+ export { prepareReleaseSnapshot } from './release/index.js';
5
+ export * as release from './release/index.js';
6
+ /** @deprecated Successor: `prepareReleaseSnapshot`; serves v3-input destinations only. */
7
+ export { preparePublicationSnapshot } from './release/legacy/index.js';
8
+ /** @deprecated Successor: `release`; the Publication snapshot of a v3-input destination. */
9
+ export * as publication from './release/legacy/index.js';
10
+ export type { Application, ApplicationHost, CorsConfig, ExecutionControl, Handler, HandlerRequest, HandlerResult, HandlerStream, HealthProbe, InvocationContext, InvocationSource, RequestBackground, RequestEvidence, RequestSleep, Issuer, exchange, PreparedServer, PublicationSnapshot, PublicationSnapshotInput, PublicationSource, ReleaseSnapshot, ReleaseSnapshotInput, ReleaseSource, Server, ServerCloseOptions, ServerConfig, ServerLimits, ServerOptions, WebSocketAdapter, WebSocketHandlers, WebSocketLike, WebSocketUpgradeOptions, } from './types.js';
package/dist/index.js CHANGED
@@ -1,5 +1,9 @@
1
1
  export { createServer, prepareServer } from './server.js';
2
2
  export { DeliveryUnavailableError, IssuerKeysUnavailableError } from './errors/index.js';
3
- export { preparePublicationSnapshot } from './publication/index.js';
4
- export * as publication from './publication/index.js';
5
- //# sourceMappingURL=index.js.map
3
+ export { releaseProjectionRouteDecision, releaseRouteDecision, } from './invocation/index.js';
4
+ export { prepareReleaseSnapshot } from './release/index.js';
5
+ export * as release from './release/index.js';
6
+ /** @deprecated Successor: `prepareReleaseSnapshot`; serves v3-input destinations only. */
7
+ export { preparePublicationSnapshot } from './release/legacy/index.js';
8
+ /** @deprecated Successor: `release`; the Publication snapshot of a v3-input destination. */
9
+ export * as publication from './release/legacy/index.js';
@@ -1,7 +1,7 @@
1
- import type { invocation as protocol } from '@astrale-os/kernel-protocol';
1
+ import type { BinaryRequestBody } from '@astrale-os/kernel-core/callable';
2
+ import type * as protocol from '@astrale-os/kernel-protocol/invocation';
2
3
  import type { ActiveOperation, ActiveOperations } from '../lifecycle/index.js';
3
4
  import type { ApplicationHost, InvocationContext } from './types.js';
4
- export declare function invocationContext(assigned: protocol.InvocationId, operation: ActiveOperation, active: ActiveOperations, host?: ApplicationHost, requestBody?: Uint8Array, idempotencyKey?: protocol.IdempotencyKey): InvocationContext;
5
+ export declare function invocationContext(assigned: protocol.InvocationId, operation: ActiveOperation, active: ActiveOperations, host?: ApplicationHost, requestBody?: Uint8Array, idempotencyKey?: protocol.IdempotencyKey, binary?: BinaryRequestBody): InvocationContext;
5
6
  /** Default non-durable timer used when the application host supplies no timer capability. */
6
7
  export declare function defaultSleep(durationMs: number): Promise<void>;
7
- //# sourceMappingURL=context.d.ts.map
@@ -1,4 +1,4 @@
1
- export function invocationContext(assigned, operation, active, host, requestBody, idempotencyKey) {
1
+ export function invocationContext(assigned, operation, active, host, requestBody, idempotencyKey, binary) {
2
2
  const body = requestBody?.slice();
3
3
  return Object.freeze({
4
4
  invocation: assigned,
@@ -9,6 +9,7 @@ export function invocationContext(assigned, operation, active, host, requestBody
9
9
  },
10
10
  ...(idempotencyKey === undefined ? {} : { idempotencyKey }),
11
11
  ...(body === undefined ? {} : { request: Object.freeze({ body: () => body.slice() }) }),
12
+ ...(binary === undefined ? {} : { binary }),
12
13
  });
13
14
  }
14
15
  /** Default non-durable timer used when the application host supplies no timer capability. */
@@ -58,4 +59,3 @@ function sleepDuration(input) {
58
59
  }
59
60
  return input;
60
61
  }
61
- //# sourceMappingURL=context.js.map
@@ -1,5 +1,5 @@
1
1
  import type { IssuerId } from '@astrale-os/kernel-core/auth';
2
- import type { invocation as protocol } from '@astrale-os/kernel-protocol';
2
+ import type * as protocol from '@astrale-os/kernel-protocol/invocation';
3
3
  /** Injected source-owned identity allocator captured before Server readiness. */
4
4
  export interface InvocationSource {
5
5
  readonly source: IssuerId;
@@ -7,4 +7,3 @@ export interface InvocationSource {
7
7
  }
8
8
  export type NextInvocationId = () => protocol.InvocationId;
9
9
  export declare function captureInvocationSource(input: InvocationSource): NextInvocationId;
10
- //# sourceMappingURL=identity.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { issuer } from '@astrale-os/kernel-core/auth';
2
- import { invocation as protocolInvocation } from '@astrale-os/kernel-protocol';
2
+ import * as protocolInvocation from '@astrale-os/kernel-protocol/invocation';
3
3
  import { captureMethod } from '../capture.js';
4
4
  export function captureInvocationSource(input) {
5
5
  if (input === null || typeof input !== 'object') {
@@ -9,4 +9,3 @@ export function captureInvocationSource(input) {
9
9
  const next = captureMethod(input, 'next', 'Server Invocation source is invalid.');
10
10
  return () => protocolInvocation.acceptInvocationId({ source, id: next() });
11
11
  }
12
- //# sourceMappingURL=identity.js.map
@@ -1,5 +1,4 @@
1
1
  export { defaultSleep, invocationContext } from './context.js';
2
2
  export { captureInvocationSource, type InvocationSource, type NextInvocationId, } from './identity.js';
3
- export { publicationRouteDecision, type PublicationRouteDecision } from './publication-route.js';
3
+ export { admitVia, releaseProjectionRouteDecision, releaseRouteDecision, type RouteDecision, } from './release-route.js';
4
4
  export type { ApplicationHost, ExecutionControl, Handler, HandlerRequest, HandlerResult, HandlerStream, InvocationContext, RequestBackground, RequestEvidence, RequestSleep, } from './types.js';
5
- //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,3 @@
1
1
  export { defaultSleep, invocationContext } from './context.js';
2
2
  export { captureInvocationSource, } from './identity.js';
3
- export { publicationRouteDecision } from './publication-route.js';
4
- //# sourceMappingURL=index.js.map
3
+ export { admitVia, releaseProjectionRouteDecision, releaseRouteDecision, } from './release-route.js';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Routed admission at a v3-input destination: #508 same-schema and schema-drift continuity
3
+ * (`publicationRouteDecision`) admits a `PublicationVia` whose ETag or Schema differs from the
4
+ * served Publication while origin and issuer stay equal, so a legacy stable Worker keeps serving
5
+ * the installations made before the release snapshot with its latest code (Routage [.57929]). It
6
+ * applies only to a Server built from a v2/v3 Publication, never to a release snapshot.
7
+ *
8
+ * @deprecated Use `releaseRouteDecision` and `releaseProjectionRouteDecision`
9
+ * (`../release-route.ts`), which admit only the exact served release or its exact projection and
10
+ * answer every other relation with DEPLOYMENT_RETIRED.
11
+ *
12
+ * Short-term consumers: the v3-input destinations of `server/release/legacy/` (legacy direct-mode
13
+ * Workers, SDK Workers without a bound build digest, the Host's intrinsic publishers).
14
+ *
15
+ * Removal, in the separate breaking release that deletes `server/release/legacy/`, under its
16
+ * condition. Then delete this folder, its laws (SV-PUBLICATION-CONTINUITY,
17
+ * SV-PUBLICATION-ADMITS-LEGACY-VIA) and the `publication` branch of `admitVia`
18
+ * (`../release-route.ts`).
19
+ */
20
+ export { publicationRouteDecision, type PublicationRouteDecision } from './publication-route.js';
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Routed admission at a v3-input destination: #508 same-schema and schema-drift continuity
3
+ * (`publicationRouteDecision`) admits a `PublicationVia` whose ETag or Schema differs from the
4
+ * served Publication while origin and issuer stay equal, so a legacy stable Worker keeps serving
5
+ * the installations made before the release snapshot with its latest code (Routage [.57929]). It
6
+ * applies only to a Server built from a v2/v3 Publication, never to a release snapshot.
7
+ *
8
+ * @deprecated Use `releaseRouteDecision` and `releaseProjectionRouteDecision`
9
+ * (`../release-route.ts`), which admit only the exact served release or its exact projection and
10
+ * answer every other relation with DEPLOYMENT_RETIRED.
11
+ *
12
+ * Short-term consumers: the v3-input destinations of `server/release/legacy/` (legacy direct-mode
13
+ * Workers, SDK Workers without a bound build digest, the Host's intrinsic publishers).
14
+ *
15
+ * Removal, in the separate breaking release that deletes `server/release/legacy/`, under its
16
+ * condition. Then delete this folder, its laws (SV-PUBLICATION-CONTINUITY,
17
+ * SV-PUBLICATION-ADMITS-LEGACY-VIA) and the `publication` branch of `admitVia`
18
+ * (`../release-route.ts`).
19
+ */
20
+ export { publicationRouteDecision } from './publication-route.js';
@@ -1,14 +1,16 @@
1
1
  import type { ErrorPayload } from '@astrale-os/kernel-protocol/errors';
2
2
  import type { Publication } from '@astrale-os/kernel-protocol/publication/publication';
3
3
  import type { PublicationRef } from '@astrale-os/kernel-protocol/publication/reference';
4
+ /** @deprecated Successor: `RouteDecision`, which also answers a retired deployment. */
4
5
  export type PublicationRouteDecision = {
5
- readonly kind: 'exact';
6
- } | {
7
- readonly kind: 'same-schema';
6
+ readonly kind: 'admitted';
8
7
  } | {
9
8
  readonly kind: 'rejected';
10
9
  readonly error: ErrorPayload;
11
10
  };
12
- /** Compare untrusted installed routing evidence with the one captured serving Publication. */
11
+ /**
12
+ * Accept ETag or Schema changes only while origin and issuer remain equal.
13
+ *
14
+ * @deprecated Use `releaseRouteDecision` or `releaseProjectionRouteDecision` for exact release admission.
15
+ */
13
16
  export declare function publicationRouteDecision(current: Publication, installed: PublicationRef): PublicationRouteDecision;
14
- //# sourceMappingURL=publication-route.d.ts.map
@@ -1,22 +1,17 @@
1
1
  import { CODES } from '@astrale-os/kernel-protocol/errors';
2
- import { SCHEMA_UPGRADE_REQUIRED, SERVICE_TRUST_REQUIRED, } from '@astrale-os/kernel-protocol/invocation/service-reason';
2
+ import { SERVICE_TRUST_REQUIRED } from '@astrale-os/kernel-protocol/invocation/service-reason';
3
3
  import { compareReference } from '@astrale-os/kernel-protocol/publication/reference';
4
- /** Compare untrusted installed routing evidence with the one captured serving Publication. */
4
+ /**
5
+ * Accept ETag or Schema changes only while origin and issuer remain equal.
6
+ *
7
+ * @deprecated Use `releaseRouteDecision` or `releaseProjectionRouteDecision` for exact release admission.
8
+ */
5
9
  export function publicationRouteDecision(current, installed) {
6
10
  switch (compareReference(current, installed)) {
7
11
  case 'exact':
8
- return Object.freeze({ kind: 'exact' });
9
12
  case 'same-schema':
10
- return Object.freeze({ kind: 'same-schema' });
11
13
  case 'schema-drift':
12
- return rejected('Installed Domain schema requires an explicit upgrade.', Object.freeze({
13
- code: SCHEMA_UPGRADE_REQUIRED,
14
- details: Object.freeze({
15
- origin: installed.origin,
16
- installedRevision: installed.revision,
17
- candidateRevision: current.schema.revision,
18
- }),
19
- }));
14
+ return Object.freeze({ kind: 'admitted' });
20
15
  case 'identity-drift':
21
16
  return rejected('Installed Domain Service identity requires explicit trust.', Object.freeze({
22
17
  code: SERVICE_TRUST_REQUIRED,
@@ -42,4 +37,3 @@ function rejected(message, data) {
42
37
  error: Object.freeze({ code: CODES.CONFLICT, message, data }),
43
38
  });
44
39
  }
45
- //# sourceMappingURL=publication-route.js.map
@@ -0,0 +1,26 @@
1
+ import type { ErrorPayload } from '@astrale-os/kernel-protocol/errors';
2
+ import type { PublicationVia, Via } from '@astrale-os/kernel-protocol/invocation';
3
+ import type { DomainRelease, ReleaseDigest, ReleaseRef } from '@astrale-os/kernel-protocol/release';
4
+ import type { PublicationRef } from '@astrale-os/kernel-protocol/release/legacy';
5
+ import type { Served } from '../release/served.js';
6
+ import type { ReleaseSnapshot } from '../release/types.js';
7
+ export type RouteDecision = {
8
+ readonly kind: 'admitted';
9
+ } | {
10
+ readonly kind: 'rejected';
11
+ readonly error: ErrorPayload;
12
+ }
13
+ /** DEPLOYMENT_RETIRED includes the requested release only when the witness identifies it. */
14
+ | {
15
+ readonly kind: 'retired';
16
+ readonly release?: ReleaseDigest;
17
+ };
18
+ /**
19
+ * Only the exact served release admits. Never report the served digest as retired when
20
+ * the witness pairs it with a different revision or issuer.
21
+ */
22
+ export declare function releaseRouteDecision(current: DomainRelease, installed: ReleaseRef): RouteDecision;
23
+ /** Only the exact v3 projection reference admits, including its ETag, Schema and issuer. */
24
+ export declare function releaseProjectionRouteDecision(current: ReleaseSnapshot, installed: PublicationRef): RouteDecision;
25
+ /** Admit routing before credential resolution; Publication sources accept only legacy witnesses. */
26
+ export declare function admitVia(served: Served | undefined, via: Via | PublicationVia): RouteDecision;
@@ -0,0 +1,55 @@
1
+ import { CODES } from '@astrale-os/kernel-protocol/errors';
2
+ import { compareReferences, reference } from '@astrale-os/kernel-protocol/release';
3
+ import { compareReference } from '@astrale-os/kernel-protocol/release/legacy';
4
+ import { publicationRouteDecision } from './legacy/index.js';
5
+ const ADMITTED = Object.freeze({ kind: 'admitted' });
6
+ const RETIRED = Object.freeze({ kind: 'retired' });
7
+ /**
8
+ * Only the exact served release admits. Never report the served digest as retired when
9
+ * the witness pairs it with a different revision or issuer.
10
+ */
11
+ export function releaseRouteDecision(current, installed) {
12
+ switch (compareReferences(reference(current), installed)) {
13
+ case 'exact':
14
+ return ADMITTED;
15
+ case 'release-drift':
16
+ return installed.digest === current.digest
17
+ ? RETIRED
18
+ : Object.freeze({ kind: 'retired', release: installed.digest });
19
+ case 'origin-drift':
20
+ return invalid('Routed release origin differs from the served Domain.');
21
+ }
22
+ }
23
+ /** Only the exact v3 projection reference admits, including its ETag, Schema and issuer. */
24
+ export function releaseProjectionRouteDecision(current, installed) {
25
+ switch (compareReference(current.publication, installed)) {
26
+ case 'exact':
27
+ return ADMITTED;
28
+ case 'same-schema':
29
+ case 'schema-drift':
30
+ case 'identity-drift':
31
+ return RETIRED;
32
+ case 'origin-drift':
33
+ return invalid('Routed Publication origin differs from the served Domain.');
34
+ }
35
+ }
36
+ /** Admit routing before credential resolution; Publication sources accept only legacy witnesses. */
37
+ export function admitVia(served, via) {
38
+ if ('release' in via) {
39
+ return served?.kind === 'release'
40
+ ? releaseRouteDecision(served.release, via.release)
41
+ : invalid('Release routing requires a release-backed destination.');
42
+ }
43
+ if (served === undefined) {
44
+ return invalid('Publication routing requires a Publication-backed destination.');
45
+ }
46
+ return served.kind === 'release'
47
+ ? releaseProjectionRouteDecision(served.snapshot, via.publication)
48
+ : publicationRouteDecision(served.publication, via.publication);
49
+ }
50
+ function invalid(message) {
51
+ return Object.freeze({
52
+ kind: 'rejected',
53
+ error: Object.freeze({ code: CODES.INVALID_REQUEST, message }),
54
+ });
55
+ }
@@ -1,8 +1,9 @@
1
1
  import type { CredentialInput } from '@astrale-os/kernel-core/auth';
2
- import type { CallableResult } from '@astrale-os/kernel-core/domain';
2
+ import type { BinaryRequestBody, CallableResult } from '@astrale-os/kernel-core/callable';
3
3
  import type { Value } from '@astrale-os/kernel-dsl/value';
4
- import type { invocation as protocol } from '@astrale-os/kernel-protocol';
5
- import type { PublicationSnapshot } from '../publication/index.js';
4
+ import type * as protocol from '@astrale-os/kernel-protocol/invocation';
5
+ import type { ReleaseSnapshot } from '../release/index.js';
6
+ import type { PublicationSnapshot } from '../release/legacy/index.js';
6
7
  /** Optional platform retention and timer adaptation for one Fetch invocation. */
7
8
  export interface ApplicationHost {
8
9
  waitUntil(promise: Promise<unknown>): void;
@@ -27,6 +28,8 @@ export interface InvocationContext {
27
28
  readonly execution: ExecutionControl;
28
29
  readonly idempotencyKey?: protocol.IdempotencyKey;
29
30
  readonly request?: RequestEvidence;
31
+ /** Root-only binary HTTP ingress; ordinary envelopes and WebSocket carry none. */
32
+ readonly binary?: BinaryRequestBody;
30
33
  readonly background: RequestBackground;
31
34
  /** Rejects promptly when execution is cancelled or reaches its deadline. */
32
35
  readonly sleep: RequestSleep;
@@ -49,15 +52,25 @@ export interface HandlerRequest {
49
52
  readonly credential?: CredentialInput;
50
53
  /** Source-only effective delegation forwarded unchanged to Runtime. */
51
54
  readonly delegate?: protocol.Delegate;
52
- /** Destination routing witness forwarded after exact or same-schema Server admission. */
53
- readonly via?: protocol.Via;
55
+ /**
56
+ * Destination routing witness forwarded after Server admission: at a release-backed destination
57
+ * a `Via` naming its exact release or a `PublicationVia` naming its exact v3 projection; at a
58
+ * v3-input destination only a `PublicationVia`.
59
+ */
60
+ readonly via?: protocol.Via | protocol.PublicationVia;
54
61
  /** Source-only local-target or remote-revision Schema Registration precondition. */
55
62
  readonly schema?: protocol.SchemaTarget;
56
- /** Exact Server-pinned serving generation for a Publication-backed request. */
63
+ /** Exact Server-pinned release for a request at a release-backed destination. */
64
+ readonly release?: ReleaseSnapshot;
65
+ /**
66
+ * Exact Server-pinned Publication snapshot for a request at a v3-input destination.
67
+ *
68
+ * @deprecated Successor: `release`. Present only on a Server built from a v2/v3 Publication;
69
+ * deleted with `server/release/legacy/`.
70
+ */
57
71
  readonly publication?: PublicationSnapshot;
58
72
  readonly context: InvocationContext;
59
73
  }
60
74
  export interface Handler {
61
75
  dispatch(request: HandlerRequest): Promise<HandlerResult>;
62
76
  }
63
- //# sourceMappingURL=types.d.ts.map
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -10,4 +10,3 @@ export interface Provider {
10
10
  }
11
11
  export declare function capture(input: Provider): Provider;
12
12
  export declare function mount(app: ServerRouter, issuer: string, provider: Provider, cors: CorsPolicy, active: ActiveOperations, timeoutMs: number): void;
13
- //# sourceMappingURL=exchange.d.ts.map