60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
|
|
import {
|
||
|
|
existsSync,
|
||
|
|
mkdirSync,
|
||
|
|
readFileSync,
|
||
|
|
writeFileSync,
|
||
|
|
unlinkSync,
|
||
|
|
} from "node:fs";
|
||
|
|
import { join } from "node:path";
|
||
|
|
import { INTERACTIVE_BASH_SESSION_STORAGE } from "./constants";
|
||
|
|
import type {
|
||
|
|
InteractiveBashSessionState,
|
||
|
|
SerializedInteractiveBashSessionState,
|
||
|
|
} from "./types";
|
||
|
|
|
||
|
|
function getStoragePath(sessionID: string): string {
|
||
|
|
return join(INTERACTIVE_BASH_SESSION_STORAGE, `${sessionID}.json`);
|
||
|
|
}
|
||
|
|
|
||
|
|
export function loadInteractiveBashSessionState(
|
||
|
|
sessionID: string,
|
||
|
|
): InteractiveBashSessionState | null {
|
||
|
|
const filePath = getStoragePath(sessionID);
|
||
|
|
if (!existsSync(filePath)) return null;
|
||
|
|
|
||
|
|
try {
|
||
|
|
const content = readFileSync(filePath, "utf-8");
|
||
|
|
const serialized = JSON.parse(content) as SerializedInteractiveBashSessionState;
|
||
|
|
return {
|
||
|
|
sessionID: serialized.sessionID,
|
||
|
|
tmuxSessions: new Set(serialized.tmuxSessions),
|
||
|
|
updatedAt: serialized.updatedAt,
|
||
|
|
};
|
||
|
|
} catch {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export function saveInteractiveBashSessionState(
|
||
|
|
state: InteractiveBashSessionState,
|
||
|
|
): void {
|
||
|
|
if (!existsSync(INTERACTIVE_BASH_SESSION_STORAGE)) {
|
||
|
|
mkdirSync(INTERACTIVE_BASH_SESSION_STORAGE, { recursive: true });
|
||
|
|
}
|
||
|
|
|
||
|
|
const filePath = getStoragePath(state.sessionID);
|
||
|
|
const serialized: SerializedInteractiveBashSessionState = {
|
||
|
|
sessionID: state.sessionID,
|
||
|
|
tmuxSessions: Array.from(state.tmuxSessions),
|
||
|
|
updatedAt: state.updatedAt,
|
||
|
|
};
|
||
|
|
writeFileSync(filePath, JSON.stringify(serialized, null, 2));
|
||
|
|
}
|
||
|
|
|
||
|
|
export function clearInteractiveBashSessionState(sessionID: string): void {
|
||
|
|
const filePath = getStoragePath(sessionID);
|
||
|
|
if (existsSync(filePath)) {
|
||
|
|
unlinkSync(filePath);
|
||
|
|
}
|
||
|
|
}
|