@czap/astro 0.1.0

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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +19 -0
  3. package/dist/Satellite.d.ts +42 -0
  4. package/dist/Satellite.d.ts.map +1 -0
  5. package/dist/Satellite.js +55 -0
  6. package/dist/Satellite.js.map +1 -0
  7. package/dist/client-directives/gpu.d.ts +3 -0
  8. package/dist/client-directives/gpu.d.ts.map +1 -0
  9. package/dist/client-directives/gpu.js +5 -0
  10. package/dist/client-directives/gpu.js.map +1 -0
  11. package/dist/client-directives/llm.d.ts +3 -0
  12. package/dist/client-directives/llm.d.ts.map +1 -0
  13. package/dist/client-directives/llm.js +5 -0
  14. package/dist/client-directives/llm.js.map +1 -0
  15. package/dist/client-directives/satellite.d.ts +3 -0
  16. package/dist/client-directives/satellite.d.ts.map +1 -0
  17. package/dist/client-directives/satellite.js +5 -0
  18. package/dist/client-directives/satellite.js.map +1 -0
  19. package/dist/client-directives/stream.d.ts +3 -0
  20. package/dist/client-directives/stream.d.ts.map +1 -0
  21. package/dist/client-directives/stream.js +5 -0
  22. package/dist/client-directives/stream.js.map +1 -0
  23. package/dist/client-directives/wasm.d.ts +3 -0
  24. package/dist/client-directives/wasm.d.ts.map +1 -0
  25. package/dist/client-directives/wasm.js +6 -0
  26. package/dist/client-directives/wasm.js.map +1 -0
  27. package/dist/client-directives/worker.d.ts +3 -0
  28. package/dist/client-directives/worker.d.ts.map +1 -0
  29. package/dist/client-directives/worker.js +5 -0
  30. package/dist/client-directives/worker.js.map +1 -0
  31. package/dist/detect-upgrade.d.ts +16 -0
  32. package/dist/detect-upgrade.d.ts.map +1 -0
  33. package/dist/detect-upgrade.js +105 -0
  34. package/dist/detect-upgrade.js.map +1 -0
  35. package/dist/headers.d.ts +45 -0
  36. package/dist/headers.d.ts.map +1 -0
  37. package/dist/headers.js +64 -0
  38. package/dist/headers.js.map +1 -0
  39. package/dist/index.d.ts +30 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +26 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/integration.d.ts +76 -0
  44. package/dist/integration.d.ts.map +1 -0
  45. package/dist/integration.js +240 -0
  46. package/dist/integration.js.map +1 -0
  47. package/dist/middleware.d.ts +69 -0
  48. package/dist/middleware.d.ts.map +1 -0
  49. package/dist/middleware.js +75 -0
  50. package/dist/middleware.js.map +1 -0
  51. package/dist/quantize.d.ts +50 -0
  52. package/dist/quantize.d.ts.map +1 -0
  53. package/dist/quantize.js +122 -0
  54. package/dist/quantize.js.map +1 -0
  55. package/dist/runtime/boundary.d.ts +123 -0
  56. package/dist/runtime/boundary.d.ts.map +1 -0
  57. package/dist/runtime/boundary.js +164 -0
  58. package/dist/runtime/boundary.js.map +1 -0
  59. package/dist/runtime/globals.d.ts +32 -0
  60. package/dist/runtime/globals.d.ts.map +1 -0
  61. package/dist/runtime/globals.js +45 -0
  62. package/dist/runtime/globals.js.map +1 -0
  63. package/dist/runtime/gpu.d.ts +15 -0
  64. package/dist/runtime/gpu.d.ts.map +1 -0
  65. package/dist/runtime/gpu.js +266 -0
  66. package/dist/runtime/gpu.js.map +1 -0
  67. package/dist/runtime/index.d.ts +7 -0
  68. package/dist/runtime/index.d.ts.map +1 -0
  69. package/dist/runtime/index.js +5 -0
  70. package/dist/runtime/index.js.map +1 -0
  71. package/dist/runtime/llm-receipt-tracker.d.ts +21 -0
  72. package/dist/runtime/llm-receipt-tracker.d.ts.map +1 -0
  73. package/dist/runtime/llm-receipt-tracker.js +60 -0
  74. package/dist/runtime/llm-receipt-tracker.js.map +1 -0
  75. package/dist/runtime/llm-render-pipeline.d.ts +89 -0
  76. package/dist/runtime/llm-render-pipeline.d.ts.map +1 -0
  77. package/dist/runtime/llm-render-pipeline.js +241 -0
  78. package/dist/runtime/llm-render-pipeline.js.map +1 -0
  79. package/dist/runtime/llm-session.d.ts +126 -0
  80. package/dist/runtime/llm-session.d.ts.map +1 -0
  81. package/dist/runtime/llm-session.js +385 -0
  82. package/dist/runtime/llm-session.js.map +1 -0
  83. package/dist/runtime/llm.d.ts +16 -0
  84. package/dist/runtime/llm.d.ts.map +1 -0
  85. package/dist/runtime/llm.js +273 -0
  86. package/dist/runtime/llm.js.map +1 -0
  87. package/dist/runtime/policy.d.ts +100 -0
  88. package/dist/runtime/policy.d.ts.map +1 -0
  89. package/dist/runtime/policy.js +147 -0
  90. package/dist/runtime/policy.js.map +1 -0
  91. package/dist/runtime/receipt-chain.d.ts +22 -0
  92. package/dist/runtime/receipt-chain.d.ts.map +1 -0
  93. package/dist/runtime/receipt-chain.js +80 -0
  94. package/dist/runtime/receipt-chain.js.map +1 -0
  95. package/dist/runtime/runtime-session.d.ts +34 -0
  96. package/dist/runtime/runtime-session.d.ts.map +1 -0
  97. package/dist/runtime/runtime-session.js +102 -0
  98. package/dist/runtime/runtime-session.js.map +1 -0
  99. package/dist/runtime/satellite.d.ts +13 -0
  100. package/dist/runtime/satellite.d.ts.map +1 -0
  101. package/dist/runtime/satellite.js +59 -0
  102. package/dist/runtime/satellite.js.map +1 -0
  103. package/dist/runtime/slots.d.ts +34 -0
  104. package/dist/runtime/slots.d.ts.map +1 -0
  105. package/dist/runtime/slots.js +108 -0
  106. package/dist/runtime/slots.js.map +1 -0
  107. package/dist/runtime/stream-session.d.ts +47 -0
  108. package/dist/runtime/stream-session.d.ts.map +1 -0
  109. package/dist/runtime/stream-session.js +82 -0
  110. package/dist/runtime/stream-session.js.map +1 -0
  111. package/dist/runtime/stream.d.ts +9 -0
  112. package/dist/runtime/stream.d.ts.map +1 -0
  113. package/dist/runtime/stream.js +308 -0
  114. package/dist/runtime/stream.js.map +1 -0
  115. package/dist/runtime/url-policy.d.ts +28 -0
  116. package/dist/runtime/url-policy.d.ts.map +1 -0
  117. package/dist/runtime/url-policy.js +87 -0
  118. package/dist/runtime/url-policy.js.map +1 -0
  119. package/dist/runtime/wasm.d.ts +20 -0
  120. package/dist/runtime/wasm.d.ts.map +1 -0
  121. package/dist/runtime/wasm.js +70 -0
  122. package/dist/runtime/wasm.js.map +1 -0
  123. package/dist/runtime/worker.d.ts +11 -0
  124. package/dist/runtime/worker.d.ts.map +1 -0
  125. package/dist/runtime/worker.js +249 -0
  126. package/dist/runtime/worker.js.map +1 -0
  127. package/package.json +106 -0
  128. package/src/Satellite.astro +39 -0
  129. package/src/Satellite.ts +84 -0
  130. package/src/client-directives/gpu.ts +5 -0
  131. package/src/client-directives/llm.ts +5 -0
  132. package/src/client-directives/satellite.ts +5 -0
  133. package/src/client-directives/stream.ts +5 -0
  134. package/src/client-directives/wasm.ts +6 -0
  135. package/src/client-directives/worker.ts +5 -0
  136. package/src/detect-upgrade.ts +105 -0
  137. package/src/headers.ts +84 -0
  138. package/src/index.ts +30 -0
  139. package/src/integration.ts +309 -0
  140. package/src/middleware.ts +133 -0
  141. package/src/quantize.ts +173 -0
  142. package/src/runtime/boundary.ts +263 -0
  143. package/src/runtime/globals.ts +57 -0
  144. package/src/runtime/gpu.ts +291 -0
  145. package/src/runtime/index.ts +12 -0
  146. package/src/runtime/llm-receipt-tracker.ts +88 -0
  147. package/src/runtime/llm-render-pipeline.ts +366 -0
  148. package/src/runtime/llm-session.ts +548 -0
  149. package/src/runtime/llm.ts +344 -0
  150. package/src/runtime/policy.ts +229 -0
  151. package/src/runtime/receipt-chain.ts +106 -0
  152. package/src/runtime/runtime-session.ts +139 -0
  153. package/src/runtime/satellite.ts +80 -0
  154. package/src/runtime/slots.ts +136 -0
  155. package/src/runtime/stream-session.ts +125 -0
  156. package/src/runtime/stream.ts +407 -0
  157. package/src/runtime/url-policy.ts +107 -0
  158. package/src/runtime/wasm.ts +85 -0
  159. package/src/runtime/worker.ts +307 -0
