@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/exposition.octets/operations/delete.js +1 -1
- package/components/exposition.octets/operations/get.js +5 -2
- package/components/exposition.octets/operations/head.js +1 -1
- package/components/exposition.octets/operations/put.js +29 -37
- package/components/exposition.octets/types/toa.d.ts +1 -1
- package/components/identity.bans/manifest.toa.yaml +12 -13
- package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.bans/operations/transit.js +1 -1
- package/components/identity.bans/source/transit.ts +1 -1
- package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
- package/components/identity.bans/types/toa.d.ts +5 -5
- package/components/identity.basic/events/principal.js +3 -1
- package/components/identity.basic/manifest.toa.yaml +17 -23
- package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
- package/components/identity.basic/operations/add.js +1 -1
- package/components/identity.basic/operations/authenticate.js +2 -2
- package/components/identity.basic/operations/check.js +4 -2
- package/components/identity.basic/operations/delete.js +1 -1
- package/components/identity.basic/operations/incept.js +1 -1
- package/components/identity.basic/operations/info.js +1 -1
- package/components/identity.basic/operations/lib/credentials.js +1 -1
- package/components/identity.basic/operations/transit.js +7 -8
- package/components/identity.basic/source/add.ts +5 -2
- package/components/identity.basic/source/authenticate.ts +11 -13
- package/components/identity.basic/source/check.ts +9 -6
- package/components/identity.basic/source/delete.ts +4 -1
- package/components/identity.basic/source/incept.ts +13 -10
- package/components/identity.basic/source/info.ts +4 -1
- package/components/identity.basic/source/lib/credentials.ts +2 -3
- package/components/identity.basic/source/transit.ts +27 -21
- package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/types/index.d.ts +7 -3
- package/components/identity.basic/types/toa.d.ts +5 -5
- package/components/identity.clients/manifest.toa.yaml +36 -40
- package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
- package/components/identity.clients/operations/describe.js +1 -1
- package/components/identity.clients/operations/lib/canonical.js +1 -1
- package/components/identity.clients/operations/lib/cimd.js +3 -2
- package/components/identity.clients/operations/lib/redirect.js +7 -4
- package/components/identity.clients/operations/register.js +2 -2
- package/components/identity.clients/source/describe.ts +6 -8
- package/components/identity.clients/source/lib/Context.ts +6 -3
- package/components/identity.clients/source/lib/Entity.ts +1 -1
- package/components/identity.clients/source/lib/canonical.ts +1 -1
- package/components/identity.clients/source/lib/cimd.test.ts +8 -6
- package/components/identity.clients/source/lib/cimd.ts +24 -19
- package/components/identity.clients/source/lib/redirect.test.ts +8 -2
- package/components/identity.clients/source/lib/redirect.ts +12 -8
- package/components/identity.clients/source/register.ts +18 -18
- package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
- package/components/identity.clients/types/toa.d.ts +5 -5
- package/components/identity.credentials/manifest.toa.yaml +4 -4
- package/components/identity.credentials/operations/list.js +8 -4
- package/components/identity.credentials/source/list.test.ts +39 -20
- package/components/identity.credentials/source/list.ts +12 -8
- package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
- package/components/identity.credentials/types/toa.d.ts +2 -2
- package/components/identity.federation/manifest.toa.yaml +23 -32
- package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
- package/components/identity.federation/operations/authenticate.js +4 -2
- package/components/identity.federation/operations/create.js +2 -2
- package/components/identity.federation/operations/decode.js +1 -1
- package/components/identity.federation/operations/delete.js +1 -1
- package/components/identity.federation/operations/incept.js +1 -1
- package/components/identity.federation/operations/lib/decode.js +1 -1
- package/components/identity.federation/operations/lib/discovery.js +2 -2
- package/components/identity.federation/operations/lib/exchange.js +8 -4
- package/components/identity.federation/operations/lib/principal.js +1 -1
- package/components/identity.federation/operations/lib/resolve.js +1 -1
- package/components/identity.federation/operations/list.js +2 -2
- package/components/identity.federation/source/authenticate.ts +19 -17
- package/components/identity.federation/source/create.ts +6 -7
- package/components/identity.federation/source/decode.ts +4 -1
- package/components/identity.federation/source/delete.ts +4 -1
- package/components/identity.federation/source/incept.ts +2 -3
- package/components/identity.federation/source/lib/decode.ts +4 -7
- package/components/identity.federation/source/lib/discovery.test.ts +15 -5
- package/components/identity.federation/source/lib/discovery.ts +10 -9
- package/components/identity.federation/source/lib/exchange.ts +18 -15
- package/components/identity.federation/source/lib/jose.d.ts +1 -1
- package/components/identity.federation/source/lib/principal.ts +5 -3
- package/components/identity.federation/source/lib/resolve.ts +5 -1
- package/components/identity.federation/source/list.test.ts +26 -10
- package/components/identity.federation/source/list.ts +5 -2
- package/components/identity.federation/source/types/context.ts +5 -2
- package/components/identity.federation/source/types/entity.ts +2 -2
- package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/types/toa.d.ts +5 -5
- package/components/identity.grants/manifest.toa.yaml +27 -31
- package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
- package/components/identity.grants/operations/authorize.js +1 -1
- package/components/identity.grants/operations/exchange.js +5 -2
- package/components/identity.grants/operations/lib/code.js +1 -1
- package/components/identity.grants/operations/lib/identify.js +1 -1
- package/components/identity.grants/operations/list.js +1 -1
- package/components/identity.grants/operations/revoke.js +3 -2
- package/components/identity.grants/source/authorize.ts +27 -19
- package/components/identity.grants/source/exchange.ts +15 -11
- package/components/identity.grants/source/lib/code.ts +20 -8
- package/components/identity.grants/source/lib/identify.ts +1 -1
- package/components/identity.grants/source/list.ts +2 -2
- package/components/identity.grants/source/revoke.ts +9 -7
- package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
- package/components/identity.grants/types/index.d.ts +3 -3
- package/components/identity.grants/types/toa.d.ts +5 -5
- package/components/identity.keys/manifest.toa.yaml +18 -23
- package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
- package/components/identity.keys/operations/create.js +1 -1
- package/components/identity.keys/operations/disable.js +1 -1
- package/components/identity.keys/operations/revoke.js +1 -1
- package/components/identity.keys/source/create.ts +2 -3
- package/components/identity.keys/source/disable.ts +1 -1
- package/components/identity.keys/source/revoke.ts +2 -2
- package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.keys/types/toa.d.ts +5 -5
- package/components/identity.otp/manifest.toa.yaml +16 -24
- package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
- package/components/identity.otp/operations/authenticate.js +1 -1
- package/components/identity.otp/operations/issue.js +1 -1
- package/components/identity.otp/source/authenticate.ts +4 -7
- package/components/identity.otp/source/issue.ts +1 -1
- package/components/identity.otp/source/lib/Context.ts +1 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
- package/components/identity.otp/types/toa.d.ts +5 -5
- package/components/identity.passkeys/manifest.toa.yaml +45 -53
- package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
- package/components/identity.passkeys/operations/authenticate.js +1 -1
- package/components/identity.passkeys/operations/challenge.js +6 -3
- package/components/identity.passkeys/operations/create.js +1 -1
- package/components/identity.passkeys/operations/delete.js +1 -1
- package/components/identity.passkeys/operations/list.js +1 -1
- package/components/identity.passkeys/operations/use.js +1 -1
- package/components/identity.passkeys/source/authenticate.ts +3 -4
- package/components/identity.passkeys/source/challenge.ts +29 -25
- package/components/identity.passkeys/source/create.ts +8 -6
- package/components/identity.passkeys/source/delete.ts +4 -1
- package/components/identity.passkeys/source/list.ts +4 -1
- package/components/identity.passkeys/source/types/Context.ts +1 -1
- package/components/identity.passkeys/source/use.ts +12 -10
- package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.passkeys/types/toa.d.ts +5 -5
- package/components/identity.roles/manifest.toa.yaml +12 -16
- package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
- package/components/identity.roles/operations/grant.js +1 -1
- package/components/identity.roles/operations/list.js +1 -1
- package/components/identity.roles/operations/principal.js +2 -2
- package/components/identity.roles/source/grant.ts +7 -6
- package/components/identity.roles/source/list.ts +1 -1
- package/components/identity.roles/source/principal.ts +5 -7
- package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/types/toa.d.ts +5 -5
- package/components/identity.tokens/manifest.toa.yaml +17 -15
- package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.tokens/operations/authenticate.js +2 -2
- package/components/identity.tokens/operations/decrypt.js +11 -5
- package/components/identity.tokens/operations/encrypt.js +2 -2
- package/components/identity.tokens/operations/issue.js +2 -4
- package/components/identity.tokens/operations/lib/form.js +1 -1
- package/components/identity.tokens/operations/lib/key.js +1 -1
- package/components/identity.tokens/operations/revoke.js +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -16
- package/components/identity.tokens/source/authenticate.ts +7 -10
- package/components/identity.tokens/source/decrypt.test.ts +62 -29
- package/components/identity.tokens/source/decrypt.ts +30 -27
- package/components/identity.tokens/source/encrypt.test.ts +21 -16
- package/components/identity.tokens/source/encrypt.ts +8 -11
- package/components/identity.tokens/source/issue.test.ts +4 -2
- package/components/identity.tokens/source/issue.ts +6 -8
- package/components/identity.tokens/source/lib/form.ts +5 -9
- package/components/identity.tokens/source/lib/jose.d.ts +1 -1
- package/components/identity.tokens/source/lib/key.ts +1 -1
- package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
- package/components/identity.tokens/source/revoke.ts +1 -1
- package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/types/index.d.ts +13 -4
- package/components/identity.tokens/types/toa.d.ts +5 -5
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/documentation/access.md +4 -3
- package/documentation/cache.md +17 -3
- package/documentation/components.md +2 -2
- package/documentation/credentials.md +2 -2
- package/documentation/identity.md +7 -9
- package/documentation/map.md +2 -2
- package/documentation/mcp.md +23 -17
- package/documentation/notes/peers.md +1 -1
- package/documentation/notes/throttling.md +1 -1
- package/documentation/octets.md +4 -4
- package/documentation/protocol.md +3 -3
- package/documentation/query.md +14 -8
- package/documentation/rpc.md +45 -31
- package/documentation/tracing.md +3 -3
- package/documentation/tree.md +1 -1
- package/features/auth.assert.feature +2 -2
- package/features/auth.bearer.feature +1 -1
- package/features/auth.claims.feature +5 -5
- package/features/auth.incept.feature +2 -2
- package/features/authorities.federation.feature +1 -1
- package/features/configuration.feature +3 -4
- package/features/credentials.feature +9 -9
- package/features/dev.feature +1 -0
- package/features/dynamic.feature +1 -0
- package/features/errors.feature +21 -0
- package/features/etag.feature +0 -86
- package/features/identity.bans.feature +3 -3
- package/features/identity.basic.feature +9 -9
- package/features/identity.federation.feature +11 -11
- package/features/identity.tokens.custom.feature +5 -5
- package/features/identity.tokens.feature +2 -2
- package/features/interruptions.feature +1 -0
- package/features/introspection.map.feature +4 -4
- package/features/io.throttle.feature +1 -0
- package/features/map.feature +2 -2
- package/features/mcp.feature +32 -28
- package/features/oauth.grants.feature +1 -1
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/rpc.feature +21 -21
- package/features/steps/Captures.ts +1 -1
- package/features/steps/Cloudinary.ts +1 -2
- package/features/steps/Common.ts +4 -5
- package/features/steps/Components.ts +17 -12
- package/features/steps/Database.ts +42 -23
- package/features/steps/Gateway.ts +55 -71
- package/features/steps/HTTP.ts +12 -15
- package/features/steps/IDP.ts +118 -94
- package/features/steps/Identity.ts +3 -3
- package/features/steps/OTP.ts +3 -3
- package/features/steps/Parameters.ts +20 -10
- package/features/steps/Probe.ts +9 -7
- package/features/steps/Realtime.ts +40 -22
- package/features/steps/Workspace.ts +10 -7
- package/features/steps/components/audit/operations/record.js +1 -1
- package/features/steps/components/echo/operations/affect.js +1 -1
- package/features/steps/components/echo/operations/compute.js +1 -1
- package/features/steps/components/echo/operations/echo.js +1 -1
- package/features/steps/components/echo/operations/error.js +1 -1
- package/features/steps/components/echo/operations/identity.js +1 -1
- package/features/steps/components/echo/operations/parameters.js +1 -1
- package/features/steps/components/echo/operations/ping.js +1 -1
- package/features/steps/components/echo/operations/unwrap.js +1 -1
- package/features/steps/components/greeter/operations/greet.js +1 -1
- package/features/steps/components/notify/operations/send.js +1 -1
- package/features/steps/components/octets.tester/operations/authority.js +1 -1
- package/features/steps/components/octets.tester/operations/bar.js +1 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/concat.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/err.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +1 -1
- package/features/steps/components/octets.tester/operations/id.js +1 -1
- package/features/steps/components/octets.tester/operations/identity.js +1 -1
- package/features/steps/components/octets.tester/operations/redirect.js +6 -4
- package/features/steps/components/octets.tester/operations/yex.js +1 -1
- package/features/steps/components/octets.tester/operations/yield.js +1 -1
- package/features/steps/components/orders/manifest.toa.yaml +10 -12
- package/features/steps/components/orders/operations/create.js +4 -2
- package/features/steps/components/pots/manifest.toa.yaml +15 -20
- package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
- package/features/steps/components/pricing/operations/quote.js +1 -1
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/sequences/operations/numbers.js +1 -1
- package/features/steps/components/sequences/operations/tokens.js +3 -3
- package/features/steps/components/users/manifest.toa.yaml +3 -5
- package/features/steps/components/users/operations/create.js +1 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
- package/features/steps/map.ts +2 -2
- package/features/timestamps.feature +1 -1
- package/package.json +7 -7
- package/readme.md +11 -11
- package/schemas/annotation.cos.yaml +1 -3
- package/schemas/method.cos.yaml +2 -0
- package/source/Branch.test.ts +2 -2
- package/source/Branch.ts +3 -5
- package/source/Composition.ts +5 -5
- package/source/Directive.test.ts +38 -20
- package/source/Directive.ts +61 -47
- package/source/Endpoint.test.ts +1 -1
- package/source/Endpoint.ts +27 -92
- package/source/Factory.ts +26 -12
- package/source/Gateway.ts +87 -76
- package/source/HTTP/Context.ts +23 -30
- package/source/HTTP/Probe.ts +7 -9
- package/source/HTTP/Server.ts +88 -69
- package/source/HTTP/Timing.ts +6 -21
- package/source/HTTP/address.test.ts +8 -2
- package/source/HTTP/address.ts +2 -3
- package/source/HTTP/exceptions.ts +20 -18
- package/source/HTTP/formats/form.ts +1 -1
- package/source/HTTP/formats/json.ts +2 -2
- package/source/HTTP/formats/msgpack.ts +3 -4
- package/source/HTTP/formats/text.ts +2 -2
- package/source/HTTP/formats/yaml.test.ts +4 -1
- package/source/HTTP/formats/yaml.ts +14 -11
- package/source/HTTP/messages.test.ts +38 -28
- package/source/HTTP/messages.ts +44 -98
- package/source/Interception.ts +3 -4
- package/source/Introspection.ts +29 -14
- package/source/MCP/Server.ts +114 -54
- package/source/MCP/discover.ts +6 -7
- package/source/MCP/errors.ts +7 -8
- package/source/MCP/schema.test.ts +9 -3
- package/source/MCP/schema.ts +12 -16
- package/source/MCP/tools.ts +33 -27
- package/source/MCP/types.ts +4 -1
- package/source/Mapping.ts +25 -27
- package/source/Query.ts +58 -44
- package/source/RPC/Context.ts +8 -11
- package/source/RPC/Dispatcher.ts +46 -26
- package/source/RPC/errors.test.ts +41 -16
- package/source/RPC/errors.ts +9 -10
- package/source/RPC/names.test.ts +51 -32
- package/source/RPC/names.ts +26 -32
- package/source/RTD/Directives.ts +21 -10
- package/source/RTD/Endpoint.ts +4 -1
- package/source/RTD/Method.ts +8 -6
- package/source/RTD/Node.ts +32 -34
- package/source/RTD/Route.ts +18 -21
- package/source/RTD/Tree.ts +18 -18
- package/source/RTD/factory.ts +13 -16
- package/source/RTD/segment.ts +12 -10
- package/source/RTD/syntax/parse.test.ts +12 -6
- package/source/RTD/syntax/parse.ts +30 -26
- package/source/RTD/syntax/types.ts +17 -1
- package/source/RTD/walk.test.ts +64 -27
- package/source/Remotes.test.ts +25 -4
- package/source/Remotes.ts +9 -4
- package/source/Tenant.ts +12 -12
- package/source/deployment.ts +20 -20
- package/source/directives/auth/Anonymous.test.ts +8 -2
- package/source/directives/auth/Anonymous.ts +5 -8
- package/source/directives/auth/Anyone.ts +3 -3
- package/source/directives/auth/Assert.ts +10 -10
- package/source/directives/auth/Authorization.ts +83 -69
- package/source/directives/auth/Delegate.test.ts +2 -2
- package/source/directives/auth/Delegate.ts +8 -10
- package/source/directives/auth/Echo.ts +5 -8
- package/source/directives/auth/Federation.ts +30 -21
- package/source/directives/auth/Id.ts +7 -4
- package/source/directives/auth/Incept.ts +32 -26
- package/source/directives/auth/Input.ts +36 -20
- package/source/directives/auth/Role.test.ts +49 -23
- package/source/directives/auth/Role.ts +29 -22
- package/source/directives/auth/Rule.ts +13 -8
- package/source/directives/auth/Scheme.ts +7 -7
- package/source/directives/auth/create.ts +1 -1
- package/source/directives/auth/schemes.ts +1 -1
- package/source/directives/auth/split.ts +2 -3
- package/source/directives/auth/types.ts +5 -2
- package/source/directives/cache/Cache.ts +44 -9
- package/source/directives/cache/Control.ts +25 -26
- package/source/directives/cache/Exact.ts +1 -1
- package/source/directives/cache/etag.ts +38 -0
- package/source/directives/cors/CORS.ts +9 -7
- package/source/directives/dev/Development.ts +3 -4
- package/source/directives/dev/Faulty.ts +11 -6
- package/source/directives/dev/Sleep.ts +5 -7
- package/source/directives/dev/Stub.ts +2 -2
- package/source/directives/dev/Throw.ts +2 -2
- package/source/directives/flow/Compose.ts +26 -20
- package/source/directives/flow/Fetch.ts +15 -15
- package/source/directives/flow/Flow.ts +9 -8
- package/source/directives/index.ts +11 -2
- package/source/directives/io/IO.ts +29 -20
- package/source/directives/io/Input.ts +9 -12
- package/source/directives/io/Output.ts +20 -23
- package/source/directives/io/Status.test.ts +12 -8
- package/source/directives/io/Status.ts +9 -8
- package/source/directives/io/Throttle.ts +6 -7
- package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
- package/source/directives/io/lib/throttle/Configuration.ts +14 -9
- package/source/directives/io/lib/throttle/Keys.ts +15 -10
- package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
- package/source/directives/io/lib/throttle/Quotas.ts +20 -26
- package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
- package/source/directives/io/lib/throttle/Sync.ts +9 -12
- package/source/directives/io/lib/throttle/Warning.ts +3 -4
- package/source/directives/io/lib/throttle/components/IP.ts +4 -5
- package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
- package/source/directives/io/lib/throttle/components/Path.ts +1 -1
- package/source/directives/io/lib/throttle/components/Route.ts +2 -2
- package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
- package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
- package/source/directives/io/schemas.test.ts +12 -6
- package/source/directives/map/Authority.ts +2 -2
- package/source/directives/map/Buffer.ts +2 -2
- package/source/directives/map/Claims.ts +25 -20
- package/source/directives/map/Headers.ts +17 -13
- package/source/directives/map/Language.ts +8 -5
- package/source/directives/map/Languages.ts +9 -3
- package/source/directives/map/Map.ts +25 -12
- package/source/directives/map/Mapping.ts +9 -6
- package/source/directives/map/Properties.ts +1 -1
- package/source/directives/map/Segments.ts +22 -15
- package/source/directives/mcp/MCP.ts +14 -5
- package/source/directives/mcp/Tool.test.ts +42 -6
- package/source/directives/mcp/Tool.ts +38 -7
- package/source/directives/oauth/Discovery.ts +7 -11
- package/source/directives/oauth/documents.ts +11 -14
- package/source/directives/octets/Context.ts +6 -3
- package/source/directives/octets/Delete.ts +33 -25
- package/source/directives/octets/Directive.ts +5 -1
- package/source/directives/octets/Get.ts +13 -21
- package/source/directives/octets/Octets.ts +20 -15
- package/source/directives/octets/Put.ts +62 -27
- package/source/directives/octets/Workflow.ts +18 -12
- package/source/directives/octets/bytes.ts +1 -1
- package/source/directives/octets/schemas.test.ts +8 -14
- package/source/directives/octets/workflows/Execution.ts +19 -21
- package/source/directives/octets/workflows/Workflow.ts +10 -7
- package/source/directives/require/Headers.ts +3 -4
- package/source/directives/require/Require.ts +3 -4
- package/source/exceptions.ts +19 -12
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +4 -1
- package/source/manifest.ts +19 -13
- package/source/octets.d.ts +1 -1
- package/source/root.ts +3 -2
- package/source/schemas.test.ts +17 -3
- package/transpiled/Branch.js.map +1 -1
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +6 -2
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +0 -2
- package/transpiled/Endpoint.js +11 -52
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js +1 -0
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -1
- package/transpiled/Gateway.js +24 -15
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +0 -3
- package/transpiled/HTTP/Context.js +7 -9
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Probe.js.map +1 -1
- package/transpiled/HTTP/Server.js +19 -4
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +1 -2
- package/transpiled/HTTP/Timing.js +2 -10
- package/transpiled/HTTP/Timing.js.map +1 -1
- package/transpiled/HTTP/address.js.map +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/form.js.map +1 -1
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +4 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +3 -2
- package/transpiled/HTTP/messages.js +1 -43
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.js.map +1 -1
- package/transpiled/Introspection.d.ts +2 -0
- package/transpiled/Introspection.js +13 -2
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.js +15 -4
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.js.map +1 -1
- package/transpiled/MCP/errors.js.map +1 -1
- package/transpiled/MCP/schema.js +1 -1
- package/transpiled/MCP/schema.js.map +1 -1
- package/transpiled/MCP/tools.js +10 -6
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/MCP/types.d.ts +3 -1
- package/transpiled/Mapping.d.ts +2 -2
- package/transpiled/Mapping.js +3 -5
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +6 -2
- package/transpiled/Query.js +23 -8
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Context.js +0 -7
- package/transpiled/RPC/Context.js.map +1 -1
- package/transpiled/RPC/Dispatcher.js +4 -1
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RPC/errors.js.map +1 -1
- package/transpiled/RPC/names.d.ts +3 -2
- package/transpiled/RPC/names.js +1 -1
- package/transpiled/RPC/names.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +1 -1
- package/transpiled/RTD/Method.js +1 -3
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.js +5 -4
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +4 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +6 -0
- package/transpiled/RTD/syntax/types.js +10 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +6 -1
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +1 -3
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.js.map +1 -1
- package/transpiled/directives/auth/Assert.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +7 -3
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.js +1 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.js +3 -7
- package/transpiled/directives/auth/Federation.js.map +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.js +1 -1
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +1 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.js.map +1 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +3 -1
- package/transpiled/directives/cache/Cache.js +28 -2
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.js +1 -1
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/etag.d.ts +10 -0
- package/transpiled/directives/cache/etag.js +30 -0
- package/transpiled/directives/cache/etag.js.map +1 -0
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Faulty.js.map +1 -1
- package/transpiled/directives/dev/Sleep.js.map +1 -1
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/flow/Compose.js +7 -3
- package/transpiled/directives/flow/Compose.js.map +1 -1
- package/transpiled/directives/flow/Fetch.js.map +1 -1
- package/transpiled/directives/flow/Flow.js.map +1 -1
- package/transpiled/directives/index.js +11 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.d.ts +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +1 -1
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Status.js.map +1 -1
- package/transpiled/directives/io/Throttle.js +1 -1
- package/transpiled/directives/io/Throttle.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
- package/transpiled/directives/map/Authority.js.map +1 -1
- package/transpiled/directives/map/Buffer.js.map +1 -1
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Headers.js.map +1 -1
- package/transpiled/directives/map/Language.js.map +1 -1
- package/transpiled/directives/map/Languages.js.map +1 -1
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/directives/map/Properties.js.map +1 -1
- package/transpiled/directives/map/Segments.js.map +1 -1
- package/transpiled/directives/mcp/MCP.js +7 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.d.ts +6 -1
- package/transpiled/directives/mcp/Tool.js +16 -3
- package/transpiled/directives/mcp/Tool.js.map +1 -1
- package/transpiled/directives/oauth/Discovery.js.map +1 -1
- package/transpiled/directives/oauth/documents.js.map +1 -1
- package/transpiled/directives/octets/Context.js +1 -1
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.js.map +1 -1
- package/transpiled/directives/octets/Get.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -1
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Put.js.map +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.js +1 -2
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Headers.js.map +1 -1
- package/transpiled/directives/require/Require.js.map +1 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js +5 -1
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/CHANGELOG.md +0 -541
- package/source/redact.test.ts +0 -27
- package/source/redact.ts +0 -21
- package/transpiled/redact.d.ts +0 -5
- package/transpiled/redact.js +0 -17
- package/transpiled/redact.js.map +0 -1
package/source/RPC/names.test.ts
CHANGED
|
@@ -7,65 +7,79 @@ import { address, name, refusal } from './names.js'
|
|
|
7
7
|
|
|
8
8
|
describe('address', () => {
|
|
9
9
|
it('should resolve a name without variables', () => {
|
|
10
|
-
assert.deepEqual(address('pots
|
|
11
|
-
|
|
10
|
+
assert.deepEqual(address('pots.GET', {}), {
|
|
11
|
+
path: '/pots/',
|
|
12
|
+
verb: 'GET',
|
|
13
|
+
variables: []
|
|
14
|
+
})
|
|
12
15
|
})
|
|
13
16
|
|
|
14
17
|
it('should resolve the trunk', () => {
|
|
15
|
-
assert.deepEqual(address('GET', {}),
|
|
16
|
-
{ path: '/', verb: 'GET', variables: [] })
|
|
18
|
+
assert.deepEqual(address('GET', {}), { path: '/', verb: 'GET', variables: [] })
|
|
17
19
|
})
|
|
18
20
|
|
|
19
21
|
it('should substitute a variable and report it taken', () => {
|
|
20
|
-
assert.deepEqual(address('pots
|
|
21
|
-
|
|
22
|
+
assert.deepEqual(address('pots._id.GET', { id: 'a1b2', title: 'Kettle' }), {
|
|
23
|
+
path: '/pots/a1b2/',
|
|
24
|
+
verb: 'GET',
|
|
25
|
+
variables: ['id']
|
|
26
|
+
})
|
|
22
27
|
})
|
|
23
28
|
|
|
24
29
|
it('should substitute every variable', () => {
|
|
25
|
-
assert.deepEqual(address('users
|
|
26
|
-
|
|
30
|
+
assert.deepEqual(address('users._user.pots._id.PATCH', { user: 'bob', id: 'a1b2' }), {
|
|
31
|
+
path: '/users/bob/pots/a1b2/',
|
|
32
|
+
verb: 'PATCH',
|
|
33
|
+
variables: ['user', 'id']
|
|
34
|
+
})
|
|
27
35
|
})
|
|
28
36
|
|
|
29
37
|
it('should let a tail carry separators', () => {
|
|
30
|
-
assert.deepEqual(address('files
|
|
31
|
-
|
|
38
|
+
assert.deepEqual(address('files.__.GET', { '**': 'a/b/c' }), {
|
|
39
|
+
path: '/files/a/b/c/',
|
|
40
|
+
verb: 'GET',
|
|
41
|
+
variables: ['**']
|
|
42
|
+
})
|
|
32
43
|
})
|
|
33
44
|
|
|
34
45
|
it('should not confuse a trailing literal with a verb', () => {
|
|
35
|
-
assert.deepEqual(address('pots
|
|
36
|
-
|
|
46
|
+
assert.deepEqual(address('pots.GET.POST', {}), {
|
|
47
|
+
path: '/pots/GET/',
|
|
48
|
+
verb: 'POST',
|
|
49
|
+
variables: []
|
|
50
|
+
})
|
|
37
51
|
})
|
|
38
52
|
|
|
39
53
|
it('should refuse a name that states no verb', () => {
|
|
40
|
-
assert.throws(() => address('pots
|
|
54
|
+
assert.throws(() => address('pots._id', { id: 'a1b2' }), http.NotFound)
|
|
41
55
|
})
|
|
42
56
|
|
|
43
57
|
it('should refuse a verb no method uses', () => {
|
|
44
|
-
assert.throws(() => address('pots
|
|
58
|
+
assert.throws(() => address('pots.FETCH', {}), http.NotFound)
|
|
45
59
|
})
|
|
46
60
|
|
|
47
61
|
it('should refuse a segment no name can spell', () => {
|
|
48
|
-
assert.throws(() => address('pots/v1.
|
|
49
|
-
assert.throws(() => address('a_b
|
|
50
|
-
assert.throws(() => address('pots
|
|
62
|
+
assert.throws(() => address('pots/v1.GET', {}), http.NotFound)
|
|
63
|
+
assert.throws(() => address('a_b.GET', {}), http.NotFound)
|
|
64
|
+
assert.throws(() => address('pots..GET', {}), http.NotFound)
|
|
51
65
|
})
|
|
52
66
|
|
|
53
67
|
it('should refuse a variable of no name', () => {
|
|
54
|
-
assert.throws(() => address('pots
|
|
68
|
+
assert.throws(() => address('pots._.GET', { '': 'a1b2' }), http.NotFound)
|
|
55
69
|
})
|
|
56
70
|
|
|
57
71
|
it('should refuse a missing variable', () => {
|
|
58
|
-
assert.throws(() => address('pots
|
|
72
|
+
assert.throws(() => address('pots._id.GET', {}), http.BadRequest)
|
|
59
73
|
})
|
|
60
74
|
|
|
61
75
|
it('should refuse a variable that would divide the path', () => {
|
|
62
|
-
assert.throws(() => address('pots
|
|
63
|
-
assert.throws(() => address('pots
|
|
64
|
-
assert.throws(() => address('pots
|
|
76
|
+
assert.throws(() => address('pots._id.GET', { id: 'a/b' }), http.BadRequest)
|
|
77
|
+
assert.throws(() => address('pots._id.GET', { id: 'a?b' }), http.BadRequest)
|
|
78
|
+
assert.throws(() => address('pots._id.GET', { id: 'a#b' }), http.BadRequest)
|
|
65
79
|
})
|
|
66
80
|
|
|
67
81
|
it('should refuse a tail that would end the path', () => {
|
|
68
|
-
assert.throws(() => address('files
|
|
82
|
+
assert.throws(() => address('files.__.GET', { '**': 'a?b' }), http.BadRequest)
|
|
69
83
|
})
|
|
70
84
|
})
|
|
71
85
|
|
|
@@ -75,22 +89,24 @@ describe('name', () => {
|
|
|
75
89
|
})
|
|
76
90
|
|
|
77
91
|
it('should name a route', () => {
|
|
78
|
-
assert.equal(name(segment('/pots'), 'GET'), 'pots
|
|
79
|
-
assert.equal(name(segment('/identity/tokens'), 'POST'), 'identity
|
|
92
|
+
assert.equal(name(segment('/pots'), 'GET'), 'pots.GET')
|
|
93
|
+
assert.equal(name(segment('/identity/tokens'), 'POST'), 'identity.tokens.POST')
|
|
80
94
|
})
|
|
81
95
|
|
|
82
96
|
it('should mark a variable', () => {
|
|
83
|
-
assert.equal(name(segment('/pots/:id'), 'GET'), 'pots
|
|
84
|
-
assert.equal(
|
|
85
|
-
'identity/tokens
|
|
97
|
+
assert.equal(name(segment('/pots/:id'), 'GET'), 'pots._id.GET')
|
|
98
|
+
assert.equal(
|
|
99
|
+
name(segment('/identity/tokens/:identity'), 'POST'),
|
|
100
|
+
'identity.tokens._identity.POST'
|
|
101
|
+
)
|
|
86
102
|
})
|
|
87
103
|
|
|
88
104
|
it('should mark a tail', () => {
|
|
89
|
-
assert.equal(name(segment('/files/**'), 'GET'), 'files
|
|
105
|
+
assert.equal(name(segment('/files/**'), 'GET'), 'files.__.GET')
|
|
90
106
|
})
|
|
91
107
|
|
|
92
108
|
it('should keep a hyphen', () => {
|
|
93
|
-
assert.equal(name(segment('/jpeg-or-png'), 'GET'), 'jpeg-or-png
|
|
109
|
+
assert.equal(name(segment('/jpeg-or-png'), 'GET'), 'jpeg-or-png.GET')
|
|
94
110
|
})
|
|
95
111
|
|
|
96
112
|
it('should name nothing where a segment cannot be spelled', () => {
|
|
@@ -103,8 +119,11 @@ describe('name', () => {
|
|
|
103
119
|
it('should round-trip what it names', () => {
|
|
104
120
|
const named = name(segment('/pots/:id'), 'GET')!
|
|
105
121
|
|
|
106
|
-
assert.deepEqual(address(named, { id: 'a1b2' }),
|
|
107
|
-
|
|
122
|
+
assert.deepEqual(address(named, { id: 'a1b2' }), {
|
|
123
|
+
path: '/pots/a1b2/',
|
|
124
|
+
verb: 'GET',
|
|
125
|
+
variables: ['id']
|
|
126
|
+
})
|
|
108
127
|
})
|
|
109
128
|
})
|
|
110
129
|
|
package/source/RPC/names.ts
CHANGED
|
@@ -7,8 +7,9 @@ import { QUERY, type Params } from './types.js'
|
|
|
7
7
|
* What a name resolves to: the path the call is made at, and the verb it is made with.
|
|
8
8
|
*
|
|
9
9
|
* A name is the route template with its variables marked and the verb appended as a segment
|
|
10
|
-
* of its own — `pots
|
|
11
|
-
*
|
|
10
|
+
* of its own — `pots._id.GET`. The revision names the characters a tool's name may hold, and
|
|
11
|
+
* `/` is not among them, so segments are joined by `.` — which a segment cannot hold either,
|
|
12
|
+
* so nothing in a name can be mistaken for anything else, and the verb is always last.
|
|
12
13
|
*/
|
|
13
14
|
export interface Address {
|
|
14
15
|
path: string
|
|
@@ -18,12 +19,11 @@ export interface Address {
|
|
|
18
19
|
variables: string[]
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
export function address
|
|
22
|
+
export function address(method: string, params: Params): Address {
|
|
22
23
|
const parts = method.split(SEPARATOR)
|
|
23
24
|
const verb = parts.pop()!
|
|
24
25
|
|
|
25
|
-
if (!verbs.has(verb))
|
|
26
|
-
throw new http.NotFound(`'${method}' names no method`)
|
|
26
|
+
if (!verbs.has(verb)) throw new http.NotFound(`'${method}' names no method`)
|
|
27
27
|
|
|
28
28
|
const variables: string[] = []
|
|
29
29
|
const fragments: string[] = []
|
|
@@ -65,13 +65,15 @@ export function address (method: string, params: Params): Address {
|
|
|
65
65
|
* What the call carries, as a request carries it: the path took its variables, `query` is
|
|
66
66
|
* the querystring, and the rest is the body.
|
|
67
67
|
*/
|
|
68
|
-
export function split
|
|
68
|
+
export function split(
|
|
69
|
+
params: Params,
|
|
70
|
+
variables: string[]
|
|
71
|
+
): { query?: Params; input?: Params } {
|
|
69
72
|
const input: Params = {}
|
|
70
73
|
let query: Params | undefined
|
|
71
74
|
|
|
72
75
|
for (const [key, value] of Object.entries(params)) {
|
|
73
|
-
if (variables.includes(key))
|
|
74
|
-
continue
|
|
76
|
+
if (variables.includes(key)) continue
|
|
75
77
|
|
|
76
78
|
if (key !== QUERY) {
|
|
77
79
|
input[key] = value
|
|
@@ -90,30 +92,27 @@ export function split (params: Params, variables: string[]): { query?: Params, i
|
|
|
90
92
|
}
|
|
91
93
|
|
|
92
94
|
/** The parameter a part reads, or nothing where the part is a literal segment. */
|
|
93
|
-
function parameter
|
|
94
|
-
if (part === TAIL)
|
|
95
|
-
return WILDCARD
|
|
95
|
+
function parameter(part: string): string | null {
|
|
96
|
+
if (part === TAIL) return WILDCARD
|
|
96
97
|
|
|
97
98
|
return part[0] === VARIABLE ? part.slice(1) : null
|
|
98
99
|
}
|
|
99
100
|
|
|
100
101
|
/** A segment a name cannot spell is a segment no name has, so this one names nothing. */
|
|
101
|
-
function literal
|
|
102
|
-
if (!NAMEABLE.test(part))
|
|
103
|
-
throw new http.NotFound(`'${method}' names no procedure`)
|
|
102
|
+
function literal(part: string, method: string): string {
|
|
103
|
+
if (!NAMEABLE.test(part)) throw new http.NotFound(`'${method}' names no procedure`)
|
|
104
104
|
|
|
105
105
|
return part
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
/** The name of a method on this route, or nothing where the route has none. */
|
|
109
|
-
export function name
|
|
109
|
+
export function name(segments: Segment[], verb: string): string | null {
|
|
110
110
|
const parts: string[] = []
|
|
111
111
|
|
|
112
112
|
for (const segment of segments) {
|
|
113
113
|
const part = component(segment)
|
|
114
114
|
|
|
115
|
-
if (part === null)
|
|
116
|
-
return null
|
|
115
|
+
if (part === null) return null
|
|
117
116
|
|
|
118
117
|
parts.push(part)
|
|
119
118
|
}
|
|
@@ -124,44 +123,39 @@ export function name (segments: Segment[], verb: string): string | null {
|
|
|
124
123
|
}
|
|
125
124
|
|
|
126
125
|
/** The segment that leaves a route unnameable, as it was declared, or nothing where none does. */
|
|
127
|
-
export function refusal
|
|
126
|
+
export function refusal(segments: Segment[]): string | null {
|
|
128
127
|
for (const segment of segments)
|
|
129
|
-
if (component(segment) === null)
|
|
130
|
-
return declared(segment)
|
|
128
|
+
if (component(segment) === null) return declared(segment)
|
|
131
129
|
|
|
132
130
|
return null
|
|
133
131
|
}
|
|
134
132
|
|
|
135
|
-
function component
|
|
133
|
+
function component(segment: Segment): string | null {
|
|
136
134
|
if (segment.fragment !== null)
|
|
137
135
|
return NAMEABLE.test(segment.fragment) ? segment.fragment : null
|
|
138
136
|
|
|
139
|
-
if (segment.wildcard === true)
|
|
140
|
-
return TAIL
|
|
137
|
+
if (segment.wildcard === true) return TAIL
|
|
141
138
|
|
|
142
139
|
// it stands for a segment the caller cannot name, so there is nothing to substitute
|
|
143
|
-
if (segment.placeholder === null)
|
|
144
|
-
return null
|
|
140
|
+
if (segment.placeholder === null) return null
|
|
145
141
|
|
|
146
142
|
return NAMEABLE.test(segment.placeholder) ? VARIABLE + segment.placeholder : null
|
|
147
143
|
}
|
|
148
144
|
|
|
149
145
|
/** The route as it was declared, which is how a message about it should read. */
|
|
150
|
-
export function template
|
|
146
|
+
export function template(segments: Segment[]): string {
|
|
151
147
|
return '/' + segments.map(declared).join('/')
|
|
152
148
|
}
|
|
153
149
|
|
|
154
|
-
function declared
|
|
155
|
-
if (segment.fragment !== null)
|
|
156
|
-
return segment.fragment
|
|
150
|
+
function declared(segment: Segment): string {
|
|
151
|
+
if (segment.fragment !== null) return segment.fragment
|
|
157
152
|
|
|
158
|
-
if (segment.wildcard === true)
|
|
159
|
-
return '**'
|
|
153
|
+
if (segment.wildcard === true) return '**'
|
|
160
154
|
|
|
161
155
|
return segment.placeholder === null ? '*' : ':' + segment.placeholder
|
|
162
156
|
}
|
|
163
157
|
|
|
164
|
-
const SEPARATOR = '
|
|
158
|
+
const SEPARATOR = '.'
|
|
165
159
|
const VARIABLE = '_'
|
|
166
160
|
const TAIL = '__'
|
|
167
161
|
|
package/source/RTD/Directives.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type * as syntax from './syntax/index.js'
|
|
|
3
3
|
import type { Context, OutgoingMessage, Options } from '../HTTP/index.js'
|
|
4
4
|
import type { Output } from '../io.js'
|
|
5
5
|
import type { Introspection } from '../Introspection.js'
|
|
6
|
-
import type { extensions } from '@toa.io/core'
|
|
6
|
+
import type { extensions } from '@toa.io/core/types'
|
|
7
7
|
|
|
8
8
|
type Host = extensions.Host
|
|
9
9
|
|
|
@@ -18,7 +18,10 @@ export interface Directives {
|
|
|
18
18
|
precall: (context: Context, parameters: Parameter[]) => Promise<Output>
|
|
19
19
|
|
|
20
20
|
/** What this route's directives make of what its method says about itself. */
|
|
21
|
-
explain: (
|
|
21
|
+
explain: (
|
|
22
|
+
context: Context,
|
|
23
|
+
introspection: Introspection
|
|
24
|
+
) => Promise<Introspection | null>
|
|
22
25
|
settle: (context: Context, response: OutgoingMessage) => Promise<void>
|
|
23
26
|
dispose: () => void
|
|
24
27
|
}
|
|
@@ -71,9 +74,11 @@ export interface DirectiveFamily<TDirective = any, TExtension = any> {
|
|
|
71
74
|
preflight?: (request: Context & TExtension) => void | Promise<void>
|
|
72
75
|
|
|
73
76
|
/** Call-scoped, with what the node declares. Runs once per call. */
|
|
74
|
-
precall?: (
|
|
77
|
+
precall?: (
|
|
78
|
+
directives: TDirective[],
|
|
75
79
|
request: Context & TExtension,
|
|
76
|
-
parameters: Parameter[]
|
|
80
|
+
parameters: Parameter[]
|
|
81
|
+
) => Output | Promise<Output>
|
|
77
82
|
|
|
78
83
|
/**
|
|
79
84
|
* What this family's directives make of what the method says about itself, which is
|
|
@@ -84,22 +89,28 @@ export interface DirectiveFamily<TDirective = any, TExtension = any> {
|
|
|
84
89
|
* is why no parameters are passed — so a directive that can only tell from one hands back
|
|
85
90
|
* what it was given.
|
|
86
91
|
*/
|
|
87
|
-
explain?: (
|
|
92
|
+
explain?: (
|
|
93
|
+
directives: TDirective[],
|
|
88
94
|
request: Context & TExtension,
|
|
89
|
-
introspection: Introspection
|
|
95
|
+
introspection: Introspection
|
|
96
|
+
) => Introspection | null | Promise<Introspection | null>
|
|
90
97
|
|
|
91
98
|
/** Call-scoped, on the message that call produced. */
|
|
92
|
-
settle?: (
|
|
99
|
+
settle?: (
|
|
100
|
+
directives: TDirective[],
|
|
93
101
|
request: Context & TExtension,
|
|
94
|
-
response: OutgoingMessage
|
|
102
|
+
response: OutgoingMessage
|
|
103
|
+
) => void | Promise<void>
|
|
95
104
|
|
|
96
105
|
/**
|
|
97
106
|
* Request-scoped, on the message going back — the counterpart of `preflight`, and
|
|
98
107
|
* likewise without directives. A reply the whole request carries, such as a re-issued
|
|
99
108
|
* credential, is written here rather than by a call that would not own it.
|
|
100
109
|
*/
|
|
101
|
-
depart?: (
|
|
102
|
-
|
|
110
|
+
depart?: (
|
|
111
|
+
request: Context & TExtension,
|
|
112
|
+
response: OutgoingMessage
|
|
113
|
+
) => void | Promise<void>
|
|
103
114
|
|
|
104
115
|
dispose?: (directives: TDirective[]) => void
|
|
105
116
|
}
|
package/source/RTD/Endpoint.ts
CHANGED
|
@@ -5,7 +5,10 @@ import type * as RTD from './index.js'
|
|
|
5
5
|
import type { Introspection } from '../Introspection.js'
|
|
6
6
|
|
|
7
7
|
export interface Endpoint {
|
|
8
|
-
call: (
|
|
8
|
+
call: (
|
|
9
|
+
context: http.Context,
|
|
10
|
+
parameters: RTD.Parameter[]
|
|
11
|
+
) => Promise<http.OutgoingMessage>
|
|
9
12
|
|
|
10
13
|
explain: (parameters: RTD.Parameter[]) => Promise<Introspection>
|
|
11
14
|
|
package/source/RTD/Method.ts
CHANGED
|
@@ -9,7 +9,7 @@ export class Method {
|
|
|
9
9
|
public readonly endpoint: Endpoint | null
|
|
10
10
|
public readonly directives: Directives
|
|
11
11
|
|
|
12
|
-
public constructor
|
|
12
|
+
public constructor(endpoint: Endpoint | null, directives: Directives) {
|
|
13
13
|
this.endpoint = endpoint
|
|
14
14
|
this.directives = directives
|
|
15
15
|
}
|
|
@@ -19,17 +19,19 @@ export class Method {
|
|
|
19
19
|
* refuse this caller. A method of no endpoint — one a directive answers on its own —
|
|
20
20
|
* states nothing of its own, and its directives still have their say.
|
|
21
21
|
*/
|
|
22
|
-
public async explain
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
public async explain(
|
|
23
|
+
context: Context,
|
|
24
|
+
parameters: Parameter[]
|
|
25
|
+
): Promise<Introspection | null> {
|
|
26
|
+
const introspection =
|
|
27
|
+
this.endpoint === null ? {} : await this.endpoint.explain(parameters)
|
|
26
28
|
|
|
27
29
|
const described = await this.directives.explain(context, introspection)
|
|
28
30
|
|
|
29
31
|
return described === null ? null : order(described)
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
public async close
|
|
34
|
+
public async close(): Promise<void> {
|
|
33
35
|
await this.endpoint?.close()
|
|
34
36
|
}
|
|
35
37
|
}
|
package/source/RTD/Node.ts
CHANGED
|
@@ -13,7 +13,7 @@ export class Node {
|
|
|
13
13
|
private readonly protected: boolean
|
|
14
14
|
private routes: Route[]
|
|
15
15
|
|
|
16
|
-
public constructor
|
|
16
|
+
public constructor(routes: Route[], methods: Methods, properties: Properties) {
|
|
17
17
|
this.routes = routes
|
|
18
18
|
this.methods = methods
|
|
19
19
|
this.protected = properties.protected
|
|
@@ -24,13 +24,16 @@ export class Node {
|
|
|
24
24
|
this.sort()
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
public match
|
|
27
|
+
public match(fragments: string[], parameters: Parameter[] = []): Match | null {
|
|
28
|
+
// a route only pushes, so what a failed one added is cut off rather than the array copied
|
|
29
|
+
const mark = parameters.length
|
|
30
|
+
|
|
28
31
|
for (const route of this.routes) {
|
|
29
|
-
const
|
|
30
|
-
|
|
32
|
+
const match = route.match(fragments, parameters)
|
|
33
|
+
|
|
34
|
+
if (match !== null) return match
|
|
31
35
|
|
|
32
|
-
|
|
33
|
-
return match
|
|
36
|
+
parameters.length = mark
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
return null
|
|
@@ -40,7 +43,7 @@ export class Node {
|
|
|
40
43
|
* Returns the nodes the merged branch has landed on, so that its expiration
|
|
41
44
|
* can later be extended without rebuilding anything.
|
|
42
45
|
*/
|
|
43
|
-
public merge
|
|
46
|
+
public merge(node: Node): Node[] {
|
|
44
47
|
this.intermediate = node.intermediate
|
|
45
48
|
|
|
46
49
|
const nodes = this.protected ? this.append(node) : this.replace(node)
|
|
@@ -50,9 +53,8 @@ export class Node {
|
|
|
50
53
|
return nodes
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
public touch
|
|
54
|
-
if (!this.protected)
|
|
55
|
-
this.expiration = expiration
|
|
56
|
+
public touch(expiration: number): void {
|
|
57
|
+
if (!this.protected) this.expiration = expiration
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
/**
|
|
@@ -62,33 +64,34 @@ export class Node {
|
|
|
62
64
|
* answers at the same place and is reached instead. The trunk is the exception `match`
|
|
63
65
|
* makes for it — `'/'` answers the trunk itself, whatever it holds.
|
|
64
66
|
*/
|
|
65
|
-
public *
|
|
67
|
+
public *walk(segments: Segment[], trunk = false): Generator<Mount> {
|
|
66
68
|
if (trunk || !this.intermediate)
|
|
67
69
|
for (const [verb, method] of Object.entries(this.methods))
|
|
68
70
|
yield { segments, verb, method }
|
|
69
71
|
|
|
70
|
-
for (const route of this.routes)
|
|
71
|
-
yield * route.walk(segments)
|
|
72
|
+
for (const route of this.routes) yield* route.walk(segments)
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
/** Every method of this node that this caller may reach, in the order they were declared. */
|
|
75
|
-
public async explain
|
|
76
|
-
|
|
76
|
+
public async explain(
|
|
77
|
+
context: Context,
|
|
78
|
+
parameters: Parameter[]
|
|
79
|
+
): Promise<Record<string, Introspection>> {
|
|
77
80
|
const entries = Object.entries(this.methods)
|
|
78
81
|
|
|
79
|
-
const explained = await Promise.all(
|
|
80
|
-
.map(async ([, method]) => await method.explain(context, parameters))
|
|
82
|
+
const explained = await Promise.all(
|
|
83
|
+
entries.map(async ([, method]) => await method.explain(context, parameters))
|
|
84
|
+
)
|
|
81
85
|
|
|
82
86
|
const methods: Record<string, Introspection> = {}
|
|
83
87
|
|
|
84
88
|
for (let i = 0; i < entries.length; i++)
|
|
85
|
-
if (explained[i] !== null)
|
|
86
|
-
methods[entries[i][0]] = explained[i]!
|
|
89
|
+
if (explained[i] !== null) methods[entries[i][0]] = explained[i]!
|
|
87
90
|
|
|
88
91
|
return methods
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
private replace
|
|
94
|
+
private replace(node: Node): Node[] {
|
|
92
95
|
const methods = Object.values(this.methods)
|
|
93
96
|
|
|
94
97
|
this.routes = node.routes
|
|
@@ -97,44 +100,39 @@ export class Node {
|
|
|
97
100
|
this.forward = node.forward
|
|
98
101
|
|
|
99
102
|
// race condition is really unlikely
|
|
100
|
-
for (const method of methods)
|
|
101
|
-
void method.close()
|
|
103
|
+
for (const method of methods) void method.close()
|
|
102
104
|
|
|
103
105
|
return this.nodes()
|
|
104
106
|
}
|
|
105
107
|
|
|
106
|
-
private append
|
|
108
|
+
private append(node: Node): Node[] {
|
|
107
109
|
const nodes: Node[] = []
|
|
108
110
|
|
|
109
|
-
for (const route of node.routes)
|
|
110
|
-
nodes.push(...this.route(route))
|
|
111
|
+
for (const route of node.routes) nodes.push(...this.route(route))
|
|
111
112
|
|
|
112
|
-
for (const [verb, method] of Object.entries(node.methods))
|
|
113
|
-
this.methods[verb] = method
|
|
113
|
+
for (const [verb, method] of Object.entries(node.methods)) this.methods[verb] = method
|
|
114
114
|
|
|
115
115
|
return nodes
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
private route
|
|
118
|
+
private route(candidate: Route): Node[] {
|
|
119
119
|
for (const route of this.routes)
|
|
120
|
-
if (candidate.equals(route))
|
|
121
|
-
return route.merge(candidate)
|
|
120
|
+
if (candidate.equals(route)) return route.merge(candidate)
|
|
122
121
|
|
|
123
122
|
this.routes.push(candidate)
|
|
124
123
|
|
|
125
124
|
return candidate.node.nodes()
|
|
126
125
|
}
|
|
127
126
|
|
|
128
|
-
private nodes
|
|
127
|
+
private nodes(): Node[] {
|
|
129
128
|
const nodes: Node[] = [this]
|
|
130
129
|
|
|
131
|
-
for (const route of this.routes)
|
|
132
|
-
nodes.push(...route.node.nodes())
|
|
130
|
+
for (const route of this.routes) nodes.push(...route.node.nodes())
|
|
133
131
|
|
|
134
132
|
return nodes
|
|
135
133
|
}
|
|
136
134
|
|
|
137
|
-
private sort
|
|
135
|
+
private sort(): void {
|
|
138
136
|
this.routes.sort((a, b) => {
|
|
139
137
|
return a.variables === b.variables
|
|
140
138
|
? b.segments.length - a.segments.length // routes with more segments should be matched first
|
package/source/RTD/Route.ts
CHANGED
|
@@ -9,7 +9,7 @@ export class Route {
|
|
|
9
9
|
public readonly node: Node
|
|
10
10
|
private readonly wildcard: boolean = false
|
|
11
11
|
|
|
12
|
-
public constructor
|
|
12
|
+
public constructor(segments: Segment[], node: Node) {
|
|
13
13
|
this.root = segments.length === 0
|
|
14
14
|
this.segments = segments
|
|
15
15
|
this.node = node
|
|
@@ -21,15 +21,13 @@ export class Route {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
public match
|
|
25
|
-
if (Date.now() >= this.node.expiration)
|
|
26
|
-
return null
|
|
24
|
+
public match(fragments: string[], parameters: Parameter[]): Match | null {
|
|
25
|
+
if (Date.now() >= this.node.expiration) return null
|
|
27
26
|
|
|
28
27
|
for (let i = 0; i < this.segments.length; i++) {
|
|
29
28
|
const segment = this.segments[i]
|
|
30
29
|
|
|
31
|
-
if (segment.fragment !== null && segment.fragment !== fragments[i])
|
|
32
|
-
return null
|
|
30
|
+
if (segment.fragment !== null && segment.fragment !== fragments[i]) return null
|
|
33
31
|
|
|
34
32
|
if (segment.fragment === null && segment.placeholder !== null)
|
|
35
33
|
parameters.push({ name: segment.placeholder, value: decode(fragments[i]) })
|
|
@@ -37,7 +35,10 @@ export class Route {
|
|
|
37
35
|
if (segment.fragment === null && segment.wildcard === true)
|
|
38
36
|
parameters.push({
|
|
39
37
|
name: '**',
|
|
40
|
-
value: fragments
|
|
38
|
+
value: fragments
|
|
39
|
+
.slice(this.segments.length - 1)
|
|
40
|
+
.map(decode)
|
|
41
|
+
.join('/')
|
|
41
42
|
})
|
|
42
43
|
}
|
|
43
44
|
|
|
@@ -45,34 +46,30 @@ export class Route {
|
|
|
45
46
|
|
|
46
47
|
if ((exact && !this.node.intermediate) || this.wildcard)
|
|
47
48
|
return { node: this.node, parameters }
|
|
48
|
-
else
|
|
49
|
-
return this.matchNested(fragments, parameters)
|
|
49
|
+
else return this.matchNested(fragments, parameters)
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
public *
|
|
52
|
+
public *walk(prefix: Segment[]): Generator<Mount> {
|
|
53
53
|
// an expired branch is not matched, so nothing under it is reachable to name
|
|
54
|
-
if (Date.now() >= this.node.expiration)
|
|
55
|
-
return
|
|
54
|
+
if (Date.now() >= this.node.expiration) return
|
|
56
55
|
|
|
57
|
-
yield
|
|
56
|
+
yield* this.node.walk(prefix.concat(this.segments))
|
|
58
57
|
}
|
|
59
58
|
|
|
60
|
-
public equals
|
|
61
|
-
if (route.segments.length !== this.segments.length)
|
|
62
|
-
return false
|
|
59
|
+
public equals(route: Route): boolean {
|
|
60
|
+
if (route.segments.length !== this.segments.length) return false
|
|
63
61
|
|
|
64
62
|
for (let i = 0; i < this.segments.length; i++)
|
|
65
|
-
if (this.segments[i].fragment !== route.segments[i].fragment)
|
|
66
|
-
return false
|
|
63
|
+
if (this.segments[i].fragment !== route.segments[i].fragment) return false
|
|
67
64
|
|
|
68
65
|
return true
|
|
69
66
|
}
|
|
70
67
|
|
|
71
|
-
public merge
|
|
68
|
+
public merge(route: Route): Node[] {
|
|
72
69
|
return this.node.merge(route.node)
|
|
73
70
|
}
|
|
74
71
|
|
|
75
|
-
private matchNested
|
|
72
|
+
private matchNested(fragments: string[], parameters: Parameter[]): Match | null {
|
|
76
73
|
fragments = fragments.slice(this.segments.length)
|
|
77
74
|
|
|
78
75
|
return this.node.match(fragments, parameters)
|
|
@@ -87,7 +84,7 @@ export class Route {
|
|
|
87
84
|
* An escape that decodes to nothing valid is left as it stands; refusing the route over it
|
|
88
85
|
* would answer `404` to a request whose only fault is its spelling.
|
|
89
86
|
*/
|
|
90
|
-
function decode
|
|
87
|
+
function decode(fragment: string): string {
|
|
91
88
|
try {
|
|
92
89
|
return decodeURIComponent(fragment)
|
|
93
90
|
} catch {
|