@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,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Aegis } from '../core/analytics';
|
|
3
|
+
import { AegisConfig } from '../types/config';
|
|
4
|
+
interface AegisContextValue {
|
|
5
|
+
aegis: Aegis | null;
|
|
6
|
+
isReady: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface AegisProviderProps {
|
|
9
|
+
writeKey: string;
|
|
10
|
+
config?: Partial<AegisConfig>;
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare const AegisProvider: React.FC<AegisProviderProps>;
|
|
14
|
+
export declare const useAegis: () => AegisContextValue;
|
|
15
|
+
export declare const useTrackEvent: () => (eventName: string, properties?: Record<string, any>) => void;
|
|
16
|
+
export declare const usePageView: (pageName?: string, properties?: Record<string, any>, dependencies?: any[]) => void;
|
|
17
|
+
export declare const useIdentifyUser: () => (userId: string, traits?: Record<string, any>) => void;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/integrations/react.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyD,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA4BtD,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAO,iBAQ3B,CAAC;AAEF,eAAO,MAAM,aAAa,oBAIV,MAAM,eAAe,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAOvD,CAAC;AAEF,eAAO,MAAM,WAAW,cACX,MAAM,eACJ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAClB,GAAG,EAAE,SASpB,CAAC;AAEF,eAAO,MAAM,eAAe,iBAIf,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,SAOhD,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AegisPlacementManager - Web SDK Placement Module
|
|
3
|
+
*
|
|
4
|
+
* Real-time SSE architecture for inline content placements.
|
|
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 placement updates
|
|
13
|
+
* - Initial fetch on load, then SSE for updates
|
|
14
|
+
* - Caches placement content locally in memory
|
|
15
|
+
* - Renders content into pre-defined UI slots (inline, not overlay)
|
|
16
|
+
* - Tracks events (impression, click, conversion) asynchronously
|
|
17
|
+
*
|
|
18
|
+
* Key Differences from In-App Messages:
|
|
19
|
+
* - INLINE content (part of layout), not overlays
|
|
20
|
+
* - Content rendered immediately on slot registration
|
|
21
|
+
* - No trigger rules (shown when slot loads)
|
|
22
|
+
* - Supports banner, card, carousel, video, HTML content types
|
|
23
|
+
*/
|
|
24
|
+
export interface PlacementContent {
|
|
25
|
+
placement_id: string;
|
|
26
|
+
variant_id: string;
|
|
27
|
+
content_type: 'banner' | 'card' | 'carousel' | 'video' | 'html' | 'dynamic_injection';
|
|
28
|
+
content: Record<string, any>;
|
|
29
|
+
css_selector?: string;
|
|
30
|
+
injection_mode?: 'replace' | 'append' | 'prepend';
|
|
31
|
+
}
|
|
32
|
+
export interface PlacementSlot {
|
|
33
|
+
placementId: string;
|
|
34
|
+
containerId: string;
|
|
35
|
+
fallbackContent?: string;
|
|
36
|
+
onRender?: (content: PlacementContent) => void;
|
|
37
|
+
onError?: (error: Error) => void;
|
|
38
|
+
}
|
|
39
|
+
export interface AegisPlacementConfig {
|
|
40
|
+
writeKey: string;
|
|
41
|
+
apiHost?: string;
|
|
42
|
+
userId?: string;
|
|
43
|
+
contactId?: string;
|
|
44
|
+
organizationId?: string;
|
|
45
|
+
debugMode?: boolean;
|
|
46
|
+
enableSSE?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare class AegisPlacementManager {
|
|
49
|
+
private writeKey;
|
|
50
|
+
private apiHost;
|
|
51
|
+
private userId?;
|
|
52
|
+
private contactId?;
|
|
53
|
+
private organizationId?;
|
|
54
|
+
private debugMode;
|
|
55
|
+
private enableSSE;
|
|
56
|
+
private placements;
|
|
57
|
+
private slots;
|
|
58
|
+
private renderedSlots;
|
|
59
|
+
private eventSource?;
|
|
60
|
+
private isInitialized;
|
|
61
|
+
private reconnectAttempts;
|
|
62
|
+
private maxReconnectAttempts;
|
|
63
|
+
constructor(config: AegisPlacementConfig);
|
|
64
|
+
initialize(): Promise<void>;
|
|
65
|
+
register(placementId: string, options: Omit<PlacementSlot, 'placementId'>): void;
|
|
66
|
+
unregister(placementId: string): void;
|
|
67
|
+
refreshPlacements(): Promise<void>;
|
|
68
|
+
private renderAllSlots;
|
|
69
|
+
private renderSlot;
|
|
70
|
+
private renderBanner;
|
|
71
|
+
private renderCard;
|
|
72
|
+
private renderCarousel;
|
|
73
|
+
private renderVideo;
|
|
74
|
+
private renderHTML;
|
|
75
|
+
private renderDynamicInjection;
|
|
76
|
+
private renderFallback;
|
|
77
|
+
private trackEvent;
|
|
78
|
+
private connectSSE;
|
|
79
|
+
private disconnectSSE;
|
|
80
|
+
private attemptReconnect;
|
|
81
|
+
private getDeviceType;
|
|
82
|
+
private sanitizeUrl;
|
|
83
|
+
private sanitizeColor;
|
|
84
|
+
private sanitizeHTML;
|
|
85
|
+
private log;
|
|
86
|
+
destroy(): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=AegisPlacementManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisPlacementManager.d.ts","sourceRoot":"","sources":["../../src/placements/AegisPlacementManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,mBAAmB,CAAC;IACtF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;gBAErB,MAAM,EAAE,oBAAoB;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,GAAG,IAAI;IAiBhF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAM/B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,YAAY;IA2EpB,OAAO,CAAC,UAAU;IAsElB,OAAO,CAAC,cAAc;IA6EtB,OAAO,CAAC,WAAW;IAmCnB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,sBAAsB;IAmE9B,OAAO,CAAC,cAAc;YAUR,UAAU;IA4CxB,OAAO,CAAC,UAAU;IAwDlB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,GAAG;IAMX,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Plugin } from '../types/plugin';
|
|
2
|
+
export declare class PluginRegistry {
|
|
3
|
+
private plugins;
|
|
4
|
+
register(plugin: Plugin): void;
|
|
5
|
+
unregister(pluginName: string): void;
|
|
6
|
+
get(pluginName: string): Plugin | undefined;
|
|
7
|
+
getAll(): Plugin[];
|
|
8
|
+
executeHook<T = any>(hookName: keyof Plugin, ...args: any[]): Promise<T | undefined>;
|
|
9
|
+
executeHookChain<T = any>(hookName: keyof Plugin, initialValue: T, ...additionalArgs: any[]): Promise<T>;
|
|
10
|
+
executeHookParallel<T = any>(hookName: keyof Plugin, ...args: any[]): Promise<T[]>;
|
|
11
|
+
clear(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAkC;IAEjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU9B,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAoBpC,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,MAAM,IAAI,MAAM,EAAE;IAIZ,WAAW,CAAC,CAAC,GAAG,GAAG,EACvB,QAAQ,EAAE,MAAM,MAAM,EACtB,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAkCnB,gBAAgB,CAAC,CAAC,GAAG,GAAG,EAC5B,QAAQ,EAAE,MAAM,MAAM,EACtB,YAAY,EAAE,CAAC,EACf,GAAG,cAAc,EAAE,GAAG,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC;IAuCP,mBAAmB,CAAC,CAAC,GAAG,GAAG,EAC/B,QAAQ,EAAE,MAAM,MAAM,EACtB,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,CAAC,EAAE,CAAC;IAuCf,KAAK,IAAI,IAAI;CAcd"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface AegisAPIClient {
|
|
2
|
+
post(endpoint: string, payload: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
}
|
|
4
|
+
export interface ContactIdentity {
|
|
5
|
+
contactId?: string;
|
|
6
|
+
shopifyCustomerId?: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AegisWebPushConfig {
|
|
10
|
+
vapidPublicKey: string;
|
|
11
|
+
autoPrompt?: boolean;
|
|
12
|
+
promptDelay?: number;
|
|
13
|
+
serviceWorkerPath?: string;
|
|
14
|
+
serviceWorkerScope?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface PushEventTracker {
|
|
17
|
+
track(eventName: string, properties: Record<string, unknown>): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* AegisWebPush — Web Push notification manager.
|
|
21
|
+
*
|
|
22
|
+
* Handles service worker registration, push subscription via VAPID,
|
|
23
|
+
* token registration with the backend, and push event tracking.
|
|
24
|
+
*/
|
|
25
|
+
export declare class AegisWebPush {
|
|
26
|
+
private apiClient;
|
|
27
|
+
private eventTracker;
|
|
28
|
+
private swRegistration;
|
|
29
|
+
private config;
|
|
30
|
+
private initialized;
|
|
31
|
+
constructor(apiClient: AegisAPIClient, config: AegisWebPushConfig, eventTracker?: PushEventTracker);
|
|
32
|
+
initialize(): Promise<void>;
|
|
33
|
+
requestPermission(): Promise<boolean>;
|
|
34
|
+
identify(params: ContactIdentity): Promise<void>;
|
|
35
|
+
logout(): Promise<void>;
|
|
36
|
+
private subscribeToPush;
|
|
37
|
+
private registerWebPushToken;
|
|
38
|
+
/**
|
|
39
|
+
* Retry an API call with exponential backoff (max 3 retries: 1s, 2s, 4s).
|
|
40
|
+
*/
|
|
41
|
+
private retryApiCall;
|
|
42
|
+
/**
|
|
43
|
+
* Handle messages forwarded from the service worker (push click, dismiss).
|
|
44
|
+
*/
|
|
45
|
+
private handleSWMessage;
|
|
46
|
+
private trackPushEvent;
|
|
47
|
+
private getDeviceFingerprint;
|
|
48
|
+
private getBrowserInfo;
|
|
49
|
+
private urlBase64ToUint8Array;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=AegisWebPush.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisWebPush.d.ts","sourceRoot":"","sources":["../../src/push/AegisWebPush.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC3B,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,eAAe;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACvE;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAS;gBAGxB,SAAS,EAAE,cAAc,EACzB,MAAM,EAAE,kBAAkB,EAC1B,YAAY,CAAC,EAAE,gBAAgB;IAa7B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAahD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YAaf,eAAe;YAuBf,oBAAoB;IAclC;;OAEG;YACW,YAAY;IAgB1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,oBAAoB;IAsC5B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,qBAAqB;CAUhC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
class AegisWebPush {
|
|
2
|
+
constructor(apiClient, config, eventTracker) {
|
|
3
|
+
this.swRegistration = null;
|
|
4
|
+
this.initialized = false;
|
|
5
|
+
this.apiClient = apiClient;
|
|
6
|
+
this.config = {
|
|
7
|
+
serviceWorkerPath: "/aegis-sw.js",
|
|
8
|
+
serviceWorkerScope: "/",
|
|
9
|
+
autoPrompt: false,
|
|
10
|
+
promptDelay: 5e3,
|
|
11
|
+
...config
|
|
12
|
+
};
|
|
13
|
+
this.eventTracker = eventTracker ?? null;
|
|
14
|
+
}
|
|
15
|
+
async initialize() {
|
|
16
|
+
if (this.initialized) return;
|
|
17
|
+
if (!("serviceWorker" in navigator) || !("PushManager" in window)) {
|
|
18
|
+
console.warn("[AegisWebPush] Push notifications not supported in this browser");
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
this.swRegistration = await navigator.serviceWorker.register(
|
|
23
|
+
this.config.serviceWorkerPath,
|
|
24
|
+
{ scope: this.config.serviceWorkerScope }
|
|
25
|
+
);
|
|
26
|
+
await navigator.serviceWorker.ready;
|
|
27
|
+
this.initialized = true;
|
|
28
|
+
navigator.serviceWorker.addEventListener("message", (event) => {
|
|
29
|
+
this.handleSWMessage(event.data);
|
|
30
|
+
});
|
|
31
|
+
if (this.config.autoPrompt) {
|
|
32
|
+
setTimeout(() => this.requestPermission(), this.config.promptDelay);
|
|
33
|
+
}
|
|
34
|
+
} catch (err) {
|
|
35
|
+
console.error("[AegisWebPush] Service worker registration failed:", err);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async requestPermission() {
|
|
39
|
+
const permission = await Notification.requestPermission();
|
|
40
|
+
if (permission === "granted") {
|
|
41
|
+
await this.subscribeToPush();
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
this.trackPushEvent("push.permission_denied", {});
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
async identify(params) {
|
|
48
|
+
var _a;
|
|
49
|
+
const subscription = await ((_a = this.swRegistration) == null ? void 0 : _a.pushManager.getSubscription());
|
|
50
|
+
if (subscription) {
|
|
51
|
+
await this.retryApiCall(
|
|
52
|
+
() => this.apiClient.post("/v1/core/devices/register", {
|
|
53
|
+
device_token: JSON.stringify(subscription.toJSON()),
|
|
54
|
+
platform: "web",
|
|
55
|
+
...params
|
|
56
|
+
})
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async logout() {
|
|
61
|
+
var _a;
|
|
62
|
+
const subscription = await ((_a = this.swRegistration) == null ? void 0 : _a.pushManager.getSubscription());
|
|
63
|
+
if (subscription) {
|
|
64
|
+
await this.apiClient.post("/v1/core/devices/unlink", {
|
|
65
|
+
device_token: JSON.stringify(subscription.toJSON())
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ---------------------------------------------------------------
|
|
70
|
+
// Private
|
|
71
|
+
// ---------------------------------------------------------------
|
|
72
|
+
async subscribeToPush() {
|
|
73
|
+
if (!this.swRegistration) return;
|
|
74
|
+
const subscription = await this.swRegistration.pushManager.subscribe({
|
|
75
|
+
userVisibleOnly: true,
|
|
76
|
+
applicationServerKey: this.urlBase64ToUint8Array(this.config.vapidPublicKey)
|
|
77
|
+
});
|
|
78
|
+
const subscriptionJSON = subscription.toJSON();
|
|
79
|
+
await this.retryApiCall(
|
|
80
|
+
() => this.registerWebPushToken({
|
|
81
|
+
endpoint: subscriptionJSON.endpoint,
|
|
82
|
+
keys: {
|
|
83
|
+
p256dh: subscriptionJSON.keys.p256dh,
|
|
84
|
+
auth: subscriptionJSON.keys.auth
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
this.trackPushEvent("push.subscribed", { browser: this.getBrowserInfo() });
|
|
89
|
+
}
|
|
90
|
+
async registerWebPushToken(subscription) {
|
|
91
|
+
await this.apiClient.post("/v1/core/devices/register", {
|
|
92
|
+
device_token: JSON.stringify(subscription),
|
|
93
|
+
platform: "web",
|
|
94
|
+
device_id: this.getDeviceFingerprint(),
|
|
95
|
+
app_version: navigator.userAgent,
|
|
96
|
+
app_installed: false,
|
|
97
|
+
browser: this.getBrowserInfo()
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Retry an API call with exponential backoff (max 3 retries: 1s, 2s, 4s).
|
|
102
|
+
*/
|
|
103
|
+
async retryApiCall(fn, maxRetries = 3) {
|
|
104
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
105
|
+
try {
|
|
106
|
+
await fn();
|
|
107
|
+
return;
|
|
108
|
+
} catch (err) {
|
|
109
|
+
if (attempt === maxRetries) {
|
|
110
|
+
console.error("[AegisWebPush] API call failed after retries:", err);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const delay = 1e3 * Math.pow(2, attempt);
|
|
114
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Handle messages forwarded from the service worker (push click, dismiss).
|
|
120
|
+
*/
|
|
121
|
+
handleSWMessage(data) {
|
|
122
|
+
if (!data || typeof data.type !== "string") return;
|
|
123
|
+
switch (data.type) {
|
|
124
|
+
case "push.clicked":
|
|
125
|
+
this.trackPushEvent("push.clicked", {
|
|
126
|
+
campaign_id: data.campaign_id,
|
|
127
|
+
action_url: data.action_url
|
|
128
|
+
});
|
|
129
|
+
break;
|
|
130
|
+
case "push.dismissed":
|
|
131
|
+
this.trackPushEvent("push.dismissed", {
|
|
132
|
+
campaign_id: data.campaign_id
|
|
133
|
+
});
|
|
134
|
+
break;
|
|
135
|
+
case "push.delivered":
|
|
136
|
+
this.trackPushEvent("push.delivered", {
|
|
137
|
+
campaign_id: data.campaign_id
|
|
138
|
+
});
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
trackPushEvent(eventName, properties) {
|
|
143
|
+
var _a;
|
|
144
|
+
(_a = this.eventTracker) == null ? void 0 : _a.track(eventName, {
|
|
145
|
+
...properties,
|
|
146
|
+
platform: "web",
|
|
147
|
+
browser: this.getBrowserInfo()
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
getDeviceFingerprint() {
|
|
151
|
+
var _a;
|
|
152
|
+
const parts = [
|
|
153
|
+
`${screen.width}x${screen.height}`,
|
|
154
|
+
navigator.language,
|
|
155
|
+
Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
156
|
+
((_a = navigator.hardwareConcurrency) == null ? void 0 : _a.toString()) ?? ""
|
|
157
|
+
];
|
|
158
|
+
try {
|
|
159
|
+
const canvas = document.createElement("canvas");
|
|
160
|
+
const ctx = canvas.getContext("2d");
|
|
161
|
+
if (ctx) {
|
|
162
|
+
ctx.textBaseline = "top";
|
|
163
|
+
ctx.font = "14px Arial";
|
|
164
|
+
ctx.fillText("aegis-fp", 2, 2);
|
|
165
|
+
parts.push(canvas.toDataURL().slice(-32));
|
|
166
|
+
}
|
|
167
|
+
} catch (_) {
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
const gl = document.createElement("canvas").getContext("webgl");
|
|
171
|
+
if (gl) {
|
|
172
|
+
const dbg = gl.getExtension("WEBGL_debug_renderer_info");
|
|
173
|
+
if (dbg) {
|
|
174
|
+
parts.push(gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
} catch (_) {
|
|
178
|
+
}
|
|
179
|
+
return btoa(parts.join("|"));
|
|
180
|
+
}
|
|
181
|
+
getBrowserInfo() {
|
|
182
|
+
const ua = navigator.userAgent;
|
|
183
|
+
if (ua.includes("Edg")) return "edge";
|
|
184
|
+
if (ua.includes("Chrome")) return "chrome";
|
|
185
|
+
if (ua.includes("Firefox")) return "firefox";
|
|
186
|
+
if (ua.includes("Safari")) return "safari";
|
|
187
|
+
return "unknown";
|
|
188
|
+
}
|
|
189
|
+
urlBase64ToUint8Array(base64String) {
|
|
190
|
+
const padding = "=".repeat((4 - base64String.length % 4) % 4);
|
|
191
|
+
const base64 = (base64String + padding).replace(/-/g, "+").replace(/_/g, "/");
|
|
192
|
+
const rawData = atob(base64);
|
|
193
|
+
const arr = new Uint8Array(rawData.length);
|
|
194
|
+
for (let i = 0; i < rawData.length; ++i) {
|
|
195
|
+
arr[i] = rawData.charCodeAt(i);
|
|
196
|
+
}
|
|
197
|
+
return arr;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export {
|
|
201
|
+
AegisWebPush
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=AegisWebPush.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisWebPush.js","sources":["../../src/push/AegisWebPush.ts"],"sourcesContent":["export interface AegisAPIClient {\n post(endpoint: string, payload: Record<string, unknown>): Promise<unknown>;\n}\n\nexport interface ContactIdentity {\n contactId?: string;\n shopifyCustomerId?: string;\n email?: string;\n}\n\nexport interface AegisWebPushConfig {\n vapidPublicKey: string;\n autoPrompt?: boolean;\n promptDelay?: number;\n serviceWorkerPath?: string;\n serviceWorkerScope?: string;\n}\n\nexport interface PushEventTracker {\n track(eventName: string, properties: Record<string, unknown>): void;\n}\n\n/**\n * AegisWebPush — Web Push notification manager.\n *\n * Handles service worker registration, push subscription via VAPID,\n * token registration with the backend, and push event tracking.\n */\nexport class AegisWebPush {\n private apiClient: AegisAPIClient;\n private eventTracker: PushEventTracker | null;\n private swRegistration: ServiceWorkerRegistration | null = null;\n private config: AegisWebPushConfig;\n private initialized = false;\n\n constructor(\n apiClient: AegisAPIClient,\n config: AegisWebPushConfig,\n eventTracker?: PushEventTracker\n ) {\n this.apiClient = apiClient;\n this.config = {\n serviceWorkerPath: '/aegis-sw.js',\n serviceWorkerScope: '/',\n autoPrompt: false,\n promptDelay: 5000,\n ...config,\n };\n this.eventTracker = eventTracker ?? null;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n if (!('serviceWorker' in navigator) || !('PushManager' in window)) {\n console.warn('[AegisWebPush] Push notifications not supported in this browser');\n return;\n }\n\n try {\n this.swRegistration = await navigator.serviceWorker.register(\n this.config.serviceWorkerPath!,\n { scope: this.config.serviceWorkerScope }\n );\n await navigator.serviceWorker.ready;\n this.initialized = true;\n\n // Listen for messages from the service worker (click/dismiss tracking)\n navigator.serviceWorker.addEventListener('message', (event) => {\n this.handleSWMessage(event.data);\n });\n\n if (this.config.autoPrompt) {\n setTimeout(() => this.requestPermission(), this.config.promptDelay);\n }\n } catch (err) {\n console.error('[AegisWebPush] Service worker registration failed:', err);\n }\n }\n\n async requestPermission(): Promise<boolean> {\n const permission = await Notification.requestPermission();\n\n if (permission === 'granted') {\n await this.subscribeToPush();\n return true;\n }\n\n this.trackPushEvent('push.permission_denied', {});\n return false;\n }\n\n async identify(params: ContactIdentity): Promise<void> {\n const subscription = await this.swRegistration?.pushManager.getSubscription();\n if (subscription) {\n await this.retryApiCall(() =>\n this.apiClient.post('/v1/core/devices/register', {\n device_token: JSON.stringify(subscription.toJSON()),\n platform: 'web',\n ...params,\n })\n );\n }\n }\n\n async logout(): Promise<void> {\n const subscription = await this.swRegistration?.pushManager.getSubscription();\n if (subscription) {\n await this.apiClient.post('/v1/core/devices/unlink', {\n device_token: JSON.stringify(subscription.toJSON()),\n });\n }\n }\n\n // ---------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------\n\n private async subscribeToPush(): Promise<void> {\n if (!this.swRegistration) return;\n\n const subscription = await this.swRegistration.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: this.urlBase64ToUint8Array(this.config.vapidPublicKey),\n });\n\n const subscriptionJSON = subscription.toJSON();\n\n await this.retryApiCall(() =>\n this.registerWebPushToken({\n endpoint: subscriptionJSON.endpoint!,\n keys: {\n p256dh: subscriptionJSON.keys!.p256dh!,\n auth: subscriptionJSON.keys!.auth!,\n },\n })\n );\n\n this.trackPushEvent('push.subscribed', { browser: this.getBrowserInfo() });\n }\n\n private async registerWebPushToken(subscription: {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n }): Promise<void> {\n await this.apiClient.post('/v1/core/devices/register', {\n device_token: JSON.stringify(subscription),\n platform: 'web',\n device_id: this.getDeviceFingerprint(),\n app_version: navigator.userAgent,\n app_installed: false,\n browser: this.getBrowserInfo(),\n });\n }\n\n /**\n * Retry an API call with exponential backoff (max 3 retries: 1s, 2s, 4s).\n */\n private async retryApiCall(fn: () => Promise<unknown>, maxRetries = 3): Promise<void> {\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n await fn();\n return;\n } catch (err) {\n if (attempt === maxRetries) {\n console.error('[AegisWebPush] API call failed after retries:', err);\n return;\n }\n const delay = 1000 * Math.pow(2, attempt);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n /**\n * Handle messages forwarded from the service worker (push click, dismiss).\n */\n private handleSWMessage(data: Record<string, unknown>): void {\n if (!data || typeof data.type !== 'string') return;\n\n switch (data.type) {\n case 'push.clicked':\n this.trackPushEvent('push.clicked', {\n campaign_id: data.campaign_id,\n action_url: data.action_url,\n });\n break;\n case 'push.dismissed':\n this.trackPushEvent('push.dismissed', {\n campaign_id: data.campaign_id,\n });\n break;\n case 'push.delivered':\n this.trackPushEvent('push.delivered', {\n campaign_id: data.campaign_id,\n });\n break;\n }\n }\n\n private trackPushEvent(eventName: string, properties: Record<string, unknown>): void {\n this.eventTracker?.track(eventName, {\n ...properties,\n platform: 'web',\n browser: this.getBrowserInfo(),\n });\n }\n\n private getDeviceFingerprint(): string {\n const parts = [\n `${screen.width}x${screen.height}`,\n navigator.language,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.hardwareConcurrency?.toString() ?? '',\n ];\n\n // Canvas fingerprint hash (lightweight)\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.textBaseline = 'top';\n ctx.font = '14px Arial';\n ctx.fillText('aegis-fp', 2, 2);\n parts.push(canvas.toDataURL().slice(-32));\n }\n } catch (_) {\n // Canvas blocked — skip\n }\n\n // WebGL renderer\n try {\n const gl = document.createElement('canvas').getContext('webgl');\n if (gl) {\n const dbg = gl.getExtension('WEBGL_debug_renderer_info');\n if (dbg) {\n parts.push(gl.getParameter(dbg.UNMASKED_RENDERER_WEBGL) as string);\n }\n }\n } catch (_) {\n // WebGL blocked — skip\n }\n\n return btoa(parts.join('|'));\n }\n\n private getBrowserInfo(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Edg')) return 'edge';\n if (ua.includes('Chrome')) return 'chrome';\n if (ua.includes('Firefox')) return 'firefox';\n if (ua.includes('Safari')) return 'safari';\n return 'unknown';\n }\n\n private urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n const arr = new Uint8Array(rawData.length);\n for (let i = 0; i < rawData.length; ++i) {\n arr[i] = rawData.charCodeAt(i);\n }\n return arr;\n }\n}\n"],"names":[],"mappings":"AA4BO,MAAM,aAAa;AAAA,EAOtB,YACI,WACA,QACA,cACF;AARF,SAAQ,iBAAmD;AAE3D,SAAQ,cAAc;AAOlB,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,MACV,mBAAmB;AAAA,MACnB,oBAAoB;AAAA,MACpB,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,GAAG;AAAA,IAAA;AAEP,SAAK,eAAe,gBAAgB;AAAA,EACxC;AAAA,EAEA,MAAM,aAA4B;AAC9B,QAAI,KAAK,YAAa;AAEtB,QAAI,EAAE,mBAAmB,cAAc,EAAE,iBAAiB,SAAS;AAC/D,cAAQ,KAAK,iEAAiE;AAC9E;AAAA,IACJ;AAEA,QAAI;AACA,WAAK,iBAAiB,MAAM,UAAU,cAAc;AAAA,QAChD,KAAK,OAAO;AAAA,QACZ,EAAE,OAAO,KAAK,OAAO,mBAAA;AAAA,MAAmB;AAE5C,YAAM,UAAU,cAAc;AAC9B,WAAK,cAAc;AAGnB,gBAAU,cAAc,iBAAiB,WAAW,CAAC,UAAU;AAC3D,aAAK,gBAAgB,MAAM,IAAI;AAAA,MACnC,CAAC;AAED,UAAI,KAAK,OAAO,YAAY;AACxB,mBAAW,MAAM,KAAK,kBAAA,GAAqB,KAAK,OAAO,WAAW;AAAA,MACtE;AAAA,IACJ,SAAS,KAAK;AACV,cAAQ,MAAM,sDAAsD,GAAG;AAAA,IAC3E;AAAA,EACJ;AAAA,EAEA,MAAM,oBAAsC;AACxC,UAAM,aAAa,MAAM,aAAa,kBAAA;AAEtC,QAAI,eAAe,WAAW;AAC1B,YAAM,KAAK,gBAAA;AACX,aAAO;AAAA,IACX;AAEA,SAAK,eAAe,0BAA0B,EAAE;AAChD,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,SAAS,QAAwC;AAhEpD;AAiEC,UAAM,eAAe,QAAM,UAAK,mBAAL,mBAAqB,YAAY;AAC5D,QAAI,cAAc;AACd,YAAM,KAAK;AAAA,QAAa,MACpB,KAAK,UAAU,KAAK,6BAA6B;AAAA,UAC7C,cAAc,KAAK,UAAU,aAAa,QAAQ;AAAA,UAClD,UAAU;AAAA,UACV,GAAG;AAAA,QAAA,CACN;AAAA,MAAA;AAAA,IAET;AAAA,EACJ;AAAA,EAEA,MAAM,SAAwB;AA7E3B;AA8EC,UAAM,eAAe,QAAM,UAAK,mBAAL,mBAAqB,YAAY;AAC5D,QAAI,cAAc;AACd,YAAM,KAAK,UAAU,KAAK,2BAA2B;AAAA,QACjD,cAAc,KAAK,UAAU,aAAa,QAAQ;AAAA,MAAA,CACrD;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,kBAAiC;AAC3C,QAAI,CAAC,KAAK,eAAgB;AAE1B,UAAM,eAAe,MAAM,KAAK,eAAe,YAAY,UAAU;AAAA,MACjE,iBAAiB;AAAA,MACjB,sBAAsB,KAAK,sBAAsB,KAAK,OAAO,cAAc;AAAA,IAAA,CAC9E;AAED,UAAM,mBAAmB,aAAa,OAAA;AAEtC,UAAM,KAAK;AAAA,MAAa,MACpB,KAAK,qBAAqB;AAAA,QACtB,UAAU,iBAAiB;AAAA,QAC3B,MAAM;AAAA,UACF,QAAQ,iBAAiB,KAAM;AAAA,UAC/B,MAAM,iBAAiB,KAAM;AAAA,QAAA;AAAA,MACjC,CACH;AAAA,IAAA;AAGL,SAAK,eAAe,mBAAmB,EAAE,SAAS,KAAK,eAAA,GAAkB;AAAA,EAC7E;AAAA,EAEA,MAAc,qBAAqB,cAGjB;AACd,UAAM,KAAK,UAAU,KAAK,6BAA6B;AAAA,MACnD,cAAc,KAAK,UAAU,YAAY;AAAA,MACzC,UAAU;AAAA,MACV,WAAW,KAAK,qBAAA;AAAA,MAChB,aAAa,UAAU;AAAA,MACvB,eAAe;AAAA,MACf,SAAS,KAAK,eAAA;AAAA,IAAe,CAChC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,IAA4B,aAAa,GAAkB;AAClF,aAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACpD,UAAI;AACA,cAAM,GAAA;AACN;AAAA,MACJ,SAAS,KAAK;AACV,YAAI,YAAY,YAAY;AACxB,kBAAQ,MAAM,iDAAiD,GAAG;AAClE;AAAA,QACJ;AACA,cAAM,QAAQ,MAAO,KAAK,IAAI,GAAG,OAAO;AACxC,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,MACjD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAqC;AACzD,QAAI,CAAC,QAAQ,OAAO,KAAK,SAAS,SAAU;AAE5C,YAAQ,KAAK,MAAA;AAAA,MACT,KAAK;AACD,aAAK,eAAe,gBAAgB;AAAA,UAChC,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,QAAA,CACpB;AACD;AAAA,MACJ,KAAK;AACD,aAAK,eAAe,kBAAkB;AAAA,UAClC,aAAa,KAAK;AAAA,QAAA,CACrB;AACD;AAAA,MACJ,KAAK;AACD,aAAK,eAAe,kBAAkB;AAAA,UAClC,aAAa,KAAK;AAAA,QAAA,CACrB;AACD;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEQ,eAAe,WAAmB,YAA2C;AA5KlF;AA6KC,eAAK,iBAAL,mBAAmB,MAAM,WAAW;AAAA,MAChC,GAAG;AAAA,MACH,UAAU;AAAA,MACV,SAAS,KAAK,eAAA;AAAA,IAAe;AAAA,EAErC;AAAA,EAEQ,uBAA+B;AApLpC;AAqLC,UAAM,QAAQ;AAAA,MACV,GAAG,OAAO,KAAK,IAAI,OAAO,MAAM;AAAA,MAChC,UAAU;AAAA,MACV,KAAK,eAAA,EAAiB,gBAAA,EAAkB;AAAA,QACxC,eAAU,wBAAV,mBAA+B,eAAc;AAAA,IAAA;AAIjD,QAAI;AACA,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,YAAM,MAAM,OAAO,WAAW,IAAI;AAClC,UAAI,KAAK;AACL,YAAI,eAAe;AACnB,YAAI,OAAO;AACX,YAAI,SAAS,YAAY,GAAG,CAAC;AAC7B,cAAM,KAAK,OAAO,UAAA,EAAY,MAAM,GAAG,CAAC;AAAA,MAC5C;AAAA,IACJ,SAAS,GAAG;AAAA,IAEZ;AAGA,QAAI;AACA,YAAM,KAAK,SAAS,cAAc,QAAQ,EAAE,WAAW,OAAO;AAC9D,UAAI,IAAI;AACJ,cAAM,MAAM,GAAG,aAAa,2BAA2B;AACvD,YAAI,KAAK;AACL,gBAAM,KAAK,GAAG,aAAa,IAAI,uBAAuB,CAAW;AAAA,QACrE;AAAA,MACJ;AAAA,IACJ,SAAS,GAAG;AAAA,IAEZ;AAEA,WAAO,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,EAC/B;AAAA,EAEQ,iBAAyB;AAC7B,UAAM,KAAK,UAAU;AACrB,QAAI,GAAG,SAAS,KAAK,EAAG,QAAO;AAC/B,QAAI,GAAG,SAAS,QAAQ,EAAG,QAAO;AAClC,QAAI,GAAG,SAAS,SAAS,EAAG,QAAO;AACnC,QAAI,GAAG,SAAS,QAAQ,EAAG,QAAO;AAClC,WAAO;AAAA,EACX;AAAA,EAEQ,sBAAsB,cAAkC;AAC5D,UAAM,UAAU,IAAI,QAAQ,IAAK,aAAa,SAAS,KAAM,CAAC;AAC9D,UAAM,UAAU,eAAe,SAAS,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAC5E,UAAM,UAAU,KAAK,MAAM;AAC3B,UAAM,MAAM,IAAI,WAAW,QAAQ,MAAM;AACzC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACrC,UAAI,CAAC,IAAI,QAAQ,WAAW,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACX;AACJ;"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { createContext, useState, useEffect, useContext } from "react";
|
|
2
|
+
import { A as Aegis } from "./analytics-B11keZ55.mjs";
|
|
3
|
+
const AegisContext = createContext({
|
|
4
|
+
aegis: null,
|
|
5
|
+
isReady: false
|
|
6
|
+
});
|
|
7
|
+
const AegisProvider = ({
|
|
8
|
+
writeKey,
|
|
9
|
+
config,
|
|
10
|
+
children
|
|
11
|
+
}) => {
|
|
12
|
+
const [aegis] = useState(() => new Aegis());
|
|
13
|
+
const [isReady, setIsReady] = useState(false);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
aegis.init(writeKey, config).then(() => {
|
|
16
|
+
setIsReady(true);
|
|
17
|
+
}).catch((error) => {
|
|
18
|
+
console.error("[Aegis] Initialization failed:", error);
|
|
19
|
+
});
|
|
20
|
+
return () => {
|
|
21
|
+
aegis.destroy();
|
|
22
|
+
};
|
|
23
|
+
}, [aegis, writeKey, config]);
|
|
24
|
+
return /* @__PURE__ */ React.createElement(AegisContext.Provider, { value: { aegis, isReady } }, children);
|
|
25
|
+
};
|
|
26
|
+
const useAegis = () => {
|
|
27
|
+
const context = useContext(AegisContext);
|
|
28
|
+
if (!context) {
|
|
29
|
+
throw new Error("useAegis must be used within AegisProvider");
|
|
30
|
+
}
|
|
31
|
+
return context;
|
|
32
|
+
};
|
|
33
|
+
const useTrackEvent = () => {
|
|
34
|
+
const { aegis, isReady } = useAegis();
|
|
35
|
+
return React.useCallback(
|
|
36
|
+
(eventName, properties) => {
|
|
37
|
+
if (isReady && aegis) {
|
|
38
|
+
aegis.track(eventName, properties);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
[aegis, isReady]
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
const usePageView = (pageName, properties, dependencies = []) => {
|
|
45
|
+
const { aegis, isReady } = useAegis();
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (isReady && aegis) {
|
|
48
|
+
aegis.page(pageName, properties);
|
|
49
|
+
}
|
|
50
|
+
}, [aegis, isReady, pageName, ...dependencies]);
|
|
51
|
+
};
|
|
52
|
+
const useIdentifyUser = () => {
|
|
53
|
+
const { aegis, isReady } = useAegis();
|
|
54
|
+
return React.useCallback(
|
|
55
|
+
(userId, traits) => {
|
|
56
|
+
if (isReady && aegis) {
|
|
57
|
+
aegis.identify(userId, traits);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
[aegis, isReady]
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
export {
|
|
64
|
+
AegisProvider,
|
|
65
|
+
useAegis,
|
|
66
|
+
useIdentifyUser,
|
|
67
|
+
usePageView,
|
|
68
|
+
useTrackEvent
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../src/integrations/react.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { Aegis } from '../core/analytics';\nimport { AegisConfig } from '../types/config';\n\ninterface AegisContextValue {\n aegis: Aegis | null;\n isReady: boolean;\n}\n\nconst AegisContext = createContext<AegisContextValue>({\n aegis: null,\n isReady: false,\n});\n\nexport interface AegisProviderProps {\n writeKey: string;\n config?: Partial<AegisConfig>;\n children: React.ReactNode;\n}\n\nexport const AegisProvider: React.FC<AegisProviderProps> = ({\n writeKey,\n config,\n children,\n}) => {\n const [aegis] = useState(() => new Aegis());\n const [isReady, setIsReady] = useState(false);\n\n useEffect(() => {\n aegis\n .init(writeKey, config)\n .then(() => {\n setIsReady(true);\n })\n .catch((error) => {\n console.error('[Aegis] Initialization failed:', error);\n });\n\n return () => {\n aegis.destroy();\n };\n }, [aegis, writeKey, config]);\n\n return (\n <AegisContext.Provider value={{ aegis, isReady }}>\n {children}\n </AegisContext.Provider>\n );\n};\n\nexport const useAegis = (): AegisContextValue => {\n const context = useContext(AegisContext);\n\n if (!context) {\n throw new Error('useAegis must be used within AegisProvider');\n }\n\n return context;\n};\n\nexport const useTrackEvent = () => {\n const { aegis, isReady } = useAegis();\n\n return React.useCallback(\n (eventName: string, properties?: Record<string, any>) => {\n if (isReady && aegis) {\n aegis.track(eventName, properties);\n }\n },\n [aegis, isReady]\n );\n};\n\nexport const usePageView = (\n pageName?: string,\n properties?: Record<string, any>,\n dependencies: any[] = []\n) => {\n const { aegis, isReady } = useAegis();\n\n useEffect(() => {\n if (isReady && aegis) {\n aegis.page(pageName, properties);\n }\n }, [aegis, isReady, pageName, ...dependencies]);\n};\n\nexport const useIdentifyUser = () => {\n const { aegis, isReady } = useAegis();\n\n return React.useCallback(\n (userId: string, traits?: Record<string, any>) => {\n if (isReady && aegis) {\n aegis.identify(userId, traits);\n }\n },\n [aegis, isReady]\n );\n};\n"],"names":[],"mappings":";;AASA,MAAM,eAAe,cAAiC;AAAA,EACpD,OAAO;AAAA,EACP,SAAS;AACX,CAAC;AAQM,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,KAAK,IAAI,SAAS,MAAM,IAAI,OAAO;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,YAAU,MAAM;AACd,UACG,KAAK,UAAU,MAAM,EACrB,KAAK,MAAM;AACV,iBAAW,IAAI;AAAA,IACjB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,cAAQ,MAAM,kCAAkC,KAAK;AAAA,IACvD,CAAC;AAEH,WAAO,MAAM;AACX,YAAM,QAAA;AAAA,IACR;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,MAAM,CAAC;AAE5B,SACE,sBAAA,cAAC,aAAa,UAAb,EAAsB,OAAO,EAAE,OAAO,UAAQ,GAC5C,QACH;AAEJ;AAEO,MAAM,WAAW,MAAyB;AAC/C,QAAM,UAAU,WAAW,YAAY;AAEvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO;AACT;AAEO,MAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,OAAO,QAAA,IAAY,SAAA;AAE3B,SAAO,MAAM;AAAA,IACX,CAAC,WAAmB,eAAqC;AACvD,UAAI,WAAW,OAAO;AACpB,cAAM,MAAM,WAAW,UAAU;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAAC,OAAO,OAAO;AAAA,EAAA;AAEnB;AAEO,MAAM,cAAc,CACzB,UACA,YACA,eAAsB,CAAA,MACnB;AACH,QAAM,EAAE,OAAO,QAAA,IAAY,SAAA;AAE3B,YAAU,MAAM;AACd,QAAI,WAAW,OAAO;AACpB,YAAM,KAAK,UAAU,UAAU;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,OAAO,SAAS,UAAU,GAAG,YAAY,CAAC;AAChD;AAEO,MAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,OAAO,QAAA,IAAY,SAAA;AAE3B,SAAO,MAAM;AAAA,IACX,CAAC,QAAgB,WAAiC;AAChD,UAAI,WAAW,OAAO;AACpB,cAAM,SAAS,QAAQ,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,OAAO,OAAO;AAAA,EAAA;AAEnB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(){var e=window.aegis=window.aegis||[];if(!e.invoked){e.invoked=!0,e.methods=["init","track","identify","page","group","alias","reset","flush","use","debug","setCell","getCellInfo","getAnonymousId","getUserId","getSessionId","setConsent","grantConsent","denyConsent","hasConsent","getConsentPreferences","onConsentChange"],e.factory=function(n){return function(){var t=Array.prototype.slice.call(arguments);return t.unshift(n),e.push(t),e}};for(var n=0;n<e.methods.length;n++){var t=e.methods[n];e[t]=e.factory(t)}e.load=function(n,t){var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=t&&t.cdnUrl?t.cdnUrl:"https://cdn.activereach.ai/sdk/aegis.min.js",o.onerror=function(){window.console&&console.error("Aegis SDK failed to load")};var s=document.getElementsByTagName("script")[0];s.parentNode.insertBefore(o,s),e._loadOptions={key:n,options:t}},e.SNIPPET_VERSION="1.0.0"}}();
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TriggerEngine - Client-Side Trigger Evaluation
|
|
3
|
+
*
|
|
4
|
+
* Evaluates behavioral triggers that require real-time client state:
|
|
5
|
+
* - Scroll depth (e.g., user scrolled >= 50%)
|
|
6
|
+
* - Time on page (e.g., >= 30 seconds on current page)
|
|
7
|
+
* - Exit intent (mouse leaving viewport toward browser controls)
|
|
8
|
+
* - Inactivity (no user interaction for X seconds)
|
|
9
|
+
* - Scroll velocity (mobile exit intent - fast upward scroll)
|
|
10
|
+
* - Visibility change (tab/app switching)
|
|
11
|
+
* - Back button (history navigation)
|
|
12
|
+
*
|
|
13
|
+
* Architecture:
|
|
14
|
+
* - Server evaluates historical triggers (event counts, segments)
|
|
15
|
+
* - Client evaluates behavioral triggers (scroll, time, exit intent)
|
|
16
|
+
* - Zero latency - no server round trip needed
|
|
17
|
+
*
|
|
18
|
+
* Usage:
|
|
19
|
+
* const trigger = new TriggerEngine();
|
|
20
|
+
* trigger.on('scroll_depth_50', (data) => {
|
|
21
|
+
* console.log('User scrolled to 50%', data);
|
|
22
|
+
* });
|
|
23
|
+
* trigger.start();
|
|
24
|
+
*/
|
|
25
|
+
export interface TriggerRule {
|
|
26
|
+
type: 'scroll_depth' | 'time_on_page' | 'exit_intent' | 'inactivity' | 'scroll_velocity' | 'visibility_change' | 'back_button';
|
|
27
|
+
config: ScrollDepthConfig | TimeOnPageConfig | ExitIntentConfig | InactivityConfig | ScrollVelocityConfig | VisibilityChangeConfig | BackButtonConfig;
|
|
28
|
+
}
|
|
29
|
+
export interface ScrollDepthConfig {
|
|
30
|
+
depth_percent: number;
|
|
31
|
+
}
|
|
32
|
+
export interface TimeOnPageConfig {
|
|
33
|
+
seconds: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ExitIntentConfig {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface InactivityConfig {
|
|
39
|
+
idle_seconds: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ScrollVelocityConfig {
|
|
42
|
+
threshold: number;
|
|
43
|
+
minScrollPosition: number;
|
|
44
|
+
cooldown: number;
|
|
45
|
+
}
|
|
46
|
+
export interface VisibilityChangeConfig {
|
|
47
|
+
enabled: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface BackButtonConfig {
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface TriggerEvent {
|
|
53
|
+
type: string;
|
|
54
|
+
data: Record<string, any>;
|
|
55
|
+
timestamp: number;
|
|
56
|
+
}
|
|
57
|
+
type TriggerCallback = (event: TriggerEvent) => void;
|
|
58
|
+
export declare class TriggerEngine {
|
|
59
|
+
private listeners;
|
|
60
|
+
private isStarted;
|
|
61
|
+
private scrollDepthTargets;
|
|
62
|
+
private scrollDepthReached;
|
|
63
|
+
private timeOnPageTargets;
|
|
64
|
+
private pageLoadTime?;
|
|
65
|
+
private exitIntentEnabled;
|
|
66
|
+
private exitIntentFired;
|
|
67
|
+
private inactivityTargets;
|
|
68
|
+
private lastActivityTime;
|
|
69
|
+
private inactivityCheckInterval?;
|
|
70
|
+
private scrollVelocityEnabled;
|
|
71
|
+
private scrollVelocityFired;
|
|
72
|
+
private scrollVelocityConfig;
|
|
73
|
+
private lastScrollY;
|
|
74
|
+
private lastScrollTime;
|
|
75
|
+
private scrollVelocityCooldownTimer?;
|
|
76
|
+
private visibilityChangeEnabled;
|
|
77
|
+
private backButtonEnabled;
|
|
78
|
+
private backButtonFired;
|
|
79
|
+
constructor();
|
|
80
|
+
on(eventType: string, callback: TriggerCallback): void;
|
|
81
|
+
off(eventType: string, callback: TriggerCallback): void;
|
|
82
|
+
registerScrollDepth(depthPercent: number): void;
|
|
83
|
+
registerTimeOnPage(seconds: number): void;
|
|
84
|
+
registerExitIntent(): void;
|
|
85
|
+
registerInactivity(idleSeconds: number): void;
|
|
86
|
+
registerScrollVelocity(config?: Partial<ScrollVelocityConfig>): void;
|
|
87
|
+
registerVisibilityChange(): void;
|
|
88
|
+
registerBackButton(): void;
|
|
89
|
+
start(): void;
|
|
90
|
+
stop(): void;
|
|
91
|
+
reset(): void;
|
|
92
|
+
private attachScrollListener;
|
|
93
|
+
private removeScrollListener;
|
|
94
|
+
private handleScroll;
|
|
95
|
+
private attachExitIntentListener;
|
|
96
|
+
private removeExitIntentListener;
|
|
97
|
+
private handleExitIntent;
|
|
98
|
+
private attachScrollVelocityListener;
|
|
99
|
+
private removeScrollVelocityListener;
|
|
100
|
+
private handleScrollVelocity;
|
|
101
|
+
private attachVisibilityChangeListener;
|
|
102
|
+
private removeVisibilityChangeListener;
|
|
103
|
+
private handleVisibilityChange;
|
|
104
|
+
private attachBackButtonListener;
|
|
105
|
+
private removeBackButtonListener;
|
|
106
|
+
private handleBackButton;
|
|
107
|
+
private attachActivityListeners;
|
|
108
|
+
private removeActivityListeners;
|
|
109
|
+
private handleActivity;
|
|
110
|
+
private startInactivityCheck;
|
|
111
|
+
private emit;
|
|
112
|
+
}
|
|
113
|
+
export {};
|
|
114
|
+
//# sourceMappingURL=TriggerEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TriggerEngine.d.ts","sourceRoot":"","sources":["../../src/triggers/TriggerEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/triggers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACb,MAAM,iBAAiB,CAAC"}
|