@syntrologie/runtime-sdk 0.2.20 → 1.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 +756 -284
- package/README.md +310 -68
- package/dist/RuntimeProvider.d.ts +51 -0
- package/dist/RuntimeProvider.js +113 -0
- package/dist/RuntimeProvider.js.map +1 -0
- package/dist/SmartCanvasApp.d.ts +16 -10
- package/dist/SmartCanvasApp.js +45 -49
- package/dist/SmartCanvasApp.js.map +1 -1
- package/dist/SmartCanvasElement.d.ts +5 -5
- package/dist/SmartCanvasElement.js +24 -14
- package/dist/SmartCanvasElement.js.map +1 -1
- package/dist/SmartCanvasPortal.d.ts +2 -2
- package/dist/SmartCanvasPortal.js +2 -2
- 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 +117 -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 +602 -0
- package/dist/actions/validation.js.map +1 -0
- package/dist/antiFlicker.js +1 -1
- package/dist/api.d.ts +40 -26
- package/dist/api.js +90 -59
- 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 +256 -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/adaptive-chatbot/index.js +7 -0
- package/dist/apps/adaptive-chatbot/index.js.map +7 -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/faq/index.js +11 -0
- package/dist/apps/faq/index.js.map +7 -0
- package/dist/apps/gamification/index.js +2 -0
- package/dist/apps/gamification/index.js.map +7 -0
- package/dist/apps/index.d.ts +15 -0
- package/dist/apps/index.js +17 -0
- package/dist/apps/index.js.map +1 -0
- package/dist/apps/nav/index.js +11 -0
- package/dist/apps/nav/index.js.map +7 -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/blocks/data/ComparisonBlock.d.ts +1 -1
- package/dist/blocks/data/ComparisonBlock.js +40 -40
- package/dist/blocks/data/ComparisonBlock.js.map +1 -1
- package/dist/blocks/data/StatsBlock.d.ts +1 -1
- package/dist/blocks/data/StatsBlock.js +41 -41
- package/dist/blocks/data/StatsBlock.js.map +1 -1
- package/dist/blocks/data/index.d.ts +2 -2
- package/dist/blocks/data/index.js +2 -2
- package/dist/blocks/index.d.ts +5 -5
- package/dist/blocks/index.js +29 -29
- package/dist/blocks/index.js.map +1 -1
- package/dist/blocks/interactive/ChecklistBlock.d.ts +1 -1
- package/dist/blocks/interactive/ChecklistBlock.js +60 -60
- package/dist/blocks/interactive/ChecklistBlock.js.map +1 -1
- package/dist/blocks/interactive/RatingBlock.d.ts +1 -1
- package/dist/blocks/interactive/RatingBlock.js +75 -65
- package/dist/blocks/interactive/RatingBlock.js.map +1 -1
- package/dist/blocks/interactive/index.d.ts +2 -2
- package/dist/blocks/interactive/index.js +2 -2
- package/dist/blocks/notification/NotificationBlock.d.ts +2 -2
- package/dist/blocks/notification/NotificationBlock.js +67 -63
- package/dist/blocks/notification/NotificationBlock.js.map +1 -1
- package/dist/blocks/notification/index.d.ts +1 -1
- package/dist/blocks/notification/index.js +1 -1
- package/dist/bootstrap.d.ts +47 -9
- package/dist/bootstrap.js +237 -69
- package/dist/bootstrap.js.map +1 -1
- package/dist/components/ShadowCanvasOverlay.d.ts +6 -6
- package/dist/components/ShadowCanvasOverlay.js +144 -107
- package/dist/components/ShadowCanvasOverlay.js.map +1 -1
- package/dist/components/TileCard.d.ts +5 -5
- package/dist/components/TileCard.js +204 -154
- package/dist/components/TileCard.js.map +1 -1
- package/dist/components/TileWheel.d.ts +3 -3
- package/dist/components/TileWheel.js +7 -7
- package/dist/components/TileWheel.js.map +1 -1
- package/dist/config-validator.d.ts +49 -0
- package/dist/config-validator.js +173 -0
- package/dist/config-validator.js.map +1 -0
- package/dist/configFetcher.d.ts +2 -2
- package/dist/configFetcher.js +20 -8
- package/dist/configFetcher.js.map +1 -1
- package/dist/context/ContextManager.d.ts +66 -0
- package/dist/context/ContextManager.js +268 -0
- package/dist/context/ContextManager.js.map +1 -0
- package/dist/context/index.d.ts +7 -0
- package/dist/context/index.js +7 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/schema.d.ts +360 -0
- package/dist/context/schema.js +50 -0
- package/dist/context/schema.js.map +1 -0
- package/dist/context/types.d.ts +101 -0
- package/dist/context/types.js +8 -0
- package/dist/context/types.js.map +1 -0
- package/dist/decisions/engine.d.ts +43 -0
- package/dist/decisions/engine.js +112 -0
- package/dist/decisions/engine.js.map +1 -0
- package/dist/decisions/index.d.ts +9 -0
- package/dist/decisions/index.js +10 -0
- package/dist/decisions/index.js.map +1 -0
- package/dist/decisions/schema.d.ts +2166 -0
- package/dist/decisions/schema.js +143 -0
- package/dist/decisions/schema.js.map +1 -0
- package/dist/decisions/strategies/rules.d.ts +24 -0
- package/dist/decisions/strategies/rules.js +152 -0
- package/dist/decisions/strategies/rules.js.map +1 -0
- package/dist/decisions/strategies/score.d.ts +10 -0
- package/dist/decisions/strategies/score.js +29 -0
- package/dist/decisions/strategies/score.js.map +1 -0
- package/dist/decisions/types.d.ts +242 -0
- package/dist/decisions/types.js +2 -0
- package/dist/decisions/types.js.map +1 -0
- 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 +12 -0
- package/dist/editorLoader.js +132 -48
- package/dist/editorLoader.js.map +1 -1
- package/dist/events/EventBus.d.ts +59 -0
- package/dist/events/EventBus.js +152 -0
- package/dist/events/EventBus.js.map +1 -0
- package/dist/events/index.d.ts +9 -0
- package/dist/events/index.js +10 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/normalizers/canvas.d.ts +67 -0
- package/dist/events/normalizers/canvas.js +116 -0
- package/dist/events/normalizers/canvas.js.map +1 -0
- package/dist/events/normalizers/posthog.d.ts +53 -0
- package/dist/events/normalizers/posthog.js +163 -0
- package/dist/events/normalizers/posthog.js.map +1 -0
- package/dist/events/schema.d.ts +70 -0
- package/dist/events/schema.js +30 -0
- package/dist/events/schema.js.map +1 -0
- package/dist/events/types.d.ts +79 -0
- package/dist/events/types.js +49 -0
- package/dist/events/types.js.map +1 -0
- package/dist/experiments/adapters/growthbook.d.ts +4 -4
- package/dist/experiments/adapters/growthbook.js +5 -5
- package/dist/experiments/adapters/growthbook.js.map +1 -1
- package/dist/experiments/index.d.ts +3 -3
- package/dist/experiments/index.js +1 -1
- package/dist/experiments/registry.d.ts +2 -2
- package/dist/experiments/registry.js +2 -2
- package/dist/experiments/types.d.ts +5 -1
- package/dist/fetchers/cdnFetcher.d.ts +1 -1
- package/dist/fetchers/cdnFetcher.js +4 -8
- package/dist/fetchers/cdnFetcher.js.map +1 -1
- package/dist/fetchers/experimentsFetcher.d.ts +2 -2
- package/dist/fetchers/experimentsFetcher.js +7 -7
- package/dist/fetchers/experimentsFetcher.js.map +1 -1
- package/dist/fetchers/index.d.ts +3 -3
- package/dist/fetchers/index.js +2 -2
- package/dist/fetchers/index.js.map +1 -1
- package/dist/fetchers/registry.d.ts +1 -1
- package/dist/fetchers/registry.js +4 -4
- package/dist/fetchers/types.d.ts +1 -1
- package/dist/hooks/useCanvasOverlays.d.ts +8 -5
- package/dist/hooks/useCanvasOverlays.js +66 -17
- package/dist/hooks/useCanvasOverlays.js.map +1 -1
- package/dist/hooks/useHostPatches.d.ts +2 -2
- package/dist/hooks/useHostPatches.js +8 -8
- package/dist/hooks/useHostPatches.js.map +1 -1
- package/dist/hooks/useShadowCanvasConfig.d.ts +9 -9
- package/dist/hooks/useShadowCanvasConfig.js +24 -8
- package/dist/hooks/useShadowCanvasConfig.js.map +1 -1
- package/dist/hostPatcher/core/patcher.d.ts +1 -1
- package/dist/hostPatcher/core/patcher.js +18 -9
- package/dist/hostPatcher/core/patcher.js.map +1 -1
- package/dist/hostPatcher/core/sanitizer.js +24 -3
- package/dist/hostPatcher/core/sanitizer.js.map +1 -1
- package/dist/hostPatcher/policy/defaultPolicy.js +15 -5
- package/dist/hostPatcher/policy/defaultPolicy.js.map +1 -1
- package/dist/hostPatcher/utils/anchors.js +4 -6
- package/dist/hostPatcher/utils/anchors.js.map +1 -1
- package/dist/index.d.ts +34 -21
- package/dist/index.js +46 -19
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +29 -0
- package/dist/logger.js +81 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/sessionMetrics.d.ts +1 -1
- package/dist/metrics/sessionMetrics.js +6 -6
- package/dist/overlays/fetcher.d.ts +2 -2
- package/dist/overlays/fetcher.js +4 -4
- package/dist/overlays/recipeRegistry.js +2 -2
- package/dist/overlays/recipeRegistry.js.map +1 -1
- package/dist/overlays/runtime/anchor/resolve.js +1 -1
- package/dist/overlays/runtime/anchor/resolve.js.map +1 -1
- package/dist/overlays/runtime/index.d.ts +7 -7
- package/dist/overlays/runtime/index.js +7 -7
- package/dist/overlays/runtime/overlay/highlight.js +39 -39
- package/dist/overlays/runtime/overlay/highlight.js.map +1 -1
- package/dist/overlays/runtime/overlay/modal.js +5 -5
- package/dist/overlays/runtime/overlay/modal.js.map +1 -1
- package/dist/overlays/runtime/overlay/root.js +1 -1
- package/dist/overlays/runtime/overlay/runner.js +70 -23
- package/dist/overlays/runtime/overlay/runner.js.map +1 -1
- package/dist/overlays/runtime/overlay/tooltip.d.ts +1 -1
- package/dist/overlays/runtime/overlay/tooltip.js +10 -10
- package/dist/overlays/runtime/overlay/tooltip.js.map +1 -1
- package/dist/overlays/runtime/utils/dom.js +4 -1
- package/dist/overlays/runtime/utils/dom.js.map +1 -1
- package/dist/overlays/schema.d.ts +98 -98
- package/dist/overlays/schema.js +12 -8
- package/dist/overlays/schema.js.map +1 -1
- package/dist/react.d.ts +7 -7
- package/dist/react.js +4 -4
- package/dist/react.js.map +1 -1
- package/dist/render/RenderContext.d.ts +2 -2
- package/dist/render/RenderContext.js +5 -5
- package/dist/render/RenderContext.js.map +1 -1
- package/dist/render/index.d.ts +3 -3
- package/dist/render/index.js +1 -1
- package/dist/render/types.d.ts +4 -4
- package/dist/runtime.d.ts +110 -0
- package/dist/runtime.js +206 -0
- package/dist/runtime.js.map +1 -0
- package/dist/smart-canvas.esm.js +155 -78
- package/dist/smart-canvas.esm.js.map +4 -4
- package/dist/smart-canvas.js +44390 -37343
- package/dist/smart-canvas.js.map +4 -4
- package/dist/smart-canvas.min.js +156 -78
- package/dist/smart-canvas.min.js.map +4 -4
- package/dist/state/StateStore.d.ts +41 -0
- package/dist/state/StateStore.js +170 -0
- package/dist/state/StateStore.js.map +1 -0
- package/dist/state/helpers/cooldowns.d.ts +7 -0
- package/dist/state/helpers/cooldowns.js +31 -0
- package/dist/state/helpers/cooldowns.js.map +1 -0
- package/dist/state/helpers/dismissals.d.ts +7 -0
- package/dist/state/helpers/dismissals.js +34 -0
- package/dist/state/helpers/dismissals.js.map +1 -0
- package/dist/state/helpers/frequency.d.ts +8 -0
- package/dist/state/helpers/frequency.js +43 -0
- package/dist/state/helpers/frequency.js.map +1 -0
- package/dist/state/index.d.ts +7 -0
- package/dist/state/index.js +7 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/schema.d.ts +49 -0
- package/dist/state/schema.js +25 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/state/types.d.ts +137 -0
- package/dist/state/types.js +9 -0
- package/dist/state/types.js.map +1 -0
- 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 +88 -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 +228 -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/noop.d.ts +12 -0
- package/dist/telemetry/adapters/noop.js +42 -0
- package/dist/telemetry/adapters/noop.js.map +1 -0
- package/dist/telemetry/adapters/posthog.d.ts +9 -3
- package/dist/telemetry/adapters/posthog.js +36 -14
- package/dist/telemetry/adapters/posthog.js.map +1 -1
- package/dist/telemetry/index.d.ts +4 -3
- package/dist/telemetry/index.js +3 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/registry.d.ts +2 -2
- package/dist/telemetry/registry.js +4 -2
- package/dist/telemetry/registry.js.map +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/theme/ThemeProvider.d.ts +2 -2
- package/dist/theme/ThemeProvider.js +21 -21
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/defaultTheme.d.ts +2 -2
- package/dist/theme/defaultTheme.js +111 -111
- package/dist/theme/defaultTheme.js.map +1 -1
- package/dist/theme/extractHostTheme.d.ts +1 -1
- package/dist/theme/extractHostTheme.js +42 -44
- package/dist/theme/extractHostTheme.js.map +1 -1
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.js +3 -3
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/types.d.ts +2 -2
- package/dist/token.d.ts +2 -0
- package/dist/token.js +3 -6
- package/dist/token.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 +95 -54
- package/dist/types.js +15 -2
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +13 -0
- package/dist/version.js +14 -0
- package/dist/version.js.map +1 -0
- 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 +27 -11
- package/schema/canvas-config.schema.json +666 -227
- package/schema/runtime-context.schema.json +127 -0
package/dist/earlyPatcher.js
CHANGED
|
@@ -1,69 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Early
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Revert all currently active patches
|
|
2
|
+
* Early Patcher - DEPRECATED
|
|
3
|
+
*
|
|
4
|
+
* This module is kept for backward compatibility but all functionality
|
|
5
|
+
* has moved to ActionEngine. Actions are now applied through the runtime.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Use ActionEngine through SmartCanvasRuntime instead.
|
|
10
8
|
*/
|
|
9
|
+
// Re-export empty functions for any code still importing from here
|
|
11
10
|
export function revertAllPatches() {
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
revertPatch(id);
|
|
15
|
-
}
|
|
16
|
-
catch (e) {
|
|
17
|
-
console.warn(`[SmartCanvas] Failed to revert patch ${id}`, e);
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
activePatchIds.clear();
|
|
21
|
-
console.log('[SmartCanvas] Reverted all patches');
|
|
11
|
+
console.warn('[SmartCanvas] revertAllPatches is deprecated. Use ActionEngine instead.');
|
|
22
12
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
* This runs before React components are mounted
|
|
26
|
-
*/
|
|
27
|
-
export function applyPatchesEarly(config) {
|
|
28
|
-
const { patches = [], onComplete } = config;
|
|
29
|
-
// Apply each patch synchronously
|
|
30
|
-
let appliedCount = 0;
|
|
31
|
-
patches.forEach(patch => {
|
|
32
|
-
try {
|
|
33
|
-
const result = applyPatch(patch, {
|
|
34
|
-
policy: defaultPolicy,
|
|
35
|
-
shadowHost: null // No shadow DOM yet, apply to main document
|
|
36
|
-
});
|
|
37
|
-
if (result.ok) {
|
|
38
|
-
appliedCount++;
|
|
39
|
-
activePatchIds.add(patch.id);
|
|
40
|
-
console.log(`[SmartCanvas] Early patch applied: ${patch.id}`);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
console.warn(`[SmartCanvas] Early patch failed: ${patch.id}`, result.reason);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
console.error(`[SmartCanvas] Error applying early patch: ${patch.id}`, error);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
console.log(`[SmartCanvas] Applied ${appliedCount}/${patches.length} patches early`);
|
|
51
|
-
// Callback when done
|
|
52
|
-
if (onComplete) {
|
|
53
|
-
onComplete();
|
|
54
|
-
}
|
|
13
|
+
export function applyPatchesEarly() {
|
|
14
|
+
console.warn('[SmartCanvas] applyPatchesEarly is deprecated. Use ActionEngine instead.');
|
|
55
15
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
export function extractPatchesFromConfig(config) {
|
|
60
|
-
if (!config || !config.patches)
|
|
61
|
-
return [];
|
|
62
|
-
return config.patches.map((patch, index) => ({
|
|
63
|
-
id: patch.id || `patch_${index}`,
|
|
64
|
-
anchor: patch.anchor,
|
|
65
|
-
operations: patch.operations || [],
|
|
66
|
-
invariants: patch.invariants
|
|
67
|
-
}));
|
|
16
|
+
export function extractPatchesFromConfig() {
|
|
17
|
+
console.warn('[SmartCanvas] extractPatchesFromConfig is deprecated. Config now uses actions[].');
|
|
18
|
+
return [];
|
|
68
19
|
}
|
|
69
20
|
//# sourceMappingURL=earlyPatcher.js.map
|
package/dist/earlyPatcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"earlyPatcher.js","sourceRoot":"","sources":["../src/earlyPatcher.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"earlyPatcher.js","sourceRoot":"","sources":["../src/earlyPatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mEAAmE;AACnE,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IACjG,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/dist/editorLoader.d.ts
CHANGED
|
@@ -4,6 +4,17 @@ export declare const DEFAULT_EDITOR_URL = "https://cdn.syntrologie.com/editor-sd
|
|
|
4
4
|
* Requires editor_token parameter for security (not just syntro_editor flag).
|
|
5
5
|
*/
|
|
6
6
|
export declare const shouldLoadEditor: () => boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Checks if audit mode should be activated based on URL query parameters.
|
|
9
|
+
* Audit mode enables element marking for product touring.
|
|
10
|
+
* Requires audit_token parameter for security.
|
|
11
|
+
*/
|
|
12
|
+
export declare const isAuditMode: () => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if any SDK mode (editor or audit) should be loaded.
|
|
15
|
+
* Returns the mode type if active, or null if neither.
|
|
16
|
+
*/
|
|
17
|
+
export declare const getActiveSdkMode: () => "editor" | "audit" | null;
|
|
7
18
|
export interface EditorLoadOptions {
|
|
8
19
|
/** URL to load editor SDK from */
|
|
9
20
|
editorUrl?: string;
|
|
@@ -13,5 +24,6 @@ export interface EditorLoadOptions {
|
|
|
13
24
|
/**
|
|
14
25
|
* Dynamically loads the Editor SDK script.
|
|
15
26
|
* Validates URL against allowlist and supports SRI integrity checking.
|
|
27
|
+
* Requires a valid token (editor_token or audit_token) in URL params.
|
|
16
28
|
*/
|
|
17
29
|
export declare const loadEditorSdk: (editorUrlOrOptions?: string | EditorLoadOptions) => Promise<void>;
|
package/dist/editorLoader.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { debug, warn } from './logger';
|
|
2
|
+
export const DEFAULT_EDITOR_URL = 'https://cdn.syntrologie.com/editor-sdk/latest/editor-sdk.js';
|
|
2
3
|
/**
|
|
3
4
|
* Allowed hosts for loading the editor SDK.
|
|
4
5
|
* Only scripts from these hosts will be loaded.
|
|
@@ -15,44 +16,50 @@ const ALLOWED_EDITOR_HOSTS = [
|
|
|
15
16
|
/**
|
|
16
17
|
* Validates that an editor URL is from an allowed host.
|
|
17
18
|
* Requires HTTPS for non-localhost URLs.
|
|
19
|
+
* Relative URLs (starting with /) are allowed and assumed to be same-origin.
|
|
18
20
|
*/
|
|
19
21
|
function validateEditorUrl(url) {
|
|
20
|
-
|
|
22
|
+
debug('Syntro Runtime', 'Validating editor URL:', url);
|
|
21
23
|
try {
|
|
24
|
+
// Allow relative URLs (same-origin) - they start with /
|
|
25
|
+
if (url.startsWith('/')) {
|
|
26
|
+
debug('Syntro Runtime', '✓ Relative URL allowed (same-origin):', url);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
22
29
|
const parsed = new URL(url);
|
|
23
30
|
const isLocalhost = /^(localhost|127\.0\.0\.1)$/.test(parsed.hostname);
|
|
24
|
-
|
|
31
|
+
debug('Syntro Runtime', 'Parsed URL:', {
|
|
25
32
|
hostname: parsed.hostname,
|
|
26
33
|
protocol: parsed.protocol,
|
|
27
34
|
isLocalhost,
|
|
28
35
|
});
|
|
29
36
|
// Require HTTPS for non-localhost
|
|
30
37
|
if (parsed.protocol !== 'https:' && !isLocalhost) {
|
|
31
|
-
|
|
38
|
+
warn('Syntro Runtime', '❌ Editor URL must use HTTPS:', url);
|
|
32
39
|
return false;
|
|
33
40
|
}
|
|
34
41
|
// Check against allowlist - handle both exact match and suffix match
|
|
35
|
-
const isAllowed = ALLOWED_EDITOR_HOSTS.some(host => {
|
|
42
|
+
const isAllowed = ALLOWED_EDITOR_HOSTS.some((host) => {
|
|
36
43
|
if (host.startsWith('.')) {
|
|
37
44
|
// Suffix match for wildcards like '.syntrologie.com'
|
|
38
45
|
return parsed.hostname.endsWith(host) || parsed.hostname === host.slice(1);
|
|
39
46
|
}
|
|
40
47
|
return parsed.hostname === host;
|
|
41
48
|
});
|
|
42
|
-
|
|
49
|
+
debug('Syntro Runtime', 'Host allowlist check:', {
|
|
43
50
|
hostname: parsed.hostname,
|
|
44
51
|
allowedHosts: ALLOWED_EDITOR_HOSTS,
|
|
45
52
|
isAllowed,
|
|
46
53
|
});
|
|
47
54
|
if (!isAllowed) {
|
|
48
|
-
|
|
55
|
+
warn('Syntro Runtime', '❌ Editor URL host not in allowlist:', parsed.hostname);
|
|
49
56
|
return false;
|
|
50
57
|
}
|
|
51
|
-
|
|
58
|
+
debug('Syntro Runtime', '✓ Editor URL validated');
|
|
52
59
|
return true;
|
|
53
60
|
}
|
|
54
61
|
catch (e) {
|
|
55
|
-
|
|
62
|
+
warn('Syntro Runtime', '❌ Invalid editor URL: ' + url, e);
|
|
56
63
|
return false;
|
|
57
64
|
}
|
|
58
65
|
}
|
|
@@ -62,91 +69,168 @@ function validateEditorUrl(url) {
|
|
|
62
69
|
*/
|
|
63
70
|
export const shouldLoadEditor = () => {
|
|
64
71
|
var _a;
|
|
65
|
-
|
|
66
|
-
if (typeof window ===
|
|
67
|
-
|
|
72
|
+
debug('Syntro Runtime', '====== EDITOR LOAD CHECK ======');
|
|
73
|
+
if (typeof window === 'undefined') {
|
|
74
|
+
debug('Syntro Runtime', 'Not in browser - skipping editor');
|
|
68
75
|
return false;
|
|
69
76
|
}
|
|
70
77
|
const params = new URLSearchParams(window.location.search);
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
debug('Syntro Runtime', 'URL:', window.location.href);
|
|
79
|
+
debug('Syntro Runtime', 'Search params:', window.location.search);
|
|
73
80
|
// Require editor_token for security - prevents arbitrary editor activation
|
|
74
|
-
const hasEditorFlag = params.has(
|
|
75
|
-
const hasEditorToken = params.has(
|
|
76
|
-
|
|
81
|
+
const hasEditorFlag = params.has('syntro_editor') || params.has('syntro-editor');
|
|
82
|
+
const hasEditorToken = params.has('editor_token');
|
|
83
|
+
debug('Syntro Runtime', 'Editor flags:', {
|
|
77
84
|
hasEditorFlag,
|
|
78
85
|
hasEditorToken,
|
|
79
|
-
syntro_editor: params.get(
|
|
80
|
-
|
|
81
|
-
editor_token: hasEditorToken ? `${(_a = params.get(
|
|
86
|
+
syntro_editor: params.get('syntro_editor'),
|
|
87
|
+
'syntro-editor': params.get('syntro-editor'),
|
|
88
|
+
editor_token: hasEditorToken ? `${(_a = params.get('editor_token')) === null || _a === void 0 ? void 0 : _a.slice(0, 10)}...` : 'none',
|
|
82
89
|
});
|
|
83
90
|
if (hasEditorFlag && !hasEditorToken) {
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
warn('Syntro Runtime', '❌ Editor activation requires editor_token parameter');
|
|
92
|
+
debug('Syntro Runtime', '================================');
|
|
86
93
|
return false;
|
|
87
94
|
}
|
|
88
95
|
const shouldLoad = hasEditorFlag && hasEditorToken;
|
|
89
|
-
|
|
90
|
-
|
|
96
|
+
debug('Syntro Runtime', 'Should load editor:', shouldLoad);
|
|
97
|
+
debug('Syntro Runtime', '================================');
|
|
91
98
|
return shouldLoad;
|
|
92
99
|
};
|
|
100
|
+
/**
|
|
101
|
+
* Checks if audit mode should be activated based on URL query parameters.
|
|
102
|
+
* Audit mode enables element marking for product touring.
|
|
103
|
+
* Requires audit_token parameter for security.
|
|
104
|
+
*/
|
|
105
|
+
export const isAuditMode = () => {
|
|
106
|
+
var _a;
|
|
107
|
+
debug('Syntro Runtime', '====== AUDIT MODE CHECK ======');
|
|
108
|
+
if (typeof window === 'undefined') {
|
|
109
|
+
debug('Syntro Runtime', 'Not in browser - skipping audit');
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const params = new URLSearchParams(window.location.search);
|
|
113
|
+
const hasAuditFlag = params.has('syntro_audit');
|
|
114
|
+
const hasAuditToken = params.has('audit_token');
|
|
115
|
+
const auditSessionId = params.get('audit_session_id');
|
|
116
|
+
debug('Syntro Runtime', 'Audit flags:', {
|
|
117
|
+
hasAuditFlag,
|
|
118
|
+
hasAuditToken,
|
|
119
|
+
auditSessionId: auditSessionId ? `${auditSessionId.slice(0, 8)}...` : 'none',
|
|
120
|
+
audit_token: hasAuditToken ? `${(_a = params.get('audit_token')) === null || _a === void 0 ? void 0 : _a.slice(0, 10)}...` : 'none',
|
|
121
|
+
});
|
|
122
|
+
// Require syntro_audit flag to activate audit mode
|
|
123
|
+
if (!hasAuditFlag) {
|
|
124
|
+
debug('Syntro Runtime', 'No syntro_audit param - not in audit mode');
|
|
125
|
+
debug('Syntro Runtime', '================================');
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
// Require audit_token for security - prevents arbitrary audit activation
|
|
129
|
+
if (!hasAuditToken) {
|
|
130
|
+
warn('Syntro Runtime', '❌ Audit activation requires audit_token parameter');
|
|
131
|
+
debug('Syntro Runtime', '================================');
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
debug('Syntro Runtime', '✓ Audit mode active');
|
|
135
|
+
debug('Syntro Runtime', '================================');
|
|
136
|
+
return true;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Checks if any SDK mode (editor or audit) should be loaded.
|
|
140
|
+
* Returns the mode type if active, or null if neither.
|
|
141
|
+
*/
|
|
142
|
+
export const getActiveSdkMode = () => {
|
|
143
|
+
if (shouldLoadEditor())
|
|
144
|
+
return 'editor';
|
|
145
|
+
if (isAuditMode())
|
|
146
|
+
return 'audit';
|
|
147
|
+
return null;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Gets the token from URL params (editor_token or audit_token).
|
|
151
|
+
* Returns the token value or null if not found.
|
|
152
|
+
*/
|
|
153
|
+
function getTokenFromUrl() {
|
|
154
|
+
if (typeof window === 'undefined')
|
|
155
|
+
return null;
|
|
156
|
+
const params = new URLSearchParams(window.location.search);
|
|
157
|
+
return params.get('editor_token') || params.get('audit_token');
|
|
158
|
+
}
|
|
93
159
|
/**
|
|
94
160
|
* Dynamically loads the Editor SDK script.
|
|
95
161
|
* Validates URL against allowlist and supports SRI integrity checking.
|
|
162
|
+
* Requires a valid token (editor_token or audit_token) in URL params.
|
|
96
163
|
*/
|
|
97
164
|
export const loadEditorSdk = async (editorUrlOrOptions) => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
console.log('[Syntro Runtime] Not in browser - skipping editor SDK load');
|
|
165
|
+
debug('Syntro Runtime', '====== LOAD EDITOR SDK ======');
|
|
166
|
+
if (typeof window === 'undefined') {
|
|
167
|
+
debug('Syntro Runtime', 'Not in browser - skipping editor SDK load');
|
|
102
168
|
return;
|
|
103
169
|
}
|
|
104
170
|
if (window.SyntroEditor) {
|
|
105
|
-
|
|
171
|
+
debug('Syntro Runtime', 'Editor SDK already loaded (window.SyntroEditor exists)');
|
|
106
172
|
return;
|
|
107
173
|
}
|
|
108
174
|
// Handle both legacy string arg and new options object
|
|
109
175
|
const options = typeof editorUrlOrOptions === 'string'
|
|
110
176
|
? { editorUrl: editorUrlOrOptions }
|
|
111
|
-
: editorUrlOrOptions !== null && editorUrlOrOptions !== void 0 ? editorUrlOrOptions : {};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
177
|
+
: (editorUrlOrOptions !== null && editorUrlOrOptions !== void 0 ? editorUrlOrOptions : {});
|
|
178
|
+
// Check for editor SDK URL override in query params
|
|
179
|
+
const params = new URLSearchParams(window.location.search);
|
|
180
|
+
const urlParamEditorSdk = params.get('syntro_editor_sdk_url');
|
|
181
|
+
// If api_base is provided, derive editor SDK URL from it
|
|
182
|
+
const apiBase = params.get('api_base');
|
|
183
|
+
const derivedEditorSdk = apiBase ? `${apiBase}/api/editor/sdk/editor-sdk.js` : null;
|
|
184
|
+
// Priority: URL param > api_base derived > options > CDN default
|
|
185
|
+
const baseEditorUrl = urlParamEditorSdk || derivedEditorSdk || options.editorUrl || DEFAULT_EDITOR_URL;
|
|
186
|
+
// Get token from URL params (required for SDK access)
|
|
187
|
+
const token = getTokenFromUrl();
|
|
188
|
+
if (!token) {
|
|
189
|
+
warn('Syntro Runtime', '❌ No token found in URL params. SDK requires editor_token or audit_token.');
|
|
190
|
+
debug('Syntro Runtime', '================================');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Append token as query param to the SDK URL
|
|
194
|
+
const editorUrl = `${baseEditorUrl}?token=${encodeURIComponent(token)}`;
|
|
195
|
+
debug('Syntro Runtime', 'Editor URL:', editorUrl);
|
|
196
|
+
debug('Syntro Runtime', 'Options:', {
|
|
115
197
|
hasIntegrity: !!options.integrity,
|
|
116
|
-
isDefault:
|
|
198
|
+
isDefault: baseEditorUrl === DEFAULT_EDITOR_URL,
|
|
199
|
+
hasApiBase: !!apiBase,
|
|
200
|
+
tokenPrefix: token.slice(0, 10) + '...',
|
|
117
201
|
});
|
|
118
|
-
// Security: Validate URL against allowlist
|
|
119
|
-
if (!validateEditorUrl(
|
|
120
|
-
console.error('[Syntro Runtime] ❌ BLOCKED: Editor from untrusted URL:',
|
|
121
|
-
|
|
202
|
+
// Security: Validate URL against allowlist (check base URL without token)
|
|
203
|
+
if (!validateEditorUrl(baseEditorUrl)) {
|
|
204
|
+
console.error('[Syntro Runtime] ❌ BLOCKED: Editor from untrusted URL:', baseEditorUrl);
|
|
205
|
+
debug('Syntro Runtime', '================================');
|
|
122
206
|
return;
|
|
123
207
|
}
|
|
124
|
-
|
|
208
|
+
debug('Syntro Runtime', '✓ URL validated, injecting script tag...');
|
|
125
209
|
return new Promise((resolve, reject) => {
|
|
126
|
-
const script = document.createElement(
|
|
210
|
+
const script = document.createElement('script');
|
|
127
211
|
script.src = editorUrl;
|
|
128
212
|
script.async = true;
|
|
129
213
|
// Add SRI integrity check if provided
|
|
130
214
|
if (options.integrity) {
|
|
131
215
|
script.integrity = options.integrity;
|
|
132
|
-
script.crossOrigin =
|
|
133
|
-
|
|
216
|
+
script.crossOrigin = 'anonymous';
|
|
217
|
+
debug('Syntro Runtime', 'SRI integrity check enabled');
|
|
134
218
|
}
|
|
135
219
|
script.onload = () => {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
220
|
+
debug('Syntro Runtime', '✓ Editor SDK script loaded successfully');
|
|
221
|
+
debug('Syntro Runtime', 'window.SyntroEditor:', !!window.SyntroEditor);
|
|
222
|
+
debug('Syntro Runtime', '================================');
|
|
139
223
|
resolve();
|
|
140
224
|
};
|
|
141
225
|
script.onerror = (err) => {
|
|
142
226
|
console.error('[Syntro Runtime] ❌ Failed to load Editor SDK:', err);
|
|
143
227
|
console.error('[Syntro Runtime] URL attempted:', editorUrl);
|
|
144
|
-
console.error('[Syntro Runtime] Check: Is the URL accessible? CORS? Network?');
|
|
145
|
-
|
|
228
|
+
console.error('[Syntro Runtime] Check: Is the URL accessible? CORS? Network? Token valid?');
|
|
229
|
+
debug('Syntro Runtime', '================================');
|
|
146
230
|
reject(err);
|
|
147
231
|
};
|
|
148
232
|
document.head.appendChild(script);
|
|
149
|
-
|
|
233
|
+
debug('Syntro Runtime', 'Script tag appended to <head>');
|
|
150
234
|
});
|
|
151
235
|
};
|
|
152
236
|
//# sourceMappingURL=editorLoader.js.map
|
package/dist/editorLoader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"editorLoader.js","sourceRoot":"","sources":["../src/editorLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventBus - Normalized event stream for the runtime.
|
|
3
|
+
*
|
|
4
|
+
* The EventBus provides:
|
|
5
|
+
* - Publish/subscribe for normalized events
|
|
6
|
+
* - Event history for recent event lookups
|
|
7
|
+
* - Filtering by name, pattern, or source
|
|
8
|
+
*/
|
|
9
|
+
import type { NormalizedEvent, EventFilter, EventCallback, EventUnsubscribe } from './types';
|
|
10
|
+
export interface EventBusOptions {
|
|
11
|
+
/** Maximum number of events to keep in history */
|
|
12
|
+
maxHistorySize?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* EventBus class for managing normalized events.
|
|
16
|
+
*/
|
|
17
|
+
export declare class EventBus {
|
|
18
|
+
private subscriptions;
|
|
19
|
+
private history;
|
|
20
|
+
private maxHistorySize;
|
|
21
|
+
constructor(options?: EventBusOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Subscribe to events matching an optional filter.
|
|
24
|
+
* Returns an unsubscribe function.
|
|
25
|
+
*/
|
|
26
|
+
subscribe(filterOrCallback: EventFilter | EventCallback, maybeCallback?: EventCallback): EventUnsubscribe;
|
|
27
|
+
/**
|
|
28
|
+
* Publish an event to all matching subscribers.
|
|
29
|
+
*/
|
|
30
|
+
publish(name: string, props?: Record<string, unknown>, source?: NormalizedEvent['source']): void;
|
|
31
|
+
/**
|
|
32
|
+
* Publish a pre-constructed NormalizedEvent.
|
|
33
|
+
*/
|
|
34
|
+
publishEvent(event: NormalizedEvent): void;
|
|
35
|
+
/**
|
|
36
|
+
* Get recent events matching an optional filter.
|
|
37
|
+
*/
|
|
38
|
+
getRecent(filter?: EventFilter, limit?: number): NormalizedEvent[];
|
|
39
|
+
/**
|
|
40
|
+
* Check if an event with a specific name occurred within a time window.
|
|
41
|
+
*/
|
|
42
|
+
hasRecentEvent(eventName: string, withinMs: number, source?: NormalizedEvent['source']): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Count events matching a filter within a time window.
|
|
45
|
+
*/
|
|
46
|
+
countRecentEvents(filter: EventFilter, withinMs?: number): number;
|
|
47
|
+
/**
|
|
48
|
+
* Clear all event history.
|
|
49
|
+
*/
|
|
50
|
+
clearHistory(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Get the number of current subscribers.
|
|
53
|
+
*/
|
|
54
|
+
getSubscriberCount(): number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Create an EventBus instance.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createEventBus(options?: EventBusOptions): EventBus;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { EVENT_SCHEMA_VERSION } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Check if an event matches a filter.
|
|
4
|
+
*/
|
|
5
|
+
function matchesFilter(event, filter) {
|
|
6
|
+
if (!filter)
|
|
7
|
+
return true;
|
|
8
|
+
// Check name filter
|
|
9
|
+
if (filter.names && filter.names.length > 0) {
|
|
10
|
+
if (!filter.names.includes(event.name)) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
// Check pattern filter
|
|
15
|
+
if (filter.patterns && filter.patterns.length > 0) {
|
|
16
|
+
const matched = filter.patterns.some((pattern) => {
|
|
17
|
+
try {
|
|
18
|
+
const regex = new RegExp(pattern);
|
|
19
|
+
return regex.test(event.name);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
if (!matched)
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
// Check source filter
|
|
29
|
+
if (filter.sources && filter.sources.length > 0) {
|
|
30
|
+
if (!filter.sources.includes(event.source)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* EventBus class for managing normalized events.
|
|
38
|
+
*/
|
|
39
|
+
export class EventBus {
|
|
40
|
+
constructor(options = {}) {
|
|
41
|
+
var _a;
|
|
42
|
+
this.subscriptions = new Set();
|
|
43
|
+
this.history = [];
|
|
44
|
+
this.maxHistorySize = (_a = options.maxHistorySize) !== null && _a !== void 0 ? _a : 100;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Subscribe to events matching an optional filter.
|
|
48
|
+
* Returns an unsubscribe function.
|
|
49
|
+
*/
|
|
50
|
+
subscribe(filterOrCallback, maybeCallback) {
|
|
51
|
+
let filter;
|
|
52
|
+
let callback;
|
|
53
|
+
// Handle overloaded signatures
|
|
54
|
+
if (typeof filterOrCallback === 'function') {
|
|
55
|
+
filter = undefined;
|
|
56
|
+
callback = filterOrCallback;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
filter = filterOrCallback;
|
|
60
|
+
callback = maybeCallback;
|
|
61
|
+
}
|
|
62
|
+
const subscription = { filter, callback };
|
|
63
|
+
this.subscriptions.add(subscription);
|
|
64
|
+
return () => {
|
|
65
|
+
this.subscriptions.delete(subscription);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Publish an event to all matching subscribers.
|
|
70
|
+
*/
|
|
71
|
+
publish(name, props, source = 'canvas') {
|
|
72
|
+
const event = {
|
|
73
|
+
ts: Date.now(),
|
|
74
|
+
name,
|
|
75
|
+
source,
|
|
76
|
+
props,
|
|
77
|
+
schemaVersion: EVENT_SCHEMA_VERSION,
|
|
78
|
+
};
|
|
79
|
+
this.publishEvent(event);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Publish a pre-constructed NormalizedEvent.
|
|
83
|
+
*/
|
|
84
|
+
publishEvent(event) {
|
|
85
|
+
// Add to history
|
|
86
|
+
this.history.push(event);
|
|
87
|
+
if (this.history.length > this.maxHistorySize) {
|
|
88
|
+
this.history.shift();
|
|
89
|
+
}
|
|
90
|
+
// Notify matching subscribers
|
|
91
|
+
for (const subscription of this.subscriptions) {
|
|
92
|
+
if (matchesFilter(event, subscription.filter)) {
|
|
93
|
+
try {
|
|
94
|
+
subscription.callback(event);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error('[EventBus] Subscriber error:', err);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get recent events matching an optional filter.
|
|
104
|
+
*/
|
|
105
|
+
getRecent(filter, limit) {
|
|
106
|
+
let events = this.history;
|
|
107
|
+
if (filter) {
|
|
108
|
+
events = events.filter((e) => matchesFilter(e, filter));
|
|
109
|
+
}
|
|
110
|
+
if (limit && limit > 0) {
|
|
111
|
+
events = events.slice(-limit);
|
|
112
|
+
}
|
|
113
|
+
return events;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if an event with a specific name occurred within a time window.
|
|
117
|
+
*/
|
|
118
|
+
hasRecentEvent(eventName, withinMs, source) {
|
|
119
|
+
const cutoff = Date.now() - withinMs;
|
|
120
|
+
return this.history.some((e) => e.name === eventName && e.ts >= cutoff && (source === undefined || e.source === source));
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Count events matching a filter within a time window.
|
|
124
|
+
*/
|
|
125
|
+
countRecentEvents(filter, withinMs) {
|
|
126
|
+
let events = this.history.filter((e) => matchesFilter(e, filter));
|
|
127
|
+
if (withinMs !== undefined) {
|
|
128
|
+
const cutoff = Date.now() - withinMs;
|
|
129
|
+
events = events.filter((e) => e.ts >= cutoff);
|
|
130
|
+
}
|
|
131
|
+
return events.length;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Clear all event history.
|
|
135
|
+
*/
|
|
136
|
+
clearHistory() {
|
|
137
|
+
this.history = [];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the number of current subscribers.
|
|
141
|
+
*/
|
|
142
|
+
getSubscriberCount() {
|
|
143
|
+
return this.subscriptions.size;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create an EventBus instance.
|
|
148
|
+
*/
|
|
149
|
+
export function createEventBus(options = {}) {
|
|
150
|
+
return new EventBus(options);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=EventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/events/EventBus.ts"],"names":[],"mappings":"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"}
|