@openfeature/server-sdk 1.14.0 → 1.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cjs/index.js +228 -162
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +231 -162
- package/dist/esm/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
<img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
|
|
17
17
|
</a>
|
|
18
18
|
<!-- x-release-please-start-version -->
|
|
19
|
-
<a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.
|
|
20
|
-
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.
|
|
19
|
+
<a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.15.1">
|
|
20
|
+
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.15.1&color=blue&style=for-the-badge" />
|
|
21
21
|
</a>
|
|
22
22
|
<!-- x-release-please-end -->
|
|
23
23
|
<br/>
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
6
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
8
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __spreadValues = (a, b) => {
|
|
12
|
+
for (var prop in b || (b = {}))
|
|
13
|
+
if (__hasOwnProp.call(b, prop))
|
|
14
|
+
__defNormalProp(a, prop, b[prop]);
|
|
15
|
+
if (__getOwnPropSymbols)
|
|
16
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
+
if (__propIsEnum.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
}
|
|
20
|
+
return a;
|
|
21
|
+
};
|
|
22
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
6
23
|
var __export = (target, all) => {
|
|
7
24
|
for (var name in all)
|
|
8
25
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -17,6 +34,26 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
34
|
};
|
|
18
35
|
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
19
36
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
37
|
+
var __async = (__this, __arguments, generator) => {
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
var fulfilled = (value) => {
|
|
40
|
+
try {
|
|
41
|
+
step(generator.next(value));
|
|
42
|
+
} catch (e) {
|
|
43
|
+
reject(e);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var rejected = (value) => {
|
|
47
|
+
try {
|
|
48
|
+
step(generator.throw(value));
|
|
49
|
+
} catch (e) {
|
|
50
|
+
reject(e);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
54
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
55
|
+
});
|
|
56
|
+
};
|
|
20
57
|
|
|
21
58
|
// src/index.ts
|
|
22
59
|
var src_exports = {};
|
|
@@ -39,9 +76,11 @@ var import_core = require("@openfeature/core");
|
|
|
39
76
|
// src/provider/no-op-provider.ts
|
|
40
77
|
var REASON_NO_OP = "No-op";
|
|
41
78
|
var NoopFeatureProvider = class {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
79
|
+
constructor() {
|
|
80
|
+
this.metadata = {
|
|
81
|
+
name: "No-op Provider"
|
|
82
|
+
};
|
|
83
|
+
}
|
|
45
84
|
resolveBooleanEvaluation(_, defaultValue) {
|
|
46
85
|
return this.noOp(defaultValue);
|
|
47
86
|
}
|
|
@@ -69,7 +108,6 @@ var import_core3 = require("@openfeature/core");
|
|
|
69
108
|
// src/provider/in-memory-provider/variant-not-found-error.ts
|
|
70
109
|
var import_core2 = require("@openfeature/core");
|
|
71
110
|
var VariantFoundError = class _VariantFoundError extends import_core2.OpenFeatureError {
|
|
72
|
-
code;
|
|
73
111
|
constructor(message) {
|
|
74
112
|
super(message);
|
|
75
113
|
Object.setPrototypeOf(this, _VariantFoundError.prototype);
|
|
@@ -80,14 +118,13 @@ var VariantFoundError = class _VariantFoundError extends import_core2.OpenFeatur
|
|
|
80
118
|
|
|
81
119
|
// src/provider/in-memory-provider/in-memory-provider.ts
|
|
82
120
|
var InMemoryProvider = class {
|
|
83
|
-
events = new OpenFeatureEventEmitter();
|
|
84
|
-
runsOn = "server";
|
|
85
|
-
metadata = {
|
|
86
|
-
name: "in-memory"
|
|
87
|
-
};
|
|
88
|
-
_flagConfiguration;
|
|
89
121
|
constructor(flagConfiguration = {}) {
|
|
90
|
-
this.
|
|
122
|
+
this.events = new OpenFeatureEventEmitter();
|
|
123
|
+
this.runsOn = "server";
|
|
124
|
+
this.metadata = {
|
|
125
|
+
name: "in-memory"
|
|
126
|
+
};
|
|
127
|
+
this._flagConfiguration = __spreadValues({}, flagConfiguration);
|
|
91
128
|
}
|
|
92
129
|
/**
|
|
93
130
|
* Overwrites the configured flags.
|
|
@@ -95,7 +132,7 @@ var InMemoryProvider = class {
|
|
|
95
132
|
*/
|
|
96
133
|
putConfiguration(flagConfiguration) {
|
|
97
134
|
const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
|
|
98
|
-
this._flagConfiguration = {
|
|
135
|
+
this._flagConfiguration = __spreadValues({}, flagConfiguration);
|
|
99
136
|
this.events.emit(import_core6.ServerProviderEvents.ConfigurationChanged, { flagsChanged });
|
|
100
137
|
}
|
|
101
138
|
resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
|
|
@@ -104,49 +141,56 @@ var InMemoryProvider = class {
|
|
|
104
141
|
resolveNumberEvaluation(flagKey, defaultValue, context, logger) {
|
|
105
142
|
return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
|
|
106
143
|
}
|
|
107
|
-
|
|
108
|
-
return this
|
|
144
|
+
resolveStringEvaluation(flagKey, defaultValue, context, logger) {
|
|
145
|
+
return __async(this, null, function* () {
|
|
146
|
+
return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
|
|
147
|
+
});
|
|
109
148
|
}
|
|
110
|
-
|
|
111
|
-
return this
|
|
149
|
+
resolveObjectEvaluation(flagKey, defaultValue, context, logger) {
|
|
150
|
+
return __async(this, null, function* () {
|
|
151
|
+
return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
|
|
152
|
+
});
|
|
112
153
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
154
|
+
resolveFlagWithReason(flagKey, defaultValue, ctx, logger) {
|
|
155
|
+
return __async(this, null, function* () {
|
|
156
|
+
try {
|
|
157
|
+
const resolutionResult = this.lookupFlagValue(flagKey, defaultValue, ctx, logger);
|
|
158
|
+
if (typeof (resolutionResult == null ? void 0 : resolutionResult.value) != typeof defaultValue) {
|
|
159
|
+
throw new import_core3.TypeMismatchError();
|
|
160
|
+
}
|
|
161
|
+
return resolutionResult;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
if (!(error instanceof import_core3.OpenFeatureError)) {
|
|
164
|
+
throw new import_core3.GeneralError((error == null ? void 0 : error.message) || "unknown error");
|
|
165
|
+
}
|
|
166
|
+
throw error;
|
|
123
167
|
}
|
|
124
|
-
|
|
125
|
-
}
|
|
168
|
+
});
|
|
126
169
|
}
|
|
127
170
|
lookupFlagValue(flagKey, defaultValue, ctx, logger) {
|
|
171
|
+
var _a;
|
|
128
172
|
if (!(flagKey in this._flagConfiguration)) {
|
|
129
173
|
const message = `no flag found with key ${flagKey}`;
|
|
130
|
-
logger
|
|
174
|
+
logger == null ? void 0 : logger.debug(message);
|
|
131
175
|
throw new import_core3.FlagNotFoundError(message);
|
|
132
176
|
}
|
|
133
177
|
const flagSpec = this._flagConfiguration[flagKey];
|
|
134
178
|
if (flagSpec.disabled) {
|
|
135
179
|
return { value: defaultValue, reason: import_core3.StandardResolutionReasons.DISABLED };
|
|
136
180
|
}
|
|
137
|
-
const isContextEval = ctx && flagSpec
|
|
138
|
-
const variant = isContextEval ? flagSpec.contextEvaluator
|
|
139
|
-
const value = variant && flagSpec
|
|
181
|
+
const isContextEval = ctx && (flagSpec == null ? void 0 : flagSpec.contextEvaluator);
|
|
182
|
+
const variant = isContextEval ? (_a = flagSpec.contextEvaluator) == null ? void 0 : _a.call(flagSpec, ctx) : flagSpec.defaultVariant;
|
|
183
|
+
const value = variant && (flagSpec == null ? void 0 : flagSpec.variants[variant]);
|
|
140
184
|
if (value === void 0) {
|
|
141
185
|
const message = `no value associated with variant ${variant}`;
|
|
142
|
-
logger
|
|
186
|
+
logger == null ? void 0 : logger.error(message);
|
|
143
187
|
throw new VariantFoundError(message);
|
|
144
188
|
}
|
|
145
|
-
return {
|
|
146
|
-
value
|
|
147
|
-
|
|
189
|
+
return __spreadProps(__spreadValues({
|
|
190
|
+
value
|
|
191
|
+
}, variant && { variant }), {
|
|
148
192
|
reason: isContextEval ? import_core3.StandardResolutionReasons.TARGETING_MATCH : import_core3.StandardResolutionReasons.STATIC
|
|
149
|
-
};
|
|
193
|
+
});
|
|
150
194
|
}
|
|
151
195
|
};
|
|
152
196
|
|
|
@@ -162,16 +206,15 @@ var OpenFeatureClient = class {
|
|
|
162
206
|
this.emitterAccessor = emitterAccessor;
|
|
163
207
|
this.globalLogger = globalLogger;
|
|
164
208
|
this.options = options;
|
|
209
|
+
this._hooks = [];
|
|
165
210
|
this._context = context;
|
|
166
211
|
}
|
|
167
|
-
_context;
|
|
168
|
-
_hooks = [];
|
|
169
|
-
_clientLogger;
|
|
170
212
|
get metadata() {
|
|
213
|
+
var _a, _b;
|
|
171
214
|
return {
|
|
172
215
|
// Use domain if name is not provided
|
|
173
|
-
name: this.options.domain
|
|
174
|
-
domain: this.options.domain
|
|
216
|
+
name: (_a = this.options.domain) != null ? _a : this.options.name,
|
|
217
|
+
domain: (_b = this.options.domain) != null ? _b : this.options.name,
|
|
175
218
|
version: this.options.version,
|
|
176
219
|
providerMetadata: this.providerAccessor().metadata
|
|
177
220
|
};
|
|
@@ -180,6 +223,7 @@ var OpenFeatureClient = class {
|
|
|
180
223
|
return this.providerStatusAccessor();
|
|
181
224
|
}
|
|
182
225
|
addHandler(eventType, handler) {
|
|
226
|
+
var _a;
|
|
183
227
|
this.emitterAccessor().addHandler(eventType, handler);
|
|
184
228
|
const shouldRunNow = (0, import_core4.statusMatchesEvent)(eventType, this._providerStatus);
|
|
185
229
|
if (shouldRunNow) {
|
|
@@ -190,7 +234,7 @@ var OpenFeatureClient = class {
|
|
|
190
234
|
providerName: this._provider.metadata.name
|
|
191
235
|
});
|
|
192
236
|
} catch (err) {
|
|
193
|
-
this._logger
|
|
237
|
+
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
194
238
|
}
|
|
195
239
|
}
|
|
196
240
|
}
|
|
@@ -222,8 +266,10 @@ var OpenFeatureClient = class {
|
|
|
222
266
|
this._hooks = [];
|
|
223
267
|
return this;
|
|
224
268
|
}
|
|
225
|
-
|
|
226
|
-
return (
|
|
269
|
+
getBooleanValue(flagKey, defaultValue, context, options) {
|
|
270
|
+
return __async(this, null, function* () {
|
|
271
|
+
return (yield this.getBooleanDetails(flagKey, defaultValue, context, options)).value;
|
|
272
|
+
});
|
|
227
273
|
}
|
|
228
274
|
getBooleanDetails(flagKey, defaultValue, context, options) {
|
|
229
275
|
return this.evaluate(
|
|
@@ -235,8 +281,10 @@ var OpenFeatureClient = class {
|
|
|
235
281
|
options
|
|
236
282
|
);
|
|
237
283
|
}
|
|
238
|
-
|
|
239
|
-
return (
|
|
284
|
+
getStringValue(flagKey, defaultValue, context, options) {
|
|
285
|
+
return __async(this, null, function* () {
|
|
286
|
+
return (yield this.getStringDetails(flagKey, defaultValue, context, options)).value;
|
|
287
|
+
});
|
|
240
288
|
}
|
|
241
289
|
getStringDetails(flagKey, defaultValue, context, options) {
|
|
242
290
|
return this.evaluate(
|
|
@@ -249,8 +297,10 @@ var OpenFeatureClient = class {
|
|
|
249
297
|
options
|
|
250
298
|
);
|
|
251
299
|
}
|
|
252
|
-
|
|
253
|
-
return (
|
|
300
|
+
getNumberValue(flagKey, defaultValue, context, options) {
|
|
301
|
+
return __async(this, null, function* () {
|
|
302
|
+
return (yield this.getNumberDetails(flagKey, defaultValue, context, options)).value;
|
|
303
|
+
});
|
|
254
304
|
}
|
|
255
305
|
getNumberDetails(flagKey, defaultValue, context, options) {
|
|
256
306
|
return this.evaluate(
|
|
@@ -263,109 +313,117 @@ var OpenFeatureClient = class {
|
|
|
263
313
|
options
|
|
264
314
|
);
|
|
265
315
|
}
|
|
266
|
-
|
|
267
|
-
return (
|
|
316
|
+
getObjectValue(flagKey, defaultValue, context, options) {
|
|
317
|
+
return __async(this, null, function* () {
|
|
318
|
+
return (yield this.getObjectDetails(flagKey, defaultValue, context, options)).value;
|
|
319
|
+
});
|
|
268
320
|
}
|
|
269
321
|
getObjectDetails(flagKey, defaultValue, context, options) {
|
|
270
322
|
return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", context, options);
|
|
271
323
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
...
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
providerMetadata: this._provider.metadata,
|
|
292
|
-
context: mergedContext,
|
|
293
|
-
logger: this._logger
|
|
294
|
-
};
|
|
295
|
-
try {
|
|
296
|
-
const frozenContext = await this.beforeHooks(allHooks, hookContext, options);
|
|
297
|
-
if (this.providerStatus === import_core.ServerProviderStatus.NOT_READY) {
|
|
298
|
-
throw new import_core4.ProviderNotReadyError("provider has not yet initialized");
|
|
299
|
-
} else if (this.providerStatus === import_core.ServerProviderStatus.FATAL) {
|
|
300
|
-
throw new import_core4.ProviderFatalError("provider is in an irrecoverable error state");
|
|
301
|
-
}
|
|
302
|
-
const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
|
|
303
|
-
const evaluationDetails = {
|
|
304
|
-
...resolution,
|
|
305
|
-
flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),
|
|
306
|
-
flagKey
|
|
324
|
+
evaluate(_0, _1, _2, _3) {
|
|
325
|
+
return __async(this, arguments, function* (flagKey, resolver, defaultValue, flagType, invocationContext = {}, options = {}) {
|
|
326
|
+
var _a;
|
|
327
|
+
const allHooks = [
|
|
328
|
+
...OpenFeature.getHooks(),
|
|
329
|
+
...this.getHooks(),
|
|
330
|
+
...options.hooks || [],
|
|
331
|
+
...this._provider.hooks || []
|
|
332
|
+
];
|
|
333
|
+
const allHooksReversed = [...allHooks].reverse();
|
|
334
|
+
const mergedContext = __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, OpenFeature.getContext()), OpenFeature.getTransactionContext()), this._context), invocationContext);
|
|
335
|
+
const hookContext = {
|
|
336
|
+
flagKey,
|
|
337
|
+
defaultValue,
|
|
338
|
+
flagValueType: flagType,
|
|
339
|
+
clientMetadata: this.metadata,
|
|
340
|
+
providerMetadata: this._provider.metadata,
|
|
341
|
+
context: mergedContext,
|
|
342
|
+
logger: this._logger
|
|
307
343
|
};
|
|
308
|
-
|
|
309
|
-
|
|
344
|
+
try {
|
|
345
|
+
const frozenContext = yield this.beforeHooks(allHooks, hookContext, options);
|
|
346
|
+
if (this.providerStatus === import_core.ServerProviderStatus.NOT_READY) {
|
|
347
|
+
throw new import_core4.ProviderNotReadyError("provider has not yet initialized");
|
|
348
|
+
} else if (this.providerStatus === import_core.ServerProviderStatus.FATAL) {
|
|
349
|
+
throw new import_core4.ProviderFatalError("provider is in an irrecoverable error state");
|
|
350
|
+
}
|
|
351
|
+
const resolution = yield resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
|
|
352
|
+
const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
|
|
353
|
+
flagMetadata: Object.freeze((_a = resolution.flagMetadata) != null ? _a : {}),
|
|
354
|
+
flagKey
|
|
355
|
+
});
|
|
356
|
+
if (evaluationDetails.errorCode) {
|
|
357
|
+
throw (0, import_core4.instantiateErrorByErrorCode)(evaluationDetails.errorCode);
|
|
358
|
+
}
|
|
359
|
+
yield this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);
|
|
360
|
+
return evaluationDetails;
|
|
361
|
+
} catch (err) {
|
|
362
|
+
const errorMessage = err == null ? void 0 : err.message;
|
|
363
|
+
const errorCode = (err == null ? void 0 : err.code) || import_core4.ErrorCode.GENERAL;
|
|
364
|
+
yield this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
365
|
+
return {
|
|
366
|
+
errorCode,
|
|
367
|
+
errorMessage,
|
|
368
|
+
value: defaultValue,
|
|
369
|
+
reason: import_core4.StandardResolutionReasons.ERROR,
|
|
370
|
+
flagMetadata: Object.freeze({}),
|
|
371
|
+
flagKey
|
|
372
|
+
};
|
|
373
|
+
} finally {
|
|
374
|
+
yield this.finallyHooks(allHooksReversed, hookContext, options);
|
|
310
375
|
}
|
|
311
|
-
|
|
312
|
-
return evaluationDetails;
|
|
313
|
-
} catch (err) {
|
|
314
|
-
const errorMessage = err?.message;
|
|
315
|
-
const errorCode = err?.code || import_core4.ErrorCode.GENERAL;
|
|
316
|
-
await this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
317
|
-
return {
|
|
318
|
-
errorCode,
|
|
319
|
-
errorMessage,
|
|
320
|
-
value: defaultValue,
|
|
321
|
-
reason: import_core4.StandardResolutionReasons.ERROR,
|
|
322
|
-
flagMetadata: Object.freeze({}),
|
|
323
|
-
flagKey
|
|
324
|
-
};
|
|
325
|
-
} finally {
|
|
326
|
-
await this.finallyHooks(allHooksReversed, hookContext, options);
|
|
327
|
-
}
|
|
376
|
+
});
|
|
328
377
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
|
|
378
|
+
beforeHooks(hooks, hookContext, options) {
|
|
379
|
+
return __async(this, null, function* () {
|
|
380
|
+
var _a;
|
|
381
|
+
for (const hook of hooks) {
|
|
382
|
+
Object.freeze(hookContext);
|
|
383
|
+
Object.assign(hookContext.context, __spreadValues(__spreadValues({}, hookContext.context), yield (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints))));
|
|
384
|
+
}
|
|
385
|
+
return Object.freeze(hookContext.context);
|
|
386
|
+
});
|
|
338
387
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
388
|
+
afterHooks(hooks, hookContext, evaluationDetails, options) {
|
|
389
|
+
return __async(this, null, function* () {
|
|
390
|
+
var _a;
|
|
391
|
+
for (const hook of hooks) {
|
|
392
|
+
yield (_a = hook == null ? void 0 : hook.after) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
|
|
393
|
+
}
|
|
394
|
+
});
|
|
343
395
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
this._logger.error(err2
|
|
396
|
+
errorHooks(hooks, hookContext, err, options) {
|
|
397
|
+
return __async(this, null, function* () {
|
|
398
|
+
var _a;
|
|
399
|
+
for (const hook of hooks) {
|
|
400
|
+
try {
|
|
401
|
+
yield (_a = hook == null ? void 0 : hook.error) == null ? void 0 : _a.call(hook, hookContext, err, options.hookHints);
|
|
402
|
+
} catch (err2) {
|
|
403
|
+
this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
|
|
404
|
+
if (err2 instanceof Error) {
|
|
405
|
+
this._logger.error(err2.stack);
|
|
406
|
+
}
|
|
407
|
+
this._logger.error(err2 == null ? void 0 : err2.stack);
|
|
352
408
|
}
|
|
353
|
-
this._logger.error(err2?.stack);
|
|
354
409
|
}
|
|
355
|
-
}
|
|
410
|
+
});
|
|
356
411
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
this._logger.error(err
|
|
412
|
+
finallyHooks(hooks, hookContext, options) {
|
|
413
|
+
return __async(this, null, function* () {
|
|
414
|
+
var _a;
|
|
415
|
+
for (const hook of hooks) {
|
|
416
|
+
try {
|
|
417
|
+
yield (_a = hook == null ? void 0 : hook.finally) == null ? void 0 : _a.call(hook, hookContext, options.hookHints);
|
|
418
|
+
} catch (err) {
|
|
419
|
+
this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
|
|
420
|
+
if (err instanceof Error) {
|
|
421
|
+
this._logger.error(err.stack);
|
|
422
|
+
}
|
|
423
|
+
this._logger.error(err == null ? void 0 : err.stack);
|
|
365
424
|
}
|
|
366
|
-
this._logger.error(err?.stack);
|
|
367
425
|
}
|
|
368
|
-
}
|
|
426
|
+
});
|
|
369
427
|
}
|
|
370
428
|
get _provider() {
|
|
371
429
|
return this.providerAccessor();
|
|
@@ -382,11 +440,12 @@ var OpenFeatureClient = class {
|
|
|
382
440
|
var import_core5 = require("@openfeature/core");
|
|
383
441
|
var import_node_events = require("events");
|
|
384
442
|
var OpenFeatureEventEmitter = class extends import_core5.GenericEventEmitter {
|
|
385
|
-
eventEmitter = new import_node_events.EventEmitter({ captureRejections: true });
|
|
386
443
|
constructor() {
|
|
387
444
|
super();
|
|
445
|
+
this.eventEmitter = new import_node_events.EventEmitter({ captureRejections: true });
|
|
388
446
|
this.eventEmitter.on("error", (err) => {
|
|
389
|
-
|
|
447
|
+
var _a;
|
|
448
|
+
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
390
449
|
});
|
|
391
450
|
}
|
|
392
451
|
};
|
|
@@ -408,9 +467,12 @@ var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator()
|
|
|
408
467
|
// src/transaction-context/async-local-storage-transaction-context-propagator.ts
|
|
409
468
|
var import_async_hooks = require("async_hooks");
|
|
410
469
|
var AsyncLocalStorageTransactionContextPropagator = class {
|
|
411
|
-
|
|
470
|
+
constructor() {
|
|
471
|
+
this.asyncLocalStorage = new import_async_hooks.AsyncLocalStorage();
|
|
472
|
+
}
|
|
412
473
|
getTransactionContext() {
|
|
413
|
-
|
|
474
|
+
var _a;
|
|
475
|
+
return (_a = this.asyncLocalStorage.getStore()) != null ? _a : {};
|
|
414
476
|
}
|
|
415
477
|
setTransactionContext(transactionContext, callback, ...args) {
|
|
416
478
|
this.asyncLocalStorage.run(transactionContext, callback, ...args);
|
|
@@ -421,18 +483,18 @@ var AsyncLocalStorageTransactionContextPropagator = class {
|
|
|
421
483
|
var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/js-sdk/api");
|
|
422
484
|
var _globalThis = globalThis;
|
|
423
485
|
var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommonAPI {
|
|
424
|
-
_statusEnumType = import_core.ServerProviderStatus;
|
|
425
|
-
_apiEmitter = new OpenFeatureEventEmitter();
|
|
426
|
-
_defaultProvider = new import_core7.ProviderWrapper(
|
|
427
|
-
NOOP_PROVIDER,
|
|
428
|
-
import_core.ServerProviderStatus.NOT_READY,
|
|
429
|
-
this._statusEnumType
|
|
430
|
-
);
|
|
431
|
-
_domainScopedProviders = /* @__PURE__ */ new Map();
|
|
432
|
-
_createEventEmitter = () => new OpenFeatureEventEmitter();
|
|
433
|
-
_transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
|
|
434
486
|
constructor() {
|
|
435
487
|
super("server");
|
|
488
|
+
this._statusEnumType = import_core.ServerProviderStatus;
|
|
489
|
+
this._apiEmitter = new OpenFeatureEventEmitter();
|
|
490
|
+
this._defaultProvider = new import_core7.ProviderWrapper(
|
|
491
|
+
NOOP_PROVIDER,
|
|
492
|
+
import_core.ServerProviderStatus.NOT_READY,
|
|
493
|
+
this._statusEnumType
|
|
494
|
+
);
|
|
495
|
+
this._domainScopedProviders = /* @__PURE__ */ new Map();
|
|
496
|
+
this._createEventEmitter = () => new OpenFeatureEventEmitter();
|
|
497
|
+
this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
|
|
436
498
|
}
|
|
437
499
|
/**
|
|
438
500
|
* Gets a singleton instance of the OpenFeature API.
|
|
@@ -449,15 +511,18 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
|
|
|
449
511
|
return instance;
|
|
450
512
|
}
|
|
451
513
|
getProviderStatus(domain) {
|
|
514
|
+
var _a, _b;
|
|
452
515
|
if (!domain) {
|
|
453
516
|
return this._defaultProvider.status;
|
|
454
517
|
}
|
|
455
|
-
return this._domainScopedProviders.get(domain)
|
|
518
|
+
return (_b = (_a = this._domainScopedProviders.get(domain)) == null ? void 0 : _a.status) != null ? _b : this._defaultProvider.status;
|
|
456
519
|
}
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
520
|
+
setProviderAndWait(domainOrProvider, providerOrUndefined) {
|
|
521
|
+
return __async(this, null, function* () {
|
|
522
|
+
const domain = (0, import_core7.stringOrUndefined)(domainOrProvider);
|
|
523
|
+
const provider = domain ? (0, import_core7.objectOrUndefined)(providerOrUndefined) : (0, import_core7.objectOrUndefined)(domainOrProvider);
|
|
524
|
+
yield this.setAwaitableProvider(domain, provider);
|
|
525
|
+
});
|
|
461
526
|
}
|
|
462
527
|
setProvider(clientOrProvider, providerOrUndefined) {
|
|
463
528
|
const domain = (0, import_core7.stringOrUndefined)(clientOrProvider);
|
|
@@ -476,9 +541,10 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
|
|
|
476
541
|
return this._context;
|
|
477
542
|
}
|
|
478
543
|
getClient(domainOrContext, versionOrContext, contextOrUndefined) {
|
|
544
|
+
var _a, _b;
|
|
479
545
|
const domain = (0, import_core7.stringOrUndefined)(domainOrContext);
|
|
480
546
|
const version = (0, import_core7.stringOrUndefined)(versionOrContext);
|
|
481
|
-
const context = (0, import_core7.objectOrUndefined)(domainOrContext)
|
|
547
|
+
const context = (_b = (_a = (0, import_core7.objectOrUndefined)(domainOrContext)) != null ? _a : (0, import_core7.objectOrUndefined)(versionOrContext)) != null ? _b : (0, import_core7.objectOrUndefined)(contextOrUndefined);
|
|
482
548
|
return new OpenFeatureClient(
|
|
483
549
|
() => this.getProviderForClient(domain),
|
|
484
550
|
() => this.getProviderStatus(domain),
|
|
@@ -497,9 +563,9 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
|
|
|
497
563
|
}
|
|
498
564
|
setTransactionContextPropagator(transactionContextPropagator) {
|
|
499
565
|
const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
|
|
500
|
-
if (typeof transactionContextPropagator
|
|
566
|
+
if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
|
|
501
567
|
this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
|
|
502
|
-
} else if (typeof transactionContextPropagator
|
|
568
|
+
} else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
|
|
503
569
|
this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
|
|
504
570
|
} else {
|
|
505
571
|
this._transactionContextPropagator = transactionContextPropagator;
|
|
@@ -514,8 +580,8 @@ var OpenFeatureAPI = class _OpenFeatureAPI extends import_core7.OpenFeatureCommo
|
|
|
514
580
|
return this._transactionContextPropagator.getTransactionContext();
|
|
515
581
|
} catch (err) {
|
|
516
582
|
const error = err;
|
|
517
|
-
this._logger.error(`Error getting transaction context: ${error
|
|
518
|
-
this._logger.error(error
|
|
583
|
+
this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
|
|
584
|
+
this._logger.error(error == null ? void 0 : error.stack);
|
|
519
585
|
return {};
|
|
520
586
|
}
|
|
521
587
|
}
|