@toa.io/extensions.exposition 1.0.0-alpha.285 → 1.0.0-alpha.287
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/CHANGELOG.md +1 -545
- package/components/exposition.octets/operations/delete.js +1 -1
- package/components/exposition.octets/operations/get.js +5 -2
- package/components/exposition.octets/operations/head.js +1 -1
- package/components/exposition.octets/operations/put.js +29 -37
- package/components/exposition.octets/types/toa.d.ts +1 -1
- package/components/identity.bans/manifest.toa.yaml +12 -13
- package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.bans/operations/transit.js +1 -1
- package/components/identity.bans/source/transit.ts +1 -1
- package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
- package/components/identity.bans/types/toa.d.ts +5 -5
- package/components/identity.basic/events/principal.js +3 -1
- package/components/identity.basic/manifest.toa.yaml +17 -23
- package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
- package/components/identity.basic/operations/add.js +1 -1
- package/components/identity.basic/operations/authenticate.js +2 -2
- package/components/identity.basic/operations/check.js +4 -2
- package/components/identity.basic/operations/delete.js +1 -1
- package/components/identity.basic/operations/incept.js +1 -1
- package/components/identity.basic/operations/info.js +1 -1
- package/components/identity.basic/operations/lib/credentials.js +1 -1
- package/components/identity.basic/operations/transit.js +7 -8
- package/components/identity.basic/source/add.ts +5 -2
- package/components/identity.basic/source/authenticate.ts +11 -13
- package/components/identity.basic/source/check.ts +9 -6
- package/components/identity.basic/source/delete.ts +4 -1
- package/components/identity.basic/source/incept.ts +13 -10
- package/components/identity.basic/source/info.ts +4 -1
- package/components/identity.basic/source/lib/credentials.ts +2 -3
- package/components/identity.basic/source/transit.ts +27 -21
- package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/types/index.d.ts +7 -3
- package/components/identity.basic/types/toa.d.ts +5 -5
- package/components/identity.clients/manifest.toa.yaml +36 -40
- package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
- package/components/identity.clients/operations/describe.js +1 -1
- package/components/identity.clients/operations/lib/canonical.js +1 -1
- package/components/identity.clients/operations/lib/cimd.js +3 -2
- package/components/identity.clients/operations/lib/redirect.js +7 -4
- package/components/identity.clients/operations/register.js +2 -2
- package/components/identity.clients/source/describe.ts +6 -8
- package/components/identity.clients/source/lib/Context.ts +6 -3
- package/components/identity.clients/source/lib/Entity.ts +1 -1
- package/components/identity.clients/source/lib/canonical.ts +1 -1
- package/components/identity.clients/source/lib/cimd.test.ts +8 -6
- package/components/identity.clients/source/lib/cimd.ts +24 -19
- package/components/identity.clients/source/lib/redirect.test.ts +8 -2
- package/components/identity.clients/source/lib/redirect.ts +12 -8
- package/components/identity.clients/source/register.ts +18 -18
- package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
- package/components/identity.clients/types/toa.d.ts +5 -5
- package/components/identity.credentials/manifest.toa.yaml +4 -4
- package/components/identity.credentials/operations/list.js +8 -4
- package/components/identity.credentials/source/list.test.ts +39 -20
- package/components/identity.credentials/source/list.ts +12 -8
- package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
- package/components/identity.credentials/types/toa.d.ts +2 -2
- package/components/identity.federation/manifest.toa.yaml +23 -32
- package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
- package/components/identity.federation/operations/authenticate.js +4 -2
- package/components/identity.federation/operations/create.js +2 -2
- package/components/identity.federation/operations/decode.js +1 -1
- package/components/identity.federation/operations/delete.js +1 -1
- package/components/identity.federation/operations/incept.js +1 -1
- package/components/identity.federation/operations/lib/decode.js +1 -1
- package/components/identity.federation/operations/lib/discovery.js +2 -2
- package/components/identity.federation/operations/lib/exchange.js +8 -4
- package/components/identity.federation/operations/lib/principal.js +1 -1
- package/components/identity.federation/operations/lib/resolve.js +1 -1
- package/components/identity.federation/operations/list.js +2 -2
- package/components/identity.federation/source/authenticate.ts +19 -17
- package/components/identity.federation/source/create.ts +6 -7
- package/components/identity.federation/source/decode.ts +4 -1
- package/components/identity.federation/source/delete.ts +4 -1
- package/components/identity.federation/source/incept.ts +2 -3
- package/components/identity.federation/source/lib/decode.ts +4 -7
- package/components/identity.federation/source/lib/discovery.test.ts +15 -5
- package/components/identity.federation/source/lib/discovery.ts +10 -9
- package/components/identity.federation/source/lib/exchange.ts +18 -15
- package/components/identity.federation/source/lib/jose.d.ts +1 -1
- package/components/identity.federation/source/lib/principal.ts +5 -3
- package/components/identity.federation/source/lib/resolve.ts +5 -1
- package/components/identity.federation/source/list.test.ts +26 -10
- package/components/identity.federation/source/list.ts +5 -2
- package/components/identity.federation/source/types/context.ts +5 -2
- package/components/identity.federation/source/types/entity.ts +2 -2
- package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/types/toa.d.ts +5 -5
- package/components/identity.grants/manifest.toa.yaml +27 -31
- package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
- package/components/identity.grants/operations/authorize.js +1 -1
- package/components/identity.grants/operations/exchange.js +5 -2
- package/components/identity.grants/operations/lib/code.js +1 -1
- package/components/identity.grants/operations/lib/identify.js +1 -1
- package/components/identity.grants/operations/list.js +1 -1
- package/components/identity.grants/operations/revoke.js +3 -2
- package/components/identity.grants/source/authorize.ts +27 -19
- package/components/identity.grants/source/exchange.ts +15 -11
- package/components/identity.grants/source/lib/code.ts +20 -8
- package/components/identity.grants/source/lib/identify.ts +1 -1
- package/components/identity.grants/source/list.ts +2 -2
- package/components/identity.grants/source/revoke.ts +9 -7
- package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
- package/components/identity.grants/types/index.d.ts +3 -3
- package/components/identity.grants/types/toa.d.ts +5 -5
- package/components/identity.keys/manifest.toa.yaml +18 -23
- package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
- package/components/identity.keys/operations/create.js +1 -1
- package/components/identity.keys/operations/disable.js +1 -1
- package/components/identity.keys/operations/revoke.js +1 -1
- package/components/identity.keys/source/create.ts +2 -3
- package/components/identity.keys/source/disable.ts +1 -1
- package/components/identity.keys/source/revoke.ts +2 -2
- package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.keys/types/toa.d.ts +5 -5
- package/components/identity.otp/manifest.toa.yaml +16 -24
- package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
- package/components/identity.otp/operations/authenticate.js +1 -1
- package/components/identity.otp/operations/issue.js +1 -1
- package/components/identity.otp/source/authenticate.ts +4 -7
- package/components/identity.otp/source/issue.ts +1 -1
- package/components/identity.otp/source/lib/Context.ts +1 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
- package/components/identity.otp/types/toa.d.ts +5 -5
- package/components/identity.passkeys/manifest.toa.yaml +45 -53
- package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
- package/components/identity.passkeys/operations/authenticate.js +1 -1
- package/components/identity.passkeys/operations/challenge.js +6 -3
- package/components/identity.passkeys/operations/create.js +1 -1
- package/components/identity.passkeys/operations/delete.js +1 -1
- package/components/identity.passkeys/operations/list.js +1 -1
- package/components/identity.passkeys/operations/use.js +1 -1
- package/components/identity.passkeys/source/authenticate.ts +3 -4
- package/components/identity.passkeys/source/challenge.ts +29 -25
- package/components/identity.passkeys/source/create.ts +8 -6
- package/components/identity.passkeys/source/delete.ts +4 -1
- package/components/identity.passkeys/source/list.ts +4 -1
- package/components/identity.passkeys/source/types/Context.ts +1 -1
- package/components/identity.passkeys/source/use.ts +12 -10
- package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.passkeys/types/toa.d.ts +5 -5
- package/components/identity.roles/manifest.toa.yaml +12 -16
- package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
- package/components/identity.roles/operations/grant.js +1 -1
- package/components/identity.roles/operations/list.js +1 -1
- package/components/identity.roles/operations/principal.js +2 -2
- package/components/identity.roles/source/grant.ts +7 -6
- package/components/identity.roles/source/list.ts +1 -1
- package/components/identity.roles/source/principal.ts +5 -7
- package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/types/toa.d.ts +5 -5
- package/components/identity.tokens/manifest.toa.yaml +17 -15
- package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.tokens/operations/authenticate.js +2 -2
- package/components/identity.tokens/operations/decrypt.js +11 -5
- package/components/identity.tokens/operations/encrypt.js +2 -2
- package/components/identity.tokens/operations/issue.js +2 -4
- package/components/identity.tokens/operations/lib/form.js +1 -1
- package/components/identity.tokens/operations/lib/key.js +1 -1
- package/components/identity.tokens/operations/revoke.js +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -16
- package/components/identity.tokens/source/authenticate.ts +7 -10
- package/components/identity.tokens/source/decrypt.test.ts +62 -29
- package/components/identity.tokens/source/decrypt.ts +30 -27
- package/components/identity.tokens/source/encrypt.test.ts +21 -16
- package/components/identity.tokens/source/encrypt.ts +8 -11
- package/components/identity.tokens/source/issue.test.ts +4 -2
- package/components/identity.tokens/source/issue.ts +6 -8
- package/components/identity.tokens/source/lib/form.ts +5 -9
- package/components/identity.tokens/source/lib/jose.d.ts +1 -1
- package/components/identity.tokens/source/lib/key.ts +1 -1
- package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
- package/components/identity.tokens/source/revoke.ts +1 -1
- package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/types/index.d.ts +13 -4
- package/components/identity.tokens/types/toa.d.ts +5 -5
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/documentation/access.md +4 -3
- package/documentation/cache.md +17 -3
- package/documentation/components.md +2 -2
- package/documentation/credentials.md +2 -2
- package/documentation/identity.md +7 -9
- package/documentation/map.md +2 -2
- package/documentation/mcp.md +16 -16
- package/documentation/notes/peers.md +1 -1
- package/documentation/notes/throttling.md +1 -1
- package/documentation/octets.md +4 -4
- package/documentation/protocol.md +3 -3
- package/documentation/query.md +14 -8
- package/documentation/rpc.md +31 -21
- package/documentation/tracing.md +3 -3
- package/documentation/tree.md +1 -1
- package/features/auth.assert.feature +2 -2
- package/features/auth.bearer.feature +1 -1
- package/features/auth.claims.feature +5 -5
- package/features/auth.incept.feature +2 -2
- package/features/authorities.federation.feature +1 -1
- package/features/configuration.feature +3 -4
- package/features/credentials.feature +9 -9
- package/features/dev.feature +1 -0
- package/features/dynamic.feature +1 -0
- package/features/errors.feature +21 -0
- package/features/etag.feature +0 -86
- package/features/identity.bans.feature +3 -3
- package/features/identity.basic.feature +9 -9
- package/features/identity.federation.feature +11 -11
- package/features/identity.tokens.custom.feature +5 -5
- package/features/identity.tokens.feature +2 -2
- package/features/interruptions.feature +1 -0
- package/features/introspection.map.feature +4 -4
- package/features/io.throttle.feature +1 -0
- package/features/map.feature +2 -2
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/steps/Captures.ts +1 -1
- package/features/steps/Cloudinary.ts +1 -2
- package/features/steps/Common.ts +4 -5
- package/features/steps/Components.ts +17 -12
- package/features/steps/Database.ts +42 -23
- package/features/steps/Gateway.ts +55 -72
- package/features/steps/HTTP.ts +12 -15
- package/features/steps/IDP.ts +118 -94
- package/features/steps/Identity.ts +3 -3
- package/features/steps/OTP.ts +3 -3
- package/features/steps/Parameters.ts +20 -10
- package/features/steps/Probe.ts +9 -7
- package/features/steps/Realtime.ts +40 -22
- package/features/steps/Workspace.ts +10 -7
- package/features/steps/components/audit/operations/record.js +1 -1
- package/features/steps/components/echo/operations/affect.js +1 -1
- package/features/steps/components/echo/operations/compute.js +1 -1
- package/features/steps/components/echo/operations/echo.js +1 -1
- package/features/steps/components/echo/operations/error.js +1 -1
- package/features/steps/components/echo/operations/identity.js +1 -1
- package/features/steps/components/echo/operations/parameters.js +1 -1
- package/features/steps/components/echo/operations/ping.js +1 -1
- package/features/steps/components/echo/operations/unwrap.js +1 -1
- package/features/steps/components/greeter/operations/greet.js +1 -1
- package/features/steps/components/notify/operations/send.js +1 -1
- package/features/steps/components/octets.tester/operations/authority.js +1 -1
- package/features/steps/components/octets.tester/operations/bar.js +1 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/concat.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/err.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +1 -1
- package/features/steps/components/octets.tester/operations/id.js +1 -1
- package/features/steps/components/octets.tester/operations/identity.js +1 -1
- package/features/steps/components/octets.tester/operations/redirect.js +6 -4
- package/features/steps/components/octets.tester/operations/yex.js +1 -1
- package/features/steps/components/octets.tester/operations/yield.js +1 -1
- package/features/steps/components/orders/manifest.toa.yaml +10 -12
- package/features/steps/components/orders/operations/create.js +4 -2
- package/features/steps/components/pots/manifest.toa.yaml +15 -20
- package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
- package/features/steps/components/pricing/operations/quote.js +1 -1
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/sequences/operations/numbers.js +1 -1
- package/features/steps/components/sequences/operations/tokens.js +3 -3
- package/features/steps/components/users/manifest.toa.yaml +3 -5
- package/features/steps/components/users/operations/create.js +1 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
- package/features/steps/map.ts +2 -2
- package/features/timestamps.feature +1 -1
- package/package.json +7 -7
- package/readme.md +11 -11
- package/schemas/annotation.cos.yaml +1 -3
- package/schemas/method.cos.yaml +2 -0
- package/source/Branch.test.ts +2 -2
- package/source/Branch.ts +3 -5
- package/source/Composition.ts +5 -5
- package/source/Directive.test.ts +38 -20
- package/source/Directive.ts +61 -47
- package/source/Endpoint.test.ts +1 -1
- package/source/Endpoint.ts +27 -92
- package/source/Factory.ts +26 -12
- package/source/Gateway.ts +87 -76
- package/source/HTTP/Context.ts +23 -30
- package/source/HTTP/Probe.ts +7 -9
- package/source/HTTP/Server.ts +88 -69
- package/source/HTTP/Timing.ts +6 -21
- package/source/HTTP/address.test.ts +8 -2
- package/source/HTTP/address.ts +2 -3
- package/source/HTTP/exceptions.ts +20 -18
- package/source/HTTP/formats/form.ts +1 -1
- package/source/HTTP/formats/json.ts +2 -2
- package/source/HTTP/formats/msgpack.ts +3 -4
- package/source/HTTP/formats/text.ts +2 -2
- package/source/HTTP/formats/yaml.test.ts +4 -1
- package/source/HTTP/formats/yaml.ts +14 -11
- package/source/HTTP/messages.test.ts +38 -28
- package/source/HTTP/messages.ts +44 -98
- package/source/Interception.ts +3 -4
- package/source/Introspection.ts +26 -14
- package/source/MCP/Server.ts +114 -54
- package/source/MCP/discover.ts +6 -7
- package/source/MCP/errors.ts +7 -8
- package/source/MCP/schema.test.ts +9 -3
- package/source/MCP/schema.ts +12 -16
- package/source/MCP/tools.ts +33 -28
- package/source/Mapping.ts +25 -27
- package/source/Query.ts +58 -44
- package/source/RPC/Context.ts +8 -11
- package/source/RPC/Dispatcher.ts +46 -26
- package/source/RPC/errors.test.ts +41 -16
- package/source/RPC/errors.ts +9 -10
- package/source/RPC/names.test.ts +35 -16
- package/source/RPC/names.ts +22 -29
- package/source/RTD/Directives.ts +21 -10
- package/source/RTD/Endpoint.ts +4 -1
- package/source/RTD/Method.ts +8 -6
- package/source/RTD/Node.ts +32 -34
- package/source/RTD/Route.ts +18 -21
- package/source/RTD/Tree.ts +18 -18
- package/source/RTD/factory.ts +13 -16
- package/source/RTD/segment.ts +12 -10
- package/source/RTD/syntax/parse.test.ts +12 -6
- package/source/RTD/syntax/parse.ts +30 -26
- package/source/RTD/syntax/types.ts +17 -1
- package/source/RTD/walk.test.ts +59 -22
- package/source/Remotes.test.ts +25 -4
- package/source/Remotes.ts +9 -4
- package/source/Tenant.ts +12 -12
- package/source/deployment.ts +20 -20
- package/source/directives/auth/Anonymous.test.ts +8 -2
- package/source/directives/auth/Anonymous.ts +5 -8
- package/source/directives/auth/Anyone.ts +3 -3
- package/source/directives/auth/Assert.ts +10 -10
- package/source/directives/auth/Authorization.ts +83 -69
- package/source/directives/auth/Delegate.test.ts +2 -2
- package/source/directives/auth/Delegate.ts +8 -10
- package/source/directives/auth/Echo.ts +5 -8
- package/source/directives/auth/Federation.ts +30 -21
- package/source/directives/auth/Id.ts +7 -4
- package/source/directives/auth/Incept.ts +32 -26
- package/source/directives/auth/Input.ts +36 -20
- package/source/directives/auth/Role.test.ts +49 -23
- package/source/directives/auth/Role.ts +29 -22
- package/source/directives/auth/Rule.ts +13 -8
- package/source/directives/auth/Scheme.ts +7 -7
- package/source/directives/auth/create.ts +1 -1
- package/source/directives/auth/schemes.ts +1 -1
- package/source/directives/auth/split.ts +2 -3
- package/source/directives/auth/types.ts +5 -2
- package/source/directives/cache/Cache.ts +44 -9
- package/source/directives/cache/Control.ts +25 -26
- package/source/directives/cache/Exact.ts +1 -1
- package/source/directives/cache/etag.ts +38 -0
- package/source/directives/cors/CORS.ts +9 -7
- package/source/directives/dev/Development.ts +3 -4
- package/source/directives/dev/Faulty.ts +11 -6
- package/source/directives/dev/Sleep.ts +5 -7
- package/source/directives/dev/Stub.ts +2 -2
- package/source/directives/dev/Throw.ts +2 -2
- package/source/directives/flow/Compose.ts +26 -20
- package/source/directives/flow/Fetch.ts +15 -15
- package/source/directives/flow/Flow.ts +9 -8
- package/source/directives/index.ts +11 -2
- package/source/directives/io/IO.ts +29 -20
- package/source/directives/io/Input.ts +9 -12
- package/source/directives/io/Output.ts +20 -23
- package/source/directives/io/Status.test.ts +12 -8
- package/source/directives/io/Status.ts +9 -8
- package/source/directives/io/Throttle.ts +6 -7
- package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
- package/source/directives/io/lib/throttle/Configuration.ts +14 -9
- package/source/directives/io/lib/throttle/Keys.ts +15 -10
- package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
- package/source/directives/io/lib/throttle/Quotas.ts +20 -26
- package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
- package/source/directives/io/lib/throttle/Sync.ts +9 -12
- package/source/directives/io/lib/throttle/Warning.ts +3 -4
- package/source/directives/io/lib/throttle/components/IP.ts +4 -5
- package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
- package/source/directives/io/lib/throttle/components/Path.ts +1 -1
- package/source/directives/io/lib/throttle/components/Route.ts +2 -2
- package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
- package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
- package/source/directives/io/schemas.test.ts +12 -6
- package/source/directives/map/Authority.ts +2 -2
- package/source/directives/map/Buffer.ts +2 -2
- package/source/directives/map/Claims.ts +25 -20
- package/source/directives/map/Headers.ts +17 -13
- package/source/directives/map/Language.ts +8 -5
- package/source/directives/map/Languages.ts +9 -3
- package/source/directives/map/Map.ts +25 -12
- package/source/directives/map/Mapping.ts +9 -6
- package/source/directives/map/Properties.ts +1 -1
- package/source/directives/map/Segments.ts +22 -15
- package/source/directives/mcp/MCP.ts +9 -7
- package/source/directives/mcp/Tool.test.ts +21 -9
- package/source/directives/mcp/Tool.ts +23 -11
- package/source/directives/oauth/Discovery.ts +7 -11
- package/source/directives/oauth/documents.ts +11 -14
- package/source/directives/octets/Context.ts +6 -3
- package/source/directives/octets/Delete.ts +33 -25
- package/source/directives/octets/Directive.ts +5 -1
- package/source/directives/octets/Get.ts +13 -21
- package/source/directives/octets/Octets.ts +20 -15
- package/source/directives/octets/Put.ts +62 -27
- package/source/directives/octets/Workflow.ts +18 -12
- package/source/directives/octets/bytes.ts +1 -1
- package/source/directives/octets/schemas.test.ts +8 -14
- package/source/directives/octets/workflows/Execution.ts +19 -21
- package/source/directives/octets/workflows/Workflow.ts +10 -7
- package/source/directives/require/Headers.ts +3 -4
- package/source/directives/require/Require.ts +3 -4
- package/source/exceptions.ts +19 -12
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +4 -1
- package/source/manifest.ts +19 -13
- package/source/octets.d.ts +1 -1
- package/source/root.ts +3 -2
- package/source/schemas.test.ts +17 -3
- package/transpiled/Branch.js.map +1 -1
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +6 -2
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +0 -2
- package/transpiled/Endpoint.js +11 -52
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js +1 -0
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -1
- package/transpiled/Gateway.js +24 -15
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +0 -3
- package/transpiled/HTTP/Context.js +7 -9
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Probe.js.map +1 -1
- package/transpiled/HTTP/Server.js +19 -4
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +1 -2
- package/transpiled/HTTP/Timing.js +2 -10
- package/transpiled/HTTP/Timing.js.map +1 -1
- package/transpiled/HTTP/address.js.map +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/form.js.map +1 -1
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +4 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +3 -2
- package/transpiled/HTTP/messages.js +1 -43
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.js.map +1 -1
- package/transpiled/Introspection.js +13 -2
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.js +15 -4
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.js.map +1 -1
- package/transpiled/MCP/errors.js.map +1 -1
- package/transpiled/MCP/schema.js +1 -1
- package/transpiled/MCP/schema.js.map +1 -1
- package/transpiled/MCP/tools.js +10 -7
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/Mapping.d.ts +2 -2
- package/transpiled/Mapping.js +3 -5
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +6 -2
- package/transpiled/Query.js +23 -8
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Context.js +0 -7
- package/transpiled/RPC/Context.js.map +1 -1
- package/transpiled/RPC/Dispatcher.js +4 -1
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RPC/errors.js.map +1 -1
- package/transpiled/RPC/names.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +1 -1
- package/transpiled/RTD/Method.js +1 -3
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.js +5 -4
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +4 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +6 -0
- package/transpiled/RTD/syntax/types.js +10 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +6 -1
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +1 -3
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.js.map +1 -1
- package/transpiled/directives/auth/Assert.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +7 -3
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.js +1 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.js +3 -7
- package/transpiled/directives/auth/Federation.js.map +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.js +1 -1
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +1 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.js.map +1 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +3 -1
- package/transpiled/directives/cache/Cache.js +28 -2
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.js +1 -1
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/etag.d.ts +10 -0
- package/transpiled/directives/cache/etag.js +30 -0
- package/transpiled/directives/cache/etag.js.map +1 -0
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Faulty.js.map +1 -1
- package/transpiled/directives/dev/Sleep.js.map +1 -1
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/flow/Compose.js +7 -3
- package/transpiled/directives/flow/Compose.js.map +1 -1
- package/transpiled/directives/flow/Fetch.js.map +1 -1
- package/transpiled/directives/flow/Flow.js.map +1 -1
- package/transpiled/directives/index.js +11 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.d.ts +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +1 -1
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Status.js.map +1 -1
- package/transpiled/directives/io/Throttle.js +1 -1
- package/transpiled/directives/io/Throttle.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
- package/transpiled/directives/map/Authority.js.map +1 -1
- package/transpiled/directives/map/Buffer.js.map +1 -1
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Headers.js.map +1 -1
- package/transpiled/directives/map/Language.js.map +1 -1
- package/transpiled/directives/map/Languages.js.map +1 -1
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/directives/map/Properties.js.map +1 -1
- package/transpiled/directives/map/Segments.js.map +1 -1
- package/transpiled/directives/mcp/MCP.js +1 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.js +3 -1
- package/transpiled/directives/mcp/Tool.js.map +1 -1
- package/transpiled/directives/oauth/Discovery.js.map +1 -1
- package/transpiled/directives/oauth/documents.js.map +1 -1
- package/transpiled/directives/octets/Context.js +1 -1
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.js.map +1 -1
- package/transpiled/directives/octets/Get.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -1
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Put.js.map +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.js +1 -2
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Headers.js.map +1 -1
- package/transpiled/directives/require/Require.js.map +1 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js +5 -1
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/source/redact.test.ts +0 -27
- package/source/redact.ts +0 -21
- package/transpiled/redact.d.ts +0 -5
- package/transpiled/redact.js +0 -17
- package/transpiled/redact.js.map +0 -1
|
@@ -5,7 +5,7 @@ export class Exception extends Error {
|
|
|
5
5
|
/** Headers the status is not complete without, like `Retry-After` on a 429. */
|
|
6
6
|
public readonly headers?: Headers
|
|
7
7
|
|
|
8
|
-
protected constructor
|
|
8
|
+
protected constructor(status: number, body?: any, headers?: Headers) {
|
|
9
9
|
super()
|
|
10
10
|
this.status = status
|
|
11
11
|
this.body = body
|
|
@@ -13,85 +13,87 @@ export class Exception extends Error {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
export class ClientError extends Exception {
|
|
17
|
-
}
|
|
16
|
+
export class ClientError extends Exception {}
|
|
18
17
|
|
|
19
18
|
export class BadRequest extends ClientError {
|
|
20
|
-
public constructor
|
|
19
|
+
public constructor(body?: any) {
|
|
21
20
|
super(400, body)
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
export class Unauthorized extends ClientError {
|
|
26
|
-
public constructor
|
|
25
|
+
public constructor(body?: any) {
|
|
27
26
|
super(401, body)
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
export class Forbidden extends ClientError {
|
|
32
|
-
public constructor
|
|
31
|
+
public constructor(body?: any) {
|
|
33
32
|
super(403, body)
|
|
34
33
|
}
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
export class NotFound extends ClientError {
|
|
38
|
-
public constructor
|
|
37
|
+
public constructor(body?: any) {
|
|
39
38
|
super(404, body)
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
41
|
|
|
43
42
|
export class MethodNotAllowed extends ClientError {
|
|
44
|
-
public constructor
|
|
43
|
+
public constructor(headers?: Headers) {
|
|
45
44
|
super(405, undefined, headers)
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
export class NotAcceptable extends ClientError {
|
|
50
|
-
public constructor
|
|
49
|
+
public constructor() {
|
|
51
50
|
super(406)
|
|
52
51
|
}
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
export class Conflict extends ClientError {
|
|
56
|
-
public constructor
|
|
55
|
+
public constructor(body?: any) {
|
|
57
56
|
super(409, body)
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
export class PreconditionFailed extends ClientError {
|
|
62
|
-
public constructor
|
|
61
|
+
public constructor() {
|
|
63
62
|
super(412)
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
|
|
67
66
|
export class RequestEntityTooLarge extends ClientError {
|
|
68
|
-
public constructor
|
|
67
|
+
public constructor(body?: any) {
|
|
69
68
|
super(413, body)
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
71
|
|
|
73
72
|
export class UnsupportedMediaType extends ClientError {
|
|
74
|
-
public constructor
|
|
73
|
+
public constructor() {
|
|
75
74
|
super(415)
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
export class UnprocessableEntity extends ClientError {
|
|
80
|
-
public constructor
|
|
79
|
+
public constructor(body?: any) {
|
|
81
80
|
super(422, body)
|
|
82
81
|
}
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
export class TooManyRequests extends ClientError {
|
|
86
85
|
/** @param retry Seconds until the request would be admitted. */
|
|
87
|
-
public constructor
|
|
88
|
-
super(
|
|
89
|
-
|
|
86
|
+
public constructor(retry?: number) {
|
|
87
|
+
super(
|
|
88
|
+
429,
|
|
89
|
+
undefined,
|
|
90
|
+
retry === undefined ? undefined : new Headers({ 'retry-after': String(retry) })
|
|
91
|
+
)
|
|
90
92
|
}
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
export class ServiceUnavailable extends Exception {
|
|
94
|
-
public constructor
|
|
96
|
+
public constructor(body?: any) {
|
|
95
97
|
super(503, body)
|
|
96
98
|
}
|
|
97
99
|
}
|
|
@@ -7,7 +7,7 @@ export const type = 'application/x-www-form-urlencoded'
|
|
|
7
7
|
* A name repeated in a form is a list, which is how a form says one — `URLSearchParams` keeps
|
|
8
8
|
* every value, and a name given once stays the string it was written as.
|
|
9
9
|
*/
|
|
10
|
-
export function decode
|
|
10
|
+
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
11
11
|
const params = new URLSearchParams(buffer.toString(charset as BufferEncoding))
|
|
12
12
|
const value: Record<string, string | string[]> = {}
|
|
13
13
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export const type = 'application/json'
|
|
2
2
|
export const multipart = 'multipart/json'
|
|
3
3
|
|
|
4
|
-
export function decode
|
|
4
|
+
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
5
|
const text = buffer.toString(charset as BufferEncoding)
|
|
6
6
|
|
|
7
7
|
return JSON.parse(text)
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export function encode
|
|
10
|
+
export function encode(value: any): Buffer {
|
|
11
11
|
const text = JSON.stringify(value)
|
|
12
12
|
|
|
13
13
|
return Buffer.from(text)
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { pack, unpack } from 'msgpackr'
|
|
2
2
|
|
|
3
|
-
export function decode
|
|
3
|
+
export function decode(buffer: Buffer): any {
|
|
4
4
|
return unpack(buffer)
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export function encode
|
|
8
|
-
if (typeof value === 'object' && value !== null)
|
|
9
|
-
Object.setPrototypeOf(value, null)
|
|
7
|
+
export function encode(value: any): Buffer {
|
|
8
|
+
if (typeof value === 'object' && value !== null) Object.setPrototypeOf(value, null)
|
|
10
9
|
|
|
11
10
|
return pack(value)
|
|
12
11
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export const type = 'text/plain'
|
|
2
2
|
export const multipart = 'multipart/text'
|
|
3
3
|
|
|
4
|
-
export function decode
|
|
4
|
+
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
5
5
|
return buffer.toString(charset as BufferEncoding)
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
export function encode
|
|
8
|
+
export function encode(value: { toString: () => string }): Buffer {
|
|
9
9
|
return Buffer.from(value.toString())
|
|
10
10
|
}
|
|
@@ -9,7 +9,10 @@ it('encodes error values as their public properties', () => {
|
|
|
9
9
|
public override readonly message = 'Username is not meeting the requirements'
|
|
10
10
|
})()
|
|
11
11
|
|
|
12
|
-
assert.strictEqual(
|
|
12
|
+
assert.strictEqual(
|
|
13
|
+
encode(value).toString(),
|
|
14
|
+
'code: INVALID_USERNAME\nmessage: Username is not meeting the requirements\n'
|
|
15
|
+
)
|
|
13
16
|
})
|
|
14
17
|
|
|
15
18
|
it('writes a value the way its toJSON says', () => {
|
|
@@ -3,35 +3,38 @@ import { yaml } from '@toa.io/generic'
|
|
|
3
3
|
export const type = 'application/yaml'
|
|
4
4
|
export const multipart = 'multipart/yaml'
|
|
5
5
|
|
|
6
|
-
export function decode
|
|
6
|
+
export function decode(buffer: Buffer, charset = 'utf-8'): any {
|
|
7
7
|
const text = buffer.toString(charset as BufferEncoding)
|
|
8
8
|
|
|
9
9
|
return yaml.load(text)
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function encode
|
|
13
|
-
const serializable =
|
|
12
|
+
export function encode(value: any): Buffer {
|
|
13
|
+
const serializable =
|
|
14
|
+
value instanceof Error ? Object.assign({}, value) : represent(value)
|
|
14
15
|
const text = yaml.dump(serializable, { lineWidth: -1, noRefs: true })
|
|
15
16
|
|
|
16
17
|
return Buffer.from(text)
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
/** What says how it is to be written — a redacted secret — is written that way, as in JSON. */
|
|
20
|
-
function represent
|
|
21
|
-
if (
|
|
21
|
+
function represent(value: unknown): unknown {
|
|
22
|
+
if (
|
|
23
|
+
typeof value !== 'object' ||
|
|
24
|
+
value === null ||
|
|
25
|
+
value instanceof Date ||
|
|
26
|
+
Buffer.isBuffer(value)
|
|
27
|
+
)
|
|
22
28
|
return value
|
|
23
29
|
|
|
24
|
-
if ('toJSON' in value && typeof value.toJSON === 'function')
|
|
25
|
-
return value.toJSON()
|
|
30
|
+
if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON()
|
|
26
31
|
|
|
27
|
-
if (Array.isArray(value))
|
|
28
|
-
return value.map(represent)
|
|
32
|
+
if (Array.isArray(value)) return value.map(represent)
|
|
29
33
|
|
|
30
34
|
const object = value as Record<string, unknown>
|
|
31
35
|
const represented: Record<string, unknown> = {}
|
|
32
36
|
|
|
33
|
-
for (const key of Object.keys(object))
|
|
34
|
-
represented[key] = represent(object[key])
|
|
37
|
+
for (const key of Object.keys(object)) represented[key] = represent(object[key])
|
|
35
38
|
|
|
36
39
|
return represented
|
|
37
40
|
}
|
|
@@ -107,50 +107,61 @@ describe('read', () => {
|
|
|
107
107
|
})
|
|
108
108
|
|
|
109
109
|
it('should not offer a form as a reply encoding', () => {
|
|
110
|
-
assert.ok(
|
|
111
|
-
'
|
|
110
|
+
assert.ok(
|
|
111
|
+
!types.includes('application/x-www-form-urlencoded'),
|
|
112
|
+
'a form is read and never written'
|
|
113
|
+
)
|
|
112
114
|
})
|
|
113
115
|
|
|
114
116
|
it('should output correct mulitpart format', async () => {
|
|
115
|
-
const response = new class extends PassThrough {
|
|
117
|
+
const response = new (class extends PassThrough {
|
|
116
118
|
public readonly headers = new Headers()
|
|
117
119
|
|
|
118
|
-
public setHeader
|
|
120
|
+
public setHeader(key: string, value: string): this {
|
|
119
121
|
this.headers.set(key, value)
|
|
120
122
|
|
|
121
123
|
return this
|
|
122
124
|
}
|
|
123
|
-
}()
|
|
125
|
+
})()
|
|
124
126
|
|
|
125
127
|
const context = { encoder: formats['text/plain'] } as unknown as Context
|
|
126
|
-
const message = {
|
|
128
|
+
const message = {
|
|
129
|
+
body: Readable.from(['Hello', 'New', 'World'])
|
|
130
|
+
} as unknown as OutgoingMessage
|
|
127
131
|
|
|
128
132
|
const framed = multipart(message, context, response as unknown as http.ServerResponse)
|
|
129
133
|
|
|
130
134
|
const result = await streamConsumers.text(framed)
|
|
131
135
|
|
|
132
|
-
assert.strictEqual(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
+
)
|
|
149
157
|
})
|
|
150
158
|
})
|
|
151
159
|
|
|
152
|
-
export function createContext
|
|
153
|
-
|
|
160
|
+
export function createContext(
|
|
161
|
+
url: string,
|
|
162
|
+
headers: Record<string, string> = {},
|
|
163
|
+
content: string | Buffer = ''
|
|
164
|
+
): Context {
|
|
154
165
|
const data = Buffer.isBuffer(content) ? content : Buffer.from(content)
|
|
155
166
|
const stream = Readable.from(data)
|
|
156
167
|
let consumed = false
|
|
@@ -163,8 +174,7 @@ Context {
|
|
|
163
174
|
url: new URL(url, 'https://host.local'),
|
|
164
175
|
timing: new Timing(),
|
|
165
176
|
buffer: async () => {
|
|
166
|
-
if (consumed)
|
|
167
|
-
throw new Error('Request body already consumed')
|
|
177
|
+
if (consumed) throw new Error('Request body already consumed')
|
|
168
178
|
|
|
169
179
|
consumed = true
|
|
170
180
|
|
|
@@ -175,7 +185,7 @@ Context {
|
|
|
175
185
|
return mock as unknown as Context
|
|
176
186
|
}
|
|
177
187
|
|
|
178
|
-
function resetCalls
|
|
188
|
+
function resetCalls(target = [], seen = new Set()) {
|
|
179
189
|
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
180
190
|
|
|
181
191
|
seen.add(target)
|
package/source/HTTP/messages.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs'
|
|
2
2
|
import { Readable } from 'node:stream'
|
|
3
3
|
import { pipeline } from 'node:stream/promises'
|
|
4
|
-
import { createHash } from 'node:crypto'
|
|
5
4
|
import * as contentType from 'content-type'
|
|
6
5
|
import { console } from 'openspan'
|
|
7
6
|
import { type Format, decoders } from './formats/index.js'
|
|
@@ -9,27 +8,28 @@ import { BadRequest, NotAcceptable, UnsupportedMediaType } from './exceptions.js
|
|
|
9
8
|
import type { Context } from './Context.js'
|
|
10
9
|
import type { ServerResponse } from './types.js'
|
|
11
10
|
|
|
12
|
-
const server =
|
|
11
|
+
const server =
|
|
12
|
+
`Exposition/${JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version}` +
|
|
13
13
|
((process.env.TOA_CONTEXT === undefined ? '' : ` ${process.env.TOA_CONTEXT}`) +
|
|
14
14
|
(process.env.TOA_ENV === undefined ? '' : `/${process.env.TOA_ENV}`))
|
|
15
15
|
|
|
16
|
-
const pending = new Map<string, PendingStream>()
|
|
17
|
-
|
|
18
16
|
/**
|
|
19
17
|
* Applies what the request accumulated in `pipelines.response` — an `io:output` restriction,
|
|
20
18
|
* a `vary` a `map` directive owes. Separate from `write` because a message is not always
|
|
21
19
|
* written: one call of several produces a value the reply is assembled from.
|
|
22
20
|
*/
|
|
23
|
-
export async function shape
|
|
24
|
-
for (const transform of context.pipelines.response)
|
|
25
|
-
await transform(message)
|
|
21
|
+
export async function shape(context: Context, message: OutgoingMessage): Promise<void> {
|
|
22
|
+
for (const transform of context.pipelines.response) await transform(message)
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
export async function write
|
|
25
|
+
export async function write(
|
|
26
|
+
context: Context,
|
|
27
|
+
response: ServerResponse,
|
|
28
|
+
message: OutgoingMessage
|
|
29
|
+
): Promise<void> {
|
|
29
30
|
await shape(context, message)
|
|
30
31
|
|
|
31
|
-
if (message?.status !== undefined)
|
|
32
|
-
response.statusCode = message.status
|
|
32
|
+
if (message?.status !== undefined) response.statusCode = message.status
|
|
33
33
|
|
|
34
34
|
response.setHeader('server', server)
|
|
35
35
|
message.headers?.forEach((value, key) => response.setHeader(key, value))
|
|
@@ -42,24 +42,21 @@ export async function write (context: Context, response: ServerResponse, message
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
response.on('error', (exception: Error) =>
|
|
45
|
-
console.warn('HTTP response error', { path: context.url.pathname, exception })
|
|
45
|
+
console.warn('HTTP response error', { path: context.url.pathname, exception })
|
|
46
|
+
)
|
|
46
47
|
|
|
47
|
-
if (message.body instanceof Readable)
|
|
48
|
-
|
|
49
|
-
else
|
|
50
|
-
send(message, context, response)
|
|
48
|
+
if (message.body instanceof Readable) stream(message, context, response)
|
|
49
|
+
else send(message, context, response)
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
export async function read
|
|
52
|
+
export async function read(context: Context): Promise<any> {
|
|
54
53
|
const header = context.request.headers['content-type']
|
|
55
54
|
|
|
56
|
-
if (header === undefined)
|
|
57
|
-
return undefined
|
|
55
|
+
if (header === undefined) return undefined
|
|
58
56
|
|
|
59
57
|
const { type, parameters } = contentType.parse(header)
|
|
60
58
|
|
|
61
|
-
if (!(type in decoders))
|
|
62
|
-
throw new UnsupportedMediaType()
|
|
59
|
+
if (!(type in decoders)) throw new UnsupportedMediaType()
|
|
63
60
|
|
|
64
61
|
const format = decoders[type]
|
|
65
62
|
const buf = await context.buffer()
|
|
@@ -76,56 +73,36 @@ export async function read (context: Context): Promise<any> {
|
|
|
76
73
|
}
|
|
77
74
|
}
|
|
78
75
|
|
|
79
|
-
function send
|
|
76
|
+
function send(
|
|
77
|
+
message: OutgoingMessage,
|
|
78
|
+
context: Context,
|
|
79
|
+
response: ServerResponse
|
|
80
|
+
): void {
|
|
80
81
|
if (message.body === undefined || message.body === null) {
|
|
81
82
|
// a HEAD reply carries no body but must still report the length a GET would
|
|
82
83
|
// have returned, so a length already set by a directive is left alone
|
|
83
|
-
if (!response.hasHeader('content-length'))
|
|
84
|
-
response.setHeader('content-length', '0')
|
|
84
|
+
if (!response.hasHeader('content-length')) response.setHeader('content-length', '0')
|
|
85
85
|
|
|
86
86
|
response.end()
|
|
87
87
|
|
|
88
88
|
return
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
if (context.encoder === null)
|
|
92
|
-
throw new NotAcceptable()
|
|
91
|
+
if (context.encoder === null) throw new NotAcceptable()
|
|
93
92
|
|
|
94
93
|
const buf = context.encoder.encode(message.body)
|
|
95
94
|
|
|
96
|
-
if (message.etag === true && conditional(context, response, buf))
|
|
97
|
-
return
|
|
98
|
-
|
|
99
95
|
response.setHeader('content-type', context.encoder.type)
|
|
100
96
|
response.setHeader('content-length', buf.length.toString())
|
|
101
97
|
response.appendHeader('vary', 'accept')
|
|
102
98
|
response.end(buf)
|
|
103
99
|
}
|
|
104
100
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
*/
|
|
111
|
-
function conditional (context: Context, response: ServerResponse, buf: Buffer): boolean {
|
|
112
|
-
const etag = `"${createHash('sha256').update(buf).digest('hex')}"`
|
|
113
|
-
|
|
114
|
-
response.setHeader('etag', etag)
|
|
115
|
-
|
|
116
|
-
if (context.request.headers['if-none-match'] !== etag)
|
|
117
|
-
return false
|
|
118
|
-
|
|
119
|
-
response.setHeader('content-length', '0')
|
|
120
|
-
response.appendHeader('vary', 'accept')
|
|
121
|
-
|
|
122
|
-
response.statusCode = 304
|
|
123
|
-
response.end()
|
|
124
|
-
|
|
125
|
-
return true
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function stream (message: OutgoingMessage, context: Context, response: ServerResponse): void {
|
|
101
|
+
function stream(
|
|
102
|
+
message: OutgoingMessage,
|
|
103
|
+
context: Context,
|
|
104
|
+
response: ServerResponse
|
|
105
|
+
): void {
|
|
129
106
|
const encoded = message.headers !== undefined && message.headers.has('content-type')
|
|
130
107
|
const source: Readable = encoded ? message.body : multipart(message, context, response)
|
|
131
108
|
|
|
@@ -134,21 +111,21 @@ function stream (message: OutgoingMessage, context: Context, response: ServerRes
|
|
|
134
111
|
//
|
|
135
112
|
// `pipeline` carries an error to every stage and destroys them. `pipe` leaves the stages it
|
|
136
113
|
// built behind, and an `error` on a stream nobody listens to is an uncaught exception.
|
|
137
|
-
pipeline(source, response)
|
|
138
|
-
.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (context.debug)
|
|
142
|
-
debugStream(context, response)
|
|
114
|
+
pipeline(source, response).catch((exception: Error) =>
|
|
115
|
+
console.warn('Message stream error', { path: context.url.pathname, exception })
|
|
116
|
+
)
|
|
143
117
|
}
|
|
144
118
|
|
|
145
119
|
/**
|
|
146
120
|
* Frames an object stream as `multipart/*`: an `ACK` part, the parts themselves, then `FIN`.
|
|
147
121
|
* The body is a `Readable`; `write` reached here by testing it.
|
|
148
122
|
*/
|
|
149
|
-
export function multipart
|
|
150
|
-
|
|
151
|
-
|
|
123
|
+
export function multipart(
|
|
124
|
+
message: OutgoingMessage,
|
|
125
|
+
context: Context,
|
|
126
|
+
response: ServerResponse
|
|
127
|
+
): Readable {
|
|
128
|
+
if (context.encoder === null) throw new NotAcceptable()
|
|
152
129
|
|
|
153
130
|
const encoder = context.encoder
|
|
154
131
|
|
|
@@ -157,7 +134,7 @@ export function multipart (message: OutgoingMessage, context: Context, response:
|
|
|
157
134
|
return Readable.from(frames(message.body as Readable, encoder))
|
|
158
135
|
}
|
|
159
136
|
|
|
160
|
-
async function
|
|
137
|
+
async function* frames(body: Readable, encoder: Format): AsyncGenerator<Buffer> {
|
|
161
138
|
yield Buffer.concat([CUT, CRLF, encoder.encode('ACK'), CRLF, CUT])
|
|
162
139
|
|
|
163
140
|
for await (const part of body)
|
|
@@ -165,7 +142,8 @@ async function * frames (body: Readable, encoder: Format): AsyncGenerator<Buffer
|
|
|
165
142
|
CRLF /* indicates no boundary headers */,
|
|
166
143
|
encoder.encode(part),
|
|
167
144
|
CRLF,
|
|
168
|
-
CUT
|
|
145
|
+
CUT
|
|
146
|
+
])
|
|
169
147
|
|
|
170
148
|
yield Buffer.concat([CRLF, encoder.encode('FIN'), CRLF, FINALCUT])
|
|
171
149
|
}
|
|
@@ -175,41 +153,14 @@ const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
|
|
|
175
153
|
const CRLF = Buffer.from('\r\n')
|
|
176
154
|
const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
|
|
177
155
|
|
|
178
|
-
const PENDING_DEBUG_INTERVAL = 30000
|
|
179
|
-
|
|
180
|
-
let pendingInterval: NodeJS.Timeout | null = null
|
|
181
|
-
|
|
182
|
-
function debugStream (context: Context, response: ServerResponse): void {
|
|
183
|
-
const ctx = { method: context.request.method, path: context.url.pathname }
|
|
184
|
-
|
|
185
|
-
console.debug('Stream opened', ctx)
|
|
186
|
-
pending.set(context.id, ctx)
|
|
187
|
-
|
|
188
|
-
response.on('close', () => {
|
|
189
|
-
console.debug('Stream closed', ctx)
|
|
190
|
-
pending.delete(context.id)
|
|
191
|
-
|
|
192
|
-
if (pending.size === 0) {
|
|
193
|
-
if (pendingInterval !== null)
|
|
194
|
-
clearInterval(pendingInterval)
|
|
195
|
-
|
|
196
|
-
pendingInterval = null
|
|
197
|
-
}
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
if (pendingInterval === null)
|
|
201
|
-
pendingInterval = setInterval(() =>
|
|
202
|
-
console.debug('Pending streams', { size: pending.size }),
|
|
203
|
-
PENDING_DEBUG_INTERVAL)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
156
|
export interface OutgoingMessage {
|
|
207
157
|
status?: number
|
|
208
158
|
headers?: Headers
|
|
209
159
|
body?: any
|
|
210
160
|
|
|
211
|
-
/**
|
|
212
|
-
|
|
161
|
+
/** what the reply carries for a cache to validate by; the `cache` family sets the headers */
|
|
162
|
+
version?: number
|
|
163
|
+
modified?: number | string
|
|
213
164
|
|
|
214
165
|
/**
|
|
215
166
|
* Built by the gateway rather than returned by an operation, as a request is `authentic`
|
|
@@ -231,8 +182,3 @@ export interface Query {
|
|
|
231
182
|
limit?: string
|
|
232
183
|
version?: number
|
|
233
184
|
}
|
|
234
|
-
|
|
235
|
-
interface PendingStream {
|
|
236
|
-
method: string
|
|
237
|
-
path: string
|
|
238
|
-
}
|
package/source/Interception.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { Input, Output } from './io.js'
|
|
|
4
4
|
export class Interception implements Interceptor {
|
|
5
5
|
private readonly interceptors: Interceptor[]
|
|
6
6
|
|
|
7
|
-
public constructor
|
|
7
|
+
public constructor(interceptors: Interceptor[], options: http.Options) {
|
|
8
8
|
this.interceptors = interceptors
|
|
9
9
|
|
|
10
10
|
// interceptors are module singletons, so a second gateway in one process —
|
|
@@ -15,12 +15,11 @@ export class Interception implements Interceptor {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
public async intercept
|
|
18
|
+
public async intercept(input: Input): Promise<Output> {
|
|
19
19
|
for (const interceptor of this.interceptors) {
|
|
20
20
|
const output = await interceptor.intercept(input)
|
|
21
21
|
|
|
22
|
-
if (output !== null)
|
|
23
|
-
return output
|
|
22
|
+
if (output !== null) return output
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
return null
|