@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293
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/components/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
package/source/HTTP/Server.ts
DELETED
|
@@ -1,430 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import fs from 'node:fs'
|
|
3
|
-
import os from 'node:os'
|
|
4
|
-
import * as http from 'node:http'
|
|
5
|
-
import * as http2 from 'node:http2'
|
|
6
|
-
import { once } from 'node:events'
|
|
7
|
-
import { setTimeout } from 'node:timers/promises'
|
|
8
|
-
import { console, current, decide, decode, run, type SpanContext } from 'openspan'
|
|
9
|
-
import { Connector } from '@toa.io/core'
|
|
10
|
-
import { type OutgoingMessage, write } from './messages.js'
|
|
11
|
-
import { ClientError, Exception } from './exceptions.js'
|
|
12
|
-
import { Context } from './Context.js'
|
|
13
|
-
import { Probe } from './Probe.js'
|
|
14
|
-
import { PORT, PROBE } from '../const.js'
|
|
15
|
-
import type { IncomingMessage, Protocol, ServerResponse } from './types.js'
|
|
16
|
-
import type { Bouncer, MCP, OAuth, RPC } from '../Annotation.js'
|
|
17
|
-
|
|
18
|
-
export class Server extends Connector {
|
|
19
|
-
private readonly server: http.Server | http2.Http2Server
|
|
20
|
-
private readonly properties: Properties
|
|
21
|
-
/** Host to authority. A map: a `Host` of `constructor` names what a plain object answers. */
|
|
22
|
-
private readonly authorities: Map<string, string>
|
|
23
|
-
|
|
24
|
-
/** Tracked for the drain: `Http2Server` has no `closeIdleConnections`. */
|
|
25
|
-
private readonly sessions = new Set<http2.ServerHttp2Session>()
|
|
26
|
-
|
|
27
|
-
private readonly probe: Probe
|
|
28
|
-
|
|
29
|
-
private process?: Processor
|
|
30
|
-
|
|
31
|
-
private constructor(properties: Properties) {
|
|
32
|
-
super()
|
|
33
|
-
|
|
34
|
-
this.properties = properties
|
|
35
|
-
this.authorities = new Map(
|
|
36
|
-
Object.entries(properties.authorities).map(([key, value]) => [value, key])
|
|
37
|
-
)
|
|
38
|
-
this.server = instantiate(properties.protocol)
|
|
39
|
-
this.probe = new Probe(properties.probe)
|
|
40
|
-
|
|
41
|
-
this.server.on('request', (req, res) =>
|
|
42
|
-
this.listener(req as unknown as IncomingMessage, res as unknown as ServerResponse)
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
if (properties.protocol === 'h1') this.h1(this.server as http.Server)
|
|
46
|
-
else this.h2(this.server as http2.Http2Server)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
public static create(options: Options): Server {
|
|
50
|
-
const properties: Properties = { ...DEFAULTS, ...options }
|
|
51
|
-
|
|
52
|
-
return new Server(properties)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public attach(process: Processor): void {
|
|
56
|
-
this.process = process
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
protected override async open(): Promise<void> {
|
|
60
|
-
// answers 503 from here; the gateway's dependencies have settled by the time `open` runs
|
|
61
|
-
await this.probe.listen()
|
|
62
|
-
|
|
63
|
-
this.server.listen(this.properties.port)
|
|
64
|
-
|
|
65
|
-
await once(this.server, 'listening')
|
|
66
|
-
|
|
67
|
-
console.info('HTTP Server is listening')
|
|
68
|
-
|
|
69
|
-
this.probe.complete()
|
|
70
|
-
|
|
71
|
-
console.info('Ready')
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
protected override async close(): Promise<void> {
|
|
75
|
-
await this.probe.close()
|
|
76
|
-
|
|
77
|
-
this.server.close()
|
|
78
|
-
|
|
79
|
-
// GOAWAY lets in-flight streams finish; `Http2Server` has no `closeIdleConnections`
|
|
80
|
-
if (this.properties.protocol === 'h1')
|
|
81
|
-
(this.server as http.Server).closeIdleConnections()
|
|
82
|
-
else for (const session of this.sessions) session.close()
|
|
83
|
-
|
|
84
|
-
console.info('Stopped accepting new connections')
|
|
85
|
-
|
|
86
|
-
// keep-alive clients hold connections open indefinitely, so the drain is bounded
|
|
87
|
-
await Promise.race([
|
|
88
|
-
once(this.server, 'close'),
|
|
89
|
-
setTimeout(this.properties.drain, undefined, { ref: false })
|
|
90
|
-
])
|
|
91
|
-
|
|
92
|
-
if (this.properties.protocol === 'h1')
|
|
93
|
-
(this.server as http.Server).closeAllConnections()
|
|
94
|
-
else for (const session of this.sessions) session.destroy()
|
|
95
|
-
|
|
96
|
-
console.info('Stopped')
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/** A malformed HTTP/1.1 request has no framing to answer in, so the status line is written by hand. */
|
|
100
|
-
private h1(server: http.Server): void {
|
|
101
|
-
server.on('clientError', (error, socket) => {
|
|
102
|
-
console.warn('Client connection error', error)
|
|
103
|
-
|
|
104
|
-
if (socket.writable) socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
|
|
105
|
-
else socket.destroy()
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** HTTP/2 has no `clientError`: failures surface per session, per stream, or per frame. */
|
|
110
|
-
private h2(server: http2.Http2Server): void {
|
|
111
|
-
server.on('session', (session) => {
|
|
112
|
-
this.sessions.add(session)
|
|
113
|
-
session.on('close', () => this.sessions.delete(session))
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
server.on('sessionError', (error) => console.warn('Session error', error))
|
|
117
|
-
server.on('streamError', (error) => console.warn('Stream error', error))
|
|
118
|
-
|
|
119
|
-
server.on('unknownProtocol', (socket) => {
|
|
120
|
-
console.warn('Unknown protocol')
|
|
121
|
-
socket.destroy()
|
|
122
|
-
})
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
private listener(request: IncomingMessage, response: ServerResponse): void {
|
|
126
|
-
request.once('error', (error) => {
|
|
127
|
-
console.warn('Request error', errorAttributes(request, error))
|
|
128
|
-
|
|
129
|
-
if (!response.writableEnded) response.destroy()
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
// no listener on `request.socket`: under HTTP/2 it is the session's socket, shared by
|
|
133
|
-
// every concurrent stream, and removing listeners on it would strip the siblings'
|
|
134
|
-
|
|
135
|
-
const host = authorityOf(request)?.toLowerCase()
|
|
136
|
-
|
|
137
|
-
if (host === undefined || !HOST.test(host)) {
|
|
138
|
-
console.warn(
|
|
139
|
-
'Request without a valid authority',
|
|
140
|
-
errorAttributes(request, new Error('Invalid authority'))
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
response.writeHead(400).end()
|
|
144
|
-
|
|
145
|
-
return
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// directives and components read `host`; HTTP/2 sends `:authority` instead, and what a
|
|
149
|
-
// component sees must not depend on the protocol the request arrived over
|
|
150
|
-
request.headers.host ??= host
|
|
151
|
-
|
|
152
|
-
const url = parse(request, host)
|
|
153
|
-
|
|
154
|
-
if (url instanceof Error) {
|
|
155
|
-
console.warn('Invalid request', errorAttributes(request, url))
|
|
156
|
-
|
|
157
|
-
response.writeHead(400).end()
|
|
158
|
-
|
|
159
|
-
return
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (request.method === undefined || !this.properties.methods.has(request.method)) {
|
|
163
|
-
response.writeHead(501).end()
|
|
164
|
-
|
|
165
|
-
return
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
assert(this.process !== undefined, 'Request processor is not attached')
|
|
169
|
-
|
|
170
|
-
const authority = this.authorities.get(host) ?? host
|
|
171
|
-
|
|
172
|
-
// if the request carries no trace context, the trace starts here
|
|
173
|
-
const remote = trace(request.headers)
|
|
174
|
-
|
|
175
|
-
const processing =
|
|
176
|
-
remote === null
|
|
177
|
-
? this.serve(request, response, authority, url)
|
|
178
|
-
: run(remote, async () => await this.serve(request, response, authority, url))
|
|
179
|
-
|
|
180
|
-
processing.catch((error) => {
|
|
181
|
-
console.error('Request processing failed', error)
|
|
182
|
-
|
|
183
|
-
if (!response.writableEnded) response.writeHead(500).end()
|
|
184
|
-
})
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// eslint-disable-next-line max-params
|
|
188
|
-
private async serve(
|
|
189
|
-
request: IncomingMessage,
|
|
190
|
-
response: ServerResponse,
|
|
191
|
-
authority: string,
|
|
192
|
-
url: URL
|
|
193
|
-
): Promise<void> {
|
|
194
|
-
await console.span(
|
|
195
|
-
{
|
|
196
|
-
name: `${request.method} ${request.url}`,
|
|
197
|
-
kind: 'server',
|
|
198
|
-
service: 'exposition',
|
|
199
|
-
attributes: { method: request.method, url: request.url, authority }
|
|
200
|
-
},
|
|
201
|
-
async () => {
|
|
202
|
-
response.setHeader('ray', current()!.traceId)
|
|
203
|
-
|
|
204
|
-
const context = new Context(authority, request, this.properties, url)
|
|
205
|
-
|
|
206
|
-
await this.process!(context)
|
|
207
|
-
.then(this.success(context, response))
|
|
208
|
-
.catch(this.fail(context, response))
|
|
209
|
-
.finally(() => request.removeAllListeners('error'))
|
|
210
|
-
}
|
|
211
|
-
)
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
private success(context: Context, response: ServerResponse) {
|
|
215
|
-
return async (message: OutgoingMessage) => {
|
|
216
|
-
let status = message.status
|
|
217
|
-
|
|
218
|
-
if (status === undefined)
|
|
219
|
-
if (message.body === null) status = 404
|
|
220
|
-
else if (context.request.method === 'POST') status = 201
|
|
221
|
-
else if (message.body === undefined && context.request.method !== 'HEAD')
|
|
222
|
-
status = 204
|
|
223
|
-
else status = 200
|
|
224
|
-
|
|
225
|
-
message.status = status
|
|
226
|
-
|
|
227
|
-
await write(context, response, message)
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
private fail(context: Context, response: ServerResponse) {
|
|
232
|
-
return async (exception: Error) => {
|
|
233
|
-
try {
|
|
234
|
-
// Over HTTP/2 the reply is followed by RST_STREAM(NO_ERROR), which tells the client
|
|
235
|
-
// to stop sending without discarding the response — so the body is never read.
|
|
236
|
-
if (!context.request.complete && this.properties.protocol === 'h1')
|
|
237
|
-
await adam(context.request)
|
|
238
|
-
|
|
239
|
-
const status = exception instanceof Exception ? exception.status : 500
|
|
240
|
-
const span = current()
|
|
241
|
-
|
|
242
|
-
// https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
|
|
243
|
-
if (status >= 500 && span !== undefined) span.status = 'error'
|
|
244
|
-
|
|
245
|
-
if (!response.writableEnded) {
|
|
246
|
-
response.statusCode = status
|
|
247
|
-
|
|
248
|
-
const message: OutgoingMessage = {
|
|
249
|
-
status: response.statusCode,
|
|
250
|
-
authentic: true
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// eslint-disable-next-line max-depth
|
|
254
|
-
if (exception instanceof Exception && exception.headers !== undefined)
|
|
255
|
-
message.headers = exception.headers
|
|
256
|
-
|
|
257
|
-
// eslint-disable-next-line max-depth
|
|
258
|
-
if (context.encoder === null) message.body = undefined
|
|
259
|
-
else if (exception instanceof ClientError || this.properties.debug)
|
|
260
|
-
message.body =
|
|
261
|
-
exception instanceof Exception
|
|
262
|
-
? exception.body
|
|
263
|
-
: ((this.properties.debug && exception.stack) ?? exception.message)
|
|
264
|
-
|
|
265
|
-
await write(context, response, message)
|
|
266
|
-
}
|
|
267
|
-
} catch (final) {
|
|
268
|
-
console.error('Error in error handler', final)
|
|
269
|
-
|
|
270
|
-
if (!response.writableEnded)
|
|
271
|
-
try {
|
|
272
|
-
response.writeHead(500).end()
|
|
273
|
-
} catch {
|
|
274
|
-
// Nothing more we can do
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function instantiate(protocol: Protocol): http.Server | http2.Http2Server {
|
|
282
|
-
if (protocol === 'h1') return http.createServer()
|
|
283
|
-
|
|
284
|
-
return http2.createServer({
|
|
285
|
-
// realtime pins one stream per subscription, and they all share a session
|
|
286
|
-
maxSessionMemory: SESSION_MEMORY,
|
|
287
|
-
settings: { initialWindowSize: WINDOW }
|
|
288
|
-
})
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* The authority the request is addressed to. HTTP/2 carries it in `:authority` and omits
|
|
293
|
-
* `host` entirely, so reading `host` alone would leave every HTTP/2 request unattributed.
|
|
294
|
-
*/
|
|
295
|
-
function authorityOf(request: IncomingMessage): string | undefined {
|
|
296
|
-
return request.headers[':authority'] ?? request.headers.host
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/** Parsing the URL is how a request is validated, so the `Context` is handed the result. */
|
|
300
|
-
function parse(request: IncomingMessage, authority: string): URL | Error {
|
|
301
|
-
try {
|
|
302
|
-
return new URL(request.url, `https://${authority}`)
|
|
303
|
-
} catch (error) {
|
|
304
|
-
return error as Error
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// https://github.com/whatwg/fetch/issues/1254
|
|
309
|
-
async function adam(request: IncomingMessage): Promise<void> {
|
|
310
|
-
const devnull = fs.createWriteStream(os.devNull)
|
|
311
|
-
|
|
312
|
-
devnull.on('error', () => undefined)
|
|
313
|
-
request.pipe(devnull).on('error', () => undefined)
|
|
314
|
-
|
|
315
|
-
await once(request, 'end')
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
function errorAttributes(
|
|
319
|
-
request: IncomingMessage,
|
|
320
|
-
error: Error & any
|
|
321
|
-
): RequestErrorAttributes {
|
|
322
|
-
const attributes: RequestErrorAttributes = {
|
|
323
|
-
path: request.url,
|
|
324
|
-
method: request.method,
|
|
325
|
-
name: error.name
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
if (typeof error.code === 'string') attributes.code = error.code
|
|
329
|
-
|
|
330
|
-
if (typeof error.stack === 'string') attributes.stack = error.stack
|
|
331
|
-
|
|
332
|
-
return attributes
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
export const DRAIN = 10 // seconds
|
|
336
|
-
|
|
337
|
-
/** Megabytes a single HTTP/2 session may hold, over Node's default of 10. */
|
|
338
|
-
const SESSION_MEMORY = 128
|
|
339
|
-
|
|
340
|
-
/** Per-stream flow control window. The default 64 KiB throttles in proportion to RTT. */
|
|
341
|
-
const WINDOW = 1024 * 1024
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Extracts the remote trace context from the request headers.
|
|
345
|
-
*
|
|
346
|
-
* The `ray` header adopts the trace by ID only and does not bypass sampling:
|
|
347
|
-
* the sampling decision is made by the server.
|
|
348
|
-
*/
|
|
349
|
-
function trace(headers: IncomingMessage['headers']): SpanContext | null {
|
|
350
|
-
if (typeof headers.traceparent === 'string') return decode(headers.traceparent)
|
|
351
|
-
|
|
352
|
-
// adopting a trace by ID does not bypass sampling
|
|
353
|
-
if (
|
|
354
|
-
typeof headers.ray === 'string' &&
|
|
355
|
-
RAY.test(headers.ray) &&
|
|
356
|
-
headers.ray !== ZERO_RAY
|
|
357
|
-
)
|
|
358
|
-
return { traceId: headers.ray.toLowerCase(), sampled: decide() }
|
|
359
|
-
|
|
360
|
-
return null
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* A host name with an optional port, or a bracketed IPv6 literal. The URL parser admits
|
|
365
|
-
* `,` `;` `=` `(` `)` and quotes in a host, and the authority is written into criteria.
|
|
366
|
-
*/
|
|
367
|
-
const HOST = /^(?:[a-z0-9.-]{1,253}|\[[0-9a-f:.]{2,45}\])(?::\d{1,5})?$/
|
|
368
|
-
|
|
369
|
-
const RAY = /^[\da-f]{32}$/i
|
|
370
|
-
const ZERO_RAY = '0'.repeat(32)
|
|
371
|
-
|
|
372
|
-
const DEFAULTS: Omit<Properties, 'authorities'> = {
|
|
373
|
-
methods: new Set<string>([
|
|
374
|
-
'OPTIONS',
|
|
375
|
-
'GET',
|
|
376
|
-
'HEAD',
|
|
377
|
-
'POST',
|
|
378
|
-
'PUT',
|
|
379
|
-
'PATCH',
|
|
380
|
-
'DELETE',
|
|
381
|
-
'LOCK',
|
|
382
|
-
'UNLOCK'
|
|
383
|
-
]),
|
|
384
|
-
debug: false,
|
|
385
|
-
port: PORT,
|
|
386
|
-
drain: DRAIN * 1000,
|
|
387
|
-
protocol: 'h1',
|
|
388
|
-
probe: PROBE
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
interface Properties {
|
|
392
|
-
authorities: Record<string, string>
|
|
393
|
-
methods: Set<string>
|
|
394
|
-
debug: boolean
|
|
395
|
-
port: number
|
|
396
|
-
drain: number
|
|
397
|
-
protocol: Protocol
|
|
398
|
-
|
|
399
|
-
/** Port of the readiness probe, which is HTTP/1.1 whatever the gateway serves. */
|
|
400
|
-
probe: number
|
|
401
|
-
|
|
402
|
-
/** The header the client address is read from; the connection's address without one. */
|
|
403
|
-
ip?: string
|
|
404
|
-
|
|
405
|
-
/** Failed authentications an address may make; none are metered unless set. */
|
|
406
|
-
bouncer?: Bouncer
|
|
407
|
-
|
|
408
|
-
/** The authorization server this context exposes; none is exposed without it. */
|
|
409
|
-
oauth?: OAuth
|
|
410
|
-
|
|
411
|
-
/** JSON-RPC at `/.rpc`; none is served without it. */
|
|
412
|
-
rpc?: RPC
|
|
413
|
-
|
|
414
|
-
/** MCP at `/.mcp`; none is served without it. */
|
|
415
|
-
mcp?: MCP
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
export type Options = { authorities: Properties['authorities'] } & {
|
|
419
|
-
[K in Exclude<keyof Properties, 'authorities'>]?: Properties[K]
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
export type Processor = (input: Context) => Promise<OutgoingMessage>
|
|
423
|
-
|
|
424
|
-
interface RequestErrorAttributes {
|
|
425
|
-
path: string
|
|
426
|
-
method: string
|
|
427
|
-
name: string
|
|
428
|
-
code?: string
|
|
429
|
-
stack?: string
|
|
430
|
-
}
|
package/source/HTTP/Timing.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { performance } from 'node:perf_hooks'
|
|
2
|
-
import type { ServerResponse } from './types.js'
|
|
3
|
-
|
|
4
|
-
/** How long the request took, from received to written: one number, the header's. */
|
|
5
|
-
export class Timing {
|
|
6
|
-
private readonly start = performance.now()
|
|
7
|
-
|
|
8
|
-
public append(response: ServerResponse): void {
|
|
9
|
-
response.setHeader(
|
|
10
|
-
'server-timing',
|
|
11
|
-
`total;dur=${(performance.now() - this.start).toFixed(3)}`
|
|
12
|
-
)
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { address } from './address.js'
|
|
5
|
-
import type { IncomingMessage } from './types.js'
|
|
6
|
-
|
|
7
|
-
const request = (headers: Record<string, string>): IncomingMessage =>
|
|
8
|
-
({ headers, socket: { remoteAddress: '9.9.9.9' } }) as unknown as IncomingMessage
|
|
9
|
-
|
|
10
|
-
it('should be nothing without a header named', () => {
|
|
11
|
-
assert.equal(address(request({ 'x-forwarded-for': '1.1.1.1' })), undefined)
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('should be the last value of the named header', () => {
|
|
15
|
-
assert.equal(
|
|
16
|
-
address(request({ 'x-forwarded-for': '1.1.1.1, 2.2.2.2' }), 'x-forwarded-for'),
|
|
17
|
-
'2.2.2.2'
|
|
18
|
-
)
|
|
19
|
-
assert.equal(
|
|
20
|
-
address(request({ 'cf-connecting-ip': '3.3.3.3' }), 'cf-connecting-ip'),
|
|
21
|
-
'3.3.3.3'
|
|
22
|
-
)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('should be nothing when the named header is absent or empty', () => {
|
|
26
|
-
assert.equal(address(request({}), 'x-real-ip'), undefined)
|
|
27
|
-
assert.equal(address(request({ 'x-real-ip': ' ' }), 'x-real-ip'), undefined)
|
|
28
|
-
})
|
package/source/HTTP/address.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { IncomingMessage } from './types.js'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The client address: the value of the header the deployment names, and nothing otherwise.
|
|
5
|
-
* Of a header holding a list, the last value is the one the edge in front appended. The
|
|
6
|
-
* connection's address is never it: behind an edge it is the edge's.
|
|
7
|
-
*/
|
|
8
|
-
export function address(request: IncomingMessage, header?: string): string | undefined {
|
|
9
|
-
if (header === undefined) return
|
|
10
|
-
|
|
11
|
-
const value = request.headers[header]
|
|
12
|
-
const raw = Array.isArray(value) ? value[value.length - 1] : value
|
|
13
|
-
const last = raw?.slice(raw.lastIndexOf(',') + 1).trim()
|
|
14
|
-
|
|
15
|
-
return last === '' ? undefined : last
|
|
16
|
-
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
export class Exception extends Error {
|
|
2
|
-
public readonly status: number
|
|
3
|
-
public readonly body?: any
|
|
4
|
-
|
|
5
|
-
/** Headers the status is not complete without, like `Retry-After` on a 429. */
|
|
6
|
-
public readonly headers?: Headers
|
|
7
|
-
|
|
8
|
-
protected constructor(status: number, body?: any, headers?: Headers) {
|
|
9
|
-
super()
|
|
10
|
-
this.status = status
|
|
11
|
-
this.body = body
|
|
12
|
-
this.headers = headers
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class ClientError extends Exception {}
|
|
17
|
-
|
|
18
|
-
export class BadRequest extends ClientError {
|
|
19
|
-
public constructor(body?: any) {
|
|
20
|
-
super(400, body)
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class Unauthorized extends ClientError {
|
|
25
|
-
public constructor(body?: any) {
|
|
26
|
-
super(401, body)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class Forbidden extends ClientError {
|
|
31
|
-
public constructor(body?: any) {
|
|
32
|
-
super(403, body)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class NotFound extends ClientError {
|
|
37
|
-
public constructor(body?: any) {
|
|
38
|
-
super(404, body)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class MethodNotAllowed extends ClientError {
|
|
43
|
-
public constructor(headers?: Headers) {
|
|
44
|
-
super(405, undefined, headers)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export class NotAcceptable extends ClientError {
|
|
49
|
-
public constructor() {
|
|
50
|
-
super(406)
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export class Conflict extends ClientError {
|
|
55
|
-
public constructor(body?: any) {
|
|
56
|
-
super(409, body)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class PreconditionFailed extends ClientError {
|
|
61
|
-
public constructor() {
|
|
62
|
-
super(412)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export class RequestEntityTooLarge extends ClientError {
|
|
67
|
-
public constructor(body?: any) {
|
|
68
|
-
super(413, body)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export class UnsupportedMediaType extends ClientError {
|
|
73
|
-
public constructor() {
|
|
74
|
-
super(415)
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export class UnprocessableEntity extends ClientError {
|
|
79
|
-
public constructor(body?: any) {
|
|
80
|
-
super(422, body)
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export class TooManyRequests extends ClientError {
|
|
85
|
-
/** @param retry Seconds until the request would be admitted. */
|
|
86
|
-
public constructor(retry?: number) {
|
|
87
|
-
super(
|
|
88
|
-
429,
|
|
89
|
-
undefined,
|
|
90
|
-
retry === undefined ? undefined : new Headers({ 'retry-after': String(retry) })
|
|
91
|
-
)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export class ServiceUnavailable extends Exception {
|
|
96
|
-
public constructor(body?: any) {
|
|
97
|
-
super(503, body)
|
|
98
|
-
}
|
|
99
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export const type = 'application/x-www-form-urlencoded'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A form is read and never written: it is what an HTML form and a handful of protocols send,
|
|
5
|
-
* and nothing asks for a reply in it.
|
|
6
|
-
*
|
|
7
|
-
* A name repeated in a form is a list, which is how a form says one — `URLSearchParams` keeps
|
|
8
|
-
* every value, and a name given once stays the string it was written as.
|
|
9
|
-
*/
|
|
10
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
11
|
-
const params = new URLSearchParams(buffer.toString(charset as BufferEncoding))
|
|
12
|
-
const value: Record<string, string | string[]> = {}
|
|
13
|
-
|
|
14
|
-
for (const name of new Set(params.keys())) {
|
|
15
|
-
const values = params.getAll(name)
|
|
16
|
-
|
|
17
|
-
value[name] = values.length === 1 ? values[0] : values
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return value
|
|
21
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import * as json from './json.js'
|
|
2
|
-
import * as yaml from './yaml.js'
|
|
3
|
-
import * as msgpack from './msgpack.js'
|
|
4
|
-
import * as text from './text.js'
|
|
5
|
-
import * as form from './form.js'
|
|
6
|
-
|
|
7
|
-
/** What a reply may be encoded as, and so what `accept` is negotiated against. */
|
|
8
|
-
export const formats: Record<string, Format> = {
|
|
9
|
-
[json.type]: json,
|
|
10
|
-
[yaml.type]: yaml,
|
|
11
|
-
[text.type]: text,
|
|
12
|
-
[msgpack.type]: msgpack
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const types = Object.keys(formats)
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* What a request body may arrive as. Everything a reply may be, and a form besides — which
|
|
19
|
-
* is read and never written, so it is not something a reply can be asked for.
|
|
20
|
-
*/
|
|
21
|
-
export const decoders: Record<string, Decoder> = {
|
|
22
|
-
...formats,
|
|
23
|
-
[form.type]: form
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface Decoder {
|
|
27
|
-
readonly type: string
|
|
28
|
-
|
|
29
|
-
decode: (buffer: Buffer, charset?: string) => any
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface Format extends Decoder {
|
|
33
|
-
readonly multipart: string
|
|
34
|
-
|
|
35
|
-
encode: (value: any) => Buffer
|
|
36
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export const type = 'application/json'
|
|
2
|
-
export const multipart = 'multipart/json'
|
|
3
|
-
|
|
4
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
|
-
const text = buffer.toString(charset as BufferEncoding)
|
|
6
|
-
|
|
7
|
-
return JSON.parse(text)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function encode(value: any): Buffer {
|
|
11
|
-
const text = JSON.stringify(value)
|
|
12
|
-
|
|
13
|
-
return Buffer.from(text)
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { pack, unpack } from 'msgpackr'
|
|
2
|
-
|
|
3
|
-
export function decode(buffer: Buffer): any {
|
|
4
|
-
return unpack(buffer)
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function encode(value: any): Buffer {
|
|
8
|
-
if (typeof value === 'object' && value !== null) Object.setPrototypeOf(value, null)
|
|
9
|
-
|
|
10
|
-
return pack(value)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export const type = 'application/msgpack'
|
|
14
|
-
export const multipart = 'multipart/msgpack'
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export const type = 'text/plain'
|
|
2
|
-
export const multipart = 'multipart/text'
|
|
3
|
-
|
|
4
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
|
-
return buffer.toString(charset as BufferEncoding)
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function encode(value: { toString: () => string }): Buffer {
|
|
9
|
-
return Buffer.from(value.toString())
|
|
10
|
-
}
|