import Ecs from '@/ecs/ecs.js'; import Script from '@/util/script.js'; import {LRUCache} from 'lru-cache'; const cache = new LRUCache({ max: 128, }); export default class ClientEcs extends Ecs { async readAsset(uri) { if (!cache.has(uri)) { let promise, resolve, reject; promise = new Promise((res, rej) => { resolve = res; reject = rej; }); cache.set(uri, promise); fetch(new URL(uri, window.location.origin)) .then(async (response) => { resolve(response.ok ? response.arrayBuffer() : new ArrayBuffer(0)); }) .catch(reject); } return cache.get(uri); } async readJson(uri) { const key = ['$$json', uri].join(':'); if (!cache.has(key)) { let promise, resolve, reject; promise = new Promise((res, rej) => { resolve = res; reject = rej; }); cache.set(key, promise); this.readAsset(uri) .then((chars) => { resolve(chars.byteLength > 0 ? JSON.parse((new TextDecoder()).decode(chars)) : {}); }) .catch(reject); } return cache.get(key); } async readScript(uriOrCode, context = {}) { if (!uriOrCode) { return undefined; } let code = ''; if (!uriOrCode.startsWith('/')) { code = uriOrCode; } else { const buffer = await this.readAsset(uriOrCode); if (buffer.byteLength > 0) { code = (new TextDecoder()).decode(buffer); } } if (code) { return Script.fromCode(code, context); } } }