jishushell 0.0.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +36 -0
- package/THIRD-PARTY-NOTICES +387 -0
- package/dist/auth.d.ts +6 -0
- package/dist/auth.js +88 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +290 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.js +226 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/control.d.ts +44 -0
- package/dist/control.js +1359 -0
- package/dist/control.js.map +1 -0
- package/dist/crypto-shim.d.ts +1 -0
- package/dist/crypto-shim.js +2 -0
- package/dist/crypto-shim.js.map +1 -0
- package/dist/doctor.d.ts +46 -0
- package/dist/doctor.js +937 -0
- package/dist/doctor.js.map +1 -0
- package/dist/install.d.ts +27 -0
- package/dist/install.js +570 -0
- package/dist/install.js.map +1 -0
- package/dist/routes/auth.d.ts +4 -0
- package/dist/routes/auth.js +151 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/instances.d.ts +2 -0
- package/dist/routes/instances.js +1303 -0
- package/dist/routes/instances.js.map +1 -0
- package/dist/routes/setup.d.ts +2 -0
- package/dist/routes/setup.js +139 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/system.d.ts +2 -0
- package/dist/routes/system.js +102 -0
- package/dist/routes/system.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +392 -0
- package/dist/server.js.map +1 -0
- package/dist/services/instance-manager.d.ts +67 -0
- package/dist/services/instance-manager.js +1319 -0
- package/dist/services/instance-manager.js.map +1 -0
- package/dist/services/llm-proxy/adapters.d.ts +3 -0
- package/dist/services/llm-proxy/adapters.js +309 -0
- package/dist/services/llm-proxy/adapters.js.map +1 -0
- package/dist/services/llm-proxy/circuit-breaker.d.ts +9 -0
- package/dist/services/llm-proxy/circuit-breaker.js +73 -0
- package/dist/services/llm-proxy/circuit-breaker.js.map +1 -0
- package/dist/services/llm-proxy/encryption.d.ts +6 -0
- package/dist/services/llm-proxy/encryption.js +61 -0
- package/dist/services/llm-proxy/encryption.js.map +1 -0
- package/dist/services/llm-proxy/index.d.ts +24 -0
- package/dist/services/llm-proxy/index.js +708 -0
- package/dist/services/llm-proxy/index.js.map +1 -0
- package/dist/services/llm-proxy/rate-limiter.d.ts +1 -0
- package/dist/services/llm-proxy/rate-limiter.js +39 -0
- package/dist/services/llm-proxy/rate-limiter.js.map +1 -0
- package/dist/services/llm-proxy/sse.d.ts +10 -0
- package/dist/services/llm-proxy/sse.js +378 -0
- package/dist/services/llm-proxy/sse.js.map +1 -0
- package/dist/services/llm-proxy/ssrf.d.ts +16 -0
- package/dist/services/llm-proxy/ssrf.js +185 -0
- package/dist/services/llm-proxy/ssrf.js.map +1 -0
- package/dist/services/llm-proxy/types.d.ts +52 -0
- package/dist/services/llm-proxy/types.js +2 -0
- package/dist/services/llm-proxy/types.js.map +1 -0
- package/dist/services/llm-proxy/usage.d.ts +12 -0
- package/dist/services/llm-proxy/usage.js +108 -0
- package/dist/services/llm-proxy/usage.js.map +1 -0
- package/dist/services/nomad-manager.d.ts +22 -0
- package/dist/services/nomad-manager.js +828 -0
- package/dist/services/nomad-manager.js.map +1 -0
- package/dist/services/plugin-installer.d.ts +22 -0
- package/dist/services/plugin-installer.js +102 -0
- package/dist/services/plugin-installer.js.map +1 -0
- package/dist/services/process-manager.d.ts +25 -0
- package/dist/services/process-manager.js +531 -0
- package/dist/services/process-manager.js.map +1 -0
- package/dist/services/setup-manager.d.ts +93 -0
- package/dist/services/setup-manager.js +1922 -0
- package/dist/services/setup-manager.js.map +1 -0
- package/dist/services/system-monitor.d.ts +1 -0
- package/dist/services/system-monitor.js +79 -0
- package/dist/services/system-monitor.js.map +1 -0
- package/dist/services/telemetry/activation.d.ts +12 -0
- package/dist/services/telemetry/activation.js +75 -0
- package/dist/services/telemetry/activation.js.map +1 -0
- package/dist/services/telemetry/client.d.ts +21 -0
- package/dist/services/telemetry/client.js +47 -0
- package/dist/services/telemetry/client.js.map +1 -0
- package/dist/services/telemetry/device-fingerprint.d.ts +18 -0
- package/dist/services/telemetry/device-fingerprint.js +123 -0
- package/dist/services/telemetry/device-fingerprint.js.map +1 -0
- package/dist/services/telemetry/heartbeat.d.ts +13 -0
- package/dist/services/telemetry/heartbeat.js +81 -0
- package/dist/services/telemetry/heartbeat.js.map +1 -0
- package/dist/services/telemetry/index.d.ts +3 -0
- package/dist/services/telemetry/index.js +4 -0
- package/dist/services/telemetry/index.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/safe-json.d.ts +2 -0
- package/dist/utils/safe-json.js +80 -0
- package/dist/utils/safe-json.js.map +1 -0
- package/dist/utils/ttl-cache.d.ts +29 -0
- package/dist/utils/ttl-cache.js +77 -0
- package/dist/utils/ttl-cache.js.map +1 -0
- package/install/jishu-install.sh +2920 -0
- package/install/jishu-uninstall.sh +811 -0
- package/install/post-install.sh +110 -0
- package/install/post-uninstall.sh +46 -0
- package/package.json +57 -8
- package/public/assets/Dashboard-CAOQDYDR.js +1 -0
- package/public/assets/InitPassword-CkehIkJG.js +1 -0
- package/public/assets/InstanceDetail-CzW2S95J.js +14 -0
- package/public/assets/Login-RkjzTNWg.js +1 -0
- package/public/assets/NewInstance-DdbErdjA.js +1 -0
- package/public/assets/Settings-BUD7zwv9.js +1 -0
- package/public/assets/Setup-RRTIERGG.js +1 -0
- package/public/assets/index-77Ug7feY.css +1 -0
- package/public/assets/index-DfRnVUQR.js +16 -0
- package/public/assets/providers-lBSOjUWy.js +1 -0
- package/public/assets/usePolling-CqQ8hrNc.js +1 -0
- package/public/assets/vendor-i18n-Bvxxh8Di.js +9 -0
- package/public/assets/vendor-react-DONn7uBV.js +59 -0
- package/public/index.html +15 -0
- package/scripts/build-image.sh +55 -0
- package/scripts/run.sh +310 -0
- package/scripts/setup-pi.sh +80 -0
- package/scripts/start-feishu1.js +46 -0
- package/index.js +0 -0
- package/jishushell-0.0.1.tgz +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily heartbeat telemetry — reports device version once per day.
|
|
3
|
+
*
|
|
4
|
+
* - Opt-out: set `telemetry: false` in panel.json
|
|
5
|
+
* - Reports at most once per calendar day (UTC)
|
|
6
|
+
* - Stores `last_heartbeat_date` in panel.json to persist across restarts
|
|
7
|
+
* - Triggered on every API request via Fastify hook; near zero cost after today's report
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from "fs";
|
|
10
|
+
import { dirname, join } from "path";
|
|
11
|
+
import { fileURLToPath } from "url";
|
|
12
|
+
import { getDeviceId, getPanelConfig, savePanelConfig } from "../../config.js";
|
|
13
|
+
import { detectBoard, getArch, getPlatform } from "./device-fingerprint.js";
|
|
14
|
+
import { report } from "./client.js";
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const __dirname = dirname(__filename);
|
|
17
|
+
function getVersion() {
|
|
18
|
+
if (process.env.npm_package_version)
|
|
19
|
+
return process.env.npm_package_version;
|
|
20
|
+
try {
|
|
21
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "..", "package.json"), "utf-8"));
|
|
22
|
+
return pkg.version || "unknown";
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return "unknown";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function todayUTC() {
|
|
29
|
+
return new Date().toISOString().slice(0, 10); // "2026-03-30"
|
|
30
|
+
}
|
|
31
|
+
let _reporting = false;
|
|
32
|
+
let _todayDone = false;
|
|
33
|
+
let _cachedDate = "";
|
|
34
|
+
/**
|
|
35
|
+
* Check and report daily heartbeat if needed.
|
|
36
|
+
* Safe to call on every request — returns immediately if already reported today.
|
|
37
|
+
*/
|
|
38
|
+
export function checkAndReportHeartbeat() {
|
|
39
|
+
const today = todayUTC();
|
|
40
|
+
// Fast path: already reported today (in-memory)
|
|
41
|
+
if (_todayDone && _cachedDate === today)
|
|
42
|
+
return;
|
|
43
|
+
const config = getPanelConfig();
|
|
44
|
+
if (config.telemetry === false) {
|
|
45
|
+
_todayDone = true;
|
|
46
|
+
_cachedDate = today;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (config.last_heartbeat_date === today) {
|
|
50
|
+
_todayDone = true;
|
|
51
|
+
_cachedDate = today;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (_reporting)
|
|
55
|
+
return;
|
|
56
|
+
_reporting = true;
|
|
57
|
+
report("heartbeat", {
|
|
58
|
+
device_id: getDeviceId(),
|
|
59
|
+
version: getVersion(),
|
|
60
|
+
board: detectBoard(),
|
|
61
|
+
arch: getArch(),
|
|
62
|
+
platform: getPlatform(),
|
|
63
|
+
reported_date: today,
|
|
64
|
+
reported_at: new Date().toISOString(),
|
|
65
|
+
})
|
|
66
|
+
.then((ok) => {
|
|
67
|
+
if (ok) {
|
|
68
|
+
const updated = getPanelConfig();
|
|
69
|
+
updated.last_heartbeat_date = today;
|
|
70
|
+
savePanelConfig(updated);
|
|
71
|
+
_todayDone = true;
|
|
72
|
+
_cachedDate = today;
|
|
73
|
+
console.log("[telemetry] Daily heartbeat reported.");
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
.catch(() => { })
|
|
77
|
+
.finally(() => {
|
|
78
|
+
_reporting = false;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/services/telemetry/heartbeat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface InstanceStatus {
|
|
2
|
+
status: "running" | "pending" | "stopped" | "failed" | string;
|
|
3
|
+
pid: number | null;
|
|
4
|
+
uptime: number | null;
|
|
5
|
+
memory_mb: number | null;
|
|
6
|
+
cpu_percent: number | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ServiceResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
warning?: string;
|
|
12
|
+
pid?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ExecResult {
|
|
15
|
+
stdout: string;
|
|
16
|
+
stderr: string;
|
|
17
|
+
exitCode: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ServiceManager {
|
|
20
|
+
getStatus(id: string): Promise<InstanceStatus>;
|
|
21
|
+
startInstance(id: string): Promise<ServiceResult>;
|
|
22
|
+
stopInstance(id: string, purge?: boolean): Promise<ServiceResult>;
|
|
23
|
+
restartInstance(id: string): Promise<ServiceResult>;
|
|
24
|
+
getLogs(id: string, lines?: number, logType?: string): Promise<string[]> | string[];
|
|
25
|
+
/** Run a command inside the running instance (docker exec or direct exec). */
|
|
26
|
+
exec(id: string, command: string[], timeoutMs?: number): Promise<ExecResult>;
|
|
27
|
+
}
|
|
28
|
+
export interface PanelConfig {
|
|
29
|
+
service_manager?: "process" | "nomad";
|
|
30
|
+
nomad_driver?: "docker";
|
|
31
|
+
openclaw_image?: string;
|
|
32
|
+
nomad_token?: string;
|
|
33
|
+
allowed_origins?: string[];
|
|
34
|
+
default_provider?: {
|
|
35
|
+
providerId?: string;
|
|
36
|
+
baseUrl?: string;
|
|
37
|
+
api?: string;
|
|
38
|
+
apiKey?: string;
|
|
39
|
+
skipped?: boolean;
|
|
40
|
+
selectedModelId?: string;
|
|
41
|
+
models?: Array<{
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
contextWindow: number;
|
|
45
|
+
}>;
|
|
46
|
+
[key: string]: any;
|
|
47
|
+
};
|
|
48
|
+
telemetry?: false;
|
|
49
|
+
activation_reported?: boolean;
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, copyFileSync, openSync, fdatasyncSync, closeSync } from "fs";
|
|
2
|
+
import { dirname } from "path";
|
|
3
|
+
const BACKUP_SUFFIXES = [".bak", ".bak.1", ".bak.2"];
|
|
4
|
+
export function safeReadJson(path, label) {
|
|
5
|
+
for (const f of [path, ...BACKUP_SUFFIXES.map(s => path + s)]) {
|
|
6
|
+
if (!existsSync(f))
|
|
7
|
+
continue;
|
|
8
|
+
try {
|
|
9
|
+
const data = JSON.parse(readFileSync(f, "utf-8"));
|
|
10
|
+
if (f !== path) {
|
|
11
|
+
console.warn(`[${label}] ${path} corrupted, recovered from ${f}`);
|
|
12
|
+
const tmp = path + ".tmp";
|
|
13
|
+
writeFileSync(tmp, JSON.stringify(data), { mode: 0o600 });
|
|
14
|
+
renameSync(tmp, path);
|
|
15
|
+
}
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
console.warn(`[${label}] Failed to parse ${f}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
// Per-path lock to detect concurrent writes (synchronous re-entrancy guard)
|
|
25
|
+
// Stores start timestamp so stale entries from crashed writes can be detected
|
|
26
|
+
const _activeWrites = new Map();
|
|
27
|
+
export function safeWriteJson(path, data, fsync = false) {
|
|
28
|
+
const existing = _activeWrites.get(path);
|
|
29
|
+
if (existing !== undefined) {
|
|
30
|
+
// If a write has been "active" for over 60s, it's stale from a previous crash
|
|
31
|
+
if (Date.now() - existing > 60_000) {
|
|
32
|
+
_activeWrites.delete(path);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.warn(`[safe-json] Concurrent write detected for ${path}, serializing`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// In Node.js single-threaded model, synchronous code can't truly interleave,
|
|
39
|
+
// but this guard catches programming errors where safeWriteJson is called
|
|
40
|
+
// from within a safeWriteJson callback (re-entrancy).
|
|
41
|
+
_activeWrites.set(path, Date.now());
|
|
42
|
+
try {
|
|
43
|
+
_safeWriteJsonImpl(path, data, fsync);
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
_activeWrites.delete(path);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function _safeWriteJsonImpl(path, data, fsync) {
|
|
50
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
51
|
+
const tmp = path + ".tmp";
|
|
52
|
+
const json = typeof data === "string" ? data : JSON.stringify(data);
|
|
53
|
+
writeFileSync(tmp, json, { mode: 0o600 });
|
|
54
|
+
JSON.parse(readFileSync(tmp, "utf-8")); // validate before commit
|
|
55
|
+
if (fsync) {
|
|
56
|
+
try {
|
|
57
|
+
const fd = openSync(tmp, "r");
|
|
58
|
+
fdatasyncSync(fd);
|
|
59
|
+
closeSync(fd);
|
|
60
|
+
}
|
|
61
|
+
catch { }
|
|
62
|
+
}
|
|
63
|
+
// Rolling backup: rotate .bak → .bak.1 → .bak.2 (keep 3 versions)
|
|
64
|
+
// Copy (not rename) so the original stays in place until the atomic rename below.
|
|
65
|
+
if (existsSync(path)) {
|
|
66
|
+
try {
|
|
67
|
+
if (existsSync(path + ".bak.1"))
|
|
68
|
+
copyFileSync(path + ".bak.1", path + ".bak.2");
|
|
69
|
+
}
|
|
70
|
+
catch { }
|
|
71
|
+
try {
|
|
72
|
+
if (existsSync(path + ".bak"))
|
|
73
|
+
copyFileSync(path + ".bak", path + ".bak.1");
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
copyFileSync(path, path + ".bak");
|
|
77
|
+
}
|
|
78
|
+
renameSync(tmp, path);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=safe-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-json.js","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple TTL cache for a single value.
|
|
3
|
+
*/
|
|
4
|
+
export declare class TtlCache<T> {
|
|
5
|
+
private readonly ttlMs;
|
|
6
|
+
private entry;
|
|
7
|
+
constructor(ttlMs: number);
|
|
8
|
+
get(loader: () => T): T;
|
|
9
|
+
/** Return cached value if still valid, without invoking a loader. */
|
|
10
|
+
peek(): T | undefined;
|
|
11
|
+
set(data: T): void;
|
|
12
|
+
invalidate(): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Per-key TTL cache backed by a Map.
|
|
16
|
+
*/
|
|
17
|
+
export declare class TtlMap<K, V> {
|
|
18
|
+
private readonly ttlMs;
|
|
19
|
+
private map;
|
|
20
|
+
private evictionTimer;
|
|
21
|
+
constructor(ttlMs: number);
|
|
22
|
+
get(key: K): V | undefined;
|
|
23
|
+
set(key: K, data: V): void;
|
|
24
|
+
delete(key: K): void;
|
|
25
|
+
clear(): void;
|
|
26
|
+
/** Remove all entries whose TTL has expired. */
|
|
27
|
+
evictExpired(): void;
|
|
28
|
+
get size(): number;
|
|
29
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple TTL cache for a single value.
|
|
3
|
+
*/
|
|
4
|
+
export class TtlCache {
|
|
5
|
+
ttlMs;
|
|
6
|
+
entry = null;
|
|
7
|
+
constructor(ttlMs) {
|
|
8
|
+
this.ttlMs = ttlMs;
|
|
9
|
+
}
|
|
10
|
+
get(loader) {
|
|
11
|
+
const now = Date.now();
|
|
12
|
+
if (this.entry && now - this.entry.ts < this.ttlMs) {
|
|
13
|
+
return this.entry.data;
|
|
14
|
+
}
|
|
15
|
+
const data = loader();
|
|
16
|
+
this.entry = { data, ts: now };
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
/** Return cached value if still valid, without invoking a loader. */
|
|
20
|
+
peek() {
|
|
21
|
+
if (this.entry && Date.now() - this.entry.ts < this.ttlMs) {
|
|
22
|
+
return this.entry.data;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
set(data) {
|
|
27
|
+
this.entry = { data, ts: Date.now() };
|
|
28
|
+
}
|
|
29
|
+
invalidate() {
|
|
30
|
+
this.entry = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Per-key TTL cache backed by a Map.
|
|
35
|
+
*/
|
|
36
|
+
export class TtlMap {
|
|
37
|
+
ttlMs;
|
|
38
|
+
map = new Map();
|
|
39
|
+
evictionTimer = null;
|
|
40
|
+
constructor(ttlMs) {
|
|
41
|
+
this.ttlMs = ttlMs;
|
|
42
|
+
// Automatically evict expired entries to prevent unbounded memory growth
|
|
43
|
+
this.evictionTimer = setInterval(() => this.evictExpired(), ttlMs * 2);
|
|
44
|
+
this.evictionTimer.unref();
|
|
45
|
+
}
|
|
46
|
+
get(key) {
|
|
47
|
+
const entry = this.map.get(key);
|
|
48
|
+
if (!entry)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (Date.now() - entry.ts >= this.ttlMs) {
|
|
51
|
+
this.map.delete(key);
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return entry.data;
|
|
55
|
+
}
|
|
56
|
+
set(key, data) {
|
|
57
|
+
this.map.set(key, { data, ts: Date.now() });
|
|
58
|
+
}
|
|
59
|
+
delete(key) {
|
|
60
|
+
this.map.delete(key);
|
|
61
|
+
}
|
|
62
|
+
clear() {
|
|
63
|
+
this.map.clear();
|
|
64
|
+
}
|
|
65
|
+
/** Remove all entries whose TTL has expired. */
|
|
66
|
+
evictExpired() {
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
for (const [key, entry] of this.map) {
|
|
69
|
+
if (now - entry.ts >= this.ttlMs)
|
|
70
|
+
this.map.delete(key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
get size() {
|
|
74
|
+
return this.map.size;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=ttl-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ttl-cache.js","sourceRoot":"","sources":["../../src/utils/ttl-cache.ts"],"names":[],"mappings":"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"}
|