@toa.io/extensions.exposition 1.0.0-alpha.285 → 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 +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/CHANGELOG.md +0 -552
- 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
|
@@ -9,14 +9,13 @@ export class Delegate implements Directive {
|
|
|
9
9
|
private readonly property: string
|
|
10
10
|
private readonly discovery: Promise<Component>
|
|
11
11
|
|
|
12
|
-
public constructor
|
|
12
|
+
public constructor(property: string, discovery: Promise<Component>) {
|
|
13
13
|
this.property = property
|
|
14
14
|
this.discovery = discovery
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
public async authorize
|
|
18
|
-
if (identity === null)
|
|
19
|
-
return false
|
|
17
|
+
public async authorize(identity: Identity | null, context: Context): Promise<boolean> {
|
|
18
|
+
if (identity === null) return false
|
|
20
19
|
|
|
21
20
|
identity.roles ??= await Role.get(identity, this.discovery)
|
|
22
21
|
context.pipelines.body.push((body) => this.embed(body, identity))
|
|
@@ -25,20 +24,19 @@ export class Delegate implements Directive {
|
|
|
25
24
|
}
|
|
26
25
|
|
|
27
26
|
/** It admits whoever there is, and embedding the identity is the request's business. */
|
|
28
|
-
public admits
|
|
27
|
+
public admits(identity: Identity | null): boolean {
|
|
29
28
|
return identity !== null
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
/** The property it embeds is the identity's, so a caller has nothing to put there. */
|
|
33
|
-
public describe
|
|
32
|
+
public describe(introspection: Introspection): Introspection {
|
|
34
33
|
take(introspection, this.property)
|
|
35
34
|
|
|
36
35
|
return introspection
|
|
37
36
|
}
|
|
38
37
|
|
|
39
|
-
private embed
|
|
40
|
-
if (body === undefined)
|
|
41
|
-
body = {}
|
|
38
|
+
private embed(body: unknown, identity: Identity): Record<string, unknown> {
|
|
39
|
+
if (body === undefined) body = {}
|
|
42
40
|
|
|
43
41
|
check(body)
|
|
44
42
|
body[this.property] = structuredClone(identity)
|
|
@@ -47,7 +45,7 @@ export class Delegate implements Directive {
|
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
function check
|
|
48
|
+
function check(body: unknown): asserts body is Record<string, unknown> {
|
|
51
49
|
if (typeof body !== 'object' || body === null)
|
|
52
50
|
throw new BadRequest('Invalid request body')
|
|
53
51
|
}
|
|
@@ -3,9 +3,8 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
|
3
3
|
import type { Directive, Identity, Context } from './types.js'
|
|
4
4
|
|
|
5
5
|
export class Echo implements Directive {
|
|
6
|
-
public authorize
|
|
7
|
-
if (identity === null && 'authorization' in context.request.headers)
|
|
8
|
-
return false
|
|
6
|
+
public authorize(identity: Identity | null, context: Context): boolean {
|
|
7
|
+
if (identity === null && 'authorization' in context.request.headers) return false
|
|
9
8
|
|
|
10
9
|
context.identity ??= create()
|
|
11
10
|
|
|
@@ -13,15 +12,13 @@ export class Echo implements Directive {
|
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
/** What `authorize` answers, without inventing the identity it would go on to invent. */
|
|
16
|
-
public admits
|
|
15
|
+
public admits(identity: Identity | null, context: Context): boolean {
|
|
17
16
|
return !(identity === null && 'authorization' in context.request.headers)
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
public reply
|
|
19
|
+
public reply(context: Context): OutgoingMessage {
|
|
21
20
|
const body = context.identity!
|
|
22
21
|
|
|
23
|
-
return body.scheme === null
|
|
24
|
-
? { status: 201, body }
|
|
25
|
-
: { body }
|
|
22
|
+
return body.scheme === null ? { status: 201, body } : { body }
|
|
26
23
|
}
|
|
27
24
|
}
|
|
@@ -5,33 +5,38 @@ import type { Parameter } from '../../RTD/index.js'
|
|
|
5
5
|
export class Federation implements Directive {
|
|
6
6
|
private readonly matchers: Array<[keyof Claims, Matcher]>
|
|
7
7
|
|
|
8
|
-
public constructor
|
|
9
|
-
this.matchers = (Object.entries(options) as Array<[keyof Claims, string]>)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
public constructor(options: Options) {
|
|
9
|
+
this.matchers = (Object.entries(options) as Array<[keyof Claims, string]>).map(
|
|
10
|
+
([key, value]) => [key, toMatcher(value)]
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
assert.ok(
|
|
14
|
+
this.matchers.length > 0,
|
|
15
|
+
'`auth:claims` requires at least one property defined'
|
|
16
|
+
)
|
|
13
17
|
}
|
|
14
18
|
|
|
15
|
-
public authorize
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
public authorize(
|
|
20
|
+
identity: Identity | null,
|
|
21
|
+
context: Context,
|
|
22
|
+
parameters: Parameter[]
|
|
23
|
+
): boolean {
|
|
24
|
+
if (identity === null || !('claims' in identity)) return false
|
|
18
25
|
|
|
19
26
|
const claims = (identity as FederatedIdentity).claims
|
|
20
27
|
|
|
21
28
|
for (const [key, match] of this.matchers)
|
|
22
|
-
if (!match(claims[key], context, parameters))
|
|
23
|
-
return false
|
|
29
|
+
if (!match(claims[key], context, parameters)) return false
|
|
24
30
|
|
|
25
31
|
return true
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
34
|
|
|
29
|
-
function toMatcher
|
|
35
|
+
function toMatcher(expression: string): Matcher {
|
|
30
36
|
if (expression.startsWith(':')) {
|
|
31
37
|
const key = expression.slice(1) as 'authority'
|
|
32
38
|
|
|
33
|
-
if (key === 'authority')
|
|
34
|
-
return (value, context) => matches(value, context[key])
|
|
39
|
+
if (key === 'authority') return (value, context) => matches(value, context[key])
|
|
35
40
|
|
|
36
41
|
if (key === 'domain')
|
|
37
42
|
return (value, context) => {
|
|
@@ -46,20 +51,20 @@ function toMatcher (expression: string): Matcher {
|
|
|
46
51
|
if (expression.startsWith('/:')) {
|
|
47
52
|
const name = expression.slice(2)
|
|
48
53
|
|
|
49
|
-
return (value, _, parameters) =>
|
|
50
|
-
.some(
|
|
54
|
+
return (value, _, parameters) =>
|
|
55
|
+
parameters.some(
|
|
56
|
+
(parameter) => parameter.name === name && matches(value, parameter.value)
|
|
57
|
+
)
|
|
51
58
|
}
|
|
52
59
|
|
|
53
60
|
return (value) => matches(value, expression)
|
|
54
61
|
}
|
|
55
62
|
|
|
56
|
-
function matches
|
|
57
|
-
return Array.isArray(value)
|
|
58
|
-
? value.includes(reference)
|
|
59
|
-
: value === reference
|
|
63
|
+
function matches(value: string | string[], reference: string): boolean {
|
|
64
|
+
return Array.isArray(value) ? value.includes(reference) : value === reference
|
|
60
65
|
}
|
|
61
66
|
|
|
62
|
-
function codomain
|
|
67
|
+
function codomain(iss: string, context: Context): boolean {
|
|
63
68
|
const hostname = new URL(iss).hostname
|
|
64
69
|
const dot = hostname.indexOf('.')
|
|
65
70
|
const basename = dot === -1 ? hostname : hostname.slice(dot)
|
|
@@ -67,7 +72,11 @@ function codomain (iss: string, context: Context): boolean {
|
|
|
67
72
|
return context.authority.slice(-basename.length) === basename
|
|
68
73
|
}
|
|
69
74
|
|
|
70
|
-
type Matcher = (
|
|
75
|
+
type Matcher = (
|
|
76
|
+
value: string | string[],
|
|
77
|
+
context: Context,
|
|
78
|
+
parameters: Parameter[]
|
|
79
|
+
) => boolean
|
|
71
80
|
|
|
72
81
|
interface Claims {
|
|
73
82
|
iss: string
|
|
@@ -4,13 +4,16 @@ import { type Directive, type Identity } from './types.js'
|
|
|
4
4
|
export class Id implements Directive {
|
|
5
5
|
private readonly parameter: string
|
|
6
6
|
|
|
7
|
-
public constructor
|
|
7
|
+
public constructor(parameter: string) {
|
|
8
8
|
this.parameter = parameter
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
public authorize
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
public authorize(
|
|
12
|
+
identity: Identity | null,
|
|
13
|
+
_: unknown,
|
|
14
|
+
parameters: Parameter[]
|
|
15
|
+
): boolean {
|
|
16
|
+
if (identity === null) return false
|
|
14
17
|
|
|
15
18
|
const parameter = parameters.find((parameter) => parameter.name === this.parameter)
|
|
16
19
|
|
|
@@ -6,7 +6,7 @@ import { create } from './create.js'
|
|
|
6
6
|
import { INCEPTION, UNKNOWN, providers as providersOf } from './schemes.js'
|
|
7
7
|
import { Role } from './Role.js'
|
|
8
8
|
import type { Component } from '@toa.io/core'
|
|
9
|
-
import type { Maybe } from '@toa.io/core'
|
|
9
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
10
10
|
import type { Directive, Discovery, Identity, Context, Components, Ban } from './types.js'
|
|
11
11
|
|
|
12
12
|
export class Incept implements Directive {
|
|
@@ -16,15 +16,17 @@ export class Incept implements Directive {
|
|
|
16
16
|
|
|
17
17
|
private readonly property: string | null
|
|
18
18
|
|
|
19
|
-
public constructor
|
|
20
|
-
assert.ok(
|
|
21
|
-
|
|
19
|
+
public constructor(property: string, discovery: Discovery) {
|
|
20
|
+
assert.ok(
|
|
21
|
+
property === null || typeof property === 'string',
|
|
22
|
+
'`auth:incept` value must be a string or null'
|
|
23
|
+
)
|
|
22
24
|
|
|
23
25
|
this.property = property
|
|
24
26
|
Incept.discovery ??= discovery
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
public static async incept
|
|
29
|
+
public static async incept(context: Context, id: string): Promise<Identity> {
|
|
28
30
|
const [scheme, credentials] = split(context.request.headers.authorization!)
|
|
29
31
|
const candidates = providersOf(scheme)
|
|
30
32
|
|
|
@@ -36,29 +38,29 @@ export class Incept implements Directive {
|
|
|
36
38
|
// from a credential it would itself have to exist to hold
|
|
37
39
|
const provider = candidates.find((candidate) => INCEPTION.includes(candidate))
|
|
38
40
|
|
|
39
|
-
if (provider === undefined)
|
|
40
|
-
throw new http.Unauthorized()
|
|
41
|
+
if (provider === undefined) throw new http.Unauthorized()
|
|
41
42
|
|
|
42
43
|
Incept.bans ??= await Incept.discovery.bans
|
|
43
44
|
|
|
44
45
|
const ban = await Incept.bans.invoke<Ban>('observe', { query: { id } })
|
|
45
46
|
|
|
46
|
-
if (ban.banned)
|
|
47
|
-
throw new http.Unauthorized()
|
|
47
|
+
if (ban.banned) throw new http.Unauthorized()
|
|
48
48
|
|
|
49
49
|
Incept.components[provider] ??= await Incept.discovery[provider]
|
|
50
50
|
|
|
51
|
-
const identity = await Incept.components[provider]!.invoke<Maybe<Identity>>(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
const identity = await Incept.components[provider]!.invoke<Maybe<Identity>>(
|
|
52
|
+
'incept',
|
|
53
|
+
{
|
|
54
|
+
input: {
|
|
55
|
+
scheme,
|
|
56
|
+
authority: context.authority,
|
|
57
|
+
id,
|
|
58
|
+
credentials
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
|
-
|
|
61
|
+
)
|
|
59
62
|
|
|
60
|
-
if (identity instanceof Error)
|
|
61
|
-
throw new http.UnprocessableEntity(identity)
|
|
63
|
+
if (identity instanceof Error) throw new http.UnprocessableEntity(identity)
|
|
62
64
|
|
|
63
65
|
identity.scheme = scheme
|
|
64
66
|
|
|
@@ -68,24 +70,25 @@ export class Incept implements Directive {
|
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
/** Credentials that were rejected for any reason but being unknown are not incepted. */
|
|
71
|
-
public static acceptable
|
|
72
|
-
return
|
|
73
|
+
public static acceptable(context: Context): boolean {
|
|
74
|
+
return (
|
|
75
|
+
context.request.headers.authorization === undefined || context.rejection === UNKNOWN
|
|
76
|
+
)
|
|
73
77
|
}
|
|
74
78
|
|
|
75
|
-
public authorize
|
|
79
|
+
public authorize(identity: Identity | null, context: Context): boolean {
|
|
76
80
|
return identity === null && Incept.acceptable(context)
|
|
77
81
|
}
|
|
78
82
|
|
|
79
|
-
public reply
|
|
80
|
-
if (this.property !== null)
|
|
81
|
-
return null
|
|
83
|
+
public reply(context: Context): http.OutgoingMessage | null {
|
|
84
|
+
if (this.property !== null) return null
|
|
82
85
|
|
|
83
86
|
const body = create(context.request.headers.authorization)
|
|
84
87
|
|
|
85
88
|
return { body }
|
|
86
89
|
}
|
|
87
90
|
|
|
88
|
-
public async settle
|
|
91
|
+
public async settle(context: Context, response: http.OutgoingMessage): Promise<void> {
|
|
89
92
|
const id = response.body?.[this.property ?? 'id']
|
|
90
93
|
|
|
91
94
|
if (id === undefined) {
|
|
@@ -97,7 +100,10 @@ export class Incept implements Directive {
|
|
|
97
100
|
return
|
|
98
101
|
}
|
|
99
102
|
|
|
100
|
-
assert(
|
|
103
|
+
assert(
|
|
104
|
+
typeof id === 'string',
|
|
105
|
+
`Response body property "${this.property}" expected to be a string`
|
|
106
|
+
)
|
|
101
107
|
|
|
102
108
|
if (context.request.headers.authorization !== undefined)
|
|
103
109
|
context.identity = await Incept.incept(context, id)
|
|
@@ -6,27 +6,40 @@ export class Input implements Directive {
|
|
|
6
6
|
public priority = 0
|
|
7
7
|
private readonly statements: Statement[] = []
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
10
|
-
this.statements = declarations.map(
|
|
9
|
+
public constructor(declarations: Declaration[], create: Create) {
|
|
10
|
+
this.statements = declarations.map(
|
|
11
|
+
(declaration) => new Statement(declaration, create)
|
|
12
|
+
)
|
|
11
13
|
}
|
|
12
14
|
|
|
13
|
-
public async authorize
|
|
14
|
-
|
|
15
|
+
public async authorize(
|
|
16
|
+
identity: Identity | null,
|
|
17
|
+
context: Context,
|
|
18
|
+
parameters: Parameter[]
|
|
19
|
+
): Promise<boolean> {
|
|
20
|
+
context.pipelines.body.push(async (body) =>
|
|
21
|
+
this.check(identity, context, parameters, body)
|
|
22
|
+
)
|
|
15
23
|
|
|
16
24
|
return false
|
|
17
25
|
}
|
|
18
26
|
|
|
19
27
|
// eslint-disable-next-line max-params
|
|
20
|
-
private async check
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
private async check(
|
|
29
|
+
identity: Identity | null,
|
|
30
|
+
context: Context,
|
|
31
|
+
parameters: Parameter[],
|
|
32
|
+
body: unknown
|
|
33
|
+
): Promise<unknown> {
|
|
34
|
+
if (body === undefined || body === null || body.constructor !== Object) return body
|
|
35
|
+
|
|
36
|
+
const settled = await Promise.allSettled(
|
|
37
|
+
this.statements.map(async (statement) =>
|
|
38
|
+
statement.check(identity, context, parameters, body as Body)
|
|
39
|
+
)
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
for (const result of settled) if (result.status === 'rejected') throw result.reason
|
|
30
43
|
|
|
31
44
|
return body
|
|
32
45
|
}
|
|
@@ -36,7 +49,7 @@ class Statement {
|
|
|
36
49
|
private readonly properties: string[]
|
|
37
50
|
private readonly directives: Directive[] = []
|
|
38
51
|
|
|
39
|
-
public constructor
|
|
52
|
+
public constructor({ prop, ...directives }: Declaration, create: Create) {
|
|
40
53
|
this.properties = typeof prop === 'string' ? [prop] : prop
|
|
41
54
|
|
|
42
55
|
for (const [name, value] of Object.entries(directives)) {
|
|
@@ -47,17 +60,20 @@ class Statement {
|
|
|
47
60
|
}
|
|
48
61
|
|
|
49
62
|
// eslint-disable-next-line max-params
|
|
50
|
-
public async check
|
|
63
|
+
public async check(
|
|
64
|
+
identity: Identity | null,
|
|
65
|
+
context: Context,
|
|
66
|
+
parameters: Parameter[],
|
|
67
|
+
body: Body
|
|
68
|
+
): Promise<void> {
|
|
51
69
|
const match = this.properties.some((property) => property in body)
|
|
52
70
|
|
|
53
|
-
if (!match)
|
|
54
|
-
return
|
|
71
|
+
if (!match) return
|
|
55
72
|
|
|
56
73
|
for (const directive of this.directives) {
|
|
57
74
|
const authorized = await directive.authorize(identity, context, parameters)
|
|
58
75
|
|
|
59
|
-
if (!authorized)
|
|
60
|
-
throw new Forbidden('Input property is not authorized')
|
|
76
|
+
if (!authorized) throw new Forbidden('Input property is not authorized')
|
|
61
77
|
}
|
|
62
78
|
}
|
|
63
79
|
}
|
|
@@ -34,12 +34,19 @@ it('should return false if not matched', async () => {
|
|
|
34
34
|
|
|
35
35
|
assert.strictEqual(result, false)
|
|
36
36
|
|
|
37
|
-
assert.ok(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
assert.ok(
|
|
38
|
+
remote.invoke.mock.calls.some(
|
|
39
|
+
(call: any) =>
|
|
40
|
+
call.arguments.length === 2 &&
|
|
41
|
+
isDeepStrictEqual(call.arguments[0], 'list') &&
|
|
42
|
+
isDeepStrictEqual(call.arguments[1], {
|
|
43
|
+
query: {
|
|
44
|
+
criteria: `identity=="${identity.id}"`,
|
|
45
|
+
limit: 1024
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
)
|
|
49
|
+
)
|
|
43
50
|
})
|
|
44
51
|
|
|
45
52
|
it('should return true on exact match', async () => {
|
|
@@ -67,36 +74,55 @@ it('should return false on non-scope substring match', async () => {
|
|
|
67
74
|
})
|
|
68
75
|
|
|
69
76
|
it('should return true on match with parameters', async () => {
|
|
70
|
-
const result = await match(
|
|
71
|
-
['app:
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
const result = await match(
|
|
78
|
+
['app:{org}:reviews'],
|
|
79
|
+
['app:29e54ae1:reviews'],
|
|
80
|
+
[
|
|
81
|
+
{
|
|
82
|
+
name: 'org',
|
|
83
|
+
value: '29e54ae1'
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
)
|
|
75
87
|
|
|
76
88
|
assert.strictEqual(result, true)
|
|
77
89
|
})
|
|
78
90
|
|
|
79
91
|
it('should return true on match with parameters', async () => {
|
|
80
|
-
const result = await match(
|
|
81
|
-
['app:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
92
|
+
const result = await match(
|
|
93
|
+
['app:{org}:reviews'],
|
|
94
|
+
['app:29e54ae1:reviews'],
|
|
95
|
+
[
|
|
96
|
+
{
|
|
97
|
+
name: 'org',
|
|
98
|
+
value: '29e54ae1'
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
)
|
|
85
102
|
|
|
86
103
|
assert.strictEqual(result, true)
|
|
87
104
|
})
|
|
88
105
|
|
|
89
106
|
it('should return false on mismatch with parameters', async () => {
|
|
90
|
-
const result = await match(
|
|
91
|
-
['app:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
const result = await match(
|
|
108
|
+
['app:{org}:reviews'],
|
|
109
|
+
['app:29e54ae1:reviews'],
|
|
110
|
+
[
|
|
111
|
+
{
|
|
112
|
+
name: 'org',
|
|
113
|
+
value: '88584c9b'
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
)
|
|
95
117
|
|
|
96
118
|
assert.strictEqual(result, false)
|
|
97
119
|
})
|
|
98
120
|
|
|
99
|
-
async function match
|
|
121
|
+
async function match(
|
|
122
|
+
expected: string[],
|
|
123
|
+
actual: string[],
|
|
124
|
+
parameters: Parameter[] = []
|
|
125
|
+
): Promise<boolean> {
|
|
100
126
|
const directive = new Role(expected, discovery)
|
|
101
127
|
|
|
102
128
|
const identity: Identity = {
|
|
@@ -110,7 +136,7 @@ async function match (expected: string[], actual: string[], parameters: Paramete
|
|
|
110
136
|
return await directive.authorize(identity, undefined, parameters)
|
|
111
137
|
}
|
|
112
138
|
|
|
113
|
-
function resetCalls
|
|
139
|
+
function resetCalls(target = [remote, discovery], seen = new Set()) {
|
|
114
140
|
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
115
141
|
|
|
116
142
|
seen.add(target)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
2
|
import { quote } from '@toa.io/generic'
|
|
3
|
-
import { type Component
|
|
3
|
+
import { type Component } from '@toa.io/core'
|
|
4
|
+
import type { Query } from '@toa.io/core/types'
|
|
4
5
|
import { type Directive, type Identity } from './types.js'
|
|
5
6
|
import type { Parameter } from '../../RTD/index.js'
|
|
6
7
|
|
|
@@ -10,13 +11,16 @@ export class Role implements Directive {
|
|
|
10
11
|
private readonly discovery: Promise<Component>
|
|
11
12
|
private readonly dynamic: boolean
|
|
12
13
|
|
|
13
|
-
public constructor
|
|
14
|
+
public constructor(roles: string | string[], discovery: Promise<Component>) {
|
|
14
15
|
this.roles = typeof roles === 'string' ? [roles] : roles
|
|
15
16
|
this.discovery = discovery
|
|
16
17
|
this.dynamic = this.roles.some((role) => role.includes('{'))
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
public static async get
|
|
20
|
+
public static async get(
|
|
21
|
+
identity: Identity,
|
|
22
|
+
discovery: Promise<Component>
|
|
23
|
+
): Promise<string[]> {
|
|
20
24
|
this.remote ??= await discovery
|
|
21
25
|
|
|
22
26
|
const query: Query = {
|
|
@@ -27,9 +31,12 @@ export class Role implements Directive {
|
|
|
27
31
|
return await this.remote.invoke('list', { query })
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
public async authorize
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
public async authorize(
|
|
35
|
+
identity: Identity | null,
|
|
36
|
+
_: unknown,
|
|
37
|
+
parameters: Parameter[]
|
|
38
|
+
): Promise<boolean> {
|
|
39
|
+
if (identity === null) return false
|
|
33
40
|
|
|
34
41
|
identity.roles ??= await Role.get(identity, this.discovery)
|
|
35
42
|
|
|
@@ -37,39 +44,39 @@ export class Role implements Directive {
|
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
/** A role naming a route variable cannot be told from a description, which has no values. */
|
|
40
|
-
public async admits
|
|
41
|
-
if (this.dynamic)
|
|
42
|
-
return undefined
|
|
47
|
+
public async admits(identity: Identity | null): Promise<boolean | undefined> {
|
|
48
|
+
if (this.dynamic) return undefined
|
|
43
49
|
|
|
44
|
-
if (identity === null)
|
|
45
|
-
return false
|
|
50
|
+
if (identity === null) return false
|
|
46
51
|
|
|
47
52
|
identity.roles ??= await Role.get(identity, this.discovery)
|
|
48
53
|
|
|
49
54
|
return this.match(identity.roles, [])
|
|
50
55
|
}
|
|
51
56
|
|
|
52
|
-
private match
|
|
57
|
+
private match(roles: string[], parameters: Parameter[]): boolean {
|
|
53
58
|
const required = this.dynamic ? this.substitute(parameters) : this.roles
|
|
54
59
|
|
|
55
60
|
for (const role of roles) {
|
|
56
|
-
const ok = required.some(
|
|
61
|
+
const ok = required.some(
|
|
62
|
+
(expected) => expected === role || expected.startsWith(role + ':')
|
|
63
|
+
)
|
|
57
64
|
|
|
58
|
-
if (ok)
|
|
59
|
-
return true
|
|
65
|
+
if (ok) return true
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
return false
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
private substitute
|
|
66
|
-
return this.roles.map((role) =>
|
|
67
|
-
|
|
71
|
+
private substitute(parameters: Parameter[]): string[] {
|
|
72
|
+
return this.roles.map((role) =>
|
|
73
|
+
role.replaceAll(/{(\w+)}/g, (_, key) => {
|
|
74
|
+
const value = parameters.find((parameter) => parameter.name === key)?.value
|
|
68
75
|
|
|
69
|
-
|
|
70
|
-
`Role '${role}' requires '${key}' route parameter`)
|
|
76
|
+
assert.ok(value !== undefined, `Role '${role}' requires '${key}' route parameter`)
|
|
71
77
|
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
return value
|
|
79
|
+
})
|
|
80
|
+
)
|
|
74
81
|
}
|
|
75
82
|
}
|
|
@@ -5,7 +5,7 @@ import type { Context, Directive, Identity, Create } from './types.js'
|
|
|
5
5
|
export class Rule implements Directive {
|
|
6
6
|
private readonly directives: Directive[] = []
|
|
7
7
|
|
|
8
|
-
public constructor
|
|
8
|
+
public constructor(directives: Record<string, any>, create: Create) {
|
|
9
9
|
for (const [name, value] of Object.entries(directives)) {
|
|
10
10
|
const directive = create(name, value)
|
|
11
11
|
|
|
@@ -13,19 +13,22 @@ export class Rule implements Directive {
|
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
public async authorize
|
|
16
|
+
public async authorize(
|
|
17
|
+
identity: Identity | null,
|
|
18
|
+
context: Context,
|
|
19
|
+
parameters: Parameter[]
|
|
20
|
+
): Promise<boolean> {
|
|
17
21
|
for (const directive of this.directives) {
|
|
18
22
|
const authorized = await directive.authorize(identity, context, parameters)
|
|
19
23
|
|
|
20
|
-
if (!authorized)
|
|
21
|
-
return false
|
|
24
|
+
if (!authorized) return false
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
return true
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
/** Whatever each of them makes of it, in the order they were declared. */
|
|
28
|
-
public describe
|
|
31
|
+
public describe(introspection: Introspection): Introspection {
|
|
29
32
|
for (const directive of this.directives)
|
|
30
33
|
introspection = directive.describe?.(introspection) ?? introspection
|
|
31
34
|
|
|
@@ -33,7 +36,10 @@ export class Rule implements Directive {
|
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
/** All of them, so one that refuses ends it and one that cannot tell leaves it untold. */
|
|
36
|
-
public async admits
|
|
39
|
+
public async admits(
|
|
40
|
+
identity: Identity | null,
|
|
41
|
+
context: Context
|
|
42
|
+
): Promise<boolean | undefined> {
|
|
37
43
|
let untold = false
|
|
38
44
|
|
|
39
45
|
for (const directive of this.directives) {
|
|
@@ -45,8 +51,7 @@ export class Rule implements Directive {
|
|
|
45
51
|
continue
|
|
46
52
|
}
|
|
47
53
|
|
|
48
|
-
if (!admits)
|
|
49
|
-
return false
|
|
54
|
+
if (!admits) return false
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
return untold ? undefined : true
|