@nebulr-group/bridge-auth-core 0.1.2 → 0.4.0-beta.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/dist/billing/bridge-subscription.d.ts +71 -0
- package/dist/billing/bridge-subscription.d.ts.map +1 -0
- package/dist/billing/bridge-subscription.js +209 -0
- package/dist/billing/bridge-subscription.js.map +1 -0
- package/dist/billing/entitlements-store.d.ts +61 -0
- package/dist/billing/entitlements-store.d.ts.map +1 -0
- package/dist/billing/entitlements-store.js +127 -0
- package/dist/billing/entitlements-store.js.map +1 -0
- package/dist/billing/fetch-billing-state.d.ts +9 -0
- package/dist/billing/fetch-billing-state.d.ts.map +1 -0
- package/dist/billing/fetch-billing-state.js +22 -0
- package/dist/billing/fetch-billing-state.js.map +1 -0
- package/dist/billing/lock-signal.d.ts +6 -0
- package/dist/billing/lock-signal.d.ts.map +1 -0
- package/dist/billing/lock-signal.js +8 -0
- package/dist/billing/lock-signal.js.map +1 -0
- package/dist/billing/quota-store.d.ts +86 -0
- package/dist/billing/quota-store.d.ts.map +1 -0
- package/dist/billing/quota-store.js +180 -0
- package/dist/billing/quota-store.js.map +1 -0
- package/dist/billing/types.d.ts +64 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +49 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/billing/use-bridge.d.ts +131 -0
- package/dist/billing/use-bridge.d.ts.map +1 -0
- package/dist/billing/use-bridge.js +181 -0
- package/dist/billing/use-bridge.js.map +1 -0
- package/dist/bridge-auth.d.ts +36 -1
- package/dist/bridge-auth.d.ts.map +1 -1
- package/dist/bridge-auth.js +57 -3
- package/dist/bridge-auth.js.map +1 -1
- package/dist/direct-auth.d.ts +1 -0
- package/dist/direct-auth.d.ts.map +1 -1
- package/dist/direct-auth.js +7 -0
- package/dist/direct-auth.js.map +1 -1
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -1
- package/dist/flags/attribute-providers.d.ts +229 -0
- package/dist/flags/attribute-providers.d.ts.map +1 -0
- package/dist/flags/attribute-providers.js +375 -0
- package/dist/flags/attribute-providers.js.map +1 -0
- package/dist/flags/dev-attribute-provider.d.ts +67 -0
- package/dist/flags/dev-attribute-provider.d.ts.map +1 -0
- package/dist/flags/dev-attribute-provider.js +200 -0
- package/dist/flags/dev-attribute-provider.js.map +1 -0
- package/dist/flags/evaluator.d.ts +58 -0
- package/dist/flags/evaluator.d.ts.map +1 -0
- package/dist/flags/evaluator.js +160 -0
- package/dist/flags/evaluator.js.map +1 -0
- package/dist/flags/flag.d.ts +199 -0
- package/dist/flags/flag.d.ts.map +1 -0
- package/dist/flags/flag.js +337 -0
- package/dist/flags/flag.js.map +1 -0
- package/dist/flags/identity.d.ts +77 -0
- package/dist/flags/identity.d.ts.map +1 -0
- package/dist/flags/identity.js +134 -0
- package/dist/flags/identity.js.map +1 -0
- package/dist/flags/index.d.ts +20 -0
- package/dist/flags/index.d.ts.map +1 -0
- package/dist/flags/index.js +21 -0
- package/dist/flags/index.js.map +1 -0
- package/dist/flags/operators.d.ts +63 -0
- package/dist/flags/operators.d.ts.map +1 -0
- package/dist/flags/operators.js +299 -0
- package/dist/flags/operators.js.map +1 -0
- package/dist/flags/propagation.d.ts +16 -0
- package/dist/flags/propagation.d.ts.map +1 -0
- package/dist/flags/propagation.js +107 -0
- package/dist/flags/propagation.js.map +1 -0
- package/dist/flags/realtime.d.ts +328 -0
- package/dist/flags/realtime.d.ts.map +1 -0
- package/dist/flags/realtime.js +504 -0
- package/dist/flags/realtime.js.map +1 -0
- package/dist/flags/runtime-mode.d.ts +32 -0
- package/dist/flags/runtime-mode.d.ts.map +1 -0
- package/dist/flags/runtime-mode.js +84 -0
- package/dist/flags/runtime-mode.js.map +1 -0
- package/dist/flags/telemetry.d.ts +79 -0
- package/dist/flags/telemetry.d.ts.map +1 -0
- package/dist/flags/telemetry.js +286 -0
- package/dist/flags/telemetry.js.map +1 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +11 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/management-types.d.ts +38 -0
- package/dist/management-types.d.ts.map +1 -1
- package/dist/route-guard.d.ts.map +1 -1
- package/dist/route-guard.js +15 -5
- package/dist/route-guard.js.map +1 -1
- package/dist/token-manager.d.ts +3 -1
- package/dist/token-manager.d.ts.map +1 -1
- package/dist/token-manager.js +10 -6
- package/dist/token-manager.js.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/usage/index.d.ts +3 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +4 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/storage/durable-storage.d.ts +47 -0
- package/dist/usage/storage/durable-storage.d.ts.map +1 -0
- package/dist/usage/storage/durable-storage.js +27 -0
- package/dist/usage/storage/durable-storage.js.map +1 -0
- package/dist/usage/storage/index.d.ts +7 -0
- package/dist/usage/storage/index.d.ts.map +1 -0
- package/dist/usage/storage/index.js +28 -0
- package/dist/usage/storage/index.js.map +1 -0
- package/dist/usage/storage/indexeddb-storage.d.ts +18 -0
- package/dist/usage/storage/indexeddb-storage.d.ts.map +1 -0
- package/dist/usage/storage/indexeddb-storage.js +159 -0
- package/dist/usage/storage/indexeddb-storage.js.map +1 -0
- package/dist/usage/storage/node-fs-storage.d.ts +29 -0
- package/dist/usage/storage/node-fs-storage.d.ts.map +1 -0
- package/dist/usage/storage/node-fs-storage.js +180 -0
- package/dist/usage/storage/node-fs-storage.js.map +1 -0
- package/dist/usage/storage/noop-storage.d.ts +17 -0
- package/dist/usage/storage/noop-storage.d.ts.map +1 -0
- package/dist/usage/storage/noop-storage.js +67 -0
- package/dist/usage/storage/noop-storage.js.map +1 -0
- package/dist/usage/usage-reporter.d.ts +64 -0
- package/dist/usage/usage-reporter.d.ts.map +1 -0
- package/dist/usage/usage-reporter.js +234 -0
- package/dist/usage/usage-reporter.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { BridgeFlags } from './flag.js';
|
|
2
|
+
export interface TelemetryBatcherConfig {
|
|
3
|
+
/** Bridge API base URL (e.g. https://api.thebridge.dev or http://localhost:3500). */
|
|
4
|
+
apiBaseUrl: string;
|
|
5
|
+
/** JWT-shaped workspace API key — sent as `x-api-key` header. */
|
|
6
|
+
apiKey: string;
|
|
7
|
+
/** Flush interval in ms. Default 30s. */
|
|
8
|
+
flushIntervalMs?: number;
|
|
9
|
+
/** Maximum events buffered before forcing a flush. Default 500. */
|
|
10
|
+
flushAtSize?: number;
|
|
11
|
+
/**
|
|
12
|
+
* Short debounce after any discovery / attribute-observation event, so
|
|
13
|
+
* first-sight items reach the admin near-instantly without waiting for the
|
|
14
|
+
* 30s eval cadence. Default 1000ms. Set higher to coalesce more aggressively
|
|
15
|
+
* or to 0 to flush synchronously.
|
|
16
|
+
*/
|
|
17
|
+
firstSightFlushMs?: number;
|
|
18
|
+
/** When false, telemetry HTTP calls are skipped — useful for tests + opt-out apps. */
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class TelemetryBatcher {
|
|
22
|
+
private readonly evalBuffer;
|
|
23
|
+
private readonly discoveryBuffer;
|
|
24
|
+
private readonly attributeDeclBuffer;
|
|
25
|
+
private readonly attributeObsBuffer;
|
|
26
|
+
private readonly callSiteBuffer;
|
|
27
|
+
private readonly seenCallSites;
|
|
28
|
+
private timer?;
|
|
29
|
+
private firstSightTimer?;
|
|
30
|
+
private readonly cfg;
|
|
31
|
+
private flushing;
|
|
32
|
+
constructor(cfg: TelemetryBatcherConfig);
|
|
33
|
+
/** Schedule a near-instant flush in response to a first-sight event. Debounced
|
|
34
|
+
* so a burst of first-sights collapses to a single flush. Discovery + attribute
|
|
35
|
+
* observation paths both use this; eval events keep the 30s cadence. */
|
|
36
|
+
private scheduleFirstSightFlush;
|
|
37
|
+
/**
|
|
38
|
+
* Attach to a BridgeFlags instance. Registers hooks for eval + discovery
|
|
39
|
+
* + attribute-declaration events. Also starts the periodic flush timer.
|
|
40
|
+
*/
|
|
41
|
+
attach(bridge: BridgeFlags): void;
|
|
42
|
+
/** Record a call-site sighting. Caller supplies the fingerprint. */
|
|
43
|
+
recordCallSite(flag: string, identity: string, fingerprint: string, devLabel?: string): void;
|
|
44
|
+
/** Hook entrypoint — coalesces eval events per (identity, flag, value, minute). */
|
|
45
|
+
private recordEval;
|
|
46
|
+
/** Hook entrypoint — discovery events are inherently dedupe'd by BridgeFlags.
|
|
47
|
+
* Schedules a near-instant flush so a new flag shows up in the admin within
|
|
48
|
+
* ~1s of first eval, not at the next 30s tick. */
|
|
49
|
+
private recordDiscovery;
|
|
50
|
+
/** Hook entrypoint — attribute type declarations (TBP-174, deprecated). */
|
|
51
|
+
private recordAttributeDeclaration;
|
|
52
|
+
/** Hook entrypoint — per-call attribute observations (TBP-178). Same near-
|
|
53
|
+
* instant flush so a new dev-supplied attribute reaches the admin catalog
|
|
54
|
+
* within ~1s of first eval. */
|
|
55
|
+
private recordAttributeObservation;
|
|
56
|
+
/** Begin periodic flushing. Idempotent. */
|
|
57
|
+
start(): void;
|
|
58
|
+
/** Stop the timer and force a final flush. Called on app shutdown / SDK teardown. */
|
|
59
|
+
stop(): Promise<void>;
|
|
60
|
+
/** Force a flush now. Returns when all in-flight HTTP calls settle. */
|
|
61
|
+
flush(): Promise<void>;
|
|
62
|
+
/** Telemetry surface for introspection / tests. */
|
|
63
|
+
stats(): {
|
|
64
|
+
evalQueue: number;
|
|
65
|
+
discoveryQueue: number;
|
|
66
|
+
attributeDeclQueue: number;
|
|
67
|
+
attributeObsQueue: number;
|
|
68
|
+
callSiteQueue: number;
|
|
69
|
+
seenCallSites: number;
|
|
70
|
+
};
|
|
71
|
+
private maybeFlushOnSize;
|
|
72
|
+
private flushEvals;
|
|
73
|
+
private flushDiscoveries;
|
|
74
|
+
private flushAttributeDeclarations;
|
|
75
|
+
private flushAttributeObservations;
|
|
76
|
+
private flushCallSites;
|
|
77
|
+
private post;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../src/flags/telemetry.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,WAAW,EAGZ,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,sBAAsB;IACrC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAuCD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAC5D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAC3E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAuC;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAMvB;IACR,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,eAAe,CAAC,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,GAAG,EAAE,sBAAsB;IAWvC;;6EAEyE;IACzE,OAAO,CAAC,uBAAuB;IAS/B;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAUjC,oEAAoE;IACpE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAS5F,mFAAmF;IACnF,OAAO,CAAC,UAAU;IAoBlB;;uDAEmD;IACnD,OAAO,CAAC,eAAe;IAWvB,2EAA2E;IAC3E,OAAO,CAAC,0BAA0B;IAUlC;;oCAEgC;IAChC,OAAO,CAAC,0BAA0B;IAWlC,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAUb,qFAAqF;IAC/E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,uEAAuE;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB5B,mDAAmD;IACnD,KAAK,IAAI;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB;IAWD,OAAO,CAAC,gBAAgB;YAYV,UAAU;YAOV,gBAAgB;YAWhB,0BAA0B;YAe1B,0BAA0B;YAe1B,cAAc;YAMd,IAAI;CAoBnB"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// SDK telemetry batcher (TBP-157).
|
|
2
|
+
//
|
|
3
|
+
// Wires the BridgeFlags hooks (`onEval`, `onDiscover`, `onIdentify`) to the
|
|
4
|
+
// bridge-api ingest endpoints (`/v1/flags/eval-events`, `/v1/flags/discover`,
|
|
5
|
+
// `/v1/flags/call-sites`). Coalesces eval events per (identity, flag, value)
|
|
6
|
+
// per minute, dedupes call-site reports per (identity, fingerprint) for the
|
|
7
|
+
// SDK runtime, and periodically flushes via HTTP.
|
|
8
|
+
//
|
|
9
|
+
// This module is platform-agnostic — it uses global `fetch` and a `setInterval`
|
|
10
|
+
// timer. Framework SDKs construct it during bootstrap and pass the workspace
|
|
11
|
+
// API key. On graceful shutdown they call `stop()` to flush pending events.
|
|
12
|
+
export class TelemetryBatcher {
|
|
13
|
+
evalBuffer = new Map();
|
|
14
|
+
discoveryBuffer = [];
|
|
15
|
+
attributeDeclBuffer = [];
|
|
16
|
+
attributeObsBuffer = [];
|
|
17
|
+
callSiteBuffer = [];
|
|
18
|
+
seenCallSites = new Set(); // dedup per runtime: `identity|fingerprint`
|
|
19
|
+
timer;
|
|
20
|
+
firstSightTimer;
|
|
21
|
+
cfg;
|
|
22
|
+
flushing = false;
|
|
23
|
+
constructor(cfg) {
|
|
24
|
+
this.cfg = {
|
|
25
|
+
apiBaseUrl: cfg.apiBaseUrl.replace(/\/+$/, ''),
|
|
26
|
+
apiKey: cfg.apiKey,
|
|
27
|
+
flushIntervalMs: cfg.flushIntervalMs ?? 30_000,
|
|
28
|
+
flushAtSize: cfg.flushAtSize ?? 500,
|
|
29
|
+
firstSightFlushMs: cfg.firstSightFlushMs ?? 1_000,
|
|
30
|
+
enabled: cfg.enabled !== false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Schedule a near-instant flush in response to a first-sight event. Debounced
|
|
34
|
+
* so a burst of first-sights collapses to a single flush. Discovery + attribute
|
|
35
|
+
* observation paths both use this; eval events keep the 30s cadence. */
|
|
36
|
+
scheduleFirstSightFlush() {
|
|
37
|
+
if (this.firstSightTimer)
|
|
38
|
+
return;
|
|
39
|
+
this.firstSightTimer = setTimeout(() => {
|
|
40
|
+
this.firstSightTimer = undefined;
|
|
41
|
+
void this.flush();
|
|
42
|
+
}, this.cfg.firstSightFlushMs);
|
|
43
|
+
if (this.firstSightTimer?.unref)
|
|
44
|
+
this.firstSightTimer.unref();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Attach to a BridgeFlags instance. Registers hooks for eval + discovery
|
|
48
|
+
* + attribute-declaration events. Also starts the periodic flush timer.
|
|
49
|
+
*/
|
|
50
|
+
attach(bridge) {
|
|
51
|
+
bridge.setHooks({
|
|
52
|
+
onEval: (ev) => this.recordEval(ev),
|
|
53
|
+
onDiscover: (ev) => this.recordDiscovery(ev),
|
|
54
|
+
onAttributeDeclaration: (decl) => this.recordAttributeDeclaration(decl),
|
|
55
|
+
onAttributeObserved: (obs) => this.recordAttributeObservation(obs),
|
|
56
|
+
});
|
|
57
|
+
this.start();
|
|
58
|
+
}
|
|
59
|
+
/** Record a call-site sighting. Caller supplies the fingerprint. */
|
|
60
|
+
recordCallSite(flag, identity, fingerprint, devLabel) {
|
|
61
|
+
if (!identity || !fingerprint)
|
|
62
|
+
return;
|
|
63
|
+
const key = `${identity}|${fingerprint}`;
|
|
64
|
+
if (this.seenCallSites.has(key))
|
|
65
|
+
return;
|
|
66
|
+
this.seenCallSites.add(key);
|
|
67
|
+
this.callSiteBuffer.push({ flag, identity, fingerprint, devLabel, timestamp: Date.now() });
|
|
68
|
+
this.maybeFlushOnSize();
|
|
69
|
+
}
|
|
70
|
+
/** Hook entrypoint — coalesces eval events per (identity, flag, value, minute). */
|
|
71
|
+
recordEval(ev) {
|
|
72
|
+
const valueKey = canonicalValueKey(ev.value);
|
|
73
|
+
const bucketMinute = Math.floor(ev.timestamp / 60_000);
|
|
74
|
+
const key = `${ev.identity ?? ''}::${ev.flag}::${valueKey}::${ev.variantIndex}::${bucketMinute}`;
|
|
75
|
+
const existing = this.evalBuffer.get(key);
|
|
76
|
+
if (existing) {
|
|
77
|
+
existing.count++;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.evalBuffer.set(key, {
|
|
81
|
+
flag: ev.flag,
|
|
82
|
+
value: ev.value,
|
|
83
|
+
variantIndex: ev.variantIndex,
|
|
84
|
+
identity: ev.identity,
|
|
85
|
+
timestamp: ev.timestamp,
|
|
86
|
+
count: 1,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
this.maybeFlushOnSize();
|
|
90
|
+
}
|
|
91
|
+
/** Hook entrypoint — discovery events are inherently dedupe'd by BridgeFlags.
|
|
92
|
+
* Schedules a near-instant flush so a new flag shows up in the admin within
|
|
93
|
+
* ~1s of first eval, not at the next 30s tick. */
|
|
94
|
+
recordDiscovery(ev) {
|
|
95
|
+
this.discoveryBuffer.push({
|
|
96
|
+
flag: ev.flag,
|
|
97
|
+
defaultValue: ev.defaultValue,
|
|
98
|
+
observedType: ev.observedType,
|
|
99
|
+
timestamp: ev.timestamp,
|
|
100
|
+
});
|
|
101
|
+
this.scheduleFirstSightFlush();
|
|
102
|
+
this.maybeFlushOnSize();
|
|
103
|
+
}
|
|
104
|
+
/** Hook entrypoint — attribute type declarations (TBP-174, deprecated). */
|
|
105
|
+
recordAttributeDeclaration(decl) {
|
|
106
|
+
this.attributeDeclBuffer.push({
|
|
107
|
+
name: decl.name,
|
|
108
|
+
type: decl.type,
|
|
109
|
+
timestamp: decl.timestamp,
|
|
110
|
+
});
|
|
111
|
+
this.scheduleFirstSightFlush();
|
|
112
|
+
this.maybeFlushOnSize();
|
|
113
|
+
}
|
|
114
|
+
/** Hook entrypoint — per-call attribute observations (TBP-178). Same near-
|
|
115
|
+
* instant flush so a new dev-supplied attribute reaches the admin catalog
|
|
116
|
+
* within ~1s of first eval. */
|
|
117
|
+
recordAttributeObservation(obs) {
|
|
118
|
+
this.attributeObsBuffer.push({
|
|
119
|
+
key: obs.key,
|
|
120
|
+
sampleValue: obs.sampleValue,
|
|
121
|
+
observedType: obs.observedType,
|
|
122
|
+
timestamp: obs.timestamp,
|
|
123
|
+
});
|
|
124
|
+
this.scheduleFirstSightFlush();
|
|
125
|
+
this.maybeFlushOnSize();
|
|
126
|
+
}
|
|
127
|
+
/** Begin periodic flushing. Idempotent. */
|
|
128
|
+
start() {
|
|
129
|
+
if (this.timer)
|
|
130
|
+
return;
|
|
131
|
+
this.timer = setInterval(() => {
|
|
132
|
+
void this.flush();
|
|
133
|
+
}, this.cfg.flushIntervalMs);
|
|
134
|
+
// Some runtimes (Node) keep the process alive on a timer; in the SDK
|
|
135
|
+
// context this is typically a browser, so it's a no-op there.
|
|
136
|
+
if (this.timer?.unref)
|
|
137
|
+
this.timer.unref();
|
|
138
|
+
}
|
|
139
|
+
/** Stop the timer and force a final flush. Called on app shutdown / SDK teardown. */
|
|
140
|
+
async stop() {
|
|
141
|
+
if (this.timer) {
|
|
142
|
+
clearInterval(this.timer);
|
|
143
|
+
this.timer = undefined;
|
|
144
|
+
}
|
|
145
|
+
if (this.firstSightTimer) {
|
|
146
|
+
clearTimeout(this.firstSightTimer);
|
|
147
|
+
this.firstSightTimer = undefined;
|
|
148
|
+
}
|
|
149
|
+
await this.flush();
|
|
150
|
+
}
|
|
151
|
+
/** Force a flush now. Returns when all in-flight HTTP calls settle. */
|
|
152
|
+
async flush() {
|
|
153
|
+
if (!this.cfg.enabled) {
|
|
154
|
+
this.evalBuffer.clear();
|
|
155
|
+
this.discoveryBuffer.length = 0;
|
|
156
|
+
this.attributeDeclBuffer.length = 0;
|
|
157
|
+
this.attributeObsBuffer.length = 0;
|
|
158
|
+
this.callSiteBuffer.length = 0;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (this.flushing)
|
|
162
|
+
return; // single-flight; the next interval picks up the rest
|
|
163
|
+
this.flushing = true;
|
|
164
|
+
try {
|
|
165
|
+
await Promise.all([
|
|
166
|
+
this.flushEvals(),
|
|
167
|
+
this.flushDiscoveries(),
|
|
168
|
+
this.flushAttributeDeclarations(),
|
|
169
|
+
this.flushAttributeObservations(),
|
|
170
|
+
this.flushCallSites(),
|
|
171
|
+
]);
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
this.flushing = false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Telemetry surface for introspection / tests. */
|
|
178
|
+
stats() {
|
|
179
|
+
return {
|
|
180
|
+
evalQueue: this.evalBuffer.size,
|
|
181
|
+
discoveryQueue: this.discoveryBuffer.length,
|
|
182
|
+
attributeDeclQueue: this.attributeDeclBuffer.length,
|
|
183
|
+
attributeObsQueue: this.attributeObsBuffer.length,
|
|
184
|
+
callSiteQueue: this.callSiteBuffer.length,
|
|
185
|
+
seenCallSites: this.seenCallSites.size,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
maybeFlushOnSize() {
|
|
189
|
+
const total = this.evalBuffer.size +
|
|
190
|
+
this.discoveryBuffer.length +
|
|
191
|
+
this.attributeDeclBuffer.length +
|
|
192
|
+
this.attributeObsBuffer.length +
|
|
193
|
+
this.callSiteBuffer.length;
|
|
194
|
+
if (total >= this.cfg.flushAtSize) {
|
|
195
|
+
void this.flush();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
async flushEvals() {
|
|
199
|
+
if (this.evalBuffer.size === 0)
|
|
200
|
+
return;
|
|
201
|
+
const events = Array.from(this.evalBuffer.values());
|
|
202
|
+
this.evalBuffer.clear();
|
|
203
|
+
await this.post('/v1/flags/eval-events', { events });
|
|
204
|
+
}
|
|
205
|
+
async flushDiscoveries() {
|
|
206
|
+
if (this.discoveryBuffer.length === 0)
|
|
207
|
+
return;
|
|
208
|
+
const events = this.discoveryBuffer.splice(0).map((d) => ({
|
|
209
|
+
kind: 'flag',
|
|
210
|
+
key: d.flag,
|
|
211
|
+
observedType: d.observedType,
|
|
212
|
+
timestamp: d.timestamp,
|
|
213
|
+
}));
|
|
214
|
+
await this.post('/v1/flags/discover', { events });
|
|
215
|
+
}
|
|
216
|
+
async flushAttributeDeclarations() {
|
|
217
|
+
if (this.attributeDeclBuffer.length === 0)
|
|
218
|
+
return;
|
|
219
|
+
// Attribute declarations are sent through the discovery endpoint with
|
|
220
|
+
// `kind: 'attribute'` + observedType. The admin UI's Discovered panel
|
|
221
|
+
// distinguishes declared vs inferred via the observedType + a future
|
|
222
|
+
// `declared: true` field (TODO once the backend supports the flag).
|
|
223
|
+
const events = this.attributeDeclBuffer.splice(0).map((d) => ({
|
|
224
|
+
kind: 'attribute',
|
|
225
|
+
key: d.name,
|
|
226
|
+
observedType: d.type,
|
|
227
|
+
timestamp: d.timestamp,
|
|
228
|
+
}));
|
|
229
|
+
await this.post('/v1/flags/discover', { events });
|
|
230
|
+
}
|
|
231
|
+
async flushAttributeObservations() {
|
|
232
|
+
if (this.attributeObsBuffer.length === 0)
|
|
233
|
+
return;
|
|
234
|
+
// Per-call attribute observations (TBP-178) — relayed to the same discovery
|
|
235
|
+
// endpoint with `kind: 'attribute'` + observedType + sampleValue. Backend
|
|
236
|
+
// accumulates distinct samples per (app, key) via `$addToSet`.
|
|
237
|
+
const events = this.attributeObsBuffer.splice(0).map((o) => ({
|
|
238
|
+
kind: 'attribute',
|
|
239
|
+
key: o.key,
|
|
240
|
+
sampleValue: o.sampleValue,
|
|
241
|
+
observedType: o.observedType,
|
|
242
|
+
timestamp: o.timestamp,
|
|
243
|
+
}));
|
|
244
|
+
await this.post('/v1/flags/discover', { events });
|
|
245
|
+
}
|
|
246
|
+
async flushCallSites() {
|
|
247
|
+
if (this.callSiteBuffer.length === 0)
|
|
248
|
+
return;
|
|
249
|
+
const events = this.callSiteBuffer.splice(0);
|
|
250
|
+
await this.post('/v1/flags/call-sites', { events });
|
|
251
|
+
}
|
|
252
|
+
async post(path, body) {
|
|
253
|
+
const url = `${this.cfg.apiBaseUrl}${path}`;
|
|
254
|
+
try {
|
|
255
|
+
await fetch(url, {
|
|
256
|
+
method: 'POST',
|
|
257
|
+
headers: {
|
|
258
|
+
'Content-Type': 'application/json',
|
|
259
|
+
'x-api-key': this.cfg.apiKey,
|
|
260
|
+
},
|
|
261
|
+
body: JSON.stringify(body),
|
|
262
|
+
});
|
|
263
|
+
// We don't currently inspect the response — accepted/rejected counts
|
|
264
|
+
// are useful for debugging but not actionable from the SDK side.
|
|
265
|
+
// A future hardening could log on non-2xx.
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Network errors swallowed — telemetry is best-effort. A future
|
|
269
|
+
// hardening could re-buffer with backoff, but losing some events is
|
|
270
|
+
// strictly preferred over breaking the SDK on a flaky network.
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// ── helpers ─────────────────────────────────────────────────────────────────
|
|
275
|
+
function canonicalValueKey(v) {
|
|
276
|
+
if (v === undefined)
|
|
277
|
+
return 'undefined';
|
|
278
|
+
try {
|
|
279
|
+
const s = JSON.stringify(v);
|
|
280
|
+
return s.length > 256 ? s.slice(0, 256) + '…' : s;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return String(v);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/flags/telemetry.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAU1C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAwChG"}
|
package/dist/http.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import { HttpError } from './errors.js';
|
|
1
|
+
import { BillingLockedError, HttpError } from './errors.js';
|
|
2
|
+
import { emitBillingLock } from './billing/lock-signal.js';
|
|
3
|
+
function isBillingLockedPayload(body) {
|
|
4
|
+
return (typeof body === 'object' &&
|
|
5
|
+
body !== null &&
|
|
6
|
+
body.reason === 'billing_locked');
|
|
7
|
+
}
|
|
2
8
|
export async function httpFetch(url, options, logger) {
|
|
3
9
|
const { method = 'GET', headers = {}, body, credentials } = options;
|
|
4
10
|
const fetchOptions = {
|
|
@@ -21,6 +27,10 @@ export async function httpFetch(url, options, logger) {
|
|
|
21
27
|
catch {
|
|
22
28
|
errorBody = await response.text().catch(() => null);
|
|
23
29
|
}
|
|
30
|
+
if (response.status === 402 && isBillingLockedPayload(errorBody)) {
|
|
31
|
+
emitBillingLock(errorBody);
|
|
32
|
+
throw new BillingLockedError(errorBody);
|
|
33
|
+
}
|
|
24
34
|
const message = typeof errorBody === 'object' && errorBody && 'message' in errorBody
|
|
25
35
|
? String(errorBody.message)
|
|
26
36
|
: `HTTP ${response.status}: ${response.statusText}`;
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAI3D,SAAS,sBAAsB,CAAC,IAAa;IAC3C,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACZ,IAA6B,CAAC,MAAM,KAAK,gBAAgB,CAC3D,CAAC;AACJ,CAAC;AASD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAW,EAAE,OAAoB,EAAE,MAAc;IAClF,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,YAAY,GAAgB;QAChC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;KAC5D,CAAC;IAEF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEhD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,SAAkB,CAAC;QACvB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS;YAClF,CAAC,CAAC,MAAM,CAAE,SAAiB,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtD,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,OAAO,SAAc,CAAC;IACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,12 +4,12 @@ export { TeamService } from './team-service.js';
|
|
|
4
4
|
export type { TeamProfile, TeamProfileUpdateInput, TeamUser, TeamUserListResult, TeamUserUpdateInput, TeamWorkspace, TeamWorkspaceUpdateInput, } from './team-types.js';
|
|
5
5
|
export { ApiTokenService } from './api-token-service.js';
|
|
6
6
|
export type { ApiToken, AvailablePrivilege, CreateApiTokenInput, CreateApiTokenResponse, } from './api-token-service.js';
|
|
7
|
-
export { BridgeAuthError, HttpError } from './errors.js';
|
|
7
|
+
export { BridgeAuthError, HttpError, BillingLockedError } from './errors.js';
|
|
8
8
|
export { LocalStorageAdapter, MemoryAdapter } from './token-storage.js';
|
|
9
9
|
export { decodeJwtPayload, getTokenExpiry, isTokenExpired, shouldRefreshNow } from './token-utils.js';
|
|
10
10
|
export { BridgeManagement } from './management/index.js';
|
|
11
11
|
export { ManagementHttpClient } from './management-http.js';
|
|
12
|
-
export type { ManagementConfig, AppResponse, UpdateAppRequest, CredentialsState, UpdateCredentialsRequest, TenantResponse, CreateTenantRequest, UpdateTenantRequest, UserResponse, InviteUserRequest, UpdateUserRequest, RoleResponse, CreateRoleRequest, UpdateRoleRequest, PrivilegeResponse, FlagResponse, CreateFlagInput, UpdateFlagInput, SegmentResponse, SegmentInput, Target, TargetValue, BrandingResponse, UpdateBrandingRequest, CssFileResponse, UpdateCssFileRequest, PlanResponse, CreatePlanRequest, UpdatePlanRequest, PlanPrice, TokenRecord, CreateTokenRequest, CreateTokenResponse, EventQuery, EventResult, OnboardingResponse, UpdateOnboardingRequest, SetupSSOParams, SetupSSOResult, SetupPaymentsParams, SetupPaymentsResult, SetupCommunicationParams, SetupCommunicationResult, SSOProvider, } from './management-types.js';
|
|
12
|
+
export type { ManagementConfig, AppResponse, UpdateAppRequest, CredentialsState, UpdateCredentialsRequest, TenantResponse, CreateTenantRequest, UpdateTenantRequest, UserResponse, InviteUserRequest, UpdateUserRequest, RoleResponse, CreateRoleRequest, UpdateRoleRequest, PrivilegeResponse, FlagResponse, CreateFlagInput, UpdateFlagInput, SegmentResponse, SegmentInput, Target, TargetValue, FlagSchedule, BrandingResponse, UpdateBrandingRequest, CssFileResponse, UpdateCssFileRequest, PlanResponse, CreatePlanRequest, UpdatePlanRequest, PlanPrice, TokenRecord, CreateTokenRequest, CreateTokenResponse, EventQuery, EventResult, OnboardingResponse, UpdateOnboardingRequest, SetupSSOParams, SetupSSOResult, SetupPaymentsParams, SetupPaymentsResult, SetupCommunicationParams, SetupCommunicationResult, SSOProvider, } from './management-types.js';
|
|
13
13
|
export { AppManagementService } from './management/app.service.js';
|
|
14
14
|
export { TenantManagementService } from './management/tenant.service.js';
|
|
15
15
|
export { UserManagementService } from './management/user.service.js';
|
|
@@ -21,4 +21,16 @@ export { TokenManagementService } from './management/token.service.js';
|
|
|
21
21
|
export { EventManagementService } from './management/event.service.js';
|
|
22
22
|
export { OnboardingManagementService } from './management/onboarding.service.js';
|
|
23
23
|
export { ManagementWorkflows } from './management/workflows.js';
|
|
24
|
+
export { OPERATORS, OPERATOR_VERSION, CONDITIONS_PER_RULE_MAX, isOperator, isOperatorValidForType, validOperatorsForType, evaluateCondition, validateConditions, bucket, evaluateBranch, evaluateRule, resolveAttribute, validateRule, BridgeFlags, BridgeIdentity, MemoryIdentityStorage, attachIdentity, generateAnonymousId, AttributeProviderRegistry, AuthAttributeProvider, BillingAttributeProvider, DevAttributeProvider, BridgePullCache, TelemetryBatcher, RealtimeClient, BRIDGE_CONTEXT_HEADER, serializeContext, deserializeContext, serverInstanceId, } from './flags/index.js';
|
|
25
|
+
export type { Operator, AttributeType, Condition, ConditionValue, ValidationError, Branch, Rule, FlagState, EvalContext, EvalResult, RuleValidationError, CachedFlag, FlagEvalResult, FlagValueType, EvalTelemetry, DiscoveryTelemetry, BridgeFlagsHooks, DeclaredAttributeType, AttributeDeclaration, BridgeFlagsMode, FlagUsageReporterLike, AnonymousTrackingMode, IdentityStorage, AttributeProvider, AuthJwtClaims, AuthProviderConfig, BillingSnapshot, BillingProviderConfig, BillingProviderStores, AttributeGetter, AttributeBulkGetter, AttributesSetOptions, BridgeRuntimeMode, PullCacheOptions, TelemetryBatcherConfig, RealtimeClientConfig, RealtimeMessage, FlagUpdateMessage, FlagRemovedMessage, UserStateMessage, SubscriptionPlanChangedMessage, BillingLifecycleMessage, QuotaUpdatedMessage, EntitlementsChangedMessage, SessionSnapshotMessage, ConnectionState, WebSocketLike, } from './flags/index.js';
|
|
26
|
+
export { useBridge } from './billing/use-bridge.js';
|
|
27
|
+
export type { UseBridgeApi, UseBridgeEntitlementsApi, BillingEventHandlers, BillingGateState, } from './billing/use-bridge.js';
|
|
28
|
+
export { BridgeSubscription } from './billing/bridge-subscription.js';
|
|
29
|
+
export { fetchBillingState } from './billing/fetch-billing-state.js';
|
|
30
|
+
export { QuotaStore } from './billing/quota-store.js';
|
|
31
|
+
export type { QuotaSnapshot } from './billing/quota-store.js';
|
|
32
|
+
export { EntitlementsStore } from './billing/entitlements-store.js';
|
|
33
|
+
export type { EntitlementSnapshot } from './billing/entitlements-store.js';
|
|
34
|
+
export { deriveNoticeState, deriveSeverity } from './billing/types.js';
|
|
35
|
+
export type { BillingSubscriptionStatus, BillingSeverity, PastDueReason, BillingPlanRef, BillingSubscriptionState, BillingSubscriptionSnapshot, BillingNoticeState, BillingLockedPayload, MountOptions, } from './billing/types.js';
|
|
24
36
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,YAAY,EACV,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,OAAO,EACP,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,yBAAyB,EACzB,IAAI,EACJ,aAAa,EACb,OAAO,EACP,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,WAAW,EACX,sBAAsB,EACtB,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EACV,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ export { TeamService } from './team-service.js';
|
|
|
5
5
|
// API token management
|
|
6
6
|
export { ApiTokenService } from './api-token-service.js';
|
|
7
7
|
// Errors
|
|
8
|
-
export { BridgeAuthError, HttpError } from './errors.js';
|
|
8
|
+
export { BridgeAuthError, HttpError, BillingLockedError } from './errors.js';
|
|
9
9
|
// Storage adapters (for custom configuration)
|
|
10
10
|
export { LocalStorageAdapter, MemoryAdapter } from './token-storage.js';
|
|
11
11
|
// Utilities
|
|
@@ -24,4 +24,19 @@ export { TokenManagementService } from './management/token.service.js';
|
|
|
24
24
|
export { EventManagementService } from './management/event.service.js';
|
|
25
25
|
export { OnboardingManagementService } from './management/onboarding.service.js';
|
|
26
26
|
export { ManagementWorkflows } from './management/workflows.js';
|
|
27
|
+
// ── Feature Flags 2.0 — locked operator set + branch evaluator ──────────────
|
|
28
|
+
// Shared between bridge-api (server eval) and SDK consumers (client eval) so
|
|
29
|
+
// there is no drift in semantics. See `flags/operators.ts` (per-condition
|
|
30
|
+
// primitives) and `flags/evaluator.ts` (branch + rollout layer).
|
|
31
|
+
export { OPERATORS, OPERATOR_VERSION, CONDITIONS_PER_RULE_MAX, isOperator, isOperatorValidForType, validOperatorsForType, evaluateCondition, validateConditions, bucket, evaluateBranch, evaluateRule, resolveAttribute, validateRule, BridgeFlags, BridgeIdentity, MemoryIdentityStorage, attachIdentity, generateAnonymousId, AttributeProviderRegistry, AuthAttributeProvider, BillingAttributeProvider, DevAttributeProvider, BridgePullCache, TelemetryBatcher, RealtimeClient, BRIDGE_CONTEXT_HEADER, serializeContext, deserializeContext, serverInstanceId, } from './flags/index.js';
|
|
32
|
+
// ── Billing 2.0 — canonical SDK reactive surface (TBP-248 / US-2) ───────────
|
|
33
|
+
// Parallel to FF 2.0's BridgeFlags surface. Do NOT unify with FF 2.0 yet —
|
|
34
|
+
// REF-1 (post-feature) folds them. See TBP-248 for context.
|
|
35
|
+
export { useBridge } from './billing/use-bridge.js';
|
|
36
|
+
export { BridgeSubscription } from './billing/bridge-subscription.js';
|
|
37
|
+
export { fetchBillingState } from './billing/fetch-billing-state.js';
|
|
38
|
+
export { QuotaStore } from './billing/quota-store.js';
|
|
39
|
+
// Billing 2.0 US-12 — entitlement cache + types.
|
|
40
|
+
export { EntitlementsStore } from './billing/entitlements-store.js';
|
|
41
|
+
export { deriveNoticeState, deriveSeverity } from './billing/types.js';
|
|
27
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuC9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuC9C,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWhD,uBAAuB;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAQzD,SAAS;AACT,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE7E,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEtG,yCAAyC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AA+B5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,iEAAiE;AACjE,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,uBAAuB,EACvB,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAmD1B,+EAA+E;AAC/E,2EAA2E;AAC3E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAOpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -189,6 +189,10 @@ export interface UpdateRoleRequest {
|
|
|
189
189
|
privileges?: string[];
|
|
190
190
|
isDefault?: boolean;
|
|
191
191
|
}
|
|
192
|
+
export type { Rule, Branch, FlagState } from './flags/evaluator.js';
|
|
193
|
+
export type { FlagValueType } from './flags/flag.js';
|
|
194
|
+
import type { Rule, FlagState } from './flags/evaluator.js';
|
|
195
|
+
import type { FlagValueType } from './flags/flag.js';
|
|
192
196
|
export interface TargetValue {
|
|
193
197
|
operator: 'eq' | 'beginsWith' | 'endsWith' | 'contains' | 'lessThan' | 'greaterThan';
|
|
194
198
|
value: string;
|
|
@@ -227,6 +231,19 @@ export interface SegmentInput {
|
|
|
227
231
|
description?: string;
|
|
228
232
|
targets?: Target[];
|
|
229
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* A scheduled future state transition (TBP-189).
|
|
236
|
+
*
|
|
237
|
+
* `null` clears any existing schedule on a write. The runner that flips the
|
|
238
|
+
* state at the appointed time is implemented separately; the management types
|
|
239
|
+
* just describe the persisted shape.
|
|
240
|
+
*/
|
|
241
|
+
export interface FlagSchedule {
|
|
242
|
+
/** ISO-8601 timestamp at which the transition fires. */
|
|
243
|
+
at: string;
|
|
244
|
+
/** Target state the runner will set when the timer fires. */
|
|
245
|
+
state: FlagState;
|
|
246
|
+
}
|
|
230
247
|
export interface FlagResponse {
|
|
231
248
|
id: string;
|
|
232
249
|
key: string;
|
|
@@ -235,6 +252,15 @@ export interface FlagResponse {
|
|
|
235
252
|
segments: SegmentResponse[];
|
|
236
253
|
targetValue?: boolean;
|
|
237
254
|
enabled: boolean;
|
|
255
|
+
state?: FlagState;
|
|
256
|
+
valueType?: FlagValueType;
|
|
257
|
+
offValue?: unknown;
|
|
258
|
+
onValue?: unknown;
|
|
259
|
+
rule?: Rule | null;
|
|
260
|
+
schedule?: FlagSchedule | null;
|
|
261
|
+
evalCount?: number;
|
|
262
|
+
/** ISO-8601 timestamp of the most recent eval, or null when never evaluated. */
|
|
263
|
+
lastEvalAt?: string | null;
|
|
238
264
|
}
|
|
239
265
|
export interface CreateFlagInput {
|
|
240
266
|
key: string;
|
|
@@ -243,6 +269,12 @@ export interface CreateFlagInput {
|
|
|
243
269
|
segments?: string[];
|
|
244
270
|
targetValue?: boolean;
|
|
245
271
|
enabled?: boolean;
|
|
272
|
+
state?: FlagState;
|
|
273
|
+
valueType?: FlagValueType;
|
|
274
|
+
offValue?: unknown;
|
|
275
|
+
onValue?: unknown;
|
|
276
|
+
rule?: Rule | null;
|
|
277
|
+
schedule?: FlagSchedule | null;
|
|
246
278
|
}
|
|
247
279
|
export interface UpdateFlagInput {
|
|
248
280
|
key?: string;
|
|
@@ -251,6 +283,12 @@ export interface UpdateFlagInput {
|
|
|
251
283
|
segments?: string[];
|
|
252
284
|
targetValue?: boolean;
|
|
253
285
|
enabled?: boolean;
|
|
286
|
+
state?: FlagState;
|
|
287
|
+
valueType?: FlagValueType;
|
|
288
|
+
offValue?: unknown;
|
|
289
|
+
onValue?: unknown;
|
|
290
|
+
rule?: Rule | null;
|
|
291
|
+
schedule?: FlagSchedule | null;
|
|
254
292
|
}
|
|
255
293
|
export interface BrandingResponse {
|
|
256
294
|
bgColor: string;
|