@astrale-os/kernel-protocol 0.5.0-beta.67 → 0.5.0-beta.69

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 (225) hide show
  1. package/dist/codecs/index.d.ts +1 -2
  2. package/dist/codecs/index.js +1 -2
  3. package/dist/codecs/media-types.d.ts +0 -1
  4. package/dist/codecs/media-types.js +0 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.js +3 -1
  7. package/dist/invocation/admission.d.ts +2 -2
  8. package/dist/invocation/admission.js +5 -5
  9. package/dist/invocation/binding-codecs.d.ts +1 -1
  10. package/dist/invocation/binding-codecs.js +1 -6
  11. package/dist/invocation/http/negotiation.js +3 -10
  12. package/dist/invocation/index.d.ts +5 -2
  13. package/dist/invocation/index.js +4 -2
  14. package/dist/invocation/legacy/index.d.ts +29 -0
  15. package/dist/invocation/legacy/index.js +28 -0
  16. package/dist/invocation/legacy/route.d.ts +14 -0
  17. package/dist/invocation/legacy/route.js +25 -0
  18. package/dist/invocation/legacy/via.d.ts +30 -0
  19. package/dist/invocation/legacy/via.js +15 -0
  20. package/dist/invocation/redirect.d.ts +15 -12
  21. package/dist/invocation/redirect.js +9 -21
  22. package/dist/invocation/request.js +2 -2
  23. package/dist/invocation/routing.d.ts +19 -5
  24. package/dist/invocation/routing.js +50 -20
  25. package/dist/invocation/schema.d.ts +3 -8
  26. package/dist/invocation/schema.js +3 -10
  27. package/dist/invocation/service-reason.d.ts +13 -13
  28. package/dist/invocation/service-reason.js +13 -12
  29. package/dist/invocation/stale-route.d.ts +1 -1
  30. package/dist/invocation/target.d.ts +3 -0
  31. package/dist/invocation/target.js +8 -1
  32. package/dist/invocation/websocket/index.d.ts +1 -1
  33. package/dist/invocation/websocket/index.js +1 -1
  34. package/dist/invocation/websocket/subprotocol.d.ts +1 -2
  35. package/dist/invocation/websocket/subprotocol.js +3 -4
  36. package/dist/issuer/claims.d.ts +7 -0
  37. package/dist/issuer/claims.js +7 -0
  38. package/dist/issuer/index.d.ts +2 -0
  39. package/dist/issuer/index.js +2 -0
  40. package/dist/issuer/paths.d.ts +2 -0
  41. package/dist/issuer/paths.js +1 -0
  42. package/dist/issuer/workflow-engine.d.ts +18 -0
  43. package/dist/issuer/workflow-engine.js +59 -0
  44. package/dist/{publication → release}/bindings/callable.js +6 -6
  45. package/dist/release/bindings/invocation.js +13 -0
  46. package/dist/{publication → release}/bindings/view.d.ts +1 -1
  47. package/dist/{publication → release}/bindings/view.js +10 -10
  48. package/dist/release/build.d.ts +6 -0
  49. package/dist/release/build.js +7 -0
  50. package/dist/release/bundle-admission.d.ts +21 -0
  51. package/dist/{publication → release}/bundle-admission.js +18 -18
  52. package/dist/{publication → release}/bundle-descriptor.js +6 -6
  53. package/dist/release/bundle-evidence.d.ts +3 -0
  54. package/dist/release/bundle-evidence.js +13 -0
  55. package/dist/{publication → release}/bundle.d.ts +2 -2
  56. package/dist/{publication → release}/bundle.js +9 -9
  57. package/dist/{publication → release}/delivery/attestation.d.ts +1 -0
  58. package/dist/release/delivery/claims.d.ts +21 -0
  59. package/dist/release/delivery/claims.js +68 -0
  60. package/dist/release/delivery/delivery.d.ts +11 -0
  61. package/dist/release/delivery/delivery.js +24 -0
  62. package/dist/{publication → release}/delivery/error.d.ts +2 -0
  63. package/dist/{publication → release}/delivery/error.js +1 -0
  64. package/dist/{publication → release}/delivery/index.d.ts +6 -1
  65. package/dist/{publication → release}/delivery/index.js +5 -0
  66. package/dist/{publication → release}/delivery/limits.d.ts +2 -1
  67. package/dist/release/delivery/limits.js +5 -0
  68. package/dist/release/delivery/request.d.ts +21 -0
  69. package/dist/release/delivery/request.js +60 -0
  70. package/dist/{publication → release}/delivery-declaration.js +4 -4
  71. package/dist/release/delivery-endpoint.js +22 -0
  72. package/dist/release/digest.d.ts +13 -0
  73. package/dist/{publication/etag.js → release/digest.js} +1 -10
  74. package/dist/release/error.d.ts +7 -0
  75. package/dist/release/error.js +11 -0
  76. package/dist/release/index.d.ts +21 -0
  77. package/dist/release/index.js +14 -0
  78. package/dist/release/issuer.d.ts +5 -0
  79. package/dist/release/issuer.js +34 -0
  80. package/dist/release/legacy/bindings.d.ts +14 -0
  81. package/dist/release/legacy/bindings.js +11 -0
  82. package/dist/release/legacy/bundle-admission.d.ts +6 -0
  83. package/dist/release/legacy/bundle-admission.js +10 -0
  84. package/dist/release/legacy/bundle-evidence.d.ts +8 -0
  85. package/dist/release/legacy/bundle-evidence.js +11 -0
  86. package/dist/release/legacy/bundle.d.ts +24 -0
  87. package/dist/release/legacy/bundle.js +31 -0
  88. package/dist/release/legacy/delivery/attestation.d.ts +6 -0
  89. package/dist/release/legacy/delivery/attestation.js +1 -0
  90. package/dist/{publication → release/legacy}/delivery/claims.d.ts +9 -0
  91. package/dist/{publication → release/legacy}/delivery/claims.js +7 -2
  92. package/dist/release/legacy/delivery/delivery.d.ts +18 -0
  93. package/dist/{publication → release/legacy}/delivery/delivery.js +6 -2
  94. package/dist/release/legacy/delivery/error.d.ts +16 -0
  95. package/dist/release/legacy/delivery/error.js +6 -0
  96. package/dist/release/legacy/delivery/index.d.ts +13 -0
  97. package/dist/release/legacy/delivery/index.js +13 -0
  98. package/dist/release/legacy/delivery/limits.d.ts +21 -0
  99. package/dist/release/legacy/delivery/limits.js +22 -0
  100. package/dist/release/legacy/delivery/request.d.ts +26 -0
  101. package/dist/{publication → release/legacy}/delivery/request.js +8 -3
  102. package/dist/release/legacy/delivery-declaration.d.ts +9 -0
  103. package/dist/release/legacy/delivery-declaration.js +11 -0
  104. package/dist/release/legacy/error.d.ts +26 -0
  105. package/dist/release/legacy/error.js +114 -0
  106. package/dist/release/legacy/etag.d.ts +12 -0
  107. package/dist/release/legacy/etag.js +14 -0
  108. package/dist/release/legacy/index.d.ts +75 -0
  109. package/dist/{publication → release/legacy}/index.js +7 -2
  110. package/dist/release/legacy/profiles.d.ts +23 -0
  111. package/dist/release/legacy/profiles.js +36 -0
  112. package/dist/release/legacy/projection.d.ts +13 -0
  113. package/dist/release/legacy/projection.js +25 -0
  114. package/dist/release/legacy/publication.d.ts +90 -0
  115. package/dist/release/legacy/publication.js +124 -0
  116. package/dist/release/legacy/reference.d.ts +47 -0
  117. package/dist/{publication → release/legacy}/reference.js +27 -3
  118. package/dist/release/legacy/requirements.d.ts +30 -0
  119. package/dist/release/legacy/requirements.js +20 -0
  120. package/dist/{publication → release}/manifest.js +6 -6
  121. package/dist/release/reference.d.ts +26 -0
  122. package/dist/release/reference.js +70 -0
  123. package/dist/release/release.d.ts +60 -0
  124. package/dist/release/release.js +123 -0
  125. package/dist/{publication → release}/requirements.d.ts +11 -4
  126. package/dist/{publication → release}/requirements.js +58 -39
  127. package/dist/{publication → release}/route.js +24 -24
  128. package/dist/{publication → release}/schema.js +4 -4
  129. package/dist/release/served.d.ts +26 -0
  130. package/dist/release/served.js +65 -0
  131. package/dist/release/shape.d.ts +8 -0
  132. package/dist/routes/admission.d.ts +1 -1
  133. package/dist/routes/admission.js +7 -85
  134. package/dist/routes/binding.d.ts +3 -3
  135. package/dist/routes/binding.js +10 -19
  136. package/dist/routes/compiler.d.ts +2 -2
  137. package/dist/routes/compiler.js +3 -2
  138. package/dist/routes/credential.d.ts +12 -1
  139. package/dist/routes/credential.js +11 -3
  140. package/dist/routes/decode.d.ts +5 -2
  141. package/dist/routes/decode.js +19 -6
  142. package/dist/routes/deployment-retired.d.ts +30 -0
  143. package/dist/routes/deployment-retired.js +96 -0
  144. package/dist/routes/encode.js +7 -6
  145. package/dist/routes/entries.d.ts +23 -0
  146. package/dist/routes/entries.js +150 -0
  147. package/dist/routes/evidence.d.ts +3 -3
  148. package/dist/routes/evidence.js +7 -34
  149. package/dist/routes/header.d.ts +9 -0
  150. package/dist/routes/header.js +34 -0
  151. package/dist/routes/index.d.ts +5 -2
  152. package/dist/routes/index.js +5 -2
  153. package/dist/routes/legacy/index.d.ts +29 -0
  154. package/dist/routes/legacy/index.js +29 -0
  155. package/dist/routes/legacy/routing.d.ts +24 -0
  156. package/dist/routes/legacy/routing.js +45 -0
  157. package/dist/routes/legacy/table.d.ts +34 -0
  158. package/dist/routes/legacy/table.js +50 -0
  159. package/dist/routes/mapping.d.ts +1 -1
  160. package/dist/routes/mapping.js +4 -4
  161. package/dist/routes/match.d.ts +1 -1
  162. package/dist/routes/placement.d.ts +2 -2
  163. package/dist/routes/plan.d.ts +1 -1
  164. package/dist/routes/request.d.ts +5 -3
  165. package/dist/routes/reservation.d.ts +4 -2
  166. package/dist/routes/reservation.js +4 -3
  167. package/dist/routes/routing.d.ts +30 -6
  168. package/dist/routes/routing.js +34 -49
  169. package/dist/routes/select.d.ts +1 -1
  170. package/dist/routes/table.d.ts +3 -2
  171. package/dist/routes/target.d.ts +5 -0
  172. package/dist/routes/target.js +16 -0
  173. package/dist/runtime/artifact.d.ts +2 -2
  174. package/dist/runtime/artifact.js +2 -2
  175. package/dist/schema/installation/codec.d.ts +6 -1
  176. package/dist/schema/installation/codec.js +10 -7
  177. package/dist/schema/installation/introspection/codec.d.ts +11 -2
  178. package/dist/schema/installation/introspection/codec.js +184 -47
  179. package/dist/schema/installation/introspection/index.d.ts +1 -1
  180. package/dist/schema/installation/introspection/result.d.ts +61 -1
  181. package/dist/schema/installation/legacy/index.d.ts +39 -0
  182. package/dist/schema/installation/legacy/index.js +39 -0
  183. package/dist/schema/installation/legacy/installation.d.ts +9 -0
  184. package/dist/schema/installation/legacy/installation.js +28 -0
  185. package/dist/schema/installation/legacy/introspection.d.ts +10 -0
  186. package/dist/schema/installation/legacy/introspection.js +70 -0
  187. package/dist/schema/installation/legacy/msgpack.d.ts +1 -0
  188. package/dist/schema/installation/legacy/msgpack.js +143 -0
  189. package/package.json +63 -36
  190. package/dist/codecs/msgpack.d.ts +0 -4
  191. package/dist/codecs/msgpack.js +0 -53
  192. package/dist/publication/bindings/invocation.js +0 -13
  193. package/dist/publication/bundle-admission.d.ts +0 -4
  194. package/dist/publication/bundle-evidence.d.ts +0 -3
  195. package/dist/publication/bundle-evidence.js +0 -13
  196. package/dist/publication/content.d.ts +0 -10
  197. package/dist/publication/delivery/delivery.d.ts +0 -9
  198. package/dist/publication/delivery/limits.js +0 -4
  199. package/dist/publication/delivery/request.d.ts +0 -15
  200. package/dist/publication/delivery-endpoint.js +0 -22
  201. package/dist/publication/error.d.ts +0 -7
  202. package/dist/publication/error.js +0 -11
  203. package/dist/publication/etag.d.ts +0 -6
  204. package/dist/publication/index.d.ts +0 -17
  205. package/dist/publication/legacy-requirements.d.ts +0 -12
  206. package/dist/publication/legacy-requirements.js +0 -23
  207. package/dist/publication/publication.d.ts +0 -38
  208. package/dist/publication/publication.js +0 -146
  209. package/dist/publication/reference.d.ts +0 -17
  210. package/dist/routes/release-unavailable.d.ts +0 -8
  211. package/dist/routes/release-unavailable.js +0 -32
  212. /package/dist/{publication → release}/bindings/callable.d.ts +0 -0
  213. /package/dist/{publication → release}/bindings/index.d.ts +0 -0
  214. /package/dist/{publication → release}/bindings/index.js +0 -0
  215. /package/dist/{publication → release}/bindings/invocation.d.ts +0 -0
  216. /package/dist/{publication → release}/bundle-descriptor.d.ts +0 -0
  217. /package/dist/{publication → release}/declaration.d.ts +0 -0
  218. /package/dist/{publication → release}/declaration.js +0 -0
  219. /package/dist/{publication → release}/delivery/attestation.js +0 -0
  220. /package/dist/{publication → release}/delivery-declaration.d.ts +0 -0
  221. /package/dist/{publication → release}/delivery-endpoint.d.ts +0 -0
  222. /package/dist/{publication → release}/manifest.d.ts +0 -0
  223. /package/dist/{publication → release}/route.d.ts +0 -0
  224. /package/dist/{publication → release}/schema.d.ts +0 -0
  225. /package/dist/{publication/content.js → release/shape.js} +0 -0
