/** * Implementation of a simple Oberver Pattern for custom event handling */ function Observer() { this.handlers = new Set(); } Observer.prototype = { // Adds handler for this message on(callback) { this.handlers.add(callback); return callback; }, clear(callback) { return this.handlers.delete(callback); }, emit(msg) { this.handlers.forEach(async (handler) => { try { await handler(msg); } catch (e) { console.warn("Observer failed to run handler"); console.warn(e); } }); }, }; /** * Generates unique id */ const guid = (size = 3) => { const s4 = () => { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); }; // returns id of format 'aaaaaaaa'-'aaaa'-'aaaa'-'aaaa'-'aaaaaaaaaaaa' let id = ""; for (var i = 0; i < size - 1; i++) id += s4() + "-"; id += s4(); return id; };