@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
|
@@ -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
|
}
|
|
@@ -11,30 +11,35 @@ export class Keys {
|
|
|
11
11
|
private readonly components: Component[]
|
|
12
12
|
private readonly conditions?: Condition[]
|
|
13
13
|
|
|
14
|
-
public constructor
|
|
14
|
+
public constructor(components: Component[], conditions?: Condition[]) {
|
|
15
15
|
this.components = components
|
|
16
16
|
this.conditions = conditions
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
public static create
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
public static create(
|
|
20
|
+
componentRules: KeyComponent[],
|
|
21
|
+
conditionRules?: KeyCondition[],
|
|
22
|
+
route: string = ''
|
|
23
|
+
): Keys {
|
|
24
|
+
const components = componentRules.map(
|
|
25
|
+
(rule) => new Components[rule.method](rule.options, route)
|
|
26
|
+
)
|
|
23
27
|
|
|
24
|
-
const conditions = conditionRules?.map(
|
|
28
|
+
const conditions = conditionRules?.map(
|
|
29
|
+
(rule) => new Conditions[rule.method](rule.options)
|
|
30
|
+
)
|
|
25
31
|
|
|
26
32
|
return new this(components, conditions)
|
|
27
33
|
}
|
|
28
34
|
|
|
29
35
|
/** The key of the request, or nothing when a component cannot key it. */
|
|
30
|
-
public get
|
|
36
|
+
public get(context: Context, parameters: Parameter[] = NONE): string | undefined {
|
|
31
37
|
const hash = createHash('sha256')
|
|
32
38
|
|
|
33
39
|
for (const component of this.components) {
|
|
34
40
|
const part = component.get(context, parameters)
|
|
35
41
|
|
|
36
|
-
if (part === undefined)
|
|
37
|
-
return
|
|
42
|
+
if (part === undefined) return
|
|
38
43
|
|
|
39
44
|
hash.update(part)
|
|
40
45
|
}
|
|
@@ -42,7 +47,7 @@ export class Keys {
|
|
|
42
47
|
return hash.digest('hex')
|
|
43
48
|
}
|
|
44
49
|
|
|
45
|
-
public matches
|
|
50
|
+
public matches(input: Context, output: Output): boolean {
|
|
46
51
|
return this.conditions?.some((condition) => !condition.match(input, output)) !== true
|
|
47
52
|
}
|
|
48
53
|
}
|
|
@@ -77,8 +77,7 @@ describe('retry', () => {
|
|
|
77
77
|
quotas = Quotas.create(createConfiguration({ requests: 10, interval: 1000 }))
|
|
78
78
|
context = createContext()
|
|
79
79
|
|
|
80
|
-
for (let i = 0; i < 10; i++)
|
|
81
|
-
quotas.check(context, [])
|
|
80
|
+
for (let i = 0; i < 10; i++) quotas.check(context, [])
|
|
82
81
|
|
|
83
82
|
// an emission here is a tenth of a second, and `Retry-After` counts in whole ones
|
|
84
83
|
assert.strictEqual(quotas.check(context, []), 1)
|
|
@@ -237,14 +236,16 @@ describe('ip', () => {
|
|
|
237
236
|
|
|
238
237
|
const context = createContext({})
|
|
239
238
|
|
|
240
|
-
for (let i = 0; i < 5; i++)
|
|
241
|
-
assert.strictEqual(quotas.check(context, []), 0)
|
|
239
|
+
for (let i = 0; i < 5; i++) assert.strictEqual(quotas.check(context, []), 0)
|
|
242
240
|
})
|
|
243
241
|
})
|
|
244
242
|
|
|
245
243
|
describe('route', () => {
|
|
246
244
|
it('should key on the route, not on the path it came in on', () => {
|
|
247
|
-
quotas = Quotas.create(
|
|
245
|
+
quotas = Quotas.create(
|
|
246
|
+
createConfiguration({ key: [{ method: 'route' }] }),
|
|
247
|
+
'/users/:id'
|
|
248
|
+
)
|
|
248
249
|
|
|
249
250
|
const one = createContext({ url: new URL('http://localhost/users/1/') })
|
|
250
251
|
const two = createContext({ url: new URL('http://localhost/users/2/') })
|
|
@@ -258,8 +259,14 @@ describe('route', () => {
|
|
|
258
259
|
})
|
|
259
260
|
|
|
260
261
|
it('should have separate quotas per route', () => {
|
|
261
|
-
const users = Quotas.create(
|
|
262
|
-
|
|
262
|
+
const users = Quotas.create(
|
|
263
|
+
createConfiguration({ key: [{ method: 'route' }] }),
|
|
264
|
+
'/users/:id'
|
|
265
|
+
)
|
|
266
|
+
const posts = Quotas.create(
|
|
267
|
+
createConfiguration({ key: [{ method: 'route' }] }),
|
|
268
|
+
'/posts/:id'
|
|
269
|
+
)
|
|
263
270
|
|
|
264
271
|
context = createContext({ url: new URL('http://localhost/users/1/') })
|
|
265
272
|
|
|
@@ -323,7 +330,9 @@ describe('identity', () => {
|
|
|
323
330
|
describe('status', () => {
|
|
324
331
|
beforeEach(() => {
|
|
325
332
|
context = createContext()
|
|
326
|
-
configuration = createConfiguration({
|
|
333
|
+
configuration = createConfiguration({
|
|
334
|
+
condition: [{ method: 'status', options: 404 }]
|
|
335
|
+
})
|
|
327
336
|
quotas = Quotas.create(configuration)
|
|
328
337
|
})
|
|
329
338
|
|
|
@@ -356,7 +365,9 @@ describe('status', () => {
|
|
|
356
365
|
it('should charge the key checking saw, which settling cannot recompute', () => {
|
|
357
366
|
const keys = [{ method: 'segment' as const, options: 'id' }]
|
|
358
367
|
|
|
359
|
-
quotas = Quotas.create(
|
|
368
|
+
quotas = Quotas.create(
|
|
369
|
+
createConfiguration({ key: keys, condition: configuration.condition })
|
|
370
|
+
)
|
|
360
371
|
|
|
361
372
|
const one = createContext()
|
|
362
373
|
const two = createContext()
|
|
@@ -373,23 +384,28 @@ describe('status', () => {
|
|
|
373
384
|
})
|
|
374
385
|
})
|
|
375
386
|
|
|
376
|
-
function flush
|
|
387
|
+
function flush(now: number = Date.now(), ...of: Quotas[]): Batch[] {
|
|
377
388
|
const batch: Batch[] = []
|
|
378
389
|
|
|
379
|
-
for (const one of of.length === 0 ? [quotas] : of)
|
|
380
|
-
one.flush(now, batch)
|
|
390
|
+
for (const one of of.length === 0 ? [quotas] : of) one.flush(now, batch)
|
|
381
391
|
|
|
382
392
|
return batch
|
|
383
393
|
}
|
|
384
394
|
|
|
385
|
-
function createConfiguration
|
|
386
|
-
return Object.assign(
|
|
395
|
+
function createConfiguration(properties?: Partial<Configuration>): Configuration {
|
|
396
|
+
return Object.assign(
|
|
397
|
+
{ key: [{ method: 'path' }], requests: 2, interval: 100 },
|
|
398
|
+
properties
|
|
399
|
+
)
|
|
387
400
|
}
|
|
388
401
|
|
|
389
|
-
function createContext
|
|
390
|
-
return Object.assign(
|
|
402
|
+
function createContext(properties?: any): Context {
|
|
403
|
+
return Object.assign(
|
|
404
|
+
{ url: new URL('http://localhost/') },
|
|
405
|
+
properties
|
|
406
|
+
) as unknown as Context
|
|
391
407
|
}
|
|
392
408
|
|
|
393
|
-
async function timeout
|
|
409
|
+
async function timeout(ms: number): Promise<void> {
|
|
394
410
|
await setTimeout(ms * 1.2)
|
|
395
411
|
}
|