@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
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { encode } from './yaml.js'
|
|
5
|
-
|
|
6
|
-
it('encodes error values as their public properties', () => {
|
|
7
|
-
const value = new (class InvalidUsernameError extends Error {
|
|
8
|
-
public readonly code = 'INVALID_USERNAME'
|
|
9
|
-
public override readonly message = 'Username is not meeting the requirements'
|
|
10
|
-
})()
|
|
11
|
-
|
|
12
|
-
assert.strictEqual(
|
|
13
|
-
encode(value).toString(),
|
|
14
|
-
'code: INVALID_USERNAME\nmessage: Username is not meeting the requirements\n'
|
|
15
|
-
)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('writes a value the way its toJSON says', () => {
|
|
19
|
-
const secret = { unwrap: () => 's3cret', toJSON: () => '<REDACTED>' }
|
|
20
|
-
|
|
21
|
-
assert.strictEqual(encode({ a: 1, b: secret }).toString(), 'a: 1\nb: <REDACTED>\n')
|
|
22
|
-
})
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { yaml } from '@toa.io/generic'
|
|
2
|
-
|
|
3
|
-
export const type = 'application/yaml'
|
|
4
|
-
export const multipart = 'multipart/yaml'
|
|
5
|
-
|
|
6
|
-
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
7
|
-
const text = buffer.toString(charset as BufferEncoding)
|
|
8
|
-
|
|
9
|
-
return yaml.load(text)
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function encode(value: any): Buffer {
|
|
13
|
-
const serializable =
|
|
14
|
-
value instanceof Error ? Object.assign({}, value) : represent(value)
|
|
15
|
-
const text = yaml.dump(serializable, { lineWidth: -1, noRefs: true })
|
|
16
|
-
|
|
17
|
-
return Buffer.from(text)
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** What says how it is to be written — a redacted secret — is written that way, as in JSON. */
|
|
21
|
-
function represent(value: unknown): unknown {
|
|
22
|
-
if (
|
|
23
|
-
typeof value !== 'object' ||
|
|
24
|
-
value === null ||
|
|
25
|
-
value instanceof Date ||
|
|
26
|
-
Buffer.isBuffer(value)
|
|
27
|
-
)
|
|
28
|
-
return value
|
|
29
|
-
|
|
30
|
-
if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON()
|
|
31
|
-
|
|
32
|
-
if (Array.isArray(value)) return value.map(represent)
|
|
33
|
-
|
|
34
|
-
const object = value as Record<string, unknown>
|
|
35
|
-
const represented: Record<string, unknown> = {}
|
|
36
|
-
|
|
37
|
-
for (const key of Object.keys(object)) represented[key] = represent(object[key])
|
|
38
|
-
|
|
39
|
-
return represented
|
|
40
|
-
}
|
package/source/HTTP/index.ts
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { PassThrough, Readable } from 'node:stream'
|
|
5
|
-
import * as streamConsumers from 'node:stream/consumers'
|
|
6
|
-
import { generate } from 'randomstring'
|
|
7
|
-
import * as msgpack from 'msgpackr'
|
|
8
|
-
import { multipart, read, type OutgoingMessage } from './messages.js'
|
|
9
|
-
import { BadRequest, UnsupportedMediaType } from './exceptions.js'
|
|
10
|
-
import { formats, types } from './formats/index.js'
|
|
11
|
-
import { Timing } from './Timing.js'
|
|
12
|
-
import type * as http from 'node:http'
|
|
13
|
-
import type { Context } from './Context.js'
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
resetCalls()
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('read', () => {
|
|
20
|
-
it('should parse application/json', async () => {
|
|
21
|
-
const path = generate()
|
|
22
|
-
const headers = { 'content-type': 'application/json' }
|
|
23
|
-
const input = { [generate()]: generate() }
|
|
24
|
-
const json = JSON.stringify(input)
|
|
25
|
-
const context = createContext(path, headers, json)
|
|
26
|
-
const output = await read(context)
|
|
27
|
-
|
|
28
|
-
assert.deepStrictEqual(output, input)
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
it('should parse application/yaml', async () => {
|
|
32
|
-
const path = generate()
|
|
33
|
-
const headers = { 'content-type': 'application/yaml' }
|
|
34
|
-
const yaml = 'foo: 1'
|
|
35
|
-
const request = createContext(path, headers, yaml)
|
|
36
|
-
const value = await read(request)
|
|
37
|
-
|
|
38
|
-
assert.deepStrictEqual(value, { foo: 1 })
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
it('should parse application/mskpack', async () => {
|
|
42
|
-
const path = generate()
|
|
43
|
-
const headers = { 'content-type': 'application/msgpack' }
|
|
44
|
-
const input = { [generate()]: generate() }
|
|
45
|
-
const msg = msgpack.encode(input)
|
|
46
|
-
const request = createContext(path, headers, msg)
|
|
47
|
-
const output = await read(request)
|
|
48
|
-
|
|
49
|
-
assert.deepStrictEqual(output, input)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
it('should parse text/plain', async () => {
|
|
53
|
-
const path = generate()
|
|
54
|
-
const headers = { 'content-type': 'text/plain' }
|
|
55
|
-
const input = generate()
|
|
56
|
-
const request = createContext(path, headers, input)
|
|
57
|
-
const output = await read(request)
|
|
58
|
-
|
|
59
|
-
assert.deepStrictEqual(output, input)
|
|
60
|
-
})
|
|
61
|
-
|
|
62
|
-
it('should parse application/json with charset parameter', async () => {
|
|
63
|
-
const path = generate()
|
|
64
|
-
const headers = { 'content-type': 'application/json; charset=utf-8' }
|
|
65
|
-
const input = { [generate()]: generate() }
|
|
66
|
-
const json = JSON.stringify(input)
|
|
67
|
-
const context = createContext(path, headers, json)
|
|
68
|
-
const output = await read(context)
|
|
69
|
-
|
|
70
|
-
assert.deepStrictEqual(output, input)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('should throw on unsupported request media type', async () => {
|
|
74
|
-
const path = generate()
|
|
75
|
-
const headers = { 'content-type': 'wtf/' + generate() }
|
|
76
|
-
const request = createContext(path, headers)
|
|
77
|
-
|
|
78
|
-
await assert.rejects(read(request), UnsupportedMediaType)
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
it('should throw on malformed content', async () => {
|
|
82
|
-
const path = generate()
|
|
83
|
-
const text = '{ "foo": "val... oops '
|
|
84
|
-
const headers = { 'content-type': 'application/json' }
|
|
85
|
-
const request = createContext(path, headers, text)
|
|
86
|
-
|
|
87
|
-
await assert.rejects(read(request), BadRequest)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('should parse application/x-www-form-urlencoded', async () => {
|
|
91
|
-
const headers = { 'content-type': 'application/x-www-form-urlencoded' }
|
|
92
|
-
const form = 'grant_type=authorization_code&code=SplxlO&scope=a+b'
|
|
93
|
-
const request = createContext(generate(), headers, form)
|
|
94
|
-
|
|
95
|
-
assert.deepStrictEqual(await read(request), {
|
|
96
|
-
grant_type: 'authorization_code',
|
|
97
|
-
code: 'SplxlO',
|
|
98
|
-
scope: 'a b'
|
|
99
|
-
})
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
it('should read a repeated form name as the list it is', async () => {
|
|
103
|
-
const headers = { 'content-type': 'application/x-www-form-urlencoded' }
|
|
104
|
-
const request = createContext(generate(), headers, 'resource=one&resource=two')
|
|
105
|
-
|
|
106
|
-
assert.deepStrictEqual(await read(request), { resource: ['one', 'two'] })
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should not offer a form as a reply encoding', () => {
|
|
110
|
-
assert.ok(
|
|
111
|
-
!types.includes('application/x-www-form-urlencoded'),
|
|
112
|
-
'a form is read and never written'
|
|
113
|
-
)
|
|
114
|
-
})
|
|
115
|
-
|
|
116
|
-
it('should output correct mulitpart format', async () => {
|
|
117
|
-
const response = new (class extends PassThrough {
|
|
118
|
-
public readonly headers = new Headers()
|
|
119
|
-
|
|
120
|
-
public setHeader(key: string, value: string): this {
|
|
121
|
-
this.headers.set(key, value)
|
|
122
|
-
|
|
123
|
-
return this
|
|
124
|
-
}
|
|
125
|
-
})()
|
|
126
|
-
|
|
127
|
-
const context = { encoder: formats['text/plain'] } as unknown as Context
|
|
128
|
-
const message = {
|
|
129
|
-
body: Readable.from(['Hello', 'New', 'World'])
|
|
130
|
-
} as unknown as OutgoingMessage
|
|
131
|
-
|
|
132
|
-
const framed = multipart(message, context, response as unknown as http.ServerResponse)
|
|
133
|
-
|
|
134
|
-
const result = await streamConsumers.text(framed)
|
|
135
|
-
|
|
136
|
-
assert.strictEqual(
|
|
137
|
-
result,
|
|
138
|
-
[
|
|
139
|
-
'--cut',
|
|
140
|
-
'',
|
|
141
|
-
'ACK',
|
|
142
|
-
'--cut',
|
|
143
|
-
'',
|
|
144
|
-
'Hello',
|
|
145
|
-
'--cut',
|
|
146
|
-
'',
|
|
147
|
-
'New',
|
|
148
|
-
'--cut',
|
|
149
|
-
'',
|
|
150
|
-
'World',
|
|
151
|
-
'--cut',
|
|
152
|
-
'',
|
|
153
|
-
'FIN',
|
|
154
|
-
'--cut--'
|
|
155
|
-
].join('\r\n')
|
|
156
|
-
)
|
|
157
|
-
})
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
export function createContext(
|
|
161
|
-
url: string,
|
|
162
|
-
headers: Record<string, string> = {},
|
|
163
|
-
content: string | Buffer = ''
|
|
164
|
-
): Context {
|
|
165
|
-
const data = Buffer.isBuffer(content) ? content : Buffer.from(content)
|
|
166
|
-
const stream = Readable.from(data)
|
|
167
|
-
let consumed = false
|
|
168
|
-
|
|
169
|
-
const mock: Partial<Context> = {
|
|
170
|
-
request: Object.assign(stream, {
|
|
171
|
-
url,
|
|
172
|
-
headers
|
|
173
|
-
}) as unknown as Context['request'],
|
|
174
|
-
url: new URL(url, 'https://host.local'),
|
|
175
|
-
timing: new Timing(),
|
|
176
|
-
buffer: async () => {
|
|
177
|
-
if (consumed) throw new Error('Request body already consumed')
|
|
178
|
-
|
|
179
|
-
consumed = true
|
|
180
|
-
|
|
181
|
-
return data
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return mock as unknown as Context
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function resetCalls(target = [], seen = new Set()) {
|
|
189
|
-
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
190
|
-
|
|
191
|
-
seen.add(target)
|
|
192
|
-
|
|
193
|
-
for (const value of Object.values(target))
|
|
194
|
-
if (typeof value === 'function' && value.mock !== undefined) value.mock.resetCalls()
|
|
195
|
-
else resetCalls(value, seen)
|
|
196
|
-
}
|
package/source/HTTP/messages.ts
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs'
|
|
2
|
-
import { Readable } from 'node:stream'
|
|
3
|
-
import { pipeline } from 'node:stream/promises'
|
|
4
|
-
import * as contentType from 'content-type'
|
|
5
|
-
import { console } from 'openspan'
|
|
6
|
-
import { type Format, decoders } from './formats/index.js'
|
|
7
|
-
import { BadRequest, NotAcceptable, UnsupportedMediaType } from './exceptions.js'
|
|
8
|
-
import { environment } from '@toa.io/generic'
|
|
9
|
-
import type { Context } from './Context.js'
|
|
10
|
-
import type { ServerResponse } from './types.js'
|
|
11
|
-
|
|
12
|
-
const context = environment.get('TOA_CONTEXT')
|
|
13
|
-
const env = environment.get('TOA_ENV')
|
|
14
|
-
const server =
|
|
15
|
-
`Exposition/${JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version}` +
|
|
16
|
-
((context === undefined ? '' : ` ${context}`) + (env === undefined ? '' : `/${env}`))
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Applies what the request accumulated in `pipelines.response` — an `io:output` restriction,
|
|
20
|
-
* a `vary` a `map` directive owes. Separate from `write` because a message is not always
|
|
21
|
-
* written: one call of several produces a value the reply is assembled from.
|
|
22
|
-
*/
|
|
23
|
-
export async function shape(context: Context, message: OutgoingMessage): Promise<void> {
|
|
24
|
-
for (const transform of context.pipelines.response) await transform(message)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export async function write(
|
|
28
|
-
context: Context,
|
|
29
|
-
response: ServerResponse,
|
|
30
|
-
message: OutgoingMessage
|
|
31
|
-
): Promise<void> {
|
|
32
|
-
await shape(context, message)
|
|
33
|
-
|
|
34
|
-
if (message?.status !== undefined) response.statusCode = message.status
|
|
35
|
-
|
|
36
|
-
response.setHeader('server', server)
|
|
37
|
-
message.headers?.forEach((value, key) => response.setHeader(key, value))
|
|
38
|
-
context.timing.append(response)
|
|
39
|
-
|
|
40
|
-
if (response.destroyed) {
|
|
41
|
-
console.warn('Request destroyed prematurely', { path: context.url.pathname })
|
|
42
|
-
|
|
43
|
-
return
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
response.on('error', (exception: Error) =>
|
|
47
|
-
console.warn('HTTP response error', { path: context.url.pathname, exception })
|
|
48
|
-
)
|
|
49
|
-
|
|
50
|
-
if (message.body instanceof Readable) stream(message, context, response)
|
|
51
|
-
else send(message, context, response)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export async function read(context: Context): Promise<any> {
|
|
55
|
-
const header = context.request.headers['content-type']
|
|
56
|
-
|
|
57
|
-
if (header === undefined) return undefined
|
|
58
|
-
|
|
59
|
-
const { type, parameters } = contentType.parse(header)
|
|
60
|
-
|
|
61
|
-
if (!(type in decoders)) throw new UnsupportedMediaType()
|
|
62
|
-
|
|
63
|
-
const format = decoders[type]
|
|
64
|
-
const buf = await context.buffer()
|
|
65
|
-
|
|
66
|
-
try {
|
|
67
|
-
return format.decode(buf, parameters.charset)
|
|
68
|
-
} catch (error: unknown) {
|
|
69
|
-
console.debug('Failed to decode message', {
|
|
70
|
-
path: context.url.pathname,
|
|
71
|
-
error: error?.toString?.()
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
throw new BadRequest()
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function send(
|
|
79
|
-
message: OutgoingMessage,
|
|
80
|
-
context: Context,
|
|
81
|
-
response: ServerResponse
|
|
82
|
-
): void {
|
|
83
|
-
if (message.body === undefined || message.body === null) {
|
|
84
|
-
// a HEAD reply carries no body but must still report the length a GET would
|
|
85
|
-
// have returned, so a length already set by a directive is left alone
|
|
86
|
-
if (!response.hasHeader('content-length')) response.setHeader('content-length', '0')
|
|
87
|
-
|
|
88
|
-
response.end()
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (context.encoder === null) throw new NotAcceptable()
|
|
94
|
-
|
|
95
|
-
const buf = context.encoder.encode(message.body)
|
|
96
|
-
|
|
97
|
-
response.setHeader('content-type', context.encoder.type)
|
|
98
|
-
response.setHeader('content-length', buf.length.toString())
|
|
99
|
-
response.appendHeader('vary', 'accept')
|
|
100
|
-
response.end(buf)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function stream(
|
|
104
|
-
message: OutgoingMessage,
|
|
105
|
-
context: Context,
|
|
106
|
-
response: ServerResponse
|
|
107
|
-
): void {
|
|
108
|
-
const encoded = message.headers !== undefined && message.headers.has('content-type')
|
|
109
|
-
const source: Readable = encoded ? message.body : multipart(message, context, response)
|
|
110
|
-
|
|
111
|
-
// not awaited: a reply that streams is written long after the request is answered, and a
|
|
112
|
-
// realtime subscription outlives the span the reply was produced in
|
|
113
|
-
//
|
|
114
|
-
// `pipeline` carries an error to every stage and destroys them. `pipe` leaves the stages it
|
|
115
|
-
// built behind, and an `error` on a stream nobody listens to is an uncaught exception.
|
|
116
|
-
pipeline(source, response).catch((exception: Error) =>
|
|
117
|
-
console.warn('Message stream error', { path: context.url.pathname, exception })
|
|
118
|
-
)
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* Frames an object stream as `multipart/*`: an `ACK` part, the parts themselves, then `FIN`.
|
|
123
|
-
* The body is a `Readable`; `write` reached here by testing it.
|
|
124
|
-
*/
|
|
125
|
-
export function multipart(
|
|
126
|
-
message: OutgoingMessage,
|
|
127
|
-
context: Context,
|
|
128
|
-
response: ServerResponse
|
|
129
|
-
): Readable {
|
|
130
|
-
if (context.encoder === null) throw new NotAcceptable()
|
|
131
|
-
|
|
132
|
-
const encoder = context.encoder
|
|
133
|
-
|
|
134
|
-
response.setHeader('content-type', `${encoder.multipart}; boundary=${BOUNDARY}`)
|
|
135
|
-
|
|
136
|
-
return Readable.from(frames(message.body as Readable, encoder))
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
async function* frames(body: Readable, encoder: Format): AsyncGenerator<Buffer> {
|
|
140
|
-
yield Buffer.concat([CUT, CRLF, encoder.encode('ACK'), CRLF, CUT])
|
|
141
|
-
|
|
142
|
-
for await (const part of body)
|
|
143
|
-
yield Buffer.concat([
|
|
144
|
-
CRLF /* indicates no boundary headers */,
|
|
145
|
-
encoder.encode(part),
|
|
146
|
-
CRLF,
|
|
147
|
-
CUT
|
|
148
|
-
])
|
|
149
|
-
|
|
150
|
-
yield Buffer.concat([CRLF, encoder.encode('FIN'), CRLF, FINALCUT])
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const BOUNDARY = 'cut'
|
|
154
|
-
const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
|
|
155
|
-
const CRLF = Buffer.from('\r\n')
|
|
156
|
-
const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
|
|
157
|
-
|
|
158
|
-
export interface OutgoingMessage {
|
|
159
|
-
status?: number
|
|
160
|
-
headers?: Headers
|
|
161
|
-
body?: any
|
|
162
|
-
|
|
163
|
-
/** what the reply carries for a cache to validate by; the `cache` family sets the headers */
|
|
164
|
-
version?: number
|
|
165
|
-
modified?: number | string
|
|
166
|
-
|
|
167
|
-
/**
|
|
168
|
-
* Built by the gateway rather than returned by an operation, as a request is `authentic`
|
|
169
|
-
* when it was made by one: what is in it is the gateway's own, and the checks that answer
|
|
170
|
-
* for what an operation returns have nothing to say about it.
|
|
171
|
-
*/
|
|
172
|
-
authentic?: boolean
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export interface Query {
|
|
176
|
-
[key: string]: string | number | undefined
|
|
177
|
-
|
|
178
|
-
id?: string
|
|
179
|
-
criteria?: string
|
|
180
|
-
search?: string
|
|
181
|
-
sample?: number
|
|
182
|
-
sort?: string
|
|
183
|
-
omit?: string
|
|
184
|
-
limit?: string
|
|
185
|
-
version?: number
|
|
186
|
-
}
|
package/source/HTTP/types.ts
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { Readable, Writable } from 'node:stream'
|
|
2
|
-
import type { OutgoingHttpHeaders } from 'node:http'
|
|
3
|
-
import type { IncomingHttpHeaders } from 'node:http2'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* What Exposition requires of a request. Both `http.IncomingMessage` and
|
|
7
|
-
* `http2.Http2ServerRequest` satisfy it, so the pipeline is written once.
|
|
8
|
-
*/
|
|
9
|
-
export interface IncomingMessage extends Readable {
|
|
10
|
-
url: string
|
|
11
|
-
method: string
|
|
12
|
-
complete: boolean
|
|
13
|
-
headers: IncomingHeaders
|
|
14
|
-
socket: { remoteAddress?: string | undefined }
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* What Exposition requires of a response.
|
|
19
|
-
*
|
|
20
|
-
* `setHeader` and `appendHeader` return `void` because `Http2ServerResponse` returns
|
|
21
|
-
* nothing from them, so neither can be chained.
|
|
22
|
-
*/
|
|
23
|
-
export interface ServerResponse extends Writable {
|
|
24
|
-
statusCode: number
|
|
25
|
-
writableEnded: boolean
|
|
26
|
-
setHeader: (name: string, value: number | string | string[]) => void
|
|
27
|
-
appendHeader: (name: string, value: string | string[]) => void
|
|
28
|
-
hasHeader: (name: string) => boolean
|
|
29
|
-
writeHead: (status: number, headers?: OutgoingHttpHeaders) => ServerResponse
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* HTTP/2's header map: HTTP/1.1's, plus the pseudo-headers. `:authority` is typed here
|
|
34
|
-
* so the authority can be read without narrowing at every call site.
|
|
35
|
-
*/
|
|
36
|
-
export type IncomingHeaders = IncomingHttpHeaders
|
|
37
|
-
|
|
38
|
-
/** `h2c` is cleartext HTTP/2: there is no in-process TLS to negotiate ALPN with. */
|
|
39
|
-
export type Protocol = 'h1' | 'h2c'
|
package/source/Interception.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type * as http from './HTTP/index.js'
|
|
2
|
-
import type { Input, Output } from './io.js'
|
|
3
|
-
|
|
4
|
-
export class Interception implements Interceptor {
|
|
5
|
-
private readonly interceptors: Interceptor[]
|
|
6
|
-
|
|
7
|
-
public constructor(interceptors: Interceptor[], options: http.Options) {
|
|
8
|
-
this.interceptors = interceptors
|
|
9
|
-
|
|
10
|
-
// interceptors are module singletons, so a second gateway in one process —
|
|
11
|
-
// which is how the features run — would otherwise inherit the first one's state
|
|
12
|
-
for (const interceptor of interceptors) {
|
|
13
|
-
interceptor.reset?.()
|
|
14
|
-
interceptor.mount?.(options)
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
public async intercept(input: Input): Promise<Output> {
|
|
19
|
-
for (const interceptor of this.interceptors) {
|
|
20
|
-
const output = await interceptor.intercept(input)
|
|
21
|
-
|
|
22
|
-
if (output !== null) return output
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return null
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface Interceptor {
|
|
30
|
-
intercept: (input: Input) => Output | Promise<Output>
|
|
31
|
-
|
|
32
|
-
/** Discards whatever the interceptor accumulated while serving. */
|
|
33
|
-
reset?: () => void
|
|
34
|
-
|
|
35
|
-
/** What the annotation says, for an interceptor that answers from it. */
|
|
36
|
-
mount?: (options: http.Options) => void
|
|
37
|
-
}
|