dotdo 0.0.1 → 0.0.2
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/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/analytics/router.js +601 -0
- package/dist/api/analytics/router.js.map +1 -0
- package/dist/api/index.js +158 -0
- package/dist/api/index.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 +544 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/middleware/error-handling.js +176 -0
- package/dist/api/middleware/error-handling.js.map +1 -0
- package/dist/api/middleware/request-id.js +21 -0
- package/dist/api/middleware/request-id.js.map +1 -0
- package/dist/api/pages.js +1180 -0
- package/dist/api/pages.js.map +1 -0
- package/dist/api/routes/api.js +612 -0
- package/dist/api/routes/api.js.map +1 -0
- package/dist/api/routes/browsers.js +471 -0
- package/dist/api/routes/browsers.js.map +1 -0
- package/dist/api/routes/do.js +188 -0
- package/dist/api/routes/do.js.map +1 -0
- package/dist/api/routes/mcp.js +459 -0
- package/dist/api/routes/mcp.js.map +1 -0
- package/dist/api/routes/obs.js +445 -0
- package/dist/api/routes/obs.js.map +1 -0
- package/dist/api/routes/openapi.js +794 -0
- package/dist/api/routes/openapi.js.map +1 -0
- package/dist/api/routes/rpc.js +1103 -0
- package/dist/api/routes/rpc.js.map +1 -0
- package/dist/api/routes/sandboxes.js +389 -0
- package/dist/api/routes/sandboxes.js.map +1 -0
- package/dist/api/test-do.js +38 -0
- package/dist/api/test-do.js.map +1 -0
- package/dist/api/types.js +11 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli/bin.js +2 -0
- package/dist/cli/main.js +52342 -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 +118 -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/bash.js +35 -0
- package/dist/do/bash.js.map +1 -0
- package/dist/do/fs.js +25 -0
- package/dist/do/fs.js.map +1 -0
- package/dist/do/full.js +61 -0
- package/dist/do/full.js.map +1 -0
- package/dist/do/git.js +28 -0
- package/dist/do/git.js.map +1 -0
- package/dist/do/index.js +52 -0
- package/dist/do/index.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/agent/tools/bash.js +336 -0
- package/dist/lib/agent/tools/bash.js.map +1 -0
- package/dist/lib/agent/tools/edit.js +157 -0
- package/dist/lib/agent/tools/edit.js.map +1 -0
- package/dist/lib/agent/tools/glob.js +137 -0
- package/dist/lib/agent/tools/glob.js.map +1 -0
- package/dist/lib/agent/tools/grep.js +315 -0
- package/dist/lib/agent/tools/grep.js.map +1 -0
- package/dist/lib/agent/tools/index.js +71 -0
- package/dist/lib/agent/tools/index.js.map +1 -0
- package/dist/lib/agent/tools/read.js +212 -0
- package/dist/lib/agent/tools/read.js.map +1 -0
- package/dist/lib/agent/tools/types.js +197 -0
- package/dist/lib/agent/tools/types.js.map +1 -0
- package/dist/lib/agent/tools/write.js +159 -0
- package/dist/lib/agent/tools/write.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 +825 -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 +1011 -0
- package/dist/lib/mixins/git.js.map +1 -0
- package/dist/lib/mixins/index.js +29 -0
- package/dist/lib/mixins/index.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 +1189 -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/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 +648 -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 +690 -0
- package/dist/objects/transport/mcp-server.js.map +1 -0
- package/dist/objects/transport/rest-autowire.js +1507 -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 +1536 -0
- package/dist/objects/transport/rpc-server.js.map +1 -0
- package/dist/objects/transport/shared.js +575 -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/primitives/bashx/src/ast/analyze.js +1472 -0
- package/dist/primitives/bashx/src/ast/analyze.js.map +1 -0
- package/dist/primitives/bashx/src/ast/parser.js +1488 -0
- package/dist/primitives/bashx/src/ast/parser.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/crypto.js +1954 -0
- package/dist/primitives/bashx/src/do/commands/crypto.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/data-processing.js +1812 -0
- package/dist/primitives/bashx/src/do/commands/data-processing.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/extended-utils.js +804 -0
- package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/math-control.js +1122 -0
- package/dist/primitives/bashx/src/do/commands/math-control.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/posix-utils.js +1015 -0
- package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/system-utils.js +687 -0
- package/dist/primitives/bashx/src/do/commands/system-utils.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/test-command.js +523 -0
- package/dist/primitives/bashx/src/do/commands/test-command.js.map +1 -0
- package/dist/primitives/bashx/src/do/commands/text-processing.js +1550 -0
- package/dist/primitives/bashx/src/do/commands/text-processing.js.map +1 -0
- package/dist/primitives/bashx/src/do/container-executor.js +429 -0
- package/dist/primitives/bashx/src/do/container-executor.js.map +1 -0
- package/dist/primitives/bashx/src/do/index.js +668 -0
- package/dist/primitives/bashx/src/do/index.js.map +1 -0
- package/dist/primitives/bashx/src/do/tiered-executor.js +2647 -0
- package/dist/primitives/bashx/src/do/tiered-executor.js.map +1 -0
- package/dist/primitives/bashx/src/do/worker.js +352 -0
- package/dist/primitives/bashx/src/do/worker.js.map +1 -0
- package/dist/primitives/bashx/src/types.js +10 -0
- package/dist/primitives/bashx/src/types.js.map +1 -0
- package/dist/primitives/fsx/core/backend.js +480 -0
- package/dist/primitives/fsx/core/backend.js.map +1 -0
- package/dist/primitives/fsx/core/constants.js +140 -0
- package/dist/primitives/fsx/core/constants.js.map +1 -0
- package/dist/primitives/fsx/core/fsx.js +1184 -0
- package/dist/primitives/fsx/core/fsx.js.map +1 -0
- package/dist/primitives/fsx/core/glob/glob.js +438 -0
- package/dist/primitives/fsx/core/glob/glob.js.map +1 -0
- package/dist/primitives/fsx/core/glob/index.js +8 -0
- package/dist/primitives/fsx/core/glob/index.js.map +1 -0
- package/dist/primitives/fsx/core/glob/match.js +392 -0
- package/dist/primitives/fsx/core/glob/match.js.map +1 -0
- package/dist/primitives/fsx/core/types.js +307 -0
- package/dist/primitives/fsx/core/types.js.map +1 -0
- package/dist/sandbox/index.js +258 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sdk/capnweb-compat.js +42 -0
- package/dist/sdk/capnweb-compat.js.map +1 -0
- package/dist/sdk/client.js +20 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/index.js +17 -0
- package/dist/sdk/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 +1215 -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 +148 -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 +279 -46
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DO Location Caching
|
|
3
|
+
*
|
|
4
|
+
* Issue: dotdo-4cgch - DO location caching
|
|
5
|
+
*
|
|
6
|
+
* Once a DO detects its location, it should cache it in DO storage since
|
|
7
|
+
* the location never changes for a given DO instance.
|
|
8
|
+
*
|
|
9
|
+
* This module provides:
|
|
10
|
+
* - LocationCache class for managing cached DO location
|
|
11
|
+
* - getOrDetectLocation() function for cached location retrieval
|
|
12
|
+
* - Storage key constants for consistent access
|
|
13
|
+
*/
|
|
14
|
+
import { fetchDOLocation } from './detection';
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Storage Key Constants
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Storage key used for caching DO location
|
|
20
|
+
*/
|
|
21
|
+
export const LOCATION_STORAGE_KEY = 'do:location';
|
|
22
|
+
/**
|
|
23
|
+
* Cache version for migration support
|
|
24
|
+
*/
|
|
25
|
+
export const LOCATION_CACHE_VERSION = 1;
|
|
26
|
+
/**
|
|
27
|
+
* Serialize DOLocation for storage
|
|
28
|
+
*/
|
|
29
|
+
function serializeDOLocation(location) {
|
|
30
|
+
const serialized = {
|
|
31
|
+
colo: location.colo,
|
|
32
|
+
region: location.region,
|
|
33
|
+
city: location.city,
|
|
34
|
+
cfHint: location.cfHint,
|
|
35
|
+
detectedAt: location.detectedAt instanceof Date
|
|
36
|
+
? location.detectedAt.toISOString()
|
|
37
|
+
: new Date(location.detectedAt).toISOString(),
|
|
38
|
+
};
|
|
39
|
+
if (location.coordinates)
|
|
40
|
+
serialized.coordinates = location.coordinates;
|
|
41
|
+
if (location.cf)
|
|
42
|
+
serialized.cf = location.cf;
|
|
43
|
+
if (location.trace)
|
|
44
|
+
serialized.trace = location.trace;
|
|
45
|
+
if (location.ip)
|
|
46
|
+
serialized.ip = location.ip;
|
|
47
|
+
if (location.country)
|
|
48
|
+
serialized.country = location.country;
|
|
49
|
+
if (location.timezone)
|
|
50
|
+
serialized.timezone = location.timezone;
|
|
51
|
+
return serialized;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Deserialize DOLocation from storage
|
|
55
|
+
*/
|
|
56
|
+
function deserializeDOLocation(serialized) {
|
|
57
|
+
const location = {
|
|
58
|
+
colo: serialized.colo,
|
|
59
|
+
region: serialized.region,
|
|
60
|
+
city: serialized.city,
|
|
61
|
+
cfHint: serialized.cfHint,
|
|
62
|
+
detectedAt: new Date(serialized.detectedAt),
|
|
63
|
+
};
|
|
64
|
+
if (serialized.coordinates)
|
|
65
|
+
location.coordinates = serialized.coordinates;
|
|
66
|
+
if (serialized.cf)
|
|
67
|
+
location.cf = serialized.cf;
|
|
68
|
+
if (serialized.trace)
|
|
69
|
+
location.trace = serialized.trace;
|
|
70
|
+
if (serialized.ip)
|
|
71
|
+
location.ip = serialized.ip;
|
|
72
|
+
if (serialized.country)
|
|
73
|
+
location.country = serialized.country;
|
|
74
|
+
if (serialized.timezone)
|
|
75
|
+
location.timezone = serialized.timezone;
|
|
76
|
+
return location;
|
|
77
|
+
}
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// LocationCache Class
|
|
80
|
+
// ============================================================================
|
|
81
|
+
/**
|
|
82
|
+
* Cache for storing and retrieving DO location from DurableObjectStorage
|
|
83
|
+
*
|
|
84
|
+
* Once a DO detects its location, it's immutable for the lifetime of that
|
|
85
|
+
* DO instance. This cache ensures we only detect once and persist the result.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const cache = new LocationCache(ctx.storage)
|
|
90
|
+
*
|
|
91
|
+
* // Check if location is cached
|
|
92
|
+
* if (await cache.has()) {
|
|
93
|
+
* const location = await cache.get()
|
|
94
|
+
* console.log(`DO located at: ${location.city}`)
|
|
95
|
+
* }
|
|
96
|
+
*
|
|
97
|
+
* // Cache detected location
|
|
98
|
+
* await cache.set(detectedLocation)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export class LocationCache {
|
|
102
|
+
storage;
|
|
103
|
+
constructor(storage) {
|
|
104
|
+
this.storage = storage;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get cached location or null if not cached
|
|
108
|
+
*
|
|
109
|
+
* @returns The cached DOLocation or null
|
|
110
|
+
*/
|
|
111
|
+
async get() {
|
|
112
|
+
const cached = await this.storage.get(LOCATION_STORAGE_KEY);
|
|
113
|
+
if (!cached) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return deserializeDOLocation(cached);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Set cached location (returns the location)
|
|
120
|
+
*
|
|
121
|
+
* If a location is already cached, this is a no-op and returns
|
|
122
|
+
* the existing cached location (immutable per DO instance).
|
|
123
|
+
*
|
|
124
|
+
* @param location - The location to cache
|
|
125
|
+
* @returns The cached location (may be existing if already set)
|
|
126
|
+
*/
|
|
127
|
+
async set(location) {
|
|
128
|
+
// Check if already cached - don't overwrite
|
|
129
|
+
const existing = await this.get();
|
|
130
|
+
if (existing) {
|
|
131
|
+
return existing;
|
|
132
|
+
}
|
|
133
|
+
// Store serialized location
|
|
134
|
+
await this.storage.put(LOCATION_STORAGE_KEY, serializeDOLocation(location));
|
|
135
|
+
return location;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Check if location is cached
|
|
139
|
+
*
|
|
140
|
+
* @returns True if location is cached, false otherwise
|
|
141
|
+
*/
|
|
142
|
+
async has() {
|
|
143
|
+
const cached = await this.storage.get(LOCATION_STORAGE_KEY);
|
|
144
|
+
return cached !== undefined;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Clear cached location (primarily for testing)
|
|
148
|
+
*
|
|
149
|
+
* In production, this should rarely be called since DO location
|
|
150
|
+
* is immutable once detected.
|
|
151
|
+
*/
|
|
152
|
+
async clear() {
|
|
153
|
+
await this.storage.delete(LOCATION_STORAGE_KEY);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// getOrDetectLocation Function
|
|
158
|
+
// ============================================================================
|
|
159
|
+
/**
|
|
160
|
+
* Gets cached location or detects and caches it
|
|
161
|
+
*
|
|
162
|
+
* This function should be the primary way to get a DO's location:
|
|
163
|
+
* 1. Check if location is cached in storage
|
|
164
|
+
* 2. If cached, return it immediately
|
|
165
|
+
* 3. If not cached, detect location and cache it
|
|
166
|
+
* 4. Return the location
|
|
167
|
+
*
|
|
168
|
+
* Detection only happens once per DO lifetime.
|
|
169
|
+
*
|
|
170
|
+
* @param storage - DurableObjectStorage for caching
|
|
171
|
+
* @returns The DO's location (cached or freshly detected)
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // In a Durable Object
|
|
176
|
+
* async fetch(request: Request) {
|
|
177
|
+
* const location = await getOrDetectLocation(this.ctx.storage)
|
|
178
|
+
* console.log(`Processing request at ${location.city} (${location.colo})`)
|
|
179
|
+
* // ...
|
|
180
|
+
* }
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
export async function getOrDetectLocation(storage) {
|
|
184
|
+
const cache = new LocationCache(storage);
|
|
185
|
+
// Check cache first
|
|
186
|
+
const cached = await cache.get();
|
|
187
|
+
if (cached) {
|
|
188
|
+
return cached;
|
|
189
|
+
}
|
|
190
|
+
// Detect location (returns canonical DOLocation with all fields populated)
|
|
191
|
+
const location = await fetchDOLocation();
|
|
192
|
+
// Cache the result
|
|
193
|
+
await cache.set(location);
|
|
194
|
+
return location;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=caching.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching.js","sourceRoot":"","sources":["../../../lib/colo/caching.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DO Location Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects Cloudflare colo location from within a Durable Object.
|
|
5
|
+
*
|
|
6
|
+
* Primary method: `https://workers.cloudflare.com/cf.json` - returns JSON with
|
|
7
|
+
* colo, coordinates, country, and more metadata directly.
|
|
8
|
+
*
|
|
9
|
+
* Fallback: `https://cloudflare.com/cdn-cgi/trace` - returns key=value pairs
|
|
10
|
+
* with colo=XXX where XXX is a 3-letter IATA code.
|
|
11
|
+
*
|
|
12
|
+
* Reference: dotdo-c3g99 - DO location detection mechanism
|
|
13
|
+
*/
|
|
14
|
+
import { codeToCity } from '../../types/Location';
|
|
15
|
+
import { createDOLocation, } from '../../types/DOLocation';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Constants
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Cloudflare's cf.json endpoint - returns JSON with rich location data
|
|
21
|
+
* Preferred over trace endpoint for simpler parsing and more data
|
|
22
|
+
*/
|
|
23
|
+
export const CLOUDFLARE_CF_JSON_URL = 'https://workers.cloudflare.com/cf.json';
|
|
24
|
+
/**
|
|
25
|
+
* Cloudflare's trace endpoint URL for detecting colo location (fallback)
|
|
26
|
+
* @deprecated Use CLOUDFLARE_CF_JSON_URL instead
|
|
27
|
+
*/
|
|
28
|
+
export const CLOUDFLARE_TRACE_URL = 'https://cloudflare.com/cdn-cgi/trace';
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Helper: Valid ColoCode Set
|
|
31
|
+
// ============================================================================
|
|
32
|
+
const validColoCodes = new Set(Object.keys(codeToCity));
|
|
33
|
+
/**
|
|
34
|
+
* Validates if a string is a known ColoCode
|
|
35
|
+
*/
|
|
36
|
+
function isValidColoCode(code) {
|
|
37
|
+
return validColoCodes.has(code);
|
|
38
|
+
}
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Functions
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Parses all fields from trace response
|
|
44
|
+
*
|
|
45
|
+
* @param response - Raw response from /cdn-cgi/trace endpoint
|
|
46
|
+
* @returns TraceData object with parsed fields (all fields are optional)
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* const data = parseTraceResponse('colo=SJC\nip=1.2.3.4\nloc=US')
|
|
51
|
+
* console.log(data.colo) // 'SJC'
|
|
52
|
+
* console.log(data.loc) // 'US'
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function parseTraceResponse(response) {
|
|
56
|
+
const result = {};
|
|
57
|
+
// Split by various line ending styles (CRLF, LF, CR)
|
|
58
|
+
const lines = response.split(/\r\n|\n|\r/);
|
|
59
|
+
for (const line of lines) {
|
|
60
|
+
const trimmedLine = line.trim();
|
|
61
|
+
if (!trimmedLine)
|
|
62
|
+
continue;
|
|
63
|
+
// Find the first equals sign (value may contain equals signs)
|
|
64
|
+
const eqIndex = trimmedLine.indexOf('=');
|
|
65
|
+
if (eqIndex === -1)
|
|
66
|
+
continue;
|
|
67
|
+
const key = trimmedLine.substring(0, eqIndex);
|
|
68
|
+
const value = trimmedLine.substring(eqIndex + 1);
|
|
69
|
+
result[key] = value;
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parses the trace response to extract colo code
|
|
75
|
+
*
|
|
76
|
+
* @param traceResponse - Raw response from /cdn-cgi/trace endpoint
|
|
77
|
+
* @returns ColoCode if valid, null otherwise
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* const colo = detectColoFromTrace('colo=SJC\nip=1.2.3.4')
|
|
82
|
+
* // Returns: 'sjc'
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export function detectColoFromTrace(traceResponse) {
|
|
86
|
+
if (!traceResponse || !traceResponse.trim()) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const traceData = parseTraceResponse(traceResponse);
|
|
90
|
+
if (!traceData.colo) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
// Trim whitespace and normalize to lowercase
|
|
94
|
+
const coloValue = traceData.colo.trim().toLowerCase();
|
|
95
|
+
if (!coloValue) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Validate against known colo codes
|
|
99
|
+
if (!isValidColoCode(coloValue)) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return coloValue;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Fetches location from cf.json endpoint (preferred method)
|
|
106
|
+
*
|
|
107
|
+
* @returns Promise resolving to DOLocation with rich metadata
|
|
108
|
+
* @throws Error on network error or invalid response
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* const location = await fetchDOLocationFromCfJson()
|
|
113
|
+
* console.log(location.colo) // 'sjc'
|
|
114
|
+
* console.log(location.coordinates) // { lat: 37.36, lng: -121.93 }
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export async function fetchDOLocationFromCfJson() {
|
|
118
|
+
const response = await fetch(CLOUDFLARE_CF_JSON_URL);
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(`Failed to fetch cf.json endpoint: ${response.status} ${response.statusText}`);
|
|
121
|
+
}
|
|
122
|
+
const cfData = (await response.json());
|
|
123
|
+
if (!cfData.colo) {
|
|
124
|
+
throw new Error('Missing colo in cf.json response');
|
|
125
|
+
}
|
|
126
|
+
const coloValue = cfData.colo.trim().toLowerCase();
|
|
127
|
+
if (!isValidColoCode(coloValue)) {
|
|
128
|
+
throw new Error(`Invalid or unknown colo code: ${cfData.colo}`);
|
|
129
|
+
}
|
|
130
|
+
const lat = parseFloat(cfData.latitude);
|
|
131
|
+
const lng = parseFloat(cfData.longitude);
|
|
132
|
+
return createDOLocation(coloValue, {
|
|
133
|
+
coordinates: isFinite(lat) && isFinite(lng) ? { lat, lng } : undefined,
|
|
134
|
+
cf: cfData,
|
|
135
|
+
country: cfData.country,
|
|
136
|
+
timezone: cfData.timezone,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Fetches location from trace endpoint (fallback method)
|
|
141
|
+
*
|
|
142
|
+
* @returns Promise resolving to DOLocation with trace metadata
|
|
143
|
+
* @throws Error on network error, invalid response, or unknown colo code
|
|
144
|
+
* @deprecated Use fetchDOLocationFromCfJson for richer data
|
|
145
|
+
*/
|
|
146
|
+
export async function fetchDOLocationFromTrace() {
|
|
147
|
+
const response = await fetch(CLOUDFLARE_TRACE_URL);
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
throw new Error(`Failed to fetch trace endpoint: ${response.status} ${response.statusText}`);
|
|
150
|
+
}
|
|
151
|
+
const responseText = await response.text();
|
|
152
|
+
if (!responseText || !responseText.trim()) {
|
|
153
|
+
throw new Error('Empty response from trace endpoint');
|
|
154
|
+
}
|
|
155
|
+
const traceData = parseTraceResponse(responseText);
|
|
156
|
+
const colo = detectColoFromTrace(responseText);
|
|
157
|
+
if (!colo) {
|
|
158
|
+
const rawColo = traceData.colo || '<missing>';
|
|
159
|
+
throw new Error(`Invalid or unknown colo code: ${rawColo}`);
|
|
160
|
+
}
|
|
161
|
+
return createDOLocation(colo, {
|
|
162
|
+
trace: traceData,
|
|
163
|
+
ip: traceData.ip,
|
|
164
|
+
country: traceData.loc,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Fetches and parses location from within a DO
|
|
169
|
+
*
|
|
170
|
+
* Uses cf.json endpoint as primary source (richer data, simpler parsing).
|
|
171
|
+
* Falls back to trace endpoint if cf.json fails.
|
|
172
|
+
*
|
|
173
|
+
* @returns Promise resolving to DOLocation with detected colo and metadata
|
|
174
|
+
* @throws Error on network error, invalid response, or unknown colo code
|
|
175
|
+
*
|
|
176
|
+
* @example
|
|
177
|
+
* ```ts
|
|
178
|
+
* const location = await fetchDOLocation()
|
|
179
|
+
* console.log(location.colo) // 'sjc'
|
|
180
|
+
* console.log(location.coordinates) // { latitude: 37.36, longitude: -121.93 }
|
|
181
|
+
* console.log(location.detectedAt) // Date
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export async function fetchDOLocation() {
|
|
185
|
+
try {
|
|
186
|
+
// Try cf.json first - richer data, simpler parsing
|
|
187
|
+
return await fetchDOLocationFromCfJson();
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// Fall back to trace endpoint
|
|
191
|
+
return await fetchDOLocationFromTrace();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detection.js","sourceRoot":"","sources":["../../../lib/colo/detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAA;AACzE,OAAO,EAIL,gBAAgB,GACjB,MAAM,wBAAwB,CAAA;AAK/B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,wCAAwC,CAAA;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,sCAAsC,CAAA;AAE1E,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;AAE/D;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAc,EAAE,CAAA;IAE5B,qDAAqD;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC/B,IAAI,CAAC,WAAW;YAAE,SAAQ;QAE1B,8DAA8D;QAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAQ;QAE5B,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAoB,CAAA;QAChE,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,aAAqB;IACvD,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAA;IAEnD,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,6CAA6C;IAC7C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAErD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAA;IAEpD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC9E,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAA;IAEpD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAElD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAExC,OAAO,gBAAgB,CAAC,SAAS,EAAE;QACjC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QACtE,EAAE,EAAE,MAAM;QACV,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB;IAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,CAAA;IAElD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,mCAAmC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC5E,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE1C,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAA;IAClD,MAAM,IAAI,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,IAAI,WAAW,CAAA;QAC7C,MAAM,IAAI,KAAK,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,gBAAgB,CAAC,IAAI,EAAE;QAC5B,KAAK,EAAE,SAAS;QAChB,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,OAAO,EAAE,SAAS,CAAC,GAAG;KACvB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,mDAAmD;QACnD,OAAO,MAAM,yBAAyB,EAAE,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;QAC9B,OAAO,MAAM,wBAAwB,EAAE,CAAA;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Data Client for WHERE-DOs-Live API
|
|
3
|
+
*
|
|
4
|
+
* Issue: dotdo-2bik1
|
|
5
|
+
*
|
|
6
|
+
* Provides utilities for fetching colo metadata from the WHERE-DOs-Live API
|
|
7
|
+
* until we have enough of our own data. The API provides colo metadata including
|
|
8
|
+
* coordinates and DO support likelihood.
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Static Colo Data (Fallback)
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Static colo data for all 23 DO colos
|
|
15
|
+
* Used as fallback when API is unavailable
|
|
16
|
+
*/
|
|
17
|
+
const STATIC_COLO_DATA = [
|
|
18
|
+
// US West
|
|
19
|
+
{ code: 'lax', city: 'LosAngeles', region: 'us-west', coordinates: { lat: 33.9425, lng: -118.408 }, supportsDOs: true },
|
|
20
|
+
{ code: 'sjc', city: 'SanJose', region: 'us-west', coordinates: { lat: 37.3639, lng: -121.9289 }, supportsDOs: true },
|
|
21
|
+
{ code: 'sea', city: 'Seattle', region: 'us-west', coordinates: { lat: 47.4502, lng: -122.3088 }, supportsDOs: true },
|
|
22
|
+
{ code: 'den', city: 'Denver', region: 'us-west', coordinates: { lat: 39.8561, lng: -104.6737 }, supportsDOs: true },
|
|
23
|
+
// US East
|
|
24
|
+
{ code: 'iad', city: 'Virginia', region: 'us-east', coordinates: { lat: 38.9445, lng: -77.4558 }, supportsDOs: true },
|
|
25
|
+
{ code: 'ewr', city: 'Newark', region: 'us-east', coordinates: { lat: 40.6895, lng: -74.1745 }, supportsDOs: true },
|
|
26
|
+
{ code: 'ord', city: 'Chicago', region: 'us-east', coordinates: { lat: 41.9742, lng: -87.9073 }, supportsDOs: true },
|
|
27
|
+
{ code: 'dfw', city: 'Dallas', region: 'us-east', coordinates: { lat: 32.8998, lng: -97.0403 }, supportsDOs: true },
|
|
28
|
+
{ code: 'atl', city: 'Atlanta', region: 'us-east', coordinates: { lat: 33.6407, lng: -84.4277 }, supportsDOs: true },
|
|
29
|
+
{ code: 'mia', city: 'Miami', region: 'us-east', coordinates: { lat: 25.7959, lng: -80.2870 }, supportsDOs: true },
|
|
30
|
+
// EU West
|
|
31
|
+
{ code: 'lhr', city: 'London', region: 'eu-west', coordinates: { lat: 51.4700, lng: -0.4543 }, supportsDOs: true },
|
|
32
|
+
{ code: 'cdg', city: 'Paris', region: 'eu-west', coordinates: { lat: 49.0097, lng: 2.5479 }, supportsDOs: true },
|
|
33
|
+
{ code: 'ams', city: 'Amsterdam', region: 'eu-west', coordinates: { lat: 52.3105, lng: 4.7683 }, supportsDOs: true },
|
|
34
|
+
{ code: 'fra', city: 'Frankfurt', region: 'eu-west', coordinates: { lat: 50.0379, lng: 8.5622 }, supportsDOs: true },
|
|
35
|
+
{ code: 'mrs', city: 'Marseille', region: 'eu-west', coordinates: { lat: 43.4365, lng: 5.2153 }, supportsDOs: true },
|
|
36
|
+
{ code: 'mxp', city: 'Milan', region: 'eu-west', coordinates: { lat: 45.6306, lng: 8.7281 }, supportsDOs: true },
|
|
37
|
+
// EU East
|
|
38
|
+
{ code: 'prg', city: 'Prague', region: 'eu-east', coordinates: { lat: 50.1018, lng: 14.2632 }, supportsDOs: true },
|
|
39
|
+
{ code: 'arn', city: 'Stockholm', region: 'eu-east', coordinates: { lat: 59.6498, lng: 17.9238 }, supportsDOs: true },
|
|
40
|
+
{ code: 'vie', city: 'Vienna', region: 'eu-east', coordinates: { lat: 48.1103, lng: 16.5697 }, supportsDOs: true },
|
|
41
|
+
// Asia-Pacific
|
|
42
|
+
{ code: 'sin', city: 'Singapore', region: 'asia-pacific', coordinates: { lat: 1.3644, lng: 103.9915 }, supportsDOs: true },
|
|
43
|
+
{ code: 'hkg', city: 'HongKong', region: 'asia-pacific', coordinates: { lat: 22.3080, lng: 113.9185 }, supportsDOs: true },
|
|
44
|
+
{ code: 'nrt', city: 'Tokyo', region: 'asia-pacific', coordinates: { lat: 35.7649, lng: 140.3867 }, supportsDOs: true },
|
|
45
|
+
{ code: 'kix', city: 'Osaka', region: 'asia-pacific', coordinates: { lat: 34.4347, lng: 135.2441 }, supportsDOs: true },
|
|
46
|
+
];
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// ColoDataClient Class
|
|
49
|
+
// ============================================================================
|
|
50
|
+
/**
|
|
51
|
+
* Client for fetching colo metadata from WHERE-DOs-Live API
|
|
52
|
+
*/
|
|
53
|
+
export class ColoDataClient {
|
|
54
|
+
baseUrl;
|
|
55
|
+
cacheTTL = 5 * 60 * 1000; // Default 5 minutes
|
|
56
|
+
cache = null;
|
|
57
|
+
cacheTimestamp = 0;
|
|
58
|
+
constructor(baseUrl) {
|
|
59
|
+
this.baseUrl = baseUrl ?? 'https://where-dos-live.do.workers.dev/api';
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if cache is still valid
|
|
63
|
+
*/
|
|
64
|
+
isCacheValid() {
|
|
65
|
+
if (this.cacheTTL === 0)
|
|
66
|
+
return false;
|
|
67
|
+
if (!this.cache)
|
|
68
|
+
return false;
|
|
69
|
+
return Date.now() - this.cacheTimestamp < this.cacheTTL;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Fetch all colo metadata from API
|
|
73
|
+
*/
|
|
74
|
+
async fetchAllColos() {
|
|
75
|
+
// Return cached data if valid
|
|
76
|
+
if (this.isCacheValid() && this.cache) {
|
|
77
|
+
return this.cache;
|
|
78
|
+
}
|
|
79
|
+
const response = await fetch(`${this.baseUrl}/colos`, {
|
|
80
|
+
method: 'GET',
|
|
81
|
+
headers: { 'Content-Type': 'application/json' },
|
|
82
|
+
});
|
|
83
|
+
if (!response.ok) {
|
|
84
|
+
throw new Error(`API error: ${response.status}`);
|
|
85
|
+
}
|
|
86
|
+
const data = await response.json();
|
|
87
|
+
// Update cache
|
|
88
|
+
this.cache = data;
|
|
89
|
+
this.cacheTimestamp = Date.now();
|
|
90
|
+
return data;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get metadata for specific colo
|
|
94
|
+
*/
|
|
95
|
+
async getColo(code) {
|
|
96
|
+
const response = await fetch(`${this.baseUrl}/colos/${code}`, {
|
|
97
|
+
method: 'GET',
|
|
98
|
+
headers: { 'Content-Type': 'application/json' },
|
|
99
|
+
});
|
|
100
|
+
if (response.status === 404) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const data = await response.json();
|
|
104
|
+
if (!data) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return data;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get colos that support DOs
|
|
111
|
+
*/
|
|
112
|
+
async getDOColos() {
|
|
113
|
+
const allColos = await this.fetchAllColos();
|
|
114
|
+
return allColos.filter(colo => colo.supportsDOs);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get colos by region
|
|
118
|
+
*/
|
|
119
|
+
async getColosByRegion(region) {
|
|
120
|
+
const allColos = await this.fetchAllColos();
|
|
121
|
+
return allColos.filter(colo => colo.region === region);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Set cache TTL in milliseconds
|
|
125
|
+
*/
|
|
126
|
+
setCacheTTL(ttl) {
|
|
127
|
+
this.cacheTTL = ttl;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clear the cache
|
|
131
|
+
*/
|
|
132
|
+
clearCache() {
|
|
133
|
+
this.cache = null;
|
|
134
|
+
this.cacheTimestamp = 0;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ============================================================================
|
|
138
|
+
// syncColoData Function
|
|
139
|
+
// ============================================================================
|
|
140
|
+
/**
|
|
141
|
+
* Sync external data to local storage
|
|
142
|
+
*/
|
|
143
|
+
export async function syncColoData(client, storage) {
|
|
144
|
+
// Fetch all colos from client
|
|
145
|
+
const colos = await client.fetchAllColos();
|
|
146
|
+
// Get existing keys from storage
|
|
147
|
+
const existingData = await storage.list({ prefix: 'colo:' });
|
|
148
|
+
const existingCodes = new Set();
|
|
149
|
+
const existingColos = new Map();
|
|
150
|
+
for (const [key, value] of existingData) {
|
|
151
|
+
const code = key.replace('colo:', '');
|
|
152
|
+
existingCodes.add(code);
|
|
153
|
+
existingColos.set(code, value);
|
|
154
|
+
}
|
|
155
|
+
let added = 0;
|
|
156
|
+
let updated = 0;
|
|
157
|
+
let removed = 0;
|
|
158
|
+
let successfulTotal = 0;
|
|
159
|
+
// Process each colo from API
|
|
160
|
+
for (const colo of colos) {
|
|
161
|
+
const key = `colo:${colo.code}`;
|
|
162
|
+
try {
|
|
163
|
+
if (existingCodes.has(colo.code)) {
|
|
164
|
+
// Check if data has changed
|
|
165
|
+
const existing = existingColos.get(colo.code);
|
|
166
|
+
if (JSON.stringify(existing) !== JSON.stringify(colo)) {
|
|
167
|
+
await storage.put(key, colo);
|
|
168
|
+
updated++;
|
|
169
|
+
}
|
|
170
|
+
existingCodes.delete(colo.code);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
await storage.put(key, colo);
|
|
174
|
+
added++;
|
|
175
|
+
}
|
|
176
|
+
successfulTotal++;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// Handle partial failures gracefully - continue with other colos
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Remove colos that are no longer in API response
|
|
183
|
+
for (const code of existingCodes) {
|
|
184
|
+
try {
|
|
185
|
+
await storage.delete(`colo:${code}`);
|
|
186
|
+
removed++;
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Handle partial failures gracefully
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
added,
|
|
194
|
+
updated,
|
|
195
|
+
removed,
|
|
196
|
+
total: successfulTotal,
|
|
197
|
+
syncedAt: new Date(),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// ============================================================================
|
|
201
|
+
// getColoWithLikelihood Function
|
|
202
|
+
// ============================================================================
|
|
203
|
+
/**
|
|
204
|
+
* Get colo metadata with likelihood score
|
|
205
|
+
* Always returns likelihood (defaults to 1.0 if not present)
|
|
206
|
+
*/
|
|
207
|
+
export async function getColoWithLikelihood(code, client) {
|
|
208
|
+
const colo = await client.getColo(code);
|
|
209
|
+
if (!colo) {
|
|
210
|
+
throw new Error(`Colo not found: ${code}`);
|
|
211
|
+
}
|
|
212
|
+
// Ensure likelihood is always present, default to 1.0 for DO-supporting colos
|
|
213
|
+
const likelihood = colo.likelihood ?? (colo.supportsDOs ? 1.0 : 0.5);
|
|
214
|
+
return {
|
|
215
|
+
...colo,
|
|
216
|
+
likelihood,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=external-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-data.js","sourceRoot":"","sources":["../../../lib/colo/external-data.ts"],"names":[],"mappings":"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"}
|