@dr-sentry/sdk 1.1.1 → 1.2.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.
Files changed (46) hide show
  1. package/README.md +14 -1
  2. package/dist/cjs/cache.d.ts +14 -3
  3. package/dist/cjs/cache.d.ts.map +1 -1
  4. package/dist/cjs/cache.js +12 -5
  5. package/dist/cjs/cache.js.map +1 -1
  6. package/dist/cjs/client.d.ts +11 -1
  7. package/dist/cjs/client.d.ts.map +1 -1
  8. package/dist/cjs/client.js +117 -78
  9. package/dist/cjs/client.js.map +1 -1
  10. package/dist/cjs/persistence.d.ts +26 -0
  11. package/dist/cjs/persistence.d.ts.map +1 -0
  12. package/dist/cjs/persistence.js +74 -0
  13. package/dist/cjs/persistence.js.map +1 -0
  14. package/dist/cjs/streaming.d.ts +10 -0
  15. package/dist/cjs/streaming.d.ts.map +1 -1
  16. package/dist/cjs/streaming.js +9 -1
  17. package/dist/cjs/streaming.js.map +1 -1
  18. package/dist/cjs/sync.d.ts +105 -0
  19. package/dist/cjs/sync.d.ts.map +1 -0
  20. package/dist/cjs/sync.js +191 -0
  21. package/dist/cjs/sync.js.map +1 -0
  22. package/dist/cjs/types.d.ts +15 -1
  23. package/dist/cjs/types.d.ts.map +1 -1
  24. package/dist/esm/cache.d.ts +14 -3
  25. package/dist/esm/cache.d.ts.map +1 -1
  26. package/dist/esm/cache.js +12 -5
  27. package/dist/esm/cache.js.map +1 -1
  28. package/dist/esm/client.d.ts +11 -1
  29. package/dist/esm/client.d.ts.map +1 -1
  30. package/dist/esm/client.js +117 -78
  31. package/dist/esm/client.js.map +1 -1
  32. package/dist/esm/persistence.d.ts +26 -0
  33. package/dist/esm/persistence.d.ts.map +1 -0
  34. package/dist/esm/persistence.js +70 -0
  35. package/dist/esm/persistence.js.map +1 -0
  36. package/dist/esm/streaming.d.ts +10 -0
  37. package/dist/esm/streaming.d.ts.map +1 -1
  38. package/dist/esm/streaming.js +9 -1
  39. package/dist/esm/streaming.js.map +1 -1
  40. package/dist/esm/sync.d.ts +105 -0
  41. package/dist/esm/sync.d.ts.map +1 -0
  42. package/dist/esm/sync.js +187 -0
  43. package/dist/esm/sync.js.map +1 -0
  44. package/dist/esm/types.d.ts +15 -1
  45. package/dist/esm/types.d.ts.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,105 @@
