@syntrologie/runtime-sdk 1.0.1-canary.3 → 2.0.0-canary.1
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/CAPABILITIES.md +630 -463
- package/README.md +285 -62
- package/dist/RuntimeProvider.d.ts +51 -0
- package/dist/RuntimeProvider.js +114 -0
- package/dist/RuntimeProvider.js.map +1 -0
- package/dist/SmartCanvasApp.d.ts +9 -3
- package/dist/SmartCanvasApp.js +36 -38
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/actions/ActionEngine.d.ts +11 -0
- package/dist/actions/ActionEngine.js +274 -0
- package/dist/actions/ActionEngine.js.map +1 -0
- package/dist/actions/executors/index.d.ts +118 -0
- package/dist/actions/executors/index.js +242 -0
- package/dist/actions/executors/index.js.map +1 -0
- package/dist/actions/executors/tour.d.ts +18 -0
- package/dist/actions/executors/tour.js +332 -0
- package/dist/actions/executors/tour.js.map +1 -0
- package/dist/actions/index.d.ts +10 -0
- package/dist/actions/index.js +12 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/types.d.ts +399 -0
- package/dist/actions/types.js +8 -0
- package/dist/actions/types.js.map +1 -0
- package/dist/actions/validation.d.ts +14 -0
- package/dist/actions/validation.js +603 -0
- package/dist/actions/validation.js.map +1 -0
- package/dist/api.d.ts +32 -18
- package/dist/api.js +56 -39
- package/dist/api.js.map +1 -1
- package/dist/apps/AppContext.d.ts +31 -0
- package/dist/apps/AppContext.js +93 -0
- package/dist/apps/AppContext.js.map +1 -0
- package/dist/apps/AppLoader.d.ts +84 -0
- package/dist/apps/AppLoader.js +250 -0
- package/dist/apps/AppLoader.js.map +1 -0
- package/dist/apps/AppRegistry.d.ts +102 -0
- package/dist/apps/AppRegistry.js +317 -0
- package/dist/apps/AppRegistry.js.map +1 -0
- package/dist/apps/examples/gamification-app.example.d.ts +305 -0
- package/dist/apps/examples/gamification-app.example.js +329 -0
- package/dist/apps/examples/gamification-app.example.js.map +1 -0
- package/dist/apps/index.d.ts +18 -0
- package/dist/apps/index.js +26 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/types.d.ts +231 -0
- package/dist/apps/types.js +8 -0
- package/dist/apps/types.js.map +1 -0
- package/dist/bootstrap.d.ts +24 -0
- package/dist/bootstrap.js +133 -33
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.js +36 -9
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.js +37 -18
- package/dist/components/TileCard.js.map +1 -1
- package/dist/context/schema.d.ts +16 -16
- package/dist/decisions/schema.d.ts +96 -96
- package/dist/earlyPatcher.d.ts +8 -20
- package/dist/earlyPatcher.js +13 -62
- package/dist/earlyPatcher.js.map +1 -1
- package/dist/editorLoader.d.ts +2 -0
- package/dist/editorLoader.js +46 -7
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/normalizers/posthog.d.ts +24 -0
- package/dist/events/normalizers/posthog.js.map +1 -1
- package/dist/events/schema.d.ts +8 -8
- package/dist/events/types.d.ts +6 -0
- package/dist/events/types.js +8 -0
- package/dist/events/types.js.map +1 -1
- package/dist/hooks/useCanvasOverlays.d.ts +4 -1
- package/dist/hooks/useCanvasOverlays.js +53 -6
- package/dist/hooks/useCanvasOverlays.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +3 -7
- package/dist/hooks/useShadowCanvasConfig.js +2 -3
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/overlays/schema.d.ts +153 -153
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.js +75 -1
- package/dist/runtime.js.map +1 -1
- package/dist/smart-canvas.esm.js +162 -55
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +21133 -17957
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +162 -55
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/store/example.d.ts +1 -0
- package/dist/store/example.js +43 -0
- package/dist/store/example.js.map +1 -0
- package/dist/store/mini-effector.d.ts +46 -0
- package/dist/store/mini-effector.js +90 -0
- package/dist/store/mini-effector.js.map +1 -0
- package/dist/surfaces/Surfaces.d.ts +11 -0
- package/dist/surfaces/Surfaces.js +361 -0
- package/dist/surfaces/Surfaces.js.map +1 -0
- package/dist/surfaces/index.d.ts +9 -0
- package/dist/surfaces/index.js +12 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/positioning.d.ts +50 -0
- package/dist/surfaces/positioning.js +231 -0
- package/dist/surfaces/positioning.js.map +1 -0
- package/dist/surfaces/types.d.ts +167 -0
- package/dist/surfaces/types.js +23 -0
- package/dist/surfaces/types.js.map +1 -0
- package/dist/telemetry/adapters/posthog.d.ts +6 -0
- package/dist/telemetry/adapters/posthog.js +9 -0
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/types-only.d.ts +32 -0
- package/dist/types-only.js +11 -0
- package/dist/types-only.js.map +1 -0
- package/dist/types.d.ts +26 -14
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/widgets/WidgetRegistry.d.ts +139 -0
- package/dist/widgets/WidgetRegistry.js +182 -0
- package/dist/widgets/WidgetRegistry.js.map +1 -0
- package/dist/widgets/index.d.ts +7 -0
- package/dist/widgets/index.js +7 -0
- package/dist/widgets/index.js.map +1 -0
- package/package.json +13 -3
- package/schema/canvas-config.schema.json +444 -254
package/dist/api.d.ts
CHANGED
|
@@ -1,9 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartCanvas API
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the SmartCanvas SDK. Creates and manages the canvas element,
|
|
5
|
+
* handles configuration, and coordinates between the ActionEngine and UI.
|
|
6
|
+
*/
|
|
1
7
|
import { SmartCanvasElement } from "./SmartCanvasElement";
|
|
2
8
|
import type { ExperimentClient } from "./experiments/types";
|
|
3
9
|
import type { TelemetryClient } from "./telemetry/types";
|
|
4
|
-
import type { CanvasConfigFetcher } from "./types";
|
|
10
|
+
import type { CanvasConfigFetcher, CanvasConfigResponse } from "./types";
|
|
5
11
|
import type { OverlayRecipeFetcher } from "./overlays/fetcher";
|
|
6
12
|
import type { CanvasTheme } from "./components/ShadowCanvasOverlay";
|
|
13
|
+
import type { SmartCanvasRuntime } from "./runtime";
|
|
7
14
|
import type { RenderProps, ActionHandler, AppearanceConfig } from "./render/types";
|
|
8
15
|
export interface SmartCanvasIntegrations {
|
|
9
16
|
experiments?: ExperimentClient;
|
|
@@ -27,16 +34,16 @@ export interface SmartCanvasConfig {
|
|
|
27
34
|
timeout?: number;
|
|
28
35
|
className?: string;
|
|
29
36
|
};
|
|
30
|
-
earlyPatching?: boolean;
|
|
31
37
|
editorUrl?: string;
|
|
32
38
|
theme?: Partial<CanvasTheme>;
|
|
33
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* v2 Runtime instance.
|
|
41
|
+
* Required for action execution. If not provided, actions will not be applied.
|
|
42
|
+
*/
|
|
43
|
+
runtime?: SmartCanvasRuntime;
|
|
34
44
|
autoDetectTheme?: boolean;
|
|
35
|
-
/** Theme appearance overrides (CSS variables, base theme) */
|
|
36
45
|
appearance?: AppearanceConfig;
|
|
37
|
-
/** Render props for customizing tile/block rendering */
|
|
38
46
|
renderProps?: RenderProps;
|
|
39
|
-
/** Action handlers for interactive blocks */
|
|
40
47
|
actionHandlers?: ActionHandler;
|
|
41
48
|
}
|
|
42
49
|
/**
|
|
@@ -46,31 +53,38 @@ export interface MountableComponent {
|
|
|
46
53
|
mount(container: HTMLElement, props: any): void | (() => void);
|
|
47
54
|
}
|
|
48
55
|
export type { TileComponent, TileComponentProps } from "./types";
|
|
56
|
+
/**
|
|
57
|
+
* Handle for interacting with a SmartCanvas instance.
|
|
58
|
+
*/
|
|
49
59
|
export interface SmartCanvasHandle {
|
|
50
60
|
el: SmartCanvasElement;
|
|
51
61
|
open(): void;
|
|
52
62
|
close(): void;
|
|
53
63
|
destroy(): void;
|
|
54
64
|
setTokens(tokens: Record<string, string>): void;
|
|
55
|
-
getConfig(): Promise<any>;
|
|
56
|
-
updateConfig(newConfig: any): void;
|
|
57
|
-
setEnabled(enabled: boolean): void;
|
|
58
|
-
registerComponent(key: string, component: MountableComponent): void;
|
|
59
|
-
setOverrideFetcher(fetcher: any): void;
|
|
60
65
|
/**
|
|
61
|
-
*
|
|
62
|
-
* Used by editor SDK to tag crawler sessions with canonical IDs.
|
|
66
|
+
* Get the current config.
|
|
63
67
|
*/
|
|
64
|
-
|
|
68
|
+
getConfig(): Promise<CanvasConfigResponse>;
|
|
65
69
|
/**
|
|
66
|
-
*
|
|
70
|
+
* Update the config and re-apply actions.
|
|
71
|
+
* This is the primary way to modify what the canvas displays.
|
|
67
72
|
*/
|
|
68
|
-
|
|
73
|
+
updateConfig(newConfig: CanvasConfigResponse): Promise<void>;
|
|
69
74
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
75
|
+
* Enable or disable the canvas.
|
|
76
|
+
* When disabled, all actions are reverted.
|
|
72
77
|
*/
|
|
78
|
+
setEnabled(enabled: boolean): Promise<void>;
|
|
79
|
+
registerComponent(key: string, component: MountableComponent): void;
|
|
80
|
+
setOverrideFetcher(fetcher: CanvasConfigFetcher): void;
|
|
81
|
+
registerTelemetryProperties(properties: Record<string, unknown>): void;
|
|
82
|
+
getSessionId(): string | undefined;
|
|
73
83
|
startSessionRecording(): void;
|
|
84
|
+
/**
|
|
85
|
+
* v2 Runtime instance for context, events, state, and decisions.
|
|
86
|
+
*/
|
|
87
|
+
runtime?: SmartCanvasRuntime;
|
|
74
88
|
}
|
|
75
89
|
export declare const createSmartCanvas: (config?: SmartCanvasConfig) => Promise<SmartCanvasHandle>;
|
|
76
90
|
declare global {
|
package/dist/api.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SmartCanvas API
|
|
3
|
+
*
|
|
4
|
+
* Entry point for the SmartCanvas SDK. Creates and manages the canvas element,
|
|
5
|
+
* handles configuration, and coordinates between the ActionEngine and UI.
|
|
6
|
+
*/
|
|
1
7
|
import { registerSmartCanvasElement } from "./SmartCanvasElement";
|
|
2
8
|
import { createCanvasConfigFetcher } from "./configFetcher";
|
|
3
9
|
import { initAntiFlicker } from "./antiFlicker";
|
|
4
|
-
import { applyPatchesEarly, extractPatchesFromConfig, revertAllPatches } from "./earlyPatcher";
|
|
5
10
|
import { loadEditorSdk, getActiveSdkMode } from "./editorLoader";
|
|
6
11
|
export const createSmartCanvas = async (config = {}) => {
|
|
7
12
|
var _a, _b, _c;
|
|
@@ -14,44 +19,60 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
14
19
|
const antiFlickerConfig = typeof config.antiFlicker === 'object' ? config.antiFlicker : {};
|
|
15
20
|
removeAntiFlicker = initAntiFlicker(antiFlickerConfig);
|
|
16
21
|
}
|
|
17
|
-
//
|
|
22
|
+
// State
|
|
18
23
|
let currentConfig = null;
|
|
19
24
|
let currentFetcher = null;
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
let currentBatchHandle = null;
|
|
26
|
+
let isEnabled = true;
|
|
27
|
+
const runtime = config.runtime;
|
|
28
|
+
/**
|
|
29
|
+
* Apply actions from config via ActionEngine.
|
|
30
|
+
*/
|
|
31
|
+
async function applyActions(actions) {
|
|
32
|
+
if (!(runtime === null || runtime === void 0 ? void 0 : runtime.actions) || actions.length === 0) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Revert previous actions
|
|
36
|
+
if (currentBatchHandle === null || currentBatchHandle === void 0 ? void 0 : currentBatchHandle.isApplied()) {
|
|
37
|
+
await currentBatchHandle.revertAll();
|
|
38
|
+
}
|
|
39
|
+
// Apply new actions
|
|
40
|
+
currentBatchHandle = await runtime.actions.applyBatch(actions);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Revert all current actions.
|
|
44
|
+
*/
|
|
45
|
+
async function revertActions() {
|
|
46
|
+
if (currentBatchHandle === null || currentBatchHandle === void 0 ? void 0 : currentBatchHandle.isApplied()) {
|
|
47
|
+
await currentBatchHandle.revertAll();
|
|
48
|
+
currentBatchHandle = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Apply initial config if fetcher provided
|
|
52
|
+
if (config.fetcher) {
|
|
22
53
|
try {
|
|
23
54
|
currentFetcher = config.fetcher;
|
|
24
55
|
const canvasConfig = await config.fetcher();
|
|
25
|
-
currentConfig = canvasConfig;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
applyPatchesEarly({
|
|
29
|
-
patches,
|
|
30
|
-
onComplete: () => {
|
|
31
|
-
// Remove anti-flicker after patches are applied
|
|
32
|
-
if (removeAntiFlicker) {
|
|
33
|
-
removeAntiFlicker();
|
|
34
|
-
removeAntiFlicker = null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
});
|
|
56
|
+
currentConfig = canvasConfig;
|
|
57
|
+
if (canvasConfig.actions.length > 0 && (runtime === null || runtime === void 0 ? void 0 : runtime.actions)) {
|
|
58
|
+
await applyActions(canvasConfig.actions);
|
|
38
59
|
}
|
|
39
60
|
}
|
|
40
61
|
catch (error) {
|
|
41
|
-
console.error('[SmartCanvas] Error applying
|
|
62
|
+
console.error('[SmartCanvas] Error fetching/applying initial config:', error);
|
|
42
63
|
}
|
|
43
64
|
}
|
|
44
|
-
// Remove anti-flicker
|
|
65
|
+
// Remove anti-flicker
|
|
45
66
|
if (removeAntiFlicker) {
|
|
46
67
|
removeAntiFlicker();
|
|
47
68
|
}
|
|
48
|
-
//
|
|
69
|
+
// Load editor SDK if in editor/audit mode
|
|
49
70
|
const sdkMode = getActiveSdkMode();
|
|
50
71
|
if (sdkMode) {
|
|
51
72
|
console.log(`[SmartCanvas] Loading editor SDK for ${sdkMode} mode`);
|
|
52
|
-
// We don't await this so the runtime SDK can continue initializing
|
|
53
73
|
loadEditorSdk(config.editorUrl).catch(console.error);
|
|
54
74
|
}
|
|
75
|
+
// Create the canvas element
|
|
55
76
|
registerSmartCanvasElement();
|
|
56
77
|
const host = document.createElement("smart-canvas");
|
|
57
78
|
if (config.tokens) {
|
|
@@ -82,7 +103,6 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
82
103
|
featureKey: config.configUriFeatureKey,
|
|
83
104
|
credentials: config.fetchCredentials,
|
|
84
105
|
});
|
|
85
|
-
// Store the initial fetcher if not already set
|
|
86
106
|
if (!currentFetcher) {
|
|
87
107
|
currentFetcher = fetcher;
|
|
88
108
|
}
|
|
@@ -91,6 +111,7 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
91
111
|
pollIntervalMs: config.pollIntervalMs,
|
|
92
112
|
experiments,
|
|
93
113
|
telemetry,
|
|
114
|
+
runtime,
|
|
94
115
|
overlayFetcher: config.overlayFetcher,
|
|
95
116
|
overlayConfigUri: config.overlayConfigUri,
|
|
96
117
|
overlayConfigFeatureKey: config.overlayConfigFeatureKey,
|
|
@@ -108,14 +129,16 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
108
129
|
el: host,
|
|
109
130
|
open: () => host.open(),
|
|
110
131
|
close: () => host.close(),
|
|
111
|
-
destroy: () =>
|
|
132
|
+
destroy: () => {
|
|
133
|
+
revertActions();
|
|
134
|
+
host.remove();
|
|
135
|
+
},
|
|
112
136
|
setTokens: (tokens) => {
|
|
113
137
|
for (const [key, value] of Object.entries(tokens)) {
|
|
114
138
|
host.style.setProperty(key, value);
|
|
115
139
|
}
|
|
116
140
|
},
|
|
117
141
|
getConfig: async () => {
|
|
118
|
-
// Use current fetcher to get fresh config
|
|
119
142
|
if (currentFetcher) {
|
|
120
143
|
try {
|
|
121
144
|
const freshConfig = await currentFetcher();
|
|
@@ -128,25 +151,21 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
128
151
|
}
|
|
129
152
|
return currentConfig;
|
|
130
153
|
},
|
|
131
|
-
updateConfig: (newConfig) => {
|
|
154
|
+
updateConfig: async (newConfig) => {
|
|
132
155
|
currentConfig = newConfig;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (patches.length > 0) {
|
|
136
|
-
applyPatchesEarly({ patches });
|
|
156
|
+
if (isEnabled) {
|
|
157
|
+
await applyActions(newConfig.actions);
|
|
137
158
|
}
|
|
138
159
|
},
|
|
139
|
-
setEnabled: (enabled) => {
|
|
160
|
+
setEnabled: async (enabled) => {
|
|
161
|
+
isEnabled = enabled;
|
|
140
162
|
if (enabled) {
|
|
141
163
|
if (currentConfig) {
|
|
142
|
-
|
|
143
|
-
if (patches.length > 0) {
|
|
144
|
-
applyPatchesEarly({ patches });
|
|
145
|
-
}
|
|
164
|
+
await applyActions(currentConfig.actions);
|
|
146
165
|
}
|
|
147
166
|
}
|
|
148
167
|
else {
|
|
149
|
-
|
|
168
|
+
await revertActions();
|
|
150
169
|
}
|
|
151
170
|
},
|
|
152
171
|
registerComponent: (key, Component) => host.registerComponent(key, Component),
|
|
@@ -166,11 +185,9 @@ export const createSmartCanvas = async (config = {}) => {
|
|
|
166
185
|
var _a;
|
|
167
186
|
(_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.startSessionRecording) === null || _a === void 0 ? void 0 : _a.call(telemetry);
|
|
168
187
|
},
|
|
188
|
+
runtime,
|
|
169
189
|
};
|
|
170
|
-
// Expose handle for editor SDK access
|
|
171
|
-
// In editor/audit mode: always expose (editor needs it to inject tiles and save config)
|
|
172
|
-
// In dev mode: always expose (for debugging)
|
|
173
|
-
// In production: never expose (security)
|
|
190
|
+
// Expose handle for editor SDK access (only in editor/dev mode)
|
|
174
191
|
if (typeof window !== "undefined") {
|
|
175
192
|
const isDev = process.env.NODE_ENV === 'development';
|
|
176
193
|
if (sdkMode || isDev) {
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsB,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAKtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Context
|
|
3
|
+
*
|
|
4
|
+
* Provides a sandboxed runtime context for apps.
|
|
5
|
+
* Apps receive an AppContext when they activate, giving them controlled
|
|
6
|
+
* access to runtime functionality.
|
|
7
|
+
*/
|
|
8
|
+
import type { SmartCanvasRuntime } from "../runtime";
|
|
9
|
+
import type { AppContext } from "./types";
|
|
10
|
+
/**
|
|
11
|
+
* Options for creating an AppContext.
|
|
12
|
+
*/
|
|
13
|
+
export interface CreateAppContextOptions {
|
|
14
|
+
/** The app ID */
|
|
15
|
+
appId: string;
|
|
16
|
+
/** The runtime instance */
|
|
17
|
+
runtime: SmartCanvasRuntime;
|
|
18
|
+
/** Whether this is a built-in app (prevents executor override) */
|
|
19
|
+
isBuiltIn?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create a sandboxed AppContext for an app.
|
|
23
|
+
*
|
|
24
|
+
* The context provides controlled access to runtime functionality,
|
|
25
|
+
* with state namespaced to the app.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createAppContext(options: CreateAppContextOptions): AppContext;
|
|
28
|
+
/**
|
|
29
|
+
* Clean up all resources registered by an app context.
|
|
30
|
+
*/
|
|
31
|
+
export declare function cleanupAppContext(appId: string, runtime: SmartCanvasRuntime): void;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Context
|
|
3
|
+
*
|
|
4
|
+
* Provides a sandboxed runtime context for apps.
|
|
5
|
+
* Apps receive an AppContext when they activate, giving them controlled
|
|
6
|
+
* access to runtime functionality.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create a sandboxed AppContext for an app.
|
|
10
|
+
*
|
|
11
|
+
* The context provides controlled access to runtime functionality,
|
|
12
|
+
* with state namespaced to the app.
|
|
13
|
+
*/
|
|
14
|
+
export function createAppContext(options) {
|
|
15
|
+
const { appId, runtime, isBuiltIn = false } = options;
|
|
16
|
+
const statePrefix = `app:${appId}:`;
|
|
17
|
+
// Track registered actions and widgets for cleanup
|
|
18
|
+
const registeredActions = [];
|
|
19
|
+
const registeredWidgets = [];
|
|
20
|
+
// Get or create namespaced storage for this app
|
|
21
|
+
const appStorage = runtime.state.ns(`app:${appId}`);
|
|
22
|
+
const context = {
|
|
23
|
+
appId,
|
|
24
|
+
// Namespaced state access (using session storage scoped to this app)
|
|
25
|
+
state: {
|
|
26
|
+
get: (key) => appStorage.get(key),
|
|
27
|
+
set: (key, value) => appStorage.set(key, value),
|
|
28
|
+
remove: (key) => appStorage.remove(key),
|
|
29
|
+
},
|
|
30
|
+
// Telemetry access (if available) - using EventBus for custom events
|
|
31
|
+
telemetry: runtime.telemetry
|
|
32
|
+
? {
|
|
33
|
+
emit: (eventName, props) => {
|
|
34
|
+
// Use EventBus to emit custom events since TelemetryClient doesn't have generic emit
|
|
35
|
+
runtime.events.publish(eventName, {
|
|
36
|
+
...props,
|
|
37
|
+
_appId: appId,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
getSessionId: () => { var _a, _b; return (_b = (_a = runtime.telemetry) === null || _a === void 0 ? void 0 : _a.getSessionId) === null || _b === void 0 ? void 0 : _b.call(_a); },
|
|
41
|
+
}
|
|
42
|
+
: undefined,
|
|
43
|
+
// Surfaces access
|
|
44
|
+
surfaces: {
|
|
45
|
+
mount: (slot, content, opts) => {
|
|
46
|
+
const handle = runtime.surfaces.mount(slot, content, {
|
|
47
|
+
...opts,
|
|
48
|
+
adaptiveId: appId,
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
unmount: () => handle.unmount(),
|
|
52
|
+
update: (newContent) => handle.update(newContent),
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
canMount: (slot, priority) => runtime.surfaces.canMount(slot, priority),
|
|
56
|
+
},
|
|
57
|
+
// Events access
|
|
58
|
+
events: {
|
|
59
|
+
subscribe: (callback) => {
|
|
60
|
+
return runtime.events.subscribe((event) => {
|
|
61
|
+
callback(event);
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
publish: (name, props) => {
|
|
65
|
+
runtime.events.publish(name, {
|
|
66
|
+
...props,
|
|
67
|
+
_appId: appId,
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
// Action registration
|
|
72
|
+
registerAction: (definition) => {
|
|
73
|
+
runtime.executors.register(definition.kind, definition.executor, definition.schema, appId, isBuiltIn);
|
|
74
|
+
registeredActions.push(definition.kind);
|
|
75
|
+
},
|
|
76
|
+
// Widget registration
|
|
77
|
+
registerWidget: (definition) => {
|
|
78
|
+
runtime.widgets.register(definition.id, definition.component, appId, definition.metadata);
|
|
79
|
+
registeredWidgets.push(definition.id);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
return context;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Clean up all resources registered by an app context.
|
|
86
|
+
*/
|
|
87
|
+
export function cleanupAppContext(appId, runtime) {
|
|
88
|
+
// Unregister all executors from this app
|
|
89
|
+
runtime.executors.unregisterBySource(appId);
|
|
90
|
+
// Unregister all widgets from this app
|
|
91
|
+
runtime.widgets.unregisterBySource(appId);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=AppContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppContext.js","sourceRoot":"","sources":["../../src/apps/AppContext.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,KAAK,GAAG,CAAC;IAEpC,mDAAmD;IACnD,MAAM,iBAAiB,GAAa,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,gDAAgD;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAe;QAC1B,KAAK;QAEL,qEAAqE;QACrE,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YACzC,GAAG,EAAE,CAAC,GAAW,EAAE,KAAc,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;YAChE,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;SAChD;QAED,qEAAqE;QACrE,SAAS,EAAE,OAAO,CAAC,SAAS;YAC1B,CAAC,CAAC;gBACE,IAAI,EAAE,CAAC,SAAiB,EAAE,KAA+B,EAAE,EAAE;oBAC3D,qFAAqF;oBACrF,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE;wBAChC,GAAG,KAAK;wBACR,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC;gBACL,CAAC;gBACD,YAAY,EAAE,GAAG,EAAE,eAAC,OAAA,MAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,YAAY,kDAAI,CAAA,EAAA;aACxD;YACH,CAAC,CAAC,SAAS;QAEb,kBAAkB;QAClB,QAAQ,EAAE;YACR,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;gBAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAW,EAAE,OAAc,EAAE;oBACjE,GAAI,IAAY;oBAChB,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE;oBAC/B,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAiB,CAAC;iBACzD,CAAC;YACJ,CAAC;YACD,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAW,EAAE,QAAQ,CAAC;SAC/E;QAED,gBAAgB;QAChB,MAAM,EAAE;YACN,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACtB,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACvB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;oBAC3B,GAAG,KAAK;oBACR,MAAM,EAAE,KAAK;iBACd,CAAC,CAAC;YACL,CAAC;SACF;QAED,sBAAsB;QACtB,cAAc,EAAE,CAAC,UAA+B,EAAE,EAAE;YAClD,OAAO,CAAC,SAAS,CAAC,QAAQ,CACxB,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,MAAM,EACjB,KAAK,EACL,SAAS,CACV,CAAC;YACF,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAED,sBAAsB;QACtB,cAAc,EAAE,CAAC,UAA+B,EAAE,EAAE;YAClD,OAAO,CAAC,OAAO,CAAC,QAAQ,CACtB,UAAU,CAAC,EAAE,EACb,UAAU,CAAC,SAAS,EACpB,KAAK,EACL,UAAU,CAAC,QAAQ,CACpB,CAAC;YACF,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,OAA2B;IAC1E,yCAAyC;IACzC,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE5C,uCAAuC;IACvC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Loader
|
|
3
|
+
*
|
|
4
|
+
* Handles loading apps from CDN based on canvas config requirements.
|
|
5
|
+
*
|
|
6
|
+
* Loading Strategy:
|
|
7
|
+
* 1. Core apps (built-in actions) are bundled with runtime - no loading needed
|
|
8
|
+
* 2. External apps are loaded from CDN when config references them
|
|
9
|
+
*
|
|
10
|
+
* The loader determines which apps are needed by scanning the canvas config for:
|
|
11
|
+
* - Action kinds with namespaces (e.g., "gamification:awardBadge")
|
|
12
|
+
* - Widget IDs with namespaces (e.g., "gamification:leaderboard")
|
|
13
|
+
* - Explicit app references in config
|
|
14
|
+
*/
|
|
15
|
+
import type { AppManifest } from "./types";
|
|
16
|
+
import type { AppRegistry } from "./AppRegistry";
|
|
17
|
+
/**
|
|
18
|
+
* App loading options.
|
|
19
|
+
*/
|
|
20
|
+
export interface AppLoaderOptions {
|
|
21
|
+
/** Base URL for CDN app bundles */
|
|
22
|
+
cdnBase: string;
|
|
23
|
+
/** App registry to register loaded apps */
|
|
24
|
+
registry: AppRegistry;
|
|
25
|
+
/** Timeout for loading apps (ms) */
|
|
26
|
+
timeout?: number;
|
|
27
|
+
/** Callback when an app starts loading */
|
|
28
|
+
onLoadStart?: (appId: string) => void;
|
|
29
|
+
/** Callback when an app finishes loading */
|
|
30
|
+
onLoadEnd?: (appId: string, success: boolean, error?: string) => void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* App load result.
|
|
34
|
+
*/
|
|
35
|
+
export interface AppLoadResult {
|
|
36
|
+
appId: string;
|
|
37
|
+
success: boolean;
|
|
38
|
+
error?: string;
|
|
39
|
+
manifest?: AppManifest;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Canvas config for determining which apps to load.
|
|
43
|
+
*/
|
|
44
|
+
export interface CanvasConfigForLoader {
|
|
45
|
+
/** Actions in the config */
|
|
46
|
+
actions?: Array<{
|
|
47
|
+
kind: string;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}>;
|
|
50
|
+
/** Explicit app IDs to load */
|
|
51
|
+
apps?: string[];
|
|
52
|
+
/** Widgets referenced in actions */
|
|
53
|
+
widgets?: Array<{
|
|
54
|
+
widgetId?: string;
|
|
55
|
+
widget?: {
|
|
56
|
+
widgetId: string;
|
|
57
|
+
};
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Check if an action kind is a core action.
|
|
62
|
+
*/
|
|
63
|
+
export declare function isCoreActionKind(kind: string): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Extract app ID from a namespaced action kind.
|
|
66
|
+
* e.g., "gamification:awardBadge" → "gamification"
|
|
67
|
+
*/
|
|
68
|
+
export declare function getAppIdFromActionKind(kind: string): string | null;
|
|
69
|
+
/**
|
|
70
|
+
* Extract app ID from a namespaced widget ID.
|
|
71
|
+
* e.g., "gamification:leaderboard" → "gamification"
|
|
72
|
+
*/
|
|
73
|
+
export declare function getAppIdFromWidgetId(widgetId: string): string | null;
|
|
74
|
+
/**
|
|
75
|
+
* Create an app loader instance.
|
|
76
|
+
*/
|
|
77
|
+
export declare function createAppLoader(options: AppLoaderOptions): {
|
|
78
|
+
loadApp: (appId: string) => Promise<AppLoadResult>;
|
|
79
|
+
loadAppsForConfig: (config: CanvasConfigForLoader) => Promise<AppLoadResult[]>;
|
|
80
|
+
preloadApps: (appIds: string[]) => Promise<AppLoadResult[]>;
|
|
81
|
+
getRequiredApps: (config: CanvasConfigForLoader) => string[];
|
|
82
|
+
getAppUrl: (appId: string) => string;
|
|
83
|
+
};
|
|
84
|
+
export type AppLoader = ReturnType<typeof createAppLoader>;
|