@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.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/Satellite.d.ts +42 -0
- package/dist/Satellite.d.ts.map +1 -0
- package/dist/Satellite.js +55 -0
- package/dist/Satellite.js.map +1 -0
- package/dist/client-directives/gpu.d.ts +3 -0
- package/dist/client-directives/gpu.d.ts.map +1 -0
- package/dist/client-directives/gpu.js +5 -0
- package/dist/client-directives/gpu.js.map +1 -0
- package/dist/client-directives/llm.d.ts +3 -0
- package/dist/client-directives/llm.d.ts.map +1 -0
- package/dist/client-directives/llm.js +5 -0
- package/dist/client-directives/llm.js.map +1 -0
- package/dist/client-directives/satellite.d.ts +3 -0
- package/dist/client-directives/satellite.d.ts.map +1 -0
- package/dist/client-directives/satellite.js +5 -0
- package/dist/client-directives/satellite.js.map +1 -0
- package/dist/client-directives/stream.d.ts +3 -0
- package/dist/client-directives/stream.d.ts.map +1 -0
- package/dist/client-directives/stream.js +5 -0
- package/dist/client-directives/stream.js.map +1 -0
- package/dist/client-directives/wasm.d.ts +3 -0
- package/dist/client-directives/wasm.d.ts.map +1 -0
- package/dist/client-directives/wasm.js +6 -0
- package/dist/client-directives/wasm.js.map +1 -0
- package/dist/client-directives/worker.d.ts +3 -0
- package/dist/client-directives/worker.d.ts.map +1 -0
- package/dist/client-directives/worker.js +5 -0
- package/dist/client-directives/worker.js.map +1 -0
- package/dist/detect-upgrade.d.ts +16 -0
- package/dist/detect-upgrade.d.ts.map +1 -0
- package/dist/detect-upgrade.js +105 -0
- package/dist/detect-upgrade.js.map +1 -0
- package/dist/headers.d.ts +45 -0
- package/dist/headers.d.ts.map +1 -0
- package/dist/headers.js +64 -0
- package/dist/headers.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/integration.d.ts +76 -0
- package/dist/integration.d.ts.map +1 -0
- package/dist/integration.js +240 -0
- package/dist/integration.js.map +1 -0
- package/dist/middleware.d.ts +69 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +75 -0
- package/dist/middleware.js.map +1 -0
- package/dist/quantize.d.ts +50 -0
- package/dist/quantize.d.ts.map +1 -0
- package/dist/quantize.js +122 -0
- package/dist/quantize.js.map +1 -0
- package/dist/runtime/boundary.d.ts +123 -0
- package/dist/runtime/boundary.d.ts.map +1 -0
- package/dist/runtime/boundary.js +164 -0
- package/dist/runtime/boundary.js.map +1 -0
- package/dist/runtime/globals.d.ts +32 -0
- package/dist/runtime/globals.d.ts.map +1 -0
- package/dist/runtime/globals.js +45 -0
- package/dist/runtime/globals.js.map +1 -0
- package/dist/runtime/gpu.d.ts +15 -0
- package/dist/runtime/gpu.d.ts.map +1 -0
- package/dist/runtime/gpu.js +266 -0
- package/dist/runtime/gpu.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/llm-receipt-tracker.d.ts +21 -0
- package/dist/runtime/llm-receipt-tracker.d.ts.map +1 -0
- package/dist/runtime/llm-receipt-tracker.js +60 -0
- package/dist/runtime/llm-receipt-tracker.js.map +1 -0
- package/dist/runtime/llm-render-pipeline.d.ts +89 -0
- package/dist/runtime/llm-render-pipeline.d.ts.map +1 -0
- package/dist/runtime/llm-render-pipeline.js +241 -0
- package/dist/runtime/llm-render-pipeline.js.map +1 -0
- package/dist/runtime/llm-session.d.ts +126 -0
- package/dist/runtime/llm-session.d.ts.map +1 -0
- package/dist/runtime/llm-session.js +385 -0
- package/dist/runtime/llm-session.js.map +1 -0
- package/dist/runtime/llm.d.ts +16 -0
- package/dist/runtime/llm.d.ts.map +1 -0
- package/dist/runtime/llm.js +273 -0
- package/dist/runtime/llm.js.map +1 -0
- package/dist/runtime/policy.d.ts +100 -0
- package/dist/runtime/policy.d.ts.map +1 -0
- package/dist/runtime/policy.js +147 -0
- package/dist/runtime/policy.js.map +1 -0
- package/dist/runtime/receipt-chain.d.ts +22 -0
- package/dist/runtime/receipt-chain.d.ts.map +1 -0
- package/dist/runtime/receipt-chain.js +80 -0
- package/dist/runtime/receipt-chain.js.map +1 -0
- package/dist/runtime/runtime-session.d.ts +34 -0
- package/dist/runtime/runtime-session.d.ts.map +1 -0
- package/dist/runtime/runtime-session.js +102 -0
- package/dist/runtime/runtime-session.js.map +1 -0
- package/dist/runtime/satellite.d.ts +13 -0
- package/dist/runtime/satellite.d.ts.map +1 -0
- package/dist/runtime/satellite.js +59 -0
- package/dist/runtime/satellite.js.map +1 -0
- package/dist/runtime/slots.d.ts +34 -0
- package/dist/runtime/slots.d.ts.map +1 -0
- package/dist/runtime/slots.js +108 -0
- package/dist/runtime/slots.js.map +1 -0
- package/dist/runtime/stream-session.d.ts +47 -0
- package/dist/runtime/stream-session.d.ts.map +1 -0
- package/dist/runtime/stream-session.js +82 -0
- package/dist/runtime/stream-session.js.map +1 -0
- package/dist/runtime/stream.d.ts +9 -0
- package/dist/runtime/stream.d.ts.map +1 -0
- package/dist/runtime/stream.js +308 -0
- package/dist/runtime/stream.js.map +1 -0
- package/dist/runtime/url-policy.d.ts +28 -0
- package/dist/runtime/url-policy.d.ts.map +1 -0
- package/dist/runtime/url-policy.js +87 -0
- package/dist/runtime/url-policy.js.map +1 -0
- package/dist/runtime/wasm.d.ts +20 -0
- package/dist/runtime/wasm.d.ts.map +1 -0
- package/dist/runtime/wasm.js +70 -0
- package/dist/runtime/wasm.js.map +1 -0
- package/dist/runtime/worker.d.ts +11 -0
- package/dist/runtime/worker.d.ts.map +1 -0
- package/dist/runtime/worker.js +249 -0
- package/dist/runtime/worker.js.map +1 -0
- package/package.json +106 -0
- package/src/Satellite.astro +39 -0
- package/src/Satellite.ts +84 -0
- package/src/client-directives/gpu.ts +5 -0
- package/src/client-directives/llm.ts +5 -0
- package/src/client-directives/satellite.ts +5 -0
- package/src/client-directives/stream.ts +5 -0
- package/src/client-directives/wasm.ts +6 -0
- package/src/client-directives/worker.ts +5 -0
- package/src/detect-upgrade.ts +105 -0
- package/src/headers.ts +84 -0
- package/src/index.ts +30 -0
- package/src/integration.ts +309 -0
- package/src/middleware.ts +133 -0
- package/src/quantize.ts +173 -0
- package/src/runtime/boundary.ts +263 -0
- package/src/runtime/globals.ts +57 -0
- package/src/runtime/gpu.ts +291 -0
- package/src/runtime/index.ts +12 -0
- package/src/runtime/llm-receipt-tracker.ts +88 -0
- package/src/runtime/llm-render-pipeline.ts +366 -0
- package/src/runtime/llm-session.ts +548 -0
- package/src/runtime/llm.ts +344 -0
- package/src/runtime/policy.ts +229 -0
- package/src/runtime/receipt-chain.ts +106 -0
- package/src/runtime/runtime-session.ts +139 -0
- package/src/runtime/satellite.ts +80 -0
- package/src/runtime/slots.ts +136 -0
- package/src/runtime/stream-session.ts +125 -0
- package/src/runtime/stream.ts +407 -0
- package/src/runtime/url-policy.ts +107 -0
- package/src/runtime/wasm.ts +85 -0
- package/src/runtime/worker.ts +307 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { Diagnostics } from '@czap/core';
|
|
2
|
+
import { WorkerHost } from '@czap/worker';
|
|
3
|
+
import { applyBoundaryState, attachViewportObserver, evaluateBoundary, normalizeBoundaryState, parseBoundary, readSignalValue, } from './boundary.js';
|
|
4
|
+
function sameStringRecord(left, right) {
|
|
5
|
+
const leftKeys = Object.keys(left);
|
|
6
|
+
const rightKeys = Object.keys(right);
|
|
7
|
+
if (leftKeys.length !== rightKeys.length) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
for (const key of leftKeys) {
|
|
11
|
+
if (left[key] !== right[key]) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
function sameNumberRecord(left, right) {
|
|
18
|
+
const leftKeys = Object.keys(left);
|
|
19
|
+
const rightKeys = Object.keys(right);
|
|
20
|
+
if (leftKeys.length !== rightKeys.length) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
for (const key of leftKeys) {
|
|
24
|
+
if (left[key] !== right[key]) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function sameBoundaryDetail(left, right) {
|
|
31
|
+
if (!left) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return (sameStringRecord(left.discrete, right.discrete) &&
|
|
35
|
+
sameStringRecord(left.aria, right.aria) &&
|
|
36
|
+
sameStringRecord(Object.fromEntries(Object.entries(left.css).map(([key, value]) => [key, String(value)])), Object.fromEntries(Object.entries(right.css).map(([key, value]) => [key, String(value)]))) &&
|
|
37
|
+
sameNumberRecord(left.glsl, right.glsl));
|
|
38
|
+
}
|
|
39
|
+
function canUseWorkerRuntime() {
|
|
40
|
+
return typeof Worker !== 'undefined' && typeof SharedArrayBuffer !== 'undefined' && globalThis.crossOriginIsolated;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Entry point used by the `client:worker` directive.
|
|
44
|
+
*
|
|
45
|
+
* Parses the serialised boundary off `element`, spins up (or reuses)
|
|
46
|
+
* a {@link WorkerHost.Shape} from `@czap/worker`, bootstraps the
|
|
47
|
+
* boundary in the worker, and streams resolved state back into DOM
|
|
48
|
+
* via {@link applyBoundaryState}. Falls back to an inline evaluation
|
|
49
|
+
* when `SharedArrayBuffer` / cross-origin isolation is unavailable.
|
|
50
|
+
*/
|
|
51
|
+
export function initWorkerDirective(load, element) {
|
|
52
|
+
let runtimeBoundary = parseBoundary(element.getAttribute('data-czap-boundary'));
|
|
53
|
+
if (!runtimeBoundary) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
let cleanupObserver = null;
|
|
57
|
+
let host = null;
|
|
58
|
+
let unsubscribe = null;
|
|
59
|
+
let ackUnsubscribe = null;
|
|
60
|
+
let workerMessageHandler = null;
|
|
61
|
+
let workerRef = null;
|
|
62
|
+
let previousState = element.getAttribute('data-czap-state') ?? '';
|
|
63
|
+
let lastAppliedDetail = null;
|
|
64
|
+
let seededGeneration = 0;
|
|
65
|
+
let lastAppliedGeneration = 0;
|
|
66
|
+
let pendingWorkerSeedAgreement = false;
|
|
67
|
+
const cleanup = () => {
|
|
68
|
+
cleanupObserver?.();
|
|
69
|
+
cleanupObserver = null;
|
|
70
|
+
unsubscribe?.();
|
|
71
|
+
unsubscribe = null;
|
|
72
|
+
ackUnsubscribe?.();
|
|
73
|
+
ackUnsubscribe = null;
|
|
74
|
+
if (workerMessageHandler && workerRef && typeof workerRef.removeEventListener === 'function') {
|
|
75
|
+
workerRef.removeEventListener('message', workerMessageHandler);
|
|
76
|
+
}
|
|
77
|
+
workerMessageHandler = null;
|
|
78
|
+
workerRef = null;
|
|
79
|
+
host?.dispose();
|
|
80
|
+
host = null;
|
|
81
|
+
};
|
|
82
|
+
const readValue = () => {
|
|
83
|
+
return readSignalValue(runtimeBoundary.input);
|
|
84
|
+
};
|
|
85
|
+
const initFallback = () => {
|
|
86
|
+
const update = (reset = false) => {
|
|
87
|
+
if (!runtimeBoundary) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const value = readValue();
|
|
91
|
+
if (value === undefined) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const nextState = reset
|
|
95
|
+
? evaluateBoundary(runtimeBoundary, value)
|
|
96
|
+
: evaluateBoundary(runtimeBoundary, value, previousState);
|
|
97
|
+
if (nextState === previousState) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
previousState = nextState;
|
|
101
|
+
applyBoundaryState(element, runtimeBoundary, {
|
|
102
|
+
discrete: { [runtimeBoundary.name]: nextState },
|
|
103
|
+
}, 'czap:worker-state');
|
|
104
|
+
};
|
|
105
|
+
update(true);
|
|
106
|
+
if (runtimeBoundary) {
|
|
107
|
+
cleanupObserver = attachViewportObserver(runtimeBoundary.input, () => update(false));
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const initWorkerHost = () => {
|
|
111
|
+
if (!runtimeBoundary) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const boundary = runtimeBoundary;
|
|
115
|
+
const workerHost = WorkerHost.create();
|
|
116
|
+
host = workerHost;
|
|
117
|
+
const syncResolvedState = (stateName, generation, bootstrap = false) => {
|
|
118
|
+
const payload = [
|
|
119
|
+
{
|
|
120
|
+
name: boundary.name,
|
|
121
|
+
state: stateName,
|
|
122
|
+
generation,
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
pendingWorkerSeedAgreement = true;
|
|
126
|
+
seededGeneration = generation;
|
|
127
|
+
lastAppliedGeneration = generation;
|
|
128
|
+
if (bootstrap) {
|
|
129
|
+
workerHost.compositor.bootstrapResolvedState(payload);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
workerHost.compositor.applyResolvedState(payload);
|
|
133
|
+
};
|
|
134
|
+
const applyHostResolvedState = (stateName, generation) => {
|
|
135
|
+
const payload = {
|
|
136
|
+
discrete: { [boundary.name]: stateName },
|
|
137
|
+
};
|
|
138
|
+
applyBoundaryState(element, boundary, payload, 'czap:worker-state');
|
|
139
|
+
previousState = stateName;
|
|
140
|
+
lastAppliedDetail = normalizeBoundaryState(payload);
|
|
141
|
+
lastAppliedGeneration = generation;
|
|
142
|
+
};
|
|
143
|
+
workerHost.compositor.addQuantizer(boundary.name, {
|
|
144
|
+
id: boundary.boundary.id,
|
|
145
|
+
states: boundary.boundary.states,
|
|
146
|
+
thresholds: boundary.boundary.thresholds,
|
|
147
|
+
});
|
|
148
|
+
const onWorkerMessage = (event) => {
|
|
149
|
+
if (event.data?.type === 'ready') {
|
|
150
|
+
element.dispatchEvent(new CustomEvent('czap:worker-ready', { bubbles: true }));
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
workerMessageHandler = onWorkerMessage;
|
|
154
|
+
workerRef = workerHost.compositor.worker;
|
|
155
|
+
workerHost.compositor.worker.addEventListener('message', onWorkerMessage);
|
|
156
|
+
ackUnsubscribe = workerHost.compositor.onResolvedStateAck((ack) => {
|
|
157
|
+
if (host !== workerHost || runtimeBoundary !== boundary) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const ackState = ack.states.find((state) => state.name === boundary.name)?.state;
|
|
161
|
+
if (pendingWorkerSeedAgreement &&
|
|
162
|
+
ack.additionalOutputsChanged === false &&
|
|
163
|
+
ack.generation === seededGeneration &&
|
|
164
|
+
ackState !== undefined &&
|
|
165
|
+
ackState === previousState) {
|
|
166
|
+
pendingWorkerSeedAgreement = false;
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
unsubscribe = workerHost.onState((state) => {
|
|
170
|
+
const currentState = state.discrete?.[boundary.name];
|
|
171
|
+
if (currentState) {
|
|
172
|
+
previousState = currentState;
|
|
173
|
+
}
|
|
174
|
+
const normalized = normalizeBoundaryState(state);
|
|
175
|
+
const workerGeneration = state.resolvedStateGenerations?.[boundary.name];
|
|
176
|
+
if (pendingWorkerSeedAgreement &&
|
|
177
|
+
workerGeneration !== undefined &&
|
|
178
|
+
workerGeneration === seededGeneration &&
|
|
179
|
+
currentState === lastAppliedDetail?.discrete[boundary.name] &&
|
|
180
|
+
sameBoundaryDetail(lastAppliedDetail, normalized)) {
|
|
181
|
+
pendingWorkerSeedAgreement = false;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
applyBoundaryState(element, boundary, state, 'czap:worker-state');
|
|
185
|
+
lastAppliedDetail = normalized;
|
|
186
|
+
if (workerGeneration !== undefined) {
|
|
187
|
+
lastAppliedGeneration = workerGeneration;
|
|
188
|
+
pendingWorkerSeedAgreement = false;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
const update = () => {
|
|
192
|
+
if (host !== workerHost || runtimeBoundary !== boundary) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const value = readValue();
|
|
196
|
+
if (value === undefined) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const nextState = evaluateBoundary(boundary, value, previousState || undefined);
|
|
200
|
+
if (nextState === previousState) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const nextGeneration = lastAppliedGeneration + 1;
|
|
204
|
+
applyHostResolvedState(nextState, nextGeneration);
|
|
205
|
+
syncResolvedState(nextState, nextGeneration);
|
|
206
|
+
};
|
|
207
|
+
const initialValue = readValue();
|
|
208
|
+
if (initialValue !== undefined) {
|
|
209
|
+
const initialState = evaluateBoundary(boundary, initialValue, previousState || undefined);
|
|
210
|
+
applyHostResolvedState(initialState, 1);
|
|
211
|
+
syncResolvedState(initialState, 1, true);
|
|
212
|
+
}
|
|
213
|
+
cleanupObserver = attachViewportObserver(boundary.input, update);
|
|
214
|
+
};
|
|
215
|
+
const init = () => {
|
|
216
|
+
if (canUseWorkerRuntime()) {
|
|
217
|
+
try {
|
|
218
|
+
initWorkerHost();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
Diagnostics.warn({
|
|
223
|
+
source: 'czap/astro.worker',
|
|
224
|
+
code: 'worker-host-fallback',
|
|
225
|
+
message: 'WorkerHost could not initialize, falling back to main-thread evaluation.',
|
|
226
|
+
detail: error instanceof Error ? error.message : String(error),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
initFallback();
|
|
231
|
+
};
|
|
232
|
+
element.addEventListener('czap:reinit', () => {
|
|
233
|
+
cleanup();
|
|
234
|
+
runtimeBoundary = parseBoundary(element.getAttribute('data-czap-boundary'));
|
|
235
|
+
previousState = element.getAttribute('data-czap-state') ?? '';
|
|
236
|
+
lastAppliedDetail = null;
|
|
237
|
+
seededGeneration = 0;
|
|
238
|
+
lastAppliedGeneration = 0;
|
|
239
|
+
pendingWorkerSeedAgreement = false;
|
|
240
|
+
ackUnsubscribe = null;
|
|
241
|
+
init();
|
|
242
|
+
});
|
|
243
|
+
element.addEventListener('czap:dispose', () => {
|
|
244
|
+
cleanup();
|
|
245
|
+
});
|
|
246
|
+
init();
|
|
247
|
+
load();
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/runtime/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@czap/astro",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Astro 6 integration with adaptive directives",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Eassa Ayoub <eassa@heyoub.dev>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/heyoub/LiteShip",
|
|
10
|
+
"directory": "packages/astro"
|
|
11
|
+
},
|
|
12
|
+
"bugs": "https://github.com/heyoub/LiteShip/issues",
|
|
13
|
+
"homepage": "https://github.com/heyoub/LiteShip#readme",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"czap",
|
|
16
|
+
"astro",
|
|
17
|
+
"astro-integration",
|
|
18
|
+
"ssr",
|
|
19
|
+
"satellite",
|
|
20
|
+
"client-directives",
|
|
21
|
+
"typescript"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"development": "./src/index.ts"
|
|
32
|
+
},
|
|
33
|
+
"./client-directives/satellite": {
|
|
34
|
+
"types": "./dist/client-directives/satellite.d.ts",
|
|
35
|
+
"import": "./dist/client-directives/satellite.js",
|
|
36
|
+
"development": "./src/client-directives/satellite.ts"
|
|
37
|
+
},
|
|
38
|
+
"./client-directives/stream": {
|
|
39
|
+
"types": "./dist/client-directives/stream.d.ts",
|
|
40
|
+
"import": "./dist/client-directives/stream.js",
|
|
41
|
+
"development": "./src/client-directives/stream.ts"
|
|
42
|
+
},
|
|
43
|
+
"./client-directives/llm": {
|
|
44
|
+
"types": "./dist/client-directives/llm.d.ts",
|
|
45
|
+
"import": "./dist/client-directives/llm.js",
|
|
46
|
+
"development": "./src/client-directives/llm.ts"
|
|
47
|
+
},
|
|
48
|
+
"./client-directives/worker": {
|
|
49
|
+
"types": "./dist/client-directives/worker.d.ts",
|
|
50
|
+
"import": "./dist/client-directives/worker.js",
|
|
51
|
+
"development": "./src/client-directives/worker.ts"
|
|
52
|
+
},
|
|
53
|
+
"./client-directives/gpu": {
|
|
54
|
+
"types": "./dist/client-directives/gpu.d.ts",
|
|
55
|
+
"import": "./dist/client-directives/gpu.js",
|
|
56
|
+
"development": "./src/client-directives/gpu.ts"
|
|
57
|
+
},
|
|
58
|
+
"./client-directives/wasm": {
|
|
59
|
+
"types": "./dist/client-directives/wasm.d.ts",
|
|
60
|
+
"import": "./dist/client-directives/wasm.js",
|
|
61
|
+
"development": "./src/client-directives/wasm.ts"
|
|
62
|
+
},
|
|
63
|
+
"./middleware": {
|
|
64
|
+
"types": "./dist/middleware.d.ts",
|
|
65
|
+
"import": "./dist/middleware.js",
|
|
66
|
+
"development": "./src/middleware.ts"
|
|
67
|
+
},
|
|
68
|
+
"./runtime": {
|
|
69
|
+
"types": "./dist/runtime/index.d.ts",
|
|
70
|
+
"import": "./dist/runtime/index.js",
|
|
71
|
+
"development": "./src/runtime/index.ts"
|
|
72
|
+
},
|
|
73
|
+
"./Satellite": "./src/Satellite.astro",
|
|
74
|
+
"./Satellite.astro": "./src/Satellite.astro"
|
|
75
|
+
},
|
|
76
|
+
"files": [
|
|
77
|
+
"dist",
|
|
78
|
+
"src",
|
|
79
|
+
"LICENSE"
|
|
80
|
+
],
|
|
81
|
+
"dependencies": {
|
|
82
|
+
"@czap/core": "0.1.0",
|
|
83
|
+
"@czap/vite": "0.1.0",
|
|
84
|
+
"@czap/detect": "0.1.0",
|
|
85
|
+
"@czap/edge": "0.1.0",
|
|
86
|
+
"@czap/web": "0.1.0",
|
|
87
|
+
"@czap/worker": "0.1.0"
|
|
88
|
+
},
|
|
89
|
+
"peerDependencies": {
|
|
90
|
+
"astro": ">=6.0.0",
|
|
91
|
+
"effect": ">=4.0.0-beta.0"
|
|
92
|
+
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"astro": "^6.0.0",
|
|
95
|
+
"effect": "4.0.0-beta.32"
|
|
96
|
+
},
|
|
97
|
+
"engines": {
|
|
98
|
+
"node": ">=22.0.0"
|
|
99
|
+
},
|
|
100
|
+
"publishConfig": {
|
|
101
|
+
"access": "public"
|
|
102
|
+
},
|
|
103
|
+
"scripts": {
|
|
104
|
+
"build": "tsc"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* Satellite -- the canonical adaptive shell for an Astro page.
|
|
4
|
+
*
|
|
5
|
+
* Wraps a `<div>` with `data-czap-*` attributes derived from a Boundary
|
|
6
|
+
* (and optionally a Component or initial state), so the `client:satellite`
|
|
7
|
+
* directive can hydrate the boundary evaluator on the client. CSS
|
|
8
|
+
* transitions handle visual changes; the directive's only runtime job
|
|
9
|
+
* is to evaluate live signals and update `data-czap-state`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```astro
|
|
13
|
+
* ---
|
|
14
|
+
* import Satellite from '@czap/astro/Satellite';
|
|
15
|
+
* import { heroLayout } from '../boundaries.js';
|
|
16
|
+
* ---
|
|
17
|
+
*
|
|
18
|
+
* <Satellite boundary={heroLayout} client:satellite>
|
|
19
|
+
* <section class="hero">...</section>
|
|
20
|
+
* </Satellite>
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* Composition note: this component is a thin shell over `satelliteAttrs()`
|
|
24
|
+
* (`packages/astro/src/Satellite.ts`). When you need to attach satellite
|
|
25
|
+
* attributes to an element other than a `<div>` (e.g. a `<section>` or
|
|
26
|
+
* `<main>`), import `satelliteAttrs` directly and spread it onto your
|
|
27
|
+
* element of choice.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { satelliteAttrs, type SatelliteProps } from './Satellite.js';
|
|
31
|
+
|
|
32
|
+
export interface Props extends SatelliteProps {}
|
|
33
|
+
|
|
34
|
+
const attrs = satelliteAttrs(Astro.props);
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
<div {...attrs}>
|
|
38
|
+
<slot />
|
|
39
|
+
</div>
|
package/src/Satellite.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Satellite -- server-side helper for rendering adaptive container divs.
|
|
3
|
+
*
|
|
4
|
+
* A satellite is czap's island primitive: a plain div annotated with
|
|
5
|
+
* data-czap-* attributes that the client directive hydrates by evaluating
|
|
6
|
+
* live signals and updating `data-czap-state`. CSS transitions handle
|
|
7
|
+
* the visual changes -- zero JS layout work.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { Boundary, Component } from '@czap/core';
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Types
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Server-render props for a satellite container. Astro components
|
|
20
|
+
* typically destructure these and pass them to {@link satelliteAttrs}.
|
|
21
|
+
*/
|
|
22
|
+
export interface SatelliteProps {
|
|
23
|
+
/** Boundary whose state the satellite tracks. */
|
|
24
|
+
readonly boundary?: Boundary.Shape;
|
|
25
|
+
/** Component definition used to identify the satellite on the client. */
|
|
26
|
+
readonly component?: Component.Shape;
|
|
27
|
+
/** Extra CSS class names to merge with `czap-satellite`. */
|
|
28
|
+
readonly class?: string;
|
|
29
|
+
/** Server-side initial state (serialised into `data-czap-state`). */
|
|
30
|
+
readonly initialState?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Attribute Generation
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generate the HTML attributes for a satellite container div.
|
|
39
|
+
* Used by framework integrations (Astro, etc.) to render the satellite wrapper.
|
|
40
|
+
*
|
|
41
|
+
* The returned record maps directly to DOM attributes -- spread it onto your
|
|
42
|
+
* container element and the client directive picks up the rest.
|
|
43
|
+
*/
|
|
44
|
+
export function satelliteAttrs(props: SatelliteProps): Record<string, string> {
|
|
45
|
+
const attrs: Record<string, string> = {};
|
|
46
|
+
|
|
47
|
+
attrs['class'] = ['czap-satellite', props.class].filter(Boolean).join(' ');
|
|
48
|
+
|
|
49
|
+
if (props.component) {
|
|
50
|
+
attrs['data-czap-satellite'] = props.component.name;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (props.boundary) {
|
|
54
|
+
attrs['data-czap-boundary'] = JSON.stringify({
|
|
55
|
+
id: props.boundary.id,
|
|
56
|
+
input: props.boundary.input,
|
|
57
|
+
thresholds: props.boundary.thresholds,
|
|
58
|
+
states: props.boundary.states,
|
|
59
|
+
hysteresis: props.boundary.hysteresis,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (props.initialState) {
|
|
64
|
+
attrs['data-czap-state'] = props.initialState;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return attrs;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// SSR State Resolution
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Resolve initial state from a boundary for SSR.
|
|
76
|
+
*
|
|
77
|
+
* Uses a first-state heuristic since the server has no live signal value.
|
|
78
|
+
* For smarter resolution with client hints and user agent parsing, use
|
|
79
|
+
* `resolveInitialState` from `./quantize.js` instead.
|
|
80
|
+
*/
|
|
81
|
+
export function resolveInitialStateFallback(boundary: Boundary.Shape): string {
|
|
82
|
+
// Boundary.make() guarantees at least one state for every Boundary.Shape.
|
|
83
|
+
return boundary.states[0]!;
|
|
84
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GPU probe upgrade -- replaces provisional tier with full detection.
|
|
3
|
+
*
|
|
4
|
+
* Runs after DOMContentLoaded (not render-blocking). Creates a throwaway
|
|
5
|
+
* WebGL context, reads the GPU renderer string, classifies the GPU tier
|
|
6
|
+
* using the same heuristics as `@czap/detect`, and updates the HTML element
|
|
7
|
+
* attributes.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Inline script that performs full GPU tier detection.
|
|
14
|
+
* Deferred to DOMContentLoaded to avoid blocking rendering.
|
|
15
|
+
*/
|
|
16
|
+
export const DETECT_UPGRADE_SCRIPT = `
|
|
17
|
+
(function(){
|
|
18
|
+
function writeDetectState(next) {
|
|
19
|
+
var safe = Object.freeze(Object.assign({}, next));
|
|
20
|
+
try {
|
|
21
|
+
Object.defineProperty(window, '__CZAP_DETECT__', {
|
|
22
|
+
value: safe,
|
|
23
|
+
configurable: true,
|
|
24
|
+
enumerable: false,
|
|
25
|
+
writable: false
|
|
26
|
+
});
|
|
27
|
+
} catch (_) {
|
|
28
|
+
try {
|
|
29
|
+
window.__CZAP_DETECT__ = safe;
|
|
30
|
+
} catch (_) {}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function upgrade() {
|
|
35
|
+
try {
|
|
36
|
+
var h = document.documentElement;
|
|
37
|
+
var tier = 1;
|
|
38
|
+
var renderer = '';
|
|
39
|
+
var webgpu = false;
|
|
40
|
+
|
|
41
|
+
// WebGL renderer probe
|
|
42
|
+
var c = document.createElement('canvas');
|
|
43
|
+
var gl = c.getContext('webgl2') || c.getContext('webgl');
|
|
44
|
+
if (gl) {
|
|
45
|
+
var ext = gl.getExtension('WEBGL_debug_renderer_info');
|
|
46
|
+
if (ext) {
|
|
47
|
+
renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) || '';
|
|
48
|
+
}
|
|
49
|
+
// Classify GPU tier from renderer string
|
|
50
|
+
var r = renderer.toLowerCase();
|
|
51
|
+
if (/swiftshader|llvmpipe|virtualbox|vmware/.test(r)) {
|
|
52
|
+
tier = 0; // software
|
|
53
|
+
} else if (/rtx|radeon rx [67]|apple m[3-9]|adreno 7/.test(r)) {
|
|
54
|
+
tier = 3; // high
|
|
55
|
+
} else if (/geforce|radeon rx [45]|adreno [56]|mali-g7|apple m[12]|intel arc/.test(r)) {
|
|
56
|
+
tier = 2; // mid
|
|
57
|
+
} else if (/intel|mali|adreno [1-4]|powervr|apple gpu/.test(r)) {
|
|
58
|
+
tier = 1; // integrated
|
|
59
|
+
}
|
|
60
|
+
gl.getExtension('WEBGL_lose_context')?.loseContext();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// WebGPU check
|
|
64
|
+
if (typeof navigator !== 'undefined' && navigator.gpu) {
|
|
65
|
+
webgpu = true;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Compute final tier using GPU + cores + memory
|
|
69
|
+
var cores = navigator.hardwareConcurrency || 2;
|
|
70
|
+
var mem = navigator.deviceMemory || 4;
|
|
71
|
+
var motion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
72
|
+
|
|
73
|
+
var capLevel = 'reactive';
|
|
74
|
+
if (motion) capLevel = 'static';
|
|
75
|
+
else if (tier === 0 || cores <= 2 || mem <= 2) capLevel = 'styled';
|
|
76
|
+
else if (tier >= 3 && cores >= 4 && webgpu) capLevel = 'gpu';
|
|
77
|
+
else if (tier >= 2 && cores >= 4) capLevel = 'animated';
|
|
78
|
+
|
|
79
|
+
var motionTier = 'animations';
|
|
80
|
+
if (motion) motionTier = 'none';
|
|
81
|
+
else if (tier === 0 || cores <= 2) motionTier = 'transitions';
|
|
82
|
+
else if (tier >= 3 && webgpu) motionTier = 'compute';
|
|
83
|
+
else if (tier >= 2) motionTier = 'physics';
|
|
84
|
+
|
|
85
|
+
h.setAttribute('data-czap-tier', capLevel);
|
|
86
|
+
h.setAttribute('data-czap-gpu-tier', String(tier));
|
|
87
|
+
if (webgpu) h.setAttribute('data-czap-webgpu', 'true');
|
|
88
|
+
h.removeAttribute('data-czap-tier-provisional');
|
|
89
|
+
|
|
90
|
+
// Update a minimal runtime snapshot instead of exposing the full probe payload.
|
|
91
|
+
writeDetectState({
|
|
92
|
+
tier: capLevel,
|
|
93
|
+
gpuTier: tier,
|
|
94
|
+
webgpu: webgpu,
|
|
95
|
+
motionTier: motionTier
|
|
96
|
+
});
|
|
97
|
+
} catch(e) { try { document.documentElement.setAttribute('data-czap-tier-probe-error', 'true'); } catch(_) {} }
|
|
98
|
+
}
|
|
99
|
+
if (document.readyState === 'loading') {
|
|
100
|
+
document.addEventListener('DOMContentLoaded', upgrade);
|
|
101
|
+
} else {
|
|
102
|
+
upgrade();
|
|
103
|
+
}
|
|
104
|
+
})();
|
|
105
|
+
`.trim();
|