silgi 0.43.29 → 0.50.1
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 +103 -1
- package/dist/_virtual/_rolldown/runtime.mjs +5 -0
- package/dist/adapters/_fetch-adapter.d.mts +18 -0
- package/dist/adapters/_fetch-adapter.mjs +53 -0
- package/dist/adapters/astro.d.mts +15 -0
- package/dist/adapters/astro.mjs +31 -0
- package/dist/adapters/aws-lambda.d.mts +42 -0
- package/dist/adapters/aws-lambda.mjs +92 -0
- package/dist/adapters/express.d.mts +16 -0
- package/dist/adapters/express.mjs +110 -0
- package/dist/adapters/message-port.d.mts +42 -0
- package/dist/adapters/message-port.mjs +132 -0
- package/dist/adapters/nestjs.d.mts +25 -0
- package/dist/adapters/nestjs.mjs +83 -0
- package/dist/adapters/nextjs.d.mts +14 -0
- package/dist/adapters/nextjs.mjs +29 -0
- package/dist/adapters/peer.d.mts +27 -0
- package/dist/adapters/peer.mjs +36 -0
- package/dist/adapters/remix.d.mts +15 -0
- package/dist/adapters/remix.mjs +30 -0
- package/dist/adapters/solidstart.d.mts +12 -0
- package/dist/adapters/solidstart.mjs +29 -0
- package/dist/adapters/sveltekit.d.mts +14 -0
- package/dist/adapters/sveltekit.mjs +30 -0
- package/dist/broker/index.d.mts +62 -0
- package/dist/broker/index.mjs +153 -0
- package/dist/broker/nats.d.mts +33 -0
- package/dist/broker/nats.mjs +31 -0
- package/dist/broker/redis.d.mts +51 -0
- package/dist/broker/redis.mjs +92 -0
- package/dist/builder.d.mts +55 -0
- package/dist/builder.mjs +70 -0
- package/dist/callable.d.mts +19 -0
- package/dist/callable.mjs +42 -0
- package/dist/caller.mjs +90 -0
- package/dist/client/adapters/fetch/index.d.mts +15 -0
- package/dist/client/adapters/fetch/index.mjs +57 -0
- package/dist/client/adapters/ofetch/index.d.mts +55 -0
- package/dist/client/adapters/ofetch/index.mjs +91 -0
- package/dist/client/adapters/websocket/index.d.mts +20 -0
- package/dist/client/adapters/websocket/index.mjs +101 -0
- package/dist/client/client.d.mts +37 -0
- package/dist/client/client.mjs +80 -0
- package/dist/client/consume.d.mts +50 -0
- package/dist/client/consume.mjs +66 -0
- package/dist/client/dynamic-link.d.mts +16 -0
- package/dist/client/dynamic-link.mjs +19 -0
- package/dist/client/index.d.mts +6 -0
- package/dist/client/index.mjs +5 -0
- package/dist/client/interceptor.d.mts +31 -0
- package/dist/client/interceptor.mjs +34 -0
- package/dist/client/openapi.d.mts +29 -0
- package/dist/client/openapi.mjs +89 -0
- package/dist/client/plugins/batch.d.mts +26 -0
- package/dist/client/plugins/batch.mjs +64 -0
- package/dist/client/plugins/circuit-breaker.d.mts +24 -0
- package/dist/client/plugins/circuit-breaker.mjs +60 -0
- package/dist/client/plugins/csrf.d.mts +13 -0
- package/dist/client/plugins/csrf.mjs +20 -0
- package/dist/client/plugins/dedupe.d.mts +10 -0
- package/dist/client/plugins/dedupe.mjs +28 -0
- package/dist/client/plugins/index.d.mts +8 -0
- package/dist/client/plugins/index.mjs +8 -0
- package/dist/client/plugins/otel.d.mts +12 -0
- package/dist/client/plugins/otel.mjs +27 -0
- package/dist/client/plugins/retry.d.mts +34 -0
- package/dist/client/plugins/retry.mjs +79 -0
- package/dist/client/plugins/timeout.d.mts +10 -0
- package/dist/client/plugins/timeout.mjs +14 -0
- package/dist/client/server.d.mts +16 -0
- package/dist/client/server.mjs +59 -0
- package/dist/client/types.d.mts +29 -0
- package/dist/codec/devalue.d.mts +21 -0
- package/dist/codec/devalue.mjs +33 -0
- package/dist/codec/msgpack.d.mts +18 -0
- package/dist/codec/msgpack.mjs +45 -0
- package/dist/codec/sanitize.mjs +38 -0
- package/dist/codegen/emitters.d.mts +51 -0
- package/dist/codegen/emitters.mjs +143 -0
- package/dist/codegen/generate.d.mts +25 -0
- package/dist/codegen/generate.mjs +224 -0
- package/dist/codegen/index.d.mts +44 -0
- package/dist/codegen/index.mjs +103 -0
- package/dist/codegen/parse.d.mts +124 -0
- package/dist/codegen/parse.mjs +135 -0
- package/dist/codegen/preserve.d.mts +21 -0
- package/dist/codegen/preserve.mjs +62 -0
- package/dist/codegen/schema-to-code.d.mts +57 -0
- package/dist/codegen/schema-to-code.mjs +167 -0
- package/dist/compile.d.mts +46 -0
- package/dist/compile.mjs +332 -0
- package/dist/core/codec.mjs +67 -0
- package/dist/core/context-bridge.mjs +11 -0
- package/dist/core/dispatch.mjs +62 -0
- package/dist/core/error.d.mts +99 -60
- package/dist/core/error.mjs +125 -92
- package/dist/core/handler.d.mts +6 -0
- package/dist/core/handler.mjs +153 -0
- package/dist/core/input.mjs +49 -0
- package/dist/core/iterator.d.mts +17 -0
- package/dist/core/iterator.mjs +79 -0
- package/dist/core/router-utils.mjs +22 -0
- package/dist/core/schema.d.mts +20 -0
- package/dist/core/schema.mjs +33 -0
- package/dist/core/serve.d.mts +51 -0
- package/dist/core/serve.mjs +76 -0
- package/dist/core/sse.d.mts +18 -0
- package/dist/core/sse.mjs +110 -0
- package/dist/core/storage.d.mts +17 -4
- package/dist/core/storage.mjs +60 -13
- package/dist/core/task.d.mts +62 -0
- package/dist/core/task.mjs +165 -0
- package/dist/core/trace-map.d.mts +13 -0
- package/dist/core/trace-map.mjs +13 -0
- package/dist/core/url.mjs +28 -0
- package/dist/core/utils.mjs +24 -0
- package/dist/index.d.mts +17 -21
- package/dist/index.mjs +14 -22
- package/dist/integrations/ai/index.d.mts +25 -0
- package/dist/integrations/ai/index.mjs +117 -0
- package/dist/integrations/better-auth/index.d.mts +41 -0
- package/dist/integrations/better-auth/index.mjs +331 -0
- package/dist/integrations/drizzle/index.d.mts +27 -0
- package/dist/integrations/drizzle/index.mjs +285 -0
- package/dist/integrations/hey-api/index.d.mts +2 -0
- package/dist/integrations/hey-api/index.mjs +2 -0
- package/dist/integrations/hey-api/to-client.d.mts +20 -0
- package/dist/integrations/hey-api/to-client.mjs +39 -0
- package/dist/integrations/pinia-colada/general-utils.d.mts +13 -0
- package/dist/integrations/pinia-colada/general-utils.mjs +9 -0
- package/dist/integrations/pinia-colada/index.d.mts +6 -0
- package/dist/integrations/pinia-colada/index.mjs +5 -0
- package/dist/integrations/pinia-colada/key.d.mts +11 -0
- package/dist/integrations/pinia-colada/key.mjs +11 -0
- package/dist/integrations/pinia-colada/procedure-utils.d.mts +25 -0
- package/dist/integrations/pinia-colada/procedure-utils.mjs +33 -0
- package/dist/integrations/pinia-colada/router-utils.d.mts +17 -0
- package/dist/integrations/pinia-colada/router-utils.mjs +30 -0
- package/dist/integrations/pinia-colada/types.d.mts +25 -0
- package/dist/integrations/react/index.d.mts +83 -0
- package/dist/integrations/react/index.mjs +196 -0
- package/dist/integrations/tanstack-query/index.d.mts +120 -0
- package/dist/integrations/tanstack-query/index.mjs +100 -0
- package/dist/integrations/tanstack-query/ssr.d.mts +60 -0
- package/dist/integrations/tanstack-query/ssr.mjs +102 -0
- package/dist/integrations/zod/converter.d.mts +75 -0
- package/dist/integrations/zod/converter.mjs +345 -0
- package/dist/integrations/zod/index.d.mts +2 -0
- package/dist/integrations/zod/index.mjs +2 -0
- package/dist/lazy.d.mts +22 -0
- package/dist/lazy.mjs +34 -0
- package/dist/lifecycle.d.mts +36 -0
- package/dist/lifecycle.mjs +46 -0
- package/dist/map-input.d.mts +17 -0
- package/dist/map-input.mjs +47 -0
- package/dist/plugins/analytics/accumulator.d.mts +24 -0
- package/dist/plugins/analytics/accumulator.mjs +91 -0
- package/dist/plugins/analytics/alerts.d.mts +59 -0
- package/dist/plugins/analytics/alerts.mjs +140 -0
- package/dist/plugins/analytics/collector.d.mts +38 -0
- package/dist/plugins/analytics/collector.mjs +275 -0
- package/dist/plugins/analytics/cost.d.mts +61 -0
- package/dist/plugins/analytics/cost.mjs +97 -0
- package/dist/plugins/analytics/export.d.mts +7 -0
- package/dist/plugins/analytics/export.mjs +86 -0
- package/dist/plugins/analytics/normalize.mjs +144 -0
- package/dist/plugins/analytics/query.mjs +164 -0
- package/dist/plugins/analytics/request-id.mjs +34 -0
- package/dist/plugins/analytics/routes.d.mts +11 -0
- package/dist/plugins/analytics/routes.mjs +211 -0
- package/dist/plugins/analytics/sse.d.mts +31 -0
- package/dist/plugins/analytics/sse.mjs +74 -0
- package/dist/plugins/analytics/store.mjs +103 -0
- package/dist/plugins/analytics/timeseries.d.mts +50 -0
- package/dist/plugins/analytics/timeseries.mjs +169 -0
- package/dist/plugins/analytics/trace.d.mts +48 -0
- package/dist/plugins/analytics/trace.mjs +83 -0
- package/dist/plugins/analytics/types.d.mts +145 -0
- package/dist/plugins/analytics/types.mjs +40 -0
- package/dist/plugins/analytics/utils.d.mts +4 -0
- package/dist/plugins/analytics/utils.mjs +56 -0
- package/dist/plugins/analytics.d.mts +18 -0
- package/dist/plugins/analytics.mjs +188 -0
- package/dist/plugins/batch-server.d.mts +20 -0
- package/dist/plugins/batch-server.mjs +91 -0
- package/dist/plugins/body-limit.d.mts +19 -0
- package/dist/plugins/body-limit.mjs +49 -0
- package/dist/plugins/cache.d.mts +170 -0
- package/dist/plugins/cache.mjs +212 -0
- package/dist/plugins/coerce.d.mts +24 -0
- package/dist/plugins/coerce.mjs +70 -0
- package/dist/plugins/cookies.d.mts +14 -0
- package/dist/plugins/cookies.mjs +48 -0
- package/dist/plugins/cors.d.mts +43 -0
- package/dist/plugins/cors.mjs +62 -0
- package/dist/plugins/file-upload.d.mts +38 -0
- package/dist/plugins/file-upload.mjs +102 -0
- package/dist/plugins/index.d.mts +18 -0
- package/dist/plugins/index.mjs +17 -0
- package/dist/plugins/otel.d.mts +35 -0
- package/dist/plugins/otel.mjs +40 -0
- package/dist/plugins/pino.d.mts +60 -0
- package/dist/plugins/pino.mjs +42 -0
- package/dist/plugins/pubsub.d.mts +50 -0
- package/dist/plugins/pubsub.mjs +53 -0
- package/dist/plugins/ratelimit.d.mts +53 -0
- package/dist/plugins/ratelimit.mjs +92 -0
- package/dist/plugins/signing.d.mts +41 -0
- package/dist/plugins/signing.mjs +118 -0
- package/dist/plugins/strict-get.d.mts +10 -0
- package/dist/plugins/strict-get.mjs +33 -0
- package/dist/scalar.d.mts +49 -0
- package/dist/scalar.mjs +311 -0
- package/dist/silgi.d.mts +144 -0
- package/dist/silgi.mjs +164 -0
- package/dist/trpc-interop.d.mts +22 -0
- package/dist/trpc-interop.mjs +68 -0
- package/dist/types.d.mts +108 -0
- package/dist/ws.d.mts +88 -0
- package/dist/ws.mjs +205 -0
- package/lib/dashboard/index.html +120 -0
- package/lib/ocache.d.mts +1 -0
- package/lib/ocache.mjs +1 -0
- package/lib/ofetch.d.mts +1 -0
- package/lib/ofetch.mjs +1 -0
- package/lib/srvx.d.mts +1 -0
- package/lib/srvx.mjs +1 -0
- package/lib/unstorage.d.mts +1 -0
- package/lib/unstorage.mjs +1 -0
- package/package.json +313 -150
- package/dist/build.d.mts +0 -3
- package/dist/build.mjs +0 -4
- package/dist/cli/build/build.mjs +0 -15
- package/dist/cli/build/dev.d.mts +0 -10
- package/dist/cli/build/dev.mjs +0 -92
- package/dist/cli/build/prepare.d.mts +0 -6
- package/dist/cli/build/prepare.mjs +0 -15
- package/dist/cli/commands/commands.mjs +0 -90
- package/dist/cli/commands/env.mjs +0 -53
- package/dist/cli/commands/init.mjs +0 -84
- package/dist/cli/commands/install.mjs +0 -52
- package/dist/cli/commands/prepare.mjs +0 -65
- package/dist/cli/commands/reset.mjs +0 -46
- package/dist/cli/commands/run.mjs +0 -31
- package/dist/cli/commands/watch.mjs +0 -153
- package/dist/cli/config/defaults.mjs +0 -117
- package/dist/cli/config/index.d.mts +0 -3
- package/dist/cli/config/index.mjs +0 -4
- package/dist/cli/config/loader.d.mts +0 -6
- package/dist/cli/config/loader.mjs +0 -71
- package/dist/cli/config/resolvers/compatibility.mjs +0 -71
- package/dist/cli/config/resolvers/imports.mjs +0 -35
- package/dist/cli/config/resolvers/paths.mjs +0 -98
- package/dist/cli/config/resolvers/storage.mjs +0 -23
- package/dist/cli/config/resolvers/url.mjs +0 -9
- package/dist/cli/config/types.d.mts +0 -14
- package/dist/cli/config/types.mjs +0 -147
- package/dist/cli/core/apiful.mjs +0 -36
- package/dist/cli/core/devServer.mjs +0 -10
- package/dist/cli/core/env.mjs +0 -68
- package/dist/cli/core/installPackage.mjs +0 -60
- package/dist/cli/core/runtimeConfig.mjs +0 -70
- package/dist/cli/core/scan.mjs +0 -35
- package/dist/cli/core/silgi.mjs +0 -111
- package/dist/cli/framework/emptyFramework.mjs +0 -7
- package/dist/cli/framework/h3.mjs +0 -55
- package/dist/cli/framework/index.mjs +0 -15
- package/dist/cli/framework/nitro.mjs +0 -24
- package/dist/cli/framework/nuxt.mjs +0 -10
- package/dist/cli/index.d.mts +0 -1
- package/dist/cli/index.mjs +0 -29
- package/dist/cli/module/exportScan.mjs +0 -180
- package/dist/cli/module/install.mjs +0 -49
- package/dist/cli/module/scan.mjs +0 -193
- package/dist/cli/scan/prepareCommands.mjs +0 -40
- package/dist/cli/scan/prepareConfigs.mjs +0 -33
- package/dist/cli/scan/prepareCoreFile.mjs +0 -118
- package/dist/cli/scan/prepareScanFile.mjs +0 -59
- package/dist/cli/scan/prepareSchema.mjs +0 -128
- package/dist/cli/scan/scanExportFile.mjs +0 -288
- package/dist/cli/scan/writeCoreFile.mjs +0 -22
- package/dist/cli/scan/writeTypesAndFiles.mjs +0 -72
- package/dist/cli/utils/cancel.mjs +0 -14
- package/dist/cli/utils/common.mjs +0 -15
- package/dist/cli/utils/compatibility.mjs +0 -33
- package/dist/cli/utils/debug.mjs +0 -11
- package/dist/cli/utils/ignore.mjs +0 -56
- package/dist/cli/utils/processManager.mjs +0 -170
- package/dist/cli/utils/readScanFile.mjs +0 -58
- package/dist/cli/utils/storage.mjs +0 -23
- package/dist/core/context.d.mts +0 -30
- package/dist/core/context.mjs +0 -32
- package/dist/core/createSilgi.d.mts +0 -6
- package/dist/core/createSilgi.mjs +0 -153
- package/dist/core/event.d.mts +0 -26
- package/dist/core/event.mjs +0 -44
- package/dist/core/index.d.mts +0 -25
- package/dist/core/index.mjs +0 -30
- package/dist/core/orchestrate.mjs +0 -115
- package/dist/core/response.d.mts +0 -20
- package/dist/core/response.mjs +0 -105
- package/dist/core/silgi.d.mts +0 -19
- package/dist/core/silgi.mjs +0 -141
- package/dist/core/silgiApp.d.mts +0 -9
- package/dist/core/silgiApp.mjs +0 -23
- package/dist/core/unctx.d.mts +0 -21
- package/dist/core/unctx.mjs +0 -35
- package/dist/core/utils/event-stream.d.mts +0 -53
- package/dist/core/utils/event-stream.mjs +0 -38
- package/dist/core/utils/event.d.mts +0 -8
- package/dist/core/utils/event.mjs +0 -12
- package/dist/core/utils/internal/event-stream.d.mts +0 -45
- package/dist/core/utils/internal/event-stream.mjs +0 -137
- package/dist/core/utils/internal/obj.mjs +0 -9
- package/dist/core/utils/internal/object.mjs +0 -29
- package/dist/core/utils/internal/query.mjs +0 -73
- package/dist/core/utils/internal/req.mjs +0 -35
- package/dist/core/utils/merge.d.mts +0 -14
- package/dist/core/utils/merge.mjs +0 -27
- package/dist/core/utils/middleware.d.mts +0 -14
- package/dist/core/utils/middleware.mjs +0 -12
- package/dist/core/utils/request.mjs +0 -35
- package/dist/core/utils/resolver.d.mts +0 -7
- package/dist/core/utils/resolver.mjs +0 -29
- package/dist/core/utils/runtime.d.mts +0 -7
- package/dist/core/utils/runtime.mjs +0 -20
- package/dist/core/utils/sanitize.mjs +0 -22
- package/dist/core/utils/schema.d.mts +0 -34
- package/dist/core/utils/schema.mjs +0 -33
- package/dist/core/utils/service.d.mts +0 -13
- package/dist/core/utils/service.mjs +0 -19
- package/dist/core/utils/shared.d.mts +0 -6
- package/dist/core/utils/shared.mjs +0 -7
- package/dist/core/utils/storage.d.mts +0 -24
- package/dist/core/utils/storage.mjs +0 -54
- package/dist/kit/add/add-commands.d.mts +0 -6
- package/dist/kit/add/add-commands.mjs +0 -12
- package/dist/kit/add/add-core-file.d.mts +0 -9
- package/dist/kit/add/add-core-file.mjs +0 -11
- package/dist/kit/add/add-imports.d.mts +0 -14
- package/dist/kit/add/add-imports.mjs +0 -56
- package/dist/kit/add/add-npm.d.mts +0 -14
- package/dist/kit/add/add-npm.mjs +0 -23
- package/dist/kit/define.d.mts +0 -28
- package/dist/kit/define.mjs +0 -25
- package/dist/kit/errors.d.mts +0 -6
- package/dist/kit/errors.mjs +0 -11
- package/dist/kit/esm.d.mts +0 -11
- package/dist/kit/esm.mjs +0 -21
- package/dist/kit/fs.d.mts +0 -4
- package/dist/kit/fs.mjs +0 -13
- package/dist/kit/function-utils.d.mts +0 -27
- package/dist/kit/function-utils.mjs +0 -75
- package/dist/kit/gen.d.mts +0 -5
- package/dist/kit/gen.mjs +0 -26
- package/dist/kit/hash.d.mts +0 -4
- package/dist/kit/hash.mjs +0 -10
- package/dist/kit/index.d.mts +0 -22
- package/dist/kit/index.mjs +0 -23
- package/dist/kit/isFramework.d.mts +0 -6
- package/dist/kit/isFramework.mjs +0 -21
- package/dist/kit/logger.d.mts +0 -6
- package/dist/kit/logger.mjs +0 -10
- package/dist/kit/migration.d.mts +0 -113
- package/dist/kit/migration.mjs +0 -301
- package/dist/kit/module.d.mts +0 -14
- package/dist/kit/module.mjs +0 -53
- package/dist/kit/path.d.mts +0 -7
- package/dist/kit/path.mjs +0 -26
- package/dist/kit/preset.d.mts +0 -8
- package/dist/kit/preset.mjs +0 -11
- package/dist/kit/resolve.d.mts +0 -37
- package/dist/kit/resolve.mjs +0 -82
- package/dist/kit/template.d.mts +0 -19
- package/dist/kit/template.mjs +0 -91
- package/dist/kit/useRequest.d.mts +0 -19
- package/dist/kit/useRequest.mjs +0 -63
- package/dist/kit/utils.d.mts +0 -34
- package/dist/kit/utils.mjs +0 -91
- package/dist/package.mjs +0 -176
- package/dist/presets/_all.gen.d.mts +0 -6
- package/dist/presets/_all.gen.mjs +0 -18
- package/dist/presets/_resolve.d.mts +0 -12
- package/dist/presets/_resolve.mjs +0 -57
- package/dist/presets/_types.gen.d.mts +0 -8
- package/dist/presets/_types.gen.mjs +0 -5
- package/dist/presets/h3/preset.d.mts +0 -6
- package/dist/presets/h3/preset.mjs +0 -35
- package/dist/presets/hono/preset.d.mts +0 -6
- package/dist/presets/hono/preset.mjs +0 -30
- package/dist/presets/index.d.mts +0 -3
- package/dist/presets/index.mjs +0 -3
- package/dist/presets/nitro/preset.d.mts +0 -6
- package/dist/presets/nitro/preset.mjs +0 -37
- package/dist/presets/npmpackage/preset.d.mts +0 -6
- package/dist/presets/npmpackage/preset.mjs +0 -29
- package/dist/presets/nuxt/preset.d.mts +0 -6
- package/dist/presets/nuxt/preset.mjs +0 -41
- package/dist/runtime/index.d.mts +0 -4
- package/dist/runtime/index.mjs +0 -5
- package/dist/runtime/internal/config.d.mts +0 -11
- package/dist/runtime/internal/config.mjs +0 -97
- package/dist/runtime/internal/debug.d.mts +0 -6
- package/dist/runtime/internal/debug.mjs +0 -11
- package/dist/runtime/internal/defu.d.mts +0 -4
- package/dist/runtime/internal/defu.mjs +0 -9
- package/dist/runtime/internal/index.d.mts +0 -7
- package/dist/runtime/internal/index.mjs +0 -8
- package/dist/runtime/internal/nitro.d.mts +0 -6
- package/dist/runtime/internal/nitro.mjs +0 -36
- package/dist/runtime/internal/nuxt.d.mts +0 -12
- package/dist/runtime/internal/nuxt.mjs +0 -16
- package/dist/runtime/internal/ofetch.d.mts +0 -8
- package/dist/runtime/internal/ofetch.mjs +0 -39
- package/dist/runtime/internal/plugin.d.mts +0 -7
- package/dist/runtime/internal/plugin.mjs +0 -8
- package/dist/types/cliConfig.d.mts +0 -288
- package/dist/types/cliConfig.mjs +0 -0
- package/dist/types/cliHooks.d.mts +0 -142
- package/dist/types/cliHooks.mjs +0 -0
- package/dist/types/compatibility.d.mts +0 -13
- package/dist/types/compatibility.mjs +0 -0
- package/dist/types/config.d.mts +0 -46
- package/dist/types/config.mjs +0 -0
- package/dist/types/dotenv.d.mts +0 -29
- package/dist/types/dotenv.mjs +0 -0
- package/dist/types/event.d.mts +0 -63
- package/dist/types/event.mjs +0 -0
- package/dist/types/global.d.mts +0 -24
- package/dist/types/global.mjs +0 -0
- package/dist/types/helper.d.mts +0 -25
- package/dist/types/helper.mjs +0 -0
- package/dist/types/hooks.d.mts +0 -37
- package/dist/types/hooks.mjs +0 -0
- package/dist/types/index.d.mts +0 -26
- package/dist/types/index.mjs +0 -0
- package/dist/types/kits.d.mts +0 -32
- package/dist/types/kits.mjs +0 -0
- package/dist/types/middleware.d.mts +0 -31
- package/dist/types/middleware.mjs +0 -0
- package/dist/types/module.d.mts +0 -102
- package/dist/types/module.mjs +0 -0
- package/dist/types/preset.d.mts +0 -20
- package/dist/types/preset.mjs +0 -0
- package/dist/types/route.d.mts +0 -59
- package/dist/types/route.mjs +0 -0
- package/dist/types/runtime/index.d.mts +0 -5
- package/dist/types/runtime/index.mjs +0 -0
- package/dist/types/runtime/nuxt.d.mts +0 -13
- package/dist/types/runtime/nuxt.mjs +0 -0
- package/dist/types/runtime/ofetch.d.mts +0 -14
- package/dist/types/runtime/ofetch.mjs +0 -0
- package/dist/types/runtime/plugin.d.mts +0 -8
- package/dist/types/runtime/plugin.mjs +0 -0
- package/dist/types/runtime/silgi.d.mts +0 -11
- package/dist/types/runtime/silgi.mjs +0 -0
- package/dist/types/schema.d.mts +0 -86
- package/dist/types/schema.mjs +0 -0
- package/dist/types/service.d.mts +0 -102
- package/dist/types/service.mjs +0 -0
- package/dist/types/shared.d.mts +0 -19
- package/dist/types/shared.mjs +0 -0
- package/dist/types/silgi.d.mts +0 -71
- package/dist/types/silgi.mjs +0 -0
- package/dist/types/silgiCLI.d.mts +0 -118
- package/dist/types/silgiCLI.mjs +0 -0
- package/dist/types/standard-schema.d.mts +0 -61
- package/dist/types/standard-schema.mjs +0 -0
- package/dist/types/storage.d.mts +0 -30
- package/dist/types/storage.mjs +0 -0
- package/dist/types/tree-kill.d.mts +0 -18
- package/dist/types/tree-kill.mjs +0 -0
- package/lib/config.d.mts +0 -7
- package/lib/config.mjs +0 -5
- package/lib/meta.d.mts +0 -4
- package/lib/meta.mjs +0 -6
- package/lib/runtime-meta.d.mts +0 -4
- package/lib/runtime-meta.mjs +0 -32
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BrokerDriver } from "./index.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/broker/redis.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Minimal pub/sub transport — implement this for your Redis client.
|
|
6
|
+
*
|
|
7
|
+
* `subscribe` returns a cleanup function to unsubscribe.
|
|
8
|
+
* Both sync and async returns are supported.
|
|
9
|
+
*/
|
|
10
|
+
interface RedisTransport {
|
|
11
|
+
publish(channel: string, message: string): unknown;
|
|
12
|
+
subscribe(channel: string, handler: (message: string) => void): (() => void) | Promise<() => void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Minimal ioredis-compatible interface.
|
|
16
|
+
* Works with `ioredis` and any client that matches this shape.
|
|
17
|
+
*/
|
|
18
|
+
interface IORedisLike {
|
|
19
|
+
publish(channel: string, message: string): Promise<number>;
|
|
20
|
+
subscribe(...channels: string[]): Promise<unknown>;
|
|
21
|
+
unsubscribe(...channels: string[]): Promise<unknown>;
|
|
22
|
+
on(event: 'message', listener: (channel: string, message: string) => void): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a RedisTransport from two ioredis connections.
|
|
26
|
+
*
|
|
27
|
+
* Redis requires separate connections for publishing and subscribing
|
|
28
|
+
* because `SUBSCRIBE` puts the connection into subscriber mode.
|
|
29
|
+
*
|
|
30
|
+
* @param pub - Publisher connection (regular Redis client)
|
|
31
|
+
* @param sub - Subscriber connection (dedicated for SUBSCRIBE)
|
|
32
|
+
*/
|
|
33
|
+
declare function ioredisTransport(pub: IORedisLike, sub: IORedisLike): RedisTransport;
|
|
34
|
+
interface RedisBrokerOptions {
|
|
35
|
+
/** Unique prefix for inbox channels. Auto-generated if not provided. */
|
|
36
|
+
inbox?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create a Redis broker driver from a RedisTransport.
|
|
40
|
+
*
|
|
41
|
+
* Simulates request-reply using temporary inbox channels:
|
|
42
|
+
* 1. Client subscribes to a unique inbox channel
|
|
43
|
+
* 2. Client publishes request with inbox address embedded
|
|
44
|
+
* 3. Server processes request, publishes response to inbox
|
|
45
|
+
* 4. Client receives response, unsubscribes from inbox
|
|
46
|
+
*
|
|
47
|
+
* Wire format: `"inbox-channel\npayload"` (newline separator, no double-serialization)
|
|
48
|
+
*/
|
|
49
|
+
declare function redisBroker(transport: RedisTransport, options?: RedisBrokerOptions): BrokerDriver;
|
|
50
|
+
//#endregion
|
|
51
|
+
export { IORedisLike, RedisBrokerOptions, RedisTransport, ioredisTransport, redisBroker };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//#region src/broker/redis.ts
|
|
2
|
+
/**
|
|
3
|
+
* Create a RedisTransport from two ioredis connections.
|
|
4
|
+
*
|
|
5
|
+
* Redis requires separate connections for publishing and subscribing
|
|
6
|
+
* because `SUBSCRIBE` puts the connection into subscriber mode.
|
|
7
|
+
*
|
|
8
|
+
* @param pub - Publisher connection (regular Redis client)
|
|
9
|
+
* @param sub - Subscriber connection (dedicated for SUBSCRIBE)
|
|
10
|
+
*/
|
|
11
|
+
function ioredisTransport(pub, sub) {
|
|
12
|
+
const handlers = /* @__PURE__ */ new Map();
|
|
13
|
+
sub.on("message", (channel, message) => {
|
|
14
|
+
const set = handlers.get(channel);
|
|
15
|
+
if (set) for (const handler of set) handler(message);
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
publish(channel, message) {
|
|
19
|
+
return pub.publish(channel, message);
|
|
20
|
+
},
|
|
21
|
+
async subscribe(channel, handler) {
|
|
22
|
+
let set = handlers.get(channel);
|
|
23
|
+
if (!set) {
|
|
24
|
+
set = /* @__PURE__ */ new Set();
|
|
25
|
+
handlers.set(channel, set);
|
|
26
|
+
await sub.subscribe(channel);
|
|
27
|
+
}
|
|
28
|
+
set.add(handler);
|
|
29
|
+
return () => {
|
|
30
|
+
set.delete(handler);
|
|
31
|
+
if (set.size === 0) {
|
|
32
|
+
handlers.delete(channel);
|
|
33
|
+
sub.unsubscribe(channel);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
let globalSeq = 0;
|
|
40
|
+
/**
|
|
41
|
+
* Create a Redis broker driver from a RedisTransport.
|
|
42
|
+
*
|
|
43
|
+
* Simulates request-reply using temporary inbox channels:
|
|
44
|
+
* 1. Client subscribes to a unique inbox channel
|
|
45
|
+
* 2. Client publishes request with inbox address embedded
|
|
46
|
+
* 3. Server processes request, publishes response to inbox
|
|
47
|
+
* 4. Client receives response, unsubscribes from inbox
|
|
48
|
+
*
|
|
49
|
+
* Wire format: `"inbox-channel\npayload"` (newline separator, no double-serialization)
|
|
50
|
+
*/
|
|
51
|
+
function redisBroker(transport, options = {}) {
|
|
52
|
+
const inboxPrefix = options.inbox ?? `silgi:inbox:${Date.now().toString(36)}:${(++globalSeq).toString(36)}`;
|
|
53
|
+
let requestSeq = 0;
|
|
54
|
+
return {
|
|
55
|
+
async subscribe(subject, handler) {
|
|
56
|
+
return transport.subscribe(subject, (message) => {
|
|
57
|
+
const sep = message.indexOf("\n");
|
|
58
|
+
if (sep === -1) return;
|
|
59
|
+
const replyTo = message.slice(0, sep);
|
|
60
|
+
handler(message.slice(sep + 1), (response) => {
|
|
61
|
+
transport.publish(replyTo, response);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
async request(subject, payload, opts) {
|
|
66
|
+
const inbox = `${inboxPrefix}:${++requestSeq}`;
|
|
67
|
+
const timeout = opts?.timeout ?? 1e4;
|
|
68
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
69
|
+
let cleanup;
|
|
70
|
+
const timer = setTimeout(() => {
|
|
71
|
+
cleanup?.();
|
|
72
|
+
reject(/* @__PURE__ */ new Error(`Broker request timeout: ${subject}`));
|
|
73
|
+
}, timeout);
|
|
74
|
+
try {
|
|
75
|
+
const unsub = await transport.subscribe(inbox, (message) => {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
cleanup?.();
|
|
78
|
+
resolve(message);
|
|
79
|
+
});
|
|
80
|
+
cleanup = typeof unsub === "function" ? unsub : void 0;
|
|
81
|
+
await transport.publish(subject, inbox + "\n" + payload);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
cleanup?.();
|
|
85
|
+
reject(err);
|
|
86
|
+
}
|
|
87
|
+
return promise;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { ioredisTransport, redisBroker };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { AnySchema, InferSchemaInput, InferSchemaOutput } from "./core/schema.mjs";
|
|
2
|
+
import { TaskDef, TaskEvent } from "./core/task.mjs";
|
|
3
|
+
import { ErrorDef, GuardDef, Meta, ProcedureDef, ProcedureType, ResolveContext, Route, WrapDef } from "./types.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/builder.d.ts
|
|
6
|
+
/** Initial builder — no input, no output, no errors yet */
|
|
7
|
+
interface ProcedureBuilder<TType extends ProcedureType, TBaseCtx extends Record<string, unknown>, TCtx extends Record<string, unknown> = TBaseCtx, TInput = undefined, TErrors extends ErrorDef = {}> {
|
|
8
|
+
/** Add a guard — enriches context with guard return type */
|
|
9
|
+
$use<TReturn extends Record<string, unknown> | void, TGErrors extends ErrorDef = {}>(guard: GuardDef<any, TReturn, TGErrors>): ProcedureBuilder<TType, TBaseCtx, TReturn extends Record<string, unknown> ? TCtx & TReturn : TCtx, TInput, TGErrors & TErrors>;
|
|
10
|
+
/** Add a wrap middleware — does not change context type */
|
|
11
|
+
$use(wrap: WrapDef<any>): ProcedureBuilder<TType, TBaseCtx, TCtx, TInput, TErrors>;
|
|
12
|
+
/** Set input schema */
|
|
13
|
+
$input<TSchema extends AnySchema>(schema: TSchema): ProcedureBuilder<TType, TBaseCtx, TCtx, InferSchemaOutput<TSchema>, TErrors>;
|
|
14
|
+
/** Set output schema — enables return type autocomplete */
|
|
15
|
+
$output<TSchema extends AnySchema>(schema: TSchema): ProcedureBuilderWithOutput<TType, TBaseCtx, TCtx, TInput, InferSchemaInput<TSchema>, TErrors>;
|
|
16
|
+
/** Set typed errors */
|
|
17
|
+
$errors<TNewErrors extends ErrorDef>(errors: TNewErrors): ProcedureBuilder<TType, TBaseCtx, TCtx, TInput, TNewErrors & TErrors>;
|
|
18
|
+
/** Set route metadata */
|
|
19
|
+
$route(route: Route): ProcedureBuilder<TType, TBaseCtx, TCtx, TInput, TErrors>;
|
|
20
|
+
/** Set custom metadata */
|
|
21
|
+
$meta(meta: Meta): ProcedureBuilder<TType, TBaseCtx, TCtx, TInput, TErrors>;
|
|
22
|
+
/** Resolve — freely inferred return type (no output schema) */
|
|
23
|
+
$resolve<TOutput>(fn: TType extends 'subscription' ? (opts: ResolveContext<TCtx, TInput, TErrors>) => AsyncIterableIterator<TOutput> : (opts: ResolveContext<TCtx, TInput, TErrors>) => Promise<TOutput> | TOutput): ProcedureDef<TType, TInput, TOutput, TErrors>;
|
|
24
|
+
/** Create a background task — guards, input, errors all apply */
|
|
25
|
+
$task<TOutput>(config: {
|
|
26
|
+
name: string;
|
|
27
|
+
cron?: string;
|
|
28
|
+
description?: string;
|
|
29
|
+
resolve: (event: TaskEvent<TInput, TCtx>) => Promise<TOutput> | TOutput;
|
|
30
|
+
}): TaskDef<TInput, TOutput>;
|
|
31
|
+
}
|
|
32
|
+
/** Builder after .$output() — return type is constrained for autocomplete */
|
|
33
|
+
interface ProcedureBuilderWithOutput<TType extends ProcedureType, TBaseCtx extends Record<string, unknown>, TCtx extends Record<string, unknown>, TInput, TOutputResolved, TErrors extends ErrorDef> {
|
|
34
|
+
/** Add a guard — enriches context with guard return type */
|
|
35
|
+
$use<TReturn extends Record<string, unknown> | void, TGErrors extends ErrorDef = {}>(guard: GuardDef<any, TReturn, TGErrors>): ProcedureBuilderWithOutput<TType, TBaseCtx, TReturn extends Record<string, unknown> ? TCtx & TReturn : TCtx, TInput, TOutputResolved, TGErrors & TErrors>;
|
|
36
|
+
/** Add a wrap middleware — does not change context type */
|
|
37
|
+
$use(wrap: WrapDef<any>): ProcedureBuilderWithOutput<TType, TBaseCtx, TCtx, TInput, TOutputResolved, TErrors>;
|
|
38
|
+
/** Set typed errors */
|
|
39
|
+
$errors<TNewErrors extends ErrorDef>(errors: TNewErrors): ProcedureBuilderWithOutput<TType, TBaseCtx, TCtx, TInput, TOutputResolved, TNewErrors & TErrors>;
|
|
40
|
+
/** Set route metadata */
|
|
41
|
+
$route(route: Route): ProcedureBuilderWithOutput<TType, TBaseCtx, TCtx, TInput, TOutputResolved, TErrors>;
|
|
42
|
+
/** Set custom metadata */
|
|
43
|
+
$meta(meta: Meta): ProcedureBuilderWithOutput<TType, TBaseCtx, TCtx, TInput, TOutputResolved, TErrors>;
|
|
44
|
+
/** Resolve — return type constrained to output schema (autocomplete works) */
|
|
45
|
+
$resolve(fn: TType extends 'subscription' ? (opts: ResolveContext<TCtx, TInput, TErrors>) => AsyncIterableIterator<TOutputResolved> : (opts: ResolveContext<TCtx, TInput, TErrors>) => Promise<TOutputResolved> | TOutputResolved): ProcedureDef<TType, TInput, TOutputResolved, TErrors>;
|
|
46
|
+
/** Create a background task — guards, input, output, errors all apply */
|
|
47
|
+
$task(config: {
|
|
48
|
+
name: string;
|
|
49
|
+
cron?: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
resolve: (event: TaskEvent<TInput, TCtx>) => Promise<TOutputResolved> | TOutputResolved;
|
|
52
|
+
}): TaskDef<TInput, TOutputResolved>;
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
export { ProcedureBuilder, ProcedureBuilderWithOutput };
|
package/dist/builder.mjs
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createTaskFromProcedure } from "./core/task.mjs";
|
|
2
|
+
//#region src/builder.ts
|
|
3
|
+
/**
|
|
4
|
+
* Procedure Builder — chainable $-prefixed API with IDE autocomplete.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* const p = k
|
|
9
|
+
* .$input(inputSchema)
|
|
10
|
+
* .$output(PostSchema)
|
|
11
|
+
* .$resolve(() => ({ id: 1, title: 'hi', body: 'x' }))
|
|
12
|
+
* // ← autocomplete suggests id, title, body
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
var ProcBuilder = class {
|
|
16
|
+
type;
|
|
17
|
+
input = null;
|
|
18
|
+
output = null;
|
|
19
|
+
errors = null;
|
|
20
|
+
use = null;
|
|
21
|
+
resolve = null;
|
|
22
|
+
route = null;
|
|
23
|
+
meta = null;
|
|
24
|
+
_contextFactory = null;
|
|
25
|
+
constructor(type) {
|
|
26
|
+
this.type = type;
|
|
27
|
+
}
|
|
28
|
+
$use(...middleware) {
|
|
29
|
+
if (this.use) this.use.push(...middleware);
|
|
30
|
+
else this.use = [...middleware];
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
$input(schema) {
|
|
34
|
+
this.input = schema;
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
$output(schema) {
|
|
38
|
+
this.output = schema;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
$errors(errors) {
|
|
42
|
+
this.errors = this.errors ? {
|
|
43
|
+
...this.errors,
|
|
44
|
+
...errors
|
|
45
|
+
} : errors;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
$route(route) {
|
|
49
|
+
this.route = route;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
$meta(meta) {
|
|
53
|
+
this.meta = meta;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
$resolve(fn) {
|
|
57
|
+
this.resolve = fn;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
$task(config) {
|
|
61
|
+
return createTaskFromProcedure(config, config.resolve, this.input, this.use, this._contextFactory);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
function createProcedureBuilder(type, contextFactory) {
|
|
65
|
+
const b = new ProcBuilder(type);
|
|
66
|
+
if (contextFactory) b._contextFactory = contextFactory;
|
|
67
|
+
return b;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { createProcedureBuilder };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ErrorDef, ProcedureDef } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/callable.d.ts
|
|
4
|
+
interface CallableOptions<TCtx extends Record<string, unknown>> {
|
|
5
|
+
/** Context factory — called on every invocation */
|
|
6
|
+
context: () => TCtx | Promise<TCtx>;
|
|
7
|
+
/** Default timeout in ms. Default: 30000. Set null to disable. */
|
|
8
|
+
timeout?: number | null;
|
|
9
|
+
}
|
|
10
|
+
type CallableFn<TInput, TOutput> = undefined extends TInput ? (input?: TInput) => Promise<TOutput> : (input: TInput) => Promise<TOutput>;
|
|
11
|
+
/**
|
|
12
|
+
* Convert a ProcedureDef into a directly callable async function.
|
|
13
|
+
*
|
|
14
|
+
* Compiles the full pipeline (guards, wraps, validation) once,
|
|
15
|
+
* then each call runs the compiled handler directly — no HTTP overhead.
|
|
16
|
+
*/
|
|
17
|
+
declare function callable<TInput, TOutput, TErrors extends ErrorDef, TCtx extends Record<string, unknown>>(procedure: ProcedureDef<any, TInput, TOutput, TErrors>, options: CallableOptions<TCtx>): CallableFn<TInput, TOutput>;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { CallableOptions, callable };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { compileProcedure } from "./compile.mjs";
|
|
2
|
+
import { applyContext } from "./core/dispatch.mjs";
|
|
3
|
+
//#region src/callable.ts
|
|
4
|
+
/**
|
|
5
|
+
* callable() — turn a procedure into a directly invocable function.
|
|
6
|
+
*
|
|
7
|
+
* Useful for server-side code where you want to call a procedure
|
|
8
|
+
* without going through HTTP or the client proxy.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const getUsers = k
|
|
13
|
+
* .$input(z.object({ limit: z.number() }))
|
|
14
|
+
* .$resolve(({ input, ctx }) => ctx.db.users.findMany({ take: input.limit }))
|
|
15
|
+
*
|
|
16
|
+
* const fn = callable(getUsers, {
|
|
17
|
+
* context: () => ({ db: getDB() }),
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* // Call it directly — no HTTP, no serialization
|
|
21
|
+
* const users = await fn({ limit: 10 })
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Convert a ProcedureDef into a directly callable async function.
|
|
26
|
+
*
|
|
27
|
+
* Compiles the full pipeline (guards, wraps, validation) once,
|
|
28
|
+
* then each call runs the compiled handler directly — no HTTP overhead.
|
|
29
|
+
*/
|
|
30
|
+
function callable(procedure, options) {
|
|
31
|
+
const handler = compileProcedure(procedure);
|
|
32
|
+
const contextFactory = options.context;
|
|
33
|
+
const defaultTimeout = options.timeout !== void 0 ? options.timeout : 3e4;
|
|
34
|
+
return (async (input) => {
|
|
35
|
+
const ctx = await contextFactory();
|
|
36
|
+
const ctxObj = Object.create(null);
|
|
37
|
+
applyContext(ctxObj, ctx);
|
|
38
|
+
return handler(ctxObj, input, defaultTimeout !== null ? AbortSignal.timeout(defaultTimeout) : new AbortController().signal);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { callable };
|
package/dist/caller.mjs
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { routerCache } from "./core/router-utils.mjs";
|
|
2
|
+
import { compileRouter, createContext, releaseContext } from "./compile.mjs";
|
|
3
|
+
import { applyContext } from "./core/dispatch.mjs";
|
|
4
|
+
//#region src/caller.ts
|
|
5
|
+
/**
|
|
6
|
+
* createCaller — call procedures directly without HTTP.
|
|
7
|
+
*
|
|
8
|
+
* Compiles the router, creates context, and runs the pipeline
|
|
9
|
+
* for each procedure call. Perfect for testing and server-side usage.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const caller = s.createCaller(appRouter)
|
|
14
|
+
*
|
|
15
|
+
* // Call procedures directly
|
|
16
|
+
* const users = await caller.users.list({ limit: 10 })
|
|
17
|
+
* const user = await caller.users.get({ id: 1 })
|
|
18
|
+
*
|
|
19
|
+
* // With custom context override
|
|
20
|
+
* const adminCaller = s.createCaller(appRouter, {
|
|
21
|
+
* contextOverride: { user: { id: 1, role: 'admin' } },
|
|
22
|
+
* })
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Create a direct caller for a router — no HTTP, no serialization.
|
|
27
|
+
*
|
|
28
|
+
* Returns a proxy that mirrors the router's nested structure.
|
|
29
|
+
* Calling a leaf procedure invokes the compiled pipeline directly.
|
|
30
|
+
*/
|
|
31
|
+
function createCaller(routerDef, contextFactory, options) {
|
|
32
|
+
let compiledRouter = routerCache.get(routerDef);
|
|
33
|
+
if (!compiledRouter) {
|
|
34
|
+
compiledRouter = compileRouter(routerDef);
|
|
35
|
+
routerCache.set(routerDef, compiledRouter);
|
|
36
|
+
}
|
|
37
|
+
const router = compiledRouter;
|
|
38
|
+
const defaultTimeout = options?.timeout !== void 0 ? options.timeout : 3e4;
|
|
39
|
+
function createMockRequest(extraHeaders) {
|
|
40
|
+
const headers = new Headers(options?.headers);
|
|
41
|
+
if (extraHeaders) for (const [k, v] of Object.entries(extraHeaders)) headers.set(k, v);
|
|
42
|
+
return new Request("http://localhost/__caller", { headers });
|
|
43
|
+
}
|
|
44
|
+
async function resolveContext(perCallContext) {
|
|
45
|
+
const ctx = createContext();
|
|
46
|
+
if (contextFactory) {
|
|
47
|
+
const result = contextFactory(createMockRequest());
|
|
48
|
+
applyContext(ctx, result instanceof Promise ? await result : result);
|
|
49
|
+
}
|
|
50
|
+
if (options?.contextOverride) applyContext(ctx, options.contextOverride);
|
|
51
|
+
if (perCallContext) applyContext(ctx, perCallContext);
|
|
52
|
+
return ctx;
|
|
53
|
+
}
|
|
54
|
+
function createProxy(segments) {
|
|
55
|
+
const cache = /* @__PURE__ */ new Map();
|
|
56
|
+
return new Proxy(() => {}, {
|
|
57
|
+
get(_target, prop) {
|
|
58
|
+
if (typeof prop === "symbol") return void 0;
|
|
59
|
+
if (prop === "then" || prop === "toJSON" || prop === "toString" || prop === "$$typeof") return;
|
|
60
|
+
let sub = cache.get(prop);
|
|
61
|
+
if (!sub) {
|
|
62
|
+
sub = createProxy([...segments, prop]);
|
|
63
|
+
cache.set(prop, sub);
|
|
64
|
+
}
|
|
65
|
+
return sub;
|
|
66
|
+
},
|
|
67
|
+
apply(_target, _thisArg, args) {
|
|
68
|
+
const path = "/" + segments.join("/");
|
|
69
|
+
const input = args[0];
|
|
70
|
+
const callOptions = args[1];
|
|
71
|
+
return (async () => {
|
|
72
|
+
const match = router("", path);
|
|
73
|
+
if (!match) throw new Error(`Procedure not found: ${path}`);
|
|
74
|
+
const ctx = await resolveContext(callOptions?.context);
|
|
75
|
+
if (match.params) ctx.params = match.params;
|
|
76
|
+
const signal = callOptions?.signal ?? (defaultTimeout !== null ? AbortSignal.timeout(defaultTimeout) : void 0);
|
|
77
|
+
try {
|
|
78
|
+
const result = match.data.handler(ctx, input, signal);
|
|
79
|
+
return result instanceof Promise ? await result : result;
|
|
80
|
+
} finally {
|
|
81
|
+
releaseContext(ctx);
|
|
82
|
+
}
|
|
83
|
+
})();
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return createProxy([]);
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { createCaller };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "../../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/adapters/fetch/index.d.ts
|
|
4
|
+
interface RPCLinkOptions<TClientContext extends ClientContext = ClientContext> {
|
|
5
|
+
url: string | URL;
|
|
6
|
+
headers?: Record<string, string> | ((options: ClientOptions<TClientContext>) => Record<string, string>);
|
|
7
|
+
fetch?: typeof globalThis.fetch;
|
|
8
|
+
}
|
|
9
|
+
declare class RPCLink<TClientContext extends ClientContext = ClientContext> implements ClientLink<TClientContext> {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(options: RPCLinkOptions<TClientContext>);
|
|
12
|
+
call(path: readonly string[], input: unknown, options: ClientOptions<TClientContext>): Promise<unknown>;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { RPCLink, RPCLinkOptions };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SilgiError, fromSilgiErrorJSON, isErrorStatus, isSilgiErrorJSON } from "../../../core/error.mjs";
|
|
2
|
+
import { parseEmptyableJSON, stringifyJSON } from "../../../core/utils.mjs";
|
|
3
|
+
//#region src/client/adapters/fetch/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* Fetch transport — HTTP client for browser and Node.js.
|
|
6
|
+
*/
|
|
7
|
+
var RPCLink = class {
|
|
8
|
+
#baseUrl;
|
|
9
|
+
#headers;
|
|
10
|
+
#fetch;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.#baseUrl = typeof options.url === "string" ? options.url : options.url.href;
|
|
13
|
+
if (this.#baseUrl.endsWith("/")) this.#baseUrl = this.#baseUrl.slice(0, -1);
|
|
14
|
+
this.#headers = options.headers;
|
|
15
|
+
this.#fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
16
|
+
}
|
|
17
|
+
async call(path, input, options) {
|
|
18
|
+
const url = `${this.#baseUrl}/${path.map(encodeURIComponent).join("/")}`;
|
|
19
|
+
const headers = { ...typeof this.#headers === "function" ? this.#headers(options) : this.#headers };
|
|
20
|
+
let body;
|
|
21
|
+
if (input !== void 0 && input !== null) {
|
|
22
|
+
headers["content-type"] = "application/json";
|
|
23
|
+
body = stringifyJSON(input);
|
|
24
|
+
}
|
|
25
|
+
const response = await this.#fetch(url, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers,
|
|
28
|
+
body,
|
|
29
|
+
signal: options.signal
|
|
30
|
+
});
|
|
31
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
32
|
+
let responseBody;
|
|
33
|
+
if (contentType.includes("msgpack")) {
|
|
34
|
+
const { decode } = await import("../../../codec/msgpack.mjs");
|
|
35
|
+
const buf = new Uint8Array(await response.arrayBuffer());
|
|
36
|
+
responseBody = buf.length > 0 ? decode(buf) : void 0;
|
|
37
|
+
} else if (contentType.includes("x-devalue")) {
|
|
38
|
+
const { decode } = await import("../../../codec/devalue.mjs");
|
|
39
|
+
const text = await response.text();
|
|
40
|
+
responseBody = text ? decode(text) : void 0;
|
|
41
|
+
} else {
|
|
42
|
+
const responseText = await response.text();
|
|
43
|
+
responseBody = responseText ? parseEmptyableJSON(responseText) : void 0;
|
|
44
|
+
}
|
|
45
|
+
if (isErrorStatus(response.status)) {
|
|
46
|
+
if (isSilgiErrorJSON(responseBody)) throw fromSilgiErrorJSON(responseBody);
|
|
47
|
+
throw new SilgiError("INTERNAL_SERVER_ERROR", {
|
|
48
|
+
status: response.status,
|
|
49
|
+
message: `HTTP ${response.status}`,
|
|
50
|
+
data: responseBody
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
return responseBody;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { RPCLink };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "../../types.mjs";
|
|
2
|
+
import { FetchContext, FetchOptions } from "ofetch";
|
|
3
|
+
|
|
4
|
+
//#region src/client/adapters/ofetch/index.d.ts
|
|
5
|
+
interface LinkOptions<TClientContext extends ClientContext = ClientContext> {
|
|
6
|
+
/** Server base URL (e.g. "http://localhost:3000") */
|
|
7
|
+
url: string;
|
|
8
|
+
/** Static headers or dynamic header factory */
|
|
9
|
+
headers?: Record<string, string> | ((options: ClientOptions<TClientContext>) => Record<string, string>);
|
|
10
|
+
/** Retry count for failed requests (default: 1 for queries, 0 for mutations) */
|
|
11
|
+
retry?: number | false;
|
|
12
|
+
/** Retry delay in ms, or function for backoff (default: 0) */
|
|
13
|
+
retryDelay?: number | ((ctx: FetchContext) => number);
|
|
14
|
+
/** Timeout in ms (default: 30000) */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Wire protocol for request/response encoding.
|
|
18
|
+
*
|
|
19
|
+
* - `'json'` — default, standard JSON
|
|
20
|
+
* - `'messagepack'` — 2-4x faster, ~50% smaller payloads
|
|
21
|
+
* - `'devalue'` — preserves Date, Map, Set, BigInt, circular refs
|
|
22
|
+
*
|
|
23
|
+
* @default 'json'
|
|
24
|
+
*/
|
|
25
|
+
protocol?: 'json' | 'messagepack' | 'devalue';
|
|
26
|
+
/**
|
|
27
|
+
* @deprecated Use `protocol: 'messagepack'` instead.
|
|
28
|
+
*/
|
|
29
|
+
binary?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* @deprecated Use `protocol: 'devalue'` instead.
|
|
32
|
+
*/
|
|
33
|
+
devalue?: boolean;
|
|
34
|
+
/** ofetch interceptors */
|
|
35
|
+
onRequest?: FetchOptions['onRequest'];
|
|
36
|
+
onResponse?: FetchOptions['onResponse'];
|
|
37
|
+
onRequestError?: FetchOptions['onRequestError'];
|
|
38
|
+
onResponseError?: FetchOptions['onResponseError'];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a Silgi client link powered by ofetch.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* import { createClient } from "silgi/client"
|
|
46
|
+
* import { createLink } from "silgi/client/ofetch"
|
|
47
|
+
*
|
|
48
|
+
* const link = createLink({ url: "http://localhost:3000" })
|
|
49
|
+
* const client = createClient<AppRouter>(link)
|
|
50
|
+
* const users = await client.users.list({ limit: 10 })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
declare function createLink<TClientContext extends ClientContext = ClientContext>(options: LinkOptions<TClientContext>): ClientLink<TClientContext>;
|
|
54
|
+
//#endregion
|
|
55
|
+
export { LinkOptions, createLink };
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { SilgiError, fromSilgiErrorJSON, isSilgiErrorJSON } from "../../../core/error.mjs";
|
|
2
|
+
import { MSGPACK_CONTENT_TYPE, decode, encode } from "../../../codec/msgpack.mjs";
|
|
3
|
+
import { FetchError, ofetch } from "ofetch";
|
|
4
|
+
//#region src/client/adapters/ofetch/index.ts
|
|
5
|
+
/**
|
|
6
|
+
* ofetch-based RPC transport — v2 client link.
|
|
7
|
+
*
|
|
8
|
+
* Uses ofetch for: retry, timeout, interceptors, auto-JSON.
|
|
9
|
+
* Replaces manual fetch + retry/dedupe plugins with a single link.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Create a Silgi client link powered by ofetch.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { createClient } from "silgi/client"
|
|
17
|
+
* import { createLink } from "silgi/client/ofetch"
|
|
18
|
+
*
|
|
19
|
+
* const link = createLink({ url: "http://localhost:3000" })
|
|
20
|
+
* const client = createClient<AppRouter>(link)
|
|
21
|
+
* const users = await client.users.list({ limit: 10 })
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
function createLink(options) {
|
|
25
|
+
const baseUrl = options.url.endsWith("/") ? options.url.slice(0, -1) : options.url;
|
|
26
|
+
const defaultTimeout = options.timeout ?? 3e4;
|
|
27
|
+
const defaultRetry = options.retry;
|
|
28
|
+
const defaultRetryDelay = options.retryDelay ?? 0;
|
|
29
|
+
const resolvedProtocol = options.protocol ?? (options.binary ? "messagepack" : void 0) ?? (options.devalue ? "devalue" : void 0) ?? "json";
|
|
30
|
+
return { async call(path, input, callOptions) {
|
|
31
|
+
const url = `${baseUrl}/${path.map(encodeURIComponent).join("/")}`;
|
|
32
|
+
const headers = { ...typeof options.headers === "function" ? options.headers(callOptions) : options.headers };
|
|
33
|
+
let body;
|
|
34
|
+
if (resolvedProtocol === "messagepack") {
|
|
35
|
+
headers["content-type"] = MSGPACK_CONTENT_TYPE;
|
|
36
|
+
headers["accept"] = MSGPACK_CONTENT_TYPE;
|
|
37
|
+
body = input !== void 0 && input !== null ? encode(input) : void 0;
|
|
38
|
+
} else if (resolvedProtocol === "devalue") {
|
|
39
|
+
const { encode: devalueEncode, DEVALUE_CONTENT_TYPE } = await import("../../../codec/devalue.mjs");
|
|
40
|
+
headers["content-type"] = DEVALUE_CONTENT_TYPE;
|
|
41
|
+
headers["accept"] = DEVALUE_CONTENT_TYPE;
|
|
42
|
+
body = input !== void 0 && input !== null ? devalueEncode(input) : void 0;
|
|
43
|
+
} else body = input !== void 0 && input !== null ? input : void 0;
|
|
44
|
+
try {
|
|
45
|
+
const data = await ofetch(url, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
headers,
|
|
48
|
+
body,
|
|
49
|
+
signal: callOptions.signal,
|
|
50
|
+
timeout: defaultTimeout,
|
|
51
|
+
retry: defaultRetry ?? 0,
|
|
52
|
+
retryDelay: defaultRetryDelay,
|
|
53
|
+
ignoreResponseError: true,
|
|
54
|
+
onRequest: options.onRequest,
|
|
55
|
+
onResponse: options.onResponse,
|
|
56
|
+
onRequestError: options.onRequestError,
|
|
57
|
+
onResponseError: options.onResponseError,
|
|
58
|
+
...resolvedProtocol === "messagepack" ? { responseType: "arrayBuffer" } : resolvedProtocol === "devalue" ? { responseType: "text" } : { parseResponse(text) {
|
|
59
|
+
if (!text) return void 0;
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(text);
|
|
62
|
+
} catch {
|
|
63
|
+
return text;
|
|
64
|
+
}
|
|
65
|
+
} }
|
|
66
|
+
});
|
|
67
|
+
let decoded;
|
|
68
|
+
if (resolvedProtocol === "messagepack") decoded = decode(new Uint8Array(data));
|
|
69
|
+
else if (resolvedProtocol === "devalue") {
|
|
70
|
+
const { decode: devalueDecode } = await import("../../../codec/devalue.mjs");
|
|
71
|
+
decoded = data ? devalueDecode(data) : void 0;
|
|
72
|
+
} else decoded = data;
|
|
73
|
+
if (isSilgiErrorJSON(decoded)) throw fromSilgiErrorJSON(decoded);
|
|
74
|
+
return decoded;
|
|
75
|
+
} catch (error) {
|
|
76
|
+
if (error instanceof SilgiError) throw error;
|
|
77
|
+
if (error instanceof FetchError) {
|
|
78
|
+
const responseData = error.data;
|
|
79
|
+
if (isSilgiErrorJSON(responseData)) throw fromSilgiErrorJSON(responseData);
|
|
80
|
+
throw new SilgiError("INTERNAL_SERVER_ERROR", {
|
|
81
|
+
status: error.status ?? 500,
|
|
82
|
+
message: error.message,
|
|
83
|
+
data: responseData
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
} };
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { createLink };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "../../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/adapters/websocket/index.d.ts
|
|
4
|
+
interface WSLinkOptions {
|
|
5
|
+
/** WebSocket URL (e.g. 'ws://localhost:3000/ws') */
|
|
6
|
+
url: string | URL;
|
|
7
|
+
/** Wire protocol (default: 'json') */
|
|
8
|
+
protocol?: 'json' | 'messagepack';
|
|
9
|
+
/** Custom WebSocket constructor (default: globalThis.WebSocket) */
|
|
10
|
+
WebSocket?: typeof globalThis.WebSocket;
|
|
11
|
+
}
|
|
12
|
+
declare class WSLink<TClientContext extends ClientContext = ClientContext> implements ClientLink<TClientContext> {
|
|
13
|
+
#private;
|
|
14
|
+
constructor(options: WSLinkOptions);
|
|
15
|
+
call(path: readonly string[], input: unknown, options: ClientOptions<TClientContext>): Promise<unknown>;
|
|
16
|
+
/** Close the WebSocket connection and reject all pending calls */
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { WSLink, WSLinkOptions };
|