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.
Files changed (727) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +446 -315
  3. package/dist/ai/index.js +19 -0
  4. package/dist/ai/index.js.map +1 -0
  5. package/dist/ai/template-literals.js +852 -0
  6. package/dist/ai/template-literals.js.map +1 -0
  7. package/dist/api/analytics/router.js +601 -0
  8. package/dist/api/analytics/router.js.map +1 -0
  9. package/dist/api/index.js +158 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/middleware/auth-federation.js +573 -0
  12. package/dist/api/middleware/auth-federation.js.map +1 -0
  13. package/dist/api/middleware/auth.js +544 -0
  14. package/dist/api/middleware/auth.js.map +1 -0
  15. package/dist/api/middleware/error-handling.js +176 -0
  16. package/dist/api/middleware/error-handling.js.map +1 -0
  17. package/dist/api/middleware/request-id.js +21 -0
  18. package/dist/api/middleware/request-id.js.map +1 -0
  19. package/dist/api/pages.js +1180 -0
  20. package/dist/api/pages.js.map +1 -0
  21. package/dist/api/routes/api.js +612 -0
  22. package/dist/api/routes/api.js.map +1 -0
  23. package/dist/api/routes/browsers.js +471 -0
  24. package/dist/api/routes/browsers.js.map +1 -0
  25. package/dist/api/routes/do.js +188 -0
  26. package/dist/api/routes/do.js.map +1 -0
  27. package/dist/api/routes/mcp.js +459 -0
  28. package/dist/api/routes/mcp.js.map +1 -0
  29. package/dist/api/routes/obs.js +445 -0
  30. package/dist/api/routes/obs.js.map +1 -0
  31. package/dist/api/routes/openapi.js +794 -0
  32. package/dist/api/routes/openapi.js.map +1 -0
  33. package/dist/api/routes/rpc.js +1103 -0
  34. package/dist/api/routes/rpc.js.map +1 -0
  35. package/dist/api/routes/sandboxes.js +389 -0
  36. package/dist/api/routes/sandboxes.js.map +1 -0
  37. package/dist/api/test-do.js +38 -0
  38. package/dist/api/test-do.js.map +1 -0
  39. package/dist/api/types.js +11 -0
  40. package/dist/api/types.js.map +1 -0
  41. package/dist/cli/bin.js +2 -0
  42. package/dist/cli/main.js +52342 -0
  43. package/dist/db/actions.js +212 -0
  44. package/dist/db/actions.js.map +1 -0
  45. package/dist/db/auth.js +506 -0
  46. package/dist/db/auth.js.map +1 -0
  47. package/dist/db/branches.js +65 -0
  48. package/dist/db/branches.js.map +1 -0
  49. package/dist/db/clickhouse.js +1074 -0
  50. package/dist/db/clickhouse.js.map +1 -0
  51. package/dist/db/dlq.js +39 -0
  52. package/dist/db/dlq.js.map +1 -0
  53. package/dist/db/events.js +28 -0
  54. package/dist/db/events.js.map +1 -0
  55. package/dist/db/exec.js +64 -0
  56. package/dist/db/exec.js.map +1 -0
  57. package/dist/db/files.js +85 -0
  58. package/dist/db/files.js.map +1 -0
  59. package/dist/db/flags.js +24 -0
  60. package/dist/db/flags.js.map +1 -0
  61. package/dist/db/git.js +116 -0
  62. package/dist/db/git.js.map +1 -0
  63. package/dist/db/iceberg/inverted-index.js +862 -0
  64. package/dist/db/iceberg/inverted-index.js.map +1 -0
  65. package/dist/db/iceberg/puffin.js +878 -0
  66. package/dist/db/iceberg/puffin.js.map +1 -0
  67. package/dist/db/iceberg/search-manifest.js +422 -0
  68. package/dist/db/iceberg/search-manifest.js.map +1 -0
  69. package/dist/db/iceberg/types.js +8 -0
  70. package/dist/db/iceberg/types.js.map +1 -0
  71. package/dist/db/index.js +121 -0
  72. package/dist/db/index.js.map +1 -0
  73. package/dist/db/integrations.js +368 -0
  74. package/dist/db/integrations.js.map +1 -0
  75. package/dist/db/json-indexes.js +332 -0
  76. package/dist/db/json-indexes.js.map +1 -0
  77. package/dist/db/linked-accounts.js +287 -0
  78. package/dist/db/linked-accounts.js.map +1 -0
  79. package/dist/db/nouns.js +183 -0
  80. package/dist/db/nouns.js.map +1 -0
  81. package/dist/db/objects.js +170 -0
  82. package/dist/db/objects.js.map +1 -0
  83. package/dist/db/primitives/dag-scheduler/index.js +869 -0
  84. package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
  85. package/dist/db/primitives/exactly-once-context.js +237 -0
  86. package/dist/db/primitives/exactly-once-context.js.map +1 -0
  87. package/dist/db/primitives/index.js +62 -0
  88. package/dist/db/primitives/index.js.map +1 -0
  89. package/dist/db/primitives/keyed-router.js +145 -0
  90. package/dist/db/primitives/keyed-router.js.map +1 -0
  91. package/dist/db/primitives/observability.js +162 -0
  92. package/dist/db/primitives/observability.js.map +1 -0
  93. package/dist/db/primitives/schema-evolution.js +643 -0
  94. package/dist/db/primitives/schema-evolution.js.map +1 -0
  95. package/dist/db/primitives/stateful-operator/index.js +770 -0
  96. package/dist/db/primitives/stateful-operator/index.js.map +1 -0
  97. package/dist/db/primitives/temporal-store.js +306 -0
  98. package/dist/db/primitives/temporal-store.js.map +1 -0
  99. package/dist/db/primitives/typed-column-store.js +1229 -0
  100. package/dist/db/primitives/typed-column-store.js.map +1 -0
  101. package/dist/db/primitives/utils/duration.js +162 -0
  102. package/dist/db/primitives/utils/duration.js.map +1 -0
  103. package/dist/db/primitives/utils/murmur3.js +118 -0
  104. package/dist/db/primitives/utils/murmur3.js.map +1 -0
  105. package/dist/db/primitives/watermark-service.js +136 -0
  106. package/dist/db/primitives/watermark-service.js.map +1 -0
  107. package/dist/db/primitives/window-manager.js +764 -0
  108. package/dist/db/primitives/window-manager.js.map +1 -0
  109. package/dist/db/relationships.js +66 -0
  110. package/dist/db/relationships.js.map +1 -0
  111. package/dist/db/schema-minimal.js +61 -0
  112. package/dist/db/schema-minimal.js.map +1 -0
  113. package/dist/db/search.js +28 -0
  114. package/dist/db/search.js.map +1 -0
  115. package/dist/db/stores.js +1665 -0
  116. package/dist/db/stores.js.map +1 -0
  117. package/dist/db/things.js +297 -0
  118. package/dist/db/things.js.map +1 -0
  119. package/dist/db/vault.js +171 -0
  120. package/dist/db/vault.js.map +1 -0
  121. package/dist/db/verbs.js +102 -0
  122. package/dist/db/verbs.js.map +1 -0
  123. package/dist/do/base.js +48 -0
  124. package/dist/do/base.js.map +1 -0
  125. package/dist/do/bash.js +35 -0
  126. package/dist/do/bash.js.map +1 -0
  127. package/dist/do/fs.js +25 -0
  128. package/dist/do/fs.js.map +1 -0
  129. package/dist/do/full.js +61 -0
  130. package/dist/do/full.js.map +1 -0
  131. package/dist/do/git.js +28 -0
  132. package/dist/do/git.js.map +1 -0
  133. package/dist/do/index.js +52 -0
  134. package/dist/do/index.js.map +1 -0
  135. package/dist/do/tiny.js +31 -0
  136. package/dist/do/tiny.js.map +1 -0
  137. package/dist/lib/DOAuth.js +261 -0
  138. package/dist/lib/DOAuth.js.map +1 -0
  139. package/dist/lib/DODispatcher.js +72 -0
  140. package/dist/lib/DODispatcher.js.map +1 -0
  141. package/dist/lib/Modifier.js +189 -0
  142. package/dist/lib/Modifier.js.map +1 -0
  143. package/dist/lib/StateStorage.js +403 -0
  144. package/dist/lib/StateStorage.js.map +1 -0
  145. package/dist/lib/TypeRegistry.js +122 -0
  146. package/dist/lib/TypeRegistry.js.map +1 -0
  147. package/dist/lib/agent/tools/bash.js +336 -0
  148. package/dist/lib/agent/tools/bash.js.map +1 -0
  149. package/dist/lib/agent/tools/edit.js +157 -0
  150. package/dist/lib/agent/tools/edit.js.map +1 -0
  151. package/dist/lib/agent/tools/glob.js +137 -0
  152. package/dist/lib/agent/tools/glob.js.map +1 -0
  153. package/dist/lib/agent/tools/grep.js +315 -0
  154. package/dist/lib/agent/tools/grep.js.map +1 -0
  155. package/dist/lib/agent/tools/index.js +71 -0
  156. package/dist/lib/agent/tools/index.js.map +1 -0
  157. package/dist/lib/agent/tools/read.js +212 -0
  158. package/dist/lib/agent/tools/read.js.map +1 -0
  159. package/dist/lib/agent/tools/types.js +197 -0
  160. package/dist/lib/agent/tools/types.js.map +1 -0
  161. package/dist/lib/agent/tools/write.js +159 -0
  162. package/dist/lib/agent/tools/write.js.map +1 -0
  163. package/dist/lib/ai/gateway.js +247 -0
  164. package/dist/lib/ai/gateway.js.map +1 -0
  165. package/dist/lib/ai/tool-loop-agent.js +591 -0
  166. package/dist/lib/ai/tool-loop-agent.js.map +1 -0
  167. package/dist/lib/auto-wiring.js +439 -0
  168. package/dist/lib/auto-wiring.js.map +1 -0
  169. package/dist/lib/browse/browserbase.js +163 -0
  170. package/dist/lib/browse/browserbase.js.map +1 -0
  171. package/dist/lib/browse/cloudflare.js +144 -0
  172. package/dist/lib/browse/cloudflare.js.map +1 -0
  173. package/dist/lib/browse/index.js +62 -0
  174. package/dist/lib/browse/index.js.map +1 -0
  175. package/dist/lib/browse/types.js +13 -0
  176. package/dist/lib/browse/types.js.map +1 -0
  177. package/dist/lib/cache/index.js +37 -0
  178. package/dist/lib/cache/index.js.map +1 -0
  179. package/dist/lib/cache/visibility.js +638 -0
  180. package/dist/lib/cache/visibility.js.map +1 -0
  181. package/dist/lib/capabilities.js +268 -0
  182. package/dist/lib/capabilities.js.map +1 -0
  183. package/dist/lib/channels/base.js +106 -0
  184. package/dist/lib/channels/base.js.map +1 -0
  185. package/dist/lib/channels/discord.js +94 -0
  186. package/dist/lib/channels/discord.js.map +1 -0
  187. package/dist/lib/channels/email.js +204 -0
  188. package/dist/lib/channels/email.js.map +1 -0
  189. package/dist/lib/channels/index.js +90 -0
  190. package/dist/lib/channels/index.js.map +1 -0
  191. package/dist/lib/channels/mdxui-chat.js +95 -0
  192. package/dist/lib/channels/mdxui-chat.js.map +1 -0
  193. package/dist/lib/channels/slack-blockkit.js +121 -0
  194. package/dist/lib/channels/slack-blockkit.js.map +1 -0
  195. package/dist/lib/channels/types.js +7 -0
  196. package/dist/lib/channels/types.js.map +1 -0
  197. package/dist/lib/cloudflare/ai.js +654 -0
  198. package/dist/lib/cloudflare/ai.js.map +1 -0
  199. package/dist/lib/cloudflare/index.js +88 -0
  200. package/dist/lib/cloudflare/index.js.map +1 -0
  201. package/dist/lib/cloudflare/kv.js +342 -0
  202. package/dist/lib/cloudflare/kv.js.map +1 -0
  203. package/dist/lib/cloudflare/queues.js +434 -0
  204. package/dist/lib/cloudflare/queues.js.map +1 -0
  205. package/dist/lib/cloudflare/r2.js +604 -0
  206. package/dist/lib/cloudflare/r2.js.map +1 -0
  207. package/dist/lib/cloudflare/vectorize.js +494 -0
  208. package/dist/lib/cloudflare/vectorize.js.map +1 -0
  209. package/dist/lib/cloudflare/workflows.js +569 -0
  210. package/dist/lib/cloudflare/workflows.js.map +1 -0
  211. package/dist/lib/colo/caching.js +196 -0
  212. package/dist/lib/colo/caching.js.map +1 -0
  213. package/dist/lib/colo/detection.js +194 -0
  214. package/dist/lib/colo/detection.js.map +1 -0
  215. package/dist/lib/colo/external-data.js +219 -0
  216. package/dist/lib/colo/external-data.js.map +1 -0
  217. package/dist/lib/colo/globe-data.js +179 -0
  218. package/dist/lib/colo/globe-data.js.map +1 -0
  219. package/dist/lib/colo/index.js +16 -0
  220. package/dist/lib/colo/index.js.map +1 -0
  221. package/dist/lib/decorators.js +37 -0
  222. package/dist/lib/decorators.js.map +1 -0
  223. package/dist/lib/discovery.js +81 -0
  224. package/dist/lib/discovery.js.map +1 -0
  225. package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
  226. package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
  227. package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
  228. package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
  229. package/dist/lib/executors/CascadeExecutor.js +418 -0
  230. package/dist/lib/executors/CascadeExecutor.js.map +1 -0
  231. package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
  232. package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
  233. package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
  234. package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
  235. package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
  236. package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
  237. package/dist/lib/executors/ParallelStepExecutor.js +308 -0
  238. package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
  239. package/dist/lib/executors/types.js +12 -0
  240. package/dist/lib/executors/types.js.map +1 -0
  241. package/dist/lib/experiments.js +89 -0
  242. package/dist/lib/experiments.js.map +1 -0
  243. package/dist/lib/flags/store.js +262 -0
  244. package/dist/lib/flags/store.js.map +1 -0
  245. package/dist/lib/functions/FunctionComposition.js +467 -0
  246. package/dist/lib/functions/FunctionComposition.js.map +1 -0
  247. package/dist/lib/functions/FunctionMiddleware.js +457 -0
  248. package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
  249. package/dist/lib/functions/FunctionRegistry.js +426 -0
  250. package/dist/lib/functions/FunctionRegistry.js.map +1 -0
  251. package/dist/lib/functions/createFunction.js +1048 -0
  252. package/dist/lib/functions/createFunction.js.map +1 -0
  253. package/dist/lib/humans/index.js +68 -0
  254. package/dist/lib/humans/index.js.map +1 -0
  255. package/dist/lib/humans/templates.js +117 -0
  256. package/dist/lib/humans/templates.js.map +1 -0
  257. package/dist/lib/identity.js +98 -0
  258. package/dist/lib/identity.js.map +1 -0
  259. package/dist/lib/index.js +9 -0
  260. package/dist/lib/index.js.map +1 -0
  261. package/dist/lib/logging/error-logger.js +163 -0
  262. package/dist/lib/logging/error-logger.js.map +1 -0
  263. package/dist/lib/logging/index.js +160 -0
  264. package/dist/lib/logging/index.js.map +1 -0
  265. package/dist/lib/mixins/bash.js +825 -0
  266. package/dist/lib/mixins/bash.js.map +1 -0
  267. package/dist/lib/mixins/fs.js +648 -0
  268. package/dist/lib/mixins/fs.js.map +1 -0
  269. package/dist/lib/mixins/git.js +1011 -0
  270. package/dist/lib/mixins/git.js.map +1 -0
  271. package/dist/lib/mixins/index.js +29 -0
  272. package/dist/lib/mixins/index.js.map +1 -0
  273. package/dist/lib/mixins/npm.js +662 -0
  274. package/dist/lib/mixins/npm.js.map +1 -0
  275. package/dist/lib/noun-id.js +278 -0
  276. package/dist/lib/noun-id.js.map +1 -0
  277. package/dist/lib/rate-limit/sliding-window.js +148 -0
  278. package/dist/lib/rate-limit/sliding-window.js.map +1 -0
  279. package/dist/lib/rate-limit.js +110 -0
  280. package/dist/lib/rate-limit.js.map +1 -0
  281. package/dist/lib/rpc/bindings.js +548 -0
  282. package/dist/lib/rpc/bindings.js.map +1 -0
  283. package/dist/lib/rpc/index.js +64 -0
  284. package/dist/lib/rpc/index.js.map +1 -0
  285. package/dist/lib/safe-stringify.js +223 -0
  286. package/dist/lib/safe-stringify.js.map +1 -0
  287. package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
  288. package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
  289. package/dist/lib/sqids.js +110 -0
  290. package/dist/lib/sqids.js.map +1 -0
  291. package/dist/lib/sql/adapters/index.js +10 -0
  292. package/dist/lib/sql/adapters/index.js.map +1 -0
  293. package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
  294. package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
  295. package/dist/lib/sql/adapters/pgsql-parser.js +1189 -0
  296. package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
  297. package/dist/lib/sql/index.js +277 -0
  298. package/dist/lib/sql/index.js.map +1 -0
  299. package/dist/lib/sql/types.js +56 -0
  300. package/dist/lib/sql/types.js.map +1 -0
  301. package/dist/lib/type-classifier.js +126 -0
  302. package/dist/lib/type-classifier.js.map +1 -0
  303. package/dist/lib/utils/html.js +47 -0
  304. package/dist/lib/utils/html.js.map +1 -0
  305. package/dist/lib/validation.js +48 -0
  306. package/dist/lib/validation.js.map +1 -0
  307. package/dist/lib/vault/store.js +411 -0
  308. package/dist/lib/vault/store.js.map +1 -0
  309. package/dist/metrics/hunch.js +739 -0
  310. package/dist/metrics/hunch.js.map +1 -0
  311. package/dist/objects/API.js +302 -0
  312. package/dist/objects/API.js.map +1 -0
  313. package/dist/objects/Agent.js +179 -0
  314. package/dist/objects/Agent.js.map +1 -0
  315. package/dist/objects/AgenticFunctionExecutor.js +8 -0
  316. package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
  317. package/dist/objects/App.js +83 -0
  318. package/dist/objects/App.js.map +1 -0
  319. package/dist/objects/Browser.js +884 -0
  320. package/dist/objects/Browser.js.map +1 -0
  321. package/dist/objects/Business.js +107 -0
  322. package/dist/objects/Business.js.map +1 -0
  323. package/dist/objects/CLI.js +221 -0
  324. package/dist/objects/CLI.js.map +1 -0
  325. package/dist/objects/CodeFunctionExecutor.js +8 -0
  326. package/dist/objects/CodeFunctionExecutor.js.map +1 -0
  327. package/dist/objects/Collection.js +161 -0
  328. package/dist/objects/Collection.js.map +1 -0
  329. package/dist/objects/DO.js +41 -0
  330. package/dist/objects/DO.js.map +1 -0
  331. package/dist/objects/DOBase.js +2309 -0
  332. package/dist/objects/DOBase.js.map +1 -0
  333. package/dist/objects/DOFull.js +1676 -0
  334. package/dist/objects/DOFull.js.map +1 -0
  335. package/dist/objects/DOTiny.js +207 -0
  336. package/dist/objects/DOTiny.js.map +1 -0
  337. package/dist/objects/Directory.js +199 -0
  338. package/dist/objects/Directory.js.map +1 -0
  339. package/dist/objects/Entity.js +413 -0
  340. package/dist/objects/Entity.js.map +1 -0
  341. package/dist/objects/Function.js +116 -0
  342. package/dist/objects/Function.js.map +1 -0
  343. package/dist/objects/Human.js +231 -0
  344. package/dist/objects/Human.js.map +1 -0
  345. package/dist/objects/HumanFunctionExecutor.js +8 -0
  346. package/dist/objects/HumanFunctionExecutor.js.map +1 -0
  347. package/dist/objects/IcebergMetadataDO.js +938 -0
  348. package/dist/objects/IcebergMetadataDO.js.map +1 -0
  349. package/dist/objects/IntegrationsDO.js +1174 -0
  350. package/dist/objects/IntegrationsDO.js.map +1 -0
  351. package/dist/objects/ObservabilityBroadcaster.js +149 -0
  352. package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
  353. package/dist/objects/Package.js +154 -0
  354. package/dist/objects/Package.js.map +1 -0
  355. package/dist/objects/Product.js +193 -0
  356. package/dist/objects/Product.js.map +1 -0
  357. package/dist/objects/SDK.js +152 -0
  358. package/dist/objects/SDK.js.map +1 -0
  359. package/dist/objects/SaaS.js +235 -0
  360. package/dist/objects/SaaS.js.map +1 -0
  361. package/dist/objects/SandboxDO.js +759 -0
  362. package/dist/objects/SandboxDO.js.map +1 -0
  363. package/dist/objects/Service.js +337 -0
  364. package/dist/objects/Service.js.map +1 -0
  365. package/dist/objects/Site.js +80 -0
  366. package/dist/objects/Site.js.map +1 -0
  367. package/dist/objects/Startup.js +479 -0
  368. package/dist/objects/Startup.js.map +1 -0
  369. package/dist/objects/ThingsDO.js +170 -0
  370. package/dist/objects/ThingsDO.js.map +1 -0
  371. package/dist/objects/VectorShardDO.js +648 -0
  372. package/dist/objects/VectorShardDO.js.map +1 -0
  373. package/dist/objects/Worker.js +144 -0
  374. package/dist/objects/Worker.js.map +1 -0
  375. package/dist/objects/Workflow.js +196 -0
  376. package/dist/objects/Workflow.js.map +1 -0
  377. package/dist/objects/WorkflowFactory.js +313 -0
  378. package/dist/objects/WorkflowFactory.js.map +1 -0
  379. package/dist/objects/WorkflowRuntime.js +863 -0
  380. package/dist/objects/WorkflowRuntime.js.map +1 -0
  381. package/dist/objects/circuit-breaker-bulkhead.js +178 -0
  382. package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
  383. package/dist/objects/createFunction.js +934 -0
  384. package/dist/objects/createFunction.js.map +1 -0
  385. package/dist/objects/index.js +80 -0
  386. package/dist/objects/index.js.map +1 -0
  387. package/dist/objects/lifecycle/Branch.js +275 -0
  388. package/dist/objects/lifecycle/Branch.js.map +1 -0
  389. package/dist/objects/lifecycle/Clone.js +1499 -0
  390. package/dist/objects/lifecycle/Clone.js.map +1 -0
  391. package/dist/objects/lifecycle/Compact.js +237 -0
  392. package/dist/objects/lifecycle/Compact.js.map +1 -0
  393. package/dist/objects/lifecycle/Promote.js +476 -0
  394. package/dist/objects/lifecycle/Promote.js.map +1 -0
  395. package/dist/objects/lifecycle/Shard.js +560 -0
  396. package/dist/objects/lifecycle/Shard.js.map +1 -0
  397. package/dist/objects/lifecycle/index.js +15 -0
  398. package/dist/objects/lifecycle/index.js.map +1 -0
  399. package/dist/objects/lifecycle/types.js +33 -0
  400. package/dist/objects/lifecycle/types.js.map +1 -0
  401. package/dist/objects/mixins/infrastructure.js +171 -0
  402. package/dist/objects/mixins/infrastructure.js.map +1 -0
  403. package/dist/objects/modules/StoresModule.js +153 -0
  404. package/dist/objects/modules/StoresModule.js.map +1 -0
  405. package/dist/objects/persistence/checkpoint-manager.js +606 -0
  406. package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
  407. package/dist/objects/persistence/index.js +72 -0
  408. package/dist/objects/persistence/index.js.map +1 -0
  409. package/dist/objects/persistence/migration-runner.js +562 -0
  410. package/dist/objects/persistence/migration-runner.js.map +1 -0
  411. package/dist/objects/persistence/replication-manager.js +501 -0
  412. package/dist/objects/persistence/replication-manager.js.map +1 -0
  413. package/dist/objects/persistence/tiered-storage-manager.js +595 -0
  414. package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
  415. package/dist/objects/persistence/types.js +14 -0
  416. package/dist/objects/persistence/types.js.map +1 -0
  417. package/dist/objects/persistence/wal-manager.js +653 -0
  418. package/dist/objects/persistence/wal-manager.js.map +1 -0
  419. package/dist/objects/presets/index.js +20 -0
  420. package/dist/objects/presets/index.js.map +1 -0
  421. package/dist/objects/presets/primitives.js +188 -0
  422. package/dist/objects/presets/primitives.js.map +1 -0
  423. package/dist/objects/primitives/alarm-adapter.js +141 -0
  424. package/dist/objects/primitives/alarm-adapter.js.map +1 -0
  425. package/dist/objects/primitives/index.js +337 -0
  426. package/dist/objects/primitives/index.js.map +1 -0
  427. package/dist/objects/primitives/storage-adapter.js +182 -0
  428. package/dist/objects/primitives/storage-adapter.js.map +1 -0
  429. package/dist/objects/primitives/with-primitives.js +102 -0
  430. package/dist/objects/primitives/with-primitives.js.map +1 -0
  431. package/dist/objects/services/StoreManager.js +227 -0
  432. package/dist/objects/services/StoreManager.js.map +1 -0
  433. package/dist/objects/services/index.js +13 -0
  434. package/dist/objects/services/index.js.map +1 -0
  435. package/dist/objects/transport/auth-layer.js +1451 -0
  436. package/dist/objects/transport/auth-layer.js.map +1 -0
  437. package/dist/objects/transport/capnweb-target.js +355 -0
  438. package/dist/objects/transport/capnweb-target.js.map +1 -0
  439. package/dist/objects/transport/chain.js +441 -0
  440. package/dist/objects/transport/chain.js.map +1 -0
  441. package/dist/objects/transport/handler.js +58 -0
  442. package/dist/objects/transport/handler.js.map +1 -0
  443. package/dist/objects/transport/index.js +53 -0
  444. package/dist/objects/transport/index.js.map +1 -0
  445. package/dist/objects/transport/mcp-server.js +690 -0
  446. package/dist/objects/transport/mcp-server.js.map +1 -0
  447. package/dist/objects/transport/rest-autowire.js +1507 -0
  448. package/dist/objects/transport/rest-autowire.js.map +1 -0
  449. package/dist/objects/transport/rest-router.js +440 -0
  450. package/dist/objects/transport/rest-router.js.map +1 -0
  451. package/dist/objects/transport/rpc-server.js +1536 -0
  452. package/dist/objects/transport/rpc-server.js.map +1 -0
  453. package/dist/objects/transport/shared.js +575 -0
  454. package/dist/objects/transport/shared.js.map +1 -0
  455. package/dist/objects/transport/sync-engine.js +291 -0
  456. package/dist/objects/transport/sync-engine.js.map +1 -0
  457. package/dist/objects/transport/types.js +8 -0
  458. package/dist/objects/transport/types.js.map +1 -0
  459. package/dist/primitives/bashx/src/ast/analyze.js +1472 -0
  460. package/dist/primitives/bashx/src/ast/analyze.js.map +1 -0
  461. package/dist/primitives/bashx/src/ast/parser.js +1488 -0
  462. package/dist/primitives/bashx/src/ast/parser.js.map +1 -0
  463. package/dist/primitives/bashx/src/do/commands/crypto.js +1954 -0
  464. package/dist/primitives/bashx/src/do/commands/crypto.js.map +1 -0
  465. package/dist/primitives/bashx/src/do/commands/data-processing.js +1812 -0
  466. package/dist/primitives/bashx/src/do/commands/data-processing.js.map +1 -0
  467. package/dist/primitives/bashx/src/do/commands/extended-utils.js +804 -0
  468. package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +1 -0
  469. package/dist/primitives/bashx/src/do/commands/math-control.js +1122 -0
  470. package/dist/primitives/bashx/src/do/commands/math-control.js.map +1 -0
  471. package/dist/primitives/bashx/src/do/commands/posix-utils.js +1015 -0
  472. package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +1 -0
  473. package/dist/primitives/bashx/src/do/commands/system-utils.js +687 -0
  474. package/dist/primitives/bashx/src/do/commands/system-utils.js.map +1 -0
  475. package/dist/primitives/bashx/src/do/commands/test-command.js +523 -0
  476. package/dist/primitives/bashx/src/do/commands/test-command.js.map +1 -0
  477. package/dist/primitives/bashx/src/do/commands/text-processing.js +1550 -0
  478. package/dist/primitives/bashx/src/do/commands/text-processing.js.map +1 -0
  479. package/dist/primitives/bashx/src/do/container-executor.js +429 -0
  480. package/dist/primitives/bashx/src/do/container-executor.js.map +1 -0
  481. package/dist/primitives/bashx/src/do/index.js +668 -0
  482. package/dist/primitives/bashx/src/do/index.js.map +1 -0
  483. package/dist/primitives/bashx/src/do/tiered-executor.js +2647 -0
  484. package/dist/primitives/bashx/src/do/tiered-executor.js.map +1 -0
  485. package/dist/primitives/bashx/src/do/worker.js +352 -0
  486. package/dist/primitives/bashx/src/do/worker.js.map +1 -0
  487. package/dist/primitives/bashx/src/types.js +10 -0
  488. package/dist/primitives/bashx/src/types.js.map +1 -0
  489. package/dist/primitives/fsx/core/backend.js +480 -0
  490. package/dist/primitives/fsx/core/backend.js.map +1 -0
  491. package/dist/primitives/fsx/core/constants.js +140 -0
  492. package/dist/primitives/fsx/core/constants.js.map +1 -0
  493. package/dist/primitives/fsx/core/fsx.js +1184 -0
  494. package/dist/primitives/fsx/core/fsx.js.map +1 -0
  495. package/dist/primitives/fsx/core/glob/glob.js +438 -0
  496. package/dist/primitives/fsx/core/glob/glob.js.map +1 -0
  497. package/dist/primitives/fsx/core/glob/index.js +8 -0
  498. package/dist/primitives/fsx/core/glob/index.js.map +1 -0
  499. package/dist/primitives/fsx/core/glob/match.js +392 -0
  500. package/dist/primitives/fsx/core/glob/match.js.map +1 -0
  501. package/dist/primitives/fsx/core/types.js +307 -0
  502. package/dist/primitives/fsx/core/types.js.map +1 -0
  503. package/dist/sandbox/index.js +258 -0
  504. package/dist/sandbox/index.js.map +1 -0
  505. package/dist/sdk/capnweb-compat.js +42 -0
  506. package/dist/sdk/capnweb-compat.js.map +1 -0
  507. package/dist/sdk/client.js +20 -0
  508. package/dist/sdk/client.js.map +1 -0
  509. package/dist/sdk/index.js +17 -0
  510. package/dist/sdk/index.js.map +1 -0
  511. package/dist/snippets/artifacts-config.js +241 -0
  512. package/dist/snippets/artifacts-config.js.map +1 -0
  513. package/dist/snippets/artifacts-ingest.js +832 -0
  514. package/dist/snippets/artifacts-ingest.js.map +1 -0
  515. package/dist/snippets/artifacts-serve.js +1035 -0
  516. package/dist/snippets/artifacts-serve.js.map +1 -0
  517. package/dist/snippets/artifacts-types.js +161 -0
  518. package/dist/snippets/artifacts-types.js.map +1 -0
  519. package/dist/snippets/cache-probe.js +376 -0
  520. package/dist/snippets/cache-probe.js.map +1 -0
  521. package/dist/snippets/cache.js +10 -0
  522. package/dist/snippets/cache.js.map +1 -0
  523. package/dist/snippets/events.js +469 -0
  524. package/dist/snippets/events.js.map +1 -0
  525. package/dist/snippets/index.js +7 -0
  526. package/dist/snippets/index.js.map +1 -0
  527. package/dist/snippets/proxy.js +495 -0
  528. package/dist/snippets/proxy.js.map +1 -0
  529. package/dist/snippets/search.js +1759 -0
  530. package/dist/snippets/search.js.map +1 -0
  531. package/dist/streams/index.js +30 -0
  532. package/dist/streams/index.js.map +1 -0
  533. package/dist/streams/observability.js +68 -0
  534. package/dist/streams/observability.js.map +1 -0
  535. package/dist/types/AI.js +92 -0
  536. package/dist/types/AI.js.map +1 -0
  537. package/dist/types/AIFunction.js +171 -0
  538. package/dist/types/AIFunction.js.map +1 -0
  539. package/dist/types/BrowseVerb.js +89 -0
  540. package/dist/types/BrowseVerb.js.map +1 -0
  541. package/dist/types/Browser.js +31 -0
  542. package/dist/types/Browser.js.map +1 -0
  543. package/dist/types/Chaos.js +15 -0
  544. package/dist/types/Chaos.js.map +1 -0
  545. package/dist/types/CloudflareBindings.js +109 -0
  546. package/dist/types/CloudflareBindings.js.map +1 -0
  547. package/dist/types/Collection.js +50 -0
  548. package/dist/types/Collection.js.map +1 -0
  549. package/dist/types/DO.js +2 -0
  550. package/dist/types/DO.js.map +1 -0
  551. package/dist/types/DOLocation.js +63 -0
  552. package/dist/types/DOLocation.js.map +1 -0
  553. package/dist/types/EventHandler.js +57 -0
  554. package/dist/types/EventHandler.js.map +1 -0
  555. package/dist/types/Experiment.js +33 -0
  556. package/dist/types/Experiment.js.map +1 -0
  557. package/dist/types/Flag.js +57 -0
  558. package/dist/types/Flag.js.map +1 -0
  559. package/dist/types/Lifecycle.js +13 -0
  560. package/dist/types/Lifecycle.js.map +1 -0
  561. package/dist/types/Location.js +169 -0
  562. package/dist/types/Location.js.map +1 -0
  563. package/dist/types/Noun.js +66 -0
  564. package/dist/types/Noun.js.map +1 -0
  565. package/dist/types/SessionEvent.js +194 -0
  566. package/dist/types/SessionEvent.js.map +1 -0
  567. package/dist/types/Thing.js +55 -0
  568. package/dist/types/Thing.js.map +1 -0
  569. package/dist/types/ThingDO.js +153 -0
  570. package/dist/types/ThingDO.js.map +1 -0
  571. package/dist/types/Things.js +2 -0
  572. package/dist/types/Things.js.map +1 -0
  573. package/dist/types/Verb.js +119 -0
  574. package/dist/types/Verb.js.map +1 -0
  575. package/dist/types/WorkflowContext.js +70 -0
  576. package/dist/types/WorkflowContext.js.map +1 -0
  577. package/dist/types/analytics-api.js +13 -0
  578. package/dist/types/analytics-api.js.map +1 -0
  579. package/dist/types/capabilities.js +135 -0
  580. package/dist/types/capabilities.js.map +1 -0
  581. package/dist/types/drizzle.js +12 -0
  582. package/dist/types/drizzle.js.map +1 -0
  583. package/dist/types/event.js +201 -0
  584. package/dist/types/event.js.map +1 -0
  585. package/dist/types/fn.js +12 -0
  586. package/dist/types/fn.js.map +1 -0
  587. package/dist/types/iceberg.js +48 -0
  588. package/dist/types/iceberg.js.map +1 -0
  589. package/dist/types/ids.js +170 -0
  590. package/dist/types/ids.js.map +1 -0
  591. package/dist/types/index.js +41 -0
  592. package/dist/types/index.js.map +1 -0
  593. package/dist/types/introspect.js +54 -0
  594. package/dist/types/introspect.js.map +1 -0
  595. package/dist/types/observability.js +124 -0
  596. package/dist/types/observability.js.map +1 -0
  597. package/dist/types/sync-protocol.js +175 -0
  598. package/dist/types/sync-protocol.js.map +1 -0
  599. package/dist/types/vector.js +13 -0
  600. package/dist/types/vector.js.map +1 -0
  601. package/dist/workflows/ScheduleManager.js +473 -0
  602. package/dist/workflows/ScheduleManager.js.map +1 -0
  603. package/dist/workflows/StepDOBridge.js +149 -0
  604. package/dist/workflows/StepDOBridge.js.map +1 -0
  605. package/dist/workflows/StepResultStorage.js +232 -0
  606. package/dist/workflows/StepResultStorage.js.map +1 -0
  607. package/dist/workflows/WaitForEventManager.js +461 -0
  608. package/dist/workflows/WaitForEventManager.js.map +1 -0
  609. package/dist/workflows/analyzer.js +332 -0
  610. package/dist/workflows/analyzer.js.map +1 -0
  611. package/dist/workflows/compat/activity-router.js +484 -0
  612. package/dist/workflows/compat/activity-router.js.map +1 -0
  613. package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
  614. package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
  615. package/dist/workflows/compat/backends/index.js +14 -0
  616. package/dist/workflows/compat/backends/index.js.map +1 -0
  617. package/dist/workflows/compat/errors/index.js +375 -0
  618. package/dist/workflows/compat/errors/index.js.map +1 -0
  619. package/dist/workflows/compat/index.js +79 -0
  620. package/dist/workflows/compat/index.js.map +1 -0
  621. package/dist/workflows/compat/inngest/index.js +989 -0
  622. package/dist/workflows/compat/inngest/index.js.map +1 -0
  623. package/dist/workflows/compat/qstash/index.js +1263 -0
  624. package/dist/workflows/compat/qstash/index.js.map +1 -0
  625. package/dist/workflows/compat/temporal/activities.js +739 -0
  626. package/dist/workflows/compat/temporal/activities.js.map +1 -0
  627. package/dist/workflows/compat/temporal/child-workflows.js +154 -0
  628. package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
  629. package/dist/workflows/compat/temporal/client.js +381 -0
  630. package/dist/workflows/compat/temporal/client.js.map +1 -0
  631. package/dist/workflows/compat/temporal/context.js +309 -0
  632. package/dist/workflows/compat/temporal/context.js.map +1 -0
  633. package/dist/workflows/compat/temporal/determinism.js +216 -0
  634. package/dist/workflows/compat/temporal/determinism.js.map +1 -0
  635. package/dist/workflows/compat/temporal/errors.js +128 -0
  636. package/dist/workflows/compat/temporal/errors.js.map +1 -0
  637. package/dist/workflows/compat/temporal/index.js +2464 -0
  638. package/dist/workflows/compat/temporal/index.js.map +1 -0
  639. package/dist/workflows/compat/temporal/saga.js +504 -0
  640. package/dist/workflows/compat/temporal/saga.js.map +1 -0
  641. package/dist/workflows/compat/temporal/signals.js +364 -0
  642. package/dist/workflows/compat/temporal/signals.js.map +1 -0
  643. package/dist/workflows/compat/temporal/storage.js +271 -0
  644. package/dist/workflows/compat/temporal/storage.js.map +1 -0
  645. package/dist/workflows/compat/temporal/timers.js +347 -0
  646. package/dist/workflows/compat/temporal/timers.js.map +1 -0
  647. package/dist/workflows/compat/temporal/types.js +7 -0
  648. package/dist/workflows/compat/temporal/types.js.map +1 -0
  649. package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
  650. package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
  651. package/dist/workflows/compat/trigger/index.js +468 -0
  652. package/dist/workflows/compat/trigger/index.js.map +1 -0
  653. package/dist/workflows/compat/utils/index.js +69 -0
  654. package/dist/workflows/compat/utils/index.js.map +1 -0
  655. package/dist/workflows/context/correlation-capability.js +266 -0
  656. package/dist/workflows/context/correlation-capability.js.map +1 -0
  657. package/dist/workflows/context/correlation.js +484 -0
  658. package/dist/workflows/context/correlation.js.map +1 -0
  659. package/dist/workflows/context/experiment.js +289 -0
  660. package/dist/workflows/context/experiment.js.map +1 -0
  661. package/dist/workflows/context/flag.js +244 -0
  662. package/dist/workflows/context/flag.js.map +1 -0
  663. package/dist/workflows/context/foundation.js +648 -0
  664. package/dist/workflows/context/foundation.js.map +1 -0
  665. package/dist/workflows/context/human-base.js +106 -0
  666. package/dist/workflows/context/human-base.js.map +1 -0
  667. package/dist/workflows/context/human.js +368 -0
  668. package/dist/workflows/context/human.js.map +1 -0
  669. package/dist/workflows/context/measure.js +354 -0
  670. package/dist/workflows/context/measure.js.map +1 -0
  671. package/dist/workflows/context/rate-limit.js +358 -0
  672. package/dist/workflows/context/rate-limit.js.map +1 -0
  673. package/dist/workflows/context/user.js +117 -0
  674. package/dist/workflows/context/user.js.map +1 -0
  675. package/dist/workflows/context/vault.js +360 -0
  676. package/dist/workflows/context/vault.js.map +1 -0
  677. package/dist/workflows/data/entity-events/entity-events.js +489 -0
  678. package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
  679. package/dist/workflows/data/experiment/index.js +599 -0
  680. package/dist/workflows/data/experiment/index.js.map +1 -0
  681. package/dist/workflows/data/goal/context.js +558 -0
  682. package/dist/workflows/data/goal/context.js.map +1 -0
  683. package/dist/workflows/data/goal/index.js +32 -0
  684. package/dist/workflows/data/goal/index.js.map +1 -0
  685. package/dist/workflows/data/measure/index.js +840 -0
  686. package/dist/workflows/data/measure/index.js.map +1 -0
  687. package/dist/workflows/data/stream/index.js +1215 -0
  688. package/dist/workflows/data/stream/index.js.map +1 -0
  689. package/dist/workflows/data/track/context.js +883 -0
  690. package/dist/workflows/data/track/context.js.map +1 -0
  691. package/dist/workflows/data/track/index.js +15 -0
  692. package/dist/workflows/data/track/index.js.map +1 -0
  693. package/dist/workflows/data/view/context.js +864 -0
  694. package/dist/workflows/data/view/context.js.map +1 -0
  695. package/dist/workflows/domain.js +93 -0
  696. package/dist/workflows/domain.js.map +1 -0
  697. package/dist/workflows/flag.js +176 -0
  698. package/dist/workflows/flag.js.map +1 -0
  699. package/dist/workflows/flags.js +217 -0
  700. package/dist/workflows/flags.js.map +1 -0
  701. package/dist/workflows/hash.js +209 -0
  702. package/dist/workflows/hash.js.map +1 -0
  703. package/dist/workflows/index.js +50 -0
  704. package/dist/workflows/index.js.map +1 -0
  705. package/dist/workflows/on.js +378 -0
  706. package/dist/workflows/on.js.map +1 -0
  707. package/dist/workflows/pipeline-promise.js +481 -0
  708. package/dist/workflows/pipeline-promise.js.map +1 -0
  709. package/dist/workflows/pipeline-types.js +20 -0
  710. package/dist/workflows/pipeline-types.js.map +1 -0
  711. package/dist/workflows/proxy.js +76 -0
  712. package/dist/workflows/proxy.js.map +1 -0
  713. package/dist/workflows/runtime.js +310 -0
  714. package/dist/workflows/runtime.js.map +1 -0
  715. package/dist/workflows/schedule-builder.js +327 -0
  716. package/dist/workflows/schedule-builder.js.map +1 -0
  717. package/dist/workflows/visibility/index.js +148 -0
  718. package/dist/workflows/visibility/index.js.map +1 -0
  719. package/dist/workflows/visibility/query-parser.js +150 -0
  720. package/dist/workflows/visibility/query-parser.js.map +1 -0
  721. package/dist/workflows/visibility/store.js +223 -0
  722. package/dist/workflows/visibility/store.js.map +1 -0
  723. package/dist/workflows/visibility/types.js +30 -0
  724. package/dist/workflows/visibility/types.js.map +1 -0
  725. package/dist/workflows/workflow.js +53 -0
  726. package/dist/workflows/workflow.js.map +1 -0
  727. 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":"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"}
@@ -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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"}