@nextop-os/browser-node 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -0
- package/dist/assets/workspace-dock-website.png +0 -0
- package/dist/bridge/index.d.ts +15 -0
- package/dist/bridge/index.js +9 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/chunk-2ZAMKGGP.js +66 -0
- package/dist/chunk-2ZAMKGGP.js.map +1 -0
- package/dist/chunk-IO5AJ2R5.js +111 -0
- package/dist/chunk-IO5AJ2R5.js.map +1 -0
- package/dist/chunk-JRJTAIK5.js +83 -0
- package/dist/chunk-JRJTAIK5.js.map +1 -0
- package/dist/chunk-OTK5YBCK.js +27 -0
- package/dist/chunk-OTK5YBCK.js.map +1 -0
- package/dist/chunk-VQTJWLWO.js +551 -0
- package/dist/chunk-VQTJWLWO.js.map +1 -0
- package/dist/electron-main/index.d.ts +125 -0
- package/dist/electron-main/index.js +509 -0
- package/dist/electron-main/index.js.map +1 -0
- package/dist/electron-preload/index.d.ts +11 -0
- package/dist/electron-preload/index.js +29 -0
- package/dist/electron-preload/index.js.map +1 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.js +13 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +169 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.d.ts +46 -0
- package/dist/react/index.js +12 -0
- package/dist/react/index.js.map +1 -0
- package/dist/types-4cyQPaaT.d.ts +110 -0
- package/dist/types-Bmzz1Q84.d.ts +32 -0
- package/dist/workbench/index.d.ts +34 -0
- package/dist/workbench/index.js +132 -0
- package/dist/workbench/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron-main/previewRoute.ts","../../src/electron-main/guestManager.ts","../../src/electron-main/registerElectronMain.ts","../../src/electron-main/webviewSecurity.ts"],"sourcesContent":["export interface BrowserNodePreviewRoute {\n readonly sourceUrl: string;\n readonly targetUrl: string;\n}\n\nexport interface BrowserNodePreviewRouteResolver {\n resolveRoutes(input: {\n nodeId: string;\n url: string;\n }): BrowserNodePreviewRoute[] | Promise<BrowserNodePreviewRoute[]>;\n}\n\nexport function createNoopBrowserNodePreviewRouteResolver(): BrowserNodePreviewRouteResolver {\n return {\n resolveRoutes: () => []\n };\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 { createNoopBrowserNodePreviewRouteResolver } from \"./previewRoute.ts\";\nimport type {\n BrowserGuestManager,\n BrowserGuestManagerInput,\n BrowserGuestNativeImage,\n BrowserGuestWebContents\n} from \"./types.ts\";\n\nconst browserPreviewMaxWidth = 260;\nconst browserPreviewMaxHeight = 170;\nconst abortedNavigationErrorCode = -3;\n\ninterface BrowserGuestSession {\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\nexport function createBrowserGuestManager({\n emit,\n logger,\n openExternal,\n previewRouteResolver = createNoopBrowserNodePreviewRouteResolver(),\n resolveWebContents\n}: BrowserGuestManagerInput): BrowserGuestManager {\n const sessions = new Map<string, BrowserGuestSession>();\n const nodeIdByWebContentsId = new Map<number, string>();\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 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.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 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 routes = await previewRouteResolver.resolveRoutes({\n nodeId: session.nodeId,\n url: resolved.url\n });\n const routedUrl =\n routes.find((route) => route.sourceUrl === resolved.url)?.targetUrl ??\n resolved.url;\n const currentComparable = normalizeBrowserComparableUrl(contents.getURL());\n const nextComparable = normalizeBrowserComparableUrl(routedUrl);\n if (currentComparable && currentComparable === nextComparable) {\n publishState(session);\n return;\n }\n\n await contents.loadURL(routedUrl);\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 prepareSession(input) {\n getSession(input.nodeId, {\n profileId: input.profileId,\n sessionMode: input.sessionMode\n });\n return Promise.resolve();\n },\n async registerGuest(input) {\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 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 };\n}\n","import type { BrowserWindow } from \"electron\";\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 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 logger?: BrowserNodeElectronLogger;\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}\n\nexport function registerBrowserNodeElectronMain(\n input: RegisterBrowserNodeElectronMainInput\n): void {\n const managersByWindow = new WeakMap<BrowserWindow, BrowserGuestManager>();\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 logger: input.logger,\n openExternal: input.openExternal,\n resolveWebContents: (webContentsId) =>\n input.resolveWebContents({\n event,\n ownerWindow,\n webContentsId\n })\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":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { f as BrowserNodeBridgeResult, e as BrowserNodeBridgeMethodDescriptor } from '../types-Bmzz1Q84.js';
|
|
2
|
+
|
|
3
|
+
interface InstallBrowserNodeGuestBridgeInput {
|
|
4
|
+
call: (method: string, args: unknown) => Promise<BrowserNodeBridgeResult<unknown>>;
|
|
5
|
+
debug?: boolean;
|
|
6
|
+
methods: readonly BrowserNodeBridgeMethodDescriptor[];
|
|
7
|
+
namespace: string;
|
|
8
|
+
}
|
|
9
|
+
declare function installBrowserNodeGuestBridge({ call, debug, methods, namespace }: InstallBrowserNodeGuestBridgeInput): void;
|
|
10
|
+
|
|
11
|
+
export { type InstallBrowserNodeGuestBridgeInput, installBrowserNodeGuestBridge };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildBrowserNodeBridgeApiTree
|
|
3
|
+
} from "../chunk-IO5AJ2R5.js";
|
|
4
|
+
|
|
5
|
+
// src/electron-preload/index.ts
|
|
6
|
+
import { contextBridge } from "electron";
|
|
7
|
+
function installBrowserNodeGuestBridge({
|
|
8
|
+
call,
|
|
9
|
+
debug = false,
|
|
10
|
+
methods,
|
|
11
|
+
namespace
|
|
12
|
+
}) {
|
|
13
|
+
const currentUrl = globalThis.location?.href ?? "";
|
|
14
|
+
const api = buildBrowserNodeBridgeApiTree({
|
|
15
|
+
call,
|
|
16
|
+
currentUrl,
|
|
17
|
+
methods,
|
|
18
|
+
namespace,
|
|
19
|
+
wrapCallable: debug ? (methodName, callable) => async (args) => {
|
|
20
|
+
console.debug("[browser-node:bridge]", methodName);
|
|
21
|
+
return await callable(args);
|
|
22
|
+
} : void 0
|
|
23
|
+
});
|
|
24
|
+
contextBridge.exposeInMainWorld(namespace.trim(), api);
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
installBrowserNodeGuestBridge
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/electron-preload/index.ts"],"sourcesContent":["import { contextBridge } from \"electron\";\nimport {\n buildBrowserNodeBridgeApiTree,\n type BrowserNodeBridgeMethodDescriptor,\n type BrowserNodeBridgeResult\n} from \"../bridge/index.ts\";\n\nexport interface InstallBrowserNodeGuestBridgeInput {\n call: (\n method: string,\n args: unknown\n ) => Promise<BrowserNodeBridgeResult<unknown>>;\n debug?: boolean;\n methods: readonly BrowserNodeBridgeMethodDescriptor[];\n namespace: string;\n}\n\nexport function installBrowserNodeGuestBridge({\n call,\n debug = false,\n methods,\n namespace\n}: InstallBrowserNodeGuestBridgeInput): void {\n const currentUrl = globalThis.location?.href ?? \"\";\n const api = buildBrowserNodeBridgeApiTree({\n call,\n currentUrl,\n methods,\n namespace,\n wrapCallable: debug\n ? (methodName, callable) => async (args?: unknown) => {\n console.debug(\"[browser-node:bridge]\", methodName);\n return await callable(args);\n }\n : undefined\n });\n\n contextBridge.exposeInMainWorld(namespace.trim(), api);\n}\n"],"mappings":";;;;;AAAA,SAAS,qBAAqB;AAiBvB,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAA6C;AAC3C,QAAM,aAAa,WAAW,UAAU,QAAQ;AAChD,QAAM,MAAM,8BAA8B;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,QACV,CAAC,YAAY,aAAa,OAAO,SAAmB;AAClD,cAAQ,MAAM,yBAAyB,UAAU;AACjD,aAAO,MAAM,SAAS,IAAI;AAAA,IAC5B,IACA;AAAA,EACN,CAAC;AAED,gBAAc,kBAAkB,UAAU,KAAK,GAAG,GAAG;AACvD;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as _nextop_os_ui_i18n_runtime from '@nextop-os/ui-i18n-runtime';
|
|
2
|
+
import { I18nRuntime, I18nDictionary } from '@nextop-os/ui-i18n-runtime';
|
|
3
|
+
|
|
4
|
+
declare const browserNodeI18nNamespace = "browserNode";
|
|
5
|
+
declare const browserNodeI18nModule: _nextop_os_ui_i18n_runtime.ScopedLocaleObjectsI18nModuleManifest;
|
|
6
|
+
type BrowserNodeI18nKey = "actions.back" | "actions.forward" | "actions.reload" | "addressLabel" | "addressPlaceholder" | "coldStatus" | "dockLabel" | "errors.invalidUrl" | "errors.navigationFailed" | "errors.unsupportedProtocol" | "errors.unsupportedUrl" | "loadFailed" | "title";
|
|
7
|
+
type BrowserNodeI18nRuntime = I18nRuntime<BrowserNodeI18nKey>;
|
|
8
|
+
declare const browserNodeI18nResources: {
|
|
9
|
+
readonly en: {
|
|
10
|
+
readonly browserNode: I18nDictionary;
|
|
11
|
+
};
|
|
12
|
+
readonly "zh-CN": {
|
|
13
|
+
readonly browserNode: I18nDictionary;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
declare function createBrowserNodeI18nRuntime(runtime: I18nRuntime<string> | undefined): BrowserNodeI18nRuntime;
|
|
17
|
+
|
|
18
|
+
export { type BrowserNodeI18nKey, type BrowserNodeI18nRuntime, browserNodeI18nModule, browserNodeI18nNamespace, browserNodeI18nResources, createBrowserNodeI18nRuntime };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
browserNodeI18nModule,
|
|
3
|
+
browserNodeI18nNamespace,
|
|
4
|
+
browserNodeI18nResources,
|
|
5
|
+
createBrowserNodeI18nRuntime
|
|
6
|
+
} from "../chunk-JRJTAIK5.js";
|
|
7
|
+
export {
|
|
8
|
+
browserNodeI18nModule,
|
|
9
|
+
browserNodeI18nNamespace,
|
|
10
|
+
browserNodeI18nResources,
|
|
11
|
+
createBrowserNodeI18nRuntime
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { I18nRuntime } from '@nextop-os/ui-i18n-runtime';
|
|
2
|
+
import { BrowserNodeI18nRuntime } from './i18n/index.js';
|
|
3
|
+
import { f as BrowserNodeEvent, o as BrowserNodeRuntimeState, g as BrowserNodeHostApi } from './types-4cyQPaaT.js';
|
|
4
|
+
export { B as BrowserNodeActivationInput, a as BrowserNodeClosedEvent, b as BrowserNodeDebugDump, c as BrowserNodeErrorCode, d as BrowserNodeErrorEvent, e as BrowserNodeErrorParams, h as BrowserNodeLifecycle, i as BrowserNodeNavigateInput, j as BrowserNodeNodeIdInput, k as BrowserNodeOpenUrlEvent, l as BrowserNodePrepareSessionInput, m as BrowserNodeRegisterGuestInput, n as BrowserNodeRuntimeError, p as BrowserNodeSessionMode, q as BrowserNodeStateEvent, r as BrowserNodeUnregisterGuestInput } from './types-4cyQPaaT.js';
|
|
5
|
+
|
|
6
|
+
interface BrowserNodeRuntimeStore {
|
|
7
|
+
applyEvent(event: BrowserNodeEvent): void;
|
|
8
|
+
clearAll(): void;
|
|
9
|
+
clearNode(nodeId: string): void;
|
|
10
|
+
getNodeState(nodeId: string): BrowserNodeRuntimeState;
|
|
11
|
+
getSnapshot(): Record<string, BrowserNodeRuntimeState | undefined>;
|
|
12
|
+
subscribe(listener: () => void): () => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
type BrowserNavigationUrlErrorCode = "invalid-url" | "unsupported-protocol";
|
|
16
|
+
interface BrowserNavigationUrlResolution {
|
|
17
|
+
errorCode: BrowserNavigationUrlErrorCode | null;
|
|
18
|
+
errorParams?: Record<string, string>;
|
|
19
|
+
url: string | null;
|
|
20
|
+
}
|
|
21
|
+
type BrowserSearchUrlResolver = (query: string) => string | null;
|
|
22
|
+
type BrowserAddressInputResolution = BrowserNavigationUrlResolution;
|
|
23
|
+
|
|
24
|
+
interface BrowserNodeFeature {
|
|
25
|
+
hostApi: BrowserNodeHostApi;
|
|
26
|
+
i18n: BrowserNodeI18nRuntime;
|
|
27
|
+
resolveAddressInput(rawInput: string): BrowserAddressInputResolution;
|
|
28
|
+
runtimeStore: BrowserNodeRuntimeStore;
|
|
29
|
+
connect(): () => void;
|
|
30
|
+
}
|
|
31
|
+
interface CreateBrowserNodeFeatureInput {
|
|
32
|
+
hostApi: BrowserNodeHostApi;
|
|
33
|
+
i18n?: I18nRuntime<string>;
|
|
34
|
+
resolveSearchUrl?: BrowserSearchUrlResolver;
|
|
35
|
+
runtimeStore?: BrowserNodeRuntimeStore;
|
|
36
|
+
}
|
|
37
|
+
declare function createBrowserNodeFeature({ hostApi, i18n, resolveSearchUrl, runtimeStore }: CreateBrowserNodeFeatureInput): BrowserNodeFeature;
|
|
38
|
+
|
|
39
|
+
export { type BrowserAddressInputResolution, type BrowserNavigationUrlErrorCode, type BrowserNavigationUrlResolution, BrowserNodeEvent, type BrowserNodeFeature, BrowserNodeHostApi, BrowserNodeRuntimeState, type BrowserSearchUrlResolver, type CreateBrowserNodeFeatureInput, createBrowserNodeFeature };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveBrowserAddressInput
|
|
3
|
+
} from "./chunk-2ZAMKGGP.js";
|
|
4
|
+
import {
|
|
5
|
+
createBrowserNodeI18nRuntime
|
|
6
|
+
} from "./chunk-JRJTAIK5.js";
|
|
7
|
+
|
|
8
|
+
// src/core/runtimeStore.ts
|
|
9
|
+
var defaultBrowserNodeRuntimeState = {
|
|
10
|
+
canGoBack: false,
|
|
11
|
+
canGoForward: false,
|
|
12
|
+
error: null,
|
|
13
|
+
isAttachedToWindow: false,
|
|
14
|
+
isLoading: false,
|
|
15
|
+
isOccluded: false,
|
|
16
|
+
lifecycle: "cold",
|
|
17
|
+
title: null,
|
|
18
|
+
url: null
|
|
19
|
+
};
|
|
20
|
+
function normalizePublishedBrowserValue(value) {
|
|
21
|
+
const trimmed = value?.trim() ?? "";
|
|
22
|
+
if (trimmed.length === 0 || trimmed === "about:blank") {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return trimmed;
|
|
26
|
+
}
|
|
27
|
+
function shouldClearLoadError({
|
|
28
|
+
isLoading,
|
|
29
|
+
previous,
|
|
30
|
+
title,
|
|
31
|
+
url
|
|
32
|
+
}) {
|
|
33
|
+
if (isLoading) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
if (previous.error === null) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return Boolean(url && url.trim() || title && title.trim());
|
|
40
|
+
}
|
|
41
|
+
function createBrowserNodeRuntimeStore() {
|
|
42
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
43
|
+
let runtimeByNodeId = {};
|
|
44
|
+
const notify = () => {
|
|
45
|
+
for (const listener of listeners) {
|
|
46
|
+
listener();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return {
|
|
50
|
+
applyEvent(event) {
|
|
51
|
+
if (event.type === "open-url") {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (event.type === "closed") {
|
|
55
|
+
if (!runtimeByNodeId[event.nodeId]) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const next2 = { ...runtimeByNodeId };
|
|
59
|
+
delete next2[event.nodeId];
|
|
60
|
+
runtimeByNodeId = next2;
|
|
61
|
+
notify();
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const previous = runtimeByNodeId[event.nodeId] ?? defaultBrowserNodeRuntimeState;
|
|
65
|
+
const next = event.type === "state" ? resolveNextState(previous, event) : {
|
|
66
|
+
...previous,
|
|
67
|
+
error: {
|
|
68
|
+
code: event.code,
|
|
69
|
+
diagnosticMessage: event.diagnosticMessage,
|
|
70
|
+
params: event.params
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
runtimeByNodeId = {
|
|
74
|
+
...runtimeByNodeId,
|
|
75
|
+
[event.nodeId]: next
|
|
76
|
+
};
|
|
77
|
+
notify();
|
|
78
|
+
},
|
|
79
|
+
clearAll() {
|
|
80
|
+
if (Object.keys(runtimeByNodeId).length === 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
runtimeByNodeId = {};
|
|
84
|
+
notify();
|
|
85
|
+
},
|
|
86
|
+
clearNode(nodeId) {
|
|
87
|
+
const normalized = nodeId.trim();
|
|
88
|
+
if (normalized.length === 0 || !runtimeByNodeId[normalized]) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const next = { ...runtimeByNodeId };
|
|
92
|
+
delete next[normalized];
|
|
93
|
+
runtimeByNodeId = next;
|
|
94
|
+
notify();
|
|
95
|
+
},
|
|
96
|
+
getNodeState(nodeId) {
|
|
97
|
+
return runtimeByNodeId[nodeId] ?? defaultBrowserNodeRuntimeState;
|
|
98
|
+
},
|
|
99
|
+
getSnapshot() {
|
|
100
|
+
return runtimeByNodeId;
|
|
101
|
+
},
|
|
102
|
+
subscribe(listener) {
|
|
103
|
+
listeners.add(listener);
|
|
104
|
+
return () => {
|
|
105
|
+
listeners.delete(listener);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function resolveNextState(previous, event) {
|
|
111
|
+
const nextUrl = normalizePublishedBrowserValue(event.url) ?? (event.lifecycle !== "cold" ? previous.url : null);
|
|
112
|
+
const nextTitle = normalizePublishedBrowserValue(event.title) ?? (event.lifecycle !== "cold" ? previous.title : null);
|
|
113
|
+
return {
|
|
114
|
+
...previous,
|
|
115
|
+
canGoBack: event.canGoBack,
|
|
116
|
+
canGoForward: event.canGoForward,
|
|
117
|
+
error: shouldClearLoadError({
|
|
118
|
+
isLoading: event.isLoading,
|
|
119
|
+
previous,
|
|
120
|
+
title: nextTitle,
|
|
121
|
+
url: nextUrl
|
|
122
|
+
}) ? null : previous.error,
|
|
123
|
+
isAttachedToWindow: event.isAttachedToWindow ?? previous.isAttachedToWindow,
|
|
124
|
+
isLoading: event.isLoading,
|
|
125
|
+
isOccluded: event.isOccluded,
|
|
126
|
+
lifecycle: event.lifecycle,
|
|
127
|
+
title: nextTitle,
|
|
128
|
+
url: nextUrl
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// src/core/feature.ts
|
|
133
|
+
function createBrowserNodeFeature({
|
|
134
|
+
hostApi,
|
|
135
|
+
i18n,
|
|
136
|
+
resolveSearchUrl,
|
|
137
|
+
runtimeStore = createBrowserNodeRuntimeStore()
|
|
138
|
+
}) {
|
|
139
|
+
let listenerCount = 0;
|
|
140
|
+
let disconnect = null;
|
|
141
|
+
const connect = () => {
|
|
142
|
+
listenerCount += 1;
|
|
143
|
+
if (!disconnect) {
|
|
144
|
+
disconnect = hostApi.onEvent((event) => {
|
|
145
|
+
runtimeStore.applyEvent(event);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return () => {
|
|
149
|
+
listenerCount = Math.max(0, listenerCount - 1);
|
|
150
|
+
if (listenerCount === 0) {
|
|
151
|
+
disconnect?.();
|
|
152
|
+
disconnect = null;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
connect,
|
|
158
|
+
hostApi,
|
|
159
|
+
i18n: createBrowserNodeI18nRuntime(i18n),
|
|
160
|
+
resolveAddressInput(rawInput) {
|
|
161
|
+
return resolveBrowserAddressInput(rawInput, { resolveSearchUrl });
|
|
162
|
+
},
|
|
163
|
+
runtimeStore
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
createBrowserNodeFeature
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/runtimeStore.ts","../src/core/feature.ts"],"sourcesContent":["import type { BrowserNodeEvent, BrowserNodeRuntimeState } from \"./types.ts\";\n\nexport interface BrowserNodeRuntimeStore {\n applyEvent(event: BrowserNodeEvent): void;\n clearAll(): void;\n clearNode(nodeId: string): void;\n getNodeState(nodeId: string): BrowserNodeRuntimeState;\n getSnapshot(): Record<string, BrowserNodeRuntimeState | undefined>;\n subscribe(listener: () => void): () => void;\n}\n\nconst defaultBrowserNodeRuntimeState: BrowserNodeRuntimeState = {\n canGoBack: false,\n canGoForward: false,\n error: null,\n isAttachedToWindow: false,\n isLoading: false,\n isOccluded: false,\n lifecycle: \"cold\",\n title: null,\n url: null\n};\n\nfunction normalizePublishedBrowserValue(\n value: string | null | undefined\n): string | null {\n const trimmed = value?.trim() ?? \"\";\n if (trimmed.length === 0 || trimmed === \"about:blank\") {\n return null;\n }\n return trimmed;\n}\n\nfunction shouldClearLoadError({\n isLoading,\n previous,\n title,\n url\n}: {\n isLoading: boolean;\n previous: BrowserNodeRuntimeState;\n title: string | null;\n url: string | null;\n}): boolean {\n if (isLoading) {\n return true;\n }\n\n if (previous.error === null) {\n return false;\n }\n\n return Boolean((url && url.trim()) || (title && title.trim()));\n}\n\nexport function createBrowserNodeRuntimeStore(): BrowserNodeRuntimeStore {\n const listeners = new Set<() => void>();\n let runtimeByNodeId: Record<string, BrowserNodeRuntimeState | undefined> = {};\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n applyEvent(event) {\n if (event.type === \"open-url\") {\n return;\n }\n\n if (event.type === \"closed\") {\n if (!runtimeByNodeId[event.nodeId]) {\n return;\n }\n const next = { ...runtimeByNodeId };\n delete next[event.nodeId];\n runtimeByNodeId = next;\n notify();\n return;\n }\n\n const previous =\n runtimeByNodeId[event.nodeId] ?? defaultBrowserNodeRuntimeState;\n const next =\n event.type === \"state\"\n ? resolveNextState(previous, event)\n : {\n ...previous,\n error: {\n code: event.code,\n diagnosticMessage: event.diagnosticMessage,\n params: event.params\n }\n };\n\n runtimeByNodeId = {\n ...runtimeByNodeId,\n [event.nodeId]: next\n };\n notify();\n },\n clearAll() {\n if (Object.keys(runtimeByNodeId).length === 0) {\n return;\n }\n runtimeByNodeId = {};\n notify();\n },\n clearNode(nodeId) {\n const normalized = nodeId.trim();\n if (normalized.length === 0 || !runtimeByNodeId[normalized]) {\n return;\n }\n const next = { ...runtimeByNodeId };\n delete next[normalized];\n runtimeByNodeId = next;\n notify();\n },\n getNodeState(nodeId) {\n return runtimeByNodeId[nodeId] ?? defaultBrowserNodeRuntimeState;\n },\n getSnapshot() {\n return runtimeByNodeId;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n };\n}\n\nfunction resolveNextState(\n previous: BrowserNodeRuntimeState,\n event: Extract<BrowserNodeEvent, { type: \"state\" }>\n): BrowserNodeRuntimeState {\n const nextUrl =\n normalizePublishedBrowserValue(event.url) ??\n (event.lifecycle !== \"cold\" ? previous.url : null);\n const nextTitle =\n normalizePublishedBrowserValue(event.title) ??\n (event.lifecycle !== \"cold\" ? previous.title : null);\n\n return {\n ...previous,\n canGoBack: event.canGoBack,\n canGoForward: event.canGoForward,\n error: shouldClearLoadError({\n isLoading: event.isLoading,\n previous,\n title: nextTitle,\n url: nextUrl\n })\n ? null\n : previous.error,\n isAttachedToWindow: event.isAttachedToWindow ?? previous.isAttachedToWindow,\n isLoading: event.isLoading,\n isOccluded: event.isOccluded,\n lifecycle: event.lifecycle,\n title: nextTitle,\n url: nextUrl\n };\n}\n","import type { I18nRuntime } from \"@nextop-os/ui-i18n-runtime\";\nimport { createBrowserNodeI18nRuntime } from \"../i18n/browserNodeI18n.ts\";\nimport type { BrowserNodeI18nRuntime } from \"../i18n/browserNodeI18n.ts\";\nimport type { BrowserNodeEvent, BrowserNodeHostApi } from \"./types.ts\";\nimport {\n createBrowserNodeRuntimeStore,\n type BrowserNodeRuntimeStore\n} from \"./runtimeStore.ts\";\nimport {\n resolveBrowserAddressInput,\n type BrowserAddressInputResolution,\n type BrowserSearchUrlResolver\n} from \"./url.ts\";\n\nexport interface BrowserNodeFeature {\n hostApi: BrowserNodeHostApi;\n i18n: BrowserNodeI18nRuntime;\n resolveAddressInput(rawInput: string): BrowserAddressInputResolution;\n runtimeStore: BrowserNodeRuntimeStore;\n connect(): () => void;\n}\n\nexport interface CreateBrowserNodeFeatureInput {\n hostApi: BrowserNodeHostApi;\n i18n?: I18nRuntime<string>;\n resolveSearchUrl?: BrowserSearchUrlResolver;\n runtimeStore?: BrowserNodeRuntimeStore;\n}\n\nexport function createBrowserNodeFeature({\n hostApi,\n i18n,\n resolveSearchUrl,\n runtimeStore = createBrowserNodeRuntimeStore()\n}: CreateBrowserNodeFeatureInput): BrowserNodeFeature {\n let listenerCount = 0;\n let disconnect: (() => void) | null = null;\n\n const connect = () => {\n listenerCount += 1;\n if (!disconnect) {\n disconnect = hostApi.onEvent((event: BrowserNodeEvent) => {\n runtimeStore.applyEvent(event);\n });\n }\n\n return () => {\n listenerCount = Math.max(0, listenerCount - 1);\n if (listenerCount === 0) {\n disconnect?.();\n disconnect = null;\n }\n };\n };\n\n return {\n connect,\n hostApi,\n i18n: createBrowserNodeI18nRuntime(i18n),\n resolveAddressInput(rawInput) {\n return resolveBrowserAddressInput(rawInput, { resolveSearchUrl });\n },\n runtimeStore\n };\n}\n"],"mappings":"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","names":["next"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { JSX, ReactNode, HTMLAttributes } from 'react';
|
|
2
|
+
import { BrowserNodeFeature } from '../index.js';
|
|
3
|
+
import { p as BrowserNodeSessionMode } from '../types-4cyQPaaT.js';
|
|
4
|
+
import '@nextop-os/ui-i18n-runtime';
|
|
5
|
+
import '../i18n/index.js';
|
|
6
|
+
|
|
7
|
+
interface BrowserNodeProps {
|
|
8
|
+
defaultUrl: string;
|
|
9
|
+
feature: BrowserNodeFeature;
|
|
10
|
+
nodeId: string;
|
|
11
|
+
onFocusRequest?: () => void;
|
|
12
|
+
profileId?: string | null;
|
|
13
|
+
sessionMode?: BrowserNodeSessionMode;
|
|
14
|
+
showHeader?: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare function BrowserNode({ defaultUrl, feature, nodeId, onFocusRequest, profileId, sessionMode, showHeader }: BrowserNodeProps): JSX.Element;
|
|
17
|
+
interface BrowserNodeWorkbenchHeaderProps {
|
|
18
|
+
className?: string;
|
|
19
|
+
defaultActions?: ReactNode;
|
|
20
|
+
defaultUrl: string;
|
|
21
|
+
dragHandleProps?: HTMLAttributes<HTMLElement>;
|
|
22
|
+
feature: BrowserNodeFeature;
|
|
23
|
+
nodeId: string;
|
|
24
|
+
onCloseRequest?: () => void;
|
|
25
|
+
onFocusRequest?: () => void;
|
|
26
|
+
}
|
|
27
|
+
declare function BrowserNodeWorkbenchHeader({ className, defaultActions, defaultUrl, dragHandleProps, feature, nodeId, onCloseRequest, onFocusRequest }: BrowserNodeWorkbenchHeaderProps): JSX.Element;
|
|
28
|
+
declare function BrowserNodeHeader({ canGoBack, canGoForward, className, defaultActions, draftUrl, dragHandleProps, feature, isCold, isLoading, nodeId, onCloseRequest, onDraftUrlChange, onFocusRequest, onSubmitUrl, withBorder }: {
|
|
29
|
+
canGoBack: boolean;
|
|
30
|
+
canGoForward: boolean;
|
|
31
|
+
className?: string;
|
|
32
|
+
defaultActions?: ReactNode;
|
|
33
|
+
draftUrl: string;
|
|
34
|
+
dragHandleProps?: HTMLAttributes<HTMLElement>;
|
|
35
|
+
feature: BrowserNodeFeature;
|
|
36
|
+
isCold?: boolean;
|
|
37
|
+
isLoading: boolean;
|
|
38
|
+
nodeId: string;
|
|
39
|
+
onCloseRequest?: () => void;
|
|
40
|
+
onDraftUrlChange: (nextUrl: string) => void;
|
|
41
|
+
onFocusRequest?: () => void;
|
|
42
|
+
onSubmitUrl: () => void;
|
|
43
|
+
withBorder?: boolean;
|
|
44
|
+
}): JSX.Element;
|
|
45
|
+
|
|
46
|
+
export { BrowserNode, BrowserNodeHeader, type BrowserNodeProps, BrowserNodeWorkbenchHeader, type BrowserNodeWorkbenchHeaderProps };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BrowserNode,
|
|
3
|
+
BrowserNodeHeader,
|
|
4
|
+
BrowserNodeWorkbenchHeader
|
|
5
|
+
} from "../chunk-VQTJWLWO.js";
|
|
6
|
+
import "../chunk-OTK5YBCK.js";
|
|
7
|
+
export {
|
|
8
|
+
BrowserNode,
|
|
9
|
+
BrowserNodeHeader,
|
|
10
|
+
BrowserNodeWorkbenchHeader
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
type BrowserNodeSessionMode = "shared" | "incognito" | "profile";
|
|
2
|
+
type BrowserNodeLifecycle = "active" | "cold";
|
|
3
|
+
type BrowserNodeErrorCode = "invalid-url" | "navigation-failed" | "unsupported-protocol" | "unsupported-url";
|
|
4
|
+
type BrowserNodeErrorParams = Record<string, string | number | boolean | null | undefined>;
|
|
5
|
+
interface BrowserNodeRuntimeError {
|
|
6
|
+
code: BrowserNodeErrorCode;
|
|
7
|
+
diagnosticMessage?: string;
|
|
8
|
+
params?: BrowserNodeErrorParams;
|
|
9
|
+
}
|
|
10
|
+
interface BrowserNodeRuntimeState {
|
|
11
|
+
canGoBack: boolean;
|
|
12
|
+
canGoForward: boolean;
|
|
13
|
+
error: BrowserNodeRuntimeError | null;
|
|
14
|
+
isAttachedToWindow: boolean;
|
|
15
|
+
isLoading: boolean;
|
|
16
|
+
isOccluded: boolean;
|
|
17
|
+
lifecycle: BrowserNodeLifecycle;
|
|
18
|
+
title: string | null;
|
|
19
|
+
url: string | null;
|
|
20
|
+
}
|
|
21
|
+
interface BrowserNodeStateEvent {
|
|
22
|
+
type: "state";
|
|
23
|
+
nodeId: string;
|
|
24
|
+
lifecycle: BrowserNodeLifecycle;
|
|
25
|
+
isOccluded: boolean;
|
|
26
|
+
isAttachedToWindow?: boolean;
|
|
27
|
+
url: string | null;
|
|
28
|
+
title: string | null;
|
|
29
|
+
isLoading: boolean;
|
|
30
|
+
canGoBack: boolean;
|
|
31
|
+
canGoForward: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface BrowserNodeClosedEvent {
|
|
34
|
+
type: "closed";
|
|
35
|
+
nodeId: string;
|
|
36
|
+
}
|
|
37
|
+
interface BrowserNodeErrorEvent {
|
|
38
|
+
type: "error";
|
|
39
|
+
nodeId: string;
|
|
40
|
+
code: BrowserNodeErrorCode;
|
|
41
|
+
diagnosticMessage?: string;
|
|
42
|
+
params?: BrowserNodeErrorParams;
|
|
43
|
+
}
|
|
44
|
+
interface BrowserNodeOpenUrlEvent {
|
|
45
|
+
type: "open-url";
|
|
46
|
+
sourceNodeId: string;
|
|
47
|
+
url: string;
|
|
48
|
+
reuseIfOpen?: boolean;
|
|
49
|
+
title?: string;
|
|
50
|
+
}
|
|
51
|
+
type BrowserNodeEvent = BrowserNodeStateEvent | BrowserNodeClosedEvent | BrowserNodeErrorEvent | BrowserNodeOpenUrlEvent;
|
|
52
|
+
interface BrowserNodeActivationInput {
|
|
53
|
+
nodeId: string;
|
|
54
|
+
profileId: string | null;
|
|
55
|
+
sessionMode: BrowserNodeSessionMode;
|
|
56
|
+
url: string;
|
|
57
|
+
}
|
|
58
|
+
interface BrowserNodePrepareSessionInput {
|
|
59
|
+
nodeId: string;
|
|
60
|
+
profileId: string | null;
|
|
61
|
+
sessionMode: BrowserNodeSessionMode;
|
|
62
|
+
}
|
|
63
|
+
interface BrowserNodeRegisterGuestInput {
|
|
64
|
+
nodeId: string;
|
|
65
|
+
profileId: string | null;
|
|
66
|
+
sessionMode: BrowserNodeSessionMode;
|
|
67
|
+
webContentsId: number;
|
|
68
|
+
}
|
|
69
|
+
interface BrowserNodeUnregisterGuestInput {
|
|
70
|
+
nodeId: string;
|
|
71
|
+
webContentsId: number;
|
|
72
|
+
}
|
|
73
|
+
interface BrowserNodeNavigateInput {
|
|
74
|
+
nodeId: string;
|
|
75
|
+
url: string;
|
|
76
|
+
}
|
|
77
|
+
interface BrowserNodeNodeIdInput {
|
|
78
|
+
nodeId: string;
|
|
79
|
+
}
|
|
80
|
+
interface BrowserNodeDebugDump {
|
|
81
|
+
canGoBack: boolean;
|
|
82
|
+
canGoForward: boolean;
|
|
83
|
+
currentUrl: string | null;
|
|
84
|
+
desiredUrl: string;
|
|
85
|
+
isAttachedToWindow: boolean;
|
|
86
|
+
isLoading: boolean;
|
|
87
|
+
lifecycle: BrowserNodeLifecycle;
|
|
88
|
+
nodeId: string;
|
|
89
|
+
profileId: string | null;
|
|
90
|
+
sessionMode: BrowserNodeSessionMode;
|
|
91
|
+
title: string | null;
|
|
92
|
+
webContentsDestroyed: boolean | null;
|
|
93
|
+
webContentsId: number | null;
|
|
94
|
+
}
|
|
95
|
+
interface BrowserNodeHostApi {
|
|
96
|
+
activate(payload: BrowserNodeActivationInput): Promise<void>;
|
|
97
|
+
capturePreview?(payload: BrowserNodeNodeIdInput): Promise<string | null>;
|
|
98
|
+
close(payload: BrowserNodeNodeIdInput): Promise<void>;
|
|
99
|
+
debugDump?(payload: BrowserNodeNodeIdInput): Promise<BrowserNodeDebugDump | null>;
|
|
100
|
+
goBack(payload: BrowserNodeNodeIdInput): Promise<void>;
|
|
101
|
+
goForward(payload: BrowserNodeNodeIdInput): Promise<void>;
|
|
102
|
+
navigate(payload: BrowserNodeNavigateInput): Promise<void>;
|
|
103
|
+
onEvent(listener: (event: BrowserNodeEvent) => void): () => void;
|
|
104
|
+
prepareSession(payload: BrowserNodePrepareSessionInput): Promise<void>;
|
|
105
|
+
registerGuest(payload: BrowserNodeRegisterGuestInput): Promise<void>;
|
|
106
|
+
reload(payload: BrowserNodeNodeIdInput): Promise<void>;
|
|
107
|
+
unregisterGuest(payload: BrowserNodeUnregisterGuestInput): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export type { BrowserNodeActivationInput as B, BrowserNodeClosedEvent as a, BrowserNodeDebugDump as b, BrowserNodeErrorCode as c, BrowserNodeErrorEvent as d, BrowserNodeErrorParams as e, BrowserNodeEvent as f, BrowserNodeHostApi as g, BrowserNodeLifecycle as h, BrowserNodeNavigateInput as i, BrowserNodeNodeIdInput as j, BrowserNodeOpenUrlEvent as k, BrowserNodePrepareSessionInput as l, BrowserNodeRegisterGuestInput as m, BrowserNodeRuntimeError as n, BrowserNodeRuntimeState as o, BrowserNodeSessionMode as p, BrowserNodeStateEvent as q, BrowserNodeUnregisterGuestInput as r };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface BrowserNodeBridgeError {
|
|
2
|
+
code: string;
|
|
3
|
+
message: string;
|
|
4
|
+
params?: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
type BrowserNodeBridgeResult<T> = {
|
|
7
|
+
ok: true;
|
|
8
|
+
value: T;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
error: BrowserNodeBridgeError;
|
|
12
|
+
};
|
|
13
|
+
interface BrowserNodeBridgeCallPayload {
|
|
14
|
+
args: unknown;
|
|
15
|
+
method: string;
|
|
16
|
+
}
|
|
17
|
+
interface BrowserNodeBridgeMeta {
|
|
18
|
+
runtime: "electron";
|
|
19
|
+
version: string;
|
|
20
|
+
}
|
|
21
|
+
interface BrowserNodeBridgeMethodDescriptor {
|
|
22
|
+
readonly defaultErrorCode?: string;
|
|
23
|
+
readonly hostPatterns: readonly string[];
|
|
24
|
+
readonly name: string;
|
|
25
|
+
}
|
|
26
|
+
type BrowserNodeBridgeCallable = (args?: unknown) => Promise<BrowserNodeBridgeResult<unknown>>;
|
|
27
|
+
interface BrowserNodeBridgeApiTree {
|
|
28
|
+
meta: BrowserNodeBridgeMeta;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type { BrowserNodeBridgeApiTree as B, BrowserNodeBridgeCallPayload as a, BrowserNodeBridgeCallable as b, BrowserNodeBridgeError as c, BrowserNodeBridgeMeta as d, BrowserNodeBridgeMethodDescriptor as e, BrowserNodeBridgeResult as f };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { WorkbenchFrame, WorkbenchHostDockEntry, WorkbenchHostNodeDefinition } from '@nextop-os/workbench-surface';
|
|
3
|
+
import { BrowserNodeFeature } from '../index.js';
|
|
4
|
+
import '@nextop-os/ui-i18n-runtime';
|
|
5
|
+
import '../i18n/index.js';
|
|
6
|
+
import '../types-4cyQPaaT.js';
|
|
7
|
+
|
|
8
|
+
interface BrowserNodeOpenUrlActivationPayload {
|
|
9
|
+
title?: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
interface BrowserNodeExternalState {
|
|
13
|
+
title?: string | null;
|
|
14
|
+
url?: string | null;
|
|
15
|
+
}
|
|
16
|
+
interface CreateBrowserNodeDefinitionInput {
|
|
17
|
+
defaultUrl: string;
|
|
18
|
+
dockIcon?: ReactNode;
|
|
19
|
+
feature: BrowserNodeFeature;
|
|
20
|
+
frame?: WorkbenchFrame;
|
|
21
|
+
typeId?: string;
|
|
22
|
+
}
|
|
23
|
+
declare const defaultBrowserNodeTypeId = "browser";
|
|
24
|
+
declare function createBrowserNodeDefinition({ defaultUrl, feature, frame, typeId }: CreateBrowserNodeDefinitionInput): WorkbenchHostNodeDefinition<BrowserNodeExternalState>;
|
|
25
|
+
declare function createBrowserDockEntry(input: {
|
|
26
|
+
dockIcon?: ReactNode;
|
|
27
|
+
feature: BrowserNodeFeature;
|
|
28
|
+
id?: string;
|
|
29
|
+
order?: number;
|
|
30
|
+
sectionId?: string;
|
|
31
|
+
typeId?: string;
|
|
32
|
+
}): WorkbenchHostDockEntry;
|
|
33
|
+
|
|
34
|
+
export { type BrowserNodeExternalState, type BrowserNodeOpenUrlActivationPayload, type CreateBrowserNodeDefinitionInput, createBrowserDockEntry, createBrowserNodeDefinition, defaultBrowserNodeTypeId };
|