@wenathlan/saddle 1.8.8 → 1.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -15
- package/dist/adapters/forge.d.ts +17 -0
- package/dist/adapters/forge.d.ts.map +1 -0
- package/dist/adapters/forge.js +19 -0
- package/dist/adapters/forge.js.map +1 -0
- package/dist/adapters/forgejo.d.ts +49 -0
- package/dist/adapters/forgejo.d.ts.map +1 -0
- package/{adapters → dist/adapters}/forgejo.js +1 -1
- package/dist/adapters/forgejo.js.map +1 -0
- package/dist/adapters/github.d.ts +12 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +20 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/gitlab.d.ts +17 -0
- package/dist/adapters/gitlab.d.ts.map +1 -0
- package/dist/adapters/gitlab.js +10 -0
- package/dist/adapters/gitlab.js.map +1 -0
- package/dist/adapters/huggingface.d.ts +17 -0
- package/dist/adapters/huggingface.d.ts.map +1 -0
- package/{adapters → dist/adapters}/huggingface.js +1 -1
- package/dist/adapters/huggingface.js.map +1 -0
- package/dist/adapters/socket.d.ts +11 -0
- package/dist/adapters/socket.d.ts.map +1 -0
- package/dist/adapters/socket.js +17 -0
- package/dist/adapters/socket.js.map +1 -0
- package/dist/adapters/transport.d.ts +7 -0
- package/dist/adapters/transport.d.ts.map +1 -0
- package/dist/adapters/transport.js +36 -0
- package/dist/adapters/transport.js.map +1 -0
- package/dist/ai/chunk.d.ts +2 -0
- package/dist/ai/chunk.d.ts.map +1 -0
- package/dist/ai/chunk.js +36 -0
- package/dist/ai/chunk.js.map +1 -0
- package/dist/ai/llmstxt.d.ts +6 -0
- package/dist/ai/llmstxt.d.ts.map +1 -0
- package/dist/ai/llmstxt.js +12 -0
- package/dist/ai/llmstxt.js.map +1 -0
- package/dist/ai/provenance.d.ts +22 -0
- package/dist/ai/provenance.d.ts.map +1 -0
- package/dist/ai/provenance.js +25 -0
- package/dist/ai/provenance.js.map +1 -0
- package/dist/ai/rag.d.ts +26 -0
- package/dist/ai/rag.d.ts.map +1 -0
- package/dist/ai/rag.js +22 -0
- package/dist/ai/rag.js.map +1 -0
- package/dist/ai/tokens.d.ts +15 -0
- package/dist/ai/tokens.d.ts.map +1 -0
- package/{ai → dist/ai}/tokens.js +1 -1
- package/dist/ai/tokens.js.map +1 -0
- package/dist/api/auth.d.ts +16 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +19 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/contracts.d.ts +28 -0
- package/dist/api/contracts.d.ts.map +1 -0
- package/{api → dist/api}/contracts.js +3 -6
- package/dist/api/contracts.js.map +1 -0
- package/dist/api/control.d.ts +10 -0
- package/dist/api/control.d.ts.map +1 -0
- package/dist/api/control.js +35 -0
- package/dist/api/control.js.map +1 -0
- package/dist/api/http.d.ts +7 -0
- package/dist/api/http.d.ts.map +1 -0
- package/{api → dist/api}/http.js +5 -5
- package/dist/api/http.js.map +1 -0
- package/dist/api/rate.d.ts +28 -0
- package/dist/api/rate.d.ts.map +1 -0
- package/dist/api/rate.js +36 -0
- package/dist/api/rate.js.map +1 -0
- package/dist/api/security.d.ts +12 -0
- package/dist/api/security.d.ts.map +1 -0
- package/dist/api/security.js +56 -0
- package/dist/api/security.js.map +1 -0
- package/dist/api/service.d.ts +5 -0
- package/dist/api/service.d.ts.map +1 -0
- package/dist/api/service.js +70 -0
- package/dist/api/service.js.map +1 -0
- package/dist/apps/registry.d.ts +33 -0
- package/dist/apps/registry.d.ts.map +1 -0
- package/dist/apps/registry.js +24 -0
- package/dist/apps/registry.js.map +1 -0
- package/dist/binary/build.d.ts +29 -0
- package/dist/binary/build.d.ts.map +1 -0
- package/dist/binary/build.js +17 -0
- package/dist/binary/build.js.map +1 -0
- package/dist/bot/adapter.d.ts +5 -0
- package/dist/bot/adapter.d.ts.map +1 -0
- package/dist/bot/adapter.js +11 -0
- package/dist/bot/adapter.js.map +1 -0
- package/dist/bot/bot.d.ts +28 -0
- package/dist/bot/bot.d.ts.map +1 -0
- package/dist/bot/bot.js +52 -0
- package/dist/bot/bot.js.map +1 -0
- package/dist/bot/commands.d.ts +8 -0
- package/dist/bot/commands.d.ts.map +1 -0
- package/dist/bot/commands.js +19 -0
- package/dist/bot/commands.js.map +1 -0
- package/dist/bot/permissions.d.ts +13 -0
- package/dist/bot/permissions.d.ts.map +1 -0
- package/dist/bot/permissions.js +16 -0
- package/dist/bot/permissions.js.map +1 -0
- package/dist/browser/actions.d.ts +33 -0
- package/dist/browser/actions.d.ts.map +1 -0
- package/dist/browser/actions.js +44 -0
- package/dist/browser/actions.js.map +1 -0
- package/dist/browser/agent.d.ts +21 -0
- package/dist/browser/agent.d.ts.map +1 -0
- package/dist/browser/agent.js +13 -0
- package/dist/browser/agent.js.map +1 -0
- package/dist/browser/context.d.ts +43 -0
- package/dist/browser/context.d.ts.map +1 -0
- package/dist/browser/context.js +54 -0
- package/dist/browser/context.js.map +1 -0
- package/dist/browser/fingerprint.d.ts +4 -0
- package/dist/browser/fingerprint.d.ts.map +1 -0
- package/{browser → dist/browser}/fingerprint.js +4 -4
- package/dist/browser/fingerprint.js.map +1 -0
- package/dist/browser/index.d.ts +11 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/{browser → dist/browser}/index.js +1 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/playwright.d.ts +11 -0
- package/dist/browser/playwright.d.ts.map +1 -0
- package/dist/browser/playwright.js +24 -0
- package/dist/browser/playwright.js.map +1 -0
- package/dist/browser/recorder.d.ts +27 -0
- package/dist/browser/recorder.d.ts.map +1 -0
- package/dist/browser/recorder.js +22 -0
- package/dist/browser/recorder.js.map +1 -0
- package/dist/browser/session.d.ts +14 -0
- package/dist/browser/session.d.ts.map +1 -0
- package/dist/browser/session.js +21 -0
- package/dist/browser/session.js.map +1 -0
- package/dist/browser/snapshot.d.ts +57 -0
- package/dist/browser/snapshot.d.ts.map +1 -0
- package/dist/browser/snapshot.js +57 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/captcha/contract.d.ts +35 -0
- package/dist/captcha/contract.d.ts.map +1 -0
- package/dist/captcha/contract.js +17 -0
- package/dist/captcha/contract.js.map +1 -0
- package/dist/captcha/evidence.d.ts +10 -0
- package/dist/captcha/evidence.d.ts.map +1 -0
- package/dist/captcha/evidence.js +9 -0
- package/dist/captcha/evidence.js.map +1 -0
- package/dist/captcha/guard.d.ts +23 -0
- package/dist/captcha/guard.d.ts.map +1 -0
- package/dist/captcha/guard.js +12 -0
- package/dist/captcha/guard.js.map +1 -0
- package/dist/cli/main.d.ts +4 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +46 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/errors.d.ts +84 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +54 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +9 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +21 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/hash.d.ts +10 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +82 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/ids.d.ts +10 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/ids.js +15 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/deploy/index.d.ts +6 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +6 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/dispatch/resumable.d.ts +85 -0
- package/dist/dispatch/resumable.d.ts.map +1 -0
- package/dist/dispatch/resumable.js +39 -0
- package/dist/dispatch/resumable.js.map +1 -0
- package/dist/dispatch/workflow.d.ts +6 -0
- package/dist/dispatch/workflow.d.ts.map +1 -0
- package/dist/dispatch/workflow.js +37 -0
- package/dist/dispatch/workflow.js.map +1 -0
- package/dist/domain/artifacts.d.ts +12 -0
- package/dist/domain/artifacts.d.ts.map +1 -0
- package/dist/domain/artifacts.js +14 -0
- package/dist/domain/artifacts.js.map +1 -0
- package/dist/domain/jobs.d.ts +12 -0
- package/dist/domain/jobs.d.ts.map +1 -0
- package/dist/domain/jobs.js +20 -0
- package/dist/domain/jobs.js.map +1 -0
- package/dist/domain/providers.d.ts +10 -0
- package/dist/domain/providers.d.ts.map +1 -0
- package/{domain → dist/domain}/providers.js +2 -2
- package/dist/domain/providers.js.map +1 -0
- package/dist/domain/runtime.d.ts +14 -0
- package/dist/domain/runtime.d.ts.map +1 -0
- package/{domain → dist/domain}/runtime.js +3 -3
- package/dist/domain/runtime.js.map +1 -0
- package/dist/domain/sessions.d.ts +12 -0
- package/dist/domain/sessions.d.ts.map +1 -0
- package/dist/domain/sessions.js +57 -0
- package/dist/domain/sessions.js.map +1 -0
- package/dist/examples/localjob.d.ts +2 -0
- package/dist/examples/localjob.d.ts.map +1 -0
- package/{examples → dist/examples}/localjob.js +1 -1
- package/dist/examples/localjob.js.map +1 -0
- package/dist/examples/publicapi.d.ts +2 -0
- package/dist/examples/publicapi.d.ts.map +1 -0
- package/{examples → dist/examples}/publicapi.js +1 -1
- package/dist/examples/publicapi.js.map +1 -0
- package/dist/extension/build.d.ts +9 -0
- package/dist/extension/build.d.ts.map +1 -0
- package/dist/extension/build.js +61 -0
- package/dist/extension/build.js.map +1 -0
- package/dist/extension/content.d.ts +6 -0
- package/dist/extension/content.d.ts.map +1 -0
- package/dist/extension/content.js +135 -0
- package/dist/extension/content.js.map +1 -0
- package/dist/extension/index.d.ts +7 -0
- package/dist/extension/index.d.ts.map +1 -0
- package/{extension → dist/extension}/index.js +1 -0
- package/dist/extension/index.js.map +1 -0
- package/dist/extension/pagebridge.d.ts +6 -0
- package/dist/extension/pagebridge.d.ts.map +1 -0
- package/dist/extension/pagebridge.js +42 -0
- package/dist/extension/pagebridge.js.map +1 -0
- package/dist/extension/permissions.d.ts +26 -0
- package/dist/extension/permissions.d.ts.map +1 -0
- package/dist/extension/permissions.js +28 -0
- package/dist/extension/permissions.js.map +1 -0
- package/dist/extension/popup.d.ts +5 -0
- package/dist/extension/popup.d.ts.map +1 -0
- package/dist/extension/popup.js +26 -0
- package/dist/extension/popup.js.map +1 -0
- package/dist/extension/protocol.d.ts +58 -0
- package/dist/extension/protocol.d.ts.map +1 -0
- package/dist/extension/protocol.js +101 -0
- package/dist/extension/protocol.js.map +1 -0
- package/dist/extension/serviceworker.d.ts +25 -0
- package/dist/extension/serviceworker.d.ts.map +1 -0
- package/dist/extension/serviceworker.js +102 -0
- package/dist/extension/serviceworker.js.map +1 -0
- package/dist/extension/worker.d.ts +28 -0
- package/dist/extension/worker.d.ts.map +1 -0
- package/dist/extension/worker.js +22 -0
- package/dist/extension/worker.js.map +1 -0
- package/dist/format/check.d.ts +8 -0
- package/dist/format/check.d.ts.map +1 -0
- package/dist/format/check.js +38 -0
- package/dist/format/check.js.map +1 -0
- package/dist/index.d.ts +117 -0
- package/dist/index.d.ts.map +1 -0
- package/{index.js → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/library/public.d.ts +53 -0
- package/dist/library/public.d.ts.map +1 -0
- package/dist/library/public.js +83 -0
- package/dist/library/public.js.map +1 -0
- package/dist/mcp/browser.d.ts +9 -0
- package/dist/mcp/browser.d.ts.map +1 -0
- package/dist/mcp/browser.js +13 -0
- package/dist/mcp/browser.js.map +1 -0
- package/dist/mcp/server.d.ts +35 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +40 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/transport.d.ts +7 -0
- package/dist/mcp/transport.d.ts.map +1 -0
- package/dist/mcp/transport.js +17 -0
- package/dist/mcp/transport.js.map +1 -0
- package/dist/memory/bridge.d.ts +14 -0
- package/dist/memory/bridge.d.ts.map +1 -0
- package/dist/memory/bridge.js +16 -0
- package/dist/memory/bridge.js.map +1 -0
- package/dist/memory/engine.d.ts +28 -0
- package/dist/memory/engine.d.ts.map +1 -0
- package/dist/memory/engine.js +59 -0
- package/dist/memory/engine.js.map +1 -0
- package/dist/memory/modes.d.ts +43 -0
- package/dist/memory/modes.d.ts.map +1 -0
- package/dist/memory/modes.js +66 -0
- package/dist/memory/modes.js.map +1 -0
- package/dist/memory/objects.d.ts +21 -0
- package/dist/memory/objects.d.ts.map +1 -0
- package/dist/memory/objects.js +20 -0
- package/dist/memory/objects.js.map +1 -0
- package/dist/memory/targets.d.ts +78 -0
- package/dist/memory/targets.d.ts.map +1 -0
- package/dist/memory/targets.js +29 -0
- package/dist/memory/targets.js.map +1 -0
- package/dist/memory/transforms.d.ts +19 -0
- package/dist/memory/transforms.d.ts.map +1 -0
- package/dist/memory/transforms.js +14 -0
- package/dist/memory/transforms.js.map +1 -0
- package/dist/modes/matrix.d.ts +23 -0
- package/dist/modes/matrix.d.ts.map +1 -0
- package/{modes → dist/modes}/matrix.js +8 -10
- package/dist/modes/matrix.js.map +1 -0
- package/dist/modes/modes.d.ts +33 -0
- package/dist/modes/modes.d.ts.map +1 -0
- package/{modes → dist/modes}/modes.js +3 -4
- package/dist/modes/modes.js.map +1 -0
- package/dist/modes/resolve.d.ts +41 -0
- package/dist/modes/resolve.d.ts.map +1 -0
- package/dist/modes/resolve.js +39 -0
- package/dist/modes/resolve.js.map +1 -0
- package/dist/observability/metrics.d.ts +14 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +18 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/packager/manifest.d.ts +49 -0
- package/dist/packager/manifest.d.ts.map +1 -0
- package/dist/packager/manifest.js +49 -0
- package/dist/packager/manifest.js.map +1 -0
- package/dist/packager/publish.d.ts +51 -0
- package/dist/packager/publish.d.ts.map +1 -0
- package/dist/packager/publish.js +18 -0
- package/dist/packager/publish.js.map +1 -0
- package/dist/packager/targetcli.d.ts +7 -0
- package/dist/packager/targetcli.d.ts.map +1 -0
- package/dist/packager/targetcli.js +22 -0
- package/dist/packager/targetcli.js.map +1 -0
- package/dist/persistence/adapter.d.ts +5 -0
- package/dist/persistence/adapter.d.ts.map +1 -0
- package/dist/persistence/adapter.js +11 -0
- package/dist/persistence/adapter.js.map +1 -0
- package/dist/persistence/drizzle.d.ts +2 -0
- package/dist/persistence/drizzle.d.ts.map +1 -0
- package/dist/persistence/drizzle.js +12 -0
- package/dist/persistence/drizzle.js.map +1 -0
- package/dist/persistence/memory.d.ts +2 -0
- package/dist/persistence/memory.d.ts.map +1 -0
- package/dist/persistence/memory.js +27 -0
- package/dist/persistence/memory.js.map +1 -0
- package/dist/persistence/migrations.d.ts +19 -0
- package/dist/persistence/migrations.d.ts.map +1 -0
- package/{persistence → dist/persistence}/migrations.js +4 -5
- package/dist/persistence/migrations.js.map +1 -0
- package/dist/persistence/prisma.d.ts +2 -0
- package/dist/persistence/prisma.d.ts.map +1 -0
- package/dist/persistence/prisma.js +25 -0
- package/dist/persistence/prisma.js.map +1 -0
- package/dist/persistence/schema.d.ts +63 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +28 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/sql.d.ts +3 -0
- package/dist/persistence/sql.d.ts.map +1 -0
- package/dist/persistence/sql.js +37 -0
- package/dist/persistence/sql.js.map +1 -0
- package/dist/protocol/blocks.d.ts +10 -0
- package/dist/protocol/blocks.d.ts.map +1 -0
- package/dist/protocol/blocks.js +26 -0
- package/dist/protocol/blocks.js.map +1 -0
- package/dist/protocol/json.d.ts +6 -0
- package/dist/protocol/json.d.ts.map +1 -0
- package/{protocol → dist/protocol}/json.js +1 -0
- package/dist/protocol/json.js.map +1 -0
- package/dist/protocol/ndjson.d.ts +3 -0
- package/dist/protocol/ndjson.d.ts.map +1 -0
- package/dist/protocol/ndjson.js +20 -0
- package/dist/protocol/ndjson.js.map +1 -0
- package/dist/protocol/sse.d.ts +7 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +25 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/proxy/pool.d.ts +9 -0
- package/dist/proxy/pool.d.ts.map +1 -0
- package/dist/proxy/pool.js +27 -0
- package/dist/proxy/pool.js.map +1 -0
- package/dist/queue/idempotency.d.ts +10 -0
- package/dist/queue/idempotency.d.ts.map +1 -0
- package/dist/queue/idempotency.js +13 -0
- package/dist/queue/idempotency.js.map +1 -0
- package/dist/queue/persistent.d.ts +13 -0
- package/dist/queue/persistent.d.ts.map +1 -0
- package/dist/queue/persistent.js +49 -0
- package/dist/queue/persistent.js.map +1 -0
- package/dist/queue/queue.d.ts +7 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +55 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/saga.d.ts +5 -0
- package/dist/queue/saga.d.ts.map +1 -0
- package/dist/queue/saga.js +20 -0
- package/dist/queue/saga.js.map +1 -0
- package/dist/release/assets.d.ts +118 -0
- package/dist/release/assets.d.ts.map +1 -0
- package/dist/release/assets.js +69 -0
- package/dist/release/assets.js.map +1 -0
- package/dist/runners/health.d.ts +36 -0
- package/dist/runners/health.d.ts.map +1 -0
- package/dist/runners/health.js +26 -0
- package/dist/runners/health.js.map +1 -0
- package/dist/runners/heartbeat.d.ts +23 -0
- package/dist/runners/heartbeat.d.ts.map +1 -0
- package/dist/runners/heartbeat.js +29 -0
- package/dist/runners/heartbeat.js.map +1 -0
- package/dist/runners/inprocess.d.ts +17 -0
- package/dist/runners/inprocess.d.ts.map +1 -0
- package/dist/runners/inprocess.js +20 -0
- package/dist/runners/inprocess.js.map +1 -0
- package/dist/runners/scheduler.d.ts +5 -0
- package/dist/runners/scheduler.d.ts.map +1 -0
- package/dist/runners/scheduler.js +19 -0
- package/dist/runners/scheduler.js.map +1 -0
- package/dist/runtime/abort.d.ts +8 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/abort.js +13 -0
- package/dist/runtime/abort.js.map +1 -0
- package/dist/runtime/compatibility.d.ts +37 -0
- package/dist/runtime/compatibility.d.ts.map +1 -0
- package/{runtime → dist/runtime}/compatibility.js +1 -4
- package/dist/runtime/compatibility.js.map +1 -0
- package/dist/runtime/detect.d.ts +13 -0
- package/dist/runtime/detect.d.ts.map +1 -0
- package/dist/runtime/detect.js +18 -0
- package/dist/runtime/detect.js.map +1 -0
- package/dist/runtime/engine.d.ts +20 -0
- package/dist/runtime/engine.d.ts.map +1 -0
- package/dist/runtime/engine.js +61 -0
- package/dist/runtime/engine.js.map +1 -0
- package/dist/runtime/retry.d.ts +19 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +54 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/worker.d.ts +10 -0
- package/dist/runtime/worker.d.ts.map +1 -0
- package/dist/runtime/worker.js +25 -0
- package/dist/runtime/worker.js.map +1 -0
- package/dist/scrape/cache.d.ts +45 -0
- package/dist/scrape/cache.d.ts.map +1 -0
- package/dist/scrape/cache.js +45 -0
- package/dist/scrape/cache.js.map +1 -0
- package/dist/scrape/crawl.d.ts +47 -0
- package/dist/scrape/crawl.d.ts.map +1 -0
- package/dist/scrape/crawl.js +114 -0
- package/dist/scrape/crawl.js.map +1 -0
- package/dist/scrape/extract.d.ts +63 -0
- package/dist/scrape/extract.d.ts.map +1 -0
- package/dist/scrape/extract.js +47 -0
- package/dist/scrape/extract.js.map +1 -0
- package/dist/scrape/normalize.d.ts +52 -0
- package/dist/scrape/normalize.d.ts.map +1 -0
- package/dist/scrape/normalize.js +102 -0
- package/dist/scrape/normalize.js.map +1 -0
- package/dist/scrape/robots.d.ts +37 -0
- package/dist/scrape/robots.d.ts.map +1 -0
- package/dist/scrape/robots.js +71 -0
- package/dist/scrape/robots.js.map +1 -0
- package/dist/scrape/schema.d.ts +5 -0
- package/dist/scrape/schema.d.ts.map +1 -0
- package/dist/scrape/schema.js +25 -0
- package/dist/scrape/schema.js.map +1 -0
- package/dist/scrape/scraper.d.ts +6 -0
- package/dist/scrape/scraper.d.ts.map +1 -0
- package/dist/scrape/scraper.js +46 -0
- package/dist/scrape/scraper.js.map +1 -0
- package/dist/scrape/semantic.d.ts +25 -0
- package/dist/scrape/semantic.d.ts.map +1 -0
- package/dist/scrape/semantic.js +27 -0
- package/dist/scrape/semantic.js.map +1 -0
- package/dist/server/node.d.ts +7 -0
- package/dist/server/node.d.ts.map +1 -0
- package/dist/server/node.js +38 -0
- package/dist/server/node.js.map +1 -0
- package/dist/sessions/file.d.ts +25 -0
- package/dist/sessions/file.d.ts.map +1 -0
- package/dist/sessions/file.js +13 -0
- package/dist/sessions/file.js.map +1 -0
- package/dist/sessions/replay.d.ts +9 -0
- package/dist/sessions/replay.d.ts.map +1 -0
- package/dist/sessions/replay.js +70 -0
- package/dist/sessions/replay.js.map +1 -0
- package/dist/sessions/store.d.ts +25 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +13 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/storage/adapter.d.ts +5 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +11 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/cache.d.ts +23 -0
- package/dist/storage/cache.d.ts.map +1 -0
- package/dist/storage/cache.js +79 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/checksum.d.ts +3 -0
- package/dist/storage/checksum.d.ts.map +1 -0
- package/dist/storage/checksum.js +19 -0
- package/dist/storage/checksum.js.map +1 -0
- package/dist/storage/chunked.d.ts +21 -0
- package/dist/storage/chunked.d.ts.map +1 -0
- package/dist/storage/chunked.js +67 -0
- package/dist/storage/chunked.js.map +1 -0
- package/dist/storage/content.d.ts +24 -0
- package/dist/storage/content.d.ts.map +1 -0
- package/dist/storage/content.js +44 -0
- package/dist/storage/content.js.map +1 -0
- package/dist/storage/filehosting.d.ts +2 -0
- package/dist/storage/filehosting.d.ts.map +1 -0
- package/dist/storage/filehosting.js +24 -0
- package/dist/storage/filehosting.js.map +1 -0
- package/dist/storage/githubcontents.d.ts +2 -0
- package/dist/storage/githubcontents.d.ts.map +1 -0
- package/dist/storage/githubcontents.js +29 -0
- package/dist/storage/githubcontents.js.map +1 -0
- package/dist/storage/index.d.ts +11 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/{storage → dist/storage}/index.js +1 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +2 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +72 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/memory.d.ts +6 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +36 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/s3compatible.d.ts +2 -0
- package/dist/storage/s3compatible.d.ts.map +1 -0
- package/dist/storage/s3compatible.js +31 -0
- package/dist/storage/s3compatible.js.map +1 -0
- package/dist/storage/sync.d.ts +47 -0
- package/dist/storage/sync.d.ts.map +1 -0
- package/dist/storage/sync.js +75 -0
- package/dist/storage/sync.js.map +1 -0
- package/dist/surfaces/adapters.d.ts +97 -0
- package/dist/surfaces/adapters.d.ts.map +1 -0
- package/dist/surfaces/adapters.js +50 -0
- package/dist/surfaces/adapters.js.map +1 -0
- package/dist/surfaces/controls.d.ts +18 -0
- package/dist/surfaces/controls.d.ts.map +1 -0
- package/dist/surfaces/controls.js +45 -0
- package/dist/surfaces/controls.js.map +1 -0
- package/dist/surfaces/manifest.d.ts +68 -0
- package/dist/surfaces/manifest.d.ts.map +1 -0
- package/dist/surfaces/manifest.js +42 -0
- package/dist/surfaces/manifest.js.map +1 -0
- package/dist/surfaces/n8n.d.ts +25 -0
- package/dist/surfaces/n8n.d.ts.map +1 -0
- package/dist/surfaces/n8n.js +31 -0
- package/dist/surfaces/n8n.js.map +1 -0
- package/dist/surfaces/operations.d.ts +32 -0
- package/dist/surfaces/operations.d.ts.map +1 -0
- package/dist/surfaces/operations.js +53 -0
- package/dist/surfaces/operations.js.map +1 -0
- package/dist/surfaces/targets.d.ts +196 -0
- package/dist/surfaces/targets.d.ts.map +1 -0
- package/dist/surfaces/targets.js +27 -0
- package/dist/surfaces/targets.js.map +1 -0
- package/dist/webhook/delivery.d.ts +18 -0
- package/dist/webhook/delivery.d.ts.map +1 -0
- package/dist/webhook/delivery.js +36 -0
- package/dist/webhook/delivery.js.map +1 -0
- package/dist/webhook/receiver.d.ts +26 -0
- package/dist/webhook/receiver.d.ts.map +1 -0
- package/dist/webhook/receiver.js +24 -0
- package/dist/webhook/receiver.js.map +1 -0
- package/dist/webhook/signature.d.ts +3 -0
- package/dist/webhook/signature.d.ts.map +1 -0
- package/{webhook → dist/webhook}/signature.js +1 -1
- package/dist/webhook/signature.js.map +1 -0
- package/dist/workflow/manifest.d.ts +21 -0
- package/dist/workflow/manifest.d.ts.map +1 -0
- package/dist/workflow/manifest.js +20 -0
- package/dist/workflow/manifest.js.map +1 -0
- package/dist/workflow/registry.d.ts +7 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +18 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/templates.d.ts +6 -0
- package/dist/workflow/templates.d.ts.map +1 -0
- package/dist/workflow/templates.js +18 -0
- package/dist/workflow/templates.js.map +1 -0
- package/dist/workflow/triggers.d.ts +36 -0
- package/dist/workflow/triggers.d.ts.map +1 -0
- package/dist/workflow/triggers.js +33 -0
- package/dist/workflow/triggers.js.map +1 -0
- package/docs/enginearchitecture.md +2 -2
- package/docs/gapmatrix.md +2 -2
- package/docs/libraryapi.md +1 -1
- package/docs/release.md +5 -5
- package/docs/releaseassets.md +1 -1
- package/docs/reorganization-1.8.9.md +28 -0
- package/docs/toolchainresearch-1.8.9.md +18 -0
- package/extension/manifest.json +1 -1
- package/package.json +61 -88
- package/adapters/forge.js +0 -16
- package/adapters/github.js +0 -19
- package/adapters/gitlab.js +0 -10
- package/adapters/socket.js +0 -14
- package/adapters/transport.js +0 -30
- package/ai/chunk.js +0 -22
- package/ai/llmstxt.js +0 -12
- package/ai/provenance.js +0 -18
- package/ai/rag.js +0 -14
- package/api/auth.js +0 -13
- package/api/control.js +0 -33
- package/api/rate.js +0 -31
- package/api/security.js +0 -42
- package/api/service.js +0 -36
- package/binary/build.js +0 -17
- package/bot/adapter.js +0 -8
- package/bot/bot.js +0 -39
- package/bot/commands.js +0 -18
- package/bot/permissions.js +0 -16
- package/browser/actions.js +0 -33
- package/browser/agent.js +0 -9
- package/browser/context.js +0 -52
- package/browser/playwright.js +0 -22
- package/browser/recorder.js +0 -21
- package/browser/session.js +0 -19
- package/browser/snapshot.js +0 -57
- package/captcha/contract.js +0 -15
- package/captcha/evidence.js +0 -9
- package/captcha/guard.js +0 -10
- package/cli/main.js +0 -36
- package/core/errors.js +0 -57
- package/core/events.js +0 -21
- package/core/hash.js +0 -73
- package/core/ids.js +0 -15
- package/dispatch/resumable.js +0 -31
- package/dispatch/workflow.js +0 -33
- package/domain/artifacts.js +0 -13
- package/domain/jobs.js +0 -20
- package/domain/sessions.js +0 -46
- package/extension/build.js +0 -46
- package/extension/content.js +0 -127
- package/extension/pagebridge.js +0 -41
- package/extension/permissions.js +0 -22
- package/extension/popup.css +0 -13
- package/extension/popup.html +0 -24
- package/extension/popup.js +0 -25
- package/extension/protocol.js +0 -95
- package/extension/serviceworker.js +0 -109
- package/extension/worker.js +0 -22
- package/format/check.js +0 -21
- package/library/public.js +0 -85
- package/mcp/browser.js +0 -12
- package/mcp/server.js +0 -28
- package/mcp/transport.js +0 -14
- package/memory/bridge.js +0 -16
- package/memory/engine.js +0 -45
- package/memory/modes.js +0 -55
- package/memory/objects.js +0 -18
- package/memory/targets.js +0 -21
- package/memory/transforms.js +0 -15
- package/modes/resolve.js +0 -39
- package/packager/manifest.js +0 -28
- package/packager/publish.js +0 -15
- package/persistence/adapter.js +0 -8
- package/persistence/drizzle.js +0 -10
- package/persistence/memory.js +0 -26
- package/persistence/prisma.js +0 -23
- package/persistence/schema.js +0 -29
- package/persistence/sql.js +0 -30
- package/protocol/blocks.js +0 -18
- package/protocol/ndjson.js +0 -17
- package/protocol/sse.js +0 -22
- package/proxy/pool.js +0 -12
- package/queue/idempotency.js +0 -12
- package/queue/persistent.js +0 -44
- package/queue/queue.js +0 -50
- package/queue/saga.js +0 -13
- package/release/assets.js +0 -70
- package/runners/health.js +0 -23
- package/runners/heartbeat.js +0 -26
- package/runners/inprocess.js +0 -19
- package/runners/scheduler.js +0 -16
- package/runtime/abort.js +0 -10
- package/runtime/detect.js +0 -14
- package/runtime/engine.js +0 -56
- package/runtime/retry.js +0 -27
- package/runtime/worker.js +0 -18
- package/scrape/agent.ts +0 -122
- package/scrape/batch.ts +0 -79
- package/scrape/biome.json +0 -76
- package/scrape/browser.ts +0 -222
- package/scrape/cache.js +0 -14
- package/scrape/cache.ts +0 -84
- package/scrape/chunking.ts +0 -193
- package/scrape/cli.ts +0 -105
- package/scrape/crawl.js +0 -104
- package/scrape/crawler.ts +0 -115
- package/scrape/dev-server.ts +0 -94
- package/scrape/errors.ts +0 -132
- package/scrape/events.ts +0 -26
- package/scrape/extract.js +0 -14
- package/scrape/extract.ts +0 -165
- package/scrape/fetch.ts +0 -105
- package/scrape/formats.ts +0 -85
- package/scrape/headers.ts +0 -71
- package/scrape/index.ts +0 -92
- package/scrape/jsdom.d.ts +0 -6
- package/scrape/llms-txt.ts +0 -84
- package/scrape/middleware.ts +0 -90
- package/scrape/normalize.js +0 -86
- package/scrape/pool.ts +0 -95
- package/scrape/port.ts +0 -18
- package/scrape/proxy.ts +0 -103
- package/scrape/rate-limiter.ts +0 -95
- package/scrape/renderer.ts +0 -194
- package/scrape/retry.ts +0 -64
- package/scrape/robots.js +0 -32
- package/scrape/robots.ts +0 -137
- package/scrape/schema.js +0 -21
- package/scrape/scrape.ts +0 -123
- package/scrape/scraper.js +0 -40
- package/scrape/semantic.js +0 -22
- package/scrape/serialize.ts +0 -310
- package/scrape/server.ts +0 -137
- package/scrape/session.ts +0 -109
- package/scrape/sitemap.ts +0 -131
- package/scrape/tokens.ts +0 -45
- package/scrape/tsconfig.json +0 -28
- package/scrape/types.ts +0 -214
- package/scrape/utils.ts +0 -77
- package/scrape/vite.config.ts +0 -55
- package/scrape/vitest.config.ts +0 -17
- package/server/node.js +0 -34
- package/sessions/file.js +0 -13
- package/sessions/replay.js +0 -61
- package/sessions/store.js +0 -13
- package/storage/adapter.js +0 -8
- package/storage/cache.js +0 -54
- package/storage/checksum.js +0 -17
- package/storage/chunked.js +0 -58
- package/storage/content.js +0 -42
- package/storage/filehosting.js +0 -17
- package/storage/githubcontents.js +0 -18
- package/storage/local.js +0 -35
- package/storage/memory.js +0 -28
- package/storage/s3compatible.js +0 -23
- package/storage/sync.js +0 -55
- package/surfaces/adapters.js +0 -48
- package/surfaces/controls.js +0 -37
- package/surfaces/manifest.js +0 -25
- package/surfaces/n8n.js +0 -24
- package/surfaces/operations.js +0 -43
- package/surfaces/targets.js +0 -16
- package/webhook/delivery.js +0 -26
- package/webhook/receiver.js +0 -20
- package/workflow/manifest.js +0 -20
- package/workflow/registry.js +0 -16
- package/workflow/templates.js +0 -18
- package/workflow/triggers.js +0 -31
package/scrape/index.ts
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
// ─── Core Scraping ───
|
|
2
|
-
export { AgentBrowser, createBrowser } from './browser.js';
|
|
3
|
-
export { scrapeUrl, scrapeHtml, scrapeWithBrowser } from './scrape.js';
|
|
4
|
-
export { extractContent, extractReadable } from './extract.js';
|
|
5
|
-
export type { ExtractedContent } from './extract.js';
|
|
6
|
-
export { fetchHtml, fetchAndParse, detectRenderingMode } from './fetch.js';
|
|
7
|
-
export type { FetchResult } from './fetch.js';
|
|
8
|
-
|
|
9
|
-
// ─── Serialization ───
|
|
10
|
-
export { serializeResult, serializeHtml } from './serialize.js';
|
|
11
|
-
export { resolveFormat, formatFromExtension, extensionForFormat, buildSerializeOptions, convertResult } from './formats.js';
|
|
12
|
-
|
|
13
|
-
// ─── Renderer ───
|
|
14
|
-
export { PygameRenderer, createRenderer } from './renderer.js';
|
|
15
|
-
|
|
16
|
-
// ─── AI/LLM ───
|
|
17
|
-
export { formatForAgent, buildContext } from './agent.js';
|
|
18
|
-
export { estimateTokens, countTokens, fitsInContext, truncateToTokens, tokenCost } from './tokens.js';
|
|
19
|
-
export type { ModelType } from './tokens.js';
|
|
20
|
-
export { chunkMarkdown, chunkText, formatChunksForRAG } from './chunking.js';
|
|
21
|
-
export type { Chunk, ChunkOptions } from './chunking.js';
|
|
22
|
-
export { generateLlmsTxt, generateLlmsFullTxt } from './llms-txt.js';
|
|
23
|
-
export type { LlmsTxtOptions } from './llms-txt.js';
|
|
24
|
-
|
|
25
|
-
// ─── Infrastructure ───
|
|
26
|
-
export { WebScrapeError, ValidationError, TimeoutError, BlockedError, RateLimitError, ProxyError, ParseError, AuthError, NetworkError, BrowserNotAvailableError } from './errors.js';
|
|
27
|
-
export type { ErrorCode } from './errors.js';
|
|
28
|
-
export { createEventEmitter, globalEmitter } from './events.js';
|
|
29
|
-
export type { WebScrapeEvents, EventEmitter } from './events.js';
|
|
30
|
-
export { withRetry, isRetryableError, AbortError } from './retry.js';
|
|
31
|
-
export { RateLimiter, createRateLimiter } from './rate-limiter.js';
|
|
32
|
-
export type { RateLimiterConfig } from './rate-limiter.js';
|
|
33
|
-
export { ProxyPool, createProxyPool } from './proxy.js';
|
|
34
|
-
export type { ProxyPoolConfig, ProxyRotationStrategy } from './proxy.js';
|
|
35
|
-
export { CookieJar, ScrapingSession, createSession } from './session.js';
|
|
36
|
-
export type { Cookie } from './session.js';
|
|
37
|
-
export { getRandomProfile, getHeaders, mergeHeaders } from './headers.js';
|
|
38
|
-
export type { HeaderProfile } from './headers.js';
|
|
39
|
-
export { WebScrapeCache, createCache } from './cache.js';
|
|
40
|
-
export type { CacheConfig, CacheEntry } from './cache.js';
|
|
41
|
-
export { MiddlewarePipeline, createPipeline, loggingMiddleware, timeoutMiddleware, retryMiddleware } from './middleware.js';
|
|
42
|
-
export type { Middleware, MiddlewareContext, MiddlewareNext } from './middleware.js';
|
|
43
|
-
|
|
44
|
-
// ─── Crawling ───
|
|
45
|
-
export { crawl } from './crawler.js';
|
|
46
|
-
export type { CrawlOptions } from './crawler.js';
|
|
47
|
-
export { fetchSitemap, discoverSitemaps, parseSitemap } from './sitemap.js';
|
|
48
|
-
export type { SitemapUrl, SitemapResult } from './sitemap.js';
|
|
49
|
-
export { fetchRobotsTxt, isAllowed, getCrawlDelay, getSitemaps } from './robots.js';
|
|
50
|
-
export type { RobotsTxt, RobotsDirective } from './robots.js';
|
|
51
|
-
|
|
52
|
-
// ─── Batch & Pool ───
|
|
53
|
-
export { batchScrape, batchScrapeSequential } from './batch.js';
|
|
54
|
-
export type { BatchResult } from './batch.js';
|
|
55
|
-
export { BrowserPool, createPool } from './pool.js';
|
|
56
|
-
export type { PoolConfig } from './pool.js';
|
|
57
|
-
|
|
58
|
-
// ─── Server ───
|
|
59
|
-
export { createServer, app } from './server.js';
|
|
60
|
-
export type { ServerConfig } from './server.js';
|
|
61
|
-
|
|
62
|
-
// ─── Utilities ───
|
|
63
|
-
export { ensureDir, writeOutput, slugify, truncate, chunkText as chunkTextUtil, delay, isValidUrl, normalizeUrl, isInternalUrl } from './utils.js';
|
|
64
|
-
export { randomPort, resetPort } from './utils/port.js';
|
|
65
|
-
|
|
66
|
-
// ─── Types ───
|
|
67
|
-
export {
|
|
68
|
-
ScrapeOptionsSchema,
|
|
69
|
-
BrowserAgentConfigSchema,
|
|
70
|
-
} from './types.js';
|
|
71
|
-
export type {
|
|
72
|
-
ScrapeFormat,
|
|
73
|
-
SerializeTarget,
|
|
74
|
-
ScrapeOptions,
|
|
75
|
-
ScrapeResult,
|
|
76
|
-
PageMetadata,
|
|
77
|
-
LinkInfo,
|
|
78
|
-
ImageInfo,
|
|
79
|
-
TableInfo,
|
|
80
|
-
BrowserAgentConfig,
|
|
81
|
-
ExtractOptions,
|
|
82
|
-
SerializeOptions,
|
|
83
|
-
SerializedOutput,
|
|
84
|
-
AgentOutput,
|
|
85
|
-
RenderOptions,
|
|
86
|
-
ChromeCommand,
|
|
87
|
-
CliOptions,
|
|
88
|
-
RetryConfig,
|
|
89
|
-
ProxyConfig,
|
|
90
|
-
CrawlStats,
|
|
91
|
-
BatchOptions,
|
|
92
|
-
} from './types.js';
|
package/scrape/jsdom.d.ts
DELETED
package/scrape/llms-txt.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import type { ScrapeResult } from './types.js';
|
|
2
|
-
|
|
3
|
-
export interface LlmsTxtOptions {
|
|
4
|
-
siteName?: string;
|
|
5
|
-
description?: string;
|
|
6
|
-
includeOptional?: boolean;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function generateLlmsTxt(
|
|
10
|
-
results: ScrapeResult[],
|
|
11
|
-
options: LlmsTxtOptions = {}
|
|
12
|
-
): string {
|
|
13
|
-
const siteName = options.siteName || results[0]?.metadata?.title || 'Site';
|
|
14
|
-
const description = options.description || results[0]?.metadata?.description || '';
|
|
15
|
-
|
|
16
|
-
const lines: string[] = [];
|
|
17
|
-
lines.push(`# ${siteName}`);
|
|
18
|
-
lines.push('');
|
|
19
|
-
if (description) {
|
|
20
|
-
lines.push(`> ${description}`);
|
|
21
|
-
lines.push('');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const pages: ScrapeResult[] = [];
|
|
25
|
-
const docs: ScrapeResult[] = [];
|
|
26
|
-
|
|
27
|
-
for (const result of results) {
|
|
28
|
-
const url = result.url.toLowerCase();
|
|
29
|
-
if (url.includes('doc') || url.includes('guide') || url.includes('api')) {
|
|
30
|
-
docs.push(result);
|
|
31
|
-
} else {
|
|
32
|
-
pages.push(result);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (pages.length > 0) {
|
|
37
|
-
lines.push('## Pages');
|
|
38
|
-
lines.push('');
|
|
39
|
-
for (const page of pages.slice(0, 20)) {
|
|
40
|
-
const title = page.metadata.title || page.title;
|
|
41
|
-
const desc = page.metadata.description || '';
|
|
42
|
-
lines.push(`- ${title}: ${desc || page.url}`);
|
|
43
|
-
}
|
|
44
|
-
lines.push('');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (docs.length > 0) {
|
|
48
|
-
lines.push('## Documentation');
|
|
49
|
-
lines.push('');
|
|
50
|
-
for (const doc of docs.slice(0, 20)) {
|
|
51
|
-
const title = doc.metadata.title || doc.title;
|
|
52
|
-
const desc = doc.metadata.description || '';
|
|
53
|
-
lines.push(`- ${title}: ${desc || doc.url}`);
|
|
54
|
-
}
|
|
55
|
-
lines.push('');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (options.includeOptional && results.length > 5) {
|
|
59
|
-
lines.push('## Optional');
|
|
60
|
-
lines.push('');
|
|
61
|
-
lines.push(`- Full content: ${results.length} pages scraped`);
|
|
62
|
-
lines.push(`- Last updated: ${new Date().toISOString().split('T')[0]}`);
|
|
63
|
-
lines.push('');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return lines.join('\n');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function generateLlmsFullTxt(results: ScrapeResult[]): string {
|
|
70
|
-
const parts: string[] = [];
|
|
71
|
-
|
|
72
|
-
for (const result of results) {
|
|
73
|
-
parts.push(`# ${result.title || result.metadata.title || 'Untitled'}`);
|
|
74
|
-
parts.push('');
|
|
75
|
-
parts.push(`Source: ${result.url}`);
|
|
76
|
-
parts.push('');
|
|
77
|
-
parts.push(result.content);
|
|
78
|
-
parts.push('');
|
|
79
|
-
parts.push('---');
|
|
80
|
-
parts.push('');
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return parts.join('\n');
|
|
84
|
-
}
|
package/scrape/middleware.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
export interface MiddlewareContext<T = Record<string, unknown>> {
|
|
2
|
-
data: T;
|
|
3
|
-
state: Record<string, unknown>;
|
|
4
|
-
startTime: number;
|
|
5
|
-
aborted: boolean;
|
|
6
|
-
abort(): void;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export type MiddlewareNext = () => Promise<void>;
|
|
10
|
-
export type Middleware<T = Record<string, unknown>> = (
|
|
11
|
-
ctx: MiddlewareContext<T>,
|
|
12
|
-
next: MiddlewareNext
|
|
13
|
-
) => Promise<void>;
|
|
14
|
-
|
|
15
|
-
export class MiddlewarePipeline<T = Record<string, unknown>> {
|
|
16
|
-
private middlewares: Middleware<T>[] = [];
|
|
17
|
-
|
|
18
|
-
use(middleware: Middleware<T>): this {
|
|
19
|
-
this.middlewares.push(middleware);
|
|
20
|
-
return this;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
async execute(initialData: T): Promise<MiddlewareContext<T>> {
|
|
24
|
-
const ctx: MiddlewareContext<T> = {
|
|
25
|
-
data: initialData,
|
|
26
|
-
state: {},
|
|
27
|
-
startTime: Date.now(),
|
|
28
|
-
aborted: false,
|
|
29
|
-
abort() { this.aborted = true; },
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
let index = 0;
|
|
33
|
-
|
|
34
|
-
const next = async (): Promise<void> => {
|
|
35
|
-
if (ctx.aborted) return;
|
|
36
|
-
if (index < this.middlewares.length) {
|
|
37
|
-
const middleware = this.middlewares[index++];
|
|
38
|
-
await middleware(ctx, next);
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
await next();
|
|
43
|
-
return ctx;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
clear(): void {
|
|
47
|
-
this.middlewares = [];
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function loggingMiddleware(logger?: { info: (msg: string) => void }): Middleware {
|
|
52
|
-
return async (_ctx, next) => {
|
|
53
|
-
const start = Date.now();
|
|
54
|
-
await next();
|
|
55
|
-
const duration = Date.now() - start;
|
|
56
|
-
logger?.info(`Request completed in ${duration}ms`);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function timeoutMiddleware(timeoutMs: number): Middleware {
|
|
61
|
-
return async (ctx, next) => {
|
|
62
|
-
const timer = setTimeout(() => ctx.abort(), timeoutMs);
|
|
63
|
-
try {
|
|
64
|
-
await next();
|
|
65
|
-
} finally {
|
|
66
|
-
clearTimeout(timer);
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export function retryMiddleware(maxRetries: number, delayMs: number): Middleware {
|
|
72
|
-
return async (ctx, next) => {
|
|
73
|
-
let attempt = 0;
|
|
74
|
-
while (attempt <= maxRetries) {
|
|
75
|
-
ctx.state.attempt = attempt;
|
|
76
|
-
try {
|
|
77
|
-
await next();
|
|
78
|
-
return;
|
|
79
|
-
} catch (error) {
|
|
80
|
-
if (attempt === maxRetries) throw error;
|
|
81
|
-
await new Promise(r => setTimeout(r, delayMs * Math.pow(2, attempt)));
|
|
82
|
-
attempt++;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function createPipeline<T = Record<string, unknown>>(): MiddlewarePipeline<T> {
|
|
89
|
-
return new MiddlewarePipeline<T>();
|
|
90
|
-
}
|
package/scrape/normalize.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* content normalization classifies bounded response bytes without owning a parser, transport or storage backend.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
const extensions = Object.freeze({
|
|
6
|
-
".json": "application/json",
|
|
7
|
-
".map": "application/json",
|
|
8
|
-
".xml": "application/xml",
|
|
9
|
-
".rss": "application/rss+xml",
|
|
10
|
-
".atom": "application/atom+xml",
|
|
11
|
-
".md": "text/markdown",
|
|
12
|
-
".markdown": "text/markdown",
|
|
13
|
-
".html": "text/html",
|
|
14
|
-
".htm": "text/html",
|
|
15
|
-
".txt": "text/plain",
|
|
16
|
-
".csv": "text/csv"
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
/** Detects a normalized media type from a header, URL suffix or caller fallback. */
|
|
20
|
-
export function detectcontenttype(header, url, fallback = "application/octet-stream") {
|
|
21
|
-
const value = String(header ?? "").split(";", 1)[0].trim().toLowerCase();
|
|
22
|
-
if (value) return value;
|
|
23
|
-
try {
|
|
24
|
-
const pathname = new URL(url).pathname.toLowerCase();
|
|
25
|
-
const suffix = Object.keys(extensions).find((extension) => pathname.endsWith(extension));
|
|
26
|
-
if (suffix) return extensions[suffix];
|
|
27
|
-
} catch { /* invalid or absent URLs remain caller-owned metadata */ }
|
|
28
|
-
return String(fallback).toLowerCase();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Normalizes bounded input bytes into a serializable text, JSON or binary result. */
|
|
32
|
-
export function normalizeresult(input, options = {}) {
|
|
33
|
-
const contenttype = detectcontenttype(options.contenttype, options.url, options.defaultcontenttype ?? "application/octet-stream");
|
|
34
|
-
const bytes = tobytes(input);
|
|
35
|
-
const maxbytes = boundedlimit(options.maxbytes, 2_000_000);
|
|
36
|
-
if (bytes.byteLength > maxbytes) throw normalizationerror("CONTENT_TOO_LARGE", `content exceeds ${maxbytes} bytes`);
|
|
37
|
-
const kind = contentkind(contenttype);
|
|
38
|
-
if (kind === "binary") return { contenttype, kind, size: bytes.byteLength, bytes };
|
|
39
|
-
const text = new TextDecoder(options.charset ?? "utf-8", { fatal: false }).decode(bytes).replaceAll("\r\n", "\n");
|
|
40
|
-
if (text.length > boundedlimit(options.maxtext, maxbytes)) throw normalizationerror("TEXT_TOO_LARGE", "decoded content exceeds the configured text limit");
|
|
41
|
-
if (kind === "json") {
|
|
42
|
-
try { return { contenttype, kind, size: bytes.byteLength, content: text, data: JSON.parse(text) }; } catch (error) { throw normalizationerror("INVALID_JSON", `invalid JSON content: ${error.message}`); }
|
|
43
|
-
}
|
|
44
|
-
return { contenttype, kind, size: bytes.byteLength, content: text };
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Reads a caller-provided response body after checking declared and actual size limits. */
|
|
48
|
-
export async function normalizeresponse(response, options = {}) {
|
|
49
|
-
if (!response || typeof response !== "object") throw new TypeError("response is required");
|
|
50
|
-
const headers = response.headers;
|
|
51
|
-
const header = typeof headers?.get === "function" ? headers.get("content-type") : headers?.["content-type"];
|
|
52
|
-
const declared = Number(typeof headers?.get === "function" ? headers.get("content-length") : headers?.["content-length"]);
|
|
53
|
-
const maxbytes = boundedlimit(options.maxbytes, 2_000_000);
|
|
54
|
-
if (Number.isFinite(declared) && declared > maxbytes) throw normalizationerror("CONTENT_TOO_LARGE", `content exceeds ${maxbytes} bytes`);
|
|
55
|
-
const body = typeof response.arrayBuffer === "function" ? await response.arrayBuffer() : await response.text();
|
|
56
|
-
return normalizeresult(body, { ...options, contenttype: header ?? options.contenttype, url: options.url ?? response.url });
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function contentkind(contenttype) {
|
|
60
|
-
if (contenttype === "application/json" || contenttype.endsWith("+json")) return "json";
|
|
61
|
-
if (contenttype === "text/html" || contenttype === "application/xhtml+xml") return "html";
|
|
62
|
-
if (contenttype === "application/xml" || contenttype === "text/xml" || contenttype.endsWith("+xml")) return "xml";
|
|
63
|
-
if (contenttype === "text/markdown") return "markdown";
|
|
64
|
-
if (contenttype.startsWith("text/")) return "text";
|
|
65
|
-
return "binary";
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function tobytes(input) {
|
|
69
|
-
if (typeof input === "string") return new TextEncoder().encode(input);
|
|
70
|
-
if (input instanceof Uint8Array) return input;
|
|
71
|
-
if (input instanceof ArrayBuffer) return new Uint8Array(input);
|
|
72
|
-
if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
73
|
-
throw new TypeError("content must be a string, ArrayBuffer or typed array");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function boundedlimit(value, fallback) {
|
|
77
|
-
const limit = Number(value ?? fallback);
|
|
78
|
-
if (!Number.isSafeInteger(limit) || limit < 1) throw new TypeError("content limit must be a positive safe integer");
|
|
79
|
-
return limit;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function normalizationerror(code, message) {
|
|
83
|
-
const error = new Error(message);
|
|
84
|
-
error.code = code;
|
|
85
|
-
return error;
|
|
86
|
-
}
|
package/scrape/pool.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { AgentBrowser } from './browser.js';
|
|
2
|
-
import type { BrowserAgentConfig } from './types.js';
|
|
3
|
-
|
|
4
|
-
export interface PoolConfig {
|
|
5
|
-
maxSize?: number;
|
|
6
|
-
acquireTimeoutMs?: number;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface PoolEntry {
|
|
10
|
-
browser: AgentBrowser;
|
|
11
|
-
inUse: boolean;
|
|
12
|
-
createdAt: number;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class BrowserPool {
|
|
16
|
-
private pool: PoolEntry[] = [];
|
|
17
|
-
private waitQueue: Array<(browser: AgentBrowser) => void> = [];
|
|
18
|
-
private config: Required<PoolConfig>;
|
|
19
|
-
private browserConfig: BrowserAgentConfig;
|
|
20
|
-
|
|
21
|
-
constructor(config: PoolConfig = {}, browserConfig: BrowserAgentConfig = {}) {
|
|
22
|
-
this.config = {
|
|
23
|
-
maxSize: config.maxSize || 3,
|
|
24
|
-
acquireTimeoutMs: config.acquireTimeoutMs || 30000,
|
|
25
|
-
};
|
|
26
|
-
this.browserConfig = browserConfig;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
async acquire(): Promise<AgentBrowser> {
|
|
30
|
-
const idle = this.pool.find(e => !e.inUse && e.browser.isConnected());
|
|
31
|
-
if (idle) {
|
|
32
|
-
idle.inUse = true;
|
|
33
|
-
return idle.browser;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (this.pool.length < this.config.maxSize) {
|
|
37
|
-
const browser = new AgentBrowser(this.browserConfig);
|
|
38
|
-
await browser.launch();
|
|
39
|
-
const entry: PoolEntry = { browser, inUse: true, createdAt: Date.now() };
|
|
40
|
-
this.pool.push(entry);
|
|
41
|
-
return browser;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return new Promise<AgentBrowser>((resolve, reject) => {
|
|
45
|
-
const timeout = setTimeout(() => {
|
|
46
|
-
const idx = this.waitQueue.indexOf(waiter);
|
|
47
|
-
if (idx !== -1) this.waitQueue.splice(idx, 1);
|
|
48
|
-
reject(new Error('Timeout waiting for browser'));
|
|
49
|
-
}, this.config.acquireTimeoutMs);
|
|
50
|
-
|
|
51
|
-
const waiter = (browser: AgentBrowser) => {
|
|
52
|
-
clearTimeout(timeout);
|
|
53
|
-
resolve(browser);
|
|
54
|
-
};
|
|
55
|
-
this.waitQueue.push(waiter);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
release(browser: AgentBrowser): void {
|
|
60
|
-
const entry = this.pool.find(e => e.browser === browser);
|
|
61
|
-
if (entry) {
|
|
62
|
-
entry.inUse = false;
|
|
63
|
-
|
|
64
|
-
if (this.waitQueue.length > 0) {
|
|
65
|
-
const waiter = this.waitQueue.shift()!;
|
|
66
|
-
entry.inUse = true;
|
|
67
|
-
waiter(browser);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async destroy(): Promise<void> {
|
|
73
|
-
for (const entry of this.pool) {
|
|
74
|
-
await entry.browser.close().catch(() => {});
|
|
75
|
-
}
|
|
76
|
-
this.pool = [];
|
|
77
|
-
for (const waiter of this.waitQueue) {
|
|
78
|
-
waiter(new AgentBrowser());
|
|
79
|
-
}
|
|
80
|
-
this.waitQueue = [];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getStatus(): { total: number; idle: number; inUse: number; waiting: number } {
|
|
84
|
-
return {
|
|
85
|
-
total: this.pool.length,
|
|
86
|
-
idle: this.pool.filter(e => !e.inUse).length,
|
|
87
|
-
inUse: this.pool.filter(e => e.inUse).length,
|
|
88
|
-
waiting: this.waitQueue.length,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function createPool(config?: PoolConfig, browserConfig?: BrowserAgentConfig): BrowserPool {
|
|
94
|
-
return new BrowserPool(config, browserConfig);
|
|
95
|
-
}
|
package/scrape/port.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate a random port number in the ephemeral port range (1024-65535).
|
|
3
|
-
* The port is calculated once and then fixed for the lifetime of the process.
|
|
4
|
-
*/
|
|
5
|
-
let _cachedPort: number | null = null;
|
|
6
|
-
|
|
7
|
-
export function randomPort(): number {
|
|
8
|
-
if (_cachedPort !== null) return _cachedPort;
|
|
9
|
-
_cachedPort = Math.floor(Math.random() * 64511) + 1024;
|
|
10
|
-
return _cachedPort;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Reset the cached port (for testing).
|
|
15
|
-
*/
|
|
16
|
-
export function resetPort(): void {
|
|
17
|
-
_cachedPort = null;
|
|
18
|
-
}
|
package/scrape/proxy.ts
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import type { ProxyConfig } from './types.js';
|
|
2
|
-
|
|
3
|
-
interface ProxyStats {
|
|
4
|
-
failures: number;
|
|
5
|
-
successes: number;
|
|
6
|
-
consecutiveFailures: number;
|
|
7
|
-
lastFailure?: number;
|
|
8
|
-
lastSuccess?: number;
|
|
9
|
-
disabled: boolean;
|
|
10
|
-
disabledAt?: number;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type ProxyRotationStrategy = 'round-robin' | 'random';
|
|
14
|
-
|
|
15
|
-
export interface ProxyPoolConfig {
|
|
16
|
-
maxFailures?: number;
|
|
17
|
-
reviveAfterMs?: number;
|
|
18
|
-
strategy?: ProxyRotationStrategy;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const DEFAULT_POOL_CONFIG: Required<ProxyPoolConfig> = {
|
|
22
|
-
maxFailures: 3,
|
|
23
|
-
reviveAfterMs: 30 * 60 * 1000,
|
|
24
|
-
strategy: 'round-robin',
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export class ProxyPool {
|
|
28
|
-
private proxies: ProxyConfig[];
|
|
29
|
-
private stats = new Map<string, ProxyStats>();
|
|
30
|
-
private currentIndex = 0;
|
|
31
|
-
private config: Required<ProxyPoolConfig>;
|
|
32
|
-
|
|
33
|
-
constructor(proxies: ProxyConfig[], config: Partial<ProxyPoolConfig> = {}) {
|
|
34
|
-
this.proxies = proxies;
|
|
35
|
-
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
36
|
-
for (const p of proxies) {
|
|
37
|
-
this.stats.set(p.url, { failures: 0, successes: 0, consecutiveFailures: 0, disabled: false });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private getActiveProxies(): ProxyConfig[] {
|
|
42
|
-
const now = Date.now();
|
|
43
|
-
return this.proxies.filter(p => {
|
|
44
|
-
const s = this.stats.get(p.url);
|
|
45
|
-
if (!s) return true;
|
|
46
|
-
if (s.disabled && s.disabledAt && (now - s.disabledAt) >= this.config.reviveAfterMs) {
|
|
47
|
-
s.disabled = false;
|
|
48
|
-
s.failures = 0;
|
|
49
|
-
s.consecutiveFailures = 0;
|
|
50
|
-
return true;
|
|
51
|
-
}
|
|
52
|
-
return !s.disabled;
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
next(): ProxyConfig | null {
|
|
57
|
-
const active = this.getActiveProxies();
|
|
58
|
-
if (active.length === 0) return null;
|
|
59
|
-
|
|
60
|
-
if (this.config.strategy === 'random') {
|
|
61
|
-
return active[Math.floor(Math.random() * active.length)];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const proxy = active[this.currentIndex % active.length];
|
|
65
|
-
this.currentIndex = (this.currentIndex + 1) % active.length;
|
|
66
|
-
return proxy;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
reportSuccess(proxy: ProxyConfig): void {
|
|
70
|
-
const s = this.stats.get(proxy.url);
|
|
71
|
-
if (s) {
|
|
72
|
-
s.successes++;
|
|
73
|
-
s.consecutiveFailures = 0;
|
|
74
|
-
s.lastSuccess = Date.now();
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
reportFailure(proxy: ProxyConfig): void {
|
|
79
|
-
const s = this.stats.get(proxy.url);
|
|
80
|
-
if (s) {
|
|
81
|
-
s.failures++;
|
|
82
|
-
s.consecutiveFailures++;
|
|
83
|
-
s.lastFailure = Date.now();
|
|
84
|
-
if (s.consecutiveFailures >= this.config.maxFailures) {
|
|
85
|
-
s.disabled = true;
|
|
86
|
-
s.disabledAt = Date.now();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
getStatus(): { total: number; active: number; disabled: number } {
|
|
92
|
-
const active = this.getActiveProxies();
|
|
93
|
-
return {
|
|
94
|
-
total: this.proxies.length,
|
|
95
|
-
active: active.length,
|
|
96
|
-
disabled: this.proxies.length - active.length,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export function createProxyPool(proxies: ProxyConfig[], config?: Partial<ProxyPoolConfig>): ProxyPool {
|
|
102
|
-
return new ProxyPool(proxies, config);
|
|
103
|
-
}
|
package/scrape/rate-limiter.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
interface TokenBucket {
|
|
2
|
-
tokens: number;
|
|
3
|
-
lastRefill: number;
|
|
4
|
-
maxTokens: number;
|
|
5
|
-
refillRate: number;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface RateLimiterConfig {
|
|
9
|
-
maxTokensPerInterval: number;
|
|
10
|
-
intervalMs: number;
|
|
11
|
-
maxConcurrent?: number;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const DEFAULT_CONFIG: Required<RateLimiterConfig> = {
|
|
15
|
-
maxTokensPerInterval: 10,
|
|
16
|
-
intervalMs: 1000,
|
|
17
|
-
maxConcurrent: 5,
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export class RateLimiter {
|
|
21
|
-
private buckets = new Map<string, TokenBucket>();
|
|
22
|
-
private active = new Map<string, number>();
|
|
23
|
-
private config: Required<RateLimiterConfig>;
|
|
24
|
-
|
|
25
|
-
constructor(config: Partial<RateLimiterConfig> = {}) {
|
|
26
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
private getBucket(key: string): TokenBucket {
|
|
30
|
-
if (!this.buckets.has(key)) {
|
|
31
|
-
this.buckets.set(key, {
|
|
32
|
-
tokens: this.config.maxTokensPerInterval,
|
|
33
|
-
lastRefill: Date.now(),
|
|
34
|
-
maxTokens: this.config.maxTokensPerInterval,
|
|
35
|
-
refillRate: this.config.maxTokensPerInterval / (this.config.intervalMs / 1000),
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
return this.buckets.get(key)!;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
private refill(bucket: TokenBucket): void {
|
|
42
|
-
const now = Date.now();
|
|
43
|
-
const elapsed = (now - bucket.lastRefill) / 1000;
|
|
44
|
-
bucket.tokens = Math.min(bucket.maxTokens, bucket.tokens + elapsed * bucket.refillRate);
|
|
45
|
-
bucket.lastRefill = now;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
async acquire(key: string): Promise<void> {
|
|
49
|
-
const bucket = this.getBucket(key);
|
|
50
|
-
const currentActive = this.active.get(key) || 0;
|
|
51
|
-
|
|
52
|
-
if (currentActive >= this.config.maxConcurrent) {
|
|
53
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
54
|
-
return this.acquire(key);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
this.refill(bucket);
|
|
58
|
-
|
|
59
|
-
if (bucket.tokens < 1) {
|
|
60
|
-
const waitMs = ((1 - bucket.tokens) / bucket.refillRate) * 1000;
|
|
61
|
-
await new Promise((resolve) => setTimeout(resolve, Math.ceil(waitMs)));
|
|
62
|
-
this.refill(bucket);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
bucket.tokens -= 1;
|
|
66
|
-
this.active.set(key, currentActive + 1);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
release(key: string): void {
|
|
70
|
-
const current = this.active.get(key) || 0;
|
|
71
|
-
if (current <= 1) {
|
|
72
|
-
this.active.delete(key);
|
|
73
|
-
} else {
|
|
74
|
-
this.active.set(key, current - 1);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
getStats(key: string): { tokens: number; active: number } {
|
|
79
|
-
const bucket = this.buckets.get(key);
|
|
80
|
-
if (bucket) this.refill(bucket);
|
|
81
|
-
return {
|
|
82
|
-
tokens: bucket?.tokens ?? this.config.maxTokensPerInterval,
|
|
83
|
-
active: this.active.get(key) || 0,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
clear(): void {
|
|
88
|
-
this.buckets.clear();
|
|
89
|
-
this.active.clear();
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function createRateLimiter(config?: Partial<RateLimiterConfig>): RateLimiter {
|
|
94
|
-
return new RateLimiter(config);
|
|
95
|
-
}
|