implement demo mode

This commit is contained in:
Nystik
2026-05-14 19:26:53 +02:00
parent e021993d61
commit ab89a94088
21 changed files with 1186 additions and 8 deletions

61
src/shims/demo.js Normal file
View File

@@ -0,0 +1,61 @@
// Client-side demo mode hooks.
//
// Detects demo mode via the body data attribute the server stamps in buildIndexHtml.
// Pre-trusts vaults so Obsidian skips its first-run "Trust author" dialog, and bridges no-vault landing to /api/demo/provision.
export function isDemoMode() {
return (
typeof document !== "undefined" &&
document.body &&
document.body.dataset.demoMode === "true"
);
}
// Demo vaults are provisioned from our own template, never from an unknown source.
export function autoTrustDemoVaults(vaultList) {
if (!isDemoMode() || !Array.isArray(vaultList)) {
return;
}
for (const v of vaultList) {
if (v && v.id) {
localStorage.setItem("enable-plugin-" + v.id, "true");
}
}
}
// In demo mode with no vault selected, ask the server to provision one and reload at ?vault=<name>.
// Sync XHR so we block before Obsidian boots. Returns true if navigation is in progress (caller should halt init).
export function maybeProvisionDemoVault() {
if (!isDemoMode()) {
return false;
}
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get("vault")) {
return false;
}
try {
const xhr = new XMLHttpRequest();
xhr.open("GET", "/api/demo/provision", false);
xhr.send();
if (xhr.status === 200) {
const { vault } = JSON.parse(xhr.responseText);
if (vault) {
// Pre-trust before redirect.
localStorage.setItem("enable-plugin-" + vault, "true");
window.location.replace("/?vault=" + encodeURIComponent(vault));
return true;
}
}
} catch (e) {
console.warn("[ignis] Demo provision failed:", e);
}
return false;
}

View File

@@ -9,6 +9,7 @@ import {
initWorkspacePatch,
} from "./workspace.js";
import { prefetchVaultContent } from "./fs/indexer-prefetch.js";
import { autoTrustDemoVaults, maybeProvisionDemoVault } from "./demo.js";
function resolveVaultId() {
const urlParams = new URLSearchParams(window.location.search);
@@ -213,6 +214,10 @@ function initCoreSyncGuardFallback() {
}
export function initialize() {
if (maybeProvisionDemoVault()) {
return;
}
resolveVaultId();
resolveWorkspaceName();
loadPresetIfRequested();
@@ -222,6 +227,7 @@ export function initialize() {
if (bootstrap) {
applyVaultInfo(bootstrap.vault);
window.__vaultList = bootstrap.vaultList;
autoTrustDemoVaults(bootstrap.vaultList);
applyTree(bootstrap.tree);
applyCoreSyncGuard(bootstrap.plugins);