@fireflysemantics/slice
Version:

145 lines • 13.5 kB
JavaScript
import { ReplaySubject } from 'rxjs';
export class OStore {
constructor(start) {
/**
* Map of Key Value pair entries
* containing values store in this store.
*/
this.entries = new Map();
/**
* Map of replay subject id to `ReplaySubject` instance.
*/
this.subjects = new Map();
if (start) {
this.S = start;
const keys = Object.keys(start);
keys.forEach((k) => {
const ovr = start[k];
this.post(ovr, ovr.value);
ovr.obs = this.observe(ovr);
});
}
}
/**
* Reset the state of the OStore to the
* values or reset provided in the constructor
* {@link OStoreStart} instance.
*/
reset() {
if (this.S) {
const keys = Object.keys(this.S);
keys.forEach((k) => {
const ovr = this.S[k];
this.put(ovr, ovr.reset ? ovr.reset : ovr.value);
});
}
}
/**
* Set create a key value pair entry and creates a
* corresponding replay subject instance that will
* be used to broadcast updates.
*
* @param key The key identifying the value
* @param value The value
*/
post(key, value) {
this.entries.set(key, value);
this.subjects.set(key, new ReplaySubject(1));
//Emit immediately so that Observers can receive
//the value straight away.
const subject = this.subjects.get(key);
if (subject) {
subject.next(value);
}
}
/**
* Update a value and notify subscribers.
*
* @param key
* @param value
*/
put(key, value) {
this.entries.set(key, value);
const subject = this.subjects.get(key);
if (subject) {
subject.next(value);
}
}
/**
* Deletes both the value entry and the corresponding {@link ReplaySubject}.
* Will unsubscribe the {@link ReplaySubject} prior to deleting it,
* severing communication with corresponding {@link Observable}s.
*
* @param key
*/
delete(key) {
//===========================================
// Delete the entry
//===========================================
this.entries.delete(key);
const subject = this.subjects.get(key);
if (subject) {
subject.next(undefined);
}
}
/**
* Clear all entries.
*
* Note that
* this will call delete for on all
* keys defined which also also
* unsubscribes and deletes
* all the sbujects.
*/
clear() {
for (let key of this.entries.keys()) {
this.delete(key);
}
}
/**
* Observe changes to the values.
*
* @param key
* @return An {@link Observable} of the value
*/
observe(key) {
return this.subjects.get(key)
? this.subjects.get(key).asObservable()
: undefined;
}
/**
* Check whether a value exists.
*
* @param key
* @return True if the entry exists ( Is not null or undefined ) and false otherwise.
*/
exists(key) {
return !!this.entries.get(key);
}
/**
* Retrieve a snapshot of the
* value.
*
* @param key
* @return A snapshot of the value corresponding to the key.
*/
snapshot(key) {
return this.entries.get(key);
}
/**
* Indicates whether the store is empty.
* @return true if the store is empty, false otherwise.
*/
isEmpty() {
return Array.from(this.entries.values()).length == 0;
}
/**
* Returns the number of key value pairs contained.
*
* @return the number of entries in the store.
*/
count() {
return Array.from(this.entries.values()).length;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT1N0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9PU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQTJCakQsTUFBTSxPQUFPLE1BQU07SUFPakIsWUFBWSxLQUFrQjtRQTJCOUI7OztXQUdHO1FBQ0ksWUFBTyxHQUFrQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTFDOztXQUVHO1FBQ0ssYUFBUSxHQUFpQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBbkN6RCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxDQUFDLEdBQU0sS0FBSyxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFrQixDQUFDO2dCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUUsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNqQixNQUFNLEdBQUcsR0FBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFD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QUFDO0lBQ2xELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheVN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBJbml0aWFsaXplIGh0ZSBzdG9yZSB3aXRoIHRoaXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVSZXNldCB7XG4gIHZhbHVlOiBhbnk7XG4gIHJlc2V0PzogYW55O1xufVxuXG4vKipcbiAqIE9TdG9yZSBLZXkgVmFsdWUgUmVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNWYWx1ZVJlc2V0IHtcbiAgdmFsdWU6IGFueTtcbiAgcmVzZXQ/OiBhbnk7XG4gIG9iczogT2JzZXJ2YWJsZTxhbnk+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtleU9ic1ZhbHVlUmVzZXQge1xuICBba2V5OiBzdHJpbmddOiBPYnNWYWx1ZVJlc2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9TdG9yZVN0YXJ0IHtcbiAgW2tleTogc3RyaW5nXTogVmFsdWVSZXNldDtcbn1cblxuZXhwb3J0IGNsYXNzIE9TdG9yZTxFIGV4dGVuZHMgS2V5T2JzVmFsdWVSZXNldD4ge1xuICAvKipcbiAgICogU3RhcnQga2V5cyBhbmQgdmFsdWVzXG4gICAqIHBhc3NlZCBpbiB2aWEgY29uc3RydWN0b3IuXG4gICAqL1xuICBwdWJsaWMgUyE6IEU7XG5cbiAgY29uc3RydWN0b3Ioc3RhcnQ6IE9TdG9yZVN0YXJ0KSB7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICB0aGlzLlMgPSA8RT5zdGFydDtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzdGFydCk7XG4gICAgICBrZXlzLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgY29uc3Qgb3ZyID0gc3RhcnRba10gYXMgT2JzVmFsdWVSZXNldDtcbiAgICAgICAgdGhpcy5wb3N0KG92ciwgb3ZyLnZhbHVlKTtcbiAgICAgICAgb3ZyLm9icyA9IHRoaXMub2JzZXJ2ZShvdnIpITtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIE9TdG9yZSB0byB0aGVcbiAgICogdmFsdWVzIG9yIHJlc2V0IHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAgKiB7QGxpbmsgT1N0b3JlU3RhcnR9IGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCkge1xuICAgIGlmICh0aGlzLlMpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLlMpO1xuICAgICAga2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgIGNvbnN0IG92cjogT2JzVmFsdWVSZXNldCA9IHRoaXMuU1trXTtcbiAgICAgICAgdGhpcy5wdXQob3ZyLCBvdnIucmVzZXQgPyBvdnIucmVzZXQgOiBvdnIudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcCBvZiBLZXkgVmFsdWUgcGFpciBlbnRyaWVzXG4gICAqIGNvbnRhaW5pbmcgdmFsdWVzIHN0b3JlIGluIHRoaXMgc3RvcmUuXG4gICAqL1xuICBwdWJsaWMgZW50cmllczogTWFwPGFueSwgYW55PiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogTWFwIG9mIHJlcGxheSBzdWJqZWN0IGlkIHRvIGBSZXBsYXlTdWJqZWN0YCBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3ViamVjdHM6IE1hcDxhbnksIFJlcGxheVN1YmplY3Q8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIFNldCBjcmVhdGUgYSBrZXkgdmFsdWUgcGFpciBlbnRyeSBhbmQgY3JlYXRlcyBhXG4gICAqIGNvcnJlc3BvbmRpbmcgcmVwbGF5IHN1YmplY3QgaW5zdGFuY2UgdGhhdCB3aWxsXG4gICAqIGJlIHVzZWQgdG8gYnJvYWRjYXN0IHVwZGF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBpZGVudGlmeWluZyB0aGUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBwb3N0KGtleTogT2JzVmFsdWVSZXNldCwgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5zdWJqZWN0cy5zZXQoa2V5LCBuZXcgUmVwbGF5U3ViamVjdCgxKSk7XG4gICAgLy9FbWl0IGltbWVkaWF0ZWx5IHNvIHRoYXQgT2JzZXJ2ZXJzIGNhbiByZWNlaXZlXG4gICAgLy90aGUgdmFsdWUgc3RyYWlnaHQgYXdheS5cbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5nZXQoa2V5KTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgc3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZSBhIHZhbHVlIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgcHV0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHZhbHVlKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5zdWJqZWN0cy5nZXQoa2V5KTtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgc3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBib3RoIHRoZSB2YWx1ZSBlbnRyeSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFJlcGxheVN1YmplY3R9LlxuICAgKiBXaWxsIHVuc3Vic2NyaWJlIHRoZSB7QGxpbmsgUmVwbGF5U3ViamVjdH0gcHJpb3IgdG8gZGVsZXRpbmcgaXQsXG4gICAqIHNldmVyaW5nIGNvbW11bmljYXRpb24gd2l0aCBjb3JyZXNwb25kaW5nIHtAbGluayBPYnNlcnZhYmxlfXMuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICovXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBhbnkpIHtcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBEZWxldGUgdGhlIGVudHJ5XG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnN1YmplY3RzLmdldChrZXkpO1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICBzdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGVudHJpZXMuICBcbiAgICogXG4gICAqIE5vdGUgdGhhdCBcbiAgICogdGhpcyB3aWxsIGNhbGwgZGVsZXRlIGZvciBvbiBhbGxcbiAgICoga2V5cyBkZWZpbmVkIHdoaWNoIGFsc28gYWxzbyBcbiAgICogdW5zdWJzY3JpYmVzIGFuZCBkZWxldGVzIFxuICAgKiBhbGwgdGhlIHNidWplY3RzLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIGZvciAobGV0IGtleSBvZiB0aGlzLmVudHJpZXMua2V5cygpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgY2hhbmdlcyB0byB0aGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm4gQW4ge0BsaW5rIE9ic2VydmFibGV9IG9mIHRoZSB2YWx1ZVxuICAgKi9cbiAgcHVibGljIG9ic2VydmUoa2V5OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3RzLmdldChrZXkpXG4gICAgICA/IHRoaXMuc3ViamVjdHMuZ2V0KGtleSkhLmFzT2JzZXJ2YWJsZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIGEgdmFsdWUgZXhpc3RzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZW50cnkgZXhpc3RzICggSXMgbm90IG51bGwgb3IgdW5kZWZpbmVkICkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBleGlzdHMoa2V5OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgYSBzbmFwc2hvdCBvZiB0aGVcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkuXG4gICAqL1xuICBwdWJsaWMgc25hcHNob3Qoa2V5OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0b3JlIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmxlbmd0aCA9PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXkgdmFsdWUgcGFpcnMgY29udGFpbmVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc3RvcmUuXG4gICAqL1xuICBwdWJsaWMgY291bnQoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGg7XG4gIH1cbn0iXX0=