Files
ignis/apps/ignis-server/server/config.js

117 lines
3.2 KiB
JavaScript
Raw Normal View History

2026-03-10 21:07:19 +01:00
const path = require("path");
2026-03-10 22:31:01 +01:00
const fs = require("fs");
2026-05-21 17:26:08 +02:00
const REPO_ROOT = path.join(__dirname, "..", "..", "..");
2026-03-10 22:31:01 +01:00
// VAULT_ROOT: a directory that contains vault folders.
// Each subdirectory is a vault. New vaults are created as new subdirs.
const vaultRoot = process.env.VAULT_ROOT || path.join(REPO_ROOT, "vaults");
2026-03-10 22:31:01 +01:00
2026-05-21 17:26:08 +02:00
const dataRoot = process.env.DATA_ROOT || path.join(REPO_ROOT, "data");
2026-03-26 23:55:12 +01:00
// Ensure required directories exist
2026-03-12 21:34:39 +01:00
try {
fs.mkdirSync(vaultRoot, { recursive: true });
} catch (e) {
console.error("[config] Failed to create VAULT_ROOT:", vaultRoot, e.message);
}
2026-03-26 23:55:12 +01:00
try {
fs.mkdirSync(dataRoot, { recursive: true });
} catch (e) {
console.error("[config] Failed to create DATA_ROOT:", dataRoot, e.message);
}
2026-03-10 22:31:01 +01:00
function discoverVaults() {
const vaults = {};
2026-03-17 12:38:30 +01:00
2026-03-10 22:31:01 +01:00
try {
const entries = fs.readdirSync(vaultRoot, { withFileTypes: true });
2026-03-17 12:38:30 +01:00
2026-03-10 22:31:01 +01:00
for (const entry of entries) {
if (entry.isDirectory() && !entry.name.startsWith(".")) {
vaults[entry.name] = path.join(vaultRoot, entry.name);
}
}
} catch (e) {
console.error("[config] Failed to read VAULT_ROOT:", vaultRoot, e.message);
}
2026-03-17 12:38:30 +01:00
// Optionally create a default vault if none exist
if (
Object.keys(vaults).length === 0 &&
process.env.AUTO_CREATE_DEFAULT === "true"
) {
2026-03-12 21:34:39 +01:00
const defaultPath = path.join(vaultRoot, "My Vault");
2026-03-17 12:38:30 +01:00
2026-03-12 21:34:39 +01:00
try {
fs.mkdirSync(path.join(defaultPath, ".obsidian"), { recursive: true });
vaults["My Vault"] = defaultPath;
2026-03-17 12:38:30 +01:00
2026-03-12 21:34:39 +01:00
console.log("[config] Created default vault: My Vault");
} catch (e) {
console.error("[config] Failed to create default vault:", e.message);
}
}
2026-03-10 22:31:01 +01:00
return vaults;
}
let vaults = discoverVaults();
2026-03-07 09:51:37 +01:00
module.exports = {
port: process.env.PORT || 8080,
2026-03-10 22:31:01 +01:00
vaultRoot,
2026-03-26 23:55:12 +01:00
dataRoot,
2026-03-10 22:31:01 +01:00
get vaults() {
return vaults;
},
get defaultVaultId() {
return Object.keys(vaults)[0] || null;
},
getVaultPath(id) {
return vaults[id] || null;
},
refreshVaults() {
vaults = discoverVaults();
return vaults;
},
2026-05-10 00:17:59 +02:00
writeCoalesceMs:
process.env.WRITE_COALESCE_MS !== undefined
? parseInt(process.env.WRITE_COALESCE_MS)
: 5000,
2026-05-09 13:02:25 +02:00
wsOrigins: process.env.WS_ORIGINS
? process.env.WS_ORIGINS.split(",")
.map((s) => s.trim())
.filter(Boolean)
: null,
2026-05-14 19:26:53 +02:00
demoMode: process.env.DEMO_MODE === "true",
demoMaxSessions: parseInt(process.env.DEMO_MAX_SESSIONS) || 20,
demoVaultsPerSession: parseInt(process.env.DEMO_VAULTS_PER_SESSION) || 3,
demoSessionQuotaBytes:
parseInt(process.env.DEMO_SESSION_QUOTA_BYTES) || 700 * 1024,
demoTimeoutMs: parseInt(process.env.DEMO_TIMEOUT_MS) || 30 * 60 * 1000,
demoTemplateDir:
process.env.DEMO_TEMPLATE_DIR || path.join(__dirname, "demo-template"),
2026-05-14 19:26:53 +02:00
2026-03-10 21:07:19 +01:00
obsidianAssetsPath:
process.env.OBSIDIAN_ASSETS_PATH ||
2026-05-21 17:26:08 +02:00
path.join(REPO_ROOT, "investigation", "obsidian_1.12.7_unpacked"),
2026-03-12 22:46:53 +01:00
get obsidianVersion() {
const assetsPath =
process.env.OBSIDIAN_ASSETS_PATH ||
path.join(__dirname, "..", "investigation", "obsidian_1.12.7_unpacked");
q;
2026-03-12 22:46:53 +01:00
try {
const pkg = JSON.parse(
fs.readFileSync(path.join(assetsPath, "package.json"), "utf-8"),
);
return pkg.version || "0.0.0";
} catch {
return "0.0.0";
}
},
2026-03-07 09:51:37 +01:00
};