@hypen-space/core 0.2.12 → 0.3.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.
- package/README.md +182 -11
- package/dist/src/app.js +470 -44
- package/dist/src/app.js.map +7 -5
- package/dist/src/components/builtin.js +470 -44
- package/dist/src/components/builtin.js.map +7 -5
- package/dist/src/discovery.js +559 -65
- package/dist/src/discovery.js.map +8 -6
- package/dist/src/engine.js +18 -9
- package/dist/src/engine.js.map +3 -3
- package/dist/src/index.browser.js +862 -81
- package/dist/src/index.browser.js.map +10 -6
- package/dist/src/index.js +1590 -124
- package/dist/src/index.js.map +16 -9
- package/dist/src/remote/client.js +525 -35
- package/dist/src/remote/client.js.map +7 -4
- package/dist/src/remote/index.js +1796 -35
- package/dist/src/remote/index.js.map +13 -4
- package/dist/src/router.js +55 -29
- package/dist/src/router.js.map +3 -3
- package/dist/src/state.js +57 -29
- package/dist/src/state.js.map +3 -3
- package/package.json +8 -2
- package/src/app.ts +292 -13
- package/src/discovery.ts +123 -18
- package/src/disposable.ts +281 -0
- package/src/engine.ts +29 -10
- package/src/hypen.ts +209 -0
- package/src/index.ts +147 -11
- package/src/logger.ts +338 -0
- package/src/remote/client.ts +263 -56
- package/src/remote/index.ts +25 -1
- package/src/remote/server.ts +652 -0
- package/src/remote/session.ts +256 -0
- package/src/remote/types.ts +68 -1
- package/src/result.ts +260 -0
- package/src/retry.ts +306 -0
- package/src/state.ts +103 -45
- package/wasm-browser/README.md +4 -0
- package/wasm-browser/hypen_engine_bg.wasm +0 -0
- package/wasm-browser/package.json +1 -1
- package/wasm-node/README.md +4 -0
- package/wasm-node/hypen_engine_bg.wasm +0 -0
- package/wasm-node/package.json +1 -1
- package/wasm-browser/hypen_engine_bg.js +0 -736
- package/wasm-node/hypen_engine_bg.js +0 -736
package/dist/src/index.js.map
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/state.ts", "../src/app.ts", "../src/engine.ts", "../src/engine.browser.ts", "../src/renderer.ts", "../src/router.ts", "../src/events.ts", "../src/context.ts", "../src/remote/client.ts", "../src/loader.ts", "../src/resolver.ts", "../src/discovery.ts", "../src/plugin.ts", "../src/components/builtin.ts", "../src/index.ts"],
|
|
3
|
+
"sources": ["../src/state.ts", "../src/result.ts", "../src/logger.ts", "../src/app.ts", "../src/engine.ts", "../src/engine.browser.ts", "../src/renderer.ts", "../src/router.ts", "../src/events.ts", "../src/context.ts", "../src/remote/client.ts", "../src/disposable.ts", "../src/retry.ts", "../src/loader.ts", "../src/resolver.ts", "../src/discovery.ts", "../src/plugin.ts", "../src/components/builtin.ts", "../src/index.ts", "../src/hypen.ts", "../src/remote/server.ts", "../src/remote/session.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * State management with observer pattern and diffing\n */\n\nexport type StatePath = string; // e.g., \"user.name\", \"items.0.title\"\n\n/**\n * Represents a change in state with full path information\n */\nexport interface StateChange {\n paths: StatePath[];\n newValues: Record<StatePath, any>;\n}\n\n/**\n * Options for state observer\n */\nexport interface StateObserverOptions {\n onChange: (change: StateChange) => void;\n pathPrefix?: string; // For nested observers\n}\n\n/**\n * Deep clone an object, handling circular references\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Use a WeakMap to track visited objects and handle circular references\n const visited = new WeakMap();\n\n function cloneInternal(value: any): any {\n // Handle primitives and null\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check if we've already cloned this object (circular reference)\n if (visited.has(value)) {\n return visited.get(value);\n }\n\n // Handle Date\n if (value instanceof Date) {\n return new Date(value.getTime());\n }\n\n // Handle RegExp\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags);\n }\n\n // Handle Map\n if (value instanceof Map) {\n const mapClone = new Map();\n visited.set(value, mapClone);\n for (const [k, v] of value.entries()) {\n mapClone.set(cloneInternal(k), cloneInternal(v));\n }\n return mapClone;\n }\n\n // Handle Set\n if (value instanceof Set) {\n const setClone = new Set();\n visited.set(value, setClone);\n for (const item of value.values()) {\n setClone.add(cloneInternal(item));\n }\n return setClone;\n }\n\n // Handle WeakMap/WeakSet - cannot be cloned, return as-is\n if (value instanceof WeakMap || value instanceof WeakSet) {\n return value;\n }\n\n // Handle Array\n if (Array.isArray(value)) {\n const arrClone: any[] = [];\n visited.set(value, arrClone);\n for (let i = 0; i < value.length; i++) {\n arrClone[i] = cloneInternal(value[i]);\n }\n return arrClone;\n }\n\n // Handle plain objects\n const objClone: any = {};\n visited.set(value, objClone);\n\n // Clone string keys\n for (const key in value) {\n if (value.hasOwnProperty(key)) {\n objClone[key] = cloneInternal(value[key]);\n }\n }\n\n // Clone Symbol keys (not enumerable by for...in)\n const symbolKeys = Object.getOwnPropertySymbols(value);\n for (const sym of symbolKeys) {\n objClone[sym] = cloneInternal(value[sym]);\n }\n\n return objClone;\n }\n\n return cloneInternal(obj);\n}\n\n/**\n * Compare two values and detect changes with full paths\n */\nfunction diffState(\n oldState: any,\n newState: any,\n basePath: string = \"\"\n): StateChange {\n const paths: StatePath[] = [];\n const newValues: Record<StatePath, any> = {};\n\n function diff(oldVal: any, newVal: any, path: string) {\n // Handle null/undefined\n if (oldVal === newVal) return;\n\n // Different types or primitives\n if (\n typeof oldVal !== \"object\" ||\n typeof newVal !== \"object\" ||\n oldVal === null ||\n newVal === null\n ) {\n if (oldVal !== newVal) {\n paths.push(path);\n newValues[path] = newVal;\n }\n return;\n }\n\n // Arrays\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n if (\n !Array.isArray(oldVal) ||\n !Array.isArray(newVal) ||\n oldVal.length !== newVal.length\n ) {\n paths.push(path);\n newValues[path] = newVal;\n return;\n }\n\n for (let i = 0; i < newVal.length; i++) {\n const itemPath = path ? `${path}.${i}` : `${i}`;\n diff(oldVal[i], newVal[i], itemPath);\n }\n return;\n }\n\n // Objects\n const oldKeys = new Set(Object.keys(oldVal));\n const newKeys = new Set(Object.keys(newVal));\n\n // Check for added or changed keys\n for (const key of newKeys) {\n const propPath = path ? `${path}.${key}` : key;\n if (!oldKeys.has(key)) {\n // New property\n paths.push(propPath);\n newValues[propPath] = newVal[key];\n } else {\n // Existing property, recurse\n diff(oldVal[key], newVal[key], propPath);\n }\n }\n\n // Check for removed keys\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n const propPath = path ? `${path}.${key}` : key;\n paths.push(propPath);\n newValues[propPath] = undefined;\n }\n }\n }\n\n diff(oldState, newState, basePath);\n return { paths, newValues };\n}\n\n/**\n * Create an observable state object that tracks changes\n */\nexport function createObservableState<T extends object>(\n initialState: T,\n options?: StateObserverOptions\n): T {\n // Use default options if not provided\n const opts: StateObserverOptions = options || { onChange: () => {} };\n\n // Handle null/undefined by using an empty object\n // This allows modules to start with null state\n if (initialState === null || initialState === undefined) {\n initialState = {} as T;\n }\n\n // Detect and reject primitive wrapper objects (Number, String, Boolean)\n // These cannot be properly proxied due to internal slots\n if (\n initialState instanceof Number ||\n initialState instanceof String ||\n initialState instanceof Boolean\n ) {\n throw new TypeError(\n \"Cannot create observable state from primitive wrapper objects (Number, String, Boolean). \" +\n \"Use plain primitives or regular objects instead.\"\n );\n }\n\n // Clone the initial state to ensure each observable has its own copy\n // This prevents multiple modules from sharing the same underlying state object\n initialState = deepClone(initialState);\n\n // Keep a snapshot of the last known state\n let lastSnapshot = deepClone(initialState);\n const pathPrefix = opts.pathPrefix || \"\";\n\n // Track if we're in a batch update\n let batchDepth = 0;\n let pendingChange: StateChange | null = null;\n\n function notifyChange() {\n if (batchDepth > 0) return;\n\n // Compare current state with last snapshot\n const change = diffState(lastSnapshot, state, pathPrefix);\n\n if (change.paths.length > 0) {\n // Update snapshot\n lastSnapshot = deepClone(state);\n\n // Merge with pending changes if any\n if (pendingChange) {\n change.paths.push(...pendingChange.paths);\n Object.assign(change.newValues, pendingChange.newValues);\n pendingChange = null;\n }\n\n // Notify\n opts.onChange(change);\n }\n }\n\n // Track if we have a pending microtask notification\n let notificationPending = false;\n\n function scheduleBatch() {\n if (batchDepth === 0) {\n // If not in a batch, schedule notification in next microtask to coalesce rapid changes\n if (!notificationPending) {\n notificationPending = true;\n queueMicrotask(() => {\n notificationPending = false;\n if (batchDepth === 0) {\n notifyChange();\n }\n });\n }\n }\n }\n\n // Cache proxies to handle circular references\n const proxyCache = new WeakMap<any, any>();\n\n function createProxy(target: any, basePath: string): any {\n // Return cached proxy if it exists (handles circular references)\n if (proxyCache.has(target)) {\n return proxyCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop) {\n const value = obj[prop];\n\n // Expose batch control methods\n if (prop === \"__beginBatch\") {\n return () => {\n batchDepth++;\n };\n }\n if (prop === \"__endBatch\") {\n return () => {\n batchDepth--;\n if (batchDepth === 0) {\n notifyChange();\n }\n };\n }\n if (prop === \"__getSnapshot\") {\n return () => deepClone(obj);\n }\n\n // Return proxied nested objects/arrays, but NOT special types\n if (value && typeof value === \"object\") {\n // Check for special object types that should not be proxied\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof WeakMap ||\n value instanceof WeakSet\n ) {\n return value;\n }\n\n // Proxy regular objects and arrays\n return createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const oldValue = obj[prop];\n\n // Set the new value\n obj[prop] = value;\n\n if (oldValue !== value) {\n scheduleBatch();\n }\n\n return true;\n },\n\n deleteProperty(obj, prop) {\n if (prop in obj) {\n delete obj[prop];\n scheduleBatch();\n }\n return true;\n },\n });\n\n // Cache the proxy before returning\n proxyCache.set(target, proxy);\n return proxy;\n }\n\n const state = createProxy(initialState, pathPrefix);\n return state as T;\n}\n\n/**\n * Helper to batch multiple state updates\n */\nexport function batchStateUpdates<T>(state: T, fn: () => void): void {\n const s = state as any;\n if (s.__beginBatch && s.__endBatch) {\n s.__beginBatch();\n try {\n fn();\n } finally {\n s.__endBatch();\n }\n } else {\n fn();\n }\n}\n\n/**\n * Get a snapshot of the current state\n */\nexport function getStateSnapshot<T>(state: T): T {\n const s = state as any;\n if (s.__getSnapshot) {\n return s.__getSnapshot();\n }\n return deepClone(state);\n}\n",
|
|
6
|
-
"/**\n *
|
|
7
|
-
"/**\n *
|
|
5
|
+
"/**\n * State management with observer pattern and diffing\n *\n * Uses a proxy-based approach with self-detection to avoid\n * creating nested proxies repeatedly.\n */\n\n// Symbol for proxy detection (more robust than string property)\nconst IS_PROXY = Symbol.for('hypen.isProxy');\nconst RAW_TARGET = Symbol.for('hypen.rawTarget');\n\nexport type StatePath = string; // e.g., \"user.name\", \"items.0.title\"\n\n/**\n * Represents a change in state with full path information\n */\nexport interface StateChange {\n paths: StatePath[];\n newValues: Record<StatePath, any>;\n}\n\n/**\n * Options for state observer\n */\nexport interface StateObserverOptions {\n onChange: (change: StateChange) => void;\n pathPrefix?: string; // For nested observers\n}\n\n/**\n * Deep clone an object, using structuredClone when available.\n * Handles proxy objects, circular references, and special types.\n */\nfunction deepClone<T>(obj: T): T {\n // Handle primitives and null\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n // Handle functions (pass through, can't be cloned)\n if (typeof obj === 'function') {\n return obj;\n }\n\n // Handle proxy objects with snapshot method\n if (typeof (obj as any).__getSnapshot === 'function') {\n return (obj as any).__getSnapshot() as T;\n }\n\n // Handle types that can't be cloned (return as-is)\n if (obj instanceof WeakMap || obj instanceof WeakSet) {\n return obj;\n }\n\n // Use a WeakMap to track visited objects and handle circular references\n const visited = new WeakMap();\n\n function cloneInternal(value: any): any {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Functions can't be cloned, pass through\n if (typeof value === 'function') {\n return value;\n }\n\n // Check for circular reference\n if (visited.has(value)) {\n return visited.get(value);\n }\n\n // Handle types that can't be cloned\n if (value instanceof WeakMap || value instanceof WeakSet) {\n return value;\n }\n\n // Try structuredClone for supported types (Date, Map, Set, etc.)\n // This is faster than manual cloning for these types\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n ArrayBuffer.isView(value) ||\n value instanceof ArrayBuffer\n ) {\n try {\n return structuredClone(value);\n } catch {\n // If structuredClone fails, fall through to manual handling\n }\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n const arrClone: any[] = [];\n visited.set(value, arrClone);\n for (let i = 0; i < value.length; i++) {\n arrClone[i] = cloneInternal(value[i]);\n }\n return arrClone;\n }\n\n // Handle plain objects\n const objClone: any = {};\n visited.set(value, objClone);\n\n // Clone string keys\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n objClone[key] = cloneInternal(value[key]);\n }\n }\n\n // Clone Symbol keys\n const symbolKeys = Object.getOwnPropertySymbols(value);\n for (const sym of symbolKeys) {\n objClone[sym] = cloneInternal(value[sym]);\n }\n\n return objClone;\n }\n\n return cloneInternal(obj);\n}\n\n/**\n * Compare two values and detect changes with full paths\n */\nfunction diffState(\n oldState: any,\n newState: any,\n basePath: string = \"\"\n): StateChange {\n const paths: StatePath[] = [];\n const newValues: Record<StatePath, any> = {};\n\n function diff(oldVal: any, newVal: any, path: string) {\n // Handle null/undefined\n if (oldVal === newVal) return;\n\n // Different types or primitives\n if (\n typeof oldVal !== \"object\" ||\n typeof newVal !== \"object\" ||\n oldVal === null ||\n newVal === null\n ) {\n if (oldVal !== newVal) {\n paths.push(path);\n newValues[path] = newVal;\n }\n return;\n }\n\n // Arrays\n if (Array.isArray(oldVal) || Array.isArray(newVal)) {\n if (\n !Array.isArray(oldVal) ||\n !Array.isArray(newVal) ||\n oldVal.length !== newVal.length\n ) {\n paths.push(path);\n newValues[path] = newVal;\n return;\n }\n\n for (let i = 0; i < newVal.length; i++) {\n const itemPath = path ? `${path}.${i}` : `${i}`;\n diff(oldVal[i], newVal[i], itemPath);\n }\n return;\n }\n\n // Objects\n const oldKeys = new Set(Object.keys(oldVal));\n const newKeys = new Set(Object.keys(newVal));\n\n // Check for added or changed keys\n for (const key of newKeys) {\n const propPath = path ? `${path}.${key}` : key;\n if (!oldKeys.has(key)) {\n // New property\n paths.push(propPath);\n newValues[propPath] = newVal[key];\n } else {\n // Existing property, recurse\n diff(oldVal[key], newVal[key], propPath);\n }\n }\n\n // Check for removed keys\n for (const key of oldKeys) {\n if (!newKeys.has(key)) {\n const propPath = path ? `${path}.${key}` : key;\n paths.push(propPath);\n newValues[propPath] = undefined;\n }\n }\n }\n\n diff(oldState, newState, basePath);\n return { paths, newValues };\n}\n\n/**\n * Create an observable state object that tracks changes\n */\nexport function createObservableState<T extends object>(\n initialState: T,\n options?: StateObserverOptions\n): T {\n // Use default options if not provided\n const opts: StateObserverOptions = options || { onChange: () => {} };\n\n // Handle null/undefined by using an empty object\n // This allows modules to start with null state\n if (initialState === null || initialState === undefined) {\n initialState = {} as T;\n }\n\n // Detect and reject primitive wrapper objects (Number, String, Boolean)\n // These cannot be properly proxied due to internal slots\n if (\n initialState instanceof Number ||\n initialState instanceof String ||\n initialState instanceof Boolean\n ) {\n throw new TypeError(\n \"Cannot create observable state from primitive wrapper objects (Number, String, Boolean). \" +\n \"Use plain primitives or regular objects instead.\"\n );\n }\n\n // Clone the initial state to ensure each observable has its own copy\n // This prevents multiple modules from sharing the same underlying state object\n initialState = deepClone(initialState);\n\n // Keep a snapshot of the last known state\n let lastSnapshot = deepClone(initialState);\n const pathPrefix = opts.pathPrefix || \"\";\n\n // Track if we're in a batch update\n let batchDepth = 0;\n let pendingChange: StateChange | null = null;\n\n function notifyChange() {\n if (batchDepth > 0) return;\n\n // Compare current state with last snapshot\n const change = diffState(lastSnapshot, state, pathPrefix);\n\n if (change.paths.length > 0) {\n // Update snapshot\n lastSnapshot = deepClone(state);\n\n // Merge with pending changes if any\n if (pendingChange) {\n change.paths.push(...pendingChange.paths);\n Object.assign(change.newValues, pendingChange.newValues);\n pendingChange = null;\n }\n\n // Notify\n opts.onChange(change);\n }\n }\n\n // Track if we have a pending microtask notification\n let notificationPending = false;\n\n function scheduleBatch() {\n if (batchDepth === 0) {\n // If not in a batch, schedule notification in next microtask to coalesce rapid changes\n if (!notificationPending) {\n notificationPending = true;\n queueMicrotask(() => {\n notificationPending = false;\n if (batchDepth === 0) {\n notifyChange();\n }\n });\n }\n }\n }\n\n // WeakMap to cache proxies by their raw target\n // This is essential for circular reference handling\n const proxyCache = new WeakMap<object, any>();\n\n function createProxy(target: any, basePath: string): any {\n // Check cache first (handles circular references)\n const cached = proxyCache.get(target);\n if (cached) return cached;\n\n const proxy = new Proxy(target, {\n get(obj, prop) {\n // Self-detection: if checking IS_PROXY, return true\n // This allows us to detect if a value is already proxied\n if (prop === IS_PROXY) return true;\n\n // Allow access to raw target (useful for debugging/serialization)\n if (prop === RAW_TARGET) return obj;\n\n // Expose batch control methods\n if (prop === \"__beginBatch\") {\n return () => {\n batchDepth++;\n };\n }\n if (prop === \"__endBatch\") {\n return () => {\n batchDepth--;\n if (batchDepth === 0) {\n notifyChange();\n }\n };\n }\n if (prop === \"__getSnapshot\") {\n return () => deepClone(obj);\n }\n\n const value = obj[prop];\n\n // Return proxied nested objects/arrays, but NOT special types\n if (value && typeof value === \"object\") {\n // Fast path: if already a proxy, return as-is\n // This check is O(1) and avoids WeakMap lookup\n if ((value as any)[IS_PROXY]) {\n return value;\n }\n\n // Check for special object types that should not be proxied\n if (\n value instanceof Date ||\n value instanceof RegExp ||\n value instanceof Map ||\n value instanceof Set ||\n value instanceof WeakMap ||\n value instanceof WeakSet\n ) {\n return value;\n }\n\n // Check cache for this value (handles circular refs and repeated access)\n const cachedNested = proxyCache.get(value);\n if (cachedNested) {\n return cachedNested;\n }\n\n // Create proxy for nested object/array\n const nestedProxy = createProxy(value, basePath ? `${basePath}.${String(prop)}` : String(prop));\n return nestedProxy;\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const oldValue = obj[prop];\n\n // If setting an object that's already a proxy, unwrap it first\n // to store the raw value (prevents proxy-wrapping-proxy)\n if (value && typeof value === \"object\" && (value as any)[IS_PROXY]) {\n value = (value as any)[RAW_TARGET];\n }\n\n // Set the new value\n obj[prop] = value;\n\n if (oldValue !== value) {\n scheduleBatch();\n }\n\n return true;\n },\n\n deleteProperty(obj, prop) {\n if (prop in obj) {\n delete obj[prop];\n scheduleBatch();\n }\n return true;\n },\n });\n\n // Cache the proxy before returning\n proxyCache.set(target, proxy);\n return proxy;\n }\n\n const state = createProxy(initialState, pathPrefix);\n return state as T;\n}\n\n/**\n * Helper to batch multiple state updates\n */\nexport function batchStateUpdates<T>(state: T, fn: () => void): void {\n const s = state as any;\n if (s.__beginBatch && s.__endBatch) {\n s.__beginBatch();\n try {\n fn();\n } finally {\n s.__endBatch();\n }\n } else {\n fn();\n }\n}\n\n/**\n * Get a snapshot of the current state\n */\nexport function getStateSnapshot<T>(state: T): T {\n const s = state as any;\n if (s.__getSnapshot) {\n return s.__getSnapshot();\n }\n return deepClone(state);\n}\n\n/**\n * Check if a value is a Hypen state proxy\n */\nexport function isStateProxy(value: unknown): boolean {\n return value !== null && typeof value === 'object' && (value as any)[IS_PROXY] === true;\n}\n\n/**\n * Get the raw (unwrapped) target from a proxy\n * Returns the value as-is if not a proxy\n */\nexport function unwrapProxy<T>(value: T): T {\n if (value !== null && typeof value === 'object' && (value as any)[IS_PROXY]) {\n return (value as any)[RAW_TARGET];\n }\n return value;\n}\n",
|
|
6
|
+
"/**\n * Result Type for Error Handling\n *\n * A lightweight Result type for explicit error handling without exceptions.\n * Provides type-safe error propagation and composition.\n */\n\n/**\n * Represents either a successful value or an error\n */\nexport type Result<T, E = Error> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: E };\n\n/**\n * Create a successful Result\n */\nexport function Ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Create a failed Result\n */\nexport function Err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Check if a Result is Ok\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Check if a Result is Err\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { ok: false; error: E } {\n return !result.ok;\n}\n\n/**\n * Wrap a Promise in a Result, catching any thrown errors\n */\nexport async function fromPromise<T, E = Error>(\n promise: Promise<T>,\n mapError?: (e: unknown) => E\n): Promise<Result<T, E>> {\n try {\n const value = await promise;\n return Ok(value);\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Wrap a synchronous function in a Result, catching any thrown errors\n */\nexport function fromTry<T, E = Error>(\n fn: () => T,\n mapError?: (e: unknown) => E\n): Result<T, E> {\n try {\n return Ok(fn());\n } catch (e) {\n if (mapError) {\n return Err(mapError(e));\n }\n return Err(e as E);\n }\n}\n\n/**\n * Map over a successful Result value\n */\nexport function map<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => U\n): Result<U, E> {\n if (result.ok) {\n return Ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * Map over a failed Result error\n */\nexport function mapErr<T, E, F>(\n result: Result<T, E>,\n fn: (error: E) => F\n): Result<T, F> {\n if (!result.ok) {\n return Err(fn(result.error));\n }\n return result;\n}\n\n/**\n * Chain Results together (flatMap)\n */\nexport function flatMap<T, U, E>(\n result: Result<T, E>,\n fn: (value: T) => Result<U, E>\n): Result<U, E> {\n if (result.ok) {\n return fn(result.value);\n }\n return result;\n}\n\n/**\n * Unwrap a Result, throwing if it's an error\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Unwrap a Result with a default value\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.ok) {\n return result.value;\n }\n return defaultValue;\n}\n\n/**\n * Unwrap a Result with a lazy default value\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n if (result.ok) {\n return result.value;\n }\n return fn(result.error);\n}\n\n/**\n * Match on a Result, providing handlers for both cases\n */\nexport function match<T, E, U>(\n result: Result<T, E>,\n handlers: {\n ok: (value: T) => U;\n err: (error: E) => U;\n }\n): U {\n if (result.ok) {\n return handlers.ok(result.value);\n }\n return handlers.err(result.error);\n}\n\n/**\n * Combine multiple Results into a single Result containing an array\n * Returns the first error encountered, or Ok with all values\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n const values: T[] = [];\n for (const result of results) {\n if (!result.ok) {\n return result;\n }\n values.push(result.value);\n }\n return Ok(values);\n}\n\n/**\n * Base class for typed errors with context\n */\nexport class HypenError extends Error {\n readonly code: string;\n readonly context?: Record<string, unknown>;\n override readonly cause?: Error;\n\n constructor(\n code: string,\n message: string,\n options?: { context?: Record<string, unknown>; cause?: Error }\n ) {\n super(message);\n this.name = 'HypenError';\n this.code = code;\n this.context = options?.context;\n this.cause = options?.cause;\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error thrown when an action handler fails\n */\nexport class ActionError extends HypenError {\n readonly actionName: string;\n\n constructor(actionName: string, cause?: unknown) {\n super(\n 'ACTION_ERROR',\n `Action handler \"${actionName}\" failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n {\n context: { actionName },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ActionError';\n this.actionName = actionName;\n }\n}\n\n/**\n * Error thrown when a connection fails\n */\nexport class ConnectionError extends HypenError {\n readonly url: string;\n readonly attempt?: number;\n\n constructor(url: string, cause?: unknown, attempt?: number) {\n super(\n 'CONNECTION_ERROR',\n `Connection to \"${url}\" failed${attempt ? ` (attempt ${attempt})` : ''}: ${\n cause instanceof Error ? cause.message : String(cause)\n }`,\n {\n context: { url, attempt },\n cause: cause instanceof Error ? cause : undefined,\n }\n );\n this.name = 'ConnectionError';\n this.url = url;\n this.attempt = attempt;\n }\n}\n\n/**\n * Error thrown when state operations fail\n */\nexport class StateError extends HypenError {\n readonly path?: string;\n\n constructor(message: string, path?: string, cause?: unknown) {\n super('STATE_ERROR', message, {\n context: { path },\n cause: cause instanceof Error ? cause : undefined,\n });\n this.name = 'StateError';\n this.path = path;\n }\n}\n",
|
|
7
|
+
"/**\n * Configurable Debug Logger\n *\n * Provides environment-aware logging that can be disabled in production.\n * Supports log levels, tagged output, and performance timing.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"none\";\n\nexport interface LoggerConfig {\n /** Minimum log level (default: \"debug\" in dev, \"error\" in prod) */\n level: LogLevel;\n /** Enable colored output (default: true) */\n colors: boolean;\n /** Include timestamps (default: false) */\n timestamps: boolean;\n /** Custom log handler (default: console) */\n handler?: LogHandler;\n}\n\nexport interface LogHandler {\n debug(tag: string, ...args: unknown[]): void;\n info(tag: string, ...args: unknown[]): void;\n warn(tag: string, ...args: unknown[]): void;\n error(tag: string, ...args: unknown[]): void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst LOG_LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LOG_LEVEL_COLORS: Record<Exclude<LogLevel, \"none\">, string> = {\n debug: \"\\x1b[36m\", // Cyan\n info: \"\\x1b[32m\", // Green\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n};\n\nconst RESET_COLOR = \"\\x1b[0m\";\n\n// ============================================================================\n// Global Configuration\n// ============================================================================\n\n/**\n * Detect if running in production environment\n */\nfunction isProduction(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env.NODE_ENV === \"production\";\n }\n return false;\n}\n\n/**\n * Default configuration\n */\nlet config: LoggerConfig = {\n level: isProduction() ? \"error\" : \"debug\",\n colors: true,\n timestamps: false,\n};\n\n// ============================================================================\n// Configuration API\n// ============================================================================\n\n/**\n * Set the global log level\n */\nexport function setLogLevel(level: LogLevel): void {\n config.level = level;\n}\n\n/**\n * Get the current log level\n */\nexport function getLogLevel(): LogLevel {\n return config.level;\n}\n\n/**\n * Configure the logger\n */\nexport function configureLogger(options: Partial<LoggerConfig>): void {\n config = { ...config, ...options };\n}\n\n/**\n * Enable all logging (sets level to \"debug\")\n */\nexport function enableLogging(): void {\n config.level = \"debug\";\n}\n\n/**\n * Disable all logging (sets level to \"none\")\n */\nexport function disableLogging(): void {\n config.level = \"none\";\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.level];\n}\n\nfunction formatTag(tag: string, level: LogLevel): string {\n const timestamp = config.timestamps ? `${new Date().toISOString()} ` : \"\";\n\n if (config.colors && level !== \"none\") {\n const color = LOG_LEVEL_COLORS[level as Exclude<LogLevel, \"none\">];\n return `${timestamp}${color}[${tag}]${RESET_COLOR}`;\n }\n\n return `${timestamp}[${tag}]`;\n}\n\n// ============================================================================\n// Logger Class\n// ============================================================================\n\n/**\n * Tagged logger instance\n *\n * @example\n * ```typescript\n * const log = createLogger(\"MyComponent\");\n * log.debug(\"initialized with\", { props });\n * log.error(\"failed to load\", error);\n * ```\n */\nexport class Logger {\n private readonly tag: string;\n\n constructor(tag: string) {\n this.tag = tag;\n }\n\n debug(...args: unknown[]): void {\n if (!shouldLog(\"debug\")) return;\n\n if (config.handler) {\n config.handler.debug(this.tag, ...args);\n } else {\n console.log(formatTag(this.tag, \"debug\"), ...args);\n }\n }\n\n info(...args: unknown[]): void {\n if (!shouldLog(\"info\")) return;\n\n if (config.handler) {\n config.handler.info(this.tag, ...args);\n } else {\n console.info(formatTag(this.tag, \"info\"), ...args);\n }\n }\n\n warn(...args: unknown[]): void {\n if (!shouldLog(\"warn\")) return;\n\n if (config.handler) {\n config.handler.warn(this.tag, ...args);\n } else {\n console.warn(formatTag(this.tag, \"warn\"), ...args);\n }\n }\n\n error(...args: unknown[]): void {\n if (!shouldLog(\"error\")) return;\n\n if (config.handler) {\n config.handler.error(this.tag, ...args);\n } else {\n console.error(formatTag(this.tag, \"error\"), ...args);\n }\n }\n\n /**\n * Time a function execution\n */\n time<T>(label: string, fn: () => T): T {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Time an async function execution\n */\n async timeAsync<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!shouldLog(\"debug\")) {\n return fn();\n }\n\n const start = performance.now();\n try {\n return await fn();\n } finally {\n const duration = performance.now() - start;\n this.debug(`${label}: ${duration.toFixed(2)}ms`);\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(subTag: string): Logger {\n return new Logger(`${this.tag}:${subTag}`);\n }\n\n /**\n * Conditionally log based on a condition\n */\n debugIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.debug(...args);\n }\n\n warnIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.warn(...args);\n }\n\n errorIf(condition: boolean, ...args: unknown[]): void {\n if (condition) this.error(...args);\n }\n\n /**\n * Log once (useful for deprecation warnings)\n */\n private loggedOnce = new Set<string>();\n\n warnOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.warn(...args);\n }\n\n debugOnce(key: string, ...args: unknown[]): void {\n if (this.loggedOnce.has(key)) return;\n this.loggedOnce.add(key);\n this.debug(...args);\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a tagged logger\n *\n * @example\n * ```typescript\n * const log = createLogger(\"Router\");\n * log.info(\"navigating to\", path);\n * ```\n */\nexport function createLogger(tag: string): Logger {\n return new Logger(tag);\n}\n\n// ============================================================================\n// Default Logger Instance\n// ============================================================================\n\n/**\n * Default logger for general use\n */\nexport const logger = createLogger(\"Hypen\");\n\n// ============================================================================\n// Shorthand Functions (untagged)\n// ============================================================================\n\n/**\n * Shorthand logging functions for quick use\n * Prefer createLogger() for component-specific logging\n */\nexport const log = {\n debug: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"debug\")) return;\n console.log(formatTag(tag, \"debug\"), ...args);\n },\n\n info: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"info\")) return;\n console.info(formatTag(tag, \"info\"), ...args);\n },\n\n warn: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"warn\")) return;\n console.warn(formatTag(tag, \"warn\"), ...args);\n },\n\n error: (tag: string, ...args: unknown[]): void => {\n if (!shouldLog(\"error\")) return;\n console.error(formatTag(tag, \"error\"), ...args);\n },\n};\n\n// ============================================================================\n// Predefined Loggers for Framework Components\n// ============================================================================\n\nexport const frameworkLoggers = {\n engine: createLogger(\"Engine\"),\n router: createLogger(\"Router\"),\n state: createLogger(\"State\"),\n events: createLogger(\"Events\"),\n remote: createLogger(\"Remote\"),\n renderer: createLogger(\"Renderer\"),\n module: createLogger(\"Module\"),\n lifecycle: createLogger(\"Lifecycle\"),\n};\n",
|
|
8
|
+
"/**\n * Hypen App Builder API\n * Implements the stateful module system from RFC-0001\n */\n\nimport type { Action } from \"./engine.js\";\nimport type { Session } from \"./remote/types.js\";\nimport { type Result, Ok, Err, fromPromise, ActionError, HypenError } from \"./result.js\";\n\n// Interface for engine compatibility (works with both engine.js and engine.browser.js)\nexport interface IEngine {\n setModule(name: string, actions: string[], stateKeys: string[], initialState: unknown): void;\n onAction(actionName: string, handler: (action: Action) => void | Promise<void>): void;\n notifyStateChange(paths: string[], changedValues: Record<string, unknown>): void;\n}\n\nimport { createObservableState, type StateChange, getStateSnapshot } from \"./state.js\";\nimport type { HypenRouter } from \"./router.js\";\nimport type { HypenGlobalContext, ModuleReference } from \"./context.js\";\nimport { createLogger } from \"./logger.js\";\n\nconst log = createLogger(\"ModuleInstance\");\n\nexport type RouterContext = {\n root: HypenRouter;\n current?: HypenRouter;\n parent?: HypenRouter;\n};\n\nexport type ActionContext = {\n name: string;\n payload?: unknown;\n sender?: string;\n};\n\nexport type ActionNext = {\n router: HypenRouter; // Direct access to router instance (from nearest parent)\n};\n\nexport type GlobalContext = {\n getModule: <T = unknown>(id: string) => ModuleReference<T>;\n hasModule: (id: string) => boolean;\n getModuleIds: () => string[];\n getGlobalState: () => Record<string, unknown>;\n emit: (event: string, payload?: unknown) => void;\n on: (event: string, handler: (payload?: unknown) => void) => () => void;\n __router?: unknown; // Internal: router instance for built-in Router component\n};\n\nexport type LifecycleHandler<T> = (\n state: T,\n context?: GlobalContext\n) => void | Promise<void>;\n\n/**\n * Action handler context - all parameters available explicitly\n */\nexport interface ActionHandlerContext<T> {\n action: ActionContext;\n state: T;\n next: ActionNext;\n context: GlobalContext;\n}\n\n/**\n * Action handler - receives all context in a single object\n */\nexport type ActionHandler<T> = (ctx: ActionHandlerContext<T>) => void | Promise<void>;\n\n/**\n * Context passed to onDisconnect handler\n */\nexport interface DisconnectContext<T> {\n /** Current state snapshot (ready to serialize and save) */\n state: T;\n /** Session information */\n session: Session;\n}\n\n/**\n * Context passed to onReconnect handler\n */\nexport interface ReconnectContext<T> {\n /** Session information */\n session: Session;\n /** Call this with saved state to restore it */\n restore: (savedState: T) => void;\n}\n\n/**\n * Context passed to onExpire handler\n */\nexport interface ExpireContext {\n /** Session information */\n session: Session;\n}\n\n/**\n * Handler called when client disconnects (session still alive for TTL)\n */\nexport type DisconnectHandler<T> = (ctx: DisconnectContext<T>) => void | Promise<void>;\n\n/**\n * Handler called when client reconnects with existing session\n */\nexport type ReconnectHandler<T> = (ctx: ReconnectContext<T>) => void | Promise<void>;\n\n/**\n * Handler called when session TTL expires (client never reconnected)\n */\nexport type ExpireHandler = (ctx: ExpireContext) => void | Promise<void>;\n\n/**\n * Context passed to onError handler\n */\nexport interface ErrorContext<T> {\n /** The error that occurred */\n error: HypenError;\n /** Current state (for inspection, not mutation during error handling) */\n state: T;\n /** The action name if error occurred in an action handler */\n actionName?: string;\n /** The lifecycle phase if error occurred in a lifecycle handler */\n lifecycle?: \"created\" | \"destroyed\" | \"disconnect\" | \"reconnect\" | \"expire\";\n}\n\n/**\n * Error handler return type - controls error propagation\n */\nexport type ErrorHandlerResult =\n | void // Continue with default behavior (log + emit)\n | { handled: true } // Error was handled, skip default behavior\n | { retry: true } // Retry the operation (only for actions)\n | { rethrow: true }; // Re-throw the error\n\n/**\n * Handler called when an error occurs in the module\n */\nexport type ErrorHandler<T> = (ctx: ErrorContext<T>) => ErrorHandlerResult | Promise<ErrorHandlerResult>;\n\nexport interface HypenModuleDefinition<T = unknown> {\n name?: string;\n actions: string[];\n stateKeys: string[];\n persist?: boolean;\n version?: number;\n initialState: T;\n /**\n * Inline UI template for single-file components.\n * Set via the `.ui(hypen`...`)` method.\n */\n template?: string;\n handlers: {\n onCreated?: LifecycleHandler<T>;\n onAction: Map<string, ActionHandler<T>>;\n onDestroyed?: LifecycleHandler<T>;\n /** Called when client disconnects (session persists for TTL) */\n onDisconnect?: DisconnectHandler<T>;\n /** Called when client reconnects with existing session */\n onReconnect?: ReconnectHandler<T>;\n /** Called when session TTL expires */\n onExpire?: ExpireHandler;\n /** Called when any error occurs in the module */\n onError?: ErrorHandler<T>;\n };\n}\n\n/**\n * Alias for HypenModuleDefinition for backward compatibility\n */\nexport type HypenModule<T = unknown> = HypenModuleDefinition<T>;\n\n/**\n * Builder for creating Hypen app modules\n */\nexport class HypenAppBuilder<T> {\n private initialState: T;\n private options: { persist?: boolean; version?: number; name?: string };\n private createdHandler?: LifecycleHandler<T>;\n private actionHandlers: Map<string, ActionHandler<T>> = new Map();\n private destroyedHandler?: LifecycleHandler<T>;\n private disconnectHandler?: DisconnectHandler<T>;\n private reconnectHandler?: ReconnectHandler<T>;\n private expireHandler?: ExpireHandler;\n private errorHandler?: ErrorHandler<T>;\n private template?: string;\n\n constructor(\n initialState: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ) {\n this.initialState = initialState;\n this.options = options || {};\n }\n\n /**\n * Register a handler for module creation\n */\n onCreated(fn: LifecycleHandler<T>): this {\n this.createdHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for a specific action\n */\n onAction(name: string, fn: ActionHandler<T>): this {\n this.actionHandlers.set(name, fn);\n return this;\n }\n\n /**\n * Register a handler for module destruction\n */\n onDestroyed(fn: LifecycleHandler<T>): this {\n this.destroyedHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for client disconnection\n * Called when client disconnects; session persists for TTL\n * Use this to save state for later restoration\n */\n onDisconnect(fn: DisconnectHandler<T>): this {\n this.disconnectHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for session reconnection\n * Called when client reconnects with an existing session ID\n * Use restore() to hydrate state from saved data\n */\n onReconnect(fn: ReconnectHandler<T>): this {\n this.reconnectHandler = fn;\n return this;\n }\n\n /**\n * Register a handler for session expiration\n * Called when TTL expires and client never reconnected\n * Use this to clean up stored state\n */\n onExpire(fn: ExpireHandler): this {\n this.expireHandler = fn;\n return this;\n }\n\n /**\n * Register an error handler for the module\n * Called when any error occurs in action handlers or lifecycle hooks\n *\n * @example\n * ```typescript\n * app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * if (state.count > 100) throw new Error(\"Count too high\");\n * state.count += 1;\n * })\n * .onError(({ error, actionName, state }) => {\n * console.error(`Error in ${actionName}:`, error.message);\n * // Optionally recover\n * if (error.message.includes(\"too high\")) {\n * return { handled: true }; // Don't propagate\n * }\n * // Or retry\n * // return { retry: true };\n * })\n * .build();\n * ```\n *\n * @param fn - Error handler function\n * @returns Builder for chaining\n */\n onError(fn: ErrorHandler<T>): this {\n this.errorHandler = fn;\n return this;\n }\n\n /**\n * Define the component's UI template inline (single-file component).\n *\n * Use with the `hypen` tagged template literal and binding proxies:\n *\n * @example\n * ```typescript\n * import { app, hypen, state } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * state.count += 1;\n * })\n * .ui(hypen`\n * Column {\n * Text(\"Count: ${state.count}\")\n * Button { Text(\"+\") }\n * .onClick(\"@actions.increment\")\n * }\n * `);\n * ```\n *\n * @param template - The Hypen DSL template string\n * @returns The built module definition (calls build() internally)\n */\n ui(template: string): HypenModuleDefinition<T> {\n this.template = template;\n return this.build();\n }\n\n /**\n * Build the module definition\n */\n build(): HypenModuleDefinition<T> {\n // Safe way to get keys from initialState\n const stateKeys = this.initialState !== null && typeof this.initialState === 'object'\n ? Object.keys(this.initialState)\n : [];\n\n return {\n name: this.options.name,\n actions: Array.from(this.actionHandlers.keys()),\n stateKeys,\n persist: this.options.persist,\n version: this.options.version,\n initialState: this.initialState,\n template: this.template,\n handlers: {\n onCreated: this.createdHandler,\n onAction: this.actionHandlers,\n onDestroyed: this.destroyedHandler,\n onDisconnect: this.disconnectHandler,\n onReconnect: this.reconnectHandler,\n onExpire: this.expireHandler,\n onError: this.errorHandler,\n },\n };\n }\n}\n\n/**\n * Hypen App API\n */\nexport class HypenApp {\n /**\n * Define the initial state for a module\n */\n defineState<T>(\n initial: T,\n options?: { persist?: boolean; version?: number; name?: string }\n ): HypenAppBuilder<T> {\n return new HypenAppBuilder(initial, options);\n }\n}\n\n/**\n * The main app instance for creating modules\n */\nexport const app = new HypenApp();\n\n/**\n * Module Instance - manages a running module with typed state\n */\nexport class HypenModuleInstance<T extends object = any> {\n private engine: IEngine;\n private definition: HypenModuleDefinition<T>;\n private state: T;\n private isDestroyed = false;\n private routerContext?: RouterContext;\n private globalContext?: HypenGlobalContext;\n private stateChangeCallbacks: Array<() => void> = [];\n\n constructor(\n engine: IEngine,\n definition: HypenModuleDefinition<T>,\n routerContext?: RouterContext,\n globalContext?: HypenGlobalContext\n ) {\n this.engine = engine;\n this.definition = definition;\n this.routerContext = routerContext;\n this.globalContext = globalContext;\n\n // Create observable state that sends only changed paths and values to engine\n this.state = createObservableState<T>(definition.initialState as T & object, {\n onChange: (change: StateChange) => {\n // Send only the changed paths and their new values (not the whole state)\n this.engine.notifyStateChange(change.paths, change.newValues);\n // Notify all registered callbacks\n this.stateChangeCallbacks.forEach(cb => cb());\n },\n });\n\n // Register with engine (initial state registration)\n this.engine.setModule(\n definition.name || \"AnonymousModule\",\n definition.actions,\n definition.stateKeys,\n getStateSnapshot(this.state)\n );\n\n // Register action handlers with flexible parameter support\n for (const [actionName, handler] of definition.handlers.onAction) {\n log.debug(`Registering action handler: ${actionName} for module ${definition.name}`);\n this.engine.onAction(actionName, async (action: Action) => {\n log.debug(`Action handler fired: ${actionName}`, action);\n\n const actionCtx: ActionContext = {\n name: action.name,\n payload: action.payload,\n sender: action.sender,\n };\n\n const next: ActionNext = {\n router: this.routerContext?.root || (null as any),\n };\n\n const context: GlobalContext | undefined = this.globalContext\n ? this.createGlobalContextAPI()\n : undefined;\n\n // Use Result type for error handling\n const result = await this.executeAction(actionName, handler, {\n action: actionCtx,\n state: this.state,\n next,\n context: context!,\n });\n\n if (!result.ok) {\n const shouldRethrow = await this.handleError(result.error, { actionName });\n if (shouldRethrow) {\n throw result.error;\n }\n } else {\n log.debug(`Action handler completed: ${actionName}`);\n }\n });\n }\n\n // Call onCreated\n this.callCreatedHandler();\n }\n\n /**\n * Create the global context API for this module\n */\n private createGlobalContextAPI(): GlobalContext {\n if (!this.globalContext) {\n throw new Error(\"Global context not available\");\n }\n\n const ctx = this.globalContext;\n const api: GlobalContext = {\n getModule: (id: string) => ctx.getModule(id),\n hasModule: (id: string) => ctx.hasModule(id),\n getModuleIds: () => ctx.getModuleIds(),\n getGlobalState: () => ctx.getGlobalState(),\n emit: (event: string, payload?: any) => ctx.emit(event, payload),\n on: (event: string, handler: (payload?: any) => void) =>\n ctx.on(event, handler),\n };\n\n // Expose router and hypen engine for built-in components (if available)\n if ((ctx as any).__router) {\n api.__router = (ctx as any).__router;\n }\n if ((ctx as any).__hypenEngine) {\n (api as any).__hypenEngine = (ctx as any).__hypenEngine;\n }\n\n return api;\n }\n\n /**\n * Execute an action handler with Result-based error handling\n * Handles both synchronous throws and async rejections\n */\n private async executeAction(\n actionName: string,\n handler: ActionHandler<T>,\n ctx: ActionHandlerContext<T>\n ): Promise<Result<void, ActionError>> {\n try {\n // Wrap in try-catch to handle synchronous throws\n const result = handler(ctx);\n // Await in case handler returns a promise\n await result;\n return Ok(undefined);\n } catch (e) {\n return Err(new ActionError(actionName, e));\n }\n }\n\n /**\n * Handle an error with module-level error handler support\n * Falls back to default behavior (emit + log) if no handler or handler doesn't suppress\n * @returns true if the error should be rethrown\n */\n private async handleError(\n error: HypenError,\n context: { actionName?: string; lifecycle?: ErrorContext<T>[\"lifecycle\"] }\n ): Promise<boolean> {\n const errorCtx: ErrorContext<T> = {\n error,\n state: this.state,\n actionName: context.actionName,\n lifecycle: context.lifecycle,\n };\n\n // Call module-level error handler if defined\n if (this.definition.handlers.onError) {\n try {\n const result = await this.definition.handlers.onError(errorCtx);\n\n // Check if error was handled\n if (result && typeof result === \"object\") {\n if (\"handled\" in result && result.handled) {\n // Error was handled, skip default behavior\n return false;\n }\n if (\"rethrow\" in result && result.rethrow) {\n // Signal caller to rethrow\n return true;\n }\n // Note: 'retry' would need to be handled at the action execution level\n // For now, we just continue with default behavior\n }\n } catch (handlerError) {\n // Error in error handler - log and continue with default behavior\n log.error(\"Error in onError handler:\", handlerError);\n }\n }\n\n // Default behavior: emit to global context and log\n if (this.globalContext) {\n const eventContext = context.actionName\n ? `action:${context.actionName}`\n : context.lifecycle\n ? `lifecycle:${context.lifecycle}`\n : \"unknown\";\n\n this.globalContext.emit(\"error\", {\n message: error.message,\n error,\n context: eventContext,\n });\n }\n\n log.error(\n `${context.actionName ? `Action \"${context.actionName}\"` : `Lifecycle \"${context.lifecycle}\"`} error:`,\n error\n );\n\n return false;\n }\n\n /**\n * Call the onCreated handler\n */\n private async callCreatedHandler(): Promise<void> {\n if (this.definition.handlers.onCreated) {\n const context = this.globalContext ? this.createGlobalContextAPI() : undefined;\n await this.definition.handlers.onCreated(this.state, context);\n }\n }\n\n /**\n * Register a callback to be notified when state changes\n */\n onStateChange(callback: () => void): void {\n this.stateChangeCallbacks.push(callback);\n }\n\n /**\n * Destroy the module instance\n */\n async destroy(): Promise<void> {\n if (this.isDestroyed) return;\n\n if (this.definition.handlers.onDestroyed) {\n await this.definition.handlers.onDestroyed(this.state);\n }\n\n this.isDestroyed = true;\n }\n\n /**\n * Get the current state (returns a snapshot)\n */\n getState(): T {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Get the live observable state\n */\n getLiveState(): T {\n return this.state;\n }\n\n /**\n * Update state directly (merges with existing state)\n */\n updateState(patch: Partial<T>): void {\n Object.assign(this.state, patch);\n }\n}\n",
|
|
9
|
+
"/**\n * Low-level wrapper around the WASM engine\n * Node.js / Bundler target\n */\n\n// WASM module types\nimport { WasmEngine } from \"../wasm-node/hypen_engine.js\";\n\n/**\n * Unwrap proxy objects to plain values for WASM serialization.\n * Uses structuredClone when available (Node 17+, Bun, modern browsers),\n * falls back to JSON round-trip for proxy objects or older environments.\n */\nfunction unwrapForWasm<T>(value: T): T {\n // Fast path: primitives don't need cloning\n if (value === null || typeof value !== 'object') {\n return value;\n }\n\n // Check if the object has a snapshot method (our proxy convention)\n if (typeof (value as any).__getSnapshot === 'function') {\n return (value as any).__getSnapshot() as T;\n }\n\n // Try structuredClone first (fastest for plain objects)\n try {\n return structuredClone(value);\n } catch {\n // Fallback for proxy objects or unsupported types\n return JSON.parse(JSON.stringify(value));\n }\n}\n\nexport type Patch = {\n type: \"create\" | \"setProp\" | \"setText\" | \"insert\" | \"move\" | \"remove\" | \"attachEvent\" | \"detachEvent\";\n id?: string;\n elementType?: string;\n props?: Record<string, any>;\n name?: string;\n value?: any;\n text?: string;\n parentId?: string;\n beforeId?: string;\n eventName?: string;\n};\n\nexport type Action = {\n name: string;\n payload?: any;\n sender?: string;\n};\n\nexport type RenderCallback = (patches: Patch[]) => void;\nexport type ActionHandler = (action: Action) => void | Promise<void>;\n\nexport type ResolvedComponent = {\n source: string;\n path: string;\n};\n\nexport type ComponentResolver = (\n componentName: string,\n contextPath: string | null\n) => ResolvedComponent | null;\n\n/**\n * Engine wraps the WASM engine and provides a TypeScript-friendly API\n */\nexport class Engine {\n private wasmEngine: WasmEngine | null = null;\n private initialized = false;\n\n /**\n * Initialize the WASM module\n */\n async init(): Promise<void> {\n if (this.initialized) return;\n\n // For bundler target, WASM is auto-initialized\n this.wasmEngine = new WasmEngine();\n this.initialized = true;\n }\n\n /**\n * Ensure the engine is initialized before operations\n */\n private ensureInitialized(): WasmEngine {\n if (!this.wasmEngine) {\n throw new Error(\"Engine not initialized. Call init() first.\");\n }\n return this.wasmEngine;\n }\n\n /**\n * Set the render callback that receives patches\n */\n setRenderCallback(callback: RenderCallback): void {\n const engine = this.ensureInitialized();\n engine.setRenderCallback((patches: Patch[]) => {\n callback(patches);\n });\n }\n\n /**\n * Set the component resolver for dynamic component composition\n */\n setComponentResolver(resolver: ComponentResolver): void {\n const engine = this.ensureInitialized();\n engine.setComponentResolver((componentName: string, contextPath: string | null) => {\n const result = resolver(componentName, contextPath);\n return result;\n });\n }\n\n /**\n * Parse and render Hypen DSL source code\n */\n renderSource(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderSource(source);\n }\n\n /**\n * Render a lazy component (for lazy route loading)\n */\n renderLazyComponent(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderLazyComponent(source);\n }\n\n /**\n * Render a component into a specific parent node (subtree rendering)\n */\n renderInto(source: string, parentNodeId: string, state: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.renderInto(source, parentNodeId, unwrapForWasm(state));\n }\n\n /**\n * Notify the engine of state changes using sparse updates\n */\n notifyStateChange(paths: string[], values: Record<string, any>): void {\n const engine = this.ensureInitialized();\n\n if (paths.length === 0) {\n return;\n }\n\n engine.updateStateSparse(paths, unwrapForWasm(values));\n console.debug(\"[Hypen] State changed (sparse):\", paths);\n }\n\n /**\n * Notify the engine of state changes using full state replacement\n * @deprecated Use notifyStateChange with sparse values instead\n */\n notifyStateChangeFull(paths: string[], currentState: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.updateState(unwrapForWasm(currentState));\n\n if (paths.length > 0) {\n console.debug(\"[Hypen] State changed (full):\", paths);\n }\n }\n\n /**\n * Update state (triggers re-render of affected nodes)\n * @deprecated Use notifyStateChange instead\n */\n updateState(statePatch: Record<string, any>): void {\n const engine = this.ensureInitialized();\n engine.updateState(unwrapForWasm(statePatch));\n }\n\n /**\n * Dispatch an action\n */\n dispatchAction(name: string, payload?: any): void {\n const engine = this.ensureInitialized();\n engine.dispatchAction(name, payload ?? null);\n }\n\n /**\n * Register an action handler\n */\n onAction(actionName: string, handler: ActionHandler): void {\n const engine = this.ensureInitialized();\n engine.onAction(actionName, (action: Action) => {\n Promise.resolve(handler(action)).catch(console.error);\n });\n }\n\n /**\n * Initialize a module\n */\n setModule(\n name: string,\n actions: string[],\n stateKeys: string[],\n initialState: Record<string, any>\n ): void {\n const engine = this.ensureInitialized();\n engine.setModule(name, actions, stateKeys, initialState);\n }\n\n /**\n * Get the current revision number\n */\n getRevision(): number {\n const engine = this.ensureInitialized();\n return Number(engine.getRevision());\n }\n\n /**\n * Clear the engine tree\n */\n clearTree(): void {\n const engine = this.ensureInitialized();\n engine.clearTree();\n }\n\n /**\n * Debug method to inspect parsed components\n */\n debugParseComponent(source: string): string {\n const engine = this.ensureInitialized();\n return engine.debugParseComponent(source);\n }\n}\n",
|
|
8
10
|
"/**\n * Browser-compatible wrapper around the WASM engine\n * Uses web target for browser environments\n */\n\n// Dynamic import path - will be configured at build time\n// For browser, the WASM needs to be served and initialized explicitly\nlet wasmInit: ((path?: string) => Promise<void>) | null = null;\nlet WasmEngineClass: any = null;\n\nexport type Patch = {\n type: \"create\" | \"setProp\" | \"setText\" | \"insert\" | \"move\" | \"remove\" | \"attachEvent\" | \"detachEvent\";\n id?: string;\n element_type?: string;\n props?: Record<string, any> | Map<string, any>;\n name?: string;\n value?: any;\n text?: string;\n parent_id?: string;\n before_id?: string;\n event_name?: string;\n};\n\nexport type Action = {\n name: string;\n payload?: any;\n sender?: string;\n};\n\nexport type RenderCallback = (patches: Patch[]) => void;\nexport type ActionHandler = (action: Action) => void | Promise<void>;\n\nexport type ResolvedComponent = {\n source: string;\n path: string;\n};\n\nexport type ComponentResolver = (\n componentName: string,\n contextPath: string | null\n) => ResolvedComponent | null;\n\nexport interface EngineInitOptions {\n /**\n * URL to the WASM binary file.\n * Default: loads from unpkg CDN\n * For production, consider serving from your own domain for better performance.\n */\n wasmUrl?: string;\n\n /**\n * URL to the WASM JS glue code.\n * Default: loads from unpkg CDN\n * For self-hosting, point to your own copy of hypen_engine.js\n */\n jsUrl?: string;\n}\n\n/**\n * Recursively convert Maps and nested structures to plain objects\n */\nfunction mapToObject(value: any): any {\n if (value instanceof Map) {\n const obj: Record<string, any> = {};\n for (const [key, val] of value.entries()) {\n obj[key] = mapToObject(val);\n }\n return obj;\n } else if (Array.isArray(value)) {\n return value.map(mapToObject);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n const obj: Record<string, any> = {};\n for (const [key, val] of Object.entries(value)) {\n obj[key] = mapToObject(val);\n }\n return obj;\n }\n return value;\n}\n\n/**\n * Engine wraps the WASM engine and provides a TypeScript-friendly API\n * Browser version with explicit WASM initialization\n */\nexport class Engine {\n private wasmEngine: any = null;\n private initialized = false;\n\n /**\n * Initialize the WASM module\n * @param options - Initialization options including wasmUrl and jsUrl\n */\n async init(options: EngineInitOptions = {}): Promise<void> {\n if (this.initialized) return;\n\n // Default to CDN for zero-config experience\n const cdnBase = \"https://unpkg.com/@hypen-space/core@0.2.12/wasm-browser\";\n const jsUrl = options.jsUrl ?? `${cdnBase}/hypen_engine.js`;\n const wasmUrl = options.wasmUrl ?? `${cdnBase}/hypen_engine_bg.wasm`;\n\n // Dynamically import the WASM JS glue code from CDN (or custom URL)\n // Using dynamic import with variable URL to avoid bundler resolution\n try {\n const wasmModule: any = await import(/* @vite-ignore */ jsUrl);\n wasmInit = wasmModule.default;\n WasmEngineClass = wasmModule.WasmEngine;\n\n // Initialize WASM with explicit path\n await wasmInit!(wasmUrl);\n\n this.wasmEngine = new WasmEngineClass();\n this.initialized = true;\n } catch (error) {\n console.error(\"[Hypen] Failed to initialize WASM engine:\", error);\n throw error;\n }\n }\n\n /**\n * Ensure the engine is initialized before operations\n */\n private ensureInitialized(): any {\n if (!this.wasmEngine) {\n throw new Error(\"Engine not initialized. Call init() first.\");\n }\n return this.wasmEngine;\n }\n\n /**\n * Set the render callback that receives patches\n */\n setRenderCallback(callback: RenderCallback): void {\n const engine = this.ensureInitialized();\n engine.setRenderCallback((patches: Patch[]) => {\n callback(patches);\n });\n }\n\n /**\n * Set the component resolver for dynamic component composition\n */\n setComponentResolver(resolver: ComponentResolver): void {\n const engine = this.ensureInitialized();\n engine.setComponentResolver((componentName: string, contextPath: string | null) => {\n const result = resolver(componentName, contextPath);\n return result;\n });\n }\n\n /**\n * Parse and render Hypen DSL source code\n */\n renderSource(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderSource(source);\n }\n\n /**\n * Render a lazy component (for lazy route loading)\n */\n renderLazyComponent(source: string): void {\n const engine = this.ensureInitialized();\n engine.renderLazyComponent(source);\n }\n\n /**\n * Render a component into a specific parent node (subtree rendering)\n */\n renderInto(source: string, parentNodeId: string, state: Record<string, any>): void {\n const engine = this.ensureInitialized();\n const safeState = JSON.parse(JSON.stringify(state));\n engine.renderInto(source, parentNodeId, safeState);\n }\n\n /**\n * Notify the engine of state changes\n */\n notifyStateChange(paths: string[], currentState: Record<string, any>): void {\n const engine = this.ensureInitialized();\n\n const plainObject = JSON.parse(JSON.stringify(currentState));\n engine.updateState(plainObject);\n\n if (paths.length > 0) {\n console.debug(\"[Hypen] State changed:\", paths);\n }\n }\n\n /**\n * Update state (triggers re-render of affected nodes)\n * @deprecated Use notifyStateChange instead\n */\n updateState(statePatch: Record<string, any>): void {\n const engine = this.ensureInitialized();\n const plainObject = JSON.parse(JSON.stringify(statePatch));\n engine.updateState(plainObject);\n }\n\n /**\n * Dispatch an action\n */\n dispatchAction(name: string, payload?: any): void {\n const engine = this.ensureInitialized();\n console.log(`[Engine] Action dispatched: ${name}`);\n engine.dispatchAction(name, payload ?? null);\n }\n\n /**\n * Register an action handler\n */\n onAction(actionName: string, handler: ActionHandler): void {\n const engine = this.ensureInitialized();\n engine.onAction(actionName, (action: Action) => {\n const normalizedAction: Action = {\n ...action,\n payload: action.payload ? mapToObject(action.payload) : action.payload,\n };\n Promise.resolve(handler(normalizedAction)).catch(console.error);\n });\n }\n\n /**\n * Initialize a module\n */\n setModule(\n name: string,\n actions: string[],\n stateKeys: string[],\n initialState: Record<string, any>\n ): void {\n const engine = this.ensureInitialized();\n engine.setModule(name, actions, stateKeys, initialState);\n }\n\n /**\n * Get the current revision number\n */\n getRevision(): bigint {\n const engine = this.ensureInitialized();\n return engine.getRevision();\n }\n\n /**\n * Clear the engine tree\n */\n clearTree(): void {\n const engine = this.ensureInitialized();\n engine.clearTree();\n }\n\n /**\n * Debug method to inspect parsed components\n */\n debugParseComponent(source: string): string {\n const engine = this.ensureInitialized();\n return engine.debugParseComponent(source);\n }\n}\n",
|
|
9
11
|
"/**\n * Renderer abstraction interface\n *\n * Renderers are pluggable and can be implemented for different platforms\n * (DOM, Canvas, Native, etc.)\n */\n\nimport type { Patch } from \"./engine.js\";\n\n/**\n * Renderer interface that all platform renderers must implement\n */\nexport interface Renderer {\n /**\n * Apply a batch of patches to the render tree\n */\n applyPatches(patches: Patch[]): void;\n\n /**\n * Get a node by its ID (optional, for debugging)\n */\n getNode?(id: string): any;\n\n /**\n * Clear the entire render tree\n */\n clear?(): void;\n}\n\n/**\n * Base renderer class with common utilities\n */\nexport abstract class BaseRenderer implements Renderer {\n protected nodes: Map<string, any> = new Map();\n\n abstract applyPatches(patches: Patch[]): void;\n\n getNode(id: string): any {\n return this.nodes.get(id);\n }\n\n clear(): void {\n this.nodes.clear();\n }\n\n /**\n * Apply a single patch\n */\n protected applyPatch(patch: Patch): void {\n switch (patch.type) {\n case \"create\":\n this.onCreate(patch.id!, patch.elementType!, patch.props || {});\n break;\n case \"setProp\":\n this.onSetProp(patch.id!, patch.name!, patch.value);\n break;\n case \"setText\":\n this.onSetText(patch.id!, patch.text!);\n break;\n case \"insert\":\n this.onInsert(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"move\":\n this.onMove(patch.parentId!, patch.id!, patch.beforeId);\n break;\n case \"remove\":\n this.onRemove(patch.id!);\n break;\n case \"attachEvent\":\n this.onAttachEvent(patch.id!, patch.eventName!);\n break;\n case \"detachEvent\":\n this.onDetachEvent(patch.id!, patch.eventName!);\n break;\n }\n }\n\n /**\n * Platform-specific patch handlers\n */\n protected abstract onCreate(id: string, elementType: string, props: Record<string, any>): void;\n protected abstract onSetProp(id: string, name: string, value: any): void;\n protected abstract onSetText(id: string, text: string): void;\n protected abstract onInsert(parentId: string, id: string, beforeId?: string): void;\n protected abstract onMove(parentId: string, id: string, beforeId?: string): void;\n protected abstract onRemove(id: string): void;\n protected abstract onAttachEvent(id: string, eventName: string): void;\n protected abstract onDetachEvent(id: string, eventName: string): void;\n}\n\n/**\n * Console/Debug renderer that logs patches\n */\nexport class ConsoleRenderer implements Renderer {\n applyPatches(patches: Patch[]): void {\n console.group(\"Patches:\");\n for (const patch of patches) {\n console.log(patch);\n }\n console.groupEnd();\n }\n}\n",
|
|
10
12
|
"/**\n * Hypen Router - Declarative routing system\n * Integrated with Hypen's reactive state management\n */\n\nimport { createObservableState, getStateSnapshot } from \"./state.js\";\n\nexport type RouteMatch = {\n params: Record<string, string>;\n query: Record<string, string>;\n path: string;\n};\n\nexport type RouteState = {\n currentPath: string;\n params: Record<string, string>;\n query: Record<string, string>;\n previousPath: string | null;\n};\n\nexport type RouteChangeCallback = (route: RouteState) => void;\n\n/**\n * Hypen Router - Manages application routing with pattern matching\n */\nexport class HypenRouter {\n private state: RouteState;\n private subscribers = new Set<RouteChangeCallback>();\n private isInitialized = false;\n private isUpdating = false;\n\n constructor() {\n // Create observable state for reactivity\n this.state = createObservableState<RouteState>(\n {\n currentPath: \"/\",\n params: {},\n query: {},\n previousPath: null,\n },\n {\n onChange: () => {\n this.notifySubscribers();\n },\n }\n );\n\n // Initialize from browser if available\n if (typeof window !== \"undefined\") {\n this.initializeBrowserSync();\n }\n }\n\n /**\n * Initialize browser history sync\n */\n private initializeBrowserSync() {\n // Get initial path from hash or pathname\n const initialPath = this.getPathFromBrowser();\n this.state.currentPath = initialPath;\n this.state.params = {};\n this.state.query = this.parseQuery();\n\n // Listen for browser back/forward\n window.addEventListener(\"popstate\", () => {\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false); // Don't push to history again\n });\n\n // Listen for hash changes\n window.addEventListener(\"hashchange\", () => {\n // Don't respond to hashchange events we triggered ourselves\n if (this.isUpdating) return;\n const newPath = this.getPathFromBrowser();\n this.updatePath(newPath, false);\n });\n\n this.isInitialized = true;\n console.log(\"Router initialized at:\", initialPath);\n }\n\n /**\n * Get path from browser URL (supports both hash and pathname)\n */\n private getPathFromBrowser(): string {\n if (typeof window === \"undefined\") return \"/\";\n\n // Prefer hash-based routing for simplicity\n const hash = window.location.hash.slice(1);\n if (hash) return hash;\n\n // Fallback to pathname\n return window.location.pathname;\n }\n\n /**\n * Parse query string from URL\n */\n private parseQuery(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n\n const query: Record<string, string> = {};\n const searchParams = new URLSearchParams(window.location.search);\n\n searchParams.forEach((value, key) => {\n query[key] = value;\n });\n\n return query;\n }\n\n /**\n * Navigate to a new path\n */\n push(path: string) {\n console.log(\"Router.push:\", path);\n this.updatePath(path, true);\n }\n\n /**\n * Replace current path without adding to history\n */\n replace(path: string) {\n console.log(\"Router.replace:\", path);\n this.updatePath(path, true, true);\n }\n\n /**\n * Go back in history\n */\n back() {\n console.log(\"Router.back\");\n if (typeof window !== \"undefined\") {\n window.history.back();\n }\n }\n\n /**\n * Go forward in history\n */\n forward() {\n console.log(\"Router.forward\");\n if (typeof window !== \"undefined\") {\n window.history.forward();\n }\n }\n\n /**\n * Update the current path\n */\n private updatePath(\n path: string,\n updateBrowser: boolean,\n replace: boolean = false\n ) {\n // Prevent re-entrant updates\n if (this.isUpdating) return;\n\n this.isUpdating = true;\n try {\n const oldPath = this.state.currentPath;\n this.state.previousPath = oldPath;\n this.state.currentPath = path;\n this.state.query = this.parseQuery();\n\n // Notify subscribers synchronously before any browser events\n this.notifySubscribers();\n\n // Update browser URL if needed\n if (updateBrowser && typeof window !== \"undefined\") {\n const url = \"#\" + path;\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n // Manually trigger hashchange event\n const hashChangeEvent = new HashChangeEvent(\"hashchange\", {\n oldURL: window.location.href.replace(window.location.hash, \"#\" + oldPath),\n newURL: window.location.href,\n });\n window.dispatchEvent(hashChangeEvent);\n }\n } finally {\n this.isUpdating = false;\n }\n }\n\n /**\n * Get current path\n */\n getCurrentPath(): string {\n return this.state.currentPath;\n }\n\n /**\n * Get current route params\n */\n getParams(): Record<string, string> {\n return { ...this.state.params };\n }\n\n /**\n * Get current query params\n */\n getQuery(): Record<string, string> {\n return { ...this.state.query };\n }\n\n /**\n * Get full route state snapshot\n */\n getState(): RouteState {\n return getStateSnapshot(this.state);\n }\n\n /**\n * Match a pattern against a path\n */\n matchPath(pattern: string, path: string): RouteMatch | null {\n // Handle invalid inputs gracefully\n if (!pattern || typeof pattern !== 'string') {\n return null;\n }\n if (!path || typeof path !== 'string') {\n return null;\n }\n\n // Exact match\n if (pattern === path) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n\n // Wildcard match: /dashboard/* matches /dashboard/anything\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -2);\n if (path === prefix || path.startsWith(prefix + \"/\")) {\n return {\n params: {},\n query: this.state.query,\n path,\n };\n }\n return null;\n }\n\n // Parameter match: /users/:id matches /users/123\n const paramNames: string[] = [];\n const regexPattern = pattern\n .replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_, name) => {\n paramNames.push(name);\n return \"([^/]+)\";\n })\n .replace(/\\*/g, \".*\");\n\n const regex = new RegExp(`^${regexPattern}$`);\n const match = path.match(regex);\n\n if (!match) return null;\n\n // Extract params\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n const value = match[i + 1];\n if (value !== undefined) {\n params[name] = decodeURIComponent(value);\n }\n });\n\n return {\n params,\n query: this.state.query,\n path,\n };\n }\n\n /**\n * Subscribe to route changes\n */\n onNavigate(callback: RouteChangeCallback): () => void {\n this.subscribers.add(callback);\n\n // Call immediately with current state\n try {\n callback(this.getState());\n } catch (error) {\n console.error(\"[HypenRouter] Error in route subscriber:\", error);\n }\n\n // Return unsubscribe function\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n /**\n * Notify all subscribers of route change\n */\n private notifySubscribers() {\n const routeState = this.getState();\n this.subscribers.forEach((callback) => {\n try {\n callback(routeState);\n } catch (error) {\n console.error(\"[HypenRouter] Error in route subscriber:\", error);\n }\n });\n }\n\n /**\n * Check if a path matches the current route\n */\n isActive(pattern: string): boolean {\n return this.matchPath(pattern, this.state.currentPath) !== null;\n }\n\n /**\n * Get a URL with query params\n */\n buildUrl(path: string, query?: Record<string, string>): string {\n if (!query || Object.keys(query).length === 0) {\n return path;\n }\n\n const queryString = new URLSearchParams(query).toString();\n return `${path}?${queryString}`;\n }\n}\n",
|
|
11
13
|
"/**\n * Type-safe Event System\n *\n * Provides strongly-typed event emission and subscription with autocomplete support.\n */\n\nexport type EventHandler<T = unknown> = (payload: T) => void;\n\n/**\n * Type-safe event emitter with generics\n */\nexport class TypedEventEmitter<TEvents extends Record<string, unknown> = Record<string, unknown>> {\n private eventBus = new Map<keyof TEvents, Set<EventHandler<any>>>();\n\n /**\n * Emit an event with type-safe payload\n */\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\n const handlers = this.eventBus.get(event);\n if (!handlers || handlers.size === 0) {\n return;\n }\n\n handlers.forEach((handler) => {\n try {\n handler(payload);\n } catch (error) {\n console.error(`Error in event handler for \"${String(event)}\":`, error);\n }\n });\n }\n\n /**\n * Subscribe to an event with type-safe payload\n * Returns an unsubscribe function\n */\n on<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n if (!this.eventBus.has(event)) {\n this.eventBus.set(event, new Set());\n }\n\n const handlers = this.eventBus.get(event)!;\n handlers.add(handler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventBus.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once (auto-unsubscribe after first emit)\n */\n once<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): () => void {\n const wrappedHandler = (payload: TEvents[K]) => {\n handler(payload);\n unsubscribe();\n };\n\n const unsubscribe = this.on(event, wrappedHandler);\n return unsubscribe;\n }\n\n /**\n * Unsubscribe a specific handler from an event\n */\n off<K extends keyof TEvents>(event: K, handler: EventHandler<TEvents[K]>): void {\n const handlers = this.eventBus.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.eventBus.delete(event);\n }\n }\n }\n\n /**\n * Remove all listeners for a specific event\n */\n removeAllListeners<K extends keyof TEvents>(event: K): void {\n this.eventBus.delete(event);\n }\n\n /**\n * Remove all listeners for all events\n */\n clearAll(): void {\n this.eventBus.clear();\n }\n\n /**\n * Get the number of listeners for an event\n */\n listenerCount<K extends keyof TEvents>(event: K): number {\n return this.eventBus.get(event)?.size ?? 0;\n }\n\n /**\n * Get all registered event names\n */\n eventNames(): Array<keyof TEvents> {\n return Array.from(this.eventBus.keys());\n }\n}\n\n/**\n * Default events for Hypen framework (can be extended by users)\n */\nexport type HypenFrameworkEvents = {\n 'module:created': { moduleId: string };\n 'module:destroyed': { moduleId: string };\n 'route:changed': { from: string | null; to: string };\n 'state:updated': { moduleId: string; paths: string[] };\n 'action:dispatched': { moduleId: string; actionName: string; payload?: unknown };\n 'error': { message: string; error?: Error; context?: string };\n};\n\n/**\n * Create a typed event emitter with custom event map\n */\nexport function createEventEmitter<TEvents extends Record<string, unknown> = HypenFrameworkEvents>(): TypedEventEmitter<TEvents> {\n return new TypedEventEmitter<TEvents>();\n}\n",
|
|
12
14
|
"/**\n * Global Context - Cross-module communication and state access\n */\n\nimport type { HypenModuleInstance } from \"./app.js\";\nimport { getStateSnapshot } from \"./state.js\";\nimport { TypedEventEmitter, type HypenFrameworkEvents } from \"./events.js\";\n\nexport type ModuleReference<T = unknown> = {\n state: T; // Live proxy state\n setState: (patch: Partial<T>) => void;\n getState: () => T; // Snapshot\n};\n\n/**\n * @deprecated Use TypedEventEmitter from events.ts for type-safe events\n */\nexport type EventHandler = (payload?: unknown) => void;\n\n/**\n * Global Context - Provides access to all modules and cross-module communication\n *\n * @template TEvents - Custom event map (extends HypenFrameworkEvents)\n */\nexport class HypenGlobalContext<TEvents extends Record<string, unknown> = HypenFrameworkEvents> {\n private modules = new Map<string, HypenModuleInstance>();\n private typedEvents: TypedEventEmitter<TEvents>;\n\n /**\n * @deprecated Legacy event bus for backward compatibility\n */\n private legacyEventBus = new Map<string, Set<EventHandler>>();\n\n constructor() {\n this.typedEvents = new TypedEventEmitter<TEvents>();\n }\n\n /**\n * Get the typed event emitter for type-safe event handling\n */\n get events(): TypedEventEmitter<TEvents> {\n return this.typedEvents;\n }\n\n /**\n * Register a module instance with an ID\n */\n registerModule(id: string, instance: HypenModuleInstance) {\n if (this.modules.has(id)) {\n console.warn(`Module \"${id}\" is already registered. Overwriting.`);\n }\n this.modules.set(id, instance);\n console.log(`Registered module: ${id}`);\n }\n\n /**\n * Unregister a module\n */\n unregisterModule(id: string) {\n this.modules.delete(id);\n console.log(`Unregistered module: ${id}`);\n }\n\n /**\n * Get a module by ID with type safety\n */\n getModule<T = unknown>(id: string): ModuleReference<T> {\n const module = this.modules.get(id);\n if (!module) {\n throw new Error(\n `Module \"${id}\" not found. Available modules: ${Array.from(this.modules.keys()).join(\", \")}`\n );\n }\n\n return {\n state: module.getLiveState() as T,\n setState: (patch: Partial<T>) => module.updateState(patch),\n getState: () => module.getState() as T,\n };\n }\n\n /**\n * Check if a module exists\n */\n hasModule(id: string): boolean {\n return this.modules.has(id);\n }\n\n /**\n * Get all registered module IDs\n */\n getModuleIds(): string[] {\n return Array.from(this.modules.keys());\n }\n\n /**\n * Get the entire app state tree (snapshot)\n */\n getGlobalState(): Record<string, unknown> {\n const state: Record<string, unknown> = {};\n this.modules.forEach((module, id) => {\n state[id] = module.getState();\n });\n return state;\n }\n\n /**\n * Emit an event to the event bus (legacy API for backward compatibility)\n * @deprecated Use `context.events.emit()` for type-safe events\n */\n emit(event: string, payload?: unknown): void {\n const handlers = this.legacyEventBus.get(event);\n if (!handlers || handlers.size === 0) {\n console.log(`Event \"${event}\" emitted but no listeners`);\n } else {\n console.log(`Emitting event: ${event}`, payload);\n handlers.forEach((handler) => {\n try {\n handler(payload);\n } catch (error) {\n console.error(`Error in event handler for \"${event}\":`, error);\n }\n });\n }\n\n // Also emit to typed event system if the event is registered there\n if (this.typedEvents.listenerCount(event as keyof TEvents) > 0) {\n this.typedEvents.emit(event as keyof TEvents, payload as TEvents[keyof TEvents]);\n }\n }\n\n /**\n * Subscribe to an event (legacy API for backward compatibility)\n * @deprecated Use `context.events.on()` for type-safe events\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.legacyEventBus.has(event)) {\n this.legacyEventBus.set(event, new Set());\n }\n\n const handlers = this.legacyEventBus.get(event)!;\n handlers.add(handler);\n\n console.log(`Listening to event: ${event}`);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.legacyEventBus.delete(event);\n }\n };\n }\n\n /**\n * Unsubscribe from an event (legacy API)\n * @deprecated Use the unsubscribe function returned by `context.events.on()`\n */\n off(event: string, handler: EventHandler): void {\n const handlers = this.legacyEventBus.get(event);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this.legacyEventBus.delete(event);\n }\n }\n }\n\n /**\n * Clear all event listeners for an event (legacy API)\n * @deprecated Use `context.events.removeAllListeners()`\n */\n clearEvent(event: string): void {\n this.legacyEventBus.delete(event);\n }\n\n /**\n * Clear all event listeners (legacy API)\n * @deprecated Use `context.events.clearAll()`\n */\n clearAllEvents(): void {\n this.legacyEventBus.clear();\n }\n\n /**\n * Get debug info about the context\n */\n debug(): {\n modules: string[];\n events: string[];\n typedEvents: Array<keyof TEvents>;\n state: Record<string, unknown>;\n } {\n return {\n modules: this.getModuleIds(),\n events: Array.from(this.legacyEventBus.keys()),\n typedEvents: this.typedEvents.eventNames(),\n state: this.getGlobalState(),\n };\n }\n}\n",
|
|
13
|
-
"/**\n * RemoteEngine - Connect to a remote Hypen app over WebSocket\n * Platform-agnostic client (uses standard WebSocket API)\n */\n\nimport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n} from \"./types.js\";\nimport type { Patch } from \"../engine.js\";\n\nexport type RemoteConnectionState = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface RemoteEngineOptions {\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\n/**\n * Client-side engine that connects to a remote Hypen app\n */\nexport class RemoteEngine {\n private ws: WebSocket | null = null;\n private url: string;\n private state: RemoteConnectionState = \"disconnected\";\n private options: Required<RemoteEngineOptions>;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Callbacks\n private patchCallbacks: Array<(patches: Patch[]) => void> = [];\n private stateCallbacks: Array<(state: any) => void> = [];\n private connectionCallbacks: Array<() => void> = [];\n private disconnectionCallbacks: Array<() => void> = [];\n private errorCallbacks: Array<(error: Error) => void> = [];\n\n // State\n private currentState: any = null;\n private currentRevision = 0;\n private moduleName: string = \"\";\n\n constructor(url: string, options: RemoteEngineOptions = {}) {\n this.url = url;\n this.options = {\n autoReconnect: options.autoReconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 3000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n };\n }\n\n /**\n * Connect to the remote server\n */\n async connect(): Promise<void> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return;\n }\n\n this.state = \"connecting\";\n\n return new Promise((resolve, reject) => {\n try {\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n this.state = \"connected\";\n this.reconnectAttempts = 0;\n this.connectionCallbacks.forEach((cb) => cb());\n resolve();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = () => {\n this.state = \"error\";\n const error = new Error(\"WebSocket error\");\n this.errorCallbacks.forEach((cb) => cb(error));\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.state = \"disconnected\";\n this.disconnectionCallbacks.forEach((cb) => cb());\n this.attemptReconnect();\n };\n } catch (error) {\n this.state = \"error\";\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from the remote server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispatch an action to the remote server\n */\n dispatchAction(action: string, payload?: any): void {\n if (this.state !== \"connected\" || !this.ws) {\n console.warn(\"Cannot dispatch action: not connected\");\n return;\n }\n\n const message: DispatchActionMessage = {\n type: \"dispatchAction\",\n module: this.moduleName,\n action,\n payload,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Register callback for patches\n */\n onPatches(callback: (patches: Patch[]) => void): this {\n this.patchCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for state updates\n */\n onStateUpdate(callback: (state: any) => void): this {\n this.stateCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for connection\n */\n onConnect(callback: () => void): this {\n this.connectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for disconnection\n */\n onDisconnect(callback: () => void): this {\n this.disconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): this {\n this.errorCallbacks.push(callback);\n return this;\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): RemoteConnectionState {\n return this.state;\n }\n\n /**\n * Get current app state\n */\n getCurrentState(): any {\n return this.currentState;\n }\n\n /**\n * Get current revision\n */\n getRevision(): number {\n return this.currentRevision;\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as RemoteMessage;\n\n switch (message.type) {\n case \"initialTree\":\n this.handleInitialTree(message as InitialTreeMessage);\n break;\n\n case \"patch\":\n this.handlePatch(message as PatchMessage);\n break;\n\n case \"stateUpdate\":\n this.currentState = message.state;\n this.stateCallbacks.forEach((cb) => cb(message.state));\n break;\n }\n } catch (error) {\n console.error(\"Error handling remote message:\", error);\n this.errorCallbacks.forEach((cb) =>\n cb(error instanceof Error ? error : new Error(String(error)))\n );\n }\n }\n\n private handleInitialTree(message: InitialTreeMessage): void {\n this.moduleName = message.module;\n this.currentState = message.state;\n this.currentRevision = message.revision;\n\n // Apply initial patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n\n // Notify state callbacks\n this.stateCallbacks.forEach((cb) => cb(message.state));\n }\n\n private handlePatch(message: PatchMessage): void {\n // Check revision ordering\n if (message.revision <= this.currentRevision) {\n console.warn(\n `Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`\n );\n return;\n }\n\n this.currentRevision = message.revision;\n\n // Apply patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n }\n\n private attemptReconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n if (this.reconnectAttempts >= this.options.maxReconnectAttempts) {\n console.error(\"Max reconnection attempts reached\");\n return;\n }\n\n this.reconnectAttempts++;\n\n console.log(\n `Attempting to reconnect (${this.reconnectAttempts}/${this.options.maxReconnectAttempts})...`\n );\n\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((error) => {\n console.error(\"Reconnection failed:\", error);\n });\n }, this.options.reconnectInterval);\n }\n}\n",
|
|
15
|
+
"/**\n * RemoteEngine - Connect to a remote Hypen app over WebSocket\n * Platform-agnostic client (uses standard WebSocket API)\n *\n * Usage:\n * ```typescript\n * const engine = new RemoteEngine(\"ws://localhost:3000\", {\n * session: {\n * id: localStorage.getItem(\"sessionId\") ?? undefined,\n * props: { platform: \"web\", version: \"1.0\" }\n * }\n * });\n *\n * engine.onSessionEstablished(({ sessionId, isNew, isRestored }) => {\n * localStorage.setItem(\"sessionId\", sessionId);\n * console.log(isRestored ? \"Welcome back!\" : \"New session\");\n * });\n *\n * engine.onSessionExpired((reason) => {\n * localStorage.removeItem(\"sessionId\");\n * });\n *\n * const result = await engine.connect();\n * if (!result.ok) {\n * console.error(\"Connection failed:\", result.error);\n * }\n * ```\n */\n\nimport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n HelloMessage,\n SessionAckMessage,\n SessionExpiredMessage,\n} from \"./types.js\";\nimport type { Patch } from \"../engine.js\";\nimport {\n type Result,\n Ok,\n Err,\n ConnectionError,\n} from \"../result.js\";\nimport {\n type Disposable,\n DisposableStack,\n disposableTimeout,\n disposableWebSocket,\n disposableListener,\n} from \"../disposable.js\";\nimport { retry, type RetryOptions } from \"../retry.js\";\n\nexport type RemoteConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\n/**\n * Session configuration for the client\n */\nexport interface SessionOptions {\n /** Session ID to resume (omit for new session) */\n id?: string;\n /** Client metadata (platform, version, userId, etc.) */\n props?: Record<string, unknown>;\n}\n\n/**\n * Session information received from server\n */\nexport interface SessionInfo {\n sessionId: string;\n isNew: boolean;\n isRestored: boolean;\n}\n\nexport interface RemoteEngineOptions {\n autoReconnect?: boolean;\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n /** Session configuration */\n session?: SessionOptions;\n}\n\ninterface RequiredOptions {\n autoReconnect: boolean;\n reconnectInterval: number;\n maxReconnectAttempts: number;\n session?: SessionOptions;\n}\n\n/**\n * Client-side engine that connects to a remote Hypen app\n */\nexport class RemoteEngine implements Disposable {\n private ws: WebSocket | null = null;\n private readonly url: string;\n private state: RemoteConnectionState = \"disconnected\";\n private readonly options: RequiredOptions;\n private reconnectAttempts = 0;\n\n // Resource management\n private readonly disposables = new DisposableStack();\n private reconnectDisposable: Disposable | null = null;\n\n // Session state\n private currentSessionId: string | null = null;\n private readonly sessionOptions?: SessionOptions;\n\n // Callbacks\n private readonly patchCallbacks: Array<(patches: Patch[]) => void> = [];\n private readonly stateCallbacks: Array<(state: unknown) => void> = [];\n private readonly connectionCallbacks: Array<() => void> = [];\n private readonly disconnectionCallbacks: Array<() => void> = [];\n private readonly errorCallbacks: Array<(error: Error) => void> = [];\n private readonly sessionEstablishedCallbacks: Array<(info: SessionInfo) => void> = [];\n private readonly sessionExpiredCallbacks: Array<(reason: string) => void> = [];\n\n // State\n private currentState: unknown = null;\n private currentRevision = 0;\n private moduleName: string = \"\";\n\n constructor(url: string, options: RemoteEngineOptions = {}) {\n this.url = url;\n this.options = {\n autoReconnect: options.autoReconnect ?? true,\n reconnectInterval: options.reconnectInterval ?? 3000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? 10,\n session: options.session,\n };\n this.sessionOptions = options.session;\n\n // If session ID was provided, use it as current\n if (options.session?.id) {\n this.currentSessionId = options.session.id;\n }\n }\n\n /**\n * Connect to the remote server\n * Returns a Result indicating success or failure\n */\n async connect(): Promise<Result<void, ConnectionError>> {\n if (this.state === \"connected\" || this.state === \"connecting\") {\n return Ok(undefined);\n }\n\n this.state = \"connecting\";\n\n return new Promise((resolve) => {\n try {\n this.ws = new WebSocket(this.url);\n\n // Track the WebSocket for cleanup\n this.disposables.add(disposableWebSocket(this.ws));\n\n // Set up message handler\n const messageHandler = (event: MessageEvent) => {\n this.handleMessage(event.data);\n };\n this.disposables.add(\n disposableListener(this.ws, \"message\", messageHandler as EventListener)\n );\n\n // Set up error handler\n const errorHandler = () => {\n this.state = \"error\";\n const error = new ConnectionError(this.url, new Error(\"WebSocket error\"));\n this.errorCallbacks.forEach((cb) => cb(error));\n resolve(Err(error));\n };\n this.disposables.add(\n disposableListener(this.ws, \"error\", errorHandler)\n );\n\n // Set up close handler\n const closeHandler = () => {\n this.state = \"disconnected\";\n this.disconnectionCallbacks.forEach((cb) => cb());\n this.attemptReconnect();\n };\n this.disposables.add(\n disposableListener(this.ws, \"close\", closeHandler)\n );\n\n // Set up open handler\n this.ws.onopen = () => {\n this.state = \"connected\";\n this.reconnectAttempts = 0;\n\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Send hello message with session info\n this.sendHello();\n\n this.connectionCallbacks.forEach((cb) => cb());\n resolve(Ok(undefined));\n };\n } catch (e) {\n this.state = \"error\";\n const error = new ConnectionError(this.url, e);\n resolve(Err(error));\n }\n });\n }\n\n /**\n * Send hello message to establish session\n */\n private sendHello(): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n\n const hello: HelloMessage = {\n type: \"hello\",\n sessionId: this.currentSessionId ?? this.sessionOptions?.id,\n props: this.sessionOptions?.props,\n };\n\n this.ws.send(JSON.stringify(hello));\n }\n\n /**\n * Disconnect from the remote server and clean up resources\n */\n disconnect(): void {\n // Cancel any pending reconnect\n if (this.reconnectDisposable) {\n this.reconnectDisposable.dispose();\n this.reconnectDisposable = null;\n }\n\n // Close WebSocket if open\n if (this.ws) {\n if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n this.ws.close();\n }\n this.ws = null;\n }\n\n this.state = \"disconnected\";\n }\n\n /**\n * Dispose all resources (alias for disconnect)\n */\n dispose(): void {\n this.disconnect();\n this.disposables.dispose();\n }\n\n /**\n * Dispatch an action to the remote server\n */\n dispatchAction(action: string, payload?: unknown): void {\n if (this.state !== \"connected\" || !this.ws) {\n console.warn(\"Cannot dispatch action: not connected\");\n return;\n }\n\n const message: DispatchActionMessage = {\n type: \"dispatchAction\",\n module: this.moduleName,\n action,\n payload,\n };\n\n this.ws.send(JSON.stringify(message));\n }\n\n /**\n * Register callback for patches\n */\n onPatches(callback: (patches: Patch[]) => void): this {\n this.patchCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for state updates\n */\n onStateUpdate(callback: (state: unknown) => void): this {\n this.stateCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for connection\n */\n onConnect(callback: () => void): this {\n this.connectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for disconnection\n */\n onDisconnect(callback: () => void): this {\n this.disconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for errors\n */\n onError(callback: (error: Error) => void): this {\n this.errorCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session establishment\n * Called when server confirms session (new or resumed)\n */\n onSessionEstablished(callback: (info: SessionInfo) => void): this {\n this.sessionEstablishedCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register callback for session expiration\n * Called when session is kicked or expires\n */\n onSessionExpired(callback: (reason: string) => void): this {\n this.sessionExpiredCallbacks.push(callback);\n return this;\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): RemoteConnectionState {\n return this.state;\n }\n\n /**\n * Get current app state\n */\n getCurrentState(): unknown {\n return this.currentState;\n }\n\n /**\n * Get current revision\n */\n getRevision(): number {\n return this.currentRevision;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as RemoteMessage;\n\n switch (message.type) {\n case \"sessionAck\":\n this.handleSessionAck(message as SessionAckMessage);\n break;\n\n case \"sessionExpired\":\n this.handleSessionExpired(message as SessionExpiredMessage);\n break;\n\n case \"initialTree\":\n this.handleInitialTree(message as InitialTreeMessage);\n break;\n\n case \"patch\":\n this.handlePatch(message as PatchMessage);\n break;\n\n case \"stateUpdate\":\n this.currentState = (message as { state: unknown }).state;\n this.stateCallbacks.forEach((cb) => cb(this.currentState));\n break;\n }\n } catch (e) {\n console.error(\"Error handling remote message:\", e);\n const error = e instanceof Error ? e : new Error(String(e));\n this.errorCallbacks.forEach((cb) => cb(error));\n }\n }\n\n private handleSessionAck(message: SessionAckMessage): void {\n this.currentSessionId = message.sessionId;\n\n const info: SessionInfo = {\n sessionId: message.sessionId,\n isNew: message.isNew,\n isRestored: message.isRestored,\n };\n\n this.sessionEstablishedCallbacks.forEach((cb) => cb(info));\n }\n\n private handleSessionExpired(message: SessionExpiredMessage): void {\n this.currentSessionId = null;\n this.sessionExpiredCallbacks.forEach((cb) => cb(message.reason));\n }\n\n private handleInitialTree(message: InitialTreeMessage): void {\n this.moduleName = message.module;\n this.currentState = message.state;\n this.currentRevision = message.revision;\n\n // Apply initial patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n\n // Notify state callbacks\n this.stateCallbacks.forEach((cb) => cb(message.state));\n }\n\n private handlePatch(message: PatchMessage): void {\n // Check revision ordering\n if (message.revision <= this.currentRevision) {\n console.warn(\n `Out of order patch: expected > ${this.currentRevision}, got ${message.revision}`\n );\n return;\n }\n\n this.currentRevision = message.revision;\n\n // Apply patches\n if (message.patches.length > 0) {\n this.patchCallbacks.forEach((cb) => cb(message.patches));\n }\n }\n\n private attemptReconnect(): void {\n if (!this.options.autoReconnect) {\n return;\n }\n\n // Use disposable timeout to start reconnection after initial delay\n this.reconnectDisposable = disposableTimeout(() => {\n this.reconnectDisposable = null;\n\n retry(\n async () => {\n const result = await this.connect();\n if (!result.ok) {\n throw result.error;\n }\n },\n {\n maxAttempts: this.options.maxReconnectAttempts,\n delayMs: this.options.reconnectInterval,\n backoff: \"exponential\",\n maxDelayMs: 30000,\n jitter: 0.1,\n onRetry: (attempt, error) => {\n console.log(\n `Reconnection attempt ${attempt}/${this.options.maxReconnectAttempts} failed: ${error.message}`\n );\n },\n }\n ).catch((error) => {\n console.error(\"Max reconnection attempts reached:\", error.message);\n this.errorCallbacks.forEach((cb) =>\n cb(new ConnectionError(this.url, error, this.options.maxReconnectAttempts))\n );\n });\n }, this.options.reconnectInterval);\n }\n}\n",
|
|
16
|
+
"/**\n * Disposable Pattern for Resource Management\n *\n * Provides a consistent way to manage and clean up resources like\n * event listeners, timers, WebSocket connections, etc.\n */\n\n/**\n * Interface for objects that can be disposed\n */\nexport interface Disposable {\n dispose(): void;\n}\n\n/**\n * Check if an object is Disposable\n */\nexport function isDisposable(obj: unknown): obj is Disposable {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n 'dispose' in obj &&\n typeof (obj as Disposable).dispose === 'function'\n );\n}\n\n/**\n * A stack of disposables that are disposed in LIFO order\n */\nexport class DisposableStack implements Disposable {\n private stack: Disposable[] = [];\n private disposed = false;\n\n /**\n * Add a disposable to the stack and return it\n */\n add<T extends Disposable>(disposable: T): T {\n if (this.disposed) {\n // If already disposed, immediately dispose the new item\n disposable.dispose();\n return disposable;\n }\n this.stack.push(disposable);\n return disposable;\n }\n\n /**\n * Add a cleanup callback to the stack\n */\n addCallback(callback: () => void): void {\n this.add({ dispose: callback });\n }\n\n /**\n * Add a value with a custom dispose function\n */\n addValue<T>(value: T, dispose: (value: T) => void): T {\n this.add({ dispose: () => dispose(value) });\n return value;\n }\n\n /**\n * Dispose all items in reverse order (LIFO)\n */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n\n while (this.stack.length > 0) {\n const item = this.stack.pop()!;\n try {\n item.dispose();\n } catch (error) {\n // Log but continue disposing other items\n console.error('[DisposableStack] Error during dispose:', error);\n }\n }\n }\n\n /**\n * Check if this stack has been disposed\n */\n get isDisposed(): boolean {\n return this.disposed;\n }\n\n /**\n * Get the number of items in the stack\n */\n get size(): number {\n return this.stack.length;\n }\n}\n\n/**\n * Create a disposable from an event listener\n */\nexport function disposableListener(\n target: EventTarget,\n event: string,\n handler: EventListenerOrEventListenerObject,\n options?: AddEventListenerOptions\n): Disposable {\n target.addEventListener(event, handler, options);\n return {\n dispose: () => target.removeEventListener(event, handler, options),\n };\n}\n\n/**\n * Create a disposable from a timeout\n */\nexport function disposableTimeout(\n callback: () => void,\n ms: number\n): Disposable & { id: ReturnType<typeof setTimeout> } {\n const id = setTimeout(callback, ms);\n return {\n id,\n dispose: () => clearTimeout(id),\n };\n}\n\n/**\n * Create a disposable from an interval\n */\nexport function disposableInterval(\n callback: () => void,\n ms: number\n): Disposable & { id: ReturnType<typeof setInterval> } {\n const id = setInterval(callback, ms);\n return {\n id,\n dispose: () => clearInterval(id),\n };\n}\n\n/**\n * Create a disposable from a WebSocket\n */\nexport function disposableWebSocket(ws: WebSocket): Disposable {\n return {\n dispose: () => {\n if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {\n ws.close();\n }\n },\n };\n}\n\n/**\n * Create a disposable from an AbortController\n */\nexport function disposableAbortController(): Disposable & { controller: AbortController; signal: AbortSignal } {\n const controller = new AbortController();\n return {\n controller,\n signal: controller.signal,\n dispose: () => controller.abort(),\n };\n}\n\n/**\n * Create a disposable subscription (for event emitters, observables, etc.)\n */\nexport function disposableSubscription(unsubscribe: () => void): Disposable {\n return { dispose: unsubscribe };\n}\n\n/**\n * Symbol used to store disposables on DOM elements\n */\nconst ELEMENT_DISPOSABLES = Symbol('hypen.disposables');\n\n/**\n * Get or create a DisposableStack for an HTML element\n */\nexport function getElementDisposables(element: HTMLElement): DisposableStack {\n const existing = (element as any)[ELEMENT_DISPOSABLES];\n if (existing instanceof DisposableStack) {\n return existing;\n }\n const stack = new DisposableStack();\n (element as any)[ELEMENT_DISPOSABLES] = stack;\n return stack;\n}\n\n/**\n * Dispose all disposables attached to an element\n */\nexport function disposeElement(element: HTMLElement): void {\n const stack = (element as any)[ELEMENT_DISPOSABLES];\n if (stack instanceof DisposableStack) {\n stack.dispose();\n delete (element as any)[ELEMENT_DISPOSABLES];\n }\n}\n\n/**\n * Check if an element has disposables\n */\nexport function hasElementDisposables(element: HTMLElement): boolean {\n return (element as any)[ELEMENT_DISPOSABLES] instanceof DisposableStack;\n}\n\n/**\n * Decorator/helper to make a class disposable\n * Tracks all resources and disposes them when dispose() is called\n */\nexport class DisposableMixin {\n protected disposables = new DisposableStack();\n\n /**\n * Register a disposable to be cleaned up\n */\n protected track<T extends Disposable>(disposable: T): T {\n return this.disposables.add(disposable);\n }\n\n /**\n * Register a cleanup callback\n */\n protected onDispose(callback: () => void): void {\n this.disposables.addCallback(callback);\n }\n\n /**\n * Dispose all tracked resources\n */\n dispose(): void {\n this.disposables.dispose();\n }\n}\n\n/**\n * Create a composite disposable that disposes multiple items together\n */\nexport function compositeDisposable(...disposables: Disposable[]): Disposable {\n return {\n dispose: () => {\n for (const d of disposables) {\n try {\n d.dispose();\n } catch (error) {\n console.error('[compositeDisposable] Error during dispose:', error);\n }\n }\n },\n };\n}\n\n/**\n * Run a function with automatic cleanup on exit\n * Similar to Python's context managers or C#'s using statement\n */\nexport async function using<T extends Disposable, R>(\n resource: T | (() => T),\n fn: (resource: T) => R | Promise<R>\n): Promise<R> {\n const r = typeof resource === 'function' ? resource() : resource;\n try {\n return await fn(r);\n } finally {\n r.dispose();\n }\n}\n\n/**\n * Synchronous version of using()\n */\nexport function usingSync<T extends Disposable, R>(\n resource: T | (() => T),\n fn: (resource: T) => R\n): R {\n const r = typeof resource === 'function' ? resource() : resource;\n try {\n return fn(r);\n } finally {\n r.dispose();\n }\n}\n",
|
|
17
|
+
"/**\n * Retry Utility for Network Operations\n *\n * Provides configurable retry logic with exponential/linear backoff\n * for handling transient failures in network operations.\n */\n\nimport { type Result, Ok, Err } from \"./result.js\";\n\n/**\n * Options for retry behavior\n */\nexport interface RetryOptions {\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Initial delay in milliseconds (default: 1000) */\n delayMs?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: \"linear\" | \"exponential\" | \"none\";\n /** Maximum delay cap in milliseconds (default: 30000) */\n maxDelayMs?: number;\n /** Jitter factor 0-1 to randomize delays (default: 0.1) */\n jitter?: number;\n /** Callback on each retry attempt */\n onRetry?: (attempt: number, error: Error, nextDelayMs: number) => void;\n /** Optional predicate to determine if error is retryable */\n shouldRetry?: (error: Error) => boolean;\n /** AbortSignal for cancellation */\n signal?: AbortSignal;\n}\n\n/**\n * Default retry options\n */\nconst DEFAULT_OPTIONS: Required<Omit<RetryOptions, \"onRetry\" | \"shouldRetry\" | \"signal\">> = {\n maxAttempts: 3,\n delayMs: 1000,\n backoff: \"exponential\",\n maxDelayMs: 30000,\n jitter: 0.1,\n};\n\n/**\n * Calculate delay for a given attempt\n */\nfunction calculateDelay(\n attempt: number,\n options: Required<Omit<RetryOptions, \"onRetry\" | \"shouldRetry\" | \"signal\">>\n): number {\n let delay: number;\n\n switch (options.backoff) {\n case \"exponential\":\n // 2^(attempt-1) * delayMs: 1x, 2x, 4x, 8x...\n delay = options.delayMs * Math.pow(2, attempt - 1);\n break;\n case \"linear\":\n // attempt * delayMs: 1x, 2x, 3x, 4x...\n delay = options.delayMs * attempt;\n break;\n case \"none\":\n delay = options.delayMs;\n break;\n }\n\n // Apply jitter (randomize ±jitter%)\n if (options.jitter > 0) {\n const jitterRange = delay * options.jitter;\n delay += (Math.random() * 2 - 1) * jitterRange;\n }\n\n // Cap at maxDelayMs\n return Math.min(delay, options.maxDelayMs);\n}\n\n/**\n * Sleep for a given duration, respecting abort signal\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error(\"Retry aborted\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\"abort\", () => {\n clearTimeout(timeoutId);\n reject(new Error(\"Retry aborted\"));\n });\n });\n}\n\n/**\n * Retry a function with configurable backoff\n *\n * @example\n * ```typescript\n * // Basic usage\n * const result = await retry(() => fetch('/api/data'));\n *\n * // With options\n * const result = await retry(\n * () => fetch('/api/data'),\n * {\n * maxAttempts: 5,\n * delayMs: 2000,\n * backoff: 'exponential',\n * onRetry: (n, err) => console.log(`Attempt ${n} failed: ${err.message}`)\n * }\n * );\n * ```\n */\nexport async function retry<T>(\n fn: () => T | Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n let lastError: Error = new Error(\"No attempts made\");\n\n for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {\n try {\n // Check for abort before each attempt\n if (opts.signal?.aborted) {\n throw new Error(\"Retry aborted\");\n }\n\n return await fn();\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n\n // Check if we should retry this error\n if (opts.shouldRetry && !opts.shouldRetry(lastError)) {\n throw lastError;\n }\n\n // If this was the last attempt, don't wait\n if (attempt === opts.maxAttempts) {\n break;\n }\n\n // Calculate delay and notify\n const delayMs = calculateDelay(attempt, opts);\n opts.onRetry?.(attempt, lastError, delayMs);\n\n // Wait before next attempt\n await sleep(delayMs, opts.signal);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Retry a function, returning a Result instead of throwing\n *\n * @example\n * ```typescript\n * const result = await retryResult(() => fetch('/api/data'));\n * if (result.ok) {\n * console.log('Success:', result.value);\n * } else {\n * console.error('All retries failed:', result.error);\n * }\n * ```\n */\nexport async function retryResult<T>(\n fn: () => T | Promise<T>,\n options: RetryOptions = {}\n): Promise<Result<T, Error>> {\n try {\n const value = await retry(fn, options);\n return Ok(value);\n } catch (e) {\n return Err(e instanceof Error ? e : new Error(String(e)));\n }\n}\n\n/**\n * Create a retryable version of a function\n *\n * @example\n * ```typescript\n * const fetchWithRetry = withRetry(\n * (url: string) => fetch(url),\n * { maxAttempts: 3 }\n * );\n *\n * const response = await fetchWithRetry('/api/data');\n * ```\n */\nexport function withRetry<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn | Promise<TReturn>,\n options: RetryOptions = {}\n): (...args: TArgs) => Promise<TReturn> {\n return (...args: TArgs) => retry(() => fn(...args), options);\n}\n\n/**\n * Predefined retry conditions\n */\nexport const RetryConditions = {\n /**\n * Retry on network errors (fetch failures, timeouts)\n */\n networkErrors: (error: Error): boolean => {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch\") ||\n message.includes(\"timeout\") ||\n message.includes(\"econnrefused\") ||\n message.includes(\"econnreset\") ||\n message.includes(\"socket\")\n );\n },\n\n /**\n * Retry on specific HTTP status codes (from fetch Response)\n */\n httpRetryable: (error: Error & { status?: number }): boolean => {\n const status = error.status;\n if (!status) return false;\n // Retry on 408, 429, 500, 502, 503, 504\n return [408, 429, 500, 502, 503, 504].includes(status);\n },\n\n /**\n * Retry on transient WebSocket errors\n */\n websocketErrors: (error: Error): boolean => {\n const message = error.message.toLowerCase();\n return (\n message.includes(\"websocket\") ||\n message.includes(\"connection\") ||\n message.includes(\"close\")\n );\n },\n\n /**\n * Combine multiple conditions (retry if any match)\n */\n any:\n (...conditions: Array<(error: Error) => boolean>) =>\n (error: Error): boolean =>\n conditions.some((c) => c(error)),\n\n /**\n * Combine multiple conditions (retry if all match)\n */\n all:\n (...conditions: Array<(error: Error) => boolean>) =>\n (error: Error): boolean =>\n conditions.every((c) => c(error)),\n};\n\n/**\n * Preset configurations for common use cases\n */\nexport const RetryPresets = {\n /**\n * Aggressive retry for critical operations\n */\n aggressive: {\n maxAttempts: 10,\n delayMs: 500,\n backoff: \"exponential\" as const,\n maxDelayMs: 60000,\n jitter: 0.2,\n },\n\n /**\n * Conservative retry for non-critical operations\n */\n conservative: {\n maxAttempts: 3,\n delayMs: 2000,\n backoff: \"linear\" as const,\n maxDelayMs: 10000,\n jitter: 0.1,\n },\n\n /**\n * Fast retry for local operations (short delays)\n */\n fast: {\n maxAttempts: 5,\n delayMs: 100,\n backoff: \"exponential\" as const,\n maxDelayMs: 2000,\n jitter: 0,\n },\n\n /**\n * WebSocket reconnection preset\n */\n websocket: {\n maxAttempts: 10,\n delayMs: 1000,\n backoff: \"exponential\" as const,\n maxDelayMs: 30000,\n jitter: 0.1,\n shouldRetry: RetryConditions.websocketErrors,\n },\n};\n",
|
|
14
18
|
"/**\n * Component Loader\n *\n * Loads and registers Hypen components from file system.\n * Works in both Node.js and Bun environments.\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\n\nexport interface ComponentDefinition {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string; // The .hypen file content\n path: string;\n}\n\nexport class ComponentLoader {\n private components = new Map<string, ComponentDefinition>();\n\n /**\n * Register a component with its module and template\n */\n register(\n name: string,\n module: HypenModuleDefinition<any>,\n template: string,\n path?: string\n ): void {\n this.components.set(name, {\n name,\n module,\n template,\n path: path || name,\n });\n }\n\n /**\n * Get a registered component by name\n */\n get(name: string): ComponentDefinition | undefined {\n return this.components.get(name);\n }\n\n /**\n * Check if a component is registered\n */\n has(name: string): boolean {\n return this.components.has(name);\n }\n\n /**\n * Get all registered component names\n */\n getNames(): string[] {\n return Array.from(this.components.keys());\n }\n\n /**\n * Get all registered components\n */\n getAll(): ComponentDefinition[] {\n return Array.from(this.components.values());\n }\n\n /**\n * Clear all registered components\n */\n clear(): void {\n this.components.clear();\n }\n\n /**\n * Load a component from a directory\n * Expects: component.ts and component.hypen in the same directory\n */\n async loadFromDirectory(name: string, dirPath: string): Promise<void> {\n try {\n // Dynamic import of the module\n const modulePath = join(dirPath, \"component.ts\");\n const moduleExport = await import(modulePath);\n const module = moduleExport.default as HypenModuleDefinition<any>;\n\n // Read the .hypen template file\n const templatePath = join(dirPath, \"component.hypen\");\n const template = readFileSync(templatePath, \"utf-8\");\n\n // Register the component\n this.register(name, module, template, dirPath);\n\n console.log(`✓ Loaded component: ${name} from ${dirPath}`);\n } catch (error) {\n console.error(\n `✗ Failed to load component ${name} from ${dirPath}:`,\n error\n );\n throw error;\n }\n }\n\n /**\n * Auto-load all components from a directory\n * Scans for subdirectories containing component.ts and component.hypen\n */\n async loadFromComponentsDir(baseDir: string): Promise<void> {\n try {\n if (!existsSync(baseDir)) {\n console.warn(`⚠ Components directory not found: ${baseDir}`);\n return;\n }\n\n const entries = readdirSync(baseDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const componentDir = join(baseDir, entry.name);\n const hypenPath = join(componentDir, \"component.hypen\");\n\n // Only load if component.hypen exists\n if (existsSync(hypenPath)) {\n await this.loadFromDirectory(entry.name, componentDir);\n }\n }\n\n console.log(`✓ Loaded ${this.components.size} components from ${baseDir}`);\n } catch (error) {\n console.error(`✗ Failed to load components from ${baseDir}:`, error);\n throw error;\n }\n }\n}\n\n// Global component loader instance\nexport const componentLoader = new ComponentLoader();\n",
|
|
15
19
|
"/**\n * Component Resolver\n * Resolves component imports from local paths or web URLs\n */\n\nexport interface ImportStatement {\n clause: ImportClause;\n source: ImportSource;\n}\n\nexport type ImportClause =\n | { type: \"named\"; names: string[] }\n | { type: \"default\"; name: string };\n\nexport type ImportSource =\n | { type: \"local\"; path: string }\n | { type: \"url\"; url: string };\n\nexport interface ComponentDefinition {\n module: any;\n template: string;\n}\n\nexport interface ResolverOptions {\n /**\n * Base directory for resolving relative local paths\n * Defaults to current working directory\n */\n baseDir?: string;\n\n /**\n * Cache resolved components to avoid re-fetching\n * Defaults to true\n */\n cache?: boolean;\n\n /**\n * Custom fetch function for URL imports\n * Useful for adding authentication, custom headers, etc.\n */\n customFetch?: (url: string) => Promise<string>;\n}\n\n/**\n * Component Resolver\n * Resolves and loads components from local files or remote URLs\n */\nexport class ComponentResolver {\n private cache = new Map<string, ComponentDefinition>();\n private options: Required<ResolverOptions>;\n\n constructor(options: ResolverOptions = {}) {\n this.options = {\n baseDir: options.baseDir || process.cwd(),\n cache: options.cache ?? true,\n customFetch: options.customFetch || this.defaultFetch.bind(this),\n };\n }\n\n /**\n * Resolve a component from an import statement\n */\n async resolve(\n importStmt: ImportStatement\n ): Promise<Record<string, ComponentDefinition>> {\n const sourcePath = this.getSourcePath(importStmt.source);\n\n // Check cache first\n if (this.options.cache && this.cache.has(sourcePath)) {\n const cached = this.cache.get(sourcePath)!;\n return this.extractComponents(importStmt.clause, cached);\n }\n\n // Load the component\n let component: ComponentDefinition;\n if (importStmt.source.type === \"local\") {\n component = await this.resolveLocal(importStmt.source.path);\n } else {\n component = await this.resolveUrl(importStmt.source.url);\n }\n\n // Cache it\n if (this.options.cache) {\n this.cache.set(sourcePath, component);\n }\n\n return this.extractComponents(importStmt.clause, component);\n }\n\n /**\n * Resolve a component from a local file path\n */\n private async resolveLocal(path: string): Promise<ComponentDefinition> {\n // For local paths, we expect the build system to have already\n // processed them into the generated components file\n // This is a fallback for dynamic resolution\n throw new Error(\n `Dynamic local component resolution not yet implemented: ${path}\\n` +\n `Please use the build-components.ts script to generate component imports.`\n );\n }\n\n /**\n * Resolve a component from a URL\n */\n private async resolveUrl(url: string): Promise<ComponentDefinition> {\n try {\n const response = await this.options.customFetch(url);\n const data = JSON.parse(response);\n\n // Expected format: { module: {...}, template: \"...\" }\n if (!data.module || !data.template) {\n throw new Error(\n `Invalid component format from ${url}. Expected { module, template }`\n );\n }\n\n return data;\n } catch (error) {\n throw new Error(\n `Failed to resolve component from ${url}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n /**\n * Default fetch implementation\n */\n private async defaultFetch(url: string): Promise<string> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n return response.text();\n }\n\n /**\n * Extract the requested components based on the import clause\n */\n private extractComponents(\n clause: ImportClause,\n component: ComponentDefinition\n ): Record<string, ComponentDefinition> {\n if (clause.type === \"default\") {\n return {\n [clause.name]: component,\n };\n } else {\n // Named imports - for now, we only support single exports\n // In the future, we could support exporting multiple components\n // from a single file\n const result: Record<string, ComponentDefinition> = {};\n for (const name of clause.names) {\n result[name] = component;\n }\n return result;\n }\n }\n\n /**\n * Get the source path as a string (for caching)\n */\n private getSourcePath(source: ImportSource): string {\n return source.type === \"local\" ? source.path : source.url;\n }\n\n /**\n * Clear the component cache\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Parse import statements from Hypen DSL text\n * This is a simple parser that extracts import statements\n */\n static parseImports(text: string): ImportStatement[] {\n const imports: ImportStatement[] = [];\n const importRegex =\n /import\\s+(?:(\\{[^}]*\\})|(\\w+))\\s+from\\s+[\"']([^\"']+)[\"']/g;\n\n let match;\n while ((match = importRegex.exec(text)) !== null) {\n const [, namedImports, defaultImport, source] = match;\n\n if (!source) continue;\n\n let clause: ImportClause;\n if (namedImports) {\n // Named imports: { Button, Card }\n const names = namedImports\n .slice(1, -1) // Remove { and }\n .split(\",\")\n .map((n) => n.trim())\n .filter((n) => n.length > 0);\n clause = { type: \"named\", names };\n } else if (defaultImport) {\n // Default import: HomePage\n clause = { type: \"default\", name: defaultImport };\n } else {\n continue;\n }\n\n // Determine if source is URL or local path\n const sourceObj: ImportSource = source.startsWith(\"http://\") ||\n source.startsWith(\"https://\")\n ? { type: \"url\", url: source }\n : { type: \"local\", path: source };\n\n imports.push({ clause, source: sourceObj });\n }\n\n return imports;\n }\n}\n",
|
|
16
|
-
"/**\n * Component Discovery\n *\n * Automatically discovers Hypen components from the filesystem.\n *\n * Supports multiple conventions:\n * 1. Folder-based: ComponentName/component.ts + ComponentName/component.hypen\n * 2. Sibling files: ComponentName.ts + ComponentName.hypen\n * 3. Index-based: ComponentName/index.ts + ComponentName/index.hypen\n */\n\nimport { existsSync, readdirSync, readFileSync, watch } from \"fs\";\nimport { join, basename, resolve } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\n\nexport interface DiscoveredComponent {\n name: string;\n hypenPath: string;\n modulePath: string | null;\n template: string;\n hasModule: boolean;\n}\n\nexport interface DiscoveryOptions {\n /**\n * Which naming patterns to look for\n * Default: [\"folder\", \"sibling\", \"index\"]\n */\n patterns?: (\"folder\" | \"sibling\" | \"index\")[];\n\n /**\n * Recursively scan subdirectories\n * Default: false\n */\n recursive?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n}\n\nexport interface WatchOptions extends DiscoveryOptions {\n /**\n * Callback when components change\n */\n onChange?: (components: DiscoveredComponent[]) => void;\n\n /**\n * Callback when a component is added\n */\n onAdd?: (component: DiscoveredComponent) => void;\n\n /**\n * Callback when a component is removed\n */\n onRemove?: (name: string) => void;\n\n /**\n * Callback when a component is updated\n */\n onUpdate?: (component: DiscoveredComponent) => void;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Discover all Hypen components in a directory\n */\nexport async function discoverComponents(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<DiscoveredComponent[]> {\n const {\n patterns = [\"folder\", \"sibling\", \"index\"],\n recursive = false,\n debug = false,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[discovery]\", ...args)\n : () => {};\n\n const resolvedDir = resolve(baseDir);\n const components: DiscoveredComponent[] = [];\n const seen = new Set<string>();\n\n log(\"Scanning directory:\", resolvedDir);\n log(\"Patterns:\", patterns);\n\n // Helper to add a component if not already seen\n const addComponent = (\n name: string,\n hypenPath: string,\n modulePath: string | null\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n const template = removeImports(templateRaw).trim();\n\n components.push({\n name,\n hypenPath,\n modulePath,\n template,\n hasModule: modulePath !== null,\n });\n\n log(`Found: ${name} (${modulePath ? \"with module\" : \"stateless\"})`);\n };\n\n // Scan directory for folder-based components\n const scanForFolderComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const folderPath = join(dir, entry.name);\n const componentName = entry.name;\n\n // Check folder-based pattern: Name/component.hypen\n if (patterns.includes(\"folder\")) {\n const hypenPath = join(folderPath, \"component.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"component.ts\");\n addComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Check index-based pattern: Name/index.hypen\n if (patterns.includes(\"index\")) {\n const hypenPath = join(folderPath, \"index.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"index.ts\");\n addComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Recursive scan\n if (recursive) {\n scanForFolderComponents(folderPath);\n }\n }\n };\n\n // Scan for sibling file components\n const scanForSiblingComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n scanForSiblingComponents(join(dir, entry.name));\n }\n continue;\n }\n\n if (!entry.name.endsWith(\".hypen\")) continue;\n\n const hypenPath = join(dir, entry.name);\n const baseName = basename(entry.name, \".hypen\");\n\n // Skip component.hypen and index.hypen (handled by folder patterns)\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n const modulePath = join(dir, `${baseName}.ts`);\n addComponent(\n baseName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n }\n };\n\n // Run scans based on patterns\n if (patterns.includes(\"folder\") || patterns.includes(\"index\")) {\n scanForFolderComponents(resolvedDir);\n }\n\n if (patterns.includes(\"sibling\")) {\n scanForSiblingComponents(resolvedDir);\n }\n\n log(`Discovered ${components.length} components`);\n\n return components;\n}\n\n/**\n * Load discovered components into a map for use with Hypen\n */\nexport async function loadDiscoveredComponents(\n components: DiscoveredComponent[]\n): Promise<\n Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string;\n }\n >\n> {\n // Dynamically import app to avoid circular dependencies\n const { app } = await import(\"./app.js\");\n\n const loaded = new Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition;\n template: string;\n }\n >();\n\n for (const component of components) {\n let module: HypenModuleDefinition<any>;\n\n if (component.modulePath) {\n // Import the TypeScript module\n const moduleExport = await import(component.modulePath);\n module = moduleExport.default as HypenModuleDefinition<any>;\n } else {\n // Create a stateless module\n module = app.defineState({}).build();\n }\n\n loaded.set(component.name, {\n name: component.name,\n module,\n template: component.template,\n });\n }\n\n return loaded;\n}\n\n/**\n * Watch a directory for component changes\n */\nexport function watchComponents(\n baseDir: string,\n options: WatchOptions = {}\n): { stop: () => void } {\n const resolvedDir = resolve(baseDir);\n const {\n onChange,\n onAdd,\n onRemove,\n onUpdate,\n debug = false,\n ...discoveryOptions\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[discovery:watch]\", ...args)\n : () => {};\n\n let currentComponents = new Map<string, DiscoveredComponent>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Initial scan\n const initialScan = async () => {\n const components = await discoverComponents(resolvedDir, discoveryOptions);\n currentComponents = new Map(components.map((c) => [c.name, c]));\n onChange?.(components);\n };\n\n // Debounced rescan\n const rescan = async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n log(\"Rescanning...\");\n const newComponents = await discoverComponents(\n resolvedDir,\n discoveryOptions\n );\n const newMap = new Map(newComponents.map((c) => [c.name, c]));\n\n // Find added/removed/updated\n for (const [name, component] of newMap) {\n const existing = currentComponents.get(name);\n if (!existing) {\n log(\"Added:\", name);\n onAdd?.(component);\n } else if (\n existing.template !== component.template ||\n existing.modulePath !== component.modulePath\n ) {\n log(\"Updated:\", name);\n onUpdate?.(component);\n }\n }\n\n for (const name of currentComponents.keys()) {\n if (!newMap.has(name)) {\n log(\"Removed:\", name);\n onRemove?.(name);\n }\n }\n\n currentComponents = newMap;\n onChange?.(newComponents);\n }, 100);\n };\n\n // Start watching\n const watcher = watch(\n resolvedDir,\n { recursive: true },\n (event, filename) => {\n if (!filename) return;\n if (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\")) {\n log(\"File changed:\", filename);\n rescan();\n }\n }\n );\n\n // Initial scan\n initialScan();\n\n return {\n stop: () => {\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n },\n };\n}\n\n/**\n * Generate a components object from discovered components\n * Useful for static imports / code generation\n */\nexport async function generateComponentsCode(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<string> {\n const components = await discoverComponents(baseDir, options);\n const resolvedDir = resolve(baseDir);\n\n let code = `/**\n * Auto-generated component imports\n * Generated by @hypen-space/core discovery\n */\n\n`;\n\n for (const component of components) {\n const relativePath = component.modulePath\n ? \"./\" +\n component.modulePath\n .replace(resolvedDir + \"/\", \"\")\n .replace(/\\.ts$/, \".js\")\n : null;\n\n if (relativePath) {\n code += `import ${component.name}Module from \"${relativePath}\";\\n`;\n }\n }\n\n code += `\\nimport { app } from \"@hypen-space/core\";\\n\\n`;\n\n for (const component of components) {\n const templateJson = JSON.stringify(component.template);\n\n if (component.hasModule) {\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n } else {\n code += `const ${component.name}Module = app.defineState({}).build();\nexport const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n }\n }\n\n return code;\n}\n",
|
|
20
|
+
"/**\n * Component Discovery\n *\n * Automatically discovers Hypen components from the filesystem.\n *\n * Supports multiple conventions:\n * 1. Single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * 2. Folder-based: ComponentName/component.ts + ComponentName/component.hypen\n * 3. Sibling files: ComponentName.ts + ComponentName.hypen\n * 4. Index-based: ComponentName/index.ts + ComponentName/index.hypen\n */\n\nimport { existsSync, readdirSync, readFileSync, watch } from \"fs\";\nimport { join, basename, resolve } from \"path\";\nimport type { HypenModuleDefinition } from \"./app.js\";\n\nexport interface DiscoveredComponent {\n name: string;\n /** Path to .hypen file (null for single-file components with inline templates) */\n hypenPath: string | null;\n /** Path to .ts module file */\n modulePath: string | null;\n /** The UI template (from .hypen file or inline) */\n template: string;\n /** Whether this component has a module (state/actions) */\n hasModule: boolean;\n /** Whether this is a single-file component with inline template */\n isSingleFile: boolean;\n}\n\nexport interface DiscoveryOptions {\n /**\n * Which naming patterns to look for\n * Default: [\"single-file\", \"folder\", \"sibling\", \"index\"]\n *\n * - single-file: ComponentName.ts with .ui(hypen`...`) inline template\n * - folder: ComponentName/component.ts + ComponentName/component.hypen\n * - sibling: ComponentName.ts + ComponentName.hypen\n * - index: ComponentName/index.ts + ComponentName/index.hypen\n */\n patterns?: (\"single-file\" | \"folder\" | \"sibling\" | \"index\")[];\n\n /**\n * Recursively scan subdirectories\n * Default: false\n */\n recursive?: boolean;\n\n /**\n * Enable debug logging\n * Default: false\n */\n debug?: boolean;\n}\n\nexport interface WatchOptions extends DiscoveryOptions {\n /**\n * Callback when components change\n */\n onChange?: (components: DiscoveredComponent[]) => void;\n\n /**\n * Callback when a component is added\n */\n onAdd?: (component: DiscoveredComponent) => void;\n\n /**\n * Callback when a component is removed\n */\n onRemove?: (name: string) => void;\n\n /**\n * Callback when a component is updated\n */\n onUpdate?: (component: DiscoveredComponent) => void;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Discover all Hypen components in a directory\n */\nexport async function discoverComponents(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<DiscoveredComponent[]> {\n const {\n patterns = [\"single-file\", \"folder\", \"sibling\", \"index\"],\n recursive = false,\n debug = false,\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[discovery]\", ...args)\n : () => {};\n\n const resolvedDir = resolve(baseDir);\n const components: DiscoveredComponent[] = [];\n const seen = new Set<string>();\n\n log(\"Scanning directory:\", resolvedDir);\n log(\"Patterns:\", patterns);\n\n // Helper to add a two-file component (.hypen + .ts)\n const addTwoFileComponent = (\n name: string,\n hypenPath: string,\n modulePath: string | null\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n const template = removeImports(templateRaw).trim();\n\n components.push({\n name,\n hypenPath,\n modulePath,\n template,\n hasModule: modulePath !== null,\n isSingleFile: false,\n });\n\n log(`Found: ${name} (two-file, ${modulePath ? \"with module\" : \"stateless\"})`);\n };\n\n // Helper to add a single-file component (.ts with inline template)\n const addSingleFileComponent = (\n name: string,\n modulePath: string,\n template: string\n ) => {\n if (seen.has(name)) {\n log(`Skipping duplicate: ${name}`);\n return;\n }\n\n seen.add(name);\n components.push({\n name,\n hypenPath: null,\n modulePath,\n template,\n hasModule: true,\n isSingleFile: true,\n });\n\n log(`Found: ${name} (single-file with inline template)`);\n };\n\n // Scan directory for folder-based components\n const scanForFolderComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const folderPath = join(dir, entry.name);\n const componentName = entry.name;\n\n // Check folder-based pattern: Name/component.hypen\n if (patterns.includes(\"folder\")) {\n const hypenPath = join(folderPath, \"component.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"component.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Check index-based pattern: Name/index.hypen\n if (patterns.includes(\"index\")) {\n const hypenPath = join(folderPath, \"index.hypen\");\n if (existsSync(hypenPath)) {\n const modulePath = join(folderPath, \"index.ts\");\n addTwoFileComponent(\n componentName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n continue;\n }\n }\n\n // Recursive scan\n if (recursive) {\n scanForFolderComponents(folderPath);\n }\n }\n };\n\n // Scan for sibling file components (.ts + .hypen pairs)\n const scanForSiblingComponents = (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n scanForSiblingComponents(join(dir, entry.name));\n }\n continue;\n }\n\n if (!entry.name.endsWith(\".hypen\")) continue;\n\n const hypenPath = join(dir, entry.name);\n const baseName = basename(entry.name, \".hypen\");\n\n // Skip component.hypen and index.hypen (handled by folder patterns)\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n const modulePath = join(dir, `${baseName}.ts`);\n addTwoFileComponent(\n baseName,\n hypenPath,\n existsSync(modulePath) ? modulePath : null\n );\n }\n };\n\n // Scan for single-file components (.ts files with inline templates)\n const scanForSingleFileComponents = async (dir: string) => {\n if (!existsSync(dir)) return;\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (recursive) {\n await scanForSingleFileComponents(join(dir, entry.name));\n }\n continue;\n }\n\n // Only look at .ts files\n if (!entry.name.endsWith(\".ts\")) continue;\n\n // Skip files that are clearly not components\n if (entry.name.startsWith('.') || entry.name.includes('.test.') || entry.name.includes('.spec.')) continue;\n\n // Skip component.ts and index.ts (handled by folder patterns)\n const baseName = basename(entry.name, \".ts\");\n if (baseName === \"component\" || baseName === \"index\") continue;\n\n // Skip if there's a matching .hypen file (handled by sibling pattern)\n const hypenPath = join(dir, `${baseName}.hypen`);\n if (existsSync(hypenPath)) continue;\n\n // Check if this looks like a single-file component by looking for .ui( pattern\n const modulePath = join(dir, entry.name);\n const content = readFileSync(modulePath, \"utf-8\");\n\n // Quick heuristic: look for .ui( or .ui(hypen pattern\n if (content.includes(\".ui(\") || content.includes(\".ui(hypen\")) {\n // Try to import and check for template\n try {\n const moduleExport = await import(modulePath);\n const module = moduleExport.default as HypenModuleDefinition<any>;\n\n if (module && typeof module === \"object\" && module.template) {\n addSingleFileComponent(baseName, modulePath, module.template);\n }\n } catch (e) {\n // Failed to import, skip this file\n log(`Failed to import potential single-file component: ${entry.name}`, e);\n }\n }\n }\n };\n\n // Run scans based on patterns\n if (patterns.includes(\"folder\") || patterns.includes(\"index\")) {\n scanForFolderComponents(resolvedDir);\n }\n\n if (patterns.includes(\"sibling\")) {\n scanForSiblingComponents(resolvedDir);\n }\n\n if (patterns.includes(\"single-file\")) {\n await scanForSingleFileComponents(resolvedDir);\n }\n\n log(`Discovered ${components.length} components`);\n\n return components;\n}\n\n/**\n * Load discovered components into a map for use with Hypen\n */\nexport async function loadDiscoveredComponents(\n components: DiscoveredComponent[]\n): Promise<\n Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition<any>;\n template: string;\n }\n >\n> {\n // Dynamically import app to avoid circular dependencies\n const { app } = await import(\"./app.js\");\n\n const loaded = new Map<\n string,\n {\n name: string;\n module: HypenModuleDefinition;\n template: string;\n }\n >();\n\n for (const component of components) {\n let module: HypenModuleDefinition<any>;\n let template = component.template;\n\n if (component.modulePath) {\n // Import the TypeScript module\n const moduleExport = await import(component.modulePath);\n module = moduleExport.default as HypenModuleDefinition<any>;\n\n // For single-file components, template is already in the module\n if (component.isSingleFile && module.template) {\n template = module.template;\n }\n } else {\n // Create a stateless module\n module = app.defineState({}).build();\n }\n\n loaded.set(component.name, {\n name: component.name,\n module,\n template,\n });\n }\n\n return loaded;\n}\n\n/**\n * Watch a directory for component changes\n */\nexport function watchComponents(\n baseDir: string,\n options: WatchOptions = {}\n): { stop: () => void } {\n const resolvedDir = resolve(baseDir);\n const {\n onChange,\n onAdd,\n onRemove,\n onUpdate,\n debug = false,\n ...discoveryOptions\n } = options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[discovery:watch]\", ...args)\n : () => {};\n\n let currentComponents = new Map<string, DiscoveredComponent>();\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Initial scan\n const initialScan = async () => {\n const components = await discoverComponents(resolvedDir, discoveryOptions);\n currentComponents = new Map(components.map((c) => [c.name, c]));\n onChange?.(components);\n };\n\n // Debounced rescan\n const rescan = async () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n log(\"Rescanning...\");\n const newComponents = await discoverComponents(\n resolvedDir,\n discoveryOptions\n );\n const newMap = new Map(newComponents.map((c) => [c.name, c]));\n\n // Find added/removed/updated\n for (const [name, component] of newMap) {\n const existing = currentComponents.get(name);\n if (!existing) {\n log(\"Added:\", name);\n onAdd?.(component);\n } else if (\n existing.template !== component.template ||\n existing.modulePath !== component.modulePath\n ) {\n log(\"Updated:\", name);\n onUpdate?.(component);\n }\n }\n\n for (const name of currentComponents.keys()) {\n if (!newMap.has(name)) {\n log(\"Removed:\", name);\n onRemove?.(name);\n }\n }\n\n currentComponents = newMap;\n onChange?.(newComponents);\n }, 100);\n };\n\n // Start watching\n const watcher = watch(\n resolvedDir,\n { recursive: true },\n (event, filename) => {\n if (!filename) return;\n if (filename.endsWith(\".hypen\") || filename.endsWith(\".ts\")) {\n log(\"File changed:\", filename);\n rescan();\n }\n }\n );\n\n // Initial scan\n initialScan();\n\n return {\n stop: () => {\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n },\n };\n}\n\n/**\n * Generate a components object from discovered components\n * Useful for static imports / code generation\n */\nexport async function generateComponentsCode(\n baseDir: string,\n options: DiscoveryOptions = {}\n): Promise<string> {\n const components = await discoverComponents(baseDir, options);\n const resolvedDir = resolve(baseDir);\n\n let code = `/**\n * Auto-generated component imports\n * Generated by @hypen-space/core discovery\n */\n\n`;\n\n for (const component of components) {\n const relativePath = component.modulePath\n ? \"./\" +\n component.modulePath\n .replace(resolvedDir + \"/\", \"\")\n .replace(/\\.ts$/, \".js\")\n : null;\n\n if (relativePath) {\n code += `import ${component.name}Module from \"${relativePath}\";\\n`;\n }\n }\n\n code += `\\nimport { app } from \"@hypen-space/core\";\\n\\n`;\n\n for (const component of components) {\n if (component.isSingleFile) {\n // Single-file component: template is in the module itself\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${component.name}Module.template,\n};\\n\\n`;\n } else if (component.hasModule) {\n // Two-file component with module\n const templateJson = JSON.stringify(component.template);\n code += `export const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n } else {\n // Stateless two-file component\n const templateJson = JSON.stringify(component.template);\n code += `const ${component.name}Module = app.defineState({}).build();\nexport const ${component.name} = {\n module: ${component.name}Module,\n template: ${templateJson},\n};\\n\\n`;\n }\n }\n\n return code;\n}\n",
|
|
17
21
|
"/**\n * Enhanced Bun Plugin for Hypen\n *\n * Automatically pairs .hypen templates with their TypeScript modules.\n *\n * Usage:\n * import Counter from \"./Counter.hypen\";\n * // Returns: { module, template, name: \"Counter\" }\n *\n * Supported conventions:\n * 1. Sibling: Name.ts + Name.hypen\n * 2. Folder: Name/component.ts + Name/component.hypen\n * 3. Index: Name/index.ts + Name/index.hypen\n */\n\nimport type { BunPlugin } from \"bun\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { dirname, basename, join, resolve } from \"path\";\n\nexport interface HypenPluginOptions {\n /**\n * Enable debug logging\n */\n debug?: boolean;\n\n /**\n * Custom patterns for finding module files\n * Default: [\"sibling\", \"component\", \"index\"]\n */\n patterns?: (\"sibling\" | \"component\" | \"index\")[];\n}\n\n/**\n * Find the matching TypeScript module for a .hypen file\n */\nfunction findModulePath(\n hypenPath: string,\n patterns: (\"sibling\" | \"component\" | \"index\")[]\n): string | null {\n const dir = dirname(hypenPath);\n const baseName = basename(hypenPath, \".hypen\");\n const parentDir = dirname(dir);\n const folderName = basename(dir);\n\n for (const pattern of patterns) {\n let candidatePath: string | null = null;\n\n switch (pattern) {\n case \"sibling\":\n // Name.hypen -> Name.ts (same directory)\n candidatePath = join(dir, `${baseName}.ts`);\n break;\n\n case \"component\":\n // Name/component.hypen -> Name/component.ts\n if (baseName === \"component\") {\n candidatePath = join(dir, \"component.ts\");\n }\n break;\n\n case \"index\":\n // Name/index.hypen -> Name/index.ts\n if (baseName === \"index\") {\n candidatePath = join(dir, \"index.ts\");\n }\n break;\n }\n\n if (candidatePath && existsSync(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n}\n\n/**\n * Determine the component name from the file path\n */\nfunction getComponentName(hypenPath: string): string {\n const baseName = basename(hypenPath, \".hypen\");\n\n // If file is component.hypen or index.hypen, use parent folder name\n if (baseName === \"component\" || baseName === \"index\") {\n return basename(dirname(hypenPath));\n }\n\n // Otherwise use the file name\n return baseName;\n}\n\n/**\n * Parse import statements from Hypen DSL (for future use)\n */\nfunction parseImports(\n text: string\n): Array<{ names: string[]; source: string }> {\n const imports: Array<{ names: string[]; source: string }> = [];\n const importRegex =\n /import\\s+(?:\\{([^}]+)\\}|(\\w+))\\s+from\\s+[\"']([^\"']+)[\"']/g;\n\n let match;\n while ((match = importRegex.exec(text)) !== null) {\n const [, namedImports, defaultImport, source] = match;\n\n if (!source) continue;\n\n let names: string[];\n if (namedImports) {\n names = namedImports\n .split(\",\")\n .map((n) => n.trim())\n .filter((n) => n.length > 0);\n } else if (defaultImport) {\n names = [defaultImport];\n } else {\n continue;\n }\n\n imports.push({ names, source });\n }\n\n return imports;\n}\n\n/**\n * Remove import statements from Hypen template\n */\nfunction removeImports(text: string): string {\n return text.replace(\n /import\\s+(?:\\{[^}]+\\}|\\w+)\\s+from\\s+[\"'][^\"']+[\"']\\s*/g,\n \"\"\n );\n}\n\n/**\n * Create the enhanced Hypen plugin for Bun\n */\nexport function hypenPlugin(options: HypenPluginOptions = {}): BunPlugin {\n const { debug = false, patterns = [\"sibling\", \"component\", \"index\"] } =\n options;\n\n const log = debug\n ? (...args: unknown[]) => console.log(\"[hypen-plugin]\", ...args)\n : () => {};\n\n return {\n name: \"hypen-loader\",\n async setup(build) {\n build.onLoad({ filter: /\\.hypen$/ }, async (args) => {\n const hypenPath = resolve(args.path);\n log(\"Loading:\", hypenPath);\n\n // Read the template\n const templateRaw = readFileSync(hypenPath, \"utf-8\");\n\n // Parse and remove imports\n const imports = parseImports(templateRaw);\n const template = removeImports(templateRaw).trim();\n\n if (imports.length > 0) {\n log(\"Found imports:\", imports);\n }\n\n // Get component name\n const componentName = getComponentName(hypenPath);\n log(\"Component name:\", componentName);\n\n // Find matching module\n const modulePath = findModulePath(hypenPath, patterns);\n log(\"Module path:\", modulePath);\n\n let contents: string;\n\n if (modulePath) {\n // Has a TypeScript module - import it\n const relativeModulePath = modulePath.replace(/\\.ts$/, \".js\");\n contents = `\nimport _module from \"${relativeModulePath}\";\nexport const module = _module;\nexport const template = ${JSON.stringify(template)};\nexport const name = ${JSON.stringify(componentName)};\nexport default { module: _module, template: ${JSON.stringify(template)}, name: ${JSON.stringify(componentName)} };\n`;\n } else {\n // No TypeScript module - create stateless component\n log(\"No module found, creating stateless component\");\n contents = `\nimport { app } from \"@hypen/core\";\nconst _module = app.defineState({}).build();\nexport const module = _module;\nexport const template = ${JSON.stringify(template)};\nexport const name = ${JSON.stringify(componentName)};\nexport default { module: _module, template: ${JSON.stringify(template)}, name: ${JSON.stringify(componentName)} };\n`;\n }\n\n return {\n contents,\n loader: \"js\",\n };\n });\n },\n };\n}\n\n/**\n * Default plugin instance with standard options\n */\nexport const defaultHypenPlugin = hypenPlugin();\n\n/**\n * Register the plugin globally (call this in your preload file)\n */\nexport function registerHypenPlugin(options?: HypenPluginOptions): void {\n Bun.plugin(hypenPlugin(options));\n}\n\nexport default hypenPlugin;\n",
|
|
18
22
|
"/**\n * Built-in Hypen Components\n * Framework-provided components like Router and Route\n */\n\nimport { app } from \"../app.js\";\nimport type { HypenRouter } from \"../router.js\";\n\n/**\n * Router Component\n * Automatically matches routes and renders the appropriate child Route\n *\n * Usage in Hypen DSL:\n * Router {\n * Route(path: \"/\") { HomePage }\n * Route(path: \"/products\") { ProductList }\n * Route(path: \"/users/:id\") { UserProfile }\n * }\n */\nexport const Router = app\n .defineState(\n {\n currentPath: \"/\",\n matchedRoute: null as any,\n routeParams: {} as Record<string, string>,\n },\n { name: \"__Router\" }\n )\n .onCreated((state, context) => {\n if (!context) {\n console.error(\"[Router] Requires global context\");\n return;\n }\n\n // Subscribe to router changes\n const router = (context as any).__router as HypenRouter;\n if (!router) {\n console.error(\"[Router] Router not found in context\");\n return;\n }\n\n // Get access to the Hypen engine for lazy rendering\n const hypenEngine = (context as any).__hypenEngine;\n\n // Function to render only the matching route\n const updateRouteVisibility = async (currentPath: string) => {\n // Find all Route elements in the DOM\n const routeElements = document.querySelectorAll(\n '[data-hypen-type=\"route\"]'\n );\n\n let matchFound = false;\n\n for (let index = 0; index < routeElements.length; index++) {\n const routeEl = routeElements[index];\n const htmlEl = routeEl as HTMLElement;\n const routePath = htmlEl.dataset.routePath || \"/\";\n\n // Simple path matching (exact match for now)\n const isMatch = routePath === currentPath;\n\n // Only show the matching route, hide all others\n htmlEl.style.display = isMatch ? \"flex\" : \"none\";\n\n if (isMatch) {\n matchFound = true;\n\n // Check if this route needs to be rendered\n const componentName = htmlEl.dataset.routeComponent;\n const isLazy = htmlEl.dataset.routeLazy === \"true\";\n const hasContent = htmlEl.children.length > 0;\n\n // Render if route has no content and has a component name\n if (componentName && !hasContent && hypenEngine) {\n try {\n await hypenEngine.renderLazyRoute(\n routePath,\n componentName,\n htmlEl\n );\n } catch (err) {\n console.error(`[Router] Failed to render route ${routePath}:`, err);\n }\n }\n }\n }\n\n if (!matchFound) {\n console.warn(\n `[Router] No route matched path: ${currentPath}. Available routes:`,\n Array.from(routeElements).map(\n (el: Element) => (el as HTMLElement).dataset.routePath\n )\n );\n }\n };\n\n // Initial route visibility (after DOM is ready)\n setTimeout(() => {\n updateRouteVisibility(state.currentPath);\n }, 100);\n\n router.onNavigate((routeState) => {\n state.currentPath = routeState.currentPath;\n state.routeParams = routeState.params;\n\n // Update route visibility when path changes\n updateRouteVisibility(routeState.currentPath);\n });\n })\n .build();\n\n/**\n * Route Component\n * Defines a route pattern and its content\n * This is just a marker component - Router processes it\n *\n * Props:\n * - path: string - Route pattern (e.g., \"/\", \"/users/:id\", \"/dashboard/*\")\n *\n * Usage:\n * Route(path: \"/products\") {\n * ProductList\n * }\n */\nexport const Route = app.defineState({}, { name: \"__Route\" }).build();\n\n/**\n * Navigation Link Component\n * Navigates to a route when clicked\n *\n * Props:\n * - to: string - Target path\n *\n * Usage:\n * Link(to: \"/products\") {\n * Text(\"View Products\")\n * }\n */\nexport const Link = app\n .defineState(\n {\n to: \"/\",\n isActive: false,\n },\n { name: \"__Link\" }\n )\n .onAction(\"navigate\", ({ state, context }) => {\n const router = (context as any)?.__router as HypenRouter;\n if (!router) {\n console.error(\"[Link] Requires router context\");\n return;\n }\n\n const targetPath = state.to;\n router.push(targetPath);\n })\n .onCreated((state, context) => {\n if (!context) return;\n\n // Check if current path matches this link's target\n const router = (context as any).__router as HypenRouter;\n if (router) {\n router.onNavigate((routeState) => {\n state.isActive = routeState.currentPath === state.to;\n });\n }\n })\n .build();\n",
|
|
19
|
-
"/**\n * @hypen/core - Hypen Core Engine\n *\n * Platform-agnostic reactive UI runtime.\n * Use with @hypen/web for browser rendering, or build your own renderer.\n *\n * ## Quick Start\n *\n * ```typescript\n * import {
|
|
23
|
+
"/**\n * @hypen/core - Hypen Core Engine\n *\n * Platform-agnostic reactive UI runtime.\n * Use with @hypen/web for browser rendering, or build your own renderer.\n *\n * ## Quick Start (Single-File Component)\n *\n * ```typescript\n * import { app, hypen, state } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * state.count += 1;\n * })\n * .ui(hypen`\n * Column {\n * Text(\"Count: ${state.count}\")\n * Button { Text(\"+\") }\n * .onClick(\"@actions.increment\")\n * }\n * `);\n * ```\n *\n * ## Two-File Component (Legacy)\n *\n * ```typescript\n * // component.ts\n * import { app } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * state.count++;\n * })\n * .build();\n *\n * // component.hypen (separate file)\n * // Column { Text(\"Count: ${state.count}\") ... }\n * ```\n */\n\n// ============================================================================\n// ENGINE API\n// ============================================================================\n\nexport { Engine } from \"./engine.js\";\nexport type {\n Patch,\n Action,\n RenderCallback,\n ActionHandler as EngineActionHandler,\n ResolvedComponent,\n ComponentResolver as EngineComponentResolver,\n} from \"./engine.js\";\n\n// Browser engine (explicit WASM init)\nexport { Engine as BrowserEngine } from \"./engine.browser.js\";\nexport type { EngineInitOptions } from \"./engine.browser.js\";\n\n// ============================================================================\n// APP / MODULE SYSTEM\n// ============================================================================\n\nexport { app, HypenApp, HypenAppBuilder, HypenModuleInstance } from \"./app.js\";\n\n// ============================================================================\n// TEMPLATE SYSTEM (Single-File Components)\n// ============================================================================\n\nexport { hypen, state, item, index } from \"./hypen.js\";\nexport type { StateProxy, ItemProxy } from \"./hypen.js\";\n\nexport type {\n IEngine,\n RouterContext,\n ActionContext,\n ActionNext,\n GlobalContext,\n LifecycleHandler,\n ActionHandlerContext,\n ActionHandler,\n HypenModuleDefinition,\n HypenModule,\n // Session lifecycle hooks\n DisconnectContext,\n ReconnectContext,\n ExpireContext,\n DisconnectHandler,\n ReconnectHandler,\n ExpireHandler,\n // Error handling\n ErrorContext,\n ErrorHandler,\n ErrorHandlerResult,\n} from \"./app.js\";\n\n// ============================================================================\n// STATE MANAGEMENT\n// ============================================================================\n\nexport {\n createObservableState,\n batchStateUpdates,\n getStateSnapshot,\n isStateProxy,\n unwrapProxy,\n} from \"./state.js\";\nexport type {\n StatePath,\n StateChange,\n StateObserverOptions,\n} from \"./state.js\";\n\n// ============================================================================\n// RENDERER ABSTRACTION\n// ============================================================================\n\nexport { BaseRenderer, ConsoleRenderer } from \"./renderer.js\";\nexport type { Renderer } from \"./renderer.js\";\n\n// ============================================================================\n// ROUTING\n// ============================================================================\n\nexport { HypenRouter } from \"./router.js\";\nexport type {\n RouteMatch,\n RouteState,\n RouteChangeCallback,\n} from \"./router.js\";\n\n// ============================================================================\n// EVENTS\n// ============================================================================\n\nexport { TypedEventEmitter, createEventEmitter } from \"./events.js\";\nexport type { EventHandler, HypenFrameworkEvents } from \"./events.js\";\n\n// ============================================================================\n// GLOBAL CONTEXT\n// ============================================================================\n\nexport { HypenGlobalContext } from \"./context.js\";\nexport type { ModuleReference } from \"./context.js\";\n\n// ============================================================================\n// REMOTE UI\n// ============================================================================\n\n// Client\nexport { RemoteEngine } from \"./remote/client.js\";\nexport type {\n RemoteConnectionState,\n RemoteEngineOptions,\n SessionOptions,\n SessionInfo,\n} from \"./remote/client.js\";\n\n// Server\nexport { RemoteServer, serve } from \"./remote/server.js\";\n\n// Session Management\nexport { SessionManager } from \"./remote/session.js\";\nexport type { SessionExpireCallback } from \"./remote/session.js\";\n\n// Types\nexport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n StateUpdateMessage,\n HelloMessage,\n SessionAckMessage,\n SessionExpiredMessage,\n Session,\n SessionConfig,\n RemoteClient,\n RemoteServerConfig,\n} from \"./remote/types.js\";\n\n// ============================================================================\n// COMPONENT LOADER\n// ============================================================================\n\nexport { ComponentLoader, componentLoader } from \"./loader.js\";\nexport type { ComponentDefinition } from \"./loader.js\";\n\n// ============================================================================\n// COMPONENT RESOLVER\n// ============================================================================\n\nexport { ComponentResolver } from \"./resolver.js\";\nexport type {\n ImportStatement,\n ImportClause,\n ImportSource,\n ComponentDefinition as ResolverComponentDefinition,\n ResolverOptions,\n} from \"./resolver.js\";\n\n// ============================================================================\n// COMPONENT DISCOVERY\n// ============================================================================\n\nexport {\n discoverComponents,\n loadDiscoveredComponents,\n watchComponents,\n generateComponentsCode,\n} from \"./discovery.js\";\nexport type {\n DiscoveredComponent,\n DiscoveryOptions,\n WatchOptions,\n} from \"./discovery.js\";\n\n// ============================================================================\n// PLUGIN\n// ============================================================================\n\nexport { hypenPlugin, registerHypenPlugin, defaultHypenPlugin } from \"./plugin.js\";\nexport type { HypenPluginOptions } from \"./plugin.js\";\n\n// ============================================================================\n// BUILT-IN COMPONENTS\n// ============================================================================\n\nexport { Router, Route, Link } from \"./components/builtin.js\";\n\n// ============================================================================\n// RESULT TYPE (Error Handling)\n// ============================================================================\n\nexport {\n Ok,\n Err,\n isOk,\n isErr,\n fromPromise,\n fromTry,\n map,\n mapErr,\n flatMap,\n unwrap,\n unwrapOr,\n unwrapOrElse,\n match,\n all,\n HypenError,\n ActionError,\n ConnectionError,\n StateError,\n} from \"./result.js\";\nexport type { Result } from \"./result.js\";\n\n// ============================================================================\n// DISPOSABLE PATTERN (Resource Management)\n// ============================================================================\n\nexport {\n DisposableStack,\n DisposableMixin,\n isDisposable,\n disposableListener,\n disposableTimeout,\n disposableInterval,\n disposableWebSocket,\n disposableAbortController,\n disposableSubscription,\n getElementDisposables,\n disposeElement,\n hasElementDisposables,\n compositeDisposable,\n using,\n usingSync,\n} from \"./disposable.js\";\nexport type { Disposable } from \"./disposable.js\";\n\n// ============================================================================\n// Retry Utility\n// ============================================================================\n\nexport {\n retry,\n retryResult,\n withRetry,\n RetryConditions,\n RetryPresets,\n} from \"./retry.js\";\nexport type { RetryOptions } from \"./retry.js\";\n\n// ============================================================================\n// Logger\n// ============================================================================\n\nexport {\n Logger,\n createLogger,\n logger,\n log,\n frameworkLoggers,\n setLogLevel,\n getLogLevel,\n configureLogger,\n enableLogging,\n disableLogging,\n} from \"./logger.js\";\nexport type { LogLevel, LoggerConfig, LogHandler } from \"./logger.js\";\n",
|
|
24
|
+
"/**\n * Hypen Tagged Template Literal\n *\n * Enables single-file components with inline UI templates.\n *\n * The `hypen` tagged template preserves ${state.x} and ${item.x} bindings\n * instead of interpolating them, allowing you to write:\n *\n * @example\n * ```typescript\n * import { app, hypen, state } from \"@hypen-space/core\";\n *\n * export default app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => {\n * state.count += 1;\n * })\n * .ui(hypen`\n * Column {\n * Text(\"Count: ${state.count}\")\n * Button { Text(\"+\") }\n * .onClick(\"@actions.increment\")\n * }\n * `);\n * ```\n */\n\n/**\n * Creates a proxy that captures property access as a binding path string.\n *\n * When used in a template literal, the proxy's toString() returns the\n * full binding expression (e.g., \"${state.user.name}\").\n *\n * @example\n * ```typescript\n * const state = createBindingProxy('state');\n * `${state.user.name}` // Returns: \"${state.user.name}\"\n * ```\n */\nfunction createBindingProxy(root: string): any {\n const handler: ProxyHandler<object> = {\n get(_, prop: string | symbol): any {\n // Handle Symbol.toPrimitive, toString, and valueOf for string conversion\n if (\n prop === Symbol.toPrimitive ||\n prop === \"toString\" ||\n prop === \"valueOf\"\n ) {\n return () => `\\${${root}}`;\n }\n\n // Handle other Symbol properties (e.g., Symbol.toStringTag)\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n // Handle JSON.stringify\n if (prop === \"toJSON\") {\n return () => `\\${${root}}`;\n }\n\n // Chain to nested property: state.user -> state.user.name\n return createBindingProxy(`${root}.${prop}`);\n },\n\n // Support for `in` operator\n has() {\n return true;\n },\n\n // Support for Object.keys() - return empty to avoid enumeration issues\n ownKeys() {\n return [];\n },\n\n getOwnPropertyDescriptor() {\n return {\n configurable: true,\n enumerable: true,\n };\n },\n };\n\n return new Proxy({} as any, handler);\n}\n\n/**\n * Proxy for state bindings.\n *\n * Use in hypen templates to create reactive state bindings:\n *\n * @example\n * ```typescript\n * hypen`Text(\"Hello, ${state.user.name}\")`\n * // Produces: Text(\"Hello, ${state.user.name}\")\n * ```\n */\nexport const state: any = createBindingProxy(\"state\");\n\n/**\n * Proxy for item bindings in list iteration.\n *\n * Use inside List components to reference the current item:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"${item.name}: ${item.price}\")\n * }\n * `\n * ```\n */\nexport const item: any = createBindingProxy(\"item\");\n\n/**\n * Proxy for index in list iteration.\n *\n * Use inside List components to reference the current index:\n *\n * @example\n * ```typescript\n * hypen`\n * List(@state.items) {\n * Text(\"Item #${index}: ${item.name}\")\n * }\n * `\n * ```\n */\nexport const index: any = {\n [Symbol.toPrimitive]: () => \"${index}\",\n toString: () => \"${index}\",\n valueOf: () => \"${index}\",\n toJSON: () => \"${index}\",\n};\n\n/**\n * Tagged template literal for Hypen DSL templates.\n *\n * Works with the `state`, `item`, and `index` binding proxies to preserve\n * binding syntax in the output string.\n *\n * @example\n * ```typescript\n * import { hypen, state, item } from \"@hypen-space/core\";\n *\n * // Simple state binding\n * const t1 = hypen`Text(\"Count: ${state.count}\")`;\n * // Result: 'Text(\"Count: ${state.count}\")'\n *\n * // Nested state binding\n * const t2 = hypen`Text(\"Hello, ${state.user.profile.name}\")`;\n * // Result: 'Text(\"Hello, ${state.user.profile.name}\")'\n *\n * // List with item binding\n * const t3 = hypen`\n * List(@state.products) {\n * Text(\"${item.name} - $${item.price}\")\n * }\n * `;\n *\n * // Complex expressions (use regular JS interpolation for static values)\n * const title = \"My App\";\n * const t4 = hypen`Text(\"${title}: ${state.count}\")`;\n * // Result: 'Text(\"My App: ${state.count}\")'\n * ```\n *\n * @param strings - Template literal string parts\n * @param expressions - Interpolated expressions (proxies return binding strings)\n * @returns The template string with bindings preserved\n */\nexport function hypen(\n strings: TemplateStringsArray,\n ...expressions: unknown[]\n): string {\n let result = strings[0];\n\n for (let i = 0; i < expressions.length; i++) {\n const expr = expressions[i];\n\n // Convert expression to string\n // Binding proxies will return \"${state.x}\" via their toString()\n result += String(expr);\n result += strings[i + 1]!;\n }\n\n return result!.trim();\n}\n\n/**\n * Type helper for defining state shape.\n * Use with state proxy for better IDE support in complex scenarios.\n *\n * @example\n * ```typescript\n * type MyState = { user: { name: string; age: number } };\n * const typedState = state as StateProxy<MyState>;\n * ```\n */\nexport type StateProxy<T> = {\n [K in keyof T]: T[K] extends object\n ? StateProxy<T[K]> & { toString(): string }\n : { toString(): string };\n} & { toString(): string };\n\n/**\n * Type helper for item proxy in lists.\n */\nexport type ItemProxy<T> = StateProxy<T>;\n",
|
|
25
|
+
"/**\n * RemoteServer - Stream Hypen apps over WebSocket with Session Management\n *\n * Usage:\n * ```typescript\n * import { RemoteServer, app } from \"@hypen/core\";\n *\n * const counter = app\n * .defineState({ count: 0 })\n * .onAction(\"increment\", ({ state }) => state.count++)\n * .onDisconnect(async ({ state, session }) => {\n * await redis.set(`session:${session.id}`, JSON.stringify(state));\n * })\n * .onReconnect(async ({ session, restore }) => {\n * const saved = await redis.get(`session:${session.id}`);\n * if (saved) restore(JSON.parse(saved));\n * })\n * .onExpire(async ({ session }) => {\n * await redis.del(`session:${session.id}`);\n * })\n * .build();\n *\n * new RemoteServer()\n * .module(\"Counter\", counter)\n * .ui(`Column { Text(\"Count: \\${state.count}\") }`)\n * .session({ ttl: 3600, concurrent: \"kick-old\" })\n * .listen(3000);\n * ```\n */\n\nimport { Engine } from \"../engine.js\";\nimport { HypenModuleInstance } from \"../app.js\";\nimport type { HypenModule } from \"../app.js\";\nimport type {\n RemoteMessage,\n RemoteClient,\n RemoteServerConfig,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n HelloMessage,\n SessionAckMessage,\n SessionExpiredMessage,\n Session,\n SessionConfig,\n} from \"./types.js\";\nimport type { Patch } from \"../engine.js\";\nimport type { ServerWebSocket } from \"bun\";\nimport { SessionManager } from \"./session.js\";\n\ninterface ClientData {\n id: string;\n engine: Engine;\n moduleInstance: HypenModuleInstance<any>;\n revision: number;\n connectedAt: Date;\n /** Session ID for this client */\n sessionId: string;\n /** Whether we've received the hello message */\n helloReceived: boolean;\n /** Timeout for legacy clients that don't send hello */\n helloTimeout?: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Builder pattern for hosting Hypen apps over WebSocket\n */\nexport class RemoteServer {\n private _module: HypenModule<any> | null = null;\n private _moduleName: string = \"App\";\n private _ui: string = \"\";\n private _config: RemoteServerConfig = {};\n private _sessionConfig: SessionConfig = {};\n private _onConnectionCallbacks: Array<(client: RemoteClient) => void> = [];\n private _onDisconnectionCallbacks: Array<(client: RemoteClient) => void> = [];\n private clients = new Map<ServerWebSocket<unknown>, ClientData>();\n private nextClientId = 1;\n private server: ReturnType<typeof Bun.serve> | null = null;\n private sessionManager: SessionManager | null = null;\n\n /**\n * Set the module for this app\n */\n module(name: string, module: HypenModule<any>): this {\n this._moduleName = name;\n this._module = module;\n return this;\n }\n\n /**\n * Set the UI DSL string\n */\n ui(dsl: string): this {\n this._ui = dsl;\n return this;\n }\n\n /**\n * Set server configuration\n */\n config(config: RemoteServerConfig): this {\n this._config = { ...this._config, ...config };\n return this;\n }\n\n /**\n * Configure session management\n */\n session(config: SessionConfig): this {\n this._sessionConfig = config;\n return this;\n }\n\n /**\n * Register connection callback\n */\n onConnection(callback: (client: RemoteClient) => void): this {\n this._onConnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Register disconnection callback\n */\n onDisconnection(callback: (client: RemoteClient) => void): this {\n this._onDisconnectionCallbacks.push(callback);\n return this;\n }\n\n /**\n * Start the WebSocket server\n */\n listen(port?: number): this {\n if (!this._module) {\n throw new Error(\"Module not set. Call .module() before .listen()\");\n }\n\n if (!this._ui) {\n throw new Error(\"UI not set. Call .ui() before .listen()\");\n }\n\n // Initialize session manager\n this.sessionManager = new SessionManager(this._sessionConfig);\n\n const finalPort = port ?? this._config.port ?? 3000;\n const hostname = this._config.hostname ?? \"0.0.0.0\";\n\n this.server = Bun.serve({\n port: finalPort,\n hostname,\n websocket: {\n open: (ws) => this.handleOpen(ws),\n message: (ws, message) => this.handleMessage(ws, message),\n close: (ws) => this.handleClose(ws),\n },\n fetch: (req, server) => {\n const url = new URL(req.url);\n\n // Upgrade to WebSocket\n if (server.upgrade(req, { data: undefined })) {\n return; // Connection upgraded\n }\n\n // Health check endpoint\n if (url.pathname === \"/health\") {\n return new Response(\"OK\", { status: 200 });\n }\n\n // Stats endpoint\n if (url.pathname === \"/stats\") {\n const stats = this.sessionManager?.getStats() ?? {\n activeSessions: 0,\n pendingSessions: 0,\n totalConnections: 0,\n };\n return new Response(JSON.stringify(stats), {\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n return new Response(\"Hypen Remote Server\", { status: 200 });\n },\n });\n\n console.log(`🚀 Hypen app streaming on ws://${hostname}:${finalPort}`);\n\n return this;\n }\n\n /**\n * Stop the server\n */\n stop(): void {\n if (this.server) {\n this.server.stop();\n this.server = null;\n }\n if (this.sessionManager) {\n this.sessionManager.destroy();\n this.sessionManager = null;\n }\n }\n\n /**\n * Get the server URL\n */\n get url(): string | null {\n if (!this.server) return null;\n const hostname = this._config.hostname ?? \"localhost\";\n const port = this._config.port ?? 3000;\n return `ws://${hostname}:${port}`;\n }\n\n /**\n * Handle new WebSocket connection\n * Waits for hello message before fully initializing\n */\n private async handleOpen(ws: ServerWebSocket<unknown>) {\n try {\n const clientId = `client_${this.nextClientId++}`;\n const connectedAt = new Date();\n\n // Create engine instance for this client\n const engine = new Engine();\n await engine.init();\n\n // Create module instance\n const moduleInstance = new HypenModuleInstance(engine, this._module!);\n\n // Store client data (session will be set when hello is received)\n const clientData: ClientData = {\n id: clientId,\n engine,\n moduleInstance,\n revision: 0,\n connectedAt,\n sessionId: \"\",\n helloReceived: false,\n };\n\n this.clients.set(ws, clientData);\n\n // Set timeout for legacy clients that don't send hello\n clientData.helloTimeout = setTimeout(() => {\n if (!clientData.helloReceived) {\n // Legacy client - create new session automatically\n this.initializeSession(ws, clientData, undefined, undefined);\n }\n }, 1000); // 1 second grace period\n\n } catch (error) {\n console.error(\"Error handling WebSocket open:\", error);\n ws.close(1011, \"Internal server error\");\n }\n }\n\n /**\n * Initialize session for a client (new or resumed)\n */\n private async initializeSession(\n ws: ServerWebSocket<unknown>,\n clientData: ClientData,\n requestedSessionId: string | undefined,\n props: Record<string, any> | undefined\n ): Promise<void> {\n if (clientData.helloReceived) return;\n clientData.helloReceived = true;\n\n // Clear hello timeout\n if (clientData.helloTimeout) {\n clearTimeout(clientData.helloTimeout);\n clientData.helloTimeout = undefined;\n }\n\n let session: Session;\n let isNew = true;\n let isRestored = false;\n let restoredState: unknown = null;\n\n if (requestedSessionId && this.sessionManager) {\n // Try to resume pending session\n const resumed = this.sessionManager.resumeSession(requestedSessionId);\n if (resumed) {\n session = resumed.session;\n restoredState = resumed.savedState;\n isNew = false;\n isRestored = true;\n\n // Call onReconnect hook\n await this.triggerReconnect(clientData, session, restoredState);\n } else {\n // Check for concurrent active session\n const activeSession = this.sessionManager.getActiveSession(requestedSessionId);\n if (activeSession) {\n const handled = await this.handleConcurrentConnection(\n ws,\n clientData,\n activeSession,\n props\n );\n if (!handled) return; // Connection was rejected\n session = activeSession;\n isNew = false;\n } else {\n // Session not found, create new\n session = this.sessionManager.createSession(props);\n }\n }\n } else if (this.sessionManager) {\n // New session\n session = this.sessionManager.createSession(props);\n } else {\n // No session manager (shouldn't happen, but fallback)\n session = {\n id: crypto.randomUUID(),\n ttl: 3600,\n createdAt: new Date(),\n lastConnectedAt: new Date(),\n props,\n };\n }\n\n clientData.sessionId = session.id;\n this.sessionManager?.trackConnection(session.id, ws);\n\n // Send session acknowledgment\n const sessionAck: SessionAckMessage = {\n type: \"sessionAck\",\n sessionId: session.id,\n isNew,\n isRestored,\n };\n ws.send(JSON.stringify(sessionAck));\n\n // Set up render callback\n this.setupRenderCallback(ws, clientData);\n\n // Render initial tree\n const initialPatches: Patch[] = [];\n clientData.engine.setRenderCallback((patches) => {\n initialPatches.push(...patches);\n });\n clientData.engine.renderSource(this._ui);\n\n // Now set up streaming render callback\n this.setupRenderCallback(ws, clientData);\n\n // Send initial tree\n const initialMessage: InitialTreeMessage = {\n type: \"initialTree\",\n module: this._moduleName,\n state: clientData.moduleInstance.getState(),\n patches: initialPatches,\n revision: 0,\n };\n ws.send(JSON.stringify(initialMessage));\n\n // Notify connection callbacks\n const client: RemoteClient = {\n id: clientData.id,\n socket: ws,\n connectedAt: clientData.connectedAt,\n };\n this._onConnectionCallbacks.forEach((cb) => cb(client));\n }\n\n /**\n * Set up the render callback for streaming patches\n */\n private setupRenderCallback(\n ws: ServerWebSocket<unknown>,\n clientData: ClientData\n ): void {\n clientData.engine.setRenderCallback((patches) => {\n const data = this.clients.get(ws);\n if (!data) return;\n\n data.revision++;\n\n const message: PatchMessage = {\n type: \"patch\",\n module: this._moduleName,\n patches,\n revision: data.revision,\n };\n\n ws.send(JSON.stringify(message));\n\n // If allow-multiple, broadcast to other connections on same session\n if (\n this.sessionManager?.getConcurrentPolicy() === \"allow-multiple\" &&\n data.sessionId\n ) {\n const connections = this.sessionManager.getConnections(data.sessionId);\n if (connections) {\n for (const conn of connections) {\n if (conn !== ws) {\n (conn as ServerWebSocket<unknown>).send(JSON.stringify(message));\n }\n }\n }\n }\n });\n }\n\n /**\n * Handle concurrent connection based on policy\n * Returns true if connection is allowed, false if rejected\n */\n private async handleConcurrentConnection(\n ws: ServerWebSocket<unknown>,\n clientData: ClientData,\n existingSession: Session,\n props: Record<string, any> | undefined\n ): Promise<boolean> {\n const policy = this.sessionManager?.getConcurrentPolicy() ?? \"kick-old\";\n\n switch (policy) {\n case \"kick-old\": {\n // Kick existing connections\n const existingConnections = this.sessionManager?.getConnections(\n existingSession.id\n );\n if (existingConnections) {\n for (const conn of existingConnections) {\n const oldWs = conn as ServerWebSocket<unknown>;\n const expiredMsg: SessionExpiredMessage = {\n type: \"sessionExpired\",\n sessionId: existingSession.id,\n reason: \"kicked\",\n };\n oldWs.send(JSON.stringify(expiredMsg));\n oldWs.close(1000, \"Session taken by new connection\");\n }\n }\n return true;\n }\n\n case \"reject-new\": {\n // Reject this connection\n const expiredMsg: SessionExpiredMessage = {\n type: \"sessionExpired\",\n sessionId: existingSession.id,\n reason: \"kicked\",\n };\n ws.send(JSON.stringify(expiredMsg));\n ws.close(1000, \"Session already active\");\n return false;\n }\n\n case \"allow-multiple\": {\n // Allow both connections\n return true;\n }\n\n default:\n return true;\n }\n }\n\n /**\n * Trigger onReconnect hook\n */\n private async triggerReconnect(\n clientData: ClientData,\n session: Session,\n savedState: unknown\n ): Promise<void> {\n const handler = this._module?.handlers.onReconnect;\n if (!handler) return;\n\n let restored = false;\n const restore = (state: unknown) => {\n restored = true;\n clientData.moduleInstance.updateState(state as any);\n };\n\n await handler({ session, restore });\n }\n\n /**\n * Handle incoming WebSocket message\n */\n private handleMessage(\n ws: ServerWebSocket<unknown>,\n message: string | Buffer\n ) {\n try {\n const clientData = this.clients.get(ws);\n if (!clientData) return;\n\n const msg = JSON.parse(message.toString()) as RemoteMessage;\n\n switch (msg.type) {\n case \"hello\": {\n const helloMsg = msg as HelloMessage;\n this.initializeSession(\n ws,\n clientData,\n helloMsg.sessionId,\n helloMsg.props\n );\n break;\n }\n\n case \"dispatchAction\": {\n const actionMsg = msg as DispatchActionMessage;\n clientData.engine.dispatchAction(actionMsg.action, actionMsg.payload);\n break;\n }\n\n default:\n // Unknown message type\n break;\n }\n } catch (error) {\n console.error(\"Error handling WebSocket message:\", error);\n }\n }\n\n /**\n * Handle WebSocket close - suspend session instead of destroying\n */\n private async handleClose(ws: ServerWebSocket<unknown>) {\n const clientData = this.clients.get(ws);\n if (!clientData) return;\n\n // Clear hello timeout if still pending\n if (clientData.helloTimeout) {\n clearTimeout(clientData.helloTimeout);\n }\n\n // Get current state for session save\n const currentState = clientData.moduleInstance.getState();\n\n // Trigger onDisconnect hook\n if (clientData.sessionId && this._module?.handlers.onDisconnect) {\n const session = this.sessionManager?.getActiveSession(clientData.sessionId);\n if (session) {\n await this._module.handlers.onDisconnect({\n state: currentState,\n session,\n });\n }\n }\n\n // Suspend session (don't destroy immediately)\n if (clientData.sessionId && this.sessionManager) {\n this.sessionManager.untrackConnection(clientData.sessionId, ws);\n\n // Only suspend if no other connections for this session\n if (this.sessionManager.getConnectionCount(clientData.sessionId) === 0) {\n const session = this.sessionManager.getActiveSession(clientData.sessionId);\n if (session) {\n this.sessionManager.suspendSession(\n clientData.sessionId,\n currentState,\n async (expiredSession) => {\n // Trigger onExpire hook\n if (this._module?.handlers.onExpire) {\n await this._module.handlers.onExpire({ session: expiredSession });\n }\n }\n );\n }\n }\n }\n\n // Cleanup module instance\n await clientData.moduleInstance.destroy();\n this.clients.delete(ws);\n\n // Notify disconnection callbacks\n const client: RemoteClient = {\n id: clientData.id,\n socket: ws,\n connectedAt: clientData.connectedAt,\n };\n this._onDisconnectionCallbacks.forEach((cb) => cb(client));\n }\n\n /**\n * Get current client count\n */\n getClientCount(): number {\n return this.clients.size;\n }\n\n /**\n * Get session stats\n */\n getSessionStats(): {\n activeSessions: number;\n pendingSessions: number;\n totalConnections: number;\n } {\n return this.sessionManager?.getStats() ?? {\n activeSessions: 0,\n pendingSessions: 0,\n totalConnections: 0,\n };\n }\n\n /**\n * Broadcast a message to all connected clients\n */\n broadcast(message: RemoteMessage): void {\n const json = JSON.stringify(message);\n this.clients.forEach((_, ws) => {\n ws.send(json);\n });\n }\n}\n\n/**\n * Convenience function to create and start a RemoteServer\n */\nexport function serve(options: {\n module: HypenModule<any>;\n moduleName?: string;\n ui: string;\n port?: number;\n hostname?: string;\n session?: SessionConfig;\n onConnection?: (client: RemoteClient) => void;\n onDisconnection?: (client: RemoteClient) => void;\n}): RemoteServer {\n const server = new RemoteServer()\n .module(options.moduleName ?? \"App\", options.module)\n .ui(options.ui);\n\n if (options.port || options.hostname) {\n server.config({\n port: options.port,\n hostname: options.hostname,\n });\n }\n\n if (options.session) {\n server.session(options.session);\n }\n\n if (options.onConnection) {\n server.onConnection(options.onConnection);\n }\n\n if (options.onDisconnection) {\n server.onDisconnection(options.onDisconnection);\n }\n\n return server.listen(options.port);\n}\n",
|
|
26
|
+
"/**\n * Session Management for Remote UI\n *\n * Manages session lifecycle including:\n * - Creating new sessions\n * - Suspending sessions on disconnect (pending reconnection)\n * - Resuming sessions on reconnect\n * - Expiring sessions after TTL\n * - Handling concurrent connections\n */\n\nimport type { Session, SessionConfig } from \"./types.js\";\n\n/**\n * Internal representation of a pending (disconnected) session\n */\ninterface PendingSession {\n session: Session;\n savedState: unknown;\n expiryTimer: ReturnType<typeof setTimeout>;\n}\n\n/**\n * Callback invoked when a session expires\n */\nexport type SessionExpireCallback = (session: Session) => void | Promise<void>;\n\n/**\n * Manages session lifecycle for remote UI connections\n */\nexport class SessionManager {\n /** Active sessions (currently connected) */\n private activeSessions = new Map<string, Session>();\n\n /** Pending sessions (disconnected, waiting for reconnect within TTL) */\n private pendingSessions = new Map<string, PendingSession>();\n\n /** Maps session ID to connected WebSocket(s) for concurrent handling */\n private sessionConnections = new Map<string, Set<unknown>>();\n\n /** Resolved configuration with defaults */\n private config: Required<SessionConfig>;\n\n constructor(config: SessionConfig = {}) {\n this.config = {\n ttl: config.ttl ?? 3600, // 1 hour default\n concurrent: config.concurrent ?? \"kick-old\",\n generateId: config.generateId ?? (() => crypto.randomUUID()),\n };\n }\n\n /**\n * Get the configured TTL in seconds\n */\n getTtl(): number {\n return this.config.ttl;\n }\n\n /**\n * Get the concurrent connection policy\n */\n getConcurrentPolicy(): \"kick-old\" | \"reject-new\" | \"allow-multiple\" {\n return this.config.concurrent;\n }\n\n /**\n * Create a new session\n */\n createSession(props?: Record<string, any>): Session {\n const now = new Date();\n const session: Session = {\n id: this.config.generateId(),\n ttl: this.config.ttl,\n createdAt: now,\n lastConnectedAt: now,\n props,\n };\n this.activeSessions.set(session.id, session);\n return session;\n }\n\n /**\n * Get an active (connected) session by ID\n */\n getActiveSession(id: string): Session | null {\n return this.activeSessions.get(id) ?? null;\n }\n\n /**\n * Get a pending (disconnected) session by ID\n */\n getPendingSession(id: string): PendingSession | null {\n return this.pendingSessions.get(id) ?? null;\n }\n\n /**\n * Check if a session exists (either active or pending)\n */\n hasSession(id: string): boolean {\n return this.activeSessions.has(id) || this.pendingSessions.has(id);\n }\n\n /**\n * Suspend a session when client disconnects\n * Moves from active to pending with a TTL timer\n *\n * @param sessionId - The session to suspend\n * @param savedState - State snapshot to restore on reconnect\n * @param onExpire - Callback when TTL expires\n */\n suspendSession(\n sessionId: string,\n savedState: unknown,\n onExpire: SessionExpireCallback\n ): void {\n const session = this.activeSessions.get(sessionId);\n if (!session) return;\n\n // Remove from active\n this.activeSessions.delete(sessionId);\n\n // Set up expiry timer\n const expiryTimer = setTimeout(async () => {\n const pending = this.pendingSessions.get(sessionId);\n if (pending) {\n this.pendingSessions.delete(sessionId);\n await onExpire(pending.session);\n }\n }, session.ttl * 1000);\n\n // Add to pending\n this.pendingSessions.set(sessionId, {\n session,\n savedState,\n expiryTimer,\n });\n }\n\n /**\n * Resume a pending session when client reconnects\n *\n * @param sessionId - The session to resume\n * @returns Session and saved state, or null if not found/expired\n */\n resumeSession(\n sessionId: string\n ): { session: Session; savedState: unknown } | null {\n const pending = this.pendingSessions.get(sessionId);\n if (!pending) return null;\n\n // Clear expiry timer\n clearTimeout(pending.expiryTimer);\n this.pendingSessions.delete(sessionId);\n\n // Update last connected time\n pending.session.lastConnectedAt = new Date();\n\n // Move back to active\n this.activeSessions.set(sessionId, pending.session);\n\n return {\n session: pending.session,\n savedState: pending.savedState,\n };\n }\n\n /**\n * Destroy a session completely (both active and pending)\n */\n destroySession(sessionId: string): void {\n this.activeSessions.delete(sessionId);\n\n const pending = this.pendingSessions.get(sessionId);\n if (pending) {\n clearTimeout(pending.expiryTimer);\n this.pendingSessions.delete(sessionId);\n }\n\n this.sessionConnections.delete(sessionId);\n }\n\n /**\n * Track a WebSocket connection for a session\n * Used for concurrent connection handling\n */\n trackConnection(sessionId: string, ws: unknown): void {\n let connections = this.sessionConnections.get(sessionId);\n if (!connections) {\n connections = new Set();\n this.sessionConnections.set(sessionId, connections);\n }\n connections.add(ws);\n }\n\n /**\n * Untrack a WebSocket connection\n */\n untrackConnection(sessionId: string, ws: unknown): void {\n const connections = this.sessionConnections.get(sessionId);\n if (connections) {\n connections.delete(ws);\n if (connections.size === 0) {\n this.sessionConnections.delete(sessionId);\n }\n }\n }\n\n /**\n * Get all connections for a session\n */\n getConnections(sessionId: string): Set<unknown> | undefined {\n return this.sessionConnections.get(sessionId);\n }\n\n /**\n * Get connection count for a session\n */\n getConnectionCount(sessionId: string): number {\n return this.sessionConnections.get(sessionId)?.size ?? 0;\n }\n\n /**\n * Get stats about current sessions\n */\n getStats(): {\n activeSessions: number;\n pendingSessions: number;\n totalConnections: number;\n } {\n let totalConnections = 0;\n for (const connections of this.sessionConnections.values()) {\n totalConnections += connections.size;\n }\n\n return {\n activeSessions: this.activeSessions.size,\n pendingSessions: this.pendingSessions.size,\n totalConnections,\n };\n }\n\n /**\n * Clean up all sessions and timers\n * Call this when shutting down the server\n */\n destroy(): void {\n // Clear all pending session timers\n for (const pending of this.pendingSessions.values()) {\n clearTimeout(pending.expiryTimer);\n }\n\n this.activeSessions.clear();\n this.pendingSessions.clear();\n this.sessionConnections.clear();\n }\n}\n"
|
|
20
27
|
],
|
|
21
|
-
"mappings": "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",
|
|
22
|
-
"debugId": "
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "7419746F35A290F664756E2164756E21",
|
|
23
30
|
"names": []
|
|
24
31
|
}
|