@syntrologie/runtime-sdk 2.0.1-canary.1 → 2.0.1-canary.3

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.
@@ -4,9 +4,26 @@
4
4
  * Used when telemetry is disabled (e.g. demo mode with t="noop").
5
5
  * All tracking methods silently do nothing. Session/distinct IDs
6
6
  * return stable values so downstream code that reads them still works.
7
+ *
8
+ * When `onFeatureFlagsLoaded` is provided, the adapter fires it on the
9
+ * next microtick with cached segment attributes (all set to `true`).
10
+ * This ensures GrowthBook gets segment attributes even without a real
11
+ * PostHog instance, so canvas configs with segment targeting still resolve.
7
12
  */
8
13
  import type { TelemetryClient } from '../types';
14
+ export interface NoopAdapterOptions {
15
+ /**
16
+ * Callback when "feature flags" are ready.
17
+ * Fired on next microtick with cached segment flags set to true.
18
+ */
19
+ onFeatureFlagsLoaded?: (flags: Record<string, boolean | string>) => void;
20
+ /**
21
+ * Callback when an event is "captured". Never called (noop).
22
+ */
23
+ onCapture?: (eventName: string, properties?: Record<string, unknown>) => void;
24
+ }
9
25
  /**
10
26
  * Create a TelemetryClient that silently discards all events.
27
+ * Accepts optional callbacks to maintain bootstrap compatibility.
11
28
  */
12
- export declare function createNoopClient(): TelemetryClient;
29
+ export declare function createNoopClient(options?: NoopAdapterOptions): TelemetryClient;
@@ -1,3 +1,4 @@
1
+ const SEGMENT_CACHE_KEY = 'syntro_segment_attributes';
1
2
  function randomId() {
2
3
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
3
4
  let id = '';
@@ -6,10 +7,41 @@ function randomId() {
6
7
  }
7
8
  return id;
8
9
  }
