@dotdo/do 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +400 -0
- package/dist/ai/embeddings.d.ts +129 -0
- package/dist/ai/embeddings.d.ts.map +1 -0
- package/dist/ai/embeddings.js +217 -0
- package/dist/ai/embeddings.js.map +1 -0
- package/dist/ai/gateway.d.ts +139 -0
- package/dist/ai/gateway.d.ts.map +1 -0
- package/dist/ai/gateway.js +179 -0
- package/dist/ai/gateway.js.map +1 -0
- package/dist/ai/image.d.ts +140 -0
- package/dist/ai/image.d.ts.map +1 -0
- package/dist/ai/image.js +199 -0
- package/dist/ai/image.js.map +1 -0
- package/dist/ai/index.d.ts +98 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +223 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/models.d.ts +81 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +537 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/text.d.ts +176 -0
- package/dist/ai/text.d.ts.map +1 -0
- package/dist/ai/text.js +253 -0
- package/dist/ai/text.js.map +1 -0
- package/dist/ai/voice/agents.d.ts +224 -0
- package/dist/ai/voice/agents.d.ts.map +1 -0
- package/dist/ai/voice/agents.js +375 -0
- package/dist/ai/voice/agents.js.map +1 -0
- package/dist/ai/voice/campaigns.d.ts +307 -0
- package/dist/ai/voice/campaigns.d.ts.map +1 -0
- package/dist/ai/voice/campaigns.js +739 -0
- package/dist/ai/voice/campaigns.js.map +1 -0
- package/dist/ai/voice/index.d.ts +21 -0
- package/dist/ai/voice/index.d.ts.map +1 -0
- package/dist/ai/voice/index.js +42 -0
- package/dist/ai/voice/index.js.map +1 -0
- package/dist/ai/voice/providers.d.ts +283 -0
- package/dist/ai/voice/providers.d.ts.map +1 -0
- package/dist/ai/voice/providers.js +286 -0
- package/dist/ai/voice/providers.js.map +1 -0
- package/dist/ai/voice/sessions.d.ts +294 -0
- package/dist/ai/voice/sessions.d.ts.map +1 -0
- package/dist/ai/voice/sessions.js +531 -0
- package/dist/ai/voice/sessions.js.map +1 -0
- package/dist/ai/voice/tools.d.ts +242 -0
- package/dist/ai/voice/tools.d.ts.map +1 -0
- package/dist/ai/voice/tools.js +370 -0
- package/dist/ai/voice/tools.js.map +1 -0
- package/dist/ai/voice/tts.d.ts +173 -0
- package/dist/ai/voice/tts.d.ts.map +1 -0
- package/dist/ai/voice/tts.js +252 -0
- package/dist/ai/voice/tts.js.map +1 -0
- package/dist/ai/voice/webrtc.d.ts +228 -0
- package/dist/ai/voice/webrtc.d.ts.map +1 -0
- package/dist/ai/voice/webrtc.js +372 -0
- package/dist/ai/voice/webrtc.js.map +1 -0
- package/dist/api/index.d.ts +103 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +191 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/mcp/handlers.d.ts +25 -0
- package/dist/api/mcp/handlers.d.ts.map +1 -0
- package/dist/api/mcp/handlers.js +422 -0
- package/dist/api/mcp/handlers.js.map +1 -0
- package/dist/api/mcp/index.d.ts +113 -0
- package/dist/api/mcp/index.d.ts.map +1 -0
- package/dist/api/mcp/index.js +141 -0
- package/dist/api/mcp/index.js.map +1 -0
- package/dist/api/middleware/auth.d.ts +65 -0
- package/dist/api/middleware/auth.d.ts.map +1 -0
- package/dist/api/middleware/auth.js +271 -0
- package/dist/api/middleware/auth.js.map +1 -0
- package/dist/api/middleware/cors.d.ts +62 -0
- package/dist/api/middleware/cors.d.ts.map +1 -0
- package/dist/api/middleware/cors.js +225 -0
- package/dist/api/middleware/cors.js.map +1 -0
- package/dist/api/middleware/index.d.ts +60 -0
- package/dist/api/middleware/index.d.ts.map +1 -0
- package/dist/api/middleware/index.js +175 -0
- package/dist/api/middleware/index.js.map +1 -0
- package/dist/api/middleware/rateLimit.d.ts +84 -0
- package/dist/api/middleware/rateLimit.d.ts.map +1 -0
- package/dist/api/middleware/rateLimit.js +321 -0
- package/dist/api/middleware/rateLimit.js.map +1 -0
- package/dist/api/routes/ai.d.ts +17 -0
- package/dist/api/routes/ai.d.ts.map +1 -0
- package/dist/api/routes/ai.js +430 -0
- package/dist/api/routes/ai.js.map +1 -0
- package/dist/api/routes/do.d.ts +17 -0
- package/dist/api/routes/do.d.ts.map +1 -0
- package/dist/api/routes/do.js +458 -0
- package/dist/api/routes/do.js.map +1 -0
- package/dist/api/routes/functions.d.ts +111 -0
- package/dist/api/routes/functions.d.ts.map +1 -0
- package/dist/api/routes/functions.js +548 -0
- package/dist/api/routes/functions.js.map +1 -0
- package/dist/api/routes/health.d.ts +16 -0
- package/dist/api/routes/health.d.ts.map +1 -0
- package/dist/api/routes/health.js +163 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/index.d.ts +41 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +275 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/nouns.d.ts +26 -0
- package/dist/api/routes/nouns.d.ts.map +1 -0
- package/dist/api/routes/nouns.js +456 -0
- package/dist/api/routes/nouns.js.map +1 -0
- package/dist/api/routes/orgs.d.ts +17 -0
- package/dist/api/routes/orgs.d.ts.map +1 -0
- package/dist/api/routes/orgs.js +560 -0
- package/dist/api/routes/orgs.js.map +1 -0
- package/dist/api/routes/relationships.d.ts +30 -0
- package/dist/api/routes/relationships.d.ts.map +1 -0
- package/dist/api/routes/relationships.js +360 -0
- package/dist/api/routes/relationships.js.map +1 -0
- package/dist/api/routes/roles.d.ts +17 -0
- package/dist/api/routes/roles.d.ts.map +1 -0
- package/dist/api/routes/roles.js +721 -0
- package/dist/api/routes/roles.js.map +1 -0
- package/dist/api/routes/things.d.ts +27 -0
- package/dist/api/routes/things.d.ts.map +1 -0
- package/dist/api/routes/things.js +568 -0
- package/dist/api/routes/things.js.map +1 -0
- package/dist/api/routes/users.d.ts +17 -0
- package/dist/api/routes/users.d.ts.map +1 -0
- package/dist/api/routes/users.js +401 -0
- package/dist/api/routes/users.js.map +1 -0
- package/dist/api/routes/verbs.d.ts +31 -0
- package/dist/api/routes/verbs.d.ts.map +1 -0
- package/dist/api/routes/verbs.js +505 -0
- package/dist/api/routes/verbs.js.map +1 -0
- package/dist/api/routes/workflows.d.ts +44 -0
- package/dist/api/routes/workflows.d.ts.map +1 -0
- package/dist/api/routes/workflows.js +521 -0
- package/dist/api/routes/workflows.js.map +1 -0
- package/dist/api/types.d.ts +370 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +11 -0
- package/dist/api/types.js.map +1 -0
- package/dist/db/cdc/events.d.ts +201 -0
- package/dist/db/cdc/events.d.ts.map +1 -0
- package/dist/db/cdc/events.js +271 -0
- package/dist/db/cdc/events.js.map +1 -0
- package/dist/db/cdc/index.d.ts +13 -0
- package/dist/db/cdc/index.d.ts.map +1 -0
- package/dist/db/cdc/index.js +16 -0
- package/dist/db/cdc/index.js.map +1 -0
- package/dist/db/cdc/replay.d.ts +388 -0
- package/dist/db/cdc/replay.d.ts.map +1 -0
- package/dist/db/cdc/replay.js +469 -0
- package/dist/db/cdc/replay.js.map +1 -0
- package/dist/db/cdc/storage.d.ts +567 -0
- package/dist/db/cdc/storage.d.ts.map +1 -0
- package/dist/db/cdc/storage.js +856 -0
- package/dist/db/cdc/storage.js.map +1 -0
- package/dist/db/cdc/streaming.d.ts +459 -0
- package/dist/db/cdc/streaming.d.ts.map +1 -0
- package/dist/db/cdc/streaming.js +636 -0
- package/dist/db/cdc/streaming.js.map +1 -0
- package/dist/db/collections/actions.d.ts +440 -0
- package/dist/db/collections/actions.d.ts.map +1 -0
- package/dist/db/collections/actions.js +631 -0
- package/dist/db/collections/actions.js.map +1 -0
- package/dist/db/collections/base.d.ts +342 -0
- package/dist/db/collections/base.d.ts.map +1 -0
- package/dist/db/collections/base.js +510 -0
- package/dist/db/collections/base.js.map +1 -0
- package/dist/db/collections/index.d.ts +50 -0
- package/dist/db/collections/index.d.ts.map +1 -0
- package/dist/db/collections/index.js +48 -0
- package/dist/db/collections/index.js.map +1 -0
- package/dist/db/collections/nouns.d.ts +260 -0
- package/dist/db/collections/nouns.d.ts.map +1 -0
- package/dist/db/collections/nouns.js +273 -0
- package/dist/db/collections/nouns.js.map +1 -0
- package/dist/db/collections/relationships.d.ts +484 -0
- package/dist/db/collections/relationships.d.ts.map +1 -0
- package/dist/db/collections/relationships.js +815 -0
- package/dist/db/collections/relationships.js.map +1 -0
- package/dist/db/collections/things.d.ts +439 -0
- package/dist/db/collections/things.d.ts.map +1 -0
- package/dist/db/collections/things.js +603 -0
- package/dist/db/collections/things.js.map +1 -0
- package/dist/db/collections/verbs.d.ts +308 -0
- package/dist/db/collections/verbs.d.ts.map +1 -0
- package/dist/db/collections/verbs.js +480 -0
- package/dist/db/collections/verbs.js.map +1 -0
- package/dist/db/index.d.ts +14 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +23 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/storage/cold.d.ts +313 -0
- package/dist/db/storage/cold.d.ts.map +1 -0
- package/dist/db/storage/cold.js +319 -0
- package/dist/db/storage/cold.js.map +1 -0
- package/dist/db/storage/hot.d.ts +340 -0
- package/dist/db/storage/hot.d.ts.map +1 -0
- package/dist/db/storage/hot.js +333 -0
- package/dist/db/storage/hot.js.map +1 -0
- package/dist/db/storage/index.d.ts +242 -0
- package/dist/db/storage/index.d.ts.map +1 -0
- package/dist/db/storage/index.js +109 -0
- package/dist/db/storage/index.js.map +1 -0
- package/dist/db/storage/snapshots.d.ts +342 -0
- package/dist/db/storage/snapshots.d.ts.map +1 -0
- package/dist/db/storage/snapshots.js +298 -0
- package/dist/db/storage/snapshots.js.map +1 -0
- package/dist/db/storage/vortex.d.ts +324 -0
- package/dist/db/storage/vortex.d.ts.map +1 -0
- package/dist/db/storage/vortex.js +365 -0
- package/dist/db/storage/vortex.js.map +1 -0
- package/dist/db/storage/warm.d.ts +306 -0
- package/dist/db/storage/warm.d.ts.map +1 -0
- package/dist/db/storage/warm.js +339 -0
- package/dist/db/storage/warm.js.map +1 -0
- package/dist/do/DigitalObject.d.ts +595 -0
- package/dist/do/DigitalObject.d.ts.map +1 -0
- package/dist/do/DigitalObject.js +971 -0
- package/dist/do/DigitalObject.js.map +1 -0
- package/dist/do/business/financial/accounting.d.ts +436 -0
- package/dist/do/business/financial/accounting.d.ts.map +1 -0
- package/dist/do/business/financial/accounting.js +476 -0
- package/dist/do/business/financial/accounting.js.map +1 -0
- package/dist/do/business/financial/index.d.ts +15 -0
- package/dist/do/business/financial/index.d.ts.map +1 -0
- package/dist/do/business/financial/index.js +20 -0
- package/dist/do/business/financial/index.js.map +1 -0
- package/dist/do/business/financial/metrics.d.ts +370 -0
- package/dist/do/business/financial/metrics.d.ts.map +1 -0
- package/dist/do/business/financial/metrics.js +376 -0
- package/dist/do/business/financial/metrics.js.map +1 -0
- package/dist/do/business/financial/payments.d.ts +397 -0
- package/dist/do/business/financial/payments.d.ts.map +1 -0
- package/dist/do/business/financial/payments.js +395 -0
- package/dist/do/business/financial/payments.js.map +1 -0
- package/dist/do/business/financial/reports.d.ts +284 -0
- package/dist/do/business/financial/reports.d.ts.map +1 -0
- package/dist/do/business/financial/reports.js +347 -0
- package/dist/do/business/financial/reports.js.map +1 -0
- package/dist/do/business/financial/stripe.d.ts +254 -0
- package/dist/do/business/financial/stripe.d.ts.map +1 -0
- package/dist/do/business/financial/stripe.js +261 -0
- package/dist/do/business/financial/stripe.js.map +1 -0
- package/dist/do/business/financial/subscriptions.d.ts +402 -0
- package/dist/do/business/financial/subscriptions.d.ts.map +1 -0
- package/dist/do/business/financial/subscriptions.js +349 -0
- package/dist/do/business/financial/subscriptions.js.map +1 -0
- package/dist/do/business/index.d.ts +9 -0
- package/dist/do/business/index.d.ts.map +1 -0
- package/dist/do/business/index.js +10 -0
- package/dist/do/business/index.js.map +1 -0
- package/dist/do/colo/followers.d.ts +194 -0
- package/dist/do/colo/followers.d.ts.map +1 -0
- package/dist/do/colo/followers.js +224 -0
- package/dist/do/colo/followers.js.map +1 -0
- package/dist/do/colo/fork.d.ts +103 -0
- package/dist/do/colo/fork.d.ts.map +1 -0
- package/dist/do/colo/fork.js +143 -0
- package/dist/do/colo/fork.js.map +1 -0
- package/dist/do/colo/index.d.ts +181 -0
- package/dist/do/colo/index.d.ts.map +1 -0
- package/dist/do/colo/index.js +145 -0
- package/dist/do/colo/index.js.map +1 -0
- package/dist/do/colo/info.d.ts +106 -0
- package/dist/do/colo/info.d.ts.map +1 -0
- package/dist/do/colo/info.js +196 -0
- package/dist/do/colo/info.js.map +1 -0
- package/dist/do/colo/migrate.d.ts +161 -0
- package/dist/do/colo/migrate.d.ts.map +1 -0
- package/dist/do/colo/migrate.js +190 -0
- package/dist/do/colo/migrate.js.map +1 -0
- package/dist/do/colo/routing.d.ts +182 -0
- package/dist/do/colo/routing.d.ts.map +1 -0
- package/dist/do/colo/routing.js +254 -0
- package/dist/do/colo/routing.js.map +1 -0
- package/dist/do/domains/dns.d.ts +269 -0
- package/dist/do/domains/dns.d.ts.map +1 -0
- package/dist/do/domains/dns.js +215 -0
- package/dist/do/domains/dns.js.map +1 -0
- package/dist/do/domains/index.d.ts +40 -0
- package/dist/do/domains/index.d.ts.map +1 -0
- package/dist/do/domains/index.js +61 -0
- package/dist/do/domains/index.js.map +1 -0
- package/dist/do/domains/routing.d.ts +263 -0
- package/dist/do/domains/routing.d.ts.map +1 -0
- package/dist/do/domains/routing.js +362 -0
- package/dist/do/domains/routing.js.map +1 -0
- package/dist/do/domains/ssl.d.ts +217 -0
- package/dist/do/domains/ssl.d.ts.map +1 -0
- package/dist/do/domains/ssl.js +231 -0
- package/dist/do/domains/ssl.js.map +1 -0
- package/dist/do/domains/subdomains.d.ts +207 -0
- package/dist/do/domains/subdomains.d.ts.map +1 -0
- package/dist/do/domains/subdomains.js +223 -0
- package/dist/do/domains/subdomains.js.map +1 -0
- package/dist/do/domains/tlds.d.ts +175 -0
- package/dist/do/domains/tlds.d.ts.map +1 -0
- package/dist/do/domains/tlds.js +188 -0
- package/dist/do/domains/tlds.js.map +1 -0
- package/dist/do/domains/validation.d.ts +164 -0
- package/dist/do/domains/validation.d.ts.map +1 -0
- package/dist/do/domains/validation.js +290 -0
- package/dist/do/domains/validation.js.map +1 -0
- package/dist/do/hibernation.d.ts +385 -0
- package/dist/do/hibernation.d.ts.map +1 -0
- package/dist/do/hibernation.js +518 -0
- package/dist/do/hibernation.js.map +1 -0
- package/dist/do/index.d.ts +19 -0
- package/dist/do/index.d.ts.map +1 -0
- package/dist/do/index.js +23 -0
- package/dist/do/index.js.map +1 -0
- package/dist/do/state.d.ts +336 -0
- package/dist/do/state.d.ts.map +1 -0
- package/dist/do/state.js +290 -0
- package/dist/do/state.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/rpc/client.d.ts +426 -0
- package/dist/rpc/client.d.ts.map +1 -0
- package/dist/rpc/client.js +826 -0
- package/dist/rpc/client.js.map +1 -0
- package/dist/rpc/index.d.ts +19 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +23 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/rpc/methods.d.ts +364 -0
- package/dist/rpc/methods.d.ts.map +1 -0
- package/dist/rpc/methods.js +557 -0
- package/dist/rpc/methods.js.map +1 -0
- package/dist/rpc/protocol.d.ts +310 -0
- package/dist/rpc/protocol.d.ts.map +1 -0
- package/dist/rpc/protocol.js +672 -0
- package/dist/rpc/protocol.js.map +1 -0
- package/dist/rpc/routes.d.ts +332 -0
- package/dist/rpc/routes.d.ts.map +1 -0
- package/dist/rpc/routes.js +633 -0
- package/dist/rpc/routes.js.map +1 -0
- package/dist/rpc/server.d.ts +380 -0
- package/dist/rpc/server.d.ts.map +1 -0
- package/dist/rpc/server.js +850 -0
- package/dist/rpc/server.js.map +1 -0
- package/dist/sdk/auth.d.ts +201 -0
- package/dist/sdk/auth.d.ts.map +1 -0
- package/dist/sdk/auth.js +343 -0
- package/dist/sdk/auth.js.map +1 -0
- package/dist/sdk/client.d.ts +123 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +403 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/index.d.ts +123 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +230 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/rpc.d.ts +275 -0
- package/dist/sdk/rpc.d.ts.map +1 -0
- package/dist/sdk/rpc.js +249 -0
- package/dist/sdk/rpc.js.map +1 -0
- package/dist/sdk/transport.d.ts +283 -0
- package/dist/sdk/transport.d.ts.map +1 -0
- package/dist/sdk/transport.js +661 -0
- package/dist/sdk/transport.js.map +1 -0
- package/dist/sdk/types.d.ts +265 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +27 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/types/ai.d.ts +533 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js +18 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types/app.d.ts +371 -0
- package/dist/types/app.d.ts.map +1 -0
- package/dist/types/app.js +151 -0
- package/dist/types/app.js.map +1 -0
- package/dist/types/business.d.ts +482 -0
- package/dist/types/business.d.ts.map +1 -0
- package/dist/types/business.js +60 -0
- package/dist/types/business.js.map +1 -0
- package/dist/types/cascade.d.ts +323 -0
- package/dist/types/cascade.d.ts.map +1 -0
- package/dist/types/cascade.js +82 -0
- package/dist/types/cascade.js.map +1 -0
- package/dist/types/collections.d.ts +704 -0
- package/dist/types/collections.d.ts.map +1 -0
- package/dist/types/collections.js +23 -0
- package/dist/types/collections.js.map +1 -0
- package/dist/types/colo.d.ts +171 -0
- package/dist/types/colo.d.ts.map +1 -0
- package/dist/types/colo.js +63 -0
- package/dist/types/colo.js.map +1 -0
- package/dist/types/communication.d.ts +595 -0
- package/dist/types/communication.d.ts.map +1 -0
- package/dist/types/communication.js +16 -0
- package/dist/types/communication.js.map +1 -0
- package/dist/types/content.d.ts +286 -0
- package/dist/types/content.d.ts.map +1 -0
- package/dist/types/content.js +8 -0
- package/dist/types/content.js.map +1 -0
- package/dist/types/context.d.ts +407 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +36 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/databases.d.ts +377 -0
- package/dist/types/databases.d.ts.map +1 -0
- package/dist/types/databases.js +14 -0
- package/dist/types/databases.js.map +1 -0
- package/dist/types/domains.d.ts +132 -0
- package/dist/types/domains.d.ts.map +1 -0
- package/dist/types/domains.js +107 -0
- package/dist/types/domains.js.map +1 -0
- package/dist/types/execution.d.ts +381 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +40 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/financial.d.ts +608 -0
- package/dist/types/financial.d.ts.map +1 -0
- package/dist/types/financial.js +12 -0
- package/dist/types/financial.js.map +1 -0
- package/dist/types/functions.d.ts +215 -0
- package/dist/types/functions.d.ts.map +1 -0
- package/dist/types/functions.js +15 -0
- package/dist/types/functions.js.map +1 -0
- package/dist/types/git.d.ts +299 -0
- package/dist/types/git.d.ts.map +1 -0
- package/dist/types/git.js +17 -0
- package/dist/types/git.js.map +1 -0
- package/dist/types/identity.d.ts +141 -0
- package/dist/types/identity.d.ts.map +1 -0
- package/dist/types/identity.js +54 -0
- package/dist/types/identity.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +65 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/integrations.d.ts +356 -0
- package/dist/types/integrations.d.ts.map +1 -0
- package/dist/types/integrations.js +19 -0
- package/dist/types/integrations.js.map +1 -0
- package/dist/types/mdxui.d.ts +1955 -0
- package/dist/types/mdxui.d.ts.map +1 -0
- package/dist/types/mdxui.js +751 -0
- package/dist/types/mdxui.js.map +1 -0
- package/dist/types/observability.d.ts +315 -0
- package/dist/types/observability.d.ts.map +1 -0
- package/dist/types/observability.js +13 -0
- package/dist/types/observability.js.map +1 -0
- package/dist/types/rpc.d.ts +339 -0
- package/dist/types/rpc.d.ts.map +1 -0
- package/dist/types/rpc.js +24 -0
- package/dist/types/rpc.js.map +1 -0
- package/dist/types/saas.d.ts +678 -0
- package/dist/types/saas.d.ts.map +1 -0
- package/dist/types/saas.js +59 -0
- package/dist/types/saas.js.map +1 -0
- package/dist/types/service.d.ts +676 -0
- package/dist/types/service.d.ts.map +1 -0
- package/dist/types/service.js +69 -0
- package/dist/types/service.js.map +1 -0
- package/dist/types/site.d.ts +317 -0
- package/dist/types/site.d.ts.map +1 -0
- package/dist/types/site.js +203 -0
- package/dist/types/site.js.map +1 -0
- package/dist/types/startup.d.ts +576 -0
- package/dist/types/startup.d.ts.map +1 -0
- package/dist/types/startup.js +59 -0
- package/dist/types/startup.js.map +1 -0
- package/dist/types/storage.d.ts +276 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +35 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/telephony.d.ts +458 -0
- package/dist/types/telephony.d.ts.map +1 -0
- package/dist/types/telephony.js +19 -0
- package/dist/types/telephony.js.map +1 -0
- package/dist/types/tenant.d.ts +708 -0
- package/dist/types/tenant.d.ts.map +1 -0
- package/dist/types/tenant.js +103 -0
- package/dist/types/tenant.js.map +1 -0
- package/dist/types/voice-ai.d.ts +459 -0
- package/dist/types/voice-ai.d.ts.map +1 -0
- package/dist/types/voice-ai.js +32 -0
- package/dist/types/voice-ai.js.map +1 -0
- package/package.json +143 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Storage - DO SQLite
|
|
3
|
+
*
|
|
4
|
+
* Primary storage tier using Durable Object's built-in SQLite.
|
|
5
|
+
* Provides ~4ms latency for active data with automatic CDC event generation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Type-safe CRUD operations
|
|
9
|
+
* - Automatic CDC event emission on mutations
|
|
10
|
+
* - Vortex columnar encoding for large collections
|
|
11
|
+
* - Transaction support
|
|
12
|
+
*
|
|
13
|
+
* @module @do/core/storage/hot
|
|
14
|
+
*/
|
|
15
|
+
import type { CDCEvent, CDCOperation, CDCCursor } from '../../types/storage';
|
|
16
|
+
/**
|
|
17
|
+
* CDC event emitter interface
|
|
18
|
+
*/
|
|
19
|
+
export interface CDCEmitter {
|
|
20
|
+
/**
|
|
21
|
+
* Emit a CDC event
|
|
22
|
+
* @param event - CDC event to emit
|
|
23
|
+
*/
|
|
24
|
+
emit(event: CDCEvent): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Get the current sequence number
|
|
27
|
+
*/
|
|
28
|
+
getSequence(): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* Get the next sequence number (increments)
|
|
31
|
+
*/
|
|
32
|
+
nextSequence(): Promise<number>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Hot storage configuration
|
|
36
|
+
*/
|
|
37
|
+
export interface HotStorageConfig {
|
|
38
|
+
/** Row count threshold for Vortex conversion */
|
|
39
|
+
vortexThreshold?: number;
|
|
40
|
+
/** Enable automatic Vortex conversion */
|
|
41
|
+
autoVortex?: boolean;
|
|
42
|
+
/** Collections to exclude from CDC */
|
|
43
|
+
cdcExclude?: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Query options for hot storage
|
|
47
|
+
*/
|
|
48
|
+
export interface HotQueryOptions {
|
|
49
|
+
/** Filter conditions */
|
|
50
|
+
where?: Record<string, unknown>;
|
|
51
|
+
/** Sort order */
|
|
52
|
+
orderBy?: {
|
|
53
|
+
field: string;
|
|
54
|
+
direction: 'asc' | 'desc';
|
|
55
|
+
}[];
|
|
56
|
+
/** Maximum results */
|
|
57
|
+
limit?: number;
|
|
58
|
+
/** Offset for pagination */
|
|
59
|
+
offset?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Transaction interface
|
|
63
|
+
*/
|
|
64
|
+
export interface Transaction {
|
|
65
|
+
/**
|
|
66
|
+
* Insert a document within the transaction
|
|
67
|
+
*/
|
|
68
|
+
insert<T extends {
|
|
69
|
+
id: string;
|
|
70
|
+
}>(collection: string, document: T): void;
|
|
71
|
+
/**
|
|
72
|
+
* Update a document within the transaction
|
|
73
|
+
*/
|
|
74
|
+
update<T>(collection: string, id: string, updates: Partial<T>): void;
|
|
75
|
+
/**
|
|
76
|
+
* Delete a document within the transaction
|
|
77
|
+
*/
|
|
78
|
+
delete(collection: string, id: string): void;
|
|
79
|
+
/**
|
|
80
|
+
* Commit the transaction
|
|
81
|
+
*/
|
|
82
|
+
commit(): Promise<CDCEvent[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Rollback the transaction
|
|
85
|
+
*/
|
|
86
|
+
rollback(): void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Hot storage implementation using DO SQLite
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const hot = new HotStorage(sqliteStorage, cdcEmitter)
|
|
94
|
+
*
|
|
95
|
+
* // Insert with automatic CDC
|
|
96
|
+
* await hot.insert('users', { id: '1', name: 'Alice' })
|
|
97
|
+
*
|
|
98
|
+
* // Query
|
|
99
|
+
* const users = await hot.query('users', {
|
|
100
|
+
* where: { name: 'Alice' },
|
|
101
|
+
* limit: 10,
|
|
102
|
+
* })
|
|
103
|
+
*
|
|
104
|
+
* // Update with CDC
|
|
105
|
+
* await hot.update('users', '1', { name: 'Alice Smith' })
|
|
106
|
+
*
|
|
107
|
+
* // Delete with CDC
|
|
108
|
+
* await hot.delete('users', '1')
|
|
109
|
+
*
|
|
110
|
+
* // Transactional operations
|
|
111
|
+
* const events = await hot.transaction(async (tx) => {
|
|
112
|
+
* tx.insert('users', { id: '2', name: 'Bob' })
|
|
113
|
+
* tx.update('orders', 'o1', { status: 'shipped' })
|
|
114
|
+
* })
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export declare class HotStorage {
|
|
118
|
+
private readonly sqlite;
|
|
119
|
+
private readonly cdc;
|
|
120
|
+
private config;
|
|
121
|
+
/**
|
|
122
|
+
* Create a new hot storage instance
|
|
123
|
+
*
|
|
124
|
+
* @param sqlite - DO SQLite storage binding
|
|
125
|
+
* @param cdc - CDC event emitter
|
|
126
|
+
* @param config - Storage configuration
|
|
127
|
+
*/
|
|
128
|
+
constructor(sqlite: SqlStorage, cdc: CDCEmitter, config?: HotStorageConfig);
|
|
129
|
+
/**
|
|
130
|
+
* Insert a document
|
|
131
|
+
*
|
|
132
|
+
* @param collection - Collection name
|
|
133
|
+
* @param document - Document to insert (must have id field)
|
|
134
|
+
* @returns The inserted document
|
|
135
|
+
*
|
|
136
|
+
* @throws {Error} If document already exists
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* await hot.insert('users', {
|
|
141
|
+
* id: crypto.randomUUID(),
|
|
142
|
+
* name: 'Alice',
|
|
143
|
+
* email: 'alice@example.com',
|
|
144
|
+
* })
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
insert<T extends {
|
|
148
|
+
id: string;
|
|
149
|
+
}>(collection: string, document: T): Promise<T>;
|
|
150
|
+
/**
|
|
151
|
+
* Query documents from a collection
|
|
152
|
+
*
|
|
153
|
+
* @param collection - Collection name
|
|
154
|
+
* @param options - Query options
|
|
155
|
+
* @returns Array of matching documents
|
|
156
|
+
*
|
|
157
|
+
* @example
|
|
158
|
+
* ```typescript
|
|
159
|
+
* const activeUsers = await hot.query('users', {
|
|
160
|
+
* where: { status: 'active' },
|
|
161
|
+
* orderBy: [{ field: 'createdAt', direction: 'desc' }],
|
|
162
|
+
* limit: 100,
|
|
163
|
+
* })
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
query<T>(collection: string, options?: HotQueryOptions): Promise<T[]>;
|
|
167
|
+
/**
|
|
168
|
+
* Get a single document by ID
|
|
169
|
+
*
|
|
170
|
+
* @param collection - Collection name
|
|
171
|
+
* @param id - Document ID
|
|
172
|
+
* @returns The document or null if not found
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const user = await hot.get('users', userId)
|
|
177
|
+
* if (user) {
|
|
178
|
+
* console.log(user.name)
|
|
179
|
+
* }
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
get<T>(collection: string, id: string): Promise<T | null>;
|
|
183
|
+
/**
|
|
184
|
+
* Update a document
|
|
185
|
+
*
|
|
186
|
+
* @param collection - Collection name
|
|
187
|
+
* @param id - Document ID
|
|
188
|
+
* @param updates - Partial document updates
|
|
189
|
+
* @returns The updated document
|
|
190
|
+
*
|
|
191
|
+
* @throws {Error} If document not found
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* ```typescript
|
|
195
|
+
* const updated = await hot.update('users', userId, {
|
|
196
|
+
* name: 'Alice Smith',
|
|
197
|
+
* updatedAt: Date.now(),
|
|
198
|
+
* })
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
update<T>(collection: string, id: string, updates: Partial<T>): Promise<T>;
|
|
202
|
+
/**
|
|
203
|
+
* Delete a document
|
|
204
|
+
*
|
|
205
|
+
* @param collection - Collection name
|
|
206
|
+
* @param id - Document ID
|
|
207
|
+
* @returns The deleted document
|
|
208
|
+
*
|
|
209
|
+
* @throws {Error} If document not found
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```typescript
|
|
213
|
+
* const deleted = await hot.delete('users', userId)
|
|
214
|
+
* console.log(`Deleted user: ${deleted.name}`)
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
delete<T>(collection: string, id: string): Promise<T>;
|
|
218
|
+
/**
|
|
219
|
+
* Execute operations in a transaction
|
|
220
|
+
*
|
|
221
|
+
* All operations within the transaction are atomic.
|
|
222
|
+
* CDC events are emitted only on successful commit.
|
|
223
|
+
*
|
|
224
|
+
* @param fn - Transaction function
|
|
225
|
+
* @returns Array of CDC events from the transaction
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```typescript
|
|
229
|
+
* const events = await hot.transaction(async (tx) => {
|
|
230
|
+
* tx.insert('orders', newOrder)
|
|
231
|
+
* tx.update('inventory', productId, { quantity: newQuantity })
|
|
232
|
+
* tx.insert('audit', auditEntry)
|
|
233
|
+
* })
|
|
234
|
+
* console.log(`Transaction emitted ${events.length} CDC events`)
|
|
235
|
+
* ```
|
|
236
|
+
*/
|
|
237
|
+
transaction(fn: (tx: Transaction) => void | Promise<void>): Promise<CDCEvent[]>;
|
|
238
|
+
/**
|
|
239
|
+
* Count documents in a collection
|
|
240
|
+
*
|
|
241
|
+
* @param collection - Collection name
|
|
242
|
+
* @param where - Optional filter conditions
|
|
243
|
+
* @returns Document count
|
|
244
|
+
*
|
|
245
|
+
* @example
|
|
246
|
+
* ```typescript
|
|
247
|
+
* const activeCount = await hot.count('users', { status: 'active' })
|
|
248
|
+
* ```
|
|
249
|
+
*/
|
|
250
|
+
count(collection: string, where?: Record<string, unknown>): Promise<number>;
|
|
251
|
+
/**
|
|
252
|
+
* Check if a document exists
|
|
253
|
+
*
|
|
254
|
+
* @param collection - Collection name
|
|
255
|
+
* @param id - Document ID
|
|
256
|
+
* @returns True if document exists
|
|
257
|
+
*/
|
|
258
|
+
exists(collection: string, id: string): Promise<boolean>;
|
|
259
|
+
/**
|
|
260
|
+
* Bulk insert documents
|
|
261
|
+
*
|
|
262
|
+
* @param collection - Collection name
|
|
263
|
+
* @param documents - Documents to insert
|
|
264
|
+
* @returns Number of inserted documents
|
|
265
|
+
*
|
|
266
|
+
* @example
|
|
267
|
+
* ```typescript
|
|
268
|
+
* const count = await hot.bulkInsert('events', [
|
|
269
|
+
* { id: '1', type: 'click', timestamp: Date.now() },
|
|
270
|
+
* { id: '2', type: 'view', timestamp: Date.now() },
|
|
271
|
+
* ])
|
|
272
|
+
* ```
|
|
273
|
+
*/
|
|
274
|
+
bulkInsert<T extends {
|
|
275
|
+
id: string;
|
|
276
|
+
}>(collection: string, documents: T[]): Promise<number>;
|
|
277
|
+
/**
|
|
278
|
+
* Convert a collection to Vortex columnar format
|
|
279
|
+
*
|
|
280
|
+
* @param collection - Collection name
|
|
281
|
+
* @returns Conversion result
|
|
282
|
+
*/
|
|
283
|
+
convertToVortex(collection: string): Promise<{
|
|
284
|
+
rowCount: number;
|
|
285
|
+
originalSize: number;
|
|
286
|
+
vortexSize: number;
|
|
287
|
+
compressionRatio: number;
|
|
288
|
+
}>;
|
|
289
|
+
/**
|
|
290
|
+
* Get CDC cursor (current position)
|
|
291
|
+
*
|
|
292
|
+
* @returns Current CDC cursor
|
|
293
|
+
*/
|
|
294
|
+
getCDCCursor(): Promise<CDCCursor>;
|
|
295
|
+
/**
|
|
296
|
+
* Get CDC events since cursor
|
|
297
|
+
*
|
|
298
|
+
* @param cursor - Starting cursor
|
|
299
|
+
* @param limit - Maximum events to return
|
|
300
|
+
* @returns CDC events and new cursor
|
|
301
|
+
*/
|
|
302
|
+
getCDCEvents(cursor: CDCCursor, limit?: number): Promise<{
|
|
303
|
+
events: CDCEvent[];
|
|
304
|
+
cursor: CDCCursor;
|
|
305
|
+
}>;
|
|
306
|
+
/**
|
|
307
|
+
* Initialize storage schema
|
|
308
|
+
*
|
|
309
|
+
* Creates necessary tables for collections, CDC, and snapshots.
|
|
310
|
+
*/
|
|
311
|
+
initialize(): Promise<void>;
|
|
312
|
+
/**
|
|
313
|
+
* Get storage statistics
|
|
314
|
+
*
|
|
315
|
+
* @returns Storage statistics
|
|
316
|
+
*/
|
|
317
|
+
getStats(): Promise<{
|
|
318
|
+
collections: {
|
|
319
|
+
name: string;
|
|
320
|
+
rowCount: number;
|
|
321
|
+
sizeBytes: number;
|
|
322
|
+
}[];
|
|
323
|
+
totalRows: number;
|
|
324
|
+
totalSizeBytes: number;
|
|
325
|
+
cdcSequence: number;
|
|
326
|
+
}>;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Create CDC event helper
|
|
330
|
+
*
|
|
331
|
+
* @param operation - CDC operation type
|
|
332
|
+
* @param collection - Collection name
|
|
333
|
+
* @param documentId - Document ID
|
|
334
|
+
* @param before - Document state before change
|
|
335
|
+
* @param after - Document state after change
|
|
336
|
+
* @param sequence - Sequence number
|
|
337
|
+
* @returns CDC event
|
|
338
|
+
*/
|
|
339
|
+
export declare function createCDCEvent<T>(operation: CDCOperation, collection: string, documentId: string, before: T | undefined, after: T | undefined, sequence: number): CDCEvent<T>;
|
|
340
|
+
//# sourceMappingURL=hot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot.d.ts","sourceRoot":"","sources":["../../../db/storage/hot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hot Storage - DO SQLite
|
|
3
|
+
*
|
|
4
|
+
* Primary storage tier using Durable Object's built-in SQLite.
|
|
5
|
+
* Provides ~4ms latency for active data with automatic CDC event generation.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Type-safe CRUD operations
|
|
9
|
+
* - Automatic CDC event emission on mutations
|
|
10
|
+
* - Vortex columnar encoding for large collections
|
|
11
|
+
* - Transaction support
|
|
12
|
+
*
|
|
13
|
+
* @module @do/core/storage/hot
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Hot storage implementation using DO SQLite
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const hot = new HotStorage(sqliteStorage, cdcEmitter)
|
|
21
|
+
*
|
|
22
|
+
* // Insert with automatic CDC
|
|
23
|
+
* await hot.insert('users', { id: '1', name: 'Alice' })
|
|
24
|
+
*
|
|
25
|
+
* // Query
|
|
26
|
+
* const users = await hot.query('users', {
|
|
27
|
+
* where: { name: 'Alice' },
|
|
28
|
+
* limit: 10,
|
|
29
|
+
* })
|
|
30
|
+
*
|
|
31
|
+
* // Update with CDC
|
|
32
|
+
* await hot.update('users', '1', { name: 'Alice Smith' })
|
|
33
|
+
*
|
|
34
|
+
* // Delete with CDC
|
|
35
|
+
* await hot.delete('users', '1')
|
|
36
|
+
*
|
|
37
|
+
* // Transactional operations
|
|
38
|
+
* const events = await hot.transaction(async (tx) => {
|
|
39
|
+
* tx.insert('users', { id: '2', name: 'Bob' })
|
|
40
|
+
* tx.update('orders', 'o1', { status: 'shipped' })
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class HotStorage {
|
|
45
|
+
sqlite;
|
|
46
|
+
cdc;
|
|
47
|
+
config;
|
|
48
|
+
/**
|
|
49
|
+
* Create a new hot storage instance
|
|
50
|
+
*
|
|
51
|
+
* @param sqlite - DO SQLite storage binding
|
|
52
|
+
* @param cdc - CDC event emitter
|
|
53
|
+
* @param config - Storage configuration
|
|
54
|
+
*/
|
|
55
|
+
constructor(sqlite, cdc, config) {
|
|
56
|
+
this.sqlite = sqlite;
|
|
57
|
+
this.cdc = cdc;
|
|
58
|
+
this.config = {
|
|
59
|
+
vortexThreshold: config?.vortexThreshold ?? 1000,
|
|
60
|
+
autoVortex: config?.autoVortex ?? true,
|
|
61
|
+
cdcExclude: config?.cdcExclude ?? ['_internal', '_cdc', '_snapshots'],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Insert a document
|
|
66
|
+
*
|
|
67
|
+
* @param collection - Collection name
|
|
68
|
+
* @param document - Document to insert (must have id field)
|
|
69
|
+
* @returns The inserted document
|
|
70
|
+
*
|
|
71
|
+
* @throws {Error} If document already exists
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* ```typescript
|
|
75
|
+
* await hot.insert('users', {
|
|
76
|
+
* id: crypto.randomUUID(),
|
|
77
|
+
* name: 'Alice',
|
|
78
|
+
* email: 'alice@example.com',
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
async insert(collection, document) {
|
|
83
|
+
// TODO: Implement insert with CDC emission
|
|
84
|
+
throw new Error('Not implemented');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Query documents from a collection
|
|
88
|
+
*
|
|
89
|
+
* @param collection - Collection name
|
|
90
|
+
* @param options - Query options
|
|
91
|
+
* @returns Array of matching documents
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const activeUsers = await hot.query('users', {
|
|
96
|
+
* where: { status: 'active' },
|
|
97
|
+
* orderBy: [{ field: 'createdAt', direction: 'desc' }],
|
|
98
|
+
* limit: 100,
|
|
99
|
+
* })
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
async query(collection, options) {
|
|
103
|
+
// TODO: Implement query
|
|
104
|
+
throw new Error('Not implemented');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get a single document by ID
|
|
108
|
+
*
|
|
109
|
+
* @param collection - Collection name
|
|
110
|
+
* @param id - Document ID
|
|
111
|
+
* @returns The document or null if not found
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```typescript
|
|
115
|
+
* const user = await hot.get('users', userId)
|
|
116
|
+
* if (user) {
|
|
117
|
+
* console.log(user.name)
|
|
118
|
+
* }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
async get(collection, id) {
|
|
122
|
+
// TODO: Implement get
|
|
123
|
+
throw new Error('Not implemented');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update a document
|
|
127
|
+
*
|
|
128
|
+
* @param collection - Collection name
|
|
129
|
+
* @param id - Document ID
|
|
130
|
+
* @param updates - Partial document updates
|
|
131
|
+
* @returns The updated document
|
|
132
|
+
*
|
|
133
|
+
* @throws {Error} If document not found
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* const updated = await hot.update('users', userId, {
|
|
138
|
+
* name: 'Alice Smith',
|
|
139
|
+
* updatedAt: Date.now(),
|
|
140
|
+
* })
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
async update(collection, id, updates) {
|
|
144
|
+
// TODO: Implement update with CDC emission
|
|
145
|
+
throw new Error('Not implemented');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Delete a document
|
|
149
|
+
*
|
|
150
|
+
* @param collection - Collection name
|
|
151
|
+
* @param id - Document ID
|
|
152
|
+
* @returns The deleted document
|
|
153
|
+
*
|
|
154
|
+
* @throws {Error} If document not found
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* const deleted = await hot.delete('users', userId)
|
|
159
|
+
* console.log(`Deleted user: ${deleted.name}`)
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
async delete(collection, id) {
|
|
163
|
+
// TODO: Implement delete with CDC emission
|
|
164
|
+
throw new Error('Not implemented');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Execute operations in a transaction
|
|
168
|
+
*
|
|
169
|
+
* All operations within the transaction are atomic.
|
|
170
|
+
* CDC events are emitted only on successful commit.
|
|
171
|
+
*
|
|
172
|
+
* @param fn - Transaction function
|
|
173
|
+
* @returns Array of CDC events from the transaction
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```typescript
|
|
177
|
+
* const events = await hot.transaction(async (tx) => {
|
|
178
|
+
* tx.insert('orders', newOrder)
|
|
179
|
+
* tx.update('inventory', productId, { quantity: newQuantity })
|
|
180
|
+
* tx.insert('audit', auditEntry)
|
|
181
|
+
* })
|
|
182
|
+
* console.log(`Transaction emitted ${events.length} CDC events`)
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
async transaction(fn) {
|
|
186
|
+
// TODO: Implement transaction support
|
|
187
|
+
throw new Error('Not implemented');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Count documents in a collection
|
|
191
|
+
*
|
|
192
|
+
* @param collection - Collection name
|
|
193
|
+
* @param where - Optional filter conditions
|
|
194
|
+
* @returns Document count
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* const activeCount = await hot.count('users', { status: 'active' })
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
async count(collection, where) {
|
|
202
|
+
// TODO: Implement count
|
|
203
|
+
throw new Error('Not implemented');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a document exists
|
|
207
|
+
*
|
|
208
|
+
* @param collection - Collection name
|
|
209
|
+
* @param id - Document ID
|
|
210
|
+
* @returns True if document exists
|
|
211
|
+
*/
|
|
212
|
+
async exists(collection, id) {
|
|
213
|
+
// TODO: Implement exists check
|
|
214
|
+
throw new Error('Not implemented');
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Bulk insert documents
|
|
218
|
+
*
|
|
219
|
+
* @param collection - Collection name
|
|
220
|
+
* @param documents - Documents to insert
|
|
221
|
+
* @returns Number of inserted documents
|
|
222
|
+
*
|
|
223
|
+
* @example
|
|
224
|
+
* ```typescript
|
|
225
|
+
* const count = await hot.bulkInsert('events', [
|
|
226
|
+
* { id: '1', type: 'click', timestamp: Date.now() },
|
|
227
|
+
* { id: '2', type: 'view', timestamp: Date.now() },
|
|
228
|
+
* ])
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
async bulkInsert(collection, documents) {
|
|
232
|
+
// TODO: Implement bulk insert with batched CDC
|
|
233
|
+
throw new Error('Not implemented');
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Convert a collection to Vortex columnar format
|
|
237
|
+
*
|
|
238
|
+
* @param collection - Collection name
|
|
239
|
+
* @returns Conversion result
|
|
240
|
+
*/
|
|
241
|
+
async convertToVortex(collection) {
|
|
242
|
+
// TODO: Implement Vortex conversion
|
|
243
|
+
throw new Error('Not implemented');
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get CDC cursor (current position)
|
|
247
|
+
*
|
|
248
|
+
* @returns Current CDC cursor
|
|
249
|
+
*/
|
|
250
|
+
async getCDCCursor() {
|
|
251
|
+
// TODO: Implement CDC cursor retrieval
|
|
252
|
+
throw new Error('Not implemented');
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get CDC events since cursor
|
|
256
|
+
*
|
|
257
|
+
* @param cursor - Starting cursor
|
|
258
|
+
* @param limit - Maximum events to return
|
|
259
|
+
* @returns CDC events and new cursor
|
|
260
|
+
*/
|
|
261
|
+
async getCDCEvents(cursor, limit) {
|
|
262
|
+
// TODO: Implement CDC event retrieval
|
|
263
|
+
throw new Error('Not implemented');
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Initialize storage schema
|
|
267
|
+
*
|
|
268
|
+
* Creates necessary tables for collections, CDC, and snapshots.
|
|
269
|
+
*/
|
|
270
|
+
async initialize() {
|
|
271
|
+
// TODO: Implement schema initialization
|
|
272
|
+
throw new Error('Not implemented');
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Get storage statistics
|
|
276
|
+
*
|
|
277
|
+
* @returns Storage statistics
|
|
278
|
+
*/
|
|
279
|
+
async getStats() {
|
|
280
|
+
// TODO: Implement stats retrieval
|
|
281
|
+
throw new Error('Not implemented');
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Create CDC event helper
|
|
286
|
+
*
|
|
287
|
+
* @param operation - CDC operation type
|
|
288
|
+
* @param collection - Collection name
|
|
289
|
+
* @param documentId - Document ID
|
|
290
|
+
* @param before - Document state before change
|
|
291
|
+
* @param after - Document state after change
|
|
292
|
+
* @param sequence - Sequence number
|
|
293
|
+
* @returns CDC event
|
|
294
|
+
*/
|
|
295
|
+
export function createCDCEvent(operation, collection, documentId, before, after, sequence) {
|
|
296
|
+
const event = {
|
|
297
|
+
id: crypto.randomUUID(),
|
|
298
|
+
operation,
|
|
299
|
+
collection,
|
|
300
|
+
documentId,
|
|
301
|
+
timestamp: Date.now(),
|
|
302
|
+
sequence,
|
|
303
|
+
};
|
|
304
|
+
if (before !== undefined) {
|
|
305
|
+
event.before = before;
|
|
306
|
+
}
|
|
307
|
+
if (after !== undefined) {
|
|
308
|
+
event.after = after;
|
|
309
|
+
}
|
|
310
|
+
if (operation === 'UPDATE' && before && after) {
|
|
311
|
+
event.changedFields = getChangedFields(before, after);
|
|
312
|
+
}
|
|
313
|
+
return event;
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get list of changed fields between two objects
|
|
317
|
+
*/
|
|
318
|
+
function getChangedFields(before, after) {
|
|
319
|
+
const changed = [];
|
|
320
|
+
const allKeys = new Set([
|
|
321
|
+
...Object.keys(before),
|
|
322
|
+
...Object.keys(after),
|
|
323
|
+
]);
|
|
324
|
+
for (const key of allKeys) {
|
|
325
|
+
const beforeVal = before[key];
|
|
326
|
+
const afterVal = after[key];
|
|
327
|
+
if (JSON.stringify(beforeVal) !== JSON.stringify(afterVal)) {
|
|
328
|
+
changed.push(key);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return changed;
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=hot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot.js","sourceRoot":"","sources":["../../../db/storage/hot.ts"],"names":[],"mappings":"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"}
|