2024-07-03 11:17:36 -05:00
|
|
|
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) {
|
2024-07-10 14:14:10 -05:00
|
|
|
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);
|
2024-07-03 11:17:36 -05:00
|
|
|
}
|
|
|
|
async readScript(uri, context = {}) {
|
|
|
|
const code = await this.readAsset(uri);
|
|
|
|
if (code.byteLength > 0) {
|
|
|
|
return Script.fromCode((new TextDecoder()).decode(code), context);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|