fleek-track-analytics 1.17.35 → 1.17.40
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 +0 -69
- package/lib/node/analytics-tool/node-rudderstack.d.ts +10 -0
- package/lib/node/analytics-tool/node-rudderstack.js +76 -0
- package/lib/node/analytics-tool/node-rudderstack.js.map +1 -0
- package/lib/node/analytics-tool/rudderstack-default-config.js.map +1 -0
- package/lib/node/analytics-tool/rudderstack-event-routing.js +18 -0
- package/lib/node/analytics-tool/rudderstack-event-routing.js.map +1 -0
- package/lib/node/track-analytics/track-analytics-types.d.ts +1 -0
- package/lib/node/track-analytics/track-analytics.d.ts +2 -0
- package/lib/node/track-analytics/track-analytics.js +102 -11
- package/lib/node/track-analytics/track-analytics.js.map +1 -1
- package/lib/react-native/track-analytics/track-analytics.d.ts +0 -2
- package/lib/react-native/track-analytics/track-analytics.js +32 -149
- package/lib/react-native/track-analytics/track-analytics.js.map +1 -1
- package/lib/track-analytics-types.d.ts +0 -5
- package/lib/web/track-analytics/track-analytics.d.ts +0 -2
- package/lib/web/track-analytics/track-analytics.js +38 -139
- package/lib/web/track-analytics/track-analytics.js.map +1 -1
- package/package.json +3 -3
- package/EXPO_RN_TESTING_GUIDE.md +0 -283
- package/lib/react-native/analytics-tool/react-native-rudderstack.d.ts +0 -12
- package/lib/react-native/analytics-tool/react-native-rudderstack.js +0 -87
- package/lib/react-native/analytics-tool/react-native-rudderstack.js.map +0 -1
- package/lib/react-native/analytics-tool/rudderstack-default-config.js +0 -8
- package/lib/react-native/analytics-tool/rudderstack-default-config.js.map +0 -1
- package/lib/react-native/analytics-tool/rudderstack-event-routing.js +0 -16
- package/lib/react-native/analytics-tool/rudderstack-event-routing.js.map +0 -1
- package/lib/web/analytics-tool/rudderstack-default-config.d.ts +0 -4
- package/lib/web/analytics-tool/rudderstack-default-config.js.map +0 -1
- package/lib/web/analytics-tool/rudderstack-event-routing.d.ts +0 -5
- package/lib/web/analytics-tool/rudderstack-event-routing.js +0 -16
- package/lib/web/analytics-tool/rudderstack-event-routing.js.map +0 -1
- package/lib/web/analytics-tool/web-rudderstack.d.ts +0 -17
- package/lib/web/analytics-tool/web-rudderstack.js +0 -76
- package/lib/web/analytics-tool/web-rudderstack.js.map +0 -1
- package/spec-files/rudderstack-migration/HLD_LLD.md +0 -353
- package/spec-files/rudderstack-migration/RUDDERSTACK_SELF_HOSTED_PARAMETERS.md +0 -283
- package/spec-files/rudderstack-migration/SEGMENT_VS_RUDDERSTACK_SDK_COMPARISON.md +0 -140
- /package/lib/{react-native → node}/analytics-tool/rudderstack-default-config.d.ts +0 -0
- /package/lib/{web → node}/analytics-tool/rudderstack-default-config.js +0 -0
- /package/lib/{react-native → node}/analytics-tool/rudderstack-event-routing.d.ts +0 -0
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.reactNativeRudderstack = void 0;
|
|
7
|
-
const rudder_sdk_react_native_1 = __importDefault(require("@rudderstack/rudder-sdk-react-native"));
|
|
8
|
-
const package_json_1 = require("../../../package.json");
|
|
9
|
-
let isInitialized = false;
|
|
10
|
-
let currentWriteKey = null;
|
|
11
|
-
let currentDataPlaneUrl = null;
|
|
12
|
-
const reactNativeRudderstack = async ({ writeKey, dataPlaneUrl, app, dimensionsManager, }) => {
|
|
13
|
-
const normalizedDataPlaneUrl = dataPlaneUrl.endsWith('/') ? dataPlaneUrl.slice(0, -1) : dataPlaneUrl;
|
|
14
|
-
if (!isInitialized || currentWriteKey !== writeKey || currentDataPlaneUrl !== normalizedDataPlaneUrl) {
|
|
15
|
-
try {
|
|
16
|
-
await rudder_sdk_react_native_1.default.setup(writeKey, {
|
|
17
|
-
dataPlaneUrl: normalizedDataPlaneUrl,
|
|
18
|
-
trackAppLifecycleEvents: true,
|
|
19
|
-
recordScreenViews: true,
|
|
20
|
-
flushQueueSize: 5,
|
|
21
|
-
sleepTimeOut: 10,
|
|
22
|
-
});
|
|
23
|
-
try {
|
|
24
|
-
await rudder_sdk_react_native_1.default.optOut(false);
|
|
25
|
-
}
|
|
26
|
-
catch (optOutError) {
|
|
27
|
-
}
|
|
28
|
-
isInitialized = true;
|
|
29
|
-
currentWriteKey = writeKey;
|
|
30
|
-
currentDataPlaneUrl = normalizedDataPlaneUrl;
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
throw error;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
const trackWrapper = async (eventName, eventParams) => {
|
|
37
|
-
const data = eventParams;
|
|
38
|
-
const eventData = Object.assign(Object.assign({}, data), { anlaytics_lib_version: package_json_1.version, fleek_platform: app, time_stamp: Date.now(), ads_params: dimensionsManager.adsDimensionValues, url_params: dimensionsManager.urlDimensionValues, internetStats: dimensionsManager.internetDimensions });
|
|
39
|
-
console.log('RUDDERSTACK CHECK: [TRACK] eventName:', eventName, 'eventData:', JSON.stringify(eventData));
|
|
40
|
-
try {
|
|
41
|
-
rudder_sdk_react_native_1.default.track(eventName, eventData);
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
throw error;
|
|
45
|
-
}
|
|
46
|
-
return Promise.resolve();
|
|
47
|
-
};
|
|
48
|
-
const screenWrapper = async (name, options) => {
|
|
49
|
-
const screenData = Object.assign(Object.assign({}, (options || {})), { anlaytics_lib_version: package_json_1.version, fleek_platform: app, time_stamp: Date.now(), ads_params: dimensionsManager.adsDimensionValues, url_params: dimensionsManager.urlDimensionValues, internetStats: dimensionsManager.internetDimensions });
|
|
50
|
-
console.log('RUDDERSTACK CHECK: [SCREEN] name:', name, 'screenData:', JSON.stringify(screenData));
|
|
51
|
-
try {
|
|
52
|
-
rudder_sdk_react_native_1.default.screen(name, screenData);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
throw error;
|
|
56
|
-
}
|
|
57
|
-
return Promise.resolve();
|
|
58
|
-
};
|
|
59
|
-
const identifyWrapper = async (id, traits) => {
|
|
60
|
-
const traitsObj = traits || {};
|
|
61
|
-
const options = {};
|
|
62
|
-
console.log('RUDDERSTACK CHECK: [IDENTIFY] id:', id, 'traits:', JSON.stringify(traits));
|
|
63
|
-
try {
|
|
64
|
-
if (id) {
|
|
65
|
-
await rudder_sdk_react_native_1.default.identify(id, traitsObj, options);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
await rudder_sdk_react_native_1.default.identify(traitsObj, options);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw error;
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
const getUserId = () => {
|
|
76
|
-
return '';
|
|
77
|
-
};
|
|
78
|
-
return {
|
|
79
|
-
track: trackWrapper,
|
|
80
|
-
screen: screenWrapper,
|
|
81
|
-
identify: identifyWrapper,
|
|
82
|
-
type: 'RN_RUDDERSTACK',
|
|
83
|
-
getUserId,
|
|
84
|
-
};
|
|
85
|
-
};
|
|
86
|
-
exports.reactNativeRudderstack = reactNativeRudderstack;
|
|
87
|
-
//# sourceMappingURL=react-native-rudderstack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"react-native-rudderstack.js","sourceRoot":"","sources":["../../../src/react-native/analytics-tool/react-native-rudderstack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RUDDERSTACK_DEFAULT_CONFIG = void 0;
|
|
4
|
-
exports.RUDDERSTACK_DEFAULT_CONFIG = {
|
|
5
|
-
dataPlaneUrl: 'https://rudderstack.joinfleek.com',
|
|
6
|
-
writeKey: '37NdqKQQY295HrNiIdLWniUMmKU',
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=rudderstack-default-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rudderstack-default-config.js","sourceRoot":"","sources":["../../../src/react-native/analytics-tool/rudderstack-default-config.ts"],"names":[],"mappings":";;;AAAa,QAAA,0BAA0B,GAAG;IACxC,YAAY,EAAE,mCAAmC;IACjD,QAAQ,EAAE,6BAA6B;CACxC,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rudderstackEventRouting = void 0;
|
|
4
|
-
exports.rudderstackEventRouting = {
|
|
5
|
-
sendToRudderstack: [
|
|
6
|
-
'identify',
|
|
7
|
-
'screen',
|
|
8
|
-
'product_detail_page_viewed',
|
|
9
|
-
'homescreen',
|
|
10
|
-
'homescreen_viewed',
|
|
11
|
-
'product_tile_clicked',
|
|
12
|
-
'session_started',
|
|
13
|
-
'collection_viewed',
|
|
14
|
-
],
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=rudderstack-event-routing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rudderstack-event-routing.js","sourceRoot":"","sources":["../../../src/react-native/analytics-tool/rudderstack-event-routing.ts"],"names":[],"mappings":";;;AAUa,QAAA,uBAAuB,GAA6B;IAC/D,iBAAiB,EAAE;QACjB,UAAU;QACV,QAAQ;QACR,4BAA4B;QAC5B,YAAY;QACZ,mBAAmB;QACnB,sBAAsB;QACtB,iBAAiB;QACjB,mBAAmB;KACpB;CACF,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rudderstack-default-config.js","sourceRoot":"","sources":["../../../src/web/analytics-tool/rudderstack-default-config.ts"],"names":[],"mappings":";;;AAAa,QAAA,0BAA0B,GAAG;IACxC,YAAY,EAAE,mCAAmC;IACjD,QAAQ,EAAE,6BAA6B;CACxC,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.rudderstackEventRouting = void 0;
|
|
4
|
-
exports.rudderstackEventRouting = {
|
|
5
|
-
sendToRudderstack: [
|
|
6
|
-
'product_detail_page_viewed',
|
|
7
|
-
'identify',
|
|
8
|
-
'page',
|
|
9
|
-
'homescreen',
|
|
10
|
-
'homescreen_viewed',
|
|
11
|
-
'product_tile_clicked',
|
|
12
|
-
'session_started',
|
|
13
|
-
'collection_viewed',
|
|
14
|
-
],
|
|
15
|
-
};
|
|
16
|
-
//# sourceMappingURL=rudderstack-event-routing.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rudderstack-event-routing.js","sourceRoot":"","sources":["../../../src/web/analytics-tool/rudderstack-event-routing.ts"],"names":[],"mappings":";;;AAUa,QAAA,uBAAuB,GAA6B;IAC/D,iBAAiB,EAAE;QACjB,4BAA4B;QAC5B,UAAU;QACV,MAAM;QACN,YAAY;QACZ,mBAAmB;QACnB,sBAAsB;QACtB,iBAAiB;QACjB,mBAAmB;KACpB;CACF,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { tWebToolWraperFunction } from './analytics-tool-types';
|
|
2
|
-
import { tWebTrack, tWebIdentify, tWebPage } from '../track-analytics/track-analytics-types';
|
|
3
|
-
interface IRudderstackWrapperParams {
|
|
4
|
-
writeKey: string;
|
|
5
|
-
dataPlaneUrl: string;
|
|
6
|
-
app: Parameters<tWebToolWraperFunction>[0]['app'];
|
|
7
|
-
debug?: boolean;
|
|
8
|
-
dimenstionsManager: Parameters<tWebToolWraperFunction>[0]['dimenstionsManager'];
|
|
9
|
-
}
|
|
10
|
-
export declare const webRudderstack: ({ writeKey, dataPlaneUrl, app, debug, dimenstionsManager }: IRudderstackWrapperParams) => {
|
|
11
|
-
track: tWebTrack;
|
|
12
|
-
page: tWebPage;
|
|
13
|
-
identify: tWebIdentify;
|
|
14
|
-
getAnonymousId: () => Promise<string | undefined>;
|
|
15
|
-
type: string;
|
|
16
|
-
};
|
|
17
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.webRudderstack = void 0;
|
|
4
|
-
const analytics_js_1 = require("@rudderstack/analytics-js");
|
|
5
|
-
const package_json_1 = require("../../../package.json");
|
|
6
|
-
const webRudderstack = ({ writeKey, dataPlaneUrl, app, debug, dimenstionsManager }) => {
|
|
7
|
-
const rudderanalytics = new analytics_js_1.RudderAnalytics();
|
|
8
|
-
const normalizedDataPlaneUrl = dataPlaneUrl.endsWith('/') ? dataPlaneUrl.slice(0, -1) : dataPlaneUrl;
|
|
9
|
-
rudderanalytics.load(writeKey, normalizedDataPlaneUrl, {
|
|
10
|
-
anonymousIdOptions: {
|
|
11
|
-
autoCapture: {
|
|
12
|
-
enabled: true,
|
|
13
|
-
source: 'segment',
|
|
14
|
-
},
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
const analytics = rudderanalytics.getAnalyticsInstance(writeKey);
|
|
18
|
-
if (!analytics) {
|
|
19
|
-
throw new Error('Failed to initialize RudderStack analytics instance');
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
track: (async (eventName, eventParams, _options, callback) => {
|
|
23
|
-
const eventData = Object.assign(Object.assign({}, eventParams), { anlaytics_lib_version: package_json_1.version, fleek_platform: app, time_stamp: Date.now(), ads_params: dimenstionsManager.adsDimensionValues, url_params: dimenstionsManager.urlDimensionValues });
|
|
24
|
-
const userTraits = analytics.getUserTraits() || {};
|
|
25
|
-
if (debug) {
|
|
26
|
-
console.log('RUDDERSTACK TRACK EVENT', eventName, eventData, userTraits);
|
|
27
|
-
}
|
|
28
|
-
analytics.track({
|
|
29
|
-
name: eventName,
|
|
30
|
-
properties: Object.assign(Object.assign({}, eventData), { webUserTraits: userTraits }),
|
|
31
|
-
});
|
|
32
|
-
if (callback && typeof callback === 'function') {
|
|
33
|
-
callback();
|
|
34
|
-
}
|
|
35
|
-
return Promise.resolve();
|
|
36
|
-
}),
|
|
37
|
-
page: (async (name, props) => {
|
|
38
|
-
if (debug) {
|
|
39
|
-
console.log('RUDDERSTACK PAGE EVENT', name, props);
|
|
40
|
-
}
|
|
41
|
-
if (typeof name === 'object' && name !== null) {
|
|
42
|
-
analytics.page({
|
|
43
|
-
name: undefined,
|
|
44
|
-
properties: Object.assign(Object.assign({}, name), { fleek_platform: app }),
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
analytics.page({
|
|
49
|
-
name: name || undefined,
|
|
50
|
-
properties: Object.assign(Object.assign({}, props), { fleek_platform: app }),
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return Promise.resolve();
|
|
54
|
-
}),
|
|
55
|
-
identify: (async (...args) => {
|
|
56
|
-
if (debug) {
|
|
57
|
-
console.log('RUDDERSTACK IDENTIFY EVENT', ...args);
|
|
58
|
-
}
|
|
59
|
-
if (args.length >= 1) {
|
|
60
|
-
const userId = args[0];
|
|
61
|
-
const traits = args[1] || {};
|
|
62
|
-
analytics.identify({
|
|
63
|
-
userId: userId || null,
|
|
64
|
-
traits: traits || null,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
return Promise.resolve();
|
|
68
|
-
}),
|
|
69
|
-
getAnonymousId: async () => {
|
|
70
|
-
return analytics.getAnonymousId();
|
|
71
|
-
},
|
|
72
|
-
type: 'WEB_RUDDERSTACK',
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
exports.webRudderstack = webRudderstack;
|
|
76
|
-
//# sourceMappingURL=web-rudderstack.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web-rudderstack.js","sourceRoot":"","sources":["../../../src/web/analytics-tool/web-rudderstack.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
# RudderStack Migration - High-Level Design (HLD) and Low-Level Design (LLD)
|
|
2
|
-
|
|
3
|
-
## High-Level Design (HLD)
|
|
4
|
-
|
|
5
|
-
### System Architecture
|
|
6
|
-
|
|
7
|
-
```mermaid
|
|
8
|
-
graph TB
|
|
9
|
-
subgraph Client["Client Application"]
|
|
10
|
-
TA[TrackAnalytics Class]
|
|
11
|
-
ER[Event Router]
|
|
12
|
-
EM[Event Enrichment Module]
|
|
13
|
-
DM[Dimension Manager]
|
|
14
|
-
TM[Trace Manager]
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
subgraph SDKs["Analytics SDKs"]
|
|
18
|
-
SS[Segment SDK]
|
|
19
|
-
RS[RudderStack SDK]
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
subgraph Backend["Backend Infrastructure"]
|
|
23
|
-
CP[Control Plane<br/>Hosted/Self-hosted]
|
|
24
|
-
DP[Data Plane<br/>Self-hosted]
|
|
25
|
-
PG[(PostgreSQL)]
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
subgraph Destinations["Destinations"]
|
|
29
|
-
D1[Warehouse]
|
|
30
|
-
D2[Third-party Tools]
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
TA --> EM
|
|
34
|
-
EM --> DM
|
|
35
|
-
EM --> TM
|
|
36
|
-
EM --> ER
|
|
37
|
-
ER -->|"All Events"| SS
|
|
38
|
-
ER -->|"Config-based"| RS
|
|
39
|
-
SS -->|"Events"| CP
|
|
40
|
-
RS -->|"Events"| DP
|
|
41
|
-
CP --> DP
|
|
42
|
-
DP --> PG
|
|
43
|
-
DP --> D1
|
|
44
|
-
DP --> D2
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Component Responsibilities
|
|
48
|
-
|
|
49
|
-
1. **TrackAnalytics Class**: Main entry point, maintains existing API unchanged
|
|
50
|
-
2. **Event Router**: New component that routes events based on internal library configuration
|
|
51
|
-
3. **Event Enrichment**: Existing module (unchanged) - adds trace context, dimensions
|
|
52
|
-
4. **Dimension Manager**: Existing module (unchanged) - manages ads and URL dimensions
|
|
53
|
-
5. **Trace Manager**: Existing module (unchanged) - manages session and trace IDs
|
|
54
|
-
6. **SDK Wrappers**: Separate wrappers for Segment and RudderStack
|
|
55
|
-
|
|
56
|
-
### Data Flow
|
|
57
|
-
|
|
58
|
-
1. Application calls `trackAnalytics.track(eventName, properties)`
|
|
59
|
-
2. `enrichEvent()` adds trace context and dimensions (unchanged)
|
|
60
|
-
3. Event Router checks internal library configuration:
|
|
61
|
-
- Always sends to Segment (existing behavior, unchanged)
|
|
62
|
-
- Conditionally sends to RudderStack if event matches internal routing config
|
|
63
|
-
4. Each SDK wrapper formats and sends events to respective endpoints
|
|
64
|
-
5. RudderStack data plane processes and routes to destinations
|
|
65
|
-
|
|
66
|
-
### Key Design Principles
|
|
67
|
-
|
|
68
|
-
- **Non-Breaking**: Segment integration remains completely unchanged
|
|
69
|
-
- **Dual-Send**: Events can be sent to both platforms simultaneously
|
|
70
|
-
- **Config-Driven**: Routing controlled by internal library configuration
|
|
71
|
-
- **Fail-Safe**: RudderStack failures do not affect Segment sending
|
|
72
|
-
- **Isolated**: RudderStack logic is isolated from Segment logic
|
|
73
|
-
|
|
74
|
-
## Low-Level Design (LLD)
|
|
75
|
-
|
|
76
|
-
### File Structure
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
src/web/
|
|
80
|
-
├── analytics-tool/
|
|
81
|
-
│ ├── web-segment.ts (unchanged)
|
|
82
|
-
│ ├── web-rudderstack.ts (new)
|
|
83
|
-
│ ├── rudderstack-event-routing.ts (new - internal routing config)
|
|
84
|
-
│ └── analytics-tool-types.ts (unchanged)
|
|
85
|
-
├── track-analytics/
|
|
86
|
-
│ ├── track-analytics.ts (modified - add routing)
|
|
87
|
-
│ └── track-analytics-types.ts (unchanged)
|
|
88
|
-
└── index.ts (unchanged)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### Component Details
|
|
92
|
-
|
|
93
|
-
#### 1. Event Routing Configuration (`rudderstack-event-routing.ts`)
|
|
94
|
-
|
|
95
|
-
**Purpose**: Internal library configuration for event routing
|
|
96
|
-
|
|
97
|
-
**Location**: `src/web/analytics-tool/rudderstack-event-routing.ts`
|
|
98
|
-
|
|
99
|
-
**Structure**:
|
|
100
|
-
```typescript
|
|
101
|
-
export interface IRudderstackEventRouting {
|
|
102
|
-
sendToRudderstack?: string[]; // List of event names
|
|
103
|
-
eventPatterns?: string[]; // Regex patterns for event names
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export const rudderstackEventRouting: IRudderstackEventRouting = {
|
|
107
|
-
sendToRudderstack: [
|
|
108
|
-
// Event names to send to RudderStack
|
|
109
|
-
],
|
|
110
|
-
// eventPatterns: ['^test_', '^poc_']
|
|
111
|
-
};
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**Key Points**:
|
|
115
|
-
- Managed within library repository
|
|
116
|
-
- Not passed from application layer
|
|
117
|
-
- Can be modified without application changes
|
|
118
|
-
|
|
119
|
-
#### 2. RudderStack Wrapper (`web-rudderstack.ts`)
|
|
120
|
-
|
|
121
|
-
**Purpose**: Wrapper around RudderStack SDK, similar to `web-segment.ts`
|
|
122
|
-
|
|
123
|
-
**Location**: `src/web/analytics-tool/web-rudderstack.ts`
|
|
124
|
-
|
|
125
|
-
**Responsibilities**:
|
|
126
|
-
- Initialize RudderStack SDK
|
|
127
|
-
- Format events with metadata (version, platform, timestamp, dimensions)
|
|
128
|
-
- Implement `IWebAnalyticsWrapper` interface
|
|
129
|
-
- Handle anonymous ID synchronization with Segment
|
|
130
|
-
|
|
131
|
-
**Key Implementation Details**:
|
|
132
|
-
- Uses `@rudderstack/rudder-sdk-js` package
|
|
133
|
-
- Initializes with write key and data plane URL
|
|
134
|
-
- Syncs anonymousId from Segment for migration continuity
|
|
135
|
-
- Adds same metadata as Segment wrapper (analytics_lib_version, fleek_platform, etc.)
|
|
136
|
-
|
|
137
|
-
#### 3. TrackAnalytics Modifications (`track-analytics.ts`)
|
|
138
|
-
|
|
139
|
-
**Changes Required**:
|
|
140
|
-
|
|
141
|
-
1. **New Property**: Add `rudderstackWrapper` property
|
|
142
|
-
```typescript
|
|
143
|
-
private rudderstackWrapper: IWebAnalyticsWrapper | null = null;
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
2. **Modified `initAnalytics()` Method**:
|
|
147
|
-
- Keep existing Segment initialization (unchanged)
|
|
148
|
-
- Add RudderStack initialization if enabled
|
|
149
|
-
- Wrap RudderStack init in try-catch for error handling
|
|
150
|
-
|
|
151
|
-
3. **Modified `track()` Method**:
|
|
152
|
-
- Keep existing Segment call (unchanged)
|
|
153
|
-
- Add conditional RudderStack call based on routing config
|
|
154
|
-
- Wrap RudderStack call in try-catch
|
|
155
|
-
|
|
156
|
-
4. **Modified `identify()` Method**:
|
|
157
|
-
- Keep existing Segment call (unchanged)
|
|
158
|
-
- Add conditional RudderStack call based on routing config
|
|
159
|
-
- Wrap RudderStack call in try-catch
|
|
160
|
-
|
|
161
|
-
5. **Modified `page()` Method**:
|
|
162
|
-
- Keep existing Segment call (unchanged)
|
|
163
|
-
- Add conditional RudderStack call based on routing config
|
|
164
|
-
- Wrap RudderStack call in try-catch
|
|
165
|
-
|
|
166
|
-
6. **New Method**: `shouldSendToRudderstack()`
|
|
167
|
-
- Checks internal routing configuration
|
|
168
|
-
- Supports event name list and regex patterns
|
|
169
|
-
- Returns boolean
|
|
170
|
-
|
|
171
|
-
#### 4. Type Definitions (`track-analytics-types.ts`)
|
|
172
|
-
|
|
173
|
-
**Changes Required**:
|
|
174
|
-
|
|
175
|
-
Extend `IAnalyticsInit` interface:
|
|
176
|
-
```typescript
|
|
177
|
-
export interface IAnalyticsInit {
|
|
178
|
-
// ... existing fields
|
|
179
|
-
rudderstack?: {
|
|
180
|
-
enabled: boolean;
|
|
181
|
-
writeKey: string;
|
|
182
|
-
dataPlaneUrl: string;
|
|
183
|
-
// Note: eventRouting is NOT part of this interface
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### Implementation Flow
|
|
189
|
-
|
|
190
|
-
#### Initialization Flow
|
|
191
|
-
|
|
192
|
-
```
|
|
193
|
-
1. Application creates TrackAnalytics instance
|
|
194
|
-
↓
|
|
195
|
-
2. Application calls initAnalytics()
|
|
196
|
-
↓
|
|
197
|
-
3. Initialize Dimension Manager (unchanged)
|
|
198
|
-
↓
|
|
199
|
-
4. Initialize Segment SDK (unchanged)
|
|
200
|
-
↓
|
|
201
|
-
5. Check if RudderStack enabled
|
|
202
|
-
├─→ No: Continue with Segment only
|
|
203
|
-
└─→ Yes: Initialize RudderStack SDK
|
|
204
|
-
├─→ Success: Store wrapper reference
|
|
205
|
-
└─→ Failure: Log error, continue with Segment only
|
|
206
|
-
↓
|
|
207
|
-
6. Initialize Trace Manager (unchanged)
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
#### Event Tracking Flow
|
|
211
|
-
|
|
212
|
-
```
|
|
213
|
-
1. Application calls track(eventName, properties)
|
|
214
|
-
↓
|
|
215
|
-
2. Check if initialized (unchanged)
|
|
216
|
-
↓
|
|
217
|
-
3. Check if bot/crawler (unchanged)
|
|
218
|
-
↓
|
|
219
|
-
4. enrichEvent() - Add trace context (unchanged)
|
|
220
|
-
↓
|
|
221
|
-
5. Send to Segment (unchanged)
|
|
222
|
-
↓
|
|
223
|
-
6. Check shouldSendToRudderstack(eventName)
|
|
224
|
-
├─→ No: End
|
|
225
|
-
└─→ Yes: Send to RudderStack
|
|
226
|
-
├─→ Success: Event sent
|
|
227
|
-
└─→ Failure: Log error, continue (don't affect Segment)
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
### Error Handling Strategy
|
|
231
|
-
|
|
232
|
-
1. **Initialization Errors**:
|
|
233
|
-
- RudderStack init failures are caught and logged
|
|
234
|
-
- Application continues with Segment only
|
|
235
|
-
- No impact on existing functionality
|
|
236
|
-
|
|
237
|
-
2. **Event Sending Errors**:
|
|
238
|
-
- RudderStack send failures are caught and logged
|
|
239
|
-
- Segment sending continues normally
|
|
240
|
-
- Errors logged via existing errorHandler
|
|
241
|
-
|
|
242
|
-
3. **Configuration Errors**:
|
|
243
|
-
- Invalid routing config defaults to not sending to RudderStack
|
|
244
|
-
- No impact on Segment functionality
|
|
245
|
-
|
|
246
|
-
### Testing Strategy
|
|
247
|
-
|
|
248
|
-
#### Unit Tests
|
|
249
|
-
|
|
250
|
-
1. **Event Routing Logic**:
|
|
251
|
-
- Test `shouldSendToRudderstack()` with various configurations
|
|
252
|
-
- Test event name matching
|
|
253
|
-
- Test regex pattern matching
|
|
254
|
-
|
|
255
|
-
2. **Wrapper Tests**:
|
|
256
|
-
- Test RudderStack wrapper initialization
|
|
257
|
-
- Test event formatting
|
|
258
|
-
- Test metadata addition
|
|
259
|
-
|
|
260
|
-
#### Integration Tests
|
|
261
|
-
|
|
262
|
-
1. **Dual-Send Tests**:
|
|
263
|
-
- Verify events sent to both platforms
|
|
264
|
-
- Verify events sent only to Segment when not in config
|
|
265
|
-
- Verify error handling doesn't affect Segment
|
|
266
|
-
|
|
267
|
-
2. **End-to-End Tests**:
|
|
268
|
-
- Test full initialization flow
|
|
269
|
-
- Test event tracking flow
|
|
270
|
-
- Test error scenarios
|
|
271
|
-
|
|
272
|
-
### Migration Path
|
|
273
|
-
|
|
274
|
-
#### Phase 1: PoC (Current Implementation)
|
|
275
|
-
- Web platform only
|
|
276
|
-
- Internal routing configuration
|
|
277
|
-
- Dual-send for selected events
|
|
278
|
-
- No changes to Segment integration
|
|
279
|
-
|
|
280
|
-
#### Phase 2: Validation
|
|
281
|
-
- Monitor event delivery to both platforms
|
|
282
|
-
- Compare data quality
|
|
283
|
-
- Validate routing logic
|
|
284
|
-
|
|
285
|
-
#### Phase 3: Expansion
|
|
286
|
-
- Extend to React Native platform
|
|
287
|
-
- Extend to Node.js platform
|
|
288
|
-
- Add more events to routing config
|
|
289
|
-
|
|
290
|
-
#### Phase 4: Full Migration
|
|
291
|
-
- Gradually move all events to RudderStack
|
|
292
|
-
- Remove Segment integration
|
|
293
|
-
- Clean up code
|
|
294
|
-
|
|
295
|
-
### Performance Considerations
|
|
296
|
-
|
|
297
|
-
1. **Dual-Send Overhead**:
|
|
298
|
-
- Minimal - both SDKs send asynchronously
|
|
299
|
-
- No blocking operations
|
|
300
|
-
- Failures don't cascade
|
|
301
|
-
|
|
302
|
-
2. **Memory Usage**:
|
|
303
|
-
- Both SDKs loaded in memory
|
|
304
|
-
- Similar memory footprint to Segment alone
|
|
305
|
-
- No significant impact
|
|
306
|
-
|
|
307
|
-
3. **Network Traffic**:
|
|
308
|
-
- Events sent to both platforms
|
|
309
|
-
- Consider bandwidth for high-volume events
|
|
310
|
-
- Can be controlled via routing config
|
|
311
|
-
|
|
312
|
-
### Security Considerations
|
|
313
|
-
|
|
314
|
-
1. **Credentials**:
|
|
315
|
-
- Write keys stored securely
|
|
316
|
-
- Data plane URL should use HTTPS
|
|
317
|
-
- No credentials in routing config
|
|
318
|
-
|
|
319
|
-
2. **Data Privacy**:
|
|
320
|
-
- Same data sent to both platforms
|
|
321
|
-
- Ensure compliance with both platforms
|
|
322
|
-
- Consider data residency requirements
|
|
323
|
-
|
|
324
|
-
### Monitoring and Observability
|
|
325
|
-
|
|
326
|
-
1. **Metrics to Track**:
|
|
327
|
-
- Events sent to Segment (existing)
|
|
328
|
-
- Events sent to RudderStack (new)
|
|
329
|
-
- Routing decision counts
|
|
330
|
-
- Error rates for RudderStack
|
|
331
|
-
|
|
332
|
-
2. **Logging**:
|
|
333
|
-
- RudderStack initialization status
|
|
334
|
-
- Routing decisions (optional, for debugging)
|
|
335
|
-
- Error logs for RudderStack operations
|
|
336
|
-
|
|
337
|
-
### Rollback Strategy
|
|
338
|
-
|
|
339
|
-
If issues arise:
|
|
340
|
-
1. Disable RudderStack via configuration (enabled: false)
|
|
341
|
-
2. Remove RudderStack initialization code
|
|
342
|
-
3. Revert to Segment-only implementation
|
|
343
|
-
4. No data loss - Segment continues working
|
|
344
|
-
|
|
345
|
-
### Success Criteria
|
|
346
|
-
|
|
347
|
-
- ✅ Segment integration unchanged and working
|
|
348
|
-
- ✅ RudderStack integration working for configured events
|
|
349
|
-
- ✅ Events correctly routed based on configuration
|
|
350
|
-
- ✅ No breaking changes to existing API
|
|
351
|
-
- ✅ Error handling prevents RudderStack issues from affecting Segment
|
|
352
|
-
- ✅ PoC validates event delivery to both platforms
|
|
353
|
-
|