@active-reach/web-sdk 1.0.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/README.md +576 -0
- package/dist/aegis-sw.js +1 -0
- package/dist/aegis.min.js +2 -0
- package/dist/aegis.min.js.map +1 -0
- package/dist/analytics-B11keZ55.mjs +1854 -0
- package/dist/analytics-B11keZ55.mjs.map +1 -0
- package/dist/cdn.d.ts +18 -0
- package/dist/cdn.d.ts.map +1 -0
- package/dist/core/analytics.d.ts +47 -0
- package/dist/core/analytics.d.ts.map +1 -0
- package/dist/core/queue.d.ts +35 -0
- package/dist/core/queue.d.ts.map +1 -0
- package/dist/core/sdk-config-poller.d.ts +59 -0
- package/dist/core/sdk-config-poller.d.ts.map +1 -0
- package/dist/core/session.d.ts +41 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/transport.d.ts +50 -0
- package/dist/core/transport.d.ts.map +1 -0
- package/dist/inapp/AegisInAppManager.d.ts +126 -0
- package/dist/inapp/AegisInAppManager.d.ts.map +1 -0
- package/dist/inapp/index.d.ts +4 -0
- package/dist/inapp/index.d.ts.map +1 -0
- package/dist/inapp/renderPreview.d.ts +25 -0
- package/dist/inapp/renderPreview.d.ts.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4296 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/react.d.ts +19 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/placements/AegisPlacementManager.d.ts +88 -0
- package/dist/placements/AegisPlacementManager.d.ts.map +1 -0
- package/dist/plugins/registry.d.ts +13 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/push/AegisWebPush.d.ts +51 -0
- package/dist/push/AegisWebPush.d.ts.map +1 -0
- package/dist/push/AegisWebPush.js +203 -0
- package/dist/push/AegisWebPush.js.map +1 -0
- package/dist/react.js +70 -0
- package/dist/react.js.map +1 -0
- package/dist/snippet.min.js +1 -0
- package/dist/triggers/TriggerEngine.d.ts +114 -0
- package/dist/triggers/TriggerEngine.d.ts.map +1 -0
- package/dist/triggers/index.d.ts +3 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/types/config.d.ts +73 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/events.d.ts +127 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/plugin.d.ts +21 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/type-safe-events.d.ts +14 -0
- package/dist/types/type-safe-events.d.ts.map +1 -0
- package/dist/utils/canonical-identity.d.ts +29 -0
- package/dist/utils/canonical-identity.d.ts.map +1 -0
- package/dist/utils/consent.d.ts +40 -0
- package/dist/utils/consent.d.ts.map +1 -0
- package/dist/utils/debounce.d.ts +3 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/device.d.ts +6 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/identity.d.ts +27 -0
- package/dist/utils/identity.d.ts.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/storage.d.ts +20 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/url-parser.d.ts +23 -0
- package/dist/utils/url-parser.d.ts.map +1 -0
- package/dist/utils/uuid.d.ts +4 -0
- package/dist/utils/uuid.d.ts.map +1 -0
- package/dist/widgets/AegisWidgetManager.d.ts +194 -0
- package/dist/widgets/AegisWidgetManager.d.ts.map +1 -0
- package/dist/widgets/index.d.ts +3 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AegisInAppManager - Web SDK In-App Messaging Module
|
|
3
|
+
*
|
|
4
|
+
* Real-time SSE architecture with client-side evaluation.
|
|
5
|
+
*
|
|
6
|
+
* Security:
|
|
7
|
+
* - XSS Protection: Uses DOM APIs (createElement, textContent) instead of innerHTML
|
|
8
|
+
* - URL Validation: Prevents javascript: protocol injection
|
|
9
|
+
* - CSP Compatible: No inline styles in HTML strings
|
|
10
|
+
*
|
|
11
|
+
* Architecture:
|
|
12
|
+
* - Connects to SSE endpoint for real-time campaign updates
|
|
13
|
+
* - Initial fetch on load, then SSE for updates
|
|
14
|
+
* - Caches campaigns locally in memory
|
|
15
|
+
* - Evaluates trigger rules client-side
|
|
16
|
+
* - Tracks events (impression, click, dismiss) asynchronously
|
|
17
|
+
*/
|
|
18
|
+
export interface InAppCampaign {
|
|
19
|
+
id: string;
|
|
20
|
+
type: 'modal' | 'banner' | 'tooltip' | 'full_screen' | 'half_interstitial' | 'alert' | 'pip';
|
|
21
|
+
sub_type?: string;
|
|
22
|
+
title: string;
|
|
23
|
+
body: string;
|
|
24
|
+
image_url?: string;
|
|
25
|
+
video_url?: string;
|
|
26
|
+
action_url?: string;
|
|
27
|
+
button_text?: string;
|
|
28
|
+
background_color?: string;
|
|
29
|
+
text_color?: string;
|
|
30
|
+
priority: number;
|
|
31
|
+
expires_at?: string;
|
|
32
|
+
frequency?: {
|
|
33
|
+
max_impressions?: number;
|
|
34
|
+
max_impressions_per_day?: number;
|
|
35
|
+
cooldown_seconds?: number;
|
|
36
|
+
};
|
|
37
|
+
interactive_config?: Record<string, unknown>;
|
|
38
|
+
client_trigger?: {
|
|
39
|
+
type: string;
|
|
40
|
+
config?: Record<string, unknown>;
|
|
41
|
+
};
|
|
42
|
+
assigned_variant_id?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface AegisInAppConfig {
|
|
45
|
+
writeKey: string;
|
|
46
|
+
apiHost?: string;
|
|
47
|
+
userId?: string;
|
|
48
|
+
contactId?: string;
|
|
49
|
+
organizationId?: string;
|
|
50
|
+
debugMode?: boolean;
|
|
51
|
+
enableSSE?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare class AegisInAppManager {
|
|
54
|
+
private writeKey;
|
|
55
|
+
private apiHost;
|
|
56
|
+
private userId?;
|
|
57
|
+
private contactId?;
|
|
58
|
+
private organizationId?;
|
|
59
|
+
private debugMode;
|
|
60
|
+
private enableSSE;
|
|
61
|
+
private campaigns;
|
|
62
|
+
private displayedCampaigns;
|
|
63
|
+
private eventSource?;
|
|
64
|
+
private isInitialized;
|
|
65
|
+
private reconnectAttempts;
|
|
66
|
+
private maxReconnectAttempts;
|
|
67
|
+
constructor(config: AegisInAppConfig);
|
|
68
|
+
initialize(): Promise<void>;
|
|
69
|
+
updateUserId(userId: string): void;
|
|
70
|
+
updateContactId(contactId: string): void;
|
|
71
|
+
private connectSSE;
|
|
72
|
+
private disconnectSSE;
|
|
73
|
+
private attemptReconnect;
|
|
74
|
+
private refreshCampaigns;
|
|
75
|
+
private detectDeviceType;
|
|
76
|
+
private isNewUser;
|
|
77
|
+
private getABAssignments;
|
|
78
|
+
private processABAssignments;
|
|
79
|
+
private getVariantId;
|
|
80
|
+
private tryDisplayNextCampaign;
|
|
81
|
+
private displayCampaign;
|
|
82
|
+
/**
|
|
83
|
+
* Renders interactive sub-type campaigns (spin wheel, NPS, quiz, etc.)
|
|
84
|
+
* using DOM-safe rendering. These sub-types use the campaign's
|
|
85
|
+
* interactive_config payload for type-specific behavior.
|
|
86
|
+
*/
|
|
87
|
+
private renderInteractive;
|
|
88
|
+
private renderNPSSurvey;
|
|
89
|
+
private renderCountdownOffer;
|
|
90
|
+
private renderStarRating;
|
|
91
|
+
private renderQuickPoll;
|
|
92
|
+
private renderQuiz;
|
|
93
|
+
private createOverlay;
|
|
94
|
+
private createCTAButton;
|
|
95
|
+
private addCloseButton;
|
|
96
|
+
private renderBanner;
|
|
97
|
+
private renderModal;
|
|
98
|
+
private renderFullScreen;
|
|
99
|
+
private renderHalfInterstitial;
|
|
100
|
+
private renderAlert;
|
|
101
|
+
private renderPIP;
|
|
102
|
+
private removeBanner;
|
|
103
|
+
private removeModal;
|
|
104
|
+
private renderTooltip;
|
|
105
|
+
private addAnimationStyles;
|
|
106
|
+
private sanitizeUrl;
|
|
107
|
+
private sanitizeColor;
|
|
108
|
+
/**
|
|
109
|
+
* Track in-app event via the standard Event Ingress pipeline.
|
|
110
|
+
*
|
|
111
|
+
* Events flow: SDK → Event Ingress → Kafka → Governance Consumer
|
|
112
|
+
* → Event Engine → ClickHouse (in_app_events + events_with_ttl)
|
|
113
|
+
*
|
|
114
|
+
* The event_type uses the canonical prefix `in_app.` so the event
|
|
115
|
+
* switchboard maps it to the correct canonical form:
|
|
116
|
+
* in_app.impression → engagement.view
|
|
117
|
+
* in_app.clicked → engagement.click
|
|
118
|
+
* in_app.dismissed → engagement.dismiss
|
|
119
|
+
*/
|
|
120
|
+
private trackEvent;
|
|
121
|
+
private log;
|
|
122
|
+
destroy(options?: {
|
|
123
|
+
clearABState?: boolean;
|
|
124
|
+
}): void;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=AegisInAppManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisInAppManager.d.ts","sourceRoot":"","sources":["../../src/inapp/AegisInAppManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inapp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* renderPreview — Static Preview Renderer for Dashboard iframe (Critical Fix A)
|
|
3
|
+
*
|
|
4
|
+
* Used exclusively by the sandboxed iframe preview route
|
|
5
|
+
* (`/api/preview/in-app/route.tsx`). Renders a single campaign into the
|
|
6
|
+
* current document body using the same rendering logic as the production SDK.
|
|
7
|
+
*
|
|
8
|
+
* Data flow:
|
|
9
|
+
* editor-sidebar.tsx → onChange → formState → postMessage({type:'preview_update', config})
|
|
10
|
+
* → iframe receives message → calls renderPreview(config)
|
|
11
|
+
*
|
|
12
|
+
* This ensures 100% fidelity between the dashboard editor preview and
|
|
13
|
+
* production rendering — both use the same SDK code.
|
|
14
|
+
*/
|
|
15
|
+
import type { InAppCampaign } from './AegisInAppManager';
|
|
16
|
+
/**
|
|
17
|
+
* Renders a single in-app campaign into the current document for preview.
|
|
18
|
+
*
|
|
19
|
+
* Creates a temporary AegisInAppManager with preview-only config (no tracking,
|
|
20
|
+
* no SSE, no network requests). Calls the same rendering pipeline as production.
|
|
21
|
+
*/
|
|
22
|
+
export declare function renderPreview(config: InAppCampaign & {
|
|
23
|
+
interactive_config?: Record<string, unknown>;
|
|
24
|
+
}): void;
|
|
25
|
+
//# sourceMappingURL=renderPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderPreview.d.ts","sourceRoot":"","sources":["../../src/inapp/renderPreview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAoC5G"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Aegis } from './core/analytics';
|
|
2
|
+
declare const aegis: Aegis;
|
|
3
|
+
export default aegis;
|
|
4
|
+
export { Aegis } from './core/analytics';
|
|
5
|
+
export type { AegisConfig, CellEndpoint, CellRegion } from './types/config';
|
|
6
|
+
export type { AegisEvent, TrackEvent, IdentifyEvent, PageEvent, GroupEvent, AliasEvent, EventContext, BatchPayload, BatchResponse, } from './types/events';
|
|
7
|
+
export type { Plugin, PluginRegistry } from './types/plugin';
|
|
8
|
+
export { debounce, throttle } from './utils/debounce';
|
|
9
|
+
export type { ConsentPreferences, ConsentCategory, ConsentStatus, } from './utils/consent';
|
|
10
|
+
export { AegisInAppManager } from './inapp';
|
|
11
|
+
export type { InAppCampaign, AegisInAppConfig } from './inapp';
|
|
12
|
+
export { renderPreview } from './inapp';
|
|
13
|
+
export { AegisPlacementManager } from './placements/AegisPlacementManager';
|
|
14
|
+
export type { PlacementContent, PlacementSlot, AegisPlacementConfig, } from './placements/AegisPlacementManager';
|
|
15
|
+
export { AegisWidgetManager } from './widgets';
|
|
16
|
+
export type { WidgetConfig, GamificationPrize, AegisWidgetConfig, } from './widgets';
|
|
17
|
+
export { TriggerEngine } from './triggers';
|
|
18
|
+
export type { TriggerRule, ScrollDepthConfig, TimeOnPageConfig, ExitIntentConfig, InactivityConfig, TriggerEvent, } from './triggers';
|
|
19
|
+
export { SdkConfigPoller } from './core/sdk-config-poller';
|
|
20
|
+
export type { SdkConfig, SdkConfigPollerOptions, ConfigChangeCallback } from './core/sdk-config-poller';
|
|
21
|
+
export { AegisWebPush } from './push/AegisWebPush';
|
|
22
|
+
export type { AegisWebPushConfig, AegisAPIClient, ContactIdentity, PushEventTracker, } from './push/AegisWebPush';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC;AAErB,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5E,YAAY,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,oBAAoB,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAExG,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC"}
|