"use strict"; const assert = require("assert"); const fs = require("fs"); const path = require("path"); const toDataModuleUrl = (source) => `data:text/javascript;base64,${Buffer.from(source).toString("base64")}`; const run = async () => { const sessionPath = path.join(__dirname, "../utils/session.js"); const contextPath = path.join(__dirname, "../utils/genealogy-context.js"); const contextUrl = toDataModuleUrl(fs.readFileSync(contextPath, "utf8")); const originalSessionSource = fs.readFileSync(sessionPath, "utf8"); const sessionSource = originalSessionSource.replace( /from\s+["']\.\/genealogy-context\.js["']\s*;/, `from "${contextUrl}";`, ); assert.notStrictEqual( sessionSource, originalSessionSource, "session 必须消费唯一的当前家谱上下文所有者", ); const storage = new Map(); const removals = []; globalThis.uni = { getStorageSync: (key) => storage.get(key) || "", setStorageSync: (key, value) => storage.set(key, value), removeStorageSync: (key) => { removals.push(key); storage.delete(key); }, }; const { session } = await import(toDataModuleUrl(sessionSource)); assert.throws( () => session.saveToken(""), /会话令牌/, "空令牌不能覆盖现有会话", ); session.saveToken("token-1"); globalThis.uni.setStorageSync("jiapu_current_genealogy_id", "genealogy-1"); assert.strictEqual(session.getToken(), "token-1"); session.saveToken("token-1"); assert.strictEqual( globalThis.uni.getStorageSync("jiapu_current_genealogy_id"), "genealogy-1", "同一会话重复保存不得清掉用户当前家谱", ); session.saveToken("token-2"); assert.strictEqual(session.getToken(), "token-2"); assert.strictEqual( globalThis.uni.getStorageSync("jiapu_current_genealogy_id"), "", "账号令牌变化必须先清理旧账号的家谱上下文", ); globalThis.uni.setStorageSync("jiapu_current_genealogy_id", "genealogy-2"); session.clear(); assert.deepStrictEqual( removals, [ "jiapu_current_genealogy_id", "jiapu_current_genealogy_invalidated", "jiapu_current_genealogy_id", "jiapu_current_genealogy_invalidated", "jiapu_token", "jiapu_current_genealogy_id", "jiapu_current_genealogy_invalidated", ], "换账号与退出必须按唯一 owner 清理旧家谱上下文", ); assert.strictEqual(session.getToken(), ""); assert.strictEqual(globalThis.uni.getStorageSync("jiapu_current_genealogy_id"), ""); assert.strictEqual(globalThis.uni.getStorageSync("jiapu_current_genealogy_invalidated"), ""); process.stdout.write("SESSION-RUNTIME-SMOKE PASS\n"); }; run().catch((error) => { process.stderr.write(`${error.stack || error.message}\n`); process.exit(1); });