@graview/guest 0.1.9 → 0.1.10
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/README.md +301 -2
- package/client.js +2 -0
- package/dist/channel.d.ts +11 -3
- package/dist/channel.d.ts.map +1 -1
- package/dist/channel.js +5 -1
- package/dist/channel.js.map +1 -1
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-script.d.ts +3 -0
- package/dist/client-script.d.ts.map +1 -0
- package/dist/client-script.js +21 -0
- package/dist/client-script.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.generated.d.ts +4 -0
- package/dist/client.generated.d.ts.map +1 -0
- package/dist/client.generated.js +9 -0
- package/dist/client.generated.js.map +1 -0
- package/dist/client.js +12 -0
- package/dist/client.js.map +1 -0
- package/dist/headless/describe.d.ts +19 -0
- package/dist/headless/describe.d.ts.map +1 -0
- package/dist/headless/describe.js +255 -0
- package/dist/headless/describe.js.map +1 -0
- package/dist/headless/draw.d.ts +17 -0
- package/dist/headless/draw.d.ts.map +1 -0
- package/dist/headless/draw.js +25 -0
- package/dist/headless/draw.js.map +1 -0
- package/dist/headless/index.d.ts +99 -0
- package/dist/headless/index.d.ts.map +1 -0
- package/dist/headless/index.js +143 -0
- package/dist/headless/index.js.map +1 -0
- package/dist/headless/judge.d.ts +16 -0
- package/dist/headless/judge.d.ts.map +1 -0
- package/dist/headless/judge.js +52 -0
- package/dist/headless/judge.js.map +1 -0
- package/dist/headless/node.d.ts +8 -0
- package/dist/headless/node.d.ts.map +1 -0
- package/dist/headless/node.js +80 -0
- package/dist/headless/node.js.map +1 -0
- package/dist/headless/protocol.d.ts +71 -0
- package/dist/headless/protocol.d.ts.map +1 -0
- package/dist/headless/protocol.js +14 -0
- package/dist/headless/protocol.js.map +1 -0
- package/dist/headless/runtime.d.ts +2 -0
- package/dist/headless/runtime.d.ts.map +1 -0
- package/dist/headless/runtime.generated.d.ts +2 -0
- package/dist/headless/runtime.generated.d.ts.map +1 -0
- package/dist/headless/runtime.generated.js +8 -0
- package/dist/headless/runtime.generated.js.map +1 -0
- package/dist/headless/runtime.js +171 -0
- package/dist/headless/runtime.js.map +1 -0
- package/dist/headless/tree.d.ts +54 -0
- package/dist/headless/tree.d.ts.map +1 -0
- package/dist/headless/tree.js +128 -0
- package/dist/headless/tree.js.map +1 -0
- package/dist/host/css.d.ts +118 -0
- package/dist/host/css.d.ts.map +1 -0
- package/dist/host/css.js +963 -0
- package/dist/host/css.js.map +1 -0
- package/dist/host/draw-budget.d.ts +10 -0
- package/dist/host/draw-budget.d.ts.map +1 -0
- package/dist/host/draw-budget.js +29 -0
- package/dist/host/draw-budget.js.map +1 -0
- package/dist/host/frame.d.ts +19 -1
- package/dist/host/frame.d.ts.map +1 -1
- package/dist/host/frame.js +21 -2
- package/dist/host/frame.js.map +1 -1
- package/dist/host/index.d.ts +4 -3
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +7 -1
- package/dist/host/index.js.map +1 -1
- package/dist/host/kit.d.ts +6 -2
- package/dist/host/kit.d.ts.map +1 -1
- package/dist/host/kit.js +12 -5
- package/dist/host/kit.js.map +1 -1
- package/dist/host/links.d.ts +24 -0
- package/dist/host/links.d.ts.map +1 -0
- package/dist/host/links.js +35 -0
- package/dist/host/links.js.map +1 -0
- package/dist/host/manifest.d.ts +50 -0
- package/dist/host/manifest.d.ts.map +1 -0
- package/dist/host/manifest.js +103 -0
- package/dist/host/manifest.js.map +1 -0
- package/dist/host/open-draw.d.ts +44 -0
- package/dist/host/open-draw.d.ts.map +1 -0
- package/dist/host/open-draw.js +108 -0
- package/dist/host/open-draw.js.map +1 -0
- package/dist/host/open-judge.d.ts +53 -0
- package/dist/host/open-judge.d.ts.map +1 -0
- package/dist/host/open-judge.js +95 -0
- package/dist/host/open-judge.js.map +1 -0
- package/dist/host/open-render.d.ts +32 -0
- package/dist/host/open-render.d.ts.map +1 -0
- package/dist/host/open-render.js +262 -0
- package/dist/host/open-render.js.map +1 -0
- package/dist/host/press.d.ts +15 -0
- package/dist/host/press.d.ts.map +1 -0
- package/dist/host/press.js +156 -0
- package/dist/host/press.js.map +1 -0
- package/dist/host/react.d.ts +15 -2
- package/dist/host/react.d.ts.map +1 -1
- package/dist/host/react.js +13 -5
- package/dist/host/react.js.map +1 -1
- package/dist/host/session.d.ts +94 -1
- package/dist/host/session.d.ts.map +1 -1
- package/dist/host/session.js +103 -14
- package/dist/host/session.js.map +1 -1
- package/dist/host/theme.d.ts +14 -0
- package/dist/host/theme.d.ts.map +1 -0
- package/dist/host/theme.js +51 -0
- package/dist/host/theme.js.map +1 -0
- package/dist/host/view-runtime.generated.d.ts +2 -0
- package/dist/host/view-runtime.generated.d.ts.map +1 -0
- package/dist/host/view-runtime.generated.js +7 -0
- package/dist/host/view-runtime.generated.js.map +1 -0
- package/dist/host/view-source.d.ts +5 -0
- package/dist/host/view-source.d.ts.map +1 -0
- package/dist/host/view-source.js +39 -0
- package/dist/host/view-source.js.map +1 -0
- package/dist/host/view.d.ts +134 -0
- package/dist/host/view.d.ts.map +1 -0
- package/dist/host/view.js +381 -0
- package/dist/host/view.js.map +1 -0
- package/dist/host/views.d.ts +10 -0
- package/dist/host/views.d.ts.map +1 -0
- package/dist/host/views.js +15 -0
- package/dist/host/views.js.map +1 -0
- package/dist/host/worker-react.d.ts +51 -0
- package/dist/host/worker-react.d.ts.map +1 -0
- package/dist/host/worker-react.js +123 -0
- package/dist/host/worker-react.js.map +1 -0
- package/dist/host/worker-start.d.ts +49 -0
- package/dist/host/worker-start.d.ts.map +1 -0
- package/dist/host/worker-start.js +122 -0
- package/dist/host/worker-start.js.map +1 -0
- package/dist/host/worker.d.ts +17 -12
- package/dist/host/worker.d.ts.map +1 -1
- package/dist/host/worker.js +58 -117
- package/dist/host/worker.js.map +1 -1
- package/dist/host/writes.d.ts +49 -0
- package/dist/host/writes.d.ts.map +1 -0
- package/dist/host/writes.js +76 -0
- package/dist/host/writes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/open-kit.d.ts +148 -0
- package/dist/open-kit.d.ts.map +1 -0
- package/dist/open-kit.js +321 -0
- package/dist/open-kit.js.map +1 -0
- package/dist/protocol.d.ts +109 -3
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +13 -0
- package/dist/protocol.js.map +1 -1
- package/dist/worker/harden.d.ts +13 -2
- package/dist/worker/harden.d.ts.map +1 -1
- package/dist/worker/harden.js +10 -4
- package/dist/worker/harden.js.map +1 -1
- package/dist/worker/natives.d.ts +1 -0
- package/dist/worker/natives.d.ts.map +1 -1
- package/dist/worker/natives.js +4 -0
- package/dist/worker/natives.js.map +1 -1
- package/dist/worker/view-global.d.ts +70 -0
- package/dist/worker/view-global.d.ts.map +1 -0
- package/dist/worker/view-global.js +264 -0
- package/dist/worker/view-global.js.map +1 -0
- package/dist/worker/view.d.ts +14 -0
- package/dist/worker/view.d.ts.map +1 -0
- package/dist/worker/view.js +64 -0
- package/dist/worker/view.js.map +1 -0
- package/package.json +30 -4
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import { checkManifest, workerViewProps } from "./manifest.js";
|
|
2
|
+
import { createGuestHost, createGuestLimiter } from "./session.js";
|
|
3
|
+
import { startWorker } from "./worker-start.js";
|
|
4
|
+
import { judgeCodeAct } from "./writes.js";
|
|
5
|
+
import { createDrawBudget } from "./draw-budget.js";
|
|
6
|
+
import { checkViewSource, viewScript } from "./view-source.js";
|
|
7
|
+
import { createLinks } from "./links.js";
|
|
8
|
+
import { readTheme, watchTheme } from "./theme.js";
|
|
9
|
+
/** What each limit is, said to a person. */
|
|
10
|
+
function why(reason, limits, detail) {
|
|
11
|
+
switch (reason) {
|
|
12
|
+
case "manifest":
|
|
13
|
+
return detail ?? "Its manifest names something this app does not have.";
|
|
14
|
+
case "source":
|
|
15
|
+
return detail ?? `Its code is longer than the ${limits.maxSourceBytes.toLocaleString("en-US")} bytes a view may be.`;
|
|
16
|
+
case "refused":
|
|
17
|
+
return `This page could not start it${detail ? `: ${detail}` : "."}`;
|
|
18
|
+
case "error":
|
|
19
|
+
return `It failed before it drew anything${detail ? `: ${detail}` : "."}`;
|
|
20
|
+
case "silent":
|
|
21
|
+
return `It stopped answering for ${limits.silentMs.toLocaleString("en-US")} ms.`;
|
|
22
|
+
case "nodes":
|
|
23
|
+
return `It drew more than the ${limits.maxNodes.toLocaleString("en-US")} things a view may draw.`;
|
|
24
|
+
case "flood":
|
|
25
|
+
return `It sent more than ${limits.messages} messages in ${limits.messageWindowMs.toLocaleString("en-US")} ms.`;
|
|
26
|
+
case "slow":
|
|
27
|
+
return `It took longer than ${limits.pushMs.toLocaleString("en-US")} ms to draw what it was shown.`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export { readTheme };
|
|
31
|
+
/**
|
|
32
|
+
* MOUNT A WORKER VIEW ON THE OPEN KIT (FR-90), AS A PLACE WITH A MANIFEST
|
|
33
|
+
* (FR-91).
|
|
34
|
+
*
|
|
35
|
+
* The view runs in a classic, hardened worker (FR-68–FR-71) and draws
|
|
36
|
+
* plain HTML, SVG and one stylesheet; the host draws them into a shadow
|
|
37
|
+
* root inside a region of its own — contained (`contain: layout paint
|
|
38
|
+
* style`), isolated, clipped — keeping only what the open kit allows. What
|
|
39
|
+
* could fetch or escape is not drawn, and is written down in `refused`.
|
|
40
|
+
* What it is handed is the viewer's sight cut to its manifest, with the
|
|
41
|
+
* app's look, pushed again when the app's scheme changes. A manifest that
|
|
42
|
+
* names what the app does not declare is refused before a worker starts.
|
|
43
|
+
* The sanitiser is fetched the first time a view draws, so a page that
|
|
44
|
+
* mounts none loads none of it.
|
|
45
|
+
*/
|
|
46
|
+
export function mountWorkerView(element, options) {
|
|
47
|
+
const document = element.ownerDocument;
|
|
48
|
+
const window = document.defaultView;
|
|
49
|
+
const { manifest } = options;
|
|
50
|
+
const region = document.createElement("div");
|
|
51
|
+
region.className = "graview-worker-view";
|
|
52
|
+
region.setAttribute("role", "region");
|
|
53
|
+
region.setAttribute("aria-label", manifest.title ?? manifest.name);
|
|
54
|
+
region.setAttribute("data-worker-view", manifest.name);
|
|
55
|
+
/* Contained, isolated, clipped: nothing the view draws paints outside the region or stacks above the app (FR-90). */
|
|
56
|
+
region.style.cssText = "display:block;position:relative;contain:layout paint style;isolation:isolate;overflow:clip;min-width:0";
|
|
57
|
+
element.appendChild(region);
|
|
58
|
+
const shadow = region.attachShadow({ mode: "open" });
|
|
59
|
+
const author = options.author ? document.createElement("p") : undefined;
|
|
60
|
+
if (author) {
|
|
61
|
+
author.className = "graview-worker-view-author";
|
|
62
|
+
author.setAttribute("data-worker-view-author", manifest.name);
|
|
63
|
+
author.style.cssText = "margin:4px 0 0;font-size:0.75rem;color:var(--graview-ink-muted, inherit)";
|
|
64
|
+
author.textContent = options.author;
|
|
65
|
+
element.appendChild(author);
|
|
66
|
+
}
|
|
67
|
+
const stats = { applied: 0, refused: 0, dropped: 0 };
|
|
68
|
+
const limiter = createGuestLimiter(options.limits);
|
|
69
|
+
const limits = {
|
|
70
|
+
maxSourceBytes: options.limits?.maxSourceBytes ?? 256_000,
|
|
71
|
+
maxNodes: options.limits?.maxNodes ?? 5_000,
|
|
72
|
+
messages: options.limits?.messages ?? 120,
|
|
73
|
+
messageWindowMs: options.limits?.messageWindowMs ?? 1_000,
|
|
74
|
+
pushMs: options.limits?.pushMs ?? 1_000,
|
|
75
|
+
silentMs: options.limits?.silentMs ?? 5_000,
|
|
76
|
+
drawMs: options.limits?.drawMs ?? 100,
|
|
77
|
+
};
|
|
78
|
+
/* What the view was last shown: the plain face drawn in its place, if it fails. */
|
|
79
|
+
let lastProps;
|
|
80
|
+
let session;
|
|
81
|
+
let started;
|
|
82
|
+
let drawing;
|
|
83
|
+
let failed = false;
|
|
84
|
+
let counted = { applied: 0, refused: 0, dropped: 0 };
|
|
85
|
+
/* What came before the drawing's module did: drawn, in order, once it has. */
|
|
86
|
+
const waiting = [];
|
|
87
|
+
const tally = () => {
|
|
88
|
+
if (!session)
|
|
89
|
+
return;
|
|
90
|
+
const now = session.stats;
|
|
91
|
+
stats.applied += now.applied - counted.applied;
|
|
92
|
+
stats.refused += now.refused - counted.refused;
|
|
93
|
+
stats.dropped += now.dropped - counted.dropped;
|
|
94
|
+
counted = { ...now };
|
|
95
|
+
};
|
|
96
|
+
let unwatch = () => { };
|
|
97
|
+
/* The interval that times each push (FR-94), once the view is ready. */
|
|
98
|
+
let timing = 0;
|
|
99
|
+
const stop = () => {
|
|
100
|
+
tally();
|
|
101
|
+
session?.dispose();
|
|
102
|
+
session = undefined;
|
|
103
|
+
started?.stop();
|
|
104
|
+
unwatch();
|
|
105
|
+
window.clearInterval(timing);
|
|
106
|
+
};
|
|
107
|
+
const fail = (reason, detail) => {
|
|
108
|
+
if (failed)
|
|
109
|
+
return;
|
|
110
|
+
failed = true;
|
|
111
|
+
stop();
|
|
112
|
+
drawing?.dispose();
|
|
113
|
+
const said = why(reason, limits, detail);
|
|
114
|
+
region.setAttribute("data-worker-view-failed", reason);
|
|
115
|
+
if (options.fallback !== false)
|
|
116
|
+
(options.fallback ?? plainFace)(region, reason, said);
|
|
117
|
+
options.onFailure?.(reason, said);
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* THE PLAIN FACE, drawn by the host from what the view was shown and
|
|
121
|
+
* nothing of the view's: its title, each record by its label, and why it
|
|
122
|
+
* was stopped. What a reader sees in place of a view that went past its
|
|
123
|
+
* limits.
|
|
124
|
+
*/
|
|
125
|
+
const plainFace = (_, reason, said) => {
|
|
126
|
+
const props = lastProps ?? (() => {
|
|
127
|
+
try {
|
|
128
|
+
return workerViewProps(options.store, options.principal, { manifest, ...(options.input ? { input: options.input() } : {}) });
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
})();
|
|
134
|
+
const face = document.createElement("div");
|
|
135
|
+
face.setAttribute("data-graview-fallback", reason);
|
|
136
|
+
face.style.cssText = "padding:12px;display:grid;gap:6px;color:var(--graview-ink, inherit);font-family:var(--graview-font-body, inherit)";
|
|
137
|
+
const title = document.createElement("strong");
|
|
138
|
+
title.textContent = manifest.title ?? manifest.name;
|
|
139
|
+
const list = document.createElement("ul");
|
|
140
|
+
list.style.cssText = "margin:0;padding-left:1.2em";
|
|
141
|
+
for (const node of [...(props?.node ? [props.node] : []), ...(props?.nodes ?? [])]) {
|
|
142
|
+
const item = document.createElement("li");
|
|
143
|
+
item.textContent = node.label ?? node.id;
|
|
144
|
+
list.appendChild(item);
|
|
145
|
+
}
|
|
146
|
+
const note = document.createElement("p");
|
|
147
|
+
note.style.cssText = "margin:0;font-size:0.8125rem;color:var(--graview-ink-muted, inherit)";
|
|
148
|
+
note.textContent = `This view was stopped. ${said}`;
|
|
149
|
+
face.append(title, list, note);
|
|
150
|
+
shadow.replaceChildren(face);
|
|
151
|
+
};
|
|
152
|
+
const findings = checkManifest(manifest, options.store);
|
|
153
|
+
if (findings.length > 0) {
|
|
154
|
+
queueMicrotask(() => fail("manifest", findings.join(" ")));
|
|
155
|
+
return handle();
|
|
156
|
+
}
|
|
157
|
+
const code = options.worker;
|
|
158
|
+
const bytes = "source" in code ? new TextEncoder().encode(code.source).length : "script" in code ? new TextEncoder().encode(code.script).length : 0;
|
|
159
|
+
if (bytes > limits.maxSourceBytes) {
|
|
160
|
+
queueMicrotask(() => fail("source"));
|
|
161
|
+
return handle();
|
|
162
|
+
}
|
|
163
|
+
/* A view's own source may load nothing (FR-96): refused before it runs, with why. */
|
|
164
|
+
const unloadable = "source" in code ? checkViewSource(code.source) : [];
|
|
165
|
+
if (unloadable.length > 0) {
|
|
166
|
+
queueMicrotask(() => fail("source", unloadable.join(" ")));
|
|
167
|
+
return handle();
|
|
168
|
+
}
|
|
169
|
+
/*
|
|
170
|
+
* THE APP'S LOOK, KEPT UP. The tokens reach the view's stylesheet by
|
|
171
|
+
* inheritance, so its CSS restyles itself; what the view computes from
|
|
172
|
+
* `props.theme` needs a push, so the host watches for the app's toggle
|
|
173
|
+
* (the embed stamps `data-graview-scheme`, a page `data-theme`) and the
|
|
174
|
+
* system's preference, and pushes when the look it reads has changed.
|
|
175
|
+
*/
|
|
176
|
+
const theme = () => options.theme?.() ?? readTheme(region);
|
|
177
|
+
let pushed = "";
|
|
178
|
+
const push = () => {
|
|
179
|
+
pushed = JSON.stringify(theme());
|
|
180
|
+
session?.push();
|
|
181
|
+
};
|
|
182
|
+
const looked = () => {
|
|
183
|
+
if (session && JSON.stringify(theme()) !== pushed)
|
|
184
|
+
push();
|
|
185
|
+
};
|
|
186
|
+
unwatch = watchTheme(document, looked);
|
|
187
|
+
let port;
|
|
188
|
+
const send = (message) => port?.postMessage(message);
|
|
189
|
+
/* Anything drawn yet: a view that throws after it drew goes on; one that throws before has failed. */
|
|
190
|
+
let drew = false;
|
|
191
|
+
/*
|
|
192
|
+
* TIME PER PUSH (FR-94). Each push of what the view is shown is timed
|
|
193
|
+
* from when the host sends it to when the runtime says it has drawn it,
|
|
194
|
+
* and the runtime says how long the view's own listeners took. Past
|
|
195
|
+
* `pushMs` either way, the view is stopped as slow. A view that spins in
|
|
196
|
+
* its listener never says it has drawn; the host's own page being held
|
|
197
|
+
* up is not the view's time.
|
|
198
|
+
*/
|
|
199
|
+
const clock = window.performance;
|
|
200
|
+
const pending = new Map();
|
|
201
|
+
let ticked = clock.now();
|
|
202
|
+
const every = Math.max(10, Math.min(250, Math.floor(limits.pushMs / 4)));
|
|
203
|
+
const startTiming = () => {
|
|
204
|
+
if (timing)
|
|
205
|
+
return;
|
|
206
|
+
ticked = clock.now();
|
|
207
|
+
timing = window.setInterval(() => {
|
|
208
|
+
const at = clock.now();
|
|
209
|
+
const held = at - ticked > every * 2 ? at - ticked - every : 0;
|
|
210
|
+
ticked = at;
|
|
211
|
+
for (const [push, sent] of pending) {
|
|
212
|
+
const since = sent + held;
|
|
213
|
+
pending.set(push, since);
|
|
214
|
+
if (at - since >= limits.pushMs)
|
|
215
|
+
return fail("slow");
|
|
216
|
+
}
|
|
217
|
+
}, every);
|
|
218
|
+
};
|
|
219
|
+
/* The host's own time drawing the view, at most `drawMs` of any second (draw-budget.ts): past it, the view is slow. */
|
|
220
|
+
const budget = createDrawBudget(limits.drawMs, () => clock.now());
|
|
221
|
+
const draw = (one) => {
|
|
222
|
+
if (failed)
|
|
223
|
+
return;
|
|
224
|
+
if (!drawing)
|
|
225
|
+
return void waiting.push(one);
|
|
226
|
+
const live = drawing;
|
|
227
|
+
const within = budget.draw((spent) => (one[0] === "render" ? live.apply(one[1], spent) : (live.style(one[1]), true)));
|
|
228
|
+
if (!within)
|
|
229
|
+
fail("slow");
|
|
230
|
+
};
|
|
231
|
+
/* Links stay in the app (FR-93): a record the viewer may see, or a place the app has. */
|
|
232
|
+
const links = createLinks({
|
|
233
|
+
sees: (id) => options.store.seenBy(options.principal).graph.has(id),
|
|
234
|
+
places: () => options.places?.() ?? [],
|
|
235
|
+
...(options.onNavigate ? { onNavigate: options.onNavigate } : {}),
|
|
236
|
+
});
|
|
237
|
+
/* The records the view was last shown: a press may be bound to one of these, and to nothing else (FR-92). */
|
|
238
|
+
let shown = new Set();
|
|
239
|
+
void Promise.all([import("./open-draw.js"), import("./press.js")]).then(([{ createOpenDrawing }, { createPressReader, judgePress }]) => {
|
|
240
|
+
if (failed)
|
|
241
|
+
return;
|
|
242
|
+
const reader = createPressReader();
|
|
243
|
+
drawing = createOpenDrawing(shadow, {
|
|
244
|
+
origin: options.origin ?? window.location.origin,
|
|
245
|
+
...(options.limits?.maxNodes !== undefined ? { maxNodes: options.limits.maxNodes } : {}),
|
|
246
|
+
onOverBudget: () => fail("nodes"),
|
|
247
|
+
send,
|
|
248
|
+
onFieldSet: (field) => reader.filled(field),
|
|
249
|
+
onAttribute: (element, name) => {
|
|
250
|
+
if (element.localName === "a" && (name === "data-record" || name === "data-place"))
|
|
251
|
+
links.link(element);
|
|
252
|
+
},
|
|
253
|
+
decorate: (element) => {
|
|
254
|
+
if (element.localName === "a")
|
|
255
|
+
links.link(element);
|
|
256
|
+
},
|
|
257
|
+
/*
|
|
258
|
+
* THE VIEWER'S PRESS, IN ITS OWN HANDLER (FR-92). A trusted click on
|
|
259
|
+
* an element bound to an act is judged and applied here, before the
|
|
260
|
+
* view hears of it; the view is told what became of it.
|
|
261
|
+
*/
|
|
262
|
+
before: (event, at, root) => {
|
|
263
|
+
reader.heard(event, at);
|
|
264
|
+
/* A link the view drew goes where it says, if that is a record or a place of this app. */
|
|
265
|
+
const anchor = at.closest("a[data-graview-link]");
|
|
266
|
+
if (anchor && root.contains(anchor) && (event.type === "click" || (event.type === "keydown" && event.key === "Enter"))) {
|
|
267
|
+
/* Followed here, and nowhere else: the face around the view does not also take the press for a press on the card. */
|
|
268
|
+
event.preventDefault();
|
|
269
|
+
event.stopPropagation();
|
|
270
|
+
links.follow(anchor);
|
|
271
|
+
}
|
|
272
|
+
const press = reader.press(event, at, root);
|
|
273
|
+
if (!press || !session)
|
|
274
|
+
return;
|
|
275
|
+
event.stopPropagation();
|
|
276
|
+
const outcome = session.pressed(judgePress(options.store, manifest, shown, press));
|
|
277
|
+
tally();
|
|
278
|
+
return { pressed: { as: press.as, ...outcome } };
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
for (const one of waiting.splice(0))
|
|
282
|
+
draw(one);
|
|
283
|
+
});
|
|
284
|
+
const begin = (source) => (started = startWorker(window, {
|
|
285
|
+
source,
|
|
286
|
+
name: manifest.name,
|
|
287
|
+
limiter,
|
|
288
|
+
readyMs: options.limits?.readyMs ?? 5_000,
|
|
289
|
+
silentMs: options.limits?.silentMs ?? 5_000,
|
|
290
|
+
onDropped: () => (stats.dropped += 1),
|
|
291
|
+
onStop: (reason, detail) => fail(reason, detail),
|
|
292
|
+
onError: (detail) => {
|
|
293
|
+
if (!drew)
|
|
294
|
+
fail("error", detail);
|
|
295
|
+
},
|
|
296
|
+
onReady: (nonce, given) => {
|
|
297
|
+
port = given;
|
|
298
|
+
startTiming();
|
|
299
|
+
const live = createGuestHost({
|
|
300
|
+
store: options.store,
|
|
301
|
+
principal: options.principal,
|
|
302
|
+
view: manifest.name,
|
|
303
|
+
nonce,
|
|
304
|
+
send: (message) => {
|
|
305
|
+
if (message.type === "props" && typeof message.push === "number")
|
|
306
|
+
pending.set(message.push, clock.now());
|
|
307
|
+
given.postMessage(message);
|
|
308
|
+
},
|
|
309
|
+
props: () => {
|
|
310
|
+
const props = workerViewProps(options.store, options.principal, { manifest, ...(options.input ? { input: options.input() } : {}), theme: theme(), ...(options.places ? { places: options.places() } : {}) });
|
|
311
|
+
shown = new Set([...(props.node ? [props.node.id] : []), ...(props.nodes ?? []).map((node) => node.id)]);
|
|
312
|
+
lastProps = props;
|
|
313
|
+
return props;
|
|
314
|
+
},
|
|
315
|
+
judgeAct: (name, args) => judgeCodeAct(options.store, manifest, name, args),
|
|
316
|
+
onRender: (records) => {
|
|
317
|
+
drew = true;
|
|
318
|
+
draw(["render", records]);
|
|
319
|
+
},
|
|
320
|
+
onPushed: (push, ms) => {
|
|
321
|
+
pending.delete(push);
|
|
322
|
+
if (ms >= limits.pushMs)
|
|
323
|
+
fail("slow");
|
|
324
|
+
},
|
|
325
|
+
/* Past the message allowance, a view is stopped, not read on (FR-94). */
|
|
326
|
+
onFlood: () => fail("flood"),
|
|
327
|
+
onStyle: (css) => draw(["style", css]),
|
|
328
|
+
onNavigate: (record) => void links.go({ record }),
|
|
329
|
+
onNavigatePlace: (place) => void links.go({ place }),
|
|
330
|
+
places: () => (options.places?.() ?? []).map((place) => place.as),
|
|
331
|
+
...(options.limits ? { limits: options.limits } : {}),
|
|
332
|
+
limiter,
|
|
333
|
+
});
|
|
334
|
+
session = live;
|
|
335
|
+
given.onmessage = (message) => {
|
|
336
|
+
if (started?.answer(message.data))
|
|
337
|
+
return;
|
|
338
|
+
live.receive(message.data);
|
|
339
|
+
tally();
|
|
340
|
+
};
|
|
341
|
+
push();
|
|
342
|
+
},
|
|
343
|
+
}));
|
|
344
|
+
if ("source" in code) {
|
|
345
|
+
void viewScript(code.source).then((script) => {
|
|
346
|
+
if (!failed)
|
|
347
|
+
begin({ script });
|
|
348
|
+
}, () => fail("refused", "the view's runtime could not be loaded"));
|
|
349
|
+
}
|
|
350
|
+
else
|
|
351
|
+
begin(code);
|
|
352
|
+
return handle();
|
|
353
|
+
function handle() {
|
|
354
|
+
return {
|
|
355
|
+
element: region,
|
|
356
|
+
shadow,
|
|
357
|
+
get worker() {
|
|
358
|
+
return started?.worker;
|
|
359
|
+
},
|
|
360
|
+
update: () => {
|
|
361
|
+
if (session)
|
|
362
|
+
push();
|
|
363
|
+
},
|
|
364
|
+
get stats() {
|
|
365
|
+
tally();
|
|
366
|
+
return stats;
|
|
367
|
+
},
|
|
368
|
+
get refused() {
|
|
369
|
+
return drawing?.refused ?? [];
|
|
370
|
+
},
|
|
371
|
+
dispose() {
|
|
372
|
+
failed = true;
|
|
373
|
+
stop();
|
|
374
|
+
drawing?.dispose();
|
|
375
|
+
region.remove();
|
|
376
|
+
author?.remove();
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/host/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { registerWorkerView, workerHome, workerView } from "./worker-react.js";
|
|
2
|
+
export type { WorkerHomeContext, WorkerViewDefinition } from "./worker-react.js";
|
|
3
|
+
export { checkManifest, manifestActs, workerViewProps } from "./manifest.js";
|
|
4
|
+
export type { ManifestAct, WorkerViewManifest, WorkerViewPropsInput } from "./manifest.js";
|
|
5
|
+
export { judgeCodeAct, sightIsTotal } from "./writes.js";
|
|
6
|
+
export type { Judged, Press, PressedField } from "./writes.js";
|
|
7
|
+
export { checkViewSource } from "./view-source.js";
|
|
8
|
+
export type { MountWorkerViewOptions, WorkerView, WorkerViewCode, WorkerViewFailure, WorkerViewLimits } from "./view.js";
|
|
9
|
+
export type { GuestPlace, GuestTheme } from "../protocol.js";
|
|
10
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/host/views.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/E,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7E,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzH,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A WORKER VIEW AS A PLACE: `@graview/guest/host/views`.
|
|
3
|
+
*
|
|
4
|
+
* Registering a worker view for its kind or as the home's body (FR-91), and
|
|
5
|
+
* judging, with no worker, what it may be handed (FR-91), ask for from its
|
|
6
|
+
* code (FR-92) and run at all (FR-96). Its own entry, apart from
|
|
7
|
+
* `@graview/guest/host`, so a page that draws only frame guests carries none
|
|
8
|
+
* of it; the worker's host and the open kit are fetched when a view is
|
|
9
|
+
* first drawn.
|
|
10
|
+
*/
|
|
11
|
+
export { registerWorkerView, workerHome, workerView } from "./worker-react.js";
|
|
12
|
+
export { checkManifest, manifestActs, workerViewProps } from "./manifest.js";
|
|
13
|
+
export { judgeCodeAct, sightIsTotal } from "./writes.js";
|
|
14
|
+
export { checkViewSource } from "./view-source.js";
|
|
15
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/host/views.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AnySchema, Principal, Store } from "@graview/core";
|
|
2
|
+
import { type ReactViewRegistry, type ViewComponent } from "@graview/react/provider";
|
|
3
|
+
import { type ComponentType } from "react";
|
|
4
|
+
import type { WorkerViewManifest } from "./manifest.js";
|
|
5
|
+
import type { WorkerViewCode, WorkerViewLimits } from "./view.js";
|
|
6
|
+
/** A worker view as an app registers it: its manifest, its code, and how far it may go. */
|
|
7
|
+
export interface WorkerViewDefinition {
|
|
8
|
+
readonly manifest: WorkerViewManifest;
|
|
9
|
+
/** Its code: `{ source }`, a plain script against the `graview` global (FR-96), or a whole worker script. */
|
|
10
|
+
readonly worker: WorkerViewCode;
|
|
11
|
+
readonly limits?: WorkerViewLimits;
|
|
12
|
+
/** Who made it, said under it ("Made by Claude for Nick"). */
|
|
13
|
+
readonly author?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A WORKER VIEW AS A VIEW OF A KIND (FR-91): what `registerWorkerView`
|
|
17
|
+
* registers. It is drawn where the kind's picture is, on both faces, with
|
|
18
|
+
* the viewer's sight cut to its manifest; should it fail — a refused
|
|
19
|
+
* worker, a manifest that names what the app does not declare, a view past
|
|
20
|
+
* its limits — `fallback` is drawn in its place.
|
|
21
|
+
*/
|
|
22
|
+
export declare function workerView(definition: WorkerViewDefinition, options?: {
|
|
23
|
+
readonly fallback?: ViewComponent<AnySchema>;
|
|
24
|
+
}): ViewComponent<AnySchema>;
|
|
25
|
+
/**
|
|
26
|
+
* REGISTER A WORKER VIEW FOR THE KIND ITS MANIFEST ATTACHES TO (FR-91): in
|
|
27
|
+
* the cell its cardinality says, at full fidelity, and — given a title — as
|
|
28
|
+
* a named place, on the Graview face and the pages face alike. Whatever the
|
|
29
|
+
* registry drew there before (the framework's own face of the kind) is what
|
|
30
|
+
* is drawn if the view fails.
|
|
31
|
+
*/
|
|
32
|
+
export declare function registerWorkerView<S extends AnySchema>(views: ReactViewRegistry<S>, definition: WorkerViewDefinition): ReactViewRegistry<S>;
|
|
33
|
+
/** What a home is handed on a face: the store, and who is looking. */
|
|
34
|
+
export interface WorkerHomeContext {
|
|
35
|
+
readonly store: Store<AnySchema>;
|
|
36
|
+
readonly principal?: Principal;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A WORKER VIEW AS THE HOME'S BODY (FR-91): a component for the routed
|
|
40
|
+
* face's `home` surface (`pages.surface("home", workerHome(definition))`).
|
|
41
|
+
* Its manifest attaches to `"home"` and reads what it shows. Should it
|
|
42
|
+
* fail, `fallback` — the app's own home — is drawn in its place.
|
|
43
|
+
*/
|
|
44
|
+
export declare function workerHome(definition: WorkerViewDefinition, options?: {
|
|
45
|
+
readonly fallback?: ComponentType<{
|
|
46
|
+
readonly context: never;
|
|
47
|
+
}>;
|
|
48
|
+
}): ComponentType<{
|
|
49
|
+
readonly context: WorkerHomeContext;
|
|
50
|
+
}>;
|
|
51
|
+
//# sourceMappingURL=worker-react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-react.d.ts","sourceRoot":"","sources":["../../src/host/worker-react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAgB,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAuC,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAkB,MAAM,yBAAyB,CAAC;AAC1I,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAExE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAc,cAAc,EAAqB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEjG,2FAA2F;AAC3F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,6GAA6G;IAC7G,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAqED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,oBAAoB,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CA4BrJ;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,oBAAoB,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAiB3I;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,oBAAoB,EAAE,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;KAAE,CAAC,CAAA;CAAO,GAAG,aAAa,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAqBrM"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useGoTo, useGraviewIfAny } from "@graview/react/provider";
|
|
3
|
+
import { useEffect, useRef, useState } from "react";
|
|
4
|
+
const inputOf = (props) => ({
|
|
5
|
+
...(props.node ? { node: { id: props.node.id } } : {}),
|
|
6
|
+
...(props.nodes ? { nodes: props.nodes.map((node) => ({ id: node.id })) } : {}),
|
|
7
|
+
...(props.label !== undefined ? { label: props.label } : {}),
|
|
8
|
+
fidelity: props.fidelity,
|
|
9
|
+
cardinality: props.cardinality,
|
|
10
|
+
mode: props.mode,
|
|
11
|
+
selected: props.selected,
|
|
12
|
+
...(props.implicated ? { implicated: props.implicated } : {}),
|
|
13
|
+
...(props.flagged ? { flagged: props.flagged } : {}),
|
|
14
|
+
});
|
|
15
|
+
/** The region a worker view is drawn in, mounted when it is drawn; the host's half is fetched then. */
|
|
16
|
+
function WorkerViewMount({ definition, store, principal, input, goTo, places, scheme, onFailure, drawsItsOwn, tick }) {
|
|
17
|
+
const holder = useRef(null);
|
|
18
|
+
const mounted = useRef(null);
|
|
19
|
+
const latest = useRef({ input, goTo, places, onFailure });
|
|
20
|
+
latest.current = { input, goTo, places, onFailure };
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const element = holder.current;
|
|
23
|
+
if (!element)
|
|
24
|
+
return;
|
|
25
|
+
let gone = false;
|
|
26
|
+
void import("./worker.js").then(({ mountWorkerView }) => {
|
|
27
|
+
if (gone)
|
|
28
|
+
return;
|
|
29
|
+
mounted.current = mountWorkerView(element, {
|
|
30
|
+
manifest: definition.manifest,
|
|
31
|
+
worker: definition.worker,
|
|
32
|
+
store,
|
|
33
|
+
principal,
|
|
34
|
+
input: () => latest.current.input?.() ?? {},
|
|
35
|
+
/* Links stay in the app (FR-93): a record or a place, on whichever face the view is drawn. */
|
|
36
|
+
onNavigate: (to) => ("record" in to ? latest.current.goTo?.record(to.record) : latest.current.goTo?.place(to.place)),
|
|
37
|
+
places: () => latest.current.places?.() ?? [],
|
|
38
|
+
onFailure: (reason, detail) => latest.current.onFailure(reason, detail),
|
|
39
|
+
...(drawsItsOwn ? { fallback: false } : {}),
|
|
40
|
+
...(definition.limits ? { limits: definition.limits } : {}),
|
|
41
|
+
...(definition.author ? { author: definition.author } : {}),
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return () => {
|
|
45
|
+
gone = true;
|
|
46
|
+
mounted.current?.dispose();
|
|
47
|
+
mounted.current = null;
|
|
48
|
+
};
|
|
49
|
+
}, [definition, store, principal]);
|
|
50
|
+
useEffect(() => mounted.current?.update(), [scheme, tick]);
|
|
51
|
+
return _jsx("div", { ref: holder, "data-worker-view-place": definition.manifest.name });
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A WORKER VIEW AS A VIEW OF A KIND (FR-91): what `registerWorkerView`
|
|
55
|
+
* registers. It is drawn where the kind's picture is, on both faces, with
|
|
56
|
+
* the viewer's sight cut to its manifest; should it fail — a refused
|
|
57
|
+
* worker, a manifest that names what the app does not declare, a view past
|
|
58
|
+
* its limits — `fallback` is drawn in its place.
|
|
59
|
+
*/
|
|
60
|
+
export function workerView(definition, options = {}) {
|
|
61
|
+
const Fallback = options.fallback;
|
|
62
|
+
function WorkerViewOfKind(props) {
|
|
63
|
+
const graview = useGraviewIfAny();
|
|
64
|
+
const goTo = useGoTo();
|
|
65
|
+
const [failed, setFailed] = useState(null);
|
|
66
|
+
const latest = useRef(props);
|
|
67
|
+
latest.current = props;
|
|
68
|
+
if (!graview)
|
|
69
|
+
return null;
|
|
70
|
+
/* Past its limits, the kind's own face — what the registry drew there before — in its place (FR-94). */
|
|
71
|
+
if (failed && Fallback)
|
|
72
|
+
return _jsx(Fallback, { ...props });
|
|
73
|
+
return (_jsx(WorkerViewMount, { definition: definition, store: graview.store, principal: graview.principal, input: () => inputOf(latest.current), goTo: goTo, places: () => graview.views.places(), scheme: graview.scheme, tick: props, drawsItsOwn: Fallback !== undefined, onFailure: (reason) => setFailed(reason) }));
|
|
74
|
+
}
|
|
75
|
+
WorkerViewOfKind.displayName = `WorkerView(${definition.manifest.name})`;
|
|
76
|
+
return WorkerViewOfKind;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* REGISTER A WORKER VIEW FOR THE KIND ITS MANIFEST ATTACHES TO (FR-91): in
|
|
80
|
+
* the cell its cardinality says, at full fidelity, and — given a title — as
|
|
81
|
+
* a named place, on the Graview face and the pages face alike. Whatever the
|
|
82
|
+
* registry drew there before (the framework's own face of the kind) is what
|
|
83
|
+
* is drawn if the view fails.
|
|
84
|
+
*/
|
|
85
|
+
export function registerWorkerView(views, definition) {
|
|
86
|
+
const { manifest } = definition;
|
|
87
|
+
if (manifest.attach === "home") {
|
|
88
|
+
/*
|
|
89
|
+
* THE HOME'S OWN VIEW (FR-81): drawn by both faces — the routed home's
|
|
90
|
+
* body, and the landing over the scene when it is at home — in place of
|
|
91
|
+
* the home the app declared, which is drawn if the view fails.
|
|
92
|
+
*/
|
|
93
|
+
if (!views.home)
|
|
94
|
+
throw new Error(`The worker view "${manifest.name}" is the home's body: draw it with workerHome, on the home.`);
|
|
95
|
+
const declared = views.homeView?.();
|
|
96
|
+
views.home(workerView(definition, declared ? { fallback: declared } : {}));
|
|
97
|
+
return views;
|
|
98
|
+
}
|
|
99
|
+
const cell = { cardinality: manifest.cardinality, fidelity: "full" };
|
|
100
|
+
const before = (views.lookup(manifest.attach, cell) ?? views.resolve(manifest.attach, cell)?.view);
|
|
101
|
+
views.register(manifest.attach, cell, workerView(definition, before ? { fallback: before } : {}), manifest.title ? { title: manifest.title } : undefined);
|
|
102
|
+
return views;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* A WORKER VIEW AS THE HOME'S BODY (FR-91): a component for the routed
|
|
106
|
+
* face's `home` surface (`pages.surface("home", workerHome(definition))`).
|
|
107
|
+
* Its manifest attaches to `"home"` and reads what it shows. Should it
|
|
108
|
+
* fail, `fallback` — the app's own home — is drawn in its place.
|
|
109
|
+
*/
|
|
110
|
+
export function workerHome(definition, options = {}) {
|
|
111
|
+
const Fallback = options.fallback;
|
|
112
|
+
function WorkerHome({ context }) {
|
|
113
|
+
const graview = useGraviewIfAny();
|
|
114
|
+
const goTo = useGoTo();
|
|
115
|
+
const [failed, setFailed] = useState(null);
|
|
116
|
+
if (failed && Fallback)
|
|
117
|
+
return _jsx(Fallback, { context: context });
|
|
118
|
+
return (_jsx(WorkerViewMount, { definition: definition, store: context.store, principal: context.principal ?? graview?.principal ?? { kind: "human" }, goTo: goTo, ...(graview ? { places: () => graview.views.places(), scheme: graview.scheme } : {}), drawsItsOwn: Fallback !== undefined, onFailure: (reason) => setFailed(reason) }));
|
|
119
|
+
}
|
|
120
|
+
WorkerHome.displayName = `WorkerHome(${definition.manifest.name})`;
|
|
121
|
+
return WorkerHome;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=worker-react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-react.js","sourceRoot":"","sources":["../../src/host/worker-react.tsx"],"names":[],"mappings":"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"}
|