@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.10
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 +12 -0
- package/components/identity.bans/manifest.toa.yaml +2 -1
- package/components/identity.basic/manifest.toa.yaml +5 -1
- package/components/identity.basic/operations/authenticate.js +1 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/source/authenticate.ts +0 -1
- package/components/identity.federation/events/principal.js +22 -0
- package/components/identity.federation/manifest.toa.yaml +94 -0
- package/components/identity.federation/operations/authenticate.d.ts +3 -0
- package/components/identity.federation/operations/authenticate.js +20 -0
- package/components/identity.federation/operations/authenticate.js.map +1 -0
- package/components/identity.federation/operations/create.d.ts +10 -0
- package/components/identity.federation/operations/create.js +15 -0
- package/components/identity.federation/operations/create.js.map +1 -0
- package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
- package/components/identity.federation/operations/lib/jwt.js +136 -0
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +59 -0
- package/components/identity.federation/operations/schemas.js +9 -0
- package/components/identity.federation/operations/schemas.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.federation/operations/types.d.ts +51 -0
- package/components/identity.federation/operations/types.js +3 -0
- package/components/identity.federation/operations/types.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +28 -0
- package/components/identity.federation/source/create.ts +26 -0
- package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/lib/jwt.ts +171 -0
- package/components/identity.federation/source/schemas.ts +61 -0
- package/components/identity.federation/source/types.ts +56 -0
- package/components/identity.federation/tsconfig.json +9 -0
- package/components/identity.roles/manifest.toa.yaml +17 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +20 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +31 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +1 -1
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/octets.storage/manifest.toa.yaml +1 -0
- package/components/octets.storage/operations/store.js +3 -3
- package/cucumber.js +0 -1
- package/documentation/access.md +11 -11
- package/documentation/components.md +48 -12
- package/documentation/identity.md +14 -7
- package/documentation/io.md +56 -0
- package/documentation/octets.md +102 -37
- package/documentation/protocol.md +21 -1
- package/documentation/query.md +51 -6
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +69 -0
- package/features/access.feature +13 -2
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +3 -0
- package/features/cors.feature +72 -0
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +4 -3
- package/features/etag.feature +97 -0
- package/features/identity.basic.feature +68 -0
- package/features/identity.feature +19 -3
- package/features/identity.federation.feature +153 -0
- package/features/identity.roles.feature +151 -0
- package/features/identity.tokens.feature +3 -0
- package/features/io.feature +167 -0
- package/features/octets.entries.feature +123 -0
- package/features/octets.feature +4 -28
- package/features/octets.meta.feature +66 -0
- package/features/octets.workflows.feature +177 -4
- package/features/queries.feature +9 -1
- package/features/response.feature +68 -0
- package/features/routes.feature +54 -10
- package/features/steps/Captures.ts +6 -0
- package/features/steps/Components.ts +18 -6
- package/features/steps/Database.ts +1 -1
- package/features/steps/Gateway.ts +4 -2
- package/features/steps/HTTP.ts +34 -6
- package/features/steps/IdP.ts +149 -0
- package/features/steps/Parameters.ts +8 -2
- package/features/steps/Workspace.ts +5 -7
- package/features/steps/components/echo/manifest.toa.yaml +1 -0
- package/features/steps/components/echo/operations/error.js +11 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
- package/features/steps/components/octets.tester/operations/concat.js +7 -0
- package/features/steps/components/octets.tester/operations/echo.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users/manifest.toa.yaml +4 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
- package/features/steps/tsconfig.json +1 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +180 -0
- package/package.json +16 -20
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/schemas/octets/delete.cos.yaml +2 -1
- package/schemas/octets/list.cos.yaml +2 -1
- package/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +14 -8
- package/source/Directive.ts +26 -49
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +23 -12
- package/source/Gateway.ts +45 -42
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +61 -134
- package/source/HTTP/Server.ts +83 -87
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/formats/msgpack.ts +9 -6
- package/source/HTTP/formats/text.ts +1 -1
- package/source/HTTP/formats/yaml.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +38 -42
- package/source/Interception.ts +24 -0
- package/source/Mapping.ts +7 -8
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +19 -15
- package/source/RTD/factory.ts +2 -5
- package/source/RTD/syntax/parse.ts +6 -6
- package/source/RTD/syntax/types.ts +1 -1
- package/source/deployment.ts +7 -2
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
- package/source/directives/auth/Delegate.ts +32 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.ts +5 -3
- package/source/directives/auth/Rule.ts +2 -2
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/index.ts +2 -2
- package/source/directives/auth/schemes.ts +2 -1
- package/source/directives/auth/types.ts +9 -6
- package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
- package/source/directives/cache/Control.ts +5 -5
- package/source/directives/cache/index.ts +2 -2
- package/source/directives/cache/types.ts +2 -2
- package/source/directives/cors/CORS.ts +62 -0
- package/source/directives/cors/index.ts +3 -0
- package/source/directives/dev/{Family.ts → Development.ts} +4 -5
- package/source/directives/dev/Stub.ts +4 -4
- package/source/directives/dev/Throw.ts +4 -4
- package/source/directives/dev/index.ts +2 -2
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/index.ts +11 -6
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +6 -5
- package/source/directives/octets/Delete.ts +64 -11
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +44 -29
- package/source/directives/octets/List.ts +50 -10
- package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
- package/source/directives/octets/Permute.ts +18 -11
- package/source/directives/octets/Store.ts +70 -102
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/index.ts +2 -2
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +13 -6
- package/source/directives/octets/types.ts +2 -8
- package/source/directives/octets/workflows/Execution.ts +76 -0
- package/source/directives/octets/workflows/Workflow.ts +37 -0
- package/source/directives/octets/workflows/index.ts +1 -0
- package/source/directives/vary/Directive.ts +6 -0
- package/source/directives/vary/Embed.ts +62 -0
- package/source/directives/vary/Properties.ts +17 -0
- package/source/directives/vary/Vary.ts +48 -0
- package/source/directives/vary/embeddings/Embedding.ts +6 -0
- package/source/directives/vary/embeddings/Header.ts +32 -0
- package/source/directives/vary/embeddings/Language.ts +31 -0
- package/source/directives/vary/embeddings/index.ts +11 -0
- package/source/directives/vary/index.ts +3 -0
- package/source/exceptions.ts +13 -9
- package/source/io.ts +4 -0
- package/source/manifest.test.ts +6 -14
- package/source/manifest.ts +9 -6
- package/source/root.ts +5 -0
- package/source/schemas.ts +7 -3
- package/transpiled/Annotation.d.ts +1 -0
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +11 -25
- package/transpiled/Directive.js +17 -18
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +58 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +0 -1
- package/transpiled/Factory.js +14 -7
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +7 -8
- package/transpiled/Gateway.js +25 -25
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +10 -7
- package/transpiled/HTTP/Server.js +80 -70
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
- package/transpiled/HTTP/formats/msgpack.js +8 -29
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.d.ts +3 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +1 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/index.d.ts +1 -0
- package/transpiled/HTTP/index.js +1 -0
- package/transpiled/HTTP/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +7 -16
- package/transpiled/HTTP/messages.js +28 -25
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Mapping.js +7 -7
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +5 -0
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/deployment.js +6 -2
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +3 -4
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -5
- package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
- package/transpiled/directives/auth/Authorization.js.map +1 -0
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +27 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +11 -6
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.js +5 -3
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.d.ts +2 -2
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/index.d.ts +2 -2
- package/transpiled/directives/auth/index.js +4 -5
- package/transpiled/directives/auth/index.js.map +1 -1
- package/transpiled/directives/auth/schemes.js +2 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +4 -4
- package/transpiled/directives/cache/Cache.d.ts +11 -0
- package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
- package/transpiled/directives/cache/Cache.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +3 -3
- package/transpiled/directives/cache/Control.js +3 -3
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/index.d.ts +2 -2
- package/transpiled/directives/cache/index.js +4 -5
- package/transpiled/directives/cache/index.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +2 -2
- package/transpiled/directives/cors/CORS.d.ts +10 -0
- package/transpiled/directives/cors/CORS.js +51 -0
- package/transpiled/directives/cors/CORS.js.map +1 -0
- package/transpiled/directives/cors/index.d.ts +2 -0
- package/transpiled/directives/cors/index.js +6 -0
- package/transpiled/directives/cors/index.js.map +1 -0
- package/transpiled/directives/dev/Development.d.ts +9 -0
- package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +3 -3
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.d.ts +3 -3
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/dev/index.d.ts +2 -2
- package/transpiled/directives/dev/index.js +4 -5
- package/transpiled/directives/dev/index.js.map +1 -1
- package/transpiled/directives/dev/types.d.ts +1 -1
- package/transpiled/directives/index.d.ts +4 -2
- package/transpiled/directives/index.js +10 -9
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/io/Input.js +63 -0
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +5 -5
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +15 -5
- package/transpiled/directives/octets/Delete.js +45 -8
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +9 -9
- package/transpiled/directives/octets/Fetch.js +36 -21
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +11 -5
- package/transpiled/directives/octets/List.js +34 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +5 -4
- package/transpiled/directives/octets/Permute.js +15 -8
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +14 -23
- package/transpiled/directives/octets/Store.js +41 -70
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/index.d.ts +2 -2
- package/transpiled/directives/octets/index.js +4 -5
- package/transpiled/directives/octets/index.js.map +1 -1
- package/transpiled/directives/octets/schemas.d.ts +13 -6
- package/transpiled/directives/octets/schemas.js +2 -1
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +2 -6
- package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
- package/transpiled/directives/octets/workflows/Execution.js +54 -0
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
- package/transpiled/directives/octets/workflows/Workflow.js +25 -0
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.d.ts +1 -0
- package/transpiled/directives/octets/workflows/index.js +6 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +5 -0
- package/transpiled/directives/vary/Directive.js +3 -0
- package/transpiled/directives/vary/Directive.js.map +1 -0
- package/transpiled/directives/vary/Embed.d.ts +10 -0
- package/transpiled/directives/vary/Embed.js +49 -0
- package/transpiled/directives/vary/Embed.js.map +1 -0
- package/transpiled/directives/vary/Properties.d.ts +9 -0
- package/transpiled/directives/vary/Properties.js +16 -0
- package/transpiled/directives/vary/Properties.js.map +1 -0
- package/transpiled/directives/vary/Vary.d.ts +10 -0
- package/transpiled/directives/vary/Vary.js +36 -0
- package/transpiled/directives/vary/Vary.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
- package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Header.js +28 -0
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Language.js +28 -0
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/index.js +10 -0
- package/transpiled/directives/vary/embeddings/index.js.map +1 -0
- package/transpiled/directives/vary/index.d.ts +2 -0
- package/transpiled/directives/vary/index.js +6 -0
- package/transpiled/directives/vary/index.js.map +1 -0
- package/transpiled/exceptions.js +7 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.js +10 -5
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +7 -3
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/source/HTTP/Server.fixtures.ts +0 -41
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
- package/transpiled/HTTP/Server.fixtures.js +0 -32
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/auth/Family.js.map +0 -1
- package/transpiled/directives/cache/Family.d.ts +0 -12
- package/transpiled/directives/cache/Family.js.map +0 -1
- package/transpiled/directives/dev/Family.d.ts +0 -10
- package/transpiled/directives/dev/Family.js.map +0 -1
- package/transpiled/directives/octets/Family.d.ts +0 -12
- package/transpiled/directives/octets/Family.js.map +0 -1
package/source/RTD/Directives.ts
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
import type { Parameter } from './Match'
|
|
1
2
|
import type * as syntax from './syntax'
|
|
3
|
+
import type { Context, OutgoingMessage } from '../HTTP'
|
|
4
|
+
import type { Output } from '../io'
|
|
2
5
|
|
|
3
|
-
export interface Directives
|
|
4
|
-
|
|
6
|
+
export interface Directives {
|
|
7
|
+
preflight: (context: Context, parameters: Parameter[]) => Promise<Output>
|
|
8
|
+
settle: (context: Context, response: OutgoingMessage) => Promise<void>
|
|
5
9
|
}
|
|
6
10
|
|
|
7
|
-
export interface
|
|
8
|
-
create: (directives: syntax.Directive[]) =>
|
|
11
|
+
export interface DirectiveFactory {
|
|
12
|
+
create: (directives: syntax.Directive[]) => Directives
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface DirectiveSet {
|
|
16
|
+
family: DirectiveFamily
|
|
17
|
+
directives: any[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DirectiveFamily<TDirective = any, TExtension = any> {
|
|
21
|
+
readonly name: string
|
|
22
|
+
readonly mandatory: boolean
|
|
23
|
+
|
|
24
|
+
create: (name: string, ...rest: any[]) => TDirective
|
|
25
|
+
|
|
26
|
+
preflight?: (directives: TDirective[],
|
|
27
|
+
request: Context & TExtension,
|
|
28
|
+
parameters: Parameter[]) => Output | Promise<Output>
|
|
29
|
+
|
|
30
|
+
settle?: (directives: TDirective[],
|
|
31
|
+
request: Context & TExtension,
|
|
32
|
+
response: OutgoingMessage) => void | Promise<void>
|
|
9
33
|
}
|
package/source/RTD/Endpoint.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type Context } from './Context'
|
|
2
|
+
import type * as http from '../HTTP'
|
|
2
3
|
import type * as syntax from './syntax'
|
|
4
|
+
import type * as RTD from './index'
|
|
3
5
|
|
|
4
|
-
export interface Endpoint
|
|
5
|
-
call:
|
|
6
|
+
export interface Endpoint {
|
|
7
|
+
call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
|
|
6
8
|
close: () => Promise<void>
|
|
7
9
|
}
|
|
8
10
|
|
|
9
|
-
export interface EndpointsFactory
|
|
10
|
-
create: (method: syntax.Method, context: Context) =>
|
|
11
|
+
export interface EndpointsFactory {
|
|
12
|
+
create: (method: syntax.Method, context: Context) => Endpoint
|
|
11
13
|
}
|
package/source/RTD/Match.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { type Node } from './Node'
|
|
2
|
-
import { type Directives } from './Directives'
|
|
3
|
-
import { type Endpoint } from './Endpoint'
|
|
4
2
|
|
|
5
|
-
export interface Match
|
|
6
|
-
|
|
7
|
-
TDirectives extends Directives<TDirectives> = any
|
|
8
|
-
> {
|
|
9
|
-
node: Node<TEndpoint, TDirectives>
|
|
3
|
+
export interface Match {
|
|
4
|
+
node: Node
|
|
10
5
|
parameters: Parameter[]
|
|
11
6
|
}
|
|
12
7
|
|
package/source/RTD/Method.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Endpoint } from './Endpoint'
|
|
2
|
+
import type { Directives } from './Directives'
|
|
3
3
|
|
|
4
|
-
export class Method
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> {
|
|
8
|
-
public readonly endpoint: TEndpoint | null
|
|
9
|
-
public readonly directives: TDirectives
|
|
4
|
+
export class Method {
|
|
5
|
+
public readonly endpoint: Endpoint | null
|
|
6
|
+
public readonly directives: Directives
|
|
10
7
|
|
|
11
|
-
public constructor (endpoint:
|
|
8
|
+
public constructor (endpoint: Endpoint | null, directives: Directives) {
|
|
12
9
|
this.endpoint = endpoint
|
|
13
10
|
this.directives = directives
|
|
14
11
|
}
|
|
@@ -18,7 +15,4 @@ export class Method<
|
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
|
|
21
|
-
export type Methods<
|
|
22
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
23
|
-
TDirectives extends Directives<TDirectives> = any
|
|
24
|
-
> = Record<string, Method<TEndpoint, TDirectives>>
|
|
18
|
+
export type Methods = Record<string, Method>
|
package/source/RTD/Node.ts
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
import { type Route } from './Route'
|
|
2
2
|
import { type Methods } from './Method'
|
|
3
3
|
import { type Match, type Parameter } from './Match'
|
|
4
|
-
import { type Directives } from './Directives'
|
|
5
|
-
import { type Endpoint } from './Endpoint'
|
|
6
4
|
|
|
7
|
-
export class Node
|
|
8
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
9
|
-
TDirectives extends Directives<TDirectives> = any
|
|
10
|
-
> {
|
|
5
|
+
export class Node {
|
|
11
6
|
public intermediate: boolean
|
|
12
|
-
public methods: Methods
|
|
7
|
+
public methods: Methods
|
|
13
8
|
private readonly protected: boolean
|
|
14
9
|
private routes: Route[]
|
|
15
10
|
|
|
16
11
|
public constructor
|
|
17
|
-
(routes: Route[], methods: Methods
|
|
12
|
+
(routes: Route[], methods: Methods, properties: Properties) {
|
|
18
13
|
this.routes = routes
|
|
19
14
|
this.methods = methods
|
|
20
15
|
this.protected = properties.protected
|
|
@@ -34,26 +29,30 @@ export class Node<
|
|
|
34
29
|
return null
|
|
35
30
|
}
|
|
36
31
|
|
|
37
|
-
public merge (node: Node
|
|
32
|
+
public merge (node: Node): void {
|
|
38
33
|
this.intermediate = node.intermediate
|
|
39
34
|
|
|
40
|
-
if (!this.protected)
|
|
41
|
-
|
|
35
|
+
if (!this.protected)
|
|
36
|
+
this.replace(node)
|
|
37
|
+
else
|
|
38
|
+
this.append(node)
|
|
42
39
|
|
|
43
40
|
this.sort()
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
private replace (node: Node
|
|
43
|
+
private replace (node: Node): void {
|
|
47
44
|
const methods = Object.values(this.methods)
|
|
48
45
|
|
|
49
46
|
this.routes = node.routes
|
|
50
47
|
this.methods = node.methods
|
|
51
48
|
|
|
52
49
|
for (const method of methods)
|
|
53
|
-
void method.close()
|
|
50
|
+
void method.close()
|
|
51
|
+
|
|
52
|
+
// race condition is really unlikely
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
private append (node: Node
|
|
55
|
+
private append (node: Node): void {
|
|
57
56
|
for (const route of node.routes)
|
|
58
57
|
this.mergeRoute(route)
|
|
59
58
|
|
package/source/RTD/Tree.ts
CHANGED
|
@@ -1,30 +1,33 @@
|
|
|
1
|
-
import { type Node } from './Node'
|
|
2
1
|
import { createNode } from './factory'
|
|
3
2
|
import { fragment } from './segment'
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
3
|
+
import type { Node } from './Node'
|
|
4
|
+
import type { Match } from './Match'
|
|
5
|
+
import type { Context } from './Context'
|
|
6
|
+
import type { DirectiveFactory } from './Directives'
|
|
7
|
+
import type { EndpointsFactory } from './Endpoint'
|
|
8
8
|
import type * as syntax from './syntax'
|
|
9
9
|
|
|
10
|
-
export class Tree
|
|
11
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
12
|
-
TDirectives extends Directives<TDirectives> = any
|
|
13
|
-
> {
|
|
10
|
+
export class Tree {
|
|
14
11
|
private readonly root: syntax.Node
|
|
15
|
-
private readonly trunk: Node
|
|
16
|
-
private readonly endpoints: EndpointsFactory
|
|
17
|
-
private readonly directives:
|
|
12
|
+
private readonly trunk: Node
|
|
13
|
+
private readonly endpoints: EndpointsFactory
|
|
14
|
+
private readonly directives: DirectiveFactory
|
|
18
15
|
|
|
19
16
|
public constructor
|
|
20
|
-
(node: syntax.Node, endpoints: EndpointsFactory, directives:
|
|
17
|
+
(node: syntax.Node, endpoints: EndpointsFactory, directives: DirectiveFactory) {
|
|
21
18
|
this.endpoints = endpoints
|
|
22
19
|
this.directives = directives
|
|
23
20
|
this.trunk = this.createNode(node, PROTECTED)
|
|
24
21
|
this.root = node
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
public match (path: string): Match
|
|
24
|
+
public match (path: string): Match | null {
|
|
25
|
+
if (path === '/')
|
|
26
|
+
return {
|
|
27
|
+
node: this.trunk,
|
|
28
|
+
parameters: []
|
|
29
|
+
}
|
|
30
|
+
|
|
28
31
|
const fragments = fragment(path)
|
|
29
32
|
|
|
30
33
|
return this.trunk.match(fragments)
|
|
@@ -36,7 +39,8 @@ export class Tree<
|
|
|
36
39
|
this.trunk.merge(branch)
|
|
37
40
|
}
|
|
38
41
|
|
|
39
|
-
private createNode
|
|
42
|
+
private createNode
|
|
43
|
+
(node: syntax.Node, protect: boolean, extension?: any): Node {
|
|
40
44
|
const context: Context = {
|
|
41
45
|
protected: protect,
|
|
42
46
|
endpoints: this.endpoints,
|
package/source/RTD/factory.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { Node, type Properties } from './Node'
|
|
2
2
|
import { Route } from './Route'
|
|
3
|
-
import { type Context } from './Context'
|
|
4
3
|
import { segment } from './segment'
|
|
5
4
|
import { Method, type Methods } from './Method'
|
|
6
|
-
import {
|
|
7
|
-
import { type Directives } from './Directives'
|
|
5
|
+
import type { Context } from './Context'
|
|
8
6
|
import type * as syntax from './syntax'
|
|
9
7
|
|
|
10
|
-
export function createNode
|
|
11
|
-
(node: syntax.Node, context: Context): Node<TEndpoint, TDirectives> {
|
|
8
|
+
export function createNode (node: syntax.Node, context: Context): Node {
|
|
12
9
|
if (node.isolated === true)
|
|
13
10
|
context.directives.stack = node.directives
|
|
14
11
|
else
|
|
@@ -28,7 +28,7 @@ function parseNode (input: object, shortcuts?: Shortcuts): Node {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
if (key[0] === '/') {
|
|
31
|
-
const route = parseRoute(key, value, shortcuts)
|
|
31
|
+
const route = parseRoute(key, value as Node, shortcuts)
|
|
32
32
|
|
|
33
33
|
node.routes.push(route)
|
|
34
34
|
|
|
@@ -36,7 +36,7 @@ function parseNode (input: object, shortcuts?: Shortcuts): Node {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
if (verbs.has(key)) {
|
|
39
|
-
const method = parseMethod(key, value, shortcuts)
|
|
39
|
+
const method = parseMethod(key, value as Mapping, shortcuts)
|
|
40
40
|
|
|
41
41
|
node.methods.push(method)
|
|
42
42
|
|
|
@@ -65,7 +65,7 @@ export function createNode (): Node {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
function parseRoute (path: string, value:
|
|
68
|
+
function parseRoute (path: string, value: Node, shortcuts?: Shortcuts): Route {
|
|
69
69
|
const node = parse(value, shortcuts)
|
|
70
70
|
|
|
71
71
|
return createRoute(path, node)
|
|
@@ -106,10 +106,10 @@ function parseQuery (mapping: any): void {
|
|
|
106
106
|
return
|
|
107
107
|
|
|
108
108
|
if (typeof query.limit === 'number')
|
|
109
|
-
query.limit = expandRange(query.limit)
|
|
109
|
+
query.limit = expandRange(query.limit as number)
|
|
110
110
|
|
|
111
111
|
if (typeof query.omit === 'number')
|
|
112
|
-
query.omit = expandRange(query.omit)
|
|
112
|
+
query.omit = expandRange(query.omit as number)
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts): Directive[] {
|
|
@@ -132,7 +132,7 @@ function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts):
|
|
|
132
132
|
|
|
133
133
|
function parseDirective (key: string, value: any, shortcuts?: Shortcuts): Directive | null {
|
|
134
134
|
if (shortcuts?.has(key) === true)
|
|
135
|
-
key = shortcuts.get(key)
|
|
135
|
+
key = shortcuts.get(key)! // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
136
136
|
|
|
137
137
|
const match = key.match(DIRECTIVE_RX)
|
|
138
138
|
|
package/source/deployment.ts
CHANGED
|
@@ -27,8 +27,7 @@ export function deployment (_: unknown, annotation: Annotation | undefined): Dep
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
if (annotation?.['/'] !== undefined) {
|
|
30
|
-
const
|
|
31
|
-
const tree = parse(node, shortcuts)
|
|
30
|
+
const tree = parse(annotation['/'], shortcuts)
|
|
32
31
|
|
|
33
32
|
service.variables.push({
|
|
34
33
|
name: 'TOA_EXPOSITION',
|
|
@@ -42,6 +41,12 @@ export function deployment (_: unknown, annotation: Annotation | undefined): Dep
|
|
|
42
41
|
value: '1'
|
|
43
42
|
})
|
|
44
43
|
|
|
44
|
+
if (annotation?.trace === true)
|
|
45
|
+
service.variables.push({
|
|
46
|
+
name: 'TOA_EXPOSITION_TRACE',
|
|
47
|
+
value: '1'
|
|
48
|
+
})
|
|
49
|
+
|
|
45
50
|
if (annotation !== undefined)
|
|
46
51
|
schemas.annotaion.validate(annotation)
|
|
47
52
|
|
|
@@ -8,7 +8,8 @@ export class Anonymous implements Directive {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
public authorize (_: any, input: Input): boolean {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
return 'authorization' in input.request.headers
|
|
12
|
+
? false
|
|
13
|
+
: this.allow
|
|
13
14
|
}
|
|
14
15
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
1
2
|
import { match } from 'matchacho'
|
|
2
3
|
import * as http from '../../HTTP'
|
|
3
4
|
import { Anonymous } from './Anonymous'
|
|
@@ -6,13 +7,14 @@ import { Role } from './Role'
|
|
|
6
7
|
import { Rule } from './Rule'
|
|
7
8
|
import { Incept } from './Incept'
|
|
8
9
|
import { Echo } from './Echo'
|
|
9
|
-
import { split } from './split'
|
|
10
10
|
import { Scheme } from './Scheme'
|
|
11
|
+
import { Delegate } from './Delegate'
|
|
12
|
+
import { split } from './split'
|
|
11
13
|
import { PRIMARY, PROVIDERS } from './schemes'
|
|
14
|
+
import type { Output } from '../../io'
|
|
12
15
|
import type { Component } from '@toa.io/core'
|
|
13
16
|
import type { Remotes } from '../../Remotes'
|
|
14
|
-
import type {
|
|
15
|
-
import type { Parameter } from '../../RTD'
|
|
17
|
+
import type { Parameter, DirectiveFamily } from '../../RTD'
|
|
16
18
|
import type {
|
|
17
19
|
AuthenticationResult,
|
|
18
20
|
Ban,
|
|
@@ -25,7 +27,8 @@ import type {
|
|
|
25
27
|
Schemes
|
|
26
28
|
} from './types'
|
|
27
29
|
|
|
28
|
-
class Authorization implements
|
|
30
|
+
export class Authorization implements DirectiveFamily<Directive, Extension> {
|
|
31
|
+
public readonly depends: string[] = ['Vary']
|
|
29
32
|
public readonly name: string = 'auth'
|
|
30
33
|
public readonly mandatory: boolean = true
|
|
31
34
|
|
|
@@ -35,24 +38,25 @@ class Authorization implements Family<Directive, Extension> {
|
|
|
35
38
|
private bans: Component | null = null
|
|
36
39
|
|
|
37
40
|
public create (name: string, value: any, remotes: Remotes): Directive {
|
|
38
|
-
|
|
41
|
+
assert.ok(name in constructors,
|
|
42
|
+
`Directive '${name}' is not provided by the '${this.name}' family.`)
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
|
|
44
|
+
const Class = constructors[name]
|
|
42
45
|
|
|
43
46
|
for (const name of REMOTES)
|
|
44
47
|
this.discovery[name] ??= remotes.discover('identity', name)
|
|
45
48
|
|
|
46
49
|
return match(Class,
|
|
47
|
-
Role, () => new Role(value, this.discovery.roles),
|
|
48
|
-
Rule, () => new Rule(value, this.create.bind(this)),
|
|
49
|
-
Incept, () => new Incept(value, this.discovery),
|
|
50
|
+
Role, () => new Role(value as string | string[], this.discovery.roles),
|
|
51
|
+
Rule, () => new Rule(value as Record<string, string>, this.create.bind(this)),
|
|
52
|
+
Incept, () => new Incept(value as string, this.discovery),
|
|
50
53
|
() => new Class(value))
|
|
51
54
|
}
|
|
52
55
|
|
|
53
|
-
public async preflight
|
|
54
|
-
|
|
55
|
-
|
|
56
|
+
public async preflight (directives: Directive[],
|
|
57
|
+
input: Input,
|
|
58
|
+
parameters: Parameter[]): Promise<Output> {
|
|
59
|
+
const identity = await this.resolve(input.request.headers.authorization)
|
|
56
60
|
|
|
57
61
|
input.identity = identity
|
|
58
62
|
|
|
@@ -63,41 +67,38 @@ class Authorization implements Family<Directive, Extension> {
|
|
|
63
67
|
return directive.reply?.(identity) ?? null
|
|
64
68
|
}
|
|
65
69
|
|
|
66
|
-
if (identity === null)
|
|
67
|
-
|
|
70
|
+
if (identity === null)
|
|
71
|
+
throw new http.Unauthorized()
|
|
72
|
+
else
|
|
73
|
+
throw new http.Forbidden()
|
|
68
74
|
}
|
|
69
75
|
|
|
70
|
-
public async settle
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
public async settle (directives: Directive[],
|
|
77
|
+
request: Input,
|
|
78
|
+
response: http.OutgoingMessage): Promise<void> {
|
|
79
|
+
for (const directive of directives) await directive.settle?.(request, response)
|
|
74
80
|
|
|
75
81
|
const identity = request.identity
|
|
76
82
|
|
|
77
|
-
if (identity === null)
|
|
78
|
-
return
|
|
83
|
+
if (identity === null) return
|
|
79
84
|
|
|
80
|
-
if (identity.scheme === PRIMARY && !identity.refresh)
|
|
81
|
-
return
|
|
85
|
+
if (identity.scheme === PRIMARY && !identity.refresh) return
|
|
82
86
|
|
|
83
87
|
// Role directive may have already set the value
|
|
84
|
-
if (identity.roles === undefined)
|
|
85
|
-
await Role.set(identity, this.discovery.roles)
|
|
88
|
+
if (identity.roles === undefined) await Role.set(identity, this.discovery.roles)
|
|
86
89
|
|
|
87
90
|
this.tokens ??= await this.discovery.tokens
|
|
88
91
|
|
|
89
92
|
const token = await this.tokens.invoke<string>('encrypt', { input: { identity } })
|
|
90
93
|
const authorization = `Token ${token}`
|
|
91
94
|
|
|
92
|
-
if (response.headers === undefined)
|
|
93
|
-
response.headers = new Headers()
|
|
95
|
+
if (response.headers === undefined) response.headers = new Headers()
|
|
94
96
|
|
|
95
97
|
response.headers.set('authorization', authorization)
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
private async resolve (authorization: string | undefined): Promise<Identity | null> {
|
|
99
|
-
if (authorization === undefined)
|
|
100
|
-
return null
|
|
101
|
+
if (authorization === undefined) return null
|
|
101
102
|
|
|
102
103
|
const [scheme, credentials] = split(authorization)
|
|
103
104
|
const provider = PROVIDERS[scheme]
|
|
@@ -107,16 +108,15 @@ class Authorization implements Family<Directive, Extension> {
|
|
|
107
108
|
|
|
108
109
|
this.schemes[scheme] ??= await this.discovery[provider]
|
|
109
110
|
|
|
110
|
-
const result = await this.schemes[scheme]
|
|
111
|
-
|
|
111
|
+
const result = await this.schemes[scheme].invoke<AuthenticationResult>('authenticate', {
|
|
112
|
+
input: credentials
|
|
113
|
+
})
|
|
112
114
|
|
|
113
|
-
if (result instanceof Error)
|
|
114
|
-
return null
|
|
115
|
+
if (result instanceof Error) return null
|
|
115
116
|
|
|
116
117
|
const identity = result.identity
|
|
117
118
|
|
|
118
|
-
if (scheme !== PRIMARY && await this.banned(identity))
|
|
119
|
-
throw new http.Unauthorized()
|
|
119
|
+
if (scheme !== PRIMARY && (await this.banned(identity))) throw new http.Unauthorized()
|
|
120
120
|
|
|
121
121
|
identity.scheme = scheme
|
|
122
122
|
identity.refresh = result.refresh
|
|
@@ -133,16 +133,15 @@ class Authorization implements Family<Directive, Extension> {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
const
|
|
136
|
+
const constructors: Record<string, new (value: any, argument?: any) => Directive> = {
|
|
137
137
|
anonymous: Anonymous,
|
|
138
138
|
id: Id,
|
|
139
139
|
role: Role,
|
|
140
140
|
rule: Rule,
|
|
141
141
|
incept: Incept,
|
|
142
142
|
scheme: Scheme,
|
|
143
|
-
echo: Echo
|
|
143
|
+
echo: Echo,
|
|
144
|
+
delegate: Delegate
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
const REMOTES: Remote[] = ['basic', 'tokens', 'roles', 'bans']
|
|
147
|
-
|
|
148
|
-
export = new Authorization()
|
|
147
|
+
const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans']
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BadRequest } from '../../HTTP'
|
|
2
|
+
import { type Directive, type Identity } from './types'
|
|
3
|
+
import type { Input } from '../../io'
|
|
4
|
+
|
|
5
|
+
export class Delegate implements Directive {
|
|
6
|
+
private readonly property: string
|
|
7
|
+
|
|
8
|
+
public constructor (property: string) {
|
|
9
|
+
this.property = property
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public authorize (identity: Identity | null, context: Input): boolean {
|
|
13
|
+
if (identity === null)
|
|
14
|
+
return false
|
|
15
|
+
|
|
16
|
+
context.pipelines.body.push((body) => this.embed(body, identity))
|
|
17
|
+
|
|
18
|
+
return true
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
private embed (body: unknown, identity: Identity): Record<string, unknown> {
|
|
22
|
+
check(body)
|
|
23
|
+
body[this.property] = identity
|
|
24
|
+
|
|
25
|
+
return body
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function check (body: unknown): asserts body is Record<string, unknown> {
|
|
30
|
+
if (typeof body !== 'object' || body === null)
|
|
31
|
+
throw new BadRequest('Invalid request body.')
|
|
32
|
+
}
|
|
@@ -15,28 +15,33 @@ export class Incept implements Directive {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
public authorize (identity: Identity | null, input: Input): boolean {
|
|
18
|
-
return identity === null && 'authorization' in input.headers
|
|
18
|
+
return identity === null && 'authorization' in input.request.headers
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
public async settle (
|
|
21
|
+
public async settle (input: Input, response: http.OutgoingMessage): Promise<void> {
|
|
22
22
|
const id = response.body?.[this.property]
|
|
23
23
|
|
|
24
24
|
if (id === undefined)
|
|
25
25
|
throw new http.Conflict('Identity inception has failed as the response body ' +
|
|
26
26
|
` does not contain the '${this.property}' property.`)
|
|
27
27
|
|
|
28
|
-
const [scheme, credentials] = split(request.headers.authorization
|
|
28
|
+
const [scheme, credentials] = split(input.request.headers.authorization!)
|
|
29
29
|
const provider = PROVIDERS[scheme]
|
|
30
30
|
|
|
31
31
|
this.schemes[scheme] ??= await this.discovery[provider]
|
|
32
32
|
|
|
33
33
|
const identity = await this.schemes[scheme]
|
|
34
|
-
.invoke<Maybe<Identity>>('create', {
|
|
34
|
+
.invoke<Maybe<Identity>>('create', {
|
|
35
|
+
input: {
|
|
36
|
+
id,
|
|
37
|
+
credentials
|
|
38
|
+
}
|
|
39
|
+
})
|
|
35
40
|
|
|
36
41
|
if (identity instanceof Error)
|
|
37
42
|
throw new http.Conflict(identity)
|
|
38
43
|
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
input.identity = identity
|
|
45
|
+
input.identity.scheme = scheme
|
|
41
46
|
}
|
|
42
47
|
}
|
|
@@ -14,10 +14,12 @@ export class Role implements Directive {
|
|
|
14
14
|
public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
|
|
15
15
|
this.remote ??= await discovery
|
|
16
16
|
|
|
17
|
-
const query: Query = {
|
|
18
|
-
|
|
17
|
+
const query: Query = {
|
|
18
|
+
criteria: `identity==${identity.id}`,
|
|
19
|
+
limit: 1024
|
|
20
|
+
}
|
|
19
21
|
|
|
20
|
-
identity.roles =
|
|
22
|
+
identity.roles = await this.remote.invoke('list', { query })
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
public async authorize (identity: Identity | null): Promise<boolean> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Parameter } from '../../RTD'
|
|
2
|
-
import {
|
|
2
|
+
import type { Input, Directive, Identity } from './types'
|
|
3
3
|
|
|
4
4
|
export class Rule implements Directive {
|
|
5
5
|
private readonly directives: Directive[] = []
|
|
@@ -13,7 +13,7 @@ export class Rule implements Directive {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
public async authorize
|
|
16
|
-
(identity: Identity | null, input:
|
|
16
|
+
(identity: Identity | null, input: Input, parameters: Parameter[]): Promise<boolean> {
|
|
17
17
|
for (const directive of this.directives) {
|
|
18
18
|
const authorized = await directive.authorize(identity, input, parameters)
|
|
19
19
|
|
|
@@ -12,10 +12,10 @@ export class Scheme implements Directive {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
public authorize (_: Identity | null, input: Input): boolean {
|
|
15
|
-
if (input.headers.authorization === undefined)
|
|
15
|
+
if (input.request.headers.authorization === undefined)
|
|
16
16
|
return false
|
|
17
17
|
|
|
18
|
-
const [scheme] = split(input.headers.authorization)
|
|
18
|
+
const [scheme] = split(input.request.headers.authorization)
|
|
19
19
|
|
|
20
20
|
if (scheme !== this.scheme)
|
|
21
21
|
throw new http.Forbidden(this.Scheme +
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Authorization } from './Authorization'
|
|
2
2
|
|
|
3
|
-
export =
|
|
3
|
+
export const authorization = new Authorization()
|