10
+ /**
11
+ * Read cached segment attributes from localStorage and return them
12
+ * as feature flags with all values set to `true`.
13
+ */
14
+ function getMockSegmentFlags() {
15
+ if (typeof window === 'undefined')
16
+ return {};
17
+ try {
18
+ const cached = localStorage.getItem(SEGMENT_CACHE_KEY);
19
+ if (cached) {
20
+ const attrs = JSON.parse(cached);
21
+ const flags = {};
22
+ for (const key of Object.keys(attrs)) {
23
+ flags[key] = true;
24
+ }
25
+ return flags;
26
+ }
27
+ }
28
+ catch {
29
+ // ignore
30
+ }
31
+ return {};
32
+ }
9
33
  class NoopAdapter {
10
- constructor() {
34
+ constructor(options = {}) {
11
35
  this.sessionId = randomId();
36
+ this.mockFlags = getMockSegmentFlags();
12
37
  console.log(`[Syntro Telemetry] Using noop adapter (no telemetry configured). sessionId=${this.sessionId}`);
38
+ // Fire feature flags callback on next microtick so the bootstrap
39
+ // Phase 2 flow runs (updates GrowthBook with segment attributes).
40
+ if (options.onFeatureFlagsLoaded) {
41
+ const cb = options.onFeatureFlagsLoaded;
42
+ const flags = this.mockFlags;
43
+ Promise.resolve().then(() => cb(flags));
44
+ }
13
45
  }
14
46
  trackCanvasOpened(_surface) { }
15
47
  trackCanvasClosed(_surface) { }
@@ -27,16 +59,17 @@ class NoopAdapter {
27
59
  return 'demo-user';
28
60
  }
29
61
  getAllFeatureFlags() {
30
- return {};
62
+ return { ...this.mockFlags };
31
63
  }
32
64
  getSegmentFlags() {
33
- return {};
65
+ return { ...this.mockFlags };
34
66
  }
35
67
  }
36
68
  /**
37
69
  * Create a TelemetryClient that silently discards all events.
70
+ * Accepts optional callbacks to maintain bootstrap compatibility.
38
71
  */
39
- export function createNoopClient() {
40
- return new NoopAdapter();
72
+ export function createNoopClient(options) {
73
+ return new NoopAdapter(options);
41
74
  }
42
75
  //# sourceMappingURL=noop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../src/telemetry/adapters/noop.ts"],"names":[],"mappings":"AASA,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,gEAAgE,CAAC;IAC/E,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,WAAW;IAGf;QACE,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CACT,8EAA8E,IAAI,CAAC,SAAS,EAAE,CAC/F,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,QAAuB,IAAS,CAAC;IACnD,iBAAiB,CAAC,QAAuB,IAAS,CAAC;IACnD,oBAAoB,CAAC,YAAoB,EAAE,QAAuB,IAAS,CAAC;IAC5E,WAAW,CAAC,OAAe,EAAE,YAAoB,EAAE,QAAuB,IAAS,CAAC;IAEpF,QAAQ,CAAC,WAAoC,IAAS,CAAC;IACvD,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,qBAAqB,KAAU,CAAC;IAChC,eAAe,CAAC,IAAY,EAAE,YAAoB,EAAE,cAAuB,IAAS,CAAC;IACrF,mBAAmB,CAAC,WAAoC,IAAS,CAAC;IAClE,uBAAuB,CAAC,WAAoC,IAAS,CAAC;IAEtE,aAAa;QACX,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,kBAAkB;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,eAAe;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,WAAW,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../src/telemetry/adapters/noop.ts"],"names":[],"mappings":"AAcA,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AAetD,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,gEAAgE,CAAC;IAC/E,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB;IAC1B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACvD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,KAAK,GAA4B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1D,MAAM,KAAK,GAA4B,EAAE,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,WAAW;IAIf,YAAY,UAA8B,EAAE;QAC1C,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,mBAAmB,EAAE,CAAC;QAEvC,OAAO,CAAC,GAAG,CACT,8EAA8E,IAAI,CAAC,SAAS,EAAE,CAC/F,CAAC;QAEF,iEAAiE;QACjE,kEAAkE;QAClE,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACjC,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,QAAuB,IAAS,CAAC;IACnD,iBAAiB,CAAC,QAAuB,IAAS,CAAC;IACnD,oBAAoB,CAAC,YAAoB,EAAE,QAAuB,IAAS,CAAC;IAC5E,WAAW,CAAC,OAAe,EAAE,YAAoB,EAAE,QAAuB,IAAS,CAAC;IAEpF,QAAQ,CAAC,WAAoC,IAAS,CAAC;IACvD,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,qBAAqB,KAAU,CAAC;IAChC,eAAe,CAAC,IAAY,EAAE,YAAoB,EAAE,cAAuB,IAAS,CAAC;IACrF,mBAAmB,CAAC,WAAoC,IAAS,CAAC;IAClE,uBAAuB,CAAC,WAAoC,IAAS,CAAC;IAEtE,aAAa;QACX,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,kBAAkB;QAChB,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,eAAe;QACb,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA4B;IAC3D,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
@@ -2,3 +2,4 @@ export type { TelemetryClient, CanvasSurface } from './types';
2
2
  export { createPostHogClient } from './adapters/posthog';
3
3
  export type { PostHogAdapterOptions } from './adapters/posthog';
4
4
  export { createNoopClient } from './adapters/noop';
5
+ export type { NoopAdapterOptions } from './adapters/noop';
@@ -9,7 +9,7 @@ import { createPostHogClient } from './adapters/posthog';
9
9
  import { createNoopClient } from './adapters/noop';
10
10
  const adapters = {
11
11
  posthog: (config) => createPostHogClient(config),
12
- noop: () => createNoopClient(),
12
+ noop: (config) => createNoopClient(config),
13
13
  };
14
14
  /**
15
15
  * Create a telemetry client for the specified provider.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/telemetry/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKnD,MAAM,QAAQ,GAAmC;IAC/C,OAAO,EAAE,CAAC,MAA6B,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACvE,IAAI,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE;CAC/B,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,MAA6B;IAE7B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,gBAAgB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/telemetry/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,mBAAmB,EAAyB,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKnD,MAAM,QAAQ,GAAmC;IAC/C,OAAO,EAAE,CAAC,MAA6B,EAAE,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACvE,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;CAC3C,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,MAA6B;IAE7B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,gBAAgB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syntrologie/runtime-sdk",
3
- "version": "2.0.1-canary.1",
3
+ "version": "2.0.1-canary.3",
4
4
  "description": "Syntrologie Runtime SDK for web experimentation and analytics",
5
5
  "license": "Proprietary",
6
6
  "private": false,