@active-reach/web-sdk 1.3.1 → 1.5.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/dist/aegis.min.js +1 -1
- package/dist/aegis.min.js.map +1 -1
- package/dist/{analytics-B0JfoAJs.mjs → analytics-C00PJUSy.mjs} +269 -2
- package/dist/analytics-C00PJUSy.mjs.map +1 -0
- package/dist/cdn.d.ts +7 -0
- package/dist/cdn.d.ts.map +1 -1
- package/dist/core/analytics.d.ts +20 -0
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/bootstrap.d.ts +71 -0
- package/dist/core/bootstrap.d.ts.map +1 -0
- package/dist/core/prefetch-bundle-client.d.ts +150 -0
- package/dist/core/prefetch-bundle-client.d.ts.map +1 -0
- package/dist/governance/bloom-filter.d.ts +47 -0
- package/dist/governance/bloom-filter.d.ts.map +1 -0
- package/dist/governance/index.d.ts +6 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/murmur3.d.ts +43 -0
- package/dist/governance/murmur3.d.ts.map +1 -0
- package/dist/governance/name-governor.d.ts +98 -0
- package/dist/governance/name-governor.d.ts.map +1 -0
- package/dist/inapp/AegisInAppManager.d.ts +28 -1
- package/dist/inapp/AegisInAppManager.d.ts.map +1 -1
- package/dist/inapp/renderers/carousel-cards.d.ts +15 -0
- package/dist/inapp/renderers/carousel-cards.d.ts.map +1 -0
- package/dist/inapp/renderers/coachmark-tour.d.ts +24 -0
- package/dist/inapp/renderers/coachmark-tour.d.ts.map +1 -0
- package/dist/inapp/renderers/index.d.ts +12 -0
- package/dist/inapp/renderers/index.d.ts.map +1 -0
- package/dist/inapp/renderers/product-recommendation.d.ts +23 -0
- package/dist/inapp/renderers/product-recommendation.d.ts.map +1 -0
- package/dist/inapp/renderers/progress-bar.d.ts +24 -0
- package/dist/inapp/renderers/progress-bar.d.ts.map +1 -0
- package/dist/inapp/renderers/sticky-bar.d.ts +14 -0
- package/dist/inapp/renderers/sticky-bar.d.ts.map +1 -0
- package/dist/inapp/renderers/types.d.ts +27 -0
- package/dist/inapp/renderers/types.d.ts.map +1 -0
- package/dist/inbox/AegisInbox.d.ts +103 -0
- package/dist/inbox/AegisInbox.d.ts.map +1 -0
- package/dist/inbox/index.d.ts +3 -0
- package/dist/inbox/index.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1396 -10
- package/dist/index.js.map +1 -1
- package/dist/push/AegisWebPush.d.ts +17 -2
- package/dist/push/AegisWebPush.d.ts.map +1 -1
- package/dist/push/AegisWebPush.js +95 -29
- package/dist/push/AegisWebPush.js.map +1 -1
- package/dist/react.js +1 -1
- package/package.json +1 -1
- package/dist/analytics-B0JfoAJs.mjs.map +0 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AegisInbox — client-side App Inbox (Message Center).
|
|
3
|
+
*
|
|
4
|
+
* Backs the notification drawer on actii.me WebView and every tenant
|
|
5
|
+
* storefront that embeds the Web SDK. Operates against cell-plane's
|
|
6
|
+
* /v1/in-app/inbox family of endpoints (list, unread-count, read,
|
|
7
|
+
* dismiss, read-all).
|
|
8
|
+
*
|
|
9
|
+
* Design choices:
|
|
10
|
+
* • Hydrate from the prefetch bundle at init — no extra HTTP on first
|
|
11
|
+
* paint. PrefetchBundleClient seeds us; we then own the live copy.
|
|
12
|
+
* • Mutations are optimistic + beacon-backed. Read / dismiss writes to
|
|
13
|
+
* local state immediately, then POSTs with `keepalive: true` so an
|
|
14
|
+
* in-flight dismiss survives page unload.
|
|
15
|
+
* • Badge polling uses the tiny `/unread-count` endpoint on a 60-second
|
|
16
|
+
* cadence — matches the `inbox_poll_interval_ms` from sdk_config's
|
|
17
|
+
* TransportConfig.hybrid mode.
|
|
18
|
+
* • No external dependencies; IndexedDB is optional (we gracefully fall
|
|
19
|
+
* back to in-memory when unavailable, e.g., in private browsing).
|
|
20
|
+
*/
|
|
21
|
+
import type { PrefetchBundleClient } from '../core/prefetch-bundle-client';
|
|
22
|
+
export interface AegisInboxEntry {
|
|
23
|
+
id: string;
|
|
24
|
+
source: string;
|
|
25
|
+
campaign_id: string | null;
|
|
26
|
+
title: string;
|
|
27
|
+
body: string;
|
|
28
|
+
media_url: string | null;
|
|
29
|
+
cta_url: string | null;
|
|
30
|
+
metadata: Record<string, unknown> | null;
|
|
31
|
+
read: boolean;
|
|
32
|
+
read_at: string | null;
|
|
33
|
+
dismissed_at?: string | null;
|
|
34
|
+
created_at: string | null;
|
|
35
|
+
expires_at: string | null;
|
|
36
|
+
}
|
|
37
|
+
export interface AegisInboxConfig {
|
|
38
|
+
apiHost: string;
|
|
39
|
+
writeKey: string;
|
|
40
|
+
organizationId?: string;
|
|
41
|
+
contactId?: string;
|
|
42
|
+
propertyId?: string;
|
|
43
|
+
bundleClient?: PrefetchBundleClient;
|
|
44
|
+
unreadPollIntervalMs?: number;
|
|
45
|
+
}
|
|
46
|
+
export type InboxListener = (state: {
|
|
47
|
+
entries: AegisInboxEntry[];
|
|
48
|
+
unreadCount: number;
|
|
49
|
+
}) => void;
|
|
50
|
+
export declare class AegisInbox {
|
|
51
|
+
private apiHost;
|
|
52
|
+
private writeKey;
|
|
53
|
+
private organizationId?;
|
|
54
|
+
private contactId?;
|
|
55
|
+
private propertyId?;
|
|
56
|
+
private bundleClient?;
|
|
57
|
+
private unreadPollIntervalMs;
|
|
58
|
+
private entries;
|
|
59
|
+
private unreadCount;
|
|
60
|
+
private cursor;
|
|
61
|
+
private listeners;
|
|
62
|
+
private pollTimer;
|
|
63
|
+
private bundleUnsub;
|
|
64
|
+
constructor(config: AegisInboxConfig);
|
|
65
|
+
/** Hydrate from bundle (if available), restore the IDB cache (if any),
|
|
66
|
+
* then start the background unread-count poll. */
|
|
67
|
+
initialize(): Promise<void>;
|
|
68
|
+
stop(): void;
|
|
69
|
+
/** Update identity after login / property switch. Clears the local
|
|
70
|
+
* inbox since it's intrinsically contact+property scoped. */
|
|
71
|
+
setIdentity(partial: {
|
|
72
|
+
contactId?: string;
|
|
73
|
+
propertyId?: string;
|
|
74
|
+
organizationId?: string;
|
|
75
|
+
}): void;
|
|
76
|
+
getEntries(): AegisInboxEntry[];
|
|
77
|
+
getUnreadCount(): number;
|
|
78
|
+
/** Pagination cursor (ISO-8601 timestamp of the oldest entry currently
|
|
79
|
+
* held). Pass it back via `loadMore()` to fetch older history. */
|
|
80
|
+
getCursor(): string | null;
|
|
81
|
+
/** Append one more page of older entries using the current cursor. */
|
|
82
|
+
loadMore(): Promise<void>;
|
|
83
|
+
onChange(l: InboxListener): () => void;
|
|
84
|
+
refreshList(): Promise<void>;
|
|
85
|
+
refreshUnreadCount(): Promise<void>;
|
|
86
|
+
markRead(messageId: string): Promise<void>;
|
|
87
|
+
dismiss(messageId: string): Promise<void>;
|
|
88
|
+
markAllRead(): Promise<void>;
|
|
89
|
+
private seedFromBundle;
|
|
90
|
+
private recomputeUnread;
|
|
91
|
+
private emit;
|
|
92
|
+
private headers;
|
|
93
|
+
/** Best-effort beacon-style POST. Uses `keepalive: true` so it survives
|
|
94
|
+
* a navigation away from the current page (e.g., user taps the CTA
|
|
95
|
+
* which takes them to another URL right after dismiss). */
|
|
96
|
+
private postBeacon;
|
|
97
|
+
private openDb;
|
|
98
|
+
private cacheKey;
|
|
99
|
+
private writeCache;
|
|
100
|
+
private readCache;
|
|
101
|
+
private clearCache;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=AegisInbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AegisInbox.d.ts","sourceRoot":"","sources":["../../src/inbox/AegisInbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,10 +18,18 @@ export { TriggerEngine } from './triggers';
|
|
|
18
18
|
export type { TriggerRule, ScrollDepthConfig, TimeOnPageConfig, ExitIntentConfig, InactivityConfig, TriggerEvent, } from './triggers';
|
|
19
19
|
export { SdkConfigPoller } from './core/sdk-config-poller';
|
|
20
20
|
export type { SdkConfig, SdkConfigPollerOptions, ConfigChangeCallback } from './core/sdk-config-poller';
|
|
21
|
+
export { PrefetchBundleClient } from './core/prefetch-bundle-client';
|
|
22
|
+
export type { PrefetchBundle, PrefetchBundleCampaign, PrefetchBundleInbox, PrefetchBundleInboxEntry, PrefetchBundleClientOptions, PrefetchBundleContext, PrefetchBundleListener, } from './core/prefetch-bundle-client';
|
|
23
|
+
export { AegisInbox } from './inbox';
|
|
24
|
+
export type { AegisInboxConfig, AegisInboxEntry, InboxListener } from './inbox';
|
|
21
25
|
export { AegisWebPush } from './push/AegisWebPush';
|
|
22
26
|
export type { AegisWebPushConfig, AegisAPIClient, ContactIdentity, PushEventTracker, } from './push/AegisWebPush';
|
|
27
|
+
export { bootstrap, readFirstPartyCookie, writeFirstPartyCookie, deriveDeviceFingerprint, BootstrapError, } from './core/bootstrap';
|
|
28
|
+
export type { BootstrapRequest, BootstrapResult } from './core/bootstrap';
|
|
23
29
|
export { RateLimiter } from './core/rate-limiter';
|
|
24
30
|
export type { RateLimiterOptions } from './core/rate-limiter';
|
|
31
|
+
export { NameGovernor, BloomFilter, murmurhash3_x86_32 } from './governance';
|
|
32
|
+
export type { EventGovernanceHint, DropReport, BloomFilterParams } from './governance';
|
|
25
33
|
export { EcommerceTracker } from './ecommerce';
|
|
26
34
|
export type { EcommerceProduct, EcommerceCart, EcommerceCheckout, EcommerceOrder, EcommerceCoupon, EcommerceSearch, EcommerceProductList, EcommerceWishlist, EcommercePromotion, } from './ecommerce';
|
|
27
35
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|