@almadar/shell-web 0.0.0-stage → 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/bundling.d.mts +18 -0
- package/bundling.mjs +28 -0
- package/dist/ArbitraryClassCompiler-Mzabq-UB.d.ts +100 -0
- package/dist/AvlGlyph-JKJOAH23.js +6 -0
- package/dist/AvlStateMachine-PI4YGREK.js +8 -0
- package/dist/AvlTransitionDetail-ZH7V24UG.js +12 -0
- package/dist/AvlTransitionExplainer-ZSRT7L6Y.js +13 -0
- package/dist/BehaviorValueFrame-6RUJXT4A.js +29 -0
- package/dist/BehaviorValueFrame-SSEMEBTG.css +1756 -0
- package/dist/BehaviorView-RFEE5J6E.js +10 -0
- package/dist/Canvas3DHost-_Y-5uLM_.d.ts +552 -0
- package/dist/EventBusProvider-CVwjkV_2.d.ts +284 -0
- package/dist/FileTree-BCFnBEuQ.d.ts +254 -0
- package/dist/FlowCanvas-3JRMNJLV.css +1756 -0
- package/dist/FlowCanvas-STDC4OWK.js +27 -0
- package/dist/GameAudioProvider-Cm9BnvmP.d.ts +93 -0
- package/dist/KaTeX_AMS-Regular-CYEKBG2K.woff +0 -0
- package/dist/KaTeX_AMS-Regular-JKX5W2C4.ttf +0 -0
- package/dist/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
- package/dist/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
- package/dist/KaTeX_Caligraphic-Bold-WZ3QSGD3.woff +0 -0
- package/dist/KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf +0 -0
- package/dist/KaTeX_Caligraphic-Regular-3LKEU76G.woff +0 -0
- package/dist/KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf +0 -0
- package/dist/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Bold-T4SWXBMT.woff +0 -0
- package/dist/KaTeX_Fraktur-Bold-WGHVTYOR.ttf +0 -0
- package/dist/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
- package/dist/KaTeX_Fraktur-Regular-5U4OPH2X.ttf +0 -0
- package/dist/KaTeX_Fraktur-Regular-PQMHCIK6.woff +0 -0
- package/dist/KaTeX_Main-Bold-2GA4IZIN.woff +0 -0
- package/dist/KaTeX_Main-Bold-W5FBVCZM.ttf +0 -0
- package/dist/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
- package/dist/KaTeX_Main-BoldItalic-4P4C7HJH.woff +0 -0
- package/dist/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
- package/dist/KaTeX_Main-BoldItalic-ODMLBJJQ.ttf +0 -0
- package/dist/KaTeX_Main-Italic-I43T2HSR.ttf +0 -0
- package/dist/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
- package/dist/KaTeX_Main-Italic-SASNQFN2.woff +0 -0
- package/dist/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
- package/dist/KaTeX_Main-Regular-P5I74A2A.woff +0 -0
- package/dist/KaTeX_Main-Regular-W74P5G27.ttf +0 -0
- package/dist/KaTeX_Math-BoldItalic-6EBV3DK5.woff +0 -0
- package/dist/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
- package/dist/KaTeX_Math-BoldItalic-VB447A4D.ttf +0 -0
- package/dist/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
- package/dist/KaTeX_Math-Italic-KKK3USB2.woff +0 -0
- package/dist/KaTeX_Math-Italic-SON4MRCA.ttf +0 -0
- package/dist/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
- package/dist/KaTeX_SansSerif-Bold-STQ6RXC7.ttf +0 -0
- package/dist/KaTeX_SansSerif-Bold-X5M5EMOD.woff +0 -0
- package/dist/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
- package/dist/KaTeX_SansSerif-Italic-PSN4QKYX.woff +0 -0
- package/dist/KaTeX_SansSerif-Italic-WTBAZBGY.ttf +0 -0
- package/dist/KaTeX_SansSerif-Regular-2TL3USAE.ttf +0 -0
- package/dist/KaTeX_SansSerif-Regular-OQCII6EP.woff +0 -0
- package/dist/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
- package/dist/KaTeX_Script-Regular-72OLXYNA.ttf +0 -0
- package/dist/KaTeX_Script-Regular-A5IFOEBS.woff +0 -0
- package/dist/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
- package/dist/KaTeX_Size1-Regular-4HRHTS65.woff +0 -0
- package/dist/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
- package/dist/KaTeX_Size1-Regular-7K6AASVL.ttf +0 -0
- package/dist/KaTeX_Size2-Regular-222HN3GT.ttf +0 -0
- package/dist/KaTeX_Size2-Regular-K5ZHAIS6.woff +0 -0
- package/dist/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
- package/dist/KaTeX_Size3-Regular-TLFPAHDE.woff +0 -0
- package/dist/KaTeX_Size3-Regular-UFCO6WCA.ttf +0 -0
- package/dist/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
- package/dist/KaTeX_Size4-Regular-7PGNVPQK.ttf +0 -0
- package/dist/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
- package/dist/KaTeX_Size4-Regular-PKMWZHNC.woff +0 -0
- package/dist/KaTeX_Typewriter-Regular-3F5K6SQ6.ttf +0 -0
- package/dist/KaTeX_Typewriter-Regular-MJMFSK64.woff +0 -0
- package/dist/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
- package/dist/KernelEngineContext-BOCQoFwk.d.ts +43 -0
- package/dist/LayersPanel-BBQ54IVG.js +7 -0
- package/dist/ModuleCard-3TT2X7IW.js +7 -0
- package/dist/OrbInspector-K6T6O7GI.js +27 -0
- package/dist/OrbInspector-MHLJ6OEE.css +1756 -0
- package/dist/Select-mDZIwNqN.d.ts +199 -0
- package/dist/ServerBridge-Cm1On51b.d.ts +233 -0
- package/dist/ThemeContext-DJmO59xd.d.ts +147 -0
- package/dist/TraitValueFrame-2PJGLLVI.js +28 -0
- package/dist/TraitValueFrame-4G3KOUBR.css +1756 -0
- package/dist/UISlotContext-Dl_ewwCI.d.ts +79 -0
- package/dist/UISlotRenderer-JKFSX24W.js +27 -0
- package/dist/UISlotRenderer-KVFO6J7R.css +1756 -0
- package/dist/UserContext-DqWeZkUZ.d.ts +100 -0
- package/dist/auth/browser/index.d.ts +2 -0
- package/dist/auth/browser/index.js +1 -0
- package/dist/auth/react/index.d.ts +49 -0
- package/dist/auth/react/index.js +119 -0
- package/dist/avl/index.css +1756 -0
- package/dist/avl/index.d.ts +2238 -0
- package/dist/avl/index.js +2693 -0
- package/dist/avl-3d-context-BIRKWpaL.d.ts +204 -0
- package/dist/avl-schema-parser-CtJxJ9KU.d.ts +132 -0
- package/dist/avl-zoom-state-CKMVuBFg.d.ts +17 -0
- package/dist/chunk-2PY54Z44.js +227 -0
- package/dist/chunk-2QOH2HWM.js +95 -0
- package/dist/chunk-3BBUBJFF.js +339 -0
- package/dist/chunk-42FY4RYA.js +191 -0
- package/dist/chunk-5QTYQTPS.js +15 -0
- package/dist/chunk-6P3MWXYE.js +440 -0
- package/dist/chunk-73SRAB4P.js +1053 -0
- package/dist/chunk-A2LR6VQQ.js +349 -0
- package/dist/chunk-AILY3XPS.js +562 -0
- package/dist/chunk-B4BU77LT.js +432 -0
- package/dist/chunk-DFNZUYX4.js +378 -0
- package/dist/chunk-DJ433ET5.js +1327 -0
- package/dist/chunk-DLZF4PVE.js +24 -0
- package/dist/chunk-DYEKAA4L.js +787 -0
- package/dist/chunk-DZ42OJQC.js +176 -0
- package/dist/chunk-EOWMARUB.js +16 -0
- package/dist/chunk-EQAMU2ZC.js +14 -0
- package/dist/chunk-FAJDTHWC.js +98 -0
- package/dist/chunk-FIW6WN23.js +508 -0
- package/dist/chunk-FP3WIKTC.js +303 -0
- package/dist/chunk-G7DCAZ22.js +19 -0
- package/dist/chunk-GAR5TQ5B.js +199 -0
- package/dist/chunk-GKIFONTE.js +131 -0
- package/dist/chunk-GYTPOFVC.js +47155 -0
- package/dist/chunk-KVQS4GXU.js +328 -0
- package/dist/chunk-L2DEKY4J.js +97 -0
- package/dist/chunk-L677XGY3.js +701 -0
- package/dist/chunk-MBQAMMSE.js +11877 -0
- package/dist/chunk-P4LNHAFI.js +1051 -0
- package/dist/chunk-P4ZFUQFF.js +93 -0
- package/dist/chunk-PC7K4SK7.js +1384 -0
- package/dist/chunk-R5O5AUPI.js +573 -0
- package/dist/chunk-SGM3FASH.js +672 -0
- package/dist/chunk-SJGJJKBY.js +502 -0
- package/dist/chunk-TESBIVUA.js +11 -0
- package/dist/chunk-TZZBINQY.js +82 -0
- package/dist/chunk-U6QRZASX.js +280 -0
- package/dist/chunk-VFF5OO47.js +319 -0
- package/dist/chunk-YDNJLLG6.js +516 -0
- package/dist/chunk-YHMRX6YA.js +455 -0
- package/dist/chunk-ZO6MXAS3.js +69 -0
- package/dist/components/index.css +1756 -0
- package/dist/components/index.d.ts +11093 -0
- package/dist/components/index.js +1110 -0
- package/dist/context/index.d.ts +9 -0
- package/dist/context/index.js +7 -0
- package/dist/core.d.ts +2523 -0
- package/dist/core.js +2 -0
- package/dist/design-classes/index.cjs +429 -0
- package/dist/design-classes/index.d.cts +165 -0
- package/dist/design-classes/index.d.ts +165 -0
- package/dist/design-classes/index.js +397 -0
- package/dist/emojiItems-QGSNAABW.js +20 -0
- package/dist/fx-CmQjnHmT.d.ts +371 -0
- package/dist/hooks/index.d.ts +936 -0
- package/dist/hooks/index.js +7 -0
- package/dist/index.d.ts +486 -0
- package/dist/index.js +38 -0
- package/dist/katexPlugin-FA7NX4PE.css +1161 -0
- package/dist/katexPlugin-NCDKOOQY.js +2 -0
- package/dist/kernel-client-ZH4PSMCN.js +367 -0
- package/dist/kernel-wire-B4S8pnP3.d.ts +65 -0
- package/dist/lib/index.d.ts +602 -0
- package/dist/lib/index.js +1288 -0
- package/dist/paintDispatch-ChW5mVuK.d.ts +698 -0
- package/dist/parseLessonSegments-GpCeMrb2.d.ts +334 -0
- package/dist/perf-CKiBKbkw.d.ts +22 -0
- package/dist/perf-Dr28-AgT.d.ts +57 -0
- package/dist/prism-AIWGN2X5.js +134 -0
- package/dist/providers/index.css +1756 -0
- package/dist/providers/index.d.ts +340 -0
- package/dist/providers/index.js +30 -0
- package/dist/renderer/index.d.ts +467 -0
- package/dist/renderer/index.js +3 -0
- package/dist/runtime/index.css +1756 -0
- package/dist/runtime/index.d.ts +440 -0
- package/dist/runtime/index.js +31 -0
- package/dist/slot-host-CPzrxLo9.d.ts +48 -0
- package/dist/ssr/index.cjs +7631 -0
- package/dist/ssr/index.d.cts +487 -0
- package/dist/ssr/index.d.ts +487 -0
- package/dist/ssr/index.js +7599 -0
- package/dist/storage/browser/index.d.ts +1 -0
- package/dist/storage/browser/index.js +1 -0
- package/dist/test-support.d.ts +35 -0
- package/dist/test-support.js +114 -0
- package/dist/themeTokens-CRd8AEDF.d.ts +125 -0
- package/dist/three/index.css +503 -0
- package/dist/three/index.d.ts +1185 -0
- package/dist/three/index.js +3896 -0
- package/dist/useKeyboardRouter-Dsq553Ur.d.ts +42 -0
- package/dist/useUISlots-CiobNFGb.d.ts +211 -0
- package/dist/verification-C5pTeMJv.d.ts +66 -0
- package/dist/verificationRegistry-CabxhfTv.d.ts +122 -0
- package/dist/wrapCallbackForEvent-B9QLbhxX.d.ts +19 -0
- package/index.css +199 -0
- package/package.json +269 -3
- package/src/core/locales/ar.json +1263 -0
- package/src/core/locales/en.json +1263 -0
- package/src/core/locales/index.ts +54 -0
- package/src/core/locales/sl.json +1263 -0
- package/src/core/tokens/native-tokens.json +369 -0
- package/tailwind-compile.cjs +29 -0
- package/tailwind-preset.cjs +991 -0
- package/themes/_base.css +451 -0
- package/themes/_contract.md +307 -0
- package/themes/_fonts-kenney.css +11 -0
- package/themes/_fonts.css +12 -0
- package/themes/_foundation.css +105 -0
- package/themes/_head.css +22 -0
- package/themes/_presets.css +67 -0
- package/themes/almadar-heritage.css +455 -0
- package/themes/almadar-website.css +269 -0
- package/themes/almadar.css +269 -0
- package/themes/aqua.css +455 -0
- package/themes/arabesque.css +459 -0
- package/themes/art-deco.css +457 -0
- package/themes/art-nouveau.css +459 -0
- package/themes/atelier.css +463 -0
- package/themes/bauhaus.css +461 -0
- package/themes/bloomberg-dense.css +463 -0
- package/themes/blueprint.css +457 -0
- package/themes/clay.css +449 -0
- package/themes/comic.css +453 -0
- package/themes/constructivist.css +457 -0
- package/themes/corporate.css +449 -0
- package/themes/cyberpunk.css +453 -0
- package/themes/frutiger-aero.css +458 -0
- package/themes/game-adventure.css +201 -0
- package/themes/game-rpg.css +203 -0
- package/themes/game-sci-fi.css +201 -0
- package/themes/game-ui-pack.css +200 -0
- package/themes/gazette.css +449 -0
- package/themes/glass.css +457 -0
- package/themes/gothic.css +453 -0
- package/themes/index.css +21 -0
- package/themes/ink-wash.css +459 -0
- package/themes/kawaii.css +459 -0
- package/themes/kflow.css +310 -0
- package/themes/kiosk.css +449 -0
- package/themes/linear-clean.css +463 -0
- package/themes/luxury.css +451 -0
- package/themes/mac-classic.css +455 -0
- package/themes/material.css +463 -0
- package/themes/memphis.css +453 -0
- package/themes/mid-century.css +455 -0
- package/themes/minimalist.css +449 -0
- package/themes/mudcloth.css +459 -0
- package/themes/nata.css +310 -0
- package/themes/neon.css +453 -0
- package/themes/neumorphic.css +451 -0
- package/themes/newsprint.css +455 -0
- package/themes/notion-editorial.css +463 -0
- package/themes/orb.css +465 -0
- package/themes/pixel.css +449 -0
- package/themes/prism.css +309 -0
- package/themes/rawi.css +310 -0
- package/themes/retro.css +452 -0
- package/themes/risograph.css +463 -0
- package/themes/scandi.css +469 -0
- package/themes/sketch.css +455 -0
- package/themes/solarpunk.css +469 -0
- package/themes/steampunk.css +451 -0
- package/themes/swiss.css +455 -0
- package/themes/terminal.css +466 -0
- package/themes/trait-wars.css +487 -0
- package/themes/ukiyo-e.css +459 -0
- package/themes/vaporwave.css +455 -0
- package/themes/victorian.css +453 -0
- package/themes/wabi-sabi.css +459 -0
- package/themes/win95.css +455 -0
- package/themes/wireframe.css +439 -0
- package/themes/zine.css +455 -0
- package/README.md +0 -3
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { createLocalFold, src_exports, createTickDriver, runTickFrame, mirrorResponse, traceResponse } from './chunk-6P3MWXYE.js';
|
|
2
|
+
import './chunk-DYEKAA4L.js';
|
|
3
|
+
import { presenceGroup, getTraitPresence } from './chunk-MBQAMMSE.js';
|
|
4
|
+
import './chunk-G7DCAZ22.js';
|
|
5
|
+
import { TraitMountError } from '@almadar/shell-runtime/client/trait-mount-error';
|
|
6
|
+
import { createLogger } from '@almadar/logger';
|
|
7
|
+
|
|
8
|
+
var log = createLogger("almadar:ui:kernel-client");
|
|
9
|
+
var defaultFrameScheduler = (callback) => {
|
|
10
|
+
if (typeof requestAnimationFrame === "function") {
|
|
11
|
+
const handle = requestAnimationFrame(callback);
|
|
12
|
+
return () => cancelAnimationFrame(handle);
|
|
13
|
+
}
|
|
14
|
+
const timer = setTimeout(() => callback(performance.now()), 16);
|
|
15
|
+
return () => clearTimeout(timer);
|
|
16
|
+
};
|
|
17
|
+
function parse(text) {
|
|
18
|
+
return JSON.parse(text);
|
|
19
|
+
}
|
|
20
|
+
function payloadJson(payload) {
|
|
21
|
+
return payload === void 0 ? void 0 : JSON.stringify(payload);
|
|
22
|
+
}
|
|
23
|
+
function createKernelClient(opts) {
|
|
24
|
+
const { store, traitIndex, transport } = opts;
|
|
25
|
+
let loaded;
|
|
26
|
+
const configs = /* @__PURE__ */ new Map();
|
|
27
|
+
const ready = opts.instance.then((k) => {
|
|
28
|
+
loaded = k;
|
|
29
|
+
return k;
|
|
30
|
+
});
|
|
31
|
+
ready.catch(() => void 0);
|
|
32
|
+
const visibleGroups = [...traitIndex.byName].filter(([, entry]) => (entry.irTrait.ticks ?? []).some((tick) => tick.whileVisible === true)).map(([name]) => [name, presenceGroup(traitIndex, name)]);
|
|
33
|
+
let queueTail = Promise.resolve();
|
|
34
|
+
const enqueue = (run) => {
|
|
35
|
+
const result = queueTail.then(run);
|
|
36
|
+
queueTail = result.then(() => void 0, () => void 0);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
let progressTail = Promise.resolve();
|
|
40
|
+
let scopeTail = Promise.resolve();
|
|
41
|
+
const declareScope = (apply) => {
|
|
42
|
+
const applied = scopeTail.then(() => ready).then(apply);
|
|
43
|
+
scopeTail = applied.then(() => void 0, () => void 0);
|
|
44
|
+
return applied;
|
|
45
|
+
};
|
|
46
|
+
const frameKeyOf = (trait) => traitIndex.byName.get(trait)?.frameKey;
|
|
47
|
+
const mirror = (response) => mirrorResponse(store, frameKeyOf, response);
|
|
48
|
+
const trace = (response) => traceResponse(opts.observer, response);
|
|
49
|
+
const localFold = createLocalFold({ store, frameKeyOf, ...opts.observer !== void 0 ? { observer: opts.observer } : {} });
|
|
50
|
+
const lane = new src_exports.DispatchLane();
|
|
51
|
+
const syncStates = (k, traits) => {
|
|
52
|
+
for (const trait of traits) {
|
|
53
|
+
const state = k.getState(trait);
|
|
54
|
+
if (state !== "" && store.states.getState(trait)?.currentState !== state) store.states.seedState(trait, state);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const restore = (k, wire, entityId) => {
|
|
58
|
+
const snapshot = wire.snapshot;
|
|
59
|
+
if (snapshot === null) return { clientEffects: [], clientEffectsByTrait: [] };
|
|
60
|
+
const trait = wire.seed.trait;
|
|
61
|
+
const repaint = parse(k.restore(trait, entityId, JSON.stringify(snapshot)));
|
|
62
|
+
const frameKey = traitIndex.byName.get(trait)?.frameKey ?? trait;
|
|
63
|
+
if (snapshot.state !== "") store.states.rollbackState(trait, snapshot.state, entityId, "server-rejected");
|
|
64
|
+
const entity = snapshot.entity;
|
|
65
|
+
if (entity !== null && typeof entity === "object" && !Array.isArray(entity)) store.frames.set(frameKey, { ...entity });
|
|
66
|
+
else store.frames.delete(frameKey);
|
|
67
|
+
mirror(repaint);
|
|
68
|
+
store.notify();
|
|
69
|
+
return { clientEffects: repaint.clientEffects ?? [], clientEffectsByTrait: repaint.clientEffectsByTrait ?? [] };
|
|
70
|
+
};
|
|
71
|
+
const planDispatch = (wire, carriesCircuitState) => {
|
|
72
|
+
if (wire.serverLegs.length > 0) {
|
|
73
|
+
return {
|
|
74
|
+
awaiting: wire.awaiting,
|
|
75
|
+
legs: wire.serverLegs.map(({ orbital, leg }) => ({
|
|
76
|
+
orbital,
|
|
77
|
+
leg,
|
|
78
|
+
keepsState: carriesCircuitState || wire.mode === "hybridClientOnly",
|
|
79
|
+
alreadyDelivered: wire.alreadyDelivered,
|
|
80
|
+
foldSeeded: wire.foldSeeded,
|
|
81
|
+
wires: [wire]
|
|
82
|
+
}))
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (!carriesCircuitState && wire.statefulLeg !== null) {
|
|
86
|
+
return {
|
|
87
|
+
awaiting: wire.statefulLeg.awaiting,
|
|
88
|
+
legs: [{ orbital: wire.statefulLeg.orbital, leg: wire.statefulLeg.leg, keepsState: true, alreadyDelivered: wire.alreadyDelivered, foldSeeded: [], wires: [wire] }]
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { legs: [], awaiting: [] };
|
|
92
|
+
};
|
|
93
|
+
const sendLegs = async (k, legs, request, flags, initial) => {
|
|
94
|
+
const out = {
|
|
95
|
+
response: initial,
|
|
96
|
+
serverEffects: { clientEffects: [], clientEffectsByTrait: [] },
|
|
97
|
+
success: true,
|
|
98
|
+
rejections: [],
|
|
99
|
+
foldedEmits: []
|
|
100
|
+
};
|
|
101
|
+
if (transport === void 0) return out;
|
|
102
|
+
const queue = [...legs];
|
|
103
|
+
for (let planned = queue.shift(); planned !== void 0; planned = queue.shift()) {
|
|
104
|
+
const shaped = planned.keepsState ? planned.leg : JSON.parse(k.statefulLeg(JSON.stringify(planned.leg)));
|
|
105
|
+
const sent = request.locale !== void 0 ? { ...shaped, locale: request.locale } : shaped;
|
|
106
|
+
const base = k.foldBase(sent.entityByTrait !== void 0 ? JSON.stringify(sent.entityByTrait) : void 0, JSON.stringify(planned.foldSeeded), sent.entityId);
|
|
107
|
+
let posted;
|
|
108
|
+
try {
|
|
109
|
+
posted = await transport.send(planned.orbital, sent);
|
|
110
|
+
} catch (err) {
|
|
111
|
+
if (flags.rollback || flags.mount) for (const wire of planned.wires) restore(k, wire, request.entityId);
|
|
112
|
+
throw err instanceof Error ? err : new Error(String(err));
|
|
113
|
+
}
|
|
114
|
+
if (!posted.success) {
|
|
115
|
+
const optimistic = planned.wires.filter((wire) => wire.mode === "runtimeOptimistic");
|
|
116
|
+
if (flags.rollback && optimistic.length > 0) {
|
|
117
|
+
return { ...out, response: posted, success: false, rolledBack: restore(k, optimistic[0], request.entityId) };
|
|
118
|
+
}
|
|
119
|
+
if (flags.mount) for (const wire of optimistic) restore(k, wire, request.entityId);
|
|
120
|
+
}
|
|
121
|
+
const applied = parse(k.applyServerResponse(JSON.stringify(posted), JSON.stringify(planned.alreadyDelivered), base));
|
|
122
|
+
log.debug("fold", { orbital: planned.orbital, event: sent.event, posted: { success: posted.success, states: posted.states, emitted: posted.emittedEvents.map((e) => e.event) }, applied: applied.applied, cascadeEmitted: applied.response.emittedEvents.map((e) => e.event) });
|
|
123
|
+
trace(applied.response);
|
|
124
|
+
for (const routed of applied.serverLegs) {
|
|
125
|
+
queue.push({ orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [] });
|
|
126
|
+
}
|
|
127
|
+
mirror(posted);
|
|
128
|
+
mirror(applied.response);
|
|
129
|
+
syncStates(k, [...Object.keys(posted.states), ...applied.applied.map(([trait]) => trait)]);
|
|
130
|
+
store.notify();
|
|
131
|
+
const fold = applied.response;
|
|
132
|
+
const delivered = new Set(planned.alreadyDelivered.map(([trait, event]) => `${trait}\0${event}`));
|
|
133
|
+
const serverEmits = posted.emittedEvents.filter((e) => !delivered.has(`${e.source?.trait ?? ""}\0${e.event}`));
|
|
134
|
+
const effects = [...posted.clientEffects ?? [], ...fold.clientEffects ?? []];
|
|
135
|
+
const byTrait = [...posted.clientEffectsByTrait ?? [], ...fold.clientEffectsByTrait ?? []];
|
|
136
|
+
out.serverEffects.clientEffects?.push(...effects);
|
|
137
|
+
out.serverEffects.clientEffectsByTrait?.push(...byTrait);
|
|
138
|
+
out.foldedEmits.push(...serverEmits, ...fold.emittedEvents);
|
|
139
|
+
out.response = {
|
|
140
|
+
...out.response,
|
|
141
|
+
emittedEvents: [...out.response.emittedEvents, ...serverEmits, ...fold.emittedEvents],
|
|
142
|
+
clientEffects: [...out.response.clientEffects ?? [], ...effects],
|
|
143
|
+
clientEffectsByTrait: [...out.response.clientEffectsByTrait ?? [], ...byTrait],
|
|
144
|
+
effectResults: [...out.response.effectResults ?? [], ...fold.effectResults ?? []]
|
|
145
|
+
};
|
|
146
|
+
out.success = out.success && posted.success;
|
|
147
|
+
if (posted.error !== void 0) out.error = posted.error;
|
|
148
|
+
out.rejections.push(...(fold.rejections ?? []).filter((r) => r.code === "effect-failed"));
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
};
|
|
152
|
+
const post = async (k, wire, request, flags) => {
|
|
153
|
+
const topology = await opts.topology;
|
|
154
|
+
const plan = planDispatch(wire, topology.carriesCircuitState);
|
|
155
|
+
const awaiting = flags.awaiting ? plan.awaiting : [];
|
|
156
|
+
store.awaiting.begin(awaiting);
|
|
157
|
+
try {
|
|
158
|
+
return await sendLegs(k, plan.legs, request, { rollback: flags.rollback, mount: false }, wire.response);
|
|
159
|
+
} finally {
|
|
160
|
+
store.awaiting.end(awaiting.map((a) => a.trait));
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
const framePost = (k) => {
|
|
164
|
+
if (transport === void 0) return void 0;
|
|
165
|
+
return {
|
|
166
|
+
postDispatch: async (wire) => (await post(k, wire, {}, { rollback: false, awaiting: false })).serverEffects,
|
|
167
|
+
sendBrowserLeg: async (routed, frameResponse) => {
|
|
168
|
+
const planned = { orbital: routed.orbital, leg: routed.leg, keepsState: true, alreadyDelivered: [], foldSeeded: [], wires: [] };
|
|
169
|
+
return (await sendLegs(k, [planned], {}, { rollback: false, mount: false }, frameResponse)).serverEffects;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
};
|
|
173
|
+
const tickPorts = (k) => ({
|
|
174
|
+
kernel: {
|
|
175
|
+
frame: (nowMs) => {
|
|
176
|
+
const presence = getTraitPresence();
|
|
177
|
+
for (const [traitName, group] of visibleGroups) k.setTraitOnScreen(traitName, presence.state(group) !== "off-screen");
|
|
178
|
+
return k.frame(nowMs);
|
|
179
|
+
},
|
|
180
|
+
framePause: () => k.framePause(),
|
|
181
|
+
frameResume: () => k.frameResume(),
|
|
182
|
+
tickCount: () => k.tickCount()
|
|
183
|
+
},
|
|
184
|
+
lane,
|
|
185
|
+
client: localFold,
|
|
186
|
+
post: framePost(k)
|
|
187
|
+
});
|
|
188
|
+
const dispatchOne = async (request, hooks, progress) => {
|
|
189
|
+
const traitName = request.targetTrait;
|
|
190
|
+
if (traitName === void 0) throw new Error("dispatch requires request.targetTrait (the seed trait)");
|
|
191
|
+
const k = await ready;
|
|
192
|
+
if (request.runTick !== void 0) {
|
|
193
|
+
const response = parse(k.tick(request.runTick.trait, request.runTick.tick, request.entityId));
|
|
194
|
+
mirror(response);
|
|
195
|
+
store.notify();
|
|
196
|
+
return { response, mode: parse(k.dispatchMode(request.runTick.trait)) };
|
|
197
|
+
}
|
|
198
|
+
const wire = parse(k.dispatch(traitName, request.entityId, request.event, payloadJson(request.payload)));
|
|
199
|
+
log.debug("dispatch", { trait: traitName, event: request.event, mode: wire.mode, legs: wire.serverLegs.length, success: wire.response.success, states: wire.response.states, effects: (wire.response.clientEffectsByTrait ?? []).map((e) => `${e.traitName}:${e.effect[0]}:${e.effect[1] ?? ""}`), emitted: wire.response.emittedEvents.map((e) => e.event) });
|
|
200
|
+
trace(wire.response);
|
|
201
|
+
mirror(wire.response);
|
|
202
|
+
store.notify();
|
|
203
|
+
if (transport === void 0 || wire.serverLegs.length === 0 && wire.statefulLeg === null) return { response: wire.response, mode: wire.mode };
|
|
204
|
+
const painters = hooks.filter((h) => h.onLocal !== void 0);
|
|
205
|
+
for (const h of painters) h.onLocal?.(wire.response);
|
|
206
|
+
const posted = await post(k, wire, request, { rollback: true, awaiting: !progress });
|
|
207
|
+
const localPainted = painters.length > 0;
|
|
208
|
+
if (posted.rolledBack !== void 0) {
|
|
209
|
+
return { response: posted.response, mode: wire.mode, ...localPainted ? { localPainted, serverEffects: posted.rolledBack } : {} };
|
|
210
|
+
}
|
|
211
|
+
return localPainted ? { response: posted.response, mode: wire.mode, localPainted, serverEffects: posted.serverEffects } : { response: posted.response, mode: wire.mode };
|
|
212
|
+
};
|
|
213
|
+
const client = {
|
|
214
|
+
store,
|
|
215
|
+
dispatch: (request, hooks) => enqueue(() => dispatchOne(request, hooks !== void 0 ? [hooks] : [], false)),
|
|
216
|
+
dispatchProgress: (request) => {
|
|
217
|
+
const outcome = progressTail.then(() => dispatchOne(request, [], true));
|
|
218
|
+
progressTail = outcome.then(() => void 0, () => void 0);
|
|
219
|
+
return outcome;
|
|
220
|
+
},
|
|
221
|
+
foldHostDispatch: (request, response) => enqueue(async () => {
|
|
222
|
+
const k = await ready;
|
|
223
|
+
if (request.targetTrait === void 0) throw new Error("foldHostDispatch requires request.targetTrait (the seed trait)");
|
|
224
|
+
const mode = parse(k.dispatchMode(request.targetTrait));
|
|
225
|
+
if (!response.success) return { response: { ...response, clientEffects: [], clientEffectsByTrait: [] }, mode };
|
|
226
|
+
const applied = parse(k.applyServerResponse(JSON.stringify(response), "[]"));
|
|
227
|
+
trace(applied.response);
|
|
228
|
+
mirror(response);
|
|
229
|
+
mirror(applied.response);
|
|
230
|
+
syncStates(k, [...Object.keys(response.states), ...applied.applied.map(([trait]) => trait)]);
|
|
231
|
+
store.notify();
|
|
232
|
+
return {
|
|
233
|
+
response: {
|
|
234
|
+
...response,
|
|
235
|
+
clientEffects: [...response.clientEffects ?? [], ...applied.response.clientEffects ?? []],
|
|
236
|
+
clientEffectsByTrait: [...response.clientEffectsByTrait ?? [], ...applied.response.clientEffectsByTrait ?? []]
|
|
237
|
+
},
|
|
238
|
+
mode
|
|
239
|
+
};
|
|
240
|
+
}),
|
|
241
|
+
dispatchMount: (seeds, hooks, base) => enqueue(async () => {
|
|
242
|
+
const k = await ready;
|
|
243
|
+
await scopeTail;
|
|
244
|
+
const baseRequest = base ?? {};
|
|
245
|
+
k.mount(JSON.stringify(seeds.map((s) => s.trait)));
|
|
246
|
+
const mount = parse(k.dispatchMount(JSON.stringify(seeds), baseRequest.entityId, payloadJson(baseRequest.payload)));
|
|
247
|
+
if (mount.failed !== null) {
|
|
248
|
+
const failed = mount.failed;
|
|
249
|
+
throw new TraitMountError(failed.trait, failed.event, new Error(failed.message));
|
|
250
|
+
}
|
|
251
|
+
const wires = mount.seeds;
|
|
252
|
+
for (const wire of wires) {
|
|
253
|
+
log.debug("mount", { trait: wire.seed.trait, event: wire.seed.event, mode: wire.mode, legs: wire.serverLegs.length, success: wire.response.success });
|
|
254
|
+
trace(wire.response);
|
|
255
|
+
mirror(wire.response);
|
|
256
|
+
}
|
|
257
|
+
store.notify();
|
|
258
|
+
for (const wire of wires) hooks?.onLocal?.(wire.seed.trait, wire.response);
|
|
259
|
+
const outcome = {
|
|
260
|
+
seeds: wires.map((w) => ({ trait: w.seed.trait, event: w.seed.event, mode: w.mode, local: w.response })),
|
|
261
|
+
posted: false,
|
|
262
|
+
success: true,
|
|
263
|
+
rejections: [],
|
|
264
|
+
serverEffects: { clientEffects: [], clientEffectsByTrait: [] },
|
|
265
|
+
emittedEvents: []
|
|
266
|
+
};
|
|
267
|
+
if (transport === void 0) return outcome;
|
|
268
|
+
const topology = await opts.topology;
|
|
269
|
+
for (const group of topology.carriesCircuitState ? mount.legs : mount.statefulLegs) {
|
|
270
|
+
const answered = wires.filter((w) => group.seeds.some((s) => s.trait === w.seed.trait && s.event === w.seed.event));
|
|
271
|
+
const planned = { orbital: group.orbital, leg: group.leg, keepsState: true, alreadyDelivered: group.alreadyDelivered, foldSeeded: group.foldSeeded, wires: answered };
|
|
272
|
+
store.awaiting.begin(group.awaiting);
|
|
273
|
+
let posted;
|
|
274
|
+
try {
|
|
275
|
+
posted = await sendLegs(k, [planned], baseRequest, { rollback: false, mount: true }, answered[0]?.response ?? outcome.seeds[0].local);
|
|
276
|
+
} finally {
|
|
277
|
+
store.awaiting.end(group.awaiting.map((a) => a.trait));
|
|
278
|
+
}
|
|
279
|
+
outcome.posted = true;
|
|
280
|
+
outcome.success = outcome.success && posted.success;
|
|
281
|
+
if (posted.error !== void 0) outcome.error = posted.error;
|
|
282
|
+
outcome.rejections.push(...posted.rejections);
|
|
283
|
+
outcome.serverEffects.clientEffects?.push(...posted.serverEffects.clientEffects ?? []);
|
|
284
|
+
outcome.serverEffects.clientEffectsByTrait?.push(...posted.serverEffects.clientEffectsByTrait ?? []);
|
|
285
|
+
outcome.emittedEvents.push(...posted.foldedEmits);
|
|
286
|
+
}
|
|
287
|
+
return outcome;
|
|
288
|
+
}),
|
|
289
|
+
routeMounts: async (routePath) => parse((await ready).routeMounts(routePath)),
|
|
290
|
+
remount: (traits) => declareScope((k) => k.remount(JSON.stringify(traits))),
|
|
291
|
+
mount: (traits) => declareScope((k) => k.mount(JSON.stringify(traits))),
|
|
292
|
+
unmount: (traits) => declareScope((k) => k.unmount(JSON.stringify(traits))),
|
|
293
|
+
frame: async (nowMs) => {
|
|
294
|
+
const k = await ready;
|
|
295
|
+
await scopeTail;
|
|
296
|
+
return (await runTickFrame(tickPorts(k), () => nowMs)).outcomes;
|
|
297
|
+
},
|
|
298
|
+
framePause: () => loaded?.framePause(),
|
|
299
|
+
frameResume: () => loaded?.frameResume(),
|
|
300
|
+
startFrames: (onFrame, schedule = defaultFrameScheduler) => {
|
|
301
|
+
const presence = getTraitPresence();
|
|
302
|
+
const releases = visibleGroups.map(([, group]) => presence.watch(group));
|
|
303
|
+
let stopped = false;
|
|
304
|
+
let latestMs = 0;
|
|
305
|
+
let nextHandle = 0;
|
|
306
|
+
const cancels = /* @__PURE__ */ new Map();
|
|
307
|
+
const visibility = {
|
|
308
|
+
hidden: () => document.visibilityState === "hidden",
|
|
309
|
+
onChange: (listener) => {
|
|
310
|
+
document.addEventListener("visibilitychange", listener);
|
|
311
|
+
return () => document.removeEventListener("visibilitychange", listener);
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
let driver;
|
|
315
|
+
ready.then(async (k) => {
|
|
316
|
+
await scopeTail;
|
|
317
|
+
if (stopped) return;
|
|
318
|
+
driver = createTickDriver({
|
|
319
|
+
...tickPorts(k),
|
|
320
|
+
now: () => latestMs,
|
|
321
|
+
requestFrame: (callback) => {
|
|
322
|
+
nextHandle += 1;
|
|
323
|
+
const handle = nextHandle;
|
|
324
|
+
cancels.set(handle, schedule((nowMs) => {
|
|
325
|
+
cancels.delete(handle);
|
|
326
|
+
latestMs = nowMs;
|
|
327
|
+
callback(nowMs);
|
|
328
|
+
}));
|
|
329
|
+
return handle;
|
|
330
|
+
},
|
|
331
|
+
cancelFrame: (handle) => {
|
|
332
|
+
cancels.get(handle)?.();
|
|
333
|
+
cancels.delete(handle);
|
|
334
|
+
},
|
|
335
|
+
visibility,
|
|
336
|
+
onApplied: (applied) => {
|
|
337
|
+
if (!stopped && applied.outcomes.length > 0) onFrame(applied.outcomes);
|
|
338
|
+
},
|
|
339
|
+
onError: (error) => log.error("kernel-frame-failed", { error: error.message })
|
|
340
|
+
});
|
|
341
|
+
driver.start();
|
|
342
|
+
}).catch((error) => log.error("kernel-frame-failed", { error: error.message }));
|
|
343
|
+
return () => {
|
|
344
|
+
stopped = true;
|
|
345
|
+
driver?.stop();
|
|
346
|
+
releases.forEach((release) => release());
|
|
347
|
+
};
|
|
348
|
+
},
|
|
349
|
+
traitState: (traitName) => loaded?.getState(traitName),
|
|
350
|
+
traitConfig: (traitName) => {
|
|
351
|
+
if (loaded === void 0) return void 0;
|
|
352
|
+
const held = configs.get(traitName);
|
|
353
|
+
if (held !== void 0) return held;
|
|
354
|
+
const config = parse(loaded.traitConfig(traitName));
|
|
355
|
+
configs.set(traitName, config);
|
|
356
|
+
return config;
|
|
357
|
+
},
|
|
358
|
+
setViewer: async (user) => {
|
|
359
|
+
const k = await ready;
|
|
360
|
+
k.setCurrentUser(JSON.stringify(user));
|
|
361
|
+
configs.clear();
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
return client;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
export { createKernelClient };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { OrbitalSchema } from '@almadar/core';
|
|
2
|
+
import { KernelModule as KernelModule$1 } from '@almadar/shell-runtime/kernel/wire';
|
|
3
|
+
import './verification-C5pTeMJv.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The `Kernel` class surface of `@almadar/kernel` (JSON strings in, JSON strings out). The wire data it
|
|
7
|
+
* speaks (`DispatchWire`, `AppliedWire`, `FrameWire`, ...) is imported from `@almadar/core/kernel-wire`.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/** The `Kernel` class `@almadar/kernel` exports: JSON strings in, JSON strings out. */
|
|
13
|
+
interface KernelInstance {
|
|
14
|
+
dispatch(traitName: string, entityId: string | undefined, event: string, payloadJson?: string): string;
|
|
15
|
+
applyServerResponse(responseJson: string, alreadyDeliveredJson?: string, baseJson?: string): string;
|
|
16
|
+
/** The rows a posted leg's answer is folded against; `undefined` when the leg carried none. */
|
|
17
|
+
/** The leg as a host that holds the circuit state takes it: only the `[shared]` frame rows its traits read. */
|
|
18
|
+
statefulLeg(legJson: string): string;
|
|
19
|
+
foldBase(carriedJson: string | undefined, seededJson: string, entityId?: string): string | undefined;
|
|
20
|
+
dispatchMount(seedsJson: string, entityId?: string, payloadJson?: string): string;
|
|
21
|
+
restore(traitName: string, entityId: string | undefined, snapshotJson: string): string;
|
|
22
|
+
tick(traitName: string, tickName: string, entityId?: string): string;
|
|
23
|
+
frame(nowMs: number): string | undefined;
|
|
24
|
+
framePause(): void;
|
|
25
|
+
frameResume(): void;
|
|
26
|
+
tickCount(): number;
|
|
27
|
+
/** The kernel's dispatch mode for a registered trait (`DispatchMode` as JSON text); throws for an unregistered one. */
|
|
28
|
+
dispatchMode(traitName: string): string;
|
|
29
|
+
/** The config the kernel binds as `@config` for a registered trait (JSON text); throws for an unregistered one. */
|
|
30
|
+
traitConfig(traitName: string): string;
|
|
31
|
+
getState(traitName: string, entityId?: string): string;
|
|
32
|
+
setCurrentUser(userJson: string): void;
|
|
33
|
+
/** The viewer's locales (`string[]`, the first is painted) and their catalogs (`{ [locale]: { [key]: text } }`) for `i18n/t`. */
|
|
34
|
+
setMessages(localesJson: string, catalogsJson: string): void;
|
|
35
|
+
/** The host runs the listeners of every emit it marks `dispatched` (the JS runtime, `orbital-server`). */
|
|
36
|
+
setHostFansOut(fansOut: boolean): void;
|
|
37
|
+
/** Carry each hop's `@entity` before and after it on the dispatch's transitions, for a verifier (EXEC-STEP-10). */
|
|
38
|
+
setRecordEntityAfter(record: boolean): void;
|
|
39
|
+
/** The kernel's mounts for a host start on `side` (`client|server|process|start`): `MountSeed[]` as JSON. */
|
|
40
|
+
bootMounts(side: string): string;
|
|
41
|
+
/** The kernel's mounts for a client opening `routePath`: `MountSeed[]` as JSON. */
|
|
42
|
+
routeMounts(routePath: string): string;
|
|
43
|
+
mount(traitsJson: string): void;
|
|
44
|
+
remount(traitsJson: string): void;
|
|
45
|
+
unmount(traitsJson: string): void;
|
|
46
|
+
/** The host's report of whether a trait's rendered output is on screen; gates its `[visible]` ticks. */
|
|
47
|
+
setTraitOnScreen(traitName: string, onScreen: boolean): void;
|
|
48
|
+
seed(entityType: string, rowsJson: string): void;
|
|
49
|
+
free(): void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* What a host's loader resolves: the `@almadar/kernel` module with its WebAssembly already
|
|
53
|
+
* initialised (`await init()` in a browser, `initSync` in Node). `@almadar/ui` never imports the
|
|
54
|
+
* package itself, so the default bundle carries none of it.
|
|
55
|
+
*/
|
|
56
|
+
interface KernelModule extends KernelModule$1 {
|
|
57
|
+
Kernel: new (resolvedSchemaJson: string, clientId: string) => KernelInstance;
|
|
58
|
+
}
|
|
59
|
+
type KernelLoader = () => Promise<KernelModule>;
|
|
60
|
+
/** Resolves the language bundle (`@almadar/core/language-data` `LanguageBundle`) as JSON text, for a kernel a browser opens over a local store. */
|
|
61
|
+
type LanguageLoader = () => Promise<string>;
|
|
62
|
+
/** Resolves the std `std-mock-seed` program (an already-resolved schema) that seeds a mock or browser store. */
|
|
63
|
+
type SeedProgramLoader = () => Promise<OrbitalSchema>;
|
|
64
|
+
|
|
65
|
+
export type { KernelModule as K, LanguageLoader as L, SeedProgramLoader as S, KernelLoader as a, KernelInstance as b };
|