dotdo 0.0.1 → 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/LICENSE +1 -1
- package/README.md +446 -315
- package/cli/README.md +238 -0
- package/cli/agent.ts +72 -0
- package/cli/bin.js +44 -0
- package/cli/bin.ts +38 -0
- package/cli/build.ts +157 -0
- package/cli/commands/auth/login.ts +14 -0
- package/cli/commands/auth/logout.ts +6 -0
- package/cli/commands/auth/whoami.ts +16 -0
- package/cli/commands/deploy-multi.ts +245 -0
- package/cli/commands/dev/deploy.ts +100 -0
- package/cli/commands/dev/dev.ts +95 -0
- package/cli/commands/dev/logs.ts +91 -0
- package/cli/commands/dev-local.ts +88 -0
- package/cli/commands/do-ops.ts +314 -0
- package/cli/commands/index.ts +100 -0
- package/cli/commands/init.ts +247 -0
- package/cli/commands/introspect/emitter.ts +315 -0
- package/cli/commands/introspect/index.ts +193 -0
- package/cli/commands/link.ts +598 -0
- package/cli/commands/snippets.ts +415 -0
- package/cli/commands/tunnel.ts +239 -0
- package/cli/device-auth.ts +289 -0
- package/cli/fallback.ts +12 -0
- package/cli/index.ts +121 -0
- package/cli/main.ts +246 -0
- package/cli/mcp-stdio.ts +790 -0
- package/cli/package.json +62 -0
- package/cli/runtime/do-registry.ts +193 -0
- package/cli/runtime/embedded-db.ts +344 -0
- package/cli/runtime/index.ts +9 -0
- package/cli/runtime/miniflare-adapter.ts +162 -0
- package/cli/sandbox.ts +82 -0
- package/cli/src/args.ts +174 -0
- package/cli/src/auth.ts +55 -0
- package/cli/src/commands/call.ts +84 -0
- package/cli/src/commands/charge.ts +96 -0
- package/cli/src/commands/config.ts +115 -0
- package/cli/src/commands/email.ts +112 -0
- package/cli/src/commands/llm.ts +115 -0
- package/cli/src/commands/queue.ts +134 -0
- package/cli/src/commands/text.ts +86 -0
- package/cli/src/config.ts +185 -0
- package/cli/src/output.ts +246 -0
- package/cli/src/rpc.ts +192 -0
- package/cli/utils/config.ts +282 -0
- package/cli/utils/detect.ts +73 -0
- package/cli/utils/index.ts +15 -0
- package/cli/utils/logger.ts +232 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/template-literals.js +852 -0
- package/dist/ai/template-literals.js.map +1 -0
- package/dist/api/middleware/auth-federation.js +573 -0
- package/dist/api/middleware/auth-federation.js.map +1 -0
- package/dist/api/middleware/auth.js +545 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/db/actions.js +212 -0
- package/dist/db/actions.js.map +1 -0
- package/dist/db/auth.js +506 -0
- package/dist/db/auth.js.map +1 -0
- package/dist/db/branches.js +65 -0
- package/dist/db/branches.js.map +1 -0
- package/dist/db/clickhouse.js +1074 -0
- package/dist/db/clickhouse.js.map +1 -0
- package/dist/db/dlq.js +39 -0
- package/dist/db/dlq.js.map +1 -0
- package/dist/db/events.js +28 -0
- package/dist/db/events.js.map +1 -0
- package/dist/db/exec.js +64 -0
- package/dist/db/exec.js.map +1 -0
- package/dist/db/files.js +85 -0
- package/dist/db/files.js.map +1 -0
- package/dist/db/flags.js +24 -0
- package/dist/db/flags.js.map +1 -0
- package/dist/db/git.js +116 -0
- package/dist/db/git.js.map +1 -0
- package/dist/db/iceberg/inverted-index.js +862 -0
- package/dist/db/iceberg/inverted-index.js.map +1 -0
- package/dist/db/iceberg/puffin.js +878 -0
- package/dist/db/iceberg/puffin.js.map +1 -0
- package/dist/db/iceberg/search-manifest.js +422 -0
- package/dist/db/iceberg/search-manifest.js.map +1 -0
- package/dist/db/iceberg/types.js +8 -0
- package/dist/db/iceberg/types.js.map +1 -0
- package/dist/db/index.js +121 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/integrations.js +368 -0
- package/dist/db/integrations.js.map +1 -0
- package/dist/db/json-indexes.js +332 -0
- package/dist/db/json-indexes.js.map +1 -0
- package/dist/db/linked-accounts.js +287 -0
- package/dist/db/linked-accounts.js.map +1 -0
- package/dist/db/nouns.js +183 -0
- package/dist/db/nouns.js.map +1 -0
- package/dist/db/objects.js +170 -0
- package/dist/db/objects.js.map +1 -0
- package/dist/db/primitives/dag-scheduler/index.js +869 -0
- package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
- package/dist/db/primitives/exactly-once-context.js +237 -0
- package/dist/db/primitives/exactly-once-context.js.map +1 -0
- package/dist/db/primitives/index.js +62 -0
- package/dist/db/primitives/index.js.map +1 -0
- package/dist/db/primitives/keyed-router.js +145 -0
- package/dist/db/primitives/keyed-router.js.map +1 -0
- package/dist/db/primitives/observability.js +162 -0
- package/dist/db/primitives/observability.js.map +1 -0
- package/dist/db/primitives/schema-evolution.js +643 -0
- package/dist/db/primitives/schema-evolution.js.map +1 -0
- package/dist/db/primitives/stateful-operator/index.js +770 -0
- package/dist/db/primitives/stateful-operator/index.js.map +1 -0
- package/dist/db/primitives/temporal-store.js +306 -0
- package/dist/db/primitives/temporal-store.js.map +1 -0
- package/dist/db/primitives/typed-column-store.js +1229 -0
- package/dist/db/primitives/typed-column-store.js.map +1 -0
- package/dist/db/primitives/utils/duration.js +162 -0
- package/dist/db/primitives/utils/duration.js.map +1 -0
- package/dist/db/primitives/utils/murmur3.js +116 -0
- package/dist/db/primitives/utils/murmur3.js.map +1 -0
- package/dist/db/primitives/watermark-service.js +136 -0
- package/dist/db/primitives/watermark-service.js.map +1 -0
- package/dist/db/primitives/window-manager.js +764 -0
- package/dist/db/primitives/window-manager.js.map +1 -0
- package/dist/db/relationships.js +66 -0
- package/dist/db/relationships.js.map +1 -0
- package/dist/db/schema-minimal.js +61 -0
- package/dist/db/schema-minimal.js.map +1 -0
- package/dist/db/search.js +28 -0
- package/dist/db/search.js.map +1 -0
- package/dist/db/stores.js +1665 -0
- package/dist/db/stores.js.map +1 -0
- package/dist/db/things.js +297 -0
- package/dist/db/things.js.map +1 -0
- package/dist/db/vault.js +171 -0
- package/dist/db/vault.js.map +1 -0
- package/dist/db/verbs.js +102 -0
- package/dist/db/verbs.js.map +1 -0
- package/dist/do/base.js +48 -0
- package/dist/do/base.js.map +1 -0
- package/dist/do/tiny.js +31 -0
- package/dist/do/tiny.js.map +1 -0
- package/dist/lib/DOAuth.js +261 -0
- package/dist/lib/DOAuth.js.map +1 -0
- package/dist/lib/DODispatcher.js +72 -0
- package/dist/lib/DODispatcher.js.map +1 -0
- package/dist/lib/Modifier.js +189 -0
- package/dist/lib/Modifier.js.map +1 -0
- package/dist/lib/StateStorage.js +403 -0
- package/dist/lib/StateStorage.js.map +1 -0
- package/dist/lib/TypeRegistry.js +122 -0
- package/dist/lib/TypeRegistry.js.map +1 -0
- package/dist/lib/ai/gateway.js +247 -0
- package/dist/lib/ai/gateway.js.map +1 -0
- package/dist/lib/ai/tool-loop-agent.js +591 -0
- package/dist/lib/ai/tool-loop-agent.js.map +1 -0
- package/dist/lib/auto-wiring.js +439 -0
- package/dist/lib/auto-wiring.js.map +1 -0
- package/dist/lib/browse/browserbase.js +163 -0
- package/dist/lib/browse/browserbase.js.map +1 -0
- package/dist/lib/browse/cloudflare.js +144 -0
- package/dist/lib/browse/cloudflare.js.map +1 -0
- package/dist/lib/browse/index.js +62 -0
- package/dist/lib/browse/index.js.map +1 -0
- package/dist/lib/browse/types.js +13 -0
- package/dist/lib/browse/types.js.map +1 -0
- package/dist/lib/cache/index.js +37 -0
- package/dist/lib/cache/index.js.map +1 -0
- package/dist/lib/cache/visibility.js +638 -0
- package/dist/lib/cache/visibility.js.map +1 -0
- package/dist/lib/capabilities.js +268 -0
- package/dist/lib/capabilities.js.map +1 -0
- package/dist/lib/channels/base.js +106 -0
- package/dist/lib/channels/base.js.map +1 -0
- package/dist/lib/channels/discord.js +94 -0
- package/dist/lib/channels/discord.js.map +1 -0
- package/dist/lib/channels/email.js +204 -0
- package/dist/lib/channels/email.js.map +1 -0
- package/dist/lib/channels/index.js +90 -0
- package/dist/lib/channels/index.js.map +1 -0
- package/dist/lib/channels/mdxui-chat.js +95 -0
- package/dist/lib/channels/mdxui-chat.js.map +1 -0
- package/dist/lib/channels/slack-blockkit.js +121 -0
- package/dist/lib/channels/slack-blockkit.js.map +1 -0
- package/dist/lib/channels/types.js +7 -0
- package/dist/lib/channels/types.js.map +1 -0
- package/dist/lib/cloudflare/ai.js +654 -0
- package/dist/lib/cloudflare/ai.js.map +1 -0
- package/dist/lib/cloudflare/index.js +88 -0
- package/dist/lib/cloudflare/index.js.map +1 -0
- package/dist/lib/cloudflare/kv.js +342 -0
- package/dist/lib/cloudflare/kv.js.map +1 -0
- package/dist/lib/cloudflare/queues.js +434 -0
- package/dist/lib/cloudflare/queues.js.map +1 -0
- package/dist/lib/cloudflare/r2.js +604 -0
- package/dist/lib/cloudflare/r2.js.map +1 -0
- package/dist/lib/cloudflare/vectorize.js +494 -0
- package/dist/lib/cloudflare/vectorize.js.map +1 -0
- package/dist/lib/cloudflare/workflows.js +569 -0
- package/dist/lib/cloudflare/workflows.js.map +1 -0
- package/dist/lib/colo/caching.js +196 -0
- package/dist/lib/colo/caching.js.map +1 -0
- package/dist/lib/colo/detection.js +194 -0
- package/dist/lib/colo/detection.js.map +1 -0
- package/dist/lib/colo/external-data.js +219 -0
- package/dist/lib/colo/external-data.js.map +1 -0
- package/dist/lib/colo/globe-data.js +179 -0
- package/dist/lib/colo/globe-data.js.map +1 -0
- package/dist/lib/colo/index.js +16 -0
- package/dist/lib/colo/index.js.map +1 -0
- package/dist/lib/decorators.js +37 -0
- package/dist/lib/decorators.js.map +1 -0
- package/dist/lib/discovery.js +81 -0
- package/dist/lib/discovery.js.map +1 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
- package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
- package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/CascadeExecutor.js +418 -0
- package/dist/lib/executors/CascadeExecutor.js.map +1 -0
- package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
- package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
- package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
- package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
- package/dist/lib/executors/ParallelStepExecutor.js +308 -0
- package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
- package/dist/lib/executors/types.js +12 -0
- package/dist/lib/executors/types.js.map +1 -0
- package/dist/lib/experiments.js +89 -0
- package/dist/lib/experiments.js.map +1 -0
- package/dist/lib/flags/store.js +262 -0
- package/dist/lib/flags/store.js.map +1 -0
- package/dist/lib/functions/FunctionComposition.js +467 -0
- package/dist/lib/functions/FunctionComposition.js.map +1 -0
- package/dist/lib/functions/FunctionMiddleware.js +457 -0
- package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
- package/dist/lib/functions/FunctionRegistry.js +426 -0
- package/dist/lib/functions/FunctionRegistry.js.map +1 -0
- package/dist/lib/functions/createFunction.js +1048 -0
- package/dist/lib/functions/createFunction.js.map +1 -0
- package/dist/lib/humans/index.js +68 -0
- package/dist/lib/humans/index.js.map +1 -0
- package/dist/lib/humans/templates.js +117 -0
- package/dist/lib/humans/templates.js.map +1 -0
- package/dist/lib/identity.js +98 -0
- package/dist/lib/identity.js.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/logging/error-logger.js +163 -0
- package/dist/lib/logging/error-logger.js.map +1 -0
- package/dist/lib/logging/index.js +160 -0
- package/dist/lib/logging/index.js.map +1 -0
- package/dist/lib/mixins/bash.js +753 -0
- package/dist/lib/mixins/bash.js.map +1 -0
- package/dist/lib/mixins/fs.js +648 -0
- package/dist/lib/mixins/fs.js.map +1 -0
- package/dist/lib/mixins/git.js +1006 -0
- package/dist/lib/mixins/git.js.map +1 -0
- package/dist/lib/mixins/npm.js +662 -0
- package/dist/lib/mixins/npm.js.map +1 -0
- package/dist/lib/noun-id.js +278 -0
- package/dist/lib/noun-id.js.map +1 -0
- package/dist/lib/rate-limit/sliding-window.js +148 -0
- package/dist/lib/rate-limit/sliding-window.js.map +1 -0
- package/dist/lib/rate-limit.js +110 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/rpc/bindings.js +548 -0
- package/dist/lib/rpc/bindings.js.map +1 -0
- package/dist/lib/rpc/index.js +64 -0
- package/dist/lib/rpc/index.js.map +1 -0
- package/dist/lib/safe-stringify.js +223 -0
- package/dist/lib/safe-stringify.js.map +1 -0
- package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
- package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
- package/dist/lib/sqids.js +110 -0
- package/dist/lib/sqids.js.map +1 -0
- package/dist/lib/sql/adapters/index.js +10 -0
- package/dist/lib/sql/adapters/index.js.map +1 -0
- package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
- package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
- package/dist/lib/sql/adapters/pgsql-parser.js +1190 -0
- package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
- package/dist/lib/sql/index.js +277 -0
- package/dist/lib/sql/index.js.map +1 -0
- package/dist/lib/sql/types.js +56 -0
- package/dist/lib/sql/types.js.map +1 -0
- package/dist/lib/type-classifier.js +126 -0
- package/dist/lib/type-classifier.js.map +1 -0
- package/dist/lib/utils/html.js +47 -0
- package/dist/lib/utils/html.js.map +1 -0
- package/dist/lib/validation.js +48 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/vault/store.js +411 -0
- package/dist/lib/vault/store.js.map +1 -0
- package/dist/metrics/hunch.js +739 -0
- package/dist/metrics/hunch.js.map +1 -0
- package/dist/objects/API.js +302 -0
- package/dist/objects/API.js.map +1 -0
- package/dist/objects/Agent.js +179 -0
- package/dist/objects/Agent.js.map +1 -0
- package/dist/objects/AgenticFunctionExecutor.js +8 -0
- package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
- package/dist/objects/App.js +83 -0
- package/dist/objects/App.js.map +1 -0
- package/dist/objects/Browser.js +884 -0
- package/dist/objects/Browser.js.map +1 -0
- package/dist/objects/Business.js +107 -0
- package/dist/objects/Business.js.map +1 -0
- package/dist/objects/CLI.js +221 -0
- package/dist/objects/CLI.js.map +1 -0
- package/dist/objects/CodeFunctionExecutor.js +8 -0
- package/dist/objects/CodeFunctionExecutor.js.map +1 -0
- package/dist/objects/Collection.js +161 -0
- package/dist/objects/Collection.js.map +1 -0
- package/dist/objects/DO.js +41 -0
- package/dist/objects/DO.js.map +1 -0
- package/dist/objects/DOBase.js +2309 -0
- package/dist/objects/DOBase.js.map +1 -0
- package/dist/objects/DOCache.js +153 -0
- package/dist/objects/DOCache.js.map +1 -0
- package/dist/objects/DOFull.js +1676 -0
- package/dist/objects/DOFull.js.map +1 -0
- package/dist/objects/DOTiny.js +207 -0
- package/dist/objects/DOTiny.js.map +1 -0
- package/dist/objects/Directory.js +199 -0
- package/dist/objects/Directory.js.map +1 -0
- package/dist/objects/Entity.js +413 -0
- package/dist/objects/Entity.js.map +1 -0
- package/dist/objects/Function.js +116 -0
- package/dist/objects/Function.js.map +1 -0
- package/dist/objects/Human.js +231 -0
- package/dist/objects/Human.js.map +1 -0
- package/dist/objects/HumanFunctionExecutor.js +8 -0
- package/dist/objects/HumanFunctionExecutor.js.map +1 -0
- package/dist/objects/IcebergMetadataDO.js +938 -0
- package/dist/objects/IcebergMetadataDO.js.map +1 -0
- package/dist/objects/IntegrationsDO.js +1174 -0
- package/dist/objects/IntegrationsDO.js.map +1 -0
- package/dist/objects/ObservabilityBroadcaster.js +149 -0
- package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
- package/dist/objects/Package.js +154 -0
- package/dist/objects/Package.js.map +1 -0
- package/dist/objects/Product.js +193 -0
- package/dist/objects/Product.js.map +1 -0
- package/dist/objects/SDK.js +152 -0
- package/dist/objects/SDK.js.map +1 -0
- package/dist/objects/SaaS.js +235 -0
- package/dist/objects/SaaS.js.map +1 -0
- package/dist/objects/SandboxDO.js +759 -0
- package/dist/objects/SandboxDO.js.map +1 -0
- package/dist/objects/Service.js +337 -0
- package/dist/objects/Service.js.map +1 -0
- package/dist/objects/Site.js +80 -0
- package/dist/objects/Site.js.map +1 -0
- package/dist/objects/Startup.js +479 -0
- package/dist/objects/Startup.js.map +1 -0
- package/dist/objects/ThingsDO.js +170 -0
- package/dist/objects/ThingsDO.js.map +1 -0
- package/dist/objects/VectorShardDO.js +650 -0
- package/dist/objects/VectorShardDO.js.map +1 -0
- package/dist/objects/Worker.js +144 -0
- package/dist/objects/Worker.js.map +1 -0
- package/dist/objects/Workflow.js +196 -0
- package/dist/objects/Workflow.js.map +1 -0
- package/dist/objects/WorkflowFactory.js +313 -0
- package/dist/objects/WorkflowFactory.js.map +1 -0
- package/dist/objects/WorkflowRuntime.js +863 -0
- package/dist/objects/WorkflowRuntime.js.map +1 -0
- package/dist/objects/circuit-breaker-bulkhead.js +178 -0
- package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
- package/dist/objects/createFunction.js +934 -0
- package/dist/objects/createFunction.js.map +1 -0
- package/dist/objects/index.js +80 -0
- package/dist/objects/index.js.map +1 -0
- package/dist/objects/lifecycle/Branch.js +275 -0
- package/dist/objects/lifecycle/Branch.js.map +1 -0
- package/dist/objects/lifecycle/Clone.js +1499 -0
- package/dist/objects/lifecycle/Clone.js.map +1 -0
- package/dist/objects/lifecycle/Compact.js +237 -0
- package/dist/objects/lifecycle/Compact.js.map +1 -0
- package/dist/objects/lifecycle/Promote.js +476 -0
- package/dist/objects/lifecycle/Promote.js.map +1 -0
- package/dist/objects/lifecycle/Shard.js +560 -0
- package/dist/objects/lifecycle/Shard.js.map +1 -0
- package/dist/objects/lifecycle/index.js +15 -0
- package/dist/objects/lifecycle/index.js.map +1 -0
- package/dist/objects/lifecycle/types.js +33 -0
- package/dist/objects/lifecycle/types.js.map +1 -0
- package/dist/objects/mixins/infrastructure.js +171 -0
- package/dist/objects/mixins/infrastructure.js.map +1 -0
- package/dist/objects/modules/StoresModule.js +153 -0
- package/dist/objects/modules/StoresModule.js.map +1 -0
- package/dist/objects/persistence/checkpoint-manager.js +606 -0
- package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
- package/dist/objects/persistence/index.js +72 -0
- package/dist/objects/persistence/index.js.map +1 -0
- package/dist/objects/persistence/migration-runner.js +562 -0
- package/dist/objects/persistence/migration-runner.js.map +1 -0
- package/dist/objects/persistence/replication-manager.js +501 -0
- package/dist/objects/persistence/replication-manager.js.map +1 -0
- package/dist/objects/persistence/tiered-storage-manager.js +595 -0
- package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
- package/dist/objects/persistence/types.js +14 -0
- package/dist/objects/persistence/types.js.map +1 -0
- package/dist/objects/persistence/wal-manager.js +653 -0
- package/dist/objects/persistence/wal-manager.js.map +1 -0
- package/dist/objects/presets/index.js +20 -0
- package/dist/objects/presets/index.js.map +1 -0
- package/dist/objects/presets/primitives.js +188 -0
- package/dist/objects/presets/primitives.js.map +1 -0
- package/dist/objects/primitives/alarm-adapter.js +141 -0
- package/dist/objects/primitives/alarm-adapter.js.map +1 -0
- package/dist/objects/primitives/index.js +337 -0
- package/dist/objects/primitives/index.js.map +1 -0
- package/dist/objects/primitives/storage-adapter.js +182 -0
- package/dist/objects/primitives/storage-adapter.js.map +1 -0
- package/dist/objects/primitives/with-primitives.js +102 -0
- package/dist/objects/primitives/with-primitives.js.map +1 -0
- package/dist/objects/services/StoreManager.js +227 -0
- package/dist/objects/services/StoreManager.js.map +1 -0
- package/dist/objects/services/index.js +13 -0
- package/dist/objects/services/index.js.map +1 -0
- package/dist/objects/transport/auth-layer.js +1451 -0
- package/dist/objects/transport/auth-layer.js.map +1 -0
- package/dist/objects/transport/capnweb-target.js +355 -0
- package/dist/objects/transport/capnweb-target.js.map +1 -0
- package/dist/objects/transport/chain.js +441 -0
- package/dist/objects/transport/chain.js.map +1 -0
- package/dist/objects/transport/handler.js +58 -0
- package/dist/objects/transport/handler.js.map +1 -0
- package/dist/objects/transport/index.js +53 -0
- package/dist/objects/transport/index.js.map +1 -0
- package/dist/objects/transport/mcp-server.js +691 -0
- package/dist/objects/transport/mcp-server.js.map +1 -0
- package/dist/objects/transport/rest-autowire.js +1508 -0
- package/dist/objects/transport/rest-autowire.js.map +1 -0
- package/dist/objects/transport/rest-router.js +440 -0
- package/dist/objects/transport/rest-router.js.map +1 -0
- package/dist/objects/transport/rpc-server.js +1539 -0
- package/dist/objects/transport/rpc-server.js.map +1 -0
- package/dist/objects/transport/shared.js +576 -0
- package/dist/objects/transport/shared.js.map +1 -0
- package/dist/objects/transport/sync-engine.js +291 -0
- package/dist/objects/transport/sync-engine.js.map +1 -0
- package/dist/objects/transport/types.js +8 -0
- package/dist/objects/transport/types.js.map +1 -0
- package/dist/sandbox/index.js +258 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/snippets/artifacts-config.js +241 -0
- package/dist/snippets/artifacts-config.js.map +1 -0
- package/dist/snippets/artifacts-ingest.js +832 -0
- package/dist/snippets/artifacts-ingest.js.map +1 -0
- package/dist/snippets/artifacts-serve.js +1035 -0
- package/dist/snippets/artifacts-serve.js.map +1 -0
- package/dist/snippets/artifacts-types.js +161 -0
- package/dist/snippets/artifacts-types.js.map +1 -0
- package/dist/snippets/cache-probe.js +376 -0
- package/dist/snippets/cache-probe.js.map +1 -0
- package/dist/snippets/cache.js +10 -0
- package/dist/snippets/cache.js.map +1 -0
- package/dist/snippets/events.js +469 -0
- package/dist/snippets/events.js.map +1 -0
- package/dist/snippets/index.js +7 -0
- package/dist/snippets/index.js.map +1 -0
- package/dist/snippets/proxy.js +495 -0
- package/dist/snippets/proxy.js.map +1 -0
- package/dist/snippets/search.js +1759 -0
- package/dist/snippets/search.js.map +1 -0
- package/dist/streams/index.js +30 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/observability.js +68 -0
- package/dist/streams/observability.js.map +1 -0
- package/dist/types/AI.js +92 -0
- package/dist/types/AI.js.map +1 -0
- package/dist/types/AIFunction.js +171 -0
- package/dist/types/AIFunction.js.map +1 -0
- package/dist/types/BrowseVerb.js +89 -0
- package/dist/types/BrowseVerb.js.map +1 -0
- package/dist/types/Browser.js +31 -0
- package/dist/types/Browser.js.map +1 -0
- package/dist/types/Chaos.js +15 -0
- package/dist/types/Chaos.js.map +1 -0
- package/dist/types/CloudflareBindings.js +109 -0
- package/dist/types/CloudflareBindings.js.map +1 -0
- package/dist/types/Collection.js +50 -0
- package/dist/types/Collection.js.map +1 -0
- package/dist/types/DO.js +2 -0
- package/dist/types/DO.js.map +1 -0
- package/dist/types/DOLocation.js +63 -0
- package/dist/types/DOLocation.js.map +1 -0
- package/dist/types/EventHandler.js +57 -0
- package/dist/types/EventHandler.js.map +1 -0
- package/dist/types/Experiment.js +33 -0
- package/dist/types/Experiment.js.map +1 -0
- package/dist/types/Flag.js +57 -0
- package/dist/types/Flag.js.map +1 -0
- package/dist/types/Lifecycle.js +13 -0
- package/dist/types/Lifecycle.js.map +1 -0
- package/dist/types/Location.js +169 -0
- package/dist/types/Location.js.map +1 -0
- package/dist/types/Noun.js +66 -0
- package/dist/types/Noun.js.map +1 -0
- package/dist/types/SessionEvent.js +194 -0
- package/dist/types/SessionEvent.js.map +1 -0
- package/dist/types/Thing.js +55 -0
- package/dist/types/Thing.js.map +1 -0
- package/dist/types/ThingDO.js +153 -0
- package/dist/types/ThingDO.js.map +1 -0
- package/dist/types/Things.js +2 -0
- package/dist/types/Things.js.map +1 -0
- package/dist/types/Verb.js +119 -0
- package/dist/types/Verb.js.map +1 -0
- package/dist/types/WorkflowContext.js +70 -0
- package/dist/types/WorkflowContext.js.map +1 -0
- package/dist/types/analytics-api.js +13 -0
- package/dist/types/analytics-api.js.map +1 -0
- package/dist/types/capabilities.js +135 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/drizzle.js +12 -0
- package/dist/types/drizzle.js.map +1 -0
- package/dist/types/event.js +201 -0
- package/dist/types/event.js.map +1 -0
- package/dist/types/fn.js +12 -0
- package/dist/types/fn.js.map +1 -0
- package/dist/types/iceberg.js +48 -0
- package/dist/types/iceberg.js.map +1 -0
- package/dist/types/ids.js +170 -0
- package/dist/types/ids.js.map +1 -0
- package/dist/types/index.js +41 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/introspect.js +54 -0
- package/dist/types/introspect.js.map +1 -0
- package/dist/types/observability.js +124 -0
- package/dist/types/observability.js.map +1 -0
- package/dist/types/sync-protocol.js +175 -0
- package/dist/types/sync-protocol.js.map +1 -0
- package/dist/types/vector.js +13 -0
- package/dist/types/vector.js.map +1 -0
- package/dist/workflows/ScheduleManager.js +473 -0
- package/dist/workflows/ScheduleManager.js.map +1 -0
- package/dist/workflows/StepDOBridge.js +149 -0
- package/dist/workflows/StepDOBridge.js.map +1 -0
- package/dist/workflows/StepResultStorage.js +232 -0
- package/dist/workflows/StepResultStorage.js.map +1 -0
- package/dist/workflows/WaitForEventManager.js +461 -0
- package/dist/workflows/WaitForEventManager.js.map +1 -0
- package/dist/workflows/analyzer.js +332 -0
- package/dist/workflows/analyzer.js.map +1 -0
- package/dist/workflows/compat/activity-router.js +484 -0
- package/dist/workflows/compat/activity-router.js.map +1 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
- package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
- package/dist/workflows/compat/backends/index.js +14 -0
- package/dist/workflows/compat/backends/index.js.map +1 -0
- package/dist/workflows/compat/errors/index.js +375 -0
- package/dist/workflows/compat/errors/index.js.map +1 -0
- package/dist/workflows/compat/index.js +79 -0
- package/dist/workflows/compat/index.js.map +1 -0
- package/dist/workflows/compat/inngest/index.js +989 -0
- package/dist/workflows/compat/inngest/index.js.map +1 -0
- package/dist/workflows/compat/qstash/index.js +1263 -0
- package/dist/workflows/compat/qstash/index.js.map +1 -0
- package/dist/workflows/compat/temporal/activities.js +739 -0
- package/dist/workflows/compat/temporal/activities.js.map +1 -0
- package/dist/workflows/compat/temporal/child-workflows.js +154 -0
- package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
- package/dist/workflows/compat/temporal/client.js +381 -0
- package/dist/workflows/compat/temporal/client.js.map +1 -0
- package/dist/workflows/compat/temporal/context.js +309 -0
- package/dist/workflows/compat/temporal/context.js.map +1 -0
- package/dist/workflows/compat/temporal/determinism.js +216 -0
- package/dist/workflows/compat/temporal/determinism.js.map +1 -0
- package/dist/workflows/compat/temporal/errors.js +128 -0
- package/dist/workflows/compat/temporal/errors.js.map +1 -0
- package/dist/workflows/compat/temporal/index.js +2464 -0
- package/dist/workflows/compat/temporal/index.js.map +1 -0
- package/dist/workflows/compat/temporal/saga.js +504 -0
- package/dist/workflows/compat/temporal/saga.js.map +1 -0
- package/dist/workflows/compat/temporal/signals.js +364 -0
- package/dist/workflows/compat/temporal/signals.js.map +1 -0
- package/dist/workflows/compat/temporal/storage.js +271 -0
- package/dist/workflows/compat/temporal/storage.js.map +1 -0
- package/dist/workflows/compat/temporal/timers.js +347 -0
- package/dist/workflows/compat/temporal/timers.js.map +1 -0
- package/dist/workflows/compat/temporal/types.js +7 -0
- package/dist/workflows/compat/temporal/types.js.map +1 -0
- package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
- package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
- package/dist/workflows/compat/trigger/index.js +468 -0
- package/dist/workflows/compat/trigger/index.js.map +1 -0
- package/dist/workflows/compat/utils/index.js +69 -0
- package/dist/workflows/compat/utils/index.js.map +1 -0
- package/dist/workflows/context/correlation-capability.js +266 -0
- package/dist/workflows/context/correlation-capability.js.map +1 -0
- package/dist/workflows/context/correlation.js +484 -0
- package/dist/workflows/context/correlation.js.map +1 -0
- package/dist/workflows/context/experiment.js +289 -0
- package/dist/workflows/context/experiment.js.map +1 -0
- package/dist/workflows/context/flag.js +244 -0
- package/dist/workflows/context/flag.js.map +1 -0
- package/dist/workflows/context/foundation.js +648 -0
- package/dist/workflows/context/foundation.js.map +1 -0
- package/dist/workflows/context/human-base.js +106 -0
- package/dist/workflows/context/human-base.js.map +1 -0
- package/dist/workflows/context/human.js +368 -0
- package/dist/workflows/context/human.js.map +1 -0
- package/dist/workflows/context/measure.js +354 -0
- package/dist/workflows/context/measure.js.map +1 -0
- package/dist/workflows/context/rate-limit.js +358 -0
- package/dist/workflows/context/rate-limit.js.map +1 -0
- package/dist/workflows/context/user.js +117 -0
- package/dist/workflows/context/user.js.map +1 -0
- package/dist/workflows/context/vault.js +360 -0
- package/dist/workflows/context/vault.js.map +1 -0
- package/dist/workflows/data/entity-events/entity-events.js +489 -0
- package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
- package/dist/workflows/data/experiment/index.js +599 -0
- package/dist/workflows/data/experiment/index.js.map +1 -0
- package/dist/workflows/data/goal/context.js +558 -0
- package/dist/workflows/data/goal/context.js.map +1 -0
- package/dist/workflows/data/goal/index.js +32 -0
- package/dist/workflows/data/goal/index.js.map +1 -0
- package/dist/workflows/data/measure/index.js +840 -0
- package/dist/workflows/data/measure/index.js.map +1 -0
- package/dist/workflows/data/stream/index.js +1149 -0
- package/dist/workflows/data/stream/index.js.map +1 -0
- package/dist/workflows/data/track/context.js +883 -0
- package/dist/workflows/data/track/context.js.map +1 -0
- package/dist/workflows/data/track/index.js +15 -0
- package/dist/workflows/data/track/index.js.map +1 -0
- package/dist/workflows/data/view/context.js +864 -0
- package/dist/workflows/data/view/context.js.map +1 -0
- package/dist/workflows/domain.js +93 -0
- package/dist/workflows/domain.js.map +1 -0
- package/dist/workflows/flag.js +176 -0
- package/dist/workflows/flag.js.map +1 -0
- package/dist/workflows/flags.js +217 -0
- package/dist/workflows/flags.js.map +1 -0
- package/dist/workflows/hash.js +209 -0
- package/dist/workflows/hash.js.map +1 -0
- package/dist/workflows/index.js +50 -0
- package/dist/workflows/index.js.map +1 -0
- package/dist/workflows/on.js +378 -0
- package/dist/workflows/on.js.map +1 -0
- package/dist/workflows/pipeline-promise.js +481 -0
- package/dist/workflows/pipeline-promise.js.map +1 -0
- package/dist/workflows/pipeline-types.js +20 -0
- package/dist/workflows/pipeline-types.js.map +1 -0
- package/dist/workflows/proxy.js +76 -0
- package/dist/workflows/proxy.js.map +1 -0
- package/dist/workflows/runtime.js +310 -0
- package/dist/workflows/runtime.js.map +1 -0
- package/dist/workflows/schedule-builder.js +327 -0
- package/dist/workflows/schedule-builder.js.map +1 -0
- package/dist/workflows/visibility/index.js +146 -0
- package/dist/workflows/visibility/index.js.map +1 -0
- package/dist/workflows/visibility/query-parser.js +150 -0
- package/dist/workflows/visibility/query-parser.js.map +1 -0
- package/dist/workflows/visibility/store.js +223 -0
- package/dist/workflows/visibility/store.js.map +1 -0
- package/dist/workflows/visibility/types.js +30 -0
- package/dist/workflows/visibility/types.js.map +1 -0
- package/dist/workflows/workflow.js +53 -0
- package/dist/workflows/workflow.js.map +1 -0
- package/package.json +294 -46
|
@@ -0,0 +1,739 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activities Module
|
|
3
|
+
*
|
|
4
|
+
* Activity proxying and local activity support.
|
|
5
|
+
*/
|
|
6
|
+
import { DurableWorkflowRuntime } from '../../runtime';
|
|
7
|
+
import { parseDuration } from '../utils';
|
|
8
|
+
import { WorkerActivityRouter, ActivityTimeoutError, TaskQueueNotRegisteredError, } from '../activity-router';
|
|
9
|
+
import { getCurrentWorkflow, getCurrentStorage, getWorkflowStep, formatDurationForCF, } from './context';
|
|
10
|
+
import { ensureError } from '../utils';
|
|
11
|
+
// Re-export error classes for backward compatibility
|
|
12
|
+
export { ActivityTimeoutError, TaskQueueNotRegisteredError };
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// TASK QUEUE REGISTRY
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Shared ActivityRouter instance used for routing activities to workers.
|
|
18
|
+
* This provides the unified routing abstraction used across all compat layers.
|
|
19
|
+
*/
|
|
20
|
+
const activityRouter = new WorkerActivityRouter();
|
|
21
|
+
/**
|
|
22
|
+
* Register a worker for a task queue.
|
|
23
|
+
*
|
|
24
|
+
* In real Temporal, workers poll task queues for work. This compat layer
|
|
25
|
+
* validates that a worker is registered before allowing workflow/activity
|
|
26
|
+
* execution on that queue.
|
|
27
|
+
*
|
|
28
|
+
* @param taskQueue - The task queue name to register
|
|
29
|
+
* @param handler - Optional handler configuration for the worker
|
|
30
|
+
* @returns A function to unregister the worker
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* import { registerWorker } from '@dotdo/temporal'
|
|
35
|
+
*
|
|
36
|
+
* // Simple registration - just validates the queue exists
|
|
37
|
+
* const unregister = registerWorker('my-task-queue')
|
|
38
|
+
*
|
|
39
|
+
* // With workflow types
|
|
40
|
+
* const unregister = registerWorker('my-task-queue', {
|
|
41
|
+
* workflowTypes: new Set(['orderWorkflow', 'paymentWorkflow']),
|
|
42
|
+
* })
|
|
43
|
+
*
|
|
44
|
+
* // Cleanup when done
|
|
45
|
+
* unregister()
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function registerWorker(taskQueue, handler = {}) {
|
|
49
|
+
// Delegate to the shared ActivityRouter instance
|
|
50
|
+
// Cast to router's WorkerHandler type (compatible interface, context param optionality differs)
|
|
51
|
+
return activityRouter.registerWorker(taskQueue, handler);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if a task queue has a registered worker
|
|
55
|
+
*/
|
|
56
|
+
export function hasWorker(taskQueue) {
|
|
57
|
+
return activityRouter.hasWorker(taskQueue);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the worker handler for a task queue
|
|
61
|
+
*/
|
|
62
|
+
export function getWorker(taskQueue) {
|
|
63
|
+
return activityRouter.getWorker(taskQueue);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* List all registered task queues
|
|
67
|
+
*/
|
|
68
|
+
export function listTaskQueues() {
|
|
69
|
+
return activityRouter.listTaskQueues();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if task queue routing is enabled.
|
|
73
|
+
*
|
|
74
|
+
* Task queue validation is enabled when at least one worker has been registered.
|
|
75
|
+
* This maintains backward compatibility - existing code that doesnt use
|
|
76
|
+
* registerWorker() will continue to work without changes.
|
|
77
|
+
*/
|
|
78
|
+
function isTaskQueueRoutingEnabled() {
|
|
79
|
+
return activityRouter.isRoutingEnabled();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get the activity router (for testing)
|
|
83
|
+
*/
|
|
84
|
+
export function getActivityRouter() {
|
|
85
|
+
return activityRouter;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Clear the activity router (for testing)
|
|
89
|
+
*/
|
|
90
|
+
export function clearActivityRouter() {
|
|
91
|
+
activityRouter.clear();
|
|
92
|
+
}
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// TASK QUEUE VALIDATION
|
|
95
|
+
// ============================================================================
|
|
96
|
+
/**
|
|
97
|
+
* Validate that a task queue is registered for workflow execution.
|
|
98
|
+
* Throws TaskQueueNotRegisteredError if not registered.
|
|
99
|
+
*
|
|
100
|
+
* NOTE: Validation is only performed when task queue routing is enabled
|
|
101
|
+
* (i.e., when at least one worker has been registered via registerWorker()).
|
|
102
|
+
* This maintains backward compatibility with existing code.
|
|
103
|
+
*
|
|
104
|
+
* @param taskQueue - The task queue to validate
|
|
105
|
+
* @param workflowType - Optional workflow type for more specific validation
|
|
106
|
+
* @throws TaskQueueNotRegisteredError if no worker is registered
|
|
107
|
+
*/
|
|
108
|
+
export function validateTaskQueueForWorkflow(taskQueue, workflowType) {
|
|
109
|
+
// Skip validation if no workers are registered (backward compatibility)
|
|
110
|
+
if (!isTaskQueueRoutingEnabled()) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const worker = activityRouter.getWorker(taskQueue);
|
|
114
|
+
if (!worker) {
|
|
115
|
+
throw new TaskQueueNotRegisteredError(taskQueue, 'workflow');
|
|
116
|
+
}
|
|
117
|
+
// If worker specifies workflow types, validate this type is registered
|
|
118
|
+
if (workflowType && worker.workflowTypes && worker.workflowTypes.size > 0) {
|
|
119
|
+
if (!worker.workflowTypes.has(workflowType)) {
|
|
120
|
+
throw new Error(`Workflow type "${workflowType}" is not registered on task queue "${taskQueue}". ` +
|
|
121
|
+
`Registered types: ${Array.from(worker.workflowTypes).join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Validate that a task queue is registered for activity execution.
|
|
127
|
+
* Throws TaskQueueNotRegisteredError if not registered.
|
|
128
|
+
*
|
|
129
|
+
* NOTE: Validation is only performed when task queue routing is enabled
|
|
130
|
+
* (i.e., when at least one worker has been registered via registerWorker()).
|
|
131
|
+
* This maintains backward compatibility with existing code.
|
|
132
|
+
*
|
|
133
|
+
* @param taskQueue - The task queue to validate
|
|
134
|
+
* @param activityName - Optional activity name for more specific validation
|
|
135
|
+
* @throws TaskQueueNotRegisteredError if no worker is registered
|
|
136
|
+
*/
|
|
137
|
+
function validateTaskQueueForActivity(taskQueue, activityName) {
|
|
138
|
+
// Skip validation if no workers are registered (backward compatibility)
|
|
139
|
+
if (!isTaskQueueRoutingEnabled()) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const worker = activityRouter.getWorker(taskQueue);
|
|
143
|
+
if (!worker) {
|
|
144
|
+
throw new TaskQueueNotRegisteredError(taskQueue, 'activity');
|
|
145
|
+
}
|
|
146
|
+
// If worker specifies activity types, validate this activity is registered
|
|
147
|
+
if (activityName && worker.activityTypes && worker.activityTypes.size > 0) {
|
|
148
|
+
if (!worker.activityTypes.has(activityName)) {
|
|
149
|
+
throw new Error(`Activity "${activityName}" is not registered on task queue "${taskQueue}". ` +
|
|
150
|
+
`Registered activities: ${Array.from(worker.activityTypes).join(', ')}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ============================================================================
|
|
155
|
+
// PROXY ACTIVITIES
|
|
156
|
+
// ============================================================================
|
|
157
|
+
/**
|
|
158
|
+
* Create activity proxies
|
|
159
|
+
*
|
|
160
|
+
* Activities integrate with multiple execution backends:
|
|
161
|
+
*
|
|
162
|
+
* 1. If a remote activity worker binding is registered for the task queue,
|
|
163
|
+
* route via RPC to the dedicated activity worker
|
|
164
|
+
* - Enables independent scaling for CPU-intensive activities
|
|
165
|
+
* - Supports heartbeats for long-running activities
|
|
166
|
+
* - Worker-level timeout enforcement
|
|
167
|
+
*
|
|
168
|
+
* 2. If a local worker with executeActivity handler is registered, route to that handler
|
|
169
|
+
* - Enables testing workflows with mock activity implementations
|
|
170
|
+
* - Handles timeouts, retries, and error classification
|
|
171
|
+
*
|
|
172
|
+
* 3. If WorkflowStep context is available (CF Workflows), use step.do()
|
|
173
|
+
* - DURABLE: automatically retries and survives restarts
|
|
174
|
+
* - REPLAY: completed steps return cached results
|
|
175
|
+
*
|
|
176
|
+
* 4. Otherwise, fall back to DurableWorkflowRuntime
|
|
177
|
+
*
|
|
178
|
+
* Activities can specify a `taskQueue` option to route execution to a specific
|
|
179
|
+
* worker. If a task queue is specified, it must have a registered worker.
|
|
180
|
+
* If no task queue is specified, activities use the workflow's task queue.
|
|
181
|
+
*/
|
|
182
|
+
export function proxyActivities(options) {
|
|
183
|
+
// Activity task queue (can be different from workflow's task queue)
|
|
184
|
+
const activityTaskQueue = options.taskQueue;
|
|
185
|
+
// Parse timeouts once
|
|
186
|
+
const startToCloseTimeoutMs = options.startToCloseTimeout
|
|
187
|
+
? parseDuration(options.startToCloseTimeout)
|
|
188
|
+
: undefined;
|
|
189
|
+
const heartbeatTimeoutMs = options.heartbeatTimeout
|
|
190
|
+
? parseDuration(options.heartbeatTimeout)
|
|
191
|
+
: undefined;
|
|
192
|
+
// Build CF Workflows step.do() options from Temporal activity options
|
|
193
|
+
const buildStepDoOptions = () => {
|
|
194
|
+
const stepOptions = {};
|
|
195
|
+
// Map retry policy
|
|
196
|
+
if (options.retry?.maximumAttempts) {
|
|
197
|
+
stepOptions.retries = {
|
|
198
|
+
limit: options.retry.maximumAttempts,
|
|
199
|
+
backoff: options.retry.backoffCoefficient && options.retry.backoffCoefficient > 1 ? 'exponential' : 'constant',
|
|
200
|
+
delay: options.retry.initialInterval ? String(options.retry.initialInterval) : undefined,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
// Map timeout
|
|
204
|
+
if (options.startToCloseTimeout) {
|
|
205
|
+
stepOptions.timeout = typeof options.startToCloseTimeout === 'string'
|
|
206
|
+
? options.startToCloseTimeout
|
|
207
|
+
: formatDurationForCF(parseDuration(options.startToCloseTimeout));
|
|
208
|
+
}
|
|
209
|
+
// Only return options if we have something to configure
|
|
210
|
+
if (stepOptions.retries || stepOptions.timeout) {
|
|
211
|
+
return stepOptions;
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
};
|
|
215
|
+
return new Proxy({}, {
|
|
216
|
+
get(_, name) {
|
|
217
|
+
return async (...args) => {
|
|
218
|
+
const workflow = getCurrentWorkflow();
|
|
219
|
+
if (!workflow) {
|
|
220
|
+
throw new Error('Activities can only be called within a workflow');
|
|
221
|
+
}
|
|
222
|
+
// Determine which task queue to use for this activity
|
|
223
|
+
const targetTaskQueue = activityTaskQueue ?? workflow.taskQueue;
|
|
224
|
+
// Validate the task queue has a registered worker
|
|
225
|
+
validateTaskQueueForActivity(targetTaskQueue, name);
|
|
226
|
+
// Include task queue in step ID to ensure isolation between queues
|
|
227
|
+
const stepId = `activity:${targetTaskQueue}:${name}:${JSON.stringify(args)}`;
|
|
228
|
+
// Check for replay in workflow stepResults (handles both success and error)
|
|
229
|
+
if (workflow.stepResults.has(stepId)) {
|
|
230
|
+
const cached = workflow.stepResults.get(stepId);
|
|
231
|
+
// If cached value is an error, re-throw it
|
|
232
|
+
if (cached instanceof Error) {
|
|
233
|
+
throw cached;
|
|
234
|
+
}
|
|
235
|
+
return cached;
|
|
236
|
+
}
|
|
237
|
+
// Check for CF Workflows step context - use step.do() for durability
|
|
238
|
+
const step = getWorkflowStep();
|
|
239
|
+
if (step) {
|
|
240
|
+
// Use CF Workflows native step.do() - DURABLE
|
|
241
|
+
// Use per-workflow counter for deterministic IDs across concurrent workflows
|
|
242
|
+
workflow.activityStepCounter++;
|
|
243
|
+
const stepName = `activity:${name}:${workflow.activityStepCounter}`;
|
|
244
|
+
const stepDoOptions = buildStepDoOptions();
|
|
245
|
+
// The callback is what CF Workflows will execute.
|
|
246
|
+
// Priority: Remote worker > Local worker > Stub
|
|
247
|
+
const callback = async () => {
|
|
248
|
+
// 1. Check for remote activity worker binding (independent scaling)
|
|
249
|
+
const remoteBinding = remoteActivityBindings.get(targetTaskQueue);
|
|
250
|
+
if (remoteBinding) {
|
|
251
|
+
const executionId = `${workflow.workflowId}:${workflow.runId}:${name}:${workflow.activityStepCounter}`;
|
|
252
|
+
const response = await remoteBinding.execute({
|
|
253
|
+
executionId,
|
|
254
|
+
activityName: name,
|
|
255
|
+
args,
|
|
256
|
+
startToCloseTimeoutMs,
|
|
257
|
+
heartbeatTimeoutMs,
|
|
258
|
+
workflowId: workflow.workflowId,
|
|
259
|
+
runId: workflow.runId,
|
|
260
|
+
});
|
|
261
|
+
if (!response.success) {
|
|
262
|
+
const error = new Error(response.error?.message ?? 'Activity execution failed');
|
|
263
|
+
error.name = response.error?.name ?? 'ActivityError';
|
|
264
|
+
throw error;
|
|
265
|
+
}
|
|
266
|
+
return response.result;
|
|
267
|
+
}
|
|
268
|
+
// 2. Check if local worker has a handler for this activity
|
|
269
|
+
const worker = activityRouter.getWorker(targetTaskQueue);
|
|
270
|
+
if (worker?.executeActivity) {
|
|
271
|
+
// Create activity context with cancellation signal
|
|
272
|
+
const activityContext = {
|
|
273
|
+
signal: workflow.abortController?.signal,
|
|
274
|
+
};
|
|
275
|
+
return worker.executeActivity(name, args, activityContext);
|
|
276
|
+
}
|
|
277
|
+
// 3. Fallback for CF Workflows runtime (no local handler)
|
|
278
|
+
return { _activity: name, _args: args, _stub: true };
|
|
279
|
+
};
|
|
280
|
+
// Call step.do() with or without options
|
|
281
|
+
const result = stepDoOptions
|
|
282
|
+
? await step.do(stepName, stepDoOptions, callback)
|
|
283
|
+
: await step.do(stepName, callback);
|
|
284
|
+
workflow.stepResults.set(stepId, result);
|
|
285
|
+
workflow.historyLength++;
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
// Fallback when no WorkflowStep is available:
|
|
289
|
+
// Priority: Remote worker > Local worker > DurableWorkflowRuntime
|
|
290
|
+
// 1. Check for remote activity worker binding (independent scaling)
|
|
291
|
+
const remoteBinding = remoteActivityBindings.get(targetTaskQueue);
|
|
292
|
+
if (remoteBinding) {
|
|
293
|
+
const executionId = `${workflow.workflowId}:${workflow.runId}:${name}:${Date.now()}`;
|
|
294
|
+
try {
|
|
295
|
+
const response = await remoteBinding.execute({
|
|
296
|
+
executionId,
|
|
297
|
+
activityName: name,
|
|
298
|
+
args,
|
|
299
|
+
startToCloseTimeoutMs,
|
|
300
|
+
heartbeatTimeoutMs,
|
|
301
|
+
workflowId: workflow.workflowId,
|
|
302
|
+
runId: workflow.runId,
|
|
303
|
+
});
|
|
304
|
+
if (!response.success) {
|
|
305
|
+
const error = new Error(response.error?.message ?? 'Activity execution failed');
|
|
306
|
+
error.name = response.error?.name ?? 'ActivityError';
|
|
307
|
+
// Cache error for replay
|
|
308
|
+
workflow.stepResults.set(stepId, error);
|
|
309
|
+
workflow.historyLength++;
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
// Cache successful result
|
|
313
|
+
workflow.stepResults.set(stepId, response.result);
|
|
314
|
+
workflow.historyLength++;
|
|
315
|
+
return response.result;
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
const err = ensureError(error);
|
|
319
|
+
workflow.stepResults.set(stepId, err);
|
|
320
|
+
workflow.historyLength++;
|
|
321
|
+
throw err;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// 2. Get the local worker for this task queue via activityRouter
|
|
325
|
+
const worker = activityRouter.getWorker(targetTaskQueue);
|
|
326
|
+
// If local worker has executeActivity handler, route via activityRouter (no step.do() durability)
|
|
327
|
+
if (worker?.executeActivity) {
|
|
328
|
+
// Create activity context with cancellation signal
|
|
329
|
+
const activityContext = {
|
|
330
|
+
signal: workflow.abortController?.signal,
|
|
331
|
+
};
|
|
332
|
+
// Build ActivityRouterOptions from Temporal ActivityOptions
|
|
333
|
+
// Use heartbeat timeout if specified and shorter than start-to-close timeout
|
|
334
|
+
// Heartbeat timeout in Temporal means the activity must heartbeat within this interval
|
|
335
|
+
// In our emulation, we use it as an effective timeout for activities that don't heartbeat
|
|
336
|
+
let effectiveTimeout = startToCloseTimeoutMs;
|
|
337
|
+
if (heartbeatTimeoutMs) {
|
|
338
|
+
if (!effectiveTimeout || heartbeatTimeoutMs < effectiveTimeout) {
|
|
339
|
+
effectiveTimeout = heartbeatTimeoutMs;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
const routerOptions = {
|
|
343
|
+
taskQueue: targetTaskQueue,
|
|
344
|
+
timeout: effectiveTimeout,
|
|
345
|
+
retries: options.retry ? {
|
|
346
|
+
maximumAttempts: options.retry.maximumAttempts,
|
|
347
|
+
initialInterval: options.retry.initialInterval,
|
|
348
|
+
backoffCoefficient: options.retry.backoffCoefficient,
|
|
349
|
+
maximumInterval: options.retry.maximumInterval,
|
|
350
|
+
nonRetryableErrors: options.retry.nonRetryableErrorTypes ? [...options.retry.nonRetryableErrorTypes] : undefined,
|
|
351
|
+
} : undefined,
|
|
352
|
+
};
|
|
353
|
+
try {
|
|
354
|
+
// Route activity via the shared ActivityRouter - handles timeouts and retries
|
|
355
|
+
const result = await activityRouter.route(name, args, routerOptions, activityContext);
|
|
356
|
+
// Cache successful result
|
|
357
|
+
workflow.stepResults.set(stepId, result);
|
|
358
|
+
workflow.historyLength++;
|
|
359
|
+
return result;
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
// Cache error for replay (determinism)
|
|
363
|
+
const err = ensureError(error);
|
|
364
|
+
workflow.stepResults.set(stepId, err);
|
|
365
|
+
workflow.historyLength++;
|
|
366
|
+
throw err;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// Fallback: Execute through DurableWorkflowRuntime
|
|
370
|
+
// Uses getCurrentStorage() for consistent storage access
|
|
371
|
+
const runtime = new DurableWorkflowRuntime({
|
|
372
|
+
storage: getCurrentStorage(),
|
|
373
|
+
retryPolicy: options.retry
|
|
374
|
+
? {
|
|
375
|
+
maxAttempts: options.retry.maximumAttempts ?? 3,
|
|
376
|
+
initialDelayMs: options.retry.initialInterval ? parseDuration(options.retry.initialInterval) : 1000,
|
|
377
|
+
maxDelayMs: options.retry.maximumInterval ? parseDuration(options.retry.maximumInterval) : 30000,
|
|
378
|
+
backoffMultiplier: options.retry.backoffCoefficient ?? 2,
|
|
379
|
+
jitter: true,
|
|
380
|
+
}
|
|
381
|
+
: undefined,
|
|
382
|
+
});
|
|
383
|
+
const result = await runtime.executeStep(stepId, {
|
|
384
|
+
path: ['Activity', name],
|
|
385
|
+
context: { args, taskQueue: targetTaskQueue },
|
|
386
|
+
contextHash: stepId,
|
|
387
|
+
runtime,
|
|
388
|
+
}, args, 'do');
|
|
389
|
+
workflow.stepResults.set(stepId, result);
|
|
390
|
+
workflow.historyLength++;
|
|
391
|
+
return result;
|
|
392
|
+
};
|
|
393
|
+
},
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
// ============================================================================
|
|
397
|
+
// LOCAL ACTIVITIES
|
|
398
|
+
// ============================================================================
|
|
399
|
+
/**
|
|
400
|
+
* Create local activity proxies
|
|
401
|
+
*/
|
|
402
|
+
export function proxyLocalActivities(options) {
|
|
403
|
+
// Local activities run in the same process with shorter timeouts
|
|
404
|
+
return proxyActivities(options);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Activity Worker - Executes activities on a dedicated CF Worker.
|
|
408
|
+
*
|
|
409
|
+
* This class implements the WorkerEntrypoint pattern for RPC access
|
|
410
|
+
* via Service Bindings, enabling activities to run on separate workers
|
|
411
|
+
* that can be independently scaled.
|
|
412
|
+
*
|
|
413
|
+
* ## Architecture
|
|
414
|
+
*
|
|
415
|
+
* ```
|
|
416
|
+
* [Workflow DO] --RPC--> [Activity Worker] --execute--> [Activity Function]
|
|
417
|
+
* ^ |
|
|
418
|
+
* | v
|
|
419
|
+
* +------- heartbeat ------+
|
|
420
|
+
* ```
|
|
421
|
+
*
|
|
422
|
+
* ## Deployment
|
|
423
|
+
*
|
|
424
|
+
* ```toml
|
|
425
|
+
* # wrangler.toml for activity worker
|
|
426
|
+
* name = "activity-worker-image-processing"
|
|
427
|
+
*
|
|
428
|
+
* [[services]]
|
|
429
|
+
* binding = "IMAGE_WORKER"
|
|
430
|
+
* service = "activity-worker-image-processing"
|
|
431
|
+
* entrypoint = "ActivityWorker"
|
|
432
|
+
* ```
|
|
433
|
+
*
|
|
434
|
+
* @example
|
|
435
|
+
* ```typescript
|
|
436
|
+
* // activity-worker.ts
|
|
437
|
+
* import { createActivityWorker } from '@dotdo/temporal'
|
|
438
|
+
*
|
|
439
|
+
* const processImage = async (imageUrl: string, options: ImageOptions) => {
|
|
440
|
+
* // CPU-intensive image processing
|
|
441
|
+
* return { url: processedUrl }
|
|
442
|
+
* }
|
|
443
|
+
*
|
|
444
|
+
* export const ActivityWorker = createActivityWorker({
|
|
445
|
+
* taskQueue: 'image-processing',
|
|
446
|
+
* activities: {
|
|
447
|
+
* processImage,
|
|
448
|
+
* },
|
|
449
|
+
* })
|
|
450
|
+
*
|
|
451
|
+
* // In workflow:
|
|
452
|
+
* const activities = proxyActivities<typeof ActivityWorker.activities>({
|
|
453
|
+
* taskQueue: 'image-processing',
|
|
454
|
+
* startToCloseTimeout: '5m',
|
|
455
|
+
* })
|
|
456
|
+
*
|
|
457
|
+
* const result = await activities.processImage(imageUrl, options)
|
|
458
|
+
* ```
|
|
459
|
+
*/
|
|
460
|
+
export class ActivityWorker {
|
|
461
|
+
taskQueue;
|
|
462
|
+
activities;
|
|
463
|
+
defaultStartToCloseTimeoutMs;
|
|
464
|
+
defaultHeartbeatTimeoutMs;
|
|
465
|
+
maxConcurrentActivities;
|
|
466
|
+
namespace;
|
|
467
|
+
activeActivities = new Map();
|
|
468
|
+
constructor(config) {
|
|
469
|
+
this.taskQueue = config.taskQueue;
|
|
470
|
+
this.activities = config.activities;
|
|
471
|
+
this.defaultStartToCloseTimeoutMs = config.defaultStartToCloseTimeout
|
|
472
|
+
? parseDuration(config.defaultStartToCloseTimeout)
|
|
473
|
+
: 5 * 60 * 1000; // 5 minutes
|
|
474
|
+
this.defaultHeartbeatTimeoutMs = config.defaultHeartbeatTimeout
|
|
475
|
+
? parseDuration(config.defaultHeartbeatTimeout)
|
|
476
|
+
: 30 * 1000; // 30 seconds
|
|
477
|
+
this.maxConcurrentActivities = config.maxConcurrentActivities ?? 10;
|
|
478
|
+
this.namespace = config.namespace ?? config.taskQueue;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Execute an activity.
|
|
482
|
+
* This is the main RPC method called from workflows.
|
|
483
|
+
*/
|
|
484
|
+
async execute(request) {
|
|
485
|
+
const startTime = Date.now();
|
|
486
|
+
const { executionId, activityName, args } = request;
|
|
487
|
+
// Check if activity exists
|
|
488
|
+
const activityFn = this.activities[activityName];
|
|
489
|
+
if (!activityFn) {
|
|
490
|
+
return {
|
|
491
|
+
executionId,
|
|
492
|
+
success: false,
|
|
493
|
+
error: {
|
|
494
|
+
name: 'ActivityNotFoundError',
|
|
495
|
+
message: `Activity "${activityName}" not found on task queue "${this.taskQueue}"`,
|
|
496
|
+
isRetryable: false,
|
|
497
|
+
},
|
|
498
|
+
durationMs: Date.now() - startTime,
|
|
499
|
+
};
|
|
500
|
+
}
|
|
501
|
+
// Check concurrency limit
|
|
502
|
+
if (this.activeActivities.size >= this.maxConcurrentActivities) {
|
|
503
|
+
return {
|
|
504
|
+
executionId,
|
|
505
|
+
success: false,
|
|
506
|
+
error: {
|
|
507
|
+
name: 'ActivityConcurrencyLimitError',
|
|
508
|
+
message: `Activity worker at capacity (${this.maxConcurrentActivities} concurrent activities)`,
|
|
509
|
+
isRetryable: true,
|
|
510
|
+
},
|
|
511
|
+
durationMs: Date.now() - startTime,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
// Setup activity tracking
|
|
515
|
+
const abortController = new AbortController();
|
|
516
|
+
const activeActivity = {
|
|
517
|
+
id: executionId,
|
|
518
|
+
name: activityName,
|
|
519
|
+
startTime,
|
|
520
|
+
lastHeartbeat: startTime,
|
|
521
|
+
abortController,
|
|
522
|
+
};
|
|
523
|
+
this.activeActivities.set(executionId, activeActivity);
|
|
524
|
+
// Setup timeouts
|
|
525
|
+
const startToCloseTimeoutMs = request.startToCloseTimeoutMs ?? this.defaultStartToCloseTimeoutMs;
|
|
526
|
+
const heartbeatTimeoutMs = request.heartbeatTimeoutMs ?? this.defaultHeartbeatTimeoutMs;
|
|
527
|
+
let lastHeartbeatDetails;
|
|
528
|
+
// Heartbeat context for the activity
|
|
529
|
+
const heartbeatCtx = {
|
|
530
|
+
heartbeat: (details) => {
|
|
531
|
+
activeActivity.lastHeartbeat = Date.now();
|
|
532
|
+
activeActivity.heartbeatDetails = details;
|
|
533
|
+
lastHeartbeatDetails = details;
|
|
534
|
+
// Reset heartbeat timeout
|
|
535
|
+
if (activeActivity.heartbeatTimeoutId) {
|
|
536
|
+
clearTimeout(activeActivity.heartbeatTimeoutId);
|
|
537
|
+
}
|
|
538
|
+
activeActivity.heartbeatTimeoutId = setTimeout(() => {
|
|
539
|
+
abortController.abort(new Error('Activity heartbeat timeout'));
|
|
540
|
+
}, heartbeatTimeoutMs);
|
|
541
|
+
},
|
|
542
|
+
get isCancelled() {
|
|
543
|
+
return abortController.signal.aborted;
|
|
544
|
+
},
|
|
545
|
+
signal: abortController.signal,
|
|
546
|
+
};
|
|
547
|
+
try {
|
|
548
|
+
// Setup start-to-close timeout
|
|
549
|
+
activeActivity.timeoutId = setTimeout(() => {
|
|
550
|
+
abortController.abort(new Error('Activity start-to-close timeout'));
|
|
551
|
+
}, startToCloseTimeoutMs);
|
|
552
|
+
// Setup initial heartbeat timeout
|
|
553
|
+
activeActivity.heartbeatTimeoutId = setTimeout(() => {
|
|
554
|
+
abortController.abort(new Error('Activity heartbeat timeout'));
|
|
555
|
+
}, heartbeatTimeoutMs);
|
|
556
|
+
// Execute the activity
|
|
557
|
+
// Check if activity expects heartbeat context (first param is HeartbeatContext)
|
|
558
|
+
const result = await activityFn(...args);
|
|
559
|
+
return {
|
|
560
|
+
executionId,
|
|
561
|
+
success: true,
|
|
562
|
+
result,
|
|
563
|
+
durationMs: Date.now() - startTime,
|
|
564
|
+
lastHeartbeatDetails,
|
|
565
|
+
};
|
|
566
|
+
}
|
|
567
|
+
catch (error) {
|
|
568
|
+
const err = ensureError(error);
|
|
569
|
+
const isTimeout = err.message.includes('timeout');
|
|
570
|
+
const isCancelled = err.message.includes('cancelled') || abortController.signal.aborted;
|
|
571
|
+
return {
|
|
572
|
+
executionId,
|
|
573
|
+
success: false,
|
|
574
|
+
error: {
|
|
575
|
+
name: err.name,
|
|
576
|
+
message: err.message,
|
|
577
|
+
stack: err.stack,
|
|
578
|
+
// Timeouts and cancellations are not retryable
|
|
579
|
+
isRetryable: !isTimeout && !isCancelled,
|
|
580
|
+
},
|
|
581
|
+
durationMs: Date.now() - startTime,
|
|
582
|
+
lastHeartbeatDetails,
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
finally {
|
|
586
|
+
// Cleanup
|
|
587
|
+
if (activeActivity.timeoutId) {
|
|
588
|
+
clearTimeout(activeActivity.timeoutId);
|
|
589
|
+
}
|
|
590
|
+
if (activeActivity.heartbeatTimeoutId) {
|
|
591
|
+
clearTimeout(activeActivity.heartbeatTimeoutId);
|
|
592
|
+
}
|
|
593
|
+
this.activeActivities.delete(executionId);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Cancel an in-progress activity.
|
|
598
|
+
*/
|
|
599
|
+
async cancel(executionId) {
|
|
600
|
+
const activity = this.activeActivities.get(executionId);
|
|
601
|
+
if (!activity) {
|
|
602
|
+
return false;
|
|
603
|
+
}
|
|
604
|
+
activity.abortController.abort(new Error('Activity cancelled'));
|
|
605
|
+
return true;
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Get heartbeat status for an activity.
|
|
609
|
+
*/
|
|
610
|
+
async heartbeatStatus(executionId) {
|
|
611
|
+
const activity = this.activeActivities.get(executionId);
|
|
612
|
+
if (!activity) {
|
|
613
|
+
return { found: false };
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
found: true,
|
|
617
|
+
lastHeartbeat: activity.lastHeartbeat,
|
|
618
|
+
details: activity.heartbeatDetails,
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Get worker status (for health checks).
|
|
623
|
+
*/
|
|
624
|
+
async status() {
|
|
625
|
+
return {
|
|
626
|
+
taskQueue: this.taskQueue,
|
|
627
|
+
activeCount: this.activeActivities.size,
|
|
628
|
+
maxConcurrent: this.maxConcurrentActivities,
|
|
629
|
+
activities: Object.keys(this.activities),
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Create an activity worker for a task queue.
|
|
635
|
+
*
|
|
636
|
+
* This is the main factory function for creating activity workers that
|
|
637
|
+
* run on dedicated Cloudflare Workers for independent scaling.
|
|
638
|
+
*
|
|
639
|
+
* ## Usage
|
|
640
|
+
*
|
|
641
|
+
* 1. Define your activities as async functions
|
|
642
|
+
* 2. Create the worker with createActivityWorker()
|
|
643
|
+
* 3. Export the worker class from your worker entry point
|
|
644
|
+
* 4. Configure service binding in wrangler.toml
|
|
645
|
+
* 5. Use proxyActivities() in workflows with matching taskQueue
|
|
646
|
+
*
|
|
647
|
+
* @example
|
|
648
|
+
* ```typescript
|
|
649
|
+
* // activities/image-worker.ts
|
|
650
|
+
* import { createActivityWorker } from '@dotdo/temporal'
|
|
651
|
+
*
|
|
652
|
+
* // Define activities
|
|
653
|
+
* async function processImage(url: string, options: ImageOptions) {
|
|
654
|
+
* // CPU-intensive processing
|
|
655
|
+
* return { processedUrl: '...' }
|
|
656
|
+
* }
|
|
657
|
+
*
|
|
658
|
+
* async function generateThumbnail(url: string, size: number) {
|
|
659
|
+
* // Generate thumbnail
|
|
660
|
+
* return { thumbnailUrl: '...' }
|
|
661
|
+
* }
|
|
662
|
+
*
|
|
663
|
+
* // Create the worker
|
|
664
|
+
* export const activityWorker = createActivityWorker({
|
|
665
|
+
* taskQueue: 'image-processing',
|
|
666
|
+
* activities: {
|
|
667
|
+
* processImage,
|
|
668
|
+
* generateThumbnail,
|
|
669
|
+
* },
|
|
670
|
+
* defaultStartToCloseTimeout: '10m',
|
|
671
|
+
* defaultHeartbeatTimeout: '1m',
|
|
672
|
+
* maxConcurrentActivities: 5,
|
|
673
|
+
* })
|
|
674
|
+
*
|
|
675
|
+
* // Export for Cloudflare Workers
|
|
676
|
+
* export { activityWorker as ActivityWorker }
|
|
677
|
+
*
|
|
678
|
+
* // In wrangler.toml:
|
|
679
|
+
* // [[services]]
|
|
680
|
+
* // binding = "IMAGE_ACTIVITIES"
|
|
681
|
+
* // service = "image-processing-worker"
|
|
682
|
+
* // entrypoint = "ActivityWorker"
|
|
683
|
+
* ```
|
|
684
|
+
*
|
|
685
|
+
* @param config - Activity worker configuration
|
|
686
|
+
* @returns ActivityWorker instance that can be exported as a WorkerEntrypoint
|
|
687
|
+
*/
|
|
688
|
+
export function createActivityWorker(config) {
|
|
689
|
+
return new ActivityWorker(config);
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Registry of remote activity worker bindings.
|
|
693
|
+
* Used by proxyActivities to route to remote workers.
|
|
694
|
+
*/
|
|
695
|
+
const remoteActivityBindings = new Map();
|
|
696
|
+
/**
|
|
697
|
+
* Register a remote activity worker binding for a task queue.
|
|
698
|
+
*
|
|
699
|
+
* Call this during worker initialization to register service bindings
|
|
700
|
+
* for remote activity workers.
|
|
701
|
+
*
|
|
702
|
+
* @example
|
|
703
|
+
* ```typescript
|
|
704
|
+
* export default {
|
|
705
|
+
* async fetch(request: Request, env: Env) {
|
|
706
|
+
* // Register remote activity workers
|
|
707
|
+
* registerRemoteActivityWorker('image-processing', env.IMAGE_ACTIVITIES)
|
|
708
|
+
* registerRemoteActivityWorker('email-sending', env.EMAIL_ACTIVITIES)
|
|
709
|
+
*
|
|
710
|
+
* // ... rest of handler
|
|
711
|
+
* }
|
|
712
|
+
* }
|
|
713
|
+
* ```
|
|
714
|
+
*
|
|
715
|
+
* @param taskQueue - Task queue name
|
|
716
|
+
* @param binding - Service binding to the activity worker
|
|
717
|
+
*/
|
|
718
|
+
export function registerRemoteActivityWorker(taskQueue, binding) {
|
|
719
|
+
remoteActivityBindings.set(taskQueue, binding);
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Get a registered remote activity worker binding.
|
|
723
|
+
*/
|
|
724
|
+
export function getRemoteActivityWorker(taskQueue) {
|
|
725
|
+
return remoteActivityBindings.get(taskQueue);
|
|
726
|
+
}
|
|
727
|
+
/**
|
|
728
|
+
* Clear remote activity worker bindings (for testing).
|
|
729
|
+
*/
|
|
730
|
+
export function clearRemoteActivityWorkers() {
|
|
731
|
+
remoteActivityBindings.clear();
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Check if a task queue has a remote activity worker binding.
|
|
735
|
+
*/
|
|
736
|
+
export function hasRemoteActivityWorker(taskQueue) {
|
|
737
|
+
return remoteActivityBindings.has(taskQueue);
|
|
738
|
+
}
|
|
739
|
+
//# sourceMappingURL=activities.js.map
|