@amalgm/browser 0.1.2-preview.35541635545 → 0.1.2-preview.37254096068
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/PURPOSE.md +119 -97
- package/README.md +51 -56
- package/SECURITY.md +10 -8
- package/dist/bin/amalgm-browser-mcp.js +2 -3
- package/dist/bin/amalgm-browser-mcp.js.map +1 -1
- package/dist/bin/amalgm-browser-rest.js +8 -18
- package/dist/bin/amalgm-browser-rest.js.map +1 -1
- package/dist/src/account.d.ts +8 -0
- package/dist/src/account.js +42 -0
- package/dist/src/account.js.map +1 -0
- package/dist/src/action.d.ts +1 -2
- package/dist/src/action.js +3 -7
- package/dist/src/action.js.map +1 -1
- package/dist/src/adapters/cli/actions.d.ts +0 -1
- package/dist/src/adapters/cli/actions.js +0 -7
- package/dist/src/adapters/cli/actions.js.map +1 -1
- package/dist/src/adapters/cli/help.d.ts +1 -1
- package/dist/src/adapters/cli/help.js +1 -4
- package/dist/src/adapters/cli/help.js.map +1 -1
- package/dist/src/adapters/cli/resources.js +0 -22
- package/dist/src/adapters/cli/resources.js.map +1 -1
- package/dist/src/adapters/cli/run.js +25 -19
- package/dist/src/adapters/cli/run.js.map +1 -1
- package/dist/src/adapters/execute.js +2 -2
- package/dist/src/adapters/execute.js.map +1 -1
- package/dist/src/adapters/http/events.d.ts +5 -2
- package/dist/src/adapters/http/events.js +18 -2
- package/dist/src/adapters/http/events.js.map +1 -1
- package/dist/src/adapters/http/internal-routes.js +9 -4
- package/dist/src/adapters/http/internal-routes.js.map +1 -1
- package/dist/src/adapters/http/navigation-stream.d.ts +4 -0
- package/dist/src/adapters/http/navigation-stream.js +17 -0
- package/dist/src/adapters/http/navigation-stream.js.map +1 -0
- package/dist/src/adapters/http/openapi.js +2 -8
- package/dist/src/adapters/http/openapi.js.map +1 -1
- package/dist/src/adapters/http/server.js +54 -14
- package/dist/src/adapters/http/server.js.map +1 -1
- package/dist/src/adapters/http/session-routes.js +0 -1
- package/dist/src/adapters/http/session-routes.js.map +1 -1
- package/dist/src/adapters/http/stream.d.ts +6 -0
- package/dist/src/adapters/http/stream.js +89 -0
- package/dist/src/adapters/http/stream.js.map +1 -0
- package/dist/src/adapters/mcp/server.js +2 -2
- package/dist/src/adapters/mcp/server.js.map +1 -1
- package/dist/src/adapters/mcp/tools.js +2 -4
- package/dist/src/adapters/mcp/tools.js.map +1 -1
- package/dist/src/adapters/mcp/types.d.ts +3 -2
- package/dist/src/adapters/toolbox/manifest.js +1 -1
- package/dist/src/adapters/toolbox/manifest.js.map +1 -1
- package/dist/src/auth/login.d.ts +3 -1
- package/dist/src/auth/login.js +48 -33
- package/dist/src/auth/login.js.map +1 -1
- package/dist/src/auth/service.js +56 -67
- package/dist/src/auth/service.js.map +1 -1
- package/dist/src/{drivers/cdp → cdp}/capture.d.ts +1 -1
- package/dist/src/{drivers/cdp → cdp}/capture.js +1 -1
- package/dist/src/cdp/capture.js.map +1 -0
- package/dist/src/{drivers/cdp → cdp}/client.d.ts +3 -1
- package/dist/src/{drivers/cdp → cdp}/client.js +51 -14
- package/dist/src/cdp/client.js.map +1 -0
- package/dist/src/cdp/input.js.map +1 -0
- package/dist/src/cdp/navigation.d.ts +5 -0
- package/dist/src/cdp/navigation.js +47 -0
- package/dist/src/cdp/navigation.js.map +1 -0
- package/dist/src/{drivers/cdp → cdp}/screencast.js +1 -1
- package/dist/src/cdp/screencast.js.map +1 -0
- package/dist/src/chrome/cookie-adapter.d.ts +23 -0
- package/dist/src/chrome/cookie-adapter.js +74 -0
- package/dist/src/chrome/cookie-adapter.js.map +1 -0
- package/dist/src/chrome/cookie-changes.d.ts +12 -0
- package/dist/src/chrome/cookie-changes.js +100 -0
- package/dist/src/chrome/cookie-changes.js.map +1 -0
- package/dist/src/chrome/cookie-observer.d.ts +20 -0
- package/dist/src/chrome/cookie-observer.js +44 -0
- package/dist/src/chrome/cookie-observer.js.map +1 -0
- package/dist/src/chrome/executable.d.ts +1 -0
- package/dist/src/chrome/executable.js +55 -0
- package/dist/src/chrome/executable.js.map +1 -0
- package/dist/src/chrome/flags.d.ts +7 -0
- package/dist/src/chrome/flags.js +59 -0
- package/dist/src/chrome/flags.js.map +1 -0
- package/dist/src/chrome/host.d.ts +25 -0
- package/dist/src/chrome/host.js +137 -0
- package/dist/src/chrome/host.js.map +1 -0
- package/dist/src/chrome/launch.d.ts +11 -0
- package/dist/src/chrome/launch.js +105 -0
- package/dist/src/chrome/launch.js.map +1 -0
- package/dist/src/chrome/relay/editing.d.ts +2 -0
- package/dist/src/chrome/relay/editing.js +14 -0
- package/dist/src/chrome/relay/editing.js.map +1 -0
- package/dist/src/chrome/relay/server.d.ts +18 -0
- package/dist/src/chrome/relay/server.js +120 -0
- package/dist/src/chrome/relay/server.js.map +1 -0
- package/dist/src/chrome/relay/targets.d.ts +11 -0
- package/dist/src/chrome/relay/targets.js +59 -0
- package/dist/src/chrome/relay/targets.js.map +1 -0
- package/dist/src/chrome/relay/view.d.ts +34 -0
- package/dist/src/chrome/relay/view.js +185 -0
- package/dist/src/chrome/relay/view.js.map +1 -0
- package/dist/src/cookies/adapter-credential.d.ts +6 -0
- package/dist/src/cookies/adapter-credential.js +33 -0
- package/dist/src/cookies/adapter-credential.js.map +1 -0
- package/dist/src/cookies/coordinator.d.ts +14 -13
- package/dist/src/cookies/coordinator.js +157 -75
- package/dist/src/cookies/coordinator.js.map +1 -1
- package/dist/src/cookies/database.d.ts +29 -0
- package/dist/src/cookies/database.js +113 -0
- package/dist/src/cookies/database.js.map +1 -0
- package/dist/src/cookies/diff.d.ts +6 -0
- package/dist/src/cookies/diff.js +19 -0
- package/dist/src/cookies/diff.js.map +1 -0
- package/dist/src/cookies/http-store.d.ts +7 -0
- package/dist/src/cookies/http-store.js +105 -0
- package/dist/src/cookies/http-store.js.map +1 -0
- package/dist/src/cookies/jar.d.ts +12 -11
- package/dist/src/cookies/jar.js +128 -120
- package/dist/src/cookies/jar.js.map +1 -1
- package/dist/src/cookies/policy.js +10 -4
- package/dist/src/cookies/policy.js.map +1 -1
- package/dist/src/cookies/secret-file.d.ts +4 -0
- package/dist/src/cookies/secret-file.js +47 -9
- package/dist/src/cookies/secret-file.js.map +1 -1
- package/dist/src/cookies/types.d.ts +34 -2
- package/dist/src/cookies.d.ts +2 -0
- package/dist/src/cookies.js +2 -0
- package/dist/src/cookies.js.map +1 -1
- package/dist/src/defaults.d.ts +1 -5
- package/dist/src/defaults.js +49 -58
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/driver/cli-policy.d.ts +1 -0
- package/dist/src/driver/cli-policy.js +17 -0
- package/dist/src/driver/cli-policy.js.map +1 -0
- package/dist/src/{drivers/headless → driver}/command.d.ts +3 -7
- package/dist/src/{drivers/headless → driver}/command.js +29 -29
- package/dist/src/driver/command.js.map +1 -0
- package/dist/src/{drivers/headless → driver}/driver.d.ts +13 -10
- package/dist/src/{drivers/headless → driver}/driver.js +67 -82
- package/dist/src/driver/driver.js.map +1 -0
- package/dist/src/{interaction/delta.d.ts → driver/evidence.d.ts} +3 -2
- package/dist/src/{interaction/delta.js → driver/evidence.js} +6 -3
- package/dist/src/driver/evidence.js.map +1 -0
- package/dist/src/driver/executable.js.map +1 -0
- package/dist/src/driver/stream.d.ts +1 -0
- package/dist/src/driver/stream.js +22 -0
- package/dist/src/driver/stream.js.map +1 -0
- package/dist/src/driver/wait.d.ts +6 -0
- package/dist/src/driver/wait.js +28 -0
- package/dist/src/driver/wait.js.map +1 -0
- package/dist/src/electron/adblock/cache.js.map +1 -0
- package/dist/src/electron/adblock/cosmetics.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/adblock/index.d.ts +0 -1
- package/dist/src/{drivers/electron/native → electron}/adblock/index.js +0 -1
- package/dist/src/{drivers/electron/native → electron}/adblock/index.js.map +1 -1
- package/dist/src/electron/adblock/policy.js.map +1 -0
- package/dist/src/electron/adblock/preload.js.map +1 -0
- package/dist/src/electron/adblock/settings.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/contracts.d.ts +0 -14
- package/dist/src/{drivers/electron/native → electron}/contracts.js +0 -1
- package/dist/src/electron/contracts.js.map +1 -0
- package/dist/src/{drivers/electron → electron}/cookie-adapter.d.ts +4 -4
- package/dist/src/{drivers/electron → electron}/cookie-adapter.js +9 -6
- package/dist/src/electron/cookie-adapter.js.map +1 -0
- package/dist/src/electron/cookie-sync.d.ts +6 -0
- package/dist/src/electron/cookie-sync.js +18 -0
- package/dist/src/electron/cookie-sync.js.map +1 -0
- package/dist/src/electron/policy.js.map +1 -0
- package/dist/src/electron/session.d.ts +2 -0
- package/dist/src/electron/session.js +9 -0
- package/dist/src/electron/session.js.map +1 -0
- package/dist/src/electron/shell/adblock-ipc.js.map +1 -0
- package/dist/src/electron/shell/context-menu.js.map +1 -0
- package/dist/src/electron/shell/downloads.js.map +1 -0
- package/dist/src/electron/shell/helpers.js.map +1 -0
- package/dist/src/electron/shell/permissions.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/shell/sites.d.ts +1 -3
- package/dist/src/{drivers/electron/native → electron}/shell/sites.js +2 -34
- package/dist/src/electron/shell/sites.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/shell/types.d.ts +0 -1
- package/dist/src/electron/shell/types.js.map +1 -0
- package/dist/src/electron/shell.d.ts +13 -0
- package/dist/src/electron/shell.js +73 -0
- package/dist/src/electron/shell.js.map +1 -0
- package/dist/src/electron/surface/commands.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface/create.js +0 -6
- package/dist/src/electron/surface/create.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface/events.js +1 -13
- package/dist/src/electron/surface/events.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface/presentation.d.ts +2 -9
- package/dist/src/electron/surface/presentation.js +29 -0
- package/dist/src/electron/surface/presentation.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface/state.d.ts +5 -0
- package/dist/src/{drivers/electron/native → electron}/surface/state.js +10 -4
- package/dist/src/electron/surface/state.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface/types.d.ts +2 -8
- package/dist/src/electron/surface/types.js.map +1 -0
- package/dist/src/{drivers/electron/native → electron}/surface-controller.js +9 -12
- package/dist/src/electron/surface-controller.js.map +1 -0
- package/dist/src/electron-preload.cjs +1 -1
- package/dist/src/electron.cjs +587 -820
- package/dist/src/electron.d.cts +4 -14
- package/dist/src/electron.d.ts +4 -14
- package/dist/src/electron.js +4 -14
- package/dist/src/electron.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +2 -3
- package/dist/src/index.js +0 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/migration/legacy-migration.d.ts +0 -1
- package/dist/src/migration/legacy-migration.js +3 -9
- package/dist/src/migration/legacy-migration.js.map +1 -1
- package/dist/src/migration/legacy-rows.d.ts +1 -2
- package/dist/src/migration/legacy-rows.js +0 -14
- package/dist/src/migration/legacy-rows.js.map +1 -1
- package/dist/src/ports.d.ts +12 -15
- package/dist/src/ports.js.map +1 -1
- package/dist/src/process.d.ts +1 -0
- package/dist/src/process.js +11 -0
- package/dist/src/process.js.map +1 -1
- package/dist/src/product-service.d.ts +4 -6
- package/dist/src/product-service.js +21 -15
- package/dist/src/product-service.js.map +1 -1
- package/dist/src/recording/encoder.js +1 -1
- package/dist/src/recording/encoder.js.map +1 -1
- package/dist/src/recording/service.d.ts +4 -0
- package/dist/src/recording/service.js +72 -62
- package/dist/src/recording/service.js.map +1 -1
- package/dist/src/recording/source.js +1 -1
- package/dist/src/recording/source.js.map +1 -1
- package/dist/src/registry.d.ts +4 -0
- package/dist/src/registry.js +17 -0
- package/dist/src/registry.js.map +1 -1
- package/dist/src/service-options.d.ts +5 -7
- package/dist/src/service.d.ts +16 -18
- package/dist/src/service.js +108 -108
- package/dist/src/service.js.map +1 -1
- package/dist/src/sessions/operations.d.ts +12 -0
- package/dist/src/sessions/operations.js +56 -0
- package/dist/src/sessions/operations.js.map +1 -0
- package/dist/src/testing.d.ts +8 -4
- package/dist/src/testing.js +7 -5
- package/dist/src/testing.js.map +1 -1
- package/dist/src/types.d.ts +0 -39
- package/docs/ACTIONS.md +0 -4
- package/docs/ARCHITECTURE.md +51 -55
- package/docs/AUTHENTICATION.md +41 -36
- package/docs/AXIOMS.md +13 -11
- package/docs/CHROME.md +143 -0
- package/docs/CLI.md +63 -31
- package/docs/COMPATIBILITY.md +14 -23
- package/docs/COOKIES.md +95 -52
- package/docs/ELECTRON_INTEGRATION.md +84 -77
- package/docs/EVENTS.md +5 -9
- package/docs/MCP.md +10 -6
- package/docs/MIGRATION.md +43 -36
- package/docs/OPERATIONS.md +48 -40
- package/docs/README.md +5 -5
- package/docs/REALTIME_BOUNDARY.md +3 -3
- package/docs/RECORDING.md +16 -15
- package/docs/REST.md +57 -26
- package/docs/SDK.md +65 -55
- package/docs/SHELL_INTEGRATION.md +78 -36
- package/docs/TESTING.md +58 -42
- package/docs/TOOLBOX_INTEGRATION.md +9 -4
- package/docs/TROUBLESHOOTING.md +68 -40
- package/examples/basic.ts +1 -0
- package/package.json +8 -15
- package/skills/use-amalgm-browser/SKILL.md +16 -29
- package/skills/use-amalgm-browser/references/actions.md +2 -2
- package/dist/src/adapters/http/profile-routes.d.ts +0 -2
- package/dist/src/adapters/http/profile-routes.js +0 -42
- package/dist/src/adapters/http/profile-routes.js.map +0 -1
- package/dist/src/auth/transport.d.ts +0 -8
- package/dist/src/auth/transport.js +0 -45
- package/dist/src/auth/transport.js.map +0 -1
- package/dist/src/drivers/cdp/capture.js.map +0 -1
- package/dist/src/drivers/cdp/client.js.map +0 -1
- package/dist/src/drivers/cdp/input.js.map +0 -1
- package/dist/src/drivers/cdp/screencast.js.map +0 -1
- package/dist/src/drivers/cdp/target.d.ts +0 -4
- package/dist/src/drivers/cdp/target.js +0 -34
- package/dist/src/drivers/cdp/target.js.map +0 -1
- package/dist/src/drivers/electron/advertisement.d.ts +0 -12
- package/dist/src/drivers/electron/advertisement.js +0 -57
- package/dist/src/drivers/electron/advertisement.js.map +0 -1
- package/dist/src/drivers/electron/contracts.d.ts +0 -45
- package/dist/src/drivers/electron/contracts.js +0 -10
- package/dist/src/drivers/electron/contracts.js.map +0 -1
- package/dist/src/drivers/electron/cookie-adapter.js.map +0 -1
- package/dist/src/drivers/electron/driver.d.ts +0 -19
- package/dist/src/drivers/electron/driver.js +0 -115
- package/dist/src/drivers/electron/driver.js.map +0 -1
- package/dist/src/drivers/electron/native/adblock/cache.js.map +0 -1
- package/dist/src/drivers/electron/native/adblock/cosmetics.js.map +0 -1
- package/dist/src/drivers/electron/native/adblock/policy.js.map +0 -1
- package/dist/src/drivers/electron/native/adblock/preload.js.map +0 -1
- package/dist/src/drivers/electron/native/adblock/settings.js.map +0 -1
- package/dist/src/drivers/electron/native/config.d.ts +0 -4
- package/dist/src/drivers/electron/native/config.js +0 -9
- package/dist/src/drivers/electron/native/config.js.map +0 -1
- package/dist/src/drivers/electron/native/contracts.js.map +0 -1
- package/dist/src/drivers/electron/native/policy.js.map +0 -1
- package/dist/src/drivers/electron/native/session.d.ts +0 -4
- package/dist/src/drivers/electron/native/session.js +0 -11
- package/dist/src/drivers/electron/native/session.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/adblock-ipc.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/context-menu.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/downloads.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/helpers.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/permissions.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/sites.js.map +0 -1
- package/dist/src/drivers/electron/native/shell/types.js.map +0 -1
- package/dist/src/drivers/electron/native/shell.d.ts +0 -14
- package/dist/src/drivers/electron/native/shell.js +0 -115
- package/dist/src/drivers/electron/native/shell.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/commands.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/create.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/events.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/presentation.js +0 -87
- package/dist/src/drivers/electron/native/surface/presentation.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/state.js.map +0 -1
- package/dist/src/drivers/electron/native/surface/types.js.map +0 -1
- package/dist/src/drivers/electron/native/surface-controller.js.map +0 -1
- package/dist/src/drivers/electron/policy.d.ts +0 -4
- package/dist/src/drivers/electron/policy.js +0 -39
- package/dist/src/drivers/electron/policy.js.map +0 -1
- package/dist/src/drivers/electron/session.d.ts +0 -4
- package/dist/src/drivers/electron/session.js +0 -5
- package/dist/src/drivers/electron/session.js.map +0 -1
- package/dist/src/drivers/headless/command.js.map +0 -1
- package/dist/src/drivers/headless/cookie-adapter.d.ts +0 -16
- package/dist/src/drivers/headless/cookie-adapter.js +0 -59
- package/dist/src/drivers/headless/cookie-adapter.js.map +0 -1
- package/dist/src/drivers/headless/driver.js.map +0 -1
- package/dist/src/drivers/headless/executable.js.map +0 -1
- package/dist/src/drivers/headless/screencast.d.ts +0 -3
- package/dist/src/drivers/headless/screencast.js +0 -21
- package/dist/src/drivers/headless/screencast.js.map +0 -1
- package/dist/src/headless.d.ts +0 -3
- package/dist/src/headless.js +0 -4
- package/dist/src/headless.js.map +0 -1
- package/dist/src/interaction/delta.js.map +0 -1
- package/dist/src/interaction/typing.d.ts +0 -39
- package/dist/src/interaction/typing.js +0 -189
- package/dist/src/interaction/typing.js.map +0 -1
- package/dist/src/profiles/directories.d.ts +0 -9
- package/dist/src/profiles/directories.js +0 -57
- package/dist/src/profiles/directories.js.map +0 -1
- package/dist/src/profiles/service.d.ts +0 -30
- package/dist/src/profiles/service.js +0 -89
- package/dist/src/profiles/service.js.map +0 -1
- package/dist/src/runtime-selector.d.ts +0 -12
- package/dist/src/runtime-selector.js +0 -72
- package/dist/src/runtime-selector.js.map +0 -1
- package/docs/HEADLESS_RUNTIME.md +0 -58
- package/examples/custom-driver.ts +0 -45
- /package/dist/src/{drivers/cdp → cdp}/input.d.ts +0 -0
- /package/dist/src/{drivers/cdp → cdp}/input.js +0 -0
- /package/dist/src/{drivers/cdp → cdp}/screencast.d.ts +0 -0
- /package/dist/src/{drivers/headless → driver}/executable.d.ts +0 -0
- /package/dist/src/{drivers/headless → driver}/executable.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/cache.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/cache.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/cosmetics.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/cosmetics.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/policy.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/policy.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/preload.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/preload.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/settings.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/adblock/settings.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/policy.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/policy.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/adblock-ipc.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/adblock-ipc.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/context-menu.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/context-menu.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/downloads.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/downloads.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/helpers.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/helpers.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/permissions.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/permissions.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/shell/types.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface/commands.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface/commands.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface/create.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface/events.d.ts +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface/types.js +0 -0
- /package/dist/src/{drivers/electron/native → electron}/surface-controller.d.ts +0 -0
package/dist/src/electron.cjs
CHANGED
|
@@ -808,356 +808,18 @@ var require_cjs = __commonJS({
|
|
|
808
808
|
var electron_exports = {};
|
|
809
809
|
__export(electron_exports, {
|
|
810
810
|
BROWSER_IPC: () => BROWSER_IPC,
|
|
811
|
-
BROWSER_SESSION_PARTITION: () => BROWSER_SESSION_PARTITION,
|
|
812
|
-
BROWSER_SURFACE_PROTOCOL: () => BROWSER_SURFACE_PROTOCOL,
|
|
813
|
-
BROWSER_SURFACE_PROTOCOLS: () => BROWSER_SURFACE_PROTOCOLS,
|
|
814
|
-
ELECTRON_COOKIE_ADAPTER_ID: () => ELECTRON_COOKIE_ADAPTER_ID,
|
|
815
|
-
ElectronBrowserDriver: () => ElectronBrowserDriver,
|
|
816
|
-
ElectronCookieAdapter: () => ElectronCookieAdapter,
|
|
817
|
-
NativeAdBlocker: () => NativeAdBlocker,
|
|
818
|
-
adBlockHostname: () => adBlockHostname,
|
|
819
|
-
browserNavigationPolicy: () => browserNavigationPolicy,
|
|
820
|
-
codeFor: () => codeFor,
|
|
821
811
|
createBrowserShell: () => createBrowserShell,
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
insertTextScript: () => insertTextScript,
|
|
825
|
-
isAdBlockCacheFresh: () => isAdBlockCacheFresh,
|
|
826
|
-
isAllowedExternalUrl: () => isAllowedExternalUrl,
|
|
827
|
-
isAllowedWebUrl: () => isAllowedWebUrl,
|
|
828
|
-
isLoopbackCdpUrl: () => isLoopbackCdpUrl,
|
|
829
|
-
isNativeAdBlockDisabled: () => isNativeAdBlockDisabled,
|
|
830
|
-
isolatedBrowserSession: () => isolatedBrowserSession,
|
|
831
|
-
keyScript: () => keyScript,
|
|
832
|
-
markerUrl: () => markerUrl,
|
|
833
|
-
nextAvailableDownloadPath: () => nextAvailableDownloadPath,
|
|
834
|
-
normalizeBrowserLocation: () => normalizeBrowserLocation,
|
|
835
|
-
parseUrl: () => parseUrl,
|
|
836
|
-
permissionOrigin: () => permissionOrigin,
|
|
837
|
-
removeHostAdvertisement: () => removeHostAdvertisement,
|
|
838
|
-
safeDownloadFilename: () => safeDownloadFilename,
|
|
839
|
-
safeDownloadName: () => safeDownloadName,
|
|
840
|
-
setValueScript: () => setValueScript,
|
|
841
|
-
shouldOpenAsTab: () => shouldOpenAsTab,
|
|
842
|
-
surfaceStamp: () => surfaceStamp,
|
|
843
|
-
writeHostAdvertisement: () => writeHostAdvertisement
|
|
812
|
+
createHttpCookieStore: () => createHttpCookieStore,
|
|
813
|
+
readCookieAdapter: () => readCookieAdapter
|
|
844
814
|
});
|
|
845
815
|
module.exports = __toCommonJS(electron_exports);
|
|
846
816
|
|
|
847
|
-
// src/
|
|
848
|
-
var
|
|
849
|
-
|
|
850
|
-
super(message);
|
|
851
|
-
this.code = code;
|
|
852
|
-
this.details = details;
|
|
853
|
-
}
|
|
854
|
-
code;
|
|
855
|
-
details;
|
|
856
|
-
name = "BrowserError";
|
|
857
|
-
};
|
|
858
|
-
|
|
859
|
-
// src/drivers/electron/contracts.ts
|
|
860
|
-
var BROWSER_SESSION_PARTITION = "persist:amalgm-browser";
|
|
861
|
-
var BROWSER_SURFACE_PROTOCOL = 6;
|
|
862
|
-
var BROWSER_SURFACE_PROTOCOLS = [5, BROWSER_SURFACE_PROTOCOL];
|
|
863
|
-
function surfaceStamp(sessionId) {
|
|
864
|
-
return `amalgm-browser:${sessionId}`;
|
|
865
|
-
}
|
|
866
|
-
function markerUrl(sessionId) {
|
|
867
|
-
return `about:blank#amalgm-bsid-${encodeURIComponent(sessionId)}`;
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
// src/drivers/electron/driver.ts
|
|
871
|
-
var ElectronBrowserDriver = class {
|
|
872
|
-
constructor(host) {
|
|
873
|
-
this.host = host;
|
|
874
|
-
this.capabilities = [...host.capabilities];
|
|
875
|
-
}
|
|
876
|
-
host;
|
|
877
|
-
kind = "electron";
|
|
878
|
-
capabilities;
|
|
879
|
-
identities = /* @__PURE__ */ new Map();
|
|
880
|
-
async open(input) {
|
|
881
|
-
const identity = await this.bind(input);
|
|
882
|
-
this.identities.set(input.session.id, identity);
|
|
883
|
-
}
|
|
884
|
-
async execute(input, action) {
|
|
885
|
-
let identity;
|
|
886
|
-
try {
|
|
887
|
-
identity = await this.verified(input);
|
|
888
|
-
} catch (error2) {
|
|
889
|
-
const previous = this.identities.get(input.session.id);
|
|
890
|
-
if (!previous || !isMissingSurface(error2)) throw error2;
|
|
891
|
-
identity = await this.reattachOnce(input, previous);
|
|
892
|
-
}
|
|
893
|
-
try {
|
|
894
|
-
return await this.host.execute({ identity, action, context: input.context });
|
|
895
|
-
} catch (error2) {
|
|
896
|
-
if (!isSurfaceLoss(error2)) throw error2;
|
|
897
|
-
identity = await this.reattachOnce(input, identity);
|
|
898
|
-
return this.host.execute({ identity, action, context: input.context });
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
async close(input) {
|
|
902
|
-
const identity = this.identities.get(input.session.id);
|
|
903
|
-
this.identities.delete(input.session.id);
|
|
904
|
-
if (identity) await this.host.retire(identity);
|
|
905
|
-
}
|
|
906
|
-
async saveState(input) {
|
|
907
|
-
const identity = await this.verified(input);
|
|
908
|
-
if (!this.host.saveState) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot save auth state.");
|
|
909
|
-
return this.host.saveState(identity);
|
|
910
|
-
}
|
|
911
|
-
async loadState(input, state) {
|
|
912
|
-
const identity = await this.verified(input);
|
|
913
|
-
if (!this.host.loadState) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot load auth state.");
|
|
914
|
-
await this.host.loadState(identity, state);
|
|
915
|
-
}
|
|
916
|
-
async startScreencast(input, onFrame) {
|
|
917
|
-
const identity = await this.verified(input);
|
|
918
|
-
if (!this.host.startScreencast) throw new BrowserError("CAPABILITY_UNSUPPORTED", "Electron host cannot record its page.");
|
|
919
|
-
return this.host.startScreencast(identity, onFrame, input.context.signal);
|
|
920
|
-
}
|
|
921
|
-
async bind(input) {
|
|
922
|
-
const identity = await this.host.requestSurface({
|
|
923
|
-
session: input.session,
|
|
924
|
-
markerUrl: markerUrl(input.session.id),
|
|
925
|
-
stamp: surfaceStamp(input.session.id),
|
|
926
|
-
context: input.context
|
|
927
|
-
});
|
|
928
|
-
assertIdentity(identity, input.session.id);
|
|
929
|
-
return identity;
|
|
930
|
-
}
|
|
931
|
-
async verified(input) {
|
|
932
|
-
const identity = this.identities.get(input.session.id);
|
|
933
|
-
if (!identity) throw new BrowserError(
|
|
934
|
-
"SURFACE_IDENTITY_FAILED",
|
|
935
|
-
"Visible surface is not bound.",
|
|
936
|
-
{ reason: "unbound" }
|
|
937
|
-
);
|
|
938
|
-
const state = await this.host.inspect(identity);
|
|
939
|
-
if (!state) throw new BrowserError(
|
|
940
|
-
"SURFACE_IDENTITY_FAILED",
|
|
941
|
-
"Visible surface was lost.",
|
|
942
|
-
{ reason: "lost" }
|
|
943
|
-
);
|
|
944
|
-
if (!sameIdentity(state.identity, identity)) {
|
|
945
|
-
throw new BrowserError(
|
|
946
|
-
"SURFACE_IDENTITY_FAILED",
|
|
947
|
-
"Visible surface identity did not match.",
|
|
948
|
-
{ reason: "mismatch" }
|
|
949
|
-
);
|
|
950
|
-
}
|
|
951
|
-
return identity;
|
|
952
|
-
}
|
|
953
|
-
async reattachOnce(input, previous) {
|
|
954
|
-
const next = await this.bind(input);
|
|
955
|
-
if (next.surfaceId !== previous.surfaceId && next.stamp !== previous.stamp) {
|
|
956
|
-
throw new BrowserError("SURFACE_IDENTITY_FAILED", "Visible surface reattachment returned an unrelated page.");
|
|
957
|
-
}
|
|
958
|
-
this.identities.set(input.session.id, next);
|
|
959
|
-
return next;
|
|
960
|
-
}
|
|
961
|
-
};
|
|
962
|
-
function assertIdentity(identity, sessionId) {
|
|
963
|
-
if (identity.browserSessionId !== sessionId || identity.stamp !== surfaceStamp(sessionId) || !BROWSER_SURFACE_PROTOCOLS.includes(identity.protocol)) {
|
|
964
|
-
throw new BrowserError("SURFACE_IDENTITY_FAILED", "Electron host returned an incompatible surface identity.");
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
function sameIdentity(left, right) {
|
|
968
|
-
return left.surfaceId === right.surfaceId && left.browserSessionId === right.browserSessionId && left.stamp === right.stamp && left.protocol === right.protocol;
|
|
969
|
-
}
|
|
970
|
-
function isSurfaceLoss(error2) {
|
|
971
|
-
return error2 instanceof BrowserError && error2.code === "SURFACE_IDENTITY_FAILED" && error2.details?.reason === "lost";
|
|
972
|
-
}
|
|
973
|
-
function isMissingSurface(error2) {
|
|
974
|
-
return error2 instanceof BrowserError && error2.code === "SURFACE_IDENTITY_FAILED" && error2.details?.reason === "lost";
|
|
975
|
-
}
|
|
976
|
-
|
|
977
|
-
// src/drivers/electron/cookie-adapter.ts
|
|
978
|
-
var ELECTRON_COOKIE_ADAPTER_ID = "electron:default-session";
|
|
979
|
-
var ElectronCookieAdapter = class {
|
|
980
|
-
constructor(cookies) {
|
|
981
|
-
this.cookies = cookies;
|
|
982
|
-
}
|
|
983
|
-
cookies;
|
|
984
|
-
id = ELECTRON_COOKIE_ADAPTER_ID;
|
|
985
|
-
supportsPartitionedCookies = false;
|
|
986
|
-
async read() {
|
|
987
|
-
return (await this.cookies.get({})).map(fromElectron);
|
|
988
|
-
}
|
|
989
|
-
async apply(input) {
|
|
990
|
-
input.signal?.throwIfAborted();
|
|
991
|
-
for (const cookie of input.upserts) {
|
|
992
|
-
input.signal?.throwIfAborted();
|
|
993
|
-
if (!cookie.partitionKey) await this.cookies.set(toElectron(cookie));
|
|
994
|
-
}
|
|
995
|
-
for (const cookie of input.deletes || []) {
|
|
996
|
-
input.signal?.throwIfAborted();
|
|
997
|
-
if (cookie.partitionKey) continue;
|
|
998
|
-
await Promise.all([
|
|
999
|
-
this.cookies.remove(cookieUrl(cookie.domain, cookie.path, false), cookie.name),
|
|
1000
|
-
this.cookies.remove(cookieUrl(cookie.domain, cookie.path, true), cookie.name)
|
|
1001
|
-
]);
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
subscribe(changed) {
|
|
1005
|
-
const listener = (_event, _cookie, _cause, _removed) => changed();
|
|
1006
|
-
this.cookies.on("changed", listener);
|
|
1007
|
-
return () => this.cookies.off("changed", listener);
|
|
1008
|
-
}
|
|
1009
|
-
};
|
|
1010
|
-
function fromElectron(cookie) {
|
|
1011
|
-
return {
|
|
1012
|
-
name: cookie.name,
|
|
1013
|
-
value: cookie.value,
|
|
1014
|
-
domain: cookie.domain || "",
|
|
1015
|
-
path: cookie.path || "/",
|
|
1016
|
-
...typeof cookie.expirationDate === "number" && cookie.expirationDate >= 0 ? { expires: cookie.expirationDate } : {},
|
|
1017
|
-
httpOnly: Boolean(cookie.httpOnly),
|
|
1018
|
-
secure: Boolean(cookie.secure),
|
|
1019
|
-
sameSite: cookie.sameSite === "strict" ? "Strict" : cookie.sameSite === "no_restriction" ? "None" : "Lax"
|
|
1020
|
-
};
|
|
1021
|
-
}
|
|
1022
|
-
function toElectron(cookie) {
|
|
1023
|
-
const hostOnly = !cookie.domain.startsWith(".");
|
|
1024
|
-
return {
|
|
1025
|
-
url: cookieUrl(cookie.domain, cookie.path, Boolean(cookie.secure) || cookie.sameSite === "None"),
|
|
1026
|
-
name: cookie.name,
|
|
1027
|
-
value: cookie.value,
|
|
1028
|
-
path: cookie.path || "/",
|
|
1029
|
-
secure: Boolean(cookie.secure),
|
|
1030
|
-
httpOnly: Boolean(cookie.httpOnly),
|
|
1031
|
-
sameSite: cookie.sameSite === "Strict" ? "strict" : cookie.sameSite === "None" ? "no_restriction" : "lax",
|
|
1032
|
-
...!hostOnly ? { domain: cookie.domain } : {},
|
|
1033
|
-
...typeof cookie.expires === "number" ? { expirationDate: cookie.expires } : {}
|
|
1034
|
-
};
|
|
1035
|
-
}
|
|
1036
|
-
function cookieUrl(domain, path6, secure) {
|
|
1037
|
-
const host = domain.trim().toLowerCase().replace(/^\.+/, "");
|
|
1038
|
-
const normalizedPath = String(path6 || "/").startsWith("/") ? path6 || "/" : `/${path6}`;
|
|
1039
|
-
return `${secure ? "https" : "http"}://${host}${normalizedPath}`;
|
|
1040
|
-
}
|
|
1041
|
-
|
|
1042
|
-
// src/drivers/electron/advertisement.ts
|
|
1043
|
-
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
1044
|
-
var import_node_path = __toESM(require("node:path"), 1);
|
|
1045
|
-
|
|
1046
|
-
// node_modules/@amalgm/core/dist/transport/auth.js
|
|
1047
|
-
var utf8 = new TextEncoder();
|
|
1048
|
-
var RUNTIME_TOKEN_HEADER = "x-amalgm-runtime-token";
|
|
1049
|
-
var LOOPBACK_ORIGIN_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "::1"];
|
|
1050
|
-
var RUNTIME_CORS_ALLOWED_HEADERS = [
|
|
1051
|
-
"Content-Type",
|
|
1052
|
-
"Authorization",
|
|
1053
|
-
"Accept",
|
|
1054
|
-
"Cache-Control",
|
|
1055
|
-
"Last-Event-ID",
|
|
1056
|
-
"Mcp-Session-Id",
|
|
1057
|
-
"X-Amalgm-Session-Id",
|
|
1058
|
-
RUNTIME_TOKEN_HEADER
|
|
1059
|
-
].join(", ");
|
|
1060
|
-
|
|
1061
|
-
// node_modules/@amalgm/core/dist/transport/state/api.js
|
|
1062
|
-
var encoder = new TextEncoder();
|
|
1063
|
-
|
|
1064
|
-
// node_modules/@amalgm/core/dist/transport/diagnostics.js
|
|
1065
|
-
var DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES = 256 * 1024;
|
|
1066
|
-
var MAX_DIAGNOSTIC_LOG_TAIL_BYTES = 2 * 1024 * 1024;
|
|
1067
|
-
|
|
1068
|
-
// src/drivers/electron/advertisement.ts
|
|
1069
|
-
function writeHostAdvertisement(options) {
|
|
1070
|
-
const protocol = options.protocol || BROWSER_SURFACE_PROTOCOL;
|
|
1071
|
-
const pid = options.pid || process.pid;
|
|
1072
|
-
if (!isLoopbackCdpUrl(options.cdpUrl)) {
|
|
1073
|
-
throw new BrowserError("INVALID_INPUT", "Electron Browser CDP advertisement must use loopback.");
|
|
1074
|
-
}
|
|
1075
|
-
const data = {
|
|
1076
|
-
browserSurfaceProtocol: protocol,
|
|
1077
|
-
browserSurfaceTargetType: protocol === 5 ? "webview" : "page",
|
|
1078
|
-
browserSurfaceTargetTypes: protocol === 5 ? ["webview"] : ["page", "webview"],
|
|
1079
|
-
cdp: { url: options.cdpUrl, port: options.cdpPort },
|
|
1080
|
-
...protocol === 5 ? { cdpUrl: options.cdpUrl, cdpPort: options.cdpPort } : {},
|
|
1081
|
-
...options.label ? { label: options.label } : {},
|
|
1082
|
-
pid,
|
|
1083
|
-
startedAt: options.startedAt || (/* @__PURE__ */ new Date()).toISOString()
|
|
1084
|
-
};
|
|
1085
|
-
const temporary = `${options.file}.${pid}.${Date.now()}.tmp`;
|
|
1086
|
-
import_node_fs.default.mkdirSync(import_node_path.default.dirname(options.file), { recursive: true, mode: 448 });
|
|
1087
|
-
try {
|
|
1088
|
-
import_node_fs.default.writeFileSync(temporary, `${JSON.stringify(data, null, 2)}
|
|
1089
|
-
`, { mode: 384 });
|
|
1090
|
-
import_node_fs.default.renameSync(temporary, options.file);
|
|
1091
|
-
import_node_fs.default.chmodSync(options.file, 384);
|
|
1092
|
-
} catch (error2) {
|
|
1093
|
-
import_node_fs.default.rmSync(temporary, { force: true });
|
|
1094
|
-
throw error2;
|
|
1095
|
-
}
|
|
1096
|
-
}
|
|
1097
|
-
function removeHostAdvertisement(file, pid = process.pid) {
|
|
1098
|
-
try {
|
|
1099
|
-
const value = JSON.parse(import_node_fs.default.readFileSync(file, "utf8"));
|
|
1100
|
-
if (value.pid !== pid) return false;
|
|
1101
|
-
} catch (error2) {
|
|
1102
|
-
if (error2.code === "ENOENT") return false;
|
|
1103
|
-
}
|
|
1104
|
-
import_node_fs.default.rmSync(file, { force: true });
|
|
1105
|
-
return true;
|
|
1106
|
-
}
|
|
1107
|
-
function isLoopbackCdpUrl(value) {
|
|
1108
|
-
try {
|
|
1109
|
-
const url = new URL(value);
|
|
1110
|
-
return ["http:", "https:", "ws:", "wss:"].includes(url.protocol) && LOOPBACK_ORIGIN_HOSTNAMES.includes(url.hostname);
|
|
1111
|
-
} catch {
|
|
1112
|
-
return false;
|
|
1113
|
-
}
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
// src/drivers/electron/session.ts
|
|
1117
|
-
function isolatedBrowserSession(sessionModule) {
|
|
1118
|
-
return sessionModule.fromPartition(BROWSER_SESSION_PARTITION);
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
// src/drivers/electron/policy.ts
|
|
1122
|
-
var WEB_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:"]);
|
|
1123
|
-
var EXTERNAL_PROTOCOLS = /* @__PURE__ */ new Set(["mailto:", "tel:", "sms:"]);
|
|
1124
|
-
function normalizeBrowserLocation(raw) {
|
|
1125
|
-
const value = raw.trim();
|
|
1126
|
-
if (!value) return "about:blank";
|
|
1127
|
-
if (/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(value)) return value;
|
|
1128
|
-
if (/^(localhost|\d{1,3}(?:\.\d{1,3}){3})(:\d+)?(?:\/|$)/i.test(value)) return `http://${value}`;
|
|
1129
|
-
if (/^[^\s.]+\.[^\s]+/.test(value)) return `https://${value}`;
|
|
1130
|
-
return `https://www.google.com/search?q=${encodeURIComponent(value)}`;
|
|
1131
|
-
}
|
|
1132
|
-
function browserNavigationPolicy(raw) {
|
|
1133
|
-
try {
|
|
1134
|
-
const url = new URL(raw);
|
|
1135
|
-
if (WEB_PROTOCOLS.has(url.protocol) || url.protocol === "about:") return "allow";
|
|
1136
|
-
if (EXTERNAL_PROTOCOLS.has(url.protocol)) return "external";
|
|
1137
|
-
} catch {
|
|
1138
|
-
}
|
|
1139
|
-
return "deny";
|
|
1140
|
-
}
|
|
1141
|
-
function safeDownloadName(value) {
|
|
1142
|
-
const name = value.replace(/[\\/:*?"<>|\u0000-\u001f]/g, "_").replace(/^\.+/, "").trim();
|
|
1143
|
-
return name.slice(0, 180) || "download";
|
|
1144
|
-
}
|
|
1145
|
-
function permissionOrigin(url) {
|
|
1146
|
-
try {
|
|
1147
|
-
const value = new URL(url);
|
|
1148
|
-
return WEB_PROTOCOLS.has(value.protocol) ? value.origin : null;
|
|
1149
|
-
} catch {
|
|
1150
|
-
return null;
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
|
|
1154
|
-
// src/drivers/electron/native/shell.ts
|
|
1155
|
-
var import_node_path4 = __toESM(require("node:path"), 1);
|
|
1156
|
-
var import_electron11 = require("electron");
|
|
817
|
+
// src/electron/shell.ts
|
|
818
|
+
var import_node_path3 = __toESM(require("node:path"), 1);
|
|
819
|
+
var import_electron10 = require("electron");
|
|
1157
820
|
|
|
1158
|
-
// src/
|
|
821
|
+
// src/electron/contracts.ts
|
|
1159
822
|
var BROWSER_IPC = {
|
|
1160
|
-
registerGuest: "browser:register-guest",
|
|
1161
823
|
surfaceCreate: "browser:surface-create",
|
|
1162
824
|
surfaceUpdate: "browser:surface-update",
|
|
1163
825
|
surfaceDestroy: "browser:surface-destroy",
|
|
@@ -11824,12 +11486,12 @@ var utf8d = new Uint8Array([
|
|
|
11824
11486
|
/* eslint-enable prettier/prettier */
|
|
11825
11487
|
]);
|
|
11826
11488
|
|
|
11827
|
-
// src/
|
|
11828
|
-
var import_node_path3 = __toESM(require("node:path"), 1);
|
|
11829
|
-
|
|
11830
|
-
// src/drivers/electron/native/adblock/cache.ts
|
|
11831
|
-
var import_node_fs2 = __toESM(require("node:fs"), 1);
|
|
11489
|
+
// src/electron/adblock/index.ts
|
|
11832
11490
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
11491
|
+
|
|
11492
|
+
// src/electron/adblock/cache.ts
|
|
11493
|
+
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
11494
|
+
var import_node_path = __toESM(require("node:path"), 1);
|
|
11833
11495
|
var MAX_AGE_MS = 7 * 24 * 60 * 6e4;
|
|
11834
11496
|
var DOWNLOAD_TIMEOUT_MS = 15e3;
|
|
11835
11497
|
function isAdBlockCacheFresh(mtimeMs, now = Date.now()) {
|
|
@@ -11858,25 +11520,25 @@ async function loadAdBlockEngine(cachePath, fetchImpl) {
|
|
|
11858
11520
|
}
|
|
11859
11521
|
async function readCache(file) {
|
|
11860
11522
|
try {
|
|
11861
|
-
const [data, stat] = await Promise.all([
|
|
11523
|
+
const [data, stat] = await Promise.all([import_node_fs.default.promises.readFile(file), import_node_fs.default.promises.stat(file)]);
|
|
11862
11524
|
return { data, mtimeMs: stat.mtimeMs };
|
|
11863
11525
|
} catch {
|
|
11864
11526
|
return null;
|
|
11865
11527
|
}
|
|
11866
11528
|
}
|
|
11867
11529
|
async function writeAtomic(file, data) {
|
|
11868
|
-
await
|
|
11530
|
+
await import_node_fs.default.promises.mkdir(import_node_path.default.dirname(file), { recursive: true, mode: 448 });
|
|
11869
11531
|
const temporary = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
11870
11532
|
try {
|
|
11871
|
-
await
|
|
11872
|
-
await
|
|
11533
|
+
await import_node_fs.default.promises.writeFile(temporary, data, { mode: 384 });
|
|
11534
|
+
await import_node_fs.default.promises.rename(temporary, file);
|
|
11873
11535
|
} catch (error2) {
|
|
11874
|
-
await
|
|
11536
|
+
await import_node_fs.default.promises.rm(temporary, { force: true });
|
|
11875
11537
|
throw error2;
|
|
11876
11538
|
}
|
|
11877
11539
|
}
|
|
11878
11540
|
|
|
11879
|
-
// src/
|
|
11541
|
+
// src/electron/adblock/cosmetics.ts
|
|
11880
11542
|
var import_electron = require("electron");
|
|
11881
11543
|
var import_tldts_experimental3 = __toESM(require_cjs(), 1);
|
|
11882
11544
|
var COSMETIC_INJECTION_CHANNEL = "@ghostery/adblocker/inject-cosmetic-filters";
|
|
@@ -11918,8 +11580,8 @@ function installCosmeticHandlers(input) {
|
|
|
11918
11580
|
};
|
|
11919
11581
|
}
|
|
11920
11582
|
|
|
11921
|
-
// src/
|
|
11922
|
-
var
|
|
11583
|
+
// src/electron/adblock/settings.ts
|
|
11584
|
+
var import_node_fs2 = __toESM(require("node:fs"), 1);
|
|
11923
11585
|
var AdBlockAllowlist = class {
|
|
11924
11586
|
constructor(file) {
|
|
11925
11587
|
this.file = file;
|
|
@@ -11946,7 +11608,7 @@ var AdBlockAllowlist = class {
|
|
|
11946
11608
|
};
|
|
11947
11609
|
function read(file) {
|
|
11948
11610
|
try {
|
|
11949
|
-
const value = JSON.parse(
|
|
11611
|
+
const value = JSON.parse(import_node_fs2.default.readFileSync(file, "utf8"));
|
|
11950
11612
|
return new Set(Array.isArray(value.pausedHosts) ? value.pausedHosts.filter((item) => typeof item === "string").map(normalize).filter(Boolean) : []);
|
|
11951
11613
|
} catch {
|
|
11952
11614
|
return /* @__PURE__ */ new Set();
|
|
@@ -11956,7 +11618,7 @@ function normalize(value) {
|
|
|
11956
11618
|
return value.trim().toLowerCase();
|
|
11957
11619
|
}
|
|
11958
11620
|
|
|
11959
|
-
// src/
|
|
11621
|
+
// src/electron/adblock/policy.ts
|
|
11960
11622
|
function adBlockHostname(value) {
|
|
11961
11623
|
try {
|
|
11962
11624
|
return new URL(value).hostname.toLowerCase();
|
|
@@ -11968,7 +11630,7 @@ function isNativeAdBlockDisabled(value = process.env.AMALGM_BROWSER_ADBLOCK) {
|
|
|
11968
11630
|
return /^(0|false|no|off)$/i.test(String(value || "").trim());
|
|
11969
11631
|
}
|
|
11970
11632
|
|
|
11971
|
-
// src/
|
|
11633
|
+
// src/electron/adblock/index.ts
|
|
11972
11634
|
var NativeAdBlocker = class {
|
|
11973
11635
|
constructor(options) {
|
|
11974
11636
|
this.options = options;
|
|
@@ -11988,7 +11650,7 @@ var NativeAdBlocker = class {
|
|
|
11988
11650
|
disabled;
|
|
11989
11651
|
cosmeticPreloadPath() {
|
|
11990
11652
|
const generatedName = true ? "electron-preload.cjs" : "preload.js";
|
|
11991
|
-
return this.disabled ? null : this.options.preloadPath ||
|
|
11653
|
+
return this.disabled ? null : this.options.preloadPath || import_node_path2.default.join(__dirname, generatedName);
|
|
11992
11654
|
}
|
|
11993
11655
|
install(session2) {
|
|
11994
11656
|
if (this.installed === session2) return;
|
|
@@ -12125,15 +11787,10 @@ var NativeAdBlocker = class {
|
|
|
12125
11787
|
}
|
|
12126
11788
|
};
|
|
12127
11789
|
|
|
12128
|
-
// src/
|
|
12129
|
-
function nativeBrowserSurfacesEnabled(value = process.env.AMALGM_BROWSER_WCV) {
|
|
12130
|
-
return !/^(0|false|no|off)$/i.test(String(value || "").trim());
|
|
12131
|
-
}
|
|
12132
|
-
|
|
12133
|
-
// src/drivers/electron/native/policy.ts
|
|
11790
|
+
// src/electron/policy.ts
|
|
12134
11791
|
var import_path = __toESM(require("path"), 1);
|
|
12135
|
-
var
|
|
12136
|
-
var
|
|
11792
|
+
var WEB_PROTOCOLS = /* @__PURE__ */ new Set(["http:", "https:", "about:"]);
|
|
11793
|
+
var EXTERNAL_PROTOCOLS = /* @__PURE__ */ new Set(["mailto:", "tel:"]);
|
|
12137
11794
|
function parseUrl(value) {
|
|
12138
11795
|
try {
|
|
12139
11796
|
return new URL(value);
|
|
@@ -12143,13 +11800,13 @@ function parseUrl(value) {
|
|
|
12143
11800
|
}
|
|
12144
11801
|
function isAllowedWebUrl(value) {
|
|
12145
11802
|
const parsed = parseUrl(value);
|
|
12146
|
-
return Boolean(parsed &&
|
|
11803
|
+
return Boolean(parsed && WEB_PROTOCOLS.has(parsed.protocol));
|
|
12147
11804
|
}
|
|
12148
11805
|
function isAllowedExternalUrl(value) {
|
|
12149
11806
|
const parsed = parseUrl(value);
|
|
12150
|
-
return Boolean(parsed &&
|
|
11807
|
+
return Boolean(parsed && EXTERNAL_PROTOCOLS.has(parsed.protocol));
|
|
12151
11808
|
}
|
|
12152
|
-
function
|
|
11809
|
+
function permissionOrigin(requestingUrl, fallbackUrl) {
|
|
12153
11810
|
const parsed = parseUrl(requestingUrl) ?? parseUrl(fallbackUrl);
|
|
12154
11811
|
return parsed?.origin && parsed.origin !== "null" ? parsed.origin : "";
|
|
12155
11812
|
}
|
|
@@ -12173,18 +11830,19 @@ function nextAvailableDownloadPath(downloadsDirectory, filename, exists) {
|
|
|
12173
11830
|
return candidate;
|
|
12174
11831
|
}
|
|
12175
11832
|
|
|
12176
|
-
// src/
|
|
11833
|
+
// src/electron/session.ts
|
|
12177
11834
|
var import_electron2 = require("electron");
|
|
12178
|
-
var
|
|
12179
|
-
function getBrowserSession() {
|
|
12180
|
-
if (!
|
|
12181
|
-
|
|
11835
|
+
var import_node_crypto = require("node:crypto");
|
|
11836
|
+
function getBrowserSession(accountId) {
|
|
11837
|
+
if (!accountId) throw new Error("Native browsing requires an Amalgm account.");
|
|
11838
|
+
const key = (0, import_node_crypto.createHash)("sha256").update(accountId).digest("hex");
|
|
11839
|
+
return import_electron2.session.fromPartition(`persist:amalgm-browser-${key}`, { cache: true });
|
|
12182
11840
|
}
|
|
12183
11841
|
|
|
12184
|
-
// src/
|
|
12185
|
-
var
|
|
11842
|
+
// src/electron/surface-controller.ts
|
|
11843
|
+
var import_electron4 = require("electron");
|
|
12186
11844
|
|
|
12187
|
-
// src/
|
|
11845
|
+
// src/electron/surface/state.ts
|
|
12188
11846
|
function validSurfaceId(value) {
|
|
12189
11847
|
return typeof value === "string" && value.length > 0 && value.length <= 200;
|
|
12190
11848
|
}
|
|
@@ -12194,11 +11852,12 @@ function normalizeBounds(bounds, owner) {
|
|
|
12194
11852
|
const width = finiteNumber(bounds?.width);
|
|
12195
11853
|
const height = finiteNumber(bounds?.height);
|
|
12196
11854
|
if (x === null || y === null || width === null || height === null) return null;
|
|
11855
|
+
const zoom = owner.webContents.getZoomFactor();
|
|
12197
11856
|
const content = owner.getContentBounds();
|
|
12198
|
-
const left = Math.max(0, Math.round(x));
|
|
12199
|
-
const top = Math.max(0, Math.round(y));
|
|
12200
|
-
const right = Math.min(content.width, Math.round(x + Math.max(0, width)));
|
|
12201
|
-
const bottom = Math.min(content.height, Math.round(y + Math.max(0, height)));
|
|
11857
|
+
const left = Math.max(0, Math.round(x * zoom));
|
|
11858
|
+
const top = Math.max(0, Math.round(y * zoom));
|
|
11859
|
+
const right = Math.min(content.width, Math.round((x + Math.max(0, width)) * zoom));
|
|
11860
|
+
const bottom = Math.min(content.height, Math.round((y + Math.max(0, height)) * zoom));
|
|
12202
11861
|
return { x: left, y: top, width: Math.max(0, right - left), height: Math.max(0, bottom - top) };
|
|
12203
11862
|
}
|
|
12204
11863
|
function stateFor(record) {
|
|
@@ -12238,7 +11897,7 @@ function finiteNumber(value) {
|
|
|
12238
11897
|
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
12239
11898
|
}
|
|
12240
11899
|
|
|
12241
|
-
// src/
|
|
11900
|
+
// src/electron/surface/commands.ts
|
|
12242
11901
|
var MIN_ZOOM = 0.5;
|
|
12243
11902
|
var MAX_ZOOM = 3;
|
|
12244
11903
|
function executeSurfaceCommand(record, request, presentation, isAllowedUrl) {
|
|
@@ -12283,7 +11942,7 @@ function executeSurfaceCommand(record, request, presentation, isAllowedUrl) {
|
|
|
12283
11942
|
return stateFor(record);
|
|
12284
11943
|
}
|
|
12285
11944
|
|
|
12286
|
-
// src/
|
|
11945
|
+
// src/electron/surface/create.ts
|
|
12287
11946
|
var import_electron3 = require("electron");
|
|
12288
11947
|
function createSurfaceRecord(sender, request, options) {
|
|
12289
11948
|
const owner = import_electron3.BrowserWindow.fromWebContents(sender);
|
|
@@ -12311,13 +11970,8 @@ function createSurfaceRecord(sender, request, options) {
|
|
|
12311
11970
|
view,
|
|
12312
11971
|
owner,
|
|
12313
11972
|
embedder: sender,
|
|
12314
|
-
isAutomation: request.isAutomation === true,
|
|
12315
|
-
automationSessionId: validSurfaceId(request.automationSessionId) ? request.automationSessionId : null,
|
|
12316
|
-
parkingWindow: null,
|
|
12317
|
-
parent: "owner",
|
|
12318
11973
|
bounds: { x: 0, y: 0, width: 0, height: 0 },
|
|
12319
11974
|
requestedVisible: false,
|
|
12320
|
-
displayScale: 1,
|
|
12321
11975
|
zoomFactor: 1,
|
|
12322
11976
|
ready: false,
|
|
12323
11977
|
title: "",
|
|
@@ -12328,7 +11982,7 @@ function createSurfaceRecord(sender, request, options) {
|
|
|
12328
11982
|
};
|
|
12329
11983
|
}
|
|
12330
11984
|
|
|
12331
|
-
// src/
|
|
11985
|
+
// src/electron/surface/events.ts
|
|
12332
11986
|
function configureSurfaceEvents(record, presentation, sendState, destroyed) {
|
|
12333
11987
|
const contents = record.view.webContents;
|
|
12334
11988
|
contents.on("did-start-loading", () => {
|
|
@@ -12344,7 +11998,6 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
|
|
|
12344
11998
|
contents.on("dom-ready", () => {
|
|
12345
11999
|
record.ready = true;
|
|
12346
12000
|
presentation.applyZoom(record);
|
|
12347
|
-
stampAutomationIdentity(record);
|
|
12348
12001
|
presentation.apply(record);
|
|
12349
12002
|
sendState();
|
|
12350
12003
|
});
|
|
@@ -12358,13 +12011,11 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
|
|
|
12358
12011
|
});
|
|
12359
12012
|
contents.on("did-navigate", () => {
|
|
12360
12013
|
record.loadError = null;
|
|
12361
|
-
stampAutomationIdentity(record);
|
|
12362
12014
|
sendState();
|
|
12363
12015
|
});
|
|
12364
12016
|
contents.on("did-navigate-in-page", (_event, _url, mainFrame) => {
|
|
12365
12017
|
if (!mainFrame) return;
|
|
12366
12018
|
record.loadError = null;
|
|
12367
|
-
stampAutomationIdentity(record);
|
|
12368
12019
|
sendState();
|
|
12369
12020
|
});
|
|
12370
12021
|
contents.on("did-fail-load", (_event, code, description, url, mainFrame) => {
|
|
@@ -12381,110 +12032,34 @@ function configureSurfaceEvents(record, presentation, sendState, destroyed) {
|
|
|
12381
12032
|
});
|
|
12382
12033
|
contents.once("destroyed", destroyed);
|
|
12383
12034
|
}
|
|
12384
|
-
function stampAutomationIdentity(record) {
|
|
12385
|
-
const contents = record.view.webContents;
|
|
12386
|
-
if (!record.automationSessionId || contents.isDestroyed()) return;
|
|
12387
|
-
void contents.executeJavaScript(
|
|
12388
|
-
`window.__amalgmBsid = ${JSON.stringify(record.automationSessionId)};`
|
|
12389
|
-
).catch(() => {
|
|
12390
|
-
});
|
|
12391
|
-
}
|
|
12392
12035
|
|
|
12393
|
-
// src/
|
|
12394
|
-
var import_electron4 = require("electron");
|
|
12395
|
-
var PARKED_VIEWPORT = { width: 1440, height: 900 };
|
|
12396
|
-
var PARKING_ORIGIN = -1e4;
|
|
12036
|
+
// src/electron/surface/presentation.ts
|
|
12397
12037
|
var MAX_ZOOM2 = 3;
|
|
12398
12038
|
var SurfacePresentation = class {
|
|
12399
12039
|
detach(record) {
|
|
12400
|
-
if (record.
|
|
12401
|
-
record.owner.contentView.removeChildView(record.view);
|
|
12402
|
-
}
|
|
12403
|
-
if (record.parent === "parking" && record.parkingWindow && !record.parkingWindow.isDestroyed()) {
|
|
12404
|
-
record.parkingWindow.contentView.removeChildView(record.view);
|
|
12405
|
-
}
|
|
12406
|
-
record.parent = null;
|
|
12040
|
+
if (!record.owner.isDestroyed()) record.owner.contentView.removeChildView(record.view);
|
|
12407
12041
|
}
|
|
12408
12042
|
applyZoom(record) {
|
|
12409
12043
|
const contents = record.view.webContents;
|
|
12410
12044
|
if (contents.isDestroyed()) return;
|
|
12411
|
-
const
|
|
12412
|
-
const factor = Math.max(0.1, Math.min(MAX_ZOOM2, record.zoomFactor * scale));
|
|
12045
|
+
const factor = Math.max(0.1, Math.min(MAX_ZOOM2, record.zoomFactor));
|
|
12413
12046
|
if (Math.abs(contents.getZoomFactor() - factor) >= 1e-3) contents.setZoomFactor(factor);
|
|
12414
12047
|
}
|
|
12048
|
+
/** Shows the page in its tab's box while the tab asks and has room; hides it otherwise. */
|
|
12415
12049
|
apply(record) {
|
|
12416
|
-
|
|
12417
|
-
|
|
12418
|
-
else this.hide(record);
|
|
12419
|
-
}
|
|
12420
|
-
destroyParking(record) {
|
|
12421
|
-
if (record.parkingWindow && !record.parkingWindow.isDestroyed()) record.parkingWindow.destroy();
|
|
12422
|
-
record.parkingWindow = null;
|
|
12423
|
-
}
|
|
12424
|
-
show(record) {
|
|
12425
|
-
if (record.parent !== "owner") {
|
|
12426
|
-
this.detach(record);
|
|
12427
|
-
record.owner.contentView.addChildView(record.view);
|
|
12428
|
-
record.parent = "owner";
|
|
12429
|
-
record.parkingWindow?.hide();
|
|
12430
|
-
} else {
|
|
12431
|
-
record.owner.contentView.addChildView(record.view);
|
|
12432
|
-
}
|
|
12433
|
-
record.view.setBounds(record.bounds);
|
|
12434
|
-
record.view.setVisible(true);
|
|
12435
|
-
this.applyZoom(record);
|
|
12436
|
-
}
|
|
12437
|
-
hide(record) {
|
|
12438
|
-
if (record.isAutomation) {
|
|
12439
|
-
this.park(record);
|
|
12050
|
+
if (!record.requestedVisible || record.bounds.width <= 0 || record.bounds.height <= 0) {
|
|
12051
|
+
record.view.setVisible(false);
|
|
12440
12052
|
return;
|
|
12441
12053
|
}
|
|
12442
|
-
|
|
12443
|
-
|
|
12444
|
-
record.owner.contentView.addChildView(record.view);
|
|
12445
|
-
record.parent = "owner";
|
|
12446
|
-
}
|
|
12447
|
-
record.view.setVisible(false);
|
|
12448
|
-
}
|
|
12449
|
-
park(record) {
|
|
12450
|
-
const parkingWindow = this.parkingWindow(record);
|
|
12451
|
-
if (record.parent !== "parking") {
|
|
12452
|
-
this.detach(record);
|
|
12453
|
-
parkingWindow.contentView.addChildView(record.view);
|
|
12454
|
-
record.parent = "parking";
|
|
12455
|
-
}
|
|
12456
|
-
record.view.setBounds({ x: 0, y: 0, ...PARKED_VIEWPORT });
|
|
12054
|
+
record.owner.contentView.addChildView(record.view);
|
|
12055
|
+
record.view.setBounds(record.bounds);
|
|
12457
12056
|
record.view.setVisible(true);
|
|
12458
12057
|
this.applyZoom(record);
|
|
12459
|
-
parkingWindow.showInactive();
|
|
12460
|
-
}
|
|
12461
|
-
parkingWindow(record) {
|
|
12462
|
-
if (record.parkingWindow && !record.parkingWindow.isDestroyed()) return record.parkingWindow;
|
|
12463
|
-
record.parkingWindow = new import_electron4.BaseWindow({
|
|
12464
|
-
show: false,
|
|
12465
|
-
x: PARKING_ORIGIN,
|
|
12466
|
-
y: PARKING_ORIGIN,
|
|
12467
|
-
...PARKED_VIEWPORT,
|
|
12468
|
-
focusable: true,
|
|
12469
|
-
skipTaskbar: true,
|
|
12470
|
-
hiddenInMissionControl: true,
|
|
12471
|
-
frame: false,
|
|
12472
|
-
hasShadow: false,
|
|
12473
|
-
closable: false,
|
|
12474
|
-
minimizable: false,
|
|
12475
|
-
maximizable: false,
|
|
12476
|
-
movable: false,
|
|
12477
|
-
resizable: false,
|
|
12478
|
-
fullscreenable: false,
|
|
12479
|
-
roundedCorners: false,
|
|
12480
|
-
backgroundColor: "#ffffff"
|
|
12481
|
-
});
|
|
12482
|
-
return record.parkingWindow;
|
|
12483
12058
|
}
|
|
12484
12059
|
};
|
|
12485
12060
|
|
|
12486
|
-
// src/
|
|
12487
|
-
var
|
|
12061
|
+
// src/electron/surface-controller.ts
|
|
12062
|
+
var CAPTURE_STALL_MS = 2e3;
|
|
12488
12063
|
function createBrowserSurfaceController(options) {
|
|
12489
12064
|
const surfaces = /* @__PURE__ */ new Map();
|
|
12490
12065
|
const ownerSurfaceIds = /* @__PURE__ */ new Map();
|
|
@@ -12498,7 +12073,6 @@ function createBrowserSurfaceController(options) {
|
|
|
12498
12073
|
surfaces.delete(record.surfaceId);
|
|
12499
12074
|
ownerSurfaceIds.get(record.embedder.id)?.delete(record.surfaceId);
|
|
12500
12075
|
presentation.detach(record);
|
|
12501
|
-
presentation.destroyParking(record);
|
|
12502
12076
|
if (closeContents && !record.view.webContents.isDestroyed()) record.view.webContents.close();
|
|
12503
12077
|
};
|
|
12504
12078
|
const destroyOwned = (ownerId) => {
|
|
@@ -12512,7 +12086,8 @@ function createBrowserSurfaceController(options) {
|
|
|
12512
12086
|
const record = surfaces.get(surfaceId);
|
|
12513
12087
|
return record && record.embedder.id === sender.id && !record.disposed ? record : null;
|
|
12514
12088
|
};
|
|
12515
|
-
|
|
12089
|
+
import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCreate, async (event, request) => {
|
|
12090
|
+
if (!options.isTrustedAppUrl(event.senderFrame?.url ?? "")) return null;
|
|
12516
12091
|
if (!request || !validSurfaceId(request.surfaceId)) return null;
|
|
12517
12092
|
const url = String(request.url || "about:blank");
|
|
12518
12093
|
if (!options.isAllowedUrl(url)) return null;
|
|
@@ -12537,8 +12112,7 @@ function createBrowserSurfaceController(options) {
|
|
|
12537
12112
|
options.onSurfaceCreated({
|
|
12538
12113
|
contents: record.view.webContents,
|
|
12539
12114
|
embedder: event.sender,
|
|
12540
|
-
tabId: record.tabId
|
|
12541
|
-
isAutomation: record.isAutomation
|
|
12115
|
+
tabId: record.tabId
|
|
12542
12116
|
});
|
|
12543
12117
|
configureSurfaceEvents(
|
|
12544
12118
|
record,
|
|
@@ -12550,43 +12124,37 @@ function createBrowserSurfaceController(options) {
|
|
|
12550
12124
|
});
|
|
12551
12125
|
return stateFor(record);
|
|
12552
12126
|
});
|
|
12553
|
-
|
|
12127
|
+
import_electron4.ipcMain.handle(BROWSER_IPC.surfaceUpdate, (event, request) => {
|
|
12554
12128
|
const record = request ? ownedSurface(event.sender, request.surfaceId) : null;
|
|
12555
12129
|
if (!record || record.owner.isDestroyed()) return false;
|
|
12556
12130
|
const bounds = normalizeBounds(request.bounds, record.owner);
|
|
12557
12131
|
if (!bounds) return false;
|
|
12558
|
-
const isAutomation = request.isAutomation === true;
|
|
12559
|
-
if (record.isAutomation !== isAutomation) {
|
|
12560
|
-
record.isAutomation = isAutomation;
|
|
12561
|
-
options.onAutomationChanged(record.view.webContents, isAutomation);
|
|
12562
|
-
}
|
|
12563
12132
|
record.bounds = bounds;
|
|
12564
12133
|
record.requestedVisible = request.visible === true;
|
|
12565
|
-
record.displayScale = Math.max(0.1, Math.min(1, Number(request.scale) || 1));
|
|
12566
12134
|
presentation.apply(record);
|
|
12567
12135
|
return true;
|
|
12568
12136
|
});
|
|
12569
|
-
|
|
12137
|
+
import_electron4.ipcMain.handle(BROWSER_IPC.surfaceDestroy, (event, surfaceId) => {
|
|
12570
12138
|
const record = ownedSurface(event.sender, surfaceId);
|
|
12571
12139
|
if (!record) return false;
|
|
12572
12140
|
destroyRecord(record, true);
|
|
12573
12141
|
return true;
|
|
12574
12142
|
});
|
|
12575
|
-
|
|
12143
|
+
import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCommand, (event, request) => {
|
|
12576
12144
|
const record = request ? ownedSurface(event.sender, request.surfaceId) : null;
|
|
12577
12145
|
if (!record || record.view.webContents.isDestroyed()) return null;
|
|
12578
12146
|
const state = executeSurfaceCommand(record, request, presentation, options.isAllowedUrl);
|
|
12579
12147
|
sendState(record);
|
|
12580
12148
|
return state;
|
|
12581
12149
|
});
|
|
12582
|
-
|
|
12150
|
+
import_electron4.ipcMain.handle(BROWSER_IPC.surfaceCapture, async (event, surfaceId) => {
|
|
12583
12151
|
const record = ownedSurface(event.sender, surfaceId);
|
|
12584
12152
|
if (!record || record.view.webContents.isDestroyed()) return null;
|
|
12585
12153
|
try {
|
|
12586
|
-
const image = await withDeadline(record.view.webContents.capturePage(),
|
|
12154
|
+
const image = await withDeadline(record.view.webContents.capturePage(), CAPTURE_STALL_MS);
|
|
12587
12155
|
if (image.isEmpty()) return null;
|
|
12588
12156
|
const size = image.getSize();
|
|
12589
|
-
const targetWidth = Math.min(size.width, Math.max(1, record.bounds.width ||
|
|
12157
|
+
const targetWidth = Math.min(size.width, Math.max(1, record.bounds.width || size.width));
|
|
12590
12158
|
const normalized = size.width > targetWidth ? image.resize({ width: targetWidth, quality: "good" }) : image;
|
|
12591
12159
|
return `data:image/jpeg;base64,${normalized.toJPEG(78).toString("base64")}`;
|
|
12592
12160
|
} catch {
|
|
@@ -12597,29 +12165,29 @@ function createBrowserSurfaceController(options) {
|
|
|
12597
12165
|
dispose() {
|
|
12598
12166
|
for (const record of [...surfaces.values()]) destroyRecord(record, true);
|
|
12599
12167
|
ownerSurfaceIds.clear();
|
|
12600
|
-
|
|
12601
|
-
|
|
12602
|
-
|
|
12603
|
-
|
|
12604
|
-
|
|
12168
|
+
import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCreate);
|
|
12169
|
+
import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceUpdate);
|
|
12170
|
+
import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceDestroy);
|
|
12171
|
+
import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCommand);
|
|
12172
|
+
import_electron4.ipcMain.removeHandler(BROWSER_IPC.surfaceCapture);
|
|
12605
12173
|
}
|
|
12606
12174
|
};
|
|
12607
12175
|
}
|
|
12608
12176
|
|
|
12609
|
-
// src/
|
|
12610
|
-
var
|
|
12177
|
+
// src/electron/shell/adblock-ipc.ts
|
|
12178
|
+
var import_electron5 = require("electron");
|
|
12611
12179
|
var BrowserAdBlockIpc = class {
|
|
12612
12180
|
constructor(blocker, sites) {
|
|
12613
12181
|
this.blocker = blocker;
|
|
12614
12182
|
this.sites = sites;
|
|
12615
|
-
|
|
12616
|
-
|
|
12183
|
+
import_electron5.ipcMain.handle(BROWSER_IPC.adBlockGetStatus, this.getStatus);
|
|
12184
|
+
import_electron5.ipcMain.handle(BROWSER_IPC.adBlockSetEnabled, this.setEnabled);
|
|
12617
12185
|
}
|
|
12618
12186
|
blocker;
|
|
12619
12187
|
sites;
|
|
12620
12188
|
dispose() {
|
|
12621
|
-
|
|
12622
|
-
|
|
12189
|
+
import_electron5.ipcMain.removeHandler(BROWSER_IPC.adBlockGetStatus);
|
|
12190
|
+
import_electron5.ipcMain.removeHandler(BROWSER_IPC.adBlockSetEnabled);
|
|
12623
12191
|
}
|
|
12624
12192
|
getStatus = (event, guestId) => {
|
|
12625
12193
|
if (!Number.isInteger(guestId)) return null;
|
|
@@ -12643,11 +12211,11 @@ var BrowserAdBlockIpc = class {
|
|
|
12643
12211
|
};
|
|
12644
12212
|
};
|
|
12645
12213
|
|
|
12646
|
-
// src/
|
|
12647
|
-
var
|
|
12648
|
-
var
|
|
12214
|
+
// src/electron/shell/context-menu.ts
|
|
12215
|
+
var import_node_crypto2 = __toESM(require("node:crypto"), 1);
|
|
12216
|
+
var import_electron6 = require("electron");
|
|
12649
12217
|
|
|
12650
|
-
// src/
|
|
12218
|
+
// src/electron/shell/helpers.ts
|
|
12651
12219
|
function send(embedder, channel, payload2) {
|
|
12652
12220
|
if (!embedder.isDestroyed()) embedder.send(channel, payload2);
|
|
12653
12221
|
}
|
|
@@ -12666,7 +12234,7 @@ function shortcutForInput(input) {
|
|
|
12666
12234
|
if (key === "=" || key === "+") return "zoom-in";
|
|
12667
12235
|
return null;
|
|
12668
12236
|
}
|
|
12669
|
-
function popupWindowOptions(cosmeticPreloadPath,
|
|
12237
|
+
function popupWindowOptions(cosmeticPreloadPath, browserSession) {
|
|
12670
12238
|
return {
|
|
12671
12239
|
width: 520,
|
|
12672
12240
|
height: 680,
|
|
@@ -12679,7 +12247,7 @@ function popupWindowOptions(cosmeticPreloadPath, browserSession2) {
|
|
|
12679
12247
|
trafficLightPosition: { x: 14, y: 14 }
|
|
12680
12248
|
} : {},
|
|
12681
12249
|
webPreferences: {
|
|
12682
|
-
session:
|
|
12250
|
+
session: browserSession,
|
|
12683
12251
|
nodeIntegration: false,
|
|
12684
12252
|
contextIsolation: true,
|
|
12685
12253
|
sandbox: true,
|
|
@@ -12690,17 +12258,17 @@ function popupWindowOptions(cosmeticPreloadPath, browserSession2) {
|
|
|
12690
12258
|
};
|
|
12691
12259
|
}
|
|
12692
12260
|
|
|
12693
|
-
// src/
|
|
12261
|
+
// src/electron/shell/context-menu.ts
|
|
12694
12262
|
var BrowserContextMenuController = class {
|
|
12695
12263
|
constructor(isDev) {
|
|
12696
12264
|
this.isDev = isDev;
|
|
12697
|
-
|
|
12265
|
+
import_electron6.ipcMain.handle(BROWSER_IPC.contextAction, this.handleAction);
|
|
12698
12266
|
}
|
|
12699
12267
|
isDev;
|
|
12700
12268
|
requests = /* @__PURE__ */ new Map();
|
|
12701
12269
|
show(site, params) {
|
|
12702
12270
|
if (site.contents.id !== site.rootGuestId) {
|
|
12703
|
-
const menu =
|
|
12271
|
+
const menu = import_electron6.Menu.buildFromTemplate([
|
|
12704
12272
|
...params.isEditable ? [
|
|
12705
12273
|
{ role: "cut" },
|
|
12706
12274
|
{ role: "copy" },
|
|
@@ -12709,18 +12277,18 @@ var BrowserContextMenuController = class {
|
|
|
12709
12277
|
] : [],
|
|
12710
12278
|
{ role: "selectAll" }
|
|
12711
12279
|
]);
|
|
12712
|
-
const owner =
|
|
12280
|
+
const owner = import_electron6.BrowserWindow.fromWebContents(site.contents);
|
|
12713
12281
|
menu.popup(owner ? { window: owner } : {});
|
|
12714
12282
|
return;
|
|
12715
12283
|
}
|
|
12716
|
-
const requestId =
|
|
12284
|
+
const requestId = import_node_crypto2.default.randomUUID();
|
|
12717
12285
|
this.requests.clear();
|
|
12718
12286
|
this.requests.set(requestId, { site, params });
|
|
12719
12287
|
send(site.embedder, BROWSER_IPC.contextMenu, payload(requestId, site, params));
|
|
12720
12288
|
}
|
|
12721
12289
|
dispose() {
|
|
12722
12290
|
this.requests.clear();
|
|
12723
|
-
|
|
12291
|
+
import_electron6.ipcMain.removeHandler(BROWSER_IPC.contextAction);
|
|
12724
12292
|
}
|
|
12725
12293
|
handleAction = async (event, request) => {
|
|
12726
12294
|
const context = request ? this.requests.get(request.requestId) : null;
|
|
@@ -12751,19 +12319,19 @@ var BrowserContextMenuController = class {
|
|
|
12751
12319
|
contents.selectAll();
|
|
12752
12320
|
break;
|
|
12753
12321
|
case "copy-link":
|
|
12754
|
-
if (params.linkURL)
|
|
12322
|
+
if (params.linkURL) import_electron6.clipboard.writeText(params.linkURL);
|
|
12755
12323
|
break;
|
|
12756
12324
|
case "copy-image":
|
|
12757
12325
|
if (params.hasImageContents) contents.copyImageAt(params.x, params.y);
|
|
12758
12326
|
break;
|
|
12759
12327
|
case "copy-image-address":
|
|
12760
|
-
if (params.srcURL)
|
|
12328
|
+
if (params.srcURL) import_electron6.clipboard.writeText(params.srcURL);
|
|
12761
12329
|
break;
|
|
12762
12330
|
case "open-link-new-tab":
|
|
12763
12331
|
if (isAllowedWebUrl(params.linkURL)) this.openTab(site, params.linkURL);
|
|
12764
12332
|
break;
|
|
12765
12333
|
case "open-link-external":
|
|
12766
|
-
if (isAllowedWebUrl(params.linkURL)) await
|
|
12334
|
+
if (isAllowedWebUrl(params.linkURL)) await import_electron6.shell.openExternal(params.linkURL);
|
|
12767
12335
|
break;
|
|
12768
12336
|
case "save-link":
|
|
12769
12337
|
if (isAllowedWebUrl(params.linkURL)) contents.downloadURL(params.linkURL);
|
|
@@ -12818,17 +12386,17 @@ function payload(requestId, site, params) {
|
|
|
12818
12386
|
};
|
|
12819
12387
|
}
|
|
12820
12388
|
|
|
12821
|
-
// src/
|
|
12822
|
-
var
|
|
12823
|
-
var
|
|
12824
|
-
var
|
|
12389
|
+
// src/electron/shell/downloads.ts
|
|
12390
|
+
var import_node_crypto3 = __toESM(require("node:crypto"), 1);
|
|
12391
|
+
var import_node_fs3 = __toESM(require("node:fs"), 1);
|
|
12392
|
+
var import_electron7 = require("electron");
|
|
12825
12393
|
var UPDATE_INTERVAL_MS = 100;
|
|
12826
12394
|
var BrowserDownloadController = class {
|
|
12827
|
-
constructor(
|
|
12828
|
-
this.browserSession =
|
|
12395
|
+
constructor(browserSession, sites) {
|
|
12396
|
+
this.browserSession = browserSession;
|
|
12829
12397
|
this.sites = sites;
|
|
12830
|
-
|
|
12831
|
-
|
|
12398
|
+
browserSession.on("will-download", this.started);
|
|
12399
|
+
import_electron7.ipcMain.handle(BROWSER_IPC.downloadAction, this.handleAction);
|
|
12832
12400
|
}
|
|
12833
12401
|
browserSession;
|
|
12834
12402
|
sites;
|
|
@@ -12836,13 +12404,13 @@ var BrowserDownloadController = class {
|
|
|
12836
12404
|
dispose() {
|
|
12837
12405
|
this.downloads.clear();
|
|
12838
12406
|
this.browserSession.off("will-download", this.started);
|
|
12839
|
-
|
|
12407
|
+
import_electron7.ipcMain.removeHandler(BROWSER_IPC.downloadAction);
|
|
12840
12408
|
}
|
|
12841
12409
|
started = (_event, item, contents) => {
|
|
12842
12410
|
const site = this.sites.get(contents.id);
|
|
12843
12411
|
if (!site) return;
|
|
12844
|
-
const id =
|
|
12845
|
-
const savePath = nextAvailableDownloadPath(
|
|
12412
|
+
const id = import_node_crypto3.default.randomUUID();
|
|
12413
|
+
const savePath = nextAvailableDownloadPath(import_electron7.app.getPath("downloads"), item.getFilename(), import_node_fs3.default.existsSync);
|
|
12846
12414
|
item.setSavePath(savePath);
|
|
12847
12415
|
const payload2 = {
|
|
12848
12416
|
id,
|
|
@@ -12894,12 +12462,12 @@ var BrowserDownloadController = class {
|
|
|
12894
12462
|
break;
|
|
12895
12463
|
case "open": {
|
|
12896
12464
|
if (record.payload.state !== "completed") return false;
|
|
12897
|
-
const error2 = await
|
|
12465
|
+
const error2 = await import_electron7.shell.openPath(record.payload.savePath);
|
|
12898
12466
|
if (error2) throw new Error(error2);
|
|
12899
12467
|
break;
|
|
12900
12468
|
}
|
|
12901
12469
|
case "show":
|
|
12902
|
-
|
|
12470
|
+
import_electron7.shell.showItemInFolder(record.payload.savePath);
|
|
12903
12471
|
break;
|
|
12904
12472
|
case "remove":
|
|
12905
12473
|
this.downloads.delete(request.id);
|
|
@@ -12918,18 +12486,18 @@ function percentComplete(item) {
|
|
|
12918
12486
|
return total <= 0 ? null : Math.max(0, Math.min(100, Math.round(item.getReceivedBytes() / total * 100)));
|
|
12919
12487
|
}
|
|
12920
12488
|
|
|
12921
|
-
// src/
|
|
12922
|
-
var
|
|
12923
|
-
var
|
|
12489
|
+
// src/electron/shell/permissions.ts
|
|
12490
|
+
var import_node_crypto4 = __toESM(require("node:crypto"), 1);
|
|
12491
|
+
var import_electron8 = require("electron");
|
|
12924
12492
|
var PERMISSION_TIMEOUT_MS = 3e4;
|
|
12925
12493
|
var BrowserPermissionController = class {
|
|
12926
|
-
constructor(
|
|
12927
|
-
this.browserSession =
|
|
12494
|
+
constructor(browserSession, sites, isTrustedAppUrl) {
|
|
12495
|
+
this.browserSession = browserSession;
|
|
12928
12496
|
this.sites = sites;
|
|
12929
12497
|
this.isTrustedAppUrl = isTrustedAppUrl;
|
|
12930
|
-
|
|
12931
|
-
|
|
12932
|
-
|
|
12498
|
+
browserSession.setPermissionCheckHandler(this.check);
|
|
12499
|
+
browserSession.setPermissionRequestHandler(this.request);
|
|
12500
|
+
import_electron8.ipcMain.on(BROWSER_IPC.permissionResponse, this.respond);
|
|
12933
12501
|
}
|
|
12934
12502
|
browserSession;
|
|
12935
12503
|
sites;
|
|
@@ -12944,19 +12512,19 @@ var BrowserPermissionController = class {
|
|
|
12944
12512
|
this.pending.clear();
|
|
12945
12513
|
this.browserSession.setPermissionCheckHandler(null);
|
|
12946
12514
|
this.browserSession.setPermissionRequestHandler(null);
|
|
12947
|
-
|
|
12515
|
+
import_electron8.ipcMain.off(BROWSER_IPC.permissionResponse, this.respond);
|
|
12948
12516
|
}
|
|
12949
12517
|
check = (contents, permission, requestingOrigin, details) => {
|
|
12950
12518
|
const requestingUrl = details.requestingUrl || requestingOrigin;
|
|
12951
12519
|
const site = this.findSite(contents, requestingUrl);
|
|
12952
|
-
const origin =
|
|
12520
|
+
const origin = permissionOrigin(requestingUrl, site?.contents.getURL() || "");
|
|
12953
12521
|
if (site && origin) return this.decisions.get(permissionKey(origin, permission)) === true;
|
|
12954
12522
|
return Boolean(origin && this.isTrustedAppUrl(origin) && (!contents || this.isTrustedAppUrl(contents.getURL())));
|
|
12955
12523
|
};
|
|
12956
12524
|
request = (contents, permission, callback, details) => {
|
|
12957
12525
|
const requestingUrl = details.requestingUrl || contents.getURL();
|
|
12958
12526
|
const site = this.findSite(contents, requestingUrl);
|
|
12959
|
-
const origin =
|
|
12527
|
+
const origin = permissionOrigin(requestingUrl, site?.contents.getURL() || "");
|
|
12960
12528
|
if (!site && origin && this.isTrustedAppUrl(origin) && this.isTrustedAppUrl(contents.getURL())) {
|
|
12961
12529
|
callback(true);
|
|
12962
12530
|
return;
|
|
@@ -12976,7 +12544,7 @@ var BrowserPermissionController = class {
|
|
|
12976
12544
|
inFlight.callbacks.push(callback);
|
|
12977
12545
|
return;
|
|
12978
12546
|
}
|
|
12979
|
-
const requestId =
|
|
12547
|
+
const requestId = import_node_crypto4.default.randomUUID();
|
|
12980
12548
|
const timer = setTimeout(() => this.finish(requestId, false, false), PERMISSION_TIMEOUT_MS);
|
|
12981
12549
|
this.pending.set(requestId, {
|
|
12982
12550
|
embedderId: site.embedder.id,
|
|
@@ -13009,9 +12577,9 @@ var BrowserPermissionController = class {
|
|
|
13009
12577
|
if (!contents) return null;
|
|
13010
12578
|
const direct = this.sites.get(contents.id);
|
|
13011
12579
|
if (direct) return direct;
|
|
13012
|
-
const origin =
|
|
12580
|
+
const origin = permissionOrigin(requestingUrl, "");
|
|
13013
12581
|
if (!origin) return null;
|
|
13014
|
-
return [...this.sites.values()].find((site) => site.embedder.id === contents.id &&
|
|
12582
|
+
return [...this.sites.values()].find((site) => site.embedder.id === contents.id && permissionOrigin(site.contents.getURL(), "") === origin) ?? null;
|
|
13015
12583
|
}
|
|
13016
12584
|
};
|
|
13017
12585
|
function mediaTypes(details) {
|
|
@@ -13023,15 +12591,14 @@ function permissionKey(origin, permission) {
|
|
|
13023
12591
|
${permission}`;
|
|
13024
12592
|
}
|
|
13025
12593
|
|
|
13026
|
-
// src/
|
|
13027
|
-
var
|
|
12594
|
+
// src/electron/shell/sites.ts
|
|
12595
|
+
var import_electron9 = require("electron");
|
|
13028
12596
|
var BrowserSiteManager = class {
|
|
13029
12597
|
constructor(options) {
|
|
13030
12598
|
this.options = options;
|
|
13031
12599
|
}
|
|
13032
12600
|
options;
|
|
13033
12601
|
sites = /* @__PURE__ */ new Map();
|
|
13034
|
-
automationEmbedders = /* @__PURE__ */ new Map();
|
|
13035
12602
|
get(webContentsId) {
|
|
13036
12603
|
return this.sites.get(webContentsId);
|
|
13037
12604
|
}
|
|
@@ -13043,19 +12610,11 @@ var BrowserSiteManager = class {
|
|
|
13043
12610
|
}
|
|
13044
12611
|
configure(site) {
|
|
13045
12612
|
this.sites.set(site.contents.id, site);
|
|
13046
|
-
try {
|
|
13047
|
-
site.contents.setBackgroundThrottling(!site.isAutomation);
|
|
13048
|
-
} catch {
|
|
13049
|
-
}
|
|
13050
|
-
if (site.isAutomation) {
|
|
13051
|
-
site.isAutomation = false;
|
|
13052
|
-
this.updateAutomation(site, true);
|
|
13053
|
-
}
|
|
13054
12613
|
this.configurePopups(site);
|
|
13055
12614
|
site.contents.on("will-navigate", (event, url) => {
|
|
13056
12615
|
if (isAllowedWebUrl(url)) return;
|
|
13057
12616
|
event.preventDefault();
|
|
13058
|
-
if (isAllowedExternalUrl(url)) void
|
|
12617
|
+
if (isAllowedExternalUrl(url)) void import_electron9.shell.openExternal(url);
|
|
13059
12618
|
});
|
|
13060
12619
|
site.contents.on("did-navigate", () => {
|
|
13061
12620
|
if (site.contents.id === site.rootGuestId) {
|
|
@@ -13077,25 +12636,8 @@ var BrowserSiteManager = class {
|
|
|
13077
12636
|
});
|
|
13078
12637
|
site.contents.once("destroyed", () => this.remove(site));
|
|
13079
12638
|
}
|
|
13080
|
-
updateAutomation(site, isAutomation) {
|
|
13081
|
-
if (site.isAutomation === isAutomation) return;
|
|
13082
|
-
site.isAutomation = isAutomation;
|
|
13083
|
-
try {
|
|
13084
|
-
site.contents.setBackgroundThrottling(!isAutomation);
|
|
13085
|
-
} catch {
|
|
13086
|
-
}
|
|
13087
|
-
const current = this.automationEmbedders.get(site.embedder.id) ?? 0;
|
|
13088
|
-
const next = Math.max(0, current + (isAutomation ? 1 : -1));
|
|
13089
|
-
if (next > 0) this.automationEmbedders.set(site.embedder.id, next);
|
|
13090
|
-
else this.automationEmbedders.delete(site.embedder.id);
|
|
13091
|
-
try {
|
|
13092
|
-
site.embedder.setBackgroundThrottling(next === 0);
|
|
13093
|
-
} catch {
|
|
13094
|
-
}
|
|
13095
|
-
}
|
|
13096
12639
|
dispose() {
|
|
13097
12640
|
this.sites.clear();
|
|
13098
|
-
this.automationEmbedders.clear();
|
|
13099
12641
|
}
|
|
13100
12642
|
configurePopups(site) {
|
|
13101
12643
|
site.contents.setWindowOpenHandler((details) => {
|
|
@@ -13105,7 +12647,7 @@ var BrowserSiteManager = class {
|
|
|
13105
12647
|
return { action: "deny" };
|
|
13106
12648
|
}
|
|
13107
12649
|
if (isAllowedExternalUrl(url)) {
|
|
13108
|
-
void
|
|
12650
|
+
void import_electron9.shell.openExternal(url);
|
|
13109
12651
|
return { action: "deny" };
|
|
13110
12652
|
}
|
|
13111
12653
|
if (!isAllowedWebUrl(url)) return { action: "deny" };
|
|
@@ -13122,28 +12664,348 @@ var BrowserSiteManager = class {
|
|
|
13122
12664
|
contents: window2.webContents,
|
|
13123
12665
|
embedder: site.embedder,
|
|
13124
12666
|
rootGuestId: site.rootGuestId,
|
|
13125
|
-
tabId: site.tabId
|
|
13126
|
-
isAutomation: false
|
|
12667
|
+
tabId: site.tabId
|
|
13127
12668
|
}));
|
|
13128
12669
|
}
|
|
13129
12670
|
remove(site) {
|
|
13130
12671
|
this.sites.delete(site.contents.id);
|
|
13131
|
-
if (site.isAutomation) this.updateAutomation(site, false);
|
|
13132
12672
|
if (site.contents.id === site.rootGuestId) this.options.adBlocker.forgetGuest(site.rootGuestId);
|
|
13133
12673
|
}
|
|
13134
12674
|
};
|
|
13135
|
-
function shellSite(contents, embedder, tabId
|
|
13136
|
-
return { contents, embedder, rootGuestId: contents.id, tabId
|
|
12675
|
+
function shellSite(contents, embedder, tabId) {
|
|
12676
|
+
return { contents, embedder, rootGuestId: contents.id, tabId };
|
|
12677
|
+
}
|
|
12678
|
+
|
|
12679
|
+
// node_modules/@amalgm/core/dist/transport/auth.js
|
|
12680
|
+
var utf8 = new TextEncoder();
|
|
12681
|
+
var RUNTIME_TOKEN_HEADER = "x-amalgm-runtime-token";
|
|
12682
|
+
var LOOPBACK_ORIGIN_HOSTNAMES = ["localhost", "127.0.0.1", "[::1]", "::1"];
|
|
12683
|
+
var RUNTIME_CORS_ALLOWED_HEADERS = [
|
|
12684
|
+
"Content-Type",
|
|
12685
|
+
"Authorization",
|
|
12686
|
+
"Accept",
|
|
12687
|
+
"Cache-Control",
|
|
12688
|
+
"Last-Event-ID",
|
|
12689
|
+
"Mcp-Session-Id",
|
|
12690
|
+
"X-Amalgm-Session-Id",
|
|
12691
|
+
RUNTIME_TOKEN_HEADER
|
|
12692
|
+
].join(", ");
|
|
12693
|
+
|
|
12694
|
+
// node_modules/@amalgm/core/dist/transport/state/api.js
|
|
12695
|
+
var encoder = new TextEncoder();
|
|
12696
|
+
|
|
12697
|
+
// node_modules/@amalgm/core/dist/transport/diagnostics.js
|
|
12698
|
+
var DEFAULT_DIAGNOSTIC_LOG_TAIL_BYTES = 256 * 1024;
|
|
12699
|
+
var MAX_DIAGNOSTIC_LOG_TAIL_BYTES = 2 * 1024 * 1024;
|
|
12700
|
+
|
|
12701
|
+
// src/cookies/policy.ts
|
|
12702
|
+
var PROTECTED_HOSTS = [
|
|
12703
|
+
"amalgm.ai",
|
|
12704
|
+
"supabase.co",
|
|
12705
|
+
"supabase.io",
|
|
12706
|
+
"supabase.in",
|
|
12707
|
+
...LOOPBACK_ORIGIN_HOSTNAMES
|
|
12708
|
+
];
|
|
12709
|
+
function normalizeCookieDomain(value) {
|
|
12710
|
+
return value.trim().replace(/^\./, "").toLowerCase();
|
|
12711
|
+
}
|
|
12712
|
+
function cookieHostIsProtected(value, excluded = []) {
|
|
12713
|
+
const host = normalizeCookieDomain(value);
|
|
12714
|
+
return [...PROTECTED_HOSTS, ...excluded.map(normalizeCookieDomain)].some((candidate) => host === candidate || host.endsWith(`.${candidate}`));
|
|
12715
|
+
}
|
|
12716
|
+
function normalizePartition(partition) {
|
|
12717
|
+
if (!partition?.topLevelSite) return void 0;
|
|
12718
|
+
try {
|
|
12719
|
+
const url = new URL(partition.topLevelSite);
|
|
12720
|
+
if (!["http:", "https:"].includes(url.protocol)) return void 0;
|
|
12721
|
+
const site = url.origin;
|
|
12722
|
+
return { topLevelSite: site, ...partition.hasCrossSiteAncestor === void 0 ? {} : { hasCrossSiteAncestor: partition.hasCrossSiteAncestor } };
|
|
12723
|
+
} catch {
|
|
12724
|
+
return void 0;
|
|
12725
|
+
}
|
|
12726
|
+
}
|
|
12727
|
+
function normalizeCookie(cookie, excluded = []) {
|
|
12728
|
+
const name = String(cookie.name || "").slice(0, 512);
|
|
12729
|
+
const host = normalizeCookieDomain(cookie.domain || "");
|
|
12730
|
+
const domain = cookie.domain?.trim().startsWith(".") ? `.${host}` : host;
|
|
12731
|
+
const path6 = cookie.path?.startsWith("/") ? cookie.path : "/";
|
|
12732
|
+
if (!name || !host || cookieHostIsProtected(host, excluded)) return null;
|
|
12733
|
+
const partitionKey = normalizePartition(cookie.partitionKey);
|
|
12734
|
+
if (cookie.partitionKey && !partitionKey) return null;
|
|
12735
|
+
return {
|
|
12736
|
+
name,
|
|
12737
|
+
value: String(cookie.value || ""),
|
|
12738
|
+
domain,
|
|
12739
|
+
path: path6,
|
|
12740
|
+
...Number.isFinite(cookie.expires) ? { expires: cookie.expires } : {},
|
|
12741
|
+
...cookie.httpOnly === void 0 ? {} : { httpOnly: cookie.httpOnly },
|
|
12742
|
+
...cookie.secure === void 0 ? {} : { secure: cookie.secure },
|
|
12743
|
+
...cookie.sameSite ? { sameSite: cookie.sameSite } : {},
|
|
12744
|
+
...partitionKey ? { partitionKey } : {}
|
|
12745
|
+
};
|
|
12746
|
+
}
|
|
12747
|
+
function cookieKey(cookie) {
|
|
12748
|
+
const partition = normalizePartition(cookie.partitionKey);
|
|
12749
|
+
return JSON.stringify([
|
|
12750
|
+
cookie.domain.trim().toLowerCase(),
|
|
12751
|
+
cookie.path || "/",
|
|
12752
|
+
cookie.name,
|
|
12753
|
+
partition?.topLevelSite || "",
|
|
12754
|
+
partition?.hasCrossSiteAncestor ?? null
|
|
12755
|
+
]);
|
|
12756
|
+
}
|
|
12757
|
+
|
|
12758
|
+
// src/cookies/diff.ts
|
|
12759
|
+
function diffCookies(before, after) {
|
|
12760
|
+
const left = new Map(before.map((cookie) => [cookieKey(cookie), cookie]));
|
|
12761
|
+
const right = new Map(after.map((cookie) => [cookieKey(cookie), cookie]));
|
|
12762
|
+
const upserts = [...right].filter(([key, value]) => !sameCookie(value, left.get(key))).map(([, value]) => value);
|
|
12763
|
+
const deletes = [...left].filter(([key]) => !right.has(key)).map(([, value]) => ({
|
|
12764
|
+
name: value.name,
|
|
12765
|
+
domain: value.domain,
|
|
12766
|
+
path: value.path,
|
|
12767
|
+
...value.partitionKey ? { partitionKey: value.partitionKey } : {}
|
|
12768
|
+
}));
|
|
12769
|
+
return { upserts, deletes };
|
|
12770
|
+
}
|
|
12771
|
+
function sameCookie(left, right) {
|
|
12772
|
+
return left === right || !!left && !!right && left.value === right.value && left.expires === right.expires && Boolean(left.httpOnly) === Boolean(right.httpOnly) && Boolean(left.secure) === Boolean(right.secure) && (left.sameSite || "Lax") === (right.sameSite || "Lax");
|
|
12773
|
+
}
|
|
12774
|
+
|
|
12775
|
+
// src/cookies/coordinator.ts
|
|
12776
|
+
var BrowserCookieCoordinator = class {
|
|
12777
|
+
constructor(store) {
|
|
12778
|
+
this.store = store;
|
|
12779
|
+
}
|
|
12780
|
+
store;
|
|
12781
|
+
connections = /* @__PURE__ */ new Map();
|
|
12782
|
+
unsubscribeStore;
|
|
12783
|
+
register(adapter) {
|
|
12784
|
+
if (this.connections.has(adapter.id)) throw new Error(`Cookie adapter ${adapter.id} is already registered.`);
|
|
12785
|
+
const connection = {
|
|
12786
|
+
adapter,
|
|
12787
|
+
current: /* @__PURE__ */ new Map(),
|
|
12788
|
+
expected: /* @__PURE__ */ new Map(),
|
|
12789
|
+
pending: /* @__PURE__ */ new Map(),
|
|
12790
|
+
unsubscribe: () => {
|
|
12791
|
+
},
|
|
12792
|
+
initialized: false,
|
|
12793
|
+
dirty: false,
|
|
12794
|
+
closed: false,
|
|
12795
|
+
excludedHosts: this.store.excludedHosts || []
|
|
12796
|
+
};
|
|
12797
|
+
this.connections.set(adapter.id, connection);
|
|
12798
|
+
connection.unsubscribe = adapter.subscribe((change) => {
|
|
12799
|
+
if (connection.closed) return;
|
|
12800
|
+
if (!change) connection.initialized = false;
|
|
12801
|
+
else {
|
|
12802
|
+
const cookie = this.portable(connection, change.cookie);
|
|
12803
|
+
if (!cookie) return;
|
|
12804
|
+
const key = cookieKey(cookie);
|
|
12805
|
+
const value = change.removed ? void 0 : cookie;
|
|
12806
|
+
if (value) connection.current.set(key, value);
|
|
12807
|
+
else connection.current.delete(key);
|
|
12808
|
+
if (connection.expected.has(key) && sameCookie(value, connection.expected.get(key))) {
|
|
12809
|
+
connection.expected.delete(key);
|
|
12810
|
+
return;
|
|
12811
|
+
}
|
|
12812
|
+
connection.pending.set(key, { cookie, removed: change.removed });
|
|
12813
|
+
}
|
|
12814
|
+
this.wake(connection);
|
|
12815
|
+
});
|
|
12816
|
+
this.unsubscribeStore ||= this.store.subscribe?.(() => {
|
|
12817
|
+
for (const entry of this.connections.values()) this.wake(entry);
|
|
12818
|
+
});
|
|
12819
|
+
}
|
|
12820
|
+
sync(adapterId) {
|
|
12821
|
+
const connection = this.connections.get(adapterId);
|
|
12822
|
+
if (!connection || connection.closed) return Promise.resolve();
|
|
12823
|
+
connection.dirty = true;
|
|
12824
|
+
return this.flush(connection);
|
|
12825
|
+
}
|
|
12826
|
+
unregister(adapterId) {
|
|
12827
|
+
const connection = this.connections.get(adapterId);
|
|
12828
|
+
if (!connection) return;
|
|
12829
|
+
connection.closed = true;
|
|
12830
|
+
connection.unsubscribe();
|
|
12831
|
+
this.connections.delete(adapterId);
|
|
12832
|
+
if (!this.connections.size) {
|
|
12833
|
+
this.unsubscribeStore?.();
|
|
12834
|
+
this.unsubscribeStore = void 0;
|
|
12835
|
+
}
|
|
12836
|
+
}
|
|
12837
|
+
async close(adapterId) {
|
|
12838
|
+
try {
|
|
12839
|
+
await this.sync(adapterId);
|
|
12840
|
+
} finally {
|
|
12841
|
+
this.unregister(adapterId);
|
|
12842
|
+
}
|
|
12843
|
+
}
|
|
12844
|
+
wake(connection) {
|
|
12845
|
+
connection.dirty = true;
|
|
12846
|
+
if (!connection.running) void this.flush(connection).catch(() => void 0);
|
|
12847
|
+
}
|
|
12848
|
+
flush(connection) {
|
|
12849
|
+
if (connection.running) return connection.running;
|
|
12850
|
+
connection.running = Promise.resolve().then(() => this.drain(connection)).finally(() => {
|
|
12851
|
+
delete connection.running;
|
|
12852
|
+
if (connection.dirty && !connection.closed) this.wake(connection);
|
|
12853
|
+
});
|
|
12854
|
+
return connection.running;
|
|
12855
|
+
}
|
|
12856
|
+
async drain(connection) {
|
|
12857
|
+
while (connection.dirty && !connection.closed) {
|
|
12858
|
+
connection.dirty = false;
|
|
12859
|
+
if (!connection.initialized) await this.initialize(connection);
|
|
12860
|
+
if (!connection.initialized || connection.closed) return;
|
|
12861
|
+
const pending = connection.pending;
|
|
12862
|
+
connection.pending = /* @__PURE__ */ new Map();
|
|
12863
|
+
if (pending.size) {
|
|
12864
|
+
try {
|
|
12865
|
+
await this.store.merge({
|
|
12866
|
+
sourceId: connection.adapter.id,
|
|
12867
|
+
upserts: [...pending.values()].filter((change) => !change.removed).map((change) => change.cookie),
|
|
12868
|
+
deletes: [...pending.values()].filter((change) => change.removed).map((change) => change.cookie)
|
|
12869
|
+
});
|
|
12870
|
+
} catch (error2) {
|
|
12871
|
+
for (const [key, change] of pending) if (!connection.pending.has(key)) connection.pending.set(key, change);
|
|
12872
|
+
throw error2;
|
|
12873
|
+
}
|
|
12874
|
+
}
|
|
12875
|
+
const delta = await this.store.changes(connection.version);
|
|
12876
|
+
if (!delta.healthy || connection.closed) return;
|
|
12877
|
+
if (delta.reset) {
|
|
12878
|
+
connection.initialized = false;
|
|
12879
|
+
connection.dirty = true;
|
|
12880
|
+
continue;
|
|
12881
|
+
}
|
|
12882
|
+
await this.apply(connection, delta);
|
|
12883
|
+
connection.version = delta.versionToken;
|
|
12884
|
+
}
|
|
12885
|
+
}
|
|
12886
|
+
async initialize(connection) {
|
|
12887
|
+
const state = await this.store.materialize();
|
|
12888
|
+
if (!state.healthy || connection.closed) return;
|
|
12889
|
+
connection.excludedHosts = this.store.excludedHosts || state.excludedHosts || [];
|
|
12890
|
+
const local = (await connection.adapter.read()).flatMap((cookie) => this.portable(connection, cookie) || []);
|
|
12891
|
+
if (connection.closed) return;
|
|
12892
|
+
const previous = connection.current;
|
|
12893
|
+
connection.current = new Map(local.map((cookie) => [cookieKey(cookie), cookie]));
|
|
12894
|
+
const known = /* @__PURE__ */ new Set([...state.cookies.map(cookieKey), ...state.tombstones.map(({ key }) => key)]);
|
|
12895
|
+
const changes = connection.version === void 0 ? { upserts: local.filter((cookie) => !known.has(cookieKey(cookie))), deletes: [] } : diffCookies([...previous.values()], local);
|
|
12896
|
+
changes.upserts = changes.upserts.filter((cookie) => !sameCookie(cookie, connection.expected.get(cookieKey(cookie))));
|
|
12897
|
+
changes.deletes = changes.deletes.filter((cookie) => !connection.expected.has(cookieKey(cookie)) || connection.expected.get(cookieKey(cookie)) !== void 0);
|
|
12898
|
+
connection.expected.clear();
|
|
12899
|
+
if (changes.upserts.length || changes.deletes.length) await this.store.merge({ sourceId: connection.adapter.id, ...changes });
|
|
12900
|
+
const changed = new Set([...changes.upserts, ...changes.deletes].map(cookieKey));
|
|
12901
|
+
const target = [...state.cookies.filter((cookie) => !changed.has(cookieKey(cookie))), ...changes.upserts].flatMap((cookie) => this.portable(connection, cookie) || []);
|
|
12902
|
+
await this.apply(connection, { ...diffCookies(local, target), versionToken: state.versionToken });
|
|
12903
|
+
connection.version = state.versionToken;
|
|
12904
|
+
connection.initialized = true;
|
|
12905
|
+
}
|
|
12906
|
+
async apply(connection, delta) {
|
|
12907
|
+
const upserts = delta.upserts.flatMap((cookie) => this.portable(connection, cookie) || []).filter((cookie) => !sameCookie(cookie, connection.current.get(cookieKey(cookie))));
|
|
12908
|
+
const deletes = delta.deletes.filter((cookie) => this.portable(connection, { ...cookie, value: "" }) && connection.current.has(cookieKey(cookie)));
|
|
12909
|
+
if (!upserts.length && !deletes.length || connection.closed) return;
|
|
12910
|
+
for (const cookie of upserts) connection.expected.set(cookieKey(cookie), cookie);
|
|
12911
|
+
for (const cookie of deletes) connection.expected.set(cookieKey(cookie), void 0);
|
|
12912
|
+
await connection.adapter.apply({ upserts, deletes, versionToken: delta.versionToken });
|
|
12913
|
+
for (const cookie of upserts) if (!connection.pending.has(cookieKey(cookie))) connection.current.set(cookieKey(cookie), cookie);
|
|
12914
|
+
for (const cookie of deletes) if (!connection.pending.has(cookieKey(cookie))) connection.current.delete(cookieKey(cookie));
|
|
12915
|
+
}
|
|
12916
|
+
portable(connection, cookie) {
|
|
12917
|
+
if (cookie.partitionKey && !connection.adapter.supportsPartitionedCookies) return null;
|
|
12918
|
+
return normalizeCookie(cookie, connection.excludedHosts);
|
|
12919
|
+
}
|
|
12920
|
+
};
|
|
12921
|
+
|
|
12922
|
+
// src/electron/cookie-adapter.ts
|
|
12923
|
+
var ELECTRON_COOKIE_ADAPTER_ID = "electron:account";
|
|
12924
|
+
var ElectronCookieAdapter = class {
|
|
12925
|
+
constructor(cookies) {
|
|
12926
|
+
this.cookies = cookies;
|
|
12927
|
+
}
|
|
12928
|
+
cookies;
|
|
12929
|
+
id = ELECTRON_COOKIE_ADAPTER_ID;
|
|
12930
|
+
supportsPartitionedCookies = false;
|
|
12931
|
+
async read() {
|
|
12932
|
+
return (await this.cookies.get({})).map(fromElectron);
|
|
12933
|
+
}
|
|
12934
|
+
async apply(input) {
|
|
12935
|
+
input.signal?.throwIfAborted();
|
|
12936
|
+
for (const cookie of input.upserts) {
|
|
12937
|
+
input.signal?.throwIfAborted();
|
|
12938
|
+
if (!cookie.partitionKey) await this.cookies.set(toElectron(cookie));
|
|
12939
|
+
}
|
|
12940
|
+
for (const cookie of input.deletes || []) {
|
|
12941
|
+
input.signal?.throwIfAborted();
|
|
12942
|
+
if (cookie.partitionKey) continue;
|
|
12943
|
+
await this.cookies.set(toElectron({ ...cookie, value: "", secure: true, expires: 0 }));
|
|
12944
|
+
}
|
|
12945
|
+
}
|
|
12946
|
+
subscribe(changed) {
|
|
12947
|
+
const listener = (_event, cookie, cause, removed) => {
|
|
12948
|
+
if (removed && cause === "overwrite") return;
|
|
12949
|
+
changed({ cookie: fromElectron(cookie), removed });
|
|
12950
|
+
};
|
|
12951
|
+
this.cookies.on("changed", listener);
|
|
12952
|
+
return () => this.cookies.off("changed", listener);
|
|
12953
|
+
}
|
|
12954
|
+
};
|
|
12955
|
+
function fromElectron(cookie) {
|
|
12956
|
+
return {
|
|
12957
|
+
name: cookie.name,
|
|
12958
|
+
value: cookie.value,
|
|
12959
|
+
domain: cookie.domain || "",
|
|
12960
|
+
path: cookie.path || "/",
|
|
12961
|
+
...typeof cookie.expirationDate === "number" && cookie.expirationDate >= 0 ? { expires: cookie.expirationDate } : {},
|
|
12962
|
+
httpOnly: Boolean(cookie.httpOnly),
|
|
12963
|
+
secure: Boolean(cookie.secure),
|
|
12964
|
+
sameSite: cookie.sameSite === "strict" ? "Strict" : cookie.sameSite === "no_restriction" ? "None" : "Lax"
|
|
12965
|
+
};
|
|
12966
|
+
}
|
|
12967
|
+
function toElectron(cookie) {
|
|
12968
|
+
const hostOnly = !cookie.domain.startsWith(".");
|
|
12969
|
+
return {
|
|
12970
|
+
url: cookieUrl(cookie.domain, cookie.path, Boolean(cookie.secure) || cookie.sameSite === "None"),
|
|
12971
|
+
name: cookie.name,
|
|
12972
|
+
value: cookie.value,
|
|
12973
|
+
path: cookie.path || "/",
|
|
12974
|
+
secure: Boolean(cookie.secure),
|
|
12975
|
+
httpOnly: Boolean(cookie.httpOnly),
|
|
12976
|
+
sameSite: cookie.sameSite === "Strict" ? "strict" : cookie.sameSite === "None" ? "no_restriction" : "lax",
|
|
12977
|
+
...!hostOnly ? { domain: cookie.domain } : {},
|
|
12978
|
+
...typeof cookie.expires === "number" ? { expirationDate: cookie.expires } : {}
|
|
12979
|
+
};
|
|
12980
|
+
}
|
|
12981
|
+
function cookieUrl(domain, path6, secure) {
|
|
12982
|
+
const host = domain.trim().toLowerCase().replace(/^\.+/, "");
|
|
12983
|
+
const normalizedPath = String(path6 || "/").startsWith("/") ? path6 || "/" : `/${path6}`;
|
|
12984
|
+
return `${secure ? "https" : "http"}://${host}${normalizedPath}`;
|
|
12985
|
+
}
|
|
12986
|
+
|
|
12987
|
+
// src/electron/cookie-sync.ts
|
|
12988
|
+
function syncElectronCookies(cookies, store) {
|
|
12989
|
+
const adapter = new ElectronCookieAdapter(cookies);
|
|
12990
|
+
const coordinator = new BrowserCookieCoordinator(store);
|
|
12991
|
+
coordinator.register(adapter);
|
|
12992
|
+
const sync = () => coordinator.sync(adapter.id);
|
|
12993
|
+
void sync().catch(() => void 0);
|
|
12994
|
+
return { async close() {
|
|
12995
|
+
try {
|
|
12996
|
+
await coordinator.close(adapter.id);
|
|
12997
|
+
} catch {
|
|
12998
|
+
}
|
|
12999
|
+
} };
|
|
13137
13000
|
}
|
|
13138
13001
|
|
|
13139
|
-
// src/
|
|
13140
|
-
var AUTOMATION_MARKER = "amalgm-bsid-";
|
|
13002
|
+
// src/electron/shell.ts
|
|
13141
13003
|
function createBrowserShell(options) {
|
|
13142
13004
|
let sites;
|
|
13143
|
-
const adBlockDirectory =
|
|
13005
|
+
const adBlockDirectory = import_node_path3.default.join(import_electron10.app.getPath("userData"), "browser", "adblock");
|
|
13144
13006
|
const adBlocker = new NativeAdBlocker({
|
|
13145
|
-
cachePath:
|
|
13146
|
-
settingsPath:
|
|
13007
|
+
cachePath: import_node_path3.default.join(adBlockDirectory, "engine.bin"),
|
|
13008
|
+
settingsPath: import_node_path3.default.join(adBlockDirectory, "settings.json"),
|
|
13147
13009
|
resolvePage(webContentsId) {
|
|
13148
13010
|
const site = sites?.get(webContentsId);
|
|
13149
13011
|
if (!site || site.contents.isDestroyed()) return null;
|
|
@@ -13162,262 +13024,167 @@ function createBrowserShell(options) {
|
|
|
13162
13024
|
},
|
|
13163
13025
|
...options.adBlockFetch ? { fetch: options.adBlockFetch } : {}
|
|
13164
13026
|
});
|
|
13165
|
-
const
|
|
13027
|
+
const browserSession = getBrowserSession(options.accountId);
|
|
13028
|
+
const cookieSync = options.cookieStore ? syncElectronCookies(browserSession.cookies, options.cookieStore) : null;
|
|
13166
13029
|
const contextMenus = new BrowserContextMenuController(options.isDev);
|
|
13167
|
-
sites = new BrowserSiteManager({ browserSession
|
|
13168
|
-
const permissions = new BrowserPermissionController(
|
|
13169
|
-
const downloads = new BrowserDownloadController(
|
|
13030
|
+
sites = new BrowserSiteManager({ browserSession, adBlocker, contextMenus });
|
|
13031
|
+
const permissions = new BrowserPermissionController(browserSession, sites, options.isTrustedAppUrl);
|
|
13032
|
+
const downloads = new BrowserDownloadController(browserSession, sites);
|
|
13170
13033
|
const adBlockIpc = new BrowserAdBlockIpc(adBlocker, sites);
|
|
13171
|
-
adBlocker.install(
|
|
13172
|
-
const surfaceController =
|
|
13173
|
-
browserSession
|
|
13034
|
+
adBlocker.install(browserSession);
|
|
13035
|
+
const surfaceController = createBrowserSurfaceController({
|
|
13036
|
+
browserSession,
|
|
13174
13037
|
cosmeticPreloadPath: () => adBlocker.cosmeticPreloadPath(),
|
|
13175
13038
|
isAllowedUrl: isAllowedWebUrl,
|
|
13039
|
+
isTrustedAppUrl: options.isTrustedAppUrl,
|
|
13176
13040
|
onSurfaceCreated(surface) {
|
|
13177
|
-
sites?.configure(shellSite(
|
|
13178
|
-
surface.contents,
|
|
13179
|
-
surface.embedder,
|
|
13180
|
-
surface.tabId,
|
|
13181
|
-
surface.isAutomation
|
|
13182
|
-
));
|
|
13041
|
+
sites?.configure(shellSite(surface.contents, surface.embedder, surface.tabId));
|
|
13183
13042
|
adBlocker.publish(surface.contents.id, surface.contents.id);
|
|
13184
|
-
}
|
|
13185
|
-
|
|
13186
|
-
const site = sites?.get(contents.id);
|
|
13187
|
-
if (site) sites?.updateAutomation(site, isAutomation);
|
|
13188
|
-
}
|
|
13189
|
-
}) : null;
|
|
13190
|
-
const registerGuest = (event, registration) => {
|
|
13191
|
-
if (!registration || !Number.isInteger(registration.guestId)) return;
|
|
13192
|
-
const site = sites?.get(registration.guestId);
|
|
13193
|
-
if (!site || site.embedder.id !== event.sender.id) return;
|
|
13194
|
-
site.tabId = String(registration.tabId || "");
|
|
13195
|
-
sites?.updateAutomation(site, registration.isAutomation === true);
|
|
13196
|
-
adBlocker.publish(site.contents.id, site.rootGuestId);
|
|
13197
|
-
};
|
|
13198
|
-
import_electron11.ipcMain.on(BROWSER_IPC.registerGuest, registerGuest);
|
|
13043
|
+
}
|
|
13044
|
+
});
|
|
13199
13045
|
return {
|
|
13200
|
-
|
|
13201
|
-
|
|
13202
|
-
const preload = adBlocker.cosmeticPreloadPath();
|
|
13203
|
-
if (preload) webPreferences.preload = preload;
|
|
13204
|
-
else delete webPreferences.preload;
|
|
13205
|
-
webPreferences.partition = BROWSER_SESSION_PARTITION;
|
|
13206
|
-
webPreferences.nodeIntegration = false;
|
|
13207
|
-
webPreferences.nodeIntegrationInSubFrames = false;
|
|
13208
|
-
webPreferences.contextIsolation = true;
|
|
13209
|
-
webPreferences.sandbox = true;
|
|
13210
|
-
webPreferences.webSecurity = true;
|
|
13211
|
-
webPreferences.webviewTag = false;
|
|
13212
|
-
webPreferences.allowRunningInsecureContent = false;
|
|
13213
|
-
return true;
|
|
13214
|
-
},
|
|
13215
|
-
attachGuest(embedder, guest) {
|
|
13216
|
-
sites?.configure(shellSite(guest, embedder, null, guest.getURL().includes(AUTOMATION_MARKER)));
|
|
13217
|
-
},
|
|
13218
|
-
sendShortcut(target, command) {
|
|
13219
|
-
if (target && !target.isDestroyed()) send(target, BROWSER_IPC.shortcut, { guestId: null, command });
|
|
13220
|
-
},
|
|
13221
|
-
dispose() {
|
|
13222
|
-
surfaceController?.dispose();
|
|
13223
|
-
import_electron11.ipcMain.off(BROWSER_IPC.registerGuest, registerGuest);
|
|
13046
|
+
async dispose() {
|
|
13047
|
+
surfaceController.dispose();
|
|
13224
13048
|
permissions.dispose();
|
|
13225
13049
|
downloads.dispose();
|
|
13226
13050
|
adBlockIpc.dispose();
|
|
13227
13051
|
contextMenus.dispose();
|
|
13228
13052
|
sites?.dispose();
|
|
13229
13053
|
adBlocker.dispose();
|
|
13054
|
+
await cookieSync?.close();
|
|
13230
13055
|
}
|
|
13231
13056
|
};
|
|
13232
13057
|
}
|
|
13233
13058
|
|
|
13234
|
-
// src/
|
|
13235
|
-
|
|
13236
|
-
|
|
13237
|
-
|
|
13238
|
-
|
|
13239
|
-
|
|
13240
|
-
|
|
13241
|
-
|
|
13242
|
-
|
|
13243
|
-
|
|
13244
|
-
|
|
13245
|
-
: null;
|
|
13246
|
-
if (!proto && !('value' in el)) {
|
|
13247
|
-
throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not fillable');
|
|
13248
|
-
}
|
|
13249
|
-
const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
13250
|
-
if (setter) setter.call(el, text); else el.value = text;
|
|
13251
|
-
}
|
|
13252
|
-
el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertReplacementText' }));
|
|
13253
|
-
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
13254
|
-
return true;
|
|
13255
|
-
})()`;
|
|
13256
|
-
}
|
|
13257
|
-
function insertTextScript(text) {
|
|
13258
|
-
return `(() => {
|
|
13259
|
-
const el = document.activeElement;
|
|
13260
|
-
if (!el || el === document.body || el === document.documentElement) {
|
|
13261
|
-
throw new Error('focus did not land on an editable field');
|
|
13262
|
-
}
|
|
13263
|
-
const text = ${JSON.stringify(String(text))};
|
|
13264
|
-
const inputEvent = (inputType, data = text) => new InputEvent('input', {
|
|
13265
|
-
bubbles: true,
|
|
13266
|
-
data,
|
|
13267
|
-
inputType,
|
|
13268
|
-
});
|
|
13059
|
+
// src/errors.ts
|
|
13060
|
+
var BrowserError = class extends Error {
|
|
13061
|
+
constructor(code, message, details) {
|
|
13062
|
+
super(message);
|
|
13063
|
+
this.code = code;
|
|
13064
|
+
this.details = details;
|
|
13065
|
+
}
|
|
13066
|
+
code;
|
|
13067
|
+
details;
|
|
13068
|
+
name = "BrowserError";
|
|
13069
|
+
};
|
|
13269
13070
|
|
|
13270
|
-
|
|
13271
|
-
|
|
13272
|
-
|
|
13273
|
-
|
|
13274
|
-
|
|
13275
|
-
|
|
13276
|
-
|
|
13277
|
-
|
|
13278
|
-
|
|
13279
|
-
|
|
13280
|
-
|
|
13281
|
-
|
|
13282
|
-
|
|
13071
|
+
// src/cookies/http-store.ts
|
|
13072
|
+
function createHttpCookieStore(options) {
|
|
13073
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
13074
|
+
let watching;
|
|
13075
|
+
let unsubscribeReady;
|
|
13076
|
+
let version;
|
|
13077
|
+
async function request(action, mutation) {
|
|
13078
|
+
start();
|
|
13079
|
+
const response = await options.request(`/cookies/${action}`, {
|
|
13080
|
+
method: mutation ? "POST" : "GET",
|
|
13081
|
+
cache: "no-store",
|
|
13082
|
+
signal: AbortSignal.timeout(5e3),
|
|
13083
|
+
...mutation ? { headers: { "content-type": "application/json" }, body: JSON.stringify(mutation) } : {}
|
|
13084
|
+
});
|
|
13085
|
+
if (!response.ok) throw new BrowserError("PROCESS_FAILED", `Browser cookie adapter is unavailable (${response.status}).`);
|
|
13086
|
+
const result = await response.json();
|
|
13087
|
+
if (result.accountId !== options.accountId || !result.jar) {
|
|
13088
|
+
throw new BrowserError("AUTHORIZATION_DENIED", "The Browser cookie adapter answered for another account.");
|
|
13089
|
+
}
|
|
13090
|
+
return result.jar;
|
|
13091
|
+
}
|
|
13092
|
+
function start() {
|
|
13093
|
+
if (watching || !listeners.size) return;
|
|
13094
|
+
const controller = watching = new AbortController();
|
|
13095
|
+
let live = false;
|
|
13096
|
+
void watch(controller.signal, () => {
|
|
13097
|
+
live = true;
|
|
13098
|
+
}).catch(() => void 0).finally(() => {
|
|
13099
|
+
if (watching !== controller) return;
|
|
13100
|
+
watching = void 0;
|
|
13101
|
+
version = void 0;
|
|
13102
|
+
if (live) start();
|
|
13103
|
+
});
|
|
13104
|
+
}
|
|
13105
|
+
async function watch(lifetime, delivered) {
|
|
13106
|
+
const response = await options.request("/cookies/changes", { method: "GET", cache: "no-store", signal: lifetime });
|
|
13107
|
+
if (!response.ok || !response.body) throw new Error("Cookie notifications unavailable.");
|
|
13108
|
+
const reader = response.body.getReader();
|
|
13109
|
+
const decoder = new TextDecoder();
|
|
13110
|
+
let buffer = "";
|
|
13111
|
+
try {
|
|
13112
|
+
for (; ; ) {
|
|
13113
|
+
const { done, value } = await reader.read();
|
|
13114
|
+
if (done) break;
|
|
13115
|
+
buffer += decoder.decode(value, { stream: true });
|
|
13116
|
+
if (buffer.length > 16e3) throw new Error("Invalid cookie notification.");
|
|
13117
|
+
let end;
|
|
13118
|
+
while ((end = buffer.indexOf("\n")) !== -1) {
|
|
13119
|
+
const line = buffer.slice(0, end);
|
|
13120
|
+
buffer = buffer.slice(end + 1);
|
|
13121
|
+
if (!line.startsWith("data:")) continue;
|
|
13122
|
+
const event = JSON.parse(line.slice(5));
|
|
13123
|
+
if (event.accountId !== options.accountId || typeof event.versionToken !== "string") {
|
|
13124
|
+
throw new Error("Invalid cookie notification identity.");
|
|
13125
|
+
}
|
|
13126
|
+
version = event.versionToken;
|
|
13127
|
+
delivered();
|
|
13128
|
+
for (const changed of listeners) changed(version);
|
|
13129
|
+
}
|
|
13283
13130
|
}
|
|
13284
|
-
|
|
13285
|
-
|
|
13131
|
+
} finally {
|
|
13132
|
+
await reader.cancel().catch(() => void 0);
|
|
13133
|
+
}
|
|
13134
|
+
}
|
|
13135
|
+
return {
|
|
13136
|
+
materialize: () => request("bootstrap"),
|
|
13137
|
+
changes(after) {
|
|
13138
|
+
if (watching && version === after) return { upserts: [], deletes: [], versionToken: after, reset: false, healthy: true };
|
|
13139
|
+
return request(`delta?after=${encodeURIComponent(after)}`);
|
|
13140
|
+
},
|
|
13141
|
+
merge: (mutation) => request("merge", mutation),
|
|
13142
|
+
subscribe(changed) {
|
|
13143
|
+
listeners.add(changed);
|
|
13144
|
+
if (!unsubscribeReady) unsubscribeReady = options.subscribeReady?.(() => {
|
|
13145
|
+
watching?.abort();
|
|
13146
|
+
watching = void 0;
|
|
13147
|
+
version = void 0;
|
|
13148
|
+
start();
|
|
13149
|
+
});
|
|
13150
|
+
start();
|
|
13151
|
+
return () => {
|
|
13152
|
+
listeners.delete(changed);
|
|
13153
|
+
if (!listeners.size) {
|
|
13154
|
+
watching?.abort();
|
|
13155
|
+
watching = void 0;
|
|
13156
|
+
version = void 0;
|
|
13157
|
+
unsubscribeReady?.();
|
|
13158
|
+
unsubscribeReady = void 0;
|
|
13159
|
+
}
|
|
13160
|
+
};
|
|
13286
13161
|
}
|
|
13287
|
-
|
|
13288
|
-
const proto = el instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype
|
|
13289
|
-
: el instanceof HTMLInputElement ? HTMLInputElement.prototype
|
|
13290
|
-
: null;
|
|
13291
|
-
if (!proto && !('value' in el)) {
|
|
13292
|
-
throw new Error('focused element <' + el.tagName.toLowerCase() + '> is not editable');
|
|
13293
|
-
}
|
|
13294
|
-
const value = String(el.value || '');
|
|
13295
|
-
const start = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
|
|
13296
|
-
const end = typeof el.selectionEnd === 'number' ? el.selectionEnd : start;
|
|
13297
|
-
const next = value.slice(0, start) + text + value.slice(end);
|
|
13298
|
-
const setter = proto && Object.getOwnPropertyDescriptor(proto, 'value').set;
|
|
13299
|
-
if (setter) setter.call(el, next); else el.value = next;
|
|
13300
|
-
const caret = start + text.length;
|
|
13301
|
-
if (typeof el.setSelectionRange === 'function') {
|
|
13302
|
-
try { el.setSelectionRange(caret, caret); } catch {}
|
|
13303
|
-
}
|
|
13304
|
-
el.dispatchEvent(inputEvent('insertText'));
|
|
13305
|
-
return true;
|
|
13306
|
-
})()`;
|
|
13307
|
-
}
|
|
13308
|
-
function codeFor(key) {
|
|
13309
|
-
if (/^[a-z]$/i.test(key)) return `Key${key.toUpperCase()}`;
|
|
13310
|
-
if (/^[0-9]$/.test(key)) return `Digit${key}`;
|
|
13311
|
-
if (key === " ") return "Space";
|
|
13312
|
-
return key;
|
|
13313
|
-
}
|
|
13314
|
-
function keyScript(combo) {
|
|
13315
|
-
const parts = String(combo).split("+");
|
|
13316
|
-
const key = parts.pop() || "";
|
|
13317
|
-
const mods = parts.map((part) => part.toLowerCase());
|
|
13318
|
-
const init = {
|
|
13319
|
-
key,
|
|
13320
|
-
code: codeFor(key),
|
|
13321
|
-
bubbles: true,
|
|
13322
|
-
cancelable: true,
|
|
13323
|
-
ctrlKey: mods.includes("control") || mods.includes("ctrl"),
|
|
13324
|
-
shiftKey: mods.includes("shift"),
|
|
13325
|
-
altKey: mods.includes("alt") || mods.includes("option"),
|
|
13326
|
-
metaKey: mods.includes("meta") || mods.includes("cmd") || mods.includes("command")
|
|
13327
13162
|
};
|
|
13328
|
-
|
|
13329
|
-
|
|
13330
|
-
|
|
13331
|
-
|
|
13332
|
-
|
|
13333
|
-
|
|
13334
|
-
|
|
13335
|
-
|
|
13336
|
-
|
|
13337
|
-
|
|
13338
|
-
|
|
13339
|
-
|
|
13340
|
-
|
|
13341
|
-
|
|
13342
|
-
|
|
13343
|
-
|
|
13344
|
-
|
|
13345
|
-
|
|
13346
|
-
}
|
|
13347
|
-
};
|
|
13348
|
-
const proceed = el.dispatchEvent(new KeyboardEvent('keydown', init));
|
|
13349
|
-
if (proceed) {
|
|
13350
|
-
el.dispatchEvent(new KeyboardEvent('keypress', init));
|
|
13351
|
-
if ((init.ctrlKey || init.metaKey) && init.key.toLowerCase() === 'a' && isEditable) {
|
|
13352
|
-
if (isInput && typeof el.select === 'function') {
|
|
13353
|
-
el.select();
|
|
13354
|
-
} else {
|
|
13355
|
-
const range = document.createRange();
|
|
13356
|
-
range.selectNodeContents(el);
|
|
13357
|
-
const selection = window.getSelection();
|
|
13358
|
-
selection.removeAllRanges();
|
|
13359
|
-
selection.addRange(range);
|
|
13360
|
-
}
|
|
13361
|
-
} else if ((init.key === 'Backspace' || init.key === 'Delete') && isInput) {
|
|
13362
|
-
const value = String(el.value || '');
|
|
13363
|
-
const selectionStart = typeof el.selectionStart === 'number' ? el.selectionStart : value.length;
|
|
13364
|
-
const selectionEnd = typeof el.selectionEnd === 'number' ? el.selectionEnd : selectionStart;
|
|
13365
|
-
let start = selectionStart;
|
|
13366
|
-
let end = selectionEnd;
|
|
13367
|
-
if (start === end && init.key === 'Backspace' && start > 0) start -= 1;
|
|
13368
|
-
if (start === end && init.key === 'Delete' && end < value.length) end += 1;
|
|
13369
|
-
if (start !== end) {
|
|
13370
|
-
setValue(value.slice(0, start) + value.slice(end), start);
|
|
13371
|
-
el.dispatchEvent(inputEvent(init.key === 'Backspace' ? 'deleteContentBackward' : 'deleteContentForward'));
|
|
13372
|
-
}
|
|
13373
|
-
} else if (init.key === 'Enter') {
|
|
13374
|
-
if (el instanceof HTMLButtonElement || el instanceof HTMLAnchorElement) {
|
|
13375
|
-
el.click();
|
|
13376
|
-
} else if (el instanceof HTMLInputElement && el.form) {
|
|
13377
|
-
if (el.form.requestSubmit) el.form.requestSubmit(); else el.form.submit();
|
|
13378
|
-
}
|
|
13379
|
-
}
|
|
13380
|
-
}
|
|
13381
|
-
el.dispatchEvent(new KeyboardEvent('keyup', init));
|
|
13382
|
-
return true;
|
|
13383
|
-
})()`;
|
|
13163
|
+
}
|
|
13164
|
+
|
|
13165
|
+
// src/cookies/adapter-credential.ts
|
|
13166
|
+
var import_node_fs4 = __toESM(require("node:fs"), 1);
|
|
13167
|
+
var import_node_path4 = __toESM(require("node:path"), 1);
|
|
13168
|
+
var FILE = "cookie-adapter.json";
|
|
13169
|
+
function readCookieAdapter(root, accountId) {
|
|
13170
|
+
const file = import_node_path4.default.join(root, FILE);
|
|
13171
|
+
let record;
|
|
13172
|
+
try {
|
|
13173
|
+
record = JSON.parse(import_node_fs4.default.readFileSync(file, "utf8"));
|
|
13174
|
+
} catch {
|
|
13175
|
+
return null;
|
|
13176
|
+
}
|
|
13177
|
+
if (record.version !== 1 || record.accountId !== accountId) {
|
|
13178
|
+
throw new BrowserError("AUTHORIZATION_DENIED", "The Browser adapter belongs to another account.");
|
|
13179
|
+
}
|
|
13180
|
+
return typeof record.token === "string" && record.token.length >= 32 ? record.token : null;
|
|
13384
13181
|
}
|
|
13385
13182
|
// Annotate the CommonJS export names for ESM import in node:
|
|
13386
13183
|
0 && (module.exports = {
|
|
13387
13184
|
BROWSER_IPC,
|
|
13388
|
-
BROWSER_SESSION_PARTITION,
|
|
13389
|
-
BROWSER_SURFACE_PROTOCOL,
|
|
13390
|
-
BROWSER_SURFACE_PROTOCOLS,
|
|
13391
|
-
ELECTRON_COOKIE_ADAPTER_ID,
|
|
13392
|
-
ElectronBrowserDriver,
|
|
13393
|
-
ElectronCookieAdapter,
|
|
13394
|
-
NativeAdBlocker,
|
|
13395
|
-
adBlockHostname,
|
|
13396
|
-
browserNavigationPolicy,
|
|
13397
|
-
codeFor,
|
|
13398
13185
|
createBrowserShell,
|
|
13399
|
-
|
|
13400
|
-
|
|
13401
|
-
insertTextScript,
|
|
13402
|
-
isAdBlockCacheFresh,
|
|
13403
|
-
isAllowedExternalUrl,
|
|
13404
|
-
isAllowedWebUrl,
|
|
13405
|
-
isLoopbackCdpUrl,
|
|
13406
|
-
isNativeAdBlockDisabled,
|
|
13407
|
-
isolatedBrowserSession,
|
|
13408
|
-
keyScript,
|
|
13409
|
-
markerUrl,
|
|
13410
|
-
nextAvailableDownloadPath,
|
|
13411
|
-
normalizeBrowserLocation,
|
|
13412
|
-
parseUrl,
|
|
13413
|
-
permissionOrigin,
|
|
13414
|
-
removeHostAdvertisement,
|
|
13415
|
-
safeDownloadFilename,
|
|
13416
|
-
safeDownloadName,
|
|
13417
|
-
setValueScript,
|
|
13418
|
-
shouldOpenAsTab,
|
|
13419
|
-
surfaceStamp,
|
|
13420
|
-
writeHostAdvertisement
|
|
13186
|
+
createHttpCookieStore,
|
|
13187
|
+
readCookieAdapter
|
|
13421
13188
|
});
|
|
13422
13189
|
/*! Bundled license information:
|
|
13423
13190
|
|