@n1k1t/mock-server
Version:
The ultimate toolkit to intercept, transform, and simulate HTTP/WS traffic with type-safe expectations
83 lines • 2.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContainersStorage = void 0;
const utils_1 = require("./utils");
const model_1 = require("./model");
class ContainersStorage {
constructor(configuration) {
this.configuration = configuration;
this.entities = new Map();
this.aliases = new Map();
}
get size() {
return this.entities.size;
}
entries() {
return this.entities.entries();
}
values() {
return this.entities.values();
}
/** Extends this storage with another */
extend(storage) {
for (const container of storage.values()) {
this.register(container);
}
return this;
}
register(predicate) {
const container = predicate instanceof model_1.Container ? predicate : model_1.Container.build({
key: (0, utils_1.compileContainerKey)(predicate.key),
group: this.configuration.group,
payload: predicate.payload,
timestamp: Date.now(),
ttl: predicate?.ttl ?? 3600,
});
container.configure({
hooks: {
unbind: (key) => this.delete(key),
bind: (key, target) => this.aliases.set(key, target),
},
});
for (const alias of container.aliases.values()) {
this.aliases.set(alias, container);
}
this.entities.set(container.key, container);
return container;
}
/** Finds or creates the container by provided configuration */
provide(configuration) {
return this.find(configuration.key) ?? this.register(configuration);
}
find(key) {
const compiled = (0, utils_1.compileContainerKey)(key);
const entity = this.entities.get(compiled);
if (entity) {
return entity;
}
return this.aliases.get(compiled);
}
delete(key) {
const compiled = (0, utils_1.compileContainerKey)(key);
const entity = this.entities.get(compiled);
if (entity) {
this.entities.delete(entity.key);
entity.aliases.forEach((key) => this.aliases.delete(key));
return this;
}
this.aliases.delete(compiled);
return this;
}
/** Returns a list of expired containers */
expired() {
const timestamp = Date.now();
return [...this.entities.values()].filter((container) => container.checkIsExpired(timestamp));
}
clear() {
this.entities.clear();
this.aliases.clear();
return this;
}
}
exports.ContainersStorage = ContainersStorage;
//# sourceMappingURL=storage.js.map