@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
|
@@ -3,7 +3,7 @@ properties:
|
|
|
3
3
|
type: string
|
|
4
4
|
resources:
|
|
5
5
|
# `null` deploys the service without any, which every deployment has to state one way
|
|
6
|
-
# or the other — see `migrations/
|
|
6
|
+
# or the other — see `migrations/262.md`.
|
|
7
7
|
type: object
|
|
8
8
|
nullable: true
|
|
9
9
|
properties:
|
|
@@ -76,7 +76,6 @@ properties:
|
|
|
76
76
|
registration:
|
|
77
77
|
type: string
|
|
78
78
|
enum: [open, closed]
|
|
79
|
-
default: closed
|
|
80
79
|
required:
|
|
81
80
|
- authorize
|
|
82
81
|
additionalProperties: false
|
|
@@ -109,7 +108,6 @@ properties:
|
|
|
109
108
|
anonymous:
|
|
110
109
|
description: Whether the endpoint answers without a credential
|
|
111
110
|
type: boolean
|
|
112
|
-
default: false
|
|
113
111
|
required:
|
|
114
112
|
- name
|
|
115
113
|
additionalProperties: false
|
package/schemas/method.cos.yaml
CHANGED
package/source/Branch.test.ts
CHANGED
|
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict'
|
|
|
4
4
|
import { decide } from './Branch.js'
|
|
5
5
|
import type { Branch, Exposed } from './Branch.js'
|
|
6
6
|
|
|
7
|
-
function branch
|
|
7
|
+
function branch(version: string, timestamp: number): Branch {
|
|
8
8
|
return {
|
|
9
9
|
namespace: 'default',
|
|
10
10
|
component: 'one',
|
|
@@ -15,7 +15,7 @@ function branch (version: string, timestamp: number): Branch {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
function exposed
|
|
18
|
+
function exposed(version: string, timestamp: number): Exposed {
|
|
19
19
|
return { version, timestamp, nodes: [] }
|
|
20
20
|
}
|
|
21
21
|
|
package/source/Branch.ts
CHANGED
|
@@ -33,12 +33,10 @@ export interface Exposed {
|
|
|
33
33
|
* - `superseded`: it came from a tenant that started before the one exposed now
|
|
34
34
|
* - `merge`: everything else
|
|
35
35
|
*/
|
|
36
|
-
export function decide
|
|
37
|
-
if (exposed.version === branch.version)
|
|
38
|
-
return 'refresh'
|
|
36
|
+
export function decide(exposed: Exposed, branch: Branch): Decision {
|
|
37
|
+
if (exposed.version === branch.version) return 'refresh'
|
|
39
38
|
|
|
40
|
-
if (branch.timestamp < exposed.timestamp)
|
|
41
|
-
return 'superseded'
|
|
39
|
+
if (branch.timestamp < exposed.timestamp) return 'superseded'
|
|
42
40
|
|
|
43
41
|
return 'merge'
|
|
44
42
|
}
|
package/source/Composition.ts
CHANGED
|
@@ -6,12 +6,12 @@ import { type Host } from './Factory.js'
|
|
|
6
6
|
export class Composition extends Connector {
|
|
7
7
|
private readonly host: Host
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(host: Host) {
|
|
10
10
|
super()
|
|
11
11
|
this.host = host
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
protected override async open
|
|
14
|
+
protected override async open(): Promise<void> {
|
|
15
15
|
const paths = find()
|
|
16
16
|
const composition = await this.host.composition(paths)
|
|
17
17
|
|
|
@@ -21,17 +21,17 @@ export class Composition extends Connector {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
function find
|
|
24
|
+
function find(): string[] {
|
|
25
25
|
return entries().map((entry) => resolve(ROOT, entry.name))
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
function entries
|
|
28
|
+
function entries(): Dirent[] {
|
|
29
29
|
const entries = readdirSync(ROOT, { withFileTypes: true })
|
|
30
30
|
|
|
31
31
|
return entries.filter((entry) => entry.isDirectory())
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export function components
|
|
34
|
+
export function components(): Components {
|
|
35
35
|
const labels: string[] = []
|
|
36
36
|
const paths: string[] = []
|
|
37
37
|
|
package/source/Directive.test.ts
CHANGED
|
@@ -16,7 +16,10 @@ const families: Array<DirectiveFamily> = [
|
|
|
16
16
|
mandatory: true,
|
|
17
17
|
create: mock.fn((_0: any, _1: any, _2: any) => generate() as any),
|
|
18
18
|
arrange: mock.fn(),
|
|
19
|
-
precall: mock.fn(() => {
|
|
19
|
+
precall: mock.fn(() => {
|
|
20
|
+
sequence.push('foo')
|
|
21
|
+
return null
|
|
22
|
+
}),
|
|
20
23
|
settle: mock.fn(),
|
|
21
24
|
dispose: mock.fn()
|
|
22
25
|
},
|
|
@@ -25,7 +28,10 @@ const families: Array<DirectiveFamily> = [
|
|
|
25
28
|
mandatory: true,
|
|
26
29
|
create: mock.fn((_0: any, _1: any, _2: any) => generate() as any),
|
|
27
30
|
arrange: mock.fn(),
|
|
28
|
-
precall: mock.fn(() => {
|
|
31
|
+
precall: mock.fn(() => {
|
|
32
|
+
sequence.push('qux')
|
|
33
|
+
return null
|
|
34
|
+
}),
|
|
29
35
|
settle: mock.fn(),
|
|
30
36
|
dispose: mock.fn()
|
|
31
37
|
},
|
|
@@ -34,7 +40,10 @@ const families: Array<DirectiveFamily> = [
|
|
|
34
40
|
mandatory: false,
|
|
35
41
|
create: mock.fn((_0: string, _1: any, _2: any) => generate() as any),
|
|
36
42
|
arrange: mock.fn(),
|
|
37
|
-
precall: mock.fn(() => {
|
|
43
|
+
precall: mock.fn(() => {
|
|
44
|
+
sequence.push('bar')
|
|
45
|
+
return null
|
|
46
|
+
}),
|
|
38
47
|
settle: mock.fn(),
|
|
39
48
|
dispose: mock.fn()
|
|
40
49
|
}
|
|
@@ -49,11 +58,18 @@ beforeEach(() => {
|
|
|
49
58
|
for (const family of families) {
|
|
50
59
|
assert.ok(family.precall !== undefined)
|
|
51
60
|
|
|
52
|
-
family.precall.mock.mockImplementation(() => {
|
|
61
|
+
family.precall.mock.mockImplementation(() => {
|
|
62
|
+
sequence.push(family.name)
|
|
63
|
+
return null
|
|
64
|
+
})
|
|
53
65
|
}
|
|
54
66
|
|
|
55
|
-
factory = new DirectivesFactory(
|
|
56
|
-
|
|
67
|
+
factory = new DirectivesFactory(
|
|
68
|
+
families,
|
|
69
|
+
{} as unknown as Remotes,
|
|
70
|
+
{} as unknown as Host,
|
|
71
|
+
{ authorities: {} }
|
|
72
|
+
)
|
|
57
73
|
})
|
|
58
74
|
|
|
59
75
|
it('should create directive', async () => {
|
|
@@ -95,8 +111,11 @@ it('should throw error if directive family is not found', async () => {
|
|
|
95
111
|
value: generate()
|
|
96
112
|
}
|
|
97
113
|
|
|
98
|
-
assert.throws(
|
|
99
|
-
(
|
|
114
|
+
assert.throws(
|
|
115
|
+
() => factory.create([declaration]),
|
|
116
|
+
(error: Error) =>
|
|
117
|
+
error.message.includes(`Directive family '${declaration.family}' is not found`)
|
|
118
|
+
)
|
|
100
119
|
})
|
|
101
120
|
|
|
102
121
|
it('should apply directive', async () => {
|
|
@@ -129,7 +148,7 @@ it('should apply mandatory families', async () => {
|
|
|
129
148
|
|
|
130
149
|
describe('order', () => {
|
|
131
150
|
// the order the families actually ran, as each precall recorded it
|
|
132
|
-
function order
|
|
151
|
+
function order(): string[] {
|
|
133
152
|
return sequence
|
|
134
153
|
}
|
|
135
154
|
|
|
@@ -145,18 +164,17 @@ describe('order', () => {
|
|
|
145
164
|
assert.deepStrictEqual(order(), ['foo', 'qux'])
|
|
146
165
|
})
|
|
147
166
|
|
|
148
|
-
it('should run a mandatory family before a declared one it is not declared with',
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
])
|
|
167
|
+
it('should run a mandatory family before a declared one it is not declared with', async () => {
|
|
168
|
+
// only `qux` is declared: `foo` still has to run first, not merely first of
|
|
169
|
+
// whatever had no declarations
|
|
170
|
+
const directives = factory.create([
|
|
171
|
+
{ family: 'qux', name: generate(), value: generate() }
|
|
172
|
+
])
|
|
155
173
|
|
|
156
|
-
|
|
174
|
+
await directives.precall(generate() as unknown as Context, [])
|
|
157
175
|
|
|
158
|
-
|
|
159
|
-
|
|
176
|
+
assert.deepStrictEqual(order(), ['foo', 'qux'])
|
|
177
|
+
})
|
|
160
178
|
|
|
161
179
|
it('should run mandatory families before the rest', async () => {
|
|
162
180
|
const directives = factory.create([
|
|
@@ -170,7 +188,7 @@ describe('order', () => {
|
|
|
170
188
|
})
|
|
171
189
|
})
|
|
172
190
|
|
|
173
|
-
function resetCalls
|
|
191
|
+
function resetCalls(target = [families], seen = new Set()) {
|
|
174
192
|
if (target === null || typeof target !== 'object' || seen.has(target)) return
|
|
175
193
|
|
|
176
194
|
seen.add(target)
|
package/source/Directive.ts
CHANGED
|
@@ -12,7 +12,7 @@ export class Directives implements RTD.Directives {
|
|
|
12
12
|
/** the span of a stage depends only on the set, so it is built once per route */
|
|
13
13
|
private readonly spans: Spans[]
|
|
14
14
|
|
|
15
|
-
public constructor
|
|
15
|
+
public constructor(sets: RTD.DirectiveSet[]) {
|
|
16
16
|
this.sets = sets
|
|
17
17
|
this.spans = sets.map((set) => ({
|
|
18
18
|
precall: options(set, 'precall'),
|
|
@@ -21,29 +21,29 @@ export class Directives implements RTD.Directives {
|
|
|
21
21
|
}))
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
public declared<T>
|
|
25
|
-
return this.sets.find((set) => set.family.name === family)?.directives as
|
|
24
|
+
public declared<T>(family: string): T[] | undefined {
|
|
25
|
+
return this.sets.find((set) => set.family.name === family)?.directives as
|
|
26
|
+
| T[]
|
|
27
|
+
| undefined
|
|
26
28
|
}
|
|
27
29
|
|
|
28
|
-
public async precall
|
|
30
|
+
public async precall(context: Context, parameters: RTD.Parameter[]): Promise<Output> {
|
|
29
31
|
let output = null
|
|
30
32
|
|
|
31
33
|
for (let i = 0; i < this.sets.length; i++) {
|
|
32
34
|
const set = this.sets[i]
|
|
33
35
|
|
|
34
|
-
if (set.family.precall === undefined)
|
|
35
|
-
continue
|
|
36
|
+
if (set.family.precall === undefined) continue
|
|
36
37
|
|
|
37
|
-
const out = await console.span(
|
|
38
|
-
|
|
38
|
+
const out = await console.span(
|
|
39
|
+
this.spans[i].precall,
|
|
40
|
+
async () => await set.family.precall!(set.directives, context, parameters)
|
|
41
|
+
)
|
|
39
42
|
|
|
40
|
-
if (out === null)
|
|
41
|
-
continue
|
|
43
|
+
if (out === null) continue
|
|
42
44
|
|
|
43
|
-
if (output !== null)
|
|
44
|
-
|
|
45
|
-
else
|
|
46
|
-
output = out
|
|
45
|
+
if (output !== null) throw new Error('Multiple precall directives responded')
|
|
46
|
+
else output = out
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
return output
|
|
@@ -54,21 +54,23 @@ export class Directives implements RTD.Directives {
|
|
|
54
54
|
* what the one before it returned, and the first to refuse ends it: a method this caller
|
|
55
55
|
* cannot reach is not described at all.
|
|
56
56
|
*/
|
|
57
|
-
public async explain
|
|
58
|
-
|
|
57
|
+
public async explain(
|
|
58
|
+
context: Context,
|
|
59
|
+
introspection: Introspection
|
|
60
|
+
): Promise<Introspection | null> {
|
|
59
61
|
let described: Introspection = introspection
|
|
60
62
|
|
|
61
63
|
for (let i = 0; i < this.sets.length; i++) {
|
|
62
64
|
const set = this.sets[i]
|
|
63
65
|
|
|
64
|
-
if (set.family.explain === undefined)
|
|
65
|
-
continue
|
|
66
|
+
if (set.family.explain === undefined) continue
|
|
66
67
|
|
|
67
|
-
const next = await console.span(
|
|
68
|
-
|
|
68
|
+
const next = await console.span(
|
|
69
|
+
this.spans[i].explain,
|
|
70
|
+
async () => await set.family.explain!(set.directives, context, described)
|
|
71
|
+
)
|
|
69
72
|
|
|
70
|
-
if (next === null)
|
|
71
|
-
return null
|
|
73
|
+
if (next === null) return null
|
|
72
74
|
|
|
73
75
|
described = next
|
|
74
76
|
}
|
|
@@ -76,19 +78,20 @@ export class Directives implements RTD.Directives {
|
|
|
76
78
|
return described
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
public async settle
|
|
81
|
+
public async settle(context: Context, response: OutgoingMessage): Promise<void> {
|
|
80
82
|
for (let i = 0; i < this.sets.length; i++) {
|
|
81
83
|
const set = this.sets[i]
|
|
82
84
|
|
|
83
85
|
if (set.family.settle !== undefined)
|
|
84
|
-
await console.span(
|
|
85
|
-
|
|
86
|
+
await console.span(
|
|
87
|
+
this.spans[i].settle,
|
|
88
|
+
async () => await set.family.settle!(set.directives, context, response)
|
|
89
|
+
)
|
|
86
90
|
}
|
|
87
91
|
}
|
|
88
92
|
|
|
89
|
-
public dispose
|
|
90
|
-
for (const set of this.sets)
|
|
91
|
-
set.family.dispose?.(set.directives)
|
|
93
|
+
public dispose(): void {
|
|
94
|
+
for (const set of this.sets) set.family.dispose?.(set.directives)
|
|
92
95
|
}
|
|
93
96
|
}
|
|
94
97
|
|
|
@@ -102,14 +105,17 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
|
102
105
|
private readonly stages: Stage[] = []
|
|
103
106
|
|
|
104
107
|
// eslint-disable-next-line max-params
|
|
105
|
-
public constructor
|
|
106
|
-
|
|
108
|
+
public constructor(
|
|
109
|
+
families: RTD.DirectiveFamily[],
|
|
110
|
+
remotes: Remotes,
|
|
111
|
+
host: Host,
|
|
112
|
+
options: Options
|
|
113
|
+
) {
|
|
107
114
|
for (const family of families) {
|
|
108
115
|
family.mount?.(host, options)
|
|
109
116
|
this.families[family.name] = family
|
|
110
117
|
|
|
111
|
-
if (family.mandatory)
|
|
112
|
-
this.mandatory.push(family.name)
|
|
118
|
+
if (family.mandatory) this.mandatory.push(family.name)
|
|
113
119
|
|
|
114
120
|
this.stages.push({
|
|
115
121
|
family,
|
|
@@ -125,22 +131,24 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
|
125
131
|
* Request-scoped, before anything is routed, so no directives are passed: a family
|
|
126
132
|
* answers here only for what it does on its own behalf.
|
|
127
133
|
*/
|
|
128
|
-
public async preflight
|
|
134
|
+
public async preflight(context: Context): Promise<void> {
|
|
129
135
|
for (const stage of this.stages)
|
|
130
136
|
if (stage.family.preflight !== undefined)
|
|
131
|
-
await console.span(stage.preflight,
|
|
132
|
-
|
|
137
|
+
await console.span(stage.preflight, async () => {
|
|
138
|
+
await stage.family.preflight!(context)
|
|
139
|
+
})
|
|
133
140
|
}
|
|
134
141
|
|
|
135
142
|
/** Request-scoped, on the message going back. */
|
|
136
|
-
public async depart
|
|
143
|
+
public async depart(context: Context, response: OutgoingMessage): Promise<void> {
|
|
137
144
|
for (const stage of this.stages)
|
|
138
145
|
if (stage.family.depart !== undefined)
|
|
139
|
-
await console.span(stage.depart,
|
|
140
|
-
|
|
146
|
+
await console.span(stage.depart, async () => {
|
|
147
|
+
await stage.family.depart!(context, response)
|
|
148
|
+
})
|
|
141
149
|
}
|
|
142
150
|
|
|
143
|
-
public create
|
|
151
|
+
public create(declarations: RTD.syntax.Directive[], route: string = ''): Directives {
|
|
144
152
|
const groups: Record<string, any> = {}
|
|
145
153
|
const mandatory = new Set(this.mandatory)
|
|
146
154
|
|
|
@@ -152,7 +160,12 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
|
152
160
|
if (family === undefined)
|
|
153
161
|
throw new Error(`Directive family '${declaration.family}' is not found`)
|
|
154
162
|
|
|
155
|
-
const directive = family.create(
|
|
163
|
+
const directive = family.create(
|
|
164
|
+
declaration.name,
|
|
165
|
+
declaration.value,
|
|
166
|
+
this.remotes,
|
|
167
|
+
route
|
|
168
|
+
)
|
|
156
169
|
|
|
157
170
|
groups[family.name] ??= []
|
|
158
171
|
groups[family.name].push(directive)
|
|
@@ -184,8 +197,7 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
|
184
197
|
sets.sort((a, b) => this.rank(a.family.name) - this.rank(b.family.name))
|
|
185
198
|
|
|
186
199
|
// whatever order a family needs among its own directives is fixed here, not per request
|
|
187
|
-
for (const set of sets)
|
|
188
|
-
set.family.arrange?.(set.directives)
|
|
200
|
+
for (const set of sets) set.family.arrange?.(set.directives)
|
|
189
201
|
|
|
190
202
|
const directives = new Directives(sets)
|
|
191
203
|
|
|
@@ -194,20 +206,22 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
|
194
206
|
return directives
|
|
195
207
|
}
|
|
196
208
|
|
|
197
|
-
public dispose
|
|
198
|
-
for (const directives of this.instances)
|
|
199
|
-
directives.dispose()
|
|
209
|
+
public dispose(): void {
|
|
210
|
+
for (const directives of this.instances) directives.dispose()
|
|
200
211
|
}
|
|
201
212
|
|
|
202
213
|
/** Mandatory families first, in their own order; everything else keeps its own. */
|
|
203
|
-
private rank
|
|
214
|
+
private rank(family: string): number {
|
|
204
215
|
const index = this.mandatory.indexOf(family)
|
|
205
216
|
|
|
206
217
|
return index === -1 ? this.mandatory.length : index
|
|
207
218
|
}
|
|
208
219
|
}
|
|
209
220
|
|
|
210
|
-
function options
|
|
221
|
+
function options(
|
|
222
|
+
set: RTD.DirectiveSet,
|
|
223
|
+
stage: 'precall' | 'settle' | 'explain'
|
|
224
|
+
): SpanOptions {
|
|
211
225
|
const options: SpanOptions = { name: `${set.family.name} ${stage}` }
|
|
212
226
|
|
|
213
227
|
if (set.names !== undefined && set.names.length > 0)
|
package/source/Endpoint.test.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type { Parameter } from './RTD/index.js'
|
|
|
10
10
|
* What `Remote.explain` answers is the contract's own object, the same one every time and
|
|
11
11
|
* on every route that mounts the endpoint — which is what this stands in for.
|
|
12
12
|
*/
|
|
13
|
-
function remote
|
|
13
|
+
function remote(): Promise<Remote> {
|
|
14
14
|
const explanation = {
|
|
15
15
|
input: {
|
|
16
16
|
type: 'object',
|
package/source/Endpoint.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { Readable } from 'node:stream'
|
|
2
|
-
import { console } from 'openspan'
|
|
3
2
|
import { Mapping } from './Mapping.js'
|
|
4
3
|
import { take } from './Introspection.js'
|
|
5
|
-
import {
|
|
4
|
+
import { parse } from './directives/cache/etag.js'
|
|
6
5
|
import * as http from './HTTP/index.js'
|
|
7
6
|
import type { Introspection, Schema } from './Introspection.js'
|
|
8
7
|
import type { Remote } from '@toa.io/core'
|
|
@@ -19,56 +18,41 @@ export class Endpoint implements RTD.Endpoint {
|
|
|
19
18
|
/** What the operation says, with what the route takes already split out of it. */
|
|
20
19
|
private introspection: Introspection | null = null
|
|
21
20
|
|
|
22
|
-
public constructor
|
|
21
|
+
public constructor(endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
|
|
23
22
|
this.endpoint = endpoint
|
|
24
23
|
this.mapping = mapping
|
|
25
24
|
this.discovery = discovery
|
|
26
25
|
}
|
|
27
26
|
|
|
28
|
-
public async call
|
|
27
|
+
public async call(
|
|
28
|
+
context: http.Context,
|
|
29
|
+
parameters: RTD.Parameter[]
|
|
30
|
+
): Promise<http.OutgoingMessage> {
|
|
29
31
|
const body = await context.body()
|
|
30
32
|
const query = this.query(context)
|
|
31
33
|
const request = this.mapping.fit(body, query, parameters)
|
|
32
34
|
|
|
33
35
|
this.remote ??= await this.discovery
|
|
34
36
|
|
|
35
|
-
const endpoint = this.remote.locator.id + '.' + this.endpoint
|
|
36
|
-
|
|
37
|
-
console.debug('Calling operation', { endpoint, request: redact(request) })
|
|
38
|
-
|
|
39
37
|
const reply = await this.remote.invoke(this.endpoint, request)
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
{ endpoint, reply: reply instanceof Readable ? '[Readable stream]' : redact(reply) })
|
|
43
|
-
|
|
44
|
-
if (reply instanceof Error)
|
|
45
|
-
throw new http.UnprocessableEntity(reply)
|
|
39
|
+
if (reply instanceof Error) throw new http.UnprocessableEntity(reply)
|
|
46
40
|
|
|
47
|
-
const message: http.OutgoingMessage = {}
|
|
41
|
+
const message: http.OutgoingMessage = { body: reply }
|
|
48
42
|
|
|
49
|
-
//
|
|
50
|
-
if (reply !== null && reply
|
|
51
|
-
|
|
43
|
+
// what the reply carries for a cache to validate by; the `cache` family sets the headers
|
|
44
|
+
if (typeof reply === 'object' && reply !== null && !(reply instanceof Readable)) {
|
|
45
|
+
if ('VERSION' in reply) message.version = reply.VERSION
|
|
52
46
|
|
|
53
|
-
|
|
54
|
-
return message
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// last-modified
|
|
58
|
-
if (typeof reply === 'object' && reply !== null && ('_updated' in reply || '_created' in reply)) {
|
|
59
|
-
const timestamp: string = reply._updated ?? reply._created
|
|
60
|
-
const date = new Date(timestamp)
|
|
47
|
+
const modified = reply.UPDATED ?? reply.CREATED
|
|
61
48
|
|
|
62
|
-
message.
|
|
63
|
-
message.headers.set('last-modified', date.toUTCString())
|
|
49
|
+
if (modified !== undefined) message.modified = modified
|
|
64
50
|
}
|
|
65
51
|
|
|
66
|
-
message.body = reply
|
|
67
|
-
|
|
68
52
|
return message
|
|
69
53
|
}
|
|
70
54
|
|
|
71
|
-
public async explain
|
|
55
|
+
public async explain(parameters: RTD.Parameter[]): Promise<Introspection> {
|
|
72
56
|
this.introspection ??= await this.introspect(parameters)
|
|
73
57
|
|
|
74
58
|
// what a directive narrows is this caller's answer, not the next caller's
|
|
@@ -81,7 +65,7 @@ export class Endpoint implements RTD.Endpoint {
|
|
|
81
65
|
* share one remote — so the copy is what keeps the second from describing what the first
|
|
82
66
|
* took away.
|
|
83
67
|
*/
|
|
84
|
-
private async introspect
|
|
68
|
+
private async introspect(parameters: RTD.Parameter[]): Promise<Introspection> {
|
|
85
69
|
this.remote ??= await this.discovery
|
|
86
70
|
|
|
87
71
|
const operation = structuredClone(await this.remote.explain(this.endpoint))
|
|
@@ -97,8 +81,7 @@ export class Endpoint implements RTD.Endpoint {
|
|
|
97
81
|
for (const parameter of parameters) {
|
|
98
82
|
const schema = take(operation, parameter.name)
|
|
99
83
|
|
|
100
|
-
if (schema === undefined)
|
|
101
|
-
continue
|
|
84
|
+
if (schema === undefined) continue
|
|
102
85
|
|
|
103
86
|
route ??= {}
|
|
104
87
|
route[parameter.name] = schema
|
|
@@ -107,80 +90,34 @@ export class Endpoint implements RTD.Endpoint {
|
|
|
107
90
|
const query = this.mapping.explain(operation)
|
|
108
91
|
const introspection: Introspection = {}
|
|
109
92
|
|
|
110
|
-
if (route !== null)
|
|
111
|
-
introspection.route = route
|
|
93
|
+
if (route !== null) introspection.route = route
|
|
112
94
|
|
|
113
|
-
if (query !== null)
|
|
114
|
-
introspection.query = query
|
|
95
|
+
if (query !== null) introspection.query = query
|
|
115
96
|
|
|
116
97
|
Object.assign(introspection, operation)
|
|
117
98
|
|
|
118
99
|
return introspection
|
|
119
100
|
}
|
|
120
101
|
|
|
121
|
-
public async close
|
|
102
|
+
public async close(): Promise<void> {
|
|
122
103
|
this.remote ??= await this.discovery
|
|
123
104
|
|
|
124
105
|
await this.remote.disconnect(INTERRUPT)
|
|
125
106
|
}
|
|
126
107
|
|
|
127
|
-
private
|
|
128
|
-
message.headers ??= new Headers()
|
|
129
|
-
|
|
130
|
-
if (typeof reply === 'object' && reply !== null && '_version' in reply) {
|
|
131
|
-
const version = reply._version as number
|
|
132
|
-
const matched = etag === undefined ? null : this.matchVersion(etag)
|
|
133
|
-
|
|
134
|
-
if (etag !== undefined && matched !== null && version === matched) {
|
|
135
|
-
message.status = 304
|
|
136
|
-
message.headers.set('etag', etag)
|
|
137
|
-
|
|
138
|
-
return true
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
message.headers.set('etag', `"${version.toString()}"`)
|
|
142
|
-
|
|
143
|
-
return false
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (reply instanceof Readable)
|
|
147
|
-
return false
|
|
148
|
-
|
|
149
|
-
/*
|
|
150
|
-
* A reply that carries no version is tagged with a hash of its body. The body is
|
|
151
|
-
* serialized anyway when the response is written, so the tag is computed from what
|
|
152
|
-
* is actually sent rather than from a second serialization of the reply — which
|
|
153
|
-
* makes it specific to the negotiated representation, hence `vary: accept`.
|
|
154
|
-
*/
|
|
155
|
-
message.etag = true
|
|
156
|
-
|
|
157
|
-
return false
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private query (context: http.Context): http.Query {
|
|
108
|
+
private query(context: http.Context): http.Query {
|
|
161
109
|
const query: http.Query = Object.fromEntries(context.url.searchParams)
|
|
162
110
|
const etag = context.request.headers['if-match']
|
|
163
111
|
|
|
164
|
-
if (etag !== undefined && this.mapping.queryable)
|
|
165
|
-
query.version = this.version(etag)
|
|
112
|
+
if (etag !== undefined && this.mapping.queryable) query.version = this.version(etag)
|
|
166
113
|
|
|
167
114
|
return query
|
|
168
115
|
}
|
|
169
116
|
|
|
170
|
-
private
|
|
171
|
-
const
|
|
117
|
+
private version(etag: string): number {
|
|
118
|
+
const version = parse(etag)
|
|
172
119
|
|
|
173
|
-
if (
|
|
174
|
-
return null
|
|
175
|
-
|
|
176
|
-
return Number.parseInt(match.groups!.version)
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
private version (etag: string): number {
|
|
180
|
-
const version = this.matchVersion(etag)
|
|
181
|
-
|
|
182
|
-
if (version === null)
|
|
183
|
-
throw new http.BadRequest('Invalid ETag')
|
|
120
|
+
if (version === null) throw new http.BadRequest('Invalid ETag')
|
|
184
121
|
|
|
185
122
|
return version
|
|
186
123
|
}
|
|
@@ -189,15 +126,15 @@ export class Endpoint implements RTD.Endpoint {
|
|
|
189
126
|
export class EndpointsFactory implements RTD.EndpointsFactory {
|
|
190
127
|
private readonly remotes: Remotes
|
|
191
128
|
|
|
192
|
-
public constructor
|
|
129
|
+
public constructor(remotes: Remotes) {
|
|
193
130
|
this.remotes = remotes
|
|
194
131
|
}
|
|
195
132
|
|
|
196
|
-
public create
|
|
133
|
+
public create(method: RTD.syntax.Method, context: Context): Endpoint {
|
|
197
134
|
if (method.mapping === undefined)
|
|
198
135
|
throw new Error('Cannot create Endpoint without mapping')
|
|
199
136
|
|
|
200
|
-
const mapping = Mapping.create(method.mapping.query)
|
|
137
|
+
const mapping = Mapping.create(method.mapping.query, method.mapping.paged)
|
|
201
138
|
|
|
202
139
|
const branch = context.extension
|
|
203
140
|
|
|
@@ -213,6 +150,4 @@ export class EndpointsFactory implements RTD.EndpointsFactory {
|
|
|
213
150
|
}
|
|
214
151
|
}
|
|
215
152
|
|
|
216
|
-
const ETAG = /^(W\/)?"(?<version>\d{1,32})"$/
|
|
217
|
-
|
|
218
153
|
const INTERRUPT = true
|