File size: 1,368 Bytes
4e23b01 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | import { randomBytes } from 'node:crypto';
import { join } from 'node:path';
import { readPrivateFile, writePrivateFile } from './privateFiles';
export const SERVER_TOKEN_FILE = 'server.token';
export function serverTokenPath(homeDir: string): string {
return join(homeDir, SERVER_TOKEN_FILE);
}
export function generateServerToken(): string {
return randomBytes(32).toString('base64url');
}
export async function writeServerToken(homeDir: string, token: string): Promise<void> {
await writePrivateFile(serverTokenPath(homeDir), token);
}
export async function readServerToken(homeDir: string): Promise<string | undefined> {
try {
const buf = await readPrivateFile(serverTokenPath(homeDir));
return buf.toString('utf8').trim();
} catch (err) {
if ((err as NodeJS.ErrnoException).code === 'ENOENT') {
return undefined;
}
throw err;
}
}
export async function loadOrCreateServerToken(homeDir: string): Promise<string> {
const existing = await readServerToken(homeDir);
if (existing !== undefined && existing.length > 0) {
return existing;
}
const token = generateServerToken();
await writeServerToken(homeDir, token);
return token;
}
export async function rotateServerToken(homeDir: string): Promise<string> {
const token = generateServerToken();
await writeServerToken(homeDir, token);
return token;
}
|