@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 @@ import { NotFound } from '../../HTTP/index.js'
|
|
|
5
5
|
import type { Directive } from './types.js'
|
|
6
6
|
import type { ReadableStream } from 'node:stream/web'
|
|
7
7
|
import type { Remotes } from '../../Remotes.js'
|
|
8
|
-
import type { Maybe } from '@toa.io/core'
|
|
8
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
9
9
|
import type { Component } from '@toa.io/core'
|
|
10
10
|
import type { Output } from '../../io.js'
|
|
11
11
|
import type { Input } from '../octets/types.js'
|
|
@@ -16,7 +16,7 @@ export class Fetch implements Directive {
|
|
|
16
16
|
private remote: Component | null = null
|
|
17
17
|
private readonly operation: string
|
|
18
18
|
|
|
19
|
-
public constructor
|
|
19
|
+
public constructor(endpoint: string, discovery: Remotes) {
|
|
20
20
|
assert.equal(typeof endpoint, 'string', '`flow:fetch` must be a string')
|
|
21
21
|
|
|
22
22
|
const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
|
|
@@ -25,9 +25,8 @@ export class Fetch implements Directive {
|
|
|
25
25
|
this.connecting = discovery.discover(namespace, name)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
public async apply
|
|
29
|
-
if ('if-none-match' in input.request.headers)
|
|
30
|
-
return { status: 304 }
|
|
28
|
+
public async apply(input: Input, parameters: Parameter[]): Promise<Output> {
|
|
29
|
+
if ('if-none-match' in input.request.headers) return { status: 304 }
|
|
31
30
|
|
|
32
31
|
this.remote ??= await this.connecting
|
|
33
32
|
|
|
@@ -39,11 +38,12 @@ export class Fetch implements Directive {
|
|
|
39
38
|
}
|
|
40
39
|
})
|
|
41
40
|
|
|
42
|
-
if (request instanceof Error)
|
|
43
|
-
throw new NotFound(request)
|
|
41
|
+
if (request instanceof Error) throw new NotFound(request)
|
|
44
42
|
|
|
45
|
-
const { url, options } = match<Request>(
|
|
46
|
-
|
|
43
|
+
const { url, options } = match<Request>(
|
|
44
|
+
request,
|
|
45
|
+
String,
|
|
46
|
+
{ url: request },
|
|
47
47
|
(request: Request): Request => ({
|
|
48
48
|
url: request.url,
|
|
49
49
|
options: {
|
|
@@ -51,25 +51,25 @@ export class Fetch implements Directive {
|
|
|
51
51
|
body: request.options?.body,
|
|
52
52
|
headers: request.options?.headers
|
|
53
53
|
}
|
|
54
|
-
})
|
|
54
|
+
})
|
|
55
|
+
)
|
|
55
56
|
|
|
56
57
|
const response = await fetch(url, options)
|
|
57
58
|
|
|
58
|
-
if (!response.ok)
|
|
59
|
-
throw new NotFound()
|
|
59
|
+
if (!response.ok) throw new NotFound()
|
|
60
60
|
|
|
61
61
|
const headers = new Headers()
|
|
62
62
|
|
|
63
63
|
for (const header of ['content-type', 'content-length', 'etag']) {
|
|
64
64
|
const value = response.headers.get(header)
|
|
65
65
|
|
|
66
|
-
if (value !== null)
|
|
67
|
-
headers.set(header, value)
|
|
66
|
+
if (value !== null) headers.set(header, value)
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
return {
|
|
71
70
|
headers,
|
|
72
|
-
body:
|
|
71
|
+
body:
|
|
72
|
+
response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
}
|
|
@@ -9,7 +9,7 @@ export class Flow implements DirectiveFamily<Directive> {
|
|
|
9
9
|
public readonly name: string = 'flow'
|
|
10
10
|
public readonly mandatory: boolean = false
|
|
11
11
|
|
|
12
|
-
public create
|
|
12
|
+
public create(name: string, value: unknown, remotes: Remotes): Directive {
|
|
13
13
|
const Class = constructors[name]
|
|
14
14
|
|
|
15
15
|
if (Class === undefined)
|
|
@@ -18,18 +18,19 @@ export class Flow implements DirectiveFamily<Directive> {
|
|
|
18
18
|
return new Class(value, remotes)
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
public async precall
|
|
21
|
+
public async precall(
|
|
22
|
+
directives: Directive[],
|
|
23
|
+
input: Input,
|
|
24
|
+
parameters: Parameter[]
|
|
25
|
+
): Promise<Output> {
|
|
22
26
|
for (const directive of directives) {
|
|
23
|
-
if (directive.attach !== undefined)
|
|
24
|
-
directive.attach(input)
|
|
27
|
+
if (directive.attach !== undefined) directive.attach(input)
|
|
25
28
|
|
|
26
|
-
if (directive.apply === undefined)
|
|
27
|
-
continue
|
|
29
|
+
if (directive.apply === undefined) continue
|
|
28
30
|
|
|
29
31
|
const output = await directive.apply(input, parameters)
|
|
30
32
|
|
|
31
|
-
if (output !== null)
|
|
32
|
-
return output
|
|
33
|
+
if (output !== null) return output
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
return null
|
|
@@ -12,6 +12,15 @@ import { discovery } from './oauth/index.js'
|
|
|
12
12
|
import type { DirectiveFamily } from '../RTD/index.js'
|
|
13
13
|
import type { Interceptor } from '../Interception.js'
|
|
14
14
|
|
|
15
|
-
export const families: DirectiveFamily[] =
|
|
16
|
-
|
|
15
|
+
export const families: DirectiveFamily[] = [
|
|
16
|
+
authorization,
|
|
17
|
+
io,
|
|
18
|
+
cache,
|
|
19
|
+
map,
|
|
20
|
+
mcp,
|
|
21
|
+
req,
|
|
22
|
+
flow,
|
|
23
|
+
octets,
|
|
24
|
+
dev
|
|
25
|
+
]
|
|
17
26
|
export const interceptors: Interceptor[] = [cors, discovery]
|
|
@@ -10,7 +10,7 @@ import type { Remotes } from '../../Remotes.js'
|
|
|
10
10
|
import type { Constructor, Directive } from './Directive.js'
|
|
11
11
|
import type { Introspection } from '../../Introspection.js'
|
|
12
12
|
import { ATOM_GROUP } from '../../const.js'
|
|
13
|
-
import type { extensions } from '@toa.io/core'
|
|
13
|
+
import type { extensions } from '@toa.io/core/types'
|
|
14
14
|
|
|
15
15
|
export class IO implements DirectiveFamily<Directive> {
|
|
16
16
|
public readonly name = 'io'
|
|
@@ -21,12 +21,17 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
21
21
|
/** Throttling reconciles through the atom of the gateways, one for every directive. */
|
|
22
22
|
private sync: Sync | null = null
|
|
23
23
|
|
|
24
|
-
public mount
|
|
24
|
+
public mount(host: extensions.Host): void {
|
|
25
25
|
this.host = host
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// eslint-disable-next-line max-params
|
|
29
|
-
public create
|
|
29
|
+
public create(
|
|
30
|
+
name: string,
|
|
31
|
+
value: unknown,
|
|
32
|
+
remotes: Remotes,
|
|
33
|
+
route: string
|
|
34
|
+
): Directive {
|
|
30
35
|
if (!(name in constructors))
|
|
31
36
|
throw new Error(`Directive 'io:${name}' is not implemented`)
|
|
32
37
|
|
|
@@ -34,14 +39,16 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
34
39
|
|
|
35
40
|
Directive.validate(value)
|
|
36
41
|
|
|
37
|
-
if (name === 'throttle')
|
|
38
|
-
this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
|
|
42
|
+
if (name === 'throttle') this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
|
|
39
43
|
|
|
40
44
|
return new Directive(value, this.sync!, route)
|
|
41
45
|
}
|
|
42
46
|
|
|
43
|
-
public precall
|
|
44
|
-
|
|
47
|
+
public precall(
|
|
48
|
+
directives: Directive[],
|
|
49
|
+
context: http.Context,
|
|
50
|
+
parameters: Parameter[]
|
|
51
|
+
): null {
|
|
45
52
|
let restricted = false
|
|
46
53
|
|
|
47
54
|
for (const directive of directives) {
|
|
@@ -50,8 +57,7 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
50
57
|
directive.precall(context, parameters)
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
if (!restricted)
|
|
54
|
-
DENIAL.precall(context, parameters)
|
|
60
|
+
if (!restricted) DENIAL.precall(context, parameters)
|
|
55
61
|
|
|
56
62
|
return null
|
|
57
63
|
}
|
|
@@ -60,16 +66,18 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
60
66
|
* What a whitelist admits is what the schema states. Without an `io:output` the reply is
|
|
61
67
|
* dropped before it is sent, so there is no output to describe at all.
|
|
62
68
|
*/
|
|
63
|
-
public explain
|
|
64
|
-
|
|
69
|
+
public explain(
|
|
70
|
+
directives: Directive[],
|
|
71
|
+
_: http.Context,
|
|
72
|
+
introspection: Introspection
|
|
73
|
+
): Introspection {
|
|
65
74
|
let restricted = false
|
|
66
75
|
|
|
67
76
|
for (const directive of directives) {
|
|
68
77
|
if (directive instanceof Input)
|
|
69
78
|
introspection.input = restrict(introspection.input, directive.allowed)
|
|
70
79
|
|
|
71
|
-
if (!(directive instanceof Output))
|
|
72
|
-
continue
|
|
80
|
+
if (!(directive instanceof Output)) continue
|
|
73
81
|
|
|
74
82
|
restricted = true
|
|
75
83
|
|
|
@@ -77,16 +85,17 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
77
85
|
introspection.output = restrict(introspection.output, directive.allowed)
|
|
78
86
|
}
|
|
79
87
|
|
|
80
|
-
if (!restricted)
|
|
81
|
-
delete introspection.output
|
|
88
|
+
if (!restricted) delete introspection.output
|
|
82
89
|
|
|
83
90
|
return introspection
|
|
84
91
|
}
|
|
85
92
|
|
|
86
|
-
public settle
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
93
|
+
public settle(
|
|
94
|
+
directives: Directive[],
|
|
95
|
+
context: http.Context,
|
|
96
|
+
output: http.OutgoingMessage
|
|
97
|
+
): void {
|
|
98
|
+
for (const directive of directives) directive.settle?.(context, output)
|
|
90
99
|
}
|
|
91
100
|
|
|
92
101
|
/**
|
|
@@ -94,7 +103,7 @@ export class IO implements DirectiveFamily<Directive> {
|
|
|
94
103
|
* factory disposes every route it made — so this runs once per route at shutdown,
|
|
95
104
|
* and disposing an already stopped ticker is what makes that harmless.
|
|
96
105
|
*/
|
|
97
|
-
public dispose
|
|
106
|
+
public dispose(): void {
|
|
98
107
|
this.sync?.dispose()
|
|
99
108
|
}
|
|
100
109
|
}
|
|
@@ -8,15 +8,15 @@ export class Input implements Directive {
|
|
|
8
8
|
/** what a client may send, which is therefore what the input schema states */
|
|
9
9
|
public readonly allowed: Set<string>
|
|
10
10
|
|
|
11
|
-
public constructor
|
|
11
|
+
public constructor(permissions: Permissions) {
|
|
12
12
|
this.allowed = new Set(permissions)
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
public static validate
|
|
16
|
-
schemas.input.validate<Permissions>(permissions,
|
|
15
|
+
public static validate(permissions: unknown): asserts permissions is Permissions {
|
|
16
|
+
schemas.input.validate<Permissions>(permissions, "Incorrect 'io:input' format")
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
public precall
|
|
19
|
+
public precall(context: Context): void {
|
|
20
20
|
// Restrictions are on what the client sent, so the check goes to the front of the
|
|
21
21
|
// pipeline whatever order the families ran in: `auth:delegate` embeds the identity
|
|
22
22
|
// and `map:*` assigns mapped properties, and those additions are the server's own,
|
|
@@ -24,9 +24,8 @@ export class Input implements Directive {
|
|
|
24
24
|
context.pipelines.body.unshift((body) => this.check(body))
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
private check
|
|
28
|
-
if (body === undefined)
|
|
29
|
-
return body
|
|
27
|
+
private check(body: unknown): Message | Message[] | undefined {
|
|
28
|
+
if (body === undefined) return body
|
|
30
29
|
|
|
31
30
|
try {
|
|
32
31
|
schemas.message.validate<Message | Message[]>(body)
|
|
@@ -36,21 +35,19 @@ export class Input implements Directive {
|
|
|
36
35
|
|
|
37
36
|
const property = this.violation(body)
|
|
38
37
|
|
|
39
|
-
if (property !== undefined)
|
|
40
|
-
throw new BadRequest(`Unexpected input: ${property}`)
|
|
38
|
+
if (property !== undefined) throw new BadRequest(`Unexpected input: ${property}`)
|
|
41
39
|
|
|
42
40
|
return body
|
|
43
41
|
}
|
|
44
42
|
|
|
45
|
-
private violation
|
|
43
|
+
private violation(value: Message | Message[]): string | undefined {
|
|
46
44
|
if (!Array.isArray(value))
|
|
47
45
|
return Object.keys(value).find((key) => !this.allowed.has(key))
|
|
48
46
|
|
|
49
47
|
for (const item of value) {
|
|
50
48
|
const property = this.violation(item)
|
|
51
49
|
|
|
52
|
-
if (property !== undefined)
|
|
53
|
-
return property
|
|
50
|
+
if (property !== undefined) return property
|
|
54
51
|
}
|
|
55
52
|
}
|
|
56
53
|
}
|
|
@@ -15,28 +15,24 @@ export class Output implements Directive {
|
|
|
15
15
|
private readonly omitted: boolean = true
|
|
16
16
|
private readonly permissions: string[] = []
|
|
17
17
|
|
|
18
|
-
public constructor
|
|
18
|
+
public constructor(permissions: Permissions) {
|
|
19
19
|
if (typeof permissions === 'boolean')
|
|
20
|
-
if (permissions)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.omitted = false
|
|
24
|
-
|
|
25
|
-
else
|
|
26
|
-
this.permissions = permissions
|
|
20
|
+
if (permissions) this.disabled = true
|
|
21
|
+
else this.omitted = false
|
|
22
|
+
else this.permissions = permissions
|
|
27
23
|
|
|
28
24
|
this.allowed = new Set(this.permissions)
|
|
29
25
|
}
|
|
30
26
|
|
|
31
|
-
public static validate
|
|
32
|
-
schemas.output.validate(permissions,
|
|
27
|
+
public static validate(permissions: unknown): asserts permissions is Permissions {
|
|
28
|
+
schemas.output.validate(permissions, "Incorrect 'io:output' format")
|
|
33
29
|
}
|
|
34
30
|
|
|
35
|
-
public precall
|
|
31
|
+
public precall(context: Context): void {
|
|
36
32
|
context.pipelines.response.push(this.restriction(context))
|
|
37
33
|
}
|
|
38
34
|
|
|
39
|
-
private restriction
|
|
35
|
+
private restriction(context: Context) {
|
|
40
36
|
return (message: OutgoingMessage): void => {
|
|
41
37
|
// what the gateway built is its own — a code and a message — and a restriction has
|
|
42
38
|
// nothing to say about it; everything else is a reply the operation returned, and is
|
|
@@ -45,37 +41,38 @@ export class Output implements Directive {
|
|
|
45
41
|
const stream = message.body instanceof Stream
|
|
46
42
|
const none = message.body === undefined || message.body === null
|
|
47
43
|
|
|
48
|
-
if (this.disabled || error || stream || none)
|
|
49
|
-
return
|
|
44
|
+
if (this.disabled || error || stream || none) return
|
|
50
45
|
|
|
51
46
|
if (typeof message.body !== 'object' || this.permissions.length === 0) {
|
|
52
47
|
if (this.omitted)
|
|
53
|
-
console.warn(
|
|
54
|
-
|
|
48
|
+
console.warn(
|
|
49
|
+
"Permissions for 'io:output' are not specified properly, response omitted",
|
|
50
|
+
{ path: context.url.pathname }
|
|
51
|
+
)
|
|
55
52
|
|
|
56
53
|
delete message.body
|
|
57
54
|
|
|
58
55
|
return
|
|
59
56
|
}
|
|
60
57
|
|
|
61
|
-
schemas.message.validate<Message>(
|
|
62
|
-
|
|
58
|
+
schemas.message.validate<Message>(
|
|
59
|
+
message.body,
|
|
60
|
+
"'io:output' expects response to be an object or array of objects"
|
|
61
|
+
)
|
|
63
62
|
|
|
64
63
|
if (Array.isArray(message.body))
|
|
65
64
|
message.body = message.body.map((entity) => this.fit(entity as Message))
|
|
66
|
-
else
|
|
67
|
-
message.body = this.fit(message.body)
|
|
65
|
+
else message.body = this.fit(message.body)
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
/** Runs per entity of a collection, hence the set and the absence of intermediates. */
|
|
72
|
-
private fit
|
|
70
|
+
private fit(message: Message): Message {
|
|
73
71
|
const output: Message = {}
|
|
74
72
|
|
|
75
73
|
// the keys of the entity, so that the response keeps the order it was built in
|
|
76
74
|
for (const key of Object.keys(message))
|
|
77
|
-
if (this.allowed.has(key))
|
|
78
|
-
output[key] = message[key]
|
|
75
|
+
if (this.allowed.has(key)) output[key] = message[key]
|
|
79
76
|
|
|
80
77
|
return output
|
|
81
78
|
}
|
|
@@ -8,8 +8,11 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
|
8
8
|
|
|
9
9
|
const status = new Status('status')
|
|
10
10
|
|
|
11
|
-
function context
|
|
12
|
-
return {
|
|
11
|
+
function context(): Context {
|
|
12
|
+
return {
|
|
13
|
+
pipelines: { body: [], response: [] },
|
|
14
|
+
url: { pathname: '/' }
|
|
15
|
+
} as unknown as Context
|
|
13
16
|
}
|
|
14
17
|
|
|
15
18
|
it('should take the status from the property and remove it', () => {
|
|
@@ -55,8 +58,7 @@ it('should have a reply it named the status of restricted, whatever that status
|
|
|
55
58
|
|
|
56
59
|
status.settle(ctx, response)
|
|
57
60
|
|
|
58
|
-
for (const transform of ctx.pipelines.response)
|
|
59
|
-
transform(response)
|
|
61
|
+
for (const transform of ctx.pipelines.response) transform(response)
|
|
60
62
|
|
|
61
63
|
assert.equal(response.status, stated)
|
|
62
64
|
assert.deepEqual(response.body, { code: 'SplxlO', error: 'invalid_grant' })
|
|
@@ -76,9 +78,11 @@ it('should leave a failure the gateway built alone, on such a route too', () =>
|
|
|
76
78
|
body: { code: 'NOT_FOUND', message: 'nope' }
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
for (const transform of ctx.pipelines.response)
|
|
80
|
-
transform(response)
|
|
81
|
+
for (const transform of ctx.pipelines.response) transform(response)
|
|
81
82
|
|
|
82
|
-
assert.deepEqual(
|
|
83
|
-
|
|
83
|
+
assert.deepEqual(
|
|
84
|
+
response.body,
|
|
85
|
+
{ code: 'NOT_FOUND', message: 'nope' },
|
|
86
|
+
'a code and a message are not what a restriction has anything to say about'
|
|
87
|
+
)
|
|
84
88
|
})
|
|
@@ -15,28 +15,29 @@ import type * as http from '../../HTTP/index.js'
|
|
|
15
15
|
export class Status implements Directive {
|
|
16
16
|
private readonly property: string
|
|
17
17
|
|
|
18
|
-
public constructor
|
|
18
|
+
public constructor(property: unknown) {
|
|
19
19
|
this.property = property as string
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
public static validate
|
|
22
|
+
public static validate(value: unknown): asserts value is string {
|
|
23
23
|
assert.ok(typeof value === 'string', '`io:status` must be a string')
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
public precall
|
|
26
|
+
public precall(): void {
|
|
27
27
|
// nothing to do until the operation has answered
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
public settle
|
|
30
|
+
public settle(_: unknown, response: http.OutgoingMessage): void {
|
|
31
31
|
const body: unknown = response.body
|
|
32
32
|
|
|
33
|
-
if (body === null || typeof body !== 'object' || !(this.property in body))
|
|
34
|
-
return
|
|
33
|
+
if (body === null || typeof body !== 'object' || !(this.property in body)) return
|
|
35
34
|
|
|
36
35
|
const value: unknown = (body as Record<string, unknown>)[this.property]
|
|
37
36
|
|
|
38
|
-
assert.ok(
|
|
39
|
-
|
|
37
|
+
assert.ok(
|
|
38
|
+
typeof value === 'number',
|
|
39
|
+
`\`io:status\` expects '${this.property}' to be a number`
|
|
40
|
+
)
|
|
40
41
|
|
|
41
42
|
response.status = value
|
|
42
43
|
|
|
@@ -8,24 +8,23 @@ import type { Directive } from './Directive.js'
|
|
|
8
8
|
export class Throttle implements Directive {
|
|
9
9
|
private readonly quotas: Quotas
|
|
10
10
|
|
|
11
|
-
public constructor
|
|
11
|
+
public constructor(declaration: Declaration, sync: Sync, route: string) {
|
|
12
12
|
this.quotas = Quotas.create(parse(declaration), route)
|
|
13
13
|
|
|
14
14
|
sync.register(this.quotas)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
public static validate
|
|
18
|
-
schemas.throttle.validate(declaration,
|
|
17
|
+
public static validate(declaration: unknown): asserts declaration is Declaration {
|
|
18
|
+
schemas.throttle.validate(declaration, "Incorrect 'io:throttle' format")
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
public precall
|
|
21
|
+
public precall(context: http.Context, parameters: Parameter[]): void {
|
|
22
22
|
const retry = this.quotas.check(context, parameters)
|
|
23
23
|
|
|
24
|
-
if (retry > 0)
|
|
25
|
-
throw new TooManyRequests(retry)
|
|
24
|
+
if (retry > 0) throw new TooManyRequests(retry)
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
public settle
|
|
27
|
+
public settle(context: http.Context, output: http.OutgoingMessage): void {
|
|
29
28
|
this.quotas.use(context, output)
|
|
30
29
|
}
|
|
31
30
|
}
|
|
@@ -22,23 +22,29 @@ it('should convert key', () => {
|
|
|
22
22
|
})
|
|
23
23
|
|
|
24
24
|
it('should convert condition', () => {
|
|
25
|
-
assert.partialDeepStrictEqual(
|
|
26
|
-
condition:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
assert.partialDeepStrictEqual(
|
|
26
|
+
parse({ key: ['ip', 'path'], condition: { status: '404' }, ...rest }),
|
|
27
|
+
{
|
|
28
|
+
condition: [
|
|
29
|
+
{
|
|
30
|
+
method: 'status',
|
|
31
|
+
options: '404'
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
)
|
|
33
36
|
|
|
34
|
-
assert.partialDeepStrictEqual(
|
|
35
|
-
condition:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
assert.partialDeepStrictEqual(
|
|
38
|
+
parse({ key: 'ip', condition: { status: '404' }, ...rest }),
|
|
39
|
+
{
|
|
40
|
+
condition: [
|
|
41
|
+
{
|
|
42
|
+
method: 'status',
|
|
43
|
+
options: '404'
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
|
47
|
+
)
|
|
42
48
|
})
|
|
43
49
|
|
|
44
50
|
it('should convert a key component that takes an argument', () => {
|
|
@@ -53,11 +59,14 @@ it('should convert a key component that takes an argument', () => {
|
|
|
53
59
|
})
|
|
54
60
|
|
|
55
61
|
it('should convert a mixed key', () => {
|
|
56
|
-
assert.partialDeepStrictEqual(
|
|
57
|
-
key: [
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
assert.partialDeepStrictEqual(
|
|
63
|
+
parse({ key: ['route', { segment: 'id' }, 'identity'], ...rest }),
|
|
64
|
+
{
|
|
65
|
+
key: [
|
|
66
|
+
{ method: 'route' },
|
|
67
|
+
{ method: 'segment', options: 'id' },
|
|
68
|
+
{ method: 'identity' }
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
)
|
|
63
72
|
})
|
|
@@ -21,7 +21,7 @@ type KeyEntry = KeyComponentMethod | { segment: string }
|
|
|
21
21
|
type KeyDeclaration = KeyEntry | KeyEntry[]
|
|
22
22
|
|
|
23
23
|
type ConditionDeclaration =
|
|
24
|
-
Record<KeyConditionMethod, unknown>
|
|
24
|
+
| Record<KeyConditionMethod, unknown>
|
|
25
25
|
| Array<Record<KeyConditionMethod, unknown>>
|
|
26
26
|
|
|
27
27
|
export interface Declaration extends Omit<Configuration, 'key' | 'condition'> {
|
|
@@ -29,7 +29,7 @@ export interface Declaration extends Omit<Configuration, 'key' | 'condition'> {
|
|
|
29
29
|
condition?: ConditionDeclaration
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export function parse
|
|
32
|
+
export function parse(declaration: Declaration): Configuration {
|
|
33
33
|
const { key, condition, requests, interval } = declaration
|
|
34
34
|
|
|
35
35
|
return {
|
|
@@ -40,24 +40,29 @@ export function parse (declaration: Declaration): Configuration {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function mapKey
|
|
43
|
+
function mapKey(declaration: KeyDeclaration): KeyComponent[] {
|
|
44
44
|
const entries = Array.isArray(declaration) ? declaration : [declaration]
|
|
45
45
|
|
|
46
46
|
// a bare `path`, or `segment: id` for the ones that take an argument
|
|
47
47
|
return entries.flatMap((entry): KeyComponent[] =>
|
|
48
48
|
typeof entry === 'string'
|
|
49
49
|
? [{ method: entry }]
|
|
50
|
-
: Object.entries(entry).map(([method, options]) =>
|
|
51
|
-
|
|
50
|
+
: Object.entries(entry).map(([method, options]) => ({
|
|
51
|
+
method: method as KeyComponentMethod,
|
|
52
|
+
options
|
|
53
|
+
}))
|
|
54
|
+
)
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
function mapCondition
|
|
55
|
-
if (declaration === undefined)
|
|
56
|
-
return
|
|
57
|
+
function mapCondition(declaration?: ConditionDeclaration): KeyCondition[] | undefined {
|
|
58
|
+
if (declaration === undefined) return
|
|
57
59
|
|
|
58
60
|
// reduce to a single object, then map entries to rules
|
|
59
61
|
const conditions = Array.isArray(declaration) ? declaration : [declaration]
|
|
60
62
|
const single = conditions.reduce((acc, condition) => ({ ...acc, ...condition }), {})
|
|
61
63
|
|
|
62
|
-
return Object.entries(single).map(([method, options]) => ({
|
|
64
|
+
return Object.entries(single).map(([method, options]) => ({
|
|
65
|
+
method,
|
|
66
|
+
options
|
|
67
|
+
})) as KeyCondition[]
|
|
63
68
|
}
|