vc-cdp-rn-sdk 0.1.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 +539 -0
- package/dist/CdpRnSdk.d.ts +129 -0
- package/dist/CdpRnSdk.d.ts.map +1 -0
- package/dist/CdpRnSdk.js +521 -0
- package/dist/CdpRnSdk.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crypto.d.ts +17 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +60 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/device.d.ts +3 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/device.js +58 -0
- package/dist/utils/device.js.map +1 -0
- package/dist/utils/storage.d.ts +12 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +51 -0
- package/dist/utils/storage.js.map +1 -0
- package/package.json +47 -0
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
export interface CdpRnConfig {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
secretKey: string;
|
|
4
|
+
source: string;
|
|
5
|
+
serviceName: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
isTest?: boolean;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
batchSize?: number;
|
|
10
|
+
batchInterval?: number;
|
|
11
|
+
enableEncryption?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface UserTraits {
|
|
14
|
+
full_name?: string;
|
|
15
|
+
first_name?: string;
|
|
16
|
+
last_name?: string;
|
|
17
|
+
phone?: string;
|
|
18
|
+
email?: string;
|
|
19
|
+
idcard?: string;
|
|
20
|
+
old_idcard?: string;
|
|
21
|
+
gender?: 'M' | 'F' | 'O';
|
|
22
|
+
dob?: string;
|
|
23
|
+
address?: string;
|
|
24
|
+
marital_status?: string;
|
|
25
|
+
occupation?: string;
|
|
26
|
+
nationality?: string;
|
|
27
|
+
kyc_status?: string;
|
|
28
|
+
religion?: string;
|
|
29
|
+
mps_verified?: boolean;
|
|
30
|
+
zalo_id?: string;
|
|
31
|
+
tiktok_id?: string;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
}
|
|
34
|
+
export interface PlatformInfo {
|
|
35
|
+
device_type?: string;
|
|
36
|
+
brand?: string;
|
|
37
|
+
model?: string;
|
|
38
|
+
app_version?: string;
|
|
39
|
+
os_name?: string;
|
|
40
|
+
os_version?: string;
|
|
41
|
+
device_id?: string;
|
|
42
|
+
push_token?: string;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface CampaignInfo {
|
|
46
|
+
utm_source?: string;
|
|
47
|
+
utm_medium?: string;
|
|
48
|
+
utm_campaign?: string;
|
|
49
|
+
utm_term?: string;
|
|
50
|
+
utm_content?: string;
|
|
51
|
+
[key: string]: unknown;
|
|
52
|
+
}
|
|
53
|
+
export interface ConsentInfo {
|
|
54
|
+
consent_type: string;
|
|
55
|
+
status: boolean;
|
|
56
|
+
consent_date?: string;
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
}
|
|
59
|
+
export interface ScoreInfo {
|
|
60
|
+
score_type: string;
|
|
61
|
+
score_value: number;
|
|
62
|
+
score_date?: string;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}
|
|
65
|
+
export interface ProductInfo {
|
|
66
|
+
product_code: string;
|
|
67
|
+
product_name?: string;
|
|
68
|
+
status?: string;
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
}
|
|
71
|
+
export interface EventProperties {
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
export interface EventContext {
|
|
75
|
+
locale?: string;
|
|
76
|
+
timezone?: string;
|
|
77
|
+
app?: {
|
|
78
|
+
version?: string;
|
|
79
|
+
build?: string;
|
|
80
|
+
};
|
|
81
|
+
[key: string]: unknown;
|
|
82
|
+
}
|
|
83
|
+
export interface CdpEvent {
|
|
84
|
+
event_id: string;
|
|
85
|
+
type: string;
|
|
86
|
+
event_name: string;
|
|
87
|
+
service_name: string;
|
|
88
|
+
user_id: string;
|
|
89
|
+
profile_id: string | null;
|
|
90
|
+
anonymous_id: string;
|
|
91
|
+
device_id: string;
|
|
92
|
+
session_id: string;
|
|
93
|
+
properties: EventProperties;
|
|
94
|
+
campaign: CampaignInfo;
|
|
95
|
+
context: EventContext;
|
|
96
|
+
platforms: PlatformInfo;
|
|
97
|
+
event_time: string;
|
|
98
|
+
}
|
|
99
|
+
export type PartyType = 'PERSON' | 'ORG';
|
|
100
|
+
export interface ProfilePayload {
|
|
101
|
+
type: string;
|
|
102
|
+
user_id: string;
|
|
103
|
+
session_id: string;
|
|
104
|
+
device_id: string;
|
|
105
|
+
party_type: PartyType;
|
|
106
|
+
service_name: string;
|
|
107
|
+
traits: string | UserTraits;
|
|
108
|
+
platforms: PlatformInfo;
|
|
109
|
+
campaign: CampaignInfo;
|
|
110
|
+
metadata: Record<string, unknown>;
|
|
111
|
+
profile_id?: string;
|
|
112
|
+
consents?: ConsentInfo[];
|
|
113
|
+
scores?: ScoreInfo[];
|
|
114
|
+
products?: ProductInfo[];
|
|
115
|
+
}
|
|
116
|
+
export interface ProfileUpdatePayload {
|
|
117
|
+
profile_id: string;
|
|
118
|
+
traits?: string | UserTraits;
|
|
119
|
+
consents?: ConsentInfo[];
|
|
120
|
+
scores?: ScoreInfo[];
|
|
121
|
+
products?: ProductInfo[];
|
|
122
|
+
metadata?: Record<string, unknown>;
|
|
123
|
+
}
|
|
124
|
+
export interface ProfileResponse {
|
|
125
|
+
code: number;
|
|
126
|
+
message: string;
|
|
127
|
+
transaction_id: string;
|
|
128
|
+
profile_id: string;
|
|
129
|
+
}
|
|
130
|
+
export interface ProfileData {
|
|
131
|
+
profile_id: string;
|
|
132
|
+
user_id?: string;
|
|
133
|
+
traits?: UserTraits;
|
|
134
|
+
platforms?: PlatformInfo;
|
|
135
|
+
consents?: ConsentInfo[];
|
|
136
|
+
scores?: ScoreInfo[];
|
|
137
|
+
products?: ProductInfo[];
|
|
138
|
+
created_at?: string;
|
|
139
|
+
updated_at?: string;
|
|
140
|
+
[key: string]: unknown;
|
|
141
|
+
}
|
|
142
|
+
export interface UserIdentities {
|
|
143
|
+
user_id: string | null;
|
|
144
|
+
profile_id: string | null;
|
|
145
|
+
anonymous_id: string;
|
|
146
|
+
device_id: string;
|
|
147
|
+
session_id: string;
|
|
148
|
+
[key: string]: unknown;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate HMAC-SHA256 signature
|
|
3
|
+
* Formula: Base64(HMAC(SHA256(source + "|" + timestamp + "|" + payload)))
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateSignature(secretKey: string, source: string, timestamp: string, payload: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Encrypt PII traits using AES-256-CBC
|
|
8
|
+
* Formula: Base64(IV + AES_CBC_PKCS5(key, plaintext_traits_json))
|
|
9
|
+
* Key: SHA256(secretKey + timestamp) → 32 bytes
|
|
10
|
+
* IV: Random 16 bytes
|
|
11
|
+
*
|
|
12
|
+
* NOTE: CryptoJS with a WordArray key does NOT auto-prepend IV to output.
|
|
13
|
+
* We must manually prepend: iv.concat(encrypted.ciphertext) → Base64.
|
|
14
|
+
*/
|
|
15
|
+
export declare function encryptTraits(secretKey: string, timestamp: string, traits: object): string;
|
|
16
|
+
export declare function generateUUID(): string;
|
|
17
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/G;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB1F;AAED,wBAAgB,YAAY,IAAI,MAAM,CAMrC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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.generateSignature = generateSignature;
|
|
7
|
+
exports.encryptTraits = encryptTraits;
|
|
8
|
+
exports.generateUUID = generateUUID;
|
|
9
|
+
const crypto_js_1 = __importDefault(require("crypto-js"));
|
|
10
|
+
/**
|
|
11
|
+
* Generate HMAC-SHA256 signature
|
|
12
|
+
* Formula: Base64(HMAC(SHA256(source + "|" + timestamp + "|" + payload)))
|
|
13
|
+
*/
|
|
14
|
+
function generateSignature(secretKey, source, timestamp, payload) {
|
|
15
|
+
try {
|
|
16
|
+
const message = `${source}|${timestamp}|${payload}`;
|
|
17
|
+
const hmac = crypto_js_1.default.HmacSHA256(message, secretKey);
|
|
18
|
+
return crypto_js_1.default.enc.Base64.stringify(hmac);
|
|
19
|
+
}
|
|
20
|
+
catch (_a) {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Encrypt PII traits using AES-256-CBC
|
|
26
|
+
* Formula: Base64(IV + AES_CBC_PKCS5(key, plaintext_traits_json))
|
|
27
|
+
* Key: SHA256(secretKey + timestamp) → 32 bytes
|
|
28
|
+
* IV: Random 16 bytes
|
|
29
|
+
*
|
|
30
|
+
* NOTE: CryptoJS with a WordArray key does NOT auto-prepend IV to output.
|
|
31
|
+
* We must manually prepend: iv.concat(encrypted.ciphertext) → Base64.
|
|
32
|
+
*/
|
|
33
|
+
function encryptTraits(secretKey, timestamp, traits) {
|
|
34
|
+
try {
|
|
35
|
+
const traitsJson = JSON.stringify(traits);
|
|
36
|
+
// Key = SHA256(secretKey + timestamp) → 32-byte WordArray
|
|
37
|
+
const key = crypto_js_1.default.SHA256(secretKey + timestamp);
|
|
38
|
+
// Random 16-byte IV
|
|
39
|
+
const iv = crypto_js_1.default.lib.WordArray.random(16);
|
|
40
|
+
const encrypted = crypto_js_1.default.AES.encrypt(traitsJson, key, {
|
|
41
|
+
iv,
|
|
42
|
+
mode: crypto_js_1.default.mode.CBC,
|
|
43
|
+
padding: crypto_js_1.default.pad.Pkcs7,
|
|
44
|
+
});
|
|
45
|
+
// Prepend IV to ciphertext then Base64-encode: Base64(IV + ciphertext)
|
|
46
|
+
const combined = iv.clone().concat(encrypted.ciphertext);
|
|
47
|
+
return crypto_js_1.default.enc.Base64.stringify(combined);
|
|
48
|
+
}
|
|
49
|
+
catch (_a) {
|
|
50
|
+
return '';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function generateUUID() {
|
|
54
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
55
|
+
const r = (Math.random() * 16) | 0;
|
|
56
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
57
|
+
return v.toString(16);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":";;;;;AAMA,8CAQC;AAWD,sCAsBC;AAED,oCAMC;AAvDD,0DAAiC;AAEjC;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,MAAc,EAAE,SAAiB,EAAE,OAAe;IACrG,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,GAAG,MAAM,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,mBAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,mBAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,MAAc;IAChF,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE1C,0DAA0D;QAC1D,MAAM,GAAG,GAAG,mBAAQ,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;QAEnD,oBAAoB;QACpB,MAAM,EAAE,GAAG,mBAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,SAAS,GAAG,mBAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE;YACtD,EAAE;YACF,IAAI,EAAE,mBAAQ,CAAC,IAAI,CAAC,GAAG;YACvB,OAAO,EAAE,mBAAQ,CAAC,GAAG,CAAC,KAAK;SAC5B,CAAC,CAAC;QAEH,uEAAuE;QACvE,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACzD,OAAO,mBAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAYxC,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,YAAY,CAAC,CA8C/D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.collectDeviceInfo = collectDeviceInfo;
|
|
4
|
+
// Lazy import to avoid hard dependency
|
|
5
|
+
function getDeviceInfo() {
|
|
6
|
+
try {
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
8
|
+
return require('react-native-device-info');
|
|
9
|
+
}
|
|
10
|
+
catch (_a) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
async function collectDeviceInfo() {
|
|
15
|
+
var _a, _b;
|
|
16
|
+
const DeviceInfo = getDeviceInfo();
|
|
17
|
+
if (!DeviceInfo) {
|
|
18
|
+
return {
|
|
19
|
+
device_type: 'mobile',
|
|
20
|
+
os_name: 'unknown',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const [brand, model, systemVersion, appVersion, deviceType] = await Promise.all([
|
|
25
|
+
DeviceInfo.getBrand ? Promise.resolve(DeviceInfo.getBrand()) : Promise.resolve('Unknown'),
|
|
26
|
+
DeviceInfo.getModel ? Promise.resolve(DeviceInfo.getModel()) : Promise.resolve('Unknown'),
|
|
27
|
+
DeviceInfo.getSystemVersion ? Promise.resolve(DeviceInfo.getSystemVersion()) : Promise.resolve('Unknown'),
|
|
28
|
+
DeviceInfo.getVersion ? Promise.resolve(DeviceInfo.getVersion()) : Promise.resolve(''),
|
|
29
|
+
DeviceInfo.getDeviceType ? Promise.resolve(DeviceInfo.getDeviceType()) : Promise.resolve('Handset'),
|
|
30
|
+
]);
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
32
|
+
const { Platform } = require('react-native');
|
|
33
|
+
const osName = Platform.OS === 'ios' ? 'iOS' : Platform.OS === 'android' ? 'Android' : Platform.OS;
|
|
34
|
+
const deviceTypeMap = {
|
|
35
|
+
Handset: 'mobile',
|
|
36
|
+
Tablet: 'tablet',
|
|
37
|
+
Tv: 'tv',
|
|
38
|
+
Desktop: 'desktop',
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
device_type: (_a = deviceTypeMap[deviceType]) !== null && _a !== void 0 ? _a : 'mobile',
|
|
42
|
+
brand,
|
|
43
|
+
model,
|
|
44
|
+
app_version: appVersion,
|
|
45
|
+
os_name: osName,
|
|
46
|
+
os_version: systemVersion,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (_c) {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
51
|
+
const { Platform } = require('react-native');
|
|
52
|
+
return {
|
|
53
|
+
device_type: 'mobile',
|
|
54
|
+
os_name: (_b = Platform.OS) !== null && _b !== void 0 ? _b : 'unknown',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/utils/device.ts"],"names":[],"mappings":";;AAYA,8CA8CC;AAxDD,uCAAuC;AACvC,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,iBAAiB;;IACrC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC9E,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACzF,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACzF,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YACzG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACtF,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;SACpG,CAAC,CAAC;QAEH,8DAA8D;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEnG,MAAM,aAAa,GAA2B;YAC5C,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,SAAS;SACnB,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,MAAA,aAAa,CAAC,UAAoB,CAAC,mCAAI,QAAQ;YAC5D,KAAK;YACL,KAAK;YACL,WAAW,EAAE,UAAU;YACvB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;IAAC,WAAM,CAAC;QACP,8DAA8D;QAC9D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QAC7C,OAAO;YACL,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,MAAA,QAAQ,CAAC,EAAE,mCAAI,SAAS;SAClC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const Storage: {
|
|
2
|
+
get(key: string): Promise<string | null>;
|
|
3
|
+
set(key: string, value: string): Promise<void>;
|
|
4
|
+
remove(key: string): Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
export declare const STORAGE_KEYS: {
|
|
7
|
+
readonly ANONYMOUS_ID: "cdp_anonymous_id";
|
|
8
|
+
readonly DEVICE_ID: "cdp_device_id";
|
|
9
|
+
readonly SESSION_ID: "cdp_session_id";
|
|
10
|
+
readonly PROFILE_ID: "cdp_profile_id";
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,OAAO;aACH,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;aAQ/B,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;gBAQlC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;CAKf,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STORAGE_KEYS = exports.Storage = void 0;
|
|
4
|
+
// Lazy import to avoid hard dependency at module load time
|
|
5
|
+
let AsyncStorage = null;
|
|
6
|
+
function getStorage() {
|
|
7
|
+
if (!AsyncStorage) {
|
|
8
|
+
try {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
10
|
+
AsyncStorage = require('@react-native-async-storage/async-storage').default;
|
|
11
|
+
}
|
|
12
|
+
catch (_a) {
|
|
13
|
+
throw new Error('[CDP RN SDK] @react-native-async-storage/async-storage is required. ' +
|
|
14
|
+
'Install it with: npm install @react-native-async-storage/async-storage');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return AsyncStorage;
|
|
18
|
+
}
|
|
19
|
+
exports.Storage = {
|
|
20
|
+
async get(key) {
|
|
21
|
+
try {
|
|
22
|
+
return await getStorage().getItem(key);
|
|
23
|
+
}
|
|
24
|
+
catch (_a) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async set(key, value) {
|
|
29
|
+
try {
|
|
30
|
+
await getStorage().setItem(key, value);
|
|
31
|
+
}
|
|
32
|
+
catch (_a) {
|
|
33
|
+
// silent fail
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
async remove(key) {
|
|
37
|
+
try {
|
|
38
|
+
await getStorage().removeItem(key);
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
// silent fail
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
exports.STORAGE_KEYS = {
|
|
46
|
+
ANONYMOUS_ID: 'cdp_anonymous_id',
|
|
47
|
+
DEVICE_ID: 'cdp_device_id',
|
|
48
|
+
SESSION_ID: 'cdp_session_id',
|
|
49
|
+
PROFILE_ID: 'cdp_profile_id',
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/utils/storage.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC3D,IAAI,YAAY,GAIL,IAAI,CAAC;AAEhB,SAAS,UAAU;IACjB,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,8DAA8D;YAC9D,YAAY,GAAG,OAAO,CAAC,2CAA2C,CAAC,CAAC,OAAO,CAAC;QAC9E,CAAC;QAAC,WAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,sEAAsE;gBACtE,wEAAwE,CACzE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,YAAa,CAAC;AACvB,CAAC;AAEY,QAAA,OAAO,GAAG;IACrB,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,WAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QAAC,WAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;CACF,CAAC;AAEW,QAAA,YAAY,GAAG;IAC1B,YAAY,EAAE,kBAAkB;IAChC,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,gBAAgB;IAC5B,UAAU,EAAE,gBAAgB;CACpB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vc-cdp-rn-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CDP SDK for React Native - Customer Data Platform tracking for iOS and Android",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"build:watch": "tsc --watch",
|
|
14
|
+
"test": "jest",
|
|
15
|
+
"lint": "eslint src --ext .ts"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"cdp",
|
|
19
|
+
"analytics",
|
|
20
|
+
"tracking",
|
|
21
|
+
"react-native",
|
|
22
|
+
"ios",
|
|
23
|
+
"android",
|
|
24
|
+
"customer-data-platform"
|
|
25
|
+
],
|
|
26
|
+
"author": "VietCredit",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@react-native-async-storage/async-storage": ">=1.17.0",
|
|
30
|
+
"react": ">=17.0.0",
|
|
31
|
+
"react-native": ">=0.68.0",
|
|
32
|
+
"react-native-device-info": ">=10.0.0"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"crypto-js": "^4.2.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/crypto-js": "^4.2.2",
|
|
39
|
+
"@types/jest": "^29.0.0",
|
|
40
|
+
"@types/react": "^18.0.0",
|
|
41
|
+
"@types/react-native": "^0.72.0",
|
|
42
|
+
"typescript": "^5.0.0"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=16.0.0"
|
|
46
|
+
}
|
|
47
|
+
}
|