50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
|
import { KvPrimitives } from "./lib/kv_primitives.ts";
|
||
|
import { Plug } from "./plug.ts";
|
||
|
import { Manifest } from "./types.ts";
|
||
|
|
||
|
export interface ManifestCache<T> {
|
||
|
getManifest(plug: Plug<T>, hash: number): Promise<Manifest<T>>;
|
||
|
}
|
||
|
|
||
|
export class KVPrimitivesManifestCache<T> implements ManifestCache<T> {
|
||
|
constructor(private kv: KvPrimitives, private manifestPrefix: string) {
|
||
|
}
|
||
|
|
||
|
async getManifest(plug: Plug<T>, hash: number): Promise<Manifest<T>> {
|
||
|
const [cached] = await this.kv.batchGet([[
|
||
|
this.manifestPrefix,
|
||
|
plug.name,
|
||
|
]]);
|
||
|
if (cached && cached.hash === hash) {
|
||
|
// console.log("Using KV cached manifest for", plug.name);
|
||
|
return cached.manifest;
|
||
|
}
|
||
|
await plug.sandbox.init();
|
||
|
const manifest = plug.sandbox.manifest!;
|
||
|
await this.kv.batchSet([{
|
||
|
key: [this.manifestPrefix, plug.name],
|
||
|
value: { manifest, hash },
|
||
|
}]);
|
||
|
return manifest;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export class InMemoryManifestCache<T> implements ManifestCache<T> {
|
||
|
private cache = new Map<string, {
|
||
|
manifest: Manifest<T>;
|
||
|
hash: number;
|
||
|
}>();
|
||
|
|
||
|
async getManifest(plug: Plug<T>, hash: number): Promise<Manifest<T>> {
|
||
|
const cached = this.cache.get(plug.workerUrl.href);
|
||
|
if (cached && cached.hash === hash) {
|
||
|
// console.log("Using memory cached manifest for", plug.name);
|
||
|
return cached.manifest;
|
||
|
}
|
||
|
await plug.sandbox.init();
|
||
|
const manifest = plug.sandbox.manifest!;
|
||
|
this.cache.set(plug.name!, { manifest, hash });
|
||
|
return manifest;
|
||
|
}
|
||
|
}
|