@astrale-os/shell 0.1.1 → 0.2.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 +202 -0
- package/dist/application/apps.d.ts +18 -0
- package/dist/application/apps.d.ts.map +1 -0
- package/dist/application/apps.js +35 -0
- package/dist/application/namespaces.d.ts +21 -0
- package/dist/application/namespaces.d.ts.map +1 -0
- package/dist/application/namespaces.js +12 -0
- package/dist/application/session/open.d.ts +19 -0
- package/dist/application/session/open.d.ts.map +1 -0
- package/dist/application/session/open.js +46 -0
- package/dist/application/session/session.d.ts +41 -0
- package/dist/application/session/session.d.ts.map +1 -0
- package/dist/application/session/session.js +9 -0
- package/dist/application/session/token.d.ts +24 -0
- package/dist/application/session/token.d.ts.map +1 -0
- package/dist/application/session/token.js +51 -0
- package/dist/application/spaces.d.ts +17 -0
- package/dist/application/spaces.d.ts.map +1 -0
- package/dist/application/spaces.js +30 -0
- package/dist/application/user.d.ts +20 -0
- package/dist/application/user.d.ts.map +1 -0
- package/dist/application/user.js +26 -0
- package/dist/application/view.d.ts +20 -0
- package/dist/application/view.d.ts.map +1 -0
- package/dist/application/view.js +18 -0
- package/dist/{application/channels/children-channel.d.ts → channel/children.d.ts} +4 -4
- package/dist/channel/children.d.ts.map +1 -0
- package/dist/channel/listeners.d.ts +8 -0
- package/dist/channel/listeners.d.ts.map +1 -0
- package/dist/{adapters/message-port.transport.d.ts → channel/message-port.d.ts} +2 -2
- package/dist/channel/message-port.d.ts.map +1 -0
- package/dist/{application/channels → channel}/observer.d.ts +2 -1
- package/dist/channel/observer.d.ts.map +1 -0
- package/dist/{application/channels/parent-channel.d.ts → channel/parent.d.ts} +4 -4
- package/dist/channel/parent.d.ts.map +1 -0
- package/dist/{application/channels/parent-channel.js → channel/parent.js} +1 -1
- package/dist/channel/transport.d.ts +8 -0
- package/dist/channel/transport.d.ts.map +1 -0
- package/dist/index.d.ts +56 -41
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -20
- package/dist/{domain/intent → intent}/middleware/capabilities.d.ts +2 -2
- package/dist/intent/middleware/capabilities.d.ts.map +1 -0
- package/dist/intent/middleware/logging.d.ts.map +1 -0
- package/dist/{domain/intent → intent}/middleware/rate-limit.d.ts +1 -1
- package/dist/intent/middleware/rate-limit.d.ts.map +1 -0
- package/dist/{application/intent/pipeline-runner.d.ts → intent/pipeline.d.ts} +3 -3
- package/dist/intent/pipeline.d.ts.map +1 -0
- package/dist/intent/policy.d.ts +40 -0
- package/dist/intent/policy.d.ts.map +1 -0
- package/dist/intent/policy.js +15 -0
- package/dist/{application/intent → intent}/request.d.ts +5 -14
- package/dist/intent/request.d.ts.map +1 -0
- package/dist/{application/intent → intent}/request.js +6 -20
- package/dist/intent/router.d.ts +31 -0
- package/dist/intent/router.d.ts.map +1 -0
- package/dist/{application/intent → intent}/router.js +1 -15
- package/dist/kernel/client.d.ts +33 -0
- package/dist/kernel/client.d.ts.map +1 -0
- package/dist/kernel/credential.d.ts +35 -0
- package/dist/kernel/credential.d.ts.map +1 -0
- package/dist/kernel/credential.js +43 -0
- package/dist/kernel/delegated.d.ts +17 -0
- package/dist/kernel/delegated.d.ts.map +1 -0
- package/dist/kernel/delegated.js +29 -0
- package/dist/{application/windowing/token-refresh.d.ts → kernel/delegation/refresh.d.ts} +2 -2
- package/dist/kernel/delegation/refresh.d.ts.map +1 -0
- package/dist/{application/windowing/token-refresh.js → kernel/delegation/refresh.js} +1 -1
- package/dist/{domain/identity/delegation.d.ts → kernel/delegation/token.d.ts} +1 -1
- package/dist/kernel/delegation/token.d.ts.map +1 -0
- package/dist/{adapters/kernel-client.adapter.d.ts → kernel/session.d.ts} +15 -12
- package/dist/kernel/session.d.ts.map +1 -0
- package/dist/{adapters/kernel-client.adapter.js → kernel/session.js} +10 -15
- package/dist/message/ctrl.d.ts +34 -0
- package/dist/message/ctrl.d.ts.map +1 -0
- package/dist/message/error.d.ts +9 -0
- package/dist/message/error.d.ts.map +1 -0
- package/dist/{application/windowing/protocol.d.ts → message/init.d.ts} +1 -1
- package/dist/message/init.d.ts.map +1 -0
- package/dist/{domain/message/registries.d.ts → message/intent.d.ts} +45 -37
- package/dist/message/intent.d.ts.map +1 -0
- package/dist/message/message.d.ts +10 -0
- package/dist/message/message.d.ts.map +1 -0
- package/dist/shell/access.d.ts +10 -0
- package/dist/shell/access.d.ts.map +1 -0
- package/dist/shell/access.js +19 -0
- package/dist/shell/build.d.ts +28 -0
- package/dist/shell/build.d.ts.map +1 -0
- package/dist/shell/build.js +58 -0
- package/dist/shell/config.d.ts +29 -0
- package/dist/shell/config.d.ts.map +1 -0
- package/dist/shell/create.d.ts +4 -0
- package/dist/shell/create.d.ts.map +1 -0
- package/dist/shell/create.js +5 -0
- package/dist/{application/windowing/child-init.d.ts → shell/sandboxed/boot.d.ts} +5 -5
- package/dist/shell/sandboxed/boot.d.ts.map +1 -0
- package/dist/{application/windowing/child-init.js → shell/sandboxed/boot.js} +5 -6
- package/dist/shell/sandboxed/guarded.d.ts +13 -0
- package/dist/shell/sandboxed/guarded.d.ts.map +1 -0
- package/dist/shell/sandboxed/guarded.js +28 -0
- package/dist/shell/sandboxed/pending.d.ts +14 -0
- package/dist/shell/sandboxed/pending.d.ts.map +1 -0
- package/dist/shell/sandboxed/pending.js +30 -0
- package/dist/shell/sandboxed/sandboxed.d.ts +4 -0
- package/dist/shell/sandboxed/sandboxed.d.ts.map +1 -0
- package/dist/shell/sandboxed/sandboxed.js +100 -0
- package/dist/shell/shell.d.ts +36 -0
- package/dist/shell/shell.d.ts.map +1 -0
- package/dist/shell/standalone.d.ts +4 -0
- package/dist/shell/standalone.d.ts.map +1 -0
- package/dist/shell/standalone.js +85 -0
- package/dist/{domain/window/config.d.ts → window/capabilities.d.ts} +3 -3
- package/dist/window/capabilities.d.ts.map +1 -0
- package/dist/{ports/shell-adapter.d.ts → window/embed/adapter.d.ts} +3 -2
- package/dist/window/embed/adapter.d.ts.map +1 -0
- package/dist/{adapters/iframe.shell-adapter.d.ts → window/embed/iframe.d.ts} +2 -2
- package/dist/window/embed/iframe.d.ts.map +1 -0
- package/dist/{application/windowing/lifecycle-controller.d.ts → window/lifecycle/states.d.ts} +4 -3
- package/dist/window/lifecycle/states.d.ts.map +1 -0
- package/dist/{application/windowing/lifecycle-controller.js → window/lifecycle/states.js} +1 -1
- package/dist/{domain/window/lifecycle.d.ts → window/lifecycle/transition.d.ts} +3 -3
- package/dist/window/lifecycle/transition.d.ts.map +1 -0
- package/dist/{domain/window/lifecycle.js → window/lifecycle/transition.js} +1 -1
- package/dist/window/mount/close.d.ts +27 -0
- package/dist/window/mount/close.d.ts.map +1 -0
- package/dist/window/mount/close.js +74 -0
- package/dist/window/mount/credential.d.ts +41 -0
- package/dist/window/mount/credential.d.ts.map +1 -0
- package/dist/window/mount/credential.js +74 -0
- package/dist/window/mount/handshake.d.ts.map +1 -0
- package/dist/{application/windowing → window/mount}/handshake.js +1 -1
- package/dist/{application/windowing/mount-controller.d.ts → window/mount/mount.d.ts} +7 -7
- package/dist/window/mount/mount.d.ts.map +1 -0
- package/dist/window/mount/mount.js +143 -0
- package/dist/window/mount/params.d.ts +73 -0
- package/dist/window/mount/params.d.ts.map +1 -0
- package/dist/window/mount/params.js +1 -0
- package/dist/window/mount/plain.d.ts +20 -0
- package/dist/window/mount/plain.d.ts.map +1 -0
- package/dist/window/mount/plain.js +46 -0
- package/dist/{domain/window → window}/window.d.ts +1 -1
- package/dist/window/window.d.ts.map +1 -0
- package/dist/window/window.js +1 -0
- package/package.json +11 -6
- package/src/application/apps.ts +60 -0
- package/src/application/namespaces.ts +38 -0
- package/src/application/session/open.ts +73 -0
- package/src/application/session/session.ts +46 -0
- package/src/application/session/token.ts +87 -0
- package/src/application/spaces.ts +52 -0
- package/src/application/user.ts +54 -0
- package/src/application/view.ts +42 -0
- package/src/{application/channels/children-channel.ts → channel/children.ts} +3 -3
- package/src/{application/channels/types.ts → channel/listeners.ts} +2 -7
- package/src/{adapters/message-port.transport.ts → channel/message-port.ts} +2 -2
- package/src/{application/channels → channel}/observer.ts +2 -1
- package/src/{application/channels/parent-channel.ts → channel/parent.ts} +4 -4
- package/src/{ports → channel}/transport.ts +2 -1
- package/src/index.ts +80 -88
- package/src/{domain/intent → intent}/middleware/capabilities.ts +2 -3
- package/src/{domain/intent → intent}/middleware/logging.ts +1 -1
- package/src/{domain/intent → intent}/middleware/rate-limit.ts +1 -1
- package/src/{application/intent/pipeline-runner.ts → intent/pipeline.ts} +3 -2
- package/src/intent/policy.ts +46 -0
- package/src/{application/intent → intent}/request.ts +14 -34
- package/src/{application/intent → intent}/router.ts +12 -49
- package/src/kernel/client.ts +33 -0
- package/src/kernel/credential.ts +78 -0
- package/src/kernel/delegated.ts +49 -0
- package/src/{application/windowing/token-refresh.ts → kernel/delegation/refresh.ts} +2 -2
- package/src/{adapters/kernel-client.adapter.ts → kernel/session.ts} +26 -33
- package/src/message/ctrl.ts +25 -0
- package/src/{domain/message/errors.ts → message/error.ts} +8 -0
- package/src/message/intent.ts +98 -0
- package/src/message/message.ts +11 -0
- package/src/shell/access.ts +26 -0
- package/src/shell/build.ts +95 -0
- package/src/shell/config.ts +32 -0
- package/src/shell/create.ts +9 -0
- package/src/{application/windowing/child-init.ts → shell/sandboxed/boot.ts} +10 -11
- package/src/shell/sandboxed/guarded.ts +32 -0
- package/src/shell/sandboxed/pending.ts +52 -0
- package/src/shell/sandboxed/sandboxed.ts +131 -0
- package/src/shell/shell.ts +37 -0
- package/src/shell/standalone.ts +97 -0
- package/src/{domain/window/config.ts → window/capabilities.ts} +2 -2
- package/src/{ports/shell-adapter.ts → window/embed/adapter.ts} +2 -1
- package/src/{adapters/iframe.shell-adapter.ts → window/embed/iframe.ts} +2 -2
- package/src/{application/windowing/lifecycle-controller.ts → window/lifecycle/states.ts} +3 -2
- package/src/{domain/window/lifecycle.ts → window/lifecycle/transition.ts} +2 -2
- package/src/window/mount/close.ts +111 -0
- package/src/window/mount/credential.ts +101 -0
- package/src/{application/windowing → window/mount}/handshake.ts +3 -2
- package/src/window/mount/mount.ts +185 -0
- package/src/window/mount/params.ts +64 -0
- package/src/window/mount/plain.ts +68 -0
- package/src/{domain/window → window}/window.ts +1 -1
- package/dist/adapters/iframe.shell-adapter.d.ts.map +0 -1
- package/dist/adapters/kernel-client.adapter.d.ts.map +0 -1
- package/dist/adapters/message-port.transport.d.ts.map +0 -1
- package/dist/application/channels/children-channel.d.ts.map +0 -1
- package/dist/application/channels/observer.d.ts.map +0 -1
- package/dist/application/channels/parent-channel.d.ts.map +0 -1
- package/dist/application/channels/types.d.ts +0 -12
- package/dist/application/channels/types.d.ts.map +0 -1
- package/dist/application/intent/pipeline-runner.d.ts.map +0 -1
- package/dist/application/intent/request.d.ts.map +0 -1
- package/dist/application/intent/router.d.ts +0 -56
- package/dist/application/intent/router.d.ts.map +0 -1
- package/dist/application/kernel-facade.d.ts +0 -33
- package/dist/application/kernel-facade.d.ts.map +0 -1
- package/dist/application/kernel-facade.js +0 -77
- package/dist/application/shell.d.ts +0 -100
- package/dist/application/shell.d.ts.map +0 -1
- package/dist/application/shell.js +0 -256
- package/dist/application/windowing/child-init.d.ts.map +0 -1
- package/dist/application/windowing/handshake.d.ts.map +0 -1
- package/dist/application/windowing/lifecycle-controller.d.ts.map +0 -1
- package/dist/application/windowing/mount-controller.d.ts.map +0 -1
- package/dist/application/windowing/mount-controller.js +0 -277
- package/dist/application/windowing/protocol.d.ts.map +0 -1
- package/dist/application/windowing/token-refresh.d.ts.map +0 -1
- package/dist/domain/identity/delegation.d.ts.map +0 -1
- package/dist/domain/identity/path.d.ts +0 -11
- package/dist/domain/identity/path.d.ts.map +0 -1
- package/dist/domain/identity/path.js +0 -13
- package/dist/domain/identity/resolve-self.d.ts +0 -21
- package/dist/domain/identity/resolve-self.d.ts.map +0 -1
- package/dist/domain/identity/resolve-self.js +0 -36
- package/dist/domain/intent/middleware/capabilities.d.ts.map +0 -1
- package/dist/domain/intent/middleware/logging.d.ts.map +0 -1
- package/dist/domain/intent/middleware/rate-limit.d.ts.map +0 -1
- package/dist/domain/intent/pipeline.d.ts +0 -3
- package/dist/domain/intent/pipeline.d.ts.map +0 -1
- package/dist/domain/intent/router.d.ts +0 -6
- package/dist/domain/intent/router.d.ts.map +0 -1
- package/dist/domain/message/errors.d.ts +0 -2
- package/dist/domain/message/errors.d.ts.map +0 -1
- package/dist/domain/message/registries.d.ts.map +0 -1
- package/dist/domain/message/types.d.ts +0 -30
- package/dist/domain/message/types.d.ts.map +0 -1
- package/dist/domain/window/config.d.ts.map +0 -1
- package/dist/domain/window/lifecycle.d.ts.map +0 -1
- package/dist/domain/window/window.d.ts.map +0 -1
- package/dist/ports/kernel-client.d.ts +0 -33
- package/dist/ports/kernel-client.d.ts.map +0 -1
- package/dist/ports/shell-adapter.d.ts.map +0 -1
- package/dist/ports/transport.d.ts +0 -7
- package/dist/ports/transport.d.ts.map +0 -1
- package/src/application/kernel-facade.ts +0 -143
- package/src/application/shell.ts +0 -433
- package/src/application/windowing/mount-controller.ts +0 -335
- package/src/domain/identity/path.ts +0 -14
- package/src/domain/identity/resolve-self.ts +0 -38
- package/src/domain/intent/pipeline.ts +0 -3
- package/src/domain/intent/router.ts +0 -6
- package/src/domain/message/registries.ts +0 -76
- package/src/domain/message/types.ts +0 -32
- package/src/ports/kernel-client.ts +0 -32
- /package/dist/{application/channels/children-channel.js → channel/children.js} +0 -0
- /package/dist/{application/channels/types.js → channel/listeners.js} +0 -0
- /package/dist/{adapters/message-port.transport.js → channel/message-port.js} +0 -0
- /package/dist/{application/channels → channel}/observer.js +0 -0
- /package/dist/{ports → channel}/transport.js +0 -0
- /package/dist/{domain/intent → intent}/middleware/capabilities.js +0 -0
- /package/dist/{domain/intent → intent}/middleware/logging.d.ts +0 -0
- /package/dist/{domain/intent → intent}/middleware/logging.js +0 -0
- /package/dist/{domain/intent → intent}/middleware/rate-limit.js +0 -0
- /package/dist/{application/intent/pipeline-runner.js → intent/pipeline.js} +0 -0
- /package/dist/{domain/intent/pipeline.js → kernel/client.js} +0 -0
- /package/dist/{domain/identity/delegation.js → kernel/delegation/token.js} +0 -0
- /package/dist/{domain/intent/router.js → message/ctrl.js} +0 -0
- /package/dist/{domain/message/errors.js → message/error.js} +0 -0
- /package/dist/{application/windowing/protocol.js → message/init.js} +0 -0
- /package/dist/{domain/message/registries.js → message/intent.js} +0 -0
- /package/dist/{domain/message/types.js → message/message.js} +0 -0
- /package/dist/{domain/window → shell}/config.js +0 -0
- /package/dist/{domain/window/window.js → shell/shell.js} +0 -0
- /package/dist/{ports/kernel-client.js → window/capabilities.js} +0 -0
- /package/dist/{ports/shell-adapter.js → window/embed/adapter.js} +0 -0
- /package/dist/{adapters/iframe.shell-adapter.js → window/embed/iframe.js} +0 -0
- /package/dist/{application/windowing → window/mount}/handshake.d.ts +0 -0
- /package/src/{domain/identity/delegation.ts → kernel/delegation/token.ts} +0 -0
- /package/src/{application/windowing/protocol.ts → message/init.ts} +0 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createOsNamespaces } from '../application/namespaces';
|
|
2
|
+
/** Assemble the Shell object shared by both modes from their wired parts. */
|
|
3
|
+
export function buildShellFacade(deps) {
|
|
4
|
+
let disposed = false;
|
|
5
|
+
// The OS namespaces are lazy over the kernel proxy: constructing them touches
|
|
6
|
+
// no kernel, so the sandboxed shell's "init() first" guard fires only when a
|
|
7
|
+
// namespace method actually dispatches.
|
|
8
|
+
let os = null;
|
|
9
|
+
const osNamespaces = () => (os ??= createOsNamespaces(deps.kernel));
|
|
10
|
+
const shell = {
|
|
11
|
+
get parent() {
|
|
12
|
+
return deps.parent;
|
|
13
|
+
},
|
|
14
|
+
children: deps.childrenChannel,
|
|
15
|
+
kernel: deps.kernel,
|
|
16
|
+
windows: deps.windows,
|
|
17
|
+
get targetNodeId() {
|
|
18
|
+
return deps.targetNodeId?.();
|
|
19
|
+
},
|
|
20
|
+
get user() {
|
|
21
|
+
return osNamespaces().user;
|
|
22
|
+
},
|
|
23
|
+
get spaces() {
|
|
24
|
+
return osNamespaces().spaces;
|
|
25
|
+
},
|
|
26
|
+
get apps() {
|
|
27
|
+
return osNamespaces().apps;
|
|
28
|
+
},
|
|
29
|
+
use(middleware) {
|
|
30
|
+
deps.pipeline.use(middleware);
|
|
31
|
+
return shell;
|
|
32
|
+
},
|
|
33
|
+
onMessage(handler) {
|
|
34
|
+
return deps.observer.subscribe(handler);
|
|
35
|
+
},
|
|
36
|
+
onIntent(name, handler) {
|
|
37
|
+
return deps.onIntent(name, handler);
|
|
38
|
+
},
|
|
39
|
+
mount(params) {
|
|
40
|
+
return deps.getMountController().mount(params);
|
|
41
|
+
},
|
|
42
|
+
close(windowId, opts) {
|
|
43
|
+
return deps.getMountController().close(windowId, opts);
|
|
44
|
+
},
|
|
45
|
+
async init() {
|
|
46
|
+
if (deps.init)
|
|
47
|
+
await deps.init();
|
|
48
|
+
return shell;
|
|
49
|
+
},
|
|
50
|
+
async dispose() {
|
|
51
|
+
if (disposed)
|
|
52
|
+
return;
|
|
53
|
+
disposed = true;
|
|
54
|
+
await deps.onDispose();
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return shell;
|
|
58
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FunctionSchema } from '@astrale-os/kernel-client';
|
|
2
|
+
import type { ShellAdapter } from '../window/embed/adapter';
|
|
3
|
+
export type StandaloneConfig = {
|
|
4
|
+
readonly mode: 'standalone';
|
|
5
|
+
readonly kernelUrl: string;
|
|
6
|
+
readonly credential?: string;
|
|
7
|
+
readonly getCredential?: () => string;
|
|
8
|
+
readonly mintIdentity?: string;
|
|
9
|
+
readonly schema?: FunctionSchema[];
|
|
10
|
+
readonly adapter?: ShellAdapter;
|
|
11
|
+
readonly windowId?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Optional wire-layer `fetch` shim for the kernel transport. A cookie-fronted
|
|
14
|
+
* SPA passes a wrapper adding `credentials:'include'` + refresh-on-401 and an
|
|
15
|
+
* empty `credential`, so a router unseals the cookie into a Bearer (the SPA
|
|
16
|
+
* holds no token). Omit it (the default) for token-based callers — including
|
|
17
|
+
* every sandboxed child view, which authenticates with a delegation token.
|
|
18
|
+
*/
|
|
19
|
+
readonly fetch?: typeof fetch;
|
|
20
|
+
};
|
|
21
|
+
export type SandboxedConfig = {
|
|
22
|
+
readonly mode: 'sandboxed';
|
|
23
|
+
readonly schema?: FunctionSchema[];
|
|
24
|
+
readonly parentWindow?: WindowProxy;
|
|
25
|
+
readonly initTimeoutMs?: number;
|
|
26
|
+
readonly adapter?: ShellAdapter;
|
|
27
|
+
};
|
|
28
|
+
export type ShellConfig = StandaloneConfig | SandboxedConfig;
|
|
29
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/shell/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,MAAM,CAAA;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,CAAA;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/shell/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpC,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAEtD"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { FunctionSchema } from '@astrale-os/kernel-client';
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import { type DelegationKernelFacadeController } from '
|
|
2
|
+
import type { MessageObserver } from '../../channel/observer';
|
|
3
|
+
import type { ParentChannelController } from '../../channel/parent';
|
|
4
|
+
import type { DelegationToken } from '../../kernel/delegation/token';
|
|
5
|
+
import { type DelegationKernelFacadeController } from '../../kernel/delegated';
|
|
6
6
|
export type ChildInitParams = {
|
|
7
7
|
readonly parent: WindowProxy;
|
|
8
8
|
readonly timeoutMs?: number;
|
|
@@ -20,4 +20,4 @@ export type ChildInitResult = {
|
|
|
20
20
|
};
|
|
21
21
|
/** Child-side init: post INIT_REQUEST, receive MessagePort + ctrl:handshake, ack. */
|
|
22
22
|
export declare function performChildInit(params: ChildInitParams): Promise<ChildInitResult>;
|
|
23
|
-
//# sourceMappingURL=
|
|
23
|
+
//# sourceMappingURL=boot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../../../src/shell/sandboxed/boot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAKpE,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,wBAAwB,CAAA;AAI/B,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,uBAAuB,CAAA;IAC9E,QAAQ,CAAC,MAAM,EAAE,gCAAgC,CAAA;IACjD,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAA;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAC/B,CAAA;AAID,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAmGlF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { INIT_REQUEST_TYPE, isInitResponse } from '
|
|
1
|
+
import { createMessagePortTransport } from '../../channel/message-port';
|
|
2
|
+
import { createParentChannel } from '../../channel/parent';
|
|
3
|
+
import { createDelegationKernelFacade, } from '../../kernel/delegated';
|
|
4
|
+
import { createKernelClientAdapter } from '../../kernel/session';
|
|
5
|
+
import { INIT_REQUEST_TYPE, isInitResponse } from '../../message/init';
|
|
6
6
|
const DEFAULT_TIMEOUT = 5_000;
|
|
7
7
|
/** Child-side init: post INIT_REQUEST, receive MessagePort + ctrl:handshake, ack. */
|
|
8
8
|
export function performChildInit(params) {
|
|
@@ -44,7 +44,6 @@ export function performChildInit(params) {
|
|
|
44
44
|
url: data.kernelUrl,
|
|
45
45
|
schema: params.schema,
|
|
46
46
|
getCredential: () => currentToken.credential,
|
|
47
|
-
mintIdentity: data.mintIdentity,
|
|
48
47
|
});
|
|
49
48
|
const kernel = createDelegationKernelFacade({
|
|
50
49
|
adapter,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ParentChannel, ParentChannelController } from '../../channel/parent';
|
|
2
|
+
import type { KernelClient } from '../../kernel/client';
|
|
3
|
+
/** Throw the canonical "call init() first" error while `get()` has no state yet. */
|
|
4
|
+
export declare function requireInit<T>(get: () => T | null): T;
|
|
5
|
+
/**
|
|
6
|
+
* Forward the whole unified kernel surface (graph sugar + `.call/.stream/…` +
|
|
7
|
+
* the shell extras) to the post-init facade lazily, so the "init() first"
|
|
8
|
+
* guard applies uniformly to every member without re-declaring each one.
|
|
9
|
+
*/
|
|
10
|
+
export declare function guardedKernel(require: () => KernelClient): KernelClient;
|
|
11
|
+
/** Same guard for the parent channel — throws on use until `init()` resolves. */
|
|
12
|
+
export declare function guardedParent(require: () => ParentChannelController): ParentChannel;
|
|
13
|
+
//# sourceMappingURL=guarded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guarded.d.ts","sourceRoot":"","sources":["../../../src/shell/sandboxed/guarded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,CAIrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,YAAY,GAAG,YAAY,CAQvE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,uBAAuB,GAAG,aAAa,CAKnF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Throw the canonical "call init() first" error while `get()` has no state yet. */
|
|
2
|
+
export function requireInit(get) {
|
|
3
|
+
const state = get();
|
|
4
|
+
if (!state)
|
|
5
|
+
throw new Error('Sandboxed shell not initialized — call shell.init() first');
|
|
6
|
+
return state;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Forward the whole unified kernel surface (graph sugar + `.call/.stream/…` +
|
|
10
|
+
* the shell extras) to the post-init facade lazily, so the "init() first"
|
|
11
|
+
* guard applies uniformly to every member without re-declaring each one.
|
|
12
|
+
*/
|
|
13
|
+
export function guardedKernel(require) {
|
|
14
|
+
return new Proxy({}, {
|
|
15
|
+
get(_target, prop) {
|
|
16
|
+
const kernel = require();
|
|
17
|
+
const value = kernel[prop];
|
|
18
|
+
return typeof value === 'function' ? value.bind(kernel) : value;
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Same guard for the parent channel — throws on use until `init()` resolves. */
|
|
23
|
+
export function guardedParent(require) {
|
|
24
|
+
return {
|
|
25
|
+
send: (message) => require().send(message),
|
|
26
|
+
on: (type, handler) => require().on(type, handler),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IntentRouterController, LocalIntentHandler } from '../../intent/router';
|
|
2
|
+
import type { IntentRegistry } from '../../message/intent';
|
|
3
|
+
/**
|
|
4
|
+
* Buffer intent subscriptions made before `init()` resolves — the router is
|
|
5
|
+
* only built once the handshake completes, but consumers want to call
|
|
6
|
+
* `onIntent` at construction time.
|
|
7
|
+
*/
|
|
8
|
+
export interface PendingIntentSubs {
|
|
9
|
+
add<K extends keyof IntentRegistry>(name: K, handler: LocalIntentHandler<K>): () => void;
|
|
10
|
+
/** Register the buffered subscriptions on the real router, then drain. */
|
|
11
|
+
replay(router: IntentRouterController): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function createPendingIntentSubs(): PendingIntentSubs;
|
|
14
|
+
//# sourceMappingURL=pending.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending.d.ts","sourceRoot":"","sources":["../../../src/shell/sandboxed/pending.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IACxF,0EAA0E;IAC1E,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAA;CAC7C;AASD,wBAAgB,uBAAuB,IAAI,iBAAiB,CA8B3D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export function createPendingIntentSubs() {
|
|
2
|
+
const entries = [];
|
|
3
|
+
return {
|
|
4
|
+
add(name, handler) {
|
|
5
|
+
const entry = {
|
|
6
|
+
name: name,
|
|
7
|
+
handler: handler,
|
|
8
|
+
unsubscribed: false,
|
|
9
|
+
};
|
|
10
|
+
entries.push(entry);
|
|
11
|
+
return () => {
|
|
12
|
+
entry.unsubscribed = true;
|
|
13
|
+
// After init, `off` is the router's real disposer (set during replay);
|
|
14
|
+
// before init, flipping `unsubscribed` is enough (replay skips it).
|
|
15
|
+
entry.off?.();
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
replay(router) {
|
|
19
|
+
// Capture each real disposer so a post-init unsubscribe (via the closure
|
|
20
|
+
// returned at add time) actually removes the handler from the router
|
|
21
|
+
// instead of no-op'ing.
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (entry.unsubscribed)
|
|
24
|
+
continue;
|
|
25
|
+
entry.off = router.onLocal(entry.name, entry.handler);
|
|
26
|
+
}
|
|
27
|
+
entries.length = 0;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxed.d.ts","sourceRoot":"","sources":["../../../src/shell/sandboxed/sandboxed.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAyBrC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,KAAK,CAkGnE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createChildrenChannel } from '../../channel/children';
|
|
2
|
+
import { createMessageObserver } from '../../channel/observer';
|
|
3
|
+
import { createIntentPipeline } from '../../intent/pipeline';
|
|
4
|
+
import { createIntentRouter } from '../../intent/router';
|
|
5
|
+
import { createLifecycleController } from '../../window/lifecycle/states';
|
|
6
|
+
import { createMountController } from '../../window/mount/mount';
|
|
7
|
+
import { buildShellFacade } from '../build';
|
|
8
|
+
import { performChildInit } from './boot';
|
|
9
|
+
import { guardedKernel, guardedParent, requireInit } from './guarded';
|
|
10
|
+
import { createPendingIntentSubs } from './pending';
|
|
11
|
+
/** Trusted sender id stamped on intents arriving from the parent channel. */
|
|
12
|
+
const PARENT_SENDER_ID = '<parent>';
|
|
13
|
+
export function createSandboxedShell(config) {
|
|
14
|
+
const observer = createMessageObserver();
|
|
15
|
+
const lifecycle = createLifecycleController();
|
|
16
|
+
const windows = new Map();
|
|
17
|
+
const childrenChannel = createChildrenChannel({
|
|
18
|
+
observer,
|
|
19
|
+
onDeliveryFailed: (toWindowId) => lifecycle.markCrashed(toWindowId),
|
|
20
|
+
});
|
|
21
|
+
const pipeline = createIntentPipeline();
|
|
22
|
+
let state = null;
|
|
23
|
+
let router = null;
|
|
24
|
+
let mountController = null;
|
|
25
|
+
const pending = createPendingIntentSubs();
|
|
26
|
+
function subscribeIntent(name, handler) {
|
|
27
|
+
if (router)
|
|
28
|
+
return router.onLocal(name, handler);
|
|
29
|
+
return pending.add(name, handler);
|
|
30
|
+
}
|
|
31
|
+
const requireState = () => requireInit(() => state);
|
|
32
|
+
const kernelProxy = guardedKernel(() => requireState().kernel);
|
|
33
|
+
const parentProxy = guardedParent(() => requireState().parent);
|
|
34
|
+
function getMountController() {
|
|
35
|
+
if (mountController)
|
|
36
|
+
return mountController;
|
|
37
|
+
if (!config.adapter) {
|
|
38
|
+
throw new Error('Shell.mount() requires a ShellAdapter in the config');
|
|
39
|
+
}
|
|
40
|
+
const current = requireState();
|
|
41
|
+
mountController = createMountController({
|
|
42
|
+
adapter: config.adapter,
|
|
43
|
+
kernel: kernelProxy,
|
|
44
|
+
kernelUrl: current.kernelUrl,
|
|
45
|
+
mintIdentity: current.mintIdentity,
|
|
46
|
+
childrenChannel,
|
|
47
|
+
windows,
|
|
48
|
+
lifecycle,
|
|
49
|
+
});
|
|
50
|
+
return mountController;
|
|
51
|
+
}
|
|
52
|
+
return buildShellFacade({
|
|
53
|
+
parent: parentProxy,
|
|
54
|
+
childrenChannel,
|
|
55
|
+
kernel: kernelProxy,
|
|
56
|
+
pipeline,
|
|
57
|
+
observer,
|
|
58
|
+
lifecycle,
|
|
59
|
+
windows,
|
|
60
|
+
getMountController,
|
|
61
|
+
targetNodeId: () => state?.targetNodeId,
|
|
62
|
+
onIntent: subscribeIntent,
|
|
63
|
+
init: async () => {
|
|
64
|
+
const result = await performChildInit({
|
|
65
|
+
parent: config.parentWindow ?? window.parent,
|
|
66
|
+
timeoutMs: config.initTimeoutMs,
|
|
67
|
+
schema: config.schema,
|
|
68
|
+
});
|
|
69
|
+
state = {
|
|
70
|
+
windowId: result.windowId,
|
|
71
|
+
kernelUrl: result.kernelUrl,
|
|
72
|
+
targetNodeId: result.targetNodeId,
|
|
73
|
+
mintIdentity: result.mintIdentity,
|
|
74
|
+
kernel: result.kernel,
|
|
75
|
+
parent: result.parentChannel(observer),
|
|
76
|
+
};
|
|
77
|
+
router = createIntentRouter({
|
|
78
|
+
selfWindowId: state.windowId,
|
|
79
|
+
pipeline,
|
|
80
|
+
parent: state.parent,
|
|
81
|
+
children: childrenChannel,
|
|
82
|
+
windows,
|
|
83
|
+
});
|
|
84
|
+
childrenChannel.on('intent', (windowId, message) => {
|
|
85
|
+
void router.handleInbound('child', message, windowId);
|
|
86
|
+
});
|
|
87
|
+
state.parent.on('intent', (message) => {
|
|
88
|
+
void router.handleInbound('parent', message, PARENT_SENDER_ID);
|
|
89
|
+
});
|
|
90
|
+
pending.replay(router);
|
|
91
|
+
},
|
|
92
|
+
onDispose: async () => {
|
|
93
|
+
if (mountController)
|
|
94
|
+
await mountController.dispose();
|
|
95
|
+
childrenChannel.dispose();
|
|
96
|
+
state?.parent.dispose();
|
|
97
|
+
state?.kernel.dispose();
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AppsNamespace } from '../application/apps';
|
|
2
|
+
import type { SpacesNamespace } from '../application/spaces';
|
|
3
|
+
import type { UserNamespace } from '../application/user';
|
|
4
|
+
import type { ChildrenChannel } from '../channel/children';
|
|
5
|
+
import type { ObserverHandler } from '../channel/observer';
|
|
6
|
+
import type { ParentChannel } from '../channel/parent';
|
|
7
|
+
import type { IntentMiddleware } from '../intent/pipeline';
|
|
8
|
+
import type { LocalIntentHandler } from '../intent/router';
|
|
9
|
+
import type { KernelClient } from '../kernel/client';
|
|
10
|
+
import type { IntentRegistry } from '../message/intent';
|
|
11
|
+
import type { CloseResult, MountedWindow, MountParams } from '../window/mount/params';
|
|
12
|
+
import type { Window } from '../window/window';
|
|
13
|
+
export interface Shell {
|
|
14
|
+
readonly parent: ParentChannel | null;
|
|
15
|
+
readonly children: ChildrenChannel;
|
|
16
|
+
readonly kernel: KernelClient;
|
|
17
|
+
readonly windows: ReadonlyMap<string, Window>;
|
|
18
|
+
readonly targetNodeId?: string;
|
|
19
|
+
/** OS plane: the caller as a shell-domain `User` — self, current space, roles. */
|
|
20
|
+
readonly user: UserNamespace;
|
|
21
|
+
/** OS plane: the caller's readable spaces — list, get, create. */
|
|
22
|
+
readonly spaces: SpacesNamespace;
|
|
23
|
+
/** OS plane: apps — install, list per space, open (returns an `AppSession`). */
|
|
24
|
+
readonly apps: AppsNamespace;
|
|
25
|
+
use(middleware: IntentMiddleware): Shell;
|
|
26
|
+
onMessage(handler: ObserverHandler): () => void;
|
|
27
|
+
onIntent<K extends keyof IntentRegistry>(name: K, handler: LocalIntentHandler<K>): () => void;
|
|
28
|
+
mount(params: MountParams): Promise<MountedWindow>;
|
|
29
|
+
close(windowId: string, opts?: {
|
|
30
|
+
force?: boolean;
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
}): Promise<CloseResult>;
|
|
33
|
+
init(): Promise<Shell>;
|
|
34
|
+
dispose(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/shell/shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAE9C,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAE9B,kFAAkF;IAClF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAChC,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAE5B,GAAG,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,CAAA;IACxC,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI,CAAA;IAC/C,QAAQ,CAAC,CAAC,SAAS,MAAM,cAAc,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAA;IAE7F,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAClD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAE7F,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../../src/shell/standalone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAcpC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,KAAK,CA+ErE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createChildrenChannel } from '../channel/children';
|
|
2
|
+
import { createMessageObserver } from '../channel/observer';
|
|
3
|
+
import { createIntentPipeline } from '../intent/pipeline';
|
|
4
|
+
import { createIntentRouter } from '../intent/router';
|
|
5
|
+
import { createKernelFacade } from '../kernel/credential';
|
|
6
|
+
import { createKernelClientAdapter } from '../kernel/session';
|
|
7
|
+
import { createLifecycleController } from '../window/lifecycle/states';
|
|
8
|
+
import { createMountController } from '../window/mount/mount';
|
|
9
|
+
import { buildShellFacade } from './build';
|
|
10
|
+
const DEFAULT_ROOT_WINDOW_ID = 'root';
|
|
11
|
+
export function createStandaloneShell(config) {
|
|
12
|
+
const windowId = config.windowId ?? DEFAULT_ROOT_WINDOW_ID;
|
|
13
|
+
const observer = createMessageObserver();
|
|
14
|
+
const getCredential = config.getCredential ??
|
|
15
|
+
(() => {
|
|
16
|
+
if (config.credential === undefined) {
|
|
17
|
+
throw new Error('Standalone shell requires credential or getCredential');
|
|
18
|
+
}
|
|
19
|
+
return config.credential;
|
|
20
|
+
});
|
|
21
|
+
const adapter = createKernelClientAdapter({
|
|
22
|
+
url: config.kernelUrl,
|
|
23
|
+
schema: config.schema,
|
|
24
|
+
getCredential,
|
|
25
|
+
fetch: config.fetch,
|
|
26
|
+
});
|
|
27
|
+
const kernel = createKernelFacade({
|
|
28
|
+
adapter,
|
|
29
|
+
getCredential,
|
|
30
|
+
url: config.kernelUrl,
|
|
31
|
+
mintIdentity: config.mintIdentity,
|
|
32
|
+
});
|
|
33
|
+
const lifecycle = createLifecycleController();
|
|
34
|
+
const windows = new Map();
|
|
35
|
+
const childrenChannel = createChildrenChannel({
|
|
36
|
+
observer,
|
|
37
|
+
onDeliveryFailed: (toWindowId) => lifecycle.markCrashed(toWindowId),
|
|
38
|
+
});
|
|
39
|
+
const pipeline = createIntentPipeline();
|
|
40
|
+
const router = createIntentRouter({
|
|
41
|
+
selfWindowId: windowId,
|
|
42
|
+
pipeline,
|
|
43
|
+
parent: null,
|
|
44
|
+
children: childrenChannel,
|
|
45
|
+
windows,
|
|
46
|
+
});
|
|
47
|
+
childrenChannel.on('intent', (fromWindowId, message) => {
|
|
48
|
+
void router.handleInbound('child', message, fromWindowId);
|
|
49
|
+
});
|
|
50
|
+
let mountController = null;
|
|
51
|
+
function getMountController() {
|
|
52
|
+
if (mountController)
|
|
53
|
+
return mountController;
|
|
54
|
+
if (!config.adapter) {
|
|
55
|
+
throw new Error('Shell.mount() requires a ShellAdapter in the config');
|
|
56
|
+
}
|
|
57
|
+
mountController = createMountController({
|
|
58
|
+
adapter: config.adapter,
|
|
59
|
+
kernel,
|
|
60
|
+
kernelUrl: config.kernelUrl,
|
|
61
|
+
mintIdentity: config.mintIdentity,
|
|
62
|
+
childrenChannel,
|
|
63
|
+
windows,
|
|
64
|
+
lifecycle,
|
|
65
|
+
});
|
|
66
|
+
return mountController;
|
|
67
|
+
}
|
|
68
|
+
return buildShellFacade({
|
|
69
|
+
parent: null,
|
|
70
|
+
childrenChannel,
|
|
71
|
+
kernel,
|
|
72
|
+
pipeline,
|
|
73
|
+
observer,
|
|
74
|
+
lifecycle,
|
|
75
|
+
windows,
|
|
76
|
+
getMountController,
|
|
77
|
+
onIntent: (name, handler) => router.onLocal(name, handler),
|
|
78
|
+
onDispose: async () => {
|
|
79
|
+
if (mountController)
|
|
80
|
+
await mountController.dispose();
|
|
81
|
+
childrenChannel.dispose();
|
|
82
|
+
adapter.disconnect();
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IntentRegistry } from '../message/
|
|
1
|
+
import type { IntentRegistry } from '../message/intent';
|
|
2
2
|
export interface SandboxProfile {
|
|
3
3
|
readonly allowScripts: boolean;
|
|
4
4
|
readonly allowForms: boolean;
|
|
@@ -15,7 +15,7 @@ export interface WindowConfig {
|
|
|
15
15
|
readonly capabilities: WindowCapabilities;
|
|
16
16
|
/**
|
|
17
17
|
* Sandbox profile for the iframe.
|
|
18
|
-
* - `undefined` → adapter default (`DEFAULT_SANDBOX` in iframe
|
|
18
|
+
* - `undefined` → adapter default (`DEFAULT_SANDBOX` in embed/iframe).
|
|
19
19
|
* - `SandboxProfile` → explicit flag set, becomes the `sandbox=…` attribute.
|
|
20
20
|
* - `null` → opt out: no `sandbox` attribute on the iframe at all (the
|
|
21
21
|
* browser's cross-origin policy is the only remaining isolation). Used
|
|
@@ -23,4 +23,4 @@ export interface WindowConfig {
|
|
|
23
23
|
*/
|
|
24
24
|
readonly sandbox?: SandboxProfile | null;
|
|
25
25
|
}
|
|
26
|
-
//# sourceMappingURL=
|
|
26
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/window/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,cAAc,CAAC,CAAA;CACtD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAA;IAC1C,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAA;IACzC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;CACzC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import type { WindowConfig } from '../
|
|
1
|
+
import type { WindowConfig } from '../capabilities';
|
|
2
2
|
export interface WindowHandle {
|
|
3
3
|
readonly element: HTMLIFrameElement | HTMLElement;
|
|
4
4
|
readonly port: MessagePort | null;
|
|
5
5
|
readonly origin: string;
|
|
6
6
|
}
|
|
7
|
+
/** How a window's host element gets created — the shell's embedding extension point. */
|
|
7
8
|
export interface ShellAdapter {
|
|
8
9
|
mount(config: WindowConfig): {
|
|
9
10
|
handle: WindowHandle;
|
|
10
11
|
dispose: () => void;
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/window/embed/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,WAAW,CAAA;IACjD,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,wFAAwF;AACxF,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG;QAAE,MAAM,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,CAAA;CAC3E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ShellAdapter } from '
|
|
1
|
+
import type { ShellAdapter } from './adapter';
|
|
2
2
|
export type IframeShellAdapterConfig = {
|
|
3
3
|
/**
|
|
4
4
|
* Optional class list applied to every iframe created by this adapter.
|
|
@@ -7,4 +7,4 @@ export type IframeShellAdapterConfig = {
|
|
|
7
7
|
readonly className?: string;
|
|
8
8
|
};
|
|
9
9
|
export declare function createIframeShellAdapter(config?: IframeShellAdapterConfig): ShellAdapter;
|
|
10
|
-
//# sourceMappingURL=iframe.
|
|
10
|
+
//# sourceMappingURL=iframe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframe.d.ts","sourceRoot":"","sources":["../../../src/window/embed/iframe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAA;AAE3D,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B,CAAA;AAUD,wBAAgB,wBAAwB,CAAC,MAAM,GAAE,wBAA6B,GAAG,YAAY,CAsC5F"}
|
package/dist/{application/windowing/lifecycle-controller.d.ts → window/lifecycle/states.d.ts}
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { WindowState } from '
|
|
2
|
-
import { type LifecycleEvent } from '
|
|
1
|
+
import type { WindowState } from '../window';
|
|
2
|
+
import { type LifecycleEvent } from './transition';
|
|
3
|
+
/** Live per-window lifecycle states, advanced only through the transition machine. */
|
|
3
4
|
export interface LifecycleController {
|
|
4
5
|
register(windowId: string, initial?: WindowState): void;
|
|
5
6
|
apply(windowId: string, event: LifecycleEvent): WindowState | null;
|
|
@@ -7,4 +8,4 @@ export interface LifecycleController {
|
|
|
7
8
|
remove(windowId: string): void;
|
|
8
9
|
}
|
|
9
10
|
export declare function createLifecycleController(): LifecycleController;
|
|
10
|
-
//# sourceMappingURL=
|
|
11
|
+
//# sourceMappingURL=states.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.d.ts","sourceRoot":"","sources":["../../../src/window/lifecycle/states.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE9D,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;IACvD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAAA;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAC/B;AAED,wBAAgB,yBAAyB,IAAI,mBAAmB,CA4B/D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WindowState } from '
|
|
1
|
+
import type { WindowState } from '../window';
|
|
2
2
|
export type LifecycleEvent = {
|
|
3
3
|
kind: 'hide';
|
|
4
4
|
} | {
|
|
@@ -20,8 +20,8 @@ export type TransitionResult = {
|
|
|
20
20
|
reason: string;
|
|
21
21
|
};
|
|
22
22
|
/**
|
|
23
|
-
* Pure state-machine transition. Used by the lifecycle
|
|
23
|
+
* Pure state-machine transition. Used by the lifecycle state map —
|
|
24
24
|
* no timers, no side effects here.
|
|
25
25
|
*/
|
|
26
26
|
export declare function transition(state: WindowState, event: LifecycleEvent): TransitionResult;
|
|
27
|
-
//# sourceMappingURL=
|
|
27
|
+
//# sourceMappingURL=transition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../src/window/lifecycle/transition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAA;AAE1B,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9F;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,gBAAgB,CAsBtF"}
|