@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
|
@@ -6,26 +6,26 @@ export class Scheme implements Directive {
|
|
|
6
6
|
private readonly scheme: string
|
|
7
7
|
private readonly Scheme: string
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(scheme: string) {
|
|
10
10
|
this.scheme = scheme.toLowerCase()
|
|
11
11
|
this.Scheme = scheme[0].toUpperCase() + scheme.substring(1)
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
public authorize
|
|
15
|
-
if (context.request.headers.authorization === undefined)
|
|
16
|
-
return false
|
|
14
|
+
public authorize(_: Identity | null, context: Context): boolean {
|
|
15
|
+
if (context.request.headers.authorization === undefined) return false
|
|
17
16
|
|
|
18
17
|
const [scheme] = split(context.request.headers.authorization)
|
|
19
18
|
|
|
20
19
|
if (scheme !== this.scheme)
|
|
21
|
-
throw new http.Forbidden(
|
|
22
|
-
' authentication scheme is required to access this resource'
|
|
20
|
+
throw new http.Forbidden(
|
|
21
|
+
this.Scheme + ' authentication scheme is required to access this resource'
|
|
22
|
+
)
|
|
23
23
|
|
|
24
24
|
return false
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/** It admits nobody: it is there to refuse a scheme, not to authorize one. */
|
|
28
|
-
public admits
|
|
28
|
+
public admits(): boolean {
|
|
29
29
|
return false
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { newid } from '@toa.io/generic'
|
|
2
2
|
import type { Identity } from './types.js'
|
|
3
3
|
|
|
4
|
-
export function create
|
|
4
|
+
export function create(credentials?: string): Identity {
|
|
5
5
|
return {
|
|
6
6
|
id: newid(),
|
|
7
7
|
scheme: credentials?.split(' ')[0] ?? null,
|
|
@@ -21,7 +21,7 @@ export const PRIMARY: Remote = 'tokens'
|
|
|
21
21
|
* The providers of a scheme, or nothing for a scheme that is not one — including a name a
|
|
22
22
|
* plain object answers on its own, like `constructor`.
|
|
23
23
|
*/
|
|
24
|
-
export function providers
|
|
24
|
+
export function providers(scheme: string): Remote[] | undefined {
|
|
25
25
|
return Object.hasOwn(PROVIDERS, scheme) ? PROVIDERS[scheme as Scheme] : undefined
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import * as http from '../../HTTP/index.js'
|
|
2
2
|
import { type Scheme } from './types.js'
|
|
3
3
|
|
|
4
|
-
export function split
|
|
4
|
+
export function split(authorization: string): [Scheme, string] {
|
|
5
5
|
const space = authorization.indexOf(' ')
|
|
6
6
|
|
|
7
|
-
if (space === -1)
|
|
8
|
-
throw new http.Unauthorized('Malformed authorization header')
|
|
7
|
+
if (space === -1) throw new http.Unauthorized('Malformed authorization header')
|
|
9
8
|
|
|
10
9
|
const Scheme = authorization.slice(0, space)
|
|
11
10
|
const scheme = Scheme.toLowerCase() as Scheme
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Component } from '@toa.io/core'
|
|
2
|
-
import {
|
|
2
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
3
3
|
import { type Parameter } from '../../RTD/index.js'
|
|
4
4
|
import type { Introspection } from '../../Introspection.js'
|
|
5
5
|
import type * as http from '../../HTTP/index.js'
|
|
@@ -55,6 +55,9 @@ export interface Extension {
|
|
|
55
55
|
|
|
56
56
|
/** the error code the presented credentials were rejected with, when they were */
|
|
57
57
|
rejection?: string
|
|
58
|
+
|
|
59
|
+
/** whether the identity was checked against the bans while being resolved */
|
|
60
|
+
vetted?: boolean
|
|
58
61
|
}
|
|
59
62
|
|
|
60
63
|
export interface Ban {
|
|
@@ -62,7 +65,7 @@ export interface Ban {
|
|
|
62
65
|
}
|
|
63
66
|
|
|
64
67
|
export type Context = io.Input & Extension
|
|
65
|
-
export type AuthenticationResult = Maybe<{ identity: Identity
|
|
68
|
+
export type AuthenticationResult = Maybe<{ identity: Identity; refresh: boolean }>
|
|
66
69
|
|
|
67
70
|
export type Scheme = 'basic' | 'token' | 'bearer' | 'code' | 'otp'
|
|
68
71
|
export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans' | 'otp'
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Control } from './Control.js'
|
|
2
2
|
import { Exact } from './Exact.js'
|
|
3
|
+
import { matches, tag } from './etag.js'
|
|
3
4
|
import type { Output } from '../../io.js'
|
|
4
5
|
import type { AuthenticatedContext, Directive } from './types.js'
|
|
5
6
|
import type { DirectiveFamily } from '../../RTD/index.js'
|
|
@@ -9,7 +10,7 @@ export class Cache implements DirectiveFamily<Directive> {
|
|
|
9
10
|
public readonly name: string = 'cache'
|
|
10
11
|
public readonly mandatory: boolean = true
|
|
11
12
|
|
|
12
|
-
public create
|
|
13
|
+
public create(name: string, value: any): Directive {
|
|
13
14
|
const Class = constructors[name]
|
|
14
15
|
|
|
15
16
|
if (Class === undefined)
|
|
@@ -18,15 +19,23 @@ export class Cache implements DirectiveFamily<Directive> {
|
|
|
18
19
|
return new Class(value)
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
public precall
|
|
22
|
+
public precall(): Output {
|
|
22
23
|
return null
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
public async settle
|
|
26
|
+
public async settle(
|
|
27
|
+
directives: Directive[],
|
|
28
|
+
context: AuthenticatedContext,
|
|
29
|
+
response: http.OutgoingMessage
|
|
30
|
+
): Promise<void> {
|
|
26
31
|
const directive = directives[0]
|
|
32
|
+
const method = context.request.method
|
|
33
|
+
const safe = method === 'GET' || method === 'HEAD'
|
|
27
34
|
|
|
28
35
|
response.headers ??= new Headers()
|
|
29
36
|
|
|
37
|
+
validate(context, response, response.headers, safe)
|
|
38
|
+
|
|
30
39
|
// `cache:exact` sets what it is given, whatever the method: whether a reply may be
|
|
31
40
|
// stored at all is not a question about the method's cacheability, and a token
|
|
32
41
|
// endpoint answers a POST it must not have kept
|
|
@@ -36,21 +45,47 @@ export class Cache implements DirectiveFamily<Directive> {
|
|
|
36
45
|
return
|
|
37
46
|
}
|
|
38
47
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (method !== 'GET' && method !== 'HEAD')
|
|
42
|
-
return
|
|
48
|
+
if (!safe) return
|
|
43
49
|
|
|
44
50
|
if (directive === undefined) {
|
|
45
51
|
if (context.identity !== null && !Control.disabled(response.headers)) {
|
|
46
52
|
response.headers.set('cache-control', 'private')
|
|
47
53
|
response.headers.append('vary', 'authorization')
|
|
48
54
|
}
|
|
49
|
-
} else
|
|
50
|
-
directive.set(context, response.headers)
|
|
55
|
+
} else directive.set(context, response.headers)
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
58
|
|
|
59
|
+
/**
|
|
60
|
+
* The validators a reply carries: the timestamp as `last-modified`, whatever the method, and
|
|
61
|
+
* on a safe one the version as its `etag`. A client that sends the tag back in `if-none-match`
|
|
62
|
+
* already has the representation and is told so, with the tag as it sent it. A reply without
|
|
63
|
+
* a version has no tag: nothing identifies it but its body, and hashing that on every reply
|
|
64
|
+
* is what a version is for.
|
|
65
|
+
*/
|
|
66
|
+
// eslint-disable-next-line max-params
|
|
67
|
+
function validate(
|
|
68
|
+
context: AuthenticatedContext,
|
|
69
|
+
response: http.OutgoingMessage,
|
|
70
|
+
headers: Headers,
|
|
71
|
+
safe: boolean
|
|
72
|
+
): void {
|
|
73
|
+
const { version, modified } = response
|
|
74
|
+
|
|
75
|
+
if (modified !== undefined)
|
|
76
|
+
headers.set('last-modified', new Date(modified).toUTCString())
|
|
77
|
+
|
|
78
|
+
if (version === undefined || !safe) return
|
|
79
|
+
|
|
80
|
+
const sent = context.request.headers['if-none-match']
|
|
81
|
+
|
|
82
|
+
if (sent !== undefined && matches(sent, version)) {
|
|
83
|
+
response.status = 304
|
|
84
|
+
response.body = undefined
|
|
85
|
+
headers.set('etag', sent)
|
|
86
|
+
} else headers.set('etag', tag(version))
|
|
87
|
+
}
|
|
88
|
+
|
|
54
89
|
const constructors: Record<string, new (value: any) => Directive> = {
|
|
55
90
|
control: Control,
|
|
56
91
|
exact: Exact
|
|
@@ -6,44 +6,38 @@ export class Control implements Directive {
|
|
|
6
6
|
private control: string | null = null
|
|
7
7
|
private vary: boolean = false
|
|
8
8
|
|
|
9
|
-
public constructor
|
|
9
|
+
public constructor(value: string) {
|
|
10
10
|
this.value = value
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
public static disabled
|
|
13
|
+
public static disabled(headers: Headers): boolean {
|
|
14
14
|
const value = headers.get('cache-control')
|
|
15
15
|
|
|
16
|
-
if (value === null)
|
|
17
|
-
return false
|
|
16
|
+
if (value === null) return false
|
|
18
17
|
|
|
19
18
|
const directives = mask(value)
|
|
20
19
|
|
|
21
20
|
return (directives & NO_STORE) === NO_STORE
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
public set
|
|
23
|
+
public set(context: AuthenticatedContext, headers: Headers): void {
|
|
25
24
|
this.control ??= this.resolve(context)
|
|
26
25
|
|
|
27
|
-
if (Control.disabled(headers))
|
|
28
|
-
return
|
|
26
|
+
if (Control.disabled(headers)) return
|
|
29
27
|
|
|
30
28
|
headers.set('cache-control', this.control)
|
|
31
29
|
|
|
32
|
-
if (this.vary)
|
|
33
|
-
headers.append('vary', 'authorization')
|
|
30
|
+
if (this.vary) headers.append('vary', 'authorization')
|
|
34
31
|
}
|
|
35
32
|
|
|
36
|
-
protected resolve
|
|
37
|
-
if (request.identity === null)
|
|
38
|
-
return this.value
|
|
33
|
+
protected resolve(request: AuthenticatedContext): string {
|
|
34
|
+
if (request.identity === null) return this.value
|
|
39
35
|
|
|
40
36
|
const directives = mask(this.value)
|
|
41
37
|
|
|
42
|
-
if ((directives & PRIVATE) === PRIVATE)
|
|
43
|
-
this.vary = true
|
|
38
|
+
if ((directives & PRIVATE) === PRIVATE) this.vary = true
|
|
44
39
|
|
|
45
|
-
if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
|
|
46
|
-
return 'no-cache, ' + this.value
|
|
40
|
+
if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC) return 'no-cache, ' + this.value
|
|
47
41
|
|
|
48
42
|
if ((directives & (PUBLIC | PRIVATE)) === 0) {
|
|
49
43
|
this.vary = true
|
|
@@ -55,26 +49,31 @@ export class Control implements Directive {
|
|
|
55
49
|
}
|
|
56
50
|
}
|
|
57
51
|
|
|
58
|
-
function mask
|
|
52
|
+
function mask(value: string): number {
|
|
59
53
|
const directives = value.match(DIRECTIVES_RX)
|
|
60
54
|
|
|
61
|
-
if (directives === null)
|
|
62
|
-
return 0
|
|
55
|
+
if (directives === null) return 0
|
|
63
56
|
|
|
64
57
|
let mask = 0
|
|
65
58
|
|
|
66
59
|
for (const directive of directives)
|
|
67
|
-
mask |= match<number>(
|
|
68
|
-
|
|
69
|
-
'
|
|
70
|
-
|
|
71
|
-
'
|
|
72
|
-
|
|
60
|
+
mask |= match<number>(
|
|
61
|
+
directive,
|
|
62
|
+
'private',
|
|
63
|
+
PRIVATE,
|
|
64
|
+
'public',
|
|
65
|
+
PUBLIC,
|
|
66
|
+
'no-cache',
|
|
67
|
+
NO_CACHE,
|
|
68
|
+
'no-store',
|
|
69
|
+
NO_STORE,
|
|
70
|
+
0
|
|
71
|
+
)
|
|
73
72
|
|
|
74
73
|
return mask
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/
|
|
76
|
+
const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/gi
|
|
78
77
|
|
|
79
78
|
const PUBLIC = 1
|
|
80
79
|
const PRIVATE = 2
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An entity tag is its version in quotes, `"3"`, or the same marked weak, `W/"3"`. A client
|
|
3
|
+
* sends one back in `if-match` and `if-none-match`; what it sent is compared here as a string
|
|
4
|
+
* and parsed only where a version is needed of it.
|
|
5
|
+
*/
|
|
6
|
+
export function tag(version: number): string {
|
|
7
|
+
return `"${version}"`
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Whether the tag a client sent names the version, strong or weak. */
|
|
11
|
+
export function matches(sent: string, version: number): boolean {
|
|
12
|
+
const strong = tag(version)
|
|
13
|
+
|
|
14
|
+
return sent === strong || sent === 'W/' + strong
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** The version a tag names, or nothing for a tag that is not one. */
|
|
18
|
+
export function parse(sent: string): number | null {
|
|
19
|
+
const strong = sent.startsWith('W/') ? sent.slice(2) : sent
|
|
20
|
+
|
|
21
|
+
if (
|
|
22
|
+
strong.length < 3 ||
|
|
23
|
+
strong.length > 34 ||
|
|
24
|
+
!strong.startsWith('"') ||
|
|
25
|
+
!strong.endsWith('"')
|
|
26
|
+
)
|
|
27
|
+
return null
|
|
28
|
+
|
|
29
|
+
const digits = strong.slice(1, -1)
|
|
30
|
+
|
|
31
|
+
for (let i = 0; i < digits.length; i++) {
|
|
32
|
+
const code = digits.charCodeAt(i)
|
|
33
|
+
|
|
34
|
+
if (code < 48 || code > 57) return null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return Number.parseInt(digits)
|
|
38
|
+
}
|
|
@@ -24,7 +24,7 @@ export class CORS implements Interceptor {
|
|
|
24
24
|
vary: 'origin'
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
public intercept
|
|
27
|
+
public intercept(input: Input): Output {
|
|
28
28
|
const origin = input.request.headers.origin
|
|
29
29
|
|
|
30
30
|
if (origin !== undefined && input.request.method === 'OPTIONS')
|
|
@@ -36,8 +36,10 @@ export class CORS implements Interceptor {
|
|
|
36
36
|
if (origin !== undefined) {
|
|
37
37
|
output.headers.set('access-control-allow-origin', origin)
|
|
38
38
|
output.headers.set('access-control-allow-credentials', 'true')
|
|
39
|
-
output.headers.set(
|
|
40
|
-
'
|
|
39
|
+
output.headers.set(
|
|
40
|
+
'access-control-expose-headers',
|
|
41
|
+
'authorization, content-type, content-length, date, etag, last-modified'
|
|
42
|
+
)
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
const method = input.request.method
|
|
@@ -49,12 +51,12 @@ export class CORS implements Interceptor {
|
|
|
49
51
|
return null
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
public reset
|
|
54
|
+
public reset(): void {
|
|
53
55
|
this.requestHeaders = new Set(REQUEST_HEADERS)
|
|
54
56
|
this.headers.set('access-control-allow-headers', this.allowedHeaders())
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
public allow
|
|
59
|
+
public allow(header: string): void {
|
|
58
60
|
this.requestHeaders.add(header.toLowerCase())
|
|
59
61
|
this.headers.set('access-control-allow-headers', this.allowedHeaders())
|
|
60
62
|
}
|
|
@@ -64,11 +66,11 @@ export class CORS implements Interceptor {
|
|
|
64
66
|
* fixed — an unsorted value would differ between otherwise identical processes,
|
|
65
67
|
* and between one restart and the next.
|
|
66
68
|
*/
|
|
67
|
-
private allowedHeaders
|
|
69
|
+
private allowedHeaders(): string {
|
|
68
70
|
return Array.from(this.requestHeaders).sort().join(', ')
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
private preflightResponse
|
|
73
|
+
private preflightResponse(origin: string): Output {
|
|
72
74
|
this.headers.set('access-control-allow-origin', origin)
|
|
73
75
|
|
|
74
76
|
return {
|
|
@@ -10,16 +10,15 @@ export class Development implements DirectiveFamily<Directive> {
|
|
|
10
10
|
public readonly name: string = 'dev'
|
|
11
11
|
public readonly mandatory: boolean = false
|
|
12
12
|
|
|
13
|
-
public create
|
|
13
|
+
public create(name: string, value: unknown): Directive {
|
|
14
14
|
const Class = constructors[name]
|
|
15
15
|
|
|
16
|
-
if (Class === undefined)
|
|
17
|
-
throw new Error(`Directive 'dev:${name}' is not implemented`)
|
|
16
|
+
if (Class === undefined) throw new Error(`Directive 'dev:${name}' is not implemented`)
|
|
18
17
|
|
|
19
18
|
return new Class(value)
|
|
20
19
|
}
|
|
21
20
|
|
|
22
|
-
public async precall
|
|
21
|
+
public async precall(directives: Directive[], input: Input): Promise<Output> {
|
|
23
22
|
let output = null
|
|
24
23
|
|
|
25
24
|
for (const directive of directives) {
|
|
@@ -8,18 +8,23 @@ export class Faulty implements Directive {
|
|
|
8
8
|
private static readonly warned = false
|
|
9
9
|
private readonly probability: number
|
|
10
10
|
|
|
11
|
-
public constructor
|
|
12
|
-
assert.ok(
|
|
13
|
-
|
|
11
|
+
public constructor(probability: number) {
|
|
12
|
+
assert.ok(
|
|
13
|
+
typeof probability === 'number',
|
|
14
|
+
'`dev:faulty` directive value must be a number'
|
|
15
|
+
)
|
|
16
|
+
assert.ok(
|
|
17
|
+
probability > 0 && probability <= 1,
|
|
18
|
+
'`dev:faulty` directive value must be in the range (0, 1]'
|
|
19
|
+
)
|
|
14
20
|
|
|
15
21
|
this.probability = probability
|
|
16
22
|
|
|
17
23
|
cors.allow('faulty')
|
|
18
24
|
}
|
|
19
25
|
|
|
20
|
-
public async apply
|
|
21
|
-
if (Math.random() > this.probability)
|
|
22
|
-
return null
|
|
26
|
+
public async apply(): Promise<Output> {
|
|
27
|
+
if (Math.random() > this.probability) return null
|
|
23
28
|
|
|
24
29
|
throw new ServiceUnavailable()
|
|
25
30
|
}
|
|
@@ -10,7 +10,7 @@ export class Sleep implements Directive {
|
|
|
10
10
|
private static warned = false
|
|
11
11
|
private readonly maximum: number
|
|
12
12
|
|
|
13
|
-
public constructor
|
|
13
|
+
public constructor(value: number) {
|
|
14
14
|
assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
|
|
15
15
|
|
|
16
16
|
if (!Sleep.warned) {
|
|
@@ -22,11 +22,10 @@ export class Sleep implements Directive {
|
|
|
22
22
|
this.maximum = value
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
public async apply
|
|
25
|
+
public async apply(input: Input): Promise<Output> {
|
|
26
26
|
const value = input.request.headers.sleep as string | undefined
|
|
27
27
|
|
|
28
|
-
if (value === undefined)
|
|
29
|
-
return null
|
|
28
|
+
if (value === undefined) return null
|
|
30
29
|
|
|
31
30
|
const [min, max] = this.parse(value)
|
|
32
31
|
|
|
@@ -40,12 +39,11 @@ export class Sleep implements Directive {
|
|
|
40
39
|
return null
|
|
41
40
|
}
|
|
42
41
|
|
|
43
|
-
private parse
|
|
42
|
+
private parse(value: string): [number, number] {
|
|
44
43
|
try {
|
|
45
44
|
const pair = JSON.parse(value) as [number, number]
|
|
46
45
|
|
|
47
|
-
if (!Array.isArray(pair) || pair.length !== 2)
|
|
48
|
-
throw new Error()
|
|
46
|
+
if (!Array.isArray(pair) || pair.length !== 2) throw new Error()
|
|
49
47
|
|
|
50
48
|
return pair
|
|
51
49
|
} catch {
|
|
@@ -4,11 +4,11 @@ import type { Directive } from './types.js'
|
|
|
4
4
|
export class Stub implements Directive {
|
|
5
5
|
private readonly value: unknown
|
|
6
6
|
|
|
7
|
-
public constructor
|
|
7
|
+
public constructor(value: unknown) {
|
|
8
8
|
this.value = value
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
public apply
|
|
11
|
+
public apply(): Output {
|
|
12
12
|
return { body: this.value }
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -4,11 +4,11 @@ import type { Directive } from './types.js'
|
|
|
4
4
|
export class Throw implements Directive {
|
|
5
5
|
private readonly message: string
|
|
6
6
|
|
|
7
|
-
public constructor
|
|
7
|
+
public constructor(message: string) {
|
|
8
8
|
this.message = message
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
public apply
|
|
11
|
+
public apply(): Output {
|
|
12
12
|
throw new Error(this.message)
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -9,11 +9,11 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
|
9
9
|
export class Compose implements Directive {
|
|
10
10
|
private readonly expressions: Expression[]
|
|
11
11
|
|
|
12
|
-
public constructor
|
|
12
|
+
public constructor(composition: any) {
|
|
13
13
|
this.expressions = build(composition)
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
public attach
|
|
16
|
+
public attach(context: Context): void {
|
|
17
17
|
context.pipelines.response.push(async (message: OutgoingMessage) => {
|
|
18
18
|
if (!(message.body instanceof Readable)) {
|
|
19
19
|
console.warn('Response body is not a stream, skipping composition')
|
|
@@ -23,8 +23,11 @@ export class Compose implements Directive {
|
|
|
23
23
|
|
|
24
24
|
assert.ok(message.body instanceof Readable, 'Response body is not a stream')
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
assert.ok(
|
|
27
|
+
// @ts-expect-error -- objectMode is not defined in the type definition
|
|
28
|
+
message.body._readableState.objectMode,
|
|
29
|
+
'Response stream is not in object mode'
|
|
30
|
+
)
|
|
28
31
|
|
|
29
32
|
const $ = await this.compose(message.body)
|
|
30
33
|
|
|
@@ -32,7 +35,7 @@ export class Compose implements Directive {
|
|
|
32
35
|
})
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
private async compose
|
|
38
|
+
private async compose(stream: Readable): Promise<unknown[]> {
|
|
36
39
|
const $: unknown[] = []
|
|
37
40
|
|
|
38
41
|
stream.on('data', (data) => $.push(data))
|
|
@@ -42,7 +45,7 @@ export class Compose implements Directive {
|
|
|
42
45
|
return $
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
private execute
|
|
48
|
+
private execute($: unknown[]): unknown {
|
|
46
49
|
let exception: Error | undefined
|
|
47
50
|
|
|
48
51
|
for (const expression of this.expressions)
|
|
@@ -57,36 +60,39 @@ export class Compose implements Directive {
|
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
|
|
60
|
-
function build
|
|
63
|
+
function build(composition: any): Expression[] {
|
|
61
64
|
return Array.isArray(composition)
|
|
62
65
|
? composition.map((variant) => compile(variant as object | string))
|
|
63
66
|
: [compile(composition as object | string)]
|
|
64
67
|
}
|
|
65
68
|
|
|
66
|
-
function compile
|
|
67
|
-
const text =
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
function compile(composition: object | string): Expression {
|
|
70
|
+
const text =
|
|
71
|
+
typeof composition === 'string'
|
|
72
|
+
? `return ${composition}`
|
|
73
|
+
: `return ${json(composition)}`
|
|
70
74
|
|
|
71
75
|
// eslint-disable-next-line @typescript-eslint/no-implied-eval,no-new-func
|
|
72
76
|
return new Function('$', text) as Expression
|
|
73
77
|
}
|
|
74
78
|
|
|
75
|
-
function json
|
|
79
|
+
function json(node: object | string): string {
|
|
76
80
|
if (typeof node === 'string')
|
|
77
|
-
if (node.startsWith('\\'))
|
|
78
|
-
|
|
79
|
-
else
|
|
80
|
-
return node
|
|
81
|
+
if (node.startsWith('\\')) return `"${node}"`
|
|
82
|
+
else return node
|
|
81
83
|
|
|
82
84
|
if (Array.isArray(node))
|
|
83
85
|
return `[${node.map((v) => json(v as object | string)).join(',')}]`
|
|
84
86
|
|
|
85
|
-
if (node.constructor !== Object)
|
|
86
|
-
return JSON.stringify(node)
|
|
87
|
+
if (node.constructor !== Object) return JSON.stringify(node)
|
|
87
88
|
|
|
88
|
-
return
|
|
89
|
-
|
|
89
|
+
return (
|
|
90
|
+
'{' +
|
|
91
|
+
Object.entries(node)
|
|
92
|
+
.map(([key, value]) => `"${key}": ${json(value as object | string)}`)
|
|
93
|
+
.join(',') +
|
|
94
|
+
'}'
|
|
95
|
+
)
|
|
90
96
|
}
|
|
91
97
|
|
|
92
98
|
type Expression = ($: unknown[]) => unknown
|