Fix Story 1.3: StateStore spec compliance and minor cleanup
Critical Fix: - StateStore now uses global Hooks.callAll directly (per spec) - Removed hooks parameter from StateStore constructor - Updated module.js to pass only adapter.settings - Updated tests to stub globalThis.Hooks Minor Cleanup: - Fixed misleading warning in SocketHandler.registerPendingOp - Added clarifying comment for setMatrix _revision behavior Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
@@ -8,11 +8,22 @@
|
||||
* Initialisation order:
|
||||
* Hooks.once('init') → register world settings → construct FoundryAdapter
|
||||
* → StateStore → SocketHandler (queue+drain)
|
||||
* Hooks.once('ready') → VisibilityManager → SocketHandler.setReady()
|
||||
* Hooks.once('ready') → hydrate StateStore → probe WebRTC
|
||||
* → Story 1.4: VisibilityManager → SocketHandler.setReady()
|
||||
* → NotificationBus → RoleRenderer → RosterStrip
|
||||
* → DirectorsBoard (lazy, GM only)
|
||||
*/
|
||||
|
||||
import { FoundryAdapter } from './src/foundry/FoundryAdapter.js';
|
||||
import { StateStore } from './src/core/StateStore.js';
|
||||
import { SocketHandler } from './src/core/SocketHandler.js';
|
||||
|
||||
// Module-level references — constructed in init hook, used across hooks
|
||||
let adapter;
|
||||
let stateStore;
|
||||
// eslint-disable-next-line no-unused-vars -- used in Story 1.4 (socketHandler.setReady)
|
||||
let socketHandler;
|
||||
|
||||
Hooks.once("init", () => {
|
||||
console.log("[ScryingPool] init — module loading");
|
||||
|
||||
@@ -29,11 +40,44 @@ Hooks.once("init", () => {
|
||||
},
|
||||
});
|
||||
|
||||
// Story 1.3+: register remaining world settings, construct FoundryAdapter, StateStore, SocketHandler
|
||||
// Construct adapter first — needed for settings registration
|
||||
adapter = new FoundryAdapter(game);
|
||||
|
||||
// Story 1.3: register remaining world settings via adapter
|
||||
adapter.settings.register("visibilityMatrix", {
|
||||
scope: "world",
|
||||
config: false,
|
||||
type: Object,
|
||||
default: { _version: 1, matrix: {} },
|
||||
});
|
||||
|
||||
adapter.settings.register("showGMSelfFeed", {
|
||||
scope: "world",
|
||||
config: true,
|
||||
type: Boolean,
|
||||
default: true,
|
||||
});
|
||||
|
||||
// Construct data layer — constructors are side-effect-free
|
||||
stateStore = new StateStore(adapter.settings);
|
||||
socketHandler = new SocketHandler(adapter.socket, adapter.hooks);
|
||||
});
|
||||
|
||||
Hooks.once("ready", () => {
|
||||
console.log("[ScryingPool] ready — module active");
|
||||
// Story 1.3+: construct VisibilityManager, NotificationBus, RoleRenderer, RosterStrip
|
||||
// Story 1.5+: register DirectorsBoard (lazy, GM only)
|
||||
|
||||
// Hydrate StateStore from persisted world setting (AC-6, AC-7)
|
||||
stateStore.init();
|
||||
|
||||
// Probe WebRTC capability and set adapter.webrtc (AC-8)
|
||||
const outcome = FoundryAdapter.probeCapability(game.webrtc);
|
||||
adapter.webrtc = outcome === 'track-disable'
|
||||
? FoundryAdapter.buildWebRTCSurface(game.webrtc)
|
||||
: null;
|
||||
adapter.settings.set(FoundryAdapter.SETTING_WEBRTC_MODE, outcome).catch(err => {
|
||||
console.error('[ScryingPool] Failed to set webrtcMode setting:', err);
|
||||
});
|
||||
|
||||
// Story 1.4: construct VisibilityManager and call socketHandler.setReady(visibilityManager)
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user