@flopflip/http-adapter 14.0.2 → 15.0.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/dist/index.cjs +312 -0
- package/dist/index.cjs.map +1 -0
- package/dist/{declarations/src/adapter/adapter.d.ts → index.d.cts} +6 -2
- package/dist/index.d.ts +27 -0
- package/dist/index.js +312 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -10
- package/dist/declarations/src/adapter/index.d.ts +0 -3
- package/dist/declarations/src/index.d.ts +0 -3
- package/dist/flopflip-http-adapter.cjs.d.ts +0 -3
- package/dist/flopflip-http-adapter.cjs.dev.js +0 -250
- package/dist/flopflip-http-adapter.cjs.js +0 -7
- package/dist/flopflip-http-adapter.cjs.prod.js +0 -250
- package/dist/flopflip-http-adapter.esm.js +0 -239
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __typeError = (msg) => {
|
|
8
|
+
throw TypeError(msg);
|
|
9
|
+
};
|
|
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));
|
|
23
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
24
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
25
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
26
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
27
|
+
var __async = (__this, __arguments, generator) => {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
var fulfilled = (value) => {
|
|
30
|
+
try {
|
|
31
|
+
step(generator.next(value));
|
|
32
|
+
} catch (e) {
|
|
33
|
+
reject(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var rejected = (value) => {
|
|
37
|
+
try {
|
|
38
|
+
step(generator.throw(value));
|
|
39
|
+
} catch (e) {
|
|
40
|
+
reject(e);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
44
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// src/adapter.ts
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
var _adapterutilities = require('@flopflip/adapter-utilities');
|
|
54
|
+
var _cache = require('@flopflip/cache');
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
var _types = require('@flopflip/types');
|
|
62
|
+
var _isEqual = require('lodash/isEqual'); var _isEqual2 = _interopRequireDefault(_isEqual);
|
|
63
|
+
var _mitt = require('mitt'); var _mitt2 = _interopRequireDefault(_mitt);
|
|
64
|
+
var _tinywarning = require('tiny-warning'); var _tinywarning2 = _interopRequireDefault(_tinywarning);
|
|
65
|
+
var intialAdapterState = {
|
|
66
|
+
subscriptionStatus: _types.AdapterSubscriptionStatus.Subscribed,
|
|
67
|
+
configurationStatus: _types.AdapterConfigurationStatus.Unconfigured,
|
|
68
|
+
flags: {},
|
|
69
|
+
lockedFlags: /* @__PURE__ */ new Set(),
|
|
70
|
+
user: {},
|
|
71
|
+
emitter: _mitt2.default.call(void 0, )
|
|
72
|
+
};
|
|
73
|
+
var ___internalConfiguredStatusChange__, _flagPollingInternal, _adapterState, _defaultpollingIntervalMs, _getIsAdapterUnsubscribed, _getIsFlagLocked, _didFlagsChange, _fetchFlags, _subscribeToFlagsChanges;
|
|
74
|
+
var HttpAdapter = class {
|
|
75
|
+
constructor() {
|
|
76
|
+
__privateAdd(this, ___internalConfiguredStatusChange__, "__internalConfiguredStatusChange__");
|
|
77
|
+
__privateAdd(this, _flagPollingInternal);
|
|
78
|
+
__privateAdd(this, _adapterState);
|
|
79
|
+
__privateAdd(this, _defaultpollingIntervalMs, 1e3 * 60);
|
|
80
|
+
__privateAdd(this, _getIsAdapterUnsubscribed, () => __privateGet(this, _adapterState).subscriptionStatus === _types.AdapterSubscriptionStatus.Unsubscribed);
|
|
81
|
+
__privateAdd(this, _getIsFlagLocked, (flagName) => __privateGet(this, _adapterState).lockedFlags.has(flagName));
|
|
82
|
+
__privateAdd(this, _didFlagsChange, (nextFlags) => {
|
|
83
|
+
const previousFlags = __privateGet(this, _adapterState).flags;
|
|
84
|
+
if (previousFlags === void 0) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return !_isEqual2.default.call(void 0, nextFlags, previousFlags);
|
|
88
|
+
});
|
|
89
|
+
__privateAdd(this, _fetchFlags, (adapterArgs) => __async(null, null, function* () {
|
|
90
|
+
const flags = yield adapterArgs.execute(adapterArgs);
|
|
91
|
+
return flags;
|
|
92
|
+
}));
|
|
93
|
+
__privateAdd(this, _subscribeToFlagsChanges, (adapterArgs) => {
|
|
94
|
+
var _a;
|
|
95
|
+
const pollingIntervalMs = (_a = adapterArgs.pollingIntervalMs) != null ? _a : __privateGet(this, _defaultpollingIntervalMs);
|
|
96
|
+
if (__privateGet(this, _flagPollingInternal)) {
|
|
97
|
+
clearInterval(__privateGet(this, _flagPollingInternal));
|
|
98
|
+
}
|
|
99
|
+
__privateSet(this, _flagPollingInternal, setInterval(() => __async(this, null, function* () {
|
|
100
|
+
var _a2;
|
|
101
|
+
if (!__privateGet(this, _getIsAdapterUnsubscribed).call(this)) {
|
|
102
|
+
const nextFlags = _adapterutilities.normalizeFlags.call(void 0, yield __privateGet(this, _fetchFlags).call(this, adapterArgs));
|
|
103
|
+
if (__privateGet(this, _didFlagsChange).call(this, nextFlags)) {
|
|
104
|
+
if (adapterArgs.cacheIdentifier) {
|
|
105
|
+
const cache = yield _cache.getCache.call(void 0,
|
|
106
|
+
adapterArgs.cacheIdentifier,
|
|
107
|
+
_types.adapterIdentifiers.http,
|
|
108
|
+
{ key: (_a2 = __privateGet(this, _adapterState).user) == null ? void 0 : _a2.key }
|
|
109
|
+
);
|
|
110
|
+
cache.set(nextFlags);
|
|
111
|
+
}
|
|
112
|
+
__privateGet(this, _adapterState).flags = nextFlags;
|
|
113
|
+
if (adapterArgs.cacheMode === _types.cacheModes.lazy) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
__privateGet(this, _adapterState).emitter.emit("flagsStateChange", nextFlags);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}), pollingIntervalMs));
|
|
120
|
+
});
|
|
121
|
+
this.getUser = () => __privateGet(this, _adapterState).user;
|
|
122
|
+
this.updateFlags = (flags, options) => {
|
|
123
|
+
const isAdapterConfigured = this.getIsConfigurationStatus(
|
|
124
|
+
_types.AdapterConfigurationStatus.Configured
|
|
125
|
+
);
|
|
126
|
+
_tinywarning2.default.call(void 0,
|
|
127
|
+
isAdapterConfigured,
|
|
128
|
+
"@flopflip/http-adapter: adapter not configured. Flags can not be updated before."
|
|
129
|
+
);
|
|
130
|
+
if (!isAdapterConfigured) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const previousFlags = __privateGet(this, _adapterState).flags;
|
|
134
|
+
const updatedFlags = Object.entries(flags).reduce(
|
|
135
|
+
(updatedFlags2, [flagName, flagValue]) => {
|
|
136
|
+
const [normalizedFlagName, normalizedFlagValue] = _adapterutilities.normalizeFlag.call(void 0,
|
|
137
|
+
flagName,
|
|
138
|
+
flagValue
|
|
139
|
+
);
|
|
140
|
+
if (__privateGet(this, _getIsFlagLocked).call(this, normalizedFlagName)) {
|
|
141
|
+
return updatedFlags2;
|
|
142
|
+
}
|
|
143
|
+
if (options == null ? void 0 : options.lockFlags) {
|
|
144
|
+
__privateGet(this, _adapterState).lockedFlags.add(normalizedFlagName);
|
|
145
|
+
}
|
|
146
|
+
const updated = __spreadProps(__spreadValues({}, updatedFlags2), {
|
|
147
|
+
[normalizedFlagName]: normalizedFlagValue
|
|
148
|
+
});
|
|
149
|
+
return updated;
|
|
150
|
+
},
|
|
151
|
+
{}
|
|
152
|
+
);
|
|
153
|
+
const nextFlags = __spreadValues(__spreadValues({}, previousFlags), updatedFlags);
|
|
154
|
+
__privateGet(this, _adapterState).flags = nextFlags;
|
|
155
|
+
__privateGet(this, _adapterState).emitter.emit("flagsStateChange", nextFlags);
|
|
156
|
+
};
|
|
157
|
+
this.reset = () => {
|
|
158
|
+
__privateSet(this, _adapterState, __spreadValues({}, intialAdapterState));
|
|
159
|
+
};
|
|
160
|
+
this.unsubscribe = () => {
|
|
161
|
+
__privateGet(this, _adapterState).subscriptionStatus = _types.AdapterSubscriptionStatus.Unsubscribed;
|
|
162
|
+
};
|
|
163
|
+
this.subscribe = () => {
|
|
164
|
+
__privateGet(this, _adapterState).subscriptionStatus = _types.AdapterSubscriptionStatus.Subscribed;
|
|
165
|
+
};
|
|
166
|
+
this.id = _types.adapterIdentifiers.http;
|
|
167
|
+
__privateSet(this, _adapterState, __spreadValues({}, intialAdapterState));
|
|
168
|
+
}
|
|
169
|
+
configure(adapterArgs, adapterEventHandlers) {
|
|
170
|
+
return __async(this, null, function* () {
|
|
171
|
+
const handleFlagsChange = (nextFlags) => {
|
|
172
|
+
if (__privateGet(this, _getIsAdapterUnsubscribed).call(this)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
adapterEventHandlers.onFlagsStateChange({
|
|
176
|
+
flags: nextFlags,
|
|
177
|
+
id: this.id
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const handleStatusChange = (nextStatus) => {
|
|
181
|
+
if (__privateGet(this, _getIsAdapterUnsubscribed).call(this)) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
adapterEventHandlers.onStatusStateChange({
|
|
185
|
+
status: nextStatus,
|
|
186
|
+
id: this.id
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
__privateGet(this, _adapterState).emitter.on("flagsStateChange", handleFlagsChange);
|
|
190
|
+
__privateGet(this, _adapterState).emitter.on("statusStateChange", handleStatusChange);
|
|
191
|
+
this.setConfigurationStatus(_types.AdapterConfigurationStatus.Configuring);
|
|
192
|
+
__privateGet(this, _adapterState).user = adapterArgs.user;
|
|
193
|
+
return Promise.resolve().then(() => __async(this, null, function* () {
|
|
194
|
+
var _a, _b;
|
|
195
|
+
let cachedFlags = null;
|
|
196
|
+
if (adapterArgs.cacheIdentifier) {
|
|
197
|
+
const cache = yield _cache.getCache.call(void 0,
|
|
198
|
+
adapterArgs.cacheIdentifier,
|
|
199
|
+
_types.adapterIdentifiers.http,
|
|
200
|
+
{ key: (_a = __privateGet(this, _adapterState).user) == null ? void 0 : _a.key }
|
|
201
|
+
);
|
|
202
|
+
cachedFlags = cache.get();
|
|
203
|
+
if (cachedFlags) {
|
|
204
|
+
__privateGet(this, _adapterState).flags = cachedFlags;
|
|
205
|
+
__privateGet(this, _adapterState).emitter.emit(
|
|
206
|
+
"flagsStateChange",
|
|
207
|
+
cachedFlags
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const flags = _adapterutilities.normalizeFlags.call(void 0, yield __privateGet(this, _fetchFlags).call(this, adapterArgs));
|
|
212
|
+
__privateGet(this, _adapterState).flags = flags;
|
|
213
|
+
this.setConfigurationStatus(_types.AdapterConfigurationStatus.Configured);
|
|
214
|
+
if (adapterArgs.cacheIdentifier) {
|
|
215
|
+
const cache = yield _cache.getCache.call(void 0,
|
|
216
|
+
adapterArgs.cacheIdentifier,
|
|
217
|
+
_types.adapterIdentifiers.http,
|
|
218
|
+
{ key: (_b = __privateGet(this, _adapterState).user) == null ? void 0 : _b.key }
|
|
219
|
+
);
|
|
220
|
+
cache.set(flags);
|
|
221
|
+
}
|
|
222
|
+
if (adapterArgs.cacheMode !== _types.cacheModes.lazy) {
|
|
223
|
+
__privateGet(this, _adapterState).emitter.emit("flagsStateChange", flags);
|
|
224
|
+
}
|
|
225
|
+
__privateGet(this, _adapterState).emitter.emit(__privateGet(this, ___internalConfiguredStatusChange__));
|
|
226
|
+
__privateGet(this, _subscribeToFlagsChanges).call(this, adapterArgs);
|
|
227
|
+
return {
|
|
228
|
+
initializationStatus: _types.AdapterInitializationStatus.Succeeded
|
|
229
|
+
};
|
|
230
|
+
}));
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
reconfigure(adapterArgs, _adapterEventHandlers) {
|
|
234
|
+
return __async(this, null, function* () {
|
|
235
|
+
var _a;
|
|
236
|
+
if (!this.getIsConfigurationStatus(_types.AdapterConfigurationStatus.Configured)) {
|
|
237
|
+
return Promise.reject(
|
|
238
|
+
new Error(
|
|
239
|
+
"@flopflip/http-adapter: please configure adapter before reconfiguring."
|
|
240
|
+
)
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
const nextUser = adapterArgs.user;
|
|
244
|
+
if (!_isEqual2.default.call(void 0, __privateGet(this, _adapterState).user, nextUser)) {
|
|
245
|
+
__privateGet(this, _adapterState).flags = {};
|
|
246
|
+
if (adapterArgs.cacheIdentifier) {
|
|
247
|
+
const cache = yield _cache.getCache.call(void 0,
|
|
248
|
+
adapterArgs.cacheIdentifier,
|
|
249
|
+
_types.adapterIdentifiers.http,
|
|
250
|
+
{ key: (_a = __privateGet(this, _adapterState).user) == null ? void 0 : _a.key }
|
|
251
|
+
);
|
|
252
|
+
cache.unset();
|
|
253
|
+
}
|
|
254
|
+
__privateGet(this, _adapterState).user = nextUser;
|
|
255
|
+
const flags = _adapterutilities.normalizeFlags.call(void 0, yield __privateGet(this, _fetchFlags).call(this, adapterArgs));
|
|
256
|
+
__privateGet(this, _adapterState).flags = flags;
|
|
257
|
+
__privateGet(this, _adapterState).emitter.emit("flagsStateChange", flags);
|
|
258
|
+
__privateGet(this, _adapterState).emitter.emit(__privateGet(this, ___internalConfiguredStatusChange__));
|
|
259
|
+
__privateGet(this, _subscribeToFlagsChanges).call(this, adapterArgs);
|
|
260
|
+
}
|
|
261
|
+
return Promise.resolve({
|
|
262
|
+
initializationStatus: _types.AdapterInitializationStatus.Succeeded
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
waitUntilConfigured() {
|
|
267
|
+
return __async(this, null, function* () {
|
|
268
|
+
return new Promise((resolve) => {
|
|
269
|
+
if (this.getIsConfigurationStatus(_types.AdapterConfigurationStatus.Configured)) {
|
|
270
|
+
resolve();
|
|
271
|
+
} else {
|
|
272
|
+
__privateGet(this, _adapterState).emitter.on(
|
|
273
|
+
__privateGet(this, ___internalConfiguredStatusChange__),
|
|
274
|
+
resolve
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
getIsConfigurationStatus(configurationStatus) {
|
|
281
|
+
return __privateGet(this, _adapterState).configurationStatus === configurationStatus;
|
|
282
|
+
}
|
|
283
|
+
getFlag(flagName) {
|
|
284
|
+
var _a;
|
|
285
|
+
return (_a = __privateGet(this, _adapterState)) == null ? void 0 : _a.flags[flagName];
|
|
286
|
+
}
|
|
287
|
+
setConfigurationStatus(nextConfigurationStatus) {
|
|
288
|
+
__privateGet(this, _adapterState).configurationStatus = nextConfigurationStatus;
|
|
289
|
+
__privateGet(this, _adapterState).emitter.emit("statusStateChange", {
|
|
290
|
+
configurationStatus: __privateGet(this, _adapterState).configurationStatus
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
___internalConfiguredStatusChange__ = new WeakMap();
|
|
295
|
+
_flagPollingInternal = new WeakMap();
|
|
296
|
+
_adapterState = new WeakMap();
|
|
297
|
+
_defaultpollingIntervalMs = new WeakMap();
|
|
298
|
+
_getIsAdapterUnsubscribed = new WeakMap();
|
|
299
|
+
_getIsFlagLocked = new WeakMap();
|
|
300
|
+
_didFlagsChange = new WeakMap();
|
|
301
|
+
_fetchFlags = new WeakMap();
|
|
302
|
+
_subscribeToFlagsChanges = new WeakMap();
|
|
303
|
+
var adapter = new HttpAdapter();
|
|
304
|
+
_adapterutilities.exposeGlobally.call(void 0, adapter);
|
|
305
|
+
|
|
306
|
+
// src/index.ts
|
|
307
|
+
var version = "__@FLOPFLIP/VERSION_OF_RELEASE__";
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
exports.adapter = adapter; exports.version = version;
|
|
312
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/flopflip/flopflip/packages/http-adapter/dist/index.cjs","../src/adapter.ts","../src/index.ts"],"names":["_a","updatedFlags"],"mappings":"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","file":"/home/runner/work/flopflip/flopflip/packages/http-adapter/dist/index.cjs","sourcesContent":[null,"import {\n exposeGlobally,\n normalizeFlag,\n normalizeFlags,\n} from '@flopflip/adapter-utilities';\nimport { getCache } from '@flopflip/cache';\nimport {\n AdapterConfigurationStatus,\n AdapterInitializationStatus,\n AdapterSubscriptionStatus,\n type TAdapterEventHandlers,\n type TAdapterStatus,\n type TAdapterStatusChange,\n type TCacheIdentifiers,\n type TFlagName,\n type TFlagVariation,\n type TFlags,\n type TFlagsChange,\n type TFlagsUpdateFunction,\n type THttpAdapterArgs,\n type THttpAdapterInterface,\n type TUser,\n adapterIdentifiers,\n cacheModes,\n} from '@flopflip/types';\nimport isEqual from 'lodash/isEqual';\nimport mitt, { type Emitter } from 'mitt';\nimport warning from 'tiny-warning';\n\ntype TInternalStatusChange = '__internalConfiguredStatusChange__';\ntype TEmitterEvents = {\n __internalConfiguredStatusChange__: undefined;\n flagsStateChange: TFlags;\n statusStateChange: Partial<TAdapterStatus>;\n};\ntype THttpAdapterState = {\n flags: TFlags;\n user?: TUser;\n emitter: Emitter<TEmitterEvents>;\n lockedFlags: Set<TFlagName>;\n cacheIdentifier?: TCacheIdentifiers;\n};\n\nconst intialAdapterState: TAdapterStatus & THttpAdapterState = {\n subscriptionStatus: AdapterSubscriptionStatus.Subscribed,\n configurationStatus: AdapterConfigurationStatus.Unconfigured,\n flags: {},\n lockedFlags: new Set<TFlagName>(),\n user: {},\n emitter: mitt(),\n};\n\nclass HttpAdapter implements THttpAdapterInterface {\n id: typeof adapterIdentifiers.http;\n #__internalConfiguredStatusChange__: TInternalStatusChange =\n '__internalConfiguredStatusChange__';\n\n #flagPollingInternal?: ReturnType<typeof setInterval>;\n #adapterState: TAdapterStatus & THttpAdapterState;\n readonly #defaultpollingIntervalMs = 1000 * 60;\n\n constructor() {\n this.id = adapterIdentifiers.http;\n this.#adapterState = {\n ...intialAdapterState,\n };\n }\n\n readonly #getIsAdapterUnsubscribed = () =>\n this.#adapterState.subscriptionStatus ===\n AdapterSubscriptionStatus.Unsubscribed;\n\n readonly #getIsFlagLocked = (flagName: TFlagName) =>\n this.#adapterState.lockedFlags.has(flagName);\n\n readonly #didFlagsChange = (nextFlags: TFlags) => {\n const previousFlags = this.#adapterState.flags;\n\n if (previousFlags === undefined) {\n return true;\n }\n\n return !isEqual(nextFlags, previousFlags);\n };\n\n readonly #fetchFlags = async (\n adapterArgs: THttpAdapterArgs\n ): Promise<TFlags> => {\n const flags = await adapterArgs.execute(adapterArgs);\n\n return flags;\n };\n\n readonly #subscribeToFlagsChanges = (adapterArgs: THttpAdapterArgs) => {\n const pollingIntervalMs =\n adapterArgs.pollingIntervalMs ?? this.#defaultpollingIntervalMs;\n\n if (this.#flagPollingInternal) {\n clearInterval(this.#flagPollingInternal);\n }\n\n this.#flagPollingInternal = setInterval(async () => {\n if (!this.#getIsAdapterUnsubscribed()) {\n const nextFlags = normalizeFlags(await this.#fetchFlags(adapterArgs));\n\n if (this.#didFlagsChange(nextFlags)) {\n if (adapterArgs.cacheIdentifier) {\n const cache = await getCache(\n adapterArgs.cacheIdentifier,\n adapterIdentifiers.http,\n { key: this.#adapterState.user?.key }\n );\n\n cache.set(nextFlags);\n }\n\n this.#adapterState.flags = nextFlags;\n\n if (adapterArgs.cacheMode === cacheModes.lazy) {\n return;\n }\n\n this.#adapterState.emitter.emit('flagsStateChange', nextFlags);\n }\n }\n }, pollingIntervalMs);\n };\n\n getUser = () => this.#adapterState.user;\n\n updateFlags: TFlagsUpdateFunction = (flags, options) => {\n const isAdapterConfigured = this.getIsConfigurationStatus(\n AdapterConfigurationStatus.Configured\n );\n\n warning(\n isAdapterConfigured,\n '@flopflip/http-adapter: adapter not configured. Flags can not be updated before.'\n );\n\n if (!isAdapterConfigured) {\n return;\n }\n\n const previousFlags: TFlags | undefined = this.#adapterState.flags;\n\n const updatedFlags = Object.entries(flags).reduce(\n (updatedFlags, [flagName, flagValue]) => {\n const [normalizedFlagName, normalizedFlagValue] = normalizeFlag(\n flagName,\n flagValue\n );\n\n if (this.#getIsFlagLocked(normalizedFlagName)) {\n return updatedFlags;\n }\n\n if (options?.lockFlags) {\n this.#adapterState.lockedFlags.add(normalizedFlagName);\n }\n\n const updated = {\n ...updatedFlags,\n [normalizedFlagName]: normalizedFlagValue,\n };\n\n return updated;\n },\n {}\n );\n\n const nextFlags: TFlags = {\n ...previousFlags,\n ...updatedFlags,\n };\n\n this.#adapterState.flags = nextFlags;\n this.#adapterState.emitter.emit('flagsStateChange', nextFlags);\n };\n\n async configure(\n adapterArgs: THttpAdapterArgs,\n adapterEventHandlers: TAdapterEventHandlers\n ) {\n const handleFlagsChange = (nextFlags: TFlagsChange['flags']) => {\n if (this.#getIsAdapterUnsubscribed()) {\n return;\n }\n\n adapterEventHandlers.onFlagsStateChange({\n flags: nextFlags,\n id: this.id,\n });\n };\n\n const handleStatusChange = (nextStatus: TAdapterStatusChange['status']) => {\n if (this.#getIsAdapterUnsubscribed()) {\n return;\n }\n\n adapterEventHandlers.onStatusStateChange({\n status: nextStatus,\n id: this.id,\n });\n };\n\n this.#adapterState.emitter.on('flagsStateChange', handleFlagsChange);\n this.#adapterState.emitter.on('statusStateChange', handleStatusChange);\n\n this.setConfigurationStatus(AdapterConfigurationStatus.Configuring);\n\n this.#adapterState.user = adapterArgs.user;\n\n return Promise.resolve().then(async () => {\n let cachedFlags = null;\n\n if (adapterArgs.cacheIdentifier) {\n const cache = await getCache(\n adapterArgs.cacheIdentifier,\n adapterIdentifiers.http,\n { key: this.#adapterState.user?.key }\n );\n\n cachedFlags = cache.get();\n\n if (cachedFlags) {\n this.#adapterState.flags = cachedFlags;\n this.#adapterState.emitter.emit(\n 'flagsStateChange',\n cachedFlags as TFlags\n );\n }\n }\n\n const flags = normalizeFlags(await this.#fetchFlags(adapterArgs));\n\n this.#adapterState.flags = flags;\n\n this.setConfigurationStatus(AdapterConfigurationStatus.Configured);\n\n if (adapterArgs.cacheIdentifier) {\n const cache = await getCache(\n adapterArgs.cacheIdentifier,\n adapterIdentifiers.http,\n { key: this.#adapterState.user?.key }\n );\n\n cache.set(flags);\n }\n\n if (adapterArgs.cacheMode !== cacheModes.lazy) {\n this.#adapterState.emitter.emit('flagsStateChange', flags);\n }\n\n this.#adapterState.emitter.emit(this.#__internalConfiguredStatusChange__);\n\n this.#subscribeToFlagsChanges(adapterArgs);\n\n return {\n initializationStatus: AdapterInitializationStatus.Succeeded,\n };\n });\n }\n\n async reconfigure(\n adapterArgs: THttpAdapterArgs,\n _adapterEventHandlers: TAdapterEventHandlers\n ) {\n if (!this.getIsConfigurationStatus(AdapterConfigurationStatus.Configured)) {\n return Promise.reject(\n new Error(\n '@flopflip/http-adapter: please configure adapter before reconfiguring.'\n )\n );\n }\n\n const nextUser = adapterArgs.user;\n\n if (!isEqual(this.#adapterState.user, nextUser)) {\n this.#adapterState.flags = {};\n\n if (adapterArgs.cacheIdentifier) {\n const cache = await getCache(\n adapterArgs.cacheIdentifier,\n adapterIdentifiers.http,\n { key: this.#adapterState.user?.key }\n );\n\n cache.unset();\n }\n\n this.#adapterState.user = nextUser;\n\n const flags = normalizeFlags(await this.#fetchFlags(adapterArgs));\n\n this.#adapterState.flags = flags;\n\n this.#adapterState.emitter.emit('flagsStateChange', flags);\n\n this.#adapterState.emitter.emit(this.#__internalConfiguredStatusChange__);\n\n this.#subscribeToFlagsChanges(adapterArgs);\n }\n\n return Promise.resolve({\n initializationStatus: AdapterInitializationStatus.Succeeded,\n });\n }\n\n async waitUntilConfigured() {\n return new Promise<void>((resolve) => {\n if (\n this.getIsConfigurationStatus(AdapterConfigurationStatus.Configured)\n ) {\n resolve();\n } else {\n this.#adapterState.emitter.on(\n this.#__internalConfiguredStatusChange__,\n resolve\n );\n }\n });\n }\n\n getIsConfigurationStatus(configurationStatus: AdapterConfigurationStatus) {\n return this.#adapterState.configurationStatus === configurationStatus;\n }\n\n getFlag(flagName: TFlagName): TFlagVariation {\n return this.#adapterState?.flags[flagName];\n }\n\n reset = () => {\n this.#adapterState = {\n ...intialAdapterState,\n };\n };\n\n setConfigurationStatus(nextConfigurationStatus: AdapterConfigurationStatus) {\n this.#adapterState.configurationStatus = nextConfigurationStatus;\n\n this.#adapterState.emitter.emit('statusStateChange', {\n configurationStatus: this.#adapterState.configurationStatus,\n });\n }\n\n unsubscribe = () => {\n this.#adapterState.subscriptionStatus =\n AdapterSubscriptionStatus.Unsubscribed;\n };\n\n subscribe = () => {\n this.#adapterState.subscriptionStatus =\n AdapterSubscriptionStatus.Subscribed;\n };\n}\n\nconst adapter = new HttpAdapter();\n\nexposeGlobally(adapter);\n\nexport { adapter };\n","const version = '__@FLOPFLIP/VERSION_OF_RELEASE__';\n\nexport { adapter } from './adapter';\nexport { version };\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { THttpAdapterInterface, adapterIdentifiers, TUser, TFlagsUpdateFunction, THttpAdapterArgs, TAdapterEventHandlers, AdapterInitializationStatus, AdapterConfigurationStatus, TFlagName, TFlagVariation } from '@flopflip/types';
|
|
2
|
+
|
|
2
3
|
declare class HttpAdapter implements THttpAdapterInterface {
|
|
3
4
|
#private;
|
|
4
5
|
id: typeof adapterIdentifiers.http;
|
|
@@ -20,4 +21,7 @@ declare class HttpAdapter implements THttpAdapterInterface {
|
|
|
20
21
|
subscribe: () => void;
|
|
21
22
|
}
|
|
22
23
|
declare const adapter: HttpAdapter;
|
|
23
|
-
|
|
24
|
+
|
|
25
|
+
declare const version = "__@FLOPFLIP/VERSION_OF_RELEASE__";
|
|
26
|
+
|
|
27
|
+
export { adapter, version };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { THttpAdapterInterface, adapterIdentifiers, TUser, TFlagsUpdateFunction, THttpAdapterArgs, TAdapterEventHandlers, AdapterInitializationStatus, AdapterConfigurationStatus, TFlagName, TFlagVariation } from '@flopflip/types';
|
|
2
|
+
|
|
3
|
+
declare class HttpAdapter implements THttpAdapterInterface {
|
|
4
|
+
#private;
|
|
5
|
+
id: typeof adapterIdentifiers.http;
|
|
6
|
+
constructor();
|
|
7
|
+
getUser: () => TUser | undefined;
|
|
8
|
+
updateFlags: TFlagsUpdateFunction;
|
|
9
|
+
configure(adapterArgs: THttpAdapterArgs, adapterEventHandlers: TAdapterEventHandlers): Promise<{
|
|
10
|
+
initializationStatus: AdapterInitializationStatus;
|
|
11
|
+
}>;
|
|
12
|
+
reconfigure(adapterArgs: THttpAdapterArgs, _adapterEventHandlers: TAdapterEventHandlers): Promise<{
|
|
13
|
+
initializationStatus: AdapterInitializationStatus;
|
|
14
|
+
}>;
|
|
15
|
+
waitUntilConfigured(): Promise<void>;
|
|
16
|
+
getIsConfigurationStatus(configurationStatus: AdapterConfigurationStatus): boolean;
|
|
17
|
+
getFlag(flagName: TFlagName): TFlagVariation;
|
|
18
|
+
reset: () => void;
|
|
19
|
+
setConfigurationStatus(nextConfigurationStatus: AdapterConfigurationStatus): void;
|
|
20
|
+
unsubscribe: () => void;
|
|
21
|
+
subscribe: () => void;
|
|
22
|
+
}
|
|
23
|
+
declare const adapter: HttpAdapter;
|
|
24
|
+
|
|
25
|
+
declare const version = "__@FLOPFLIP/VERSION_OF_RELEASE__";
|
|
26
|
+
|
|
27
|
+
export { adapter, version };
|