@@ -0,0 +1,150 @@
1
+ import { accept as acceptPortable, json } from '@astrale-os/kernel-dsl/value';
2
+ import { admitRoute } from '../release/route.js';
3
+ import { fail } from './error.js';
4
+ import { place } from './placement.js';
5
+ const AUTH = new Set(['anonymous', 'authenticated', 'authorized']);
6
+ const OUTPUT = new Set(['value', 'stream', 'binary']);
7
+ /**
8
+ * The coordinate in which a served document differs from one Plan placed at `publicUrl`: its
9
+ * origin or schema revision (`identity`), or its route wire (`routes`). Each Table words its own
10
+ * refusal after the document it binds.
11
+ */
12
+ export function placementMismatch(plan, deployed, domain, publicUrl) {
13
+ if (plan.origin !== deployed.origin ||
14
+ plan.origin !== domain.origin ||
15
+ plan.revision !== deployed.schema.revision ||
16
+ plan.revision !== domain.revision) {
17
+ return 'identity';
18
+ }
19
+ return json.serialize(place(plan, publicUrl)) ===
20
+ json.serialize(deployed.routes)
21
+ ? undefined
22
+ : 'routes';
23
+ }
24
+ /** The entries of one placed Plan at the hrefs its served document publishes. */
25
+ export function placedEntries(plan, deployed) {
26
+ return Object.freeze(plan.entries.map((entry, index) => {
27
+ const { path: _path, ...portable } = entry;
28
+ return Object.freeze({ ...portable, href: deployed.routes[index].href });
29
+ }));
30
+ }
31
+ /** Whether entries carry exactly the route wire and Domain identity of one served document. */
32
+ export function sameServedWire(entries, deployed, domain) {
33
+ return (domain.origin === deployed.origin &&
34
+ domain.revision === deployed.schema.revision &&
35
+ json.serialize(entries.map(wireRoute)) === json.serialize(deployed.routes));
36
+ }
37
+ /** Refuse an entry whose target, auth or output differs from the Domain's callable meaning. */
38
+ export function verifyMeaning(entries, domain) {
39
+ for (const entry of entries) {
40
+ const meaning = domain.callable(entry.callable);
41
+ const targetMatches = meaning !== undefined &&
42
+ ((entry.target.kind === 'function' && !isMethod(meaning)) ||
43
+ (entry.target.kind === 'method' &&
44
+ isMethod(meaning) &&
45
+ meaning.executable &&
46
+ entry.target.dispatch === (meaning.static ? 'static' : 'instance')));
47
+ if (!targetMatches || meaning.auth !== entry.auth || meaning.output.mode !== entry.output) {
48
+ fail('NATIVE_ROUTE_BINDING_INVALID', `Route ${entry.name} differs from Domain meaning.`);
49
+ }
50
+ }
51
+ }
52
+ /** Admit one portable Table object holding exactly `fields`. */
53
+ export function tableObject(input, fields) {
54
+ const value = object(acceptPortable(input), 'Route Table');
55
+ exact(value, fields, 'Route Table');
56
+ return value;
57
+ }
58
+ /** Admit the entries of one Table bound to `origin`; an invalid route wire is a `ReleaseError`. */
59
+ export function acceptEntries(input, origin) {
60
+ if (!Array.isArray(input))
61
+ invalid('Route Table entries');
62
+ const entries = input.map((entry) => acceptRoute(entry, origin));
63
+ if (new Set(entries.map(({ name }) => name)).size !== entries.length) {
64
+ fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table names must be unique.');
65
+ }
66
+ return Object.freeze(entries);
67
+ }
68
+ function acceptRoute(input, origin) {
69
+ const value = object(input, 'Route Table entry');
70
+ exact(value, ['name', 'callable', 'target', 'auth', 'output', 'href', 'method', 'default'], 'Route Table entry', ['requestMethod', 'query', 'headers', 'body', 'credential']);
71
+ if (typeof value.default !== 'boolean')
72
+ invalid('Route Table default');
73
+ if (typeof value.auth !== 'string' || !AUTH.has(value.auth)) {
74
+ invalid('Route Table auth');
75
+ }
76
+ if (typeof value.output !== 'string' || !OUTPUT.has(value.output))
77
+ invalid('Route Table output');
78
+ const wire = admitRoute({
79
+ name: value.name,
80
+ callable: value.callable,
81
+ href: value.href,
82
+ method: value.method,
83
+ ...(value.default === true ? { default: true } : {}),
84
+ ...(value.requestMethod === undefined ? {} : { requestMethod: value.requestMethod }),
85
+ ...(value.query === undefined ? {} : { query: value.query }),
86
+ ...(value.headers === undefined ? {} : { headers: value.headers }),
87
+ ...(value.body === undefined ? {} : { body: value.body }),
88
+ ...(value.credential === undefined ? {} : { credential: value.credential }),
89
+ ...receiver(value.target),
90
+ }, origin);
91
+ const { default: _default, receiver: _receiver, ...common } = wire;
92
+ return Object.freeze({
93
+ ...common,
94
+ target: target(value.target),
95
+ auth: value.auth,
96
+ output: value.output,
97
+ default: value.default,
98
+ });
99
+ }
100
+ function target(input) {
101
+ const value = object(input, 'Route target');
102
+ if (value.kind === 'function') {
103
+ exact(value, ['kind'], 'Route Function target');
104
+ return Object.freeze({ kind: 'function' });
105
+ }
106
+ if (value.kind !== 'method' || (value.dispatch !== 'static' && value.dispatch !== 'instance')) {
107
+ invalid('Route Method target');
108
+ }
109
+ if (value.dispatch === 'static') {
110
+ exact(value, ['kind', 'dispatch'], 'Route static Method target');
111
+ return Object.freeze({ kind: 'method', dispatch: 'static' });
112
+ }
113
+ exact(value, ['kind', 'dispatch', 'receiver'], 'Route instance Method target');
114
+ if (typeof value.receiver !== 'string')
115
+ invalid('Route receiver');
116
+ return Object.freeze({ kind: 'method', dispatch: 'instance', receiver: value.receiver });
117
+ }
118
+ function receiver(input) {
119
+ const admitted = target(input);
120
+ return admitted.kind === 'method' && admitted.dispatch === 'instance'
121
+ ? { receiver: admitted.receiver }
122
+ : {};
123
+ }
124
+ function isMethod(meaning) {
125
+ return 'owner' in meaning;
126
+ }
127
+ function wireRoute(entry) {
128
+ const { target, auth: _auth, output: _output, default: isDefault, ...wire } = entry;
129
+ return {
130
+ ...wire,
131
+ ...(isDefault ? { default: true } : {}),
132
+ ...(target.kind === 'method' && target.dispatch === 'instance'
133
+ ? { receiver: target.receiver }
134
+ : {}),
135
+ };
136
+ }
137
+ function object(input, label) {
138
+ if (input === null || typeof input !== 'object' || Array.isArray(input))
139
+ invalid(label);
140
+ return input;
141
+ }
142
+ function exact(value, required, label, optional = []) {
143
+ const allowed = new Set([...required, ...optional]);
144
+ if (Object.keys(value).some((key) => !allowed.has(key)) ||
145
+ required.some((key) => !Object.hasOwn(value, key)))
146
+ invalid(label);
147
+ }
148
+ function invalid(label) {
149
+ return fail('NATIVE_ROUTE_BINDING_INVALID', `${label} is invalid.`);
150
+ }
@@ -1,5 +1,5 @@
1
1
  import type { Domain } from '@astrale-os/kernel-dsl/v1';
