@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.js
ADDED
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
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
|
+
import {
|
|
50
|
+
exposeGlobally,
|
|
51
|
+
normalizeFlag,
|
|
52
|
+
normalizeFlags
|
|
53
|
+
} from "@flopflip/adapter-utilities";
|
|
54
|
+
import { getCache } from "@flopflip/cache";
|
|
55
|
+
import {
|
|
56
|
+
AdapterConfigurationStatus,
|
|
57
|
+
AdapterInitializationStatus,
|
|
58
|
+
AdapterSubscriptionStatus,
|
|
59
|
+
adapterIdentifiers,
|
|
60
|
+
cacheModes
|
|
61
|
+
} from "@flopflip/types";
|
|
62
|
+
import isEqual from "lodash/isEqual";
|
|
63
|
+
import mitt from "mitt";
|
|
64
|
+
import warning from "tiny-warning";
|
|
65
|
+
var intialAdapterState = {
|
|
66
|
+
subscriptionStatus: AdapterSubscriptionStatus.Subscribed,
|
|
67
|
+
configurationStatus: AdapterConfigurationStatus.Unconfigured,
|
|
68
|
+
flags: {},
|
|
69
|
+
lockedFlags: /* @__PURE__ */ new Set(),
|
|
70
|
+
user: {},
|
|
71
|
+
emitter: mitt()
|
|
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 === 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 !isEqual(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 = normalizeFlags(yield __privateGet(this, _fetchFlags).call(this, adapterArgs));
|
|
103
|
+
if (__privateGet(this, _didFlagsChange).call(this, nextFlags)) {
|
|
104
|
+
if (adapterArgs.cacheIdentifier) {
|
|
105
|
+
const cache = yield getCache(
|
|
106
|
+
adapterArgs.cacheIdentifier,
|
|
107
|
+
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 === 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
|
+
AdapterConfigurationStatus.Configured
|
|
125
|
+
);
|
|
126
|
+
warning(
|
|
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] = normalizeFlag(
|
|
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 = AdapterSubscriptionStatus.Unsubscribed;
|
|
162
|
+
};
|
|
163
|
+
this.subscribe = () => {
|
|
164
|
+
__privateGet(this, _adapterState).subscriptionStatus = AdapterSubscriptionStatus.Subscribed;
|
|
165
|
+
};
|
|
166
|
+
this.id = 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(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 getCache(
|
|
198
|
+
adapterArgs.cacheIdentifier,
|
|
199
|
+
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 = normalizeFlags(yield __privateGet(this, _fetchFlags).call(this, adapterArgs));
|
|
212
|
+
__privateGet(this, _adapterState).flags = flags;
|
|
213
|
+
this.setConfigurationStatus(AdapterConfigurationStatus.Configured);
|
|
214
|
+
if (adapterArgs.cacheIdentifier) {
|
|
215
|
+
const cache = yield getCache(
|
|
216
|
+
adapterArgs.cacheIdentifier,
|
|
217
|
+
adapterIdentifiers.http,
|
|
218
|
+
{ key: (_b = __privateGet(this, _adapterState).user) == null ? void 0 : _b.key }
|
|
219
|
+
);
|
|
220
|
+
cache.set(flags);
|
|
221
|
+
}
|
|
222
|
+
if (adapterArgs.cacheMode !== 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: AdapterInitializationStatus.Succeeded
|
|
229
|
+
};
|
|
230
|
+
}));
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
reconfigure(adapterArgs, _adapterEventHandlers) {
|
|
234
|
+
return __async(this, null, function* () {
|
|
235
|
+
var _a;
|
|
236
|
+
if (!this.getIsConfigurationStatus(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 (!isEqual(__privateGet(this, _adapterState).user, nextUser)) {
|
|
245
|
+
__privateGet(this, _adapterState).flags = {};
|
|
246
|
+
if (adapterArgs.cacheIdentifier) {
|
|
247
|
+
const cache = yield getCache(
|
|
248
|
+
adapterArgs.cacheIdentifier,
|
|
249
|
+
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 = normalizeFlags(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: AdapterInitializationStatus.Succeeded
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
waitUntilConfigured() {
|
|
267
|
+
return __async(this, null, function* () {
|
|
268
|
+
return new Promise((resolve) => {
|
|
269
|
+
if (this.getIsConfigurationStatus(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
|
+
exposeGlobally(adapter);
|
|
305
|
+
|
|
306
|
+
// src/index.ts
|
|
307
|
+
var version = "__@FLOPFLIP/VERSION_OF_RELEASE__";
|
|
308
|
+
export {
|
|
309
|
+
adapter,
|
|
310
|
+
version
|
|
311
|
+
};
|
|
312
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapter.ts","../src/index.ts"],"sourcesContent":["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"],"mappings":"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","names":["_a","updatedFlags"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flopflip/http-adapter",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "15.0.1",
|
|
4
4
|
"description": "An HTTP adapter for flipflop",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"sideEffects": false,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"import": "./dist/index.js",
|
|
10
|
+
"require": "./dist/index.cjs"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"typesVersions": {
|
|
15
|
+
"*": {
|
|
16
|
+
".": [
|
|
17
|
+
"dist/*.d.ts",
|
|
18
|
+
"dist/*.d.cts"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
},
|
|
7
22
|
"files": [
|
|
8
23
|
"readme.md",
|
|
9
24
|
"dist/**"
|
|
@@ -29,17 +44,26 @@
|
|
|
29
44
|
"client"
|
|
30
45
|
],
|
|
31
46
|
"dependencies": {
|
|
32
|
-
"@babel/runtime": "7.
|
|
47
|
+
"@babel/runtime": "7.27.4",
|
|
33
48
|
"lodash": "4.17.21",
|
|
34
49
|
"mitt": "3.0.1",
|
|
35
50
|
"tiny-warning": "1.0.3",
|
|
36
|
-
"@flopflip/adapter-utilities": "
|
|
37
|
-
"@flopflip/cache": "
|
|
38
|
-
"@flopflip/localstorage-cache": "
|
|
39
|
-
"@flopflip/sessionstorage-cache": "
|
|
40
|
-
"@flopflip/types": "
|
|
51
|
+
"@flopflip/adapter-utilities": "15.0.1",
|
|
52
|
+
"@flopflip/cache": "15.0.1",
|
|
53
|
+
"@flopflip/localstorage-cache": "15.0.1",
|
|
54
|
+
"@flopflip/sessionstorage-cache": "15.0.1",
|
|
55
|
+
"@flopflip/types": "15.0.1"
|
|
41
56
|
},
|
|
42
57
|
"devDependencies": {
|
|
43
|
-
"globalthis": "1.0.4"
|
|
58
|
+
"globalthis": "1.0.4",
|
|
59
|
+
"tsup": "8.5.0",
|
|
60
|
+
"@flopflip/tsconfig": "15.0.1"
|
|
61
|
+
},
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "rimraf dist && tsup",
|
|
64
|
+
"check-types": "tsc --noEmit",
|
|
65
|
+
"test": "vitest --run",
|
|
66
|
+
"test:watch": "vitest",
|
|
67
|
+
"dev": "tsup --watch --clean=false"
|
|
44
68
|
}
|
|
45
69
|
}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from "./declarations/src/index";
|
|
2
|
-
export { default } from "./declarations/src/index";
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvcGZsaXAtaHR0cC1hZGFwdGVyLmNqcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi9kZWNsYXJhdGlvbnMvc3JjL2luZGV4LmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEifQ==
|