@nextop-os/browser-node 0.0.20 → 0.0.21
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.
|
@@ -90,6 +90,7 @@ declare function registerBrowserNodeElectronMain(input: RegisterBrowserNodeElect
|
|
|
90
90
|
|
|
91
91
|
interface BrowserWebviewSecurityInput {
|
|
92
92
|
params: Record<string, string>;
|
|
93
|
+
resolvePreload?: BrowserWebviewPreloadResolver;
|
|
93
94
|
webPreferences: WebPreferences;
|
|
94
95
|
}
|
|
95
96
|
interface BrowserWebviewSecurityResult {
|
|
@@ -97,15 +98,20 @@ interface BrowserWebviewSecurityResult {
|
|
|
97
98
|
reason: string | null;
|
|
98
99
|
}
|
|
99
100
|
type BrowserNodeWebviewMatcher = (params: Record<string, string>) => boolean;
|
|
101
|
+
interface BrowserWebviewPreloadResolverInput {
|
|
102
|
+
params: Readonly<Record<string, string>>;
|
|
103
|
+
}
|
|
104
|
+
type BrowserWebviewPreloadResolver = (input: BrowserWebviewPreloadResolverInput) => string | null | undefined;
|
|
100
105
|
declare function isBrowserNodeWebviewAttach(params: Record<string, string>): boolean;
|
|
101
|
-
declare function enforceBrowserWebviewSecurity({ params, webPreferences }: BrowserWebviewSecurityInput): BrowserWebviewSecurityResult;
|
|
106
|
+
declare function enforceBrowserWebviewSecurity({ params, resolvePreload, webPreferences }: BrowserWebviewSecurityInput): BrowserWebviewSecurityResult;
|
|
102
107
|
interface InstallBrowserWebviewSecurityInput {
|
|
103
108
|
contents: WebContents;
|
|
104
109
|
logger?: BrowserNodeElectronLogger;
|
|
105
110
|
onGuestAttached?: (guestContents: WebContents) => void;
|
|
106
111
|
openExternal: (url: string) => Promise<void> | void;
|
|
112
|
+
resolvePreload?: BrowserWebviewPreloadResolver;
|
|
107
113
|
shouldHandleWebview?: BrowserNodeWebviewMatcher;
|
|
108
114
|
}
|
|
109
|
-
declare function installBrowserWebviewSecurity({ contents, logger, onGuestAttached, openExternal, shouldHandleWebview }: InstallBrowserWebviewSecurityInput): () => void;
|
|
115
|
+
declare function installBrowserWebviewSecurity({ contents, logger, onGuestAttached, openExternal, resolvePreload, shouldHandleWebview }: InstallBrowserWebviewSecurityInput): () => void;
|
|
110
116
|
|
|
111
|
-
export { type BrowserNodeElectronLogger, type BrowserNodeElectronMainChannels, type BrowserNodeLoopbackPreviewResolver, type BrowserNodeLoopbackPreviewRoutingOptions, type BrowserNodeLoopbackPreviewTarget, type BrowserNodeWebviewMatcher, type BrowserWebviewSecurityInput, type BrowserWebviewSecurityResult, type InstallBrowserWebviewSecurityInput, type RegisterBrowserNodeElectronMainInput, enforceBrowserWebviewSecurity, installBrowserWebviewSecurity, isBrowserNodeWebviewAttach, registerBrowserNodeElectronMain };
|
|
117
|
+
export { type BrowserNodeElectronLogger, type BrowserNodeElectronMainChannels, type BrowserNodeLoopbackPreviewResolver, type BrowserNodeLoopbackPreviewRoutingOptions, type BrowserNodeLoopbackPreviewTarget, type BrowserNodeWebviewMatcher, type BrowserWebviewPreloadResolver, type BrowserWebviewPreloadResolverInput, type BrowserWebviewSecurityInput, type BrowserWebviewSecurityResult, type InstallBrowserWebviewSecurityInput, type RegisterBrowserNodeElectronMainInput, enforceBrowserWebviewSecurity, installBrowserWebviewSecurity, isBrowserNodeWebviewAttach, registerBrowserNodeElectronMain };
|
|
@@ -943,6 +943,7 @@ function isBrowserNodeWebviewAttach(params) {
|
|
|
943
943
|
}
|
|
944
944
|
function enforceBrowserWebviewSecurity({
|
|
945
945
|
params,
|
|
946
|
+
resolvePreload,
|
|
946
947
|
webPreferences
|
|
947
948
|
}) {
|
|
948
949
|
webPreferences.allowRunningInsecureContent = false;
|
|
@@ -968,6 +969,11 @@ function enforceBrowserWebviewSecurity({
|
|
|
968
969
|
};
|
|
969
970
|
}
|
|
970
971
|
params.src = resolved.url;
|
|
972
|
+
const preload = resolvePreload?.({ params: { ...params } });
|
|
973
|
+
const resolvedPreload = typeof preload === "string" ? preload.trim() : "";
|
|
974
|
+
if (resolvedPreload.length > 0) {
|
|
975
|
+
webPreferences.preload = resolvedPreload;
|
|
976
|
+
}
|
|
971
977
|
return { allowed: true, reason: null };
|
|
972
978
|
}
|
|
973
979
|
function installBrowserWebviewSecurity({
|
|
@@ -975,6 +981,7 @@ function installBrowserWebviewSecurity({
|
|
|
975
981
|
logger,
|
|
976
982
|
onGuestAttached,
|
|
977
983
|
openExternal,
|
|
984
|
+
resolvePreload,
|
|
978
985
|
shouldHandleWebview = isBrowserNodeWebviewAttach
|
|
979
986
|
}) {
|
|
980
987
|
let pendingBrowserAttachCount = 0;
|
|
@@ -983,7 +990,11 @@ function installBrowserWebviewSecurity({
|
|
|
983
990
|
return;
|
|
984
991
|
}
|
|
985
992
|
pendingBrowserAttachCount += 1;
|
|
986
|
-
const result = enforceBrowserWebviewSecurity({
|
|
993
|
+
const result = enforceBrowserWebviewSecurity({
|
|
994
|
+
params,
|
|
995
|
+
resolvePreload,
|
|
996
|
+
webPreferences
|
|
997
|
+
});
|
|
987
998
|
if (!result.allowed) {
|
|
988
999
|
pendingBrowserAttachCount = Math.max(0, pendingBrowserAttachCount - 1);
|
|
989
1000
|
logger?.warn?.("Browser Node webview blocked", { reason: result.reason });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/electron-main/loopbackPreviewProxy.ts","../../src/electron-main/guestManager.ts","../../src/electron-main/registerElectronMain.ts","../../src/electron-main/webviewSecurity.ts"],"sourcesContent":["import {\n createServer,\n request as httpRequest,\n type IncomingHttpHeaders,\n type IncomingMessage,\n type Server,\n type ServerResponse\n} from \"node:http\";\nimport { request as httpsRequest } from \"node:https\";\nimport { createRequire } from \"node:module\";\nimport type { Socket } from \"node:net\";\nimport { pipeline } from \"node:stream\";\nimport type WebSocketType from \"ws\";\nimport type { RawData, WebSocketServer as WebSocketServerType } from \"ws\";\nimport type { BrowserNodeSessionMode } from \"../core/types.ts\";\nimport type {\n BrowserNodeLoopbackPreviewRoutingOptions,\n BrowserNodeLoopbackPreviewTarget\n} from \"./loopbackPreview.ts\";\nimport type { BrowserNodeElectronLogger } from \"./types.ts\";\n\nconst require = createRequire(import.meta.url);\ntype WsModule = typeof WebSocketType & {\n WebSocketServer: typeof WebSocketServerType;\n};\nconst wsModule = require(\"ws\") as unknown as WsModule;\nconst WebSocket = wsModule;\nconst { WebSocketServer } = wsModule;\n\nconst defaultLoopbackPreviewCacheTtlMs = 30_000;\nconst loopbackHostPattern = /^(localhost|127(?:\\.\\d{1,3}){0,3})$/i;\n// Order matters: bypass all, subtract loopback so local previews can proxy,\n// then keep HTTPS/WSS direct because this proxy does not implement CONNECT.\nconst loopbackPreviewProxyBypassRules = \"*;<-loopback>;https://*;wss://*\";\nconst hopByHopHeaders = new Set([\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\"\n]);\n\ninterface CachedLoopbackPreviewTarget {\n expiresAt: number;\n target: BrowserNodeLoopbackPreviewTarget | null;\n}\n\nexport interface BrowserNodePreviewSession {\n setProxy(input: {\n mode: \"fixed_servers\";\n proxyBypassRules: string;\n proxyRules: string;\n }): Promise<void>;\n}\n\nexport interface BrowserNodeLoopbackPreviewProxy {\n configureSession(input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }): Promise<void>;\n dispose(): Promise<void>;\n addressForTesting(): string;\n serverForTesting(): Server;\n}\n\nexport interface BrowserNodeLoopbackPreviewProxyInput {\n logger?: BrowserNodeElectronLogger;\n resolveSession: (input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }) => BrowserNodePreviewSession | Promise<BrowserNodePreviewSession>;\n routing: BrowserNodeLoopbackPreviewRoutingOptions;\n}\n\nexport function createBrowserNodeLoopbackPreviewProxy({\n logger,\n resolveSession,\n routing\n}: BrowserNodeLoopbackPreviewProxyInput): BrowserNodeLoopbackPreviewProxy {\n const configuredSessions = new WeakSet<BrowserNodePreviewSession>();\n const targetCache = new Map<string, CachedLoopbackPreviewTarget>();\n const downstreamWebSocketServer = new WebSocketServer({ noServer: true });\n let server: Server | null = null;\n let serverStartPromise: Promise<string> | null = null;\n\n const cacheTtlMs = routing.cacheTtlMs ?? defaultLoopbackPreviewCacheTtlMs;\n const fallback = routing.fallback ?? \"direct\";\n\n const pruneExpiredTargets = (now: number): void => {\n for (const [cacheKey, cachedTarget] of targetCache.entries()) {\n if (cachedTarget.expiresAt <= now) {\n targetCache.delete(cacheKey);\n }\n }\n };\n\n const start = async (): Promise<string> => {\n if (server?.listening) {\n return addressForTesting();\n }\n if (serverStartPromise) {\n return serverStartPromise;\n }\n\n serverStartPromise = new Promise<string>((resolve, reject) => {\n const nextServer = createServer((request, response) => {\n void handleRequest(request, response);\n });\n nextServer.on(\"upgrade\", (request, socket, head) => {\n void handleUpgrade(request, socket as Socket, head);\n });\n\n const cleanup = (): void => {\n nextServer.removeListener(\"error\", onError);\n nextServer.removeListener(\"listening\", onListening);\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n const onListening = (): void => {\n cleanup();\n server = nextServer;\n resolve(addressForTesting());\n };\n\n nextServer.once(\"error\", onError);\n nextServer.once(\"listening\", onListening);\n nextServer.listen(0, \"127.0.0.1\");\n }).finally(() => {\n serverStartPromise = null;\n });\n\n return serverStartPromise;\n };\n\n const resolveLoopbackTarget = async (\n originalUrl: URL\n ): Promise<BrowserNodeLoopbackPreviewTarget | null> => {\n const port = Number(originalUrl.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return null;\n }\n\n const now = Date.now();\n pruneExpiredTargets(now);\n\n const cacheKey = originalUrl.toString();\n const cached = targetCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.target;\n }\n\n const nextTarget = await Promise.resolve(\n routing.resolver.resolveTarget({\n port,\n url: originalUrl.toString()\n })\n );\n\n const target = normalizeLoopbackPreviewTarget(nextTarget);\n targetCache.set(cacheKey, {\n expiresAt: now + Math.max(0, cacheTtlMs),\n target\n });\n return target;\n };\n\n const configureSession = async (input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }): Promise<void> => {\n const nextSession = await resolveSession(input);\n if (configuredSessions.has(nextSession)) {\n return;\n }\n const address = await start();\n await nextSession.setProxy({\n mode: \"fixed_servers\",\n proxyBypassRules: loopbackPreviewProxyBypassRules,\n proxyRules: `http=${address}`\n });\n configuredSessions.add(nextSession);\n };\n\n const dispose = async (): Promise<void> => {\n targetCache.clear();\n downstreamWebSocketServer.close();\n const activeServer = server;\n server = null;\n if (!activeServer || !activeServer.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n activeServer.close(() => resolve());\n });\n };\n\n const handleRequest = async (\n request: IncomingMessage,\n response: ServerResponse\n ): Promise<void> => {\n const originalUrl = resolveProxyRequestUrl(request);\n if (!originalUrl) {\n response.writeHead(400);\n response.end(\"invalid proxy request\");\n return;\n }\n if (originalUrl.protocol !== \"http:\") {\n response.writeHead(400);\n response.end(\"unsupported proxy request\");\n return;\n }\n\n const targetContext = await resolveTargetRequestContext(originalUrl);\n if (!targetContext.targetUrl) {\n response.writeHead(502);\n response.end(\"unable to resolve loopback preview target\");\n return;\n }\n\n const headers = filterProxyHeaders(request.headers);\n headers.set(\"host\", targetContext.targetUrl.host);\n\n const forward =\n targetContext.targetUrl.protocol === \"https:\"\n ? httpsRequest\n : httpRequest;\n const upstream = forward(\n targetContext.targetUrl,\n {\n headers: Object.fromEntries(headers.entries()),\n method: request.method\n },\n (upstreamResponse) => {\n const responseHeaders = filterProxyHeaders(upstreamResponse.headers);\n const location = responseHeaders.get(\"location\");\n if (location && targetContext.loopbackTarget) {\n const rewritten = rewriteLoopbackLocation({\n location,\n originalUrl,\n targetUrl: targetContext.loopbackTarget.targetUrl\n });\n if (rewritten) {\n responseHeaders.set(\"location\", rewritten);\n }\n }\n\n response.writeHead(\n upstreamResponse.statusCode ?? 502,\n upstreamResponse.statusMessage,\n Object.fromEntries(responseHeaders.entries())\n );\n pipeline(upstreamResponse, response, () => undefined);\n }\n );\n\n upstream.on(\"error\", (error) => {\n logger?.warn?.(\"Browser Node loopback preview request failed\", {\n error: normalizeProxyError(error),\n originalUrl: originalUrl.toString(),\n targetUrl: targetContext.targetUrl?.toString() ?? null,\n workspaceId: targetContext.loopbackTarget?.workspaceId ?? null\n });\n if (!response.headersSent) {\n response.writeHead(502);\n }\n response.end(\n `loopback preview upstream request failed: ${normalizeProxyError(error)}`\n );\n });\n\n pipeline(request, upstream, () => undefined);\n };\n\n const handleUpgrade = async (\n request: IncomingMessage,\n socket: Socket,\n head: Buffer\n ): Promise<void> => {\n const originalUrl = resolveProxyRequestUrl(request, \"ws:\");\n if (!originalUrl) {\n socket.destroy();\n return;\n }\n if (originalUrl.protocol !== \"ws:\") {\n socket.destroy();\n return;\n }\n\n const targetContext = await resolveTargetRequestContext(originalUrl);\n const targetUrl = targetContext.targetUrl;\n if (!targetUrl) {\n socket.destroy();\n return;\n }\n\n downstreamWebSocketServer.handleUpgrade(\n request,\n socket,\n head,\n (downstream) => {\n const headers = Object.fromEntries(\n filterProxyHeaders(request.headers).entries()\n );\n headers.host = targetUrl.host;\n\n const upstream = new WebSocket(targetUrl, { headers });\n const pendingMessages: Array<{ data: RawData; isBinary: boolean }> = [];\n\n downstream.on(\"message\", (data, isBinary) => {\n if (upstream.readyState === WebSocket.OPEN) {\n upstream.send(data, { binary: isBinary });\n return;\n }\n pendingMessages.push({ data, isBinary });\n });\n\n upstream.once(\"open\", () => {\n for (const nextMessage of pendingMessages.splice(0)) {\n upstream.send(nextMessage.data, { binary: nextMessage.isBinary });\n }\n });\n\n upstream.on(\"message\", (data, isBinary) => {\n if (downstream.readyState === WebSocket.OPEN) {\n downstream.send(data, { binary: isBinary });\n }\n });\n\n upstream.once(\"close\", (code, reason) => {\n if (\n downstream.readyState === WebSocket.OPEN ||\n downstream.readyState === WebSocket.CONNECTING\n ) {\n downstream.close(normalizeWebSocketCloseCode(code), reason);\n }\n });\n\n downstream.once(\"close\", (code, reason) => {\n if (\n upstream.readyState === WebSocket.OPEN ||\n upstream.readyState === WebSocket.CONNECTING\n ) {\n upstream.close(normalizeWebSocketCloseCode(code), reason);\n }\n });\n\n upstream.once(\"error\", (error) => {\n logger?.warn?.(\"Browser Node loopback preview websocket failed\", {\n error: normalizeProxyError(error),\n originalUrl: originalUrl.toString(),\n targetUrl: targetContext.targetUrl?.toString() ?? null,\n workspaceId: targetContext.loopbackTarget?.workspaceId ?? null\n });\n downstream.close(1011, \"loopback preview websocket upstream failed\");\n });\n }\n );\n };\n\n const resolveTargetRequestContext = async (\n originalUrl: URL\n ): Promise<{\n loopbackTarget: BrowserNodeLoopbackPreviewTarget | null;\n targetUrl: URL | null;\n }> => {\n if (!isLoopbackUrl(originalUrl)) {\n return {\n loopbackTarget: null,\n targetUrl: null\n };\n }\n\n const loopbackTarget = await resolveLoopbackTarget(originalUrl);\n if (loopbackTarget) {\n return {\n loopbackTarget,\n targetUrl: buildTargetRequestUrl(loopbackTarget.targetUrl, originalUrl)\n };\n }\n\n if (fallback === \"direct\") {\n return {\n loopbackTarget: null,\n targetUrl: cloneUrl(originalUrl)\n };\n }\n\n return {\n loopbackTarget: null,\n targetUrl: null\n };\n };\n\n const addressForTesting = (): string => {\n const address = server?.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Browser Node loopback preview proxy is not listening\");\n }\n return `127.0.0.1:${address.port}`;\n };\n\n const serverForTesting = (): Server => {\n if (!server) {\n throw new Error(\"Browser Node loopback preview proxy is not started\");\n }\n return server;\n };\n\n return {\n addressForTesting,\n configureSession,\n dispose,\n serverForTesting\n };\n}\n\nfunction normalizeLoopbackPreviewTarget(\n input: BrowserNodeLoopbackPreviewTarget | null | undefined\n): BrowserNodeLoopbackPreviewTarget | null {\n if (!input) {\n return null;\n }\n const normalizedTargetUrl = input.targetUrl.trim();\n if (normalizedTargetUrl.length === 0) {\n return null;\n }\n try {\n const parsed = new URL(normalizedTargetUrl);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n return {\n targetUrl: parsed.toString(),\n workspaceId: input.workspaceId\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveProxyRequestUrl(\n request: IncomingMessage,\n defaultProtocol = \"http:\"\n): URL | null {\n const rawUrl = request.url ?? \"\";\n try {\n if (/^[a-z][a-z\\d+\\-.]*:\\/\\//i.test(rawUrl)) {\n return new URL(rawUrl);\n }\n const host = request.headers.host;\n if (typeof host !== \"string\" || host.trim().length === 0) {\n return null;\n }\n const path = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return new URL(`${defaultProtocol}//${host}${path}`);\n } catch {\n return null;\n }\n}\n\nfunction filterProxyHeaders(input: Headers | IncomingHttpHeaders): Headers {\n const output = new Headers();\n const appendValue = (key: string, value: string): void => {\n if (hopByHopHeaders.has(key.toLowerCase())) {\n return;\n }\n output.append(key, value);\n };\n\n if (input instanceof Headers) {\n input.forEach((value, key) => {\n appendValue(key, value);\n });\n return output;\n }\n\n for (const [key, value] of Object.entries(input)) {\n if (Array.isArray(value)) {\n for (const nextValue of value) {\n appendValue(key, nextValue);\n }\n continue;\n }\n if (typeof value === \"string\") {\n appendValue(key, value);\n }\n }\n return output;\n}\n\nfunction isLoopbackUrl(url: URL): boolean {\n return (\n (url.protocol === \"http:\" || url.protocol === \"ws:\") &&\n loopbackHostPattern.test(url.hostname) &&\n url.port.length > 0\n );\n}\n\nfunction buildTargetRequestUrl(\n targetUrl: string,\n originalUrl: URL\n): URL | null {\n try {\n const base = new URL(targetUrl);\n const normalizedBasePath = normalizeBasePath(base.pathname);\n const nextUrl = new URL(base.toString());\n nextUrl.pathname = joinBasePath(normalizedBasePath, originalUrl.pathname);\n nextUrl.search = originalUrl.search;\n nextUrl.hash = \"\";\n if (originalUrl.protocol === \"ws:\") {\n nextUrl.protocol = nextUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n }\n return nextUrl;\n } catch {\n return null;\n }\n}\n\nfunction rewriteLoopbackLocation({\n location,\n originalUrl,\n targetUrl\n}: {\n location: string;\n originalUrl: URL;\n targetUrl: string;\n}): string | null {\n try {\n const targetBase = new URL(targetUrl);\n const resolvedLocation = new URL(location, targetBase);\n if (resolvedLocation.origin !== targetBase.origin) {\n return location;\n }\n\n const basePath = normalizeBasePath(targetBase.pathname);\n const strippedPath =\n stripBasePath(basePath, resolvedLocation.pathname) ??\n resolvedLocation.pathname;\n\n const loopbackUrl = new URL(originalUrl.origin);\n resolvedLocation.protocol = loopbackUrl.protocol;\n resolvedLocation.host = loopbackUrl.host;\n resolvedLocation.pathname = strippedPath;\n resolvedLocation.username = \"\";\n resolvedLocation.password = \"\";\n return resolvedLocation.toString();\n } catch {\n return location;\n }\n}\n\nfunction normalizeBasePath(pathname: string): string {\n const normalized = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`;\n}\n\nfunction joinBasePath(basePath: string, requestPath: string): string {\n const normalizedRequestPath =\n requestPath === \"/\" ? \"\" : requestPath.replace(/^\\/+/, \"\");\n return normalizedRequestPath.length > 0\n ? `${basePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\")\n : basePath;\n}\n\nfunction stripBasePath(basePath: string, pathname: string): string | null {\n const normalizedPath = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (normalizedPath === basePath.slice(0, -1)) {\n return \"/\";\n }\n if (!normalizedPath.startsWith(basePath)) {\n return null;\n }\n const suffix = normalizedPath.slice(basePath.length);\n return suffix.length > 0 ? `/${suffix}` : \"/\";\n}\n\nfunction cloneUrl(url: URL): URL | null {\n try {\n return new URL(url.toString());\n } catch {\n return null;\n }\n}\n\nfunction normalizeProxyError(error: unknown): string {\n if (error instanceof Error) {\n const code =\n typeof (error as NodeJS.ErrnoException).code === \"string\"\n ? ` ${(error as NodeJS.ErrnoException).code}`\n : \"\";\n return `${error.message}${code}`;\n }\n return String(error);\n}\n\nfunction normalizeWebSocketCloseCode(code: number): number {\n if (code === 1000 || (code >= 3000 && code <= 4999)) {\n return code;\n }\n return 1000;\n}\n","import type {\n BrowserNodeLifecycle,\n BrowserNodeRuntimeError,\n BrowserNodeSessionMode\n} from \"../core/types.ts\";\nimport {\n normalizeBrowserComparableUrl,\n resolveBrowserNavigationUrl,\n type BrowserNavigationUrlResolution\n} from \"../core/url.ts\";\nimport type {\n BrowserGuestManager,\n BrowserGuestManagerInput,\n BrowserGuestNativeImage,\n BrowserPreferredColorScheme,\n BrowserGuestWebContents\n} from \"./types.ts\";\n\nconst browserPreviewMaxWidth = 260;\nconst browserPreviewMaxHeight = 170;\nconst abortedNavigationErrorCode = -3;\n\ninterface BrowserGuestSession {\n appliedColorScheme: BrowserPreferredColorScheme | null;\n contents: BrowserGuestWebContents | null;\n desiredUrl: string;\n lifecycle: BrowserNodeLifecycle;\n listeners: Array<{\n event: string;\n listener: (...args: unknown[]) => void;\n }>;\n nodeId: string;\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n webContentsId: number | null;\n}\n\nfunction resolveBrowserNodeUrlError(\n resolved: BrowserNavigationUrlResolution\n): BrowserNodeRuntimeError {\n if (resolved.errorCode === \"invalid-url\") {\n return { code: \"invalid-url\" };\n }\n\n if (resolved.errorCode === \"unsupported-protocol\") {\n return {\n code: \"unsupported-protocol\",\n params: resolved.errorParams\n };\n }\n\n return { code: \"unsupported-url\" };\n}\n\nfunction resizeBrowserPreviewImage(\n image: BrowserGuestNativeImage\n): BrowserGuestNativeImage {\n if (image.isEmpty?.() === true || !image.resize || !image.getSize) {\n return image;\n }\n\n const size = image.getSize();\n if (size.width <= 0 || size.height <= 0) {\n return image;\n }\n\n const scale = Math.min(\n 1,\n browserPreviewMaxWidth / size.width,\n browserPreviewMaxHeight / size.height\n );\n if (scale >= 1) {\n return image;\n }\n\n return image.resize({\n height: Math.max(1, Math.round(size.height * scale)),\n quality: \"good\",\n width: Math.max(1, Math.round(size.width * scale))\n });\n}\n\nfunction isAbortedNavigationError(input: {\n errorCode?: number;\n errorDescription?: string;\n}): boolean {\n return (\n input.errorCode === abortedNavigationErrorCode ||\n input.errorDescription === \"ERR_ABORTED\"\n );\n}\n\nasync function applyPreferredColorSchemeToGuest(\n session: BrowserGuestSession,\n logger: BrowserGuestManagerInput[\"logger\"],\n syncPreferredColorScheme: BrowserGuestManagerInput[\"syncPreferredColorScheme\"],\n scheme: BrowserPreferredColorScheme | null\n): Promise<void> {\n const contents = session.contents;\n if (\n !contents ||\n contents.isDestroyed() ||\n !syncPreferredColorScheme ||\n scheme === null ||\n session.appliedColorScheme === scheme\n ) {\n return;\n }\n\n try {\n await syncPreferredColorScheme(contents, scheme);\n session.appliedColorScheme = scheme;\n } catch (error) {\n session.appliedColorScheme = null;\n logger?.warn?.(\"Browser Node failed to sync guest color scheme\", {\n error: error instanceof Error ? error.message : String(error),\n nodeId: session.nodeId,\n scheme,\n webContentsId: session.webContentsId\n });\n }\n}\n\nexport function createBrowserGuestManager({\n emit,\n getPreferredColorScheme,\n logger,\n openExternal,\n prepareSession,\n resolveWebContents,\n syncPreferredColorScheme,\n subscribePreferredColorScheme\n}: BrowserGuestManagerInput): BrowserGuestManager {\n const sessions = new Map<string, BrowserGuestSession>();\n const nodeIdByWebContentsId = new Map<number, string>();\n let preferredColorScheme = getPreferredColorScheme?.() ?? null;\n\n const getSession = (\n nodeId: string,\n input?: {\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n url?: string;\n }\n ): BrowserGuestSession => {\n const existing = sessions.get(nodeId);\n if (existing) {\n if (input?.profileId !== undefined) {\n existing.profileId = input.profileId;\n }\n if (input?.sessionMode !== undefined) {\n existing.sessionMode = input.sessionMode;\n }\n if (input?.url !== undefined) {\n existing.desiredUrl = input.url;\n }\n return existing;\n }\n\n const session: BrowserGuestSession = {\n appliedColorScheme: null,\n contents: null,\n desiredUrl: input?.url ?? \"about:blank\",\n lifecycle: \"cold\",\n listeners: [],\n nodeId,\n profileId: input?.profileId ?? null,\n sessionMode: input?.sessionMode ?? \"shared\",\n webContentsId: null\n };\n sessions.set(nodeId, session);\n return session;\n };\n\n const publishState = (session: BrowserGuestSession): void => {\n const contents =\n session.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n emit({\n canGoBack: contents ? contents.canGoBack() : false,\n canGoForward: contents ? contents.canGoForward() : false,\n isAttachedToWindow: Boolean(contents),\n isLoading: contents ? contents.isLoading() : false,\n isOccluded: session.lifecycle === \"cold\",\n lifecycle: session.lifecycle,\n nodeId: session.nodeId,\n title: contents ? contents.getTitle() || null : null,\n type: \"state\",\n url: contents\n ? contents.getURL() || session.desiredUrl\n : session.desiredUrl\n });\n };\n\n const detachGuest = (session: BrowserGuestSession): void => {\n const contents = session.contents;\n const webContentsId = session.webContentsId;\n if (contents) {\n for (const record of session.listeners) {\n contents.off(record.event, record.listener);\n }\n }\n session.listeners = [];\n session.contents = null;\n session.appliedColorScheme = null;\n session.webContentsId = null;\n if (\n webContentsId !== null &&\n nodeIdByWebContentsId.get(webContentsId) === session.nodeId\n ) {\n nodeIdByWebContentsId.delete(webContentsId);\n }\n publishState(session);\n };\n\n const handlePreferredColorSchemeChange = (\n scheme: BrowserPreferredColorScheme\n ) => {\n preferredColorScheme = scheme;\n for (const session of sessions.values()) {\n session.appliedColorScheme = null;\n void applyPreferredColorSchemeToGuest(\n session,\n logger,\n syncPreferredColorScheme,\n scheme\n ).catch(() => undefined);\n }\n };\n\n const unsubscribePreferredColorScheme =\n subscribePreferredColorScheme?.(handlePreferredColorSchemeChange) ?? null;\n\n const attachGuestListeners = (session: BrowserGuestSession): void => {\n const contents = session.contents;\n if (!contents) {\n return;\n }\n\n const onStateChange = () => publishState(session);\n const onFailLoad = (...args: unknown[]) => {\n const errorCode = typeof args[1] === \"number\" ? args[1] : undefined;\n const errorDescription =\n typeof args[2] === \"string\" ? args[2] : undefined;\n if (isAbortedNavigationError({ errorCode, errorDescription })) {\n publishState(session);\n return;\n }\n emit({\n code: \"navigation-failed\",\n diagnosticMessage: errorDescription,\n nodeId: session.nodeId,\n params: errorCode === undefined ? undefined : { errorCode },\n type: \"error\"\n });\n publishState(session);\n };\n const onDestroyed = () => detachGuest(session);\n\n const records: BrowserGuestSession[\"listeners\"] = [\n { event: \"did-start-loading\", listener: onStateChange },\n { event: \"did-stop-loading\", listener: onStateChange },\n { event: \"did-navigate\", listener: onStateChange },\n { event: \"did-navigate-in-page\", listener: onStateChange },\n { event: \"page-title-updated\", listener: onStateChange },\n { event: \"did-fail-load\", listener: onFailLoad },\n { event: \"destroyed\", listener: onDestroyed }\n ];\n\n for (const record of records) {\n contents.on(record.event, record.listener);\n }\n session.listeners = records;\n };\n\n const loadDesiredUrl = async (\n session: BrowserGuestSession\n ): Promise<void> => {\n const contents = session.contents;\n if (!contents || contents.isDestroyed()) {\n publishState(session);\n return;\n }\n\n const resolved = resolveBrowserNavigationUrl(session.desiredUrl);\n if (!resolved.url) {\n emit({\n ...resolveBrowserNodeUrlError(resolved),\n nodeId: session.nodeId,\n type: \"error\"\n });\n publishState(session);\n return;\n }\n\n const currentComparable = normalizeBrowserComparableUrl(contents.getURL());\n const nextComparable = normalizeBrowserComparableUrl(resolved.url);\n if (currentComparable && currentComparable === nextComparable) {\n publishState(session);\n return;\n }\n\n await contents.loadURL(resolved.url);\n publishState(session);\n };\n\n const openExternalFromGuest = (url: string): { action: \"deny\" } => {\n const resolved = resolveBrowserNavigationUrl(url);\n if (resolved.url) {\n void Promise.resolve(openExternal(resolved.url)).catch(\n (error: unknown) => {\n logger?.warn?.(\"Browser Node openExternal failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n );\n }\n return { action: \"deny\" };\n };\n\n return {\n async activate(input) {\n const resolved = resolveBrowserNavigationUrl(input.url);\n if (!resolved.url) {\n throw new Error(\"Browser Node rejected navigation URL\");\n }\n const session = getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode,\n url: resolved.url\n });\n session.lifecycle = \"active\";\n await loadDesiredUrl(session);\n },\n async capturePreview(input) {\n const session = sessions.get(input.nodeId);\n const contents =\n session?.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n if (!contents?.capturePage) {\n return null;\n }\n\n const image = await contents.capturePage();\n if (image.isEmpty?.() === true) {\n return null;\n }\n\n return resizeBrowserPreviewImage(image).toDataURL();\n },\n close(input) {\n const session = sessions.get(input.nodeId);\n if (session) {\n detachGuest(session);\n sessions.delete(input.nodeId);\n }\n emit({ nodeId: input.nodeId, type: \"closed\" });\n return Promise.resolve();\n },\n debugDump(input) {\n const session = sessions.get(input.nodeId);\n if (!session) {\n return null;\n }\n const contents =\n session.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n return {\n canGoBack: contents ? contents.canGoBack() : false,\n canGoForward: contents ? contents.canGoForward() : false,\n currentUrl: contents ? contents.getURL() : null,\n desiredUrl: session.desiredUrl,\n isAttachedToWindow: Boolean(contents),\n isLoading: contents ? contents.isLoading() : false,\n lifecycle: session.lifecycle,\n nodeId: session.nodeId,\n profileId: session.profileId,\n sessionMode: session.sessionMode,\n title: contents ? contents.getTitle() : null,\n webContentsDestroyed: session.contents\n ? session.contents.isDestroyed()\n : null,\n webContentsId: session.webContentsId\n };\n },\n goBack(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed() && contents.canGoBack()) {\n contents.goBack();\n }\n return Promise.resolve();\n },\n goForward(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed() && contents.canGoForward()) {\n contents.goForward();\n }\n return Promise.resolve();\n },\n async navigate(input) {\n const resolved = resolveBrowserNavigationUrl(input.url);\n if (!resolved.url) {\n throw new Error(\"Browser Node rejected navigation URL\");\n }\n const session = getSession(input.nodeId, { url: resolved.url });\n session.lifecycle = \"active\";\n await loadDesiredUrl(session);\n },\n async prepareSession(input) {\n await prepareSession?.(input);\n getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n },\n async registerGuest(input) {\n await prepareSession?.({\n nodeId: input.nodeId,\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n const contents = resolveWebContents(input.webContentsId);\n if (!contents || contents.isDestroyed()) {\n throw new Error(\n `Browser Node guest ${input.webContentsId} is not available`\n );\n }\n\n const ownerNodeId = nodeIdByWebContentsId.get(input.webContentsId);\n if (ownerNodeId && ownerNodeId !== input.nodeId) {\n throw new Error(\n `Browser Node guest ${input.webContentsId} is already registered`\n );\n }\n\n const session = getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n if (\n session.webContentsId === input.webContentsId &&\n session.contents === contents\n ) {\n publishState(session);\n return;\n }\n if (session.contents && session.contents !== contents) {\n detachGuest(session);\n }\n session.contents = contents;\n session.webContentsId = input.webContentsId;\n nodeIdByWebContentsId.set(input.webContentsId, input.nodeId);\n session.lifecycle = \"active\";\n contents.setWindowOpenHandler?.(({ url }) => openExternalFromGuest(url));\n attachGuestListeners(session);\n await applyPreferredColorSchemeToGuest(\n session,\n logger,\n syncPreferredColorScheme,\n preferredColorScheme\n );\n await loadDesiredUrl(session);\n },\n reload(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed()) {\n contents.reload();\n }\n return Promise.resolve();\n },\n unregisterGuest(input) {\n const session = sessions.get(input.nodeId);\n if (!session || session.webContentsId !== input.webContentsId) {\n return Promise.resolve();\n }\n session.lifecycle = \"cold\";\n detachGuest(session);\n return Promise.resolve();\n },\n dispose() {\n unsubscribePreferredColorScheme?.();\n }\n };\n}\n","import type { BrowserWindow } from \"electron\";\nimport { resolveBrowserSessionPartition } from \"../core/session.ts\";\nimport type { BrowserNodeLoopbackPreviewRoutingOptions } from \"./loopbackPreview.ts\";\nimport { createBrowserNodeLoopbackPreviewProxy } from \"./loopbackPreviewProxy.ts\";\nimport type {\n BrowserNodeActivationInput,\n BrowserNodeNavigateInput,\n BrowserNodeNodeIdInput,\n BrowserNodePrepareSessionInput,\n BrowserNodeRegisterGuestInput,\n BrowserNodeUnregisterGuestInput\n} from \"../core/types.ts\";\nimport { createBrowserGuestManager } from \"./guestManager.ts\";\nimport type {\n BrowserGuestManager,\n BrowserPreferredColorScheme,\n BrowserGuestWebContents,\n BrowserNodeElectronLogger\n} from \"./types.ts\";\n\nexport interface BrowserNodeElectronMainChannels {\n readonly activate: string;\n readonly capturePreview?: string;\n readonly close: string;\n readonly debugDump?: string;\n readonly event: string;\n readonly goBack: string;\n readonly goForward: string;\n readonly navigate: string;\n readonly prepareSession: string;\n readonly registerGuest: string;\n readonly reload: string;\n readonly unregisterGuest: string;\n}\n\nexport interface RegisterBrowserNodeElectronMainInput {\n readonly channels: BrowserNodeElectronMainChannels;\n readonly getOwnerWindow: (event: unknown) => BrowserWindow | null;\n readonly getPreferredColorScheme?: () => BrowserPreferredColorScheme;\n readonly logger?: BrowserNodeElectronLogger;\n readonly loopbackPreviewRouting?: BrowserNodeLoopbackPreviewRoutingOptions;\n readonly openExternal: (url: string) => Promise<void> | void;\n readonly registerHandler: <TPayload, TResult>(\n channel: string,\n handler: (event: unknown, payload: TPayload) => Promise<TResult> | TResult\n ) => void;\n readonly resolveWebContents: (input: {\n event: unknown;\n ownerWindow: BrowserWindow;\n webContentsId: number;\n }) => BrowserGuestWebContents | null;\n readonly syncPreferredColorScheme?: (\n contents: BrowserGuestWebContents,\n scheme: BrowserPreferredColorScheme\n ) => Promise<void> | void;\n readonly subscribePreferredColorScheme?: (\n listener: (scheme: BrowserPreferredColorScheme) => void\n ) => () => void;\n}\n\nexport function registerBrowserNodeElectronMain(\n input: RegisterBrowserNodeElectronMainInput\n): void {\n const managersByWindow = new WeakMap<BrowserWindow, BrowserGuestManager>();\n const loopbackPreviewProxy =\n input.loopbackPreviewRouting !== undefined\n ? createBrowserNodeLoopbackPreviewProxy({\n logger: input.logger,\n resolveSession: async ({ profileId, sessionMode }) => {\n const { session } = await import(\"electron\");\n return session.fromPartition(\n resolveBrowserSessionPartition({\n profileId,\n sessionMode\n })\n );\n },\n routing: input.loopbackPreviewRouting\n })\n : null;\n\n const resolveManager = (event: unknown): BrowserGuestManager => {\n const ownerWindow = input.getOwnerWindow(event);\n if (!ownerWindow) {\n throw new Error(\"Browser Node IPC requires an owner window\");\n }\n\n const existing = managersByWindow.get(ownerWindow);\n if (existing) {\n return existing;\n }\n\n const manager = createBrowserGuestManager({\n emit(browserEvent) {\n if (!ownerWindow.isDestroyed()) {\n ownerWindow.webContents.send(input.channels.event, browserEvent);\n }\n },\n getPreferredColorScheme: input.getPreferredColorScheme,\n logger: input.logger,\n openExternal: input.openExternal,\n prepareSession:\n loopbackPreviewProxy !== null\n ? (payload) => loopbackPreviewProxy.configureSession(payload)\n : undefined,\n resolveWebContents: (webContentsId) =>\n input.resolveWebContents({\n event,\n ownerWindow,\n webContentsId\n }),\n syncPreferredColorScheme: input.syncPreferredColorScheme,\n subscribePreferredColorScheme: input.subscribePreferredColorScheme\n });\n ownerWindow.once(\"closed\", () => {\n manager.dispose();\n managersByWindow.delete(ownerWindow);\n });\n managersByWindow.set(ownerWindow, manager);\n return manager;\n };\n\n input.registerHandler(input.channels.prepareSession, (event, payload) =>\n resolveManager(event).prepareSession(\n payload as BrowserNodePrepareSessionInput\n )\n );\n input.registerHandler(input.channels.activate, (event, payload) =>\n resolveManager(event).activate(payload as BrowserNodeActivationInput)\n );\n if (input.channels.capturePreview) {\n input.registerHandler(input.channels.capturePreview, (event, payload) =>\n resolveManager(event).capturePreview(payload as BrowserNodeNodeIdInput)\n );\n }\n input.registerHandler(input.channels.registerGuest, (event, payload) =>\n resolveManager(event).registerGuest(\n payload as BrowserNodeRegisterGuestInput\n )\n );\n input.registerHandler(input.channels.unregisterGuest, (event, payload) =>\n resolveManager(event).unregisterGuest(\n payload as BrowserNodeUnregisterGuestInput\n )\n );\n input.registerHandler(input.channels.navigate, (event, payload) =>\n resolveManager(event).navigate(payload as BrowserNodeNavigateInput)\n );\n input.registerHandler(input.channels.goBack, (event, payload) =>\n resolveManager(event).goBack(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.goForward, (event, payload) =>\n resolveManager(event).goForward(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.reload, (event, payload) =>\n resolveManager(event).reload(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.close, (event, payload) =>\n resolveManager(event).close(payload as BrowserNodeNodeIdInput)\n );\n if (input.channels.debugDump) {\n input.registerHandler(input.channels.debugDump, (event, payload) =>\n resolveManager(event).debugDump(payload as BrowserNodeNodeIdInput)\n );\n }\n}\n","import type { Event, WebContents, WebPreferences } from \"electron\";\nimport { isBrowserSessionPartitionAllowed } from \"../core/session.ts\";\nimport { resolveBrowserNavigationUrl } from \"../core/url.ts\";\nimport type { BrowserNodeElectronLogger } from \"./types.ts\";\n\nexport interface BrowserWebviewSecurityInput {\n params: Record<string, string>;\n webPreferences: WebPreferences;\n}\n\nexport interface BrowserWebviewSecurityResult {\n allowed: boolean;\n reason: string | null;\n}\n\nexport type BrowserNodeWebviewMatcher = (\n params: Record<string, string>\n) => boolean;\n\nexport function isBrowserNodeWebviewAttach(\n params: Record<string, string>\n): boolean {\n return (\n params[\"data-browser-node-webview\"] === \"true\" ||\n isBrowserSessionPartitionAllowed(params.partition)\n );\n}\n\nexport function enforceBrowserWebviewSecurity({\n params,\n webPreferences\n}: BrowserWebviewSecurityInput): BrowserWebviewSecurityResult {\n webPreferences.allowRunningInsecureContent = false;\n webPreferences.contextIsolation = true;\n webPreferences.javascript = true;\n webPreferences.nodeIntegration = false;\n webPreferences.plugins = false;\n webPreferences.sandbox = true;\n webPreferences.webSecurity = true;\n delete webPreferences.preload;\n\n const partition = params.partition;\n if (!partition || !isBrowserSessionPartitionAllowed(partition)) {\n return {\n allowed: false,\n reason: \"Unsupported Browser Node session partition\"\n };\n }\n\n const resolved = resolveBrowserNavigationUrl(params.src ?? \"about:blank\");\n if (!resolved.url) {\n return {\n allowed: false,\n reason: \"Unsupported browser URL\"\n };\n }\n params.src = resolved.url;\n\n return { allowed: true, reason: null };\n}\n\nexport interface InstallBrowserWebviewSecurityInput {\n contents: WebContents;\n logger?: BrowserNodeElectronLogger;\n onGuestAttached?: (guestContents: WebContents) => void;\n openExternal: (url: string) => Promise<void> | void;\n shouldHandleWebview?: BrowserNodeWebviewMatcher;\n}\n\nexport function installBrowserWebviewSecurity({\n contents,\n logger,\n onGuestAttached,\n openExternal,\n shouldHandleWebview = isBrowserNodeWebviewAttach\n}: InstallBrowserWebviewSecurityInput): () => void {\n let pendingBrowserAttachCount = 0;\n\n const handleWillAttachWebview = (\n event: Event,\n webPreferences: WebPreferences,\n params: Record<string, string>\n ) => {\n if (!shouldHandleWebview(params)) {\n return;\n }\n\n pendingBrowserAttachCount += 1;\n const result = enforceBrowserWebviewSecurity({ params, webPreferences });\n if (!result.allowed) {\n pendingBrowserAttachCount = Math.max(0, pendingBrowserAttachCount - 1);\n logger?.warn?.(\"Browser Node webview blocked\", { reason: result.reason });\n event.preventDefault();\n }\n };\n\n const handleDidAttachWebview = (\n _event: Event,\n guestContents: WebContents\n ) => {\n if (pendingBrowserAttachCount <= 0) {\n return;\n }\n pendingBrowserAttachCount -= 1;\n\n onGuestAttached?.(guestContents);\n guestContents.setWindowOpenHandler(({ url }) => {\n const resolved = resolveBrowserNavigationUrl(url);\n if (resolved.url) {\n void Promise.resolve(openExternal(resolved.url)).catch(() => undefined);\n }\n return { action: \"deny\" };\n });\n };\n\n contents.on(\"will-attach-webview\", handleWillAttachWebview);\n contents.on(\"did-attach-webview\", handleDidAttachWebview);\n\n return () => {\n contents.off(\"will-attach-webview\", handleWillAttachWebview);\n contents.off(\"did-attach-webview\", handleDidAttachWebview);\n };\n}\n"],"mappings":"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","names":["require"]}
|
|
1
|
+
{"version":3,"sources":["../../src/electron-main/loopbackPreviewProxy.ts","../../src/electron-main/guestManager.ts","../../src/electron-main/registerElectronMain.ts","../../src/electron-main/webviewSecurity.ts"],"sourcesContent":["import {\n createServer,\n request as httpRequest,\n type IncomingHttpHeaders,\n type IncomingMessage,\n type Server,\n type ServerResponse\n} from \"node:http\";\nimport { request as httpsRequest } from \"node:https\";\nimport { createRequire } from \"node:module\";\nimport type { Socket } from \"node:net\";\nimport { pipeline } from \"node:stream\";\nimport type WebSocketType from \"ws\";\nimport type { RawData, WebSocketServer as WebSocketServerType } from \"ws\";\nimport type { BrowserNodeSessionMode } from \"../core/types.ts\";\nimport type {\n BrowserNodeLoopbackPreviewRoutingOptions,\n BrowserNodeLoopbackPreviewTarget\n} from \"./loopbackPreview.ts\";\nimport type { BrowserNodeElectronLogger } from \"./types.ts\";\n\nconst require = createRequire(import.meta.url);\ntype WsModule = typeof WebSocketType & {\n WebSocketServer: typeof WebSocketServerType;\n};\nconst wsModule = require(\"ws\") as unknown as WsModule;\nconst WebSocket = wsModule;\nconst { WebSocketServer } = wsModule;\n\nconst defaultLoopbackPreviewCacheTtlMs = 30_000;\nconst loopbackHostPattern = /^(localhost|127(?:\\.\\d{1,3}){0,3})$/i;\n// Order matters: bypass all, subtract loopback so local previews can proxy,\n// then keep HTTPS/WSS direct because this proxy does not implement CONNECT.\nconst loopbackPreviewProxyBypassRules = \"*;<-loopback>;https://*;wss://*\";\nconst hopByHopHeaders = new Set([\n \"connection\",\n \"keep-alive\",\n \"proxy-authenticate\",\n \"proxy-authorization\",\n \"proxy-connection\",\n \"te\",\n \"trailer\",\n \"transfer-encoding\",\n \"upgrade\"\n]);\n\ninterface CachedLoopbackPreviewTarget {\n expiresAt: number;\n target: BrowserNodeLoopbackPreviewTarget | null;\n}\n\nexport interface BrowserNodePreviewSession {\n setProxy(input: {\n mode: \"fixed_servers\";\n proxyBypassRules: string;\n proxyRules: string;\n }): Promise<void>;\n}\n\nexport interface BrowserNodeLoopbackPreviewProxy {\n configureSession(input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }): Promise<void>;\n dispose(): Promise<void>;\n addressForTesting(): string;\n serverForTesting(): Server;\n}\n\nexport interface BrowserNodeLoopbackPreviewProxyInput {\n logger?: BrowserNodeElectronLogger;\n resolveSession: (input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }) => BrowserNodePreviewSession | Promise<BrowserNodePreviewSession>;\n routing: BrowserNodeLoopbackPreviewRoutingOptions;\n}\n\nexport function createBrowserNodeLoopbackPreviewProxy({\n logger,\n resolveSession,\n routing\n}: BrowserNodeLoopbackPreviewProxyInput): BrowserNodeLoopbackPreviewProxy {\n const configuredSessions = new WeakSet<BrowserNodePreviewSession>();\n const targetCache = new Map<string, CachedLoopbackPreviewTarget>();\n const downstreamWebSocketServer = new WebSocketServer({ noServer: true });\n let server: Server | null = null;\n let serverStartPromise: Promise<string> | null = null;\n\n const cacheTtlMs = routing.cacheTtlMs ?? defaultLoopbackPreviewCacheTtlMs;\n const fallback = routing.fallback ?? \"direct\";\n\n const pruneExpiredTargets = (now: number): void => {\n for (const [cacheKey, cachedTarget] of targetCache.entries()) {\n if (cachedTarget.expiresAt <= now) {\n targetCache.delete(cacheKey);\n }\n }\n };\n\n const start = async (): Promise<string> => {\n if (server?.listening) {\n return addressForTesting();\n }\n if (serverStartPromise) {\n return serverStartPromise;\n }\n\n serverStartPromise = new Promise<string>((resolve, reject) => {\n const nextServer = createServer((request, response) => {\n void handleRequest(request, response);\n });\n nextServer.on(\"upgrade\", (request, socket, head) => {\n void handleUpgrade(request, socket as Socket, head);\n });\n\n const cleanup = (): void => {\n nextServer.removeListener(\"error\", onError);\n nextServer.removeListener(\"listening\", onListening);\n };\n const onError = (error: Error): void => {\n cleanup();\n reject(error);\n };\n const onListening = (): void => {\n cleanup();\n server = nextServer;\n resolve(addressForTesting());\n };\n\n nextServer.once(\"error\", onError);\n nextServer.once(\"listening\", onListening);\n nextServer.listen(0, \"127.0.0.1\");\n }).finally(() => {\n serverStartPromise = null;\n });\n\n return serverStartPromise;\n };\n\n const resolveLoopbackTarget = async (\n originalUrl: URL\n ): Promise<BrowserNodeLoopbackPreviewTarget | null> => {\n const port = Number(originalUrl.port);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n return null;\n }\n\n const now = Date.now();\n pruneExpiredTargets(now);\n\n const cacheKey = originalUrl.toString();\n const cached = targetCache.get(cacheKey);\n if (cached && cached.expiresAt > now) {\n return cached.target;\n }\n\n const nextTarget = await Promise.resolve(\n routing.resolver.resolveTarget({\n port,\n url: originalUrl.toString()\n })\n );\n\n const target = normalizeLoopbackPreviewTarget(nextTarget);\n targetCache.set(cacheKey, {\n expiresAt: now + Math.max(0, cacheTtlMs),\n target\n });\n return target;\n };\n\n const configureSession = async (input: {\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n }): Promise<void> => {\n const nextSession = await resolveSession(input);\n if (configuredSessions.has(nextSession)) {\n return;\n }\n const address = await start();\n await nextSession.setProxy({\n mode: \"fixed_servers\",\n proxyBypassRules: loopbackPreviewProxyBypassRules,\n proxyRules: `http=${address}`\n });\n configuredSessions.add(nextSession);\n };\n\n const dispose = async (): Promise<void> => {\n targetCache.clear();\n downstreamWebSocketServer.close();\n const activeServer = server;\n server = null;\n if (!activeServer || !activeServer.listening) {\n return;\n }\n await new Promise<void>((resolve) => {\n activeServer.close(() => resolve());\n });\n };\n\n const handleRequest = async (\n request: IncomingMessage,\n response: ServerResponse\n ): Promise<void> => {\n const originalUrl = resolveProxyRequestUrl(request);\n if (!originalUrl) {\n response.writeHead(400);\n response.end(\"invalid proxy request\");\n return;\n }\n if (originalUrl.protocol !== \"http:\") {\n response.writeHead(400);\n response.end(\"unsupported proxy request\");\n return;\n }\n\n const targetContext = await resolveTargetRequestContext(originalUrl);\n if (!targetContext.targetUrl) {\n response.writeHead(502);\n response.end(\"unable to resolve loopback preview target\");\n return;\n }\n\n const headers = filterProxyHeaders(request.headers);\n headers.set(\"host\", targetContext.targetUrl.host);\n\n const forward =\n targetContext.targetUrl.protocol === \"https:\"\n ? httpsRequest\n : httpRequest;\n const upstream = forward(\n targetContext.targetUrl,\n {\n headers: Object.fromEntries(headers.entries()),\n method: request.method\n },\n (upstreamResponse) => {\n const responseHeaders = filterProxyHeaders(upstreamResponse.headers);\n const location = responseHeaders.get(\"location\");\n if (location && targetContext.loopbackTarget) {\n const rewritten = rewriteLoopbackLocation({\n location,\n originalUrl,\n targetUrl: targetContext.loopbackTarget.targetUrl\n });\n if (rewritten) {\n responseHeaders.set(\"location\", rewritten);\n }\n }\n\n response.writeHead(\n upstreamResponse.statusCode ?? 502,\n upstreamResponse.statusMessage,\n Object.fromEntries(responseHeaders.entries())\n );\n pipeline(upstreamResponse, response, () => undefined);\n }\n );\n\n upstream.on(\"error\", (error) => {\n logger?.warn?.(\"Browser Node loopback preview request failed\", {\n error: normalizeProxyError(error),\n originalUrl: originalUrl.toString(),\n targetUrl: targetContext.targetUrl?.toString() ?? null,\n workspaceId: targetContext.loopbackTarget?.workspaceId ?? null\n });\n if (!response.headersSent) {\n response.writeHead(502);\n }\n response.end(\n `loopback preview upstream request failed: ${normalizeProxyError(error)}`\n );\n });\n\n pipeline(request, upstream, () => undefined);\n };\n\n const handleUpgrade = async (\n request: IncomingMessage,\n socket: Socket,\n head: Buffer\n ): Promise<void> => {\n const originalUrl = resolveProxyRequestUrl(request, \"ws:\");\n if (!originalUrl) {\n socket.destroy();\n return;\n }\n if (originalUrl.protocol !== \"ws:\") {\n socket.destroy();\n return;\n }\n\n const targetContext = await resolveTargetRequestContext(originalUrl);\n const targetUrl = targetContext.targetUrl;\n if (!targetUrl) {\n socket.destroy();\n return;\n }\n\n downstreamWebSocketServer.handleUpgrade(\n request,\n socket,\n head,\n (downstream) => {\n const headers = Object.fromEntries(\n filterProxyHeaders(request.headers).entries()\n );\n headers.host = targetUrl.host;\n\n const upstream = new WebSocket(targetUrl, { headers });\n const pendingMessages: Array<{ data: RawData; isBinary: boolean }> = [];\n\n downstream.on(\"message\", (data, isBinary) => {\n if (upstream.readyState === WebSocket.OPEN) {\n upstream.send(data, { binary: isBinary });\n return;\n }\n pendingMessages.push({ data, isBinary });\n });\n\n upstream.once(\"open\", () => {\n for (const nextMessage of pendingMessages.splice(0)) {\n upstream.send(nextMessage.data, { binary: nextMessage.isBinary });\n }\n });\n\n upstream.on(\"message\", (data, isBinary) => {\n if (downstream.readyState === WebSocket.OPEN) {\n downstream.send(data, { binary: isBinary });\n }\n });\n\n upstream.once(\"close\", (code, reason) => {\n if (\n downstream.readyState === WebSocket.OPEN ||\n downstream.readyState === WebSocket.CONNECTING\n ) {\n downstream.close(normalizeWebSocketCloseCode(code), reason);\n }\n });\n\n downstream.once(\"close\", (code, reason) => {\n if (\n upstream.readyState === WebSocket.OPEN ||\n upstream.readyState === WebSocket.CONNECTING\n ) {\n upstream.close(normalizeWebSocketCloseCode(code), reason);\n }\n });\n\n upstream.once(\"error\", (error) => {\n logger?.warn?.(\"Browser Node loopback preview websocket failed\", {\n error: normalizeProxyError(error),\n originalUrl: originalUrl.toString(),\n targetUrl: targetContext.targetUrl?.toString() ?? null,\n workspaceId: targetContext.loopbackTarget?.workspaceId ?? null\n });\n downstream.close(1011, \"loopback preview websocket upstream failed\");\n });\n }\n );\n };\n\n const resolveTargetRequestContext = async (\n originalUrl: URL\n ): Promise<{\n loopbackTarget: BrowserNodeLoopbackPreviewTarget | null;\n targetUrl: URL | null;\n }> => {\n if (!isLoopbackUrl(originalUrl)) {\n return {\n loopbackTarget: null,\n targetUrl: null\n };\n }\n\n const loopbackTarget = await resolveLoopbackTarget(originalUrl);\n if (loopbackTarget) {\n return {\n loopbackTarget,\n targetUrl: buildTargetRequestUrl(loopbackTarget.targetUrl, originalUrl)\n };\n }\n\n if (fallback === \"direct\") {\n return {\n loopbackTarget: null,\n targetUrl: cloneUrl(originalUrl)\n };\n }\n\n return {\n loopbackTarget: null,\n targetUrl: null\n };\n };\n\n const addressForTesting = (): string => {\n const address = server?.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Browser Node loopback preview proxy is not listening\");\n }\n return `127.0.0.1:${address.port}`;\n };\n\n const serverForTesting = (): Server => {\n if (!server) {\n throw new Error(\"Browser Node loopback preview proxy is not started\");\n }\n return server;\n };\n\n return {\n addressForTesting,\n configureSession,\n dispose,\n serverForTesting\n };\n}\n\nfunction normalizeLoopbackPreviewTarget(\n input: BrowserNodeLoopbackPreviewTarget | null | undefined\n): BrowserNodeLoopbackPreviewTarget | null {\n if (!input) {\n return null;\n }\n const normalizedTargetUrl = input.targetUrl.trim();\n if (normalizedTargetUrl.length === 0) {\n return null;\n }\n try {\n const parsed = new URL(normalizedTargetUrl);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n return {\n targetUrl: parsed.toString(),\n workspaceId: input.workspaceId\n };\n } catch {\n return null;\n }\n}\n\nfunction resolveProxyRequestUrl(\n request: IncomingMessage,\n defaultProtocol = \"http:\"\n): URL | null {\n const rawUrl = request.url ?? \"\";\n try {\n if (/^[a-z][a-z\\d+\\-.]*:\\/\\//i.test(rawUrl)) {\n return new URL(rawUrl);\n }\n const host = request.headers.host;\n if (typeof host !== \"string\" || host.trim().length === 0) {\n return null;\n }\n const path = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return new URL(`${defaultProtocol}//${host}${path}`);\n } catch {\n return null;\n }\n}\n\nfunction filterProxyHeaders(input: Headers | IncomingHttpHeaders): Headers {\n const output = new Headers();\n const appendValue = (key: string, value: string): void => {\n if (hopByHopHeaders.has(key.toLowerCase())) {\n return;\n }\n output.append(key, value);\n };\n\n if (input instanceof Headers) {\n input.forEach((value, key) => {\n appendValue(key, value);\n });\n return output;\n }\n\n for (const [key, value] of Object.entries(input)) {\n if (Array.isArray(value)) {\n for (const nextValue of value) {\n appendValue(key, nextValue);\n }\n continue;\n }\n if (typeof value === \"string\") {\n appendValue(key, value);\n }\n }\n return output;\n}\n\nfunction isLoopbackUrl(url: URL): boolean {\n return (\n (url.protocol === \"http:\" || url.protocol === \"ws:\") &&\n loopbackHostPattern.test(url.hostname) &&\n url.port.length > 0\n );\n}\n\nfunction buildTargetRequestUrl(\n targetUrl: string,\n originalUrl: URL\n): URL | null {\n try {\n const base = new URL(targetUrl);\n const normalizedBasePath = normalizeBasePath(base.pathname);\n const nextUrl = new URL(base.toString());\n nextUrl.pathname = joinBasePath(normalizedBasePath, originalUrl.pathname);\n nextUrl.search = originalUrl.search;\n nextUrl.hash = \"\";\n if (originalUrl.protocol === \"ws:\") {\n nextUrl.protocol = nextUrl.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n }\n return nextUrl;\n } catch {\n return null;\n }\n}\n\nfunction rewriteLoopbackLocation({\n location,\n originalUrl,\n targetUrl\n}: {\n location: string;\n originalUrl: URL;\n targetUrl: string;\n}): string | null {\n try {\n const targetBase = new URL(targetUrl);\n const resolvedLocation = new URL(location, targetBase);\n if (resolvedLocation.origin !== targetBase.origin) {\n return location;\n }\n\n const basePath = normalizeBasePath(targetBase.pathname);\n const strippedPath =\n stripBasePath(basePath, resolvedLocation.pathname) ??\n resolvedLocation.pathname;\n\n const loopbackUrl = new URL(originalUrl.origin);\n resolvedLocation.protocol = loopbackUrl.protocol;\n resolvedLocation.host = loopbackUrl.host;\n resolvedLocation.pathname = strippedPath;\n resolvedLocation.username = \"\";\n resolvedLocation.password = \"\";\n return resolvedLocation.toString();\n } catch {\n return location;\n }\n}\n\nfunction normalizeBasePath(pathname: string): string {\n const normalized = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return normalized.endsWith(\"/\") ? normalized : `${normalized}/`;\n}\n\nfunction joinBasePath(basePath: string, requestPath: string): string {\n const normalizedRequestPath =\n requestPath === \"/\" ? \"\" : requestPath.replace(/^\\/+/, \"\");\n return normalizedRequestPath.length > 0\n ? `${basePath}${normalizedRequestPath}`.replace(/\\/{2,}/g, \"/\")\n : basePath;\n}\n\nfunction stripBasePath(basePath: string, pathname: string): string | null {\n const normalizedPath = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n if (normalizedPath === basePath.slice(0, -1)) {\n return \"/\";\n }\n if (!normalizedPath.startsWith(basePath)) {\n return null;\n }\n const suffix = normalizedPath.slice(basePath.length);\n return suffix.length > 0 ? `/${suffix}` : \"/\";\n}\n\nfunction cloneUrl(url: URL): URL | null {\n try {\n return new URL(url.toString());\n } catch {\n return null;\n }\n}\n\nfunction normalizeProxyError(error: unknown): string {\n if (error instanceof Error) {\n const code =\n typeof (error as NodeJS.ErrnoException).code === \"string\"\n ? ` ${(error as NodeJS.ErrnoException).code}`\n : \"\";\n return `${error.message}${code}`;\n }\n return String(error);\n}\n\nfunction normalizeWebSocketCloseCode(code: number): number {\n if (code === 1000 || (code >= 3000 && code <= 4999)) {\n return code;\n }\n return 1000;\n}\n","import type {\n BrowserNodeLifecycle,\n BrowserNodeRuntimeError,\n BrowserNodeSessionMode\n} from \"../core/types.ts\";\nimport {\n normalizeBrowserComparableUrl,\n resolveBrowserNavigationUrl,\n type BrowserNavigationUrlResolution\n} from \"../core/url.ts\";\nimport type {\n BrowserGuestManager,\n BrowserGuestManagerInput,\n BrowserGuestNativeImage,\n BrowserPreferredColorScheme,\n BrowserGuestWebContents\n} from \"./types.ts\";\n\nconst browserPreviewMaxWidth = 260;\nconst browserPreviewMaxHeight = 170;\nconst abortedNavigationErrorCode = -3;\n\ninterface BrowserGuestSession {\n appliedColorScheme: BrowserPreferredColorScheme | null;\n contents: BrowserGuestWebContents | null;\n desiredUrl: string;\n lifecycle: BrowserNodeLifecycle;\n listeners: Array<{\n event: string;\n listener: (...args: unknown[]) => void;\n }>;\n nodeId: string;\n profileId: string | null;\n sessionMode: BrowserNodeSessionMode;\n webContentsId: number | null;\n}\n\nfunction resolveBrowserNodeUrlError(\n resolved: BrowserNavigationUrlResolution\n): BrowserNodeRuntimeError {\n if (resolved.errorCode === \"invalid-url\") {\n return { code: \"invalid-url\" };\n }\n\n if (resolved.errorCode === \"unsupported-protocol\") {\n return {\n code: \"unsupported-protocol\",\n params: resolved.errorParams\n };\n }\n\n return { code: \"unsupported-url\" };\n}\n\nfunction resizeBrowserPreviewImage(\n image: BrowserGuestNativeImage\n): BrowserGuestNativeImage {\n if (image.isEmpty?.() === true || !image.resize || !image.getSize) {\n return image;\n }\n\n const size = image.getSize();\n if (size.width <= 0 || size.height <= 0) {\n return image;\n }\n\n const scale = Math.min(\n 1,\n browserPreviewMaxWidth / size.width,\n browserPreviewMaxHeight / size.height\n );\n if (scale >= 1) {\n return image;\n }\n\n return image.resize({\n height: Math.max(1, Math.round(size.height * scale)),\n quality: \"good\",\n width: Math.max(1, Math.round(size.width * scale))\n });\n}\n\nfunction isAbortedNavigationError(input: {\n errorCode?: number;\n errorDescription?: string;\n}): boolean {\n return (\n input.errorCode === abortedNavigationErrorCode ||\n input.errorDescription === \"ERR_ABORTED\"\n );\n}\n\nasync function applyPreferredColorSchemeToGuest(\n session: BrowserGuestSession,\n logger: BrowserGuestManagerInput[\"logger\"],\n syncPreferredColorScheme: BrowserGuestManagerInput[\"syncPreferredColorScheme\"],\n scheme: BrowserPreferredColorScheme | null\n): Promise<void> {\n const contents = session.contents;\n if (\n !contents ||\n contents.isDestroyed() ||\n !syncPreferredColorScheme ||\n scheme === null ||\n session.appliedColorScheme === scheme\n ) {\n return;\n }\n\n try {\n await syncPreferredColorScheme(contents, scheme);\n session.appliedColorScheme = scheme;\n } catch (error) {\n session.appliedColorScheme = null;\n logger?.warn?.(\"Browser Node failed to sync guest color scheme\", {\n error: error instanceof Error ? error.message : String(error),\n nodeId: session.nodeId,\n scheme,\n webContentsId: session.webContentsId\n });\n }\n}\n\nexport function createBrowserGuestManager({\n emit,\n getPreferredColorScheme,\n logger,\n openExternal,\n prepareSession,\n resolveWebContents,\n syncPreferredColorScheme,\n subscribePreferredColorScheme\n}: BrowserGuestManagerInput): BrowserGuestManager {\n const sessions = new Map<string, BrowserGuestSession>();\n const nodeIdByWebContentsId = new Map<number, string>();\n let preferredColorScheme = getPreferredColorScheme?.() ?? null;\n\n const getSession = (\n nodeId: string,\n input?: {\n profileId?: string | null;\n sessionMode?: BrowserNodeSessionMode;\n url?: string;\n }\n ): BrowserGuestSession => {\n const existing = sessions.get(nodeId);\n if (existing) {\n if (input?.profileId !== undefined) {\n existing.profileId = input.profileId;\n }\n if (input?.sessionMode !== undefined) {\n existing.sessionMode = input.sessionMode;\n }\n if (input?.url !== undefined) {\n existing.desiredUrl = input.url;\n }\n return existing;\n }\n\n const session: BrowserGuestSession = {\n appliedColorScheme: null,\n contents: null,\n desiredUrl: input?.url ?? \"about:blank\",\n lifecycle: \"cold\",\n listeners: [],\n nodeId,\n profileId: input?.profileId ?? null,\n sessionMode: input?.sessionMode ?? \"shared\",\n webContentsId: null\n };\n sessions.set(nodeId, session);\n return session;\n };\n\n const publishState = (session: BrowserGuestSession): void => {\n const contents =\n session.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n emit({\n canGoBack: contents ? contents.canGoBack() : false,\n canGoForward: contents ? contents.canGoForward() : false,\n isAttachedToWindow: Boolean(contents),\n isLoading: contents ? contents.isLoading() : false,\n isOccluded: session.lifecycle === \"cold\",\n lifecycle: session.lifecycle,\n nodeId: session.nodeId,\n title: contents ? contents.getTitle() || null : null,\n type: \"state\",\n url: contents\n ? contents.getURL() || session.desiredUrl\n : session.desiredUrl\n });\n };\n\n const detachGuest = (session: BrowserGuestSession): void => {\n const contents = session.contents;\n const webContentsId = session.webContentsId;\n if (contents) {\n for (const record of session.listeners) {\n contents.off(record.event, record.listener);\n }\n }\n session.listeners = [];\n session.contents = null;\n session.appliedColorScheme = null;\n session.webContentsId = null;\n if (\n webContentsId !== null &&\n nodeIdByWebContentsId.get(webContentsId) === session.nodeId\n ) {\n nodeIdByWebContentsId.delete(webContentsId);\n }\n publishState(session);\n };\n\n const handlePreferredColorSchemeChange = (\n scheme: BrowserPreferredColorScheme\n ) => {\n preferredColorScheme = scheme;\n for (const session of sessions.values()) {\n session.appliedColorScheme = null;\n void applyPreferredColorSchemeToGuest(\n session,\n logger,\n syncPreferredColorScheme,\n scheme\n ).catch(() => undefined);\n }\n };\n\n const unsubscribePreferredColorScheme =\n subscribePreferredColorScheme?.(handlePreferredColorSchemeChange) ?? null;\n\n const attachGuestListeners = (session: BrowserGuestSession): void => {\n const contents = session.contents;\n if (!contents) {\n return;\n }\n\n const onStateChange = () => publishState(session);\n const onFailLoad = (...args: unknown[]) => {\n const errorCode = typeof args[1] === \"number\" ? args[1] : undefined;\n const errorDescription =\n typeof args[2] === \"string\" ? args[2] : undefined;\n if (isAbortedNavigationError({ errorCode, errorDescription })) {\n publishState(session);\n return;\n }\n emit({\n code: \"navigation-failed\",\n diagnosticMessage: errorDescription,\n nodeId: session.nodeId,\n params: errorCode === undefined ? undefined : { errorCode },\n type: \"error\"\n });\n publishState(session);\n };\n const onDestroyed = () => detachGuest(session);\n\n const records: BrowserGuestSession[\"listeners\"] = [\n { event: \"did-start-loading\", listener: onStateChange },\n { event: \"did-stop-loading\", listener: onStateChange },\n { event: \"did-navigate\", listener: onStateChange },\n { event: \"did-navigate-in-page\", listener: onStateChange },\n { event: \"page-title-updated\", listener: onStateChange },\n { event: \"did-fail-load\", listener: onFailLoad },\n { event: \"destroyed\", listener: onDestroyed }\n ];\n\n for (const record of records) {\n contents.on(record.event, record.listener);\n }\n session.listeners = records;\n };\n\n const loadDesiredUrl = async (\n session: BrowserGuestSession\n ): Promise<void> => {\n const contents = session.contents;\n if (!contents || contents.isDestroyed()) {\n publishState(session);\n return;\n }\n\n const resolved = resolveBrowserNavigationUrl(session.desiredUrl);\n if (!resolved.url) {\n emit({\n ...resolveBrowserNodeUrlError(resolved),\n nodeId: session.nodeId,\n type: \"error\"\n });\n publishState(session);\n return;\n }\n\n const currentComparable = normalizeBrowserComparableUrl(contents.getURL());\n const nextComparable = normalizeBrowserComparableUrl(resolved.url);\n if (currentComparable && currentComparable === nextComparable) {\n publishState(session);\n return;\n }\n\n await contents.loadURL(resolved.url);\n publishState(session);\n };\n\n const openExternalFromGuest = (url: string): { action: \"deny\" } => {\n const resolved = resolveBrowserNavigationUrl(url);\n if (resolved.url) {\n void Promise.resolve(openExternal(resolved.url)).catch(\n (error: unknown) => {\n logger?.warn?.(\"Browser Node openExternal failed\", {\n error: error instanceof Error ? error.message : String(error)\n });\n }\n );\n }\n return { action: \"deny\" };\n };\n\n return {\n async activate(input) {\n const resolved = resolveBrowserNavigationUrl(input.url);\n if (!resolved.url) {\n throw new Error(\"Browser Node rejected navigation URL\");\n }\n const session = getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode,\n url: resolved.url\n });\n session.lifecycle = \"active\";\n await loadDesiredUrl(session);\n },\n async capturePreview(input) {\n const session = sessions.get(input.nodeId);\n const contents =\n session?.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n if (!contents?.capturePage) {\n return null;\n }\n\n const image = await contents.capturePage();\n if (image.isEmpty?.() === true) {\n return null;\n }\n\n return resizeBrowserPreviewImage(image).toDataURL();\n },\n close(input) {\n const session = sessions.get(input.nodeId);\n if (session) {\n detachGuest(session);\n sessions.delete(input.nodeId);\n }\n emit({ nodeId: input.nodeId, type: \"closed\" });\n return Promise.resolve();\n },\n debugDump(input) {\n const session = sessions.get(input.nodeId);\n if (!session) {\n return null;\n }\n const contents =\n session.contents && !session.contents.isDestroyed()\n ? session.contents\n : null;\n return {\n canGoBack: contents ? contents.canGoBack() : false,\n canGoForward: contents ? contents.canGoForward() : false,\n currentUrl: contents ? contents.getURL() : null,\n desiredUrl: session.desiredUrl,\n isAttachedToWindow: Boolean(contents),\n isLoading: contents ? contents.isLoading() : false,\n lifecycle: session.lifecycle,\n nodeId: session.nodeId,\n profileId: session.profileId,\n sessionMode: session.sessionMode,\n title: contents ? contents.getTitle() : null,\n webContentsDestroyed: session.contents\n ? session.contents.isDestroyed()\n : null,\n webContentsId: session.webContentsId\n };\n },\n goBack(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed() && contents.canGoBack()) {\n contents.goBack();\n }\n return Promise.resolve();\n },\n goForward(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed() && contents.canGoForward()) {\n contents.goForward();\n }\n return Promise.resolve();\n },\n async navigate(input) {\n const resolved = resolveBrowserNavigationUrl(input.url);\n if (!resolved.url) {\n throw new Error(\"Browser Node rejected navigation URL\");\n }\n const session = getSession(input.nodeId, { url: resolved.url });\n session.lifecycle = \"active\";\n await loadDesiredUrl(session);\n },\n async prepareSession(input) {\n await prepareSession?.(input);\n getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n },\n async registerGuest(input) {\n await prepareSession?.({\n nodeId: input.nodeId,\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n const contents = resolveWebContents(input.webContentsId);\n if (!contents || contents.isDestroyed()) {\n throw new Error(\n `Browser Node guest ${input.webContentsId} is not available`\n );\n }\n\n const ownerNodeId = nodeIdByWebContentsId.get(input.webContentsId);\n if (ownerNodeId && ownerNodeId !== input.nodeId) {\n throw new Error(\n `Browser Node guest ${input.webContentsId} is already registered`\n );\n }\n\n const session = getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n if (\n session.webContentsId === input.webContentsId &&\n session.contents === contents\n ) {\n publishState(session);\n return;\n }\n if (session.contents && session.contents !== contents) {\n detachGuest(session);\n }\n session.contents = contents;\n session.webContentsId = input.webContentsId;\n nodeIdByWebContentsId.set(input.webContentsId, input.nodeId);\n session.lifecycle = \"active\";\n contents.setWindowOpenHandler?.(({ url }) => openExternalFromGuest(url));\n attachGuestListeners(session);\n await applyPreferredColorSchemeToGuest(\n session,\n logger,\n syncPreferredColorScheme,\n preferredColorScheme\n );\n await loadDesiredUrl(session);\n },\n reload(input) {\n const contents = sessions.get(input.nodeId)?.contents;\n if (contents && !contents.isDestroyed()) {\n contents.reload();\n }\n return Promise.resolve();\n },\n unregisterGuest(input) {\n const session = sessions.get(input.nodeId);\n if (!session || session.webContentsId !== input.webContentsId) {\n return Promise.resolve();\n }\n session.lifecycle = \"cold\";\n detachGuest(session);\n return Promise.resolve();\n },\n dispose() {\n unsubscribePreferredColorScheme?.();\n }\n };\n}\n","import type { BrowserWindow } from \"electron\";\nimport { resolveBrowserSessionPartition } from \"../core/session.ts\";\nimport type { BrowserNodeLoopbackPreviewRoutingOptions } from \"./loopbackPreview.ts\";\nimport { createBrowserNodeLoopbackPreviewProxy } from \"./loopbackPreviewProxy.ts\";\nimport type {\n BrowserNodeActivationInput,\n BrowserNodeNavigateInput,\n BrowserNodeNodeIdInput,\n BrowserNodePrepareSessionInput,\n BrowserNodeRegisterGuestInput,\n BrowserNodeUnregisterGuestInput\n} from \"../core/types.ts\";\nimport { createBrowserGuestManager } from \"./guestManager.ts\";\nimport type {\n BrowserGuestManager,\n BrowserPreferredColorScheme,\n BrowserGuestWebContents,\n BrowserNodeElectronLogger\n} from \"./types.ts\";\n\nexport interface BrowserNodeElectronMainChannels {\n readonly activate: string;\n readonly capturePreview?: string;\n readonly close: string;\n readonly debugDump?: string;\n readonly event: string;\n readonly goBack: string;\n readonly goForward: string;\n readonly navigate: string;\n readonly prepareSession: string;\n readonly registerGuest: string;\n readonly reload: string;\n readonly unregisterGuest: string;\n}\n\nexport interface RegisterBrowserNodeElectronMainInput {\n readonly channels: BrowserNodeElectronMainChannels;\n readonly getOwnerWindow: (event: unknown) => BrowserWindow | null;\n readonly getPreferredColorScheme?: () => BrowserPreferredColorScheme;\n readonly logger?: BrowserNodeElectronLogger;\n readonly loopbackPreviewRouting?: BrowserNodeLoopbackPreviewRoutingOptions;\n readonly openExternal: (url: string) => Promise<void> | void;\n readonly registerHandler: <TPayload, TResult>(\n channel: string,\n handler: (event: unknown, payload: TPayload) => Promise<TResult> | TResult\n ) => void;\n readonly resolveWebContents: (input: {\n event: unknown;\n ownerWindow: BrowserWindow;\n webContentsId: number;\n }) => BrowserGuestWebContents | null;\n readonly syncPreferredColorScheme?: (\n contents: BrowserGuestWebContents,\n scheme: BrowserPreferredColorScheme\n ) => Promise<void> | void;\n readonly subscribePreferredColorScheme?: (\n listener: (scheme: BrowserPreferredColorScheme) => void\n ) => () => void;\n}\n\nexport function registerBrowserNodeElectronMain(\n input: RegisterBrowserNodeElectronMainInput\n): void {\n const managersByWindow = new WeakMap<BrowserWindow, BrowserGuestManager>();\n const loopbackPreviewProxy =\n input.loopbackPreviewRouting !== undefined\n ? createBrowserNodeLoopbackPreviewProxy({\n logger: input.logger,\n resolveSession: async ({ profileId, sessionMode }) => {\n const { session } = await import(\"electron\");\n return session.fromPartition(\n resolveBrowserSessionPartition({\n profileId,\n sessionMode\n })\n );\n },\n routing: input.loopbackPreviewRouting\n })\n : null;\n\n const resolveManager = (event: unknown): BrowserGuestManager => {\n const ownerWindow = input.getOwnerWindow(event);\n if (!ownerWindow) {\n throw new Error(\"Browser Node IPC requires an owner window\");\n }\n\n const existing = managersByWindow.get(ownerWindow);\n if (existing) {\n return existing;\n }\n\n const manager = createBrowserGuestManager({\n emit(browserEvent) {\n if (!ownerWindow.isDestroyed()) {\n ownerWindow.webContents.send(input.channels.event, browserEvent);\n }\n },\n getPreferredColorScheme: input.getPreferredColorScheme,\n logger: input.logger,\n openExternal: input.openExternal,\n prepareSession:\n loopbackPreviewProxy !== null\n ? (payload) => loopbackPreviewProxy.configureSession(payload)\n : undefined,\n resolveWebContents: (webContentsId) =>\n input.resolveWebContents({\n event,\n ownerWindow,\n webContentsId\n }),\n syncPreferredColorScheme: input.syncPreferredColorScheme,\n subscribePreferredColorScheme: input.subscribePreferredColorScheme\n });\n ownerWindow.once(\"closed\", () => {\n manager.dispose();\n managersByWindow.delete(ownerWindow);\n });\n managersByWindow.set(ownerWindow, manager);\n return manager;\n };\n\n input.registerHandler(input.channels.prepareSession, (event, payload) =>\n resolveManager(event).prepareSession(\n payload as BrowserNodePrepareSessionInput\n )\n );\n input.registerHandler(input.channels.activate, (event, payload) =>\n resolveManager(event).activate(payload as BrowserNodeActivationInput)\n );\n if (input.channels.capturePreview) {\n input.registerHandler(input.channels.capturePreview, (event, payload) =>\n resolveManager(event).capturePreview(payload as BrowserNodeNodeIdInput)\n );\n }\n input.registerHandler(input.channels.registerGuest, (event, payload) =>\n resolveManager(event).registerGuest(\n payload as BrowserNodeRegisterGuestInput\n )\n );\n input.registerHandler(input.channels.unregisterGuest, (event, payload) =>\n resolveManager(event).unregisterGuest(\n payload as BrowserNodeUnregisterGuestInput\n )\n );\n input.registerHandler(input.channels.navigate, (event, payload) =>\n resolveManager(event).navigate(payload as BrowserNodeNavigateInput)\n );\n input.registerHandler(input.channels.goBack, (event, payload) =>\n resolveManager(event).goBack(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.goForward, (event, payload) =>\n resolveManager(event).goForward(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.reload, (event, payload) =>\n resolveManager(event).reload(payload as BrowserNodeNodeIdInput)\n );\n input.registerHandler(input.channels.close, (event, payload) =>\n resolveManager(event).close(payload as BrowserNodeNodeIdInput)\n );\n if (input.channels.debugDump) {\n input.registerHandler(input.channels.debugDump, (event, payload) =>\n resolveManager(event).debugDump(payload as BrowserNodeNodeIdInput)\n );\n }\n}\n","import type { Event, WebContents, WebPreferences } from \"electron\";\nimport { isBrowserSessionPartitionAllowed } from \"../core/session.ts\";\nimport { resolveBrowserNavigationUrl } from \"../core/url.ts\";\nimport type { BrowserNodeElectronLogger } from \"./types.ts\";\n\nexport interface BrowserWebviewSecurityInput {\n params: Record<string, string>;\n resolvePreload?: BrowserWebviewPreloadResolver;\n webPreferences: WebPreferences;\n}\n\nexport interface BrowserWebviewSecurityResult {\n allowed: boolean;\n reason: string | null;\n}\n\nexport type BrowserNodeWebviewMatcher = (\n params: Record<string, string>\n) => boolean;\n\nexport interface BrowserWebviewPreloadResolverInput {\n params: Readonly<Record<string, string>>;\n}\n\nexport type BrowserWebviewPreloadResolver = (\n input: BrowserWebviewPreloadResolverInput\n) => string | null | undefined;\n\nexport function isBrowserNodeWebviewAttach(\n params: Record<string, string>\n): boolean {\n return (\n params[\"data-browser-node-webview\"] === \"true\" ||\n isBrowserSessionPartitionAllowed(params.partition)\n );\n}\n\nexport function enforceBrowserWebviewSecurity({\n params,\n resolvePreload,\n webPreferences\n}: BrowserWebviewSecurityInput): BrowserWebviewSecurityResult {\n webPreferences.allowRunningInsecureContent = false;\n webPreferences.contextIsolation = true;\n webPreferences.javascript = true;\n webPreferences.nodeIntegration = false;\n webPreferences.plugins = false;\n webPreferences.sandbox = true;\n webPreferences.webSecurity = true;\n delete webPreferences.preload;\n\n const partition = params.partition;\n if (!partition || !isBrowserSessionPartitionAllowed(partition)) {\n return {\n allowed: false,\n reason: \"Unsupported Browser Node session partition\"\n };\n }\n\n const resolved = resolveBrowserNavigationUrl(params.src ?? \"about:blank\");\n if (!resolved.url) {\n return {\n allowed: false,\n reason: \"Unsupported browser URL\"\n };\n }\n params.src = resolved.url;\n\n const preload = resolvePreload?.({ params: { ...params } });\n const resolvedPreload = typeof preload === \"string\" ? preload.trim() : \"\";\n if (resolvedPreload.length > 0) {\n webPreferences.preload = resolvedPreload;\n }\n\n return { allowed: true, reason: null };\n}\n\nexport interface InstallBrowserWebviewSecurityInput {\n contents: WebContents;\n logger?: BrowserNodeElectronLogger;\n onGuestAttached?: (guestContents: WebContents) => void;\n openExternal: (url: string) => Promise<void> | void;\n resolvePreload?: BrowserWebviewPreloadResolver;\n shouldHandleWebview?: BrowserNodeWebviewMatcher;\n}\n\nexport function installBrowserWebviewSecurity({\n contents,\n logger,\n onGuestAttached,\n openExternal,\n resolvePreload,\n shouldHandleWebview = isBrowserNodeWebviewAttach\n}: InstallBrowserWebviewSecurityInput): () => void {\n let pendingBrowserAttachCount = 0;\n\n const handleWillAttachWebview = (\n event: Event,\n webPreferences: WebPreferences,\n params: Record<string, string>\n ) => {\n if (!shouldHandleWebview(params)) {\n return;\n }\n\n pendingBrowserAttachCount += 1;\n const result = enforceBrowserWebviewSecurity({\n params,\n resolvePreload,\n webPreferences\n });\n if (!result.allowed) {\n pendingBrowserAttachCount = Math.max(0, pendingBrowserAttachCount - 1);\n logger?.warn?.(\"Browser Node webview blocked\", { reason: result.reason });\n event.preventDefault();\n }\n };\n\n const handleDidAttachWebview = (\n _event: Event,\n guestContents: WebContents\n ) => {\n if (pendingBrowserAttachCount <= 0) {\n return;\n }\n pendingBrowserAttachCount -= 1;\n\n onGuestAttached?.(guestContents);\n guestContents.setWindowOpenHandler(({ url }) => {\n const resolved = resolveBrowserNavigationUrl(url);\n if (resolved.url) {\n void Promise.resolve(openExternal(resolved.url)).catch(() => undefined);\n }\n return { action: \"deny\" };\n });\n };\n\n contents.on(\"will-attach-webview\", handleWillAttachWebview);\n contents.on(\"did-attach-webview\", handleDidAttachWebview);\n\n return () => {\n contents.off(\"will-attach-webview\", handleWillAttachWebview);\n contents.off(\"did-attach-webview\", handleDidAttachWebview);\n };\n}\n"],"mappings":";;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA,WAAW;AAAA,OAKN;AACP,SAAS,WAAW,oBAAoB;AACxC,SAAS,qBAAqB;AAE9B,SAAS,gBAAgB;AAUzB,IAAMA,WAAU,cAAc,YAAY,GAAG;AAI7C,IAAM,WAAWA,SAAQ,IAAI;AAC7B,IAAM,YAAY;AAClB,IAAM,EAAE,gBAAgB,IAAI;AAE5B,IAAM,mCAAmC;AACzC,IAAM,sBAAsB;AAG5B,IAAM,kCAAkC;AACxC,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAkCM,SAAS,sCAAsC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AACF,GAA0E;AACxE,QAAM,qBAAqB,oBAAI,QAAmC;AAClE,QAAM,cAAc,oBAAI,IAAyC;AACjE,QAAM,4BAA4B,IAAI,gBAAgB,EAAE,UAAU,KAAK,CAAC;AACxE,MAAI,SAAwB;AAC5B,MAAI,qBAA6C;AAEjD,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,WAAW,QAAQ,YAAY;AAErC,QAAM,sBAAsB,CAAC,QAAsB;AACjD,eAAW,CAAC,UAAU,YAAY,KAAK,YAAY,QAAQ,GAAG;AAC5D,UAAI,aAAa,aAAa,KAAK;AACjC,oBAAY,OAAO,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,YAA6B;AACzC,QAAI,QAAQ,WAAW;AACrB,aAAO,kBAAkB;AAAA,IAC3B;AACA,QAAI,oBAAoB;AACtB,aAAO;AAAA,IACT;AAEA,yBAAqB,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC5D,YAAM,aAAa,aAAa,CAAC,SAAS,aAAa;AACrD,aAAK,cAAc,SAAS,QAAQ;AAAA,MACtC,CAAC;AACD,iBAAW,GAAG,WAAW,CAAC,SAAS,QAAQ,SAAS;AAClD,aAAK,cAAc,SAAS,QAAkB,IAAI;AAAA,MACpD,CAAC;AAED,YAAM,UAAU,MAAY;AAC1B,mBAAW,eAAe,SAAS,OAAO;AAC1C,mBAAW,eAAe,aAAa,WAAW;AAAA,MACpD;AACA,YAAM,UAAU,CAAC,UAAuB;AACtC,gBAAQ;AACR,eAAO,KAAK;AAAA,MACd;AACA,YAAM,cAAc,MAAY;AAC9B,gBAAQ;AACR,iBAAS;AACT,gBAAQ,kBAAkB,CAAC;AAAA,MAC7B;AAEA,iBAAW,KAAK,SAAS,OAAO;AAChC,iBAAW,KAAK,aAAa,WAAW;AACxC,iBAAW,OAAO,GAAG,WAAW;AAAA,IAClC,CAAC,EAAE,QAAQ,MAAM;AACf,2BAAqB;AAAA,IACvB,CAAC;AAED,WAAO;AAAA,EACT;AAEA,QAAM,wBAAwB,OAC5B,gBACqD;AACrD,UAAM,OAAO,OAAO,YAAY,IAAI;AACpC,QAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AACvD,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,wBAAoB,GAAG;AAEvB,UAAM,WAAW,YAAY,SAAS;AACtC,UAAM,SAAS,YAAY,IAAI,QAAQ;AACvC,QAAI,UAAU,OAAO,YAAY,KAAK;AACpC,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,aAAa,MAAM,QAAQ;AAAA,MAC/B,QAAQ,SAAS,cAAc;AAAA,QAC7B;AAAA,QACA,KAAK,YAAY,SAAS;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,+BAA+B,UAAU;AACxD,gBAAY,IAAI,UAAU;AAAA,MACxB,WAAW,MAAM,KAAK,IAAI,GAAG,UAAU;AAAA,MACvC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,UAGX;AACnB,UAAM,cAAc,MAAM,eAAe,KAAK;AAC9C,QAAI,mBAAmB,IAAI,WAAW,GAAG;AACvC;AAAA,IACF;AACA,UAAM,UAAU,MAAM,MAAM;AAC5B,UAAM,YAAY,SAAS;AAAA,MACzB,MAAM;AAAA,MACN,kBAAkB;AAAA,MAClB,YAAY,QAAQ,OAAO;AAAA,IAC7B,CAAC;AACD,uBAAmB,IAAI,WAAW;AAAA,EACpC;AAEA,QAAM,UAAU,YAA2B;AACzC,gBAAY,MAAM;AAClB,8BAA0B,MAAM;AAChC,UAAM,eAAe;AACrB,aAAS;AACT,QAAI,CAAC,gBAAgB,CAAC,aAAa,WAAW;AAC5C;AAAA,IACF;AACA,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,mBAAa,MAAM,MAAM,QAAQ,CAAC;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,OACpB,SACA,aACkB;AAClB,UAAM,cAAc,uBAAuB,OAAO;AAClD,QAAI,CAAC,aAAa;AAChB,eAAS,UAAU,GAAG;AACtB,eAAS,IAAI,uBAAuB;AACpC;AAAA,IACF;AACA,QAAI,YAAY,aAAa,SAAS;AACpC,eAAS,UAAU,GAAG;AACtB,eAAS,IAAI,2BAA2B;AACxC;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,4BAA4B,WAAW;AACnE,QAAI,CAAC,cAAc,WAAW;AAC5B,eAAS,UAAU,GAAG;AACtB,eAAS,IAAI,2CAA2C;AACxD;AAAA,IACF;AAEA,UAAM,UAAU,mBAAmB,QAAQ,OAAO;AAClD,YAAQ,IAAI,QAAQ,cAAc,UAAU,IAAI;AAEhD,UAAM,UACJ,cAAc,UAAU,aAAa,WACjC,eACA;AACN,UAAM,WAAW;AAAA,MACf,cAAc;AAAA,MACd;AAAA,QACE,SAAS,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAAA,QAC7C,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,CAAC,qBAAqB;AACpB,cAAM,kBAAkB,mBAAmB,iBAAiB,OAAO;AACnE,cAAM,WAAW,gBAAgB,IAAI,UAAU;AAC/C,YAAI,YAAY,cAAc,gBAAgB;AAC5C,gBAAM,YAAY,wBAAwB;AAAA,YACxC;AAAA,YACA;AAAA,YACA,WAAW,cAAc,eAAe;AAAA,UAC1C,CAAC;AACD,cAAI,WAAW;AACb,4BAAgB,IAAI,YAAY,SAAS;AAAA,UAC3C;AAAA,QACF;AAEA,iBAAS;AAAA,UACP,iBAAiB,cAAc;AAAA,UAC/B,iBAAiB;AAAA,UACjB,OAAO,YAAY,gBAAgB,QAAQ,CAAC;AAAA,QAC9C;AACA,iBAAS,kBAAkB,UAAU,MAAM,MAAS;AAAA,MACtD;AAAA,IACF;AAEA,aAAS,GAAG,SAAS,CAAC,UAAU;AAC9B,cAAQ,OAAO,gDAAgD;AAAA,QAC7D,OAAO,oBAAoB,KAAK;AAAA,QAChC,aAAa,YAAY,SAAS;AAAA,QAClC,WAAW,cAAc,WAAW,SAAS,KAAK;AAAA,QAClD,aAAa,cAAc,gBAAgB,eAAe;AAAA,MAC5D,CAAC;AACD,UAAI,CAAC,SAAS,aAAa;AACzB,iBAAS,UAAU,GAAG;AAAA,MACxB;AACA,eAAS;AAAA,QACP,6CAA6C,oBAAoB,KAAK,CAAC;AAAA,MACzE;AAAA,IACF,CAAC;AAED,aAAS,SAAS,UAAU,MAAM,MAAS;AAAA,EAC7C;AAEA,QAAM,gBAAgB,OACpB,SACA,QACA,SACkB;AAClB,UAAM,cAAc,uBAAuB,SAAS,KAAK;AACzD,QAAI,CAAC,aAAa;AAChB,aAAO,QAAQ;AACf;AAAA,IACF;AACA,QAAI,YAAY,aAAa,OAAO;AAClC,aAAO,QAAQ;AACf;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,4BAA4B,WAAW;AACnE,UAAM,YAAY,cAAc;AAChC,QAAI,CAAC,WAAW;AACd,aAAO,QAAQ;AACf;AAAA,IACF;AAEA,8BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,eAAe;AACd,cAAM,UAAU,OAAO;AAAA,UACrB,mBAAmB,QAAQ,OAAO,EAAE,QAAQ;AAAA,QAC9C;AACA,gBAAQ,OAAO,UAAU;AAEzB,cAAM,WAAW,IAAI,UAAU,WAAW,EAAE,QAAQ,CAAC;AACrD,cAAM,kBAA+D,CAAC;AAEtE,mBAAW,GAAG,WAAW,CAAC,MAAM,aAAa;AAC3C,cAAI,SAAS,eAAe,UAAU,MAAM;AAC1C,qBAAS,KAAK,MAAM,EAAE,QAAQ,SAAS,CAAC;AACxC;AAAA,UACF;AACA,0BAAgB,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,QACzC,CAAC;AAED,iBAAS,KAAK,QAAQ,MAAM;AAC1B,qBAAW,eAAe,gBAAgB,OAAO,CAAC,GAAG;AACnD,qBAAS,KAAK,YAAY,MAAM,EAAE,QAAQ,YAAY,SAAS,CAAC;AAAA,UAClE;AAAA,QACF,CAAC;AAED,iBAAS,GAAG,WAAW,CAAC,MAAM,aAAa;AACzC,cAAI,WAAW,eAAe,UAAU,MAAM;AAC5C,uBAAW,KAAK,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,UAC5C;AAAA,QACF,CAAC;AAED,iBAAS,KAAK,SAAS,CAAC,MAAM,WAAW;AACvC,cACE,WAAW,eAAe,UAAU,QACpC,WAAW,eAAe,UAAU,YACpC;AACA,uBAAW,MAAM,4BAA4B,IAAI,GAAG,MAAM;AAAA,UAC5D;AAAA,QACF,CAAC;AAED,mBAAW,KAAK,SAAS,CAAC,MAAM,WAAW;AACzC,cACE,SAAS,eAAe,UAAU,QAClC,SAAS,eAAe,UAAU,YAClC;AACA,qBAAS,MAAM,4BAA4B,IAAI,GAAG,MAAM;AAAA,UAC1D;AAAA,QACF,CAAC;AAED,iBAAS,KAAK,SAAS,CAAC,UAAU;AAChC,kBAAQ,OAAO,kDAAkD;AAAA,YAC/D,OAAO,oBAAoB,KAAK;AAAA,YAChC,aAAa,YAAY,SAAS;AAAA,YAClC,WAAW,cAAc,WAAW,SAAS,KAAK;AAAA,YAClD,aAAa,cAAc,gBAAgB,eAAe;AAAA,UAC5D,CAAC;AACD,qBAAW,MAAM,MAAM,4CAA4C;AAAA,QACrE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,8BAA8B,OAClC,gBAII;AACJ,QAAI,CAAC,cAAc,WAAW,GAAG;AAC/B,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,sBAAsB,WAAW;AAC9D,QAAI,gBAAgB;AAClB,aAAO;AAAA,QACL;AAAA,QACA,WAAW,sBAAsB,eAAe,WAAW,WAAW;AAAA,MACxE;AAAA,IACF;AAEA,QAAI,aAAa,UAAU;AACzB,aAAO;AAAA,QACL,gBAAgB;AAAA,QAChB,WAAW,SAAS,WAAW;AAAA,MACjC;AAAA,IACF;AAEA,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,oBAAoB,MAAc;AACtC,UAAM,UAAU,QAAQ,QAAQ;AAChC,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AACA,WAAO,aAAa,QAAQ,IAAI;AAAA,EAClC;AAEA,QAAM,mBAAmB,MAAc;AACrC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,+BACP,OACyC;AACzC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,sBAAsB,MAAM,UAAU,KAAK;AACjD,MAAI,oBAAoB,WAAW,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,mBAAmB;AAC1C,QAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UAAU;AAC/D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,WAAW,OAAO,SAAS;AAAA,MAC3B,aAAa,MAAM;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBACP,SACA,kBAAkB,SACN;AACZ,QAAM,SAAS,QAAQ,OAAO;AAC9B,MAAI;AACF,QAAI,2BAA2B,KAAK,MAAM,GAAG;AAC3C,aAAO,IAAI,IAAI,MAAM;AAAA,IACvB;AACA,UAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAE,WAAW,GAAG;AACxD,aAAO;AAAA,IACT;AACA,UAAM,OAAO,OAAO,WAAW,GAAG,IAAI,SAAS,IAAI,MAAM;AACzD,WAAO,IAAI,IAAI,GAAG,eAAe,KAAK,IAAI,GAAG,IAAI,EAAE;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,OAA+C;AACzE,QAAM,SAAS,IAAI,QAAQ;AAC3B,QAAM,cAAc,CAAC,KAAa,UAAwB;AACxD,QAAI,gBAAgB,IAAI,IAAI,YAAY,CAAC,GAAG;AAC1C;AAAA,IACF;AACA,WAAO,OAAO,KAAK,KAAK;AAAA,EAC1B;AAEA,MAAI,iBAAiB,SAAS;AAC5B,UAAM,QAAQ,CAAC,OAAO,QAAQ;AAC5B,kBAAY,KAAK,KAAK;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,iBAAW,aAAa,OAAO;AAC7B,oBAAY,KAAK,SAAS;AAAA,MAC5B;AACA;AAAA,IACF;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,kBAAY,KAAK,KAAK;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAmB;AACxC,UACG,IAAI,aAAa,WAAW,IAAI,aAAa,UAC9C,oBAAoB,KAAK,IAAI,QAAQ,KACrC,IAAI,KAAK,SAAS;AAEtB;AAEA,SAAS,sBACP,WACA,aACY;AACZ,MAAI;AACF,UAAM,OAAO,IAAI,IAAI,SAAS;AAC9B,UAAM,qBAAqB,kBAAkB,KAAK,QAAQ;AAC1D,UAAM,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC;AACvC,YAAQ,WAAW,aAAa,oBAAoB,YAAY,QAAQ;AACxE,YAAQ,SAAS,YAAY;AAC7B,YAAQ,OAAO;AACf,QAAI,YAAY,aAAa,OAAO;AAClC,cAAQ,WAAW,QAAQ,aAAa,WAAW,SAAS;AAAA,IAC9D;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,MAAI;AACF,UAAM,aAAa,IAAI,IAAI,SAAS;AACpC,UAAM,mBAAmB,IAAI,IAAI,UAAU,UAAU;AACrD,QAAI,iBAAiB,WAAW,WAAW,QAAQ;AACjD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,kBAAkB,WAAW,QAAQ;AACtD,UAAM,eACJ,cAAc,UAAU,iBAAiB,QAAQ,KACjD,iBAAiB;AAEnB,UAAM,cAAc,IAAI,IAAI,YAAY,MAAM;AAC9C,qBAAiB,WAAW,YAAY;AACxC,qBAAiB,OAAO,YAAY;AACpC,qBAAiB,WAAW;AAC5B,qBAAiB,WAAW;AAC5B,qBAAiB,WAAW;AAC5B,WAAO,iBAAiB,SAAS;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,aAAa,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI,QAAQ;AACrE,SAAO,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,UAAU;AAC9D;AAEA,SAAS,aAAa,UAAkB,aAA6B;AACnE,QAAM,wBACJ,gBAAgB,MAAM,KAAK,YAAY,QAAQ,QAAQ,EAAE;AAC3D,SAAO,sBAAsB,SAAS,IAClC,GAAG,QAAQ,GAAG,qBAAqB,GAAG,QAAQ,WAAW,GAAG,IAC5D;AACN;AAEA,SAAS,cAAc,UAAkB,UAAiC;AACxE,QAAM,iBAAiB,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI,QAAQ;AACzE,MAAI,mBAAmB,SAAS,MAAM,GAAG,EAAE,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,CAAC,eAAe,WAAW,QAAQ,GAAG;AACxC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,eAAe,MAAM,SAAS,MAAM;AACnD,SAAO,OAAO,SAAS,IAAI,IAAI,MAAM,KAAK;AAC5C;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI;AACF,WAAO,IAAI,IAAI,IAAI,SAAS,CAAC;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,OAAwB;AACnD,MAAI,iBAAiB,OAAO;AAC1B,UAAM,OACJ,OAAQ,MAAgC,SAAS,WAC7C,IAAK,MAAgC,IAAI,KACzC;AACN,WAAO,GAAG,MAAM,OAAO,GAAG,IAAI;AAAA,EAChC;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,4BAA4B,MAAsB;AACzD,MAAI,SAAS,OAAS,QAAQ,OAAQ,QAAQ,MAAO;AACnD,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC5kBA,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAChC,IAAM,6BAA6B;AAiBnC,SAAS,2BACP,UACyB;AACzB,MAAI,SAAS,cAAc,eAAe;AACxC,WAAO,EAAE,MAAM,cAAc;AAAA,EAC/B;AAEA,MAAI,SAAS,cAAc,wBAAwB;AACjD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,kBAAkB;AACnC;AAEA,SAAS,0BACP,OACyB;AACzB,MAAI,MAAM,UAAU,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,MAAM,SAAS;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,KAAK,SAAS,KAAK,KAAK,UAAU,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,yBAAyB,KAAK;AAAA,IAC9B,0BAA0B,KAAK;AAAA,EACjC;AACA,MAAI,SAAS,GAAG;AACd,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,OAAO;AAAA,IAClB,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,KAAK,CAAC;AAAA,IACnD,SAAS;AAAA,IACT,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,KAAK,CAAC;AAAA,EACnD,CAAC;AACH;AAEA,SAAS,yBAAyB,OAGtB;AACV,SACE,MAAM,cAAc,8BACpB,MAAM,qBAAqB;AAE/B;AAEA,eAAe,iCACb,SACA,QACA,0BACA,QACe;AACf,QAAM,WAAW,QAAQ;AACzB,MACE,CAAC,YACD,SAAS,YAAY,KACrB,CAAC,4BACD,WAAW,QACX,QAAQ,uBAAuB,QAC/B;AACA;AAAA,EACF;AAEA,MAAI;AACF,UAAM,yBAAyB,UAAU,MAAM;AAC/C,YAAQ,qBAAqB;AAAA,EAC/B,SAAS,OAAO;AACd,YAAQ,qBAAqB;AAC7B,YAAQ,OAAO,kDAAkD;AAAA,MAC/D,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC5D,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA,eAAe,QAAQ;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkD;AAChD,QAAM,WAAW,oBAAI,IAAiC;AACtD,QAAM,wBAAwB,oBAAI,IAAoB;AACtD,MAAI,uBAAuB,0BAA0B,KAAK;AAE1D,QAAM,aAAa,CACjB,QACA,UAKwB;AACxB,UAAM,WAAW,SAAS,IAAI,MAAM;AACpC,QAAI,UAAU;AACZ,UAAI,OAAO,cAAc,QAAW;AAClC,iBAAS,YAAY,MAAM;AAAA,MAC7B;AACA,UAAI,OAAO,gBAAgB,QAAW;AACpC,iBAAS,cAAc,MAAM;AAAA,MAC/B;AACA,UAAI,OAAO,QAAQ,QAAW;AAC5B,iBAAS,aAAa,MAAM;AAAA,MAC9B;AACA,aAAO;AAAA,IACT;AAEA,UAAM,UAA+B;AAAA,MACnC,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,YAAY,OAAO,OAAO;AAAA,MAC1B,WAAW;AAAA,MACX,WAAW,CAAC;AAAA,MACZ;AAAA,MACA,WAAW,OAAO,aAAa;AAAA,MAC/B,aAAa,OAAO,eAAe;AAAA,MACnC,eAAe;AAAA,IACjB;AACA,aAAS,IAAI,QAAQ,OAAO;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,YAAuC;AAC3D,UAAM,WACJ,QAAQ,YAAY,CAAC,QAAQ,SAAS,YAAY,IAC9C,QAAQ,WACR;AACN,SAAK;AAAA,MACH,WAAW,WAAW,SAAS,UAAU,IAAI;AAAA,MAC7C,cAAc,WAAW,SAAS,aAAa,IAAI;AAAA,MACnD,oBAAoB,QAAQ,QAAQ;AAAA,MACpC,WAAW,WAAW,SAAS,UAAU,IAAI;AAAA,MAC7C,YAAY,QAAQ,cAAc;AAAA,MAClC,WAAW,QAAQ;AAAA,MACnB,QAAQ,QAAQ;AAAA,MAChB,OAAO,WAAW,SAAS,SAAS,KAAK,OAAO;AAAA,MAChD,MAAM;AAAA,MACN,KAAK,WACD,SAAS,OAAO,KAAK,QAAQ,aAC7B,QAAQ;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,CAAC,YAAuC;AAC1D,UAAM,WAAW,QAAQ;AACzB,UAAM,gBAAgB,QAAQ;AAC9B,QAAI,UAAU;AACZ,iBAAW,UAAU,QAAQ,WAAW;AACtC,iBAAS,IAAI,OAAO,OAAO,OAAO,QAAQ;AAAA,MAC5C;AAAA,IACF;AACA,YAAQ,YAAY,CAAC;AACrB,YAAQ,WAAW;AACnB,YAAQ,qBAAqB;AAC7B,YAAQ,gBAAgB;AACxB,QACE,kBAAkB,QAClB,sBAAsB,IAAI,aAAa,MAAM,QAAQ,QACrD;AACA,4BAAsB,OAAO,aAAa;AAAA,IAC5C;AACA,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,mCAAmC,CACvC,WACG;AACH,2BAAuB;AACvB,eAAW,WAAW,SAAS,OAAO,GAAG;AACvC,cAAQ,qBAAqB;AAC7B,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,MAAM,MAAM,MAAS;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,kCACJ,gCAAgC,gCAAgC,KAAK;AAEvE,QAAM,uBAAuB,CAAC,YAAuC;AACnE,UAAM,WAAW,QAAQ;AACzB,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,aAAa,OAAO;AAChD,UAAM,aAAa,IAAI,SAAoB;AACzC,YAAM,YAAY,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI;AAC1D,YAAM,mBACJ,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,IAAI;AAC1C,UAAI,yBAAyB,EAAE,WAAW,iBAAiB,CAAC,GAAG;AAC7D,qBAAa,OAAO;AACpB;AAAA,MACF;AACA,WAAK;AAAA,QACH,MAAM;AAAA,QACN,mBAAmB;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,cAAc,SAAY,SAAY,EAAE,UAAU;AAAA,QAC1D,MAAM;AAAA,MACR,CAAC;AACD,mBAAa,OAAO;AAAA,IACtB;AACA,UAAM,cAAc,MAAM,YAAY,OAAO;AAE7C,UAAM,UAA4C;AAAA,MAChD,EAAE,OAAO,qBAAqB,UAAU,cAAc;AAAA,MACtD,EAAE,OAAO,oBAAoB,UAAU,cAAc;AAAA,MACrD,EAAE,OAAO,gBAAgB,UAAU,cAAc;AAAA,MACjD,EAAE,OAAO,wBAAwB,UAAU,cAAc;AAAA,MACzD,EAAE,OAAO,sBAAsB,UAAU,cAAc;AAAA,MACvD,EAAE,OAAO,iBAAiB,UAAU,WAAW;AAAA,MAC/C,EAAE,OAAO,aAAa,UAAU,YAAY;AAAA,IAC9C;AAEA,eAAW,UAAU,SAAS;AAC5B,eAAS,GAAG,OAAO,OAAO,OAAO,QAAQ;AAAA,IAC3C;AACA,YAAQ,YAAY;AAAA,EACtB;AAEA,QAAM,iBAAiB,OACrB,YACkB;AAClB,UAAM,WAAW,QAAQ;AACzB,QAAI,CAAC,YAAY,SAAS,YAAY,GAAG;AACvC,mBAAa,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,WAAW,4BAA4B,QAAQ,UAAU;AAC/D,QAAI,CAAC,SAAS,KAAK;AACjB,WAAK;AAAA,QACH,GAAG,2BAA2B,QAAQ;AAAA,QACtC,QAAQ,QAAQ;AAAA,QAChB,MAAM;AAAA,MACR,CAAC;AACD,mBAAa,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,oBAAoB,8BAA8B,SAAS,OAAO,CAAC;AACzE,UAAM,iBAAiB,8BAA8B,SAAS,GAAG;AACjE,QAAI,qBAAqB,sBAAsB,gBAAgB;AAC7D,mBAAa,OAAO;AACpB;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,SAAS,GAAG;AACnC,iBAAa,OAAO;AAAA,EACtB;AAEA,QAAM,wBAAwB,CAAC,QAAoC;AACjE,UAAM,WAAW,4BAA4B,GAAG;AAChD,QAAI,SAAS,KAAK;AAChB,WAAK,QAAQ,QAAQ,aAAa,SAAS,GAAG,CAAC,EAAE;AAAA,QAC/C,CAAC,UAAmB;AAClB,kBAAQ,OAAO,oCAAoC;AAAA,YACjD,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL,MAAM,SAAS,OAAO;AACpB,YAAM,WAAW,4BAA4B,MAAM,GAAG;AACtD,UAAI,CAAC,SAAS,KAAK;AACjB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,YAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,QACvC,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,KAAK,SAAS;AAAA,MAChB,CAAC;AACD,cAAQ,YAAY;AACpB,YAAM,eAAe,OAAO;AAAA,IAC9B;AAAA,IACA,MAAM,eAAe,OAAO;AAC1B,YAAM,UAAU,SAAS,IAAI,MAAM,MAAM;AACzC,YAAM,WACJ,SAAS,YAAY,CAAC,QAAQ,SAAS,YAAY,IAC/C,QAAQ,WACR;AACN,UAAI,CAAC,UAAU,aAAa;AAC1B,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,MAAM,SAAS,YAAY;AACzC,UAAI,MAAM,UAAU,MAAM,MAAM;AAC9B,eAAO;AAAA,MACT;AAEA,aAAO,0BAA0B,KAAK,EAAE,UAAU;AAAA,IACpD;AAAA,IACA,MAAM,OAAO;AACX,YAAM,UAAU,SAAS,IAAI,MAAM,MAAM;AACzC,UAAI,SAAS;AACX,oBAAY,OAAO;AACnB,iBAAS,OAAO,MAAM,MAAM;AAAA,MAC9B;AACA,WAAK,EAAE,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC;AAC7C,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,UAAU,OAAO;AACf,YAAM,UAAU,SAAS,IAAI,MAAM,MAAM;AACzC,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AACA,YAAM,WACJ,QAAQ,YAAY,CAAC,QAAQ,SAAS,YAAY,IAC9C,QAAQ,WACR;AACN,aAAO;AAAA,QACL,WAAW,WAAW,SAAS,UAAU,IAAI;AAAA,QAC7C,cAAc,WAAW,SAAS,aAAa,IAAI;AAAA,QACnD,YAAY,WAAW,SAAS,OAAO,IAAI;AAAA,QAC3C,YAAY,QAAQ;AAAA,QACpB,oBAAoB,QAAQ,QAAQ;AAAA,QACpC,WAAW,WAAW,SAAS,UAAU,IAAI;AAAA,QAC7C,WAAW,QAAQ;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB,OAAO,WAAW,SAAS,SAAS,IAAI;AAAA,QACxC,sBAAsB,QAAQ,WAC1B,QAAQ,SAAS,YAAY,IAC7B;AAAA,QACJ,eAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AACZ,YAAM,WAAW,SAAS,IAAI,MAAM,MAAM,GAAG;AAC7C,UAAI,YAAY,CAAC,SAAS,YAAY,KAAK,SAAS,UAAU,GAAG;AAC/D,iBAAS,OAAO;AAAA,MAClB;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,UAAU,OAAO;AACf,YAAM,WAAW,SAAS,IAAI,MAAM,MAAM,GAAG;AAC7C,UAAI,YAAY,CAAC,SAAS,YAAY,KAAK,SAAS,aAAa,GAAG;AAClE,iBAAS,UAAU;AAAA,MACrB;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,MAAM,SAAS,OAAO;AACpB,YAAM,WAAW,4BAA4B,MAAM,GAAG;AACtD,UAAI,CAAC,SAAS,KAAK;AACjB,cAAM,IAAI,MAAM,sCAAsC;AAAA,MACxD;AACA,YAAM,UAAU,WAAW,MAAM,QAAQ,EAAE,KAAK,SAAS,IAAI,CAAC;AAC9D,cAAQ,YAAY;AACpB,YAAM,eAAe,OAAO;AAAA,IAC9B;AAAA,IACA,MAAM,eAAe,OAAO;AAC1B,YAAM,iBAAiB,KAAK;AAC5B,iBAAW,MAAM,QAAQ;AAAA,QACvB,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,cAAc,OAAO;AACzB,YAAM,iBAAiB;AAAA,QACrB,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,WAAW,mBAAmB,MAAM,aAAa;AACvD,UAAI,CAAC,YAAY,SAAS,YAAY,GAAG;AACvC,cAAM,IAAI;AAAA,UACR,sBAAsB,MAAM,aAAa;AAAA,QAC3C;AAAA,MACF;AAEA,YAAM,cAAc,sBAAsB,IAAI,MAAM,aAAa;AACjE,UAAI,eAAe,gBAAgB,MAAM,QAAQ;AAC/C,cAAM,IAAI;AAAA,UACR,sBAAsB,MAAM,aAAa;AAAA,QAC3C;AAAA,MACF;AAEA,YAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,QACvC,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,MACrB,CAAC;AACD,UACE,QAAQ,kBAAkB,MAAM,iBAChC,QAAQ,aAAa,UACrB;AACA,qBAAa,OAAO;AACpB;AAAA,MACF;AACA,UAAI,QAAQ,YAAY,QAAQ,aAAa,UAAU;AACrD,oBAAY,OAAO;AAAA,MACrB;AACA,cAAQ,WAAW;AACnB,cAAQ,gBAAgB,MAAM;AAC9B,4BAAsB,IAAI,MAAM,eAAe,MAAM,MAAM;AAC3D,cAAQ,YAAY;AACpB,eAAS,uBAAuB,CAAC,EAAE,IAAI,MAAM,sBAAsB,GAAG,CAAC;AACvE,2BAAqB,OAAO;AAC5B,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,eAAe,OAAO;AAAA,IAC9B;AAAA,IACA,OAAO,OAAO;AACZ,YAAM,WAAW,SAAS,IAAI,MAAM,MAAM,GAAG;AAC7C,UAAI,YAAY,CAAC,SAAS,YAAY,GAAG;AACvC,iBAAS,OAAO;AAAA,MAClB;AACA,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,gBAAgB,OAAO;AACrB,YAAM,UAAU,SAAS,IAAI,MAAM,MAAM;AACzC,UAAI,CAAC,WAAW,QAAQ,kBAAkB,MAAM,eAAe;AAC7D,eAAO,QAAQ,QAAQ;AAAA,MACzB;AACA,cAAQ,YAAY;AACpB,kBAAY,OAAO;AACnB,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAAA,IACA,UAAU;AACR,wCAAkC;AAAA,IACpC;AAAA,EACF;AACF;;;AC1aO,SAAS,gCACd,OACM;AACN,QAAM,mBAAmB,oBAAI,QAA4C;AACzE,QAAM,uBACJ,MAAM,2BAA2B,SAC7B,sCAAsC;AAAA,IACpC,QAAQ,MAAM;AAAA,IACd,gBAAgB,OAAO,EAAE,WAAW,YAAY,MAAM;AACpD,YAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,UAAU;AAC3C,aAAO,QAAQ;AAAA,QACb,+BAA+B;AAAA,UAC7B;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,SAAS,MAAM;AAAA,EACjB,CAAC,IACD;AAEN,QAAM,iBAAiB,CAAC,UAAwC;AAC9D,UAAM,cAAc,MAAM,eAAe,KAAK;AAC9C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,UAAM,WAAW,iBAAiB,IAAI,WAAW;AACjD,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,0BAA0B;AAAA,MACxC,KAAK,cAAc;AACjB,YAAI,CAAC,YAAY,YAAY,GAAG;AAC9B,sBAAY,YAAY,KAAK,MAAM,SAAS,OAAO,YAAY;AAAA,QACjE;AAAA,MACF;AAAA,MACA,yBAAyB,MAAM;AAAA,MAC/B,QAAQ,MAAM;AAAA,MACd,cAAc,MAAM;AAAA,MACpB,gBACE,yBAAyB,OACrB,CAAC,YAAY,qBAAqB,iBAAiB,OAAO,IAC1D;AAAA,MACN,oBAAoB,CAAC,kBACnB,MAAM,mBAAmB;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACH,0BAA0B,MAAM;AAAA,MAChC,+BAA+B,MAAM;AAAA,IACvC,CAAC;AACD,gBAAY,KAAK,UAAU,MAAM;AAC/B,cAAQ,QAAQ;AAChB,uBAAiB,OAAO,WAAW;AAAA,IACrC,CAAC;AACD,qBAAiB,IAAI,aAAa,OAAO;AACzC,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAgB,CAAC,OAAO,YAC3D,eAAe,KAAK,EAAE;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAU,CAAC,OAAO,YACrD,eAAe,KAAK,EAAE,SAAS,OAAqC;AAAA,EACtE;AACA,MAAI,MAAM,SAAS,gBAAgB;AACjC,UAAM;AAAA,MAAgB,MAAM,SAAS;AAAA,MAAgB,CAAC,OAAO,YAC3D,eAAe,KAAK,EAAE,eAAe,OAAiC;AAAA,IACxE;AAAA,EACF;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAe,CAAC,OAAO,YAC1D,eAAe,KAAK,EAAE;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAiB,CAAC,OAAO,YAC5D,eAAe,KAAK,EAAE;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAU,CAAC,OAAO,YACrD,eAAe,KAAK,EAAE,SAAS,OAAmC;AAAA,EACpE;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAQ,CAAC,OAAO,YACnD,eAAe,KAAK,EAAE,OAAO,OAAiC;AAAA,EAChE;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAW,CAAC,OAAO,YACtD,eAAe,KAAK,EAAE,UAAU,OAAiC;AAAA,EACnE;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAQ,CAAC,OAAO,YACnD,eAAe,KAAK,EAAE,OAAO,OAAiC;AAAA,EAChE;AACA,QAAM;AAAA,IAAgB,MAAM,SAAS;AAAA,IAAO,CAAC,OAAO,YAClD,eAAe,KAAK,EAAE,MAAM,OAAiC;AAAA,EAC/D;AACA,MAAI,MAAM,SAAS,WAAW;AAC5B,UAAM;AAAA,MAAgB,MAAM,SAAS;AAAA,MAAW,CAAC,OAAO,YACtD,eAAe,KAAK,EAAE,UAAU,OAAiC;AAAA,IACnE;AAAA,EACF;AACF;;;ACzIO,SAAS,2BACd,QACS;AACT,SACE,OAAO,2BAA2B,MAAM,UACxC,iCAAiC,OAAO,SAAS;AAErD;AAEO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF,GAA8D;AAC5D,iBAAe,8BAA8B;AAC7C,iBAAe,mBAAmB;AAClC,iBAAe,aAAa;AAC5B,iBAAe,kBAAkB;AACjC,iBAAe,UAAU;AACzB,iBAAe,UAAU;AACzB,iBAAe,cAAc;AAC7B,SAAO,eAAe;AAEtB,QAAM,YAAY,OAAO;AACzB,MAAI,CAAC,aAAa,CAAC,iCAAiC,SAAS,GAAG;AAC9D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,4BAA4B,OAAO,OAAO,aAAa;AACxE,MAAI,CAAC,SAAS,KAAK;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO,MAAM,SAAS;AAEtB,QAAM,UAAU,iBAAiB,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;AAC1D,QAAM,kBAAkB,OAAO,YAAY,WAAW,QAAQ,KAAK,IAAI;AACvE,MAAI,gBAAgB,SAAS,GAAG;AAC9B,mBAAe,UAAU;AAAA,EAC3B;AAEA,SAAO,EAAE,SAAS,MAAM,QAAQ,KAAK;AACvC;AAWO,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB;AACxB,GAAmD;AACjD,MAAI,4BAA4B;AAEhC,QAAM,0BAA0B,CAC9B,OACA,gBACA,WACG;AACH,QAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC;AAAA,IACF;AAEA,iCAA6B;AAC7B,UAAM,SAAS,8BAA8B;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,CAAC,OAAO,SAAS;AACnB,kCAA4B,KAAK,IAAI,GAAG,4BAA4B,CAAC;AACrE,cAAQ,OAAO,gCAAgC,EAAE,QAAQ,OAAO,OAAO,CAAC;AACxE,YAAM,eAAe;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,yBAAyB,CAC7B,QACA,kBACG;AACH,QAAI,6BAA6B,GAAG;AAClC;AAAA,IACF;AACA,iCAA6B;AAE7B,sBAAkB,aAAa;AAC/B,kBAAc,qBAAqB,CAAC,EAAE,IAAI,MAAM;AAC9C,YAAM,WAAW,4BAA4B,GAAG;AAChD,UAAI,SAAS,KAAK;AAChB,aAAK,QAAQ,QAAQ,aAAa,SAAS,GAAG,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,MACxE;AACA,aAAO,EAAE,QAAQ,OAAO;AAAA,IAC1B,CAAC;AAAA,EACH;AAEA,WAAS,GAAG,uBAAuB,uBAAuB;AAC1D,WAAS,GAAG,sBAAsB,sBAAsB;AAExD,SAAO,MAAM;AACX,aAAS,IAAI,uBAAuB,uBAAuB;AAC3D,aAAS,IAAI,sBAAsB,sBAAsB;AAAA,EAC3D;AACF;","names":["require"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextop-os/browser-node",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"directory": "packages/browser/workbench-node"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@nextop-os/ui-i18n-runtime": "0.0.
|
|
48
|
-
"@nextop-os/ui-react-hooks": "0.0.
|
|
49
|
-
"@nextop-os/ui-system": "0.0.
|
|
50
|
-
"@nextop-os/workbench-surface": "0.0.
|
|
47
|
+
"@nextop-os/ui-i18n-runtime": "0.0.21",
|
|
48
|
+
"@nextop-os/ui-react-hooks": "0.0.21",
|
|
49
|
+
"@nextop-os/ui-system": "0.0.21",
|
|
50
|
+
"@nextop-os/workbench-surface": "0.0.21",
|
|
51
51
|
"ws": "^8.21.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|