1
+ import { Flag } from './types.js';
2
+ /** Timing knobs for the resilient sync engine. All values in milliseconds. */
3
+ export interface SyncTiming {
4
+ /** Steady-state full-resync interval while the SSE stream is healthy. */
5
+ steadyIntervalMs: number;
6
+ /** Resync interval while the stream is down but the server is reachable. */
7
+ streamDownResyncMs: number;
8
+ /** First retry delay after a failed full fetch (escalates to max). */
9
+ retryInitialMs: number;
10
+ /** Cap on the escalating retry delay after repeated fetch failures. */
11
+ retryMaxMs: number;
12
+ /** No stream activity within this window marks the stream unhealthy. */
13
+ streamStaleAfterMs: number;
14
+ }
15
+ export declare const DEFAULT_SYNC_TIMING: SyncTiming;
16
+ interface SyncManagerOptions {
17
+ /** Fetch the full flag set from the server. Throws on failure. */
18
+ fetchAll: () => Promise<Flag[]>;
19
+ /** Called with the authoritative full flag set after every successful sync. */
20
+ onSynced: (flags: Flag[]) => void;
21
+ timing?: Partial<SyncTiming>;
22
+ /** Returns epoch-ms; injectable for tests. Defaults to Date.now. */
23
+ now?: () => number;
24
+ log?: (msg: string) => void;
25
+ }
26
+ /**
27
+ * Drives full flag resynchronisation so the local copy is never out of sync
28
+ * with the server unless the connection is completely down.
29
+ *
30
+ * Cadence is chosen each tick from observed health:
31
+ *
32
+ * - **Last fetch failed** → aggressive retry (escalating {@link SyncTiming.retryInitialMs}
33
+ * → {@link SyncTiming.retryMaxMs}). Covers both boot and mid-flight outages:
34
+ * "retry frequently until successful".
35
+ * - **Stream healthy** (recent ping) → steady 10-minute safety-net resync;
36
+ * SSE delivers individual changes in between.
37
+ * - **Stream down but server reachable** → fast 30-second resync so flags
38
+ * cannot drift while the realtime channel is dead.
39
+ *
40
+ * A stream reconnect triggers an immediate resync to recover any change events
41
+ * missed while disconnected.
42
+ */
43
+ export declare class SyncManager {
44
+ private readonly fetchAll;
45
+ private readonly onSynced;
46
+ private readonly timing;
47
+ private readonly now;
48
+ private readonly log;
49
+ private timer;
50
+ private stopped;
51
+ private running;
52
+ private lastFetchOk;
53
+ private retryMs;
54
+ private streamConnected;
55
+ private lastStreamActivity;
56
+ private streamDropped;
57
+ /** Resolves once the first successful full sync completes. */
58
+ readonly firstSync: Promise<void>;
59
+ private resolveFirstSync;
60
+ constructor(options: SyncManagerOptions);
61
+ /** True once at least one full sync has succeeded. */
62
+ get isSynced(): boolean;
63
+ /**
64
+ * Begin the sync loop. Runs one sync immediately, then self-schedules.
65
+ * Returns when the loop is armed (does not wait for the first sync — await
66
+ * {@link firstSync} for that).
67
+ */
68
+ start(): void;
69
+ /**
70
+ * Seed the engine with an already-fetched flag set (e.g. the boot fetch) so
71
+ * it applies it via {@link SyncManagerOptions.onSynced} and schedules the
72
+ * next resync, avoiding an immediate duplicate fetch.
73
+ */
74
+ seed(flags: Flag[]): void;
75
+ /** Stop all scheduled syncs. */
76
+ stop(): void;
77
+ /**
78
+ * Record that the SSE stream connected.
79
+ *
80
+ * On a reconnect after a drop, resync immediately to recover change events
81
+ * missed while disconnected. The first-ever open is benign — boot already
82
+ * loaded the full set (via {@link seed} or the initial fetch) — so it only
83
+ * reschedules the next tick to reflect the now-healthy steady cadence
84
+ * instead of forcing a redundant fetch.
85
+ */
86
+ noteStreamOpen(): void;
87
+ /** Record inbound stream activity (heartbeat or data event). */
88
+ noteStreamActivity(): void;
89
+ /** Record that the SSE stream errored / closed. */
90
+ noteStreamError(): void;
91
+ private streamHealthy;
92
+ /** Force a resync as soon as possible without waiting for the next tick. */
93
+ private triggerNow;
94
+ /**
95
+ * Recompute the next tick's delay from current health without fetching.
96
+ * Used when stream health changes (e.g. the first open turns an unhealthy
97
+ * 30s cadence into the steady 10-minute one) but no immediate resync is
98
+ * warranted.
99
+ */
100
+ private reschedule;
101
+ private tick;
102
+ private schedule;
103
+ }
104
+ export {};
105
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,8EAA8E;AAC9E,MAAM,WAAW,UAAU;IACzB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,mBAAmB,EAAE,UAMjC,CAAC;AAEF,UAAU,kBAAkB;IAC1B,kEAAkE;IAClE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAE5C,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,aAAa,CAAS;IAE9B,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,gBAAgB,CAAc;gBAE1B,OAAO,EAAE,kBAAkB;IAYvC,sDAAsD;IACtD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAKb;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IASzB,gCAAgC;IAChC,IAAI,IAAI,IAAI;IAQZ;;;;;;;;OAQG;IACH,cAAc,IAAI,IAAI;IAWtB,gEAAgE;IAChE,kBAAkB,IAAI,IAAI;IAI1B,mDAAmD;IACnD,eAAe,IAAI,IAAI;IAKvB,OAAO,CAAC,aAAa;IAOrB,4EAA4E;IAC5E,OAAO,CAAC,UAAU;IASlB;;;;;OAKG;IACH,OAAO,CAAC,UAAU;YASJ,IAAI;IAkBlB,OAAO,CAAC,QAAQ;CAkBjB"}
@@ -0,0 +1,187 @@
1
+ export const DEFAULT_SYNC_TIMING = {
2
+ steadyIntervalMs: 600_000, // 10 minutes — safety net while SSE keeps us live.
3
+ streamDownResyncMs: 30_000, // poll every 30s when the stream is dead.
4
+ retryInitialMs: 1_000,
5
+ retryMaxMs: 15_000,
6
+ streamStaleAfterMs: 30_000, // server pings every ~10s; 30s = three missed.
7
+ };
8
+ /**
9
+ * Drives full flag resynchronisation so the local copy is never out of sync
10
+ * with the server unless the connection is completely down.
11
+ *
12
+ * Cadence is chosen each tick from observed health:
13
+ *
14
+ * - **Last fetch failed** → aggressive retry (escalating {@link SyncTiming.retryInitialMs}
15
+ * → {@link SyncTiming.retryMaxMs}). Covers both boot and mid-flight outages:
16
+ * "retry frequently until successful".
17
+ * - **Stream healthy** (recent ping) → steady 10-minute safety-net resync;
18
+ * SSE delivers individual changes in between.
19
+ * - **Stream down but server reachable** → fast 30-second resync so flags
20
+ * cannot drift while the realtime channel is dead.
21
+ *
22
+ * A stream reconnect triggers an immediate resync to recover any change events
23
+ * missed while disconnected.
24
+ */
25
+ export class SyncManager {
26
+ fetchAll;
27
+ onSynced;
28
+ timing;
29
+ now;
30
+ log;
31
+ timer = null;
32
+ stopped = false;
33
+ running = false;
34
+ lastFetchOk = false;
35
+ retryMs;
36
+ streamConnected = false;
37
+ lastStreamActivity = 0;
38
+ streamDropped = false;
39
+ /** Resolves once the first successful full sync completes. */
40
+ firstSync;
41
+ resolveFirstSync;
42
+ constructor(options) {
43
+ this.fetchAll = options.fetchAll;
44
+ this.onSynced = options.onSynced;
45
+ this.timing = { ...DEFAULT_SYNC_TIMING, ...(options.timing ?? {}) };
46
+ this.now = options.now ?? Date.now;
47
+ this.log = options.log ?? (() => { });
48
+ this.retryMs = this.timing.retryInitialMs;
49
+ this.firstSync = new Promise((resolve) => {
50
+ this.resolveFirstSync = resolve;
51
+ });
52
+ }
53
+ /** True once at least one full sync has succeeded. */
54
+ get isSynced() {
55
+ return this.lastFetchOk;
56
+ }
57
+ /**
58
+ * Begin the sync loop. Runs one sync immediately, then self-schedules.
59
+ * Returns when the loop is armed (does not wait for the first sync — await
60
+ * {@link firstSync} for that).
61
+ */
62
+ start() {
63
+ if (this.stopped)
64
+ return;
65
+ void this.tick();
66
+ }
67
+ /**
68
+ * Seed the engine with an already-fetched flag set (e.g. the boot fetch) so
69
+ * it applies it via {@link SyncManagerOptions.onSynced} and schedules the
70
+ * next resync, avoiding an immediate duplicate fetch.
71
+ */
72
+ seed(flags) {
73
+ if (this.stopped)
74
+ return;
75
+ this.lastFetchOk = true;
76
+ this.retryMs = this.timing.retryInitialMs;
77
+ this.onSynced(flags);
78
+ this.resolveFirstSync();
79
+ this.schedule();
80
+ }
81
+ /** Stop all scheduled syncs. */
82
+ stop() {
83
+ this.stopped = true;
84
+ if (this.timer) {
85
+ clearTimeout(this.timer);
86
+ this.timer = null;
87
+ }
88
+ }
89
+ /**
90
+ * Record that the SSE stream connected.
91
+ *
92
+ * On a reconnect after a drop, resync immediately to recover change events
93
+ * missed while disconnected. The first-ever open is benign — boot already
94
+ * loaded the full set (via {@link seed} or the initial fetch) — so it only
95
+ * reschedules the next tick to reflect the now-healthy steady cadence
96
+ * instead of forcing a redundant fetch.
97
+ */
98
+ noteStreamOpen() {
99
+ this.streamConnected = true;
100
+ this.lastStreamActivity = this.now();
101
+ if (this.streamDropped) {
102
+ this.streamDropped = false;
103
+ this.triggerNow();
104
+ }
105
+ else {
106
+ this.reschedule();
107
+ }
108
+ }
109
+ /** Record inbound stream activity (heartbeat or data event). */
110
+ noteStreamActivity() {
111
+ this.lastStreamActivity = this.now();
112
+ }
113
+ /** Record that the SSE stream errored / closed. */
114
+ noteStreamError() {
115
+ this.streamConnected = false;
116
+ this.streamDropped = true;
117
+ }
118
+ streamHealthy() {
119
+ return (this.streamConnected &&
120
+ this.now() - this.lastStreamActivity <= this.timing.streamStaleAfterMs);
121
+ }
122
+ /** Force a resync as soon as possible without waiting for the next tick. */
123
+ triggerNow() {
124
+ if (this.stopped || this.running)
125
+ return;
126
+ if (this.timer) {
127
+ clearTimeout(this.timer);
128
+ this.timer = null;
129
+ }
130
+ void this.tick();
131
+ }
132
+ /**
133
+ * Recompute the next tick's delay from current health without fetching.
134
+ * Used when stream health changes (e.g. the first open turns an unhealthy
135
+ * 30s cadence into the steady 10-minute one) but no immediate resync is
136
+ * warranted.
137
+ */
138
+ reschedule() {
139
+ if (this.stopped || this.running)
140
+ return;
141
+ if (this.timer) {
142
+ clearTimeout(this.timer);
143
+ this.timer = null;
144
+ }
145
+ this.schedule();
146
+ }
147
+ async tick() {
148
+ if (this.stopped || this.running)
149
+ return;
150
+ this.running = true;
151
+ try {
152
+ const flags = await this.fetchAll();
153
+ this.lastFetchOk = true;
154
+ this.retryMs = this.timing.retryInitialMs;
155
+ this.onSynced(flags);
156
+ this.resolveFirstSync();
157
+ }
158
+ catch (err) {
159
+ this.lastFetchOk = false;
160
+ this.log(`full resync failed: ${String(err)}`);
161
+ }
162
+ finally {
163
+ this.running = false;
164
+ this.schedule();
165
+ }
166
+ }
167
+ schedule() {
168
+ if (this.stopped)
169
+ return;
170
+ let delay;
171
+ if (!this.lastFetchOk) {
172
+ delay = this.retryMs;
173
+ this.retryMs = Math.min(this.retryMs * 2, this.timing.retryMaxMs);
174
+ }
175
+ else if (this.streamHealthy()) {
176
+ delay = this.timing.steadyIntervalMs;
177
+ }
178
+ else {
179
+ delay = this.timing.streamDownResyncMs;
180
+ }
181
+ this.timer = setTimeout(() => {
182
+ this.timer = null;
183
+ void this.tick();
184
+ }, delay);
185
+ }
186
+ }
187
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * DeploySentry SDK type definitions.
3
3
  */
