@dr-sentry/sdk 1.1.0 → 1.2.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.
Files changed (70) hide show
  1. package/README.md +103 -5
  2. package/dist/cjs/cache.d.ts +30 -3
  3. package/dist/cjs/cache.d.ts.map +1 -1
  4. package/dist/cjs/cache.js +32 -5
  5. package/dist/cjs/cache.js.map +1 -1
  6. package/dist/cjs/client.d.ts +55 -1
  7. package/dist/cjs/client.d.ts.map +1 -1
  8. package/dist/cjs/client.js +297 -37
  9. package/dist/cjs/client.js.map +1 -1
  10. package/dist/cjs/defaults.d.ts +58 -0
  11. package/dist/cjs/defaults.d.ts.map +1 -0
  12. package/dist/cjs/defaults.js +175 -0
  13. package/dist/cjs/defaults.js.map +1 -0
  14. package/dist/cjs/index.d.ts +2 -1
  15. package/dist/cjs/index.d.ts.map +1 -1
  16. package/dist/cjs/index.js +4 -1
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/persistence.d.ts +26 -0
  19. package/dist/cjs/persistence.d.ts.map +1 -0
  20. package/dist/cjs/persistence.js +74 -0
  21. package/dist/cjs/persistence.js.map +1 -0
  22. package/dist/cjs/status-reporter.d.ts +42 -0
  23. package/dist/cjs/status-reporter.d.ts.map +1 -0
  24. package/dist/cjs/status-reporter.js +153 -0
  25. package/dist/cjs/status-reporter.js.map +1 -0
  26. package/dist/cjs/streaming.d.ts +10 -0
  27. package/dist/cjs/streaming.d.ts.map +1 -1
  28. package/dist/cjs/streaming.js +9 -1
  29. package/dist/cjs/streaming.js.map +1 -1
  30. package/dist/cjs/sync.d.ts +105 -0
  31. package/dist/cjs/sync.d.ts.map +1 -0
  32. package/dist/cjs/sync.js +191 -0
  33. package/dist/cjs/sync.js.map +1 -0
  34. package/dist/cjs/types.d.ts +78 -1
  35. package/dist/cjs/types.d.ts.map +1 -1
  36. package/dist/esm/cache.d.ts +30 -3
  37. package/dist/esm/cache.d.ts.map +1 -1
  38. package/dist/esm/cache.js +32 -5
  39. package/dist/esm/cache.js.map +1 -1
  40. package/dist/esm/client.d.ts +55 -1
  41. package/dist/esm/client.d.ts.map +1 -1
  42. package/dist/esm/client.js +297 -37
  43. package/dist/esm/client.js.map +1 -1
  44. package/dist/esm/defaults.d.ts +58 -0
  45. package/dist/esm/defaults.d.ts.map +1 -0
  46. package/dist/esm/defaults.js +136 -0
  47. package/dist/esm/defaults.js.map +1 -0
  48. package/dist/esm/index.d.ts +2 -1
  49. package/dist/esm/index.d.ts.map +1 -1
  50. package/dist/esm/index.js +1 -0
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/esm/persistence.d.ts +26 -0
  53. package/dist/esm/persistence.d.ts.map +1 -0
  54. package/dist/esm/persistence.js +70 -0
  55. package/dist/esm/persistence.js.map +1 -0
  56. package/dist/esm/status-reporter.d.ts +42 -0
  57. package/dist/esm/status-reporter.d.ts.map +1 -0
  58. package/dist/esm/status-reporter.js +148 -0
  59. package/dist/esm/status-reporter.js.map +1 -0
  60. package/dist/esm/streaming.d.ts +10 -0
  61. package/dist/esm/streaming.d.ts.map +1 -1
  62. package/dist/esm/streaming.js +9 -1
  63. package/dist/esm/streaming.js.map +1 -1
  64. package/dist/esm/sync.d.ts +105 -0
  65. package/dist/esm/sync.d.ts.map +1 -0
  66. package/dist/esm/sync.js +187 -0
  67. package/dist/esm/sync.js.map +1 -0
  68. package/dist/esm/types.d.ts +78 -1
  69. package/dist/esm/types.d.ts.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseDefaults = parseDefaults;