2
- import type { Publication } from '../publication/publication.js';
2
+ import type { DomainRelease } from '../release/release.js';
3
3
  import type { Table } from './table.js';
4
- /** Verify that an admitted Table carries the exact published wire and Domain meaning. */
5
- export declare function verifyTable(table: Table, deployed: Publication, domain: Pick<Domain, 'origin' | 'revision' | 'callable'>): Table;
4
+ /** Verify that an admitted Table carries the exact released wire and Domain meaning. */
5
+ export declare function verifyTable(table: Table, deployed: DomainRelease, domain: Pick<Domain, 'origin' | 'revision' | 'callable'>): Table;
@@ -1,39 +1,12 @@
1
- import { json } from '@astrale-os/kernel-dsl/value';
2
- import { compareReferences, reference } from '../publication/reference.js';
1
+ import { compareReferences, reference } from '../release/reference.js';
2
+ import { sameServedWire, verifyMeaning } from './entries.js';
3
3
  import { fail } from './error.js';
4
- /** Verify that an admitted Table carries the exact published wire and Domain meaning. */
4
+ /** Verify that an admitted Table carries the exact released wire and Domain meaning. */
5
5
  export function verifyTable(table, deployed, domain) {
6
- if (compareReferences(table.publication, reference(deployed)) !== 'exact' ||
7
- domain.origin !== deployed.origin ||
8
- domain.revision !== deployed.schema.revision ||
9
- json.serialize(table.entries.map(wireRoute)) !==
10
- json.serialize(deployed.routes)) {
11
- fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table evidence differs from its Publication.');
12
- }
13
- for (const entry of table.entries) {
14
- const meaning = domain.callable(entry.callable);
15
- const targetMatches = meaning !== undefined &&
16
- ((entry.target.kind === 'function' && !isMethod(meaning)) ||
17
- (entry.target.kind === 'method' &&
18
- isMethod(meaning) &&
19
- meaning.executable &&
20
- entry.target.dispatch === (meaning.static ? 'static' : 'instance')));
21
- if (!targetMatches || meaning.auth !== entry.auth || meaning.output.mode !== entry.output) {
22
- fail('NATIVE_ROUTE_BINDING_INVALID', `Route ${entry.name} differs from Domain meaning.`);
23
- }
6
+ if (compareReferences(table.release, reference(deployed)) !== 'exact' ||
7
+ !sameServedWire(table.entries, deployed, domain)) {
8
+ fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table evidence differs from its Release.');
24
9
  }
10
+ verifyMeaning(table.entries, domain);
25
11
  return table;
26
12
  }
27
- function isMethod(meaning) {
28
- return 'owner' in meaning;
29
- }
30
- function wireRoute(entry) {
31
- const { target, auth: _auth, output: _output, default: isDefault, ...wire } = entry;
32
- return {
33
- ...wire,
34
- ...(isDefault ? { default: true } : {}),
35
- ...(target.kind === 'method' && target.dispatch === 'instance'
36
- ? { receiver: target.receiver }
37
- : {}),
38
- };
39
- }
@@ -0,0 +1,9 @@
1
+ import * as auth from '@astrale-os/kernel-core/auth';
2
+ import type { Sha256Digest } from '../release/digest.js';
3
+ import type { HttpRequest } from './request.js';
4
+ /** The digest one header value names as exactly one strong quoted digest, else undefined. */
5
+ export declare function strongDigest(input: string): Sha256Digest | undefined;
6
+ /** Read one reserved header, which occurs at most once in any spelling. */
7
+ export declare function reservedHeader(input: HttpRequest['headers'], name: string): string | undefined;
8
+ /** Admit the routing Kernel issuer one native route request names in header `name`. */
9
+ export declare function acceptIssuerHeader(encoded: string, name: string): auth.IssuerId;
@@ -0,0 +1,34 @@
1
+ import * as auth from '@astrale-os/kernel-core/auth';
2
+ import { fail } from './error.js';
3
+ const STRONG_DIGEST = /^"(sha256:[0-9a-f]{64})"$/u;
4
+ /** The digest one header value names as exactly one strong quoted digest, else undefined. */
5
+ export function strongDigest(input) {
6
+ return STRONG_DIGEST.exec(input)?.[1];
7
+ }
8
+ /** Read one reserved header, which occurs at most once in any spelling. */
9
+ export function reservedHeader(input, name) {
10
+ if (input instanceof Headers)
11
+ return input.get(name) ?? undefined;
12
+ let found;
13
+ for (const [candidate, value] of Object.entries(input ?? {})) {
14
+ if (candidate.toLowerCase() !== name || value === undefined)
15
+ continue;
16
+ if (found !== undefined || (Array.isArray(value) && value.length !== 1)) {
17
+ fail('NATIVE_ROUTE_ROUTING_INVALID', `Header ${name} must occur at most once.`);
18
+ }
19
+ found = typeof value === 'string' ? value : value[0];
20
+ }
21
+ return found;
22
+ }
23
+ /** Admit the routing Kernel issuer one native route request names in header `name`. */
24
+ export function acceptIssuerHeader(encoded, name) {
25
+ try {
26
+ return auth.issuer.accept(encoded);
27
+ }
28
+ catch (cause) {
29
+ if (cause instanceof auth.AuthValueError) {
30
+ return fail('NATIVE_ROUTE_ROUTING_INVALID', `${name} is invalid.`, cause);
31
+ }
32
+ throw cause;
33
+ }
34
+ }
@@ -12,8 +12,11 @@ export type { Plan, PlanEntry } from './plan.js';
12
12
  export type { Route, Table } from './table.js';
13
13
  export type { RouteTarget } from './target.js';
14
14
  export { place } from './placement.js';
15
- export { decodeReleaseUnavailable, HTTP_ROUTE_RELEASE_UNAVAILABLE, HTTP_ROUTE_RELEASE_UNAVAILABLE_STATUS, releaseUnavailableHeaders, type ReleaseUnavailable, } from './release-unavailable.js';
16
- export { decodeRouting, decodeMiss, decodeStale, HTTP_ROUTE_PUBLICATION, HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_MISS_STATUS, HTTP_ROUTE_STALE, HTTP_ROUTE_STALE_STATUS, missHeaders, staleHeaders, type MissControl, type StaleControl, } from './routing.js';
15
+ export { decodeDeploymentRetired, deploymentRetiredBody, deploymentRetiredHeaders, HTTP_DEPLOYMENT_RETIRED, HTTP_DEPLOYMENT_RETIRED_STATUS, type DeploymentRetired, } from './deployment-retired.js';
16
+ export { decodeRouting, decodeMiss, decodeStale, HTTP_ROUTE_DIGEST, HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_MISS_STATUS, HTTP_ROUTE_STALE, HTTP_ROUTE_STALE_STATUS, missHeaders, staleHeaders, type MissControl, type ServedReferences, type StaleControl, } from './routing.js';
17
17
  export { select } from './select.js';
18
18
  export { decodeStreamFrame, encodeStreamFrame, STREAM_MEDIA_TYPE, type StreamFrame, } from './stream.js';
19
19
  export { templatesOverlap } from './template.js';
20
+ /** @deprecated Native routes of a v3-input destination; use the release-bound Table and decoders. */
21
+ export * as legacy from './legacy/index.js';
22
+ export { HTTP_ROUTE_PUBLICATION } from './legacy/index.js';
@@ -9,8 +9,11 @@ export { RouteError } from './error.js';
9
9
  export { match } from './match.js';
10
10
  export {} from './request.js';
11
11
  export { place } from './placement.js';
12
- export { decodeReleaseUnavailable, HTTP_ROUTE_RELEASE_UNAVAILABLE, HTTP_ROUTE_RELEASE_UNAVAILABLE_STATUS, releaseUnavailableHeaders, } from './release-unavailable.js';
13
- export { decodeRouting, decodeMiss, decodeStale, HTTP_ROUTE_PUBLICATION, HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_MISS_STATUS, HTTP_ROUTE_STALE, HTTP_ROUTE_STALE_STATUS, missHeaders, staleHeaders, } from './routing.js';
12
+ export { decodeDeploymentRetired, deploymentRetiredBody, deploymentRetiredHeaders, HTTP_DEPLOYMENT_RETIRED, HTTP_DEPLOYMENT_RETIRED_STATUS, } from './deployment-retired.js';
13
+ export { decodeRouting, decodeMiss, decodeStale, HTTP_ROUTE_DIGEST, HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_MISS_STATUS, HTTP_ROUTE_STALE, HTTP_ROUTE_STALE_STATUS, missHeaders, staleHeaders, } from './routing.js';
14
14
  export { select } from './select.js';
15
15
  export { decodeStreamFrame, encodeStreamFrame, STREAM_MEDIA_TYPE, } from './stream.js';
16
16
  export { templatesOverlap } from './template.js';
17
+ /** @deprecated Native routes of a v3-input destination; use the release-bound Table and decoders. */
18
+ export * as legacy from './legacy/index.js';
19
+ export { HTTP_ROUTE_PUBLICATION } from './legacy/index.js';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Native routes bound to a v2/v3 Publication and its ETag. Binding also reserves `release.json`
3
+ * to prevent routes from shadowing the release document.
4
+ * Superseded by release-based Tables and routing from `@astrale-os/kernel-protocol/routes`.
5
+ *
6
+ * Short-term consumers: every destination sealed from a v2/v3 Publication, the legacy stable
7
+ * Workers and the SDK's v3 seal and preflight (`legacy.bind`, `legacy.verifyTable`,
8
+ * `legacy.Table`, adopted at its Kernel pin bump), and the Server's Publication-backed native
9
+ * routes (`server/routes/routes.ts`, `server/release/legacy/`) that serve them.
10
+ *
11
+ * Removal, in a separate breaking release: the conditions of `protocol/release/legacy/index.ts`
12
+ * hold (no stable Worker serves a v2/v3 document, no installation pins one) and every supported
13
+ * client relays `Via`. Then delete, in the same PR:
14
+ * - this folder with its tests and laws, the `legacy` namespace and `HTTP_ROUTE_PUBLICATION`
15
+ * re-export of `routes/index.ts`, and the `./routes/legacy` subpaths (source and `dist`) of
16
+ * `protocol/package.json`;
17
+ * - the projection branch of the canonical `decodeRouting` (`routing.ts`) with
18
+ * `ServedReferences.projection`, so stale reports the release digest as `current`, and the
19
+ * projection vectors of TEST-DECODES-ROUTING-BY-SERVED-REFERENCE;
20
+ * - the Publication-backed native routes of the Server (`server/routes/routes.ts`,
21
+ * `server/release/legacy/`, and #508 in `server/invocation/legacy/`), which read this module;
22
+ * - rebase `protocol/__tests__/publication-routes.test.ts`, which exercises the shared compile,
23
+ * placement and reservation laws through this Table, on the release Table;
24
+ * - `ServedReferences.projection` from law PROTOCOL-LEGACY-WIRE-FIELDS and its test.
25
+ * The shared entry mechanics (`entries.ts`, `header.ts`) and `reservation.ts` stay: they carry no
26
+ * document label.
27
+ */
28
+ export { acceptTable, bind, verifyTable, type Table } from './table.js';
29
+ export { decode, decodeRouting, HTTP_ROUTE_PUBLICATION } from './routing.js';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Native routes bound to a v2/v3 Publication and its ETag. Binding also reserves `release.json`
3
+ * to prevent routes from shadowing the release document.
4
+ * Superseded by release-based Tables and routing from `@astrale-os/kernel-protocol/routes`.
5
+ *
6
+ * Short-term consumers: every destination sealed from a v2/v3 Publication, the legacy stable
7
+ * Workers and the SDK's v3 seal and preflight (`legacy.bind`, `legacy.verifyTable`,
8
+ * `legacy.Table`, adopted at its Kernel pin bump), and the Server's Publication-backed native
9
+ * routes (`server/routes/routes.ts`, `server/release/legacy/`) that serve them.
10
+ *
11
+ * Removal, in a separate breaking release: the conditions of `protocol/release/legacy/index.ts`
12
+ * hold (no stable Worker serves a v2/v3 document, no installation pins one) and every supported
13
+ * client relays `Via`. Then delete, in the same PR:
14
+ * - this folder with its tests and laws, the `legacy` namespace and `HTTP_ROUTE_PUBLICATION`
15
+ * re-export of `routes/index.ts`, and the `./routes/legacy` subpaths (source and `dist`) of
16
+ * `protocol/package.json`;
17
+ * - the projection branch of the canonical `decodeRouting` (`routing.ts`) with
18
+ * `ServedReferences.projection`, so stale reports the release digest as `current`, and the
19
+ * projection vectors of TEST-DECODES-ROUTING-BY-SERVED-REFERENCE;
20
+ * - the Publication-backed native routes of the Server (`server/routes/routes.ts`,
21
+ * `server/release/legacy/`, and #508 in `server/invocation/legacy/`), which read this module;
22
+ * - rebase `protocol/__tests__/publication-routes.test.ts`, which exercises the shared compile,
23
+ * placement and reservation laws through this Table, on the release Table;
24
+ * - `ServedReferences.projection` from law PROTOCOL-LEGACY-WIRE-FIELDS and its test.
25
+ * The shared entry mechanics (`entries.ts`, `header.ts`) and `reservation.ts` stay: they carry no
26
+ * document label.
27
+ */
28
+ export { acceptTable, bind, verifyTable } from './table.js';
29
+ export { decode, decodeRouting, HTTP_ROUTE_PUBLICATION } from './routing.js';
@@ -0,0 +1,24 @@
1
+ import type { Domain } from '@astrale-os/kernel-dsl/v1';
2
+ import type { PublicationVia } from '../../invocation/index.js';
3
+ import type { PublicationRef } from '../../release/legacy/reference.js';
4
+ import type { HttpRequest, Invocation } from '../request.js';
5
+ import type { Route } from '../table.js';
6
+ /**
7
+ * The If-Match header native routing reads, named for the Publication ETag it carried.
8
+ *
9
+ * @deprecated Successor: `HTTP_ROUTE_DIGEST`, the same header named for the routed digest.
10
+ */
11
+ export declare const HTTP_ROUTE_PUBLICATION: "if-match";
12
+ /**
13
+ * Decode only the native strong If-Match representation of Publication routing, served by a
14
+ * v3-input destination; a mismatched ETag is invalid here because the Server answers stale first.
15
+ *
16
+ * @deprecated Successor: `decodeRouting`, which serves a release and its v3 projection.
17
+ */
18
+ export declare function decodeRouting(input: Pick<HttpRequest, 'headers'>, publication: PublicationRef): PublicationVia | undefined;
19
+ /**
20
+ * Decode one native route request served by a v3-input destination.
21
+ *
22
+ * @deprecated Successor: `decode`, which serves a release and its v3 projection.
23
+ */
24
+ export declare function decode(entry: Route, request: HttpRequest, domain: Domain, served: PublicationRef): Invocation;
@@ -0,0 +1,45 @@
1
+ import { decodeInvocation } from '../decode.js';
2
+ import { fail } from '../error.js';
3
+ import { acceptIssuerHeader, reservedHeader, strongDigest } from '../header.js';
4
+ import { HTTP_ROUTE_DIGEST, HTTP_ROUTE_ISSUER } from '../routing.js';
5
+ /**
6
+ * The If-Match header native routing reads, named for the Publication ETag it carried.
7
+ *
8
+ * @deprecated Successor: `HTTP_ROUTE_DIGEST`, the same header named for the routed digest.
9
+ */
10
+ export const HTTP_ROUTE_PUBLICATION = HTTP_ROUTE_DIGEST;
11
+ /**
12
+ * Decode only the native strong If-Match representation of Publication routing, served by a
13
+ * v3-input destination; a mismatched ETag is invalid here because the Server answers stale first.
14
+ *
15
+ * @deprecated Successor: `decodeRouting`, which serves a release and its v3 projection.
16
+ */
17
+ export function decodeRouting(input, publication) {
18
+ const encodedEtag = reservedHeader(input.headers, HTTP_ROUTE_DIGEST);
19
+ const encodedIssuer = reservedHeader(input.headers, HTTP_ROUTE_ISSUER);
20
+ if (encodedEtag === undefined && encodedIssuer === undefined)
21
+ return undefined;
22
+ if (encodedEtag === undefined || encodedIssuer === undefined) {
23
+ fail('NATIVE_ROUTE_ROUTING_INVALID', `${HTTP_ROUTE_DIGEST} and ${HTTP_ROUTE_ISSUER} must occur together.`);
24
+ }
25
+ const etag = strongDigest(encodedEtag);
26
+ if (etag === undefined) {
27
+ fail('NATIVE_ROUTE_ROUTING_INVALID', 'If-Match must contain exactly one strong quoted Publication ETag.');
28
+ }
29
+ if (etag !== publication.etag) {
30
+ fail('NATIVE_ROUTE_ROUTING_INVALID', 'If-Match does not name the compiled Publication.');
31
+ }
32
+ return Object.freeze({
33
+ kind: 'via',
34
+ publication,
35
+ issuer: acceptIssuerHeader(encodedIssuer, HTTP_ROUTE_ISSUER),
36
+ });
37
+ }
38
+ /**
39
+ * Decode one native route request served by a v3-input destination.
40
+ *
41
+ * @deprecated Successor: `decode`, which serves a release and its v3 projection.
42
+ */
43
+ export function decode(entry, request, domain, served) {
44
+ return decodeInvocation(entry, request, domain, (input) => decodeRouting(input, served));
45
+ }
@@ -0,0 +1,34 @@
1
+ import type { Domain } from '@astrale-os/kernel-dsl/v1';
2
+ import type { Publication } from '../../release/legacy/publication.js';
3
+ import type { PublicationRef } from '../../release/legacy/reference.js';
4
+ import type { Plan } from '../plan.js';
5
+ import type { Route } from '../table.js';
6
+ /**
7
+ * Serving proof tied to one exact v2/v3 Publication and its resolved Domain.
8
+ *
9
+ * @deprecated Successor: `Table`, bound to the `ReleaseRef` of a `DomainRelease`.
10
+ */
11
+ export interface Table {
12
+ readonly publication: PublicationRef;
13
+ readonly entries: readonly Route[];
14
+ }
15
+ /**
16
+ * Bind one Plan to an exact placed Publication and matching resolved Domain. Like the release
17
+ * Table, it also reserves `release.json`, so a v3 Domain cannot claim the document a v4 Kernel
18
+ * reads first.
19
+ *
20
+ * @deprecated Successor: `bind`, which binds a `DomainRelease`.
21
+ */
22
+ export declare function bind(plan: Plan, deployed: Publication, domain: Domain, publicUrl?: string): Table;
23
+ /**
24
+ * Admit one emitted portable Publication Table before Server composition.
25
+ *
26
+ * @deprecated Successor: `acceptTable`, which admits a release Table.
27
+ */
28
+ export declare function acceptTable(input: unknown): Table;
29
+ /**
30
+ * Verify exact Publication bytes and callable meaning before Server trusts one Table.
31
+ *
32
+ * @deprecated Successor: `verifyTable`, which verifies a release Table.
33
+ */
34
+ export declare function verifyTable(table: Table, deployed: Publication, domain: Pick<Domain, 'origin' | 'revision' | 'callable'>): Table;
@@ -0,0 +1,50 @@
1
+ import { withPublicationError } from '../../release/legacy/error.js';
2
+ import { acceptReference, compareReferences, reference } from '../../release/legacy/reference.js';
3
+ import { acceptEntries, placedEntries, placementMismatch, sameServedWire, tableObject, verifyMeaning, } from '../entries.js';
4
+ import { fail } from '../error.js';
5
+ import { rejectReserved } from '../reservation.js';
6
+ /**
7
+ * Bind one Plan to an exact placed Publication and matching resolved Domain. Like the release
8
+ * Table, it also reserves `release.json`, so a v3 Domain cannot claim the document a v4 Kernel
9
+ * reads first.
10
+ *
11
+ * @deprecated Successor: `bind`, which binds a `DomainRelease`.
12
+ */
13
+ export function bind(plan, deployed, domain, publicUrl = deployed.identity.issuer) {
14
+ const mismatch = placementMismatch(plan, deployed, domain, publicUrl);
15
+ if (mismatch === 'identity') {
16
+ fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Plan, Publication, and Domain identity differ.');
17
+ }
18
+ if (mismatch === 'routes') {
19
+ fail('NATIVE_ROUTE_BINDING_INVALID', 'Publication routes differ from the placed Route Plan.');
20
+ }
21
+ const entries = placedEntries(plan, deployed);
22
+ withPublicationError(() => rejectReserved(deployed, entries));
23
+ return Object.freeze({ publication: reference(deployed), entries });
24
+ }
25
+ /**
26
+ * Admit one emitted portable Publication Table before Server composition.
27
+ *
28
+ * @deprecated Successor: `acceptTable`, which admits a release Table.
29
+ */
30
+ export function acceptTable(input) {
31
+ const value = tableObject(input, ['publication', 'entries']);
32
+ const publication = acceptReference(value.publication);
33
+ return Object.freeze({
34
+ publication,
35
+ entries: withPublicationError(() => acceptEntries(value.entries, publication.origin)),
36
+ });
37
+ }
38
+ /**
39
+ * Verify exact Publication bytes and callable meaning before Server trusts one Table.
40
+ *
41
+ * @deprecated Successor: `verifyTable`, which verifies a release Table.
42
+ */
43
+ export function verifyTable(table, deployed, domain) {
44
+ if (compareReferences(table.publication, reference(deployed)) !== 'exact' ||
45
+ !sameServedWire(table.entries, deployed, domain)) {
46
+ fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table evidence differs from its Publication.');
47
+ }
48
+ verifyMeaning(table.entries, domain);
49
+ return table;
50
+ }
@@ -1,4 +1,4 @@
1
- import type { HttpRoute } from '../publication/index.js';
1
+ import type { HttpRoute } from '../release/route.js';
2
2
  export declare function validateMapping(route: HttpRoute, fields: readonly string[] | undefined, instanceMethod: boolean): void;
3
3
  export declare function validateWireMapping(route: HttpRoute): void;
4
4
  export declare function validateCredentialMapping(route: HttpRoute): void;
@@ -1,8 +1,8 @@
1
1
  import { HTTP_IDEMPOTENCY_KEY } from '../invocation/index.js';
2
2
  import { credentialSources } from './credential.js';
3
+ import { HTTP_DEPLOYMENT_RETIRED } from './deployment-retired.js';
3
4
  import { fail } from './error.js';
4
- import { HTTP_ROUTE_RELEASE_UNAVAILABLE } from './release-unavailable.js';
5
- import { HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_PUBLICATION, HTTP_ROUTE_STALE, } from './routing.js';
5
+ import { HTTP_ROUTE_DIGEST, HTTP_ROUTE_ISSUER, HTTP_ROUTE_MISS, HTTP_ROUTE_STALE, } from './routing.js';
6
6
  import { PLACEHOLDER } from './template.js';
7
7
  export function validateMapping(route, fields, instanceMethod) {
8
8
  if (fields === undefined) {
@@ -110,10 +110,10 @@ export function validateCredentialMapping(route) {
110
110
  }
111
111
  const RESERVED_HEADERS = new Set([
112
112
  HTTP_IDEMPOTENCY_KEY,
113
+ HTTP_DEPLOYMENT_RETIRED,
114
+ HTTP_ROUTE_DIGEST,
113
115
  HTTP_ROUTE_ISSUER,
114
116
  HTTP_ROUTE_MISS,
115
- HTTP_ROUTE_PUBLICATION,
116
- HTTP_ROUTE_RELEASE_UNAVAILABLE,
117
117
  HTTP_ROUTE_STALE,
118
118
  ]);
119
119
  export function isReservedHeader(input) {
@@ -1,4 +1,4 @@
1
1
  import type { HttpRequest } from './request.js';
2
2
  import type { Route, Table } from './table.js';
3
- export declare function match(table: Table, request: Pick<HttpRequest, 'url' | 'method'>): Route | undefined;
3
+ export declare function match(table: Pick<Table, 'entries'>, request: Pick<HttpRequest, 'url' | 'method'>): Route | undefined;
4
4
  export declare function methodMatches(entry: Route, method: string): boolean;
@@ -1,5 +1,5 @@
1
- import type * as publication from '../publication/index.js';
1
+ import type { HttpRoute } from '../release/route.js';
2
2
  import type { Plan } from './plan.js';
3
3
  /** Resolve a provider-neutral Plan beneath one exact serving issuer. */
4
- export declare function place(plan: Plan, issuer: string): readonly publication.HttpRoute[];
4
+ export declare function place(plan: Plan, issuer: string): readonly HttpRoute[];
5
5
  export declare function placePath(path: string, issuer: string): string;
@@ -1,6 +1,6 @@
1
1
  import type { FunctionAuth, Key, Revision } from '@astrale-os/kernel-dsl/v1';
2
2
  import type { OutputMode } from '@astrale-os/kernel-dsl/v1/language';
3
- import type { CredentialSource, HttpMethod, RouteBody, RouteHeaders } from '../publication/index.js';
3
+ import type { CredentialSource, HttpMethod, RouteBody, RouteHeaders } from '../release/route.js';
4
4
  import type { RouteTarget } from './target.js';
5
5
  export interface PlanEntry {
6
6
  readonly name: string;
@@ -1,11 +1,13 @@
1
1
  import type { Value } from '@astrale-os/kernel-dsl/value';
2
- import type { Call, Via } from '../invocation/index.js';
3
- import type { HttpMethod } from '../publication/index.js';
2
+ import type { Call, PublicationVia, Via } from '../invocation/index.js';
3
+ import type { HttpMethod } from '../release/route.js';
4
4
  /** Canonical invocation values presented to or returned from a native route mapping. */
5
5
  export interface Invocation {
6
6
  readonly call: Call;
7
7
  readonly credential?: string;
8
- readonly routing?: Via;
8
+ /** The request channel that carried `credential`; `cookie` is ambient (CSRF-exposed). */
9
+ readonly credentialIn?: 'header' | 'cookie' | 'query';
10
+ readonly routing?: Via | PublicationVia;
9
11
  readonly method?: Exclude<HttpMethod, '*'>;
10
12
  }
11
13
  export interface Request {
@@ -1,3 +1,5 @@
1
- import type { Publication } from '../publication/publication.js';
1
+ import type { DomainRelease } from '../release/release.js';
2
2
  import type { Route } from './table.js';
3
- export declare function rejectReserved(publication: Publication, entries: readonly Route[]): void;
3
+ /** The fields of a served document that route binding reads, whichever document version it is. */
4
+ export type Placed = Pick<DomainRelease, 'origin' | 'identity' | 'schema' | 'bindings' | 'routes' | 'delivery'>;
5
+ export declare function rejectReserved(publication: Placed, entries: readonly Route[]): void;
@@ -1,9 +1,10 @@
1
1
  import * as issuer from '../issuer/index.js';
2
- import { bundleUrl } from '../publication/bundle.js';
3
- import { PATH as PUBLICATION_PATH } from '../publication/publication.js';
2
+ import { bundleUrl } from '../release/bundle.js';
3
+ import { PATH as PUBLICATION_PATH } from '../release/legacy/publication.js';
4
+ import { PATH as RELEASE_PATH } from '../release/release.js';
4
5
  import { fail } from './error.js';
5
6
  import { templateUrl, templatesOverlap } from './template.js';
6
- const STATIC_RESERVED_PATHS = new Set([PUBLICATION_PATH]);
7
+ const STATIC_RESERVED_PATHS = new Set([RELEASE_PATH, PUBLICATION_PATH]);
7
8
  export function rejectReserved(publication, entries) {
8
9
  const discovery = issuer.paths(publication.identity.issuer);
9
10
  const reservedPaths = new Set([...STATIC_RESERVED_PATHS, discovery.configuration, discovery.keys]);