reliable-zeromq
Version:
A collection of reliable zeromq messaging constructs
54 lines • 4.45 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const typescript_collections_1 = require("typescript-collections");
const EXPIRY_BUFFER = 500; // Addresses potential rounding issues and encourages batching
class ExpiryMap extends Map {
constructor(aExpiryMS, aEntries) {
super();
this.mExpiryQueue = new typescript_collections_1.Queue();
this.PruneStale = () => {
delete (this.mNextExpiry);
const lStaleTime = Date.now();
// PERF: Can optimize with for() & break on undefined
while (this.mExpiryQueue.size() > 0 && lStaleTime >= this.mExpiryQueue.peek().Expiry) {
const lKey = this.mExpiryQueue.dequeue().Key;
super.delete(lKey);
}
if (this.mExpiryQueue.size() > 0) {
const lNextExpiry = this.mExpiryQueue.peek().Expiry - Date.now() + EXPIRY_BUFFER;
this.mNextExpiry = setTimeout(this.PruneStale, lNextExpiry); // setTimeout has its own range check
}
};
this.mExpiryMS = aExpiryMS;
if (aEntries) {
for (const aEntry of aEntries) {
this.set(aEntry[0], aEntry[1]);
}
}
}
AddKeyToQueue(aKey) {
this.mExpiryQueue.add({
Key: aKey,
Expiry: Date.now() + this.mExpiryMS,
});
}
clear() {
super.clear();
this.mExpiryQueue.clear();
if (this.mNextExpiry) {
clearTimeout(this.mNextExpiry);
delete (this.mNextExpiry);
}
}
set(key, value) {
// KNOWN ISSUE: Overwriting an already set value will not reset the expiry. Does not affect reliable-zeromq functionality
super.set(key, value);
this.AddKeyToQueue(key);
if (!this.mNextExpiry) {
this.mNextExpiry = setTimeout(this.PruneStale, this.mExpiryMS + EXPIRY_BUFFER);
}
return this;
}
}
exports.default = ExpiryMap;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwaXJ5TWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vU3JjL1V0aWxzL0V4cGlyeU1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1FQUErQztBQUUvQyxNQUFNLGFBQWEsR0FBVyxHQUFHLENBQUMsQ0FBRSw4REFBOEQ7QUFRbEcsTUFBcUIsU0FBZ0IsU0FBUSxHQUFTO0lBTWxELFlBQW1CLFNBQWlCLEVBQUUsUUFBb0M7UUFFdEUsS0FBSyxFQUFFLENBQUM7UUFMSixpQkFBWSxHQUEyQixJQUFJLDhCQUFLLEVBQW1CLENBQUM7UUEyQnBFLGVBQVUsR0FBRyxHQUFTLEVBQUU7WUFFNUIsT0FBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixNQUFNLFVBQVUsR0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFdEMscURBQXFEO1lBQ3JELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFHLENBQUMsTUFBTSxFQUNyRjtnQkFDSSxNQUFNLElBQUksR0FBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRyxDQUFDLEdBQUcsQ0FBQztnQkFFakQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QjtZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQ2hDO2dCQUNJLE1BQU0sV0FBVyxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxhQUFhLENBQUM7Z0JBRTFGLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBSSxxQ0FBcUM7YUFDeEc7UUFDTCxDQUFDLENBQUE7UUF4Q0csSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFM0IsSUFBSSxRQUFRLEVBQ1o7WUFDSSxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFDN0I7Z0JBQ0ksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDSjtJQUNMLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBTztRQUV6QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FDakI7WUFDSSxHQUFHLEVBQUUsSUFBSTtZQUNULE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVM7U0FDdEMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQXVCTSxLQUFLO1FBRVIsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQ3BCO1lBQ0ksWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixPQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzVCO0lBRUwsQ0FBQztJQUVNLEdBQUcsQ0FBQyxHQUFNLEVBQUUsS0FBUTtRQUV2Qix5SEFBeUg7UUFDekgsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFDckI7WUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUM7U0FDbEY7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBQ0o7QUE3RUQsNEJBNkVDIn0=