mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-10-09 15:58:34 +00:00
70607cb26d
Split vault/session/settings into publishers and store-backed Hosts so hot fields no longer rebuild the whole shell, and harden Terminal boot / startup effects for StrictMode double-mounts. Co-authored-by: Cursor <cursoragent@cursor.com>
100 lines
3.1 KiB
TypeScript
100 lines
3.1 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import {
|
|
getAppSessionRuntime,
|
|
getAppSettingsRuntime,
|
|
getAppVaultRuntime,
|
|
registerAppSessionRuntime,
|
|
registerAppSettingsRuntime,
|
|
registerAppVaultRuntime,
|
|
subscribeAppSessionRuntime,
|
|
subscribeAppSettingsRuntime,
|
|
subscribeAppVaultRuntime,
|
|
type AppSessionRuntime,
|
|
type AppSettingsRuntime,
|
|
type AppVaultRuntime,
|
|
} from './appRuntimeBridge';
|
|
|
|
const vaultRuntime = (label: string) => ({ label }) as unknown as AppVaultRuntime;
|
|
const sessionRuntime = (label: string) => ({ label }) as unknown as AppSessionRuntime;
|
|
const settingsRuntime = (label: string) => ({ label }) as unknown as AppSettingsRuntime;
|
|
|
|
test('vault slot exposes the last registered runtime and notifies on change', () => {
|
|
let notifications = 0;
|
|
const unsubscribe = subscribeAppVaultRuntime(() => {
|
|
notifications += 1;
|
|
});
|
|
|
|
const first = vaultRuntime('first');
|
|
registerAppVaultRuntime(first);
|
|
assert.equal(getAppVaultRuntime(), first);
|
|
assert.equal(notifications, 1);
|
|
|
|
// Re-registering the same identity is what a render with unchanged state
|
|
// does; it must not wake subscribers.
|
|
registerAppVaultRuntime(first);
|
|
assert.equal(notifications, 1);
|
|
|
|
const second = vaultRuntime('second');
|
|
registerAppVaultRuntime(second);
|
|
assert.equal(getAppVaultRuntime(), second);
|
|
assert.equal(notifications, 2);
|
|
|
|
unsubscribe();
|
|
registerAppVaultRuntime(null);
|
|
assert.equal(getAppVaultRuntime(), null);
|
|
assert.equal(notifications, 2, 'unsubscribed listeners stay quiet');
|
|
});
|
|
|
|
test('session slot is independent from the vault slot', () => {
|
|
let vaultNotifications = 0;
|
|
let sessionNotifications = 0;
|
|
const unsubscribeVault = subscribeAppVaultRuntime(() => {
|
|
vaultNotifications += 1;
|
|
});
|
|
const unsubscribeSession = subscribeAppSessionRuntime(() => {
|
|
sessionNotifications += 1;
|
|
});
|
|
|
|
const runtime = sessionRuntime('session');
|
|
registerAppSessionRuntime(runtime);
|
|
assert.equal(getAppSessionRuntime(), runtime);
|
|
assert.equal(sessionNotifications, 1);
|
|
assert.equal(vaultNotifications, 0);
|
|
|
|
unsubscribeVault();
|
|
unsubscribeSession();
|
|
registerAppSessionRuntime(null);
|
|
});
|
|
|
|
test('settings slot is independent from the vault and session slots', () => {
|
|
let settingsNotifications = 0;
|
|
let otherNotifications = 0;
|
|
const unsubscribeSettings = subscribeAppSettingsRuntime(() => {
|
|
settingsNotifications += 1;
|
|
});
|
|
const unsubscribeVault = subscribeAppVaultRuntime(() => {
|
|
otherNotifications += 1;
|
|
});
|
|
const unsubscribeSession = subscribeAppSessionRuntime(() => {
|
|
otherNotifications += 1;
|
|
});
|
|
|
|
const runtime = settingsRuntime('settings');
|
|
registerAppSettingsRuntime(runtime);
|
|
assert.equal(getAppSettingsRuntime(), runtime);
|
|
assert.equal(settingsNotifications, 1);
|
|
assert.equal(otherNotifications, 0);
|
|
|
|
// A re-render with unchanged state re-registers the same identity.
|
|
registerAppSettingsRuntime(runtime);
|
|
assert.equal(settingsNotifications, 1);
|
|
|
|
unsubscribeSettings();
|
|
unsubscribeVault();
|
|
unsubscribeSession();
|
|
registerAppSettingsRuntime(null);
|
|
assert.equal(getAppSettingsRuntime(), null);
|
|
});
|