@amalgm/browser 0.1.0
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/CHANGELOG.md +16 -0
- package/LICENSE +5 -0
- package/PURPOSE.md +117 -0
- package/README.md +120 -0
- package/SECURITY.md +49 -0
- package/dist/bin/amalgm-browser-mcp.d.ts +2 -0
- package/dist/bin/amalgm-browser-mcp.js +5 -0
- package/dist/bin/amalgm-browser-mcp.js.map +1 -0
- package/dist/bin/amalgm-browser-rest.d.ts +2 -0
- package/dist/bin/amalgm-browser-rest.js +20 -0
- package/dist/bin/amalgm-browser-rest.js.map +1 -0
- package/dist/bin/amalgm-browser.d.ts +2 -0
- package/dist/bin/amalgm-browser.js +4 -0
- package/dist/bin/amalgm-browser.js.map +1 -0
- package/dist/src/action.d.ts +5 -0
- package/dist/src/action.js +42 -0
- package/dist/src/action.js.map +1 -0
- package/dist/src/adapters/actions.d.ts +10 -0
- package/dist/src/adapters/actions.js +41 -0
- package/dist/src/adapters/actions.js.map +1 -0
- package/dist/src/adapters/cli/actions.d.ts +7 -0
- package/dist/src/adapters/cli/actions.js +63 -0
- package/dist/src/adapters/cli/actions.js.map +1 -0
- package/dist/src/adapters/cli/args.d.ts +8 -0
- package/dist/src/adapters/cli/args.js +41 -0
- package/dist/src/adapters/cli/args.js.map +1 -0
- package/dist/src/adapters/cli/help.d.ts +1 -0
- package/dist/src/adapters/cli/help.js +29 -0
- package/dist/src/adapters/cli/help.js.map +1 -0
- package/dist/src/adapters/cli/resources.d.ts +4 -0
- package/dist/src/adapters/cli/resources.js +116 -0
- package/dist/src/adapters/cli/resources.js.map +1 -0
- package/dist/src/adapters/cli/run.d.ts +7 -0
- package/dist/src/adapters/cli/run.js +108 -0
- package/dist/src/adapters/cli/run.js.map +1 -0
- package/dist/src/adapters/execute.d.ts +4 -0
- package/dist/src/adapters/execute.js +91 -0
- package/dist/src/adapters/execute.js.map +1 -0
- package/dist/src/adapters/http/auth-routes.d.ts +2 -0
- package/dist/src/adapters/http/auth-routes.js +93 -0
- package/dist/src/adapters/http/auth-routes.js.map +1 -0
- package/dist/src/adapters/http/events.d.ts +3 -0
- package/dist/src/adapters/http/events.js +20 -0
- package/dist/src/adapters/http/events.js.map +1 -0
- package/dist/src/adapters/http/internal-routes.d.ts +2 -0
- package/dist/src/adapters/http/internal-routes.js +35 -0
- package/dist/src/adapters/http/internal-routes.js.map +1 -0
- package/dist/src/adapters/http/openapi.d.ts +1 -0
- package/dist/src/adapters/http/openapi.js +78 -0
- package/dist/src/adapters/http/openapi.js.map +1 -0
- package/dist/src/adapters/http/profile-routes.d.ts +2 -0
- package/dist/src/adapters/http/profile-routes.js +42 -0
- package/dist/src/adapters/http/profile-routes.js.map +1 -0
- package/dist/src/adapters/http/recording-routes.d.ts +2 -0
- package/dist/src/adapters/http/recording-routes.js +41 -0
- package/dist/src/adapters/http/recording-routes.js.map +1 -0
- package/dist/src/adapters/http/request.d.ts +4 -0
- package/dist/src/adapters/http/request.js +44 -0
- package/dist/src/adapters/http/request.js.map +1 -0
- package/dist/src/adapters/http/server.d.ts +2 -0
- package/dist/src/adapters/http/server.js +114 -0
- package/dist/src/adapters/http/server.js.map +1 -0
- package/dist/src/adapters/http/session-routes.d.ts +2 -0
- package/dist/src/adapters/http/session-routes.js +54 -0
- package/dist/src/adapters/http/session-routes.js.map +1 -0
- package/dist/src/adapters/http/types.d.ts +29 -0
- package/dist/src/adapters/http/types.js +2 -0
- package/dist/src/adapters/http/types.js.map +1 -0
- package/dist/src/adapters/mcp/server.d.ts +3 -0
- package/dist/src/adapters/mcp/server.js +74 -0
- package/dist/src/adapters/mcp/server.js.map +1 -0
- package/dist/src/adapters/mcp/tools.d.ts +3 -0
- package/dist/src/adapters/mcp/tools.js +45 -0
- package/dist/src/adapters/mcp/tools.js.map +1 -0
- package/dist/src/adapters/mcp/types.d.ts +17 -0
- package/dist/src/adapters/mcp/types.js +2 -0
- package/dist/src/adapters/mcp/types.js.map +1 -0
- package/dist/src/adapters/toolbox/aliases.d.ts +5 -0
- package/dist/src/adapters/toolbox/aliases.js +14 -0
- package/dist/src/adapters/toolbox/aliases.js.map +1 -0
- package/dist/src/adapters/toolbox/executor.d.ts +6 -0
- package/dist/src/adapters/toolbox/executor.js +13 -0
- package/dist/src/adapters/toolbox/executor.js.map +1 -0
- package/dist/src/adapters/toolbox/manifest.d.ts +15 -0
- package/dist/src/adapters/toolbox/manifest.js +24 -0
- package/dist/src/adapters/toolbox/manifest.js.map +1 -0
- package/dist/src/artifacts.d.ts +14 -0
- package/dist/src/artifacts.js +28 -0
- package/dist/src/artifacts.js.map +1 -0
- package/dist/src/auth/filter.d.ts +3 -0
- package/dist/src/auth/filter.js +60 -0
- package/dist/src/auth/filter.js.map +1 -0
- package/dist/src/auth/login.d.ts +41 -0
- package/dist/src/auth/login.js +145 -0
- package/dist/src/auth/login.js.map +1 -0
- package/dist/src/auth/portable.d.ts +18 -0
- package/dist/src/auth/portable.js +48 -0
- package/dist/src/auth/portable.js.map +1 -0
- package/dist/src/auth/service.d.ts +29 -0
- package/dist/src/auth/service.js +104 -0
- package/dist/src/auth/service.js.map +1 -0
- package/dist/src/auth/transport.d.ts +8 -0
- package/dist/src/auth/transport.js +45 -0
- package/dist/src/auth/transport.js.map +1 -0
- package/dist/src/auth/vault.d.ts +10 -0
- package/dist/src/auth/vault.js +27 -0
- package/dist/src/auth/vault.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +3 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/cookies/coordinator.d.ts +17 -0
- package/dist/src/cookies/coordinator.js +93 -0
- package/dist/src/cookies/coordinator.js.map +1 -0
- package/dist/src/cookies/jar.d.ts +21 -0
- package/dist/src/cookies/jar.js +146 -0
- package/dist/src/cookies/jar.js.map +1 -0
- package/dist/src/cookies/policy.d.ts +6 -0
- package/dist/src/cookies/policy.js +58 -0
- package/dist/src/cookies/policy.js.map +1 -0
- package/dist/src/cookies/secret-file.d.ts +10 -0
- package/dist/src/cookies/secret-file.js +80 -0
- package/dist/src/cookies/secret-file.js.map +1 -0
- package/dist/src/cookies/types.d.ts +64 -0
- package/dist/src/cookies/types.js +2 -0
- package/dist/src/cookies/types.js.map +1 -0
- package/dist/src/cookies.d.ts +5 -0
- package/dist/src/cookies.js +5 -0
- package/dist/src/cookies.js.map +1 -0
- package/dist/src/defaults.d.ts +24 -0
- package/dist/src/defaults.js +107 -0
- package/dist/src/defaults.js.map +1 -0
- package/dist/src/drivers/cdp/capture.d.ts +5 -0
- package/dist/src/drivers/cdp/capture.js +39 -0
- package/dist/src/drivers/cdp/capture.js.map +1 -0
- package/dist/src/drivers/cdp/client.d.ts +8 -0
- package/dist/src/drivers/cdp/client.js +88 -0
- package/dist/src/drivers/cdp/client.js.map +1 -0
- package/dist/src/drivers/cdp/input.d.ts +2 -0
- package/dist/src/drivers/cdp/input.js +15 -0
- package/dist/src/drivers/cdp/input.js.map +1 -0
- package/dist/src/drivers/cdp/screencast.d.ts +2 -0
- package/dist/src/drivers/cdp/screencast.js +39 -0
- package/dist/src/drivers/cdp/screencast.js.map +1 -0
- package/dist/src/drivers/cdp/target.d.ts +4 -0
- package/dist/src/drivers/cdp/target.js +34 -0
- package/dist/src/drivers/cdp/target.js.map +1 -0
- package/dist/src/drivers/electron/advertisement.d.ts +12 -0
- package/dist/src/drivers/electron/advertisement.js +57 -0
- package/dist/src/drivers/electron/advertisement.js.map +1 -0
- package/dist/src/drivers/electron/contracts.d.ts +45 -0
- package/dist/src/drivers/electron/contracts.js +10 -0
- package/dist/src/drivers/electron/contracts.js.map +1 -0
- package/dist/src/drivers/electron/cookie-adapter.d.ts +17 -0
- package/dist/src/drivers/electron/cookie-adapter.js +69 -0
- package/dist/src/drivers/electron/cookie-adapter.js.map +1 -0
- package/dist/src/drivers/electron/driver.d.ts +19 -0
- package/dist/src/drivers/electron/driver.js +115 -0
- package/dist/src/drivers/electron/driver.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/cache.d.ts +4 -0
- package/dist/src/drivers/electron/native/adblock/cache.js +54 -0
- package/dist/src/drivers/electron/native/adblock/cache.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.d.ts +11 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.js +45 -0
- package/dist/src/drivers/electron/native/adblock/cosmetics.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/index.d.ts +44 -0
- package/dist/src/drivers/electron/native/adblock/index.js +153 -0
- package/dist/src/drivers/electron/native/adblock/index.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/policy.d.ts +2 -0
- package/dist/src/drivers/electron/native/adblock/policy.js +12 -0
- package/dist/src/drivers/electron/native/adblock/policy.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/preload.d.ts +1 -0
- package/dist/src/drivers/electron/native/adblock/preload.js +131 -0
- package/dist/src/drivers/electron/native/adblock/preload.js.map +1 -0
- package/dist/src/drivers/electron/native/adblock/settings.d.ts +9 -0
- package/dist/src/drivers/electron/native/adblock/settings.js +37 -0
- package/dist/src/drivers/electron/native/adblock/settings.js.map +1 -0
- package/dist/src/drivers/electron/native/config.d.ts +4 -0
- package/dist/src/drivers/electron/native/config.js +9 -0
- package/dist/src/drivers/electron/native/config.js.map +1 -0
- package/dist/src/drivers/electron/native/contracts.d.ts +174 -0
- package/dist/src/drivers/electron/native/contracts.js +20 -0
- package/dist/src/drivers/electron/native/contracts.js.map +1 -0
- package/dist/src/drivers/electron/native/policy.d.ts +7 -0
- package/dist/src/drivers/electron/native/policy.js +43 -0
- package/dist/src/drivers/electron/native/policy.js.map +1 -0
- package/dist/src/drivers/electron/native/session.d.ts +4 -0
- package/dist/src/drivers/electron/native/session.js +11 -0
- package/dist/src/drivers/electron/native/session.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.d.ts +10 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.js +44 -0
- package/dist/src/drivers/electron/native/shell/adblock-ipc.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/context-menu.d.ts +11 -0
- package/dist/src/drivers/electron/native/shell/context-menu.js +129 -0
- package/dist/src/drivers/electron/native/shell/context-menu.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/downloads.d.ts +11 -0
- package/dist/src/drivers/electron/native/shell/downloads.js +90 -0
- package/dist/src/drivers/electron/native/shell/downloads.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/helpers.d.ts +5 -0
- package/dist/src/drivers/electron/native/shell/helpers.js +53 -0
- package/dist/src/drivers/electron/native/shell/helpers.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/permissions.d.ts +16 -0
- package/dist/src/drivers/electron/native/shell/permissions.js +107 -0
- package/dist/src/drivers/electron/native/shell/permissions.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/sites.d.ts +24 -0
- package/dist/src/drivers/electron/native/shell/sites.js +119 -0
- package/dist/src/drivers/electron/native/shell/sites.js.map +1 -0
- package/dist/src/drivers/electron/native/shell/types.d.ts +13 -0
- package/dist/src/drivers/electron/native/shell/types.js +2 -0
- package/dist/src/drivers/electron/native/shell/types.js.map +1 -0
- package/dist/src/drivers/electron/native/shell.d.ts +14 -0
- package/dist/src/drivers/electron/native/shell.js +115 -0
- package/dist/src/drivers/electron/native/shell.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/commands.d.ts +4 -0
- package/dist/src/drivers/electron/native/surface/commands.js +49 -0
- package/dist/src/drivers/electron/native/surface/commands.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/create.d.ts +4 -0
- package/dist/src/drivers/electron/native/surface/create.js +46 -0
- package/dist/src/drivers/electron/native/surface/create.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/events.d.ts +3 -0
- package/dist/src/drivers/electron/native/surface/events.js +55 -0
- package/dist/src/drivers/electron/native/surface/events.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/presentation.d.ts +15 -0
- package/dist/src/drivers/electron/native/surface/presentation.js +87 -0
- package/dist/src/drivers/electron/native/surface/presentation.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/state.d.ts +7 -0
- package/dist/src/drivers/electron/native/surface/state.js +45 -0
- package/dist/src/drivers/electron/native/surface/state.js.map +1 -0
- package/dist/src/drivers/electron/native/surface/types.d.ts +39 -0
- package/dist/src/drivers/electron/native/surface/types.js +2 -0
- package/dist/src/drivers/electron/native/surface/types.js.map +1 -0
- package/dist/src/drivers/electron/native/surface-controller.d.ts +6 -0
- package/dist/src/drivers/electron/native/surface-controller.js +138 -0
- package/dist/src/drivers/electron/native/surface-controller.js.map +1 -0
- package/dist/src/drivers/electron/policy.d.ts +4 -0
- package/dist/src/drivers/electron/policy.js +39 -0
- package/dist/src/drivers/electron/policy.js.map +1 -0
- package/dist/src/drivers/electron/session.d.ts +4 -0
- package/dist/src/drivers/electron/session.js +5 -0
- package/dist/src/drivers/electron/session.js.map +1 -0
- package/dist/src/drivers/headless/command.d.ts +25 -0
- package/dist/src/drivers/headless/command.js +114 -0
- package/dist/src/drivers/headless/command.js.map +1 -0
- package/dist/src/drivers/headless/cookie-adapter.d.ts +16 -0
- package/dist/src/drivers/headless/cookie-adapter.js +59 -0
- package/dist/src/drivers/headless/cookie-adapter.js.map +1 -0
- package/dist/src/drivers/headless/driver.d.ts +31 -0
- package/dist/src/drivers/headless/driver.js +238 -0
- package/dist/src/drivers/headless/driver.js.map +1 -0
- package/dist/src/drivers/headless/executable.d.ts +8 -0
- package/dist/src/drivers/headless/executable.js +56 -0
- package/dist/src/drivers/headless/executable.js.map +1 -0
- package/dist/src/drivers/headless/screencast.d.ts +3 -0
- package/dist/src/drivers/headless/screencast.js +21 -0
- package/dist/src/drivers/headless/screencast.js.map +1 -0
- package/dist/src/electron.d.ts +14 -0
- package/dist/src/electron.js +15 -0
- package/dist/src/electron.js.map +1 -0
- package/dist/src/errors.d.ts +9 -0
- package/dist/src/errors.js +25 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/events.d.ts +13 -0
- package/dist/src/events.js +32 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/headless.d.ts +3 -0
- package/dist/src/headless.js +4 -0
- package/dist/src/headless.js.map +1 -0
- package/dist/src/http.d.ts +3 -0
- package/dist/src/http.js +3 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/ids.d.ts +2 -0
- package/dist/src/ids.js +9 -0
- package/dist/src/ids.js.map +1 -0
- package/dist/src/index.d.ts +14 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interaction/delta.d.ts +25 -0
- package/dist/src/interaction/delta.js +102 -0
- package/dist/src/interaction/delta.js.map +1 -0
- package/dist/src/interaction/typing.d.ts +39 -0
- package/dist/src/interaction/typing.js +189 -0
- package/dist/src/interaction/typing.js.map +1 -0
- package/dist/src/mcp.d.ts +3 -0
- package/dist/src/mcp.js +3 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/migration/legacy-cookies.d.ts +2 -0
- package/dist/src/migration/legacy-cookies.js +60 -0
- package/dist/src/migration/legacy-cookies.js.map +1 -0
- package/dist/src/migration/legacy-crypto.d.ts +1 -0
- package/dist/src/migration/legacy-crypto.js +35 -0
- package/dist/src/migration/legacy-crypto.js.map +1 -0
- package/dist/src/migration/legacy-migration.d.ts +20 -0
- package/dist/src/migration/legacy-migration.js +81 -0
- package/dist/src/migration/legacy-migration.js.map +1 -0
- package/dist/src/migration/legacy-rows.d.ts +5 -0
- package/dist/src/migration/legacy-rows.js +72 -0
- package/dist/src/migration/legacy-rows.js.map +1 -0
- package/dist/src/persistence/sqlite-registry.d.ts +32 -0
- package/dist/src/persistence/sqlite-registry.js +136 -0
- package/dist/src/persistence/sqlite-registry.js.map +1 -0
- package/dist/src/ports.d.ts +93 -0
- package/dist/src/ports.js +4 -0
- package/dist/src/ports.js.map +1 -0
- package/dist/src/process.d.ts +4 -0
- package/dist/src/process.js +63 -0
- package/dist/src/process.js.map +1 -0
- package/dist/src/product-service.d.ts +30 -0
- package/dist/src/product-service.js +38 -0
- package/dist/src/product-service.js.map +1 -0
- package/dist/src/profiles/directories.d.ts +9 -0
- package/dist/src/profiles/directories.js +57 -0
- package/dist/src/profiles/directories.js.map +1 -0
- package/dist/src/profiles/service.d.ts +30 -0
- package/dist/src/profiles/service.js +89 -0
- package/dist/src/profiles/service.js.map +1 -0
- package/dist/src/recording/encoder.d.ts +22 -0
- package/dist/src/recording/encoder.js +89 -0
- package/dist/src/recording/encoder.js.map +1 -0
- package/dist/src/recording/sampler.d.ts +18 -0
- package/dist/src/recording/sampler.js +33 -0
- package/dist/src/recording/sampler.js.map +1 -0
- package/dist/src/recording/service.d.ts +27 -0
- package/dist/src/recording/service.js +180 -0
- package/dist/src/recording/service.js.map +1 -0
- package/dist/src/recording/source.d.ts +1 -0
- package/dist/src/recording/source.js +21 -0
- package/dist/src/recording/source.js.map +1 -0
- package/dist/src/recording.d.ts +3 -0
- package/dist/src/recording.js +4 -0
- package/dist/src/recording.js.map +1 -0
- package/dist/src/registry.d.ts +15 -0
- package/dist/src/registry.js +46 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/runtime-selector.d.ts +12 -0
- package/dist/src/runtime-selector.js +78 -0
- package/dist/src/runtime-selector.js.map +1 -0
- package/dist/src/service-options.d.ts +19 -0
- package/dist/src/service-options.js +2 -0
- package/dist/src/service-options.js.map +1 -0
- package/dist/src/service.d.ts +39 -0
- package/dist/src/service.js +204 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/sessions/leases.d.ts +10 -0
- package/dist/src/sessions/leases.js +41 -0
- package/dist/src/sessions/leases.js.map +1 -0
- package/dist/src/sessions/prune.d.ts +2 -0
- package/dist/src/sessions/prune.js +8 -0
- package/dist/src/sessions/prune.js.map +1 -0
- package/dist/src/testing.d.ts +18 -0
- package/dist/src/testing.js +21 -0
- package/dist/src/testing.js.map +1 -0
- package/dist/src/toolbox.d.ts +3 -0
- package/dist/src/toolbox.js +4 -0
- package/dist/src/toolbox.js.map +1 -0
- package/dist/src/types.d.ts +273 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/docs/ACTIONS.md +27 -0
- package/docs/ARCHITECTURE.md +71 -0
- package/docs/AUTHENTICATION.md +56 -0
- package/docs/AXIOMS.md +20 -0
- package/docs/CLI.md +61 -0
- package/docs/COMPATIBILITY.md +45 -0
- package/docs/COOKIES.md +61 -0
- package/docs/ELECTRON_INTEGRATION.md +87 -0
- package/docs/ENGINE_INTEGRATION.md +73 -0
- package/docs/EVENTS.md +30 -0
- package/docs/HEADLESS_RUNTIME.md +58 -0
- package/docs/MCP.md +36 -0
- package/docs/MIGRATION.md +64 -0
- package/docs/OPERATIONS.md +69 -0
- package/docs/README.md +21 -0
- package/docs/REALTIME_BOUNDARY.md +33 -0
- package/docs/RECORDING.md +55 -0
- package/docs/REST.md +69 -0
- package/docs/SDK.md +101 -0
- package/docs/TESTING.md +57 -0
- package/docs/TOOLBOX_INTEGRATION.md +34 -0
- package/docs/TROUBLESHOOTING.md +67 -0
- package/examples/basic.ts +7 -0
- package/examples/custom-driver.ts +45 -0
- package/package.json +78 -0
- package/skills/use-amalgm-browser/SKILL.md +42 -0
- package/skills/use-amalgm-browser/agents/openai.yaml +4 -0
- package/skills/use-amalgm-browser/references/actions.md +40 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { BrowserError } from '../errors.js';
|
|
2
|
+
import { safeId } from '../ids.js';
|
|
3
|
+
export class BrowserProfileStore {
|
|
4
|
+
options;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.options = options;
|
|
7
|
+
}
|
|
8
|
+
create(input) {
|
|
9
|
+
const id = safeId(input.id || this.options.generate());
|
|
10
|
+
if (this.find(id))
|
|
11
|
+
throw new BrowserError('CONFLICT', `Browser profile ${id} already exists.`);
|
|
12
|
+
return this.ensure(id, input.kind || 'durable', input.name);
|
|
13
|
+
}
|
|
14
|
+
list() { return this.options.registry.snapshot().profiles; }
|
|
15
|
+
get(id) {
|
|
16
|
+
const profile = this.find(id);
|
|
17
|
+
if (!profile)
|
|
18
|
+
throw new BrowserError('NOT_FOUND', `Browser profile ${id} does not exist.`);
|
|
19
|
+
return profile;
|
|
20
|
+
}
|
|
21
|
+
update(id, patch) {
|
|
22
|
+
const profile = this.get(id);
|
|
23
|
+
const updated = {
|
|
24
|
+
...profile,
|
|
25
|
+
...(patch.name !== undefined ? { name: patch.name.trim() || profile.name } : {}),
|
|
26
|
+
...(patch.kind !== undefined ? { kind: patch.kind } : {}),
|
|
27
|
+
updatedAt: this.options.now(),
|
|
28
|
+
};
|
|
29
|
+
this.options.registry.putProfile(updated);
|
|
30
|
+
this.options.publish(updated.id);
|
|
31
|
+
return updated;
|
|
32
|
+
}
|
|
33
|
+
inspect(id, sessions, referenced) {
|
|
34
|
+
return {
|
|
35
|
+
profile: this.get(id),
|
|
36
|
+
live: sessions.some((session) => session.profileId === id && !isFinished(session)),
|
|
37
|
+
referenced: referenced.has(id),
|
|
38
|
+
locked: this.options.directories?.isLocked(id) || false,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
delete(id, sessions) {
|
|
42
|
+
if (sessions.some((session) => session.profileId === id && !isFinished(session))) {
|
|
43
|
+
throw new BrowserError('CONFLICT', `Browser profile ${id} belongs to a live session.`);
|
|
44
|
+
}
|
|
45
|
+
if (this.options.directories?.isLocked(id)) {
|
|
46
|
+
throw new BrowserError('CONFLICT', `Browser profile ${id} has a live Chromium lock.`);
|
|
47
|
+
}
|
|
48
|
+
this.options.directories?.remove(id);
|
|
49
|
+
this.options.registry.deleteProfile(id);
|
|
50
|
+
}
|
|
51
|
+
prune(maxAgeMs, referenced, sessions) {
|
|
52
|
+
const cutoff = Date.parse(this.options.now()) - maxAgeMs;
|
|
53
|
+
const live = new Set(sessions.filter((session) => !isFinished(session)).map((session) => session.profileId));
|
|
54
|
+
const removed = this.list().filter((profile) => profile.kind === 'ephemeral'
|
|
55
|
+
&& !live.has(profile.id)
|
|
56
|
+
&& !referenced.has(profile.id)
|
|
57
|
+
&& !this.options.directories?.isLocked(profile.id)
|
|
58
|
+
&& Math.max(Date.parse(profile.lastUsedAt), this.options.directories?.lastTouchedAt(profile.id) || 0) < cutoff)
|
|
59
|
+
.map((profile) => profile.id);
|
|
60
|
+
for (const id of removed) {
|
|
61
|
+
this.options.directories?.remove(id);
|
|
62
|
+
this.options.registry.deleteProfile(id);
|
|
63
|
+
}
|
|
64
|
+
return removed;
|
|
65
|
+
}
|
|
66
|
+
ensure(idValue, kind, name = idValue) {
|
|
67
|
+
const id = safeId(idValue);
|
|
68
|
+
const existing = this.find(id);
|
|
69
|
+
if (existing)
|
|
70
|
+
return existing;
|
|
71
|
+
const now = this.options.now();
|
|
72
|
+
const profile = { id, name, kind, createdAt: now, updatedAt: now, lastUsedAt: now };
|
|
73
|
+
this.options.registry.putProfile(profile);
|
|
74
|
+
this.options.publish(id);
|
|
75
|
+
return profile;
|
|
76
|
+
}
|
|
77
|
+
touch(id) {
|
|
78
|
+
const profile = this.get(id);
|
|
79
|
+
const now = this.options.now();
|
|
80
|
+
this.options.registry.putProfile({ ...profile, updatedAt: now, lastUsedAt: now });
|
|
81
|
+
}
|
|
82
|
+
find(id) {
|
|
83
|
+
return this.list().find((profile) => profile.id === safeId(id));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function isFinished(session) {
|
|
87
|
+
return session.status === 'closed' || session.status === 'failed';
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/profiles/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface EncoderResult {
|
|
2
|
+
frames: number;
|
|
3
|
+
videoSeconds: number;
|
|
4
|
+
wallSeconds: number;
|
|
5
|
+
forced: boolean;
|
|
6
|
+
framesReceived: number;
|
|
7
|
+
skippedTicks: number;
|
|
8
|
+
warning?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class WebmEncoder {
|
|
11
|
+
readonly binary: string;
|
|
12
|
+
readonly file: string;
|
|
13
|
+
readonly fps: number;
|
|
14
|
+
private child?;
|
|
15
|
+
private sampler?;
|
|
16
|
+
private startedAt;
|
|
17
|
+
constructor(binary: string, file: string, fps: number);
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
frame(png: Buffer): void;
|
|
20
|
+
stop(): Promise<EncoderResult>;
|
|
21
|
+
force(): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { BrowserError } from '../errors.js';
|
|
3
|
+
import { deadline } from '../drivers/cdp/client.js';
|
|
4
|
+
import { LatestFrameSampler } from './sampler.js';
|
|
5
|
+
export class WebmEncoder {
|
|
6
|
+
binary;
|
|
7
|
+
file;
|
|
8
|
+
fps;
|
|
9
|
+
child;
|
|
10
|
+
sampler;
|
|
11
|
+
startedAt = 0;
|
|
12
|
+
constructor(binary, file, fps) {
|
|
13
|
+
this.binary = binary;
|
|
14
|
+
this.file = file;
|
|
15
|
+
this.fps = fps;
|
|
16
|
+
}
|
|
17
|
+
async start() {
|
|
18
|
+
const child = spawn(this.binary, encoderArgs(this.file, this.fps), { stdio: ['pipe', 'ignore', 'pipe'] });
|
|
19
|
+
this.child = child;
|
|
20
|
+
await new Promise((resolve, reject) => {
|
|
21
|
+
const ready = setTimeout(resolve, 100);
|
|
22
|
+
child.once('error', (error) => { clearTimeout(ready); reject(error); });
|
|
23
|
+
child.once('spawn', () => { clearTimeout(ready); resolve(); });
|
|
24
|
+
}).catch((error) => {
|
|
25
|
+
throw new BrowserError('PROCESS_FAILED', `ffmpeg failed to start: ${error.message}`);
|
|
26
|
+
});
|
|
27
|
+
child.stderr.on('data', () => undefined);
|
|
28
|
+
child.stdin.on('error', () => undefined);
|
|
29
|
+
this.sampler = new LatestFrameSampler(this.fps, (frame, onDrain) => {
|
|
30
|
+
const ready = child.stdin.write(frame);
|
|
31
|
+
if (!ready)
|
|
32
|
+
child.stdin.once('drain', onDrain);
|
|
33
|
+
return ready;
|
|
34
|
+
});
|
|
35
|
+
this.startedAt = Date.now();
|
|
36
|
+
this.sampler.start();
|
|
37
|
+
}
|
|
38
|
+
frame(png) { this.sampler?.push(png); }
|
|
39
|
+
async stop() {
|
|
40
|
+
if (!this.child)
|
|
41
|
+
throw new BrowserError('CONFLICT', 'Encoder was not started.');
|
|
42
|
+
this.sampler?.stop();
|
|
43
|
+
this.sampler?.tick();
|
|
44
|
+
const wallSeconds = Math.max(0, (Date.now() - this.startedAt) / 1_000);
|
|
45
|
+
const stats = this.sampler?.stats || { received: 0, encoded: 0, skippedTicks: 0 };
|
|
46
|
+
if (!stats.encoded) {
|
|
47
|
+
this.child.kill('SIGKILL');
|
|
48
|
+
await onceClosed(this.child).catch(() => undefined);
|
|
49
|
+
throw new BrowserError('PROCESS_FAILED', 'Recording produced no page frames.');
|
|
50
|
+
}
|
|
51
|
+
this.child.stdin.end();
|
|
52
|
+
let forced = false;
|
|
53
|
+
try {
|
|
54
|
+
await deadline(onceClosed(this.child), 10_000, 'encoder flush');
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
forced = true;
|
|
58
|
+
this.child.kill('SIGKILL');
|
|
59
|
+
await onceClosed(this.child).catch(() => undefined);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
frames: stats.encoded,
|
|
63
|
+
framesReceived: stats.received,
|
|
64
|
+
skippedTicks: stats.skippedTicks,
|
|
65
|
+
videoSeconds: stats.encoded / this.fps,
|
|
66
|
+
wallSeconds,
|
|
67
|
+
forced,
|
|
68
|
+
...(forced ? { warning: 'Encoder exceeded its flush deadline and was terminated; the partial WebM may still be playable.' } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
force() {
|
|
72
|
+
this.sampler?.stop();
|
|
73
|
+
this.child?.kill('SIGKILL');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function encoderArgs(file, fps) {
|
|
77
|
+
return [
|
|
78
|
+
'-y', '-f', 'image2pipe', '-framerate', String(fps), '-c:v', 'png', '-i', 'pipe:0',
|
|
79
|
+
'-filter_complex', '[0:v]format=rgba,split[fg1][fg2];[fg1]drawbox=color=white:t=fill[bg];[bg][fg2]overlay=format=auto,pad=ceil(iw/2)*2:ceil(ih/2)*2,format=yuv420p',
|
|
80
|
+
'-c:v', 'libvpx-vp9', '-deadline', 'realtime', '-cpu-used', '8', '-lag-in-frames', '0',
|
|
81
|
+
'-auto-alt-ref', '0', '-cluster_time_limit', '1000', '-cluster_size_limit', '2097152', '-f', 'webm', file,
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
function onceClosed(child) {
|
|
85
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
86
|
+
return Promise.resolve();
|
|
87
|
+
return new Promise((resolve) => child.once('close', () => resolve()));
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoder.js","sourceRoot":"","sources":["../../../src/recording/encoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SamplerStats {
|
|
2
|
+
received: number;
|
|
3
|
+
encoded: number;
|
|
4
|
+
skippedTicks: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class LatestFrameSampler {
|
|
7
|
+
readonly fps: number;
|
|
8
|
+
readonly write: (frame: Buffer, onDrain: () => void) => boolean;
|
|
9
|
+
readonly stats: SamplerStats;
|
|
10
|
+
private latest?;
|
|
11
|
+
private blocked;
|
|
12
|
+
private timer;
|
|
13
|
+
constructor(fps: number, write: (frame: Buffer, onDrain: () => void) => boolean);
|
|
14
|
+
push(frame: Buffer): void;
|
|
15
|
+
tick(): boolean;
|
|
16
|
+
start(): void;
|
|
17
|
+
stop(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export class LatestFrameSampler {
|
|
2
|
+
fps;
|
|
3
|
+
write;
|
|
4
|
+
stats = { received: 0, encoded: 0, skippedTicks: 0 };
|
|
5
|
+
latest;
|
|
6
|
+
blocked = false;
|
|
7
|
+
timer;
|
|
8
|
+
constructor(fps, write) {
|
|
9
|
+
this.fps = fps;
|
|
10
|
+
this.write = write;
|
|
11
|
+
}
|
|
12
|
+
push(frame) { this.stats.received += 1; this.latest = frame; }
|
|
13
|
+
tick() {
|
|
14
|
+
if (!this.latest)
|
|
15
|
+
return false;
|
|
16
|
+
if (this.blocked) {
|
|
17
|
+
this.stats.skippedTicks += 1;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const ready = this.write(this.latest, () => { this.blocked = false; });
|
|
21
|
+
this.stats.encoded += 1;
|
|
22
|
+
this.blocked = !ready;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
start() {
|
|
26
|
+
if (this.timer)
|
|
27
|
+
return;
|
|
28
|
+
this.timer = setInterval(() => this.tick(), 1_000 / this.fps);
|
|
29
|
+
}
|
|
30
|
+
stop() { if (this.timer)
|
|
31
|
+
clearInterval(this.timer); this.timer = undefined; }
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=sampler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sampler.js","sourceRoot":"","sources":["../../../src/recording/sampler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,kBAAkB;IAOlB;IACA;IAPF,KAAK,GAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACpE,MAAM,CAAU;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,KAAK,CAA6B;IAE1C,YACW,GAAW,EACX,KAAsD;QADtD,QAAG,GAAH,GAAG,CAAQ;QACX,UAAK,GAAL,KAAK,CAAiD;IAC9D,CAAC;IAEJ,IAAI,CAAC,KAAa,IAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAE5E,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAW,IAAI,IAAI,CAAC,KAAK;QAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;CACpF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BrowserArtifactStore, BrowserRegistry, ProcessLauncher } from '../ports.js';
|
|
2
|
+
import type { BrowserService } from '../service.js';
|
|
3
|
+
import type { BrowserRecording, BrowserRuntimeContext } from '../types.js';
|
|
4
|
+
export declare class BrowserRecordingService {
|
|
5
|
+
readonly browser: BrowserService;
|
|
6
|
+
readonly registry: BrowserRegistry;
|
|
7
|
+
readonly artifacts: BrowserArtifactStore;
|
|
8
|
+
readonly launcher: ProcessLauncher;
|
|
9
|
+
readonly binary: string;
|
|
10
|
+
readonly now: () => Date;
|
|
11
|
+
private readonly active;
|
|
12
|
+
constructor(browser: BrowserService, registry: BrowserRegistry, artifacts: BrowserArtifactStore, launcher: ProcessLauncher, binary?: string, now?: () => Date);
|
|
13
|
+
list(): BrowserRecording[];
|
|
14
|
+
activeRecordings(): BrowserRecording[];
|
|
15
|
+
get(id: string): BrowserRecording;
|
|
16
|
+
start(input: {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
fps?: number;
|
|
20
|
+
context?: BrowserRuntimeContext;
|
|
21
|
+
}): Promise<BrowserRecording>;
|
|
22
|
+
stop(sessionId: string): Promise<BrowserRecording>;
|
|
23
|
+
forceStop(sessionId: string): Promise<void>;
|
|
24
|
+
isActive(sessionId: string): boolean;
|
|
25
|
+
private recoverOrphans;
|
|
26
|
+
private verifyEncoder;
|
|
27
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { BrowserError } from '../errors.js';
|
|
3
|
+
import { newId, safeId } from '../ids.js';
|
|
4
|
+
import { ffmpegBinary } from '../drivers/headless/executable.js';
|
|
5
|
+
import { WebmEncoder } from './encoder.js';
|
|
6
|
+
import { deadline } from '../drivers/cdp/client.js';
|
|
7
|
+
import { waitForRecordingFrame } from './source.js';
|
|
8
|
+
import { pidIsRunning } from '../runtime-selector.js';
|
|
9
|
+
export class BrowserRecordingService {
|
|
10
|
+
browser;
|
|
11
|
+
registry;
|
|
12
|
+
artifacts;
|
|
13
|
+
launcher;
|
|
14
|
+
binary;
|
|
15
|
+
now;
|
|
16
|
+
active = new Map();
|
|
17
|
+
constructor(browser, registry, artifacts, launcher, binary = ffmpegBinary(), now = () => new Date()) {
|
|
18
|
+
this.browser = browser;
|
|
19
|
+
this.registry = registry;
|
|
20
|
+
this.artifacts = artifacts;
|
|
21
|
+
this.launcher = launcher;
|
|
22
|
+
this.binary = binary;
|
|
23
|
+
this.now = now;
|
|
24
|
+
this.recoverOrphans();
|
|
25
|
+
}
|
|
26
|
+
list() { return this.registry.snapshot().recordings; }
|
|
27
|
+
activeRecordings() { return this.list().filter((recording) => recording.status === 'active'); }
|
|
28
|
+
get(id) {
|
|
29
|
+
const recording = this.list().find((value) => value.id === safeId(id));
|
|
30
|
+
if (!recording)
|
|
31
|
+
throw new BrowserError('NOT_FOUND', `Browser recording ${id} does not exist.`);
|
|
32
|
+
return recording;
|
|
33
|
+
}
|
|
34
|
+
async start(input) {
|
|
35
|
+
if (this.active.has(input.sessionId) || this.activeRecordings().some((value) => value.sessionId === input.sessionId)) {
|
|
36
|
+
throw new BrowserError('CONFLICT', `Session ${input.sessionId} already has an active recording.`);
|
|
37
|
+
}
|
|
38
|
+
const context = input.context || {};
|
|
39
|
+
const session = this.browser.getSession(input.sessionId);
|
|
40
|
+
if (!session.capabilities.includes('recording')) {
|
|
41
|
+
throw new BrowserError('CAPABILITY_UNSUPPORTED', `${session.backend} cannot record page imagery.`);
|
|
42
|
+
}
|
|
43
|
+
const driver = this.browser.options.drivers[session.backend];
|
|
44
|
+
if (!driver.startScreencast)
|
|
45
|
+
throw new BrowserError('CAPABILITY_UNSUPPORTED', `${session.backend} cannot record page imagery.`);
|
|
46
|
+
await this.verifyEncoder(context.signal);
|
|
47
|
+
const fps = Math.min(Math.max(Math.round(input.fps || 15), 1), 30);
|
|
48
|
+
const file = await this.artifacts.resolve({
|
|
49
|
+
kind: 'recording',
|
|
50
|
+
name: input.name || input.sessionId,
|
|
51
|
+
extension: 'webm',
|
|
52
|
+
context,
|
|
53
|
+
});
|
|
54
|
+
let pending;
|
|
55
|
+
let acceptFirst;
|
|
56
|
+
const firstFrame = new Promise((resolve) => { acceptFirst = resolve; });
|
|
57
|
+
let encoder;
|
|
58
|
+
const stopSource = await driver.startScreencast({ session, context }, (frame) => {
|
|
59
|
+
pending = frame;
|
|
60
|
+
acceptFirst?.(frame);
|
|
61
|
+
acceptFirst = undefined;
|
|
62
|
+
encoder?.frame(frame);
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
await waitForRecordingFrame(firstFrame, context.signal);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
await deadline(stopSource(), 2_000, 'recording source stop').catch(() => undefined);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
encoder = new WebmEncoder(this.binary, file, fps);
|
|
72
|
+
try {
|
|
73
|
+
await encoder.start();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
await stopSource();
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
if (pending)
|
|
80
|
+
encoder.frame(pending);
|
|
81
|
+
const recording = {
|
|
82
|
+
id: safeId(newId('recording')),
|
|
83
|
+
sessionId: session.id,
|
|
84
|
+
ownerPid: process.pid,
|
|
85
|
+
status: 'active',
|
|
86
|
+
fps,
|
|
87
|
+
createdAt: this.now().toISOString(),
|
|
88
|
+
};
|
|
89
|
+
this.registry.putRecording(recording);
|
|
90
|
+
this.active.set(session.id, { recording, file, encoder, stopSource, context });
|
|
91
|
+
await this.browser.publish({ type: 'recording.started', sessionId: session.id, profileId: session.profileId, recordingId: recording.id });
|
|
92
|
+
return recording;
|
|
93
|
+
}
|
|
94
|
+
async stop(sessionId) {
|
|
95
|
+
const current = this.active.get(sessionId);
|
|
96
|
+
if (!current) {
|
|
97
|
+
const persisted = this.activeRecordings().find((value) => value.sessionId === sessionId);
|
|
98
|
+
if (persisted)
|
|
99
|
+
throw new BrowserError('CONFLICT', `Recording ${persisted.id} belongs to another Browser process.`);
|
|
100
|
+
throw new BrowserError('NOT_FOUND', `Session ${sessionId} has no active recording.`);
|
|
101
|
+
}
|
|
102
|
+
this.active.delete(sessionId);
|
|
103
|
+
await deadline(current.stopSource(), 2_000, 'recording source stop').catch(() => undefined);
|
|
104
|
+
try {
|
|
105
|
+
const result = await current.encoder.stop();
|
|
106
|
+
const artifact = await this.artifacts.inspect(current.file, 'recording', 'video/webm');
|
|
107
|
+
const stopped = {
|
|
108
|
+
...current.recording,
|
|
109
|
+
status: 'stopped',
|
|
110
|
+
stoppedAt: this.now().toISOString(),
|
|
111
|
+
frames: result.frames,
|
|
112
|
+
framesReceived: result.framesReceived,
|
|
113
|
+
skippedTicks: result.skippedTicks,
|
|
114
|
+
videoSeconds: result.videoSeconds,
|
|
115
|
+
wallSeconds: result.wallSeconds,
|
|
116
|
+
artifact,
|
|
117
|
+
...(result.warning ? { warning: result.warning } : {}),
|
|
118
|
+
};
|
|
119
|
+
this.registry.putRecording(stopped);
|
|
120
|
+
await this.browser.publish({
|
|
121
|
+
type: 'recording.stopped', sessionId, profileId: this.browser.getSession(sessionId).profileId,
|
|
122
|
+
recordingId: stopped.id,
|
|
123
|
+
});
|
|
124
|
+
return stopped;
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
await fs.promises.rm(current.file, { force: true });
|
|
128
|
+
const failed = { ...current.recording, status: 'failed', stoppedAt: this.now().toISOString(), warning: error.message };
|
|
129
|
+
this.registry.putRecording(failed);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async forceStop(sessionId) {
|
|
134
|
+
const current = this.active.get(sessionId);
|
|
135
|
+
if (!current) {
|
|
136
|
+
const persisted = this.activeRecordings().find((value) => value.sessionId === sessionId);
|
|
137
|
+
if (persisted)
|
|
138
|
+
throw new BrowserError('CONFLICT', `Recording ${persisted.id} belongs to another Browser process.`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.active.delete(sessionId);
|
|
142
|
+
current.encoder.force();
|
|
143
|
+
await deadline(current.stopSource(), 2_000, 'recording source stop').catch(() => undefined);
|
|
144
|
+
await fs.promises.rm(current.file, { force: true });
|
|
145
|
+
this.registry.putRecording({
|
|
146
|
+
...current.recording,
|
|
147
|
+
status: 'failed',
|
|
148
|
+
stoppedAt: this.now().toISOString(),
|
|
149
|
+
warning: 'Recording was force-stopped.',
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
isActive(sessionId) {
|
|
153
|
+
return this.active.has(sessionId) || this.activeRecordings().some((value) => value.sessionId === sessionId);
|
|
154
|
+
}
|
|
155
|
+
recoverOrphans() {
|
|
156
|
+
for (const recording of this.activeRecordings()) {
|
|
157
|
+
if (recording.ownerPid && pidIsRunning(recording.ownerPid))
|
|
158
|
+
continue;
|
|
159
|
+
this.registry.putRecording({
|
|
160
|
+
...recording,
|
|
161
|
+
status: 'failed',
|
|
162
|
+
stoppedAt: this.now().toISOString(),
|
|
163
|
+
warning: 'Recording owner process ended before the recording stopped.',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async verifyEncoder(signal) {
|
|
168
|
+
const result = await this.launcher.run({
|
|
169
|
+
command: this.binary,
|
|
170
|
+
args: ['-version'],
|
|
171
|
+
cwd: process.cwd(),
|
|
172
|
+
...(signal ? { signal } : {}),
|
|
173
|
+
timeoutMs: 5_000,
|
|
174
|
+
outputLimit: 4_000,
|
|
175
|
+
}).catch((error) => { throw new BrowserError('PROCESS_FAILED', `ffmpeg is unavailable: ${error.message}`); });
|
|
176
|
+
if (result.code !== 0)
|
|
177
|
+
throw new BrowserError('PROCESS_FAILED', 'ffmpeg is unavailable.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/recording/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function waitForRecordingFrame(frame: Promise<Buffer>, signal?: AbortSignal, timeoutMs?: number): Promise<Buffer>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BrowserError } from '../errors.js';
|
|
2
|
+
import { deadline } from '../drivers/cdp/client.js';
|
|
3
|
+
export async function waitForRecordingFrame(frame, signal, timeoutMs = 5_000) {
|
|
4
|
+
if (!signal)
|
|
5
|
+
return deadline(frame, timeoutMs, 'first page recording frame');
|
|
6
|
+
if (signal.aborted)
|
|
7
|
+
throw new BrowserError('ABORTED', 'Recording capture was cancelled.');
|
|
8
|
+
let abort;
|
|
9
|
+
const cancelled = new Promise((_resolve, reject) => {
|
|
10
|
+
abort = () => reject(new BrowserError('ABORTED', 'Recording capture was cancelled.'));
|
|
11
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
12
|
+
});
|
|
13
|
+
try {
|
|
14
|
+
return await deadline(Promise.race([frame, cancelled]), timeoutMs, 'first page recording frame');
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
if (abort)
|
|
18
|
+
signal.removeEventListener('abort', abort);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/recording/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsB,EACtB,MAAoB,EACpB,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;IAC1F,IAAI,KAA+B,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACxD,KAAK,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QAAC,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;IAAC,CAAC;YACjG,CAAC;QAAC,IAAI,KAAK;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAsB,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAqB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BrowserAuthBundle, BrowserLoginSession, BrowserProfile, BrowserRecording, BrowserSession } from './types.js';
|
|
2
|
+
import type { BrowserRegistry, BrowserRegistrySnapshot } from './ports.js';
|
|
3
|
+
export declare class MemoryBrowserRegistry implements BrowserRegistry {
|
|
4
|
+
protected data: BrowserRegistrySnapshot;
|
|
5
|
+
constructor(initial?: BrowserRegistrySnapshot);
|
|
6
|
+
snapshot(): BrowserRegistrySnapshot;
|
|
7
|
+
putProfile(value: BrowserProfile): void;
|
|
8
|
+
deleteProfile(id: string): void;
|
|
9
|
+
putSession(value: BrowserSession): void;
|
|
10
|
+
deleteSession(id: string): void;
|
|
11
|
+
putRecording(value: BrowserRecording): void;
|
|
12
|
+
putAuthBundle(value: BrowserAuthBundle): void;
|
|
13
|
+
deleteAuthBundle(id: string): void;
|
|
14
|
+
putLoginSession(value: BrowserLoginSession): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
function emptySnapshot() {
|
|
2
|
+
return {
|
|
3
|
+
schemaVersion: 1,
|
|
4
|
+
profiles: [],
|
|
5
|
+
sessions: [],
|
|
6
|
+
recordings: [],
|
|
7
|
+
authBundles: [],
|
|
8
|
+
loginSessions: [],
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function replaceById(items, value) {
|
|
12
|
+
return [...items.filter((item) => item.id !== value.id), value]
|
|
13
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
14
|
+
}
|
|
15
|
+
export class MemoryBrowserRegistry {
|
|
16
|
+
data;
|
|
17
|
+
constructor(initial = emptySnapshot()) {
|
|
18
|
+
this.data = structuredClone(initial);
|
|
19
|
+
}
|
|
20
|
+
snapshot() { return structuredClone(this.data); }
|
|
21
|
+
putProfile(value) {
|
|
22
|
+
this.data.profiles = replaceById(this.data.profiles, value);
|
|
23
|
+
}
|
|
24
|
+
deleteProfile(id) {
|
|
25
|
+
this.data.profiles = this.data.profiles.filter((value) => value.id !== id);
|
|
26
|
+
}
|
|
27
|
+
putSession(value) {
|
|
28
|
+
this.data.sessions = replaceById(this.data.sessions, value);
|
|
29
|
+
}
|
|
30
|
+
deleteSession(id) {
|
|
31
|
+
this.data.sessions = this.data.sessions.filter((value) => value.id !== id);
|
|
32
|
+
}
|
|
33
|
+
putRecording(value) {
|
|
34
|
+
this.data.recordings = replaceById(this.data.recordings, value);
|
|
35
|
+
}
|
|
36
|
+
putAuthBundle(value) {
|
|
37
|
+
this.data.authBundles = replaceById(this.data.authBundles, value);
|
|
38
|
+
}
|
|
39
|
+
deleteAuthBundle(id) {
|
|
40
|
+
this.data.authBundles = this.data.authBundles.filter((value) => value.id !== id);
|
|
41
|
+
}
|
|
42
|
+
putLoginSession(value) {
|
|
43
|
+
this.data.loginSessions = replaceById(this.data.loginSessions, value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AASA,SAAS,aAAa;IACpB,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,WAAW,EAAE,EAAE;QACf,aAAa,EAAE,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAA2B,KAAU,EAAE,KAAQ;IACjE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;SAC5D,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,OAAO,qBAAqB;IACtB,IAAI,CAA0B;IAExC,YAAY,UAAmC,aAAa,EAAE;QAC5D,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,KAA8B,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1E,UAAU,CAAC,KAAqB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,aAAa,CAAC,EAAU;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,UAAU,CAAC,KAAqB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,aAAa,CAAC,EAAU;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,YAAY,CAAC,KAAuB;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,aAAa,CAAC,KAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC;IACD,gBAAgB,CAAC,EAAU;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,eAAe,CAAC,KAA0B;QACxC,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BrowserRuntimeSelector } from './ports.js';
|
|
2
|
+
import type { BrowserBackendKind, BrowserHostAdvertisement, BrowserRuntimeContext } from './types.js';
|
|
3
|
+
export declare const ELECTRON_SURFACE_PROTOCOLS: readonly [5, 6];
|
|
4
|
+
export declare function pidIsRunning(pid: number): boolean;
|
|
5
|
+
export declare function bridgeFileCandidates(env?: NodeJS.ProcessEnv): string[];
|
|
6
|
+
export declare function readHostAdvertisement(files?: string[]): BrowserHostAdvertisement | null;
|
|
7
|
+
export declare class DefaultRuntimeSelector implements BrowserRuntimeSelector {
|
|
8
|
+
readonly advertisement: () => BrowserHostAdvertisement | null;
|
|
9
|
+
readonly env: NodeJS.ProcessEnv;
|
|
10
|
+
constructor(advertisement?: () => BrowserHostAdvertisement | null, env?: NodeJS.ProcessEnv);
|
|
11
|
+
select(context: BrowserRuntimeContext): BrowserBackendKind;
|
|
12
|
+
}
|