4
4
  /** Categories that classify the intent and lifecycle of a feature flag. */
5
- export type FlagCategory = 'release' | 'feature' | 'experiment' | 'ops' | 'permission';
5
+ export type FlagCategory = 'release' | 'feature' | 'experiment' | 'ops' | 'permission' | 'envvar';
6
6
  /** Rich metadata attached to every feature flag. */
7
7
  export interface FlagMetadata {
8
8
  /** Categorisation that drives lifecycle policies. */
@@ -113,6 +113,20 @@ export interface ClientOptions {
113
113
  flagFilePath?: string;
114
114
  /** Called whenever the flag cache is refreshed from an SSE change event. */
115
115
  onFlagChange?: (flags: Flag[]) => void;
116
+ /**
117
+ * Path to a local JSON file where the SDK persists the last fully-synced
118
+ * flag set. When set, the client survives a server outage on boot by
119
+ * restoring this snapshot, and the resilient sync engine retries the initial
120
+ * fetch in the background until it succeeds instead of throwing. Omit to keep
121
+ * the legacy in-memory-only behaviour (boot fetch failure throws).
122
+ */
123
+ persistencePath?: string;
124
+ /**
125
+ * Steady-state full-resync interval in ms while the SSE stream is healthy.
126
+ * Default: 600_000 (10 minutes). When the stream goes quiet the engine
127
+ * resyncs far more aggressively regardless of this value.
128
+ */
129
+ resyncIntervalMs?: number;
116
130
  /**
117
131
  * Application UUID. Required when `reportStatus` is true. Distinct from
118
132
  * `application` (the slug used for flag evaluation) because the status
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dr-sentry/sdk",
3
- "version": "1.1.1",
3
+ "version": "1.2.1",
4
4
  "description": "Official Node.js SDK for the DeploySentry platform – feature flag evaluation with rich metadata",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",