@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
|
@@ -15,11 +15,13 @@ const FORBIDDEN = new Set(['host', 'origin'])
|
|
|
15
15
|
export class Headers extends Mapping<Record<string, string>> {
|
|
16
16
|
private readonly headers: string[]
|
|
17
17
|
|
|
18
|
-
public constructor
|
|
18
|
+
public constructor(map: Record<string, string>) {
|
|
19
19
|
assert.ok(map.constructor === Object, '`map:headers` must be an object')
|
|
20
20
|
|
|
21
|
-
assert.ok(
|
|
22
|
-
|
|
21
|
+
assert.ok(
|
|
22
|
+
Object.values(map).every((value) => typeof value === 'string'),
|
|
23
|
+
'`map:headers` must be an object with string values'
|
|
24
|
+
)
|
|
23
25
|
|
|
24
26
|
super(map)
|
|
25
27
|
|
|
@@ -27,7 +29,7 @@ export class Headers extends Mapping<Record<string, string>> {
|
|
|
27
29
|
this.headers.forEach((header) => cors.allow(header))
|
|
28
30
|
}
|
|
29
31
|
|
|
30
|
-
public override explain
|
|
32
|
+
public override explain(introspection: Introspection): void {
|
|
31
33
|
for (const [property, header] of Object.entries(this.value)) {
|
|
32
34
|
const schema = take(introspection, property)
|
|
33
35
|
|
|
@@ -36,21 +38,23 @@ export class Headers extends Mapping<Record<string, string>> {
|
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
40
|
|
|
39
|
-
public properties
|
|
41
|
+
public properties(context: Input): Record<string, string> {
|
|
40
42
|
context.pipelines.response.push((response) => {
|
|
41
43
|
response.headers ??= new global.Headers()
|
|
42
44
|
|
|
43
|
-
for (const header of this.headers)
|
|
44
|
-
response.headers.append('vary', header)
|
|
45
|
+
for (const header of this.headers) response.headers.append('vary', header)
|
|
45
46
|
})
|
|
46
47
|
|
|
47
|
-
return Object.entries(this.value).reduce(
|
|
48
|
-
|
|
48
|
+
return Object.entries(this.value).reduce(
|
|
49
|
+
(properties: Record<string, string>, [property, header]) => {
|
|
50
|
+
const value = context.request.headers[header]
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
if (value !== undefined)
|
|
53
|
+
properties[property] = Array.isArray(value) ? value.join(', ') : value
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
return properties
|
|
56
|
+
},
|
|
57
|
+
{}
|
|
58
|
+
)
|
|
55
59
|
}
|
|
56
60
|
}
|
|
@@ -10,14 +10,18 @@ import type { Directive } from './Directive.js'
|
|
|
10
10
|
export class Language extends Mapping<string> {
|
|
11
11
|
private languages: string[] | null = null
|
|
12
12
|
|
|
13
|
-
public constructor
|
|
13
|
+
public constructor(property: string) {
|
|
14
14
|
assert.ok(typeof property === 'string', '`map:language` must be a string')
|
|
15
15
|
|
|
16
16
|
cors.allow('accept-language')
|
|
17
17
|
super(property)
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public properties
|
|
20
|
+
public properties(
|
|
21
|
+
context: Input,
|
|
22
|
+
parameters: Parameter[],
|
|
23
|
+
directives: Directive[]
|
|
24
|
+
): Record<string, string> {
|
|
21
25
|
this.languages ??= this.resolve(directives)
|
|
22
26
|
|
|
23
27
|
const negotiator = new Negotiator(context.request)
|
|
@@ -32,10 +36,9 @@ export class Language extends Mapping<string> {
|
|
|
32
36
|
return { [this.value]: language }
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
private resolve
|
|
39
|
+
private resolve(directives: Directive[]): string[] {
|
|
36
40
|
for (const directive of directives)
|
|
37
|
-
if (directive instanceof Languages)
|
|
38
|
-
return directive.value
|
|
41
|
+
if (directive instanceof Languages) return directive.value
|
|
39
42
|
|
|
40
43
|
throw new Error('Supported languages are not defined, add `map:languages` directive')
|
|
41
44
|
}
|
|
@@ -2,9 +2,15 @@ import assert from 'node:assert'
|
|
|
2
2
|
import { Property } from './Properties.js'
|
|
3
3
|
|
|
4
4
|
export class Languages extends Property<'languages'> {
|
|
5
|
-
public constructor
|
|
6
|
-
assert.ok(
|
|
7
|
-
|
|
5
|
+
public constructor(value: string[]) {
|
|
6
|
+
assert.ok(
|
|
7
|
+
Array.isArray(value) && value.length > 0,
|
|
8
|
+
'`map:languages` must be a non-empty array of strings'
|
|
9
|
+
)
|
|
10
|
+
assert.ok(
|
|
11
|
+
value.every((language) => typeof language === 'string'),
|
|
12
|
+
'`map:languages` must be an array of strings'
|
|
13
|
+
)
|
|
8
14
|
|
|
9
15
|
super('languages', value)
|
|
10
16
|
}
|
|
@@ -21,37 +21,50 @@ export class Map implements DirectiveFamily {
|
|
|
21
21
|
|
|
22
22
|
private remotes!: Remotes
|
|
23
23
|
|
|
24
|
-
public create
|
|
24
|
+
public create(name: string, value: unknown, remotes: Remotes): Property | Mapping {
|
|
25
25
|
this.remotes = remotes
|
|
26
26
|
|
|
27
|
-
return match(
|
|
28
|
-
|
|
29
|
-
() =>
|
|
27
|
+
return match(
|
|
28
|
+
name,
|
|
29
|
+
() => properties.has(name),
|
|
30
|
+
(name: PN) => new Property(name, value as PV),
|
|
31
|
+
() => name in mappings,
|
|
32
|
+
(name: keyof typeof mappings) => new mappings[name](value, remotes),
|
|
30
33
|
() => {
|
|
31
34
|
throw new Error(`Directive 'map:${name}' is not implemented`)
|
|
32
|
-
}
|
|
35
|
+
}
|
|
36
|
+
)
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
public explain
|
|
39
|
+
public explain(
|
|
40
|
+
directives: Directive[],
|
|
41
|
+
_: Input,
|
|
42
|
+
introspection: Introspection
|
|
43
|
+
): Introspection {
|
|
36
44
|
for (const directive of directives)
|
|
37
|
-
if (directive instanceof Mapping)
|
|
38
|
-
directive.explain(introspection)
|
|
45
|
+
if (directive instanceof Mapping) directive.explain(introspection)
|
|
39
46
|
|
|
40
47
|
return introspection
|
|
41
48
|
}
|
|
42
49
|
|
|
43
|
-
public async precall
|
|
50
|
+
public async precall(
|
|
51
|
+
directives: Directive[],
|
|
52
|
+
context: Input,
|
|
53
|
+
parameters: Parameter[]
|
|
54
|
+
): Promise<Output> {
|
|
44
55
|
const properties = {}
|
|
45
56
|
|
|
46
57
|
for (const directive of directives)
|
|
47
58
|
if (directive instanceof Mapping)
|
|
48
|
-
Object.assign(
|
|
59
|
+
Object.assign(
|
|
60
|
+
properties,
|
|
61
|
+
await directive.properties(context, parameters, directives)
|
|
62
|
+
)
|
|
49
63
|
|
|
50
64
|
context.pipelines.body.push((body: unknown) => {
|
|
51
65
|
if (body === undefined || body === null || typeof body !== 'object')
|
|
52
66
|
return properties
|
|
53
|
-
else
|
|
54
|
-
return Object.assign(body, properties)
|
|
67
|
+
else return Object.assign(body, properties)
|
|
55
68
|
})
|
|
56
69
|
|
|
57
70
|
return null
|
|
@@ -9,12 +9,16 @@ export abstract class Mapping<T = unknown> {
|
|
|
9
9
|
protected value: T
|
|
10
10
|
protected remotes?: Remotes
|
|
11
11
|
|
|
12
|
-
protected constructor
|
|
12
|
+
protected constructor(value: T, remotes?: Remotes) {
|
|
13
13
|
this.value = value
|
|
14
14
|
this.remotes = remotes
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
public abstract properties
|
|
17
|
+
public abstract properties(
|
|
18
|
+
context: Input,
|
|
19
|
+
parameters: Parameter[],
|
|
20
|
+
directives: Directive[]
|
|
21
|
+
): Output
|
|
18
22
|
|
|
19
23
|
/**
|
|
20
24
|
* What this mapping does to what the method says about itself, which is the reverse of
|
|
@@ -25,13 +29,12 @@ export abstract class Mapping<T = unknown> {
|
|
|
25
29
|
* from the request itself and there is nowhere for a caller to put one; a header and a
|
|
26
30
|
* segment are the caller's, and those say where.
|
|
27
31
|
*/
|
|
28
|
-
public explain
|
|
29
|
-
for (const property of this.names())
|
|
30
|
-
take(introspection, property)
|
|
32
|
+
public explain(introspection: Introspection): void {
|
|
33
|
+
for (const property of this.names()) take(introspection, property)
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
/** The input properties this mapping fills, however its value names them. */
|
|
34
|
-
protected names
|
|
37
|
+
protected names(): string[] {
|
|
35
38
|
return typeof this.value === 'string'
|
|
36
39
|
? [this.value]
|
|
37
40
|
: Object.keys(this.value as object)
|
|
@@ -6,7 +6,7 @@ export class Property<K extends keyof Properties = keyof Properties> {
|
|
|
6
6
|
public readonly name: K
|
|
7
7
|
public readonly value: Properties[K]
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(name: K, value: Properties[K]) {
|
|
10
10
|
this.name = name
|
|
11
11
|
this.value = value
|
|
12
12
|
}
|
|
@@ -5,17 +5,19 @@ import type { Parameter } from '../../RTD/index.js'
|
|
|
5
5
|
import type { Introspection, Schema } from '../../Introspection.js'
|
|
6
6
|
|
|
7
7
|
export class Segments extends Mapping<Record<string, string>> {
|
|
8
|
-
public constructor
|
|
8
|
+
public constructor(map: Record<string, string>) {
|
|
9
9
|
assert.ok(map.constructor === Object, '`map:segments` must be an object')
|
|
10
10
|
|
|
11
|
-
assert.ok(
|
|
12
|
-
|
|
11
|
+
assert.ok(
|
|
12
|
+
Object.values(map).every((value) => typeof value === 'string'),
|
|
13
|
+
'`map:segments ` must be an object with string values'
|
|
14
|
+
)
|
|
13
15
|
|
|
14
16
|
super(map)
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
/** A segment is the caller's, so it moves to the route rather than out of sight. */
|
|
18
|
-
public override explain
|
|
20
|
+
public override explain(introspection: Introspection): void {
|
|
19
21
|
for (const property of Object.keys(this.value)) {
|
|
20
22
|
const schema = take(introspection, property)
|
|
21
23
|
|
|
@@ -24,22 +26,27 @@ export class Segments extends Mapping<Record<string, string>> {
|
|
|
24
26
|
}
|
|
25
27
|
}
|
|
26
28
|
|
|
27
|
-
public override properties
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
public override properties(
|
|
30
|
+
_: unknown,
|
|
31
|
+
parameters: Parameter[]
|
|
32
|
+
): Record<string, string> {
|
|
33
|
+
return Object.entries(this.value).reduce(
|
|
34
|
+
(properties: Record<string, string>, [property, parameter]) => {
|
|
35
|
+
const cut = parameter[0] === '~'
|
|
30
36
|
|
|
31
|
-
|
|
37
|
+
if (cut) parameter = parameter.slice(1)
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
const index = parameters.findIndex(({ name }) => name === parameter)
|
|
34
40
|
|
|
35
|
-
|
|
41
|
+
assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
properties[property] = parameters[index].value
|
|
38
44
|
|
|
39
|
-
|
|
40
|
-
parameters.splice(index, 1)
|
|
45
|
+
if (cut) parameters.splice(index, 1)
|
|
41
46
|
|
|
42
|
-
|
|
43
|
-
|
|
47
|
+
return properties
|
|
48
|
+
},
|
|
49
|
+
{}
|
|
50
|
+
)
|
|
44
51
|
}
|
|
45
52
|
}
|
|
@@ -12,29 +12,31 @@ export class MCP implements DirectiveFamily<Tool> {
|
|
|
12
12
|
public readonly mandatory = false
|
|
13
13
|
|
|
14
14
|
/** What this method is published as, which is what the nearest declaration says. */
|
|
15
|
-
public static published
|
|
15
|
+
public static published(directives: Tool[] | undefined): Tool | null {
|
|
16
16
|
return directives?.[0] ?? null
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
// eslint-disable-next-line max-params
|
|
20
|
-
public create
|
|
20
|
+
public create(name: string, value: unknown, _: unknown, route: string): Tool {
|
|
21
21
|
assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
|
|
22
22
|
|
|
23
23
|
return new Tool(value, route)
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** What the route states this method is, which is the only thing that states it. */
|
|
27
|
-
public explain
|
|
28
|
-
|
|
27
|
+
public explain(
|
|
28
|
+
directives: Tool[],
|
|
29
|
+
_: Context,
|
|
30
|
+
introspection: Introspection
|
|
31
|
+
): Introspection {
|
|
29
32
|
const tool = MCP.published(directives)
|
|
30
33
|
|
|
31
|
-
if (tool === null)
|
|
32
|
-
return introspection
|
|
34
|
+
if (tool === null) return introspection
|
|
33
35
|
|
|
34
36
|
return {
|
|
35
37
|
...introspection,
|
|
36
38
|
description: tool.description,
|
|
37
|
-
...tool.title === undefined ? {} : { title: tool.title }
|
|
39
|
+
...(tool.title === undefined ? {} : { title: tool.title })
|
|
38
40
|
}
|
|
39
41
|
}
|
|
40
42
|
}
|
|
@@ -12,7 +12,10 @@ describe('mcp:tool', () => {
|
|
|
12
12
|
})
|
|
13
13
|
|
|
14
14
|
it('should take a title beside the description', () => {
|
|
15
|
-
const tool = new Tool(
|
|
15
|
+
const tool = new Tool(
|
|
16
|
+
{ title: 'Hot pots', description: 'The pots that are hot.' },
|
|
17
|
+
'/pots'
|
|
18
|
+
)
|
|
16
19
|
|
|
17
20
|
assert.strictEqual(tool.title, 'Hot pots')
|
|
18
21
|
assert.strictEqual(tool.description, 'The pots that are hot.')
|
|
@@ -23,13 +26,17 @@ describe('mcp:tool', () => {
|
|
|
23
26
|
})
|
|
24
27
|
|
|
25
28
|
it('should not accept an empty title', () => {
|
|
26
|
-
assert.throws(
|
|
27
|
-
|
|
29
|
+
assert.throws(
|
|
30
|
+
() => new Tool({ title: ' ', description: 'A pot.' }, '/pots'),
|
|
31
|
+
/a title cannot be empty/
|
|
32
|
+
)
|
|
28
33
|
})
|
|
29
34
|
|
|
30
35
|
it('should not accept what it does not know', () => {
|
|
31
|
-
assert.throws(
|
|
32
|
-
|
|
36
|
+
assert.throws(
|
|
37
|
+
() => new Tool({ description: 'A pot.', name: 'pots' }, '/pots'),
|
|
38
|
+
/unknown 'name'/
|
|
39
|
+
)
|
|
33
40
|
})
|
|
34
41
|
|
|
35
42
|
it('should not accept an empty description', () => {
|
|
@@ -73,8 +80,11 @@ describe('mcp:tool inheritance', () => {
|
|
|
73
80
|
})
|
|
74
81
|
|
|
75
82
|
it('should describe a method with what the route states', () => {
|
|
76
|
-
const described = family.explain(
|
|
77
|
-
|
|
83
|
+
const described = family.explain(
|
|
84
|
+
[new Tool('What the route is.', '/pots')],
|
|
85
|
+
null as never,
|
|
86
|
+
{ description: 'What the operation is.' }
|
|
87
|
+
)
|
|
78
88
|
|
|
79
89
|
assert.strictEqual(described.description, 'What the route is.')
|
|
80
90
|
})
|
|
@@ -84,7 +94,9 @@ describe('mcp:tool inheritance', () => {
|
|
|
84
94
|
})
|
|
85
95
|
|
|
86
96
|
it('should refuse a directive it does not know', () => {
|
|
87
|
-
assert.throws(
|
|
88
|
-
|
|
97
|
+
assert.throws(
|
|
98
|
+
() => family.create('resource', 'A pot.', null, '/pots'),
|
|
99
|
+
/Unknown directive: mcp:resource/
|
|
100
|
+
)
|
|
89
101
|
})
|
|
90
102
|
})
|
|
@@ -19,27 +19,39 @@ export class Tool {
|
|
|
19
19
|
public readonly description: string
|
|
20
20
|
public readonly title: string | undefined
|
|
21
21
|
|
|
22
|
-
public constructor
|
|
22
|
+
public constructor(value: unknown, route: string) {
|
|
23
23
|
const stated = typeof value === 'string' ? { description: value } : value
|
|
24
24
|
|
|
25
|
-
assert.ok(
|
|
26
|
-
|
|
25
|
+
assert.ok(
|
|
26
|
+
typeof stated === 'object' && stated !== null && !Array.isArray(stated),
|
|
27
|
+
'Directive mcp:tool: the value is what the tool is, or a `title` and a `description`'
|
|
28
|
+
)
|
|
27
29
|
|
|
28
30
|
const { description, title, ...rest } = stated as Record<string, unknown>
|
|
29
31
|
|
|
30
|
-
assert.ok(
|
|
31
|
-
|
|
32
|
+
assert.ok(
|
|
33
|
+
Object.keys(rest).length === 0,
|
|
34
|
+
`Directive mcp:tool: unknown ${Object.keys(rest)
|
|
35
|
+
.map((key) => `'${key}'`)
|
|
36
|
+
.join(', ')}`
|
|
37
|
+
)
|
|
32
38
|
|
|
33
|
-
assert.ok(
|
|
34
|
-
'
|
|
39
|
+
assert.ok(
|
|
40
|
+
typeof description === 'string' && description.trim().length > 0,
|
|
41
|
+
'Directive mcp:tool: a description cannot be empty'
|
|
42
|
+
)
|
|
35
43
|
|
|
36
|
-
assert.ok(
|
|
37
|
-
|
|
44
|
+
assert.ok(
|
|
45
|
+
title === undefined || (typeof title === 'string' && title.trim().length > 0),
|
|
46
|
+
'Directive mcp:tool: a title cannot be empty'
|
|
47
|
+
)
|
|
38
48
|
|
|
39
49
|
// a tool is called by name, so a route that cannot be named cannot be one — said where
|
|
40
50
|
// the mistake is, rather than as a tool that is quietly never listed
|
|
41
|
-
assert.ok(
|
|
42
|
-
|
|
51
|
+
assert.ok(
|
|
52
|
+
refusal(segment(route)) === null,
|
|
53
|
+
`Directive mcp:tool: '${route}' holds a segment no tool name can spell`
|
|
54
|
+
)
|
|
43
55
|
|
|
44
56
|
this.description = description
|
|
45
57
|
this.title = title as string | undefined
|
|
@@ -20,11 +20,10 @@ export class Discovery implements Interceptor {
|
|
|
20
20
|
*/
|
|
21
21
|
private readonly authorities = new Map<string, Documents>()
|
|
22
22
|
|
|
23
|
-
public mount
|
|
23
|
+
public mount(options: http.Options): void {
|
|
24
24
|
this.authorities.clear()
|
|
25
25
|
|
|
26
|
-
if (options.oauth === undefined)
|
|
27
|
-
return
|
|
26
|
+
if (options.oauth === undefined) return
|
|
28
27
|
|
|
29
28
|
/*
|
|
30
29
|
* `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
|
|
@@ -39,20 +38,18 @@ export class Discovery implements Interceptor {
|
|
|
39
38
|
this.authorities.set(authority, documents(`https://${host}`, options.oauth))
|
|
40
39
|
}
|
|
41
40
|
|
|
42
|
-
public reset
|
|
41
|
+
public reset(): void {
|
|
43
42
|
this.authorities.clear()
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
public intercept
|
|
45
|
+
public intercept(input: Input): Output {
|
|
47
46
|
const known = this.authorities.get(input.authority)
|
|
48
47
|
|
|
49
|
-
if (known === undefined)
|
|
50
|
-
return null
|
|
48
|
+
if (known === undefined) return null
|
|
51
49
|
|
|
52
50
|
// every reply, not just a document's: the challenge is what points a client here
|
|
53
51
|
input.pipelines.response.push((response) => {
|
|
54
|
-
if (response.status !== UNAUTHORIZED)
|
|
55
|
-
return
|
|
52
|
+
if (response.status !== UNAUTHORIZED) return
|
|
56
53
|
|
|
57
54
|
response.headers ??= new Headers()
|
|
58
55
|
response.headers.set('www-authenticate', known.challenge(input.url.pathname))
|
|
@@ -60,8 +57,7 @@ export class Discovery implements Interceptor {
|
|
|
60
57
|
|
|
61
58
|
const body = known.read(input.url.pathname)
|
|
62
59
|
|
|
63
|
-
if (body === undefined)
|
|
64
|
-
return null
|
|
60
|
+
if (body === undefined) return null
|
|
65
61
|
|
|
66
62
|
return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
|
|
67
63
|
}
|
|
@@ -9,12 +9,12 @@ export interface Documents {
|
|
|
9
9
|
challenge: (pathname: string) => string
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function documents
|
|
12
|
+
export function documents(issuer: string, oauth: OAuth): Documents {
|
|
13
13
|
const server = authorizationServer(issuer, oauth)
|
|
14
14
|
const resources = protectedResources(issuer, oauth)
|
|
15
15
|
const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
|
|
16
16
|
|
|
17
|
-
function read
|
|
17
|
+
function read(pathname: string): object | undefined {
|
|
18
18
|
if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
|
|
19
19
|
return server
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
|
|
|
24
24
|
return undefined
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
function challenge
|
|
27
|
+
function challenge(pathname: string): string {
|
|
28
28
|
return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -36,7 +36,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
|
|
|
36
36
|
* everything else this extension serves. Both flags are load-bearing for a client that
|
|
37
37
|
* prefers Client ID Metadata Documents: without either it falls back to registration.
|
|
38
38
|
*/
|
|
39
|
-
function authorizationServer
|
|
39
|
+
function authorizationServer(issuer: string, oauth: OAuth): object {
|
|
40
40
|
const metadata: Record<string, unknown> = {
|
|
41
41
|
issuer,
|
|
42
42
|
authorization_endpoint: oauth.authorize,
|
|
@@ -52,8 +52,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
|
|
|
52
52
|
if (oauth.registration === 'open')
|
|
53
53
|
metadata.registration_endpoint = `${issuer}${REGISTRATION}`
|
|
54
54
|
|
|
55
|
-
if (oauth.scopes !== undefined)
|
|
56
|
-
metadata.scopes_supported = oauth.scopes
|
|
55
|
+
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
57
56
|
|
|
58
57
|
return metadata
|
|
59
58
|
}
|
|
@@ -63,7 +62,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
|
|
|
63
62
|
* `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
|
|
64
63
|
* no path reads the document at the origin.
|
|
65
64
|
*/
|
|
66
|
-
function protectedResources
|
|
65
|
+
function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
|
|
67
66
|
const map = new Map<string, object>()
|
|
68
67
|
|
|
69
68
|
for (const path of oauth.resources ?? [])
|
|
@@ -74,26 +73,24 @@ function protectedResources (issuer: string, oauth: OAuth): Map<string, object>
|
|
|
74
73
|
return map
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
function resource
|
|
76
|
+
function resource(issuer: string, path: string, oauth: OAuth): object {
|
|
78
77
|
const metadata: Record<string, unknown> = {
|
|
79
78
|
resource: issuer + path,
|
|
80
79
|
authorization_servers: [issuer],
|
|
81
80
|
bearer_methods_supported: ['header']
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
if (oauth.scopes !== undefined)
|
|
85
|
-
metadata.scopes_supported = oauth.scopes
|
|
83
|
+
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
86
84
|
|
|
87
85
|
return metadata
|
|
88
86
|
}
|
|
89
87
|
|
|
90
88
|
/** The document a request to this path was refused against: the longest resource holding it. */
|
|
91
|
-
function suffix
|
|
89
|
+
function suffix(oauth: OAuth, pathname: string): string {
|
|
92
90
|
let longest = ''
|
|
93
91
|
|
|
94
92
|
for (const path of oauth.resources ?? [])
|
|
95
|
-
if (pathname.startsWith(path) && path.length > longest.length)
|
|
96
|
-
longest = path
|
|
93
|
+
if (pathname.startsWith(path) && path.length > longest.length) longest = path
|
|
97
94
|
|
|
98
95
|
return canonical(longest)
|
|
99
96
|
}
|
|
@@ -102,7 +99,7 @@ function suffix (oauth: OAuth, pathname: string): string {
|
|
|
102
99
|
* A resource is identified without its trailing slash — the form MCP asks for — while a
|
|
103
100
|
* route is declared with one, so `/mcp/` identifies `…/mcp`.
|
|
104
101
|
*/
|
|
105
|
-
function canonical
|
|
102
|
+
function canonical(path: string): string {
|
|
106
103
|
return path.endsWith('/') ? path.slice(0, -1) : path
|
|
107
104
|
}
|
|
108
105
|
|
|
@@ -6,15 +6,18 @@ export class Context extends Directive {
|
|
|
6
6
|
public readonly targeted = false
|
|
7
7
|
public readonly storage: string
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(value: unknown) {
|
|
10
10
|
super()
|
|
11
11
|
|
|
12
|
-
assert.ok(
|
|
12
|
+
assert.ok(
|
|
13
|
+
typeof value === 'string',
|
|
14
|
+
"Directive 'octets:context' must must be a string"
|
|
15
|
+
)
|
|
13
16
|
|
|
14
17
|
this.storage = value
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
public async apply
|
|
20
|
+
public async apply(): Promise<Output> {
|
|
18
21
|
return null
|
|
19
22
|
}
|
|
20
23
|
}
|