@directive-run/core 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","requestId","value","pending","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","send","request","reject","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.cjs","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /** Get a distributable snapshot */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot>;\n /** Inspect the system state */\n inspect(): Promise<SystemInspection>;\n /** Wait for the system to settle */\n settle(timeout?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks\n const pendingRequests = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n let requestIdCounter = 0;\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n onError?.(event.message, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n pendingRequests.set(message.requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request({ type: \"GET_SNAPSHOT\", options, requestId });\n },\n\n inspect(): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request({ type: \"INSPECT\", requestId });\n },\n\n settle(timeout?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request({ type: \"SETTLE\", timeout, requestId });\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
1
+ {"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","DEFAULT_REQUEST_TIMEOUT_MS","clearPendingTimeout","requestId","pending","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","value","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","msg","err","send","request","timeoutMs","reject","entry","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.cjs","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /**\n * Get a distributable snapshot.\n *\n * @param options Snapshot options forwarded to the worker.\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot>;\n /**\n * Inspect the system state.\n *\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n inspect(timeoutMs?: number): Promise<SystemInspection>;\n /**\n * Wait for the system to settle.\n *\n * @param timeout Settle timeout forwarded to the worker (separate from request timeout).\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n settle(timeout?: number, timeoutMs?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks. Each entry MAY hold a timeout handle so we\n // can clear it on resolve/reject without leaking the timer.\n const pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n }\n >();\n let requestIdCounter = 0;\n\n /** Default per-request timeout (ms). 0 / Infinity = disabled. */\n const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\n function clearPendingTimeout(requestId: string): void {\n const pending = pendingRequests.get(requestId);\n if (pending?.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n }\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearPendingTimeout(requestId);\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n clearPendingTimeout(message.requestId);\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n const msg =\n event && typeof event === \"object\" && \"message\" in event\n ? String((event as { message?: unknown }).message ?? \"unknown error\")\n : \"unknown error\";\n // Reject ALL pending requests so they don't leak when the worker dies.\n if (pendingRequests.size > 0) {\n const err = new Error(`[Directive] worker errored: ${msg}`);\n for (const [, pending] of pendingRequests) {\n if (pending.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n pending.reject(err);\n }\n pendingRequests.clear();\n }\n onError?.(msg, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n timeoutMs: number = DEFAULT_REQUEST_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const entry: {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n } = {\n resolve: resolve as (value: unknown) => void,\n reject,\n };\n\n // Only arm the timer if a finite positive timeout was requested.\n if (\n Number.isFinite(timeoutMs) &&\n (timeoutMs as number) > 0\n ) {\n entry.timeoutHandle = setTimeout(() => {\n if (pendingRequests.has(message.requestId)) {\n pendingRequests.delete(message.requestId);\n reject(\n new Error(\n `[Directive] worker request timed out after ${timeoutMs}ms`,\n ),\n );\n }\n }, timeoutMs);\n }\n\n pendingRequests.set(message.requestId, entry);\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request(\n { type: \"GET_SNAPSHOT\", options, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n inspect(timeoutMs?: number): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request(\n { type: \"INSPECT\", requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n settle(timeout?: number, timeoutMs?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request(\n { type: \"SETTLE\", timeout, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
package/dist/worker.d.cts CHANGED
@@ -143,12 +143,29 @@ interface WorkerClient {
143
143
  type: string;
144
144
  [key: string]: unknown;
145
145
  }): void;
146
- /** Get a distributable snapshot */
147
- getSnapshot(options?: DistributableSnapshotOptions): Promise<DistributableSnapshot>;
148
- /** Inspect the system state */
149
- inspect(): Promise<SystemInspection>;
150
- /** Wait for the system to settle */
151
- settle(timeout?: number): Promise<void>;
146
+ /**
147
+ * Get a distributable snapshot.
148
+ *
149
+ * @param options Snapshot options forwarded to the worker.
150
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
151
+ * Pass `0` or `Infinity` to disable the timeout.
152
+ */
153
+ getSnapshot(options?: DistributableSnapshotOptions, timeoutMs?: number): Promise<DistributableSnapshot>;
154
+ /**
155
+ * Inspect the system state.
156
+ *
157
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
158
+ * Pass `0` or `Infinity` to disable the timeout.
159
+ */
160
+ inspect(timeoutMs?: number): Promise<SystemInspection>;
161
+ /**
162
+ * Wait for the system to settle.
163
+ *
164
+ * @param timeout Settle timeout forwarded to the worker (separate from request timeout).
165
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
166
+ * Pass `0` or `Infinity` to disable the timeout.
167
+ */
168
+ settle(timeout?: number, timeoutMs?: number): Promise<void>;
152
169
  /** Terminate the worker */
153
170
  terminate(): void;
154
171
  }
package/dist/worker.d.ts CHANGED
@@ -143,12 +143,29 @@ interface WorkerClient {
143
143
  type: string;
144
144
  [key: string]: unknown;
145
145
  }): void;
146
- /** Get a distributable snapshot */
147
- getSnapshot(options?: DistributableSnapshotOptions): Promise<DistributableSnapshot>;
148
- /** Inspect the system state */
149
- inspect(): Promise<SystemInspection>;
150
- /** Wait for the system to settle */
151
- settle(timeout?: number): Promise<void>;
146
+ /**
147
+ * Get a distributable snapshot.
148
+ *
149
+ * @param options Snapshot options forwarded to the worker.
150
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
151
+ * Pass `0` or `Infinity` to disable the timeout.
152
+ */
153
+ getSnapshot(options?: DistributableSnapshotOptions, timeoutMs?: number): Promise<DistributableSnapshot>;
154
+ /**
155
+ * Inspect the system state.
156
+ *
157
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
158
+ * Pass `0` or `Infinity` to disable the timeout.
159
+ */
160
+ inspect(timeoutMs?: number): Promise<SystemInspection>;
161
+ /**
162
+ * Wait for the system to settle.
163
+ *
164
+ * @param timeout Settle timeout forwarded to the worker (separate from request timeout).
165
+ * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.
166
+ * Pass `0` or `Infinity` to disable the timeout.
167
+ */
168
+ settle(timeout?: number, timeoutMs?: number): Promise<void>;
152
169
  /** Terminate the worker */
153
170
  terminate(): void;
154
171
  }
package/dist/worker.js CHANGED
@@ -1,2 +1,2 @@
1
- function _(o){let{worker:c,onFactChange:l,onDerivationChange:y,onRequirementCreated:E,onRequirementMet:a,onError:r}=o,s=new Map,u=0,t=null,i=null,d=null,T=null;function g(e){return e?.(),null}function R(e,n){let S=s.get(e);S&&(S.resolve(n),s.delete(e));}function M(){t=g(t);}function m(){i=g(i);}function I(){d=g(d);}function b(){T=g(T);}function h(e){l?.(e.key,e.value,e.prev);}function O(e){y?.(e.key,e.value);}function W(e){E?.(e.requirement);}function C(e){a?.(e.requirementId,e.resolverId);}function P(e){r?.(e.error,e.source);}function D(e){R(e.requestId,e.snapshot);}function w(e){R(e.requestId,e.inspection);}function q(e){let n=s.get(e.requestId);n&&(e.success?n.resolve(void 0):n.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let n=e.data;switch(n.type){case "READY":return M();case "STARTED":return m();case "STOPPED":return I();case "DESTROYED":return b();case "FACT_CHANGED":return h(n);case "DERIVATION_CHANGED":return O(n);case "REQUIREMENT_CREATED":return W(n);case "REQUIREMENT_MET":return C(n);case "ERROR":return P(n);case "SNAPSHOT_RESULT":return D(n);case "INSPECT_RESULT":return w(n);case "SETTLE_RESULT":return q(n)}},c.onerror=e=>{r?.(e.message,"worker");};function p(e){c.postMessage(e);}function k(e){return new Promise((n,S)=>{s.set(e.requestId,{resolve:n,reject:S}),p(e);})}return {init(e){return new Promise(n=>{t=n,p({type:"INIT",config:e});})},start(){return new Promise(e=>{i=e,p({type:"START"});})},stop(){return new Promise(e=>{d=e,p({type:"STOP"});})},destroy(){return new Promise(e=>{T=e,p({type:"DESTROY"});})},setFact(e,n){p({type:"SET_FACT",key:e,value:n});},setFacts(e){p({type:"SET_FACTS",facts:e});},dispatch(e){p({type:"DISPATCH",event:e});},getSnapshot(e){let n=`snapshot-${++u}`;return k({type:"GET_SNAPSHOT",options:e,requestId:n})},inspect(){let e=`inspect-${++u}`;return k({type:"INSPECT",requestId:e})},settle(e){let n=`settle-${++u}`;return k({type:"SETTLE",timeout:e,requestId:n})},terminate(){c.terminate();}}}var v=null;function f(){return v||(v=new Map),v}function N(o,c){f().set(o,c);}function x(){let o=null;async function c(t){let i=await A(t.config);return postMessage({type:"READY"}),i}function l(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function E(t){t.destroy(),postMessage({type:"DESTROYED"});}function a(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function r(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function u(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":l(o);break;case "STOP":y(o);break;case "DESTROY":E(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":a(o,t);break;case "INSPECT":r(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await u(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function A(o){let{createSystem:c}=await import('./system-A6VYKLVF.js'),l=f(),y={};for(let r of o.moduleNames){let s=l.get(r);if(!s)throw new Error(`[Directive Worker] Module "${r}" not registered. Call registerWorkerModule('${r}', module) before handling messages.`);y[r]=s;}let a=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(r,s,u)=>{postMessage({type:"FACT_CHANGED",key:r,value:s,prev:u});},onDerivationCompute:(r,s)=>{postMessage({type:"DERIVATION_CHANGED",key:r,value:s});},onRequirementCreated:r=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...r.requirement,id:r.id}});},onRequirementMet:(r,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:r.id,resolverId:s});}}],history:o.history});return {start:()=>a.start(),stop:()=>a.stop(),destroy:()=>a.destroy(),setFact:(r,s)=>{a.facts[r]=s;},setFacts:r=>{let s=a.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[u,t]of Object.entries(r))s[u]=t;});else for(let[u,t]of Object.entries(r))s[u]=t;},dispatch:r=>{a.dispatch(r);},getSnapshot:r=>a.getDistributableSnapshot(r),inspect:()=>a.inspect(),settle:r=>a.settle(r)}}export{_ as createWorkerClient,f as getWorkerModuleRegistry,x as handleWorkerMessages,N as registerWorkerModule};//# sourceMappingURL=worker.js.map
1
+ function H(o){let{worker:c,onFactChange:T,onDerivationChange:y,onRequirementCreated:g,onRequirementMet:u,onError:n}=o,s=new Map,a=0,t=3e4;function i(e){let r=s.get(e);r?.timeoutHandle!==void 0&&clearTimeout(r.timeoutHandle);}let d=null,S=null,f=null,v=null;function k(e){return e?.(),null}function M(e,r){let p=s.get(e);p&&(i(e),p.resolve(r),s.delete(e));}function h(){d=k(d);}function O(){S=k(S);}function W(){f=k(f);}function C(){v=k(v);}function w(e){T?.(e.key,e.value,e.prev);}function D(e){y?.(e.key,e.value);}function P(e){g?.(e.requirement);}function q(e){u?.(e.requirementId,e.resolverId);}function _(e){n?.(e.error,e.source);}function A(e){M(e.requestId,e.snapshot);}function N(e){M(e.requestId,e.inspection);}function x(e){let r=s.get(e.requestId);r&&(i(e.requestId),e.success?r.resolve(void 0):r.reject(new Error(e.error||"Settle failed")),s.delete(e.requestId));}c.onmessage=e=>{let r=e.data;switch(r.type){case "READY":return h();case "STARTED":return O();case "STOPPED":return W();case "DESTROYED":return C();case "FACT_CHANGED":return w(r);case "DERIVATION_CHANGED":return D(r);case "REQUIREMENT_CREATED":return P(r);case "REQUIREMENT_MET":return q(r);case "ERROR":return _(r);case "SNAPSHOT_RESULT":return A(r);case "INSPECT_RESULT":return N(r);case "SETTLE_RESULT":return x(r)}},c.onerror=e=>{let r=e&&typeof e=="object"&&"message"in e?String(e.message??"unknown error"):"unknown error";if(s.size>0){let p=new Error(`[Directive] worker errored: ${r}`);for(let[,E]of s)E.timeoutHandle!==void 0&&clearTimeout(E.timeoutHandle),E.reject(p);s.clear();}n?.(r,"worker");};function l(e){c.postMessage(e);}function m(e,r=t){return new Promise((p,E)=>{let I={resolve:p,reject:E};Number.isFinite(r)&&r>0&&(I.timeoutHandle=setTimeout(()=>{s.has(e.requestId)&&(s.delete(e.requestId),E(new Error(`[Directive] worker request timed out after ${r}ms`)));},r)),s.set(e.requestId,I),l(e);})}return {init(e){return new Promise(r=>{d=r,l({type:"INIT",config:e});})},start(){return new Promise(e=>{S=e,l({type:"START"});})},stop(){return new Promise(e=>{f=e,l({type:"STOP"});})},destroy(){return new Promise(e=>{v=e,l({type:"DESTROY"});})},setFact(e,r){l({type:"SET_FACT",key:e,value:r});},setFacts(e){l({type:"SET_FACTS",facts:e});},dispatch(e){l({type:"DISPATCH",event:e});},getSnapshot(e,r){let p=`snapshot-${++a}`;return m({type:"GET_SNAPSHOT",options:e,requestId:p},r??t)},inspect(e){let r=`inspect-${++a}`;return m({type:"INSPECT",requestId:r},e??t)},settle(e,r){let p=`settle-${++a}`;return m({type:"SETTLE",timeout:e,requestId:p},r??t)},terminate(){c.terminate();}}}var R=null;function b(){return R||(R=new Map),R}function L(o,c){b().set(o,c);}function U(){let o=null;async function c(t){let i=await F(t.config);return postMessage({type:"READY"}),i}function T(t){t.start(),postMessage({type:"STARTED"});}function y(t){t.stop(),postMessage({type:"STOPPED"});}function g(t){t.destroy(),postMessage({type:"DESTROYED"});}function u(t,i){let d=t.getSnapshot(i.options);postMessage({type:"SNAPSHOT_RESULT",requestId:i.requestId,snapshot:d});}function n(t,i){let d=t.inspect();postMessage({type:"INSPECT_RESULT",requestId:i.requestId,inspection:d});}async function s(t,i){try{await t.settle(i.timeout),postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:!0});}catch(d){postMessage({type:"SETTLE_RESULT",requestId:i.requestId,success:false,error:d instanceof Error?d.message:String(d)});}}async function a(t){if(t.type==="INIT"){o=await c(t);return}if(o)switch(t.type){case "START":T(o);break;case "STOP":y(o);break;case "DESTROY":g(o),o=null;break;case "SET_FACT":o.setFact(t.key,t.value);break;case "SET_FACTS":o.setFacts(t.facts);break;case "DISPATCH":o.dispatch(t.event);break;case "GET_SNAPSHOT":u(o,t);break;case "INSPECT":n(o,t);break;case "SETTLE":await s(o,t);break}}self.onmessage=async t=>{try{await a(t.data);}catch(i){postMessage({type:"ERROR",error:i instanceof Error?i.message:String(i),source:t.data.type});}};}async function F(o){let{createSystem:c}=await import('./system-A6VYKLVF.js'),T=b(),y={};for(let n of o.moduleNames){let s=T.get(n);if(!s)throw new Error(`[Directive Worker] Module "${n}" not registered. Call registerWorkerModule('${n}', module) before handling messages.`);y[n]=s;}let u=c({modules:y,plugins:[{name:"__worker-tracking__",onFactSet:(n,s,a)=>{postMessage({type:"FACT_CHANGED",key:n,value:s,prev:a});},onDerivationCompute:(n,s)=>{postMessage({type:"DERIVATION_CHANGED",key:n,value:s});},onRequirementCreated:n=>{postMessage({type:"REQUIREMENT_CREATED",requirement:{...n.requirement,id:n.id}});},onRequirementMet:(n,s)=>{postMessage({type:"REQUIREMENT_MET",requirementId:n.id,resolverId:s});}}],history:o.history});return {start:()=>u.start(),stop:()=>u.stop(),destroy:()=>u.destroy(),setFact:(n,s)=>{u.facts[n]=s;},setFacts:n=>{let s=u.facts;if(s.$store?.batch)s.$store.batch(()=>{for(let[a,t]of Object.entries(n))s[a]=t;});else for(let[a,t]of Object.entries(n))s[a]=t;},dispatch:n=>{u.dispatch(n);},getSnapshot:n=>u.getDistributableSnapshot(n),inspect:()=>u.inspect(),settle:n=>u.settle(n)}}export{H as createWorkerClient,b as getWorkerModuleRegistry,U as handleWorkerMessages,L as registerWorkerModule};//# sourceMappingURL=worker.js.map
2
2
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","requestId","value","pending","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","send","request","reject","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.js","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /** Get a distributable snapshot */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot>;\n /** Inspect the system state */\n inspect(): Promise<SystemInspection>;\n /** Wait for the system to settle */\n settle(timeout?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks\n const pendingRequests = new Map<\n string,\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\n >();\n let requestIdCounter = 0;\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n onError?.(event.message, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n pendingRequests.set(message.requestId, {\n resolve: resolve as (value: unknown) => void,\n reject,\n });\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request({ type: \"GET_SNAPSHOT\", options, requestId });\n },\n\n inspect(): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request({ type: \"INSPECT\", requestId });\n },\n\n settle(timeout?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request({ type: \"SETTLE\", timeout, requestId });\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
1
+ {"version":3,"sources":["../src/adapters/worker.ts"],"names":["createWorkerClient","options","worker","onFactChange","onDerivationChange","onRequirementCreated","onRequirementMet","onError","pendingRequests","requestIdCounter","DEFAULT_REQUEST_TIMEOUT_MS","clearPendingTimeout","requestId","pending","initResolve","startResolve","stopResolve","destroyResolve","resolveLifecycle","resolve","resolvePendingRequest","value","handleReady","handleStarted","handleStopped","handleDestroyed","handleFactChanged","message","handleDerivationChanged","handleRequirementCreated","handleRequirementMet","handleError","handleSnapshotResult","handleInspectResult","handleSettleResult","event","msg","err","send","request","timeoutMs","reject","entry","config","key","facts","timeout","workerModuleRegistry","getWorkerModuleRegistry","registerWorkerModule","name","module","handleWorkerMessages","system","handleInit","created","createWorkerSystem","handleStart","sys","handleStop","handleDestroy","handleGetSnapshot","snapshot","handleInspect","inspection","handleSettle","error","dispatchMessage","createSystem","registry","modules","prev","id","req","resolverId","factsProxy"],"mappings":"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","file":"worker.js","sourcesContent":["/**\n * Web Worker Adapter - Run Directive engine off the main thread\n *\n * Features:\n * - Run computations in a dedicated worker\n * - Synchronized state between main thread and worker\n * - Automatic serialization of facts and derivations\n * - Event-based communication\n */\n\nimport type {\n DistributableSnapshot,\n DistributableSnapshotOptions,\n ModuleSchema,\n Requirement,\n SystemInspection,\n} from \"../core/types.js\";\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Messages sent from main thread to worker */\nexport type WorkerInboundMessage =\n | { type: \"INIT\"; config: WorkerSystemConfig }\n | { type: \"START\" }\n | { type: \"STOP\" }\n | { type: \"DESTROY\" }\n | { type: \"SET_FACT\"; key: string; value: unknown }\n | { type: \"SET_FACTS\"; facts: Record<string, unknown> }\n | { type: \"DISPATCH\"; event: { type: string; [key: string]: unknown } }\n | {\n type: \"GET_SNAPSHOT\";\n options?: DistributableSnapshotOptions;\n requestId: string;\n }\n | { type: \"INSPECT\"; requestId: string }\n | { type: \"SETTLE\"; timeout?: number; requestId: string };\n\n/** Messages sent from worker to main thread */\nexport type WorkerOutboundMessage =\n | { type: \"READY\" }\n | { type: \"STARTED\" }\n | { type: \"STOPPED\" }\n | { type: \"DESTROYED\" }\n | { type: \"FACT_CHANGED\"; key: string; value: unknown; prev: unknown }\n | { type: \"DERIVATION_CHANGED\"; key: string; value: unknown }\n | { type: \"REQUIREMENT_CREATED\"; requirement: Requirement & { id: string } }\n | { type: \"REQUIREMENT_MET\"; requirementId: string; resolverId: string }\n | { type: \"ERROR\"; error: string; source?: string }\n | {\n type: \"SNAPSHOT_RESULT\";\n requestId: string;\n snapshot: DistributableSnapshot;\n }\n | { type: \"INSPECT_RESULT\"; requestId: string; inspection: SystemInspection }\n | {\n type: \"SETTLE_RESULT\";\n requestId: string;\n success: boolean;\n error?: string;\n };\n\n// ============================================================================\n// Worker System Config\n// ============================================================================\n\n/**\n * Configuration for creating a system inside a worker.\n * Note: Functions cannot be serialized, so modules must be defined\n * in the worker script itself using createWorkerModule.\n */\nexport interface WorkerSystemConfig {\n /** Module names to initialize (modules must be registered in worker) */\n moduleNames: string[];\n /** History configuration for snapshot-based state history */\n history?:\n | boolean\n | {\n maxSnapshots?: number;\n };\n}\n\n// ============================================================================\n// Main Thread API\n// ============================================================================\n\n/**\n * Options for creating a worker client.\n */\nexport interface WorkerClientOptions {\n /** The web worker instance */\n worker: Worker;\n /** Callback when a fact changes in the worker */\n onFactChange?: (key: string, value: unknown, prev: unknown) => void;\n /** Callback when a derivation changes in the worker */\n onDerivationChange?: (key: string, value: unknown) => void;\n /** Callback when a requirement is created */\n onRequirementCreated?: (requirement: Requirement & { id: string }) => void;\n /** Callback when a requirement is met */\n onRequirementMet?: (requirementId: string, resolverId: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string, source?: string) => void;\n}\n\n/**\n * Client for interacting with a Directive system running in a Web Worker.\n */\nexport interface WorkerClient {\n /** Initialize the worker system */\n init(config: WorkerSystemConfig): Promise<void>;\n /** Start the worker system */\n start(): Promise<void>;\n /** Stop the worker system */\n stop(): Promise<void>;\n /** Destroy the worker system and terminate the worker */\n destroy(): Promise<void>;\n /** Set a single fact */\n setFact(key: string, value: unknown): void;\n /** Set multiple facts at once */\n setFacts(facts: Record<string, unknown>): void;\n /** Dispatch an event */\n dispatch(event: { type: string; [key: string]: unknown }): void;\n /**\n * Get a distributable snapshot.\n *\n * @param options Snapshot options forwarded to the worker.\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot>;\n /**\n * Inspect the system state.\n *\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n inspect(timeoutMs?: number): Promise<SystemInspection>;\n /**\n * Wait for the system to settle.\n *\n * @param timeout Settle timeout forwarded to the worker (separate from request timeout).\n * @param timeoutMs Per-request timeout in ms. Defaults to 30_000.\n * Pass `0` or `Infinity` to disable the timeout.\n */\n settle(timeout?: number, timeoutMs?: number): Promise<void>;\n /** Terminate the worker */\n terminate(): void;\n}\n\n/**\n * Create a client for communicating with a Directive worker.\n *\n * @example\n * ```typescript\n * // main.ts\n * const worker = new Worker(new URL('./directive.worker.ts', import.meta.url));\n * const client = createWorkerClient({\n * worker,\n * onFactChange: (key, value) => console.log(`Fact ${key} = ${value}`),\n * });\n *\n * await client.init({ moduleNames: ['myModule'] });\n * await client.start();\n * client.setFact('userId', '123');\n * ```\n */\nexport function createWorkerClient(options: WorkerClientOptions): WorkerClient {\n const {\n worker,\n onFactChange,\n onDerivationChange,\n onRequirementCreated,\n onRequirementMet,\n onError,\n } = options;\n\n // Pending request callbacks. Each entry MAY hold a timeout handle so we\n // can clear it on resolve/reject without leaking the timer.\n const pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n }\n >();\n let requestIdCounter = 0;\n\n /** Default per-request timeout (ms). 0 / Infinity = disabled. */\n const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\n function clearPendingTimeout(requestId: string): void {\n const pending = pendingRequests.get(requestId);\n if (pending?.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n }\n\n // Promise resolvers for lifecycle events\n let initResolve: (() => void) | null = null;\n let startResolve: (() => void) | null = null;\n let stopResolve: (() => void) | null = null;\n let destroyResolve: (() => void) | null = null;\n\n // ---- Outbound message handlers ----\n\n function resolveLifecycle(resolve: (() => void) | null): (() => void) | null {\n resolve?.();\n\n return null;\n }\n\n function resolvePendingRequest(requestId: string, value: unknown): void {\n const pending = pendingRequests.get(requestId);\n if (pending) {\n clearPendingTimeout(requestId);\n pending.resolve(value);\n pendingRequests.delete(requestId);\n }\n }\n\n function handleReady(): void {\n initResolve = resolveLifecycle(initResolve);\n }\n\n function handleStarted(): void {\n startResolve = resolveLifecycle(startResolve);\n }\n\n function handleStopped(): void {\n stopResolve = resolveLifecycle(stopResolve);\n }\n\n function handleDestroyed(): void {\n destroyResolve = resolveLifecycle(destroyResolve);\n }\n\n function handleFactChanged(\n message: Extract<WorkerOutboundMessage, { type: \"FACT_CHANGED\" }>,\n ): void {\n onFactChange?.(message.key, message.value, message.prev);\n }\n\n function handleDerivationChanged(\n message: Extract<WorkerOutboundMessage, { type: \"DERIVATION_CHANGED\" }>,\n ): void {\n onDerivationChange?.(message.key, message.value);\n }\n\n function handleRequirementCreated(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_CREATED\" }>,\n ): void {\n onRequirementCreated?.(message.requirement);\n }\n\n function handleRequirementMet(\n message: Extract<WorkerOutboundMessage, { type: \"REQUIREMENT_MET\" }>,\n ): void {\n onRequirementMet?.(message.requirementId, message.resolverId);\n }\n\n function handleError(\n message: Extract<WorkerOutboundMessage, { type: \"ERROR\" }>,\n ): void {\n onError?.(message.error, message.source);\n }\n\n function handleSnapshotResult(\n message: Extract<WorkerOutboundMessage, { type: \"SNAPSHOT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.snapshot);\n }\n\n function handleInspectResult(\n message: Extract<WorkerOutboundMessage, { type: \"INSPECT_RESULT\" }>,\n ): void {\n resolvePendingRequest(message.requestId, message.inspection);\n }\n\n function handleSettleResult(\n message: Extract<WorkerOutboundMessage, { type: \"SETTLE_RESULT\" }>,\n ): void {\n const pending = pendingRequests.get(message.requestId);\n if (pending) {\n clearPendingTimeout(message.requestId);\n if (message.success) {\n pending.resolve(undefined);\n } else {\n pending.reject(new Error(message.error || \"Settle failed\"));\n }\n pendingRequests.delete(message.requestId);\n }\n }\n\n // Handle messages from worker\n worker.onmessage = (event: MessageEvent<WorkerOutboundMessage>) => {\n const message = event.data;\n\n switch (message.type) {\n case \"READY\":\n return handleReady();\n case \"STARTED\":\n return handleStarted();\n case \"STOPPED\":\n return handleStopped();\n case \"DESTROYED\":\n return handleDestroyed();\n case \"FACT_CHANGED\":\n return handleFactChanged(message);\n case \"DERIVATION_CHANGED\":\n return handleDerivationChanged(message);\n case \"REQUIREMENT_CREATED\":\n return handleRequirementCreated(message);\n case \"REQUIREMENT_MET\":\n return handleRequirementMet(message);\n case \"ERROR\":\n return handleError(message);\n case \"SNAPSHOT_RESULT\":\n return handleSnapshotResult(message);\n case \"INSPECT_RESULT\":\n return handleInspectResult(message);\n case \"SETTLE_RESULT\":\n return handleSettleResult(message);\n }\n };\n\n worker.onerror = (event) => {\n const msg =\n event && typeof event === \"object\" && \"message\" in event\n ? String((event as { message?: unknown }).message ?? \"unknown error\")\n : \"unknown error\";\n // Reject ALL pending requests so they don't leak when the worker dies.\n if (pendingRequests.size > 0) {\n const err = new Error(`[Directive] worker errored: ${msg}`);\n for (const [, pending] of pendingRequests) {\n if (pending.timeoutHandle !== undefined) {\n clearTimeout(pending.timeoutHandle);\n }\n pending.reject(err);\n }\n pendingRequests.clear();\n }\n onError?.(msg, \"worker\");\n };\n\n function send(message: WorkerInboundMessage): void {\n worker.postMessage(message);\n }\n\n function request<T>(\n message: WorkerInboundMessage & { requestId: string },\n timeoutMs: number = DEFAULT_REQUEST_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const entry: {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutHandle?: ReturnType<typeof setTimeout>;\n } = {\n resolve: resolve as (value: unknown) => void,\n reject,\n };\n\n // Only arm the timer if a finite positive timeout was requested.\n if (\n Number.isFinite(timeoutMs) &&\n (timeoutMs as number) > 0\n ) {\n entry.timeoutHandle = setTimeout(() => {\n if (pendingRequests.has(message.requestId)) {\n pendingRequests.delete(message.requestId);\n reject(\n new Error(\n `[Directive] worker request timed out after ${timeoutMs}ms`,\n ),\n );\n }\n }, timeoutMs);\n }\n\n pendingRequests.set(message.requestId, entry);\n send(message);\n });\n }\n\n return {\n init(config: WorkerSystemConfig): Promise<void> {\n return new Promise((resolve) => {\n initResolve = resolve;\n send({ type: \"INIT\", config });\n });\n },\n\n start(): Promise<void> {\n return new Promise((resolve) => {\n startResolve = resolve;\n send({ type: \"START\" });\n });\n },\n\n stop(): Promise<void> {\n return new Promise((resolve) => {\n stopResolve = resolve;\n send({ type: \"STOP\" });\n });\n },\n\n destroy(): Promise<void> {\n return new Promise((resolve) => {\n destroyResolve = resolve;\n send({ type: \"DESTROY\" });\n });\n },\n\n setFact(key: string, value: unknown): void {\n send({ type: \"SET_FACT\", key, value });\n },\n\n setFacts(facts: Record<string, unknown>): void {\n send({ type: \"SET_FACTS\", facts });\n },\n\n dispatch(event: { type: string; [key: string]: unknown }): void {\n send({ type: \"DISPATCH\", event });\n },\n\n getSnapshot(\n options?: DistributableSnapshotOptions,\n timeoutMs?: number,\n ): Promise<DistributableSnapshot> {\n const requestId = `snapshot-${++requestIdCounter}`;\n return request(\n { type: \"GET_SNAPSHOT\", options, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n inspect(timeoutMs?: number): Promise<SystemInspection> {\n const requestId = `inspect-${++requestIdCounter}`;\n return request(\n { type: \"INSPECT\", requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n settle(timeout?: number, timeoutMs?: number): Promise<void> {\n const requestId = `settle-${++requestIdCounter}`;\n return request(\n { type: \"SETTLE\", timeout, requestId },\n timeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n );\n },\n\n terminate(): void {\n worker.terminate();\n },\n };\n}\n\n// ============================================================================\n// Worker-Side API\n// ============================================================================\n\n/**\n * Module registration for worker-side systems.\n * Since functions can't be serialized, modules must be registered in the worker.\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module types vary\ntype ModuleRegistry = Map<string, any>;\n\nlet workerModuleRegistry: ModuleRegistry | null = null;\n\n/**\n * Get or create the module registry for worker-side modules.\n */\nexport function getWorkerModuleRegistry(): ModuleRegistry {\n if (!workerModuleRegistry) {\n workerModuleRegistry = new Map();\n }\n return workerModuleRegistry;\n}\n\n/**\n * Register a module for use in workers.\n * Call this in your worker script before handling INIT messages.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n * import { myModule } from './modules/my-module';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\n// biome-ignore lint/suspicious/noExplicitAny: Module type varies\nexport function registerWorkerModule(name: string, module: any): void {\n getWorkerModuleRegistry().set(name, module);\n}\n\n/**\n * Handler for worker-side message processing.\n * Sets up the message listener and creates/manages the Directive system.\n *\n * @example\n * ```typescript\n * // directive.worker.ts\n * import { registerWorkerModule, handleWorkerMessages } from '@directive-run/core/worker';\n *\n * registerWorkerModule('myModule', myModule);\n * handleWorkerMessages();\n * ```\n */\nexport function handleWorkerMessages(): void {\n // Dynamic import to avoid issues in non-worker contexts\n // The actual system creation happens when messages are received\n type WorkerSystem = Awaited<ReturnType<typeof createWorkerSystem>>;\n let system: WorkerSystem | null = null;\n\n // ---- Inbound message handlers ----\n\n async function handleInit(\n message: Extract<WorkerInboundMessage, { type: \"INIT\" }>,\n ): Promise<WorkerSystem> {\n const created = await createWorkerSystem(message.config);\n postMessage({ type: \"READY\" } satisfies WorkerOutboundMessage);\n\n return created;\n }\n\n function handleStart(sys: WorkerSystem): void {\n sys.start();\n postMessage({ type: \"STARTED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleStop(sys: WorkerSystem): void {\n sys.stop();\n postMessage({ type: \"STOPPED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleDestroy(sys: WorkerSystem): void {\n sys.destroy();\n postMessage({ type: \"DESTROYED\" } satisfies WorkerOutboundMessage);\n }\n\n function handleGetSnapshot(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"GET_SNAPSHOT\" }>,\n ): void {\n const snapshot = sys.getSnapshot(message.options);\n postMessage({\n type: \"SNAPSHOT_RESULT\",\n requestId: message.requestId,\n snapshot,\n } satisfies WorkerOutboundMessage);\n }\n\n function handleInspect(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"INSPECT\" }>,\n ): void {\n const inspection = sys.inspect();\n postMessage({\n type: \"INSPECT_RESULT\",\n requestId: message.requestId,\n inspection,\n } satisfies WorkerOutboundMessage);\n }\n\n async function handleSettle(\n sys: WorkerSystem,\n message: Extract<WorkerInboundMessage, { type: \"SETTLE\" }>,\n ): Promise<void> {\n try {\n await sys.settle(message.timeout);\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: true,\n } satisfies WorkerOutboundMessage);\n } catch (error) {\n postMessage({\n type: \"SETTLE_RESULT\",\n requestId: message.requestId,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WorkerOutboundMessage);\n }\n }\n\n // ---- Message dispatch ----\n\n async function dispatchMessage(message: WorkerInboundMessage): Promise<void> {\n if (message.type === \"INIT\") {\n system = await handleInit(message);\n\n return;\n }\n\n if (!system) {\n return;\n }\n\n switch (message.type) {\n case \"START\":\n handleStart(system);\n break;\n case \"STOP\":\n handleStop(system);\n break;\n case \"DESTROY\":\n handleDestroy(system);\n system = null;\n break;\n case \"SET_FACT\":\n system.setFact(message.key, message.value);\n break;\n case \"SET_FACTS\":\n system.setFacts(message.facts);\n break;\n case \"DISPATCH\":\n system.dispatch(message.event);\n break;\n case \"GET_SNAPSHOT\":\n handleGetSnapshot(system, message);\n break;\n case \"INSPECT\":\n handleInspect(system, message);\n break;\n case \"SETTLE\":\n await handleSettle(system, message);\n break;\n }\n }\n\n self.onmessage = async (event: MessageEvent<WorkerInboundMessage>) => {\n try {\n await dispatchMessage(event.data);\n } catch (error) {\n postMessage({\n type: \"ERROR\",\n error: error instanceof Error ? error.message : String(error),\n source: event.data.type,\n } satisfies WorkerOutboundMessage);\n }\n };\n}\n\n/**\n * Internal: Create a system inside the worker.\n */\nasync function createWorkerSystem(config: WorkerSystemConfig) {\n // Dynamically import createSystem to avoid circular dependencies\n const { createSystem } = await import(\"../core/system.js\");\n\n const registry = getWorkerModuleRegistry();\n const modules: Record<string, unknown> = {};\n\n for (const name of config.moduleNames) {\n const module = registry.get(name);\n if (!module) {\n throw new Error(\n `[Directive Worker] Module \"${name}\" not registered. ` +\n `Call registerWorkerModule('${name}', module) before handling messages.`,\n );\n }\n modules[name] = module;\n }\n\n // Create tracking plugin to notify main thread\n const trackingPlugin = {\n name: \"__worker-tracking__\",\n onFactSet: (key: string, value: unknown, prev: unknown) => {\n postMessage({\n type: \"FACT_CHANGED\",\n key,\n value,\n prev,\n } satisfies WorkerOutboundMessage);\n },\n onDerivationCompute: (id: string, value: unknown) => {\n postMessage({\n type: \"DERIVATION_CHANGED\",\n key: id,\n value,\n } satisfies WorkerOutboundMessage);\n },\n onRequirementCreated: (req: { id: string; requirement: Requirement }) => {\n postMessage({\n type: \"REQUIREMENT_CREATED\",\n requirement: { ...req.requirement, id: req.id },\n } satisfies WorkerOutboundMessage);\n },\n onRequirementMet: (req: { id: string }, resolverId: string) => {\n postMessage({\n type: \"REQUIREMENT_MET\",\n requirementId: req.id,\n resolverId,\n } satisfies WorkerOutboundMessage);\n },\n };\n\n const system = createSystem({\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic module types\n modules: modules as any,\n plugins: [trackingPlugin],\n history: config.history,\n });\n\n return {\n start: () => system.start(),\n stop: () => system.stop(),\n destroy: () => system.destroy(),\n setFact: (key: string, value: unknown) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n (system.facts as any)[key] = value;\n },\n setFacts: (facts: Record<string, unknown>) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic facts access\n const factsProxy = system.facts as any;\n if (factsProxy.$store?.batch) {\n factsProxy.$store.batch(() => {\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n });\n } else {\n // Fallback: set facts one by one\n for (const [key, value] of Object.entries(facts)) {\n factsProxy[key] = value;\n }\n }\n },\n dispatch: (event: { type: string }) => {\n // biome-ignore lint/suspicious/noExplicitAny: Dynamic dispatch\n (system as any).dispatch(event);\n },\n getSnapshot: (options?: DistributableSnapshotOptions) => {\n return system.getDistributableSnapshot(options);\n },\n inspect: () => system.inspect(),\n settle: (timeout?: number) => system.settle(timeout),\n };\n}\n\n// ============================================================================\n// Type Helpers\n// ============================================================================\n\n/**\n * Type helper for creating type-safe worker clients.\n * Use this to get proper typing for facts and events.\n *\n * @example\n * ```typescript\n * type MyWorkerClient = TypedWorkerClient<typeof myModuleSchema>;\n * const client = createWorkerClient(options) as MyWorkerClient;\n * client.setFact('userId', '123'); // Type-checked!\n * ```\n */\nexport type TypedWorkerClient<M extends ModuleSchema> = Omit<\n WorkerClient,\n \"setFact\" | \"setFacts\" | \"dispatch\"\n> & {\n setFact<K extends keyof M[\"facts\"]>(\n key: K,\n value: M[\"facts\"][K] extends { _type: infer T } ? T : M[\"facts\"][K],\n ): void;\n setFacts(\n facts: Partial<{\n [K in keyof M[\"facts\"]]: M[\"facts\"][K] extends { _type: infer T }\n ? T\n : M[\"facts\"][K];\n }>,\n ): void;\n dispatch(\n event: M[\"events\"] extends Record<string, unknown>\n ? {\n [K in keyof M[\"events\"]]: { type: K } & M[\"events\"][K];\n }[keyof M[\"events\"]]\n : { type: string },\n ): void;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@directive-run/core",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "imports": {
5
5
  "#is-development": {
6
6
  "production": "./src/dev-false.ts",
@@ -1,2 +0,0 @@
1
- 'use strict';var chunkT4TRJEJN_cjs=require('./chunk-T4TRJEJN.cjs'),chunk4MNQDXH7_cjs=require('./chunk-4MNQDXH7.cjs');var $="djb2-1",F=1,x=Symbol("directive.audit-ledger.internal");function B(t,r,i){if(t===null||typeof t!="object")return;let o=[];for(let a of r.split(".")){if(!a)continue;let l=a.match(/^\[(\d+)\](.*)$/);if(l){o.push(Number(l[1])),l[2]&&o.push(l[2].replace(/^\./,""));continue}let f=a.match(/^([^[]+)\[(\d+)\](.*)$/);if(f){o.push(f[1]),o.push(Number(f[2])),f[3]&&o.push(f[3].replace(/^\./,""));continue}o.push(a);}let m=t;for(let a=0;a<o.length-1;a++){let l=o[a];if(m===null||typeof m!="object")return;m=m[l];}if(m===null||typeof m!="object")return;let d=o[o.length-1];d!==void 0&&(m[d]=i);}function N(t){for(let r of Object.keys(t)){let i=t[r];if(i!==null&&typeof i=="object"){if(Array.isArray(i)&&r==="whenExplain")for(let o of i)o!==null&&typeof o=="object"&&Object.freeze(o);Object.freeze(i);}}return Object.freeze(t),t}var U=1e4,G=1e3;function P(t){if(t instanceof Date)return t.getTime();if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("[Directive] audit-ledger: changedBetween bound must be a finite number, ISO string, or Date.");return t}if(typeof t=="string"){let r=Date.parse(t);if(!Number.isFinite(r))throw new Error(`[Directive] audit-ledger: changedBetween bound "${t}" is not a parseable ISO date string.`);return r}throw new Error("[Directive] audit-ledger: changedBetween bound must be a number, ISO string, or Date.")}function T(t,r){if(r.kind&&!(Array.isArray(r.kind)?r.kind:[r.kind]).includes(t.kind))return false;if(r.factPath!==void 0)if(t.kind==="fact.change"){if(t.key!==r.factPath)return false}else if(t.kind==="resolver.write.rejected"){if(t.fact!==r.factPath)return false}else return false;if(r.constraintId!==void 0&&(t.kind!=="constraint.evaluate"||t.constraintId!==r.constraintId))return false;if(r.changedBetween){let[i,o]=r.changedBetween,m=P(i),d=P(o);if(t.ts<m||t.ts>d)return false}return true}function Y(t={}){let r=t.capacity??U,i=[],o=null;return {write(d){if(i.length>=r){let a=i[0];o?.(a.seq,1),i.shift();}for(i.push(d);i.length>r;)i.shift();},query(d){let a=d.limit??G,l=[];for(let f=i.length-1;f>=0;f--){let g=i[f];if(T(g,d)&&(l.push(g),l.length>=a))break}return l},recent(d){let a=Math.max(0,i.length-d);return i.slice(a)},forFact(d,a={}){return this.query({factPath:d,limit:a.limit})},forConstraint(d,a={}){return this.query({constraintId:d,limit:a.limit})},toJSON(){return {entries:i.slice(),capturedAt:Date.now()}},clear(){i=[];},destroy(){i=[],o=null;},erase(d,a){let l=0;for(let f=0;f<i.length;f++){let g=i[f];T(g,d)&&(i[f]=a(g),l++);}return l},onTruncate(d){o=d;}}}function W(t){return chunk4MNQDXH7_cjs.h(t)}function _(t){if(t.hashAlgo==="djb2-1")return W(t);throw new Error(`[Directive] audit-ledger: unknown hashAlgo "${String(t.hashAlgo)}" on entry seq=${t.seq}. Cannot verify chain integrity. Known algorithms: "djb2-1".`)}function ee(t={}){let r=t.sink??Y(),i=t.capturePII??false,o=t.redact,m=0,d=null,a=null,l=null,f=new Map,g=new Map,k=new Set;function L(e){if(i||k.size===0||e===null||typeof e!="object")return e;let n;try{n=JSON.parse(JSON.stringify(e));}catch{return e}return chunkT4TRJEJN_cjs.i(n,{operator(s,u,y,c){k.has(s)&&B(n,c,"[redacted]");},literal(s){k.has(s)&&B(n,s,"[redacted]");}}),n}function w(){if(f.clear(),g.clear(),!!a)try{let e=a.inspect;if(typeof e!="function")return;let s=e()?.constraints??[],u=a.$internal?.mergedConstraints;for(let y of s)if(y.whenSpec!==void 0)f.set(y.id,L(y.whenSpec));else {let c=u?.[y.id],h=c&&typeof c.when=="function"?c.when:void 0;h?g.set(y.id,chunk4MNQDXH7_cjs.h(String(h))):y.when!==void 0&&typeof y.when=="function"?g.set(y.id,chunk4MNQDXH7_cjs.h(String(y.when))):g.set(y.id,chunk4MNQDXH7_cjs.h("[function]"));}}catch{}}function j(){if(k.clear(),!(i||!a))try{let e=a.meta;if(!e||typeof e.byTag!="function")return;let n=e.byTag("pii")??[];for(let s of n)k.add(s.id);}catch{}}function E(e,n){return i?n:k.has(e)?"[redacted]":n}function C(e){if(!e||i||k.size===0)return e;let n=false,s=e.map(u=>{if(k.has(u.path))return n=true,{...u,actual:"[redacted]"};if(u.children){let y=C(u.children);if(y!==u.children)return n=true,{...u,children:y}}return u});return n?s:e}function p(e){let n={...e,seq:m++,ts:Date.now(),prevHash:d,hashAlgo:$,schemaVersion:F},s=o?o(n):n;return N(s),r.write(s),d=_(s),s}function M(e){switch(e.type){case "constraint.evaluate":{let n=f.get(e.id),s=g.get(e.id),u={kind:"constraint.evaluate",constraintId:e.id,active:e.active,whenExplain:C(e.whenExplain)};n!==void 0?u.whenSpec=n:s!==void 0&&(u.whenSource={kind:"function",sourceHash:s}),p(u);break}case "fact.change":p({kind:"fact.change",key:e.key,prior:E(e.key,e.prev),next:E(e.key,e.next)});break;case "resolver.write.rejected":e.kind==="summary"?p({kind:"resolver.write.rejected",rejection:"summary",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,dropped:e.dropped}):p({kind:"resolver.write.rejected",rejection:"rejection",resolverId:e.resolver,requirementId:e.requirementId,reason:e.reason,fact:e.fact,expected:E(e.fact,e.expected),actual:E(e.fact,e.actual)});break;case "resolver.complete":p({kind:"resolver.complete",resolverId:e.resolver,requirementId:e.requirementId,duration:e.duration});break;case "resolver.error":p({kind:"resolver.error",resolverId:e.resolver,requirementId:e.requirementId,error:String(e.error)});break;case "system.init":case "system.start":case "system.stop":case "system.destroy":p({kind:e.type});break;}}let v=false;function K(e){a=e,j(),w(),l=e.observe(M),r.onTruncate?.((n,s)=>{if(!v){v=true;try{p({kind:"system.truncated",droppedSeq:n,droppedCount:s});}finally{v=false;}}});}function H(){l&&(l(),l=null),a=null,f.clear(),g.clear(),k.clear();}let V={name:"audit-ledger",onInit(e){K(e);},onStop(){l&&(l(),l=null);},onDestroy(){H();},onDefinitionRegister(e,n){e==="constraint"&&w(),(e==="constraint"||e==="resolver"||e==="effect")&&j();},onDefinitionAssign(e,n){e==="constraint"&&w();},onDefinitionUnregister(e,n){e==="constraint"&&w();},onSnapshot(e){p({kind:"system.snapshot",snapshotId:e.id,trigger:e.trigger});},onHistoryNavigate(e,n){p({kind:"system.history.navigate",from:e,to:n});}};function J(e){if(e.__internal===void 0)return e;let n={...e};return delete n.__internal,n}function b(e){let n=false;for(let s of e)if(s.__internal!==void 0){n=true;break}return n?e.map(J):e}return {plugin:V,query:(e={})=>b(r.query(e)),recent:e=>b(r.recent(e)),forFact:(e,n)=>b(r.forFact(e,n)),forConstraint:(e,n)=>b(r.forConstraint(e,n)),toJSON:()=>{let e=r.toJSON();return {entries:b(e.entries),capturedAt:e.capturedAt}},verify(e){if(e?.strong===true)throw new Error("[Directive] verify({ strong: true }) is reserved for v2 \u2014 v1 ships sync djb2 chain only. Use verify() (sync) for tamper detection.");let{entries:n}=r.toJSON();if(n.length===0)return {valid:true,entryCount:0};let s=new Set,u=null;for(let c=0;c<n.length;c++){let h=n[c];if(h.prevHash!==u){let S=c>0?n[c-1]:null,I=h.kind==="system.entry-erased",O=S?.kind==="system.entry-erased";if(I||O){let q=[];I&&q.push(h),O&&S!==null&&q.push(S);let R=q.find(Q=>Q.__internal!==x);if(R)return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:R,reason:"tombstone forgery detected \u2014 missing internal sentinel. A 'system.entry-erased' entry was written via sink.write() rather than ledger.erase(); rejected as tamper."};let z=I?h:S;s.add(z.seq),u=_(h);continue}return {valid:false,brokenAt:c,expectedHash:u??"<genesis>",actualHash:h.prevHash??"<genesis>",entry:h}}u=_(h);}let y={valid:true,entryCount:n.length};return s.size>0&&(y.erasedSeqs=[...s].sort((c,h)=>c-h)),y},erase(e){let n=Date.now(),s=0;if(typeof r.erase=="function"&&(s=r.erase(e,c=>{let h={seq:c.seq,ts:c.ts,kind:"system.entry-erased",prevHash:c.prevHash,hashAlgo:c.hashAlgo,schemaVersion:c.schemaVersion??F,originalKind:c.kind,erasedAt:n,__internal:x};return N(h),h})),s===0)return {erased:0,markerEntry:null};let u={factPath:e.factPath!==void 0,constraintId:e.constraintId!==void 0,kind:e.kind,changedBetween:e.changedBetween!==void 0?"[range]":void 0},y=p({kind:"system.subject-erased",filterHash:chunk4MNQDXH7_cjs.h(e),filterShape:u,erased:s});return {erased:s,markerEntry:y}},clear(){r.clear(),m=0,d=null;},destroy(){H(),r.destroy();}}}exports.a=Y;exports.b=ee;//# sourceMappingURL=chunk-IXRS4LM4.cjs.map
2
- //# sourceMappingURL=chunk-IXRS4LM4.cjs.map