@toa.io/extensions.exposition 1.0.0-alpha.18 → 1.0.0-alpha.181
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/context.toa.yaml +2 -2
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/manifest.toa.yaml +48 -11
- package/components/identity.basic/operations/authenticate.d.ts +5 -1
- package/components/identity.basic/operations/authenticate.js +7 -4
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/check.d.ts +7 -0
- package/components/identity.basic/operations/check.js +15 -0
- package/components/identity.basic/operations/check.js.map +1 -0
- package/components/identity.basic/operations/incept.d.ts +12 -0
- package/components/identity.basic/operations/incept.js +26 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +4 -4
- package/components/identity.basic/operations/transit.js +8 -6
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/types.d.ts +8 -4
- package/components/identity.basic/source/authenticate.ts +18 -7
- package/components/identity.basic/source/check.ts +20 -0
- package/components/identity.basic/source/incept.ts +38 -0
- package/components/identity.basic/source/transit.ts +11 -9
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +80 -38
- package/components/identity.federation/operations/authenticate.d.ts +16 -3
- package/components/identity.federation/operations/authenticate.js +25 -15
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/decode.d.ts +3 -0
- package/components/identity.federation/operations/decode.js +12 -0
- package/components/identity.federation/operations/decode.js.map +1 -0
- package/components/identity.federation/operations/incept.d.ts +11 -0
- package/components/identity.federation/operations/incept.js +23 -0
- package/components/identity.federation/operations/incept.js.map +1 -0
- package/components/identity.federation/operations/lib/Configuration.d.ts +39 -0
- package/components/identity.federation/operations/lib/Configuration.js +3 -0
- package/components/identity.federation/operations/lib/Configuration.js.map +1 -0
- package/components/identity.federation/operations/lib/Ctx.d.ts +6 -0
- package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/lib/Ctx.js} +1 -1
- package/components/identity.federation/operations/lib/Ctx.js.map +1 -0
- package/components/identity.federation/operations/lib/Payload.d.ts +5 -0
- package/components/identity.federation/operations/lib/Payload.js +3 -0
- package/components/identity.federation/operations/lib/Payload.js.map +1 -0
- package/components/identity.federation/operations/lib/decode.d.ts +3 -0
- package/components/identity.federation/operations/lib/{assertions-as-values.js → decode.js} +19 -19
- package/components/identity.federation/operations/lib/decode.js.map +1 -0
- package/components/identity.federation/operations/lib/discovery.d.ts +4 -0
- package/components/identity.federation/operations/lib/discovery.js +49 -0
- package/components/identity.federation/operations/lib/discovery.js.map +1 -0
- package/components/identity.federation/operations/lib/errors.d.ts +11 -0
- package/components/identity.federation/operations/lib/errors.js +15 -0
- package/components/identity.federation/operations/lib/errors.js.map +1 -0
- package/components/identity.federation/operations/lib/exchange.d.ts +3 -0
- package/components/identity.federation/operations/lib/exchange.js +107 -0
- package/components/identity.federation/operations/lib/exchange.js.map +1 -0
- package/components/identity.federation/operations/lib/index.d.ts +3 -0
- package/components/identity.federation/operations/lib/index.js +8 -0
- package/components/identity.federation/operations/lib/index.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/Scheme.d.ts +1 -0
- package/components/identity.federation/operations/types/Scheme.js +3 -0
- package/components/identity.federation/operations/types/Scheme.js.map +1 -0
- package/components/identity.federation/operations/types/configuration.d.ts +20 -0
- package/components/identity.federation/operations/types/configuration.js +3 -0
- package/components/identity.federation/operations/types/configuration.js.map +1 -0
- package/components/identity.federation/operations/types/context.d.ts +36 -0
- package/components/identity.federation/operations/types/context.js +3 -0
- package/components/identity.federation/operations/types/context.js.map +1 -0
- package/components/identity.federation/operations/types/entity.d.ts +6 -0
- package/components/identity.federation/operations/types/entity.js +3 -0
- package/components/identity.federation/operations/types/entity.js.map +1 -0
- package/components/identity.federation/operations/types/index.d.ts +4 -0
- package/components/identity.federation/operations/types/index.js +21 -0
- package/components/identity.federation/operations/types/index.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +44 -19
- package/components/identity.federation/source/decode.ts +10 -0
- package/components/identity.federation/source/incept.ts +37 -0
- package/components/identity.federation/source/lib/Configuration.ts +39 -0
- package/components/identity.federation/source/lib/Ctx.ts +7 -0
- package/components/identity.federation/source/lib/Payload.ts +6 -0
- package/components/identity.federation/source/lib/decode.ts +28 -0
- package/components/identity.federation/source/lib/discovery.ts +30 -0
- package/components/identity.federation/source/lib/errors.ts +12 -0
- package/components/identity.federation/source/lib/exchange.ts +116 -0
- package/components/identity.federation/source/lib/index.ts +3 -0
- package/components/identity.federation/source/types/Scheme.ts +1 -0
- package/components/identity.federation/source/types/configuration.ts +21 -0
- package/components/identity.federation/source/types/context.ts +40 -0
- package/components/identity.federation/source/types/entity.ts +6 -0
- package/components/identity.federation/source/types/index.ts +4 -0
- package/components/identity.federation/tsconfig.json +5 -4
- package/components/identity.keys/manifest.toa.yaml +57 -0
- package/components/identity.keys/operations/create.d.ts +22 -0
- package/components/identity.keys/operations/create.js +16 -0
- package/components/identity.keys/operations/create.js.map +1 -0
- package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.keys/source/create.ts +35 -0
- package/components/identity.keys/tsconfig.json +9 -0
- package/components/identity.otp/manifest.toa.yaml +39 -0
- package/components/identity.otp/operations/authenticate.d.ts +12 -0
- package/components/identity.otp/operations/authenticate.js +30 -0
- package/components/identity.otp/operations/authenticate.js.map +1 -0
- package/components/identity.otp/operations/issue.d.ts +10 -0
- package/components/identity.otp/operations/issue.js +13 -0
- package/components/identity.otp/operations/issue.js.map +1 -0
- package/components/identity.otp/operations/lib/Context.d.ts +13 -0
- package/components/identity.otp/operations/lib/Context.js +3 -0
- package/components/identity.otp/operations/lib/Context.js.map +1 -0
- package/components/identity.otp/operations/lib/Entity.d.ts +5 -0
- package/components/identity.otp/operations/lib/Entity.js +3 -0
- package/components/identity.otp/operations/lib/Entity.js.map +1 -0
- package/components/identity.otp/operations/lib/index.d.ts +1 -0
- package/components/identity.otp/operations/lib/index.js +3 -0
- package/components/identity.otp/operations/lib/index.js.map +1 -0
- package/components/identity.otp/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.otp/source/authenticate.ts +46 -0
- package/components/identity.otp/source/issue.ts +22 -0
- package/components/identity.otp/source/lib/Context.ts +14 -0
- package/components/identity.otp/source/lib/Entity.ts +5 -0
- package/components/identity.otp/source/lib/index.ts +1 -0
- package/components/identity.otp/tsconfig.json +9 -0
- package/components/identity.passkeys/manifest.toa.yaml +268 -0
- package/components/identity.passkeys/operations/authenticate.d.ts +16 -0
- package/components/identity.passkeys/operations/authenticate.js +34 -0
- package/components/identity.passkeys/operations/authenticate.js.map +1 -0
- package/components/identity.passkeys/operations/challenge.d.ts +35 -0
- package/components/identity.passkeys/operations/challenge.js +73 -0
- package/components/identity.passkeys/operations/challenge.js.map +1 -0
- package/components/identity.passkeys/operations/create.d.ts +19 -0
- package/components/identity.passkeys/operations/create.js +58 -0
- package/components/identity.passkeys/operations/create.js.map +1 -0
- package/components/identity.passkeys/operations/delete.d.ts +8 -0
- package/components/identity.passkeys/operations/delete.js +12 -0
- package/components/identity.passkeys/operations/delete.js.map +1 -0
- package/components/identity.passkeys/operations/lib/const.d.ts +1 -0
- package/components/identity.passkeys/operations/lib/const.js +5 -0
- package/components/identity.passkeys/operations/lib/const.js.map +1 -0
- package/components/identity.passkeys/operations/list.d.ts +7 -0
- package/components/identity.passkeys/operations/list.js +15 -0
- package/components/identity.passkeys/operations/list.js.map +1 -0
- package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.passkeys/operations/types/Configuration.d.ts +6 -0
- package/components/identity.passkeys/operations/types/Configuration.js +3 -0
- package/components/identity.passkeys/operations/types/Configuration.js.map +1 -0
- package/components/identity.passkeys/operations/types/Context.d.ts +15 -0
- package/components/identity.passkeys/operations/types/Context.js +3 -0
- package/components/identity.passkeys/operations/types/Context.js.map +1 -0
- package/components/identity.passkeys/operations/types/Passkey.d.ts +13 -0
- package/components/identity.passkeys/operations/types/Passkey.js +3 -0
- package/components/identity.passkeys/operations/types/Passkey.js.map +1 -0
- package/components/identity.passkeys/operations/types/index.d.ts +2 -0
- package/components/identity.passkeys/operations/types/index.js +3 -0
- package/components/identity.passkeys/operations/types/index.js.map +1 -0
- package/components/identity.passkeys/operations/use.d.ts +16 -0
- package/components/identity.passkeys/operations/use.js +57 -0
- package/components/identity.passkeys/operations/use.js.map +1 -0
- package/components/identity.passkeys/source/authenticate.ts +48 -0
- package/components/identity.passkeys/source/challenge.ts +115 -0
- package/components/identity.passkeys/source/create.ts +77 -0
- package/components/identity.passkeys/source/delete.ts +15 -0
- package/components/identity.passkeys/source/lib/const.ts +1 -0
- package/components/identity.passkeys/source/list.ts +17 -0
- package/components/identity.passkeys/source/types/Configuration.ts +6 -0
- package/components/identity.passkeys/source/types/Context.ts +16 -0
- package/components/identity.passkeys/source/types/Passkey.ts +14 -0
- package/components/identity.passkeys/source/types/index.ts +2 -0
- package/components/identity.passkeys/source/use.ts +75 -0
- package/components/identity.passkeys/tsconfig.json +9 -0
- package/components/identity.roles/manifest.toa.yaml +4 -2
- package/components/identity.roles/operations/grant.js +2 -2
- package/components/identity.roles/operations/grant.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +2 -2
- package/components/identity.tokens/manifest.toa.yaml +95 -12
- package/components/identity.tokens/operations/authenticate.d.ts +3 -3
- package/components/identity.tokens/operations/authenticate.js +15 -11
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.d.ts +13 -3
- package/components/identity.tokens/operations/decrypt.js +65 -17
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.d.ts +3 -3
- package/components/identity.tokens/operations/encrypt.js +24 -7
- package/components/identity.tokens/operations/encrypt.js.map +1 -1
- package/components/identity.tokens/operations/issue.d.ts +24 -0
- package/components/identity.tokens/operations/issue.js +59 -0
- package/components/identity.tokens/operations/issue.js.map +1 -0
- package/components/identity.tokens/operations/lib/index.d.ts +2 -0
- package/components/identity.tokens/operations/lib/index.js +19 -0
- package/components/identity.tokens/operations/lib/index.js.map +1 -0
- package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
- package/components/identity.tokens/operations/lib/pad.js +5 -0
- package/components/identity.tokens/operations/lib/pad.js.map +1 -0
- package/components/identity.tokens/operations/lib/types.d.ts +75 -0
- package/components/identity.tokens/operations/lib/types.js.map +1 -0
- package/components/identity.tokens/operations/revoke.d.ts +2 -2
- package/components/identity.tokens/operations/revoke.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -9
- package/components/identity.tokens/source/authenticate.ts +18 -13
- package/components/identity.tokens/source/decrypt.test.ts +33 -18
- package/components/identity.tokens/source/decrypt.ts +95 -20
- package/components/identity.tokens/source/encrypt.test.ts +51 -13
- package/components/identity.tokens/source/encrypt.ts +36 -11
- package/components/identity.tokens/source/issue.ts +82 -0
- package/components/identity.tokens/source/lib/index.ts +2 -0
- package/components/identity.tokens/source/lib/pad.ts +1 -0
- package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
- package/components/identity.tokens/source/lib/types.ts +86 -0
- package/components/identity.tokens/source/revoke.ts +2 -2
- package/components/octets.storage/manifest.toa.yaml +13 -11
- package/components/octets.storage/operations/get.js +3 -3
- package/components/octets.storage/operations/head.js +7 -0
- package/components/octets.storage/operations/put.js +135 -0
- package/documentation/access.md +78 -27
- package/documentation/authorities.md +48 -0
- package/documentation/components.md +109 -42
- package/documentation/dev.md +30 -0
- package/documentation/flow.md +44 -0
- package/documentation/identity.md +129 -24
- package/documentation/introspection.md +82 -0
- package/documentation/io.md +42 -2
- package/documentation/map.md +96 -0
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +59 -0
- package/documentation/notes/throttling.md +82 -0
- package/documentation/octets.md +122 -69
- package/documentation/passkeys.md +4 -0
- package/documentation/protocol.md +11 -4
- package/documentation/query.md +51 -4
- package/documentation/require.md +15 -0
- package/documentation/tree.md +13 -0
- package/features/access.feature +122 -9
- package/features/annotation.feature +1 -0
- package/features/auth.assert.feature +57 -0
- package/features/auth.claims.feature +170 -0
- package/features/auth.incept.feature +120 -0
- package/features/auth.input.feature +59 -0
- package/features/auth.issue.feature +32 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +99 -0
- package/features/authorities.tokens.feature +117 -0
- package/features/body.feature +2 -0
- package/features/cache.feature +131 -8
- package/features/cors.feature +32 -7
- package/features/debug.feature +34 -0
- package/features/dev.feature +56 -0
- package/features/directives.feature +3 -0
- package/features/dynamic.feature +48 -0
- package/features/errors.feature +29 -6
- package/features/etag.feature +140 -1
- package/features/flow.feature +148 -0
- package/features/identity.bans.feature +12 -3
- package/features/identity.basic.feature +104 -21
- package/features/identity.feature +18 -6
- package/features/identity.federation.feature +134 -44
- package/features/identity.otp.feature +71 -0
- package/features/identity.roles.feature +81 -20
- package/features/identity.tokens.feature +11 -97
- package/features/identtiy.tokens.custom.feature +247 -0
- package/features/interruptions.feature +19 -0
- package/features/introspection.feature +153 -0
- package/features/io.feature +9 -1
- package/features/io.throttle.feature +40 -0
- package/features/map.feature +328 -0
- package/features/methods.feature +47 -0
- package/features/octets.cloudinary.feature +186 -0
- package/features/octets.download.feature +189 -0
- package/features/octets.entries.feature +13 -55
- package/features/octets.feature +70 -114
- package/features/octets.head.feature +40 -0
- package/features/octets.location.feature +83 -0
- package/features/octets.meta.feature +65 -15
- package/features/octets.workflows.feature +344 -66
- package/features/passkeys.feature +66 -0
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +142 -2
- package/features/realtime.feature +34 -0
- package/features/require.feature +67 -0
- package/features/response.feature +34 -2
- package/features/routes.feature +93 -2
- package/features/server.feature +21 -0
- package/features/steps/.env.example +5 -0
- package/features/steps/Common.ts +4 -0
- package/features/steps/Gateway.ts +26 -7
- package/features/steps/HTTP.ts +26 -3
- package/features/steps/IDP.ts +334 -0
- package/features/steps/Identity.ts +51 -0
- package/features/steps/OTP.ts +39 -0
- package/features/steps/Parameters.ts +77 -2
- package/features/steps/Realtime.ts +151 -0
- package/features/steps/components/echo/manifest.toa.yaml +12 -0
- package/features/steps/components/echo/operations/echo.js +7 -0
- package/features/steps/components/echo/operations/parameters.js +7 -0
- package/features/steps/components/echo/operations/ping.js +7 -0
- package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
- package/features/steps/components/echo.beacon/operations/hello.js +5 -0
- package/features/steps/components/greeter/manifest.toa.yaml +0 -1
- package/features/steps/components/octets.tester/manifest.toa.yaml +26 -3
- package/features/steps/components/octets.tester/operations/authority.js +7 -0
- package/features/steps/components/octets.tester/operations/bar.js +0 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +2 -2
- package/features/steps/components/octets.tester/operations/id.js +7 -0
- package/features/steps/components/octets.tester/operations/identity.js +7 -0
- package/features/steps/components/octets.tester/operations/redirect.js +12 -0
- package/features/steps/components/octets.tester/operations/yex.js +16 -0
- package/features/steps/components/octets.tester/operations/yield.js +13 -0
- package/features/steps/components/pots/manifest.toa.yaml +15 -4
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/users/manifest.toa.yaml +4 -2
- package/features/steps/components/users/operations/create.js +15 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
- package/features/streams.feature +5 -0
- package/features/timestamps.feature +41 -0
- package/features/timing.feature +4 -1
- package/package.json +29 -17
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +8 -1
- package/schemas/io/throttle.cos.yaml +36 -0
- package/schemas/method.cos.yaml +2 -1
- package/schemas/node.cos.yaml +2 -0
- package/schemas/octets/put.cos.yaml +28 -0
- package/schemas/query.cos.yaml +6 -10
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +6 -3
- package/source/Branch.ts +1 -0
- package/source/Composition.ts +0 -6
- package/source/Context.ts +1 -0
- package/source/Directive.test.ts +5 -3
- package/source/Directive.ts +30 -6
- package/source/Endpoint.ts +89 -24
- package/source/Factory.ts +22 -13
- package/source/Gateway.ts +75 -19
- package/source/HTTP/Context.ts +32 -7
- package/source/HTTP/Server.ts +153 -56
- package/source/HTTP/exceptions.ts +25 -7
- package/source/HTTP/formats/index.ts +3 -4
- package/source/HTTP/formats/json.ts +0 -2
- package/source/HTTP/formats/msgpack.ts +0 -1
- package/source/HTTP/formats/text.ts +0 -2
- package/source/HTTP/formats/yaml.ts +0 -1
- package/source/HTTP/messages.test.ts +46 -2
- package/source/HTTP/messages.ts +94 -9
- package/source/Introspection.ts +11 -0
- package/source/Mapping.ts +69 -21
- package/source/Query.test.ts +3 -3
- package/source/Query.ts +131 -33
- package/source/RTD/Context.ts +1 -1
- package/source/RTD/Directives.ts +4 -0
- package/source/RTD/Endpoint.ts +3 -0
- package/source/RTD/Method.ts +16 -0
- package/source/RTD/Node.ts +29 -13
- package/source/RTD/Route.ts +12 -5
- package/source/RTD/Tree.ts +6 -2
- package/source/RTD/factory.ts +4 -1
- package/source/RTD/segment.ts +2 -0
- package/source/RTD/syntax/parse.test.ts +1 -1
- package/source/RTD/syntax/parse.ts +37 -24
- package/source/RTD/syntax/types.ts +8 -4
- package/source/Remotes.ts +7 -6
- package/source/Tenant.ts +6 -12
- package/source/deployment.ts +34 -24
- package/source/directives/auth/Anonymous.ts +3 -3
- package/source/directives/auth/Anyone.ts +13 -0
- package/source/directives/auth/Assert.ts +35 -0
- package/source/directives/auth/Authorization.ts +69 -26
- package/source/directives/auth/Delegate.ts +9 -5
- package/source/directives/auth/Echo.ts +16 -6
- package/source/directives/auth/Federation.ts +84 -0
- package/source/directives/auth/Id.ts +1 -1
- package/source/directives/auth/Incept.ts +68 -24
- package/source/directives/auth/Input.ts +72 -0
- package/source/directives/auth/Role.test.ts +1 -1
- package/source/directives/auth/Role.ts +5 -9
- package/source/directives/auth/Rule.ts +3 -5
- package/source/directives/auth/Scheme.ts +5 -5
- package/source/directives/auth/create.ts +11 -0
- package/source/directives/auth/schemes.ts +5 -2
- package/source/directives/auth/split.ts +1 -1
- package/source/directives/auth/types.ts +12 -7
- package/source/directives/cache/Cache.ts +15 -6
- package/source/directives/cache/Control.ts +16 -16
- package/source/directives/cors/CORS.ts +9 -9
- package/source/directives/dev/Development.ts +12 -7
- package/source/directives/dev/Sleep.ts +40 -0
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/flow/Compose.ts +92 -0
- package/source/directives/flow/Fetch.ts +86 -0
- package/source/directives/flow/Flow.ts +42 -0
- package/source/directives/flow/index.ts +3 -0
- package/source/directives/flow/types.ts +7 -0
- package/source/directives/index.ts +4 -2
- package/source/directives/io/Directive.ts +5 -2
- package/source/directives/io/IO.ts +18 -6
- package/source/directives/io/Input.ts +9 -6
- package/source/directives/io/Output.ts +6 -5
- package/source/directives/io/Throttle.ts +32 -0
- package/source/directives/io/lib/throttle/Configuration.test.ts +40 -0
- package/source/directives/io/lib/throttle/Configuration.ts +58 -0
- package/source/directives/io/lib/throttle/Interval.ts +31 -0
- package/source/directives/io/lib/throttle/Keys.ts +40 -0
- package/source/directives/io/lib/throttle/Quota.ts +22 -0
- package/source/directives/io/lib/throttle/Quotas.test.ts +136 -0
- package/source/directives/io/lib/throttle/Quotas.ts +83 -0
- package/source/directives/io/lib/throttle/components/Component.ts +5 -0
- package/source/directives/io/lib/throttle/components/IP.ts +40 -0
- package/source/directives/io/lib/throttle/components/Path.ts +8 -0
- package/source/directives/io/lib/throttle/components/index.ts +13 -0
- package/source/directives/io/lib/throttle/conditions/Condition.ts +5 -0
- package/source/directives/io/lib/throttle/conditions/Status.ts +17 -0
- package/source/directives/io/lib/throttle/conditions/index.ts +11 -0
- package/source/directives/io/lib/throttle/index.ts +2 -0
- package/source/directives/io/schemas.test.ts +9 -0
- package/source/directives/io/schemas.ts +3 -0
- package/source/directives/map/Authority.ts +15 -0
- package/source/directives/map/Claims.ts +58 -0
- package/source/directives/map/Directive.ts +4 -0
- package/source/directives/map/Headers.ts +38 -0
- package/source/directives/map/Language.ts +42 -0
- package/source/directives/map/Languages.ts +11 -0
- package/source/directives/map/Map.ts +61 -0
- package/source/directives/map/Mapping.ts +19 -0
- package/source/directives/{vary → map}/Properties.ts +2 -4
- package/source/directives/map/Segments.ts +33 -0
- package/source/directives/map/index.ts +3 -0
- package/source/directives/octets/Context.ts +3 -2
- package/source/directives/octets/Delete.ts +21 -17
- package/source/directives/octets/Get.ts +96 -0
- package/source/directives/octets/Octets.ts +9 -12
- package/source/directives/octets/{Store.ts → Put.ts} +52 -38
- package/source/directives/octets/Workflow.ts +9 -3
- package/source/directives/octets/bytes.test.ts +30 -0
- package/source/directives/octets/bytes.ts +18 -0
- package/source/directives/octets/schemas.ts +4 -8
- package/source/directives/octets/types.ts +2 -0
- package/source/directives/octets/workflows/Execution.ts +62 -8
- package/source/directives/octets/workflows/Workflow.ts +18 -7
- package/source/directives/octets/workflows/index.ts +1 -1
- package/source/directives/require/Directive.ts +5 -0
- package/source/directives/require/Headers.ts +20 -0
- package/source/directives/require/Require.ts +28 -0
- package/source/directives/require/index.ts +3 -0
- package/source/exceptions.ts +2 -1
- package/source/manifest.ts +10 -11
- package/source/root.ts +16 -1
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +5 -3
- package/transpiled/Branch.d.ts +1 -0
- package/transpiled/Composition.d.ts +0 -1
- package/transpiled/Composition.js +0 -4
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +1 -0
- package/transpiled/Directive.d.ts +3 -0
- package/transpiled/Directive.js +24 -6
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +6 -4
- package/transpiled/Endpoint.js +64 -16
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +3 -2
- package/transpiled/Factory.js +18 -10
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +3 -0
- package/transpiled/Gateway.js +56 -12
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +10 -2
- package/transpiled/HTTP/Context.js +22 -6
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +15 -4
- package/transpiled/HTTP/Server.js +116 -45
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +13 -4
- package/transpiled/HTTP/exceptions.js +28 -10
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/index.d.ts +1 -1
- package/transpiled/HTTP/formats/index.js +3 -3
- package/transpiled/HTTP/formats/index.js.map +1 -1
- package/transpiled/HTTP/formats/json.d.ts +1 -1
- package/transpiled/HTTP/formats/json.js +1 -2
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.d.ts +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.d.ts +1 -1
- package/transpiled/HTTP/formats/text.js +1 -2
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.d.ts +1 -1
- package/transpiled/HTTP/formats/yaml.js +1 -2
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +4 -1
- package/transpiled/HTTP/messages.js +65 -8
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Introspection.d.ts +9 -0
- package/transpiled/Introspection.js +3 -0
- package/transpiled/Introspection.js.map +1 -0
- package/transpiled/Mapping.d.ts +11 -2
- package/transpiled/Mapping.js +51 -19
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +12 -1
- package/transpiled/Query.js +93 -30
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +1 -1
- package/transpiled/RTD/Directives.d.ts +3 -0
- package/transpiled/RTD/Endpoint.d.ts +1 -0
- package/transpiled/RTD/Method.d.ts +4 -0
- package/transpiled/RTD/Method.js +11 -0
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -1
- package/transpiled/RTD/Node.js +23 -12
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.d.ts +2 -1
- package/transpiled/RTD/Route.js +7 -3
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +2 -1
- package/transpiled/RTD/Tree.js +3 -0
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +4 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.d.ts +1 -0
- package/transpiled/RTD/segment.js +2 -0
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +34 -22
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +7 -3
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.d.ts +4 -4
- package/transpiled/Remotes.js +6 -5
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +5 -4
- package/transpiled/Tenant.js +2 -7
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/deployment.js +29 -21
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.d.ts +2 -2
- package/transpiled/directives/auth/Anonymous.js +2 -2
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.d.ts +6 -0
- package/transpiled/directives/auth/Anyone.js +14 -0
- package/transpiled/directives/auth/Anyone.js.map +1 -0
- package/transpiled/directives/auth/Assert.d.ts +7 -0
- package/transpiled/directives/auth/Assert.js +57 -0
- package/transpiled/directives/auth/Assert.js.map +1 -0
- package/transpiled/directives/auth/Authorization.d.ts +4 -3
- package/transpiled/directives/auth/Authorization.js +53 -23
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +5 -4
- package/transpiled/directives/auth/Delegate.js +7 -3
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.d.ts +4 -4
- package/transpiled/directives/auth/Echo.js +11 -4
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.d.ts +16 -0
- package/transpiled/directives/auth/Federation.js +57 -0
- package/transpiled/directives/auth/Federation.js.map +1 -0
- package/transpiled/directives/auth/Id.d.ts +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.d.ts +7 -5
- package/transpiled/directives/auth/Incept.js +52 -18
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.d.ts +13 -0
- package/transpiled/directives/auth/Input.js +49 -0
- package/transpiled/directives/auth/Input.js.map +1 -0
- package/transpiled/directives/auth/Role.d.ts +1 -1
- package/transpiled/directives/auth/Role.js +4 -6
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.d.ts +2 -4
- package/transpiled/directives/auth/Rule.js +2 -2
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.d.ts +2 -2
- package/transpiled/directives/auth/Scheme.js +4 -4
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.d.ts +2 -0
- package/transpiled/directives/auth/create.js +14 -0
- package/transpiled/directives/auth/create.js.map +1 -0
- package/transpiled/directives/auth/schemes.d.ts +2 -1
- package/transpiled/directives/auth/schemes.js +5 -2
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +10 -7
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +12 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -2
- package/transpiled/directives/cache/Control.js +12 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.js +7 -7
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.d.ts +1 -1
- package/transpiled/directives/dev/Development.js +13 -7
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Sleep.d.ts +8 -0
- package/transpiled/directives/dev/Sleep.js +36 -0
- package/transpiled/directives/dev/Sleep.js.map +1 -0
- package/transpiled/directives/dev/types.d.ts +1 -1
- package/transpiled/directives/flow/Compose.d.ts +9 -0
- package/transpiled/directives/flow/Compose.js +94 -0
- package/transpiled/directives/flow/Compose.js.map +1 -0
- package/transpiled/directives/flow/Fetch.d.ts +12 -0
- package/transpiled/directives/flow/Fetch.js +58 -0
- package/transpiled/directives/flow/Fetch.js.map +1 -0
- package/transpiled/directives/flow/Flow.d.ts +10 -0
- package/transpiled/directives/flow/Flow.js +33 -0
- package/transpiled/directives/flow/Flow.js.map +1 -0
- package/transpiled/directives/flow/index.d.ts +2 -0
- package/transpiled/directives/flow/index.js +6 -0
- package/transpiled/directives/flow/index.js.map +1 -0
- package/transpiled/directives/flow/types.d.ts +6 -0
- package/transpiled/directives/flow/types.js.map +1 -0
- package/transpiled/directives/index.js +4 -2
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +5 -2
- package/transpiled/directives/io/IO.d.ts +4 -2
- package/transpiled/directives/io/IO.js +14 -4
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.d.ts +1 -1
- package/transpiled/directives/io/Input.js +5 -3
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.d.ts +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Throttle.d.ts +11 -0
- package/transpiled/directives/{octets/Permute.js → io/Throttle.js} +21 -28
- package/transpiled/directives/io/Throttle.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/Configuration.d.ts +23 -0
- package/transpiled/directives/io/lib/throttle/Configuration.js +27 -0
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/Interval.d.ts +9 -0
- package/transpiled/directives/io/lib/throttle/Interval.js +31 -0
- package/transpiled/directives/io/lib/throttle/Interval.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/Keys.d.ts +12 -0
- package/transpiled/directives/io/lib/throttle/Keys.js +34 -0
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/Quota.d.ts +8 -0
- package/transpiled/directives/io/lib/throttle/Quota.js +22 -0
- package/transpiled/directives/io/lib/throttle/Quota.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/Quotas.d.ts +26 -0
- package/transpiled/directives/io/lib/throttle/Quotas.js +61 -0
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/components/Component.d.ts +4 -0
- package/transpiled/directives/io/lib/throttle/components/Component.js +3 -0
- package/transpiled/directives/io/lib/throttle/components/Component.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/components/IP.d.ts +6 -0
- package/transpiled/directives/io/lib/throttle/components/IP.js +33 -0
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/components/Path.d.ts +5 -0
- package/transpiled/directives/io/lib/throttle/components/Path.js +10 -0
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/components/index.d.ts +5 -0
- package/transpiled/directives/io/lib/throttle/components/index.js +10 -0
- package/transpiled/directives/io/lib/throttle/components/index.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/conditions/Condition.d.ts +4 -0
- package/transpiled/directives/io/lib/throttle/conditions/Condition.js +3 -0
- package/transpiled/directives/io/lib/throttle/conditions/Condition.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/conditions/Status.d.ts +7 -0
- package/transpiled/directives/io/lib/throttle/conditions/Status.js +19 -0
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/conditions/index.d.ts +5 -0
- package/transpiled/directives/io/lib/throttle/conditions/index.js +8 -0
- package/transpiled/directives/io/lib/throttle/conditions/index.js.map +1 -0
- package/transpiled/directives/io/lib/throttle/index.d.ts +2 -0
- package/transpiled/directives/io/lib/throttle/index.js +8 -0
- package/transpiled/directives/io/lib/throttle/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +2 -0
- package/transpiled/directives/io/schemas.js +2 -1
- package/transpiled/directives/io/schemas.js.map +1 -1
- package/transpiled/directives/map/Authority.d.ts +6 -0
- package/transpiled/directives/map/Authority.js +19 -0
- package/transpiled/directives/map/Authority.js.map +1 -0
- package/transpiled/directives/map/Claims.d.ts +10 -0
- package/transpiled/directives/map/Claims.js +44 -0
- package/transpiled/directives/map/Claims.js.map +1 -0
- package/transpiled/directives/map/Directive.d.ts +3 -0
- package/transpiled/directives/map/Directive.js.map +1 -0
- package/transpiled/directives/map/Headers.d.ts +7 -0
- package/transpiled/directives/map/Headers.js +34 -0
- package/transpiled/directives/map/Headers.js.map +1 -0
- package/transpiled/directives/map/Language.d.ts +10 -0
- package/transpiled/directives/map/Language.js +38 -0
- package/transpiled/directives/map/Language.js.map +1 -0
- package/transpiled/directives/map/Languages.d.ts +4 -0
- package/transpiled/directives/map/Languages.js +17 -0
- package/transpiled/directives/map/Languages.js.map +1 -0
- package/transpiled/directives/map/Map.d.ts +13 -0
- package/transpiled/directives/map/Map.js +46 -0
- package/transpiled/directives/map/Map.js.map +1 -0
- package/transpiled/directives/map/Mapping.d.ts +13 -0
- package/transpiled/directives/map/Mapping.js +13 -0
- package/transpiled/directives/map/Mapping.js.map +1 -0
- package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
- package/transpiled/directives/{vary → map}/Properties.js +1 -3
- package/transpiled/directives/map/Properties.js.map +1 -0
- package/transpiled/directives/map/Segments.d.ts +6 -0
- package/transpiled/directives/map/Segments.js +30 -0
- package/transpiled/directives/map/Segments.js.map +1 -0
- package/transpiled/directives/map/index.d.ts +2 -0
- package/transpiled/directives/map/index.js +6 -0
- package/transpiled/directives/map/index.js.map +1 -0
- package/transpiled/directives/octets/Context.js +4 -24
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js +15 -12
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
- package/transpiled/directives/octets/{Fetch.js → Get.js} +34 -30
- package/transpiled/directives/octets/Get.js.map +1 -0
- package/transpiled/directives/octets/Octets.js +9 -12
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
- package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
- package/transpiled/directives/octets/Put.js.map +1 -0
- package/transpiled/directives/octets/Workflow.js +7 -2
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.d.ts +1 -0
- package/transpiled/directives/octets/bytes.js +21 -0
- package/transpiled/directives/octets/bytes.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +4 -8
- package/transpiled/directives/octets/schemas.js +3 -6
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +2 -0
- package/transpiled/directives/octets/workflows/Execution.d.ts +7 -1
- package/transpiled/directives/octets/workflows/Execution.js +44 -9
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
- package/transpiled/directives/octets/workflows/Workflow.js +10 -4
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/octets/workflows/index.d.ts +1 -1
- package/transpiled/directives/octets/workflows/index.js.map +1 -1
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/exceptions.js +2 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/manifest.js +10 -11
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +16 -1
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +1 -1
- package/transpiled/schemas.js +2 -2
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/create.d.ts +0 -10
- package/components/identity.basic/operations/create.js +0 -10
- package/components/identity.basic/operations/create.js.map +0 -1
- package/components/identity.basic/source/create.ts +0 -18
- package/components/identity.federation/operations/create.d.ts +0 -10
- package/components/identity.federation/operations/create.js +0 -15
- package/components/identity.federation/operations/create.js.map +0 -1
- package/components/identity.federation/operations/lib/assertions-as-values.d.ts +0 -4
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +0 -1
- package/components/identity.federation/operations/lib/jwt.d.ts +0 -20
- package/components/identity.federation/operations/lib/jwt.js +0 -136
- package/components/identity.federation/operations/lib/jwt.js.map +0 -1
- package/components/identity.federation/operations/schemas.d.ts +0 -59
- package/components/identity.federation/operations/schemas.js +0 -9
- package/components/identity.federation/operations/schemas.js.map +0 -1
- package/components/identity.federation/operations/types.d.ts +0 -51
- package/components/identity.federation/operations/types.js.map +0 -1
- package/components/identity.federation/source/create.ts +0 -26
- package/components/identity.federation/source/lib/assertions-as-values.ts +0 -19
- package/components/identity.federation/source/lib/jwt.test.ts +0 -56
- package/components/identity.federation/source/lib/jwt.ts +0 -171
- package/components/identity.federation/source/schemas.ts +0 -61
- package/components/identity.federation/source/types.ts +0 -56
- package/components/identity.tokens/operations/types.d.ts +0 -39
- package/components/identity.tokens/operations/types.js.map +0 -1
- package/components/identity.tokens/source/types.ts +0 -47
- package/components/octets.storage/operations/fetch.js +0 -46
- package/components/octets.storage/operations/list.js +0 -7
- package/components/octets.storage/operations/permute.js +0 -7
- package/components/octets.storage/operations/store.js +0 -11
- package/documentation/vary.md +0 -75
- package/features/steps/IdP.ts +0 -154
- package/features/steps/components/octets.tester/operations/diversify.js +0 -14
- package/features/vary.feature +0 -203
- package/schemas/octets/context.cos.yaml +0 -1
- package/schemas/octets/fetch.cos.yaml +0 -3
- package/schemas/octets/permute.cos.yaml +0 -1
- package/schemas/octets/store.cos.yaml +0 -3
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Fetch.ts +0 -100
- package/source/directives/octets/List.ts +0 -72
- package/source/directives/octets/Permute.ts +0 -44
- package/source/directives/vary/Directive.ts +0 -7
- package/source/directives/vary/Embed.ts +0 -68
- package/source/directives/vary/Vary.ts +0 -50
- package/source/directives/vary/embeddings/Embedding.ts +0 -7
- package/source/directives/vary/embeddings/Header.ts +0 -32
- package/source/directives/vary/embeddings/Language.ts +0 -31
- package/source/directives/vary/embeddings/Parameter.ts +0 -14
- package/source/directives/vary/embeddings/index.ts +0 -11
- package/source/directives/vary/index.ts +0 -3
- package/transpiled/directives/octets/Fetch.js.map +0 -1
- package/transpiled/directives/octets/List.d.ts +0 -16
- package/transpiled/directives/octets/List.js +0 -74
- package/transpiled/directives/octets/List.js.map +0 -1
- package/transpiled/directives/octets/Permute.d.ts +0 -11
- package/transpiled/directives/octets/Permute.js.map +0 -1
- package/transpiled/directives/octets/Store.js.map +0 -1
- package/transpiled/directives/vary/Directive.d.ts +0 -6
- package/transpiled/directives/vary/Directive.js.map +0 -1
- package/transpiled/directives/vary/Embed.d.ts +0 -11
- package/transpiled/directives/vary/Embed.js +0 -51
- package/transpiled/directives/vary/Embed.js.map +0 -1
- package/transpiled/directives/vary/Properties.js.map +0 -1
- package/transpiled/directives/vary/Vary.d.ts +0 -10
- package/transpiled/directives/vary/Vary.js +0 -36
- package/transpiled/directives/vary/Vary.js.map +0 -1
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -6
- package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
- package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
- package/transpiled/directives/vary/embeddings/Header.js +0 -28
- package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
- package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
- package/transpiled/directives/vary/embeddings/Language.js +0 -28
- package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +0 -7
- package/transpiled/directives/vary/embeddings/Parameter.js +0 -14
- package/transpiled/directives/vary/embeddings/Parameter.js.map +0 -1
- package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
- package/transpiled/directives/vary/embeddings/index.js +0 -12
- package/transpiled/directives/vary/embeddings/index.js.map +0 -1
- package/transpiled/directives/vary/index.d.ts +0 -2
- package/transpiled/directives/vary/index.js +0 -6
- package/transpiled/directives/vary/index.js.map +0 -1
- /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
- /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
- /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
- /package/transpiled/directives/{vary → map}/Directive.js +0 -0
|
@@ -1,36 +1,30 @@
|
|
|
1
1
|
# Identity
|
|
2
2
|
|
|
3
3
|
Identity is the fundamental entity within an authentication system that represents the **unique
|
|
4
|
-
identifier** of an
|
|
5
|
-
individual, organization, application or device.
|
|
4
|
+
identifier** of an individual, organization, application or device.
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Identity.
|
|
6
|
+
To prove its Identity, the request originator must provide a valid _credentials_ that are associated
|
|
7
|
+
with that Identity.
|
|
10
8
|
|
|
11
9
|
Identity is intrinsically linked to credentials, as an Identity is established only when the first
|
|
12
|
-
set of credentials
|
|
13
|
-
for that Identity is created.
|
|
10
|
+
set of credentials for that Identity is created.
|
|
14
11
|
In other words, the creation of credentials marks the inception of an Identity.
|
|
15
12
|
Once the last credentials are removed from the Identity, it ceases to exist.
|
|
16
13
|
Without credentials, there is no basis for defining or asserting an Identity.
|
|
17
14
|
|
|
18
15
|
## Authentication
|
|
19
16
|
|
|
20
|
-
The
|
|
21
|
-
authentication
|
|
22
|
-
schemes.
|
|
17
|
+
The Authentication system resolves provided credentials to an Identity using one of the supported
|
|
18
|
+
authentication schemes.
|
|
23
19
|
|
|
24
20
|
The Authentication is request-agnostic, meaning it does not depend on the specific URL being
|
|
25
|
-
requested or the content of
|
|
26
|
-
the request body.
|
|
21
|
+
requested or the content of the request body.
|
|
27
22
|
The only information it handles is the value of the `Authorization` header.
|
|
28
23
|
|
|
29
|
-
> Except for its own [management resources](
|
|
24
|
+
> Except for its own [management resources](components.md).
|
|
30
25
|
|
|
31
26
|
If the provided credentials are not valid or not associated with an Identity, then Authentication
|
|
32
|
-
interrupts request
|
|
33
|
-
processing and responds with an authentication error.
|
|
27
|
+
interrupts request processing and responds with an authentication error.
|
|
34
28
|
|
|
35
29
|
### Basic scheme
|
|
36
30
|
|
|
@@ -52,8 +46,8 @@ Authrization: Token v4.local.eyJzdWIiOiJqb2hu...
|
|
|
52
46
|
|
|
53
47
|
The `Token` is the **primary** authentication scheme.
|
|
54
48
|
If request originators use an alternative authentication scheme, they will receive a response
|
|
55
|
-
containing `Token`
|
|
56
|
-
|
|
49
|
+
containing `Token`credentials and will be required to switch to the `Token` scheme for any
|
|
50
|
+
subsequent requests.
|
|
57
51
|
Continued use of other authentication schemes will result in temporary blocking of requests.
|
|
58
52
|
|
|
59
53
|
See [`identity.tokens` component](components.md#stateless-tokens).
|
|
@@ -69,7 +63,7 @@ to [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.ht
|
|
|
69
63
|
Authorization: Bearer eyJhbGciOiJIUzI1...
|
|
70
64
|
```
|
|
71
65
|
|
|
72
|
-
Trusted providers are specified using the `identity.federation`
|
|
66
|
+
Trusted providers are specified using the `identity.federation` configuration.
|
|
73
67
|
|
|
74
68
|
```yaml
|
|
75
69
|
# context.toa.yaml
|
|
@@ -77,17 +71,100 @@ Trusted providers are specified using the `identity.federation` property within
|
|
|
77
71
|
configuration:
|
|
78
72
|
identity.federation:
|
|
79
73
|
trust:
|
|
80
|
-
-
|
|
81
|
-
|
|
82
|
-
- <GOOGLE_CLIENT_ID>
|
|
74
|
+
- iss: https://accounts.google.com
|
|
75
|
+
aud: <GOOGLE_CLIENT_ID>
|
|
83
76
|
|
|
84
|
-
-
|
|
77
|
+
- iss: https://appleid.apple.com
|
|
78
|
+
aud: <APPLE_CLIENT_ID>
|
|
79
|
+
secret: <APPLE_CLIENT_SECRET> # enables Authorization Code Flow
|
|
85
80
|
|
|
86
|
-
-
|
|
81
|
+
- iss: private.entity
|
|
87
82
|
secrets:
|
|
88
83
|
HS384:
|
|
89
84
|
key0: <THE-SECRET-STRING-FOR-HS384>
|
|
90
85
|
key1: <THE-SECRET-STRING-FOR-HS384> # selected by `kid` in the JWT header
|
|
86
|
+
principal:
|
|
87
|
+
iss: https://accounts.google.com
|
|
88
|
+
sub: 4218230498234
|
|
89
|
+
implicit: true
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`principal` specifies the values of the `iss` and `sub` claims of an Identity that will be granted
|
|
93
|
+
with a `system` role.
|
|
94
|
+
|
|
95
|
+
`implicit` indicates whether the Identity should be implicitly created when a valid token for a
|
|
96
|
+
non-existent Identity is provided (default `false`).
|
|
97
|
+
|
|
98
|
+
### Authorization Code Flow
|
|
99
|
+
|
|
100
|
+
[OAuth 2.0 RFC 6749, section 4.1](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
GET /identity/
|
|
104
|
+
authorization: Code <credentials>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
`<credentials>` is a base64-encoded JSON containing the following properties:
|
|
108
|
+
|
|
109
|
+
```yaml
|
|
110
|
+
code: authorization code
|
|
111
|
+
iss: code issuer
|
|
112
|
+
for: redirect URI
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Trust configuration for the issuer requires `aud` and either `secret` or `signature`
|
|
116
|
+
values to enable the Authorization Code Flow.
|
|
117
|
+
|
|
118
|
+
> If `aud` is an array, the first value is used.
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
# context.toa.yaml
|
|
122
|
+
configuration:
|
|
123
|
+
identity.federation:
|
|
124
|
+
trust:
|
|
125
|
+
- iss: https://accounts.google.com
|
|
126
|
+
aud: 1045282659797-n705sf85j4b2rodtpdn43od43tvseiet.apps.googleusercontent.com
|
|
127
|
+
secret: $GOOGLE_CLIENT_SECRET
|
|
128
|
+
- iss: https://appleid.apple.com
|
|
129
|
+
aud: io.toa.services.id
|
|
130
|
+
signature:
|
|
131
|
+
iss: team-id
|
|
132
|
+
kid: key-id
|
|
133
|
+
key: $APPLE_PRIVATE_KEY
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### OTP scheme
|
|
137
|
+
|
|
138
|
+
One-time passwords.
|
|
139
|
+
|
|
140
|
+
Passwords can be issued by calling `identity.otp.issue` operation, with the following input:
|
|
141
|
+
|
|
142
|
+
```yaml
|
|
143
|
+
authority: string
|
|
144
|
+
username: string
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The reply will contain the `code` property of type `string` formed as a random 6-digit number,
|
|
148
|
+
valid for 60 seconds by default.
|
|
149
|
+
|
|
150
|
+
```yaml
|
|
151
|
+
code: 123456
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
OTP can be used with `OTP` authentication formatted as `base64(username:password)`.
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
GET /identity/ HTTP/1.1
|
|
158
|
+
authentication: OTP dXNlcm5hbWU6MTIzNDU2
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
OTP expiration time can be configured using the `identity.otp` configuration.
|
|
162
|
+
|
|
163
|
+
```yaml
|
|
164
|
+
# context.toa.yaml
|
|
165
|
+
configuration:
|
|
166
|
+
identity.otp:
|
|
167
|
+
lifetime: 60 # seconds
|
|
91
168
|
```
|
|
92
169
|
|
|
93
170
|
## Identity inception
|
|
@@ -115,7 +192,7 @@ exposition:
|
|
|
115
192
|
The value of the `auth:incept` directive refers to the name of the response property that will be
|
|
116
193
|
returned by the `POST` operation, containing the created entity identifier.
|
|
117
194
|
|
|
118
|
-
A request with Identity inception
|
|
195
|
+
A request with Identity inception may contain (non-existent) credentials that will be associated
|
|
119
196
|
with the created Identity.
|
|
120
197
|
|
|
121
198
|
```http
|
|
@@ -137,6 +214,34 @@ id: 2428c31ecb6e4a51a24ef52f0c4181b9
|
|
|
137
214
|
As a result of processing the above request, the provided Basic credentials associated with the
|
|
138
215
|
Identity `2428c31ecb6e4a51a24ef52f0c4181b9` are created.
|
|
139
216
|
|
|
217
|
+
> `auth:incept` directive may have a `null` value, which means that the Identity will be created
|
|
218
|
+
> without any associated entity.
|
|
219
|
+
|
|
220
|
+
Inception is supported for `Basic` and `Bearer` authentication schemes.
|
|
221
|
+
|
|
222
|
+
## Identity assertion
|
|
223
|
+
|
|
224
|
+
`auth:assert` directive is used to ensure that given credentials are associated with an existing
|
|
225
|
+
Identity or to create a new Identity if it does not exist.
|
|
226
|
+
The directive itself does not allow or deny access to the requested resource.
|
|
227
|
+
|
|
228
|
+
> Used authentication scheme must support inception.
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
/accounts/echo:
|
|
232
|
+
auth:assert: true
|
|
233
|
+
auth:anyone: true
|
|
234
|
+
endpoint: echo
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
```http
|
|
238
|
+
GET /accounts/echo/
|
|
239
|
+
authorization: Basic new-or-existent-credentials
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
If new Identity is created and endpoint returns a successful response, the status code `201 Created`
|
|
243
|
+
is returned.
|
|
244
|
+
|
|
140
245
|
## FAQ
|
|
141
246
|
|
|
142
247
|
<dl>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Resource introspection
|
|
2
|
+
|
|
3
|
+
Any resource can be introspected by sending an `OPTIONS` request to the resource's path.
|
|
4
|
+
The response will contain the resource's input and output schemas for each supported method.
|
|
5
|
+
|
|
6
|
+
Introspection properties:
|
|
7
|
+
|
|
8
|
+
- `route` route parameters
|
|
9
|
+
- `query` query parameters
|
|
10
|
+
- `input` input schema
|
|
11
|
+
- `output` output schema
|
|
12
|
+
- `errors` error codes
|
|
13
|
+
|
|
14
|
+
```http
|
|
15
|
+
OPTIONS /pots/:id/ HTTP/1.1
|
|
16
|
+
accept: application/yaml
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```http
|
|
20
|
+
200 OK
|
|
21
|
+
Allow: GET, POST, OPTIONS
|
|
22
|
+
|
|
23
|
+
GET:
|
|
24
|
+
route:
|
|
25
|
+
id:
|
|
26
|
+
type: string
|
|
27
|
+
pattern: ^[a-fA-F0-9]{32}$
|
|
28
|
+
output:
|
|
29
|
+
type: array
|
|
30
|
+
items:
|
|
31
|
+
type: object
|
|
32
|
+
properties:
|
|
33
|
+
title:
|
|
34
|
+
type: string
|
|
35
|
+
maxLength: 64
|
|
36
|
+
volume:
|
|
37
|
+
type: number
|
|
38
|
+
exclusiveMinimum: 0
|
|
39
|
+
maximum: 1000
|
|
40
|
+
temperature:
|
|
41
|
+
type: number
|
|
42
|
+
exclusiveMinimum: 0
|
|
43
|
+
maximum: 300
|
|
44
|
+
additionalProperties: false
|
|
45
|
+
required:
|
|
46
|
+
- id
|
|
47
|
+
- title
|
|
48
|
+
- volume
|
|
49
|
+
POST:
|
|
50
|
+
route:
|
|
51
|
+
id:
|
|
52
|
+
type: string
|
|
53
|
+
pattern: ^[a-fA-F0-9]{32}$
|
|
54
|
+
input:
|
|
55
|
+
type: object
|
|
56
|
+
properties:
|
|
57
|
+
title:
|
|
58
|
+
type: string
|
|
59
|
+
maxLength: 64
|
|
60
|
+
temperature:
|
|
61
|
+
type: number
|
|
62
|
+
exclusiveMinimum: 0
|
|
63
|
+
maximum: 300
|
|
64
|
+
volume:
|
|
65
|
+
type: number
|
|
66
|
+
exclusiveMinimum: 0
|
|
67
|
+
maximum: 1000
|
|
68
|
+
additionalProperties: false
|
|
69
|
+
required:
|
|
70
|
+
- title
|
|
71
|
+
- volume
|
|
72
|
+
output:
|
|
73
|
+
type: object
|
|
74
|
+
properties:
|
|
75
|
+
id:
|
|
76
|
+
type: string
|
|
77
|
+
pattern: ^[a-fA-F0-9]{32}$
|
|
78
|
+
additionalProperties: false
|
|
79
|
+
errors:
|
|
80
|
+
- NO_WAY
|
|
81
|
+
- WONT_CREATE
|
|
82
|
+
```
|
package/documentation/io.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The Exposition comes with `io` directives to control access to the operation's input and output
|
|
4
4
|
properties.
|
|
5
5
|
|
|
6
|
-
##
|
|
6
|
+
## Input
|
|
7
7
|
|
|
8
8
|
The `io:input` optional directive contains a list of properties that are allowed to be specified in
|
|
9
9
|
the request body.
|
|
@@ -22,7 +22,7 @@ not in the list, the request will be rejected with a `400` status code.
|
|
|
22
22
|
> Therefore, `io:input` is only applicable to operations which input is an object or an
|
|
23
23
|
> array of objects.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Output
|
|
26
26
|
|
|
27
27
|
The `io:output` mandatory directive contains a list of properties that are allowed to be included in
|
|
28
28
|
the response body.
|
|
@@ -54,3 +54,43 @@ GET:
|
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
Output restrictions are not applied to stream responses and errors.
|
|
57
|
+
|
|
58
|
+
## Throttling
|
|
59
|
+
|
|
60
|
+
The `io:throttle` directive is used to limit the rate of the requests meeting the specified
|
|
61
|
+
criteria.
|
|
62
|
+
See [algorithm description](notes/throttling.md).
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
exposition:
|
|
66
|
+
/:
|
|
67
|
+
io:throttle:
|
|
68
|
+
key:
|
|
69
|
+
- route
|
|
70
|
+
- ip
|
|
71
|
+
- identity
|
|
72
|
+
- segment: id
|
|
73
|
+
- header: x-real-ip
|
|
74
|
+
- status: [4xx, 5xx]
|
|
75
|
+
requests: 500
|
|
76
|
+
interval: 30
|
|
77
|
+
cooldown: 30
|
|
78
|
+
status: 429
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Once the rate limit is reached, the server will block the requests with the specified `status`
|
|
82
|
+
code (429 by default) until the `cooldown` period expires.
|
|
83
|
+
|
|
84
|
+
> Currently, only `header` and `status` key components are supported.
|
|
85
|
+
|
|
86
|
+
### Request key components
|
|
87
|
+
|
|
88
|
+
Request components used to track quota usage and block requests:
|
|
89
|
+
|
|
90
|
+
- `header`: name of the header (or a list of header names), which value(s) will be used
|
|
91
|
+
|
|
92
|
+
### Response key components
|
|
93
|
+
|
|
94
|
+
Response components used only to track quota usage:
|
|
95
|
+
|
|
96
|
+
- `status`: response status code (or a list of status codes)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# HTTP context mapping
|
|
2
|
+
|
|
3
|
+
The `map` directive family is used to map HTTP request parts to operation call input properties.
|
|
4
|
+
|
|
5
|
+
[Features](../features/map.feature).
|
|
6
|
+
|
|
7
|
+
## TL;DR
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
exposition:
|
|
11
|
+
/:group:
|
|
12
|
+
languages: [en, fr] # supported languages
|
|
13
|
+
GET:
|
|
14
|
+
map:authority: hostname # request authority (e.g., hostname)
|
|
15
|
+
map:language: lang # requested language
|
|
16
|
+
map:headers: # raw header values
|
|
17
|
+
token: x-access-token
|
|
18
|
+
map:segments: # route parameters
|
|
19
|
+
group: group
|
|
20
|
+
map:claims: # Bearer token claims
|
|
21
|
+
address: email
|
|
22
|
+
verified: email_verified
|
|
23
|
+
endpoint: observe
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The operation input type must be an object.
|
|
27
|
+
If the input already contains the specified keys, they will be overwritten.
|
|
28
|
+
|
|
29
|
+
## Authority
|
|
30
|
+
|
|
31
|
+
The `map:authority` directive maps the [authority identifier](authorities.md) to an operation call
|
|
32
|
+
input property specified by the directive value.
|
|
33
|
+
|
|
34
|
+
### Language
|
|
35
|
+
|
|
36
|
+
The `map:language` mapping sets the [most matching](https://github.com/jshttp/negotiator) language
|
|
37
|
+
code based on the `accept-language` request header and a list of supported languages defined by
|
|
38
|
+
the `map:languages` directive, and also adds `accept-language` to the `Vary` HTTP response header
|
|
39
|
+
value.
|
|
40
|
+
|
|
41
|
+
If none of the supported languages match, the first supported language is used.
|
|
42
|
+
|
|
43
|
+
> `map:languages` has a shorthand form: `languages: [en, fr]`.
|
|
44
|
+
|
|
45
|
+
## Header values
|
|
46
|
+
|
|
47
|
+
The `map:headers` directive maps the values of HTTP request headers to operation call input
|
|
48
|
+
properties.
|
|
49
|
+
The value of the directive is a map where keys are the names of the input properties and values are
|
|
50
|
+
the names of the HTTP request headers.
|
|
51
|
+
|
|
52
|
+
The names of these headers are then included in the `Vary` HTTP response header
|
|
53
|
+
and [Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
|
|
54
|
+
of the [CORS](protocol.md#cors).
|
|
55
|
+
|
|
56
|
+
[Multiple header fields](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) are combined
|
|
57
|
+
as a comma-separated list.
|
|
58
|
+
|
|
59
|
+
## Route parameters
|
|
60
|
+
|
|
61
|
+
The `map:segments` directive maps the values of route parameters to operation call input properties.
|
|
62
|
+
The value of the directive is a map where keys are the names of the input properties, and values are
|
|
63
|
+
the names of the route parameters.
|
|
64
|
+
|
|
65
|
+
Parameter name may be prefixed with `~`
|
|
66
|
+
to indicate that the parameter should not be available to the
|
|
67
|
+
remaining directives or used as criteria in the operation call.
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
/:id/:tag:
|
|
71
|
+
POST:
|
|
72
|
+
map:segments:
|
|
73
|
+
id: id
|
|
74
|
+
tag: ~tag
|
|
75
|
+
endpoint: create
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Wildcard routes are supported by using `**` as the parameter name.
|
|
79
|
+
|
|
80
|
+
```yaml
|
|
81
|
+
/path/to/**:
|
|
82
|
+
GET:
|
|
83
|
+
map:segments:
|
|
84
|
+
path: '**'
|
|
85
|
+
endpoint: observe
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Bearer token claims
|
|
89
|
+
|
|
90
|
+
The `map:claims` directive maps the values of
|
|
91
|
+
the [token claims](https://datatracker.ietf.org/doc/html/rfc7519#section-4).
|
|
92
|
+
The value of the directive is a map where keys are the names of the input properties and values are
|
|
93
|
+
the names of the claims.
|
|
94
|
+
|
|
95
|
+
If the claim is not present in the token or the request is not authenticated using
|
|
96
|
+
the [`Bearer` scheme](identity.md#bearer-scheme), the input properties are not set.
|
|
Binary file
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Distributed Peer Discovery
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
Modulo partitioning algorithm `taks.id % replicas == index` requires
|
|
6
|
+
to know the number of task processing instances running in the cluster,
|
|
7
|
+
and the own index of the current instance.
|
|
8
|
+
|
|
9
|
+
## Forces
|
|
10
|
+
|
|
11
|
+
1. Static configuration is not an option (due to dynamic scaling / failover).
|
|
12
|
+
2. In a distributed system, there is no concept of a *global current time*.
|
|
13
|
+
|
|
14
|
+
## Solution
|
|
15
|
+
|
|
16
|
+
An algorithm that emits `(index, replicas)` once per `interval` seconds, using common Redis
|
|
17
|
+
key and atomic increment.
|
|
18
|
+
|
|
19
|
+
Define the following parameters:
|
|
20
|
+
|
|
21
|
+
- `name`: a name of the task processing (e.g. `mail-sender`)
|
|
22
|
+
- `interval`: indexing interval that is deliberately greater than the expected clock skew among
|
|
23
|
+
instances
|
|
24
|
+
|
|
25
|
+
At the start of each `interval` in [Unix epoch](https://en.wikipedia.org/wiki/Unix_time):
|
|
26
|
+
|
|
27
|
+
1. Calculate an ordinal number of the current interval: `number = ceil(now() / interval)`
|
|
28
|
+
2. Compose a `key` as `{name}:{number}`
|
|
29
|
+
3. Atomically increment a `key` in Redis ([INCR](https://redis.io/docs/latest/commands/incr/))
|
|
30
|
+
4. If `index` is defined (see 5)
|
|
31
|
+
|
|
32
|
+
- get the value of previous key `{name}:{number-1}` as `replicas`
|
|
33
|
+
- if the `replicas` is defined, emit `(index, replicas)` **algorithm result**
|
|
34
|
+
|
|
35
|
+
5. Store the response (3) in `index`.
|
|
36
|
+
|
|
37
|
+
## Safe index transition
|
|
38
|
+
|
|
39
|
+
If the `index` or `replicas` changes, the algorithm consumer must stop consuming new tasks
|
|
40
|
+
and execute _safe index transition_, to prevent task duplication or loss.
|
|
41
|
+
|
|
42
|
+
The transition can be implemented in a manner similar to the described algorithm, using a dedicated
|
|
43
|
+
`{name}:transition` key.
|
|
44
|
+
However, this process is considered outside the scope of this document.
|
|
45
|
+
|
|
46
|
+
## Extension
|
|
47
|
+
|
|
48
|
+
If the system clocks are too precisely synchronized (skew is less than a round-trip time to Redis),
|
|
49
|
+
this may result in continuous [index transitions](#safe-index-transition).
|
|
50
|
+
|
|
51
|
+
To mitigate this, the algorithm can be extended with a random delay:
|
|
52
|
+
|
|
53
|
+
1. Before starting the algorithm, define a random constant clock skew, significantly smaller than
|
|
54
|
+
`interval`: `skew = random() * (interval / 2)`
|
|
55
|
+
2. Start the algorithm at each `interval + skew`.
|
|
56
|
+
|
|
57
|
+
## Caveats
|
|
58
|
+
|
|
59
|
+
- The first result will become known between `interval` and `interval × 2` seconds.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Decentralized Request Throttling
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
|
|
5
|
+
To prevent an unnecessary load, API requests should be throttled when made maliciously or due to an
|
|
6
|
+
error.
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
1. The [API Gateway](https://microservices.io/patterns/apigateway.html) of a distributed system runs
|
|
11
|
+
in multiple instances, each with an in-memory state that does not allow tracking the current
|
|
12
|
+
quota usage.
|
|
13
|
+
2. Precise quota enforcement (per request, per second) is not critical; the goal is to prevent
|
|
14
|
+
significant overuse.
|
|
15
|
+
3. Quota configuration is static.
|
|
16
|
+
|
|
17
|
+
## Forces
|
|
18
|
+
|
|
19
|
+
1. No per request IO is allowed (centralized solutions do not fit).
|
|
20
|
+
2. In a distributed system, there is no concept of a *global current time*.
|
|
21
|
+
3. Failure to retrieve the quota state should not result in Gateway failure.
|
|
22
|
+
|
|
23
|
+
## Solution
|
|
24
|
+
|
|
25
|
+
Implement in-memory quotas in each process, periodically synchronizing them asynchronously using
|
|
26
|
+
Redis.
|
|
27
|
+
|
|
28
|
+
Consider a basic throttling rule:
|
|
29
|
+
|
|
30
|
+
1. No more than `MAX_REQUESTS` within `INTERVAL` time for any API route (`KEY`).
|
|
31
|
+
2. If the limit is exceeded, block requests to `KEY` for `COOLDOWN` seconds.
|
|
32
|
+
|
|
33
|
+
### Concept
|
|
34
|
+
|
|
35
|
+
1. Divide `INTERVAL` into `N` spans (`N >= 2`).
|
|
36
|
+
2. At the end of each span,
|
|
37
|
+
atomically increment the value in Redis ([INCRBY](https://redis.io/docs/latest/commands/incrby/))
|
|
38
|
+
by the number of requests received for each `KEY`, using a key composed of the `KEY` and the
|
|
39
|
+
current ordinal number of `INTERVAL`
|
|
40
|
+
in [Unix epoch](https://en.wikipedia.org/wiki/Unix_time).
|
|
41
|
+
3. If the returned value exceeds `MAX_REQUESTS`, block access to `KEY`, remove after `COOLDOWN`.
|
|
42
|
+
4. If the write operation fails and `REQUESTS > MAX_REQUESTS / N` (i.e., the quota is exceeded
|
|
43
|
+
locally), block access to `KEY`, remove after `COOLDOWN`.
|
|
44
|
+
|
|
45
|
+
Each API Gateway instance will generate the `KEY` based on its own local time,
|
|
46
|
+
which, in general, will lead to simultaneous writes (from Redis’s local time perspective) to
|
|
47
|
+
different `KEY`s. However, the total contribution of each node to each `KEY` will correspond to the
|
|
48
|
+
actual request rate experienced by that node.
|
|
49
|
+
|
|
50
|
+
<img src="desync.jpg" alt="Desynchronization" />
|
|
51
|
+
|
|
52
|
+
Dividing the `INTERVAL` into spans smooths the desynchronization effect.
|
|
53
|
+
|
|
54
|
+
### Extension
|
|
55
|
+
|
|
56
|
+
Introduce `nodes`, the approximate number of active API Gateway instances, to improve the algorithm.
|
|
57
|
+
|
|
58
|
+
1. Initially, `nodes` equals to `1`.
|
|
59
|
+
2. During each `INTERVAL`, sum the total request count for each `KEY`, keep current and previous
|
|
60
|
+
values.
|
|
61
|
+
3. At the end of each interval:
|
|
62
|
+
|
|
63
|
+
- Read the value from the `KEY` for the previous interval. At this point, it is assumed that all
|
|
64
|
+
nodes have switched to the next interval.
|
|
65
|
+
- Update the `nodes` value by dividing response form Redis by the number of `REQUESTS` counted for
|
|
66
|
+
the previous interval.
|
|
67
|
+
- Set the previous value to the current value.
|
|
68
|
+
- Set the current value to `0`
|
|
69
|
+
|
|
70
|
+
4. Update point 4 of the [Concept](#concept): `REQUESTS * nodes > MAX_REQUESTS / N`.
|
|
71
|
+
This will increase the precision of the local quota enforcement.
|
|
72
|
+
5. Add a new step: if `REQUESTS * nodes > MAX_REQUESTS`, block access to `KEY`, remove after
|
|
73
|
+
`COOLDOWN`.
|
|
74
|
+
|
|
75
|
+
When nodes are added or removed, the algorithm will adapt in the upcoming intervals.
|
|
76
|
+
|
|
77
|
+
### Caveats
|
|
78
|
+
|
|
79
|
+
1. In the worst case scenario (really, really unlikely), the quota is exceeded by `MAX_REQUESTS / N`
|
|
80
|
+
in a span on each node.
|
|
81
|
+
2. Time desynchronization between nodes should be insignificant for the selected `INTERVAL` (i.e.,
|
|
82
|
+
`INTERVAL` >> desync). See Extension point 3.
|