workerstack 0.1.0-beta.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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/dist/access.d.ts +131 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +333 -0
- package/dist/access.js.map +1 -0
- package/dist/api/builder.d.ts +457 -0
- package/dist/api/builder.d.ts.map +1 -0
- package/dist/api/builder.js +45 -0
- package/dist/api/builder.js.map +1 -0
- package/dist/api/catalog.d.ts +8 -0
- package/dist/api/catalog.d.ts.map +1 -0
- package/dist/api/catalog.js +56 -0
- package/dist/api/catalog.js.map +1 -0
- package/dist/api/context.d.ts +47 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +40 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/crud-router.d.ts +476 -0
- package/dist/api/crud-router.d.ts.map +1 -0
- package/dist/api/crud-router.js +354 -0
- package/dist/api/crud-router.js.map +1 -0
- package/dist/api/list-input-schema.d.ts +37 -0
- package/dist/api/list-input-schema.d.ts.map +1 -0
- package/dist/api/list-input-schema.js +63 -0
- package/dist/api/list-input-schema.js.map +1 -0
- package/dist/api/list-spec.d.ts +44 -0
- package/dist/api/list-spec.d.ts.map +1 -0
- package/dist/api/list-spec.js +49 -0
- package/dist/api/list-spec.js.map +1 -0
- package/dist/api/live-view.d.ts +14 -0
- package/dist/api/live-view.d.ts.map +1 -0
- package/dist/api/live-view.js +42 -0
- package/dist/api/live-view.js.map +1 -0
- package/dist/api/live-window.d.ts +40 -0
- package/dist/api/live-window.d.ts.map +1 -0
- package/dist/api/live-window.js +93 -0
- package/dist/api/live-window.js.map +1 -0
- package/dist/api/openapi.d.ts +6 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +146 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/realtime-router.d.ts +94 -0
- package/dist/api/realtime-router.d.ts.map +1 -0
- package/dist/api/realtime-router.js +45 -0
- package/dist/api/realtime-router.js.map +1 -0
- package/dist/api/registry.d.ts +30 -0
- package/dist/api/registry.d.ts.map +1 -0
- package/dist/api/registry.js +236 -0
- package/dist/api/registry.js.map +1 -0
- package/dist/api/router.d.ts +15 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +32 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/storage-router.d.ts +349 -0
- package/dist/api/storage-router.d.ts.map +1 -0
- package/dist/api/storage-router.js +155 -0
- package/dist/api/storage-router.js.map +1 -0
- package/dist/api/types.d.ts +55 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth-password.d.ts +27 -0
- package/dist/auth-password.d.ts.map +1 -0
- package/dist/auth-password.js +60 -0
- package/dist/auth-password.js.map +1 -0
- package/dist/auth.d.ts +59 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +146 -0
- package/dist/auth.js.map +1 -0
- package/dist/backend-internals.d.ts +35 -0
- package/dist/backend-internals.d.ts.map +1 -0
- package/dist/backend-internals.js +2 -0
- package/dist/backend-internals.js.map +1 -0
- package/dist/backend.d.ts +63 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +59 -0
- package/dist/backend.js.map +1 -0
- package/dist/blueprint-generator.d.ts +21 -0
- package/dist/blueprint-generator.d.ts.map +1 -0
- package/dist/blueprint-generator.js +199 -0
- package/dist/blueprint-generator.js.map +1 -0
- package/dist/blueprint.d.ts +99 -0
- package/dist/blueprint.d.ts.map +1 -0
- package/dist/blueprint.js +257 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/cli-skills.d.ts +16 -0
- package/dist/cli-skills.d.ts.map +1 -0
- package/dist/cli-skills.js +108 -0
- package/dist/cli-skills.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +205 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/client.d.ts +53 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +111 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/live-view.d.ts +49 -0
- package/dist/client/live-view.d.ts.map +1 -0
- package/dist/client/live-view.js +184 -0
- package/dist/client/live-view.js.map +1 -0
- package/dist/client/react.d.ts +4 -0
- package/dist/client/react.d.ts.map +1 -0
- package/dist/client/react.js +6 -0
- package/dist/client/react.js.map +1 -0
- package/dist/client/realtime.d.ts +54 -0
- package/dist/client/realtime.d.ts.map +1 -0
- package/dist/client/realtime.js +105 -0
- package/dist/client/realtime.js.map +1 -0
- package/dist/client/rest.d.ts +2 -0
- package/dist/client/rest.d.ts.map +1 -0
- package/dist/client/rest.js +2 -0
- package/dist/client/rest.js.map +1 -0
- package/dist/client/rpc-client.d.ts +38 -0
- package/dist/client/rpc-client.d.ts.map +1 -0
- package/dist/client/rpc-client.js +59 -0
- package/dist/client/rpc-client.js.map +1 -0
- package/dist/client/solid.d.ts +7 -0
- package/dist/client/solid.d.ts.map +1 -0
- package/dist/client/solid.js +21 -0
- package/dist/client/solid.js.map +1 -0
- package/dist/client/svelte.d.ts +6 -0
- package/dist/client/svelte.d.ts.map +1 -0
- package/dist/client/svelte.js +9 -0
- package/dist/client/svelte.js.map +1 -0
- package/dist/client/vue.d.ts +5 -0
- package/dist/client/vue.d.ts.map +1 -0
- package/dist/client/vue.js +11 -0
- package/dist/client/vue.js.map +1 -0
- package/dist/codegen.d.ts +36 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/codegen.js +235 -0
- package/dist/codegen.js.map +1 -0
- package/dist/config.d.ts +129 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +4 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +3 -0
- package/dist/cron.js.map +1 -0
- package/dist/crud-operations.d.ts +43 -0
- package/dist/crud-operations.d.ts.map +1 -0
- package/dist/crud-operations.js +249 -0
- package/dist/crud-operations.js.map +1 -0
- package/dist/database/adapter.d.ts +26 -0
- package/dist/database/adapter.d.ts.map +1 -0
- package/dist/database/adapter.js +2 -0
- package/dist/database/adapter.js.map +1 -0
- package/dist/database/libsql.d.ts +3 -0
- package/dist/database/libsql.d.ts.map +1 -0
- package/dist/database/libsql.js +39 -0
- package/dist/database/libsql.js.map +1 -0
- package/dist/db.d.ts +15 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +8 -0
- package/dist/db.js.map +1 -0
- package/dist/dev/binaries.d.ts +22 -0
- package/dist/dev/binaries.d.ts.map +1 -0
- package/dist/dev/binaries.js +119 -0
- package/dist/dev/binaries.js.map +1 -0
- package/dist/dev/env.d.ts +11 -0
- package/dist/dev/env.d.ts.map +1 -0
- package/dist/dev/env.js +71 -0
- package/dist/dev/env.js.map +1 -0
- package/dist/dev/index.d.ts +39 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +273 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/processes.d.ts +37 -0
- package/dist/dev/processes.d.ts.map +1 -0
- package/dist/dev/processes.js +104 -0
- package/dist/dev/processes.js.map +1 -0
- package/dist/dev/push.d.ts +2 -0
- package/dist/dev/push.d.ts.map +1 -0
- package/dist/dev/push.js +30 -0
- package/dist/dev/push.js.map +1 -0
- package/dist/dialect.d.ts +17 -0
- package/dist/dialect.d.ts.map +1 -0
- package/dist/dialect.js +12 -0
- package/dist/dialect.js.map +1 -0
- package/dist/email/smtp.d.ts +20 -0
- package/dist/email/smtp.d.ts.map +1 -0
- package/dist/email/smtp.js +31 -0
- package/dist/email/smtp.js.map +1 -0
- package/dist/email.d.ts +26 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +2 -0
- package/dist/email.js.map +1 -0
- package/dist/env-probe.d.ts +9 -0
- package/dist/env-probe.d.ts.map +1 -0
- package/dist/env-probe.js +72 -0
- package/dist/env-probe.js.map +1 -0
- package/dist/env.d.ts +62 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +86 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +153 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +106 -0
- package/dist/errors.js.map +1 -0
- package/dist/handler.d.ts +11 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +21 -0
- package/dist/handler.js.map +1 -0
- package/dist/hosted-contract.d.ts +11 -0
- package/dist/hosted-contract.d.ts.map +1 -0
- package/dist/hosted-contract.js +50 -0
- package/dist/hosted-contract.js.map +1 -0
- package/dist/idempotency.d.ts +17 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +65 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +15 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +44 -0
- package/dist/inspect.js.map +1 -0
- package/dist/internal-tables.d.ts +1767 -0
- package/dist/internal-tables.d.ts.map +1 -0
- package/dist/internal-tables.js +114 -0
- package/dist/internal-tables.js.map +1 -0
- package/dist/jobs/cron.d.ts +15 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +74 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/define.d.ts +186 -0
- package/dist/jobs/define.d.ts.map +1 -0
- package/dist/jobs/define.js +99 -0
- package/dist/jobs/define.js.map +1 -0
- package/dist/jobs/index.d.ts +9 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +7 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/queue.d.ts +13 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +71 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/slots.d.ts +30 -0
- package/dist/jobs/slots.d.ts.map +1 -0
- package/dist/jobs/slots.js +53 -0
- package/dist/jobs/slots.js.map +1 -0
- package/dist/jobs/worker.d.ts +45 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +605 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/lifecycle.d.ts +10 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +37 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/list-query.d.ts +62 -0
- package/dist/list-query.d.ts.map +1 -0
- package/dist/list-query.js +190 -0
- package/dist/list-query.js.map +1 -0
- package/dist/live/apply.d.ts +13 -0
- package/dist/live/apply.d.ts.map +1 -0
- package/dist/live/apply.js +32 -0
- package/dist/live/apply.js.map +1 -0
- package/dist/live/index.d.ts +48 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +108 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/protocol.d.ts +47 -0
- package/dist/live/protocol.d.ts.map +1 -0
- package/dist/live/protocol.js +12 -0
- package/dist/live/protocol.js.map +1 -0
- package/dist/live/sse.d.ts +22 -0
- package/dist/live/sse.d.ts.map +1 -0
- package/dist/live/sse.js +41 -0
- package/dist/live/sse.js.map +1 -0
- package/dist/logging.d.ts +8 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +6 -0
- package/dist/logging.js.map +1 -0
- package/dist/manifest-diff.d.ts +6 -0
- package/dist/manifest-diff.d.ts.map +1 -0
- package/dist/manifest-diff.js +42 -0
- package/dist/manifest-diff.js.map +1 -0
- package/dist/manifest.d.ts +87 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +237 -0
- package/dist/manifest.js.map +1 -0
- package/dist/messaging/email.d.ts +16 -0
- package/dist/messaging/email.d.ts.map +1 -0
- package/dist/messaging/email.js +8 -0
- package/dist/messaging/email.js.map +1 -0
- package/dist/messaging/index.d.ts +8 -0
- package/dist/messaging/index.d.ts.map +1 -0
- package/dist/messaging/index.js +4 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/journal.d.ts +4 -0
- package/dist/messaging/journal.d.ts.map +1 -0
- package/dist/messaging/journal.js +19 -0
- package/dist/messaging/journal.js.map +1 -0
- package/dist/messaging/runtime.d.ts +16 -0
- package/dist/messaging/runtime.d.ts.map +1 -0
- package/dist/messaging/runtime.js +213 -0
- package/dist/messaging/runtime.js.map +1 -0
- package/dist/messaging/standalone.d.ts +27 -0
- package/dist/messaging/standalone.d.ts.map +1 -0
- package/dist/messaging/standalone.js +18 -0
- package/dist/messaging/standalone.js.map +1 -0
- package/dist/messaging/telegram.d.ts +16 -0
- package/dist/messaging/telegram.d.ts.map +1 -0
- package/dist/messaging/telegram.js +5 -0
- package/dist/messaging/telegram.js.map +1 -0
- package/dist/messaging/types.d.ts +22 -0
- package/dist/messaging/types.d.ts.map +1 -0
- package/dist/messaging/types.js +17 -0
- package/dist/messaging/types.js.map +1 -0
- package/dist/platform.d.ts +25 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +24 -0
- package/dist/platform.js.map +1 -0
- package/dist/provision-internals.d.ts +23 -0
- package/dist/provision-internals.d.ts.map +1 -0
- package/dist/provision-internals.js +7 -0
- package/dist/provision-internals.js.map +1 -0
- package/dist/provision-runtime.d.ts +6 -0
- package/dist/provision-runtime.d.ts.map +1 -0
- package/dist/provision-runtime.js +41 -0
- package/dist/provision-runtime.js.map +1 -0
- package/dist/provision-schema.d.ts +16 -0
- package/dist/provision-schema.d.ts.map +1 -0
- package/dist/provision-schema.js +59 -0
- package/dist/provision-schema.js.map +1 -0
- package/dist/provision.d.ts +8 -0
- package/dist/provision.d.ts.map +1 -0
- package/dist/provision.js +16 -0
- package/dist/provision.js.map +1 -0
- package/dist/query/api.d.ts +10 -0
- package/dist/query/api.d.ts.map +1 -0
- package/dist/query/api.js +7 -0
- package/dist/query/api.js.map +1 -0
- package/dist/query/client.d.ts +28 -0
- package/dist/query/client.d.ts.map +1 -0
- package/dist/query/client.js +87 -0
- package/dist/query/client.js.map +1 -0
- package/dist/query/fetch.d.ts +3 -0
- package/dist/query/fetch.d.ts.map +1 -0
- package/dist/query/fetch.js +4 -0
- package/dist/query/fetch.js.map +1 -0
- package/dist/query/index.d.ts +8 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +4 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/infer.d.ts +25 -0
- package/dist/query/infer.d.ts.map +1 -0
- package/dist/query/infer.js +2 -0
- package/dist/query/infer.js.map +1 -0
- package/dist/query/react.d.ts +3 -0
- package/dist/query/react.d.ts.map +1 -0
- package/dist/query/react.js +2 -0
- package/dist/query/react.js.map +1 -0
- package/dist/query/realtime-flush.d.ts +26 -0
- package/dist/query/realtime-flush.d.ts.map +1 -0
- package/dist/query/realtime-flush.js +45 -0
- package/dist/query/realtime-flush.js.map +1 -0
- package/dist/query/realtime-stream.d.ts +3 -0
- package/dist/query/realtime-stream.d.ts.map +1 -0
- package/dist/query/realtime-stream.js +3 -0
- package/dist/query/realtime-stream.js.map +1 -0
- package/dist/query/realtime.d.ts +88 -0
- package/dist/query/realtime.d.ts.map +1 -0
- package/dist/query/realtime.js +255 -0
- package/dist/query/realtime.js.map +1 -0
- package/dist/rate-limit.d.ts +8 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +46 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/readiness-probes.d.ts +4 -0
- package/dist/readiness-probes.d.ts.map +1 -0
- package/dist/readiness-probes.js +23 -0
- package/dist/readiness-probes.js.map +1 -0
- package/dist/readiness.d.ts +39 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +72 -0
- package/dist/readiness.js.map +1 -0
- package/dist/realtime/facade.d.ts +20 -0
- package/dist/realtime/facade.d.ts.map +1 -0
- package/dist/realtime/facade.js +37 -0
- package/dist/realtime/facade.js.map +1 -0
- package/dist/realtime/filter.d.ts +42 -0
- package/dist/realtime/filter.d.ts.map +1 -0
- package/dist/realtime/filter.js +86 -0
- package/dist/realtime/filter.js.map +1 -0
- package/dist/realtime/heartbeat.d.ts +20 -0
- package/dist/realtime/heartbeat.d.ts.map +1 -0
- package/dist/realtime/heartbeat.js +64 -0
- package/dist/realtime/heartbeat.js.map +1 -0
- package/dist/realtime/publisher.d.ts +19 -0
- package/dist/realtime/publisher.d.ts.map +1 -0
- package/dist/realtime/publisher.js +8 -0
- package/dist/realtime/publisher.js.map +1 -0
- package/dist/runtime.d.ts +141 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +463 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema-export.d.ts +2 -0
- package/dist/schema-export.d.ts.map +1 -0
- package/dist/schema-export.js +2 -0
- package/dist/schema-export.js.map +1 -0
- package/dist/scope.d.ts +4 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +13 -0
- package/dist/scope.js.map +1 -0
- package/dist/standard-schema.d.ts +13 -0
- package/dist/standard-schema.d.ts.map +1 -0
- package/dist/standard-schema.js +34 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/start/auth-client.d.ts +11 -0
- package/dist/start/auth-client.d.ts.map +1 -0
- package/dist/start/auth-client.js +15 -0
- package/dist/start/auth-client.js.map +1 -0
- package/dist/start/create-start-worker.d.ts +16 -0
- package/dist/start/create-start-worker.d.ts.map +1 -0
- package/dist/start/create-start-worker.js +24 -0
- package/dist/start/create-start-worker.js.map +1 -0
- package/dist/start/index.d.ts +66 -0
- package/dist/start/index.d.ts.map +1 -0
- package/dist/start/index.js +49 -0
- package/dist/start/index.js.map +1 -0
- package/dist/start/isomorphic-fetch.d.ts +22 -0
- package/dist/start/isomorphic-fetch.d.ts.map +1 -0
- package/dist/start/isomorphic-fetch.js +49 -0
- package/dist/start/isomorphic-fetch.js.map +1 -0
- package/dist/start/server-entry.d.ts +7 -0
- package/dist/start/server-entry.d.ts.map +1 -0
- package/dist/start/server-entry.js +8 -0
- package/dist/start/server-entry.js.map +1 -0
- package/dist/storage/background.d.ts +3 -0
- package/dist/storage/background.d.ts.map +1 -0
- package/dist/storage/background.js +3 -0
- package/dist/storage/background.js.map +1 -0
- package/dist/storage/buckets.d.ts +78 -0
- package/dist/storage/buckets.d.ts.map +1 -0
- package/dist/storage/buckets.js +177 -0
- package/dist/storage/buckets.js.map +1 -0
- package/dist/storage/delete.d.ts +8 -0
- package/dist/storage/delete.d.ts.map +1 -0
- package/dist/storage/delete.js +10 -0
- package/dist/storage/delete.js.map +1 -0
- package/dist/storage/file-meta.d.ts +37 -0
- package/dist/storage/file-meta.d.ts.map +1 -0
- package/dist/storage/file-meta.js +166 -0
- package/dist/storage/file-meta.js.map +1 -0
- package/dist/storage/index.d.ts +28 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/local.d.ts +15 -0
- package/dist/storage/local.d.ts.map +1 -0
- package/dist/storage/local.js +56 -0
- package/dist/storage/local.js.map +1 -0
- package/dist/storage/operations.d.ts +54 -0
- package/dist/storage/operations.d.ts.map +1 -0
- package/dist/storage/operations.js +212 -0
- package/dist/storage/operations.js.map +1 -0
- package/dist/storage/registry.d.ts +11 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +23 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/s3.d.ts +35 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +125 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/sigv4.d.ts +24 -0
- package/dist/storage/sigv4.d.ts.map +1 -0
- package/dist/storage/sigv4.js +107 -0
- package/dist/storage/sigv4.js.map +1 -0
- package/dist/storage/sweep.d.ts +9 -0
- package/dist/storage/sweep.d.ts.map +1 -0
- package/dist/storage/sweep.js +17 -0
- package/dist/storage/sweep.js.map +1 -0
- package/dist/sync/collection.d.ts +106 -0
- package/dist/sync/collection.d.ts.map +1 -0
- package/dist/sync/collection.js +258 -0
- package/dist/sync/collection.js.map +1 -0
- package/dist/sync/index.d.ts +8 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +4 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/realtime-sync.d.ts +31 -0
- package/dist/sync/realtime-sync.d.ts.map +1 -0
- package/dist/sync/realtime-sync.js +46 -0
- package/dist/sync/realtime-sync.js.map +1 -0
- package/dist/sync/sync-client.d.ts +28 -0
- package/dist/sync/sync-client.d.ts.map +1 -0
- package/dist/sync/sync-client.js +52 -0
- package/dist/sync/sync-client.js.map +1 -0
- package/dist/sync/update-queue.d.ts +27 -0
- package/dist/sync/update-queue.d.ts.map +1 -0
- package/dist/sync/update-queue.js +66 -0
- package/dist/sync/update-queue.js.map +1 -0
- package/dist/testing/auth.d.ts +85 -0
- package/dist/testing/auth.d.ts.map +1 -0
- package/dist/testing/auth.js +140 -0
- package/dist/testing/auth.js.map +1 -0
- package/dist/testing/client.d.ts +6 -0
- package/dist/testing/client.d.ts.map +1 -0
- package/dist/testing/client.js +9 -0
- package/dist/testing/client.js.map +1 -0
- package/dist/testing/database.d.ts +6 -0
- package/dist/testing/database.d.ts.map +1 -0
- package/dist/testing/database.js +8 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/email.d.ts +15 -0
- package/dist/testing/email.d.ts.map +1 -0
- package/dist/testing/email.js +32 -0
- package/dist/testing/email.js.map +1 -0
- package/dist/testing/fixture.d.ts +51 -0
- package/dist/testing/fixture.d.ts.map +1 -0
- package/dist/testing/fixture.js +177 -0
- package/dist/testing/fixture.js.map +1 -0
- package/dist/testing/jobs.d.ts +40 -0
- package/dist/testing/jobs.d.ts.map +1 -0
- package/dist/testing/jobs.js +76 -0
- package/dist/testing/jobs.js.map +1 -0
- package/dist/testing/logs.d.ts +18 -0
- package/dist/testing/logs.d.ts.map +1 -0
- package/dist/testing/logs.js +53 -0
- package/dist/testing/logs.js.map +1 -0
- package/dist/testing/messaging.d.ts +21 -0
- package/dist/testing/messaging.d.ts.map +1 -0
- package/dist/testing/messaging.js +34 -0
- package/dist/testing/messaging.js.map +1 -0
- package/dist/testing/storage.d.ts +7 -0
- package/dist/testing/storage.d.ts.map +1 -0
- package/dist/testing/storage.js +29 -0
- package/dist/testing/storage.js.map +1 -0
- package/dist/testing/workers-fakes.d.ts +17 -0
- package/dist/testing/workers-fakes.d.ts.map +1 -0
- package/dist/testing/workers-fakes.js +98 -0
- package/dist/testing/workers-fakes.js.map +1 -0
- package/dist/testing.d.ts +12 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +5 -0
- package/dist/testing.js.map +1 -0
- package/dist/typeid.d.ts +46 -0
- package/dist/typeid.d.ts.map +1 -0
- package/dist/typeid.js +130 -0
- package/dist/typeid.js.map +1 -0
- package/dist/vite.d.ts +26 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +100 -0
- package/dist/vite.js.map +1 -0
- package/dist/worker-plan.d.ts +37 -0
- package/dist/worker-plan.d.ts.map +1 -0
- package/dist/worker-plan.js +63 -0
- package/dist/worker-plan.js.map +1 -0
- package/dist/workers/app.d.ts +19 -0
- package/dist/workers/app.d.ts.map +1 -0
- package/dist/workers/app.js +56 -0
- package/dist/workers/app.js.map +1 -0
- package/dist/workers/entry.d.ts +7 -0
- package/dist/workers/entry.d.ts.map +1 -0
- package/dist/workers/entry.js +8 -0
- package/dist/workers/entry.js.map +1 -0
- package/dist/workers/index.d.ts +23 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +39 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/r2.d.ts +24 -0
- package/dist/workers/r2.d.ts.map +1 -0
- package/dist/workers/r2.js +76 -0
- package/dist/workers/r2.js.map +1 -0
- package/dist/workers/rate-limiter.d.ts +9 -0
- package/dist/workers/rate-limiter.d.ts.map +1 -0
- package/dist/workers/rate-limiter.js +22 -0
- package/dist/workers/rate-limiter.js.map +1 -0
- package/dist/workers/realtime-hub.d.ts +20 -0
- package/dist/workers/realtime-hub.d.ts.map +1 -0
- package/dist/workers/realtime-hub.js +117 -0
- package/dist/workers/realtime-hub.js.map +1 -0
- package/dist/workers/registry.d.ts +13 -0
- package/dist/workers/registry.d.ts.map +1 -0
- package/dist/workers/registry.js +19 -0
- package/dist/workers/registry.js.map +1 -0
- package/dist/workers/scheduler.d.ts +13 -0
- package/dist/workers/scheduler.d.ts.map +1 -0
- package/dist/workers/scheduler.js +71 -0
- package/dist/workers/scheduler.js.map +1 -0
- package/dist/workers/types.d.ts +55 -0
- package/dist/workers/types.d.ts.map +1 -0
- package/dist/workers/types.js +4 -0
- package/dist/workers/types.js.map +1 -0
- package/dist/workers/wrangler.d.ts +62 -0
- package/dist/workers/wrangler.d.ts.map +1 -0
- package/dist/workers/wrangler.js +90 -0
- package/dist/workers/wrangler.js.map +1 -0
- package/package.json +286 -0
- package/skills/creating-workerstack-apps/SKILL.md +45 -0
- package/skills/creating-workerstack-apps/agents/openai.yaml +4 -0
- package/skills/creating-workerstack-apps/references/application-structure.md +219 -0
- package/skills/creating-workerstack-apps/references/runtime-integrations.md +96 -0
- package/skills/creating-workerstack-apps/references/verification.md +29 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AccessUser, OperationRule, ResolvedAccess, ResolvedTableAccess } from '../access.js';
|
|
2
|
+
import type { RealtimeChange } from './publisher.js';
|
|
3
|
+
type GetSession = () => Promise<{
|
|
4
|
+
user: AccessUser | null;
|
|
5
|
+
activeOrganizationId: string | null;
|
|
6
|
+
}>;
|
|
7
|
+
export interface FilterRealtimeChangesOptions {
|
|
8
|
+
subscriptions: readonly string[];
|
|
9
|
+
access: ResolvedAccess;
|
|
10
|
+
request: Request;
|
|
11
|
+
getSession: GetSession;
|
|
12
|
+
}
|
|
13
|
+
export interface FilterTableChangesOptions {
|
|
14
|
+
/** Events arrive under this name — the schema key they were published with. */
|
|
15
|
+
tableName: string;
|
|
16
|
+
entry: ResolvedTableAccess;
|
|
17
|
+
/**
|
|
18
|
+
* The operation right this stream reads under: `get` for a subscription to
|
|
19
|
+
* rows, `list` for a live view of a query.
|
|
20
|
+
*/
|
|
21
|
+
rule: OperationRule;
|
|
22
|
+
request: Request;
|
|
23
|
+
getSession: GetSession;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Whether one change may reach this subscriber: the given right plus the read
|
|
27
|
+
* scope of the row, evaluated against the caller's session. The session
|
|
28
|
+
* resolves at most once per stream.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createChangeGuard(entry: ResolvedTableAccess, options: {
|
|
31
|
+
rule: OperationRule;
|
|
32
|
+
request: Request;
|
|
33
|
+
getSession: GetSession;
|
|
34
|
+
}): (change: RealtimeChange) => Promise<boolean>;
|
|
35
|
+
export declare function filterRealtimeChanges(source: AsyncIterable<RealtimeChange>, options: FilterRealtimeChangesOptions): AsyncGenerator<RealtimeChange, void, void>;
|
|
36
|
+
/**
|
|
37
|
+
* The same stream narrowed to one table with its access entry known up front —
|
|
38
|
+
* what a live view (`GET /{table}:live`) consumes.
|
|
39
|
+
*/
|
|
40
|
+
export declare function filterTableChanges(source: AsyncIterable<RealtimeChange>, options: FilterTableChangesOptions): AsyncGenerator<RealtimeChange, void, void>;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/realtime/filter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACpB,MAAM,WAAW,CAAA;AAClB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIjD,KAAK,UAAU,GAAG,MAAM,OAAO,CAAC;IAC9B,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC,CAAC,CAAA;AAEF,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAA;IAChC,MAAM,EAAE,cAAc,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,WAAW,yBAAyB;IACxC,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,mBAAmB,CAAA;IAC1B;;;OAGG;IACH,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,OAAO,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACzE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CA+B9C;AAcD,wBAAuB,qBAAqB,CAC1C,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,EACrC,OAAO,EAAE,4BAA4B,GACpC,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAiC5C;AAED;;;GAGG;AACH,wBAAuB,kBAAkB,CACvC,MAAM,EAAE,aAAa,CAAC,cAAc,CAAC,EACrC,OAAO,EAAE,yBAAyB,GACjC,cAAc,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAO5C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { getEventMeta, withEventMeta } from '@orpc/server';
|
|
2
|
+
import { checkAccess, rowMatchesScope, tableEntryForName } from '../access.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether one change may reach this subscriber: the given right plus the read
|
|
5
|
+
* scope of the row, evaluated against the caller's session. The session
|
|
6
|
+
* resolves at most once per stream.
|
|
7
|
+
*/
|
|
8
|
+
export function createChangeGuard(entry, options) {
|
|
9
|
+
let sessionPromise;
|
|
10
|
+
const getSession = () => (sessionPromise ??= options.getSession());
|
|
11
|
+
return async (change) => {
|
|
12
|
+
if (!entry.enabled || options.rule === 'deny')
|
|
13
|
+
return false;
|
|
14
|
+
const needsSession = options.rule !== 'public' || entry.readScope !== undefined;
|
|
15
|
+
const session = needsSession
|
|
16
|
+
? await getSession()
|
|
17
|
+
: { user: null, activeOrganizationId: null };
|
|
18
|
+
const context = {
|
|
19
|
+
request: options.request,
|
|
20
|
+
user: session.user,
|
|
21
|
+
row: change.record,
|
|
22
|
+
session: { activeOrganizationId: session.activeOrganizationId },
|
|
23
|
+
};
|
|
24
|
+
if (!(await checkAccess(options.rule, context, entry.ownerColumn)).allowed) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (entry.readScope &&
|
|
28
|
+
!rowMatchesScope(change.record, entry.readScope(context))) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Preserve publisher event metadata (ids) across the projection. */
|
|
35
|
+
function project(change) {
|
|
36
|
+
const projected = {
|
|
37
|
+
table: change.table,
|
|
38
|
+
action: change.action,
|
|
39
|
+
record: change.record,
|
|
40
|
+
...(change.operationId ? { operationId: change.operationId } : {}),
|
|
41
|
+
};
|
|
42
|
+
const meta = getEventMeta(change);
|
|
43
|
+
return meta ? withEventMeta(projected, meta) : projected;
|
|
44
|
+
}
|
|
45
|
+
export async function* filterRealtimeChanges(source, options) {
|
|
46
|
+
const subscriptions = new Set(options.subscriptions);
|
|
47
|
+
// One guard — and therefore one cached session — per table entry.
|
|
48
|
+
const guards = new Map();
|
|
49
|
+
for await (const change of source) {
|
|
50
|
+
// Events name tables by schema key; the SQL-name lookup stays as a fallback
|
|
51
|
+
// for publishers outside the CRUD path that only know the physical name.
|
|
52
|
+
const entry = options.access.get(change.table) ??
|
|
53
|
+
tableEntryForName(options.access, change.table);
|
|
54
|
+
if (!entry?.enabled)
|
|
55
|
+
continue;
|
|
56
|
+
const recordId = change.record.id;
|
|
57
|
+
if (!subscriptions.has(change.table) &&
|
|
58
|
+
(recordId == null ||
|
|
59
|
+
!subscriptions.has(`${change.table}/${String(recordId)}`))) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
let guard = guards.get(entry);
|
|
63
|
+
if (!guard) {
|
|
64
|
+
guard = createChangeGuard(entry, { ...options, rule: entry.get });
|
|
65
|
+
guards.set(entry, guard);
|
|
66
|
+
}
|
|
67
|
+
if (!(await guard(change)))
|
|
68
|
+
continue;
|
|
69
|
+
yield project(change);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The same stream narrowed to one table with its access entry known up front —
|
|
74
|
+
* what a live view (`GET /{table}:live`) consumes.
|
|
75
|
+
*/
|
|
76
|
+
export async function* filterTableChanges(source, options) {
|
|
77
|
+
const guard = createChangeGuard(options.entry, options);
|
|
78
|
+
for await (const change of source) {
|
|
79
|
+
if (change.table !== options.tableName)
|
|
80
|
+
continue;
|
|
81
|
+
if (!(await guard(change)))
|
|
82
|
+
continue;
|
|
83
|
+
yield project(change);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/realtime/filter.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEventMeta, withEventMeta } from '@orpc/server'\n\nimport type {\n AccessUser,\n OperationRule,\n ResolvedAccess,\n ResolvedTableAccess,\n} from '../access'\nimport type { RealtimeChange } from './publisher'\n\nimport { checkAccess, rowMatchesScope, tableEntryForName } from '../access'\n\ntype GetSession = () => Promise<{\n user: AccessUser | null\n activeOrganizationId: string | null\n}>\n\nexport interface FilterRealtimeChangesOptions {\n subscriptions: readonly string[]\n access: ResolvedAccess\n request: Request\n getSession: GetSession\n}\n\nexport interface FilterTableChangesOptions {\n /** Events arrive under this name — the schema key they were published with. */\n tableName: string\n entry: ResolvedTableAccess\n /**\n * The operation right this stream reads under: `get` for a subscription to\n * rows, `list` for a live view of a query.\n */\n rule: OperationRule\n request: Request\n getSession: GetSession\n}\n\n/**\n * Whether one change may reach this subscriber: the given right plus the read\n * scope of the row, evaluated against the caller's session. The session\n * resolves at most once per stream.\n */\nexport function createChangeGuard(\n entry: ResolvedTableAccess,\n options: { rule: OperationRule; request: Request; getSession: GetSession },\n): (change: RealtimeChange) => Promise<boolean> {\n let sessionPromise: ReturnType<GetSession> | undefined\n const getSession = () => (sessionPromise ??= options.getSession())\n\n return async (change) => {\n if (!entry.enabled || options.rule === 'deny') return false\n\n const needsSession =\n options.rule !== 'public' || entry.readScope !== undefined\n const session = needsSession\n ? await getSession()\n : { user: null, activeOrganizationId: null }\n const context = {\n request: options.request,\n user: session.user,\n row: change.record,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n if (\n !(await checkAccess(options.rule, context, entry.ownerColumn)).allowed\n ) {\n return false\n }\n if (\n entry.readScope &&\n !rowMatchesScope(change.record, entry.readScope(context))\n ) {\n return false\n }\n return true\n }\n}\n\n/** Preserve publisher event metadata (ids) across the projection. */\nfunction project(change: RealtimeChange): RealtimeChange {\n const projected: RealtimeChange = {\n table: change.table,\n action: change.action,\n record: change.record,\n ...(change.operationId ? { operationId: change.operationId } : {}),\n }\n const meta = getEventMeta(change)\n return meta ? withEventMeta(projected, meta) : projected\n}\n\nexport async function* filterRealtimeChanges(\n source: AsyncIterable<RealtimeChange>,\n options: FilterRealtimeChangesOptions,\n): AsyncGenerator<RealtimeChange, void, void> {\n const subscriptions = new Set(options.subscriptions)\n // One guard — and therefore one cached session — per table entry.\n const guards = new Map<\n ResolvedTableAccess,\n ReturnType<typeof createChangeGuard>\n >()\n\n for await (const change of source) {\n // Events name tables by schema key; the SQL-name lookup stays as a fallback\n // for publishers outside the CRUD path that only know the physical name.\n const entry =\n options.access.get(change.table) ??\n tableEntryForName(options.access, change.table)\n if (!entry?.enabled) continue\n\n const recordId = change.record.id\n if (\n !subscriptions.has(change.table) &&\n (recordId == null ||\n !subscriptions.has(`${change.table}/${String(recordId)}`))\n ) {\n continue\n }\n\n let guard = guards.get(entry)\n if (!guard) {\n guard = createChangeGuard(entry, { ...options, rule: entry.get })\n guards.set(entry, guard)\n }\n if (!(await guard(change))) continue\n yield project(change)\n }\n}\n\n/**\n * The same stream narrowed to one table with its access entry known up front —\n * what a live view (`GET /{table}:live`) consumes.\n */\nexport async function* filterTableChanges(\n source: AsyncIterable<RealtimeChange>,\n options: FilterTableChangesOptions,\n): AsyncGenerator<RealtimeChange, void, void> {\n const guard = createChangeGuard(options.entry, options)\n for await (const change of source) {\n if (change.table !== options.tableName) continue\n if (!(await guard(change))) continue\n yield project(change)\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const REALTIME_HEARTBEAT_INTERVAL_MS = 5000;
|
|
2
|
+
/**
|
|
3
|
+
* A transport-only event. `intervalMs` is the cadence it is sent at, so a
|
|
4
|
+
* client can size its own dead-stream timeout from the server's real setting
|
|
5
|
+
* instead of hardcoding a constant that drifts from it.
|
|
6
|
+
*/
|
|
7
|
+
export type RealtimeHeartbeat = {
|
|
8
|
+
type: 'heartbeat';
|
|
9
|
+
intervalMs: number;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Emits a transport-only event whenever the source has been idle for an
|
|
13
|
+
* interval. Heartbeats are deliberately not published, persisted, or assigned
|
|
14
|
+
* event IDs, so they do not affect replay and resume semantics.
|
|
15
|
+
*/
|
|
16
|
+
export declare function withRealtimeHeartbeat<T>(source: AsyncIterable<T>, options: {
|
|
17
|
+
intervalMs?: number;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}): AsyncGenerator<T | RealtimeHeartbeat, void, void>;
|
|
20
|
+
//# sourceMappingURL=heartbeat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/realtime/heartbeat.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,OAAQ,CAAA;AAEnD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAOzE;;;;GAIG;AACH,wBAAuB,qBAAqB,CAAC,CAAC,EAC5C,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GACrD,cAAc,CAAC,CAAC,GAAG,iBAAiB,EAAE,IAAI,EAAE,IAAI,CAAC,CA8DnD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const REALTIME_HEARTBEAT_INTERVAL_MS = 5_000;
|
|
2
|
+
/**
|
|
3
|
+
* Emits a transport-only event whenever the source has been idle for an
|
|
4
|
+
* interval. Heartbeats are deliberately not published, persisted, or assigned
|
|
5
|
+
* event IDs, so they do not affect replay and resume semantics.
|
|
6
|
+
*/
|
|
7
|
+
export async function* withRealtimeHeartbeat(source, options) {
|
|
8
|
+
const intervalMs = Math.max(1, options.intervalMs ?? REALTIME_HEARTBEAT_INTERVAL_MS);
|
|
9
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
10
|
+
let state = { status: 'pending' };
|
|
11
|
+
let wake;
|
|
12
|
+
const getState = () => state;
|
|
13
|
+
const requestNext = () => {
|
|
14
|
+
state = { status: 'pending' };
|
|
15
|
+
void iterator.next().then((result) => {
|
|
16
|
+
state = { status: 'ready', result };
|
|
17
|
+
wake?.();
|
|
18
|
+
}, (error) => {
|
|
19
|
+
state = { status: 'error', error };
|
|
20
|
+
wake?.();
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
requestNext();
|
|
24
|
+
try {
|
|
25
|
+
while (!options.signal?.aborted) {
|
|
26
|
+
let current = getState();
|
|
27
|
+
if (current.status === 'pending') {
|
|
28
|
+
await new Promise((resolve) => {
|
|
29
|
+
let settled = false;
|
|
30
|
+
const finish = () => {
|
|
31
|
+
if (settled)
|
|
32
|
+
return;
|
|
33
|
+
settled = true;
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
options.signal?.removeEventListener('abort', finish);
|
|
36
|
+
resolve();
|
|
37
|
+
};
|
|
38
|
+
const timer = setTimeout(finish, intervalMs);
|
|
39
|
+
options.signal?.addEventListener('abort', finish, { once: true });
|
|
40
|
+
wake = finish;
|
|
41
|
+
});
|
|
42
|
+
wake = undefined;
|
|
43
|
+
if (options.signal?.aborted)
|
|
44
|
+
break;
|
|
45
|
+
current = getState();
|
|
46
|
+
if (current.status === 'pending') {
|
|
47
|
+
yield { type: 'heartbeat', intervalMs };
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (current.status === 'error')
|
|
52
|
+
throw current.error;
|
|
53
|
+
if (current.result.done)
|
|
54
|
+
break;
|
|
55
|
+
yield current.result.value;
|
|
56
|
+
requestNext();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
wake = undefined;
|
|
61
|
+
await iterator.return?.();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/realtime/heartbeat.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAA;AAcnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,MAAwB,EACxB,OAAsD;IAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,OAAO,CAAC,UAAU,IAAI,8BAA8B,CACrD,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC/C,IAAI,KAAK,GAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACjD,IAAI,IAA8B,CAAA;IAClC,MAAM,QAAQ,GAAG,GAAmB,EAAE,CAAC,KAAK,CAAA;IAE5C,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC7B,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CACvB,CAAC,MAAM,EAAE,EAAE;YACT,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YACnC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAClC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IAED,WAAW,EAAE,CAAA;IACb,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAChC,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAA;YACxB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,IAAI,OAAO,GAAG,KAAK,CAAA;oBACnB,MAAM,MAAM,GAAG,GAAG,EAAE;wBAClB,IAAI,OAAO;4BAAE,OAAM;wBACnB,OAAO,GAAG,IAAI,CAAA;wBACd,YAAY,CAAC,KAAK,CAAC,CAAA;wBACnB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;wBACpD,OAAO,EAAE,CAAA;oBACX,CAAC,CAAA;oBACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;oBAC5C,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;oBACjE,IAAI,GAAG,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;gBACF,IAAI,GAAG,SAAS,CAAA;gBAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;oBAAE,MAAK;gBAClC,OAAO,GAAG,QAAQ,EAAE,CAAA;gBACpB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;oBACvC,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAA;YACnD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAK;YAE9B,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;YAC1B,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,GAAG,SAAS,CAAA;QAChB,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC","sourcesContent":["export const REALTIME_HEARTBEAT_INTERVAL_MS = 5_000\n\n/**\n * A transport-only event. `intervalMs` is the cadence it is sent at, so a\n * client can size its own dead-stream timeout from the server's real setting\n * instead of hardcoding a constant that drifts from it.\n */\nexport type RealtimeHeartbeat = { type: 'heartbeat'; intervalMs: number }\n\ntype SourceState<T> =\n | { status: 'pending' }\n | { status: 'ready'; result: IteratorResult<T> }\n | { status: 'error'; error: unknown }\n\n/**\n * Emits a transport-only event whenever the source has been idle for an\n * interval. Heartbeats are deliberately not published, persisted, or assigned\n * event IDs, so they do not affect replay and resume semantics.\n */\nexport async function* withRealtimeHeartbeat<T>(\n source: AsyncIterable<T>,\n options: { intervalMs?: number; signal?: AbortSignal },\n): AsyncGenerator<T | RealtimeHeartbeat, void, void> {\n const intervalMs = Math.max(\n 1,\n options.intervalMs ?? REALTIME_HEARTBEAT_INTERVAL_MS,\n )\n const iterator = source[Symbol.asyncIterator]()\n let state: SourceState<T> = { status: 'pending' }\n let wake: (() => void) | undefined\n const getState = (): SourceState<T> => state\n\n const requestNext = () => {\n state = { status: 'pending' }\n void iterator.next().then(\n (result) => {\n state = { status: 'ready', result }\n wake?.()\n },\n (error: unknown) => {\n state = { status: 'error', error }\n wake?.()\n },\n )\n }\n\n requestNext()\n try {\n while (!options.signal?.aborted) {\n let current = getState()\n if (current.status === 'pending') {\n await new Promise<void>((resolve) => {\n let settled = false\n const finish = () => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n options.signal?.removeEventListener('abort', finish)\n resolve()\n }\n const timer = setTimeout(finish, intervalMs)\n options.signal?.addEventListener('abort', finish, { once: true })\n wake = finish\n })\n wake = undefined\n\n if (options.signal?.aborted) break\n current = getState()\n if (current.status === 'pending') {\n yield { type: 'heartbeat', intervalMs }\n continue\n }\n }\n\n if (current.status === 'error') throw current.error\n if (current.result.done) break\n\n yield current.result.value\n requestNext()\n }\n } finally {\n wake = undefined\n await iterator.return?.()\n }\n}\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Publisher } from '@orpc/publisher';
|
|
2
|
+
export type RealtimeAction = 'create' | 'update' | 'delete';
|
|
3
|
+
export interface RealtimeChange {
|
|
4
|
+
table: string;
|
|
5
|
+
action: RealtimeAction;
|
|
6
|
+
record: Record<string, unknown>;
|
|
7
|
+
/** Correlates this confirmed write with the client operation that caused it. */
|
|
8
|
+
operationId?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RealtimeEvents extends Record<string, object> {
|
|
11
|
+
change: RealtimeChange;
|
|
12
|
+
}
|
|
13
|
+
export type RealtimePublisher = Publisher<RealtimeEvents>;
|
|
14
|
+
export interface RealtimePublisherOptions {
|
|
15
|
+
maxBufferedEvents?: number;
|
|
16
|
+
resumeSeconds?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function createMemoryRealtimePublisher(options?: RealtimePublisherOptions): RealtimePublisher;
|
|
19
|
+
//# sourceMappingURL=publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/realtime/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAIhD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE3D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAC5D,MAAM,EAAE,cAAc,CAAA;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,cAAc,CAAC,CAAA;AAEzD,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CAKnB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MemoryPublisher } from '@orpc/publisher/memory';
|
|
2
|
+
export function createMemoryRealtimePublisher(options = {}) {
|
|
3
|
+
return new MemoryPublisher({
|
|
4
|
+
maxBufferedEvents: options.maxBufferedEvents,
|
|
5
|
+
resume: { enabled: true, seconds: options.resumeSeconds ?? 300 },
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/realtime/publisher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAuBxD,MAAM,UAAU,6BAA6B,CAC3C,UAAoC,EAAE;IAEtC,OAAO,IAAI,eAAe,CAAiB;QACzC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG,EAAE;KACjE,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import type { Publisher } from '@orpc/publisher'\n\nimport { MemoryPublisher } from '@orpc/publisher/memory'\n\nexport type RealtimeAction = 'create' | 'update' | 'delete'\n\nexport interface RealtimeChange {\n table: string\n action: RealtimeAction\n record: Record<string, unknown>\n /** Correlates this confirmed write with the client operation that caused it. */\n operationId?: string\n}\n\nexport interface RealtimeEvents extends Record<string, object> {\n change: RealtimeChange\n}\n\nexport type RealtimePublisher = Publisher<RealtimeEvents>\n\nexport interface RealtimePublisherOptions {\n maxBufferedEvents?: number\n resumeSeconds?: number\n}\n\nexport function createMemoryRealtimePublisher(\n options: RealtimePublisherOptions = {},\n): RealtimePublisher {\n return new MemoryPublisher<RealtimeEvents>({\n maxBufferedEvents: options.maxBufferedEvents,\n resume: { enabled: true, seconds: options.resumeSeconds ?? 300 },\n })\n}\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { AnyRouter as AnyORPCRouter } from '@orpc/server';
|
|
2
|
+
import type { Auth } from 'better-auth';
|
|
3
|
+
import type { AuthSessionResolver, SessionUserConfig } from './access.js';
|
|
4
|
+
import type { TableAccessInput } from './access.js';
|
|
5
|
+
import type { RealtimeApiRouter } from './api/realtime-router.js';
|
|
6
|
+
import type { CrudApiRouterFor, MergeApiRouterTypes, UnifiedApiRouter } from './api/types.js';
|
|
7
|
+
import type { RuntimeTestingHandle } from './backend-internals.js';
|
|
8
|
+
import type { DatabaseConnection } from './database/adapter.js';
|
|
9
|
+
import type { DbFor } from './db.js';
|
|
10
|
+
import type { WorkerstackJobsBuilder, JobsDefs, JobsFacade } from './jobs/index.js';
|
|
11
|
+
import type { MessagingConfig, MessagingFacadesFor } from './messaging/index.js';
|
|
12
|
+
import type { MessagingAdapter } from './messaging/runtime.js';
|
|
13
|
+
import type { ResolvedStorageBuckets, StorageConfigInput } from './storage/buckets.js';
|
|
14
|
+
import type { StorageAdapter } from './storage/index.js';
|
|
15
|
+
import { type WorkerstackAuth } from './auth.js';
|
|
16
|
+
import { type BetterAuthConfig, type WorkerstackConfig } from './config.js';
|
|
17
|
+
import { type EnvConfigInput, type ValidatedEnv } from './env.js';
|
|
18
|
+
import { type LifecycleStatus } from './lifecycle.js';
|
|
19
|
+
import { type WorkerstackLogger } from './logging.js';
|
|
20
|
+
import { type Platform } from './platform.js';
|
|
21
|
+
import { type RealtimeFacade } from './realtime/facade.js';
|
|
22
|
+
/** Base Better Auth contract used by framework internals and API context. */
|
|
23
|
+
export type AuthInstance = Auth;
|
|
24
|
+
export type RuntimeOverrides = {
|
|
25
|
+
database?: DatabaseConnection;
|
|
26
|
+
resolvedStorage?: ResolvedStorageBuckets;
|
|
27
|
+
messagingAdapters?: Record<string, MessagingAdapter>;
|
|
28
|
+
authResolver?: AuthSessionResolver;
|
|
29
|
+
logger?: WorkerstackLogger;
|
|
30
|
+
/** Host services; see src/platform.ts. */
|
|
31
|
+
platform?: Partial<Platform>;
|
|
32
|
+
/** Private callback used by backend.test(); never exposed on the app. */
|
|
33
|
+
captureTestingHandle?: (handle: RuntimeTestingHandle) => void;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Public storage facade exposed as `app.storage`. Object-level operations live
|
|
37
|
+
* on the per-bucket adapters; this surface offers the app-wide deletes that
|
|
38
|
+
* must also clean the file-meta row.
|
|
39
|
+
*/
|
|
40
|
+
export interface StorageFacade {
|
|
41
|
+
/** Delete a file row and purge all underlying storage derivatives. */
|
|
42
|
+
delete(fileId: string): Promise<void>;
|
|
43
|
+
/** Low-level access to the underlying storage adapter for a bucket. */
|
|
44
|
+
bucket(name: string): StorageAdapter | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Reap stale `pending` uploads older than `olderThanMs` (default 30m). Runs
|
|
47
|
+
* only when explicitly invoked by the host or local scheduler. Returns
|
|
48
|
+
* the count reaped.
|
|
49
|
+
*/
|
|
50
|
+
sweep(olderThanMs?: number): Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* Get a public or presigned download URL for a file key.
|
|
53
|
+
* Returns a presigned S3 URL when S3 is configured, or local proxy route `/api/files/...` in development.
|
|
54
|
+
*/
|
|
55
|
+
getUrl(key: string, opts?: {
|
|
56
|
+
bucket?: string;
|
|
57
|
+
expiresIn?: number;
|
|
58
|
+
}): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Upload bytes as a ready file and register it in file_meta so it is
|
|
61
|
+
* accessible via `GET /api/files/<key>`. Use this for server-generated
|
|
62
|
+
* files (e.g. generated PDFs) that are not uploaded by end-users.
|
|
63
|
+
*/
|
|
64
|
+
upload(key: string, body: ArrayBuffer | Uint8Array, contentType: string, opts?: {
|
|
65
|
+
ownerId?: string;
|
|
66
|
+
filename?: string;
|
|
67
|
+
}): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
/** Bucket names declared in a storage config; `string` when unknowable. */
|
|
70
|
+
export type BucketNamesOf<TStorage> = TStorage extends {
|
|
71
|
+
buckets: infer B extends Record<string, unknown>;
|
|
72
|
+
} ? keyof B & string : string;
|
|
73
|
+
export type WorkerstackApp<TSchema extends Record<string, unknown>, TAccess extends Record<string, TableAccessInput> | undefined = undefined, TBuckets extends string = string, TEnv extends EnvConfigInput | undefined = undefined, TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, TRealtime = undefined, TMessaging extends MessagingConfig | undefined = undefined, TAuthConfig extends BetterAuthConfig = BetterAuthConfig> = {
|
|
74
|
+
handler: (req: Request) => Promise<Response>;
|
|
75
|
+
db: DbFor<TSchema>;
|
|
76
|
+
auth: WorkerstackAuth<TAuthConfig>;
|
|
77
|
+
storage: StorageFacade;
|
|
78
|
+
/** Validated env: workerstack's base vars plus the config's `env` extension. */
|
|
79
|
+
env: ValidatedEnv<TEnv>;
|
|
80
|
+
/** Named, provider-specific outbound messaging channels. */
|
|
81
|
+
messaging: MessagingFacadesFor<TMessaging>;
|
|
82
|
+
/** Job queue facade; always present — enqueue throws when jobs aren't configured. */
|
|
83
|
+
jobs: JobsFacade<TJobsDefs extends JobsDefs ? TJobsDefs : Record<never, never>, TSchema>;
|
|
84
|
+
/** Typed custom row publication; enabled=false/no-op when realtime is off. */
|
|
85
|
+
realtime: RealtimeFacade<TSchema>;
|
|
86
|
+
close(): Promise<void>;
|
|
87
|
+
readonly status: LifecycleStatus;
|
|
88
|
+
readonly signal: AbortSignal;
|
|
89
|
+
/**
|
|
90
|
+
* Type-only carrier for client inference (`createClient<typeof app>()`).
|
|
91
|
+
* Never assigned at runtime.
|
|
92
|
+
*/
|
|
93
|
+
readonly $inferClient?: {
|
|
94
|
+
schema: TSchema;
|
|
95
|
+
access: TAccess;
|
|
96
|
+
buckets: TBuckets;
|
|
97
|
+
api: MergeApiRouterTypes<UnifiedApiRouter<CrudApiRouterFor<TSchema, TAccess, [
|
|
98
|
+
TRealtime
|
|
99
|
+
] extends [false | undefined] ? false : true>, TCustomApiRouter>, [
|
|
100
|
+
TRealtime
|
|
101
|
+
] extends [false | undefined] ? {} : RealtimeApiRouter>;
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
export declare function materializeWorkerstack<TSchema extends Record<string, unknown>, const TAccess extends Record<string, TableAccessInput> | undefined = undefined, const TStorage extends StorageConfigInput | undefined = undefined, const TEnv extends EnvConfigInput | undefined = undefined, const TJobsDefs extends JobsDefs | undefined = undefined, TCustomApiRouter extends AnyORPCRouter | undefined = undefined, const TRealtime extends WorkerstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter>['realtime'] = undefined, const TMessaging extends MessagingConfig | undefined = undefined, const TAuthConfig extends BetterAuthConfig = BetterAuthConfig, const TSession extends SessionUserConfig<Record<string, unknown>> | undefined = undefined>(options: WorkerstackConfig<TSchema, TAccess, TStorage, TEnv, TCustomApiRouter, TAuthConfig, TSession> & {
|
|
105
|
+
realtime?: TRealtime;
|
|
106
|
+
messaging?: TMessaging;
|
|
107
|
+
jobs?: TJobsDefs | ((j: WorkerstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>) => TJobsDefs);
|
|
108
|
+
}, source: Record<string, string | undefined>, overrides?: RuntimeOverrides, env?: ValidatedEnv<TEnv>): Promise<WorkerstackApp<TSchema, TAccess, BucketNamesOf<TStorage>, TEnv, TJobsDefs, TCustomApiRouter, TRealtime, TMessaging, TAuthConfig>>;
|
|
109
|
+
export { listSpec } from './api/list-spec.js';
|
|
110
|
+
export type { ListSpecOptions } from './api/list-spec.js';
|
|
111
|
+
export type { WorkerstackDb, WorkerstackTx } from './db.js';
|
|
112
|
+
export { MAX_LIST_LIMIT } from './list-query.js';
|
|
113
|
+
export { WorkerstackError } from './errors.js';
|
|
114
|
+
export type { WorkerstackErrorCode } from './errors.js';
|
|
115
|
+
export { resolveConfig, resolveAuthConfig, defineAuth } from './config.js';
|
|
116
|
+
export type { AuthConfigContext, AuthConfigFactory, AuthConfigInput, BetterAuthConfig, WorkerstackConfig, ResolvedConfig, } from './config.js';
|
|
117
|
+
export { validateEnv, createClientEnv, WorkerstackEnvError } from './env.js';
|
|
118
|
+
export type { EnvConfigInput, BaseEnv, ValidatedEnv } from './env.js';
|
|
119
|
+
export { buildManifest, parseManifest } from './manifest.js';
|
|
120
|
+
export type { WorkerstackManifest, ManifestEnvVar } from './manifest.js';
|
|
121
|
+
export type { EmailMessage, EmailAdapter } from './email.js';
|
|
122
|
+
export { createJobsBuilder } from './jobs/index.js';
|
|
123
|
+
export type { WorkerstackJobContext, WorkerstackJobsBuilder, BackgroundDefinition, BackgroundDefs, CronDefinition, CronInvocation, DedupeUntil, EnqueueOptions, EnqueueTransaction, JobContext, JobDefinition, JobsDefs, JobsFacade, JobsRuntimeFacade, QueueJobDefinition, QueueJobKeys, TypedEnqueueOptions, } from './jobs/index.js';
|
|
124
|
+
export { defineSessionUser, defineAccess, validateAndResolveAccess, checkAccess, AUTH_TABLE_NAMES, } from './access.js';
|
|
125
|
+
export type { TableAccessInput, OperationRule, AccessContext, AccessUser, AccessUserBase, SessionUserConfig, SessionUserExtraOf, SessionUserSource, } from './access.js';
|
|
126
|
+
export { typeid, generate as generateTypeId, parse as parseTypeId, asTypeId, } from './typeid.js';
|
|
127
|
+
export type { TypeId } from './typeid.js';
|
|
128
|
+
export type { DatabaseAdapter, DatabaseConnection, DatabaseConnectionResult, } from './database/adapter.js';
|
|
129
|
+
export type { StorageAdapter } from './storage/index.js';
|
|
130
|
+
export type { StorageConfigInput, BucketConfigInput, ResolvedBucket, } from './storage/buckets.js';
|
|
131
|
+
export type { RealtimeAction } from './realtime/publisher.js';
|
|
132
|
+
export { createRealtimeFacade } from './realtime/facade.js';
|
|
133
|
+
export type { RealtimeFacade, RealtimeTransport, SchemaTable, } from './realtime/facade.js';
|
|
134
|
+
export { createApiBuilder, defineApi } from './api/builder.js';
|
|
135
|
+
export type { WorkerstackApiBuilder, ApiFactory } from './api/builder.js';
|
|
136
|
+
export type { ApiContext } from './api/context.js';
|
|
137
|
+
export type { CrudApiRouterFor, ExposedApiTables, MergeApiRouterTypes, UnifiedApiRouter, } from './api/types.js';
|
|
138
|
+
export type { TableCrudProcedures } from './api/crud-router.js';
|
|
139
|
+
export { buildApiRegistry, mergeApiRoutersStrict, normalizeApiPath, normalizeForeignOpenAPISpec, } from './api/registry.js';
|
|
140
|
+
export { mergeOpenAPISpecs } from './api/openapi.js';
|
|
141
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|