@iota-uz/sdk 0.4.12 → 0.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":["createRoot","jsx"],"mappings":"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","file":"host.cjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const anyGlobal = globalThis as any\n anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: err,\n })\n throw err\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<any>\n MemoryRouter: React.ComponentType<any>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}
1
+ {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":["createRoot","jsx"],"mappings":"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","file":"host.cjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const abortController = timeoutMs > 0 ? new AbortController() : undefined\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n let timedOut = false\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n abortController.abort()\n }, timeoutMs)\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n let rpcErr: unknown = err\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n })\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n })\n throw rpcErr\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}
@@ -40,6 +40,7 @@ type AppletRPCSchema = Record<string, {
40
40
  interface CreateAppletRPCClientOptions {
41
41
  endpoint: string;
42
42
  fetcher?: typeof fetch;
43
+ timeoutMs?: number;
43
44
  }
44
45
  declare function createAppletRPCClient(options: CreateAppletRPCClientOptions): {
45
46
  call: <TParams, TResult>(method: string, params: TParams) => Promise<TResult>;
@@ -50,8 +51,8 @@ type RouterMode = 'url' | 'memory';
50
51
  interface CreateAppletRouterOptions {
51
52
  mode: RouterMode;
52
53
  basePath?: string;
53
- BrowserRouter: react__default.ComponentType<any>;
54
- MemoryRouter: react__default.ComponentType<any>;
54
+ BrowserRouter: react__default.ComponentType<Record<string, unknown>>;
55
+ MemoryRouter: react__default.ComponentType<Record<string, unknown>>;
55
56
  }
56
57
  declare function createAppletRouter(options: CreateAppletRouterOptions): {
57
58
  Router: react__default.FC<{
@@ -40,6 +40,7 @@ type AppletRPCSchema = Record<string, {
40
40
  interface CreateAppletRPCClientOptions {
41
41
  endpoint: string;
42
42
  fetcher?: typeof fetch;
43
+ timeoutMs?: number;
43
44
  }
44
45
  declare function createAppletRPCClient(options: CreateAppletRPCClientOptions): {
45
46
  call: <TParams, TResult>(method: string, params: TParams) => Promise<TResult>;
@@ -50,8 +51,8 @@ type RouterMode = 'url' | 'memory';
50
51
  interface CreateAppletRouterOptions {
51
52
  mode: RouterMode;
52
53
  basePath?: string;
53
- BrowserRouter: react__default.ComponentType<any>;
54
- MemoryRouter: react__default.ComponentType<any>;
54
+ BrowserRouter: react__default.ComponentType<Record<string, unknown>>;
55
+ MemoryRouter: react__default.ComponentType<Record<string, unknown>>;
55
56
  }
56
57
  declare function createAppletRouter(options: CreateAppletRouterOptions): {
57
58
  Router: react__default.FC<{
@@ -137,9 +137,9 @@ function defineReactAppletElement(options) {
137
137
  customElements.define(tagName, ReactAppletElement);
138
138
  }
139
139
  function getRegistry() {
140
- const anyGlobal = globalThis;
141
- anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ ?? (anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ = /* @__PURE__ */ new Map());
142
- return anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__;
140
+ const g = globalThis;
141
+ g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ?? (g.__IOTA_REACT_APPLET_HOST_REGISTRY__ = /* @__PURE__ */ new Map());
142
+ return g.__IOTA_REACT_APPLET_HOST_REGISTRY__;
143
143
  }
144
144
 
145
145
  // ui/src/applet-devtools/enabled.ts
@@ -166,19 +166,30 @@ var AppletRPCException = class extends Error {
166
166
  };
167
167
  function createAppletRPCClient(options) {
168
168
  const fetcher = options.fetcher ?? fetch;
169
+ const timeoutMs = typeof options.timeoutMs === "number" && options.timeoutMs > 0 ? options.timeoutMs : 0;
169
170
  async function call(method, params) {
170
171
  const req = { id: crypto.randomUUID(), method, params };
171
172
  const startedAt = typeof performance !== "undefined" ? performance.now() : Date.now();
173
+ const abortController = timeoutMs > 0 ? new AbortController() : void 0;
174
+ let timeoutHandle;
175
+ let timedOut = false;
172
176
  maybeDispatchRPCEvent({
173
177
  id: req.id,
174
178
  method: req.method,
175
179
  status: "start"
176
180
  });
177
181
  try {
182
+ if (abortController) {
183
+ timeoutHandle = setTimeout(() => {
184
+ timedOut = true;
185
+ abortController.abort();
186
+ }, timeoutMs);
187
+ }
178
188
  const resp = await fetcher(options.endpoint, {
179
189
  method: "POST",
180
190
  headers: { "Content-Type": "application/json" },
181
- body: JSON.stringify(req)
191
+ body: JSON.stringify(req),
192
+ signal: abortController?.signal
182
193
  });
183
194
  if (!resp.ok) {
184
195
  throw new AppletRPCException({
@@ -209,14 +220,26 @@ function createAppletRPCClient(options) {
209
220
  });
210
221
  return json.result;
211
222
  } catch (err) {
223
+ let rpcErr = err;
224
+ if (err instanceof Error && err.name === "AbortError") {
225
+ rpcErr = new AppletRPCException({
226
+ code: timedOut ? "timeout" : "aborted",
227
+ message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : "RPC request was aborted",
228
+ cause: err
229
+ });
230
+ }
212
231
  maybeDispatchRPCEvent({
213
232
  id: req.id,
214
233
  method: req.method,
215
234
  status: "error",
216
235
  durationMs: elapsedMs(startedAt),
217
- error: err
236
+ error: rpcErr
218
237
  });
219
- throw err;
238
+ throw rpcErr;
239
+ } finally {
240
+ if (timeoutHandle !== void 0) {
241
+ clearTimeout(timeoutHandle);
242
+ }
220
243
  }
221
244
  }
222
245
  async function callTyped(method, params) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":[],"mappings":"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","file":"host.mjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const anyGlobal = globalThis as any\n anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return anyGlobal.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: err,\n })\n throw err\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<any>\n MemoryRouter: React.ComponentType<any>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}
1
+ {"version":3,"sources":["../../ui/src/applet-host/react-element.ts","../../ui/src/applet-devtools/enabled.ts","../../ui/src/applet-host/rpc.ts","../../ui/src/applet-host/router.tsx"],"names":[],"mappings":"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","file":"host.mjs","sourcesContent":["import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const abortController = timeoutMs > 0 ? new AbortController() : undefined\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n let timedOut = false\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n abortController.abort()\n }, timeoutMs)\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n let rpcErr: unknown = err\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n })\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n })\n throw rpcErr\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n"]}