@mysten/sui
Version:
Sui TypeScript API(Work in Progress)
65 lines (52 loc) • 1.41 kB
text/typescript
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
export interface ClientCacheOptions {
prefix?: string[];
cache?: Map<string, unknown>;
}
export class ClientCache {
#prefix: string[];
#cache: Map<string, unknown>;
constructor({ prefix, cache }: ClientCacheOptions = {}) {
this.#prefix = prefix ?? [];
this.#cache = cache ?? new Map();
}
read<T>(key: [string, ...string[]], load: () => T | Promise<T>): T | Promise<T> {
const cacheKey = [this.#prefix, ...key].join(':');
if (this.#cache.has(cacheKey)) {
return this.#cache.get(cacheKey) as T;
}
const result = load();
this.#cache.set(cacheKey, result);
if (typeof result === 'object' && result !== null && 'then' in result) {
return Promise.resolve(result)
.then((v) => {
this.#cache.set(cacheKey, v);
return v as T;
})
.catch((err) => {
this.#cache.delete(cacheKey);
throw err;
});
}
return result as T;
}
clear(prefix?: string[]) {
const prefixKey = [...this.#prefix, ...(prefix ?? [])].join(':');
if (!prefixKey) {
this.#cache.clear();
return;
}
for (const key of this.#cache.keys()) {
if (key.startsWith(prefixKey)) {
this.#cache.delete(key);
}
}
}
scope(prefix: string | string[]) {
return new ClientCache({
prefix: [...this.#prefix, ...(Array.isArray(prefix) ? prefix : [prefix])],
cache: this.#cache,
});
}
}