Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@r1-runtime/core

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@r1-runtime/core - npm Package Compare versions

Comparing version
0.3.1
to
0.3.2
+2
-89
dist/index.js
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
import { WindowManager } from "@r1/window";
import { WindowManager } from "@r1-runtime/window";
import { appWindow } from "@r1-runtime/apis/window";
class EventBus {

@@ -222,90 +223,2 @@ constructor() {

}
class WebviewWindow {
constructor(label) {
__publicField(this, "label");
this.label = label;
}
async setTitle(title) {
return window.__TAURI_INTERNALS__.invoke("window:set_title", { label: this.label, title });
}
async minimize() {
return window.__TAURI_INTERNALS__.invoke("window:minimize", { label: this.label });
}
async maximize() {
return window.__TAURI_INTERNALS__.invoke("window:maximize", { label: this.label });
}
async unmaximize() {
return window.__TAURI_INTERNALS__.invoke("window:unmaximize", { label: this.label });
}
async toggleMaximize() {
return window.__TAURI_INTERNALS__.invoke("window:toggle_maximize", { label: this.label });
}
async close() {
return window.__TAURI_INTERNALS__.invoke("window:close", { label: this.label });
}
async show() {
return window.__TAURI_INTERNALS__.invoke("window:show", { label: this.label });
}
async hide() {
return window.__TAURI_INTERNALS__.invoke("window:hide", { label: this.label });
}
async setFocus() {
return window.__TAURI_INTERNALS__.invoke("window:focus", { label: this.label });
}
async setSize(size) {
return window.__TAURI_INTERNALS__.invoke("window:set_size", { label: this.label, width: size.width, height: size.height });
}
async setPosition(position) {
return window.__TAURI_INTERNALS__.invoke("window:set_position", { label: this.label, x: position.x, y: position.y });
}
async setResizable(resizable) {
return window.__TAURI_INTERNALS__.invoke("window:set_resizable", { label: this.label, resizable });
}
async setAlwaysOnTop(alwaysOnTop) {
return window.__TAURI_INTERNALS__.invoke("window:set_always_on_top", { label: this.label, alwaysOnTop });
}
async innerSize() {
return window.__TAURI_INTERNALS__.invoke("window:inner_size", { label: this.label });
}
async outerSize() {
return window.__TAURI_INTERNALS__.invoke("window:outer_size", { label: this.label });
}
async isMaximized() {
return window.__TAURI_INTERNALS__.invoke("window:is_maximized", { label: this.label });
}
async isMinimized() {
return window.__TAURI_INTERNALS__.invoke("window:is_minimized", { label: this.label });
}
async isVisible() {
return window.__TAURI_INTERNALS__.invoke("window:is_visible", { label: this.label });
}
/**
* Listen for window events.
*/
async onCloseRequested(handler) {
return window.__TAURI_INTERNALS__.listen(`tauri://close-requested`, handler);
}
async onResized(handler) {
return window.__TAURI_INTERNALS__.listen(`tauri://resize`, (e) => handler(e.payload));
}
async onMoved(handler) {
return window.__TAURI_INTERNALS__.listen(`tauri://move`, (e) => handler(e.payload));
}
async onFocusChanged(handler) {
const l1 = await window.__TAURI_INTERNALS__.listen(`tauri://focus`, () => handler(true));
const l2 = await window.__TAURI_INTERNALS__.listen(`tauri://blur`, () => handler(false));
return () => {
l1();
l2();
};
}
/**
* Static factory to get a window by label.
*/
static getByLabel(label) {
if (label === "main") return appWindow;
return new WebviewWindow(label);
}
}
const appWindow = new WebviewWindow("main");
function installIpcBridge(kernelProxy) {

@@ -312,0 +225,0 @@ const callbacks = new CallbackRegistry();

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../src/event-bus.ts","../src/kernel-proxy.ts","../src/callback-registry.ts","../../apis/src/window.ts","../src/ipc-bridge.ts","../src/runtime.ts"],"sourcesContent":["/**\n * Simple Event Bus for R1 Runtime.\n * Allows components to subscribe to events and dispatch them with payloads.\n */\nexport class EventBus {\n private handlers: Map<string, Set<Function>> = new Map();\n\n /**\n * Listen for an event. Returns an unlisten function.\n */\n on(event: string, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n return () => {\n const set = this.handlers.get(event);\n if (set) {\n set.delete(handler);\n if (set.size === 0) this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Listen for an event once. Returns an unlisten function.\n */\n once(event: string, handler: Function): () => void {\n const unlisten = this.on(event, (payload: any) => {\n unlisten();\n handler(payload);\n });\n return unlisten;\n }\n\n /**\n * Emit an event to all subscribers.\n */\n emit(event: string, payload: any): void {\n const set = this.handlers.get(event);\n if (set) {\n // Execute on next tick to avoid blocking the emitter and handle potential re-entrancy\n set.forEach(handler => {\n try {\n handler(payload);\n } catch (e) {\n console.error(`[EventBus] Error in handler for event \"${event}\":`, e);\n }\n });\n }\n }\n}\n","import type { KernelRequest, KernelResponse } from '@r1/kernel';\nimport { EventBus } from './event-bus';\nimport { WindowManager } from '@r1/window';\n\n/** Let's wait up to 30s before considering the worker dead/stuck. */\nconst REQUEST_TIMEOUT_MS = 30000;\n\n/**\n * The main thread's proxy to the R1 Kernel Worker.\n * Handles spawning the thread, managing lifecycle, and dispatching promises.\n */\nexport class KernelProxy {\n private worker: Worker;\n public eventBus = new EventBus();\n private requests = new Map<\n string,\n { resolve: (p: any) => void; reject: (e: any) => void; timer: ReturnType<typeof setTimeout> }\n >();\n\n constructor(workerUrl: string | URL) {\n this.worker = new Worker(workerUrl, { type: 'module' });\n\n this.worker.onmessage = (event: MessageEvent<KernelResponse | { type: string, payload: any }>) => {\n const data = event.data;\n \n // Check if this is an out-of-band event emission (e.g. from Rust)\n if (data && 'type' in data && data.type === 'EVENT_EMIT') {\n const { event: eventName, payload } = data.payload as { event: string, payload: any };\n \n // Wrap in Tauri-compatible Event object\n const wrappedEvent = {\n event: eventName,\n windowLabel: 'main', // Default label\n id: Math.floor(Math.random() * 1000000), // Unique delivery ID\n payload\n };\n \n this.eventBus.emit(eventName, wrappedEvent);\n return;\n }\n\n // Check if this is a request to execute a Main Thread API (Worker -> Main)\n if (data && 'type' in data && data.type === 'MAIN_THREAD_CALL') {\n const { api, method, args } = (data as any).payload;\n this.handleMainThreadCall((data as any).id, api, method, args);\n return;\n }\n\n this.handleResponse(data as KernelResponse);\n };\n\n this.worker.onerror = (error: ErrorEvent) => {\n console.error('[R1 Main] Kernel Worker crashed:', error.message || error);\n };\n\n this.worker.onmessageerror = (event: MessageEvent) => {\n console.error('[R1 Main] Kernel Worker deserialisation error:', event);\n };\n }\n\n /**\n * Send a typed message to the worker and await its exact response.\n */\n public send(type: string, payload: unknown = {}): Promise<unknown> {\n return new Promise((resolve, reject) => {\n // 1. Generate unique request id (poor-man's nanoid)\n const id = typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 15);\n\n // 2. Setup 30s timeout\n const timer = setTimeout(() => {\n if (this.requests.has(id)) {\n this.requests.delete(id);\n reject(new Error(`Kernel Request timed out after ${REQUEST_TIMEOUT_MS}ms (type=${type})`));\n }\n }, REQUEST_TIMEOUT_MS);\n\n // 3. Register pending request\n this.requests.set(id, { resolve, reject, timer });\n\n // 4. Send\n const request: KernelRequest = { id, type, payload };\n this.worker.postMessage(request);\n });\n }\n\n /**\n * Internal processor for all inbound traffic from the kernel worker.\n */\n private handleResponse(response: KernelResponse) {\n if (!response || !response.id) return;\n \n const pending = this.requests.get(response.id);\n if (!pending) {\n console.warn(`[R1 Main] Received KernelResponse for unknown/expired request id: ${response.id}`);\n return;\n }\n\n clearTimeout(pending.timer);\n this.requests.delete(response.id);\n\n if (response.error) {\n pending.reject(new Error(response.error));\n } else {\n pending.resolve(response.payload);\n }\n }\n\n /**\n * Dispatches a call to real Web APIs on the main thread.\n */\n private async handleMainThreadCall(id: string, api: string, method: string, args: any) {\n let result: any;\n let error: string | undefined;\n\n try {\n if (api === 'dialog') {\n if (method === 'message') {\n await WindowManager.getInstance().showDialog({ message: args.message, title: args.title, type: 'alert' });\n }\n else if (method === 'confirm' || method === 'ask') {\n result = await WindowManager.getInstance().showDialog({ message: args.message, title: args.title, type: 'confirm' });\n }\n } else if (api === 'clipboard') {\n if (method === 'write_text') await navigator.clipboard.writeText(args.text);\n else if (method === 'read_text') result = await navigator.clipboard.readText();\n } else if (api === 'notification') {\n if (method === 'request_permission') result = await Notification.requestPermission();\n else if (method === 'notify') new Notification(args.title, args.options);\n } else if (api === 'shell') {\n if (method === 'open') window.open(args.url, '_blank');\n } else if (api === 'os') {\n if (method === 'platform') result = (navigator as any).platform || 'unknown';\n else if (method === 'arch') result = 'x64'; // Default for browser\n else if (method === 'version') result = navigator.userAgent;\n else if (method === 'type') result = 'Browser';\n } else if (api === 'path') {\n if (method === 'home_dir') result = '/home';\n else if (method === 'app_data_dir') result = '/app_data';\n else if (method === 'resolve') result = args.paths.join('/'); \n } else if (api === 'window') {\n const wm = WindowManager.getInstance();\n const winId = args.id || 'main';\n const methodMapping: Record<string, string> = {\n 'set_title': 'setTitle',\n 'close': 'close',\n 'maximize': 'maximize',\n 'minimize': 'minimize',\n 'focus': 'focus'\n };\n\n if (method === 'close') {\n wm.close(winId);\n } else if (method === 'focus') {\n wm.focus(winId);\n } else if (method === 'set_title') {\n const win = wm.getWindow(winId);\n if (win) win.setTitle(args.title);\n }\n }\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n\n this.worker.postMessage({\n type: 'MAIN_THREAD_RESPONSE',\n id,\n payload: result,\n error\n });\n }\n\n public terminate() {\n this.worker.terminate();\n }\n}\n","/**\n * Tauri's frontend APIs (like `invoke`) pass a callback function to the backend.\n * Because functions cannot be serialized to the Web Worker, we store them in this\n * registry and pass a numeric ID to the backend instead.\n * \n * When the backend replies, it targets the numeric ID, and we trigger the real\n * JS function here.\n */\nexport class CallbackRegistry {\n private count = 0;\n private registry = new Map<number, { fn: Function; once: boolean }>();\n\n /**\n * Register a function and return its unique numerical ID.\n */\n register(fn: Function, once: boolean): number {\n const id = ++this.count;\n this.registry.set(id, { fn, once });\n return id;\n }\n\n /**\n * Trigger the callback with given payload.\n * If `once` was true, the callback is removed immediately.\n */\n trigger(id: number, payload: unknown): void {\n const entry = this.registry.get(id);\n if (!entry) {\n console.warn(`[R1 IPC] Attempted to trigger unknown callback id: ${id}`);\n return;\n }\n\n try {\n entry.fn(payload);\n } catch (e) {\n console.error(`[R1 IPC] Error inside callback ${id}:`, e);\n }\n\n if (entry.once) {\n this.registry.delete(id);\n }\n }\n\n /** Remove a callback completely */\n delete(id: number): void {\n this.registry.delete(id);\n }\n}\n","import { KernelPlugin, KernelHandler } from '@r1/kernel';\n\n/**\n * Allows the guest app (WASM/JS) to control its own window.\n */\nexport class WindowPlugin implements KernelPlugin {\n name = 'window';\n private onMainThreadCall: (api: string, method: string, args: any) => Promise<any>;\n\n constructor(onMainThreadCall: (api: string, method: string, args: any) => Promise<any>) {\n this.onMainThreadCall = onMainThreadCall;\n }\n\n getCommands(): Map<string, KernelHandler> {\n const commands = new Map<string, KernelHandler>();\n\n // These commands are proxied to the main thread via the bridge\n commands.set('set_title', async (args) => this.onMainThreadCall('window', 'set_title', args));\n commands.set('close', async (args) => this.onMainThreadCall('window', 'close', args));\n commands.set('maximize', async (args) => this.onMainThreadCall('window', 'maximize', args));\n commands.set('minimize', async (args) => this.onMainThreadCall('window', 'minimize', args));\n commands.set('focus', async (args) => this.onMainThreadCall('window', 'focus', args));\n\n return commands;\n }\n}\n\n// ─── Direct JS exports (used by @tauri-apps/api/window imports) ───────────────\n\n/**\n * Interface for unlistening to events.\n */\nexport type UnlistenFn = () => void;\n\n/**\n * Interface for screen size.\n */\nexport interface PhysicalSize {\n width: number;\n height: number;\n}\n\n/**\n * Interface for screen position.\n */\nexport interface PhysicalPosition {\n x: number;\n y: number;\n}\n\n/**\n * Represents a window in the R1 environment.\n * Maps closely to Tauri's WebviewWindow.\n */\nexport class WebviewWindow {\n label: string;\n\n constructor(label: string) {\n this.label = label;\n }\n\n async setTitle(title: string): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:set_title', { label: this.label, title });\n }\n\n async minimize(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:minimize', { label: this.label });\n }\n\n async maximize(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:maximize', { label: this.label });\n }\n\n async unmaximize(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:unmaximize', { label: this.label });\n }\n\n async toggleMaximize(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:toggle_maximize', { label: this.label });\n }\n\n async close(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:close', { label: this.label });\n }\n\n async show(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:show', { label: this.label });\n }\n\n async hide(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:hide', { label: this.label });\n }\n\n async setFocus(): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:focus', { label: this.label });\n }\n\n async setSize(size: PhysicalSize): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:set_size', { label: this.label, width: size.width, height: size.height });\n }\n\n async setPosition(position: PhysicalPosition): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:set_position', { label: this.label, x: position.x, y: position.y });\n }\n\n async setResizable(resizable: boolean): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:set_resizable', { label: this.label, resizable });\n }\n\n async setAlwaysOnTop(alwaysOnTop: boolean): Promise<void> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:set_always_on_top', { label: this.label, alwaysOnTop });\n }\n\n async innerSize(): Promise<PhysicalSize> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:inner_size', { label: this.label });\n }\n\n async outerSize(): Promise<PhysicalSize> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:outer_size', { label: this.label });\n }\n\n async isMaximized(): Promise<boolean> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:is_maximized', { label: this.label });\n }\n\n async isMinimized(): Promise<boolean> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:is_minimized', { label: this.label });\n }\n\n async isVisible(): Promise<boolean> {\n return (window as any).__TAURI_INTERNALS__.invoke('window:is_visible', { label: this.label });\n }\n\n /**\n * Listen for window events.\n */\n async onCloseRequested(handler: () => void): Promise<UnlistenFn> {\n return (window as any).__TAURI_INTERNALS__.listen(`tauri://close-requested`, handler);\n }\n\n async onResized(handler: (size: PhysicalSize) => void): Promise<UnlistenFn> {\n return (window as any).__TAURI_INTERNALS__.listen(`tauri://resize`, (e: any) => handler(e.payload));\n }\n\n async onMoved(handler: (position: PhysicalPosition) => void): Promise<UnlistenFn> {\n return (window as any).__TAURI_INTERNALS__.listen(`tauri://move`, (e: any) => handler(e.payload));\n }\n\n async onFocusChanged(handler: (focused: boolean) => void): Promise<UnlistenFn> {\n const l1 = await (window as any).__TAURI_INTERNALS__.listen(`tauri://focus`, () => handler(true));\n const l2 = await (window as any).__TAURI_INTERNALS__.listen(`tauri://blur`, () => handler(false));\n return () => { l1(); l2(); };\n }\n\n /**\n * Static factory to get a window by label.\n */\n static getByLabel(label: string): WebviewWindow | null {\n // In our single-webview runtime, we only really have 'main'\n if (label === 'main') return appWindow;\n return new WebviewWindow(label);\n }\n}\n\n/**\n * The default window singleton.\n */\nexport const appWindow = new WebviewWindow('main');\n\n// Type aliases Tauri uses\nexport type { WebviewWindow as Window };\n","import type { KernelProxy } from './kernel-proxy';\nimport { CallbackRegistry } from './callback-registry';\nimport { appWindow } from '@r1/apis/window';\n\n/**\n * Patches the browser `window` to intercept Tauri frontend library calls\n * and route them to our Kernel Worker instead of the native Rust backend.\n */\nexport function installIpcBridge(kernelProxy: KernelProxy): void {\n const callbacks = new CallbackRegistry();\n\n // Make the registry available globally so Kernel responses can trigger them\n // (We'll use this in Phase 7 for events, or we route them back via the proxy resolving)\n (window as any).__R1_CALLBACKS__ = callbacks;\n\n // Numeric ID registry for unlisten functions\n const eventListeners = new Map<number, { event: string, unlisten: () => void }>();\n let nextListenerId = 1;\n\n // --------------------------------------------------------------------------\n // TAURI v2 BRIDGE\n // --------------------------------------------------------------------------\n (window as any).__TAURI_INTERNALS__ = {\n /**\n * Replaces V2 `invoke(cmd, args)`.\n */\n invoke: async (command: string, args: unknown = {}) => {\n // The protocol format requires an 'IPC_INVOKE' type.\n const payload = { command, args };\n // The kernel router will catch errors and reject the proxy Promise,\n // so we don't need manual try/catch here; it natively maps to Tauri's promise rejection.\n return kernelProxy.send('IPC_INVOKE', payload);\n },\n\n /**\n * Converts a JS function into a numeric ID passable to Rust.\n */\n transformCallback: (callback: Function, once = false) => {\n return callbacks.register(callback, once);\n },\n\n /**\n * listen() for global events.\n */\n listen: (event: string, handler: Function) => {\n const id = nextListenerId++;\n const unlisten = kernelProxy.eventBus.on(event, handler);\n eventListeners.set(id, { event, unlisten });\n \n const unlistenWrapper = () => {\n unlisten();\n eventListeners.delete(id);\n };\n // Tauri v2 returns a Promise<UnlistenFn>\n return Promise.resolve(unlistenWrapper);\n },\n\n /**\n * once() for global events.\n */\n once: (event: string, handler: Function) => {\n const id = nextListenerId++;\n const unlisten = kernelProxy.eventBus.once(event, handler);\n eventListeners.set(id, { event, unlisten });\n \n const unlistenWrapper = () => {\n unlisten();\n eventListeners.delete(id);\n };\n return Promise.resolve(unlistenWrapper);\n },\n\n /**\n * unlisten() by numeric ID (Tauri v1 style).\n */\n unlisten: (event: string, id: number) => {\n const entry = eventListeners.get(id);\n if (entry && entry.event === event) {\n entry.unlisten();\n eventListeners.delete(id);\n }\n return Promise.resolve();\n }\n };\n\n // --------------------------------------------------------------------------\n // TAURI v1 BRIDGE\n // --------------------------------------------------------------------------\n (window as any).__TAURI_IPC__ = async (message: {\n cmd: string;\n callback?: number;\n error?: number;\n [key: string]: unknown;\n }) => {\n const { cmd, callback, error, ...args } = message;\n\n try {\n // Route the command via KernelProxy\n const response = await kernelProxy.send('IPC_INVOKE', { command: cmd, args });\n \n // If success and a success callback is registered, trigger it\n if (typeof callback === 'number') {\n callbacks.trigger(callback, response);\n }\n } catch (err) {\n // If failure and an error callback is registered, trigger it\n if (typeof error === 'number') {\n callbacks.trigger(error, err instanceof Error ? err.message : String(err));\n } else {\n // If no error callback, we must log it so it doesn't vanish silently.\n console.error(`[R1 IPC] Unhandled error from Tauri V1 invoke('${cmd}'):`, err);\n }\n }\n };\n\n // --------------------------------------------------------------------------\n // GLOBAL OBJECT INJECTIONS\n // --------------------------------------------------------------------------\n\n // Tauri v2 structure\n (window as any).__TAURI__ = (window as any).__TAURI__ || {};\n (window as any).__TAURI__.window = (window as any).__TAURI__.window || {};\n \n // Make appWindow available globally so apps that access it\n // via window.__TAURI_INTERNALS__ also work\n (window as any).__TAURI_INTERNALS__.appWindow = appWindow;\n (window as any).__TAURI__.window = { appWindow };\n\n // Polyfill convertFileSrc (used for loading local assets into <img> tags)\n // In the browser/service-worker runtime, we just return the path as-is\n // and the Service Worker intercepts it.\n (window as any).__TAURI__.core = (window as any).__TAURI__.core || {};\n (window as any).__TAURI__.core.convertFileSrc = (path: string) => path;\n (window as any).__TAURI_INTERNALS__.convertFileSrc = (path: string) => path;\n}\n","import { KernelProxy } from './kernel-proxy';\nimport { installIpcBridge } from './ipc-bridge';\n\nexport class R1Runtime {\n private kernelProxy: KernelProxy | null = null;\n\n /**\n * Boots the R1 Runtime. Must be called before any Tauri APIs are invoked.\n * \n * @param options - Boot options including WASM and Worker paths.\n */\n async boot(options: { wasmPath?: string, workerUrl?: string, swUrl?: string } = {}): Promise<void> {\n // Step 1 — Request persistent storage\n // Without this, the browser can silently delete OPFS data when\n // the device runs low on storage. This call prevents eviction.\n await this.requestPersistentStorage();\n\n const { wasmPath, workerUrl = '/sw.js', swUrl = '/r1-sw.js' } = options;\n \n // Check if another instance (possibly from a duplicated module) is already booting\n const win = window as any;\n if (this.kernelProxy || win.__R1_KERNEL_PROXY__) {\n this.kernelProxy = this.kernelProxy || win.__R1_KERNEL_PROXY__;\n return;\n }\n\n try {\n // Set global booting state immediately\n win.__R1_BOOT_STATUS__ = 'booting';\n console.log('[R1] Booting Kernel...');\n \n // 1. Spawn Kernel Worker\n this.kernelProxy = new KernelProxy(workerUrl);\n win.__R1_KERNEL_PROXY__ = this.kernelProxy;\n\n // 2. Install IPC Bridge\n installIpcBridge(this.kernelProxy);\n\n // 3. Register Service Worker interception\n if ('serviceWorker' in navigator) {\n try {\n // Add a timeout to SW registration to prevent hangs\n const swPromise = navigator.serviceWorker.register(swUrl, { scope: '/' });\n const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('SW registration timeout')), 3000));\n \n await Promise.race([swPromise, timeoutPromise]);\n console.log('[R1] Service Worker registered.');\n } catch (e) {\n console.warn('[R1] SW registration skipped or failed:', e);\n // Non-fatal, but we should track it\n }\n }\n\n // 4. Load developer WASM if provided\n if (wasmPath) {\n console.log(`[R1] Loading WASM from ${wasmPath}...`);\n await this.kernelProxy.send('WASM_LOAD', { name: 'main', url: wasmPath });\n }\n\n win.__R1_BOOT_STATUS__ = 'ready';\n console.log('[R1] Boot complete.');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n win.__R1_BOOT_STATUS__ = 'error';\n win.__R1_BOOT_ERROR__ = msg;\n console.error('[R1] Boot failed:', err);\n window.dispatchEvent(new CustomEvent('r1:error', { detail: msg }));\n throw err;\n }\n }\n\n isBooted(): boolean {\n return (window as any).__R1_BOOT_STATUS__ === 'ready';\n }\n\n async invoke(type: string, payload: any): Promise<any> {\n return this.kernel.send(type, payload);\n }\n\n /** Get direct access to the kernel proxy if needed internally */\n get kernel(): KernelProxy {\n const proxy = this.kernelProxy || (window as any).__R1_KERNEL_PROXY__;\n if (!proxy) throw new Error('[R1] Runtime not booted.');\n return proxy;\n }\n\n private async requestPersistentStorage(): Promise<void> {\n if (!navigator.storage) return;\n\n try {\n // Check if already persisted\n const alreadyPersisted = await navigator.storage.persisted();\n if (alreadyPersisted) {\n console.log('[R1] Storage: persistent ✓');\n return;\n }\n\n // Request persistence\n const granted = await navigator.storage.persist();\n\n if (granted) {\n console.log('[R1] Storage: persistent ✓');\n } else {\n console.warn(\n '[R1] Storage: best-effort only. ' +\n 'Data may be cleared by the browser when storage is low. ' +\n 'Bookmark this page or install it as a PWA for reliable storage.'\n );\n }\n } catch (err) {\n // Silently fail — browser may not support the API\n console.warn('[R1] Storage: persistence API not available', err);\n }\n }\n\n /** @internal FOR TESTING ONLY */\n static __TEST_RESET__() {\n const win = window as any;\n delete win.__R1_KERNEL_PROXY__;\n delete win.__R1_BOOT_STATUS__;\n }\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../src/event-bus.ts","../src/kernel-proxy.ts","../src/callback-registry.ts","../src/ipc-bridge.ts","../src/runtime.ts"],"sourcesContent":["/**\n * Simple Event Bus for R1 Runtime.\n * Allows components to subscribe to events and dispatch them with payloads.\n */\nexport class EventBus {\n private handlers: Map<string, Set<Function>> = new Map();\n\n /**\n * Listen for an event. Returns an unlisten function.\n */\n on(event: string, handler: Function): () => void {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n this.handlers.get(event)!.add(handler);\n\n return () => {\n const set = this.handlers.get(event);\n if (set) {\n set.delete(handler);\n if (set.size === 0) this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Listen for an event once. Returns an unlisten function.\n */\n once(event: string, handler: Function): () => void {\n const unlisten = this.on(event, (payload: any) => {\n unlisten();\n handler(payload);\n });\n return unlisten;\n }\n\n /**\n * Emit an event to all subscribers.\n */\n emit(event: string, payload: any): void {\n const set = this.handlers.get(event);\n if (set) {\n // Execute on next tick to avoid blocking the emitter and handle potential re-entrancy\n set.forEach(handler => {\n try {\n handler(payload);\n } catch (e) {\n console.error(`[EventBus] Error in handler for event \"${event}\":`, e);\n }\n });\n }\n }\n}\n","import type { KernelRequest, KernelResponse } from '@r1-runtime/kernel';\nimport { EventBus } from './event-bus';\nimport { WindowManager } from '@r1-runtime/window';\n\n/** Let's wait up to 30s before considering the worker dead/stuck. */\nconst REQUEST_TIMEOUT_MS = 30000;\n\n/**\n * The main thread's proxy to the R1 Kernel Worker.\n * Handles spawning the thread, managing lifecycle, and dispatching promises.\n */\nexport class KernelProxy {\n private worker: Worker;\n public eventBus = new EventBus();\n private requests = new Map<\n string,\n { resolve: (p: any) => void; reject: (e: any) => void; timer: ReturnType<typeof setTimeout> }\n >();\n\n constructor(workerUrl: string | URL) {\n this.worker = new Worker(workerUrl, { type: 'module' });\n\n this.worker.onmessage = (event: MessageEvent<KernelResponse | { type: string, payload: any }>) => {\n const data = event.data;\n \n // Check if this is an out-of-band event emission (e.g. from Rust)\n if (data && 'type' in data && data.type === 'EVENT_EMIT') {\n const { event: eventName, payload } = data.payload as { event: string, payload: any };\n \n // Wrap in Tauri-compatible Event object\n const wrappedEvent = {\n event: eventName,\n windowLabel: 'main', // Default label\n id: Math.floor(Math.random() * 1000000), // Unique delivery ID\n payload\n };\n \n this.eventBus.emit(eventName, wrappedEvent);\n return;\n }\n\n // Check if this is a request to execute a Main Thread API (Worker -> Main)\n if (data && 'type' in data && data.type === 'MAIN_THREAD_CALL') {\n const { api, method, args } = (data as any).payload;\n this.handleMainThreadCall((data as any).id, api, method, args);\n return;\n }\n\n this.handleResponse(data as KernelResponse);\n };\n\n this.worker.onerror = (error: ErrorEvent) => {\n console.error('[R1 Main] Kernel Worker crashed:', error.message || error);\n };\n\n this.worker.onmessageerror = (event: MessageEvent) => {\n console.error('[R1 Main] Kernel Worker deserialisation error:', event);\n };\n }\n\n /**\n * Send a typed message to the worker and await its exact response.\n */\n public send(type: string, payload: unknown = {}): Promise<unknown> {\n return new Promise((resolve, reject) => {\n // 1. Generate unique request id (poor-man's nanoid)\n const id = typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2, 15);\n\n // 2. Setup 30s timeout\n const timer = setTimeout(() => {\n if (this.requests.has(id)) {\n this.requests.delete(id);\n reject(new Error(`Kernel Request timed out after ${REQUEST_TIMEOUT_MS}ms (type=${type})`));\n }\n }, REQUEST_TIMEOUT_MS);\n\n // 3. Register pending request\n this.requests.set(id, { resolve, reject, timer });\n\n // 4. Send\n const request: KernelRequest = { id, type, payload };\n this.worker.postMessage(request);\n });\n }\n\n /**\n * Internal processor for all inbound traffic from the kernel worker.\n */\n private handleResponse(response: KernelResponse) {\n if (!response || !response.id) return;\n \n const pending = this.requests.get(response.id);\n if (!pending) {\n console.warn(`[R1 Main] Received KernelResponse for unknown/expired request id: ${response.id}`);\n return;\n }\n\n clearTimeout(pending.timer);\n this.requests.delete(response.id);\n\n if (response.error) {\n pending.reject(new Error(response.error));\n } else {\n pending.resolve(response.payload);\n }\n }\n\n /**\n * Dispatches a call to real Web APIs on the main thread.\n */\n private async handleMainThreadCall(id: string, api: string, method: string, args: any) {\n let result: any;\n let error: string | undefined;\n\n try {\n if (api === 'dialog') {\n if (method === 'message') {\n await WindowManager.getInstance().showDialog({ message: args.message, title: args.title, type: 'alert' });\n }\n else if (method === 'confirm' || method === 'ask') {\n result = await WindowManager.getInstance().showDialog({ message: args.message, title: args.title, type: 'confirm' });\n }\n } else if (api === 'clipboard') {\n if (method === 'write_text') await navigator.clipboard.writeText(args.text);\n else if (method === 'read_text') result = await navigator.clipboard.readText();\n } else if (api === 'notification') {\n if (method === 'request_permission') result = await Notification.requestPermission();\n else if (method === 'notify') new Notification(args.title, args.options);\n } else if (api === 'shell') {\n if (method === 'open') window.open(args.url, '_blank');\n } else if (api === 'os') {\n if (method === 'platform') result = (navigator as any).platform || 'unknown';\n else if (method === 'arch') result = 'x64'; // Default for browser\n else if (method === 'version') result = navigator.userAgent;\n else if (method === 'type') result = 'Browser';\n } else if (api === 'path') {\n if (method === 'home_dir') result = '/home';\n else if (method === 'app_data_dir') result = '/app_data';\n else if (method === 'resolve') result = args.paths.join('/'); \n } else if (api === 'window') {\n const wm = WindowManager.getInstance();\n const winId = args.id || 'main';\n const methodMapping: Record<string, string> = {\n 'set_title': 'setTitle',\n 'close': 'close',\n 'maximize': 'maximize',\n 'minimize': 'minimize',\n 'focus': 'focus'\n };\n\n if (method === 'close') {\n wm.close(winId);\n } else if (method === 'focus') {\n wm.focus(winId);\n } else if (method === 'set_title') {\n const win = wm.getWindow(winId);\n if (win) win.setTitle(args.title);\n }\n }\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n }\n\n this.worker.postMessage({\n type: 'MAIN_THREAD_RESPONSE',\n id,\n payload: result,\n error\n });\n }\n\n public terminate() {\n this.worker.terminate();\n }\n}\n","/**\n * Tauri's frontend APIs (like `invoke`) pass a callback function to the backend.\n * Because functions cannot be serialized to the Web Worker, we store them in this\n * registry and pass a numeric ID to the backend instead.\n * \n * When the backend replies, it targets the numeric ID, and we trigger the real\n * JS function here.\n */\nexport class CallbackRegistry {\n private count = 0;\n private registry = new Map<number, { fn: Function; once: boolean }>();\n\n /**\n * Register a function and return its unique numerical ID.\n */\n register(fn: Function, once: boolean): number {\n const id = ++this.count;\n this.registry.set(id, { fn, once });\n return id;\n }\n\n /**\n * Trigger the callback with given payload.\n * If `once` was true, the callback is removed immediately.\n */\n trigger(id: number, payload: unknown): void {\n const entry = this.registry.get(id);\n if (!entry) {\n console.warn(`[R1 IPC] Attempted to trigger unknown callback id: ${id}`);\n return;\n }\n\n try {\n entry.fn(payload);\n } catch (e) {\n console.error(`[R1 IPC] Error inside callback ${id}:`, e);\n }\n\n if (entry.once) {\n this.registry.delete(id);\n }\n }\n\n /** Remove a callback completely */\n delete(id: number): void {\n this.registry.delete(id);\n }\n}\n","import type { KernelProxy } from './kernel-proxy';\nimport { CallbackRegistry } from './callback-registry';\nimport { appWindow } from '@r1-runtime/apis/window';\n\n/**\n * Patches the browser `window` to intercept Tauri frontend library calls\n * and route them to our Kernel Worker instead of the native Rust backend.\n */\nexport function installIpcBridge(kernelProxy: KernelProxy): void {\n const callbacks = new CallbackRegistry();\n\n // Make the registry available globally so Kernel responses can trigger them\n // (We'll use this in Phase 7 for events, or we route them back via the proxy resolving)\n (window as any).__R1_CALLBACKS__ = callbacks;\n\n // Numeric ID registry for unlisten functions\n const eventListeners = new Map<number, { event: string, unlisten: () => void }>();\n let nextListenerId = 1;\n\n // --------------------------------------------------------------------------\n // TAURI v2 BRIDGE\n // --------------------------------------------------------------------------\n (window as any).__TAURI_INTERNALS__ = {\n /**\n * Replaces V2 `invoke(cmd, args)`.\n */\n invoke: async (command: string, args: unknown = {}) => {\n // The protocol format requires an 'IPC_INVOKE' type.\n const payload = { command, args };\n // The kernel router will catch errors and reject the proxy Promise,\n // so we don't need manual try/catch here; it natively maps to Tauri's promise rejection.\n return kernelProxy.send('IPC_INVOKE', payload);\n },\n\n /**\n * Converts a JS function into a numeric ID passable to Rust.\n */\n transformCallback: (callback: Function, once = false) => {\n return callbacks.register(callback, once);\n },\n\n /**\n * listen() for global events.\n */\n listen: (event: string, handler: Function) => {\n const id = nextListenerId++;\n const unlisten = kernelProxy.eventBus.on(event, handler);\n eventListeners.set(id, { event, unlisten });\n \n const unlistenWrapper = () => {\n unlisten();\n eventListeners.delete(id);\n };\n // Tauri v2 returns a Promise<UnlistenFn>\n return Promise.resolve(unlistenWrapper);\n },\n\n /**\n * once() for global events.\n */\n once: (event: string, handler: Function) => {\n const id = nextListenerId++;\n const unlisten = kernelProxy.eventBus.once(event, handler);\n eventListeners.set(id, { event, unlisten });\n \n const unlistenWrapper = () => {\n unlisten();\n eventListeners.delete(id);\n };\n return Promise.resolve(unlistenWrapper);\n },\n\n /**\n * unlisten() by numeric ID (Tauri v1 style).\n */\n unlisten: (event: string, id: number) => {\n const entry = eventListeners.get(id);\n if (entry && entry.event === event) {\n entry.unlisten();\n eventListeners.delete(id);\n }\n return Promise.resolve();\n }\n };\n\n // --------------------------------------------------------------------------\n // TAURI v1 BRIDGE\n // --------------------------------------------------------------------------\n (window as any).__TAURI_IPC__ = async (message: {\n cmd: string;\n callback?: number;\n error?: number;\n [key: string]: unknown;\n }) => {\n const { cmd, callback, error, ...args } = message;\n\n try {\n // Route the command via KernelProxy\n const response = await kernelProxy.send('IPC_INVOKE', { command: cmd, args });\n \n // If success and a success callback is registered, trigger it\n if (typeof callback === 'number') {\n callbacks.trigger(callback, response);\n }\n } catch (err) {\n // If failure and an error callback is registered, trigger it\n if (typeof error === 'number') {\n callbacks.trigger(error, err instanceof Error ? err.message : String(err));\n } else {\n // If no error callback, we must log it so it doesn't vanish silently.\n console.error(`[R1 IPC] Unhandled error from Tauri V1 invoke('${cmd}'):`, err);\n }\n }\n };\n\n // --------------------------------------------------------------------------\n // GLOBAL OBJECT INJECTIONS\n // --------------------------------------------------------------------------\n\n // Tauri v2 structure\n (window as any).__TAURI__ = (window as any).__TAURI__ || {};\n (window as any).__TAURI__.window = (window as any).__TAURI__.window || {};\n \n // Make appWindow available globally so apps that access it\n // via window.__TAURI_INTERNALS__ also work\n (window as any).__TAURI_INTERNALS__.appWindow = appWindow;\n (window as any).__TAURI__.window = { appWindow };\n\n // Polyfill convertFileSrc (used for loading local assets into <img> tags)\n // In the browser/service-worker runtime, we just return the path as-is\n // and the Service Worker intercepts it.\n (window as any).__TAURI__.core = (window as any).__TAURI__.core || {};\n (window as any).__TAURI__.core.convertFileSrc = (path: string) => path;\n (window as any).__TAURI_INTERNALS__.convertFileSrc = (path: string) => path;\n}\n","import { KernelProxy } from './kernel-proxy';\nimport { installIpcBridge } from './ipc-bridge';\n\nexport class R1Runtime {\n private kernelProxy: KernelProxy | null = null;\n\n /**\n * Boots the R1 Runtime. Must be called before any Tauri APIs are invoked.\n * \n * @param options - Boot options including WASM and Worker paths.\n */\n async boot(options: { wasmPath?: string, workerUrl?: string, swUrl?: string } = {}): Promise<void> {\n // Step 1 — Request persistent storage\n // Without this, the browser can silently delete OPFS data when\n // the device runs low on storage. This call prevents eviction.\n await this.requestPersistentStorage();\n\n const { wasmPath, workerUrl = '/sw.js', swUrl = '/r1-sw.js' } = options;\n \n // Check if another instance (possibly from a duplicated module) is already booting\n const win = window as any;\n if (this.kernelProxy || win.__R1_KERNEL_PROXY__) {\n this.kernelProxy = this.kernelProxy || win.__R1_KERNEL_PROXY__;\n return;\n }\n\n try {\n // Set global booting state immediately\n win.__R1_BOOT_STATUS__ = 'booting';\n console.log('[R1] Booting Kernel...');\n \n // 1. Spawn Kernel Worker\n this.kernelProxy = new KernelProxy(workerUrl);\n win.__R1_KERNEL_PROXY__ = this.kernelProxy;\n\n // 2. Install IPC Bridge\n installIpcBridge(this.kernelProxy);\n\n // 3. Register Service Worker interception\n if ('serviceWorker' in navigator) {\n try {\n // Add a timeout to SW registration to prevent hangs\n const swPromise = navigator.serviceWorker.register(swUrl, { scope: '/' });\n const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('SW registration timeout')), 3000));\n \n await Promise.race([swPromise, timeoutPromise]);\n console.log('[R1] Service Worker registered.');\n } catch (e) {\n console.warn('[R1] SW registration skipped or failed:', e);\n // Non-fatal, but we should track it\n }\n }\n\n // 4. Load developer WASM if provided\n if (wasmPath) {\n console.log(`[R1] Loading WASM from ${wasmPath}...`);\n await this.kernelProxy.send('WASM_LOAD', { name: 'main', url: wasmPath });\n }\n\n win.__R1_BOOT_STATUS__ = 'ready';\n console.log('[R1] Boot complete.');\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n win.__R1_BOOT_STATUS__ = 'error';\n win.__R1_BOOT_ERROR__ = msg;\n console.error('[R1] Boot failed:', err);\n window.dispatchEvent(new CustomEvent('r1:error', { detail: msg }));\n throw err;\n }\n }\n\n isBooted(): boolean {\n return (window as any).__R1_BOOT_STATUS__ === 'ready';\n }\n\n async invoke(type: string, payload: any): Promise<any> {\n return this.kernel.send(type, payload);\n }\n\n /** Get direct access to the kernel proxy if needed internally */\n get kernel(): KernelProxy {\n const proxy = this.kernelProxy || (window as any).__R1_KERNEL_PROXY__;\n if (!proxy) throw new Error('[R1] Runtime not booted.');\n return proxy;\n }\n\n private async requestPersistentStorage(): Promise<void> {\n if (!navigator.storage) return;\n\n try {\n // Check if already persisted\n const alreadyPersisted = await navigator.storage.persisted();\n if (alreadyPersisted) {\n console.log('[R1] Storage: persistent ✓');\n return;\n }\n\n // Request persistence\n const granted = await navigator.storage.persist();\n\n if (granted) {\n console.log('[R1] Storage: persistent ✓');\n } else {\n console.warn(\n '[R1] Storage: best-effort only. ' +\n 'Data may be cleared by the browser when storage is low. ' +\n 'Bookmark this page or install it as a PWA for reliable storage.'\n );\n }\n } catch (err) {\n // Silently fail — browser may not support the API\n console.warn('[R1] Storage: persistence API not available', err);\n }\n }\n\n /** @internal FOR TESTING ONLY */\n static __TEST_RESET__() {\n const win = window as any;\n delete win.__R1_KERNEL_PROXY__;\n delete win.__R1_BOOT_STATUS__;\n }\n}\n"],"names":[],"mappings":"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"}
{
"name": "@r1-runtime/core",
"version": "0.3.1",
"version": "0.3.2",
"description": "Main thread runtime for R1 — IPC bridge, EventBus, and boot synchronization.",

@@ -39,3 +39,3 @@ "type": "module",

"dependencies": {
"@r1-runtime/apis": "^0.3.0"
"@r1-runtime/apis": "^0.3.2"
},

@@ -42,0 +42,0 @@ "devDependencies": {