@@ -0,0 +1,308 @@
1
+ import { Effect } from 'effect';
2
+ import { Millis, SSE_RECONNECT_INITIAL_MS, SSE_RECONNECT_MAX_MS } from '@czap/core';
3
+ import { Morph, Resumption, SSE, SlotAddressing, SlotRegistry, resolveHtmlString } from '@czap/web';
4
+ import { bootstrapSlots, rescanSlots } from './slots.js';
5
+ import { readRuntimeHtmlPolicy, readRuntimeEndpointPolicy } from './policy.js';
6
+ import { createStreamScheduler } from './stream-session.js';
7
+ import { allowRuntimeEndpointUrl } from './url-policy.js';
8
+ function targetLocator(element) {
9
+ const slot = element.getAttribute('data-czap-slot');
10
+ if (slot) {
11
+ return { type: 'slot', value: slot };
12
+ }
13
+ if (element.id) {
14
+ return { type: 'id', value: element.id };
15
+ }
16
+ const semanticId = element.getAttribute('data-czap-id');
17
+ if (semanticId) {
18
+ return { type: 'semantic-id', value: semanticId };
19
+ }
20
+ return null;
21
+ }
22
+ function findTarget(locator) {
23
+ if (!locator) {
24
+ return null;
25
+ }
26
+ switch (locator.type) {
27
+ case 'slot': {
28
+ const el = SlotRegistry.findElement(SlotAddressing.brand(locator.value));
29
+ /* v8 ignore next — slot elements are always HTML host elements (divs/sections/etc.);
30
+ this narrows SlotRegistry.findElement's generic `Element | null` return so SVG-like
31
+ non-HTML descendants are rejected if they ever leak into the slot registry. */
32
+ return el instanceof HTMLElement ? el : null;
33
+ }
34
+ case 'id':
35
+ return document.getElementById(locator.value);
36
+ case 'semantic-id': {
37
+ const root = document.documentElement;
38
+ if (root.getAttribute('data-czap-id') === locator.value) {
39
+ return root;
40
+ }
41
+ for (const candidate of Array.from(root.querySelectorAll('[data-czap-id]'))) {
42
+ if (candidate.getAttribute('data-czap-id') === locator.value && candidate instanceof HTMLElement) {
43
+ return candidate;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ }
49
+ }
50
+ function messageHtml(message) {
51
+ if ((message.type === 'patch' || message.type === 'batch') && typeof message.data === 'string') {
52
+ return message.data;
53
+ }
54
+ if (message.type === 'snapshot' && message.data !== null && typeof message.data === 'object') {
55
+ if ('html' in message.data && typeof message.data.html === 'string') {
56
+ return message.data.html;
57
+ }
58
+ return null;
59
+ }
60
+ return null;
61
+ }
62
+ function replayHtml(patch) {
63
+ if (typeof patch === 'string') {
64
+ return patch;
65
+ }
66
+ if (patch !== null && typeof patch === 'object') {
67
+ if ('html' in patch && typeof patch.html === 'string') {
68
+ return patch.html;
69
+ }
70
+ if ('data' in patch && typeof patch.data === 'string') {
71
+ return patch.data;
72
+ }
73
+ }
74
+ return null;
75
+ }
76
+ function patchCouldInvalidateSlots(locator, morphStyle, html) {
77
+ if (morphStyle === 'outerHTML') {
78
+ return true;
79
+ }
80
+ if (locator?.type === 'slot') {
81
+ return true;
82
+ }
83
+ return (html.includes('data-czap-slot') ||
84
+ html.includes('data-czap-id') ||
85
+ html.includes(' id=') ||
86
+ html.includes(' id="') ||
87
+ html.includes(" id='"));
88
+ }
89
+ function saveResumptionState(artifactId, lastEventId) {
90
+ if (!artifactId || !lastEventId) {
91
+ return;
92
+ }
93
+ const parsed = Resumption.parseEventId(lastEventId);
94
+ Effect.runSync(Resumption.saveState({
95
+ artifactId,
96
+ lastEventId,
97
+ lastSequence: parsed.sequence,
98
+ timestamp: Date.now(),
99
+ }));
100
+ }
101
+ function hasCustomEndpointPolicy(policy) {
102
+ return (policy.mode !== 'same-origin' ||
103
+ policy.allowOrigins.length > 0 ||
104
+ Object.values(policy.byKind).some((allowlist) => allowlist.length > 0));
105
+ }
106
+ /**
107
+ * Entry point for the `client:stream` directive. Opens an SSE client
108
+ * to the `data-czap-stream-url` endpoint, funnels incoming HTML
109
+ * patches through a {@link createStreamScheduler}, and triggers slot
110
+ * rescans when necessary. Honors `czap:reinit` / `czap:dispose` to
111
+ * survive Astro view transitions.
112
+ */
113
+ export function initStreamDirective(load, element) {
114
+ bootstrapSlots();
115
+ const endpointPolicy = readRuntimeEndpointPolicy();
116
+ const htmlPolicy = readRuntimeHtmlPolicy();
117
+ const prepareHtml = (html) => resolveHtmlString(html, {
118
+ policy: htmlPolicy.streamDefault,
119
+ allowTrustedHtml: htmlPolicy.allowTrustedHtml,
120
+ });
121
+ let target = element;
122
+ let reinitTarget = null;
123
+ const streamUrl = allowRuntimeEndpointUrl(target.getAttribute('data-czap-stream-url'), 'stream', 'czap/astro.stream', {
124
+ crossOriginRejected: 'stream-cross-origin-url-rejected',
125
+ malformedUrl: 'stream-malformed-url-rejected',
126
+ originNotAllowed: 'stream-origin-not-allowed',
127
+ endpointKindNotPermitted: 'stream-endpoint-kind-not-permitted',
128
+ }, endpointPolicy);
129
+ if (!streamUrl) {
130
+ return;
131
+ }
132
+ const artifactId = target.getAttribute('data-czap-stream-artifact') ?? undefined;
133
+ const morphStyle = (target.getAttribute('data-czap-stream-morph') ?? 'innerHTML');
134
+ const snapshotUrl = allowRuntimeEndpointUrl(target.getAttribute('data-czap-snapshot-url'), 'snapshot', 'czap/astro.stream', {
135
+ crossOriginRejected: 'snapshot-cross-origin-url-rejected',
136
+ malformedUrl: 'snapshot-malformed-url-rejected',
137
+ originNotAllowed: 'snapshot-origin-not-allowed',
138
+ endpointKindNotPermitted: 'snapshot-endpoint-kind-not-permitted',
139
+ }, endpointPolicy) ?? undefined;
140
+ const replayUrl = allowRuntimeEndpointUrl(target.getAttribute('data-czap-replay-url'), 'replay', 'czap/astro.stream', {
141
+ crossOriginRejected: 'replay-cross-origin-url-rejected',
142
+ malformedUrl: 'replay-malformed-url-rejected',
143
+ originNotAllowed: 'replay-origin-not-allowed',
144
+ endpointKindNotPermitted: 'replay-endpoint-kind-not-permitted',
145
+ }, endpointPolicy) ?? undefined;
146
+ let source = null;
147
+ let reconnectAttempt = 0;
148
+ let reconnectTimer = null;
149
+ let lastEventId = null;
150
+ let recoveryPending = false;
151
+ let pendingLocator = null;
152
+ const reconnectConfig = {
153
+ maxAttempts: 10,
154
+ initialDelay: Millis(SSE_RECONNECT_INITIAL_MS),
155
+ maxDelay: Millis(SSE_RECONNECT_MAX_MS),
156
+ factor: 2,
157
+ };
158
+ const bindReinit = (nextTarget) => {
159
+ if (reinitTarget === nextTarget) {
160
+ return;
161
+ }
162
+ reinitTarget?.removeEventListener('czap:reinit', handleReinit);
163
+ reinitTarget = nextTarget;
164
+ reinitTarget.addEventListener('czap:reinit', handleReinit);
165
+ };
166
+ const patchScheduler = createStreamScheduler({
167
+ applyHtml: (html) => {
168
+ const locator = targetLocator(target);
169
+ pendingLocator = locator;
170
+ Effect.runSync(Morph.morphWithState(target, html, {
171
+ morphStyle,
172
+ preserveFocus: true,
173
+ preserveScroll: true,
174
+ preserveSelection: true,
175
+ }));
176
+ if (locator && locator.type !== 'slot') {
177
+ target = findTarget(locator) ?? target;
178
+ }
179
+ },
180
+ onFlush: ({ patchCount, requiresRescan }) => {
181
+ if (requiresRescan) {
182
+ rescanSlots(document.documentElement);
183
+ }
184
+ target = findTarget(pendingLocator) ?? target;
185
+ bindReinit(target);
186
+ for (let index = 0; index < patchCount; index++) {
187
+ target.dispatchEvent(new CustomEvent('czap:stream-morph', {
188
+ bubbles: true,
189
+ }));
190
+ }
191
+ pendingLocator = null;
192
+ },
193
+ });
194
+ const enqueueHtml = (html) => {
195
+ const normalizedHtml = prepareHtml(html);
196
+ return patchScheduler.enqueue({
197
+ html: normalizedHtml,
198
+ requiresRescan: patchCouldInvalidateSlots(targetLocator(target), morphStyle, normalizedHtml),
199
+ });
200
+ };
201
+ const applyResumeResponse = async (response) => {
202
+ if (response.type === 'snapshot') {
203
+ await enqueueHtml(response.html);
204
+ return;
205
+ }
206
+ const patches = response.patches
207
+ .map((patch) => replayHtml(patch))
208
+ .filter((html) => html !== null)
209
+ .map((html) => ({
210
+ html,
211
+ requiresRescan: patchCouldInvalidateSlots(targetLocator(target), morphStyle, html),
212
+ }));
213
+ await patchScheduler.enqueueBatch(patches);
214
+ };
215
+ const reconcileResumption = async (currentEventId) => {
216
+ const resolvedArtifactId = artifactId;
217
+ try {
218
+ const response = await Effect.runPromise(Resumption.resume(resolvedArtifactId, currentEventId, {
219
+ ...(snapshotUrl ? { snapshotUrl } : {}),
220
+ ...(replayUrl ? { replayUrl } : {}),
221
+ ...(hasCustomEndpointPolicy(endpointPolicy) ? { endpointPolicy } : {}),
222
+ }));
223
+ await applyResumeResponse(response);
224
+ }
225
+ catch (error) {
226
+ target.dispatchEvent(new CustomEvent('czap:stream-error', {
227
+ detail: {
228
+ reason: 'resume-failed',
229
+ message: error instanceof Error ? error.message : String(error),
230
+ },
231
+ bubbles: true,
232
+ }));
233
+ }
234
+ };
235
+ const buildUrl = () => SSE.buildUrl(streamUrl, artifactId, lastEventId ?? undefined);
236
+ const connect = () => {
237
+ source = new EventSource(buildUrl());
238
+ source.onopen = () => {
239
+ reconnectAttempt = 0;
240
+ patchScheduler.activate();
241
+ target.dispatchEvent(new CustomEvent('czap:stream-connected', { bubbles: true }));
242
+ };
243
+ source.onmessage = (event) => {
244
+ if (event.lastEventId) {
245
+ lastEventId = event.lastEventId;
246
+ saveResumptionState(artifactId, event.lastEventId);
247
+ }
248
+ if (recoveryPending && artifactId && event.lastEventId) {
249
+ recoveryPending = false;
250
+ void reconcileResumption(event.lastEventId);
251
+ }
252
+ const message = SSE.parseMessage(event);
253
+ if (!message) {
254
+ return;
255
+ }
256
+ if (message.type === 'signal') {
257
+ target.dispatchEvent(new CustomEvent('czap:signal', {
258
+ detail: message.data,
259
+ bubbles: true,
260
+ }));
261
+ return;
262
+ }
263
+ if (message.type === 'heartbeat' || message.type === 'receipt') {
264
+ return;
265
+ }
266
+ const html = messageHtml(message);
267
+ if (html) {
268
+ void enqueueHtml(html);
269
+ }
270
+ };
271
+ source.onerror = () => {
272
+ source?.close();
273
+ source = null;
274
+ recoveryPending = artifactId !== undefined && lastEventId !== null;
275
+ patchScheduler.beginReconnect();
276
+ target.dispatchEvent(new CustomEvent('czap:stream-disconnected', { bubbles: true }));
277
+ if (reconnectAttempt < reconnectConfig.maxAttempts) {
278
+ const delay = SSE.calculateDelay(reconnectAttempt, reconnectConfig);
279
+ reconnectAttempt += 1;
280
+ reconnectTimer = patchScheduler.setReconnectTimer(connect, delay);
281
+ return;
282
+ }
283
+ target.dispatchEvent(new CustomEvent('czap:stream-error', {
284
+ detail: { reason: 'max-reconnect-attempts' },
285
+ bubbles: true,
286
+ }));
287
+ };
288
+ };
289
+ const cleanup = () => {
290
+ reconnectTimer = patchScheduler.clearReconnectTimer(reconnectTimer);
291
+ source?.close();
292
+ source = null;
293
+ };
294
+ const handleReinit = () => {
295
+ cleanup();
296
+ reconnectAttempt = 0;
297
+ recoveryPending = false;
298
+ connect();
299
+ };
300
+ bindReinit(target);
301
+ connect();
302
+ element.addEventListener('czap:dispose', () => {
303
+ cleanup();
304
+ patchScheduler.dispose();
305
+ });
306
+ load();
307
+ }
308
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/runtime/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { RuntimeEndpointKind, RuntimeEndpointPolicy } from '@czap/web';
2
+ interface RuntimeEndpointDiagnosticCodes {
3
+ readonly malformedUrl: string;
4
+ readonly crossOriginRejected: string;
5
+ readonly originNotAllowed: string;
6
+ readonly endpointKindNotPermitted: string;
7
+ }
8
+ /**
9
+ * Fast boolean check -- does `rawUrl` resolve under a `same-origin`
10
+ * stream policy? Handy for runtime code that only needs a guard and
11
+ * does not want to emit diagnostics.
12
+ */
13
+ export declare function isSameOriginRuntimeUrl(rawUrl: string): boolean;
14
+ /**
15
+ * Convenience wrapper around {@link allowRuntimeEndpointUrl} that
16
+ * collapses every diagnostic code into a single `code`. Used by
17
+ * directives that only care whether a URL is same-origin-safe.
18
+ */
19
+ export declare function allowSameOriginRuntimeUrl(rawUrl: string | null, source: string, code: string): string | null;
20
+ /**
21
+ * Resolve `rawUrl` under the runtime endpoint policy and either
22
+ * return the safe URL string or emit a structured `Diagnostics.warn`
23
+ * describing the rejection reason. Returns `null` for both missing
24
+ * and rejected URLs so callers can bail out uniformly.
25
+ */
26
+ export declare function allowRuntimeEndpointUrl(rawUrl: string | null, kind: RuntimeEndpointKind, source: string, codes?: Partial<RuntimeEndpointDiagnosticCodes>, policy?: RuntimeEndpointPolicy): string | null;
27
+ export {};
28
+ //# sourceMappingURL=url-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-policy.d.ts","sourceRoot":"","sources":["../../src/runtime/url-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAI5E,UAAU,8BAA8B;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAO9D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO5G;AAWD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,EAC/C,MAAM,GAAE,qBAAmD,GAC1D,MAAM,GAAG,IAAI,CA6Cf"}
@@ -0,0 +1,87 @@
1
+ import { Diagnostics } from '@czap/core';
2
+ import { resolveRuntimeUrl } from '@czap/web';
3
+ import { readRuntimeEndpointPolicy } from './policy.js';
4
+ /**
5
+ * Fast boolean check -- does `rawUrl` resolve under a `same-origin`
6
+ * stream policy? Handy for runtime code that only needs a guard and
7
+ * does not want to emit diagnostics.
8
+ */
9
+ export function isSameOriginRuntimeUrl(rawUrl) {
10
+ return (resolveRuntimeUrl(rawUrl, {
11
+ kind: 'stream',
12
+ policy: { mode: 'same-origin' },
13
+ }).type === 'allowed');
14
+ }
15
+ /**
16
+ * Convenience wrapper around {@link allowRuntimeEndpointUrl} that
17
+ * collapses every diagnostic code into a single `code`. Used by
18
+ * directives that only care whether a URL is same-origin-safe.
19
+ */
20
+ export function allowSameOriginRuntimeUrl(rawUrl, source, code) {
21
+ return allowRuntimeEndpointUrl(rawUrl, 'stream', source, {
22
+ malformedUrl: code,
23
+ crossOriginRejected: code,
24
+ originNotAllowed: code,
25
+ endpointKindNotPermitted: code,
26
+ });
27
+ }
28
+ function defaultDiagnosticCodes(kind) {
29
+ return {
30
+ malformedUrl: `${kind}-malformed-url-rejected`,
31
+ crossOriginRejected: `${kind}-cross-origin-url-rejected`,
32
+ originNotAllowed: `${kind}-origin-not-allowed`,
33
+ endpointKindNotPermitted: `${kind}-endpoint-kind-not-permitted`,
34
+ };
35
+ }
36
+ /**
37
+ * Resolve `rawUrl` under the runtime endpoint policy and either
38
+ * return the safe URL string or emit a structured `Diagnostics.warn`
39
+ * describing the rejection reason. Returns `null` for both missing
40
+ * and rejected URLs so callers can bail out uniformly.
41
+ */
42
+ export function allowRuntimeEndpointUrl(rawUrl, kind, source, codes, policy = readRuntimeEndpointPolicy()) {
43
+ const resolved = resolveRuntimeUrl(rawUrl, { kind, policy });
44
+ const finalCodes = { ...defaultDiagnosticCodes(kind), ...codes };
45
+ switch (resolved.type) {
46
+ case 'missing':
47
+ return null;
48
+ case 'allowed':
49
+ return resolved.url;
50
+ case 'malformed':
51
+ Diagnostics.warn({
52
+ source,
53
+ code: finalCodes.malformedUrl,
54
+ message: `Runtime URL "${rawUrl}" was rejected because it is not a valid URL.`,
55
+ });
56
+ return null;
57
+ case 'cross-origin-rejected':
58
+ Diagnostics.warn({
59
+ source,
60
+ code: finalCodes.crossOriginRejected,
61
+ message: `Cross-origin runtime URL "${rawUrl}" was rejected. Runtime endpoints must be same-origin by default.`,
62
+ });
63
+ return null;
64
+ case 'origin-not-allowed':
65
+ Diagnostics.warn({
66
+ source,
67
+ code: finalCodes.originNotAllowed,
68
+ message: `Runtime URL "${rawUrl}" was rejected because origin "${resolved.resolved.origin}" is not allowlisted.`,
69
+ });
70
+ return null;
71
+ case 'kind-not-allowed':
72
+ Diagnostics.warn({
73
+ source,
74
+ code: finalCodes.endpointKindNotPermitted,
75
+ message: `Runtime URL "${rawUrl}" was rejected because endpoint kind "${kind}" is not permitted for cross-origin access.`,
76
+ });
77
+ return null;
78
+ case 'private-ip-rejected':
79
+ Diagnostics.warn({
80
+ source,
81
+ code: `${kind}-private-ip-rejected`,
82
+ message: `Runtime URL "${rawUrl}" was rejected because it resolves to a private or reserved IP address.`,
83
+ });
84
+ return null;
85
+ }
86
+ }
87
+ //# sourceMappingURL=url-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-policy.js","sourceRoot":"","sources":["../../src/runtime/url-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AASxD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,OAAO,CACL,iBAAiB,CAAC,MAAM,EAAE;QACxB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;KAChC,CAAC,CAAC,IAAI,KAAK,SAAS,CACtB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAqB,EAAE,MAAc,EAAE,IAAY;IAC3F,OAAO,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;QACvD,YAAY,EAAE,IAAI;QAClB,mBAAmB,EAAE,IAAI;QACzB,gBAAgB,EAAE,IAAI;QACtB,wBAAwB,EAAE,IAAI;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAyB;IACvD,OAAO;QACL,YAAY,EAAE,GAAG,IAAI,yBAAyB;QAC9C,mBAAmB,EAAE,GAAG,IAAI,4BAA4B;QACxD,gBAAgB,EAAE,GAAG,IAAI,qBAAqB;QAC9C,wBAAwB,EAAE,GAAG,IAAI,8BAA8B;KAChE,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAqB,EACrB,IAAyB,EACzB,MAAc,EACd,KAA+C,EAC/C,SAAgC,yBAAyB,EAAE;IAE3D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IAEjE,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC,GAAG,CAAC;QACtB,KAAK,WAAW;YACd,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,UAAU,CAAC,YAAY;gBAC7B,OAAO,EAAE,gBAAgB,MAAM,+CAA+C;aAC/E,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,KAAK,uBAAuB;YAC1B,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,UAAU,CAAC,mBAAmB;gBACpC,OAAO,EAAE,6BAA6B,MAAM,mEAAmE;aAChH,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,KAAK,oBAAoB;YACvB,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,UAAU,CAAC,gBAAgB;gBACjC,OAAO,EAAE,gBAAgB,MAAM,kCAAkC,QAAQ,CAAC,QAAQ,CAAC,MAAM,uBAAuB;aACjH,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,KAAK,kBAAkB;YACrB,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,UAAU,CAAC,wBAAwB;gBACzC,OAAO,EAAE,gBAAgB,MAAM,yCAAyC,IAAI,6CAA6C;aAC1H,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,KAAK,qBAAqB;YACxB,WAAW,CAAC,IAAI,CAAC;gBACf,MAAM;gBACN,IAAI,EAAE,GAAG,IAAI,sBAAsB;gBACnC,OAAO,EAAE,gBAAgB,MAAM,yEAAyE;aACzG,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Configure (or clear) the root `data-czap-wasm-url` attribute used by
3
+ * the `client:wasm` directive to discover its module URL. Also
4
+ * back-fills any existing `[data-czap-wasm]` elements that lack a
5
+ * per-element override.
6
+ */
7
+ export declare function configureWasmRuntime(wasmUrl: string | null | undefined): void;
8
+ /**
9
+ * Resolve the WASM module URL for `element`, falling back to the
10
+ * root-configured URL when no per-element override exists.
11
+ */
12
+ export declare function resolveWasmUrl(element: HTMLElement): string | null;
13
+ /**
14
+ * Load the WASM kernels for `element`, publish them to
15
+ * `window.__CZAP_WASM__`, and dispatch a `czap:wasm-ready` event on
16
+ * `document`. On failure, emits a diagnostic and fires
17
+ * `czap:wasm-error` instead so downstream consumers can degrade.
18
+ */
19
+ export declare function loadWasmRuntime(element: HTMLElement): Promise<void>;
20
+ //# sourceMappingURL=wasm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../src/runtime/wasm.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAY7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAElE;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CzE"}
@@ -0,0 +1,70 @@
1
+ import { WASMDispatch, Diagnostics } from '@czap/core';
2
+ import { writeRuntimeGlobal } from './globals.js';
3
+ import { readRuntimeEndpointPolicy } from './policy.js';
4
+ import { allowRuntimeEndpointUrl } from './url-policy.js';
5
+ const ROOT_WASM_ATTR = 'data-czap-wasm-url';
6
+ /**
7
+ * Configure (or clear) the root `data-czap-wasm-url` attribute used by
8
+ * the `client:wasm` directive to discover its module URL. Also
9
+ * back-fills any existing `[data-czap-wasm]` elements that lack a
10
+ * per-element override.
11
+ */
12
+ export function configureWasmRuntime(wasmUrl) {
13
+ if (!wasmUrl) {
14
+ document.documentElement.removeAttribute(ROOT_WASM_ATTR);
15
+ return;
16
+ }
17
+ document.documentElement.setAttribute(ROOT_WASM_ATTR, wasmUrl);
18
+ document.querySelectorAll('[data-czap-wasm]').forEach((element) => {
19
+ if (!element.getAttribute(ROOT_WASM_ATTR)) {
20
+ element.setAttribute(ROOT_WASM_ATTR, wasmUrl);
21
+ }
22
+ });
23
+ }
24
+ /**
25
+ * Resolve the WASM module URL for `element`, falling back to the
26
+ * root-configured URL when no per-element override exists.
27
+ */
28
+ export function resolveWasmUrl(element) {
29
+ return element.getAttribute(ROOT_WASM_ATTR) ?? document.documentElement.getAttribute(ROOT_WASM_ATTR);
30
+ }
31
+ /**
32
+ * Load the WASM kernels for `element`, publish them to
33
+ * `window.__CZAP_WASM__`, and dispatch a `czap:wasm-ready` event on
34
+ * `document`. On failure, emits a diagnostic and fires
35
+ * `czap:wasm-error` instead so downstream consumers can degrade.
36
+ */
37
+ export async function loadWasmRuntime(element) {
38
+ const wasmUrl = allowRuntimeEndpointUrl(resolveWasmUrl(element), 'wasm', 'czap/astro.wasm', {
39
+ crossOriginRejected: 'wasm-cross-origin-url-rejected',
40
+ malformedUrl: 'wasm-malformed-url-rejected',
41
+ originNotAllowed: 'wasm-origin-not-allowed',
42
+ endpointKindNotPermitted: 'wasm-endpoint-kind-not-permitted',
43
+ }, readRuntimeEndpointPolicy());
44
+ if (!wasmUrl) {
45
+ return;
46
+ }
47
+ try {
48
+ const kernels = await WASMDispatch.load(wasmUrl);
49
+ writeRuntimeGlobal('__CZAP_WASM__', kernels);
50
+ document.dispatchEvent(new CustomEvent('czap:wasm-ready', {
51
+ detail: { url: wasmUrl },
52
+ }));
53
+ }
54
+ catch (error) {
55
+ Diagnostics.warn({
56
+ source: 'czap/astro.wasm',
57
+ code: 'wasm-load-failed',
58
+ message: 'WASM runtime failed to load.',
59
+ detail: error instanceof Error ? error.message : 'load-failed',
60
+ cause: error,
61
+ });
62
+ document.dispatchEvent(new CustomEvent('czap:wasm-error', {
63
+ detail: {
64
+ url: wasmUrl,
65
+ reason: error instanceof Error ? error.message : 'load-failed',
66
+ },
67
+ }));
68
+ }
69
+ }
70
+ //# sourceMappingURL=wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../src/runtime/wasm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAkC;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC/D,QAAQ,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7E,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAoB;IACjD,OAAO,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;AACvG,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAoB;IACxD,MAAM,OAAO,GAAG,uBAAuB,CACrC,cAAc,CAAC,OAAO,CAAC,EACvB,MAAM,EACN,iBAAiB,EACjB;QACE,mBAAmB,EAAE,gCAAgC;QACrD,YAAY,EAAE,6BAA6B;QAC3C,gBAAgB,EAAE,yBAAyB;QAC3C,wBAAwB,EAAE,kCAAkC;KAC7D,EACD,yBAAyB,EAAE,CAC5B,CAAC;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,kBAAkB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAE7C,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,iBAAiB,EAAE;YACjC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;SACzB,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,8BAA8B;YACvC,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;YAC9D,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QACH,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,iBAAiB,EAAE;YACjC,MAAM,EAAE;gBACN,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;aAC/D;SACF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Entry point used by the `client:worker` directive.
3
+ *
4
+ * Parses the serialised boundary off `element`, spins up (or reuses)
5
+ * a {@link WorkerHost.Shape} from `@czap/worker`, bootstraps the
6
+ * boundary in the worker, and streams resolved state back into DOM
7
+ * via {@link applyBoundaryState}. Falls back to an inline evaluation
8
+ * when `SharedArrayBuffer` / cross-origin isolation is unavailable.
9
+ */
10
+ export declare function initWorkerDirective(load: () => Promise<unknown>, element: HTMLElement): void;
11
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/runtime/worker.ts"],"names":[],"mappings":"AAgEA;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAyO5F"}