37
+ exports.lookupOfflineDefault = lookupOfflineDefault;
38
+ exports.readDefaultsFile = readDefaultsFile;
39
+ exports.coerceOfflineValue = coerceOfflineValue;
40
+ const fs = __importStar(require("fs/promises"));
41
+ /**
42
+ * Parse a YAMLExport JSON payload into an OfflineFlagDefault map.
43
+ *
44
+ * `environment` is the SDK's configured environment string. It is matched
45
+ * against the export's `environments[]` first by UUID, then by name
46
+ * (case-insensitive). The first match wins.
47
+ */
48
+ function parseDefaults(payload, environment) {
49
+ if (!payload || typeof payload !== 'object') {
50
+ throw new Error('deploysentry: defaults payload must be an object');
51
+ }
52
+ const exp = payload;
53
+ if (!Array.isArray(exp.flags)) {
54
+ throw new Error('deploysentry: defaults payload missing flags[] array');
55
+ }
56
+ let envUUID = '';
57
+ if (environment && Array.isArray(exp.environments)) {
58
+ for (const e of exp.environments) {
59
+ if (e.id === environment) {
60
+ envUUID = e.id;
61
+ break;
62
+ }
63
+ }
64
+ if (!envUUID) {
65
+ for (const e of exp.environments) {
66
+ if (e.name && e.name.toLowerCase() === environment.toLowerCase()) {
67
+ envUUID = e.id;
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ const defaults = new Map();
74
+ for (const f of exp.flags) {
75
+ defaults.set(f.key, {
76
+ key: f.key,
77
+ flagType: f.flag_type,
78
+ defaultValue: f.default_value,
79
+ envStates: { ...(f.environments ?? {}) },
80
+ });
81
+ }
82
+ return { defaults, envUUID };
83
+ }
84
+ /**
85
+ * Resolve the offline value for a flag key. Returns `undefined` when the
86
+ * flag is not in the loaded defaults. When an env override exists for the
87
+ * resolved env UUID, its `value` is returned; otherwise the flag's global
88
+ * `defaultValue` is returned.
89
+ */
90
+ function lookupOfflineDefault(defaults, envUUID, key) {
91
+ const d = defaults.get(key);
92
+ if (!d)
93
+ return undefined;
94
+ if (envUUID) {
95
+ const es = d.envStates[envUUID];
96
+ if (es && es.value !== '') {
97
+ return { value: es.value, enabled: es.enabled, flagType: d.flagType };
98
+ }
99
+ if (es) {
100
+ // Env state exists but value is empty — use flag default with this env's enabled flag.
101
+ return { value: d.defaultValue, enabled: es.enabled, flagType: d.flagType };
102
+ }
103
+ }
104
+ return { value: d.defaultValue, enabled: true, flagType: d.flagType };
105
+ }
106
+ /**
107
+ * Read a defaults JSON file from disk and return the parsed payload.
108
+ * Accepts either raw JSON or YAML based on the file extension.
109
+ */
110
+ async function readDefaultsFile(path) {
111
+ const data = await fs.readFile(path, 'utf-8');
112
+ if (path.endsWith('.yaml') || path.endsWith('.yml')) {
113
+ // Lazy-load js-yaml so SDK consumers who never call this don't pay
114
+ // for the dependency at startup.
115
+ const yaml = await Promise.resolve().then(() => __importStar(require('js-yaml')));
116
+ return yaml.load(data);
117
+ }
118
+ return JSON.parse(data);
119
+ }
120
+ /**
121
+ * Coerce an offline default raw value into the requested TypeScript type.
122
+ * Mirrors the BoolValue / StringValue / IntValue helpers' coercion rules
123
+ * so offline defaults behave identically to live results.
124
+ */
125
+ function coerceOfflineValue(raw, requested) {
126
+ switch (requested) {
127
+ case 'bool': {
128
+ // raw may be a JSON literal ("true", "false") OR a plain string ("true").
129
+ let s = raw;
130
+ if (raw.length >= 2 && raw[0] === '"' && raw[raw.length - 1] === '"') {
131
+ s = raw.slice(1, -1);
132
+ }
133
+ const lower = s.toLowerCase();
134
+ if (lower === 'true')
135
+ return true;
136
+ if (lower === 'false')
137
+ return false;
138
+ return undefined;
139
+ }
140
+ case 'string': {
141
+ try {
142
+ const parsed = JSON.parse(raw);
143
+ if (typeof parsed === 'string')
144
+ return parsed;
145
+ }
146
+ catch {
147
+ // not JSON — treat raw as the string itself
148
+ }
149
+ return raw;
150
+ }
151
+ case 'number': {
152
+ const n = Number(raw);
153
+ if (Number.isFinite(n))
154
+ return n;
155
+ try {
156
+ const parsed = JSON.parse(raw);
157
+ if (typeof parsed === 'number' && Number.isFinite(parsed))
158
+ return parsed;
159
+ }
160
+ catch {
161
+ /* ignore */
162
+ }
163
+ return undefined;
164
+ }
165
+ case 'json': {
166
+ try {
167
+ return JSON.parse(raw);
168
+ }
169
+ catch {
170
+ return undefined;
171
+ }
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"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"}
@@ -25,5 +25,6 @@ export { FlagCache } from './cache';
25
25
  export { FlagStreamClient } from './streaming';
26
26
  export { loadFlagConfig } from './file-loader';
27
27
  export { evaluateLocal } from './local-evaluator';
28
- export type { ClientOptions, EvaluationContext, EvaluationResult, Flag, FlagCategory, FlagMetadata, FlagConfig, FlagConfigFlag, FlagConfigRule, FlagConfigEnvironment, ApiError, } from './types';
28
+ export { StatusReporter, resolveVersion } from './status-reporter';
29
+ export type { ClientOptions, EvaluationContext, EvaluationResult, Flag, FlagCategory, FlagInspection, FlagSource, FlagMetadata, FlagConfig, FlagConfigFlag, FlagConfigRule, FlagConfigEnvironment, ApiError, HealthReport, } from './types';
29
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,QAAQ,GACT,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,IAAI,EACJ,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -22,7 +22,7 @@
22
22
  * @packageDocumentation
23
23
  */
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.evaluateLocal = exports.loadFlagConfig = exports.FlagStreamClient = exports.FlagCache = exports.DeploySentryClient = void 0;
25
+ exports.resolveVersion = exports.StatusReporter = exports.evaluateLocal = exports.loadFlagConfig = exports.FlagStreamClient = exports.FlagCache = exports.DeploySentryClient = void 0;
26
26
  var client_1 = require("./client");
27
27
  Object.defineProperty(exports, "DeploySentryClient", { enumerable: true, get: function () { return client_1.DeploySentryClient; } });
28
28
  var cache_1 = require("./cache");
@@ -33,4 +33,7 @@ var file_loader_1 = require("./file-loader");
33
33
  Object.defineProperty(exports, "loadFlagConfig", { enumerable: true, get: function () { return file_loader_1.loadFlagConfig; } });
34
34
  var local_evaluator_1 = require("./local-evaluator");
35
35
  Object.defineProperty(exports, "evaluateLocal", { enumerable: true, get: function () { return local_evaluator_1.evaluateLocal; } });
36
+ var status_reporter_1 = require("./status-reporter");
37
+ Object.defineProperty(exports, "StatusReporter", { enumerable: true, get: function () { return status_reporter_1.StatusReporter; } });
38
+ Object.defineProperty(exports, "resolveVersion", { enumerable: true, get: function () { return status_reporter_1.resolveVersion; } });
36
39
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAEH,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,iCAAoC;AAA3B,kGAAA,SAAS,OAAA;AAClB,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,qDAAkD;AAAzC,gHAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;;AAEH,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,iCAAoC;AAA3B,kGAAA,SAAS,OAAA;AAClB,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AACzB,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AACtB,qDAAmE;AAA1D,iHAAA,cAAc,OAAA;AAAE,iHAAA,cAAc,OAAA"}
@@ -0,0 +1,26 @@
1
+ import { Flag } from './types';
2
+ /**
3
+ * Persists the last fully-synced flag set to a local JSON file so the SDK can
4
+ * serve a recent local copy on the next boot when the server is unreachable.
5
+ *
6
+ * Opt-in: only constructed when the caller supplies a `persistencePath`.
7
+ * Writes are atomic (temp file + rename) so a crash mid-write never corrupts
8
+ * an existing good snapshot. All failures are swallowed and surfaced via the
9
+ * optional logger — persistence is a best-effort durability aid, never a hard
10
+ * dependency of flag evaluation.
11
+ */
12
+ export declare class FlagSnapshotStore {
13
+ private readonly path;
14
+ private readonly scope;
15
+ private readonly log;
16
+ constructor(path: string, scope: string, log?: (msg: string) => void);
17
+ /**
18
+ * Load the persisted snapshot. Returns the flags if a valid snapshot exists
19
+ * for the same scope, otherwise `null` (missing file, parse error, version
20
+ * mismatch, or scope mismatch).
21
+ */
22
+ load(): Flag[] | null;
23
+ /** Atomically write the current flag set to disk. Best-effort. */
24
+ save(flags: Flag[]): void;
25
+ }
26
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/persistence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAgB/B;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;gBAEhC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAMpE;;;;OAIG;IACH,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI;IAoBrB,kEAAkE;IAClE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;CAiB1B"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FlagSnapshotStore = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const SNAPSHOT_VERSION = 1;
7
+ /**
8
+ * Persists the last fully-synced flag set to a local JSON file so the SDK can
9
+ * serve a recent local copy on the next boot when the server is unreachable.
10
+ *
11
+ * Opt-in: only constructed when the caller supplies a `persistencePath`.
12
+ * Writes are atomic (temp file + rename) so a crash mid-write never corrupts
13
+ * an existing good snapshot. All failures are swallowed and surfaced via the
14
+ * optional logger — persistence is a best-effort durability aid, never a hard
15
+ * dependency of flag evaluation.
16
+ */
17
+ class FlagSnapshotStore {
18
+ path;
19
+ scope;
20
+ log;
21
+ constructor(path, scope, log) {
22
+ this.path = path;
23
+ this.scope = scope;
24
+ this.log = log ?? (() => { });
25
+ }
26
+ /**
27
+ * Load the persisted snapshot. Returns the flags if a valid snapshot exists
28
+ * for the same scope, otherwise `null` (missing file, parse error, version
29
+ * mismatch, or scope mismatch).
30
+ */
31
+ load() {
32
+ let raw;
33
+ try {
34
+ raw = (0, fs_1.readFileSync)(this.path, 'utf8');
35
+ }
36
+ catch {
37
+ return null; // No snapshot yet — expected on first run.
38
+ }
39
+ try {
40
+ const parsed = JSON.parse(raw);
41
+ if (parsed.version !== SNAPSHOT_VERSION)
42
+ return null;
43
+ if (parsed.scope !== this.scope)
44
+ return null;
45
+ if (!Array.isArray(parsed.flags))
46
+ return null;
47
+ return parsed.flags;
48
+ }
49
+ catch (err) {
50
+ this.log(`failed to parse snapshot ${this.path}: ${String(err)}`);
51
+ return null;
52
+ }
53
+ }
54
+ /** Atomically write the current flag set to disk. Best-effort. */
55
+ save(flags) {
56
+ const payload = {
57
+ version: SNAPSHOT_VERSION,
58
+ savedAt: new Date().toISOString(),
59
+ scope: this.scope,
60
+ flags,
61
+ };
62
+ const tmp = `${this.path}.${process.pid}.tmp`;
63
+ try {
64
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(this.path), { recursive: true });
65
+ (0, fs_1.writeFileSync)(tmp, JSON.stringify(payload), 'utf8');
66
+ (0, fs_1.renameSync)(tmp, this.path); // Atomic on POSIX/Windows same-volume.
67
+ }
68
+ catch (err) {
69
+ this.log(`failed to persist snapshot ${this.path}: ${String(err)}`);
70
+ }
71
+ }
72
+ }
73
+ exports.FlagSnapshotStore = FlagSnapshotStore;
74
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../src/persistence.ts"],"names":[],"mappings":";;;AAAA,2BAAwE;AACxE,+BAA+B;AAe/B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B;;;;;;;;;GASG;AACH,MAAa,iBAAiB;IACX,IAAI,CAAS;IACb,KAAK,CAAS;IACd,GAAG,CAAwB;IAE5C,YAAY,IAAY,EAAE,KAAa,EAAE,GAA2B;QAClE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,IAAA,iBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,2CAA2C;QAC1D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;YAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YACrD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,IAAI,CAAC,KAAa;QAChB,MAAM,OAAO,GAAiB;YAC5B,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK;SACN,CAAC;QAEF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QAC9C,IAAI,CAAC;YACH,IAAA,cAAS,EAAC,IAAA,cAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,IAAA,kBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YACpD,IAAA,eAAU,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,uCAAuC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF;AAtDD,8CAsDC"}
@@ -0,0 +1,42 @@
1
+ import type { HealthReport } from './types';
2
+ /** Options passed to StatusReporter. Internal to the SDK. */
3
+ export interface StatusReporterOptions {
4
+ baseURL: string;
5
+ apiKey: string;
6
+ applicationId: string;
7
+ intervalMs?: number;
8
+ version?: string;
9
+ commitSha?: string;
10
+ deploySlot?: string;
11
+ tags?: Record<string, string>;
12
+ healthProvider?: () => HealthReport | Promise<HealthReport>;
13
+ /** Injection seam for tests. Defaults to global fetch. */
14
+ fetchImpl?: typeof fetch;
15
+ /** Injection seam for tests. */
16
+ warn?: (msg: string) => void;
17
+ }
18
+ /**
19
+ * Resolve the version the app should report, in this preference order:
20
+ * explicit config → standard env vars → `npm_package_version` → "unknown".
21
+ */
22
+ export declare function resolveVersion(explicit?: string): string;
23
+ /**
24
+ * StatusReporter posts periodic `POST /applications/:id/status` updates to
25
+ * DeploySentry on behalf of a DeploySentryClient. Failures are swallowed
26
+ * (logged via `warn`) so flag evaluation is never blocked by reporting.
27
+ */
28
+ export declare class StatusReporter {
29
+ private readonly opts;
30
+ private timer;
31
+ private stopped;
32
+ private backoff;
33
+ constructor(options: StatusReporterOptions);
34
+ /** Fire one immediate report and (if intervalMs > 0) schedule repeats. */
35
+ start(): void;
36
+ /** Stop scheduling further reports. In-flight reports still resolve. */
37
+ stop(): void;
38
+ /** Send exactly one report. Public for tests and explicit callers. */
39
+ reportOnce(): Promise<void>;
40
+ private tick;
41
+ }
42
+ //# sourceMappingURL=status-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-reporter.d.ts","sourceRoot":"","sources":["../../src/status-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiB5C,6DAA6D;AAC7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5D,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,gCAAgC;IAChC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASxD;AAED;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAGyE;IAE9F,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAK;gBAER,OAAO,EAAE,qBAAqB;IAiB1C,0EAA0E;IAC1E,KAAK,IAAI,IAAI;IAKb,wEAAwE;IACxE,IAAI,IAAI,IAAI;IAQZ,sEAAsE;IAChE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAuCnB,IAAI;CA+BnB"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatusReporter = void 0;
4
+ exports.resolveVersion = resolveVersion;
5
+ /** Environment variable names probed (in order) for the running version. */
6
+ const VERSION_ENV_CHAIN = [
7
+ 'APP_VERSION',
8
+ 'GIT_SHA',
9
+ 'GIT_COMMIT',
10
+ 'SOURCE_COMMIT',
11
+ 'RAILWAY_GIT_COMMIT_SHA',
12
+ 'RENDER_GIT_COMMIT',
13
+ 'VERCEL_GIT_COMMIT_SHA',
14
+ 'HEROKU_SLUG_COMMIT',
15
+ ];
16
+ const MIN_BACKOFF_MS = 1_000;
17
+ const MAX_BACKOFF_MS = 5 * 60_000;
18
+ /**
19
+ * Resolve the version the app should report, in this preference order:
20
+ * explicit config → standard env vars → `npm_package_version` → "unknown".
21
+ */
22
+ function resolveVersion(explicit) {
23
+ if (explicit && explicit.trim())
24
+ return explicit;
25
+ const env = typeof process !== 'undefined' && process.env ? process.env : {};
26
+ for (const name of VERSION_ENV_CHAIN) {
27
+ const v = env[name];
28
+ if (v && v.trim())
29
+ return v;
30
+ }
31
+ if (env.npm_package_version)
32
+ return env.npm_package_version;
33
+ return 'unknown';
34
+ }
35
+ /**
36
+ * StatusReporter posts periodic `POST /applications/:id/status` updates to
37
+ * DeploySentry on behalf of a DeploySentryClient. Failures are swallowed
38
+ * (logged via `warn`) so flag evaluation is never blocked by reporting.
39
+ */
40
+ class StatusReporter {
41
+ opts;
42
+ timer = null;
43
+ stopped = false;
44
+ backoff = 0;
45
+ constructor(options) {
46
+ if (!options.baseURL)
47
+ throw new Error('baseURL is required');
48
+ if (!options.apiKey)
49
+ throw new Error('apiKey is required');
50
+ if (!options.applicationId)
51
+ throw new Error('applicationId is required');
52
+ const intervalMs = options.intervalMs ?? 30_000;
53
+ if (intervalMs < 0)
54
+ throw new Error('intervalMs must be >= 0');
55
+ this.opts = {
56
+ ...options,
57
+ baseURL: options.baseURL.replace(/\/+$/, ''),
58
+ apiKey: options.apiKey,
59
+ applicationId: options.applicationId,
60
+ intervalMs,
61
+ warn: options.warn ?? ((msg) => console.warn('[DeploySentry] ' + msg)),
62
+ };
63
+ }
64
+ /** Fire one immediate report and (if intervalMs > 0) schedule repeats. */
65
+ start() {
66
+ this.stopped = false;
67
+ void this.tick();
68
+ }
69
+ /** Stop scheduling further reports. In-flight reports still resolve. */
70
+ stop() {
71
+ this.stopped = true;
72
+ if (this.timer) {
73
+ clearTimeout(this.timer);
74
+ this.timer = null;
75
+ }
76
+ }
77
+ /** Send exactly one report. Public for tests and explicit callers. */
78
+ async reportOnce() {
79
+ const version = resolveVersion(this.opts.version);
80
+ let health = { state: 'healthy' };
81
+ if (this.opts.healthProvider) {
82
+ try {
83
+ health = await this.opts.healthProvider();
84
+ }
85
+ catch (err) {
86
+ health = { state: 'unknown', reason: String(err?.message ?? err) };
87
+ }
88
+ }
89
+ const body = {
90
+ version,
91
+ health: health.state,
92
+ };
93
+ if (health.score !== undefined)
94
+ body.health_score = health.score;
95
+ if (health.reason)
96
+ body.health_reason = health.reason;
97
+ if (this.opts.commitSha)
98
+ body.commit_sha = this.opts.commitSha;
99
+ if (this.opts.deploySlot)
100
+ body.deploy_slot = this.opts.deploySlot;
101
+ if (this.opts.tags && Object.keys(this.opts.tags).length)
102
+ body.tags = this.opts.tags;
103
+ const fetchImpl = this.opts.fetchImpl ?? fetch;
104
+ const url = `${this.opts.baseURL}/api/v1/applications/${encodeURIComponent(this.opts.applicationId)}/status`;
105
+ const res = await fetchImpl(url, {
106
+ method: 'POST',
107
+ headers: {
108
+ 'Content-Type': 'application/json',
109
+ Authorization: `ApiKey ${this.opts.apiKey}`,
110
+ },
111
+ body: JSON.stringify(body),
112
+ });
113
+ if (!res.ok) {
114
+ throw new Error(`status report failed: ${res.status} ${res.statusText}`);
115
+ }
116
+ }
117
+ async tick() {
118
+ if (this.stopped)
119
+ return;
120
+ try {
121
+ await this.reportOnce();
122
+ this.backoff = 0; // success — clear backoff
123
+ }
124
+ catch (err) {
125
+ this.opts.warn(`status report error: ${err.message}`);
126
+ if (this.backoff >= MAX_BACKOFF_MS) {
127
+ // Already at the ceiling. Reset so the next schedule falls back to
128
+ // intervalMs — otherwise a server that recovers mid-outage takes up
129
+ // to MAX_BACKOFF_MS (5m) to be noticed, regardless of how tight the
130
+ // operator configured intervalMs. On the next failure the 1s ladder
131
+ // restarts, so the short-outage behavior (quickly re-probe while
132
+ // the server is still down) is preserved.
133
+ this.backoff = 0;
134
+ this.opts.warn(`status reporter backoff reset; probing every ${this.opts.intervalMs}ms`);
135
+ }
136
+ else {
137
+ this.backoff = this.backoff === 0 ? MIN_BACKOFF_MS : Math.min(this.backoff * 2, MAX_BACKOFF_MS);
138
+ }
139
+ }
140
+ if (this.stopped)
141
+ return;
142
+ if (this.opts.intervalMs === 0)
143
+ return; // startup-only
144
+ const nextDelay = this.backoff > 0 ? this.backoff : this.opts.intervalMs;
145
+ this.timer = setTimeout(() => void this.tick(), nextDelay);
146
+ // Allow Node to exit even when the timer is pending.
147
+ if (typeof this.timer.unref === 'function') {
148
+ this.timer.unref?.();
149
+ }
150
+ }
151
+ }
152
+ exports.StatusReporter = StatusReporter;
153
+ //# sourceMappingURL=status-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-reporter.js","sourceRoot":"","sources":["../../src/status-reporter.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,14 @@ interface StreamOptions {
17
17
  onChange: FlagChangeHandler;
18
18
  /** Called when the stream encounters an error. */
19
19
  onError?: StreamErrorHandler;
20
+ /** Called once the SSE connection is established (HTTP 200). */
21
+ onOpen?: () => void;
22
+ /**
23
+ * Called on any inbound stream activity — heartbeat comments (`:ping`) and
24
+ * data events alike. Lets the sync engine treat the stream as alive and gate
25
+ * its resync cadence on stream liveness.
26
+ */
27
+ onHeartbeat?: () => void;
20
28
  }
21
29
  /**
22
30
  * Lightweight SSE streaming client that keeps the local flag cache
@@ -34,6 +42,8 @@ export declare class FlagStreamClient {
34
42
  private readonly headers;
35
43
  private readonly onChange;
36
44
  private readonly onError;
45
+ private readonly onOpen;
46
+ private readonly onHeartbeat;
37
47
  constructor(options: StreamOptions);
38
48
  /** Open the SSE connection and start processing events. */
39
49
  connect(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAOxD,UAAU,aAAa;IACrB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,kDAAkD;IAClD,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;IAEvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,OAAO,EAAE,aAAa;IAOlC,2DAA2D;IACrD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC9B,2DAA2D;IAC3D,KAAK,IAAI,IAAI;YAkBC,aAAa;IA8B3B,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,iBAAiB;CAgB1B"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAElE,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAOxD,UAAU,aAAa;IACrB,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,kDAAkD;IAClD,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAwB;IAEvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE7B,OAAO,EAAE,aAAa;IASlC,2DAA2D;IACrD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC9B,2DAA2D;IAC3D,KAAK,IAAI,IAAI;YAkBC,aAAa;IA8B3B,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,iBAAiB;CAgB1B"}
@@ -21,11 +21,15 @@ class FlagStreamClient {
21
21
  headers;
22
22
  onChange;
23
23
  onError;
24
+ onOpen;
25
+ onHeartbeat;
24
26
  constructor(options) {
25
27
  this.url = options.url;
26
28
  this.headers = options.headers;
27
29
  this.onChange = options.onChange;
28
30
  this.onError = options.onError ?? (() => { });
31
+ this.onOpen = options.onOpen ?? (() => { });
32
+ this.onHeartbeat = options.onHeartbeat ?? (() => { });
29
33
  }
30
34
  /** Open the SSE connection and start processing events. */
31
35
  async connect() {
@@ -49,6 +53,7 @@ class FlagStreamClient {
49
53
  throw new Error('SSE response has no body');
50
54
  }
51
55
  this.retryMs = SSE_INITIAL_RETRY_MS;
56
+ this.onOpen();
52
57
  await this.consumeStream(response.body);
53
58
  }
54
59
  catch (err) {
@@ -103,6 +108,9 @@ class FlagStreamClient {
103
108
  }
104
109
  }
105
110
  processEvent(raw) {
111
+ // Any inbound frame — including a heartbeat comment — means the stream is
112
+ // alive. Surface that before interpreting the payload.
113
+ this.onHeartbeat();
106
114
  let eventType = 'message';
107
115
  let data = '';
108
116
  for (const line of raw.split('\n')) {
@@ -113,7 +121,7 @@ class FlagStreamClient {
113
121
  data += line.slice(5).trim();
114
122
  }
115
123
  else if (line.startsWith(':')) {
116
- // SSE comment (heartbeat) — ignore.
124
+ // SSE comment (heartbeat) — liveness already recorded above; no payload.
117
125
  return;
118
126
  }
119
127
  }
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming.js","sourceRoot":"","sources":["../../src/streaming.ts"],"names":[],"mappings":"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"}