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,68 @@
|
|
|
1
|
+
//#region src/trpc-interop.ts
|
|
2
|
+
/**
|
|
3
|
+
* Convert a tRPC router to a Silgi RouterDef.
|
|
4
|
+
*
|
|
5
|
+
* Walks the tRPC router's `_def.procedures` and wraps each one as
|
|
6
|
+
* a Silgi ProcedureDef that calls the tRPC procedure's resolver.
|
|
7
|
+
*
|
|
8
|
+
* Supports:
|
|
9
|
+
* - tRPC v10 and v11 routers
|
|
10
|
+
* - Queries, mutations, and subscriptions
|
|
11
|
+
* - Input schemas (passed through as-is)
|
|
12
|
+
* - Middleware (runs inside tRPC, not Silgi's pipeline)
|
|
13
|
+
*
|
|
14
|
+
* Does NOT support:
|
|
15
|
+
* - Converting tRPC middleware to Silgi guards/wraps
|
|
16
|
+
* - tRPC context factories (use Silgi's context instead)
|
|
17
|
+
*/
|
|
18
|
+
function fromTRPC(trpcRouter) {
|
|
19
|
+
if (!trpcRouter || typeof trpcRouter !== "object") throw new Error("fromTRPC: expected a tRPC router object");
|
|
20
|
+
const router = trpcRouter;
|
|
21
|
+
return walkTRPCRouter(router._def?.procedures ?? router);
|
|
22
|
+
}
|
|
23
|
+
function walkTRPCRouter(node) {
|
|
24
|
+
const result = {};
|
|
25
|
+
for (const [key, value] of Object.entries(node)) {
|
|
26
|
+
if (!value || typeof value !== "object") continue;
|
|
27
|
+
const proc = value;
|
|
28
|
+
if (isTRPCProcedure(proc)) result[key] = convertProcedure(proc);
|
|
29
|
+
else if (isTRPCRouter(proc)) result[key] = walkTRPCRouter(proc._def?.procedures ?? proc);
|
|
30
|
+
else result[key] = walkTRPCRouter(proc);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function isTRPCProcedure(value) {
|
|
35
|
+
const def = value._def;
|
|
36
|
+
if (!def) return false;
|
|
37
|
+
return def.type === "query" || def.type === "mutation" || def.type === "subscription";
|
|
38
|
+
}
|
|
39
|
+
function isTRPCRouter(value) {
|
|
40
|
+
return !!value._def?.procedures;
|
|
41
|
+
}
|
|
42
|
+
function convertProcedure(trpcProc) {
|
|
43
|
+
const def = trpcProc._def;
|
|
44
|
+
const type = def.type === "subscription" ? "subscription" : def.type === "mutation" ? "mutation" : "query";
|
|
45
|
+
return {
|
|
46
|
+
type,
|
|
47
|
+
input: def.inputs?.[0] ?? null,
|
|
48
|
+
output: null,
|
|
49
|
+
errors: null,
|
|
50
|
+
use: null,
|
|
51
|
+
resolve: async ({ input, ctx }) => {
|
|
52
|
+
if (typeof def.resolver === "function") return def.resolver({
|
|
53
|
+
input,
|
|
54
|
+
ctx,
|
|
55
|
+
type
|
|
56
|
+
});
|
|
57
|
+
if (typeof trpcProc.call === "function") return trpcProc.call({
|
|
58
|
+
input,
|
|
59
|
+
ctx
|
|
60
|
+
});
|
|
61
|
+
throw new Error(`Cannot resolve tRPC procedure: ${JSON.stringify(Object.keys(def))}`);
|
|
62
|
+
},
|
|
63
|
+
route: null,
|
|
64
|
+
meta: { __trpc: true }
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { fromTRPC };
|
package/dist/types.d.mts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { AnySchema, InferSchemaInput } from "./core/schema.mjs";
|
|
2
|
+
import { TaskDef } from "./core/task.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/types.d.ts
|
|
5
|
+
/** HTTP route metadata + OpenAPI operation metadata */
|
|
6
|
+
interface Route {
|
|
7
|
+
method?: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
/** Short summary of the operation (OpenAPI `summary`) */
|
|
10
|
+
summary?: string;
|
|
11
|
+
/** Detailed description of the operation (OpenAPI `description`, supports markdown) */
|
|
12
|
+
description?: string;
|
|
13
|
+
/** Tags for grouping operations in API docs */
|
|
14
|
+
tags?: string[];
|
|
15
|
+
/** Mark operation as deprecated in API docs */
|
|
16
|
+
deprecated?: boolean;
|
|
17
|
+
/** Custom operationId (default: router path joined with `_`) */
|
|
18
|
+
operationId?: string;
|
|
19
|
+
/** HTTP status code for successful responses (default: 200) */
|
|
20
|
+
successStatus?: number;
|
|
21
|
+
/** Description for the success response in API docs */
|
|
22
|
+
successDescription?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Per-procedure security override.
|
|
25
|
+
* - `false` — public endpoint (no auth), overrides global security
|
|
26
|
+
* - `string[]` — named security scheme(s) required
|
|
27
|
+
*/
|
|
28
|
+
security?: false | string[];
|
|
29
|
+
/**
|
|
30
|
+
* Override or extend the auto-generated OpenAPI operation object.
|
|
31
|
+
* - Object: merged over the generated operation
|
|
32
|
+
* - Function: receives the generated operation, returns the final one
|
|
33
|
+
*
|
|
34
|
+
* Use this for any OpenAPI metadata not covered by other Route fields
|
|
35
|
+
* (e.g. `externalDocs`, `x-` extensions, custom `parameters`).
|
|
36
|
+
*/
|
|
37
|
+
spec?: Record<string, unknown> | ((operation: Record<string, unknown>) => Record<string, unknown>);
|
|
38
|
+
/**
|
|
39
|
+
* Cache-Control header for query responses.
|
|
40
|
+
*
|
|
41
|
+
* - `number` — shorthand for `max-age=N` (seconds)
|
|
42
|
+
* - `string` — full Cache-Control value (e.g. `'public, max-age=60, stale-while-revalidate=30'`)
|
|
43
|
+
* - Only applies to query procedures (mutations and subscriptions are never cached)
|
|
44
|
+
*/
|
|
45
|
+
cache?: number | string;
|
|
46
|
+
/** Enable WebSocket RPC for this procedure */
|
|
47
|
+
ws?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Procedure metadata */
|
|
50
|
+
type Meta = Record<string, unknown>;
|
|
51
|
+
type ProcedureType = 'query' | 'mutation' | 'subscription';
|
|
52
|
+
/** Internal procedure representation — fixed shape for V8 optimization */
|
|
53
|
+
interface ProcedureDef<TType extends ProcedureType = ProcedureType, _TInput = unknown, _TOutput = unknown, TErrors extends ErrorDef = ErrorDef> {
|
|
54
|
+
readonly type: TType;
|
|
55
|
+
readonly input: AnySchema | null;
|
|
56
|
+
readonly output: AnySchema | null;
|
|
57
|
+
readonly errors: TErrors | null;
|
|
58
|
+
readonly use: readonly MiddlewareDef[] | null;
|
|
59
|
+
readonly resolve: Function;
|
|
60
|
+
readonly route: Route | null;
|
|
61
|
+
readonly meta: Meta | null;
|
|
62
|
+
}
|
|
63
|
+
/** Error definition: number shorthand or full config */
|
|
64
|
+
type ErrorDefItem = number | {
|
|
65
|
+
status: number;
|
|
66
|
+
message?: string;
|
|
67
|
+
data?: AnySchema;
|
|
68
|
+
};
|
|
69
|
+
type ErrorDef = Record<string, ErrorDefItem>;
|
|
70
|
+
/** Extract data schema from error def item */
|
|
71
|
+
type ErrorData<T extends ErrorDefItem> = T extends {
|
|
72
|
+
data: infer S extends AnySchema;
|
|
73
|
+
} ? InferSchemaInput<S> : undefined;
|
|
74
|
+
/** Typed fail() function — inferred from errors definition */
|
|
75
|
+
type FailFn<TErrors extends ErrorDef> = <K extends keyof TErrors & string>(code: K, ...args: ErrorData<TErrors[K]> extends undefined ? [data?: unknown] : [data: ErrorData<TErrors[K]>]) => never;
|
|
76
|
+
type GuardFn<TCtxIn, TReturn> = (ctx: TCtxIn) => TReturn | Promise<TReturn> | void | Promise<void>;
|
|
77
|
+
type WrapFn<TCtx> = (ctx: TCtx, next: () => Promise<unknown>) => Promise<unknown>;
|
|
78
|
+
interface GuardDef<TCtxIn = unknown, TReturn = unknown, TErrors extends ErrorDef = {}> {
|
|
79
|
+
readonly kind: 'guard';
|
|
80
|
+
readonly fn: GuardFn<TCtxIn, TReturn>;
|
|
81
|
+
readonly errors?: TErrors;
|
|
82
|
+
}
|
|
83
|
+
interface WrapDef<TCtx = unknown> {
|
|
84
|
+
readonly kind: 'wrap';
|
|
85
|
+
readonly fn: WrapFn<TCtx>;
|
|
86
|
+
}
|
|
87
|
+
type MiddlewareDef = GuardDef<any, any> | WrapDef<any>;
|
|
88
|
+
/** Extract the context additions from a single guard */
|
|
89
|
+
type InferGuardOutput<T> = T extends GuardDef<any, infer O> ? (O extends void | undefined ? {} : O extends Record<string, unknown> ? O : {}) : {};
|
|
90
|
+
/** Walk a middleware tuple, accumulate guard outputs into context */
|
|
91
|
+
type InferContextFromUse<T extends readonly MiddlewareDef[], TBase> = T extends readonly [infer Head, ...infer Tail extends readonly MiddlewareDef[]] ? InferContextFromUse<Tail, TBase & InferGuardOutput<Head>> : TBase;
|
|
92
|
+
interface ResolveContext<TCtx, TInput, TErrors extends ErrorDef> {
|
|
93
|
+
ctx: TCtx;
|
|
94
|
+
input: TInput;
|
|
95
|
+
fail: FailFn<TErrors>;
|
|
96
|
+
signal: AbortSignal;
|
|
97
|
+
/** URL params extracted from the route pattern (e.g. `/users/:id` → `{ id: '123' }`) */
|
|
98
|
+
params: Record<string, string>;
|
|
99
|
+
}
|
|
100
|
+
type RouterDef = {
|
|
101
|
+
[key: string]: ProcedureDef<any, any, any, any> | TaskDef<any, any> | RouterDef;
|
|
102
|
+
};
|
|
103
|
+
/** Return type wrapper — subscription yields, query/mutation returns Promise */
|
|
104
|
+
type ProcedureResult<TType extends ProcedureType, TOutput> = TType extends 'subscription' ? AsyncIterableIterator<TOutput> : Promise<TOutput>;
|
|
105
|
+
/** Infer client type from router */
|
|
106
|
+
type InferClient<T> = T extends ProcedureDef<infer TType, infer TInput, infer TOutput> ? undefined extends TInput ? () => ProcedureResult<TType, TOutput> : (input: TInput) => ProcedureResult<TType, TOutput> : T extends Record<string, unknown> ? { [K in keyof T]: InferClient<T[K]> } : never;
|
|
107
|
+
//#endregion
|
|
108
|
+
export { ErrorDef, ErrorDefItem, FailFn, GuardDef, GuardFn, InferClient, InferContextFromUse, InferGuardOutput, Meta, MiddlewareDef, ProcedureDef, ProcedureType, ResolveContext, Route, RouterDef, WrapDef, WrapFn };
|
package/dist/ws.d.mts
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { RouterDef } from "./types.mjs";
|
|
2
|
+
import { Hooks, Peer } from "crossws";
|
|
3
|
+
import { Server } from "node:http";
|
|
4
|
+
|
|
5
|
+
//#region src/ws.d.ts
|
|
6
|
+
interface WSAdapterOptions<TCtx extends Record<string, unknown> = Record<string, unknown>> {
|
|
7
|
+
/**
|
|
8
|
+
* Wire protocol for WebSocket message encoding.
|
|
9
|
+
*
|
|
10
|
+
* - `'json'` — default, text frames with JSON
|
|
11
|
+
* - `'messagepack'` — binary frames with MessagePack
|
|
12
|
+
*
|
|
13
|
+
* @default 'json'
|
|
14
|
+
*/
|
|
15
|
+
protocol?: 'json' | 'messagepack';
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Use `protocol: 'messagepack'` instead.
|
|
18
|
+
*/
|
|
19
|
+
binary?: boolean;
|
|
20
|
+
/** Context factory — receives the peer on each message */
|
|
21
|
+
context?: (peer: Peer) => TCtx | Promise<TCtx>;
|
|
22
|
+
/**
|
|
23
|
+
* Enable per-message-deflate compression.
|
|
24
|
+
*
|
|
25
|
+
* - `true`: enable with defaults
|
|
26
|
+
* - `object`: fine-tune zlib options (passed to ws `perMessageDeflate`)
|
|
27
|
+
*
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
compress?: boolean | {
|
|
31
|
+
threshold?: number;
|
|
32
|
+
serverNoContextTakeover?: boolean;
|
|
33
|
+
clientNoContextTakeover?: boolean;
|
|
34
|
+
serverMaxWindowBits?: number;
|
|
35
|
+
clientMaxWindowBits?: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Maximum allowed message size in bytes.
|
|
39
|
+
* Messages exceeding this limit will cause the connection to be closed.
|
|
40
|
+
*
|
|
41
|
+
* @default 1_048_576 (1 MB)
|
|
42
|
+
*/
|
|
43
|
+
maxPayload?: number;
|
|
44
|
+
/**
|
|
45
|
+
* Keepalive ping interval in milliseconds.
|
|
46
|
+
* Server sends a ping frame at this interval; if the client
|
|
47
|
+
* does not respond with a pong before the next ping, the connection is terminated.
|
|
48
|
+
*
|
|
49
|
+
* Set to `0` or `false` to disable.
|
|
50
|
+
*
|
|
51
|
+
* @default 30_000 (30 seconds)
|
|
52
|
+
*/
|
|
53
|
+
keepalive?: number | false;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create crossws-compatible hooks for Silgi RPC over WebSocket.
|
|
57
|
+
*
|
|
58
|
+
* Works with any crossws integration — Nitro, Deno, Bun, Cloudflare, etc.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* // Nitro / Nuxt
|
|
63
|
+
* import { createWSHooks } from "silgi/ws";
|
|
64
|
+
* export default defineWebSocketHandler(createWSHooks(appRouter));
|
|
65
|
+
*
|
|
66
|
+
* // With context
|
|
67
|
+
* export default defineWebSocketHandler(createWSHooks(appRouter, {
|
|
68
|
+
* context: (peer) => ({ userId: peer.request?.headers.get('x-user-id') }),
|
|
69
|
+
* }));
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare function createWSHooks<TCtx extends Record<string, unknown>>(routerDef: RouterDef, options?: WSAdapterOptions<TCtx>): Partial<Hooks>;
|
|
73
|
+
/**
|
|
74
|
+
* Attach WebSocket RPC handler to an existing Node.js HTTP server.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* import { createServer } from "node:http";
|
|
79
|
+
* import { attachWebSocket } from "silgi/ws";
|
|
80
|
+
*
|
|
81
|
+
* const server = createServer(httpHandler);
|
|
82
|
+
* attachWebSocket(server, appRouter);
|
|
83
|
+
* server.listen(3000);
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
declare function attachWebSocket<TCtx extends Record<string, unknown>>(server: Server, routerDef: RouterDef, options?: WSAdapterOptions<TCtx>): Promise<void>;
|
|
87
|
+
//#endregion
|
|
88
|
+
export { WSAdapterOptions, attachWebSocket, createWSHooks };
|
package/dist/ws.mjs
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { SilgiError, toSilgiError } from "./core/error.mjs";
|
|
2
|
+
import { compileRouter, createContext, releaseContext } from "./compile.mjs";
|
|
3
|
+
import { stringifyJSON } from "./core/utils.mjs";
|
|
4
|
+
import { decode, encode } from "./codec/msgpack.mjs";
|
|
5
|
+
//#region src/ws.ts
|
|
6
|
+
/**
|
|
7
|
+
* WebSocket RPC adapter — powered by crossws.
|
|
8
|
+
*
|
|
9
|
+
* Bidirectional type-safe RPC over WebSocket.
|
|
10
|
+
* Supports subscriptions (server → client streaming) natively.
|
|
11
|
+
*
|
|
12
|
+
* Protocol:
|
|
13
|
+
* Client → Server: { id: string, path: string, input?: unknown }
|
|
14
|
+
* Server → Client: { id: string, result?: unknown, error?: unknown }
|
|
15
|
+
* Server → Client (stream): { id: string, data: unknown, done?: boolean }
|
|
16
|
+
*/
|
|
17
|
+
const peerAbortControllers = /* @__PURE__ */ new WeakMap();
|
|
18
|
+
const peerKeepaliveTimers = /* @__PURE__ */ new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Create crossws-compatible hooks for Silgi RPC over WebSocket.
|
|
21
|
+
*
|
|
22
|
+
* Works with any crossws integration — Nitro, Deno, Bun, Cloudflare, etc.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* // Nitro / Nuxt
|
|
27
|
+
* import { createWSHooks } from "silgi/ws";
|
|
28
|
+
* export default defineWebSocketHandler(createWSHooks(appRouter));
|
|
29
|
+
*
|
|
30
|
+
* // With context
|
|
31
|
+
* export default defineWebSocketHandler(createWSHooks(appRouter, {
|
|
32
|
+
* context: (peer) => ({ userId: peer.request?.headers.get('x-user-id') }),
|
|
33
|
+
* }));
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
function createWSHooks(routerDef, options = {}) {
|
|
37
|
+
const flat = compileRouter(routerDef);
|
|
38
|
+
const useMsgpack = options.protocol === "messagepack" || options.protocol == null && (options.binary ?? false);
|
|
39
|
+
const contextFactory = options.context;
|
|
40
|
+
const keepaliveMs = options.keepalive === false ? 0 : options.keepalive ?? 3e4;
|
|
41
|
+
function send(peer, data) {
|
|
42
|
+
const compress = !!options.compress;
|
|
43
|
+
if (useMsgpack) peer.send(encode(data), { compress });
|
|
44
|
+
else peer.send(stringifyJSON(data), { compress });
|
|
45
|
+
}
|
|
46
|
+
function parseMessage(message) {
|
|
47
|
+
if (useMsgpack) return decode(message.uint8Array());
|
|
48
|
+
return message.json();
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
open(peer) {
|
|
52
|
+
peerAbortControllers.set(peer, /* @__PURE__ */ new Set());
|
|
53
|
+
if (keepaliveMs > 0) {
|
|
54
|
+
const ws = peer._internal?.ws;
|
|
55
|
+
if (ws && typeof ws.ping === "function") {
|
|
56
|
+
let alive = true;
|
|
57
|
+
ws.on("pong", () => {
|
|
58
|
+
alive = true;
|
|
59
|
+
});
|
|
60
|
+
const timer = setInterval(() => {
|
|
61
|
+
if (!alive) {
|
|
62
|
+
clearInterval(timer);
|
|
63
|
+
ws.terminate();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
alive = false;
|
|
67
|
+
ws.ping();
|
|
68
|
+
}, keepaliveMs);
|
|
69
|
+
peerKeepaliveTimers.set(peer, timer);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
async message(peer, message) {
|
|
74
|
+
let req;
|
|
75
|
+
try {
|
|
76
|
+
req = parseMessage(message);
|
|
77
|
+
} catch {
|
|
78
|
+
send(peer, {
|
|
79
|
+
id: "0",
|
|
80
|
+
error: {
|
|
81
|
+
code: "BAD_REQUEST",
|
|
82
|
+
status: 400,
|
|
83
|
+
message: "Invalid message format"
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const { id, path, input } = req;
|
|
89
|
+
const route = flat("POST", "/" + path)?.data;
|
|
90
|
+
if (!route || !route.ws) {
|
|
91
|
+
send(peer, {
|
|
92
|
+
id,
|
|
93
|
+
error: {
|
|
94
|
+
code: "NOT_FOUND",
|
|
95
|
+
status: 404,
|
|
96
|
+
message: `Procedure "${path}" not found`
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const ctx = createContext();
|
|
102
|
+
if (contextFactory) try {
|
|
103
|
+
const baseResult = contextFactory(peer);
|
|
104
|
+
const base = baseResult instanceof Promise ? await baseResult : baseResult;
|
|
105
|
+
const keys = Object.keys(base);
|
|
106
|
+
for (let i = 0; i < keys.length; i++) ctx[keys[i]] = base[keys[i]];
|
|
107
|
+
} catch (err) {
|
|
108
|
+
releaseContext(ctx);
|
|
109
|
+
send(peer, {
|
|
110
|
+
id,
|
|
111
|
+
error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
|
|
112
|
+
});
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const ac = new AbortController();
|
|
116
|
+
const controllers = peerAbortControllers.get(peer);
|
|
117
|
+
controllers?.add(ac);
|
|
118
|
+
try {
|
|
119
|
+
const result = route.handler(ctx, input ?? {}, ac.signal);
|
|
120
|
+
const output = result instanceof Promise ? await result : result;
|
|
121
|
+
if (output && typeof output === "object" && Symbol.asyncIterator in output) {
|
|
122
|
+
const iter = output;
|
|
123
|
+
try {
|
|
124
|
+
for await (const data of iter) {
|
|
125
|
+
if (ac.signal.aborted) break;
|
|
126
|
+
send(peer, {
|
|
127
|
+
id,
|
|
128
|
+
data
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
if (!ac.signal.aborted) send(peer, {
|
|
132
|
+
id,
|
|
133
|
+
data: null,
|
|
134
|
+
done: true
|
|
135
|
+
});
|
|
136
|
+
} catch (err) {
|
|
137
|
+
if (!ac.signal.aborted) send(peer, {
|
|
138
|
+
id,
|
|
139
|
+
error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
|
|
140
|
+
});
|
|
141
|
+
} finally {
|
|
142
|
+
await iter.return?.();
|
|
143
|
+
}
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
send(peer, {
|
|
147
|
+
id,
|
|
148
|
+
result: output
|
|
149
|
+
});
|
|
150
|
+
} catch (err) {
|
|
151
|
+
send(peer, {
|
|
152
|
+
id,
|
|
153
|
+
error: (err instanceof SilgiError ? err : toSilgiError(err)).toJSON()
|
|
154
|
+
});
|
|
155
|
+
} finally {
|
|
156
|
+
controllers?.delete(ac);
|
|
157
|
+
releaseContext(ctx);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
close(peer, _details) {
|
|
161
|
+
const timer = peerKeepaliveTimers.get(peer);
|
|
162
|
+
if (timer) {
|
|
163
|
+
clearInterval(timer);
|
|
164
|
+
peerKeepaliveTimers.delete(peer);
|
|
165
|
+
}
|
|
166
|
+
const controllers = peerAbortControllers.get(peer);
|
|
167
|
+
if (controllers) {
|
|
168
|
+
for (const ac of controllers) ac.abort();
|
|
169
|
+
controllers.clear();
|
|
170
|
+
peerAbortControllers.delete(peer);
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
error(_peer, error) {
|
|
174
|
+
console.error("[silgi:ws] error:", error);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Attach WebSocket RPC handler to an existing Node.js HTTP server.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* ```ts
|
|
183
|
+
* import { createServer } from "node:http";
|
|
184
|
+
* import { attachWebSocket } from "silgi/ws";
|
|
185
|
+
*
|
|
186
|
+
* const server = createServer(httpHandler);
|
|
187
|
+
* attachWebSocket(server, appRouter);
|
|
188
|
+
* server.listen(3000);
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async function attachWebSocket(server, routerDef, options = {}) {
|
|
192
|
+
const nodeAdapter = (await import("crossws/adapters/node")).default;
|
|
193
|
+
const serverOptions = {};
|
|
194
|
+
if (options.compress) serverOptions.perMessageDeflate = typeof options.compress === "object" ? options.compress : true;
|
|
195
|
+
if (options.maxPayload !== void 0) serverOptions.maxPayload = options.maxPayload;
|
|
196
|
+
const ws = nodeAdapter({
|
|
197
|
+
hooks: createWSHooks(routerDef, options),
|
|
198
|
+
...Object.keys(serverOptions).length > 0 && { serverOptions }
|
|
199
|
+
});
|
|
200
|
+
server.on("upgrade", (req, socket, head) => {
|
|
201
|
+
ws.handleUpgrade(req, socket, head);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
//#endregion
|
|
205
|
+
export { attachWebSocket, createWSHooks };
|