@hypen-space/core 0.3.0 → 0.3.1

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.
@@ -1876,6 +1876,13 @@ init_app();
1876
1876
  init_state();
1877
1877
  export {
1878
1878
  getStateSnapshot,
1879
+ getElementDisposables,
1880
+ disposableWebSocket,
1881
+ disposableTimeout,
1882
+ disposableSubscription,
1883
+ disposableListener,
1884
+ disposableInterval,
1885
+ disposableAbortController,
1879
1886
  createObservableState,
1880
1887
  createEventEmitter,
1881
1888
  batchStateUpdates,
@@ -1888,8 +1895,9 @@ export {
1888
1895
  HypenAppBuilder,
1889
1896
  HypenApp,
1890
1897
  Engine,
1898
+ DisposableStack,
1891
1899
  ConsoleRenderer,
1892
1900
  BaseRenderer
1893
1901
  };
1894
1902
 
1895
- //# debugId=963C71FF3FCA5E5C64756E2164756E21
1903
+ //# debugId=710AF22CE2874E4E64756E2164756E21
@@ -14,9 +14,9 @@
14
14
  "/**\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",
15
15
  "/**\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",
16
16
  "/**\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",
17
- "/**\n * @hypen/core - Browser Entry Point\n *\n * This entry point uses the browser-compatible engine with explicit WASM initialization.\n */\n\n// ============================================================================\n// ENGINE API (Browser version)\n// ============================================================================\n\nexport { Engine } from \"./engine.browser.js\";\nexport type {\n Patch,\n Action,\n RenderCallback,\n ActionHandler as EngineActionHandler,\n ResolvedComponent,\n ComponentResolver,\n EngineInitOptions,\n} from \"./engine.browser.js\";\n\n// ============================================================================\n// APP / MODULE SYSTEM\n// ============================================================================\n\nexport { app, HypenApp, HypenAppBuilder, HypenModuleInstance } from \"./app.js\";\nexport type {\n IEngine,\n RouterContext,\n ActionContext,\n ActionNext,\n GlobalContext,\n LifecycleHandler,\n ActionHandlerContext,\n ActionHandler,\n HypenModuleDefinition,\n HypenModule,\n} from \"./app.js\";\n\n// ============================================================================\n// STATE MANAGEMENT\n// ============================================================================\n\nexport {\n createObservableState,\n batchStateUpdates,\n getStateSnapshot,\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\nexport { RemoteEngine } from \"./remote/client.js\";\nexport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n StateUpdateMessage,\n RemoteClient,\n RemoteServerConfig,\n} from \"./remote/types.js\";\nexport type {\n RemoteConnectionState,\n RemoteEngineOptions,\n} from \"./remote/client.js\";\n"
17
+ "/**\n * @hypen-space/core - Browser Entry Point\n *\n * This entry point uses the browser-compatible engine with explicit WASM initialization.\n */\n\n// ============================================================================\n// ENGINE API (Browser version)\n// ============================================================================\n\nexport { Engine } from \"./engine.browser.js\";\nexport type {\n Patch,\n Action,\n RenderCallback,\n ActionHandler as EngineActionHandler,\n ResolvedComponent,\n ComponentResolver,\n EngineInitOptions,\n} from \"./engine.browser.js\";\n\n// ============================================================================\n// APP / MODULE SYSTEM\n// ============================================================================\n\nexport { app, HypenApp, HypenAppBuilder, HypenModuleInstance } from \"./app.js\";\nexport type {\n IEngine,\n RouterContext,\n ActionContext,\n ActionNext,\n GlobalContext,\n LifecycleHandler,\n ActionHandlerContext,\n ActionHandler,\n HypenModuleDefinition,\n HypenModule,\n} from \"./app.js\";\n\n// ============================================================================\n// STATE MANAGEMENT\n// ============================================================================\n\nexport {\n createObservableState,\n batchStateUpdates,\n getStateSnapshot,\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\nexport { RemoteEngine } from \"./remote/client.js\";\nexport type {\n RemoteMessage,\n InitialTreeMessage,\n PatchMessage,\n DispatchActionMessage,\n StateUpdateMessage,\n RemoteClient,\n RemoteServerConfig,\n} from \"./remote/types.js\";\nexport type {\n RemoteConnectionState,\n RemoteEngineOptions,\n} from \"./remote/client.js\";\n\n// ============================================================================\n// DISPOSABLES (for event cleanup in @hypen-space/web)\n// ============================================================================\n\nexport {\n DisposableStack,\n getElementDisposables,\n disposableListener,\n disposableTimeout,\n disposableInterval,\n disposableWebSocket,\n disposableAbortController,\n disposableSubscription,\n} from \"./disposable.js\";\nexport type { Disposable } from \"./disposable.js\";\n"
18
18
  ],
19
19
  "mappings": "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",
20
- "debugId": "963C71FF3FCA5E5C64756E2164756E21",
20
+ "debugId": "710AF22CE2874E4E64756E2164756E21",
21
21
  "names": []
