@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
|
@@ -3,18 +3,27 @@ import assert from 'node:assert/strict'
|
|
|
3
3
|
|
|
4
4
|
import * as http from '../HTTP/index.js'
|
|
5
5
|
import {
|
|
6
|
-
FORBIDDEN,
|
|
6
|
+
FORBIDDEN,
|
|
7
|
+
INTERNAL,
|
|
8
|
+
INVALID_PARAMS,
|
|
9
|
+
METHOD_NOT_FOUND,
|
|
10
|
+
REFUSED,
|
|
11
|
+
of
|
|
7
12
|
} from './errors.js'
|
|
8
13
|
|
|
9
14
|
describe('of', () => {
|
|
10
15
|
it('should read a missing route as a missing method', () => {
|
|
11
|
-
assert.deepEqual(of(new http.NotFound('pots/_id/FETCH names no method')),
|
|
12
|
-
|
|
16
|
+
assert.deepEqual(of(new http.NotFound('pots/_id/FETCH names no method')), {
|
|
17
|
+
code: METHOD_NOT_FOUND,
|
|
18
|
+
message: 'pots/_id/FETCH names no method'
|
|
19
|
+
})
|
|
13
20
|
})
|
|
14
21
|
|
|
15
22
|
it('should read a verb the node does not declare as a missing method', () => {
|
|
16
|
-
assert.deepEqual(of(new http.MethodNotAllowed()),
|
|
17
|
-
|
|
23
|
+
assert.deepEqual(of(new http.MethodNotAllowed()), {
|
|
24
|
+
code: METHOD_NOT_FOUND,
|
|
25
|
+
message: 'Method not found'
|
|
26
|
+
})
|
|
18
27
|
})
|
|
19
28
|
|
|
20
29
|
it('should read a refused authorization as forbidden', () => {
|
|
@@ -22,31 +31,47 @@ describe('of', () => {
|
|
|
22
31
|
})
|
|
23
32
|
|
|
24
33
|
it('should read a bad request as invalid params', () => {
|
|
25
|
-
assert.deepEqual(of(new http.BadRequest('Query limit must be between 1 and 100')),
|
|
26
|
-
|
|
34
|
+
assert.deepEqual(of(new http.BadRequest('Query limit must be between 1 and 100')), {
|
|
35
|
+
code: INVALID_PARAMS,
|
|
36
|
+
message: 'Query limit must be between 1 and 100'
|
|
37
|
+
})
|
|
27
38
|
})
|
|
28
39
|
|
|
29
40
|
it('should carry the code an operation refused with', () => {
|
|
30
|
-
const error = Object.assign(new Error(), {
|
|
41
|
+
const error = Object.assign(new Error(), {
|
|
42
|
+
code: 'WONT_CREATE',
|
|
43
|
+
message: 'Volume is out of range'
|
|
44
|
+
})
|
|
31
45
|
|
|
32
|
-
assert.deepEqual(of(new http.UnprocessableEntity(error)),
|
|
33
|
-
|
|
46
|
+
assert.deepEqual(of(new http.UnprocessableEntity(error)), {
|
|
47
|
+
code: REFUSED,
|
|
48
|
+
message: 'Volume is out of range',
|
|
49
|
+
data: { code: 'WONT_CREATE' }
|
|
50
|
+
})
|
|
34
51
|
})
|
|
35
52
|
|
|
36
53
|
it('should stand the code in for a message the operation did not declare', () => {
|
|
37
54
|
const error = Object.assign(new Error(), { code: 'WONT_CREATE' })
|
|
38
55
|
|
|
39
|
-
assert.deepEqual(of(new http.UnprocessableEntity(error)),
|
|
40
|
-
|
|
56
|
+
assert.deepEqual(of(new http.UnprocessableEntity(error)), {
|
|
57
|
+
code: REFUSED,
|
|
58
|
+
message: 'WONT_CREATE',
|
|
59
|
+
data: { code: 'WONT_CREATE' }
|
|
60
|
+
})
|
|
41
61
|
})
|
|
42
62
|
|
|
43
63
|
it('should say what any other client error was refused with', () => {
|
|
44
|
-
assert.deepEqual(of(new http.Conflict()),
|
|
45
|
-
|
|
64
|
+
assert.deepEqual(of(new http.Conflict()), {
|
|
65
|
+
code: REFUSED,
|
|
66
|
+
message: 'Refused',
|
|
67
|
+
data: { status: 409 }
|
|
68
|
+
})
|
|
46
69
|
})
|
|
47
70
|
|
|
48
71
|
it('should say nothing of what it did not mean to answer', () => {
|
|
49
|
-
assert.deepEqual(of(new Error('the connection dropped')),
|
|
50
|
-
|
|
72
|
+
assert.deepEqual(of(new Error('the connection dropped')), {
|
|
73
|
+
code: INTERNAL,
|
|
74
|
+
message: 'Internal error'
|
|
75
|
+
})
|
|
51
76
|
})
|
|
52
77
|
})
|
package/source/RPC/errors.ts
CHANGED
|
@@ -20,16 +20,15 @@ export const FORBIDDEN = -32000
|
|
|
20
20
|
export const REFUSED = -32001
|
|
21
21
|
export const BATCH_TOO_LARGE = -32002
|
|
22
22
|
|
|
23
|
-
export function failure
|
|
23
|
+
export function failure(code: number, message: string, data?: unknown): Failure {
|
|
24
24
|
const value: Failure = { code, message }
|
|
25
25
|
|
|
26
|
-
if (data !== undefined)
|
|
27
|
-
value.data = data
|
|
26
|
+
if (data !== undefined) value.data = data
|
|
28
27
|
|
|
29
28
|
return value
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
export function response
|
|
31
|
+
export function response(id: string | number | null, error: Failure): Response {
|
|
33
32
|
return { jsonrpc: VERSION, id, error }
|
|
34
33
|
}
|
|
35
34
|
|
|
@@ -39,9 +38,8 @@ export function response (id: string | number | null, error: Failure): Response
|
|
|
39
38
|
* The readable text is `body`, never `message`: `http.Exception` calls `super()` with no
|
|
40
39
|
* argument, so every one of them carries an empty `message`.
|
|
41
40
|
*/
|
|
42
|
-
export function of
|
|
43
|
-
if (exception instanceof http.UnprocessableEntity)
|
|
44
|
-
return refusal(exception)
|
|
41
|
+
export function of(exception: unknown): Failure {
|
|
42
|
+
if (exception instanceof http.UnprocessableEntity) return refusal(exception)
|
|
45
43
|
|
|
46
44
|
if (exception instanceof http.NotFound || exception instanceof http.MethodNotAllowed)
|
|
47
45
|
return failure(METHOD_NOT_FOUND, text(exception, 'Method not found'))
|
|
@@ -64,19 +62,20 @@ export function of (exception: unknown): Failure {
|
|
|
64
62
|
* reply contract states `{ code, message? }` — the message optional. The number says the
|
|
65
63
|
* operation refused; `data.code` says what it refused with, and is what a caller branches on.
|
|
66
64
|
*/
|
|
67
|
-
function refusal
|
|
65
|
+
function refusal(exception: http.UnprocessableEntity): Failure {
|
|
68
66
|
const body = exception.body
|
|
69
67
|
|
|
70
68
|
if (typeof body !== 'object' || body === null || typeof body.code !== 'string')
|
|
71
69
|
return failure(REFUSED, text(exception, 'Refused'))
|
|
72
70
|
|
|
73
71
|
const code = body.code as string
|
|
74
|
-
const message =
|
|
72
|
+
const message =
|
|
73
|
+
typeof body.message === 'string' && body.message !== '' ? body.message : code
|
|
75
74
|
|
|
76
75
|
return failure(REFUSED, message, { code })
|
|
77
76
|
}
|
|
78
77
|
|
|
79
|
-
function text
|
|
78
|
+
function text(exception: http.Exception, fallback: string): string {
|
|
80
79
|
return typeof exception.body === 'string' && exception.body !== ''
|
|
81
80
|
? exception.body
|
|
82
81
|
: fallback
|
package/source/RPC/names.test.ts
CHANGED
|
@@ -7,33 +7,47 @@ 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.GET', {}),
|
|
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._id.GET', { id: 'a1b2', title: 'Kettle' }),
|
|
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._user.pots._id.PATCH', { user: 'bob', id: 'a1b2' }),
|
|
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.__.GET', { '**': 'a/b/c' }),
|
|
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.GET.POST', {}),
|
|
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', () => {
|
|
@@ -81,8 +95,10 @@ describe('name', () => {
|
|
|
81
95
|
|
|
82
96
|
it('should mark a variable', () => {
|
|
83
97
|
assert.equal(name(segment('/pots/:id'), 'GET'), 'pots._id.GET')
|
|
84
|
-
assert.equal(
|
|
85
|
-
'identity
|
|
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', () => {
|
|
@@ -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
|
@@ -19,12 +19,11 @@ export interface Address {
|
|
|
19
19
|
variables: string[]
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
export function address
|
|
22
|
+
export function address(method: string, params: Params): Address {
|
|
23
23
|
const parts = method.split(SEPARATOR)
|
|
24
24
|
const verb = parts.pop()!
|
|
25
25
|
|
|
26
|
-
if (!verbs.has(verb))
|
|
27
|
-
throw new http.NotFound(`'${method}' names no method`)
|
|
26
|
+
if (!verbs.has(verb)) throw new http.NotFound(`'${method}' names no method`)
|
|
28
27
|
|
|
29
28
|
const variables: string[] = []
|
|
30
29
|
const fragments: string[] = []
|
|
@@ -66,13 +65,15 @@ export function address (method: string, params: Params): Address {
|
|
|
66
65
|
* What the call carries, as a request carries it: the path took its variables, `query` is
|
|
67
66
|
* the querystring, and the rest is the body.
|
|
68
67
|
*/
|
|
69
|
-
export function split
|
|
68
|
+
export function split(
|
|
69
|
+
params: Params,
|
|
70
|
+
variables: string[]
|
|
71
|
+
): { query?: Params; input?: Params } {
|
|
70
72
|
const input: Params = {}
|
|
71
73
|
let query: Params | undefined
|
|
72
74
|
|
|
73
75
|
for (const [key, value] of Object.entries(params)) {
|
|
74
|
-
if (variables.includes(key))
|
|
75
|
-
continue
|
|
76
|
+
if (variables.includes(key)) continue
|
|
76
77
|
|
|
77
78
|
if (key !== QUERY) {
|
|
78
79
|
input[key] = value
|
|
@@ -91,30 +92,27 @@ export function split (params: Params, variables: string[]): { query?: Params, i
|
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
/** The parameter a part reads, or nothing where the part is a literal segment. */
|
|
94
|
-
function parameter
|
|
95
|
-
if (part === TAIL)
|
|
96
|
-
return WILDCARD
|
|
95
|
+
function parameter(part: string): string | null {
|
|
96
|
+
if (part === TAIL) return WILDCARD
|
|
97
97
|
|
|
98
98
|
return part[0] === VARIABLE ? part.slice(1) : null
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/** A segment a name cannot spell is a segment no name has, so this one names nothing. */
|
|
102
|
-
function literal
|
|
103
|
-
if (!NAMEABLE.test(part))
|
|
104
|
-
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`)
|
|
105
104
|
|
|
106
105
|
return part
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
/** The name of a method on this route, or nothing where the route has none. */
|
|
110
|
-
export function name
|
|
109
|
+
export function name(segments: Segment[], verb: string): string | null {
|
|
111
110
|
const parts: string[] = []
|
|
112
111
|
|
|
113
112
|
for (const segment of segments) {
|
|
114
113
|
const part = component(segment)
|
|
115
114
|
|
|
116
|
-
if (part === null)
|
|
117
|
-
return null
|
|
115
|
+
if (part === null) return null
|
|
118
116
|
|
|
119
117
|
parts.push(part)
|
|
120
118
|
}
|
|
@@ -125,39 +123,34 @@ export function name (segments: Segment[], verb: string): string | null {
|
|
|
125
123
|
}
|
|
126
124
|
|
|
127
125
|
/** The segment that leaves a route unnameable, as it was declared, or nothing where none does. */
|
|
128
|
-
export function refusal
|
|
126
|
+
export function refusal(segments: Segment[]): string | null {
|
|
129
127
|
for (const segment of segments)
|
|
130
|
-
if (component(segment) === null)
|
|
131
|
-
return declared(segment)
|
|
128
|
+
if (component(segment) === null) return declared(segment)
|
|
132
129
|
|
|
133
130
|
return null
|
|
134
131
|
}
|
|
135
132
|
|
|
136
|
-
function component
|
|
133
|
+
function component(segment: Segment): string | null {
|
|
137
134
|
if (segment.fragment !== null)
|
|
138
135
|
return NAMEABLE.test(segment.fragment) ? segment.fragment : null
|
|
139
136
|
|
|
140
|
-
if (segment.wildcard === true)
|
|
141
|
-
return TAIL
|
|
137
|
+
if (segment.wildcard === true) return TAIL
|
|
142
138
|
|
|
143
139
|
// it stands for a segment the caller cannot name, so there is nothing to substitute
|
|
144
|
-
if (segment.placeholder === null)
|
|
145
|
-
return null
|
|
140
|
+
if (segment.placeholder === null) return null
|
|
146
141
|
|
|
147
142
|
return NAMEABLE.test(segment.placeholder) ? VARIABLE + segment.placeholder : null
|
|
148
143
|
}
|
|
149
144
|
|
|
150
145
|
/** The route as it was declared, which is how a message about it should read. */
|
|
151
|
-
export function template
|
|
146
|
+
export function template(segments: Segment[]): string {
|
|
152
147
|
return '/' + segments.map(declared).join('/')
|
|
153
148
|
}
|
|
154
149
|
|
|
155
|
-
function declared
|
|
156
|
-
if (segment.fragment !== null)
|
|
157
|
-
return segment.fragment
|
|
150
|
+
function declared(segment: Segment): string {
|
|
151
|
+
if (segment.fragment !== null) return segment.fragment
|
|
158
152
|
|
|
159
|
-
if (segment.wildcard === true)
|
|
160
|
-
return '**'
|
|
153
|
+
if (segment.wildcard === true) return '**'
|
|
161
154
|
|
|
162
155
|
return segment.placeholder === null ? '*' : ':' + segment.placeholder
|
|
163
156
|
}
|
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
|