1eb0f650ab
The managed runner is de-privileged on Windows now (runs as LocalService), and %ProgramData%\punktfunk is locked read-only to it — so writing config/ cache straight under the config dir fails EPERM. Move the plugin's state to <config_dir>/plugin-state/playnite, which `punktfunk-host plugins enable` grants the runner write on. On Linux the runner owns the config dir, so the path is writable there too. First release, so no migration needed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
// State persistence lands under `<config_dir>/plugin-state/playnite` — the one dir the
|
|
// de-privileged Windows runner (LocalService) may write. A regression here (writing straight under
|
|
// the config dir) would EPERM under the runner and lose the operator's config.
|
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
import * as fs from "node:fs";
|
|
import * as os from "node:os";
|
|
import * as path from "node:path";
|
|
import { loadConfig, saveRawConfig } from "../src/state.js";
|
|
|
|
let root: string;
|
|
let saved: string | undefined;
|
|
|
|
beforeEach(() => {
|
|
saved = process.env.PUNKTFUNK_CONFIG_DIR;
|
|
root = fs.mkdtempSync(path.join(os.tmpdir(), "pn-state-"));
|
|
process.env.PUNKTFUNK_CONFIG_DIR = root;
|
|
});
|
|
afterEach(() => {
|
|
if (saved === undefined) delete process.env.PUNKTFUNK_CONFIG_DIR;
|
|
else process.env.PUNKTFUNK_CONFIG_DIR = saved;
|
|
fs.rmSync(root, { recursive: true, force: true });
|
|
});
|
|
|
|
describe("state location", () => {
|
|
test("persists under plugin-state/playnite and round-trips", () => {
|
|
saveRawConfig({ playniteDir: "/games/playnite" });
|
|
expect(
|
|
fs.existsSync(path.join(root, "plugin-state", "playnite", "config.json")),
|
|
).toBe(true);
|
|
// Not written straight under the config dir (the LocalService-unwritable location).
|
|
expect(fs.existsSync(path.join(root, "playnite", "config.json"))).toBe(
|
|
false,
|
|
);
|
|
expect(loadConfig().playniteDir).toBe("/games/playnite");
|
|
});
|
|
});
|