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,101 @@
|
|
|
1
|
+
import { SilgiError } from "../../../core/error.mjs";
|
|
2
|
+
//#region src/client/adapters/websocket/index.ts
|
|
3
|
+
/**
|
|
4
|
+
* WebSocket client link — bidirectional RPC over WebSocket.
|
|
5
|
+
*
|
|
6
|
+
* Uses the same wire protocol as the server-side ws.ts adapter:
|
|
7
|
+
* Client → Server: { id: string, path: string, input?: unknown }
|
|
8
|
+
* Server → Client: { id: string, result?: unknown, error?: unknown }
|
|
9
|
+
* Server → Client (stream): { id: string, data: unknown, done?: boolean }
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { WSLink } from 'silgi/client/ws'
|
|
14
|
+
*
|
|
15
|
+
* const link = new WSLink({ url: 'ws://localhost:3000/ws' })
|
|
16
|
+
* const client = createClient<AppRouter>(link)
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
var WSLink = class {
|
|
20
|
+
#url;
|
|
21
|
+
#WebSocket;
|
|
22
|
+
#ws;
|
|
23
|
+
#pending = /* @__PURE__ */ new Map();
|
|
24
|
+
#nextId = 0;
|
|
25
|
+
#connecting;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.#url = typeof options.url === "string" ? options.url : options.url.href;
|
|
28
|
+
this.#WebSocket = options.WebSocket ?? globalThis.WebSocket;
|
|
29
|
+
}
|
|
30
|
+
async call(path, input, options) {
|
|
31
|
+
await this.#ensureConnected();
|
|
32
|
+
const id = String(this.#nextId++);
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
this.#pending.set(id, {
|
|
35
|
+
resolve,
|
|
36
|
+
reject
|
|
37
|
+
});
|
|
38
|
+
options.signal?.addEventListener("abort", () => {
|
|
39
|
+
this.#pending.delete(id);
|
|
40
|
+
reject(new DOMException("Aborted", "AbortError"));
|
|
41
|
+
}, { once: true });
|
|
42
|
+
const msg = {
|
|
43
|
+
id,
|
|
44
|
+
path: path.join("/"),
|
|
45
|
+
input
|
|
46
|
+
};
|
|
47
|
+
this.#ws.send(JSON.stringify(msg));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
#ensureConnected() {
|
|
51
|
+
if (this.#ws?.readyState === WebSocket.OPEN) return Promise.resolve();
|
|
52
|
+
if (this.#connecting) return this.#connecting;
|
|
53
|
+
this.#connecting = new Promise((resolve, reject) => {
|
|
54
|
+
const ws = new this.#WebSocket(this.#url);
|
|
55
|
+
ws.binaryType = "arraybuffer";
|
|
56
|
+
ws.addEventListener("open", () => {
|
|
57
|
+
this.#ws = ws;
|
|
58
|
+
this.#connecting = void 0;
|
|
59
|
+
resolve();
|
|
60
|
+
});
|
|
61
|
+
ws.addEventListener("error", () => {
|
|
62
|
+
this.#connecting = void 0;
|
|
63
|
+
reject(new SilgiError("INTERNAL_SERVER_ERROR", { message: "WebSocket connection failed" }));
|
|
64
|
+
});
|
|
65
|
+
ws.addEventListener("message", (event) => {
|
|
66
|
+
const msg = JSON.parse(typeof event.data === "string" ? event.data : new TextDecoder().decode(event.data));
|
|
67
|
+
const pending = this.#pending.get(msg.id);
|
|
68
|
+
if (!pending) return;
|
|
69
|
+
if (msg.error) {
|
|
70
|
+
this.#pending.delete(msg.id);
|
|
71
|
+
const err = msg.error;
|
|
72
|
+
pending.reject(new SilgiError(err.code ?? "INTERNAL_SERVER_ERROR", {
|
|
73
|
+
status: err.status,
|
|
74
|
+
message: err.message,
|
|
75
|
+
data: err.data
|
|
76
|
+
}));
|
|
77
|
+
} else if (msg.done) {
|
|
78
|
+
this.#pending.delete(msg.id);
|
|
79
|
+
pending.resolve(msg.data);
|
|
80
|
+
} else if ("result" in msg) {
|
|
81
|
+
this.#pending.delete(msg.id);
|
|
82
|
+
pending.resolve(msg.result);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
ws.addEventListener("close", () => {
|
|
86
|
+
this.#ws = void 0;
|
|
87
|
+
for (const [, p] of this.#pending) p.reject(new SilgiError("INTERNAL_SERVER_ERROR", { message: "WebSocket closed" }));
|
|
88
|
+
this.#pending.clear();
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
return this.#connecting;
|
|
92
|
+
}
|
|
93
|
+
/** Close the WebSocket connection and reject all pending calls */
|
|
94
|
+
dispose() {
|
|
95
|
+
this.#ws?.close();
|
|
96
|
+
for (const [, p] of this.#pending) p.reject(new DOMException("Link disposed", "AbortError"));
|
|
97
|
+
this.#pending.clear();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
//#endregion
|
|
101
|
+
export { WSLink };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { InferClient } from "../types.mjs";
|
|
2
|
+
import { SilgiError } from "../core/error.mjs";
|
|
3
|
+
import { ClientContext, ClientLink } from "./types.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/client/client.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Create a type-safe client from a link.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const client = createClient<typeof appRouter>(link)
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
declare function createClient<T, TClientContext extends ClientContext = Record<never, never>>(link: ClientLink<TClientContext>): InferClient<T>;
|
|
14
|
+
/**
|
|
15
|
+
* Safe client wrapper — returns [error, data] tuples instead of throwing.
|
|
16
|
+
*/
|
|
17
|
+
interface SafeResult<TOutput, TError> {
|
|
18
|
+
error: TError | null;
|
|
19
|
+
data: TOutput | undefined;
|
|
20
|
+
isError: boolean;
|
|
21
|
+
isSuccess: boolean;
|
|
22
|
+
}
|
|
23
|
+
declare function safe<TOutput, TError = unknown>(promise: Promise<TOutput>): Promise<SafeResult<TOutput, TError>>;
|
|
24
|
+
/**
|
|
25
|
+
* Create a safe client — every procedure call returns { error, data } instead of throwing.
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* const safeClient = createSafeClient<typeof appRouter>(link)
|
|
29
|
+
* const { error, data } = await safeClient.users.list()
|
|
30
|
+
* if (error) console.error(error)
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
declare function createSafeClient<T, TClientContext extends ClientContext = Record<never, never>>(link: ClientLink<TClientContext>): InferSafeClient<T>;
|
|
34
|
+
/** Infer a safe client type where every procedure returns SafeResult */
|
|
35
|
+
type InferSafeClient<T> = T extends ((...args: infer A) => Promise<infer R>) ? (...args: A) => Promise<SafeResult<R, SilgiError>> : { [K in keyof T]: InferSafeClient<T[K]> };
|
|
36
|
+
//#endregion
|
|
37
|
+
export { InferSafeClient, SafeResult, createClient, createSafeClient, safe };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//#region src/client/client.ts
|
|
2
|
+
/**
|
|
3
|
+
* Create a type-safe client from a link.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const client = createClient<typeof appRouter>(link)
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
function createClient(link) {
|
|
10
|
+
return createClientProxy(link, []);
|
|
11
|
+
}
|
|
12
|
+
function createClientProxy(link, path) {
|
|
13
|
+
const cache = /* @__PURE__ */ new Map();
|
|
14
|
+
const procedureClient = (input, options) => link.call(path, input, options ?? {});
|
|
15
|
+
return new Proxy(procedureClient, {
|
|
16
|
+
get(_target, prop) {
|
|
17
|
+
if (prop === "then") return void 0;
|
|
18
|
+
if (typeof prop !== "string") return void 0;
|
|
19
|
+
let cached = cache.get(prop);
|
|
20
|
+
if (!cached) {
|
|
21
|
+
cached = createClientProxy(link, [...path, prop]);
|
|
22
|
+
cache.set(prop, cached);
|
|
23
|
+
}
|
|
24
|
+
return cached;
|
|
25
|
+
},
|
|
26
|
+
apply(_target, _thisArg, args) {
|
|
27
|
+
return procedureClient(args[0], args[1]);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async function safe(promise) {
|
|
32
|
+
try {
|
|
33
|
+
return {
|
|
34
|
+
error: null,
|
|
35
|
+
data: await promise,
|
|
36
|
+
isError: false,
|
|
37
|
+
isSuccess: true
|
|
38
|
+
};
|
|
39
|
+
} catch (error) {
|
|
40
|
+
return {
|
|
41
|
+
error,
|
|
42
|
+
data: void 0,
|
|
43
|
+
isError: true,
|
|
44
|
+
isSuccess: false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a safe client — every procedure call returns { error, data } instead of throwing.
|
|
50
|
+
*
|
|
51
|
+
* ```ts
|
|
52
|
+
* const safeClient = createSafeClient<typeof appRouter>(link)
|
|
53
|
+
* const { error, data } = await safeClient.users.list()
|
|
54
|
+
* if (error) console.error(error)
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
function createSafeClient(link) {
|
|
58
|
+
return createSafeProxy(link, []);
|
|
59
|
+
}
|
|
60
|
+
function createSafeProxy(link, path) {
|
|
61
|
+
const cache = /* @__PURE__ */ new Map();
|
|
62
|
+
const procedureClient = (input, options) => safe(link.call(path, input, options ?? {}));
|
|
63
|
+
return new Proxy(procedureClient, {
|
|
64
|
+
get(_target, prop) {
|
|
65
|
+
if (prop === "then") return void 0;
|
|
66
|
+
if (typeof prop !== "string") return void 0;
|
|
67
|
+
let cached = cache.get(prop);
|
|
68
|
+
if (!cached) {
|
|
69
|
+
cached = createSafeProxy(link, [...path, prop]);
|
|
70
|
+
cache.set(prop, cached);
|
|
71
|
+
}
|
|
72
|
+
return cached;
|
|
73
|
+
},
|
|
74
|
+
apply(_target, _thisArg, args) {
|
|
75
|
+
return procedureClient(args[0], args[1]);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//#endregion
|
|
80
|
+
export { createClient, createSafeClient, safe };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//#region src/client/consume.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Client-side SSE/streaming consumption utilities.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* const iterator = await client.events.subscribe()
|
|
8
|
+
* await consumeIterator(iterator, {
|
|
9
|
+
* onEvent: (data) => console.log('Event:', data),
|
|
10
|
+
* onError: (err) => console.error('Error:', err),
|
|
11
|
+
* onFinish: () => console.log('Stream ended'),
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
interface ConsumeOptions<T> {
|
|
16
|
+
/** Called for each event value */
|
|
17
|
+
onEvent?: (data: T) => void | Promise<void>;
|
|
18
|
+
/** Called when an error occurs */
|
|
19
|
+
onError?: (error: Error) => void;
|
|
20
|
+
/** Called when the stream ends (success or error) */
|
|
21
|
+
onFinish?: () => void;
|
|
22
|
+
/** AbortSignal to cancel consumption */
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Consume an async iterator with lifecycle callbacks.
|
|
27
|
+
* Returns the final value (if any) when the iterator completes.
|
|
28
|
+
*/
|
|
29
|
+
declare function consumeIterator<T>(iterator: AsyncIterableIterator<T>, options?: ConsumeOptions<T>): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Map values from an async iterator, producing a new iterator.
|
|
32
|
+
*/
|
|
33
|
+
declare function mapIterator<T, U>(iterator: AsyncIterableIterator<T>, fn: (value: T) => U | Promise<U>): AsyncIterableIterator<U>;
|
|
34
|
+
interface ReconnectOptions<T> extends ConsumeOptions<T> {
|
|
35
|
+
/** Factory to create a new iterator on reconnection */
|
|
36
|
+
connect: (lastEventId?: string) => AsyncIterableIterator<T> | Promise<AsyncIterableIterator<T>>;
|
|
37
|
+
/** Maximum reconnection attempts (default: Infinity) */
|
|
38
|
+
maxReconnects?: number;
|
|
39
|
+
/** Delay between reconnections in ms (default: 1000) */
|
|
40
|
+
reconnectDelay?: number;
|
|
41
|
+
/** Called on each reconnection attempt */
|
|
42
|
+
onReconnect?: (attempt: number) => void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Consume an iterator with automatic reconnection on failure.
|
|
46
|
+
* Uses lastEventId for resumption if available.
|
|
47
|
+
*/
|
|
48
|
+
declare function consumeWithReconnect<T>(options: ReconnectOptions<T>): Promise<void>;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { ConsumeOptions, ReconnectOptions, consumeIterator, consumeWithReconnect, mapIterator };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
//#region src/client/consume.ts
|
|
2
|
+
/**
|
|
3
|
+
* Consume an async iterator with lifecycle callbacks.
|
|
4
|
+
* Returns the final value (if any) when the iterator completes.
|
|
5
|
+
*/
|
|
6
|
+
async function consumeIterator(iterator, options = {}) {
|
|
7
|
+
const { onEvent, onError, onFinish, signal } = options;
|
|
8
|
+
try {
|
|
9
|
+
while (true) {
|
|
10
|
+
if (signal?.aborted) {
|
|
11
|
+
await iterator.return?.();
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
const result = await iterator.next();
|
|
15
|
+
if (result.done) break;
|
|
16
|
+
if (onEvent) await onEvent(result.value);
|
|
17
|
+
}
|
|
18
|
+
} catch (error) {
|
|
19
|
+
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
20
|
+
} finally {
|
|
21
|
+
onFinish?.();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Map values from an async iterator, producing a new iterator.
|
|
26
|
+
*/
|
|
27
|
+
async function* mapIterator(iterator, fn) {
|
|
28
|
+
try {
|
|
29
|
+
for await (const value of iterator) yield await fn(value);
|
|
30
|
+
} finally {
|
|
31
|
+
await iterator.return?.();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Consume an iterator with automatic reconnection on failure.
|
|
36
|
+
* Uses lastEventId for resumption if available.
|
|
37
|
+
*/
|
|
38
|
+
async function consumeWithReconnect(options) {
|
|
39
|
+
const { connect, maxReconnects = Infinity, reconnectDelay = 1e3, onReconnect, signal, ...consumeOpts } = options;
|
|
40
|
+
let lastEventId;
|
|
41
|
+
let attempt = 0;
|
|
42
|
+
while (attempt <= maxReconnects) {
|
|
43
|
+
if (signal?.aborted) break;
|
|
44
|
+
try {
|
|
45
|
+
const iterator = await connect(lastEventId);
|
|
46
|
+
attempt = 0;
|
|
47
|
+
await consumeIterator(iterator, {
|
|
48
|
+
...consumeOpts,
|
|
49
|
+
signal,
|
|
50
|
+
onEvent: async (data) => {
|
|
51
|
+
if (data && typeof data === "object" && "id" in data) lastEventId = String(data.id);
|
|
52
|
+
if (consumeOpts.onEvent) await consumeOpts.onEvent(data);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
break;
|
|
56
|
+
} catch {
|
|
57
|
+
attempt++;
|
|
58
|
+
if (attempt > maxReconnects || signal?.aborted) break;
|
|
59
|
+
onReconnect?.(attempt);
|
|
60
|
+
await new Promise((resolve) => setTimeout(resolve, reconnectDelay));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
consumeOpts.onFinish?.();
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
export { consumeIterator, consumeWithReconnect, mapIterator };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/dynamic-link.d.ts
|
|
4
|
+
type LinkSelector<TClientContext extends ClientContext = ClientContext> = (path: readonly string[], input: unknown, options: ClientOptions<TClientContext>) => ClientLink<TClientContext> | Promise<ClientLink<TClientContext>>;
|
|
5
|
+
/**
|
|
6
|
+
* A link that delegates to other links based on a selector function.
|
|
7
|
+
* The selector runs on every call, so it can use dynamic state.
|
|
8
|
+
* Supports both sync and async selectors (e.g. lazy-importing a link).
|
|
9
|
+
*/
|
|
10
|
+
declare class DynamicLink<TClientContext extends ClientContext = ClientContext> implements ClientLink<TClientContext> {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(selector: LinkSelector<TClientContext>);
|
|
13
|
+
call(path: readonly string[], input: unknown, options: ClientOptions<TClientContext>): Promise<unknown>;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { DynamicLink, LinkSelector };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/client/dynamic-link.ts
|
|
2
|
+
/**
|
|
3
|
+
* A link that delegates to other links based on a selector function.
|
|
4
|
+
* The selector runs on every call, so it can use dynamic state.
|
|
5
|
+
* Supports both sync and async selectors (e.g. lazy-importing a link).
|
|
6
|
+
*/
|
|
7
|
+
var DynamicLink = class {
|
|
8
|
+
#selector;
|
|
9
|
+
constructor(selector) {
|
|
10
|
+
this.#selector = selector;
|
|
11
|
+
}
|
|
12
|
+
call(path, input, options) {
|
|
13
|
+
const result = this.#selector(path, input, options);
|
|
14
|
+
if (result && typeof result.then === "function") return result.then((link) => link.call(path, input, options));
|
|
15
|
+
return result.call(path, input, options);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { DynamicLink };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SilgiError, SilgiErrorCode, SilgiErrorJSON, isDefinedError } from "../core/error.mjs";
|
|
2
|
+
import { Client, ClientContext, ClientLink, ClientOptions, ClientRest, InferClientInputs, InferClientOutputs, NestedClient } from "./types.mjs";
|
|
3
|
+
import { InferSafeClient, SafeResult, createClient, createSafeClient, safe } from "./client.mjs";
|
|
4
|
+
import { DynamicLink, LinkSelector } from "./dynamic-link.mjs";
|
|
5
|
+
import { ClientInterceptors, withInterceptors } from "./interceptor.mjs";
|
|
6
|
+
export { type Client, type ClientContext, type ClientInterceptors, type ClientLink, type ClientOptions, type ClientRest, DynamicLink, type InferClientInputs, type InferClientOutputs, type InferSafeClient, type LinkSelector, type NestedClient, type SafeResult, SilgiError, type SilgiErrorCode, type SilgiErrorJSON, createClient, createSafeClient, isDefinedError, safe, withInterceptors };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SilgiError, isDefinedError } from "../core/error.mjs";
|
|
2
|
+
import { createClient, createSafeClient, safe } from "./client.mjs";
|
|
3
|
+
import { DynamicLink } from "./dynamic-link.mjs";
|
|
4
|
+
import { withInterceptors } from "./interceptor.mjs";
|
|
5
|
+
export { DynamicLink, SilgiError, createClient, createSafeClient, isDefinedError, safe, withInterceptors };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/interceptor.d.ts
|
|
4
|
+
interface ClientInterceptors<TClientContext extends ClientContext = ClientContext> {
|
|
5
|
+
/** Called before every request. Can modify input or options. */
|
|
6
|
+
onRequest?: (event: {
|
|
7
|
+
path: readonly string[];
|
|
8
|
+
input: unknown;
|
|
9
|
+
options: ClientOptions<TClientContext>;
|
|
10
|
+
}) => void | Promise<void>;
|
|
11
|
+
/** Called after a successful response. */
|
|
12
|
+
onResponse?: (event: {
|
|
13
|
+
path: readonly string[];
|
|
14
|
+
input: unknown;
|
|
15
|
+
output: unknown;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
}) => void | Promise<void>;
|
|
18
|
+
/** Called when a request fails. */
|
|
19
|
+
onError?: (event: {
|
|
20
|
+
path: readonly string[];
|
|
21
|
+
input: unknown;
|
|
22
|
+
error: unknown;
|
|
23
|
+
}) => void | Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wrap a ClientLink with interceptor hooks.
|
|
27
|
+
* Returns a new link that calls the interceptors around the original.
|
|
28
|
+
*/
|
|
29
|
+
declare function withInterceptors<TClientContext extends ClientContext = ClientContext>(link: ClientLink<TClientContext>, interceptors: ClientInterceptors<TClientContext>): ClientLink<TClientContext>;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { ClientInterceptors, withInterceptors };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/client/interceptor.ts
|
|
2
|
+
/**
|
|
3
|
+
* Wrap a ClientLink with interceptor hooks.
|
|
4
|
+
* Returns a new link that calls the interceptors around the original.
|
|
5
|
+
*/
|
|
6
|
+
function withInterceptors(link, interceptors) {
|
|
7
|
+
return { async call(path, input, options) {
|
|
8
|
+
if (interceptors.onRequest) await interceptors.onRequest({
|
|
9
|
+
path,
|
|
10
|
+
input,
|
|
11
|
+
options
|
|
12
|
+
});
|
|
13
|
+
const t0 = performance.now();
|
|
14
|
+
try {
|
|
15
|
+
const output = await link.call(path, input, options);
|
|
16
|
+
if (interceptors.onResponse) await interceptors.onResponse({
|
|
17
|
+
path,
|
|
18
|
+
input,
|
|
19
|
+
output,
|
|
20
|
+
durationMs: performance.now() - t0
|
|
21
|
+
});
|
|
22
|
+
return output;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
if (interceptors.onError) await interceptors.onError({
|
|
25
|
+
path,
|
|
26
|
+
input,
|
|
27
|
+
error
|
|
28
|
+
});
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
} };
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { withInterceptors };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/openapi.d.ts
|
|
4
|
+
interface OpenAPILinkOptions {
|
|
5
|
+
/** Base URL of the API */
|
|
6
|
+
url: string;
|
|
7
|
+
/** OpenAPI 3.x specification object (parsed JSON) */
|
|
8
|
+
spec?: Record<string, unknown>;
|
|
9
|
+
/** Default headers */
|
|
10
|
+
headers?: Record<string, string> | (() => Record<string, string>);
|
|
11
|
+
/** Custom fetch implementation */
|
|
12
|
+
fetch?: typeof globalThis.fetch;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A ClientLink that makes REST requests to an OpenAPI endpoint.
|
|
16
|
+
*
|
|
17
|
+
* Maps procedure paths to REST paths:
|
|
18
|
+
* - `client.users.list({ limit: 10 })` → `GET /users/list?limit=10` or `POST /users/list`
|
|
19
|
+
*
|
|
20
|
+
* Without a spec, it defaults to POST requests with JSON body.
|
|
21
|
+
* With a spec, it uses the correct HTTP method and parameter placement.
|
|
22
|
+
*/
|
|
23
|
+
declare class OpenAPILink<TCtx extends ClientContext = ClientContext> implements ClientLink<TCtx> {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(options: OpenAPILinkOptions);
|
|
26
|
+
call(path: readonly string[], input: unknown, options: ClientOptions<TCtx>): Promise<unknown>;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { OpenAPILink, OpenAPILinkOptions };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { SilgiError } from "../core/error.mjs";
|
|
2
|
+
//#region src/client/openapi.ts
|
|
3
|
+
/**
|
|
4
|
+
* OpenAPI Client Link — consume any OpenAPI endpoint as a Silgi client.
|
|
5
|
+
*
|
|
6
|
+
* Unlike RPCLink (which uses Silgi's wire protocol), OpenAPILink sends
|
|
7
|
+
* standard REST requests based on an OpenAPI spec.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { OpenAPILink } from "silgi/client/openapi"
|
|
12
|
+
* import { createClient } from "silgi/client"
|
|
13
|
+
*
|
|
14
|
+
* const link = new OpenAPILink({
|
|
15
|
+
* url: "https://api.example.com",
|
|
16
|
+
* spec: await fetch("/api/openapi.json").then(r => r.json()),
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* const client = createClient<ExternalAPI>(link)
|
|
20
|
+
* const users = await client.users.list({ limit: 10 })
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* A ClientLink that makes REST requests to an OpenAPI endpoint.
|
|
25
|
+
*
|
|
26
|
+
* Maps procedure paths to REST paths:
|
|
27
|
+
* - `client.users.list({ limit: 10 })` → `GET /users/list?limit=10` or `POST /users/list`
|
|
28
|
+
*
|
|
29
|
+
* Without a spec, it defaults to POST requests with JSON body.
|
|
30
|
+
* With a spec, it uses the correct HTTP method and parameter placement.
|
|
31
|
+
*/
|
|
32
|
+
var OpenAPILink = class {
|
|
33
|
+
#url;
|
|
34
|
+
#spec;
|
|
35
|
+
#headers;
|
|
36
|
+
#fetch;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.#url = options.url.replace(/\/$/, "");
|
|
39
|
+
this.#spec = options.spec;
|
|
40
|
+
this.#headers = options.headers ?? {};
|
|
41
|
+
this.#fetch = options.fetch ?? globalThis.fetch;
|
|
42
|
+
}
|
|
43
|
+
async call(path, input, options) {
|
|
44
|
+
const endpoint = "/" + path.join("/");
|
|
45
|
+
const url = this.#url + endpoint;
|
|
46
|
+
const headers = {
|
|
47
|
+
"content-type": "application/json",
|
|
48
|
+
...typeof this.#headers === "function" ? this.#headers() : this.#headers
|
|
49
|
+
};
|
|
50
|
+
let method = "POST";
|
|
51
|
+
if (this.#spec) {
|
|
52
|
+
const paths = this.#spec.paths;
|
|
53
|
+
if (paths?.[endpoint]) {
|
|
54
|
+
if (paths[endpoint].get) method = "GET";
|
|
55
|
+
else if (paths[endpoint].post) method = "POST";
|
|
56
|
+
else if (paths[endpoint].put) method = "PUT";
|
|
57
|
+
else if (paths[endpoint].patch) method = "PATCH";
|
|
58
|
+
else if (paths[endpoint].delete) method = "DELETE";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let requestUrl = url;
|
|
62
|
+
let body;
|
|
63
|
+
if (method === "GET" || method === "HEAD") {
|
|
64
|
+
if (input && typeof input === "object") {
|
|
65
|
+
const params = new URLSearchParams();
|
|
66
|
+
for (const [k, v] of Object.entries(input)) if (v !== void 0) params.set(k, String(v));
|
|
67
|
+
const qs = params.toString();
|
|
68
|
+
if (qs) requestUrl = `${url}?${qs}`;
|
|
69
|
+
}
|
|
70
|
+
} else body = input !== void 0 ? JSON.stringify(input) : void 0;
|
|
71
|
+
const response = await this.#fetch(requestUrl, {
|
|
72
|
+
method,
|
|
73
|
+
headers,
|
|
74
|
+
body,
|
|
75
|
+
signal: options.signal
|
|
76
|
+
});
|
|
77
|
+
if (!response.ok) {
|
|
78
|
+
const errorBody = await response.json().catch(() => null);
|
|
79
|
+
throw new SilgiError(errorBody?.code ?? `HTTP_${response.status}`, {
|
|
80
|
+
status: response.status,
|
|
81
|
+
message: errorBody?.message ?? response.statusText,
|
|
82
|
+
data: errorBody
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return response.json();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
//#endregion
|
|
89
|
+
export { OpenAPILink };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ClientContext, ClientLink, ClientOptions } from "../types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/client/plugins/batch.d.ts
|
|
4
|
+
interface BatchLinkOptions {
|
|
5
|
+
/** The underlying link to send the batch through */
|
|
6
|
+
link: ClientLink;
|
|
7
|
+
/** Batch endpoint path (default: /__batch__) */
|
|
8
|
+
path?: string;
|
|
9
|
+
/** Maximum batch size (default: 20) */
|
|
10
|
+
maxSize?: number;
|
|
11
|
+
/** URL for the batch endpoint */
|
|
12
|
+
url: string | URL;
|
|
13
|
+
/**
|
|
14
|
+
* Enable streaming mode — server streams individual responses progressively
|
|
15
|
+
* via newline-delimited JSON instead of waiting for all to complete.
|
|
16
|
+
* @default false
|
|
17
|
+
*/
|
|
18
|
+
streaming?: boolean;
|
|
19
|
+
}
|
|
20
|
+
declare class BatchLink<TClientContext extends ClientContext = ClientContext> implements ClientLink<TClientContext> {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(options: BatchLinkOptions);
|
|
23
|
+
call(path: readonly string[], input: unknown, options: ClientOptions<TClientContext>): Promise<unknown>;
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { BatchLink, BatchLinkOptions };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//#region src/client/plugins/batch.ts
|
|
2
|
+
var BatchLink = class {
|
|
3
|
+
#link;
|
|
4
|
+
#batchPath;
|
|
5
|
+
#maxSize;
|
|
6
|
+
#pending = [];
|
|
7
|
+
#scheduled = false;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.#link = options.link;
|
|
10
|
+
this.#batchPath = options.path ?? "/__batch__";
|
|
11
|
+
this.#maxSize = options.maxSize ?? 20;
|
|
12
|
+
}
|
|
13
|
+
call(path, input, options) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
this.#pending.push({
|
|
16
|
+
path,
|
|
17
|
+
input,
|
|
18
|
+
options,
|
|
19
|
+
resolve,
|
|
20
|
+
reject
|
|
21
|
+
});
|
|
22
|
+
if (!this.#scheduled) {
|
|
23
|
+
this.#scheduled = true;
|
|
24
|
+
queueMicrotask(() => this.#flush());
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async #flush() {
|
|
29
|
+
this.#scheduled = false;
|
|
30
|
+
const batch = this.#pending.splice(0);
|
|
31
|
+
if (batch.length === 0) return;
|
|
32
|
+
const chunks = [];
|
|
33
|
+
for (let i = 0; i < batch.length; i += this.#maxSize) chunks.push(batch.slice(i, i + this.#maxSize));
|
|
34
|
+
await Promise.all(chunks.map((chunk) => this.#sendChunk(chunk)));
|
|
35
|
+
}
|
|
36
|
+
async #sendChunk(chunk) {
|
|
37
|
+
const batchBody = chunk.map((call) => ({
|
|
38
|
+
path: "/" + call.path.join("/"),
|
|
39
|
+
method: "POST",
|
|
40
|
+
body: call.input
|
|
41
|
+
}));
|
|
42
|
+
try {
|
|
43
|
+
const responses = await this.#link.call([this.#batchPath.slice(1)], batchBody, { signal: chunk.length === 1 ? chunk[0].options.signal : AbortSignal.any(chunk.map((c) => c.options.signal).filter(Boolean)) });
|
|
44
|
+
if (!Array.isArray(responses)) {
|
|
45
|
+
for (const call of chunk) call.reject(/* @__PURE__ */ new Error("Invalid batch response"));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
for (const response of responses) {
|
|
49
|
+
const call = chunk[response.index];
|
|
50
|
+
if (!call) continue;
|
|
51
|
+
if (response.status >= 400) call.reject(response.body ?? /* @__PURE__ */ new Error(`HTTP ${response.status}`));
|
|
52
|
+
else call.resolve(response.body);
|
|
53
|
+
}
|
|
54
|
+
for (let i = 0; i < chunk.length; i++) {
|
|
55
|
+
const call = chunk[i];
|
|
56
|
+
if (!responses.some((r) => r.index === i)) call.reject(/* @__PURE__ */ new Error("No response in batch"));
|
|
57
|
+
}
|
|
58
|
+
} catch (error) {
|
|
59
|
+
for (const call of chunk) call.reject(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { BatchLink };
|