@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 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
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AAEhF,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,kBAAkB,iEAAiE,CAAC;AAyEjG,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,wBAAgB,aAAa,SAW5B"}
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;
@@ -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,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGvD,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,kBAAkB,GAAG,8DAA8D,CAAC;AAEjG,MAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,IAAI,QAAQ,GAAkB,IAAI,CAAC;AACnC,IAAI,SAAS,GAAG,kBAAkB,CAAC;AACnC,IAAI,KAAK,GAAkB,EAAE,CAAC;AAC9B,IAAI,UAAU,GAAyC,IAAI,CAAC;AAC5D,IAAI,oBAAoB,GAAkC,IAAI,CAAC;AAC/D,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjF,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA6B;IACvD,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE;YAAE,SAAS;QACtC,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;AAED,KAAK,UAAU,YAAY;IACzB,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,MAAM;QACtD,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;QAC1D,GAAG,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,WAAW,EAAE;KACnE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,UAA6B;IAChE,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,YAAY,EAAE;QACd,YAAY,CAAC,UAAU,CAAC;KACzB,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC;QACT,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,kBAAkB,CAAC,UAAU,CAAC;QAC1C,OAAO,EAAE,MAAM,YAAY,EAAE;KAC9B,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC9B,KAAK,KAAK,EAAE,CAAC;IACf,CAAC;SAAM,CAAC;QACN,aAAa,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;QAC3B,KAAK,KAAK,EAAE,CAAC;IACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,UAAU,EAAE,CAAC;QACf,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAE5C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,EAAE;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;YACzC,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;QACzB,aAAa,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,aAAa,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,oBAAoB;QAAE,OAAO;IAEjC,oBAAoB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;QACnE,IAAI,KAAK,KAAK,YAAY,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACnD,KAAK,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,UAA6B,EAAE;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAED,QAAQ,GAAG,OAAO,CAAC;IACnB,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;IAC5D,aAAa,EAAE,CAAC;IAEhB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,IAAI,CAAC;QACnB,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YACnC,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,UAA6B;IACrE,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,MAAM,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,UAA6B;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,GAAG,IAAI,CAAC;IAChB,SAAS,GAAG,kBAAkB,CAAC;IAC/B,KAAK,GAAG,EAAE,CAAC;IACX,IAAI,UAAU,EAAE,CAAC;QACf,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,GAAG,IAAI,CAAC;IAC5B,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC"}
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
  };
@@ -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;;;;;;CAMlB,CAAC;AAEF,eAAe,MAAM,CAAC"}
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
@@ -6,6 +6,9 @@ export const Brekky = {
6
6
  init: client.init,
7
7
  track: client.track,
8
8
  screen: client.screen,
9
+ identify: client.identify,
10
+ alias: client.alias,
11
+ reset: client.reset,
9
12
  flush: client.flush,
10
13
  trackNavigationState,
11
14
  };
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
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,WAMzB;AAkBD,wBAAsB,YAAY,oBAOjC;AAED,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,mBAcnD"}
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
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ import type { BrekkyProperties } from "./types";
2
+ export declare function sanitizeTraits(traits?: BrekkyProperties): BrekkyProperties;
3
+ //# sourceMappingURL=traits.d.ts.map
@@ -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
@@ -8,6 +8,7 @@ export type QueuedEvent = {
8
8
  timestamp: string;
9
9
  visitor_id: string;
10
10
  session_id: string;
11
+ user_id?: string;
11
12
  properties: BrekkyProperties;
12
13
  context: Record<string, unknown>;
13
14
  };
@@ -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.0",
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 { getSessionId, getVisitorId } from "./storage";
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
@@ -9,6 +9,9 @@ export const Brekky = {
9
9
  init: client.init,
10
10
  track: client.track,
11
11
  screen: client.screen,
12
+ identify: client.identify,
13
+ alias: client.alias,
14
+ reset: client.reset,
12
15
  flush: client.flush,
13
16
  trackNavigationState,
14
17
  };
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
+ }
package/src/types.ts CHANGED
@@ -10,6 +10,7 @@ export type QueuedEvent = {
10
10
  timestamp: string;
11
11
  visitor_id: string;
12
12
  session_id: string;
13
+ user_id?: string;
13
14
  properties: BrekkyProperties;
14
15
  context: Record<string, unknown>;
15
16
  };