@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286
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/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 +23 -17
- 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 +45 -31
- 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/mcp.feature +32 -28
- package/features/oauth.grants.feature +1 -1
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/rpc.feature +21 -21
- 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 -71
- 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 +29 -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 -27
- package/source/MCP/types.ts +4 -1
- 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 +51 -32
- package/source/RPC/names.ts +26 -32
- 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 +64 -27
- 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 +14 -5
- package/source/directives/mcp/Tool.test.ts +42 -6
- package/source/directives/mcp/Tool.ts +38 -7
- 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.d.ts +2 -0
- 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 -6
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/MCP/types.d.ts +3 -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.d.ts +3 -2
- package/transpiled/RPC/names.js +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 +7 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.d.ts +6 -1
- package/transpiled/directives/mcp/Tool.js +16 -3
- 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/CHANGELOG.md +0 -541
- 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
|
@@ -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
|
package/source/Introspection.ts
CHANGED
|
@@ -8,6 +8,9 @@ export interface Introspection {
|
|
|
8
8
|
* one sentence cannot be true of both. The operation's own is for the Introspection.
|
|
9
9
|
*/
|
|
10
10
|
description?: string
|
|
11
|
+
|
|
12
|
+
/** what a person is shown where a client lists this method, which a name is not */
|
|
13
|
+
title?: string
|
|
11
14
|
route?: Record<string, Schema>
|
|
12
15
|
query?: Record<string, Schema>
|
|
13
16
|
|
|
@@ -30,28 +33,40 @@ export type Schema = Awaited<ReturnType<Remote['explain']>>['input']
|
|
|
30
33
|
* The same, in the order the shape states — whatever order the families that filled it ran
|
|
31
34
|
* in. What a resource says about itself is read, so it is written the way it is documented.
|
|
32
35
|
*/
|
|
33
|
-
export function order
|
|
36
|
+
export function order(introspection: Introspection): Introspection {
|
|
34
37
|
const ordered: Introspection = {}
|
|
35
38
|
|
|
36
39
|
for (const key of KEYS)
|
|
37
|
-
if (introspection[key] !== undefined)
|
|
38
|
-
(ordered[key] as unknown) = introspection[key]
|
|
40
|
+
if (introspection[key] !== undefined) (ordered[key] as unknown) = introspection[key]
|
|
39
41
|
|
|
40
42
|
return ordered
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
const KEYS = [
|
|
45
|
+
const KEYS = [
|
|
46
|
+
'title',
|
|
47
|
+
'description',
|
|
48
|
+
'route',
|
|
49
|
+
'query',
|
|
50
|
+
'headers',
|
|
51
|
+
'input',
|
|
52
|
+
'output',
|
|
53
|
+
'errors'
|
|
54
|
+
] as const
|
|
44
55
|
|
|
45
56
|
/**
|
|
46
57
|
* The schema of one input property, taken out of it: a property another family fills is
|
|
47
58
|
* not the caller's to send, and what took it says where it comes from instead.
|
|
48
59
|
*/
|
|
49
|
-
export function take
|
|
60
|
+
export function take(carrier: Carrier, property: string): Schema | undefined {
|
|
50
61
|
const input = carrier.input as Shape | null | undefined
|
|
51
62
|
const properties = input?.properties
|
|
52
63
|
|
|
53
|
-
if (
|
|
54
|
-
|
|
64
|
+
if (
|
|
65
|
+
input === undefined ||
|
|
66
|
+
input === null ||
|
|
67
|
+
properties === undefined ||
|
|
68
|
+
!(property in properties)
|
|
69
|
+
)
|
|
55
70
|
return undefined
|
|
56
71
|
|
|
57
72
|
const schema = properties[property]
|
|
@@ -69,23 +84,23 @@ export function take (carrier: Carrier, property: string): Schema | undefined {
|
|
|
69
84
|
* describes an array. What is not an object of properties is left alone: a whitelist has
|
|
70
85
|
* nothing to say about a string.
|
|
71
86
|
*/
|
|
72
|
-
export function restrict
|
|
87
|
+
export function restrict(
|
|
88
|
+
schema: Schema | undefined,
|
|
89
|
+
allowed: Set<string>
|
|
90
|
+
): Schema | undefined {
|
|
73
91
|
const shape = schema as Shape | null | undefined
|
|
74
92
|
|
|
75
|
-
if (shape === undefined || shape === null)
|
|
76
|
-
return schema
|
|
93
|
+
if (shape === undefined || shape === null) return schema
|
|
77
94
|
|
|
78
95
|
if (shape.items !== undefined)
|
|
79
96
|
return { ...shape, items: restrict(shape.items, allowed) } as unknown as Schema
|
|
80
97
|
|
|
81
|
-
if (shape.properties === undefined)
|
|
82
|
-
return schema
|
|
98
|
+
if (shape.properties === undefined) return schema
|
|
83
99
|
|
|
84
100
|
const properties: Record<string, Schema> = {}
|
|
85
101
|
|
|
86
102
|
for (const [name, property] of Object.entries(shape.properties))
|
|
87
|
-
if (allowed.has(name))
|
|
88
|
-
properties[name] = property
|
|
103
|
+
if (allowed.has(name)) properties[name] = property
|
|
89
104
|
|
|
90
105
|
const restricted: Shape = { ...shape, properties }
|
|
91
106
|
|