@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,826 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CapnWeb RPC Client SDK
|
|
3
|
+
*
|
|
4
|
+
* TypeScript client for connecting to Digital Objects via WebSocket or HTTP.
|
|
5
|
+
* Provides type inference for all RPC methods, auto-reconnection, and
|
|
6
|
+
* subscription support.
|
|
7
|
+
*
|
|
8
|
+
* @module rpc/client
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { createRPCClient } from 'do/rpc/client'
|
|
13
|
+
*
|
|
14
|
+
* // Connect to a Digital Object
|
|
15
|
+
* const client = await createRPCClient('wss://my-do.example.com/rpc')
|
|
16
|
+
*
|
|
17
|
+
* // Call methods with full type inference
|
|
18
|
+
* const identity = await client.call('do.identity.get')
|
|
19
|
+
* const things = await client.call('do.things.list', { limit: 10 })
|
|
20
|
+
*
|
|
21
|
+
* // Subscribe to events
|
|
22
|
+
* const unsubscribe = client.subscribe('cdc', (event) => {
|
|
23
|
+
* console.log('Change:', event)
|
|
24
|
+
* })
|
|
25
|
+
*
|
|
26
|
+
* // Batch operations
|
|
27
|
+
* const batch = await client.batch([
|
|
28
|
+
* { id: '1', method: 'do.nouns.list' },
|
|
29
|
+
* { id: '2', method: 'do.verbs.list' },
|
|
30
|
+
* ])
|
|
31
|
+
*
|
|
32
|
+
* // Clean up
|
|
33
|
+
* await client.close()
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* RPC Error class for rejected calls
|
|
38
|
+
*/
|
|
39
|
+
class RPCCallError extends Error {
|
|
40
|
+
code;
|
|
41
|
+
data;
|
|
42
|
+
constructor(error) {
|
|
43
|
+
super(error.message);
|
|
44
|
+
this.name = 'RPCCallError';
|
|
45
|
+
this.code = error.code;
|
|
46
|
+
this.data = error.data;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* RPC Client for Digital Objects
|
|
51
|
+
*
|
|
52
|
+
* Connects to a Digital Object and provides type-safe method calling.
|
|
53
|
+
* Supports both WebSocket (preferred) and HTTP transports.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const client = new DOClient('wss://example.com/rpc', {
|
|
58
|
+
* auth: 'Bearer token',
|
|
59
|
+
* autoReconnect: true,
|
|
60
|
+
* onConnectionChange: (state) => console.log('Connection:', state),
|
|
61
|
+
* })
|
|
62
|
+
*
|
|
63
|
+
* await client.connect()
|
|
64
|
+
* const result = await client.call('do.things.list')
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export class DOClient {
|
|
68
|
+
url;
|
|
69
|
+
options;
|
|
70
|
+
state = 'disconnected';
|
|
71
|
+
transport = 'websocket';
|
|
72
|
+
ws = null;
|
|
73
|
+
pendingRequests = new Map();
|
|
74
|
+
subscriptions = new Map();
|
|
75
|
+
stateChangeCallbacks = [];
|
|
76
|
+
eventListeners = new Map();
|
|
77
|
+
requestIdCounter = 0;
|
|
78
|
+
reconnectAttempts = 0;
|
|
79
|
+
reconnectTimer = null;
|
|
80
|
+
intentionalClose = false;
|
|
81
|
+
messageQueue = [];
|
|
82
|
+
/**
|
|
83
|
+
* Create a new RPC client
|
|
84
|
+
*
|
|
85
|
+
* Does not connect automatically - call connect() to establish connection.
|
|
86
|
+
*
|
|
87
|
+
* @param url - WebSocket URL (wss://) or HTTP URL (https://)
|
|
88
|
+
* @param options - Client configuration
|
|
89
|
+
*/
|
|
90
|
+
constructor(url, options) {
|
|
91
|
+
this.url = url;
|
|
92
|
+
this.options = options || {};
|
|
93
|
+
// Set default transport based on options
|
|
94
|
+
if (this.options.transport === 'http') {
|
|
95
|
+
this.transport = 'http';
|
|
96
|
+
}
|
|
97
|
+
else if (this.options.transport === 'websocket') {
|
|
98
|
+
this.transport = 'websocket';
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// auto or undefined - default to websocket
|
|
102
|
+
this.transport = 'websocket';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ===========================================================================
|
|
106
|
+
// Connection Management
|
|
107
|
+
// ===========================================================================
|
|
108
|
+
/**
|
|
109
|
+
* Connect to the Digital Object
|
|
110
|
+
*
|
|
111
|
+
* Establishes WebSocket connection or validates HTTP endpoint.
|
|
112
|
+
*
|
|
113
|
+
* @returns Promise that resolves when connected
|
|
114
|
+
* @throws Error if connection fails
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* const client = new DOClient('wss://example.com/rpc')
|
|
119
|
+
* await client.connect()
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
async connect() {
|
|
123
|
+
if (this.state === 'connected') {
|
|
124
|
+
throw new Error('Already connected');
|
|
125
|
+
}
|
|
126
|
+
if (this.transport === 'http') {
|
|
127
|
+
this.setState('connected');
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// WebSocket connection
|
|
131
|
+
this.setState('connecting');
|
|
132
|
+
this.intentionalClose = false;
|
|
133
|
+
const wsUrl = this.buildWebSocketUrl();
|
|
134
|
+
const connectionTimeout = this.options.connectionTimeout || 30000;
|
|
135
|
+
let timeoutId;
|
|
136
|
+
let ws;
|
|
137
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
138
|
+
timeoutId = setTimeout(() => {
|
|
139
|
+
if (ws) {
|
|
140
|
+
ws.close();
|
|
141
|
+
}
|
|
142
|
+
reject(new Error('Connection timeout'));
|
|
143
|
+
}, connectionTimeout);
|
|
144
|
+
});
|
|
145
|
+
const connectionPromise = new Promise((resolve, reject) => {
|
|
146
|
+
ws = new WebSocket(wsUrl);
|
|
147
|
+
this.ws = ws;
|
|
148
|
+
ws.addEventListener('error', (event) => {
|
|
149
|
+
if (this.state === 'connecting' && this.options.fallbackToHttp) {
|
|
150
|
+
// Fallback to HTTP
|
|
151
|
+
this.transport = 'http';
|
|
152
|
+
this.ws = null;
|
|
153
|
+
this.setState('connected');
|
|
154
|
+
resolve();
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const err = new Error('Connection refused');
|
|
158
|
+
reject(err);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
ws.addEventListener('open', () => {
|
|
162
|
+
this.reconnectAttempts = 0;
|
|
163
|
+
this.setState('connected');
|
|
164
|
+
this.flushMessageQueue();
|
|
165
|
+
resolve();
|
|
166
|
+
});
|
|
167
|
+
ws.addEventListener('close', (event) => {
|
|
168
|
+
if (this.state === 'connecting' && !this.intentionalClose) {
|
|
169
|
+
reject(new Error('Connection closed'));
|
|
170
|
+
}
|
|
171
|
+
this.handleClose(event);
|
|
172
|
+
});
|
|
173
|
+
ws.addEventListener('message', (event) => {
|
|
174
|
+
this.handleMessage(event.data);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
try {
|
|
178
|
+
await Promise.race([connectionPromise, timeoutPromise]);
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
if (timeoutId) {
|
|
182
|
+
clearTimeout(timeoutId);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Close the connection
|
|
188
|
+
*
|
|
189
|
+
* Cleans up resources and cancels pending requests.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```typescript
|
|
193
|
+
* await client.close()
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
async close() {
|
|
197
|
+
this.intentionalClose = true;
|
|
198
|
+
if (this.reconnectTimer) {
|
|
199
|
+
clearTimeout(this.reconnectTimer);
|
|
200
|
+
this.reconnectTimer = null;
|
|
201
|
+
}
|
|
202
|
+
// Reject all pending requests
|
|
203
|
+
for (const [, pending] of this.pendingRequests) {
|
|
204
|
+
clearTimeout(pending.timeout);
|
|
205
|
+
pending.reject(new Error('Connection closed'));
|
|
206
|
+
}
|
|
207
|
+
this.pendingRequests.clear();
|
|
208
|
+
if (this.ws) {
|
|
209
|
+
this.ws.close();
|
|
210
|
+
this.ws = null;
|
|
211
|
+
}
|
|
212
|
+
this.setState('disconnected');
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get current connection state
|
|
216
|
+
*
|
|
217
|
+
* @returns Current connection state
|
|
218
|
+
*/
|
|
219
|
+
getState() {
|
|
220
|
+
return this.state;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get current connection state (alias for getState)
|
|
224
|
+
*
|
|
225
|
+
* @returns Current connection state
|
|
226
|
+
*/
|
|
227
|
+
getConnectionState() {
|
|
228
|
+
return this.state;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get the current transport type
|
|
232
|
+
*
|
|
233
|
+
* @returns Current transport ('websocket' or 'http')
|
|
234
|
+
*/
|
|
235
|
+
getTransport() {
|
|
236
|
+
return this.transport;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Check if client is connected
|
|
240
|
+
*
|
|
241
|
+
* @returns Whether the client is connected
|
|
242
|
+
*/
|
|
243
|
+
isConnected() {
|
|
244
|
+
return this.state === 'connected';
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Register a callback for connection state changes
|
|
248
|
+
*
|
|
249
|
+
* @param callback - Callback function
|
|
250
|
+
*/
|
|
251
|
+
onStateChange(callback) {
|
|
252
|
+
this.stateChangeCallbacks.push(callback);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Register an event listener
|
|
256
|
+
*
|
|
257
|
+
* @param event - Event name
|
|
258
|
+
* @param callback - Callback function
|
|
259
|
+
*/
|
|
260
|
+
on(event, callback) {
|
|
261
|
+
if (!this.eventListeners.has(event)) {
|
|
262
|
+
this.eventListeners.set(event, new Set());
|
|
263
|
+
}
|
|
264
|
+
this.eventListeners.get(event).add(callback);
|
|
265
|
+
}
|
|
266
|
+
// ===========================================================================
|
|
267
|
+
// RPC Methods
|
|
268
|
+
// ===========================================================================
|
|
269
|
+
/**
|
|
270
|
+
* Call an RPC method
|
|
271
|
+
*
|
|
272
|
+
* Sends a request and waits for the response.
|
|
273
|
+
* Type inference provides autocomplete and type checking.
|
|
274
|
+
*
|
|
275
|
+
* @typeParam M - Method name from DORPCMethods
|
|
276
|
+
* @param method - Method name (e.g., 'do.things.list')
|
|
277
|
+
* @param params - Method parameters
|
|
278
|
+
* @returns Method result
|
|
279
|
+
* @throws RPCError if the method returns an error
|
|
280
|
+
*
|
|
281
|
+
* @example
|
|
282
|
+
* ```typescript
|
|
283
|
+
* // Params and return types are inferred
|
|
284
|
+
* const things = await client.call('do.things.list', { limit: 10 })
|
|
285
|
+
* // ^? Thing[]
|
|
286
|
+
*
|
|
287
|
+
* const identity = await client.call('do.identity.get')
|
|
288
|
+
* // ^? DigitalObjectIdentity
|
|
289
|
+
* ```
|
|
290
|
+
*/
|
|
291
|
+
call(method, ...params) {
|
|
292
|
+
const request = {
|
|
293
|
+
id: this.generateId(),
|
|
294
|
+
method: method,
|
|
295
|
+
params: params[0],
|
|
296
|
+
meta: {
|
|
297
|
+
timestamp: Date.now(),
|
|
298
|
+
auth: this.options.auth,
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
if (this.transport === 'http') {
|
|
302
|
+
return this.sendHttp(request);
|
|
303
|
+
}
|
|
304
|
+
return this.sendWebSocket(request);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Call multiple methods in a batch
|
|
308
|
+
*
|
|
309
|
+
* Reduces round-trips by sending multiple requests in one message.
|
|
310
|
+
* Responses are returned in the same order as requests.
|
|
311
|
+
*
|
|
312
|
+
* @param requests - Array of RPC requests
|
|
313
|
+
* @param options - Batch options
|
|
314
|
+
* @returns Batch response with all results
|
|
315
|
+
*
|
|
316
|
+
* @example
|
|
317
|
+
* ```typescript
|
|
318
|
+
* const batch = await client.batch([
|
|
319
|
+
* { id: '1', method: 'do.nouns.list' },
|
|
320
|
+
* { id: '2', method: 'do.verbs.list' },
|
|
321
|
+
* { id: '3', method: 'do.things.create', params: { name: 'Widget' } },
|
|
322
|
+
* ])
|
|
323
|
+
*
|
|
324
|
+
* console.log(batch.responses[0].result) // nouns
|
|
325
|
+
* console.log(batch.responses[1].result) // verbs
|
|
326
|
+
* console.log(batch.responses[2].result) // created thing
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
async batch(requests, options) {
|
|
330
|
+
const batchId = this.generateId();
|
|
331
|
+
const batchRequests = requests.map((req) => ({
|
|
332
|
+
id: this.generateId(),
|
|
333
|
+
method: req.method,
|
|
334
|
+
params: req.params,
|
|
335
|
+
}));
|
|
336
|
+
const batchRequest = {
|
|
337
|
+
id: batchId,
|
|
338
|
+
requests: batchRequests,
|
|
339
|
+
abortOnError: options?.abortOnError,
|
|
340
|
+
};
|
|
341
|
+
if (this.transport === 'http') {
|
|
342
|
+
return this.sendHttpBatch(batchRequest);
|
|
343
|
+
}
|
|
344
|
+
return this.sendWebSocketBatch(batchRequest);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Create a pipeline for chaining calls
|
|
348
|
+
*
|
|
349
|
+
* @returns Pipeline builder
|
|
350
|
+
*
|
|
351
|
+
* @example
|
|
352
|
+
* ```typescript
|
|
353
|
+
* const results = await client
|
|
354
|
+
* .pipeline()
|
|
355
|
+
* .call('do.nouns.create', { name: 'User' })
|
|
356
|
+
* .call('do.things.create', { $type: 'User' })
|
|
357
|
+
* .execute()
|
|
358
|
+
* ```
|
|
359
|
+
*/
|
|
360
|
+
pipeline() {
|
|
361
|
+
const calls = [];
|
|
362
|
+
const builder = {
|
|
363
|
+
call: (method, ...params) => {
|
|
364
|
+
const param = params[0];
|
|
365
|
+
calls.push({ method, params: param });
|
|
366
|
+
return builder;
|
|
367
|
+
},
|
|
368
|
+
execute: async () => {
|
|
369
|
+
const batchId = this.generateId();
|
|
370
|
+
const batchRequests = calls.map((call, index) => {
|
|
371
|
+
const id = this.generateId();
|
|
372
|
+
// Check if params is a function (reference to previous result)
|
|
373
|
+
if (typeof call.params === 'function') {
|
|
374
|
+
return {
|
|
375
|
+
id,
|
|
376
|
+
method: call.method,
|
|
377
|
+
params: { $ref: index },
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
id,
|
|
382
|
+
method: call.method,
|
|
383
|
+
params: call.params,
|
|
384
|
+
};
|
|
385
|
+
});
|
|
386
|
+
const batchRequest = {
|
|
387
|
+
id: batchId,
|
|
388
|
+
requests: batchRequests,
|
|
389
|
+
};
|
|
390
|
+
if (this.transport === 'http') {
|
|
391
|
+
const response = await this.sendHttpBatch(batchRequest);
|
|
392
|
+
return response.responses.map((r) => r.result);
|
|
393
|
+
}
|
|
394
|
+
const response = await this.sendWebSocketBatch(batchRequest);
|
|
395
|
+
return response.responses.map((r) => r.result);
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
return builder;
|
|
399
|
+
}
|
|
400
|
+
// ===========================================================================
|
|
401
|
+
// Subscriptions
|
|
402
|
+
// ===========================================================================
|
|
403
|
+
/**
|
|
404
|
+
* Subscribe to events on a channel
|
|
405
|
+
*
|
|
406
|
+
* Returns an unsubscribe function.
|
|
407
|
+
*
|
|
408
|
+
* @param channel - Channel name (e.g., 'cdc', 'events')
|
|
409
|
+
* @param handler - Handler function called for each event
|
|
410
|
+
* @returns Unsubscribe function
|
|
411
|
+
*
|
|
412
|
+
* @example
|
|
413
|
+
* ```typescript
|
|
414
|
+
* const unsubscribe = client.subscribe('cdc', (event) => {
|
|
415
|
+
* console.log('Change:', event)
|
|
416
|
+
* })
|
|
417
|
+
*
|
|
418
|
+
* // Later...
|
|
419
|
+
* unsubscribe()
|
|
420
|
+
* ```
|
|
421
|
+
*/
|
|
422
|
+
subscribe(channel, handler) {
|
|
423
|
+
if (!this.subscriptions.has(channel)) {
|
|
424
|
+
this.subscriptions.set(channel, new Set());
|
|
425
|
+
}
|
|
426
|
+
this.subscriptions.get(channel).add(handler);
|
|
427
|
+
return () => {
|
|
428
|
+
const handlers = this.subscriptions.get(channel);
|
|
429
|
+
if (handlers) {
|
|
430
|
+
handlers.delete(handler);
|
|
431
|
+
if (handlers.size === 0) {
|
|
432
|
+
this.subscriptions.delete(channel);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Unsubscribe from a channel
|
|
439
|
+
*
|
|
440
|
+
* @param channel - Channel to unsubscribe from
|
|
441
|
+
*/
|
|
442
|
+
unsubscribe(channel) {
|
|
443
|
+
this.subscriptions.delete(channel);
|
|
444
|
+
}
|
|
445
|
+
// ===========================================================================
|
|
446
|
+
// Internal Methods
|
|
447
|
+
// ===========================================================================
|
|
448
|
+
/**
|
|
449
|
+
* Send a request via WebSocket
|
|
450
|
+
*
|
|
451
|
+
* @param request - Request to send
|
|
452
|
+
* @returns Promise resolving to response
|
|
453
|
+
*/
|
|
454
|
+
sendWebSocket(request) {
|
|
455
|
+
return new Promise((resolve, reject) => {
|
|
456
|
+
const timeout = this.options.timeout || 30000;
|
|
457
|
+
const timeoutId = setTimeout(() => {
|
|
458
|
+
this.pendingRequests.delete(request.id);
|
|
459
|
+
reject(new Error('Request timeout'));
|
|
460
|
+
}, timeout);
|
|
461
|
+
this.pendingRequests.set(request.id, {
|
|
462
|
+
resolve,
|
|
463
|
+
reject,
|
|
464
|
+
timeout: timeoutId,
|
|
465
|
+
});
|
|
466
|
+
if (this.state === 'reconnecting') {
|
|
467
|
+
// Queue the request
|
|
468
|
+
this.messageQueue.push(request);
|
|
469
|
+
}
|
|
470
|
+
else if (this.ws && this.ws.readyState === 1) {
|
|
471
|
+
this.ws.send(JSON.stringify(request));
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
this.messageQueue.push(request);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Send a batch request via WebSocket
|
|
480
|
+
*
|
|
481
|
+
* @param batchRequest - Batch request to send
|
|
482
|
+
* @returns Promise resolving to batch response
|
|
483
|
+
*/
|
|
484
|
+
sendWebSocketBatch(batchRequest) {
|
|
485
|
+
return new Promise((resolve, reject) => {
|
|
486
|
+
const timeout = this.options.timeout || 30000;
|
|
487
|
+
const timeoutId = setTimeout(() => {
|
|
488
|
+
this.pendingRequests.delete(batchRequest.id);
|
|
489
|
+
reject(new Error('Request timeout'));
|
|
490
|
+
}, timeout);
|
|
491
|
+
this.pendingRequests.set(batchRequest.id, {
|
|
492
|
+
resolve: resolve,
|
|
493
|
+
reject,
|
|
494
|
+
timeout: timeoutId,
|
|
495
|
+
});
|
|
496
|
+
if (this.ws && this.ws.readyState === 1) {
|
|
497
|
+
this.ws.send(JSON.stringify(batchRequest));
|
|
498
|
+
}
|
|
499
|
+
else {
|
|
500
|
+
this.messageQueue.push(batchRequest);
|
|
501
|
+
}
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Send a request via HTTP
|
|
506
|
+
*
|
|
507
|
+
* @param request - Request to send
|
|
508
|
+
* @returns Promise resolving to response
|
|
509
|
+
*/
|
|
510
|
+
async sendHttp(request) {
|
|
511
|
+
const httpUrl = this.buildHttpUrl();
|
|
512
|
+
const retries = this.options.retries || 0;
|
|
513
|
+
const timeout = this.options.timeout || 30000;
|
|
514
|
+
let lastError = null;
|
|
515
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
516
|
+
try {
|
|
517
|
+
const controller = new AbortController();
|
|
518
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
519
|
+
const response = await fetch(httpUrl, {
|
|
520
|
+
method: 'POST',
|
|
521
|
+
headers: {
|
|
522
|
+
'Content-Type': 'application/json',
|
|
523
|
+
...(this.options.auth ? { Authorization: this.options.auth } : {}),
|
|
524
|
+
...(this.options.headers || {}),
|
|
525
|
+
},
|
|
526
|
+
body: JSON.stringify(request),
|
|
527
|
+
signal: controller.signal,
|
|
528
|
+
});
|
|
529
|
+
clearTimeout(timeoutId);
|
|
530
|
+
const data = (await response.json());
|
|
531
|
+
if (data.error) {
|
|
532
|
+
throw new RPCCallError(data.error);
|
|
533
|
+
}
|
|
534
|
+
return data.result;
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
538
|
+
throw new Error('Request timeout');
|
|
539
|
+
}
|
|
540
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
541
|
+
if (attempt === retries) {
|
|
542
|
+
throw lastError;
|
|
543
|
+
}
|
|
544
|
+
// Continue to next retry
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
throw lastError || new Error('Request failed');
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Send a batch request via HTTP
|
|
551
|
+
*
|
|
552
|
+
* @param batchRequest - Batch request to send
|
|
553
|
+
* @returns Promise resolving to batch response
|
|
554
|
+
*/
|
|
555
|
+
async sendHttpBatch(batchRequest) {
|
|
556
|
+
const httpUrl = this.buildHttpUrl();
|
|
557
|
+
const response = await fetch(httpUrl, {
|
|
558
|
+
method: 'POST',
|
|
559
|
+
headers: {
|
|
560
|
+
'Content-Type': 'application/json',
|
|
561
|
+
...(this.options.auth ? { Authorization: this.options.auth } : {}),
|
|
562
|
+
...(this.options.headers || {}),
|
|
563
|
+
},
|
|
564
|
+
body: JSON.stringify(batchRequest),
|
|
565
|
+
});
|
|
566
|
+
return (await response.json());
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Handle incoming WebSocket message
|
|
570
|
+
*
|
|
571
|
+
* @param message - Raw message data
|
|
572
|
+
*/
|
|
573
|
+
handleMessage(message) {
|
|
574
|
+
// Ignore binary messages
|
|
575
|
+
if (typeof message !== 'string') {
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
let data;
|
|
579
|
+
try {
|
|
580
|
+
data = JSON.parse(message);
|
|
581
|
+
}
|
|
582
|
+
catch {
|
|
583
|
+
// Ignore malformed messages
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
const pending = this.pendingRequests.get(data.id);
|
|
587
|
+
if (pending) {
|
|
588
|
+
clearTimeout(pending.timeout);
|
|
589
|
+
this.pendingRequests.delete(data.id);
|
|
590
|
+
// Check if this is a batch response
|
|
591
|
+
if ('responses' in data) {
|
|
592
|
+
pending.resolve(data);
|
|
593
|
+
}
|
|
594
|
+
else if (data.error) {
|
|
595
|
+
pending.reject(new RPCCallError(data.error));
|
|
596
|
+
}
|
|
597
|
+
else {
|
|
598
|
+
pending.resolve(data.result);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Handle WebSocket close event
|
|
604
|
+
*
|
|
605
|
+
* @param event - Close event
|
|
606
|
+
*/
|
|
607
|
+
handleClose(event) {
|
|
608
|
+
// Reject all pending requests when connection closes unexpectedly
|
|
609
|
+
if (!this.intentionalClose && this.options.autoReconnect !== false) {
|
|
610
|
+
for (const [, pending] of this.pendingRequests) {
|
|
611
|
+
// Don't reject during reconnection - queue will be flushed
|
|
612
|
+
if (this.state === 'reconnecting') {
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
// Connection closed intentionally or without auto-reconnect
|
|
619
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
620
|
+
clearTimeout(pending.timeout);
|
|
621
|
+
pending.reject(new Error('Connection closed'));
|
|
622
|
+
this.pendingRequests.delete(id);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
if (this.intentionalClose) {
|
|
626
|
+
this.setState('disconnected');
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
// Auto-reconnect on unexpected close
|
|
630
|
+
if (this.options.autoReconnect !== false) {
|
|
631
|
+
this.reconnect();
|
|
632
|
+
}
|
|
633
|
+
else {
|
|
634
|
+
// Reject pending requests when not auto-reconnecting
|
|
635
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
636
|
+
clearTimeout(pending.timeout);
|
|
637
|
+
pending.reject(new Error('Connection closed'));
|
|
638
|
+
this.pendingRequests.delete(id);
|
|
639
|
+
}
|
|
640
|
+
this.setState('disconnected');
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* Attempt to reconnect
|
|
645
|
+
*/
|
|
646
|
+
async reconnect() {
|
|
647
|
+
const maxAttempts = this.options.maxReconnectAttempts || 5;
|
|
648
|
+
if (this.reconnectAttempts >= maxAttempts) {
|
|
649
|
+
// Max attempts reached - reject pending and give up
|
|
650
|
+
for (const [id, pending] of this.pendingRequests) {
|
|
651
|
+
clearTimeout(pending.timeout);
|
|
652
|
+
pending.reject(new Error('Connection closed'));
|
|
653
|
+
this.pendingRequests.delete(id);
|
|
654
|
+
}
|
|
655
|
+
this.setState('disconnected');
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
this.setState('reconnecting');
|
|
659
|
+
this.emitEvent('reconnecting');
|
|
660
|
+
this.reconnectAttempts++;
|
|
661
|
+
const baseDelay = this.options.reconnectDelay || 1000;
|
|
662
|
+
const backoff = this.options.reconnectBackoff || 2;
|
|
663
|
+
const maxDelay = this.options.maxReconnectDelay || 30000;
|
|
664
|
+
const delay = Math.min(baseDelay * Math.pow(backoff, this.reconnectAttempts - 1), maxDelay);
|
|
665
|
+
this.reconnectTimer = setTimeout(async () => {
|
|
666
|
+
this.intentionalClose = false;
|
|
667
|
+
const wsUrl = this.buildWebSocketUrl();
|
|
668
|
+
const ws = new WebSocket(wsUrl);
|
|
669
|
+
this.ws = ws;
|
|
670
|
+
ws.addEventListener('open', () => {
|
|
671
|
+
this.reconnectAttempts = 0;
|
|
672
|
+
this.setState('connected');
|
|
673
|
+
this.emitEvent('reconnected');
|
|
674
|
+
this.flushMessageQueue();
|
|
675
|
+
});
|
|
676
|
+
ws.addEventListener('error', () => {
|
|
677
|
+
// Retry
|
|
678
|
+
this.reconnect();
|
|
679
|
+
});
|
|
680
|
+
ws.addEventListener('close', (event) => {
|
|
681
|
+
this.handleClose(event);
|
|
682
|
+
});
|
|
683
|
+
ws.addEventListener('message', (event) => {
|
|
684
|
+
this.handleMessage(event.data);
|
|
685
|
+
});
|
|
686
|
+
}, delay);
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Set connection state and notify listeners
|
|
690
|
+
*
|
|
691
|
+
* @param state - New state
|
|
692
|
+
*/
|
|
693
|
+
setState(state) {
|
|
694
|
+
this.state = state;
|
|
695
|
+
for (const callback of this.stateChangeCallbacks) {
|
|
696
|
+
callback(state);
|
|
697
|
+
}
|
|
698
|
+
this.options.onConnectionChange?.(state);
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Emit an event to listeners
|
|
702
|
+
*
|
|
703
|
+
* @param event - Event name
|
|
704
|
+
*/
|
|
705
|
+
emitEvent(event) {
|
|
706
|
+
const listeners = this.eventListeners.get(event);
|
|
707
|
+
if (listeners) {
|
|
708
|
+
for (const listener of listeners) {
|
|
709
|
+
listener();
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Flush queued messages after reconnection
|
|
715
|
+
*/
|
|
716
|
+
flushMessageQueue() {
|
|
717
|
+
if (!this.ws || this.ws.readyState !== 1)
|
|
718
|
+
return;
|
|
719
|
+
for (const message of this.messageQueue) {
|
|
720
|
+
this.ws.send(JSON.stringify(message));
|
|
721
|
+
}
|
|
722
|
+
this.messageQueue = [];
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Build WebSocket URL from base URL
|
|
726
|
+
*
|
|
727
|
+
* @returns WebSocket URL
|
|
728
|
+
*/
|
|
729
|
+
buildWebSocketUrl() {
|
|
730
|
+
let url = this.url;
|
|
731
|
+
// Convert http(s) to ws(s)
|
|
732
|
+
if (url.startsWith('https://')) {
|
|
733
|
+
url = 'wss://' + url.slice(8);
|
|
734
|
+
}
|
|
735
|
+
else if (url.startsWith('http://')) {
|
|
736
|
+
url = 'ws://' + url.slice(7);
|
|
737
|
+
}
|
|
738
|
+
// Append /rpc if not present
|
|
739
|
+
if (!url.endsWith('/rpc')) {
|
|
740
|
+
url += '/rpc';
|
|
741
|
+
}
|
|
742
|
+
return url;
|
|
743
|
+
}
|
|
744
|
+
/**
|
|
745
|
+
* Build HTTP URL from base URL
|
|
746
|
+
*
|
|
747
|
+
* @returns HTTP URL
|
|
748
|
+
*/
|
|
749
|
+
buildHttpUrl() {
|
|
750
|
+
let url = this.url;
|
|
751
|
+
// Append /rpc if not present
|
|
752
|
+
if (!url.endsWith('/rpc')) {
|
|
753
|
+
url += '/rpc';
|
|
754
|
+
}
|
|
755
|
+
return url;
|
|
756
|
+
}
|
|
757
|
+
/**
|
|
758
|
+
* Generate a unique request ID
|
|
759
|
+
*
|
|
760
|
+
* @returns Unique ID string
|
|
761
|
+
*/
|
|
762
|
+
generateId() {
|
|
763
|
+
return `${Date.now()}-${++this.requestIdCounter}`;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
// =============================================================================
|
|
767
|
+
// Factory Functions
|
|
768
|
+
// =============================================================================
|
|
769
|
+
/**
|
|
770
|
+
* Create an RPC client (synchronous)
|
|
771
|
+
*
|
|
772
|
+
* Creates a client without connecting. Call connect() to establish connection.
|
|
773
|
+
*
|
|
774
|
+
* @param options - Client options including URL
|
|
775
|
+
* @returns Client instance
|
|
776
|
+
*
|
|
777
|
+
* @example
|
|
778
|
+
* ```typescript
|
|
779
|
+
* const client = createRPCClient({ url: 'https://my-do.example.com', transport: 'websocket' })
|
|
780
|
+
* await client.connect()
|
|
781
|
+
* const things = await client.call('do.things.list')
|
|
782
|
+
* ```
|
|
783
|
+
*/
|
|
784
|
+
export function createRPCClient(options) {
|
|
785
|
+
return new DOClient(options.url, options);
|
|
786
|
+
}
|
|
787
|
+
/**
|
|
788
|
+
* Create an HTTP-only RPC client
|
|
789
|
+
*
|
|
790
|
+
* For environments where WebSocket is not available.
|
|
791
|
+
*
|
|
792
|
+
* @param url - HTTP URL
|
|
793
|
+
* @param options - Client options
|
|
794
|
+
* @returns Connected client (HTTP transport)
|
|
795
|
+
*/
|
|
796
|
+
export async function createHttpClient(url, options) {
|
|
797
|
+
const client = new DOClient(url, { ...options, transport: 'http' });
|
|
798
|
+
await client.connect();
|
|
799
|
+
return client;
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
802
|
+
* Type-safe request builder
|
|
803
|
+
*
|
|
804
|
+
* @example
|
|
805
|
+
* ```typescript
|
|
806
|
+
* const request = buildRequest('do.things.list', { limit: 10 })
|
|
807
|
+
* // ^? RPCRequest<{ limit: number }>
|
|
808
|
+
* ```
|
|
809
|
+
*/
|
|
810
|
+
export function buildRequest(method, ...params) {
|
|
811
|
+
return {
|
|
812
|
+
id: `${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
813
|
+
method: method,
|
|
814
|
+
params: params[0],
|
|
815
|
+
meta: {
|
|
816
|
+
timestamp: Date.now(),
|
|
817
|
+
},
|
|
818
|
+
};
|
|
819
|
+
}
|
|
820
|
+
/**
|
|
821
|
+
* RPCClientImpl class (alias for DOClient)
|
|
822
|
+
*
|
|
823
|
+
* Exported for compatibility with tests
|
|
824
|
+
*/
|
|
825
|
+
export const RPCClientImpl = DOClient;
|
|
826
|
+
//# sourceMappingURL=client.js.map
|