22
22
  }
package/dist/src/index.js CHANGED
@@ -2517,7 +2517,7 @@ export default { module: _module, template: ${JSON.stringify(template)}, name: $
2517
2517
  } else {
2518
2518
  log3("No module found, creating stateless component");
2519
2519
  contents = `
2520
- import { app } from "@hypen/core";
2520
+ import { app } from "@hypen-space/core";
2521
2521
  const _module = app.defineState({}).build();
2522
2522
  export const module = _module;
2523
2523
  export const template = ${JSON.stringify(template)};
@@ -3258,4 +3258,4 @@ export {
3258
3258
  ActionError
3259
3259
  };
3260
3260
 
3261
- //# debugId=7419746F35A290F664756E2164756E21
3261
+ //# debugId=C14CD722218CC69564756E2164756E21
@@ -18,14 +18,14 @@
18
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",
19
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",
20
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",
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",
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-space/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",
22
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",
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",
23
+ "/**\n * @hypen-space/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
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",
25
+ "/**\n * RemoteServer - Stream Hypen apps over WebSocket with Session Management\n *\n * Usage:\n * ```typescript\n * import { RemoteServer, app } from \"@hypen-space/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
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"
27
27
  ],
28
28
  "mappings": "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",
29
- "debugId": "7419746F35A290F664756E2164756E21",
29
+ "debugId": "C14CD722218CC69564756E2164756E21",
30
30
  "names": []
31
31
  }
@@ -103,7 +103,7 @@ export default { module: _module, template: ${JSON.stringify(template)}, name: $
103
103
  } else {
104
104
  log("No module found, creating stateless component");
105
105
  contents = `
106
- import { app } from "@hypen/core";
106
+ import { app } from "@hypen-space/core";
107
107
  const _module = app.defineState({}).build();
108
108
  export const module = _module;
109
109
  export const template = ${JSON.stringify(template)};
@@ -131,4 +131,4 @@ export {
131
131
  plugin_default as default
132
132
  };
133
133
 
134
- //# debugId=F069255D558FE8AD64756E2164756E21
134
+ //# debugId=F7A9B786256270A664756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/plugin.ts"],
4
4
  "sourcesContent": [
5
- "/**\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"
5
+ "/**\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-space/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"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "F069255D558FE8AD64756E2164756E21",
8
+ "debugId": "F7A9B786256270A664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -10,7 +10,7 @@
10
10
  "/**\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",
11
11
  "/**\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",
12
12
  "/**\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",
13
- "/**\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",
13
+ "/**\n * RemoteServer - Stream Hypen apps over WebSocket with Session Management\n *\n * Usage:\n * ```typescript\n * import { RemoteServer, app } from \"@hypen-space/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",
14
14
  "/**\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"
15
15
  ],
16
16
  "mappings": "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",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypen-space/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Hypen core engine - Platform-agnostic reactive UI runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @hypen/core - Browser Entry Point
2
+ * @hypen-space/core - Browser Entry Point
3
3
  *
4
4
  * This entry point uses the browser-compatible engine with explicit WASM initialization.
5
5
  */
@@ -102,3 +102,19 @@ export type {
102
102
  RemoteConnectionState,
103
103
  RemoteEngineOptions,
104
104
  } from "./remote/client.js";
105
+
106
+ // ============================================================================
107
+ // DISPOSABLES (for event cleanup in @hypen-space/web)
108
+ // ============================================================================
109
+
110
+ export {
111
+ DisposableStack,
112
+ getElementDisposables,
113
+ disposableListener,
114
+ disposableTimeout,
115
+ disposableInterval,
116
+ disposableWebSocket,
117
+ disposableAbortController,
118
+ disposableSubscription,
119
+ } from "./disposable.js";
120
+ export type { Disposable } from "./disposable.js";
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @hypen/core - Hypen Core Engine
2
+ * @hypen-space/core - Hypen Core Engine
3
3
  *
4
4
  * Platform-agnostic reactive UI runtime.
5
5
  * Use with @hypen/web for browser rendering, or build your own renderer.
package/src/plugin.ts CHANGED
@@ -186,7 +186,7 @@ export default { module: _module, template: ${JSON.stringify(template)}, name: $
186
186
  // No TypeScript module - create stateless component
187
187
  log("No module found, creating stateless component");
188
188
  contents = `
189
- import { app } from "@hypen/core";
189
+ import { app } from "@hypen-space/core";
190
190
  const _module = app.defineState({}).build();
191
191
  export const module = _module;
192
192
  export const template = ${JSON.stringify(template)};
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Usage:
5
5
  * ```typescript
6
- * import { RemoteServer, app } from "@hypen/core";
6
+ * import { RemoteServer, app } from "@hypen-space/core";
7
7
  *
8
8
  * const counter = app
9
9
  * .defineState({ count: 0 })