raffel 0.1.2
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 +485 -0
- package/dist/adapters/grpc.d.ts +56 -0
- package/dist/adapters/grpc.d.ts.map +1 -0
- package/dist/adapters/grpc.int.test.d.ts +5 -0
- package/dist/adapters/grpc.int.test.d.ts.map +1 -0
- package/dist/adapters/grpc.int.test.js +168 -0
- package/dist/adapters/grpc.int.test.js.map +1 -0
- package/dist/adapters/grpc.js +434 -0
- package/dist/adapters/grpc.js.map +1 -0
- package/dist/adapters/http.d.ts +62 -0
- package/dist/adapters/http.d.ts.map +1 -0
- package/dist/adapters/http.int.test.d.ts +5 -0
- package/dist/adapters/http.int.test.d.ts.map +1 -0
- package/dist/adapters/http.int.test.js +396 -0
- package/dist/adapters/http.int.test.js.map +1 -0
- package/dist/adapters/http.js +606 -0
- package/dist/adapters/http.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +13 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/jsonrpc.d.ts +86 -0
- package/dist/adapters/jsonrpc.d.ts.map +1 -0
- package/dist/adapters/jsonrpc.int.test.d.ts +5 -0
- package/dist/adapters/jsonrpc.int.test.d.ts.map +1 -0
- package/dist/adapters/jsonrpc.int.test.js +640 -0
- package/dist/adapters/jsonrpc.int.test.js.map +1 -0
- package/dist/adapters/jsonrpc.js +338 -0
- package/dist/adapters/jsonrpc.js.map +1 -0
- package/dist/adapters/s3db/adapter.d.ts +105 -0
- package/dist/adapters/s3db/adapter.d.ts.map +1 -0
- package/dist/adapters/s3db/adapter.js +539 -0
- package/dist/adapters/s3db/adapter.js.map +1 -0
- package/dist/adapters/s3db/index.d.ts +20 -0
- package/dist/adapters/s3db/index.d.ts.map +1 -0
- package/dist/adapters/s3db/index.js +25 -0
- package/dist/adapters/s3db/index.js.map +1 -0
- package/dist/adapters/s3db/s3db.int.test.d.ts +5 -0
- package/dist/adapters/s3db/s3db.int.test.d.ts.map +1 -0
- package/dist/adapters/s3db/s3db.int.test.js +472 -0
- package/dist/adapters/s3db/s3db.int.test.js.map +1 -0
- package/dist/adapters/s3db/types.d.ts +277 -0
- package/dist/adapters/s3db/types.d.ts.map +1 -0
- package/dist/adapters/s3db/types.js +7 -0
- package/dist/adapters/s3db/types.js.map +1 -0
- package/dist/adapters/s3db/utils/etag.d.ts +65 -0
- package/dist/adapters/s3db/utils/etag.d.ts.map +1 -0
- package/dist/adapters/s3db/utils/etag.js +99 -0
- package/dist/adapters/s3db/utils/etag.js.map +1 -0
- package/dist/adapters/s3db/utils/guards.d.ts +121 -0
- package/dist/adapters/s3db/utils/guards.d.ts.map +1 -0
- package/dist/adapters/s3db/utils/guards.js +169 -0
- package/dist/adapters/s3db/utils/guards.js.map +1 -0
- package/dist/adapters/s3db/utils/index.d.ts +9 -0
- package/dist/adapters/s3db/utils/index.d.ts.map +1 -0
- package/dist/adapters/s3db/utils/index.js +10 -0
- package/dist/adapters/s3db/utils/index.js.map +1 -0
- package/dist/adapters/s3db/utils/populate.d.ts +89 -0
- package/dist/adapters/s3db/utils/populate.d.ts.map +1 -0
- package/dist/adapters/s3db/utils/populate.js +165 -0
- package/dist/adapters/s3db/utils/populate.js.map +1 -0
- package/dist/adapters/tcp.d.ts +59 -0
- package/dist/adapters/tcp.d.ts.map +1 -0
- package/dist/adapters/tcp.int.test.d.ts +5 -0
- package/dist/adapters/tcp.int.test.d.ts.map +1 -0
- package/dist/adapters/tcp.int.test.js +379 -0
- package/dist/adapters/tcp.int.test.js.map +1 -0
- package/dist/adapters/tcp.js +400 -0
- package/dist/adapters/tcp.js.map +1 -0
- package/dist/adapters/websocket.d.ts +75 -0
- package/dist/adapters/websocket.d.ts.map +1 -0
- package/dist/adapters/websocket.int.test.d.ts +5 -0
- package/dist/adapters/websocket.int.test.d.ts.map +1 -0
- package/dist/adapters/websocket.int.test.js +383 -0
- package/dist/adapters/websocket.int.test.js.map +1 -0
- package/dist/adapters/websocket.js +393 -0
- package/dist/adapters/websocket.js.map +1 -0
- package/dist/cache/drivers/file.d.ts +77 -0
- package/dist/cache/drivers/file.d.ts.map +1 -0
- package/dist/cache/drivers/file.js +329 -0
- package/dist/cache/drivers/file.js.map +1 -0
- package/dist/cache/drivers/index.d.ts +10 -0
- package/dist/cache/drivers/index.d.ts.map +1 -0
- package/dist/cache/drivers/index.js +10 -0
- package/dist/cache/drivers/index.js.map +1 -0
- package/dist/cache/drivers/memory.d.ts +138 -0
- package/dist/cache/drivers/memory.d.ts.map +1 -0
- package/dist/cache/drivers/memory.int.test.d.ts +5 -0
- package/dist/cache/drivers/memory.int.test.d.ts.map +1 -0
- package/dist/cache/drivers/memory.int.test.js +241 -0
- package/dist/cache/drivers/memory.int.test.js.map +1 -0
- package/dist/cache/drivers/memory.js +659 -0
- package/dist/cache/drivers/memory.js.map +1 -0
- package/dist/cache/drivers/redis.d.ts +84 -0
- package/dist/cache/drivers/redis.d.ts.map +1 -0
- package/dist/cache/drivers/redis.js +243 -0
- package/dist/cache/drivers/redis.js.map +1 -0
- package/dist/cache/drivers/s3db.d.ts +78 -0
- package/dist/cache/drivers/s3db.d.ts.map +1 -0
- package/dist/cache/drivers/s3db.js +216 -0
- package/dist/cache/drivers/s3db.js.map +1 -0
- package/dist/cache/factory.d.ts +77 -0
- package/dist/cache/factory.d.ts.map +1 -0
- package/dist/cache/factory.js +130 -0
- package/dist/cache/factory.js.map +1 -0
- package/dist/cache/index.d.ts +62 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +63 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/types.d.ts +328 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +8 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/channels/channel-manager.d.ts +39 -0
- package/dist/channels/channel-manager.d.ts.map +1 -0
- package/dist/channels/channel-manager.int.test.d.ts +5 -0
- package/dist/channels/channel-manager.int.test.d.ts.map +1 -0
- package/dist/channels/channel-manager.int.test.js +378 -0
- package/dist/channels/channel-manager.int.test.js.map +1 -0
- package/dist/channels/channel-manager.js +274 -0
- package/dist/channels/channel-manager.js.map +1 -0
- package/dist/channels/index.d.ts +47 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +48 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/channels/types.d.ts +265 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +39 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/core/ctx-call.int.test.d.ts +7 -0
- package/dist/core/ctx-call.int.test.d.ts.map +1 -0
- package/dist/core/ctx-call.int.test.js +263 -0
- package/dist/core/ctx-call.int.test.js.map +1 -0
- package/dist/core/event-delivery.d.ts +38 -0
- package/dist/core/event-delivery.d.ts.map +1 -0
- package/dist/core/event-delivery.js +131 -0
- package/dist/core/event-delivery.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/registry.d.ts +93 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +107 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.unit.test.d.ts +2 -0
- package/dist/core/registry.unit.test.d.ts.map +1 -0
- package/dist/core/registry.unit.test.js +133 -0
- package/dist/core/registry.unit.test.js.map +1 -0
- package/dist/core/router.d.ts +70 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.int.test.d.ts +2 -0
- package/dist/core/router.int.test.d.ts.map +1 -0
- package/dist/core/router.int.test.js +368 -0
- package/dist/core/router.int.test.js.map +1 -0
- package/dist/core/router.js +308 -0
- package/dist/core/router.js.map +1 -0
- package/dist/docs/generators/content-types.d.ts +10 -0
- package/dist/docs/generators/content-types.d.ts.map +1 -0
- package/dist/docs/generators/content-types.js +18 -0
- package/dist/docs/generators/content-types.js.map +1 -0
- package/dist/docs/generators/errors-types.d.ts +409 -0
- package/dist/docs/generators/errors-types.d.ts.map +1 -0
- package/dist/docs/generators/errors-types.js +224 -0
- package/dist/docs/generators/errors-types.js.map +1 -0
- package/dist/docs/generators/errors.d.ts +88 -0
- package/dist/docs/generators/errors.d.ts.map +1 -0
- package/dist/docs/generators/errors.js +224 -0
- package/dist/docs/generators/errors.js.map +1 -0
- package/dist/docs/generators/generators.int.test.d.ts +2 -0
- package/dist/docs/generators/generators.int.test.d.ts.map +1 -0
- package/dist/docs/generators/generators.int.test.js +105 -0
- package/dist/docs/generators/generators.int.test.js.map +1 -0
- package/dist/docs/generators/grpc-generator.d.ts +53 -0
- package/dist/docs/generators/grpc-generator.d.ts.map +1 -0
- package/dist/docs/generators/grpc-generator.js +109 -0
- package/dist/docs/generators/grpc-generator.js.map +1 -0
- package/dist/docs/generators/http-generator.d.ts +49 -0
- package/dist/docs/generators/http-generator.d.ts.map +1 -0
- package/dist/docs/generators/http-generator.js +561 -0
- package/dist/docs/generators/http-generator.js.map +1 -0
- package/dist/docs/generators/index.d.ts +17 -0
- package/dist/docs/generators/index.d.ts.map +1 -0
- package/dist/docs/generators/index.js +30 -0
- package/dist/docs/generators/index.js.map +1 -0
- package/dist/docs/generators/jsonrpc-generator.d.ts +53 -0
- package/dist/docs/generators/jsonrpc-generator.d.ts.map +1 -0
- package/dist/docs/generators/jsonrpc-generator.js +111 -0
- package/dist/docs/generators/jsonrpc-generator.js.map +1 -0
- package/dist/docs/generators/schema-converter.d.ts +117 -0
- package/dist/docs/generators/schema-converter.d.ts.map +1 -0
- package/dist/docs/generators/schema-converter.js +370 -0
- package/dist/docs/generators/schema-converter.js.map +1 -0
- package/dist/docs/generators/streams-generator.d.ts +85 -0
- package/dist/docs/generators/streams-generator.d.ts.map +1 -0
- package/dist/docs/generators/streams-generator.js +282 -0
- package/dist/docs/generators/streams-generator.js.map +1 -0
- package/dist/docs/generators/tcp-generator.d.ts +133 -0
- package/dist/docs/generators/tcp-generator.d.ts.map +1 -0
- package/dist/docs/generators/tcp-generator.js +227 -0
- package/dist/docs/generators/tcp-generator.js.map +1 -0
- package/dist/docs/generators/udp-generator.d.ts +119 -0
- package/dist/docs/generators/udp-generator.d.ts.map +1 -0
- package/dist/docs/generators/udp-generator.js +241 -0
- package/dist/docs/generators/udp-generator.js.map +1 -0
- package/dist/docs/generators/usd-generator.d.ts +182 -0
- package/dist/docs/generators/usd-generator.d.ts.map +1 -0
- package/dist/docs/generators/usd-generator.js +473 -0
- package/dist/docs/generators/usd-generator.js.map +1 -0
- package/dist/docs/generators/websocket-generator.d.ts +49 -0
- package/dist/docs/generators/websocket-generator.d.ts.map +1 -0
- package/dist/docs/generators/websocket-generator.js +319 -0
- package/dist/docs/generators/websocket-generator.js.map +1 -0
- package/dist/docs/index.d.ts +31 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +56 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/openapi/generator.d.ts +164 -0
- package/dist/docs/openapi/generator.d.ts.map +1 -0
- package/dist/docs/openapi/generator.int.test.d.ts +5 -0
- package/dist/docs/openapi/generator.int.test.d.ts.map +1 -0
- package/dist/docs/openapi/generator.int.test.js +260 -0
- package/dist/docs/openapi/generator.int.test.js.map +1 -0
- package/dist/docs/openapi/generator.js +690 -0
- package/dist/docs/openapi/generator.js.map +1 -0
- package/dist/docs/openapi/index.d.ts +7 -0
- package/dist/docs/openapi/index.d.ts.map +1 -0
- package/dist/docs/openapi/index.js +7 -0
- package/dist/docs/openapi/index.js.map +1 -0
- package/dist/docs/ui/html-builder.d.ts +19 -0
- package/dist/docs/ui/html-builder.d.ts.map +1 -0
- package/dist/docs/ui/html-builder.js +3065 -0
- package/dist/docs/ui/html-builder.js.map +1 -0
- package/dist/docs/ui/index.d.ts +8 -0
- package/dist/docs/ui/index.d.ts.map +1 -0
- package/dist/docs/ui/index.js +7 -0
- package/dist/docs/ui/index.js.map +1 -0
- package/dist/docs/ui/styles.d.ts +14 -0
- package/dist/docs/ui/styles.d.ts.map +1 -0
- package/dist/docs/ui/styles.js +2228 -0
- package/dist/docs/ui/styles.js.map +1 -0
- package/dist/docs/ui/types.d.ts +68 -0
- package/dist/docs/ui/types.d.ts.map +1 -0
- package/dist/docs/ui/types.js +7 -0
- package/dist/docs/ui/types.js.map +1 -0
- package/dist/docs/ui/utils.d.ts +24 -0
- package/dist/docs/ui/utils.d.ts.map +1 -0
- package/dist/docs/ui/utils.js +55 -0
- package/dist/docs/ui/utils.js.map +1 -0
- package/dist/docs/usd-middleware.d.ts +157 -0
- package/dist/docs/usd-middleware.d.ts.map +1 -0
- package/dist/docs/usd-middleware.js +118 -0
- package/dist/docs/usd-middleware.js.map +1 -0
- package/dist/dx/health/health.int.test.d.ts +5 -0
- package/dist/dx/health/health.int.test.d.ts.map +1 -0
- package/dist/dx/health/health.int.test.js +249 -0
- package/dist/dx/health/health.int.test.js.map +1 -0
- package/dist/dx/health/index.d.ts +82 -0
- package/dist/dx/health/index.d.ts.map +1 -0
- package/dist/dx/health/index.js +260 -0
- package/dist/dx/health/index.js.map +1 -0
- package/dist/dx/health/types.d.ts +104 -0
- package/dist/dx/health/types.d.ts.map +1 -0
- package/dist/dx/health/types.js +7 -0
- package/dist/dx/health/types.js.map +1 -0
- package/dist/dx/index.d.ts +12 -0
- package/dist/dx/index.d.ts.map +1 -0
- package/dist/dx/index.js +15 -0
- package/dist/dx/index.js.map +1 -0
- package/dist/dx/logging/formats.d.ts +46 -0
- package/dist/dx/logging/formats.d.ts.map +1 -0
- package/dist/dx/logging/formats.js +225 -0
- package/dist/dx/logging/formats.js.map +1 -0
- package/dist/dx/logging/http-logging.int.test.d.ts +5 -0
- package/dist/dx/logging/http-logging.int.test.d.ts.map +1 -0
- package/dist/dx/logging/http-logging.int.test.js +319 -0
- package/dist/dx/logging/http-logging.int.test.js.map +1 -0
- package/dist/dx/logging/index.d.ts +84 -0
- package/dist/dx/logging/index.d.ts.map +1 -0
- package/dist/dx/logging/index.js +164 -0
- package/dist/dx/logging/index.js.map +1 -0
- package/dist/dx/logging/types.d.ts +76 -0
- package/dist/dx/logging/types.d.ts.map +1 -0
- package/dist/dx/logging/types.js +7 -0
- package/dist/dx/logging/types.js.map +1 -0
- package/dist/errors/codes.d.ts +239 -0
- package/dist/errors/codes.d.ts.map +1 -0
- package/dist/errors/codes.js +286 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/factories.d.ts +142 -0
- package/dist/errors/factories.d.ts.map +1 -0
- package/dist/errors/factories.js +201 -0
- package/dist/errors/factories.js.map +1 -0
- package/dist/errors/factories.unit.test.d.ts +7 -0
- package/dist/errors/factories.unit.test.d.ts.map +1 -0
- package/dist/errors/factories.unit.test.js +358 -0
- package/dist/errors/factories.unit.test.js.map +1 -0
- package/dist/errors/index.d.ts +9 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +11 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/graphql/adapter.d.ts +28 -0
- package/dist/graphql/adapter.d.ts.map +1 -0
- package/dist/graphql/adapter.js +624 -0
- package/dist/graphql/adapter.js.map +1 -0
- package/dist/graphql/index.d.ts +35 -0
- package/dist/graphql/index.d.ts.map +1 -0
- package/dist/graphql/index.js +35 -0
- package/dist/graphql/index.js.map +1 -0
- package/dist/graphql/schema-generator.d.ts +23 -0
- package/dist/graphql/schema-generator.d.ts.map +1 -0
- package/dist/graphql/schema-generator.int.test.d.ts +5 -0
- package/dist/graphql/schema-generator.int.test.d.ts.map +1 -0
- package/dist/graphql/schema-generator.int.test.js +51 -0
- package/dist/graphql/schema-generator.int.test.js.map +1 -0
- package/dist/graphql/schema-generator.js +502 -0
- package/dist/graphql/schema-generator.js.map +1 -0
- package/dist/graphql/types.d.ts +172 -0
- package/dist/graphql/types.d.ts.map +1 -0
- package/dist/graphql/types.js +7 -0
- package/dist/graphql/types.js.map +1 -0
- package/dist/http/app.d.ts +156 -0
- package/dist/http/app.d.ts.map +1 -0
- package/dist/http/app.js +421 -0
- package/dist/http/app.js.map +1 -0
- package/dist/http/auth.d.ts +617 -0
- package/dist/http/auth.d.ts.map +1 -0
- package/dist/http/auth.js +913 -0
- package/dist/http/auth.js.map +1 -0
- package/dist/http/banner.d.ts +118 -0
- package/dist/http/banner.d.ts.map +1 -0
- package/dist/http/banner.js +187 -0
- package/dist/http/banner.js.map +1 -0
- package/dist/http/body-limit.d.ts +80 -0
- package/dist/http/body-limit.d.ts.map +1 -0
- package/dist/http/body-limit.js +187 -0
- package/dist/http/body-limit.js.map +1 -0
- package/dist/http/compress.d.ts +67 -0
- package/dist/http/compress.d.ts.map +1 -0
- package/dist/http/compress.js +226 -0
- package/dist/http/compress.js.map +1 -0
- package/dist/http/context-helpers.d.ts +171 -0
- package/dist/http/context-helpers.d.ts.map +1 -0
- package/dist/http/context-helpers.js +325 -0
- package/dist/http/context-helpers.js.map +1 -0
- package/dist/http/context.d.ts +157 -0
- package/dist/http/context.d.ts.map +1 -0
- package/dist/http/context.js +217 -0
- package/dist/http/context.js.map +1 -0
- package/dist/http/cookie.d.ts +291 -0
- package/dist/http/cookie.d.ts.map +1 -0
- package/dist/http/cookie.js +585 -0
- package/dist/http/cookie.js.map +1 -0
- package/dist/http/cors.d.ts +95 -0
- package/dist/http/cors.d.ts.map +1 -0
- package/dist/http/cors.js +177 -0
- package/dist/http/cors.js.map +1 -0
- package/dist/http/errors.d.ts +286 -0
- package/dist/http/errors.d.ts.map +1 -0
- package/dist/http/errors.js +487 -0
- package/dist/http/errors.js.map +1 -0
- package/dist/http/events.d.ts +251 -0
- package/dist/http/events.d.ts.map +1 -0
- package/dist/http/events.js +321 -0
- package/dist/http/events.js.map +1 -0
- package/dist/http/failban.d.ts +230 -0
- package/dist/http/failban.d.ts.map +1 -0
- package/dist/http/failban.js +351 -0
- package/dist/http/failban.js.map +1 -0
- package/dist/http/guards.d.ts +210 -0
- package/dist/http/guards.d.ts.map +1 -0
- package/dist/http/guards.js +327 -0
- package/dist/http/guards.js.map +1 -0
- package/dist/http/health.d.ts +197 -0
- package/dist/http/health.d.ts.map +1 -0
- package/dist/http/health.js +255 -0
- package/dist/http/health.js.map +1 -0
- package/dist/http/index.d.ts +64 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +130 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/oauth2.d.ts +280 -0
- package/dist/http/oauth2.d.ts.map +1 -0
- package/dist/http/oauth2.js +503 -0
- package/dist/http/oauth2.js.map +1 -0
- package/dist/http/oidc.d.ts +310 -0
- package/dist/http/oidc.d.ts.map +1 -0
- package/dist/http/oidc.js +470 -0
- package/dist/http/oidc.js.map +1 -0
- package/dist/http/rate-limit.d.ts +312 -0
- package/dist/http/rate-limit.d.ts.map +1 -0
- package/dist/http/rate-limit.js +522 -0
- package/dist/http/rate-limit.js.map +1 -0
- package/dist/http/response.d.ts +239 -0
- package/dist/http/response.d.ts.map +1 -0
- package/dist/http/response.js +352 -0
- package/dist/http/response.js.map +1 -0
- package/dist/http/security.d.ts +233 -0
- package/dist/http/security.d.ts.map +1 -0
- package/dist/http/security.js +230 -0
- package/dist/http/security.js.map +1 -0
- package/dist/http/serve.d.ts +72 -0
- package/dist/http/serve.d.ts.map +1 -0
- package/dist/http/serve.js +200 -0
- package/dist/http/serve.js.map +1 -0
- package/dist/http/session.d.ts +279 -0
- package/dist/http/session.d.ts.map +1 -0
- package/dist/http/session.js +354 -0
- package/dist/http/session.js.map +1 -0
- package/dist/http/static-s3.d.ts +176 -0
- package/dist/http/static-s3.d.ts.map +1 -0
- package/dist/http/static-s3.js +282 -0
- package/dist/http/static-s3.js.map +1 -0
- package/dist/http/static.d.ts +111 -0
- package/dist/http/static.d.ts.map +1 -0
- package/dist/http/static.js +373 -0
- package/dist/http/static.js.map +1 -0
- package/dist/http/stream-auth.d.ts +312 -0
- package/dist/http/stream-auth.d.ts.map +1 -0
- package/dist/http/stream-auth.js +404 -0
- package/dist/http/stream-auth.js.map +1 -0
- package/dist/http/templates.d.ts +262 -0
- package/dist/http/templates.d.ts.map +1 -0
- package/dist/http/templates.js +457 -0
- package/dist/http/templates.js.map +1 -0
- package/dist/http/types.d.ts +97 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +59 -0
- package/dist/http/types.js.map +1 -0
- package/dist/http/validate.d.ts +197 -0
- package/dist/http/validate.d.ts.map +1 -0
- package/dist/http/validate.js +437 -0
- package/dist/http/validate.js.map +1 -0
- package/dist/http/web-types.d.ts +38 -0
- package/dist/http/web-types.d.ts.map +1 -0
- package/dist/http/web-types.js +9 -0
- package/dist/http/web-types.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/cli.d.ts +18 -0
- package/dist/mcp/cli.d.ts.map +1 -0
- package/dist/mcp/cli.js +185 -0
- package/dist/mcp/cli.js.map +1 -0
- package/dist/mcp/docs/adapters.d.ts +10 -0
- package/dist/mcp/docs/adapters.d.ts.map +1 -0
- package/dist/mcp/docs/adapters.js +891 -0
- package/dist/mcp/docs/adapters.js.map +1 -0
- package/dist/mcp/docs/errors.d.ts +11 -0
- package/dist/mcp/docs/errors.d.ts.map +1 -0
- package/dist/mcp/docs/errors.js +549 -0
- package/dist/mcp/docs/errors.js.map +1 -0
- package/dist/mcp/docs/index.d.ts +38 -0
- package/dist/mcp/docs/index.d.ts.map +1 -0
- package/dist/mcp/docs/index.js +94 -0
- package/dist/mcp/docs/index.js.map +1 -0
- package/dist/mcp/docs/interceptors.d.ts +18 -0
- package/dist/mcp/docs/interceptors.d.ts.map +1 -0
- package/dist/mcp/docs/interceptors.js +872 -0
- package/dist/mcp/docs/interceptors.js.map +1 -0
- package/dist/mcp/docs/patterns.d.ts +12 -0
- package/dist/mcp/docs/patterns.d.ts.map +1 -0
- package/dist/mcp/docs/patterns.js +1099 -0
- package/dist/mcp/docs/patterns.js.map +1 -0
- package/dist/mcp/docs/quickstart.d.ts +52 -0
- package/dist/mcp/docs/quickstart.d.ts.map +1 -0
- package/dist/mcp/docs/quickstart.js +682 -0
- package/dist/mcp/docs/quickstart.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +18 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/prompts/index.d.ts +11 -0
- package/dist/mcp/prompts/index.d.ts.map +1 -0
- package/dist/mcp/prompts/index.js +596 -0
- package/dist/mcp/prompts/index.js.map +1 -0
- package/dist/mcp/resources/index.d.ts +10 -0
- package/dist/mcp/resources/index.d.ts.map +1 -0
- package/dist/mcp/resources/index.js +262 -0
- package/dist/mcp/resources/index.js.map +1 -0
- package/dist/mcp/server.d.ts +35 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +452 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/definitions.d.ts +15 -0
- package/dist/mcp/tools/definitions.d.ts.map +1 -0
- package/dist/mcp/tools/definitions.js +395 -0
- package/dist/mcp/tools/definitions.js.map +1 -0
- package/dist/mcp/tools/handlers.d.ts +8 -0
- package/dist/mcp/tools/handlers.d.ts.map +1 -0
- package/dist/mcp/tools/handlers.js +883 -0
- package/dist/mcp/tools/handlers.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +8 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +8 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/types.d.ts +248 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +13 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/metrics/exporters.d.ts +20 -0
- package/dist/metrics/exporters.d.ts.map +1 -0
- package/dist/metrics/exporters.js +122 -0
- package/dist/metrics/exporters.js.map +1 -0
- package/dist/metrics/index.d.ts +11 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +10 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/interceptor.d.ts +29 -0
- package/dist/metrics/interceptor.d.ts.map +1 -0
- package/dist/metrics/interceptor.js +146 -0
- package/dist/metrics/interceptor.js.map +1 -0
- package/dist/metrics/metrics.int.test.d.ts +5 -0
- package/dist/metrics/metrics.int.test.d.ts.map +1 -0
- package/dist/metrics/metrics.int.test.js +288 -0
- package/dist/metrics/metrics.int.test.js.map +1 -0
- package/dist/metrics/registry.d.ts +11 -0
- package/dist/metrics/registry.d.ts.map +1 -0
- package/dist/metrics/registry.js +178 -0
- package/dist/metrics/registry.js.map +1 -0
- package/dist/metrics/types.d.ts +107 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +21 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/middleware/auth.d.ts +231 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.int.test.d.ts +5 -0
- package/dist/middleware/auth.int.test.d.ts.map +1 -0
- package/dist/middleware/auth.int.test.js +366 -0
- package/dist/middleware/auth.int.test.js.map +1 -0
- package/dist/middleware/auth.js +413 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/compose.d.ts +102 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.int.test.d.ts +7 -0
- package/dist/middleware/compose.int.test.d.ts.map +1 -0
- package/dist/middleware/compose.int.test.js +238 -0
- package/dist/middleware/compose.int.test.js.map +1 -0
- package/dist/middleware/compose.js +152 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/http/compression.d.ts +92 -0
- package/dist/middleware/http/compression.d.ts.map +1 -0
- package/dist/middleware/http/compression.js +264 -0
- package/dist/middleware/http/compression.js.map +1 -0
- package/dist/middleware/http/index.d.ts +10 -0
- package/dist/middleware/http/index.d.ts.map +1 -0
- package/dist/middleware/http/index.js +11 -0
- package/dist/middleware/http/index.js.map +1 -0
- package/dist/middleware/http/security.d.ts +71 -0
- package/dist/middleware/http/security.d.ts.map +1 -0
- package/dist/middleware/http/security.js +263 -0
- package/dist/middleware/http/security.js.map +1 -0
- package/dist/middleware/index.d.ts +28 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +58 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/interceptors/bulkhead.d.ts +104 -0
- package/dist/middleware/interceptors/bulkhead.d.ts.map +1 -0
- package/dist/middleware/interceptors/bulkhead.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/bulkhead.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/bulkhead.int.test.js +263 -0
- package/dist/middleware/interceptors/bulkhead.int.test.js.map +1 -0
- package/dist/middleware/interceptors/bulkhead.js +260 -0
- package/dist/middleware/interceptors/bulkhead.js.map +1 -0
- package/dist/middleware/interceptors/cache.d.ts +218 -0
- package/dist/middleware/interceptors/cache.d.ts.map +1 -0
- package/dist/middleware/interceptors/cache.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/cache.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/cache.int.test.js +470 -0
- package/dist/middleware/interceptors/cache.int.test.js.map +1 -0
- package/dist/middleware/interceptors/cache.js +505 -0
- package/dist/middleware/interceptors/cache.js.map +1 -0
- package/dist/middleware/interceptors/circuit-breaker.d.ts +72 -0
- package/dist/middleware/interceptors/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/circuit-breaker.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/circuit-breaker.int.test.js +253 -0
- package/dist/middleware/interceptors/circuit-breaker.int.test.js.map +1 -0
- package/dist/middleware/interceptors/circuit-breaker.js +268 -0
- package/dist/middleware/interceptors/circuit-breaker.js.map +1 -0
- package/dist/middleware/interceptors/dedup.d.ts +105 -0
- package/dist/middleware/interceptors/dedup.d.ts.map +1 -0
- package/dist/middleware/interceptors/dedup.js +219 -0
- package/dist/middleware/interceptors/dedup.js.map +1 -0
- package/dist/middleware/interceptors/fallback.d.ts +94 -0
- package/dist/middleware/interceptors/fallback.d.ts.map +1 -0
- package/dist/middleware/interceptors/fallback.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/fallback.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/fallback.int.test.js +211 -0
- package/dist/middleware/interceptors/fallback.int.test.js.map +1 -0
- package/dist/middleware/interceptors/fallback.js +161 -0
- package/dist/middleware/interceptors/fallback.js.map +1 -0
- package/dist/middleware/interceptors/index.d.ts +24 -0
- package/dist/middleware/interceptors/index.d.ts.map +1 -0
- package/dist/middleware/interceptors/index.js +28 -0
- package/dist/middleware/interceptors/index.js.map +1 -0
- package/dist/middleware/interceptors/logging.d.ts +62 -0
- package/dist/middleware/interceptors/logging.d.ts.map +1 -0
- package/dist/middleware/interceptors/logging.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/logging.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/logging.int.test.js +144 -0
- package/dist/middleware/interceptors/logging.int.test.js.map +1 -0
- package/dist/middleware/interceptors/logging.js +294 -0
- package/dist/middleware/interceptors/logging.js.map +1 -0
- package/dist/middleware/interceptors/rate-limit.d.ts +147 -0
- package/dist/middleware/interceptors/rate-limit.d.ts.map +1 -0
- package/dist/middleware/interceptors/rate-limit.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/rate-limit.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/rate-limit.int.test.js +221 -0
- package/dist/middleware/interceptors/rate-limit.int.test.js.map +1 -0
- package/dist/middleware/interceptors/rate-limit.js +376 -0
- package/dist/middleware/interceptors/rate-limit.js.map +1 -0
- package/dist/middleware/interceptors/request-id.d.ts +63 -0
- package/dist/middleware/interceptors/request-id.d.ts.map +1 -0
- package/dist/middleware/interceptors/request-id.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/request-id.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/request-id.int.test.js +136 -0
- package/dist/middleware/interceptors/request-id.int.test.js.map +1 -0
- package/dist/middleware/interceptors/request-id.js +119 -0
- package/dist/middleware/interceptors/request-id.js.map +1 -0
- package/dist/middleware/interceptors/retry.d.ts +80 -0
- package/dist/middleware/interceptors/retry.d.ts.map +1 -0
- package/dist/middleware/interceptors/retry.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/retry.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/retry.int.test.js +534 -0
- package/dist/middleware/interceptors/retry.int.test.js.map +1 -0
- package/dist/middleware/interceptors/retry.js +275 -0
- package/dist/middleware/interceptors/retry.js.map +1 -0
- package/dist/middleware/interceptors/size-limit.d.ts +145 -0
- package/dist/middleware/interceptors/size-limit.d.ts.map +1 -0
- package/dist/middleware/interceptors/size-limit.js +231 -0
- package/dist/middleware/interceptors/size-limit.js.map +1 -0
- package/dist/middleware/interceptors/timeout.d.ts +121 -0
- package/dist/middleware/interceptors/timeout.d.ts.map +1 -0
- package/dist/middleware/interceptors/timeout.int.test.d.ts +5 -0
- package/dist/middleware/interceptors/timeout.int.test.d.ts.map +1 -0
- package/dist/middleware/interceptors/timeout.int.test.js +228 -0
- package/dist/middleware/interceptors/timeout.int.test.js.map +1 -0
- package/dist/middleware/interceptors/timeout.js +253 -0
- package/dist/middleware/interceptors/timeout.js.map +1 -0
- package/dist/middleware/presets.d.ts +214 -0
- package/dist/middleware/presets.d.ts.map +1 -0
- package/dist/middleware/presets.js +329 -0
- package/dist/middleware/presets.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +105 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.int.test.d.ts +5 -0
- package/dist/middleware/rate-limit.int.test.d.ts.map +1 -0
- package/dist/middleware/rate-limit.int.test.js +350 -0
- package/dist/middleware/rate-limit.int.test.js.map +1 -0
- package/dist/middleware/rate-limit.js +206 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/types.d.ts +371 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +7 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/openapi/index.d.ts +9 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +9 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/rate-limit/drivers/filesystem.d.ts +17 -0
- package/dist/rate-limit/drivers/filesystem.d.ts.map +1 -0
- package/dist/rate-limit/drivers/filesystem.js +85 -0
- package/dist/rate-limit/drivers/filesystem.js.map +1 -0
- package/dist/rate-limit/drivers/memory.d.ts +15 -0
- package/dist/rate-limit/drivers/memory.d.ts.map +1 -0
- package/dist/rate-limit/drivers/memory.js +55 -0
- package/dist/rate-limit/drivers/memory.js.map +1 -0
- package/dist/rate-limit/drivers/redis.d.ts +12 -0
- package/dist/rate-limit/drivers/redis.d.ts.map +1 -0
- package/dist/rate-limit/drivers/redis.js +46 -0
- package/dist/rate-limit/drivers/redis.js.map +1 -0
- package/dist/rate-limit/factory.d.ts +11 -0
- package/dist/rate-limit/factory.d.ts.map +1 -0
- package/dist/rate-limit/factory.js +33 -0
- package/dist/rate-limit/factory.js.map +1 -0
- package/dist/rate-limit/index.d.ts +6 -0
- package/dist/rate-limit/index.d.ts.map +1 -0
- package/dist/rate-limit/index.js +5 -0
- package/dist/rate-limit/index.js.map +1 -0
- package/dist/rate-limit/types.d.ts +51 -0
- package/dist/rate-limit/types.d.ts.map +1 -0
- package/dist/rate-limit/types.js +7 -0
- package/dist/rate-limit/types.js.map +1 -0
- package/dist/server/builder.d.ts +11 -0
- package/dist/server/builder.d.ts.map +1 -0
- package/dist/server/builder.int.test.d.ts +7 -0
- package/dist/server/builder.int.test.d.ts.map +1 -0
- package/dist/server/builder.int.test.js +414 -0
- package/dist/server/builder.int.test.js.map +1 -0
- package/dist/server/builder.js +1682 -0
- package/dist/server/builder.js.map +1 -0
- package/dist/server/channel-utils.d.ts +34 -0
- package/dist/server/channel-utils.d.ts.map +1 -0
- package/dist/server/channel-utils.js +131 -0
- package/dist/server/channel-utils.js.map +1 -0
- package/dist/server/discovery-utils.d.ts +32 -0
- package/dist/server/discovery-utils.d.ts.map +1 -0
- package/dist/server/discovery-utils.js +118 -0
- package/dist/server/discovery-utils.js.map +1 -0
- package/dist/server/errors.d.ts +186 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +397 -0
- package/dist/server/errors.js.map +1 -0
- package/dist/server/fs-routes/index.d.ts +66 -0
- package/dist/server/fs-routes/index.d.ts.map +1 -0
- package/dist/server/fs-routes/index.js +66 -0
- package/dist/server/fs-routes/index.js.map +1 -0
- package/dist/server/fs-routes/loader.d.ts +28 -0
- package/dist/server/fs-routes/loader.d.ts.map +1 -0
- package/dist/server/fs-routes/loader.int.test.d.ts +5 -0
- package/dist/server/fs-routes/loader.int.test.d.ts.map +1 -0
- package/dist/server/fs-routes/loader.int.test.js +48 -0
- package/dist/server/fs-routes/loader.int.test.js.map +1 -0
- package/dist/server/fs-routes/loader.js +586 -0
- package/dist/server/fs-routes/loader.js.map +1 -0
- package/dist/server/fs-routes/middleware-processor.d.ts +19 -0
- package/dist/server/fs-routes/middleware-processor.d.ts.map +1 -0
- package/dist/server/fs-routes/middleware-processor.js +232 -0
- package/dist/server/fs-routes/middleware-processor.js.map +1 -0
- package/dist/server/fs-routes/resources/index.d.ts +8 -0
- package/dist/server/fs-routes/resources/index.d.ts.map +1 -0
- package/dist/server/fs-routes/resources/index.js +8 -0
- package/dist/server/fs-routes/resources/index.js.map +1 -0
- package/dist/server/fs-routes/resources/loader.d.ts +16 -0
- package/dist/server/fs-routes/resources/loader.d.ts.map +1 -0
- package/dist/server/fs-routes/resources/loader.js +431 -0
- package/dist/server/fs-routes/resources/loader.js.map +1 -0
- package/dist/server/fs-routes/resources/types.d.ts +256 -0
- package/dist/server/fs-routes/resources/types.d.ts.map +1 -0
- package/dist/server/fs-routes/resources/types.js +8 -0
- package/dist/server/fs-routes/resources/types.js.map +1 -0
- package/dist/server/fs-routes/rest/index.d.ts +8 -0
- package/dist/server/fs-routes/rest/index.d.ts.map +1 -0
- package/dist/server/fs-routes/rest/index.js +8 -0
- package/dist/server/fs-routes/rest/index.js.map +1 -0
- package/dist/server/fs-routes/rest/loader.d.ts +11 -0
- package/dist/server/fs-routes/rest/loader.d.ts.map +1 -0
- package/dist/server/fs-routes/rest/loader.js +595 -0
- package/dist/server/fs-routes/rest/loader.js.map +1 -0
- package/dist/server/fs-routes/rest/types.d.ts +288 -0
- package/dist/server/fs-routes/rest/types.d.ts.map +1 -0
- package/dist/server/fs-routes/rest/types.js +50 -0
- package/dist/server/fs-routes/rest/types.js.map +1 -0
- package/dist/server/fs-routes/tcp/index.d.ts +8 -0
- package/dist/server/fs-routes/tcp/index.d.ts.map +1 -0
- package/dist/server/fs-routes/tcp/index.js +8 -0
- package/dist/server/fs-routes/tcp/index.js.map +1 -0
- package/dist/server/fs-routes/tcp/loader.d.ts +15 -0
- package/dist/server/fs-routes/tcp/loader.d.ts.map +1 -0
- package/dist/server/fs-routes/tcp/loader.js +402 -0
- package/dist/server/fs-routes/tcp/loader.js.map +1 -0
- package/dist/server/fs-routes/tcp/types.d.ts +215 -0
- package/dist/server/fs-routes/tcp/types.d.ts.map +1 -0
- package/dist/server/fs-routes/tcp/types.js +7 -0
- package/dist/server/fs-routes/tcp/types.js.map +1 -0
- package/dist/server/fs-routes/types.d.ts +437 -0
- package/dist/server/fs-routes/types.d.ts.map +1 -0
- package/dist/server/fs-routes/types.js +7 -0
- package/dist/server/fs-routes/types.js.map +1 -0
- package/dist/server/fs-routes/udp/index.d.ts +8 -0
- package/dist/server/fs-routes/udp/index.d.ts.map +1 -0
- package/dist/server/fs-routes/udp/index.js +8 -0
- package/dist/server/fs-routes/udp/index.js.map +1 -0
- package/dist/server/fs-routes/udp/loader.d.ts +15 -0
- package/dist/server/fs-routes/udp/loader.d.ts.map +1 -0
- package/dist/server/fs-routes/udp/loader.js +282 -0
- package/dist/server/fs-routes/udp/loader.js.map +1 -0
- package/dist/server/fs-routes/udp/types.d.ts +164 -0
- package/dist/server/fs-routes/udp/types.d.ts.map +1 -0
- package/dist/server/fs-routes/udp/types.js +7 -0
- package/dist/server/fs-routes/udp/types.js.map +1 -0
- package/dist/server/fs-routes/watcher.d.ts +34 -0
- package/dist/server/fs-routes/watcher.d.ts.map +1 -0
- package/dist/server/fs-routes/watcher.js +158 -0
- package/dist/server/fs-routes/watcher.js.map +1 -0
- package/dist/server/handler-builders.d.ts +44 -0
- package/dist/server/handler-builders.d.ts.map +1 -0
- package/dist/server/handler-builders.js +297 -0
- package/dist/server/handler-builders.js.map +1 -0
- package/dist/server/hooks.int.test.d.ts +7 -0
- package/dist/server/hooks.int.test.d.ts.map +1 -0
- package/dist/server/hooks.int.test.js +564 -0
- package/dist/server/hooks.int.test.js.map +1 -0
- package/dist/server/index.d.ts +18 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +37 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/protocol-config.d.ts +22 -0
- package/dist/server/protocol-config.d.ts.map +1 -0
- package/dist/server/protocol-config.js +61 -0
- package/dist/server/protocol-config.js.map +1 -0
- package/dist/server/resource-builder.d.ts +175 -0
- package/dist/server/resource-builder.d.ts.map +1 -0
- package/dist/server/resource-builder.js +212 -0
- package/dist/server/resource-builder.js.map +1 -0
- package/dist/server/rest-middleware.d.ts +45 -0
- package/dist/server/rest-middleware.d.ts.map +1 -0
- package/dist/server/rest-middleware.js +368 -0
- package/dist/server/rest-middleware.js.map +1 -0
- package/dist/server/route-discovery.d.ts +54 -0
- package/dist/server/route-discovery.d.ts.map +1 -0
- package/dist/server/route-discovery.int.test.d.ts +5 -0
- package/dist/server/route-discovery.int.test.d.ts.map +1 -0
- package/dist/server/route-discovery.int.test.js +49 -0
- package/dist/server/route-discovery.int.test.js.map +1 -0
- package/dist/server/route-discovery.js +154 -0
- package/dist/server/route-discovery.js.map +1 -0
- package/dist/server/router-module.d.ts +50 -0
- package/dist/server/router-module.d.ts.map +1 -0
- package/dist/server/router-module.js +250 -0
- package/dist/server/router-module.js.map +1 -0
- package/dist/server/shared-context.d.ts +140 -0
- package/dist/server/shared-context.d.ts.map +1 -0
- package/dist/server/shared-context.js +258 -0
- package/dist/server/shared-context.js.map +1 -0
- package/dist/server/types.d.ts +2160 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +7 -0
- package/dist/server/types.js.map +1 -0
- package/dist/stream/index.d.ts +3 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/raffel-stream.d.ts +17 -0
- package/dist/stream/raffel-stream.d.ts.map +1 -0
- package/dist/stream/raffel-stream.int.test.d.ts +2 -0
- package/dist/stream/raffel-stream.int.test.d.ts.map +1 -0
- package/dist/stream/raffel-stream.int.test.js +265 -0
- package/dist/stream/raffel-stream.int.test.js.map +1 -0
- package/dist/stream/raffel-stream.js +205 -0
- package/dist/stream/raffel-stream.js.map +1 -0
- package/dist/tracing/exporters.d.ts +47 -0
- package/dist/tracing/exporters.d.ts.map +1 -0
- package/dist/tracing/exporters.js +173 -0
- package/dist/tracing/exporters.js.map +1 -0
- package/dist/tracing/index.d.ts +43 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +46 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/interceptor.d.ts +20 -0
- package/dist/tracing/interceptor.d.ts.map +1 -0
- package/dist/tracing/interceptor.js +90 -0
- package/dist/tracing/interceptor.js.map +1 -0
- package/dist/tracing/sampler.d.ts +32 -0
- package/dist/tracing/sampler.d.ts.map +1 -0
- package/dist/tracing/sampler.js +111 -0
- package/dist/tracing/sampler.js.map +1 -0
- package/dist/tracing/span.d.ts +32 -0
- package/dist/tracing/span.d.ts.map +1 -0
- package/dist/tracing/span.js +139 -0
- package/dist/tracing/span.js.map +1 -0
- package/dist/tracing/tracer.d.ts +11 -0
- package/dist/tracing/tracer.d.ts.map +1 -0
- package/dist/tracing/tracer.js +149 -0
- package/dist/tracing/tracer.js.map +1 -0
- package/dist/tracing/tracing.int.test.d.ts +5 -0
- package/dist/tracing/tracing.int.test.d.ts.map +1 -0
- package/dist/tracing/tracing.int.test.js +412 -0
- package/dist/tracing/tracing.int.test.js.map +1 -0
- package/dist/tracing/types.d.ts +175 -0
- package/dist/tracing/types.d.ts.map +1 -0
- package/dist/tracing/types.js +16 -0
- package/dist/tracing/types.js.map +1 -0
- package/dist/types/context.d.ts +96 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +55 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/envelope.d.ts +57 -0
- package/dist/types/envelope.d.ts.map +1 -0
- package/dist/types/envelope.js +39 -0
- package/dist/types/envelope.js.map +1 -0
- package/dist/types/handlers.d.ts +142 -0
- package/dist/types/handlers.d.ts.map +1 -0
- package/dist/types/handlers.js +7 -0
- package/dist/types/handlers.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/stream.d.ts +69 -0
- package/dist/types/stream.d.ts.map +1 -0
- package/dist/types/stream.js +7 -0
- package/dist/types/stream.js.map +1 -0
- package/dist/ui/core/event-delivery.d.ts +38 -0
- package/dist/ui/core/event-delivery.d.ts.map +1 -0
- package/dist/ui/core/registry.d.ts +93 -0
- package/dist/ui/core/registry.d.ts.map +1 -0
- package/dist/ui/core/router.d.ts +70 -0
- package/dist/ui/core/router.d.ts.map +1 -0
- package/dist/ui/docs/openapi/generator.d.ts +164 -0
- package/dist/ui/docs/openapi/generator.d.ts.map +1 -0
- package/dist/ui/docs/openapi/index.d.ts +7 -0
- package/dist/ui/docs/openapi/index.d.ts.map +1 -0
- package/dist/ui/docs/ui/html-builder.d.ts +19 -0
- package/dist/ui/docs/ui/html-builder.d.ts.map +1 -0
- package/dist/ui/docs/ui/index.d.ts +8 -0
- package/dist/ui/docs/ui/index.d.ts.map +1 -0
- package/dist/ui/docs/ui/styles.d.ts +14 -0
- package/dist/ui/docs/ui/styles.d.ts.map +1 -0
- package/dist/ui/docs/ui/types.d.ts +68 -0
- package/dist/ui/docs/ui/types.d.ts.map +1 -0
- package/dist/ui/docs/ui/utils.d.ts +24 -0
- package/dist/ui/docs/ui/utils.d.ts.map +1 -0
- package/dist/ui/errors/codes.d.ts +239 -0
- package/dist/ui/errors/codes.d.ts.map +1 -0
- package/dist/ui/types/context.d.ts +96 -0
- package/dist/ui/types/context.d.ts.map +1 -0
- package/dist/ui/types/envelope.d.ts +57 -0
- package/dist/ui/types/envelope.d.ts.map +1 -0
- package/dist/ui/types/handlers.d.ts +142 -0
- package/dist/ui/types/handlers.d.ts.map +1 -0
- package/dist/ui/types/index.d.ts +7 -0
- package/dist/ui/types/index.d.ts.map +1 -0
- package/dist/ui/types/stream.d.ts +69 -0
- package/dist/ui/types/stream.d.ts.map +1 -0
- package/dist/ui/usd/builder/document.d.ts +190 -0
- package/dist/ui/usd/builder/document.d.ts.map +1 -0
- package/dist/ui/usd/builder/grpc.d.ts +119 -0
- package/dist/ui/usd/builder/grpc.d.ts.map +1 -0
- package/dist/ui/usd/builder/http.d.ts +131 -0
- package/dist/ui/usd/builder/http.d.ts.map +1 -0
- package/dist/ui/usd/builder/index.d.ts +15 -0
- package/dist/ui/usd/builder/index.d.ts.map +1 -0
- package/dist/ui/usd/builder/jsonrpc.d.ts +96 -0
- package/dist/ui/usd/builder/jsonrpc.d.ts.map +1 -0
- package/dist/ui/usd/builder/schema.d.ts +143 -0
- package/dist/ui/usd/builder/schema.d.ts.map +1 -0
- package/dist/ui/usd/builder/streams.d.ts +71 -0
- package/dist/ui/usd/builder/streams.d.ts.map +1 -0
- package/dist/ui/usd/builder/tcp.d.ts +61 -0
- package/dist/ui/usd/builder/tcp.d.ts.map +1 -0
- package/dist/ui/usd/builder/udp.d.ts +64 -0
- package/dist/ui/usd/builder/udp.d.ts.map +1 -0
- package/dist/ui/usd/builder/websocket.d.ts +131 -0
- package/dist/ui/usd/builder/websocket.d.ts.map +1 -0
- package/dist/ui/usd/export/index.d.ts +8 -0
- package/dist/ui/usd/export/index.d.ts.map +1 -0
- package/dist/ui/usd/export/openapi.d.ts +75 -0
- package/dist/ui/usd/export/openapi.d.ts.map +1 -0
- package/dist/ui/usd/index.d.ts +58 -0
- package/dist/ui/usd/index.d.ts.map +1 -0
- package/dist/ui/usd/parser/index.d.ts +93 -0
- package/dist/ui/usd/parser/index.d.ts.map +1 -0
- package/dist/ui/usd/parser/json.d.ts +34 -0
- package/dist/ui/usd/parser/json.d.ts.map +1 -0
- package/dist/ui/usd/parser/normalize.d.ts +20 -0
- package/dist/ui/usd/parser/normalize.d.ts.map +1 -0
- package/dist/ui/usd/parser/yaml.d.ts +41 -0
- package/dist/ui/usd/parser/yaml.d.ts.map +1 -0
- package/dist/ui/usd/spec/defaults.d.ts +121 -0
- package/dist/ui/usd/spec/defaults.d.ts.map +1 -0
- package/dist/ui/usd/spec/types.d.ts +704 -0
- package/dist/ui/usd/spec/types.d.ts.map +1 -0
- package/dist/ui/usd/utils/index.d.ts +6 -0
- package/dist/ui/usd/utils/index.d.ts.map +1 -0
- package/dist/ui/usd/utils/merge.d.ts +29 -0
- package/dist/ui/usd/utils/merge.d.ts.map +1 -0
- package/dist/ui/usd/utils/refs.d.ts +46 -0
- package/dist/ui/usd/utils/refs.d.ts.map +1 -0
- package/dist/ui/usd/validator/errors.d.ts +66 -0
- package/dist/ui/usd/validator/errors.d.ts.map +1 -0
- package/dist/ui/usd/validator/index.d.ts +68 -0
- package/dist/ui/usd/validator/index.d.ts.map +1 -0
- package/dist/ui/usd/validator/schema.d.ts +905 -0
- package/dist/ui/usd/validator/schema.d.ts.map +1 -0
- package/dist/ui/usd/validator/semantic.d.ts +15 -0
- package/dist/ui/usd/validator/semantic.d.ts.map +1 -0
- package/dist/ui/utils/id/alphabets.d.ts +68 -0
- package/dist/ui/utils/id/alphabets.d.ts.map +1 -0
- package/dist/ui/utils/id/entropy.d.ts +45 -0
- package/dist/ui/utils/id/entropy.d.ts.map +1 -0
- package/dist/ui/utils/id/index.d.ts +15 -0
- package/dist/ui/utils/id/index.d.ts.map +1 -0
- package/dist/ui/utils/id/sid.d.ts +86 -0
- package/dist/ui/utils/id/sid.d.ts.map +1 -0
- package/dist/ui/validation/adapters/ajv.d.ts +59 -0
- package/dist/ui/validation/adapters/ajv.d.ts.map +1 -0
- package/dist/ui/validation/adapters/fastest.d.ts +52 -0
- package/dist/ui/validation/adapters/fastest.d.ts.map +1 -0
- package/dist/ui/validation/adapters/index.d.ts +19 -0
- package/dist/ui/validation/adapters/index.d.ts.map +1 -0
- package/dist/ui/validation/adapters/joi.d.ts +51 -0
- package/dist/ui/validation/adapters/joi.d.ts.map +1 -0
- package/dist/ui/validation/adapters/yup.d.ts +53 -0
- package/dist/ui/validation/adapters/yup.d.ts.map +1 -0
- package/dist/ui/validation/adapters/zod.d.ts +52 -0
- package/dist/ui/validation/adapters/zod.d.ts.map +1 -0
- package/dist/ui/validation/index.d.ts +26 -0
- package/dist/ui/validation/index.d.ts.map +1 -0
- package/dist/ui/validation/schema.d.ts +150 -0
- package/dist/ui/validation/schema.d.ts.map +1 -0
- package/dist/ui/validation/types.d.ts +72 -0
- package/dist/ui/validation/types.d.ts.map +1 -0
- package/dist/usd/builder/document.d.ts +190 -0
- package/dist/usd/builder/document.d.ts.map +1 -0
- package/dist/usd/builder/document.js +418 -0
- package/dist/usd/builder/document.js.map +1 -0
- package/dist/usd/builder/grpc.d.ts +119 -0
- package/dist/usd/builder/grpc.d.ts.map +1 -0
- package/dist/usd/builder/grpc.js +220 -0
- package/dist/usd/builder/grpc.js.map +1 -0
- package/dist/usd/builder/http.d.ts +131 -0
- package/dist/usd/builder/http.d.ts.map +1 -0
- package/dist/usd/builder/http.js +248 -0
- package/dist/usd/builder/http.js.map +1 -0
- package/dist/usd/builder/index.d.ts +15 -0
- package/dist/usd/builder/index.d.ts.map +1 -0
- package/dist/usd/builder/index.js +18 -0
- package/dist/usd/builder/index.js.map +1 -0
- package/dist/usd/builder/jsonrpc.d.ts +96 -0
- package/dist/usd/builder/jsonrpc.d.ts.map +1 -0
- package/dist/usd/builder/jsonrpc.js +167 -0
- package/dist/usd/builder/jsonrpc.js.map +1 -0
- package/dist/usd/builder/schema.d.ts +143 -0
- package/dist/usd/builder/schema.d.ts.map +1 -0
- package/dist/usd/builder/schema.js +171 -0
- package/dist/usd/builder/schema.js.map +1 -0
- package/dist/usd/builder/streams.d.ts +71 -0
- package/dist/usd/builder/streams.d.ts.map +1 -0
- package/dist/usd/builder/streams.js +146 -0
- package/dist/usd/builder/streams.js.map +1 -0
- package/dist/usd/builder/tcp.d.ts +61 -0
- package/dist/usd/builder/tcp.d.ts.map +1 -0
- package/dist/usd/builder/tcp.js +150 -0
- package/dist/usd/builder/tcp.js.map +1 -0
- package/dist/usd/builder/udp.d.ts +64 -0
- package/dist/usd/builder/udp.d.ts.map +1 -0
- package/dist/usd/builder/udp.js +166 -0
- package/dist/usd/builder/udp.js.map +1 -0
- package/dist/usd/builder/websocket.d.ts +131 -0
- package/dist/usd/builder/websocket.d.ts.map +1 -0
- package/dist/usd/builder/websocket.js +218 -0
- package/dist/usd/builder/websocket.js.map +1 -0
- package/dist/usd/export/index.d.ts +8 -0
- package/dist/usd/export/index.d.ts.map +1 -0
- package/dist/usd/export/index.js +10 -0
- package/dist/usd/export/index.js.map +1 -0
- package/dist/usd/export/openapi.d.ts +75 -0
- package/dist/usd/export/openapi.d.ts.map +1 -0
- package/dist/usd/export/openapi.js +296 -0
- package/dist/usd/export/openapi.js.map +1 -0
- package/dist/usd/index.d.ts +58 -0
- package/dist/usd/index.d.ts.map +1 -0
- package/dist/usd/index.js +61 -0
- package/dist/usd/index.js.map +1 -0
- package/dist/usd/parser/index.d.ts +93 -0
- package/dist/usd/parser/index.d.ts.map +1 -0
- package/dist/usd/parser/index.js +137 -0
- package/dist/usd/parser/index.js.map +1 -0
- package/dist/usd/parser/json.d.ts +34 -0
- package/dist/usd/parser/json.d.ts.map +1 -0
- package/dist/usd/parser/json.js +68 -0
- package/dist/usd/parser/json.js.map +1 -0
- package/dist/usd/parser/normalize.d.ts +20 -0
- package/dist/usd/parser/normalize.d.ts.map +1 -0
- package/dist/usd/parser/normalize.js +271 -0
- package/dist/usd/parser/normalize.js.map +1 -0
- package/dist/usd/parser/yaml.d.ts +41 -0
- package/dist/usd/parser/yaml.d.ts.map +1 -0
- package/dist/usd/parser/yaml.js +66 -0
- package/dist/usd/parser/yaml.js.map +1 -0
- package/dist/usd/spec/defaults.d.ts +121 -0
- package/dist/usd/spec/defaults.d.ts.map +1 -0
- package/dist/usd/spec/defaults.js +204 -0
- package/dist/usd/spec/defaults.js.map +1 -0
- package/dist/usd/spec/index.d.ts +6 -0
- package/dist/usd/spec/index.d.ts.map +1 -0
- package/dist/usd/spec/index.js +6 -0
- package/dist/usd/spec/index.js.map +1 -0
- package/dist/usd/spec/types.d.ts +698 -0
- package/dist/usd/spec/types.d.ts.map +1 -0
- package/dist/usd/spec/types.js +33 -0
- package/dist/usd/spec/types.js.map +1 -0
- package/dist/usd/utils/index.d.ts +6 -0
- package/dist/usd/utils/index.d.ts.map +1 -0
- package/dist/usd/utils/index.js +6 -0
- package/dist/usd/utils/index.js.map +1 -0
- package/dist/usd/utils/merge.d.ts +29 -0
- package/dist/usd/utils/merge.d.ts.map +1 -0
- package/dist/usd/utils/merge.js +92 -0
- package/dist/usd/utils/merge.js.map +1 -0
- package/dist/usd/utils/refs.d.ts +46 -0
- package/dist/usd/utils/refs.d.ts.map +1 -0
- package/dist/usd/utils/refs.js +102 -0
- package/dist/usd/utils/refs.js.map +1 -0
- package/dist/usd/validator/errors.d.ts +66 -0
- package/dist/usd/validator/errors.d.ts.map +1 -0
- package/dist/usd/validator/errors.js +132 -0
- package/dist/usd/validator/errors.js.map +1 -0
- package/dist/usd/validator/index.d.ts +68 -0
- package/dist/usd/validator/index.d.ts.map +1 -0
- package/dist/usd/validator/index.js +92 -0
- package/dist/usd/validator/index.js.map +1 -0
- package/dist/usd/validator/schema.d.ts +905 -0
- package/dist/usd/validator/schema.d.ts.map +1 -0
- package/dist/usd/validator/schema.js +539 -0
- package/dist/usd/validator/schema.js.map +1 -0
- package/dist/usd/validator/semantic.d.ts +15 -0
- package/dist/usd/validator/semantic.d.ts.map +1 -0
- package/dist/usd/validator/semantic.js +452 -0
- package/dist/usd/validator/semantic.js.map +1 -0
- package/dist/utils/content-codecs.d.ts +14 -0
- package/dist/utils/content-codecs.d.ts.map +1 -0
- package/dist/utils/content-codecs.js +201 -0
- package/dist/utils/content-codecs.js.map +1 -0
- package/dist/utils/header-metadata.d.ts +6 -0
- package/dist/utils/header-metadata.d.ts.map +1 -0
- package/dist/utils/header-metadata.js +78 -0
- package/dist/utils/header-metadata.js.map +1 -0
- package/dist/utils/id/alphabets.d.ts +68 -0
- package/dist/utils/id/alphabets.d.ts.map +1 -0
- package/dist/utils/id/alphabets.js +90 -0
- package/dist/utils/id/alphabets.js.map +1 -0
- package/dist/utils/id/entropy.d.ts +45 -0
- package/dist/utils/id/entropy.d.ts.map +1 -0
- package/dist/utils/id/entropy.js +154 -0
- package/dist/utils/id/entropy.js.map +1 -0
- package/dist/utils/id/index.d.ts +15 -0
- package/dist/utils/id/index.d.ts.map +1 -0
- package/dist/utils/id/index.js +13 -0
- package/dist/utils/id/index.js.map +1 -0
- package/dist/utils/id/sid.d.ts +86 -0
- package/dist/utils/id/sid.d.ts.map +1 -0
- package/dist/utils/id/sid.js +109 -0
- package/dist/utils/id/sid.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/validation/adapters/ajv.d.ts +59 -0
- package/dist/validation/adapters/ajv.d.ts.map +1 -0
- package/dist/validation/adapters/ajv.js +136 -0
- package/dist/validation/adapters/ajv.js.map +1 -0
- package/dist/validation/adapters/fastest.d.ts +52 -0
- package/dist/validation/adapters/fastest.d.ts.map +1 -0
- package/dist/validation/adapters/fastest.js +215 -0
- package/dist/validation/adapters/fastest.js.map +1 -0
- package/dist/validation/adapters/index.d.ts +19 -0
- package/dist/validation/adapters/index.d.ts.map +1 -0
- package/dist/validation/adapters/index.js +19 -0
- package/dist/validation/adapters/index.js.map +1 -0
- package/dist/validation/adapters/joi.d.ts +51 -0
- package/dist/validation/adapters/joi.d.ts.map +1 -0
- package/dist/validation/adapters/joi.js +267 -0
- package/dist/validation/adapters/joi.js.map +1 -0
- package/dist/validation/adapters/yup.d.ts +53 -0
- package/dist/validation/adapters/yup.d.ts.map +1 -0
- package/dist/validation/adapters/yup.js +267 -0
- package/dist/validation/adapters/yup.js.map +1 -0
- package/dist/validation/adapters/zod.d.ts +52 -0
- package/dist/validation/adapters/zod.d.ts.map +1 -0
- package/dist/validation/adapters/zod.js +107 -0
- package/dist/validation/adapters/zod.js.map +1 -0
- package/dist/validation/index.d.ts +26 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +48 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/multi-validator.int.test.d.ts +7 -0
- package/dist/validation/multi-validator.int.test.d.ts.map +1 -0
- package/dist/validation/multi-validator.int.test.js +808 -0
- package/dist/validation/multi-validator.int.test.js.map +1 -0
- package/dist/validation/schema.d.ts +150 -0
- package/dist/validation/schema.d.ts.map +1 -0
- package/dist/validation/schema.int.test.d.ts +5 -0
- package/dist/validation/schema.int.test.d.ts.map +1 -0
- package/dist/validation/schema.int.test.js +340 -0
- package/dist/validation/schema.int.test.js.map +1 -0
- package/dist/validation/schema.js +271 -0
- package/dist/validation/schema.js.map +1 -0
- package/dist/validation/types.d.ts +72 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +14 -0
- package/dist/validation/types.js.map +1 -0
- package/package.json +222 -0
|
@@ -0,0 +1,1099 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raffel MCP - API Patterns Documentation
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: These patterns teach AI how to correctly construct Raffel code.
|
|
5
|
+
* Each pattern shows correct and incorrect examples to prevent invalid code generation.
|
|
6
|
+
*/
|
|
7
|
+
export const patterns = [
|
|
8
|
+
// === Pattern 1: Server Builder ===
|
|
9
|
+
{
|
|
10
|
+
name: 'Server Builder (Fluent API)',
|
|
11
|
+
description: 'The createServer() function returns a builder with fluent chainable methods. The server is configured through method chaining, NOT by passing a large options object.',
|
|
12
|
+
components: [
|
|
13
|
+
'createServer',
|
|
14
|
+
'procedure',
|
|
15
|
+
'stream',
|
|
16
|
+
'event',
|
|
17
|
+
'use',
|
|
18
|
+
'group',
|
|
19
|
+
'mount',
|
|
20
|
+
'provide',
|
|
21
|
+
],
|
|
22
|
+
signature: `createServer(options?)
|
|
23
|
+
.use(interceptor) // Add global interceptor
|
|
24
|
+
.provide('name', factory) // Register provider (DI)
|
|
25
|
+
.procedure('name') // Start procedure builder
|
|
26
|
+
.input(schema) // Input validation
|
|
27
|
+
.output(schema) // Output validation
|
|
28
|
+
.handler(fn) // Handler function
|
|
29
|
+
.stream('name') // Start stream builder
|
|
30
|
+
.handler(fn)
|
|
31
|
+
.event('name') // Start event builder
|
|
32
|
+
.delivery('at-least-once')
|
|
33
|
+
.handler(fn)
|
|
34
|
+
.group('prefix') // Group with shared prefix
|
|
35
|
+
.procedure('name').handler(fn)
|
|
36
|
+
.mount('/path', module) // Mount router module
|
|
37
|
+
.start() // Start the server`,
|
|
38
|
+
correctExamples: [
|
|
39
|
+
{
|
|
40
|
+
title: 'Basic Server with Procedures',
|
|
41
|
+
code: `import { createServer } from 'raffel'
|
|
42
|
+
|
|
43
|
+
const server = createServer({ port: 3000 })
|
|
44
|
+
.procedure('users.list')
|
|
45
|
+
.handler(async (input, ctx) => {
|
|
46
|
+
return await db.users.findMany()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
.procedure('users.get')
|
|
50
|
+
.handler(async ({ id }, ctx) => {
|
|
51
|
+
return await db.users.findUnique({ where: { id } })
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
.procedure('users.create')
|
|
55
|
+
.handler(async (input, ctx) => {
|
|
56
|
+
return await db.users.create({ data: input })
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
await server.start()`,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
title: 'Server with Middleware and Validation',
|
|
63
|
+
code: `import { createServer, createAuthMiddleware, createBearerStrategy } from 'raffel'
|
|
64
|
+
import { z } from 'zod'
|
|
65
|
+
|
|
66
|
+
const server = createServer({ port: 3000 })
|
|
67
|
+
.use(createAuthMiddleware({
|
|
68
|
+
strategy: createBearerStrategy({ validate: verifyToken })
|
|
69
|
+
}))
|
|
70
|
+
|
|
71
|
+
.procedure('users.create')
|
|
72
|
+
.input(z.object({
|
|
73
|
+
name: z.string().min(2),
|
|
74
|
+
email: z.string().email()
|
|
75
|
+
}))
|
|
76
|
+
.output(z.object({
|
|
77
|
+
id: z.string(),
|
|
78
|
+
name: z.string(),
|
|
79
|
+
email: z.string()
|
|
80
|
+
}))
|
|
81
|
+
.handler(async (input, ctx) => {
|
|
82
|
+
return await db.users.create({ data: input })
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
await server.start()`,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
wrongExamples: [
|
|
89
|
+
{
|
|
90
|
+
title: 'Wrong: Passing handlers in constructor',
|
|
91
|
+
code: `// WRONG - Don't pass handlers as constructor options
|
|
92
|
+
const server = createServer({
|
|
93
|
+
port: 3000,
|
|
94
|
+
procedures: { // This doesn't exist!
|
|
95
|
+
'users.list': async () => db.users.findMany()
|
|
96
|
+
}
|
|
97
|
+
})`,
|
|
98
|
+
description: 'Raffel uses fluent builder pattern, not a constructor with all options.',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
title: 'Wrong: Calling handler() before procedure()',
|
|
102
|
+
code: `// WRONG - Must call procedure() first
|
|
103
|
+
const server = createServer()
|
|
104
|
+
.handler(async () => {}) // Error: handler() requires procedure() first
|
|
105
|
+
.procedure('users.list')`,
|
|
106
|
+
description: 'handler() is a method on ProcedureBuilder, not on the server.',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
title: 'Wrong: Missing handler()',
|
|
110
|
+
code: `// WRONG - Every procedure needs a handler
|
|
111
|
+
const server = createServer()
|
|
112
|
+
.procedure('users.list')
|
|
113
|
+
.input(z.object({ limit: z.number() }))
|
|
114
|
+
.procedure('users.get') // Error: previous procedure has no handler!
|
|
115
|
+
.handler(async () => {})`,
|
|
116
|
+
description: 'Each procedure() must end with handler() before starting a new one.',
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
why: 'The fluent builder pattern provides type safety, discoverability, and clear visual structure. Each chain represents a complete handler definition.',
|
|
120
|
+
},
|
|
121
|
+
// === Pattern 2: Handler Functions ===
|
|
122
|
+
{
|
|
123
|
+
name: 'Handler Functions',
|
|
124
|
+
description: 'Handlers are async functions that receive (input, ctx) and return a value. The context provides auth, tracing, signal, deadline, and the call() function for inter-procedure calls.',
|
|
125
|
+
components: ['ProcedureHandler', 'StreamHandler', 'EventHandler', 'Context'],
|
|
126
|
+
signature: `// Procedure: (input: T, ctx: Context) => Promise<R>
|
|
127
|
+
async function handler(input, ctx) {
|
|
128
|
+
// Access context properties:
|
|
129
|
+
// ctx.auth - authentication info
|
|
130
|
+
// ctx.tracing - trace/span IDs
|
|
131
|
+
// ctx.signal - AbortSignal for cancellation
|
|
132
|
+
// ctx.deadline - request deadline
|
|
133
|
+
// ctx.requestId - unique request ID
|
|
134
|
+
// ctx.call('procedure', data) - call other procedures
|
|
135
|
+
// ctx.extensions - typed extensions
|
|
136
|
+
|
|
137
|
+
return result
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Stream (generator): async function*(input, ctx) { yield chunk }
|
|
141
|
+
// Event: (payload, ctx, ack?) => void | Promise<void>`,
|
|
142
|
+
correctExamples: [
|
|
143
|
+
{
|
|
144
|
+
title: 'Procedure Handler with Context',
|
|
145
|
+
code: `server.procedure('users.getProfile')
|
|
146
|
+
.handler(async (input, ctx) => {
|
|
147
|
+
// Check authentication
|
|
148
|
+
if (!ctx.auth.authenticated) {
|
|
149
|
+
throw new RaffelError('UNAUTHENTICATED', 'Login required')
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Use authenticated user
|
|
153
|
+
const userId = ctx.auth.principal.id
|
|
154
|
+
|
|
155
|
+
// Call another procedure
|
|
156
|
+
const settings = await ctx.call('users.getSettings', { userId })
|
|
157
|
+
|
|
158
|
+
return { user: ctx.auth.principal, settings }
|
|
159
|
+
})`,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
title: 'Handler with Cancellation',
|
|
163
|
+
code: `server.procedure('reports.generate')
|
|
164
|
+
.handler(async (input, ctx) => {
|
|
165
|
+
const report = []
|
|
166
|
+
|
|
167
|
+
for (const chunk of dataSource) {
|
|
168
|
+
// Check if request was cancelled
|
|
169
|
+
if (ctx.signal.aborted) {
|
|
170
|
+
throw new RaffelError('CANCELLED', 'Report generation cancelled')
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
report.push(await processChunk(chunk))
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return report
|
|
177
|
+
})`,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
title: 'Stream Handler (Generator)',
|
|
181
|
+
code: `server.stream('logs.tail')
|
|
182
|
+
.handler(async function* (input, ctx) {
|
|
183
|
+
const { filter } = input
|
|
184
|
+
|
|
185
|
+
while (!ctx.signal.aborted) {
|
|
186
|
+
const logs = await getNewLogs(filter)
|
|
187
|
+
|
|
188
|
+
for (const log of logs) {
|
|
189
|
+
yield log // Send to client
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
await sleep(1000)
|
|
193
|
+
}
|
|
194
|
+
})`,
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
title: 'Event Handler with Ack',
|
|
198
|
+
code: `server.event('orders.process')
|
|
199
|
+
.delivery('at-least-once')
|
|
200
|
+
.handler(async (payload, ctx, ack) => {
|
|
201
|
+
try {
|
|
202
|
+
await processOrder(payload)
|
|
203
|
+
ack() // Acknowledge successful processing
|
|
204
|
+
} catch (error) {
|
|
205
|
+
// Don't ack - will be retried
|
|
206
|
+
throw error
|
|
207
|
+
}
|
|
208
|
+
})`,
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
wrongExamples: [
|
|
212
|
+
{
|
|
213
|
+
title: 'Wrong: Express-style (req, res)',
|
|
214
|
+
code: `// WRONG - Raffel doesn't use req/res pattern
|
|
215
|
+
server.procedure('users.list')
|
|
216
|
+
.handler(async (req, res) => {
|
|
217
|
+
res.json(await db.users.findMany()) // Wrong!
|
|
218
|
+
})`,
|
|
219
|
+
description: 'Raffel handlers return values directly, not via res.json().',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
title: 'Wrong: Missing async',
|
|
223
|
+
code: `// WRONG - Handlers should be async
|
|
224
|
+
server.procedure('users.list')
|
|
225
|
+
.handler((input, ctx) => {
|
|
226
|
+
return db.users.findMany() // Returns Promise, but handler not async
|
|
227
|
+
})`,
|
|
228
|
+
description: 'Always use async functions for handlers, even if returning a Promise.',
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
title: 'Wrong: Arrow function for stream',
|
|
232
|
+
code: `// WRONG - Streams must be generator functions
|
|
233
|
+
server.stream('logs.tail')
|
|
234
|
+
.handler(async (input, ctx) => {
|
|
235
|
+
return createStream() // Wrong! Must use function*
|
|
236
|
+
})`,
|
|
237
|
+
description: 'Stream handlers must be async generator functions (function*).',
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
why: 'The (input, ctx) signature is consistent across all handler types. Context provides everything needed without global state or request objects.',
|
|
241
|
+
},
|
|
242
|
+
// === Pattern 3: Middleware Composition ===
|
|
243
|
+
{
|
|
244
|
+
name: 'Interceptor Composition',
|
|
245
|
+
description: 'Interceptors (middleware) wrap handler execution in an onion model. They can be applied globally, per-pattern, or per-procedure. Use composition helpers for conditional application.',
|
|
246
|
+
components: [
|
|
247
|
+
'use',
|
|
248
|
+
'compose',
|
|
249
|
+
'pipe',
|
|
250
|
+
'when',
|
|
251
|
+
'forPattern',
|
|
252
|
+
'forProcedures',
|
|
253
|
+
'except',
|
|
254
|
+
'branch',
|
|
255
|
+
],
|
|
256
|
+
signature: `// Interceptor signature
|
|
257
|
+
type Interceptor = (envelope, ctx, next) => Promise<unknown>
|
|
258
|
+
|
|
259
|
+
// Apply globally
|
|
260
|
+
server.use(interceptor)
|
|
261
|
+
|
|
262
|
+
// Apply per-pattern
|
|
263
|
+
server.use(forPattern('admin.*', interceptor))
|
|
264
|
+
|
|
265
|
+
// Apply conditionally
|
|
266
|
+
server.use(when(predicate, interceptor))
|
|
267
|
+
|
|
268
|
+
// Compose multiple
|
|
269
|
+
server.use(compose(i1, i2, i3))
|
|
270
|
+
|
|
271
|
+
// Exclude patterns
|
|
272
|
+
server.use(except('health.*', interceptor))`,
|
|
273
|
+
correctExamples: [
|
|
274
|
+
{
|
|
275
|
+
title: 'Global Middleware Stack',
|
|
276
|
+
code: `import {
|
|
277
|
+
createServer,
|
|
278
|
+
createAuthMiddleware,
|
|
279
|
+
createRateLimitInterceptor,
|
|
280
|
+
createMetricsInterceptor,
|
|
281
|
+
compose
|
|
282
|
+
} from 'raffel'
|
|
283
|
+
|
|
284
|
+
const server = createServer()
|
|
285
|
+
.use(compose(
|
|
286
|
+
createMetricsInterceptor({ registry: metrics }),
|
|
287
|
+
createRateLimitInterceptor({ maxRequests: 100 }),
|
|
288
|
+
createAuthMiddleware({ strategy: bearerStrategy })
|
|
289
|
+
))`,
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
title: 'Pattern-Based Middleware',
|
|
293
|
+
code: `import { createServer, forPattern, except, createRateLimitInterceptor } from 'raffel'
|
|
294
|
+
|
|
295
|
+
const server = createServer()
|
|
296
|
+
// Strict rate limit for auth endpoints
|
|
297
|
+
.use(forPattern('auth.*', createRateLimitInterceptor({
|
|
298
|
+
maxRequests: 5,
|
|
299
|
+
windowMs: 60000
|
|
300
|
+
})))
|
|
301
|
+
|
|
302
|
+
// Normal rate limit, excluding health checks
|
|
303
|
+
.use(except('health.*', createRateLimitInterceptor({
|
|
304
|
+
maxRequests: 100,
|
|
305
|
+
windowMs: 60000
|
|
306
|
+
})))`,
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
title: 'Conditional Middleware',
|
|
310
|
+
code: `import { createServer, when, branch, logging } from 'raffel'
|
|
311
|
+
|
|
312
|
+
const server = createServer()
|
|
313
|
+
// Only in development
|
|
314
|
+
.use(when(
|
|
315
|
+
() => process.env.NODE_ENV === 'development',
|
|
316
|
+
logging({ level: 'debug', format: 'pretty' })
|
|
317
|
+
))
|
|
318
|
+
|
|
319
|
+
// Different caching by auth status
|
|
320
|
+
.use(branch(
|
|
321
|
+
(ctx) => ctx.auth?.authenticated,
|
|
322
|
+
cache({ ttl: 60000 }), // Authenticated: 1 min
|
|
323
|
+
cache({ ttl: 300000 }) // Anonymous: 5 min
|
|
324
|
+
))`,
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
title: 'Custom Interceptor',
|
|
328
|
+
code: `// Create a custom interceptor
|
|
329
|
+
const timingInterceptor = async (envelope, ctx, next) => {
|
|
330
|
+
const start = Date.now()
|
|
331
|
+
|
|
332
|
+
try {
|
|
333
|
+
const result = await next()
|
|
334
|
+
const duration = Date.now() - start
|
|
335
|
+
console.log(\`\${envelope.procedure} took \${duration}ms\`)
|
|
336
|
+
return result
|
|
337
|
+
} catch (error) {
|
|
338
|
+
const duration = Date.now() - start
|
|
339
|
+
console.log(\`\${envelope.procedure} failed after \${duration}ms\`)
|
|
340
|
+
throw error
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
server.use(timingInterceptor)`,
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
wrongExamples: [
|
|
348
|
+
{
|
|
349
|
+
title: 'Wrong: Express-style middleware',
|
|
350
|
+
code: `// WRONG - Raffel interceptors are not (req, res, next)
|
|
351
|
+
server.use((req, res, next) => {
|
|
352
|
+
console.log(req.url)
|
|
353
|
+
next()
|
|
354
|
+
})`,
|
|
355
|
+
description: 'Raffel interceptors receive (envelope, ctx, next) and must return next() result.',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
title: 'Wrong: Not awaiting/returning next()',
|
|
359
|
+
code: `// WRONG - Must return the result of next()
|
|
360
|
+
server.use(async (envelope, ctx, next) => {
|
|
361
|
+
console.log('before')
|
|
362
|
+
next() // Missing return!
|
|
363
|
+
console.log('after')
|
|
364
|
+
})`,
|
|
365
|
+
description: 'Always return await next() to properly chain interceptors.',
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
title: 'Wrong: Middleware after procedures',
|
|
369
|
+
code: `// WRONG - Middleware should come before procedures
|
|
370
|
+
const server = createServer()
|
|
371
|
+
.procedure('users.list').handler(async () => [])
|
|
372
|
+
.use(authMiddleware) // Too late! Won't apply to users.list`,
|
|
373
|
+
description: 'Apply .use() before defining procedures, or use forPattern/forProcedures.',
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
why: 'The onion model ensures interceptors wrap handlers cleanly. Composition helpers provide fine-grained control without complex conditionals.',
|
|
377
|
+
},
|
|
378
|
+
// === Pattern 4: Providers (Dependency Injection) ===
|
|
379
|
+
{
|
|
380
|
+
name: 'Providers (Dependency Injection)',
|
|
381
|
+
description: 'Providers register singleton dependencies that are initialized at server.start() and available in ctx. Use for database clients, cache connections, external APIs.',
|
|
382
|
+
components: ['provide', 'ProviderFactory', 'onShutdown'],
|
|
383
|
+
signature: `.provide('name', factoryFn, options?)
|
|
384
|
+
|
|
385
|
+
// Factory receives ResolvedProviders of already-registered providers
|
|
386
|
+
type ProviderFactory<T> = (deps: ResolvedProviders) => T | Promise<T>
|
|
387
|
+
|
|
388
|
+
// Options
|
|
389
|
+
{
|
|
390
|
+
onShutdown?: (instance: T) => Promise<void> // Cleanup on server.stop()
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Access in handlers
|
|
394
|
+
ctx.db // If registered as 'db'
|
|
395
|
+
ctx.redis // If registered as 'redis'`,
|
|
396
|
+
correctExamples: [
|
|
397
|
+
{
|
|
398
|
+
title: 'Database Provider',
|
|
399
|
+
code: `import { createServer } from 'raffel'
|
|
400
|
+
import { PrismaClient } from '@prisma/client'
|
|
401
|
+
|
|
402
|
+
const server = createServer()
|
|
403
|
+
.provide('db', async () => {
|
|
404
|
+
const prisma = new PrismaClient()
|
|
405
|
+
await prisma.$connect()
|
|
406
|
+
return prisma
|
|
407
|
+
}, {
|
|
408
|
+
onShutdown: async (prisma) => {
|
|
409
|
+
await prisma.$disconnect()
|
|
410
|
+
}
|
|
411
|
+
})
|
|
412
|
+
|
|
413
|
+
.procedure('users.list')
|
|
414
|
+
.handler(async (input, ctx) => {
|
|
415
|
+
// ctx.db is PrismaClient, fully typed!
|
|
416
|
+
return await ctx.db.users.findMany()
|
|
417
|
+
})`,
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
title: 'Multiple Providers',
|
|
421
|
+
code: `import { createServer } from 'raffel'
|
|
422
|
+
import Redis from 'ioredis'
|
|
423
|
+
|
|
424
|
+
const server = createServer()
|
|
425
|
+
// Redis provider
|
|
426
|
+
.provide('redis', () => new Redis(process.env.REDIS_URL), {
|
|
427
|
+
onShutdown: (redis) => redis.quit()
|
|
428
|
+
})
|
|
429
|
+
|
|
430
|
+
// Cache depends on Redis
|
|
431
|
+
.provide('cache', ({ redis }) => ({
|
|
432
|
+
get: (key) => redis.get(key).then(JSON.parse),
|
|
433
|
+
set: (key, val, ttl) => redis.setex(key, ttl, JSON.stringify(val))
|
|
434
|
+
}))
|
|
435
|
+
|
|
436
|
+
.procedure('data.get')
|
|
437
|
+
.handler(async ({ key }, ctx) => {
|
|
438
|
+
// Try cache first
|
|
439
|
+
const cached = await ctx.cache.get(key)
|
|
440
|
+
if (cached) return cached
|
|
441
|
+
|
|
442
|
+
// Fetch and cache
|
|
443
|
+
const data = await fetchData(key)
|
|
444
|
+
await ctx.cache.set(key, data, 300)
|
|
445
|
+
return data
|
|
446
|
+
})`,
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
title: 'External API Client Provider',
|
|
450
|
+
code: `import { createServer } from 'raffel'
|
|
451
|
+
import { Client } from 'recker'
|
|
452
|
+
|
|
453
|
+
const server = createServer()
|
|
454
|
+
.provide('stripeApi', () => new Client({
|
|
455
|
+
baseUrl: 'https://api.stripe.com/v1',
|
|
456
|
+
headers: { Authorization: \`Bearer \${process.env.STRIPE_KEY}\` },
|
|
457
|
+
retry: { attempts: 3 }
|
|
458
|
+
}))
|
|
459
|
+
|
|
460
|
+
.procedure('payments.create')
|
|
461
|
+
.handler(async (input, ctx) => {
|
|
462
|
+
return await ctx.stripeApi.post('/charges', { body: input })
|
|
463
|
+
})`,
|
|
464
|
+
},
|
|
465
|
+
],
|
|
466
|
+
wrongExamples: [
|
|
467
|
+
{
|
|
468
|
+
title: 'Wrong: Global variable instead of provider',
|
|
469
|
+
code: `// WRONG - Don't use global variables
|
|
470
|
+
import { PrismaClient } from '@prisma/client'
|
|
471
|
+
|
|
472
|
+
const db = new PrismaClient() // Global, no lifecycle management!
|
|
473
|
+
|
|
474
|
+
const server = createServer()
|
|
475
|
+
.procedure('users.list')
|
|
476
|
+
.handler(async () => db.users.findMany())`,
|
|
477
|
+
description: "Global variables don't get proper cleanup on server.stop() and can't be typed in context.",
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
title: 'Wrong: Creating client in handler',
|
|
481
|
+
code: `// WRONG - Creates new connection per request
|
|
482
|
+
server.procedure('users.list')
|
|
483
|
+
.handler(async () => {
|
|
484
|
+
const db = new PrismaClient() // Connection created per request!
|
|
485
|
+
return await db.users.findMany()
|
|
486
|
+
})`,
|
|
487
|
+
description: 'Creating clients in handlers wastes resources. Use providers for singletons.',
|
|
488
|
+
},
|
|
489
|
+
],
|
|
490
|
+
why: 'Providers ensure proper lifecycle management (connect on start, cleanup on stop), dependency resolution, and type-safe access in handlers.',
|
|
491
|
+
},
|
|
492
|
+
// === Pattern 5: Router Modules ===
|
|
493
|
+
{
|
|
494
|
+
name: 'Router Modules',
|
|
495
|
+
description: 'Router modules encapsulate related procedures for modular code organization. They can be mounted at a path prefix and composed with module-specific interceptors.',
|
|
496
|
+
components: ['createRouterModule', 'mount', 'loadRouterModule'],
|
|
497
|
+
signature: `// Create a module
|
|
498
|
+
const usersModule = createRouterModule()
|
|
499
|
+
.use(moduleInterceptor)
|
|
500
|
+
.procedure('list').handler(fn)
|
|
501
|
+
.procedure('get').handler(fn)
|
|
502
|
+
|
|
503
|
+
// Mount on server
|
|
504
|
+
server.mount('/users', usersModule)
|
|
505
|
+
|
|
506
|
+
// File-based discovery
|
|
507
|
+
// src/http/users.ts exports default createRouterModule()...
|
|
508
|
+
// Auto-loaded as users.*`,
|
|
509
|
+
correctExamples: [
|
|
510
|
+
{
|
|
511
|
+
title: 'Creating a Router Module',
|
|
512
|
+
code: `// src/modules/users.ts
|
|
513
|
+
import { createRouterModule } from 'raffel'
|
|
514
|
+
import { z } from 'zod'
|
|
515
|
+
|
|
516
|
+
export const usersModule = createRouterModule()
|
|
517
|
+
.procedure('list')
|
|
518
|
+
.output(z.array(UserSchema))
|
|
519
|
+
.handler(async (input, ctx) => {
|
|
520
|
+
return await ctx.db.users.findMany()
|
|
521
|
+
})
|
|
522
|
+
|
|
523
|
+
.procedure('get')
|
|
524
|
+
.input(z.object({ id: z.string() }))
|
|
525
|
+
.output(UserSchema)
|
|
526
|
+
.handler(async ({ id }, ctx) => {
|
|
527
|
+
return await ctx.db.users.findUnique({ where: { id } })
|
|
528
|
+
})
|
|
529
|
+
|
|
530
|
+
.procedure('create')
|
|
531
|
+
.input(CreateUserSchema)
|
|
532
|
+
.output(UserSchema)
|
|
533
|
+
.handler(async (input, ctx) => {
|
|
534
|
+
return await ctx.db.users.create({ data: input })
|
|
535
|
+
})`,
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
title: 'Mounting Modules',
|
|
539
|
+
code: `// src/server.ts
|
|
540
|
+
import { createServer } from 'raffel'
|
|
541
|
+
import { usersModule } from './modules/users'
|
|
542
|
+
import { ordersModule } from './modules/orders'
|
|
543
|
+
import { adminModule } from './modules/admin'
|
|
544
|
+
|
|
545
|
+
const server = createServer()
|
|
546
|
+
// Mount modules at prefixes
|
|
547
|
+
.mount('/users', usersModule) // users.list, users.get, users.create
|
|
548
|
+
.mount('/orders', ordersModule) // orders.list, orders.get, ...
|
|
549
|
+
.mount('/admin', adminModule, {
|
|
550
|
+
interceptors: [requireAdmin] // Module-specific middleware
|
|
551
|
+
})`,
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
title: 'File-Based Discovery',
|
|
555
|
+
code: `// src/http/users.ts (file-based routing)
|
|
556
|
+
import { createRouterModule } from 'raffel'
|
|
557
|
+
|
|
558
|
+
export default createRouterModule()
|
|
559
|
+
.procedure('list')
|
|
560
|
+
.handler(async (_, ctx) => ctx.db.users.findMany())
|
|
561
|
+
|
|
562
|
+
.procedure('create')
|
|
563
|
+
.handler(async (input, ctx) => ctx.db.users.create({ data: input }))
|
|
564
|
+
|
|
565
|
+
// Server auto-discovers:
|
|
566
|
+
// src/http/users.ts → users.list, users.create
|
|
567
|
+
// src/http/orders.ts → orders.list, orders.create
|
|
568
|
+
|
|
569
|
+
import { createServer, loadRouterModule } from 'raffel'
|
|
570
|
+
|
|
571
|
+
const server = createServer({ discovery: true })
|
|
572
|
+
await server.start()`,
|
|
573
|
+
},
|
|
574
|
+
],
|
|
575
|
+
wrongExamples: [
|
|
576
|
+
{
|
|
577
|
+
title: 'Wrong: Using server methods in module',
|
|
578
|
+
code: `// WRONG - Modules don't have server methods
|
|
579
|
+
const module = createRouterModule()
|
|
580
|
+
.start() // Error! Modules don't have start()
|
|
581
|
+
.provide('db', fn) // Error! Modules don't have provide()`,
|
|
582
|
+
description: 'Router modules only have procedure/stream/event/use methods.',
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
title: 'Wrong: Mounting without prefix',
|
|
586
|
+
code: `// WRONG - mount() requires a prefix
|
|
587
|
+
server.mount(usersModule) // Error! Missing prefix
|
|
588
|
+
|
|
589
|
+
// CORRECT
|
|
590
|
+
server.mount('/users', usersModule)`,
|
|
591
|
+
description: 'The first argument to mount() must be the path prefix.',
|
|
592
|
+
},
|
|
593
|
+
],
|
|
594
|
+
why: 'Router modules enable clean separation of concerns, team ownership of domains, and modular testing.',
|
|
595
|
+
},
|
|
596
|
+
// === Pattern 6: Validation Schemas ===
|
|
597
|
+
{
|
|
598
|
+
name: 'Validation Schemas',
|
|
599
|
+
description: 'Input and output validation using your preferred validator (Zod, Yup, Joi, Ajv). Register the validator once, then use schemas in procedure definitions.',
|
|
600
|
+
components: ['registerValidator', 'input', 'output', 'createValidationInterceptor'],
|
|
601
|
+
signature: `// 1. Register validator (once, at startup)
|
|
602
|
+
import { z } from 'zod'
|
|
603
|
+
import { registerValidator, createZodAdapter } from 'raffel'
|
|
604
|
+
|
|
605
|
+
registerValidator(createZodAdapter(z))
|
|
606
|
+
|
|
607
|
+
// 2. Use schemas in procedures
|
|
608
|
+
.procedure('name')
|
|
609
|
+
.input(z.object({ ... })) // Validates request
|
|
610
|
+
.output(z.object({ ... })) // Validates response
|
|
611
|
+
.handler(fn)`,
|
|
612
|
+
correctExamples: [
|
|
613
|
+
{
|
|
614
|
+
title: 'Zod Validation',
|
|
615
|
+
code: `import { createServer, registerValidator, createZodAdapter } from 'raffel'
|
|
616
|
+
import { z } from 'zod'
|
|
617
|
+
|
|
618
|
+
// Register Zod adapter
|
|
619
|
+
registerValidator(createZodAdapter(z))
|
|
620
|
+
|
|
621
|
+
// Define schemas
|
|
622
|
+
const CreateUserInput = z.object({
|
|
623
|
+
name: z.string().min(2).max(100),
|
|
624
|
+
email: z.string().email(),
|
|
625
|
+
age: z.number().min(0).optional()
|
|
626
|
+
})
|
|
627
|
+
|
|
628
|
+
const UserOutput = z.object({
|
|
629
|
+
id: z.string(),
|
|
630
|
+
name: z.string(),
|
|
631
|
+
email: z.string(),
|
|
632
|
+
age: z.number().optional(),
|
|
633
|
+
createdAt: z.date()
|
|
634
|
+
})
|
|
635
|
+
|
|
636
|
+
const server = createServer()
|
|
637
|
+
.procedure('users.create')
|
|
638
|
+
.input(CreateUserInput)
|
|
639
|
+
.output(UserOutput)
|
|
640
|
+
.handler(async (input, ctx) => {
|
|
641
|
+
// input is typed as { name: string, email: string, age?: number }
|
|
642
|
+
return await ctx.db.users.create({ data: input })
|
|
643
|
+
})`,
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
title: 'Yup Validation',
|
|
647
|
+
code: `import { createServer, registerValidator, createYupAdapter } from 'raffel'
|
|
648
|
+
import * as yup from 'yup'
|
|
649
|
+
|
|
650
|
+
registerValidator(createYupAdapter(yup))
|
|
651
|
+
|
|
652
|
+
const CreateOrderInput = yup.object({
|
|
653
|
+
items: yup.array().of(yup.object({
|
|
654
|
+
productId: yup.string().required(),
|
|
655
|
+
quantity: yup.number().positive().integer().required()
|
|
656
|
+
})).min(1).required(),
|
|
657
|
+
shippingAddress: yup.string().required()
|
|
658
|
+
})
|
|
659
|
+
|
|
660
|
+
server.procedure('orders.create')
|
|
661
|
+
.input(CreateOrderInput)
|
|
662
|
+
.handler(async (input, ctx) => {
|
|
663
|
+
return await ctx.db.orders.create({ data: input })
|
|
664
|
+
})`,
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
title: 'Multiple Validators',
|
|
668
|
+
code: `import { registerValidator, createZodAdapter, createJoiAdapter } from 'raffel'
|
|
669
|
+
import { z } from 'zod'
|
|
670
|
+
import Joi from 'joi'
|
|
671
|
+
|
|
672
|
+
// Register multiple adapters
|
|
673
|
+
registerValidator(createZodAdapter(z))
|
|
674
|
+
registerValidator(createJoiAdapter(Joi), 'joi')
|
|
675
|
+
|
|
676
|
+
// Use Zod (default)
|
|
677
|
+
.procedure('users.create')
|
|
678
|
+
.input(z.object({ name: z.string() }))
|
|
679
|
+
|
|
680
|
+
// Use Joi explicitly
|
|
681
|
+
.procedure('orders.create')
|
|
682
|
+
.input(Joi.object({ total: Joi.number() }), { validator: 'joi' })`,
|
|
683
|
+
},
|
|
684
|
+
],
|
|
685
|
+
wrongExamples: [
|
|
686
|
+
{
|
|
687
|
+
title: 'Wrong: Using schema without registering adapter',
|
|
688
|
+
code: `// WRONG - Forgot to register the adapter
|
|
689
|
+
import { z } from 'zod'
|
|
690
|
+
|
|
691
|
+
server.procedure('users.create')
|
|
692
|
+
.input(z.object({ name: z.string() })) // Error! No adapter registered`,
|
|
693
|
+
description: 'Must call registerValidator(createZodAdapter(z)) first.',
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
title: 'Wrong: Manual validation in handler',
|
|
697
|
+
code: `// WRONG - Don't validate manually
|
|
698
|
+
server.procedure('users.create')
|
|
699
|
+
.handler(async (input, ctx) => {
|
|
700
|
+
// Unnecessary - use .input() instead
|
|
701
|
+
const result = schema.safeParse(input)
|
|
702
|
+
if (!result.success) throw new Error('Invalid')
|
|
703
|
+
return await db.create(result.data)
|
|
704
|
+
})`,
|
|
705
|
+
description: 'Use .input() and .output() for automatic validation.',
|
|
706
|
+
},
|
|
707
|
+
],
|
|
708
|
+
why: 'Declarative validation is cleaner, generates OpenAPI specs, provides consistent error responses, and types handlers automatically.',
|
|
709
|
+
},
|
|
710
|
+
// === Pattern 7: Error Handling ===
|
|
711
|
+
{
|
|
712
|
+
name: 'Error Handling',
|
|
713
|
+
description: 'Use RaffelError for typed errors with codes. Error codes map to HTTP status codes automatically. Use error hooks for global error handling.',
|
|
714
|
+
components: ['RaffelError', 'ErrorCodes', 'Errors', 'error hook'],
|
|
715
|
+
signature: `// Throw typed errors
|
|
716
|
+
throw new RaffelError(code, message, details?)
|
|
717
|
+
|
|
718
|
+
// Error codes
|
|
719
|
+
ErrorCodes = {
|
|
720
|
+
INVALID_ARGUMENT, // 400
|
|
721
|
+
UNAUTHENTICATED, // 401
|
|
722
|
+
PERMISSION_DENIED, // 403
|
|
723
|
+
NOT_FOUND, // 404
|
|
724
|
+
ALREADY_EXISTS, // 409
|
|
725
|
+
RESOURCE_EXHAUSTED, // 429
|
|
726
|
+
INTERNAL, // 500
|
|
727
|
+
UNAVAILABLE, // 503
|
|
728
|
+
DEADLINE_EXCEEDED // 504
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Global error hook
|
|
732
|
+
.error(async (error, ctx) => { ... })`,
|
|
733
|
+
correctExamples: [
|
|
734
|
+
{
|
|
735
|
+
title: 'Throwing Typed Errors',
|
|
736
|
+
code: `import { RaffelError, ErrorCodes } from 'raffel'
|
|
737
|
+
|
|
738
|
+
server.procedure('users.get')
|
|
739
|
+
.handler(async ({ id }, ctx) => {
|
|
740
|
+
const user = await ctx.db.users.findUnique({ where: { id } })
|
|
741
|
+
|
|
742
|
+
if (!user) {
|
|
743
|
+
throw new RaffelError(
|
|
744
|
+
ErrorCodes.NOT_FOUND,
|
|
745
|
+
\`User \${id} not found\`,
|
|
746
|
+
{ userId: id }
|
|
747
|
+
)
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
return user
|
|
751
|
+
})
|
|
752
|
+
|
|
753
|
+
server.procedure('users.create')
|
|
754
|
+
.handler(async (input, ctx) => {
|
|
755
|
+
const existing = await ctx.db.users.findByEmail(input.email)
|
|
756
|
+
|
|
757
|
+
if (existing) {
|
|
758
|
+
throw new RaffelError(
|
|
759
|
+
ErrorCodes.ALREADY_EXISTS,
|
|
760
|
+
'Email already registered',
|
|
761
|
+
{ email: input.email }
|
|
762
|
+
)
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return await ctx.db.users.create({ data: input })
|
|
766
|
+
})`,
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
title: 'Using Errors Helper',
|
|
770
|
+
code: `import { Errors } from 'raffel'
|
|
771
|
+
|
|
772
|
+
server.procedure('orders.process')
|
|
773
|
+
.handler(async (input, ctx) => {
|
|
774
|
+
if (!ctx.auth.authenticated) {
|
|
775
|
+
throw Errors.unauthenticated('Login required')
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
if (!ctx.auth.principal.roles.includes('admin')) {
|
|
779
|
+
throw Errors.permissionDenied('Admin access required')
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
const order = await ctx.db.orders.findUnique({ where: { id: input.id } })
|
|
783
|
+
if (!order) {
|
|
784
|
+
throw Errors.notFound(\`Order \${input.id} not found\`)
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return await processOrder(order)
|
|
788
|
+
})`,
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
title: 'Global Error Hook',
|
|
792
|
+
code: `const server = createServer()
|
|
793
|
+
.error(async (error, ctx) => {
|
|
794
|
+
// Log all errors
|
|
795
|
+
console.error({
|
|
796
|
+
requestId: ctx.requestId,
|
|
797
|
+
procedure: ctx.procedure,
|
|
798
|
+
error: error.message,
|
|
799
|
+
code: error.code,
|
|
800
|
+
stack: error.stack
|
|
801
|
+
})
|
|
802
|
+
|
|
803
|
+
// Report to error tracking
|
|
804
|
+
if (error.code === 'INTERNAL') {
|
|
805
|
+
await Sentry.captureException(error)
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// Don't modify the error - just observe
|
|
809
|
+
})`,
|
|
810
|
+
},
|
|
811
|
+
{
|
|
812
|
+
title: 'Per-Procedure Error Hook',
|
|
813
|
+
code: `server.procedure('payments.charge')
|
|
814
|
+
.error(async (error, ctx) => {
|
|
815
|
+
// Payment-specific error handling
|
|
816
|
+
await ctx.db.payments.update({
|
|
817
|
+
where: { id: ctx.paymentId },
|
|
818
|
+
data: { status: 'failed', error: error.message }
|
|
819
|
+
})
|
|
820
|
+
})
|
|
821
|
+
.handler(async (input, ctx) => {
|
|
822
|
+
ctx.paymentId = input.paymentId
|
|
823
|
+
return await stripe.charges.create(input)
|
|
824
|
+
})`,
|
|
825
|
+
},
|
|
826
|
+
],
|
|
827
|
+
wrongExamples: [
|
|
828
|
+
{
|
|
829
|
+
title: 'Wrong: Throwing plain Error',
|
|
830
|
+
code: `// WRONG - Use RaffelError for proper error codes
|
|
831
|
+
server.procedure('users.get')
|
|
832
|
+
.handler(async ({ id }) => {
|
|
833
|
+
const user = await db.findUser(id)
|
|
834
|
+
if (!user) {
|
|
835
|
+
throw new Error('User not found') // Returns 500, not 404!
|
|
836
|
+
}
|
|
837
|
+
})`,
|
|
838
|
+
description: 'Plain Error becomes INTERNAL (500). Use RaffelError with proper code.',
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
title: 'Wrong: Catching and re-throwing incorrectly',
|
|
842
|
+
code: `// WRONG - Loses error code
|
|
843
|
+
server.procedure('users.create')
|
|
844
|
+
.handler(async (input) => {
|
|
845
|
+
try {
|
|
846
|
+
return await db.create(input)
|
|
847
|
+
} catch (e) {
|
|
848
|
+
throw new Error(e.message) // Loses original error code!
|
|
849
|
+
}
|
|
850
|
+
})`,
|
|
851
|
+
description: 'Re-throw RaffelError or create new one with proper code.',
|
|
852
|
+
},
|
|
853
|
+
],
|
|
854
|
+
why: 'Typed errors ensure consistent error responses across protocols. HTTP, gRPC, and WebSocket all map errors correctly from error codes.',
|
|
855
|
+
},
|
|
856
|
+
// === Pattern 8: Streaming ===
|
|
857
|
+
{
|
|
858
|
+
name: 'Streaming',
|
|
859
|
+
description: 'Streaming handlers use async generators to yield data progressively. Use createStream() for more control over backpressure and multiplexing.',
|
|
860
|
+
components: ['stream', 'createStream', 'RaffelStream', 'ServerStreamHandler'],
|
|
861
|
+
signature: `// Simple generator
|
|
862
|
+
.stream('name')
|
|
863
|
+
.handler(async function* (input, ctx) {
|
|
864
|
+
yield chunk1
|
|
865
|
+
yield chunk2
|
|
866
|
+
})
|
|
867
|
+
|
|
868
|
+
// With RaffelStream for control
|
|
869
|
+
.stream('name')
|
|
870
|
+
.handler(async function* (input, ctx) {
|
|
871
|
+
const stream = createStream({ highWaterMark: 100 })
|
|
872
|
+
|
|
873
|
+
// Write from external source
|
|
874
|
+
source.on('data', (chunk) => stream.write(chunk))
|
|
875
|
+
source.on('end', () => stream.end())
|
|
876
|
+
|
|
877
|
+
// Yield from stream
|
|
878
|
+
for await (const chunk of stream) {
|
|
879
|
+
yield chunk
|
|
880
|
+
}
|
|
881
|
+
})`,
|
|
882
|
+
correctExamples: [
|
|
883
|
+
{
|
|
884
|
+
title: 'Simple Server Stream',
|
|
885
|
+
code: `server.stream('logs.tail')
|
|
886
|
+
.handler(async function* (input, ctx) {
|
|
887
|
+
const { filter, limit = 100 } = input
|
|
888
|
+
let count = 0
|
|
889
|
+
|
|
890
|
+
while (!ctx.signal.aborted && count < limit) {
|
|
891
|
+
const logs = await getNewLogs(filter)
|
|
892
|
+
|
|
893
|
+
for (const log of logs) {
|
|
894
|
+
yield log
|
|
895
|
+
count++
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
await sleep(1000)
|
|
899
|
+
}
|
|
900
|
+
})`,
|
|
901
|
+
},
|
|
902
|
+
{
|
|
903
|
+
title: 'Stream with Backpressure',
|
|
904
|
+
code: `import { createStream } from 'raffel'
|
|
905
|
+
|
|
906
|
+
server.stream('data.export')
|
|
907
|
+
.handler(async function* (input, ctx) {
|
|
908
|
+
const stream = createStream({
|
|
909
|
+
highWaterMark: 50 // Buffer up to 50 items
|
|
910
|
+
})
|
|
911
|
+
|
|
912
|
+
// Producer
|
|
913
|
+
const cursor = ctx.db.records.findMany({ cursor: true })
|
|
914
|
+
for await (const record of cursor) {
|
|
915
|
+
// write() returns false if buffer is full
|
|
916
|
+
const ready = stream.write(record)
|
|
917
|
+
if (!ready) {
|
|
918
|
+
// Wait for consumer to catch up
|
|
919
|
+
await stream.drain()
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
stream.end()
|
|
923
|
+
|
|
924
|
+
// Consumer
|
|
925
|
+
for await (const chunk of stream) {
|
|
926
|
+
yield chunk
|
|
927
|
+
}
|
|
928
|
+
})`,
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
title: 'Bidirectional Stream',
|
|
932
|
+
code: `server.stream('chat.room', { direction: 'bidi' })
|
|
933
|
+
.handler(async function* (inputStream, ctx) {
|
|
934
|
+
const output = createStream()
|
|
935
|
+
|
|
936
|
+
// Handle incoming messages
|
|
937
|
+
;(async () => {
|
|
938
|
+
for await (const message of inputStream) {
|
|
939
|
+
// Process and broadcast
|
|
940
|
+
const saved = await ctx.db.messages.create({ data: message })
|
|
941
|
+
output.write({ type: 'message', data: saved })
|
|
942
|
+
}
|
|
943
|
+
})()
|
|
944
|
+
|
|
945
|
+
// Yield outgoing messages
|
|
946
|
+
for await (const msg of output) {
|
|
947
|
+
yield msg
|
|
948
|
+
}
|
|
949
|
+
})`,
|
|
950
|
+
},
|
|
951
|
+
],
|
|
952
|
+
wrongExamples: [
|
|
953
|
+
{
|
|
954
|
+
title: 'Wrong: Regular async function for stream',
|
|
955
|
+
code: `// WRONG - Streams must be generators
|
|
956
|
+
server.stream('logs.tail')
|
|
957
|
+
.handler(async (input, ctx) => {
|
|
958
|
+
return [log1, log2, log3] // Returns array, not stream!
|
|
959
|
+
})`,
|
|
960
|
+
description: 'Use async function* (generator) for streaming, not regular async function.',
|
|
961
|
+
},
|
|
962
|
+
{
|
|
963
|
+
title: 'Wrong: Blocking generator',
|
|
964
|
+
code: `// WRONG - Blocks without yielding
|
|
965
|
+
server.stream('data.process')
|
|
966
|
+
.handler(async function* (input, ctx) {
|
|
967
|
+
const allData = await fetchAllData() // Waits for ALL data
|
|
968
|
+
for (const item of allData) {
|
|
969
|
+
yield item
|
|
970
|
+
}
|
|
971
|
+
})`,
|
|
972
|
+
description: 'Yield progressively as data becomes available, not after fetching all.',
|
|
973
|
+
},
|
|
974
|
+
],
|
|
975
|
+
why: 'Generators enable progressive data transfer without loading everything in memory. Backpressure prevents fast producers from overwhelming slow consumers.',
|
|
976
|
+
},
|
|
977
|
+
// === Pattern 9: Events ===
|
|
978
|
+
{
|
|
979
|
+
name: 'Event Delivery',
|
|
980
|
+
description: 'Events are fire-and-forget by default. Use delivery guarantees (at-least-once, at-most-once) for reliability. Ack function confirms successful processing.',
|
|
981
|
+
components: ['event', 'delivery', 'retryPolicy', 'deduplicationWindow', 'ack'],
|
|
982
|
+
signature: `.event('name')
|
|
983
|
+
.delivery('at-least-once') // Retry until ack
|
|
984
|
+
.retryPolicy({ // Retry config
|
|
985
|
+
maxAttempts: 5,
|
|
986
|
+
initialDelay: 1000,
|
|
987
|
+
maxDelay: 30000,
|
|
988
|
+
backoffMultiplier: 2
|
|
989
|
+
})
|
|
990
|
+
.handler(async (payload, ctx, ack) => {
|
|
991
|
+
await process(payload)
|
|
992
|
+
ack() // Acknowledge success
|
|
993
|
+
})`,
|
|
994
|
+
correctExamples: [
|
|
995
|
+
{
|
|
996
|
+
title: 'Best-Effort Event (Default)',
|
|
997
|
+
code: `server.event('analytics.pageView')
|
|
998
|
+
.handler(async (payload, ctx) => {
|
|
999
|
+
// Fire and forget - no retry
|
|
1000
|
+
await analytics.track(payload)
|
|
1001
|
+
})
|
|
1002
|
+
|
|
1003
|
+
// Emit from a procedure
|
|
1004
|
+
server.procedure('pages.view')
|
|
1005
|
+
.handler(async (input, ctx) => {
|
|
1006
|
+
await ctx.emit('analytics.pageView', { page: input.path, userId: ctx.auth?.principal?.id })
|
|
1007
|
+
return { ok: true }
|
|
1008
|
+
})`,
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
title: 'At-Least-Once Delivery',
|
|
1012
|
+
code: `server.event('orders.created')
|
|
1013
|
+
.delivery('at-least-once')
|
|
1014
|
+
.retryPolicy({
|
|
1015
|
+
maxAttempts: 5,
|
|
1016
|
+
initialDelay: 1000,
|
|
1017
|
+
maxDelay: 30000,
|
|
1018
|
+
backoffMultiplier: 2
|
|
1019
|
+
})
|
|
1020
|
+
.handler(async (payload, ctx, ack) => {
|
|
1021
|
+
// Process order - will retry if fails
|
|
1022
|
+
await sendConfirmationEmail(payload)
|
|
1023
|
+
await updateInventory(payload)
|
|
1024
|
+
|
|
1025
|
+
// Acknowledge successful processing
|
|
1026
|
+
ack()
|
|
1027
|
+
})`,
|
|
1028
|
+
},
|
|
1029
|
+
{
|
|
1030
|
+
title: 'At-Most-Once with Deduplication',
|
|
1031
|
+
code: `server.event('payments.processed')
|
|
1032
|
+
.delivery('at-most-once')
|
|
1033
|
+
.deduplicationWindow(60000) // 1 minute window
|
|
1034
|
+
.handler(async (payload, ctx) => {
|
|
1035
|
+
// Will only process once even if emitted multiple times
|
|
1036
|
+
await notifyUser(payload)
|
|
1037
|
+
})`,
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
title: 'Event with Error Handling',
|
|
1041
|
+
code: `server.event('notifications.send')
|
|
1042
|
+
.delivery('at-least-once')
|
|
1043
|
+
.retryPolicy({ maxAttempts: 3 })
|
|
1044
|
+
.handler(async (payload, ctx, ack) => {
|
|
1045
|
+
try {
|
|
1046
|
+
await sendPushNotification(payload)
|
|
1047
|
+
ack()
|
|
1048
|
+
} catch (error) {
|
|
1049
|
+
if (error.code === 'DEVICE_NOT_REGISTERED') {
|
|
1050
|
+
// Don't retry - device is invalid
|
|
1051
|
+
await ctx.db.devices.delete({ where: { id: payload.deviceId } })
|
|
1052
|
+
ack() // Acknowledge to stop retries
|
|
1053
|
+
}
|
|
1054
|
+
// Other errors: don't ack, will retry
|
|
1055
|
+
throw error
|
|
1056
|
+
}
|
|
1057
|
+
})`,
|
|
1058
|
+
},
|
|
1059
|
+
],
|
|
1060
|
+
wrongExamples: [
|
|
1061
|
+
{
|
|
1062
|
+
title: 'Wrong: Ack before processing',
|
|
1063
|
+
code: `// WRONG - Ack should be after successful processing
|
|
1064
|
+
server.event('orders.process')
|
|
1065
|
+
.delivery('at-least-once')
|
|
1066
|
+
.handler(async (payload, ctx, ack) => {
|
|
1067
|
+
ack() // Too early! What if processing fails?
|
|
1068
|
+
await processOrder(payload)
|
|
1069
|
+
})`,
|
|
1070
|
+
description: 'Only call ack() after successful processing to enable retries on failure.',
|
|
1071
|
+
},
|
|
1072
|
+
{
|
|
1073
|
+
title: 'Wrong: Not handling ack parameter',
|
|
1074
|
+
code: `// WRONG - at-least-once requires ack
|
|
1075
|
+
server.event('critical.event')
|
|
1076
|
+
.delivery('at-least-once')
|
|
1077
|
+
.handler(async (payload, ctx) => {
|
|
1078
|
+
// Missing ack parameter - will retry forever!
|
|
1079
|
+
await process(payload)
|
|
1080
|
+
})`,
|
|
1081
|
+
description: 'For at-least-once, always include and call the ack parameter.',
|
|
1082
|
+
},
|
|
1083
|
+
],
|
|
1084
|
+
why: 'Event delivery guarantees ensure critical events are processed reliably. Ack pattern enables exactly-once processing semantics.',
|
|
1085
|
+
},
|
|
1086
|
+
];
|
|
1087
|
+
export function getPattern(name) {
|
|
1088
|
+
return patterns.find((p) => p.name.toLowerCase().includes(name.toLowerCase()));
|
|
1089
|
+
}
|
|
1090
|
+
export function listPatterns() {
|
|
1091
|
+
return patterns;
|
|
1092
|
+
}
|
|
1093
|
+
export function searchPatterns(query) {
|
|
1094
|
+
const lowerQuery = query.toLowerCase();
|
|
1095
|
+
return patterns.filter((p) => p.name.toLowerCase().includes(lowerQuery) ||
|
|
1096
|
+
p.description.toLowerCase().includes(lowerQuery) ||
|
|
1097
|
+
p.components.some((c) => c.toLowerCase().includes(lowerQuery)));
|
|
1098
|
+
}
|
|
1099
|
+
//# sourceMappingURL=patterns.js.map
|