@brekkymetrics/react-native 0.1.0 → 0.1.1
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/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +29 -3
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/storage.d.ts +7 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +48 -0
- package/dist/storage.js.map +1 -1
- package/dist/traits.d.ts +3 -0
- package/dist/traits.d.ts.map +1 -0
- package/dist/traits.js +56 -0
- package/dist/traits.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/client.ts +42 -3
- package/src/index.ts +3 -0
- package/src/storage.ts +54 -0
- package/src/traits.ts +56 -0
- package/src/types.ts +1 -0
package/dist/client.d.ts
CHANGED
|
@@ -5,5 +5,8 @@ export declare function flush(): Promise<void>;
|
|
|
5
5
|
export declare function init(key: string, options?: BrekkyInitOptions): Promise<void>;
|
|
6
6
|
export declare function track(name: string, properties?: BrekkyProperties): Promise<void>;
|
|
7
7
|
export declare function screen(name: string, properties?: BrekkyProperties): Promise<void>;
|
|
8
|
+
export declare function identify(userId: string, traits?: BrekkyProperties): Promise<void>;
|
|
9
|
+
export declare function alias(userId: string, previousId?: string): Promise<void>;
|
|
10
|
+
export declare function reset(): Promise<void>;
|
|
8
11
|
export declare function resetForTests(): void;
|
|
9
12
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AAGhF,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,kBAAkB,iEAAiE,CAAC;AA2EjG,wBAAsB,KAAK,kBA8B1B;AAYD,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB,iBAgBtE;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,iBAItE;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,iBAIvE;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,iBAQvE;AAED,wBAAsB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,iBAO9D;AAED,wBAAsB,KAAK,kBAK1B;AAED,wBAAgB,aAAa,SAW5B"}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AppState, Platform } from "react-native";
|
|
2
|
-
import { getSessionId, getVisitorId } from "./storage";
|
|
2
|
+
import { clearIdentity, getSessionId, getTraits, getUserId, getVisitorId, rotateSessionId, rotateVisitorId, setTraits, setUserId, } from "./storage";
|
|
3
|
+
import { sanitizeTraits } from "./traits";
|
|
3
4
|
export const SDK_VERSION = "0.1.0";
|
|
4
5
|
export const DEFAULT_INGEST_URL = "https://ndxxbmnaoqnnepfmyoax.supabase.co/functions/v1/ingest";
|
|
5
6
|
const FLUSH_MS = 1000;
|
|
@@ -43,15 +44,17 @@ async function buildContext() {
|
|
|
43
44
|
async function enqueue(name, properties) {
|
|
44
45
|
if (!writeKey)
|
|
45
46
|
return;
|
|
46
|
-
const [visitorId, sessionId] = await Promise.all([
|
|
47
|
+
const [visitorId, sessionId, userId] = await Promise.all([
|
|
47
48
|
getVisitorId(),
|
|
48
49
|
getSessionId(SESSION_MS),
|
|
50
|
+
getUserId(),
|
|
49
51
|
]);
|
|
50
52
|
queue.push({
|
|
51
53
|
name,
|
|
52
54
|
timestamp: new Date().toISOString(),
|
|
53
55
|
visitor_id: visitorId,
|
|
54
56
|
session_id: sessionId,
|
|
57
|
+
...(userId ? { user_id: userId } : {}),
|
|
55
58
|
properties: sanitizeProperties(properties),
|
|
56
59
|
context: await buildContext(),
|
|
57
60
|
});
|
|
@@ -124,7 +127,7 @@ export async function init(key, options = {}) {
|
|
|
124
127
|
}
|
|
125
128
|
export async function track(name, properties) {
|
|
126
129
|
const clean = sanitizeEventName(name);
|
|
127
|
-
if (!clean)
|
|
130
|
+
if (!clean || clean === "identify" || clean === "alias")
|
|
128
131
|
return;
|
|
129
132
|
await enqueue(clean, properties);
|
|
130
133
|
}
|
|
@@ -134,6 +137,29 @@ export async function screen(name, properties) {
|
|
|
134
137
|
return;
|
|
135
138
|
await track("screen_view", { screen: cleanScreen, ...sanitizeProperties(properties) });
|
|
136
139
|
}
|
|
140
|
+
export async function identify(userId, traits) {
|
|
141
|
+
const clean = userId.trim().slice(0, 128);
|
|
142
|
+
if (!clean)
|
|
143
|
+
return;
|
|
144
|
+
const nextTraits = sanitizeTraits({ ...(await getTraits()), ...traits });
|
|
145
|
+
await setUserId(clean);
|
|
146
|
+
await setTraits(nextTraits);
|
|
147
|
+
await enqueue("identify", nextTraits);
|
|
148
|
+
}
|
|
149
|
+
export async function alias(userId, previousId) {
|
|
150
|
+
const cleanUser = userId.trim().slice(0, 128);
|
|
151
|
+
const cleanPrevious = (previousId?.trim() || (await getVisitorId())).slice(0, 128);
|
|
152
|
+
if (!cleanUser || !cleanPrevious || cleanUser === cleanPrevious)
|
|
153
|
+
return;
|
|
154
|
+
await setUserId(cleanUser);
|
|
155
|
+
await enqueue("alias", { previous_id: cleanPrevious });
|
|
156
|
+
}
|
|
157
|
+
export async function reset() {
|
|
158
|
+
await flush();
|
|
159
|
+
await clearIdentity();
|
|
160
|
+
await rotateVisitorId();
|
|
161
|
+
await rotateSessionId();
|
|
162
|
+
}
|
|
137
163
|
export function resetForTests() {
|
|
138
164
|
writeKey = null;
|
|
139
165
|
ingestUrl = DEFAULT_INGEST_URL;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export declare const Brekky: {
|
|
|
7
7
|
init: typeof client.init;
|
|
8
8
|
track: typeof client.track;
|
|
9
9
|
screen: typeof client.screen;
|
|
10
|
+
identify: typeof client.identify;
|
|
11
|
+
alias: typeof client.alias;
|
|
12
|
+
reset: typeof client.reset;
|
|
10
13
|
flush: typeof client.flush;
|
|
11
14
|
trackNavigationState: typeof trackNavigationState;
|
|
12
15
|
};
|
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,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,eAAO,MAAM,MAAM;;;;;;;;;CASlB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,oBAAoB;CACrB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,KAAK,EAAE,MAAM,CAAC,KAAK;IACnB,oBAAoB;CACrB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
export declare function createUuid(): string;
|
|
2
2
|
export declare function getVisitorId(): Promise<string>;
|
|
3
|
+
export declare function rotateVisitorId(): Promise<string>;
|
|
4
|
+
export declare function getUserId(): Promise<string | null>;
|
|
5
|
+
export declare function setUserId(userId: string | null): Promise<void>;
|
|
6
|
+
export declare function getTraits(): Promise<Record<string, string | number | boolean | null>>;
|
|
7
|
+
export declare function setTraits(traits: Record<string, string | number | boolean | null>): Promise<void>;
|
|
8
|
+
export declare function clearIdentity(): Promise<void>;
|
|
3
9
|
export declare function getSessionId(sessionMs: number): Promise<string>;
|
|
10
|
+
export declare function rotateSessionId(): Promise<string>;
|
|
4
11
|
//# sourceMappingURL=storage.d.ts.map
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAQA,wBAAgB,UAAU,WAMzB;AA0BD,wBAAsB,YAAY,oBAOjC;AAED,wBAAsB,eAAe,oBAIpC;AAED,wBAAsB,SAAS,2BAE9B;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,iBAOpD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,CAQ3F;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,iBAEvF;AAED,wBAAsB,aAAa,kBAElC;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,mBAcnD;AAED,wBAAsB,eAAe,oBAKpC"}
|
package/dist/storage.js
CHANGED
|
@@ -2,6 +2,8 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
|
2
2
|
const VID_KEY = "bm_vid";
|
|
3
3
|
const SID_KEY = "bm_sid";
|
|
4
4
|
const SID_AT_KEY = "bm_sid_at";
|
|
5
|
+
const UID_KEY = "bm_uid";
|
|
6
|
+
const TRAITS_KEY = "bm_traits";
|
|
5
7
|
export function createUuid() {
|
|
6
8
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (char) => {
|
|
7
9
|
const random = (Math.random() * 16) | 0;
|
|
@@ -25,6 +27,14 @@ async function write(key, value) {
|
|
|
25
27
|
// Storage can fail in private mode or restricted environments.
|
|
26
28
|
}
|
|
27
29
|
}
|
|
30
|
+
async function remove(key) {
|
|
31
|
+
try {
|
|
32
|
+
await AsyncStorage.removeItem(key);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// ignore
|
|
36
|
+
}
|
|
37
|
+
}
|
|
28
38
|
export async function getVisitorId() {
|
|
29
39
|
const existing = await read(VID_KEY);
|
|
30
40
|
if (existing)
|
|
@@ -33,6 +43,38 @@ export async function getVisitorId() {
|
|
|
33
43
|
await write(VID_KEY, id);
|
|
34
44
|
return id;
|
|
35
45
|
}
|
|
46
|
+
export async function rotateVisitorId() {
|
|
47
|
+
const id = createUuid();
|
|
48
|
+
await write(VID_KEY, id);
|
|
49
|
+
return id;
|
|
50
|
+
}
|
|
51
|
+
export async function getUserId() {
|
|
52
|
+
return read(UID_KEY);
|
|
53
|
+
}
|
|
54
|
+
export async function setUserId(userId) {
|
|
55
|
+
if (!userId) {
|
|
56
|
+
await remove(UID_KEY);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
await write(UID_KEY, userId);
|
|
60
|
+
}
|
|
61
|
+
export async function getTraits() {
|
|
62
|
+
const raw = await read(TRAITS_KEY);
|
|
63
|
+
if (!raw)
|
|
64
|
+
return {};
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function setTraits(traits) {
|
|
73
|
+
await write(TRAITS_KEY, JSON.stringify(traits));
|
|
74
|
+
}
|
|
75
|
+
export async function clearIdentity() {
|
|
76
|
+
await Promise.all([remove(UID_KEY), remove(TRAITS_KEY), remove(SID_KEY), remove(SID_AT_KEY)]);
|
|
77
|
+
}
|
|
36
78
|
export async function getSessionId(sessionMs) {
|
|
37
79
|
const now = Date.now();
|
|
38
80
|
const existing = await read(SID_KEY);
|
|
@@ -46,4 +88,10 @@ export async function getSessionId(sessionMs) {
|
|
|
46
88
|
await write(SID_AT_KEY, String(now));
|
|
47
89
|
return id;
|
|
48
90
|
}
|
|
91
|
+
export async function rotateSessionId() {
|
|
92
|
+
const id = createUuid();
|
|
93
|
+
await write(SID_KEY, id);
|
|
94
|
+
await write(SID_AT_KEY, String(Date.now()));
|
|
95
|
+
return id;
|
|
96
|
+
}
|
|
49
97
|
//# sourceMappingURL=storage.js.map
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,2CAA2C,CAAC;AAErE,MAAM,OAAO,GAAG,QAAQ,CAAC;AACzB,MAAM,OAAO,GAAG,QAAQ,CAAC;AACzB,MAAM,UAAU,GAAG,WAAW,CAAC;AAE/B,MAAM,UAAU,UAAU;IACxB,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACtE,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC3D,OAAO,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,KAAK,CAAC,GAAW,EAAE,KAAa;IAC7C,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;IAEhE,IAAI,QAAQ,IAAI,GAAG,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/traits.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traits.d.ts","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA2ChD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,gBAAgB,CAY1E"}
|
package/dist/traits.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const BLOCKED_TRAIT_KEYS = [
|
|
2
|
+
"password",
|
|
3
|
+
"passwd",
|
|
4
|
+
"secret",
|
|
5
|
+
"token",
|
|
6
|
+
"api_key",
|
|
7
|
+
"apikey",
|
|
8
|
+
"authorization",
|
|
9
|
+
"ssn",
|
|
10
|
+
"social_security",
|
|
11
|
+
"tax_id",
|
|
12
|
+
"credit_card",
|
|
13
|
+
"card_number",
|
|
14
|
+
"cvv",
|
|
15
|
+
"cvc",
|
|
16
|
+
"bank_account",
|
|
17
|
+
"routing_number",
|
|
18
|
+
"iban",
|
|
19
|
+
"diagnosis",
|
|
20
|
+
"medication",
|
|
21
|
+
"medical_record",
|
|
22
|
+
"mrn",
|
|
23
|
+
"health_plan",
|
|
24
|
+
"treatment",
|
|
25
|
+
"physician",
|
|
26
|
+
"patient_id",
|
|
27
|
+
"insurance_id",
|
|
28
|
+
"hipaa",
|
|
29
|
+
"phi",
|
|
30
|
+
"ip",
|
|
31
|
+
"ip_address",
|
|
32
|
+
"gps",
|
|
33
|
+
"latitude",
|
|
34
|
+
"longitude",
|
|
35
|
+
];
|
|
36
|
+
function isBlockedTraitKey(key) {
|
|
37
|
+
const lower = key.toLowerCase();
|
|
38
|
+
return BLOCKED_TRAIT_KEYS.some((blocked) => lower === blocked || lower.includes(blocked));
|
|
39
|
+
}
|
|
40
|
+
export function sanitizeTraits(traits) {
|
|
41
|
+
if (!traits)
|
|
42
|
+
return {};
|
|
43
|
+
const out = {};
|
|
44
|
+
for (const [key, value] of Object.entries(traits)) {
|
|
45
|
+
if (!key || key.length > 64 || isBlockedTraitKey(key))
|
|
46
|
+
continue;
|
|
47
|
+
if (typeof value === "string")
|
|
48
|
+
out[key] = value.slice(0, 500);
|
|
49
|
+
else if (typeof value === "number" && Number.isFinite(value))
|
|
50
|
+
out[key] = value;
|
|
51
|
+
else if (typeof value === "boolean" || value === null)
|
|
52
|
+
out[key] = value;
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=traits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traits.js","sourceRoot":"","sources":["../src/traits.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG;IACzB,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,SAAS;IACT,QAAQ;IACR,eAAe;IACf,KAAK;IACL,iBAAiB;IACjB,QAAQ;IACR,aAAa;IACb,aAAa;IACb,KAAK;IACL,KAAK;IACL,cAAc;IACd,gBAAgB;IAChB,MAAM;IACN,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,KAAK;IACL,aAAa;IACb,WAAW;IACX,WAAW;IACX,YAAY;IACZ,cAAc;IACd,OAAO;IACP,KAAK;IACL,IAAI;IACJ,YAAY;IACZ,KAAK;IACL,UAAU;IACV,WAAW;CACZ,CAAC;AAEF,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,iBAAiB,CAAC,GAAG,CAAC;YAAE,SAAS;QAChE,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC1E,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1E,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAEhF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAEhF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brekkymetrics/react-native",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Brekky analytics for React Native",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
},
|
|
30
30
|
"repository": {
|
|
31
31
|
"type": "git",
|
|
32
|
-
"url": "https://github.com/brekkymetrics/brekkymetrics"
|
|
32
|
+
"url": "https://github.com/brekkymetrics/brekkymetrics-sdk"
|
|
33
33
|
},
|
|
34
34
|
"keywords": [
|
|
35
35
|
"analytics",
|
package/src/client.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { AppState, Platform } from "react-native";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
clearIdentity,
|
|
4
|
+
getSessionId,
|
|
5
|
+
getTraits,
|
|
6
|
+
getUserId,
|
|
7
|
+
getVisitorId,
|
|
8
|
+
rotateSessionId,
|
|
9
|
+
rotateVisitorId,
|
|
10
|
+
setTraits,
|
|
11
|
+
setUserId,
|
|
12
|
+
} from "./storage";
|
|
3
13
|
import type { BrekkyInitOptions, BrekkyProperties, QueuedEvent } from "./types";
|
|
14
|
+
import { sanitizeTraits } from "./traits";
|
|
4
15
|
|
|
5
16
|
export const SDK_VERSION = "0.1.0";
|
|
6
17
|
export const DEFAULT_INGEST_URL = "https://ndxxbmnaoqnnepfmyoax.supabase.co/functions/v1/ingest";
|
|
@@ -48,9 +59,10 @@ async function buildContext() {
|
|
|
48
59
|
async function enqueue(name: string, properties?: BrekkyProperties) {
|
|
49
60
|
if (!writeKey) return;
|
|
50
61
|
|
|
51
|
-
const [visitorId, sessionId] = await Promise.all([
|
|
62
|
+
const [visitorId, sessionId, userId] = await Promise.all([
|
|
52
63
|
getVisitorId(),
|
|
53
64
|
getSessionId(SESSION_MS),
|
|
65
|
+
getUserId(),
|
|
54
66
|
]);
|
|
55
67
|
|
|
56
68
|
queue.push({
|
|
@@ -58,6 +70,7 @@ async function enqueue(name: string, properties?: BrekkyProperties) {
|
|
|
58
70
|
timestamp: new Date().toISOString(),
|
|
59
71
|
visitor_id: visitorId,
|
|
60
72
|
session_id: sessionId,
|
|
73
|
+
...(userId ? { user_id: userId } : {}),
|
|
61
74
|
properties: sanitizeProperties(properties),
|
|
62
75
|
context: await buildContext(),
|
|
63
76
|
});
|
|
@@ -138,7 +151,7 @@ export async function init(key: string, options: BrekkyInitOptions = {}) {
|
|
|
138
151
|
|
|
139
152
|
export async function track(name: string, properties?: BrekkyProperties) {
|
|
140
153
|
const clean = sanitizeEventName(name);
|
|
141
|
-
if (!clean) return;
|
|
154
|
+
if (!clean || clean === "identify" || clean === "alias") return;
|
|
142
155
|
await enqueue(clean, properties);
|
|
143
156
|
}
|
|
144
157
|
|
|
@@ -148,6 +161,32 @@ export async function screen(name: string, properties?: BrekkyProperties) {
|
|
|
148
161
|
await track("screen_view", { screen: cleanScreen, ...sanitizeProperties(properties) });
|
|
149
162
|
}
|
|
150
163
|
|
|
164
|
+
export async function identify(userId: string, traits?: BrekkyProperties) {
|
|
165
|
+
const clean = userId.trim().slice(0, 128);
|
|
166
|
+
if (!clean) return;
|
|
167
|
+
|
|
168
|
+
const nextTraits = sanitizeTraits({ ...(await getTraits()), ...traits });
|
|
169
|
+
await setUserId(clean);
|
|
170
|
+
await setTraits(nextTraits);
|
|
171
|
+
await enqueue("identify", nextTraits);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export async function alias(userId: string, previousId?: string) {
|
|
175
|
+
const cleanUser = userId.trim().slice(0, 128);
|
|
176
|
+
const cleanPrevious = (previousId?.trim() || (await getVisitorId())).slice(0, 128);
|
|
177
|
+
if (!cleanUser || !cleanPrevious || cleanUser === cleanPrevious) return;
|
|
178
|
+
|
|
179
|
+
await setUserId(cleanUser);
|
|
180
|
+
await enqueue("alias", { previous_id: cleanPrevious });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export async function reset() {
|
|
184
|
+
await flush();
|
|
185
|
+
await clearIdentity();
|
|
186
|
+
await rotateVisitorId();
|
|
187
|
+
await rotateSessionId();
|
|
188
|
+
}
|
|
189
|
+
|
|
151
190
|
export function resetForTests() {
|
|
152
191
|
writeKey = null;
|
|
153
192
|
ingestUrl = DEFAULT_INGEST_URL;
|
package/src/index.ts
CHANGED
package/src/storage.ts
CHANGED
|
@@ -3,6 +3,8 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
|
3
3
|
const VID_KEY = "bm_vid";
|
|
4
4
|
const SID_KEY = "bm_sid";
|
|
5
5
|
const SID_AT_KEY = "bm_sid_at";
|
|
6
|
+
const UID_KEY = "bm_uid";
|
|
7
|
+
const TRAITS_KEY = "bm_traits";
|
|
6
8
|
|
|
7
9
|
export function createUuid() {
|
|
8
10
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (char) => {
|
|
@@ -28,6 +30,14 @@ async function write(key: string, value: string) {
|
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
|
|
33
|
+
async function remove(key: string) {
|
|
34
|
+
try {
|
|
35
|
+
await AsyncStorage.removeItem(key);
|
|
36
|
+
} catch {
|
|
37
|
+
// ignore
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
31
41
|
export async function getVisitorId() {
|
|
32
42
|
const existing = await read(VID_KEY);
|
|
33
43
|
if (existing) return existing;
|
|
@@ -37,6 +47,43 @@ export async function getVisitorId() {
|
|
|
37
47
|
return id;
|
|
38
48
|
}
|
|
39
49
|
|
|
50
|
+
export async function rotateVisitorId() {
|
|
51
|
+
const id = createUuid();
|
|
52
|
+
await write(VID_KEY, id);
|
|
53
|
+
return id;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function getUserId() {
|
|
57
|
+
return read(UID_KEY);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export async function setUserId(userId: string | null) {
|
|
61
|
+
if (!userId) {
|
|
62
|
+
await remove(UID_KEY);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
await write(UID_KEY, userId);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export async function getTraits(): Promise<Record<string, string | number | boolean | null>> {
|
|
70
|
+
const raw = await read(TRAITS_KEY);
|
|
71
|
+
if (!raw) return {};
|
|
72
|
+
try {
|
|
73
|
+
return JSON.parse(raw) as Record<string, string | number | boolean | null>;
|
|
74
|
+
} catch {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export async function setTraits(traits: Record<string, string | number | boolean | null>) {
|
|
80
|
+
await write(TRAITS_KEY, JSON.stringify(traits));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function clearIdentity() {
|
|
84
|
+
await Promise.all([remove(UID_KEY), remove(TRAITS_KEY), remove(SID_KEY), remove(SID_AT_KEY)]);
|
|
85
|
+
}
|
|
86
|
+
|
|
40
87
|
export async function getSessionId(sessionMs: number) {
|
|
41
88
|
const now = Date.now();
|
|
42
89
|
const existing = await read(SID_KEY);
|
|
@@ -52,3 +99,10 @@ export async function getSessionId(sessionMs: number) {
|
|
|
52
99
|
await write(SID_AT_KEY, String(now));
|
|
53
100
|
return id;
|
|
54
101
|
}
|
|
102
|
+
|
|
103
|
+
export async function rotateSessionId() {
|
|
104
|
+
const id = createUuid();
|
|
105
|
+
await write(SID_KEY, id);
|
|
106
|
+
await write(SID_AT_KEY, String(Date.now()));
|
|
107
|
+
return id;
|
|
108
|
+
}
|
package/src/traits.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { BrekkyProperties } from "./types";
|
|
2
|
+
|
|
3
|
+
const BLOCKED_TRAIT_KEYS = [
|
|
4
|
+
"password",
|
|
5
|
+
"passwd",
|
|
6
|
+
"secret",
|
|
7
|
+
"token",
|
|
8
|
+
"api_key",
|
|
9
|
+
"apikey",
|
|
10
|
+
"authorization",
|
|
11
|
+
"ssn",
|
|
12
|
+
"social_security",
|
|
13
|
+
"tax_id",
|
|
14
|
+
"credit_card",
|
|
15
|
+
"card_number",
|
|
16
|
+
"cvv",
|
|
17
|
+
"cvc",
|
|
18
|
+
"bank_account",
|
|
19
|
+
"routing_number",
|
|
20
|
+
"iban",
|
|
21
|
+
"diagnosis",
|
|
22
|
+
"medication",
|
|
23
|
+
"medical_record",
|
|
24
|
+
"mrn",
|
|
25
|
+
"health_plan",
|
|
26
|
+
"treatment",
|
|
27
|
+
"physician",
|
|
28
|
+
"patient_id",
|
|
29
|
+
"insurance_id",
|
|
30
|
+
"hipaa",
|
|
31
|
+
"phi",
|
|
32
|
+
"ip",
|
|
33
|
+
"ip_address",
|
|
34
|
+
"gps",
|
|
35
|
+
"latitude",
|
|
36
|
+
"longitude",
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
function isBlockedTraitKey(key: string) {
|
|
40
|
+
const lower = key.toLowerCase();
|
|
41
|
+
return BLOCKED_TRAIT_KEYS.some((blocked) => lower === blocked || lower.includes(blocked));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function sanitizeTraits(traits?: BrekkyProperties): BrekkyProperties {
|
|
45
|
+
if (!traits) return {};
|
|
46
|
+
|
|
47
|
+
const out: BrekkyProperties = {};
|
|
48
|
+
for (const [key, value] of Object.entries(traits)) {
|
|
49
|
+
if (!key || key.length > 64 || isBlockedTraitKey(key)) continue;
|
|
50
|
+
if (typeof value === "string") out[key] = value.slice(0, 500);
|
|
51
|
+
else if (typeof value === "number" && Number.isFinite(value)) out[key] = value;
|
|
52
|
+
else if (typeof value === "boolean" || value === null) out[key] = value;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return out;
|
|
56
|
+
}
|