resources/perf.webkit.org/public/v3/models/data-model.js (104 lines of code) (raw):

'use strict'; class DataModelObject { _id; constructor(id) { this._id = id; this.ensureNamedStaticMap('id')[id] = this; } id() { return this._id; } static ensureSingleton(id, object) { const singleton = this.findById(id); if (singleton) { singleton.updateSingleton(object) return singleton; } return new (this)(id, object); } updateSingleton(object) { } static clearStaticMap() { this[DataModelObject.StaticMapSymbol] = null; } static namedStaticMap(name) { const staticMap = this[DataModelObject.StaticMapSymbol]; return staticMap ? staticMap.get(name) : null; } static ensureNamedStaticMap(name) { if (!this[DataModelObject.StaticMapSymbol]) this[DataModelObject.StaticMapSymbol] = new Map; const staticMap = this[DataModelObject.StaticMapSymbol]; let namedMap = staticMap.get(name); if (!namedMap) { namedMap = { }; // Use a regular object to implicitly convert each key to a string. staticMap.set(name, namedMap); } return namedMap; } namedStaticMap(name) { return this.__proto__.constructor.namedStaticMap(name); } ensureNamedStaticMap(name) { return this.__proto__.constructor.ensureNamedStaticMap(name); } static findById(id) { const idMap = this.namedStaticMap('id'); return idMap ? idMap[id] : null; } static listForStaticMap(name) { const list = []; const idMap = this.namedStaticMap(name); if (idMap) { for (const id in idMap) list.push(idMap[id]); } return list; } static all() { return this.listForStaticMap('id'); } static async cachedFetch(path, params = { }, noCache = false) { const query = []; if (params) { for (let key in params) query.push(key + '=' + escape(params[key])); } if (query.length) path += '?' + query.join('&'); if (noCache) return RemoteAPI.getJSONWithStatus(path); const cacheMap = this.ensureNamedStaticMap(DataModelObject.CacheMapSymbol); let promise = cacheMap[path]; if (!promise) { promise = RemoteAPI.getJSONWithStatus(path); cacheMap[path] = promise; } const content = await cacheMap[path]; return JSON.parse(JSON.stringify(content)); } } DataModelObject.StaticMapSymbol = Symbol(); DataModelObject.CacheMapSymbol = Symbol(); class LabeledObject extends DataModelObject { _name; constructor(id, object) { super(id); this._name = object.name; } updateSingleton(object) { this._name = object.name; } static sortByName(list) { return list.sort((a, b) => { if (a.name() < b.name()) return -1; else if (a.name() > b.name()) return 1; return 0; }); } sortByName(list) { return LabeledObject.sortByName(list); } name() { return this._name; } label() { return this.name(); } } if (typeof module != 'undefined') { module.exports.DataModelObject = DataModelObject; module.exports.LabeledObject = LabeledObject; }