@openfeature/server-sdk 1.6.3 → 1.7.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 +32 -12
- package/dist/cjs/index.js +78 -617
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +80 -571
- package/dist/esm/index.js.map +4 -4
- package/dist/types.d.ts +65 -629
- package/package.json +9 -10
package/dist/esm/index.js
CHANGED
|
@@ -38,549 +38,16 @@ var __async = (__this, __arguments, generator) => {
|
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
40
|
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
// ../shared/src/evaluation/evaluation.ts
|
|
51
|
-
var StandardResolutionReasons = {
|
|
52
|
-
/**
|
|
53
|
-
* The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
|
|
54
|
-
*/
|
|
55
|
-
TARGETING_MATCH: "TARGETING_MATCH",
|
|
56
|
-
/**
|
|
57
|
-
* The resolved value was the result of pseudorandom assignment.
|
|
58
|
-
*/
|
|
59
|
-
SPLIT: "SPLIT",
|
|
60
|
-
/**
|
|
61
|
-
* The resolved value was the result of the flag being disabled in the management system.
|
|
62
|
-
*/
|
|
63
|
-
DISABLED: "DISABLED",
|
|
64
|
-
/**
|
|
65
|
-
* The resolved value was configured statically, or otherwise fell back to a pre-configured value.
|
|
66
|
-
*/
|
|
67
|
-
DEFAULT: "DEFAULT",
|
|
68
|
-
/**
|
|
69
|
-
* The reason for the resolved value could not be determined.
|
|
70
|
-
*/
|
|
71
|
-
UNKNOWN: "UNKNOWN",
|
|
72
|
-
/**
|
|
73
|
-
* The resolved value is static (no dynamic evaluation).
|
|
74
|
-
*/
|
|
75
|
-
STATIC: "STATIC",
|
|
76
|
-
/**
|
|
77
|
-
* The resolved value was retrieved from cache.
|
|
78
|
-
*/
|
|
79
|
-
CACHED: "CACHED",
|
|
80
|
-
/**
|
|
81
|
-
* The resolved value was the result of an error.
|
|
82
|
-
*
|
|
83
|
-
* Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
|
|
84
|
-
*/
|
|
85
|
-
ERROR: "ERROR"
|
|
86
|
-
};
|
|
87
|
-
var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
|
|
88
|
-
ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
|
|
89
|
-
ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
|
|
90
|
-
ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
|
|
91
|
-
ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
|
|
92
|
-
ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
|
|
93
|
-
ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
|
|
94
|
-
ErrorCode2["GENERAL"] = "GENERAL";
|
|
95
|
-
return ErrorCode2;
|
|
96
|
-
})(ErrorCode || {});
|
|
97
|
-
|
|
98
|
-
// ../shared/src/errors/general-error.ts
|
|
99
|
-
var GeneralError = class extends OpenFeatureError {
|
|
100
|
-
constructor(message) {
|
|
101
|
-
super(message);
|
|
102
|
-
Object.setPrototypeOf(this, GeneralError.prototype);
|
|
103
|
-
this.name = "GeneralError";
|
|
104
|
-
this.code = "GENERAL" /* GENERAL */;
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
// ../shared/src/errors/flag-not-found-error.ts
|
|
109
|
-
var FlagNotFoundError = class extends OpenFeatureError {
|
|
110
|
-
constructor(message) {
|
|
111
|
-
super(message);
|
|
112
|
-
Object.setPrototypeOf(this, FlagNotFoundError.prototype);
|
|
113
|
-
this.name = "FlagNotFoundError";
|
|
114
|
-
this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// ../shared/src/errors/parse-error.ts
|
|
119
|
-
var ParseError = class extends OpenFeatureError {
|
|
120
|
-
constructor(message) {
|
|
121
|
-
super(message);
|
|
122
|
-
Object.setPrototypeOf(this, ParseError.prototype);
|
|
123
|
-
this.name = "ParseError";
|
|
124
|
-
this.code = "PARSE_ERROR" /* PARSE_ERROR */;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
// ../shared/src/errors/type-mismatch-error.ts
|
|
129
|
-
var TypeMismatchError = class extends OpenFeatureError {
|
|
130
|
-
constructor(message) {
|
|
131
|
-
super(message);
|
|
132
|
-
Object.setPrototypeOf(this, TypeMismatchError.prototype);
|
|
133
|
-
this.name = "TypeMismatchError";
|
|
134
|
-
this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
|
|
135
|
-
}
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// ../shared/src/errors/targeting-key-missing-error.ts
|
|
139
|
-
var TargetingKeyMissingError = class extends OpenFeatureError {
|
|
140
|
-
constructor(message) {
|
|
141
|
-
super(message);
|
|
142
|
-
Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
|
|
143
|
-
this.name = "TargetingKeyMissingError";
|
|
144
|
-
this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
// ../shared/src/errors/invalid-context-error.ts
|
|
149
|
-
var InvalidContextError = class extends OpenFeatureError {
|
|
150
|
-
constructor(message) {
|
|
151
|
-
super(message);
|
|
152
|
-
Object.setPrototypeOf(this, InvalidContextError.prototype);
|
|
153
|
-
this.name = "InvalidContextError";
|
|
154
|
-
this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
// ../shared/src/provider/provider.ts
|
|
159
|
-
var ProviderStatus = /* @__PURE__ */ ((ProviderStatus2) => {
|
|
160
|
-
ProviderStatus2["NOT_READY"] = "NOT_READY";
|
|
161
|
-
ProviderStatus2["READY"] = "READY";
|
|
162
|
-
ProviderStatus2["ERROR"] = "ERROR";
|
|
163
|
-
ProviderStatus2["STALE"] = "STALE";
|
|
164
|
-
return ProviderStatus2;
|
|
165
|
-
})(ProviderStatus || {});
|
|
166
|
-
|
|
167
|
-
// ../shared/src/events/events.ts
|
|
168
|
-
var ProviderEvents = /* @__PURE__ */ ((ProviderEvents3) => {
|
|
169
|
-
ProviderEvents3["Ready"] = "PROVIDER_READY";
|
|
170
|
-
ProviderEvents3["Error"] = "PROVIDER_ERROR";
|
|
171
|
-
ProviderEvents3["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
|
|
172
|
-
ProviderEvents3["Stale"] = "PROVIDER_STALE";
|
|
173
|
-
return ProviderEvents3;
|
|
174
|
-
})(ProviderEvents || {});
|
|
175
|
-
|
|
176
|
-
// ../shared/src/events/event-utils.ts
|
|
177
|
-
var eventStatusMap = {
|
|
178
|
-
["READY" /* READY */]: "PROVIDER_READY" /* Ready */,
|
|
179
|
-
["ERROR" /* ERROR */]: "PROVIDER_ERROR" /* Error */,
|
|
180
|
-
["STALE" /* STALE */]: "PROVIDER_STALE" /* Stale */,
|
|
181
|
-
["NOT_READY" /* NOT_READY */]: void 0
|
|
182
|
-
};
|
|
183
|
-
var statusMatchesEvent = (event, status) => {
|
|
184
|
-
return !status && event === "PROVIDER_READY" /* Ready */ || eventStatusMap[status] === event;
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
// ../shared/src/events/open-feature-event-emitter.ts
|
|
188
|
-
import EventEmitter from "events";
|
|
189
|
-
|
|
190
|
-
// ../shared/src/logger/default-logger.ts
|
|
191
|
-
var DefaultLogger = class {
|
|
192
|
-
error(...args) {
|
|
193
|
-
console.error(...args);
|
|
194
|
-
}
|
|
195
|
-
warn(...args) {
|
|
196
|
-
console.warn(...args);
|
|
197
|
-
}
|
|
198
|
-
info() {
|
|
199
|
-
}
|
|
200
|
-
debug() {
|
|
201
|
-
}
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
// ../shared/src/logger/safe-logger.ts
|
|
205
|
-
var LOG_LEVELS = ["error", "warn", "info", "debug"];
|
|
206
|
-
var SafeLogger = class {
|
|
207
|
-
constructor(logger) {
|
|
208
|
-
this.fallbackLogger = new DefaultLogger();
|
|
209
|
-
try {
|
|
210
|
-
for (const level of LOG_LEVELS) {
|
|
211
|
-
if (!logger[level] || typeof logger[level] !== "function") {
|
|
212
|
-
throw new Error(`The provided logger is missing the ${level} method.`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
this.logger = logger;
|
|
216
|
-
} catch (err) {
|
|
217
|
-
console.error(err);
|
|
218
|
-
console.error("Falling back to the default logger.");
|
|
219
|
-
this.logger = this.fallbackLogger;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
error(...args) {
|
|
223
|
-
this.log("error", ...args);
|
|
224
|
-
}
|
|
225
|
-
warn(...args) {
|
|
226
|
-
this.log("warn", ...args);
|
|
227
|
-
}
|
|
228
|
-
info(...args) {
|
|
229
|
-
this.log("info", ...args);
|
|
230
|
-
}
|
|
231
|
-
debug(...args) {
|
|
232
|
-
this.log("debug", ...args);
|
|
233
|
-
}
|
|
234
|
-
log(level, ...args) {
|
|
235
|
-
try {
|
|
236
|
-
this.logger[level](...args);
|
|
237
|
-
} catch (error) {
|
|
238
|
-
this.fallbackLogger[level](...args);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
// ../shared/src/events/open-feature-event-emitter.ts
|
|
244
|
-
var GenericEventEmitter = class {
|
|
245
|
-
constructor(globalLogger) {
|
|
246
|
-
this.globalLogger = globalLogger;
|
|
247
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
248
|
-
this._handlers = /* @__PURE__ */ new WeakMap();
|
|
249
|
-
this.eventEmitter = new EventEmitter({ captureRejections: true });
|
|
250
|
-
this.eventEmitter.on("error", (err) => {
|
|
251
|
-
var _a;
|
|
252
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
emit(eventType, context) {
|
|
256
|
-
this.eventEmitter.emit(eventType, context);
|
|
257
|
-
}
|
|
258
|
-
addHandler(eventType, handler) {
|
|
259
|
-
const asyncHandler = (details) => __async(this, null, function* () {
|
|
260
|
-
yield handler(details);
|
|
261
|
-
});
|
|
262
|
-
this._handlers.set(handler, asyncHandler);
|
|
263
|
-
this.eventEmitter.on(eventType, asyncHandler);
|
|
264
|
-
}
|
|
265
|
-
removeHandler(eventType, handler) {
|
|
266
|
-
const asyncHandler = this._handlers.get(handler);
|
|
267
|
-
if (!asyncHandler) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
this.eventEmitter.removeListener(eventType, asyncHandler);
|
|
271
|
-
}
|
|
272
|
-
removeAllHandlers(eventType) {
|
|
273
|
-
if (eventType) {
|
|
274
|
-
this.eventEmitter.removeAllListeners(eventType);
|
|
275
|
-
} else {
|
|
276
|
-
this.eventEmitter.removeAllListeners();
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
getHandlers(eventType) {
|
|
280
|
-
return this.eventEmitter.listeners(eventType);
|
|
281
|
-
}
|
|
282
|
-
setLogger(logger) {
|
|
283
|
-
this._eventLogger = new SafeLogger(logger);
|
|
284
|
-
return this;
|
|
285
|
-
}
|
|
286
|
-
get _logger() {
|
|
287
|
-
var _a, _b;
|
|
288
|
-
return (_b = this._eventLogger) != null ? _b : (_a = this.globalLogger) == null ? void 0 : _a.call(this);
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
var OpenFeatureEventEmitter = class extends GenericEventEmitter {
|
|
292
|
-
};
|
|
293
|
-
var InternalEventEmitter = class extends GenericEventEmitter {
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
// ../shared/src/transaction-context/no-op-transaction-context-propagator.ts
|
|
297
|
-
var NoopTransactionContextPropagator = class {
|
|
298
|
-
getTransactionContext() {
|
|
299
|
-
return {};
|
|
300
|
-
}
|
|
301
|
-
setTransactionContext(_, callback) {
|
|
302
|
-
callback();
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
|
|
306
|
-
|
|
307
|
-
// ../shared/src/type-guards.ts
|
|
308
|
-
function isString(value) {
|
|
309
|
-
return typeof value === "string";
|
|
310
|
-
}
|
|
311
|
-
function stringOrUndefined(value) {
|
|
312
|
-
return isString(value) ? value : void 0;
|
|
313
|
-
}
|
|
314
|
-
function isObject(value) {
|
|
315
|
-
return typeof value === "object";
|
|
316
|
-
}
|
|
317
|
-
function objectOrUndefined(value) {
|
|
318
|
-
return isObject(value) ? value : void 0;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// ../shared/src/filter.ts
|
|
322
|
-
function isDefined(input) {
|
|
323
|
-
return typeof input !== "undefined" && input !== null;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// ../shared/src/open-feature.ts
|
|
327
|
-
var OpenFeatureCommonAPI = class {
|
|
328
|
-
constructor(category) {
|
|
329
|
-
this._hooks = [];
|
|
330
|
-
this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
|
|
331
|
-
this._context = {};
|
|
332
|
-
this._logger = new DefaultLogger();
|
|
333
|
-
this._events = new InternalEventEmitter(() => this._logger);
|
|
334
|
-
this._clientEventHandlers = /* @__PURE__ */ new Map();
|
|
335
|
-
this._clientProviders = /* @__PURE__ */ new Map();
|
|
336
|
-
this._clientEvents = /* @__PURE__ */ new Map();
|
|
337
|
-
this._runsOn = category;
|
|
338
|
-
}
|
|
339
|
-
addHooks(...hooks) {
|
|
340
|
-
this._hooks = [...this._hooks, ...hooks];
|
|
341
|
-
return this;
|
|
342
|
-
}
|
|
343
|
-
getHooks() {
|
|
344
|
-
return this._hooks;
|
|
345
|
-
}
|
|
346
|
-
clearHooks() {
|
|
347
|
-
this._hooks = [];
|
|
348
|
-
return this;
|
|
349
|
-
}
|
|
350
|
-
setLogger(logger) {
|
|
351
|
-
this._logger = new SafeLogger(logger);
|
|
352
|
-
return this;
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Get metadata about registered provider.
|
|
356
|
-
* @returns {ProviderMetadata} Provider Metadata
|
|
357
|
-
*/
|
|
358
|
-
get providerMetadata() {
|
|
359
|
-
return this._defaultProvider.metadata;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Adds a handler for the given provider event type.
|
|
363
|
-
* The handlers are called in the order they have been added.
|
|
364
|
-
* API (global) events run for all providers.
|
|
365
|
-
* @param {ProviderEvents} eventType The provider event type to listen to
|
|
366
|
-
* @param {EventHandler} handler The handler to run on occurrence of the event type
|
|
367
|
-
*/
|
|
368
|
-
addHandler(eventType, handler) {
|
|
369
|
-
[.../* @__PURE__ */ new Map([[void 0, this._defaultProvider]]), ...this._clientProviders].forEach((keyProviderTuple) => {
|
|
370
|
-
var _a;
|
|
371
|
-
const clientName = keyProviderTuple[0];
|
|
372
|
-
const provider = keyProviderTuple[1];
|
|
373
|
-
const shouldRunNow = statusMatchesEvent(eventType, keyProviderTuple[1].status);
|
|
374
|
-
if (shouldRunNow) {
|
|
375
|
-
try {
|
|
376
|
-
handler({ clientName, providerName: provider.metadata.name });
|
|
377
|
-
} catch (err) {
|
|
378
|
-
(_a = this._logger) == null ? void 0 : _a.error("Error running event handler:", err);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
});
|
|
382
|
-
this._events.addHandler(eventType, handler);
|
|
383
|
-
}
|
|
384
|
-
/**
|
|
385
|
-
* Removes a handler for the given provider event type.
|
|
386
|
-
* @param {ProviderEvents} eventType The provider event type to remove the listener for
|
|
387
|
-
* @param {EventHandler} handler The handler to remove for the provider event type
|
|
388
|
-
*/
|
|
389
|
-
removeHandler(eventType, handler) {
|
|
390
|
-
this._events.removeHandler(eventType, handler);
|
|
391
|
-
}
|
|
392
|
-
/**
|
|
393
|
-
* Gets the current handlers for the given provider event type.
|
|
394
|
-
* @param {ProviderEvents} eventType The provider event type to get the current handlers for
|
|
395
|
-
* @returns {EventHandler[]} The handlers currently attached to the given provider event type
|
|
396
|
-
*/
|
|
397
|
-
getHandlers(eventType) {
|
|
398
|
-
return this._events.getHandlers(eventType);
|
|
399
|
-
}
|
|
400
|
-
setProviderAndWait(clientOrProvider, providerOrUndefined) {
|
|
401
|
-
return __async(this, null, function* () {
|
|
402
|
-
yield this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
403
|
-
});
|
|
404
|
-
}
|
|
405
|
-
setProvider(clientOrProvider, providerOrUndefined) {
|
|
406
|
-
const maybePromise = this.setAwaitableProvider(clientOrProvider, providerOrUndefined);
|
|
407
|
-
if (maybePromise) {
|
|
408
|
-
maybePromise.catch(() => {
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
return this;
|
|
412
|
-
}
|
|
413
|
-
setAwaitableProvider(clientOrProvider, providerOrUndefined) {
|
|
414
|
-
var _a, _b, _c, _d, _e, _f;
|
|
415
|
-
const clientName = stringOrUndefined(clientOrProvider);
|
|
416
|
-
const provider = (_a = objectOrUndefined(clientOrProvider)) != null ? _a : objectOrUndefined(providerOrUndefined);
|
|
417
|
-
if (!provider) {
|
|
418
|
-
this._logger.debug("No provider defined, ignoring setProvider call");
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
const oldProvider = this.getProviderForClient(clientName);
|
|
422
|
-
const providerName = provider.metadata.name;
|
|
423
|
-
if (oldProvider === provider) {
|
|
424
|
-
this._logger.debug("Provider is already set, ignoring setProvider call");
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
if (!provider.runsOn) {
|
|
428
|
-
this._logger.debug(`Provider '${provider.metadata.name}' has not defined its intended use.`);
|
|
429
|
-
} else if (provider.runsOn !== this._runsOn) {
|
|
430
|
-
throw new GeneralError(`Provider '${provider.metadata.name}' is intended for use on the ${provider.runsOn}.`);
|
|
431
|
-
}
|
|
432
|
-
const emitters = this.getAssociatedEventEmitters(clientName);
|
|
433
|
-
if (typeof provider.initialize === "function" && provider.status === void 0) {
|
|
434
|
-
const activeLogger = this._logger || console;
|
|
435
|
-
activeLogger.warn(
|
|
436
|
-
`Provider ${providerName} implements 'initialize' but not 'status'. Please implement 'status'.`
|
|
437
|
-
);
|
|
438
|
-
}
|
|
439
|
-
let initializationPromise = void 0;
|
|
440
|
-
if ((provider == null ? void 0 : provider.status) === "NOT_READY" /* NOT_READY */ && typeof provider.initialize === "function") {
|
|
441
|
-
initializationPromise = (_d = (_c = (_b = provider.initialize) == null ? void 0 : _b.call(provider, this._context)) == null ? void 0 : _c.then(() => {
|
|
442
|
-
var _a2;
|
|
443
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
444
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
445
|
-
});
|
|
446
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
447
|
-
})) == null ? void 0 : _d.catch((error) => {
|
|
448
|
-
var _a2;
|
|
449
|
-
this.getAssociatedEventEmitters(clientName).forEach((emitter) => {
|
|
450
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
451
|
-
});
|
|
452
|
-
(_a2 = this._events) == null ? void 0 : _a2.emit("PROVIDER_ERROR" /* Error */, { clientName, providerName, message: error.message });
|
|
453
|
-
throw error;
|
|
454
|
-
});
|
|
455
|
-
} else {
|
|
456
|
-
emitters.forEach((emitter) => {
|
|
457
|
-
emitter == null ? void 0 : emitter.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
458
|
-
});
|
|
459
|
-
(_e = this._events) == null ? void 0 : _e.emit("PROVIDER_READY" /* Ready */, { clientName, providerName });
|
|
460
|
-
}
|
|
461
|
-
if (clientName) {
|
|
462
|
-
this._clientProviders.set(clientName, provider);
|
|
463
|
-
} else {
|
|
464
|
-
this._defaultProvider = provider;
|
|
465
|
-
}
|
|
466
|
-
this.transferListeners(oldProvider, provider, clientName, emitters);
|
|
467
|
-
if (![...this._clientProviders.values(), this._defaultProvider].includes(oldProvider)) {
|
|
468
|
-
(_f = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _f.call(oldProvider);
|
|
469
|
-
}
|
|
470
|
-
return initializationPromise;
|
|
471
|
-
}
|
|
472
|
-
getProviderForClient(name) {
|
|
473
|
-
var _a;
|
|
474
|
-
if (!name) {
|
|
475
|
-
return this._defaultProvider;
|
|
476
|
-
}
|
|
477
|
-
return (_a = this._clientProviders.get(name)) != null ? _a : this._defaultProvider;
|
|
478
|
-
}
|
|
479
|
-
buildAndCacheEventEmitterForClient(name) {
|
|
480
|
-
const emitter = this._clientEvents.get(name);
|
|
481
|
-
if (emitter) {
|
|
482
|
-
return emitter;
|
|
483
|
-
}
|
|
484
|
-
const newEmitter = new InternalEventEmitter(() => this._logger);
|
|
485
|
-
this._clientEvents.set(name, newEmitter);
|
|
486
|
-
const clientProvider = this.getProviderForClient(name);
|
|
487
|
-
Object.values(ProviderEvents).forEach(
|
|
488
|
-
(eventType) => {
|
|
489
|
-
var _a;
|
|
490
|
-
return (_a = clientProvider.events) == null ? void 0 : _a.addHandler(eventType, (details) => __async(this, null, function* () {
|
|
491
|
-
newEmitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName: name, providerName: clientProvider.metadata.name }));
|
|
492
|
-
}));
|
|
493
|
-
}
|
|
494
|
-
);
|
|
495
|
-
return newEmitter;
|
|
496
|
-
}
|
|
497
|
-
getUnboundEmitters() {
|
|
498
|
-
const namedProviders = [...this._clientProviders.keys()];
|
|
499
|
-
const eventEmitterNames = [...this._clientEvents.keys()].filter(isDefined);
|
|
500
|
-
const unboundEmitterNames = eventEmitterNames.filter((name) => !namedProviders.includes(name));
|
|
501
|
-
return [
|
|
502
|
-
// all unbound, named emitters
|
|
503
|
-
...unboundEmitterNames.map((name) => this._clientEvents.get(name)),
|
|
504
|
-
// the default emitter
|
|
505
|
-
this._clientEvents.get(void 0)
|
|
506
|
-
].filter(isDefined);
|
|
507
|
-
}
|
|
508
|
-
getAssociatedEventEmitters(clientName) {
|
|
509
|
-
return clientName ? [this.buildAndCacheEventEmitterForClient(clientName)] : this.getUnboundEmitters();
|
|
510
|
-
}
|
|
511
|
-
transferListeners(oldProvider, newProvider, clientName, emitters) {
|
|
512
|
-
var _a;
|
|
513
|
-
(_a = this._clientEventHandlers.get(clientName)) == null ? void 0 : _a.forEach((eventHandler) => {
|
|
514
|
-
var _a2;
|
|
515
|
-
return (_a2 = oldProvider.events) == null ? void 0 : _a2.removeHandler(...eventHandler);
|
|
516
|
-
});
|
|
517
|
-
const newClientHandlers = Object.values(ProviderEvents).map((eventType) => {
|
|
518
|
-
const handler = (details) => __async(this, null, function* () {
|
|
519
|
-
emitters.forEach((emitter) => {
|
|
520
|
-
emitter == null ? void 0 : emitter.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
521
|
-
});
|
|
522
|
-
this._events.emit(eventType, __spreadProps(__spreadValues({}, details), { clientName, providerName: newProvider.metadata.name }));
|
|
523
|
-
});
|
|
524
|
-
return [eventType, handler];
|
|
525
|
-
});
|
|
526
|
-
this._clientEventHandlers.set(clientName, newClientHandlers);
|
|
527
|
-
newClientHandlers.forEach((eventHandler) => {
|
|
528
|
-
var _a2;
|
|
529
|
-
return (_a2 = newProvider.events) == null ? void 0 : _a2.addHandler(...eventHandler);
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
close() {
|
|
533
|
-
return __async(this, null, function* () {
|
|
534
|
-
var _a, _b;
|
|
535
|
-
try {
|
|
536
|
-
yield (_b = (_a = this == null ? void 0 : this._defaultProvider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
|
|
537
|
-
} catch (err) {
|
|
538
|
-
this.handleShutdownError(this._defaultProvider, err);
|
|
539
|
-
}
|
|
540
|
-
const providers = Array.from(this._clientProviders);
|
|
541
|
-
yield Promise.all(
|
|
542
|
-
providers.map((_0) => __async(this, [_0], function* ([, provider]) {
|
|
543
|
-
var _a2;
|
|
544
|
-
try {
|
|
545
|
-
yield (_a2 = provider.onClose) == null ? void 0 : _a2.call(provider);
|
|
546
|
-
} catch (err) {
|
|
547
|
-
this.handleShutdownError(this._defaultProvider, err);
|
|
548
|
-
}
|
|
549
|
-
}))
|
|
550
|
-
);
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
handleShutdownError(provider, err) {
|
|
554
|
-
this._logger.error(`Error during shutdown of provider ${provider.metadata.name}: ${err}`);
|
|
555
|
-
this._logger.error(err == null ? void 0 : err.stack);
|
|
556
|
-
}
|
|
557
|
-
setTransactionContextPropagator(transactionContextPropagator) {
|
|
558
|
-
const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
|
|
559
|
-
if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
|
|
560
|
-
this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
|
|
561
|
-
} else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
|
|
562
|
-
this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
|
|
563
|
-
} else {
|
|
564
|
-
this._transactionContextPropagator = transactionContextPropagator;
|
|
565
|
-
}
|
|
566
|
-
return this;
|
|
567
|
-
}
|
|
568
|
-
setTransactionContext(transactionContext, callback, ...args) {
|
|
569
|
-
this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
|
|
570
|
-
}
|
|
571
|
-
getTransactionContext() {
|
|
572
|
-
try {
|
|
573
|
-
return this._transactionContextPropagator.getTransactionContext();
|
|
574
|
-
} catch (err) {
|
|
575
|
-
const error = err;
|
|
576
|
-
this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
|
|
577
|
-
this._logger.error(error == null ? void 0 : error.stack);
|
|
578
|
-
return {};
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
};
|
|
41
|
+
// src/client/open-feature-client.ts
|
|
42
|
+
import {
|
|
43
|
+
ErrorCode as ErrorCode2,
|
|
44
|
+
SafeLogger,
|
|
45
|
+
StandardResolutionReasons as StandardResolutionReasons2,
|
|
46
|
+
statusMatchesEvent
|
|
47
|
+
} from "@openfeature/core";
|
|
582
48
|
|
|
583
49
|
// src/provider/no-op-provider.ts
|
|
50
|
+
import { ProviderStatus } from "@openfeature/core";
|
|
584
51
|
var REASON_NO_OP = "No-op";
|
|
585
52
|
var NoopFeatureProvider = class {
|
|
586
53
|
constructor() {
|
|
@@ -589,7 +56,7 @@ var NoopFeatureProvider = class {
|
|
|
589
56
|
};
|
|
590
57
|
}
|
|
591
58
|
get status() {
|
|
592
|
-
return
|
|
59
|
+
return ProviderStatus.NOT_READY;
|
|
593
60
|
}
|
|
594
61
|
resolveBooleanEvaluation(_, defaultValue) {
|
|
595
62
|
return this.noOp(defaultValue);
|
|
@@ -612,13 +79,25 @@ var NoopFeatureProvider = class {
|
|
|
612
79
|
};
|
|
613
80
|
var NOOP_PROVIDER = new NoopFeatureProvider();
|
|
614
81
|
|
|
82
|
+
// src/provider/in-memory-provider/in-memory-provider.ts
|
|
83
|
+
import {
|
|
84
|
+
FlagNotFoundError,
|
|
85
|
+
GeneralError,
|
|
86
|
+
OpenFeatureError as OpenFeatureError2,
|
|
87
|
+
OpenFeatureEventEmitter,
|
|
88
|
+
ProviderEvents,
|
|
89
|
+
StandardResolutionReasons,
|
|
90
|
+
TypeMismatchError
|
|
91
|
+
} from "@openfeature/core";
|
|
92
|
+
|
|
615
93
|
// src/provider/in-memory-provider/variant-not-found-error.ts
|
|
94
|
+
import { ErrorCode, OpenFeatureError } from "@openfeature/core";
|
|
616
95
|
var VariantFoundError = class extends OpenFeatureError {
|
|
617
96
|
constructor(message) {
|
|
618
97
|
super(message);
|
|
619
98
|
Object.setPrototypeOf(this, VariantFoundError.prototype);
|
|
620
99
|
this.name = "VariantFoundError";
|
|
621
|
-
this.code =
|
|
100
|
+
this.code = ErrorCode.GENERAL;
|
|
622
101
|
}
|
|
623
102
|
};
|
|
624
103
|
|
|
@@ -639,7 +118,7 @@ var InMemoryProvider = class {
|
|
|
639
118
|
putConfiguration(flagConfiguration) {
|
|
640
119
|
const flagsChanged = Object.entries(flagConfiguration).filter(([key, value]) => this._flagConfiguration[key] !== value).map(([key]) => key);
|
|
641
120
|
this._flagConfiguration = __spreadValues({}, flagConfiguration);
|
|
642
|
-
this.events.emit(
|
|
121
|
+
this.events.emit(ProviderEvents.ConfigurationChanged, { flagsChanged });
|
|
643
122
|
}
|
|
644
123
|
resolveBooleanEvaluation(flagKey, defaultValue, context, logger) {
|
|
645
124
|
return this.resolveFlagWithReason(flagKey, defaultValue, context, logger);
|
|
@@ -666,7 +145,7 @@ var InMemoryProvider = class {
|
|
|
666
145
|
}
|
|
667
146
|
return resolutionResult;
|
|
668
147
|
} catch (error) {
|
|
669
|
-
if (!(error instanceof
|
|
148
|
+
if (!(error instanceof OpenFeatureError2)) {
|
|
670
149
|
throw new GeneralError((error == null ? void 0 : error.message) || "unknown error");
|
|
671
150
|
}
|
|
672
151
|
throw error;
|
|
@@ -700,13 +179,31 @@ var InMemoryProvider = class {
|
|
|
700
179
|
}
|
|
701
180
|
};
|
|
702
181
|
|
|
182
|
+
// src/open-feature.ts
|
|
183
|
+
import {
|
|
184
|
+
OpenFeatureCommonAPI,
|
|
185
|
+
objectOrUndefined,
|
|
186
|
+
stringOrUndefined
|
|
187
|
+
} from "@openfeature/core";
|
|
188
|
+
|
|
189
|
+
// src/transaction-context/no-op-transaction-context-propagator.ts
|
|
190
|
+
var NoopTransactionContextPropagator = class {
|
|
191
|
+
getTransactionContext() {
|
|
192
|
+
return {};
|
|
193
|
+
}
|
|
194
|
+
setTransactionContext(_, callback) {
|
|
195
|
+
callback();
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
|
|
199
|
+
|
|
703
200
|
// src/open-feature.ts
|
|
704
201
|
var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/js-sdk/api");
|
|
705
202
|
var _globalThis = globalThis;
|
|
706
203
|
var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
707
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
708
204
|
constructor() {
|
|
709
205
|
super("server");
|
|
206
|
+
this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
|
|
710
207
|
this._defaultProvider = NOOP_PROVIDER;
|
|
711
208
|
}
|
|
712
209
|
/**
|
|
@@ -743,6 +240,37 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
|
|
|
743
240
|
context
|
|
744
241
|
);
|
|
745
242
|
}
|
|
243
|
+
/**
|
|
244
|
+
* Clears all registered providers and resets the default provider.
|
|
245
|
+
* @returns {Promise<void>}
|
|
246
|
+
*/
|
|
247
|
+
clearProviders() {
|
|
248
|
+
return super.clearProvidersAndSetDefault(NOOP_PROVIDER);
|
|
249
|
+
}
|
|
250
|
+
setTransactionContextPropagator(transactionContextPropagator) {
|
|
251
|
+
const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
|
|
252
|
+
if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
|
|
253
|
+
this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
|
|
254
|
+
} else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
|
|
255
|
+
this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
|
|
256
|
+
} else {
|
|
257
|
+
this._transactionContextPropagator = transactionContextPropagator;
|
|
258
|
+
}
|
|
259
|
+
return this;
|
|
260
|
+
}
|
|
261
|
+
setTransactionContext(transactionContext, callback, ...args) {
|
|
262
|
+
this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
|
|
263
|
+
}
|
|
264
|
+
getTransactionContext() {
|
|
265
|
+
try {
|
|
266
|
+
return this._transactionContextPropagator.getTransactionContext();
|
|
267
|
+
} catch (err) {
|
|
268
|
+
const error = err;
|
|
269
|
+
this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
|
|
270
|
+
this._logger.error(error == null ? void 0 : error.stack);
|
|
271
|
+
return {};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
746
274
|
};
|
|
747
275
|
var OpenFeature = OpenFeatureAPI.getInstance();
|
|
748
276
|
|
|
@@ -889,13 +417,13 @@ var OpenFeatureClient = class {
|
|
|
889
417
|
return evaluationDetails;
|
|
890
418
|
} catch (err) {
|
|
891
419
|
const errorMessage = err == null ? void 0 : err.message;
|
|
892
|
-
const errorCode = (err == null ? void 0 : err.code) ||
|
|
420
|
+
const errorCode = (err == null ? void 0 : err.code) || ErrorCode2.GENERAL;
|
|
893
421
|
yield this.errorHooks(allHooksReversed, hookContext, err, options);
|
|
894
422
|
return {
|
|
895
423
|
errorCode,
|
|
896
424
|
errorMessage,
|
|
897
425
|
value: defaultValue,
|
|
898
|
-
reason:
|
|
426
|
+
reason: StandardResolutionReasons2.ERROR,
|
|
899
427
|
flagMetadata: Object.freeze({}),
|
|
900
428
|
flagKey
|
|
901
429
|
};
|
|
@@ -961,34 +489,15 @@ var OpenFeatureClient = class {
|
|
|
961
489
|
return this._clientLogger || this.globalLogger();
|
|
962
490
|
}
|
|
963
491
|
};
|
|
492
|
+
|
|
493
|
+
// src/index.ts
|
|
494
|
+
export * from "@openfeature/core";
|
|
964
495
|
export {
|
|
965
|
-
DefaultLogger,
|
|
966
|
-
ErrorCode,
|
|
967
|
-
FlagNotFoundError,
|
|
968
|
-
GeneralError,
|
|
969
496
|
InMemoryProvider,
|
|
970
|
-
InternalEventEmitter,
|
|
971
|
-
InvalidContextError,
|
|
972
|
-
LOG_LEVELS,
|
|
973
497
|
NOOP_PROVIDER,
|
|
974
498
|
NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
|
|
975
499
|
OpenFeature,
|
|
976
500
|
OpenFeatureAPI,
|
|
977
|
-
OpenFeatureClient
|
|
978
|
-
OpenFeatureCommonAPI,
|
|
979
|
-
OpenFeatureError,
|
|
980
|
-
OpenFeatureEventEmitter,
|
|
981
|
-
ParseError,
|
|
982
|
-
ProviderEvents,
|
|
983
|
-
ProviderStatus,
|
|
984
|
-
SafeLogger,
|
|
985
|
-
StandardResolutionReasons,
|
|
986
|
-
TargetingKeyMissingError,
|
|
987
|
-
TypeMismatchError,
|
|
988
|
-
isObject,
|
|
989
|
-
isString,
|
|
990
|
-
objectOrUndefined,
|
|
991
|
-
statusMatchesEvent,
|
|
992
|
-
stringOrUndefined
|
|
501
|
+
OpenFeatureClient
|
|
993
502
|
};
|
|
994
503
|
//# sourceMappingURL=index.js.map
|