unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
77 lines • 2.65 kB
JavaScript
export class FakeUnknownFlagsStore {
constructor() {
this.unknownFlagMap = new Map();
}
getKey(flag) {
return `${flag.name}:${flag.appName}:${flag.environment}`;
}
async insert(flags) {
this.unknownFlagMap.clear();
for (const flag of flags) {
this.unknownFlagMap.set(this.getKey(flag), flag);
}
}
groupFlags(flags) {
const byName = new Map();
for (const f of flags) {
const apps = byName.get(f.name) ?? new Map();
const envs = apps.get(f.appName) ?? new Map();
const prev = envs.get(f.environment);
if (!prev || f.lastSeenAt > prev)
envs.set(f.environment, f.lastSeenAt);
apps.set(f.appName, envs);
byName.set(f.name, apps);
}
const out = [];
for (const [name, appsMap] of byName) {
let lastSeenAt = null;
const reports = Array.from(appsMap.entries()).map(([appName, envMap]) => {
const environments = Array.from(envMap.entries()).map(([environment, seenAt]) => {
if (!lastSeenAt || seenAt > lastSeenAt)
lastSeenAt = seenAt;
return { environment, seenAt };
});
return { appName, environments };
});
out.push({
name,
lastSeenAt: lastSeenAt ?? new Date(0),
reports,
});
}
return out;
}
async getAll({ limit, orderBy } = {}) {
const flat = Array.from(this.unknownFlagMap.values());
const flags = this.groupFlags(flat);
if (orderBy) {
flags.sort((a, b) => {
for (const { column, order } of orderBy) {
if (a[column] < b[column])
return order === 'asc' ? -1 : 1;
if (a[column] > b[column])
return order === 'asc' ? 1 : -1;
}
return 0;
});
}
if (!limit)
return flags;
return flags.slice(0, limit);
}
async clear(hoursAgo) {
const cutoff = Date.now() - hoursAgo * 60 * 60 * 1000;
for (const [key, flag] of this.unknownFlagMap.entries()) {
if (flag.lastSeenAt.getTime() < cutoff) {
this.unknownFlagMap.delete(key);
}
}
}
async deleteAll() {
this.unknownFlagMap.clear();
}
async count() {
return this.unknownFlagMap.size;
}
}
//# sourceMappingURL=fake-unknown-flags-store.js.map