Files
bincio-activity/site/src/lib/manifest.ts
T

49 lines
1.4 KiB
TypeScript

/**
* Build-time helpers for reading the BAS shard manifest.
* Only import this in .astro frontmatter — it uses Node.js APIs.
*/
import { readFileSync } from 'node:fs';
import { join, resolve } from 'node:path';
export function findDataDir(): string | null {
const candidates = [
process.env.BINCIO_DATA_DIR,
resolve(process.cwd(), 'public', 'data'),
resolve(process.cwd(), '..', 'bincio_data'),
].filter(Boolean) as string[];
return candidates.find(d => {
try { readFileSync(join(d, 'index.json')); return true; } catch { return false; }
}) ?? null;
}
export interface ShardHandle {
handle: string;
/** Shard URL as written in the manifest (relative to data root). */
url: string;
}
export function isInstancePrivate(): boolean {
try {
const dataDir = findDataDir();
if (!dataDir) return false;
const root = JSON.parse(readFileSync(join(dataDir, 'index.json'), 'utf-8'));
return root?.instance?.private === true;
} catch {
return false;
}
}
export function readShardHandles(): ShardHandle[] {
try {
const dataDir = findDataDir();
if (!dataDir) return [];
const root = JSON.parse(readFileSync(join(dataDir, 'index.json'), 'utf-8'));
const shards: Array<{ handle?: string; url: string }> = root.shards ?? [];
return shards
.filter(s => !!s.handle)
.map(s => ({ handle: s.handle!, url: s.url }));
} catch {
return [];
}
}