@toa.io/extensions.exposition 1.0.0-alpha.0 → 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 +6 -2
- package/components/identity.basic/operations/authenticate.d.ts +9 -0
- package/components/identity.basic/operations/authenticate.js +24 -0
- package/components/identity.basic/operations/authenticate.js.map +1 -0
- package/components/identity.basic/operations/create.d.ts +10 -0
- package/components/identity.basic/operations/create.js +10 -0
- package/components/identity.basic/operations/create.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +12 -0
- package/components/identity.basic/operations/transit.js +53 -0
- package/components/identity.basic/operations/transit.js.map +1 -0
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.basic/operations/types.d.ts +38 -0
- package/components/identity.basic/operations/types.js +3 -0
- package/components/identity.basic/operations/types.js.map +1 -0
- 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 +2 -0
- package/components/identity.roles/operations/list.js +8 -0
- package/components/identity.roles/operations/list.js.map +1 -0
- package/components/identity.roles/operations/principal.d.ts +13 -0
- package/components/identity.roles/operations/principal.js +13 -0
- package/components/identity.roles/operations/principal.js.map +1 -0
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
- 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.d.ts +9 -0
- package/components/identity.tokens/operations/authenticate.js +32 -0
- package/components/identity.tokens/operations/authenticate.js.map +1 -0
- package/components/identity.tokens/operations/decrypt.d.ts +3 -0
- package/components/identity.tokens/operations/decrypt.js +32 -0
- package/components/identity.tokens/operations/decrypt.js.map +1 -0
- package/components/identity.tokens/operations/encrypt.d.ts +8 -0
- package/components/identity.tokens/operations/encrypt.js +22 -0
- package/components/identity.tokens/operations/encrypt.js.map +1 -0
- package/components/identity.tokens/operations/revoke.d.ts +2 -0
- package/components/identity.tokens/operations/revoke.js +8 -0
- package/components/identity.tokens/operations/revoke.js.map +1 -0
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.tokens/operations/types.d.ts +40 -0
- package/components/identity.tokens/operations/types.js +3 -0
- package/components/identity.tokens/operations/types.js.map +1 -0
- 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 +49 -13
- package/documentation/identity.md +14 -7
- package/documentation/io.md +56 -0
- package/documentation/octets.md +105 -40
- 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 +40 -87
- 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 +96 -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 +8 -0
- package/transpiled/Annotation.js +3 -0
- package/transpiled/Annotation.js.map +1 -0
- package/transpiled/Branch.d.ts +7 -0
- package/transpiled/Branch.js +3 -0
- package/transpiled/Branch.js.map +1 -0
- package/transpiled/Composition.d.ts +14 -0
- package/transpiled/Composition.js +43 -0
- package/transpiled/Composition.js.map +1 -0
- package/transpiled/Context.d.ts +7 -0
- package/transpiled/Context.js +3 -0
- package/transpiled/Context.js.map +1 -0
- package/transpiled/Directive.d.ts +18 -0
- package/transpiled/Directive.js +75 -0
- package/transpiled/Directive.js.map +1 -0
- package/transpiled/Endpoint.d.ts +22 -0
- package/transpiled/Endpoint.js +101 -0
- package/transpiled/Endpoint.js.map +1 -0
- package/transpiled/Factory.d.ts +9 -0
- package/transpiled/Factory.js +73 -0
- package/transpiled/Factory.js.map +1 -0
- package/transpiled/Gateway.d.ts +18 -0
- package/transpiled/Gateway.js +92 -0
- package/transpiled/Gateway.js.map +1 -0
- 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 +25 -0
- package/transpiled/HTTP/Server.js +141 -0
- package/transpiled/HTTP/Server.js.map +1 -0
- 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/exceptions.d.ts +34 -0
- package/transpiled/HTTP/exceptions.js +71 -0
- package/transpiled/HTTP/exceptions.js.map +1 -0
- package/transpiled/HTTP/formats/index.d.ts +10 -0
- package/transpiled/HTTP/formats/index.js +38 -0
- package/transpiled/HTTP/formats/index.js.map +1 -0
- package/transpiled/HTTP/formats/json.d.ts +6 -0
- package/transpiled/HTTP/formats/json.js +17 -0
- package/transpiled/HTTP/formats/json.js.map +1 -0
- package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
- package/transpiled/HTTP/formats/msgpack.js +17 -0
- package/transpiled/HTTP/formats/msgpack.js.map +1 -0
- package/transpiled/HTTP/formats/text.d.ts +8 -0
- package/transpiled/HTTP/formats/text.js +15 -0
- package/transpiled/HTTP/formats/text.js.map +1 -0
- package/transpiled/HTTP/formats/yaml.d.ts +6 -0
- package/transpiled/HTTP/formats/yaml.js +41 -0
- package/transpiled/HTTP/formats/yaml.js.map +1 -0
- package/transpiled/HTTP/index.d.ts +4 -0
- package/transpiled/HTTP/index.js +21 -0
- package/transpiled/HTTP/index.js.map +1 -0
- package/transpiled/HTTP/messages.d.ts +19 -0
- package/transpiled/HTTP/messages.js +73 -0
- package/transpiled/HTTP/messages.js.map +1 -0
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Mapping.d.ts +8 -0
- package/transpiled/Mapping.js +38 -0
- package/transpiled/Mapping.js.map +1 -0
- package/transpiled/Query.d.ts +13 -0
- package/transpiled/Query.js +107 -0
- package/transpiled/Query.js.map +1 -0
- package/transpiled/RTD/Context.d.ts +12 -0
- package/transpiled/RTD/Context.js +3 -0
- package/transpiled/RTD/Context.js.map +1 -0
- package/transpiled/RTD/Directives.d.ts +22 -0
- package/transpiled/RTD/Directives.js +3 -0
- package/transpiled/RTD/Directives.js.map +1 -0
- package/transpiled/RTD/Endpoint.d.ts +11 -0
- package/transpiled/RTD/Endpoint.js +3 -0
- package/transpiled/RTD/Endpoint.js.map +1 -0
- package/transpiled/RTD/Match.d.ts +9 -0
- package/transpiled/RTD/Match.js +3 -0
- package/transpiled/RTD/Match.js.map +1 -0
- package/transpiled/RTD/Method.d.ts +9 -0
- package/transpiled/RTD/Method.js +16 -0
- package/transpiled/RTD/Method.js.map +1 -0
- package/transpiled/RTD/Node.d.ts +19 -0
- package/transpiled/RTD/Node.js +62 -0
- package/transpiled/RTD/Node.js.map +1 -0
- package/transpiled/RTD/Route.d.ts +14 -0
- package/transpiled/RTD/Route.js +49 -0
- package/transpiled/RTD/Route.js.map +1 -0
- package/transpiled/RTD/Tree.d.ts +14 -0
- package/transpiled/RTD/Tree.js +45 -0
- package/transpiled/RTD/Tree.js.map +1 -0
- package/transpiled/RTD/factory.d.ts +4 -0
- package/transpiled/RTD/factory.js +36 -0
- package/transpiled/RTD/factory.js.map +1 -0
- package/transpiled/RTD/index.d.ts +8 -0
- package/transpiled/RTD/index.js +38 -0
- package/transpiled/RTD/index.js.map +1 -0
- package/transpiled/RTD/segment.d.ts +8 -0
- package/transpiled/RTD/segment.js +25 -0
- package/transpiled/RTD/segment.js.map +1 -0
- package/transpiled/RTD/syntax/index.d.ts +2 -0
- package/transpiled/RTD/syntax/index.js +19 -0
- package/transpiled/RTD/syntax/index.js.map +1 -0
- package/transpiled/RTD/syntax/parse.d.ts +4 -0
- package/transpiled/RTD/syntax/parse.js +128 -0
- package/transpiled/RTD/syntax/parse.js.map +1 -0
- package/transpiled/RTD/syntax/types.d.ts +41 -0
- package/transpiled/RTD/syntax/types.js +5 -0
- package/transpiled/RTD/syntax/types.js.map +1 -0
- package/transpiled/Remotes.d.ts +9 -0
- package/transpiled/Remotes.js +25 -0
- package/transpiled/Remotes.js.map +1 -0
- package/transpiled/Tenant.d.ts +13 -0
- package/transpiled/Tenant.js +34 -0
- package/transpiled/Tenant.js.map +1 -0
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +71 -0
- package/transpiled/deployment.js.map +1 -0
- package/transpiled/directives/auth/Anonymous.d.ts +6 -0
- package/transpiled/directives/auth/Anonymous.js +16 -0
- package/transpiled/directives/auth/Anonymous.js.map +1 -0
- package/transpiled/directives/auth/Authorization.d.ts +19 -0
- package/transpiled/directives/auth/Authorization.js +127 -0
- 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/Echo.d.ts +6 -0
- package/transpiled/directives/auth/Echo.js +13 -0
- package/transpiled/directives/auth/Echo.js.map +1 -0
- package/transpiled/directives/auth/Id.d.ts +7 -0
- package/transpiled/directives/auth/Id.js +17 -0
- package/transpiled/directives/auth/Id.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +10 -0
- package/transpiled/directives/auth/Incept.js +63 -0
- package/transpiled/directives/auth/Incept.js.map +1 -0
- package/transpiled/directives/auth/Role.d.ts +11 -0
- package/transpiled/directives/auth/Role.js +46 -0
- package/transpiled/directives/auth/Role.js.map +1 -0
- package/transpiled/directives/auth/Rule.d.ts +9 -0
- package/transpiled/directives/auth/Rule.js +22 -0
- package/transpiled/directives/auth/Rule.js.map +1 -0
- package/transpiled/directives/auth/Scheme.d.ts +7 -0
- package/transpiled/directives/auth/Scheme.js +47 -0
- package/transpiled/directives/auth/Scheme.js.map +1 -0
- package/transpiled/directives/auth/index.d.ts +2 -0
- package/transpiled/directives/auth/index.js +6 -0
- package/transpiled/directives/auth/index.js.map +1 -0
- package/transpiled/directives/auth/schemes.d.ts +3 -0
- package/transpiled/directives/auth/schemes.js +10 -0
- package/transpiled/directives/auth/schemes.js.map +1 -0
- package/transpiled/directives/auth/split.d.ts +2 -0
- package/transpiled/directives/auth/split.js +38 -0
- package/transpiled/directives/auth/split.js.map +1 -0
- package/transpiled/directives/auth/types.d.ts +31 -0
- package/transpiled/directives/auth/types.js +3 -0
- package/transpiled/directives/auth/types.js.map +1 -0
- package/transpiled/directives/cache/Cache.d.ts +11 -0
- package/transpiled/directives/cache/Cache.js +28 -0
- package/transpiled/directives/cache/Cache.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +9 -0
- package/transpiled/directives/cache/Control.js +42 -0
- package/transpiled/directives/cache/Control.js.map +1 -0
- package/transpiled/directives/cache/Exact.d.ts +4 -0
- package/transpiled/directives/cache/Exact.js +11 -0
- package/transpiled/directives/cache/Exact.js.map +1 -0
- package/transpiled/directives/cache/index.d.ts +2 -0
- package/transpiled/directives/cache/index.js +6 -0
- package/transpiled/directives/cache/index.js.map +1 -0
- package/transpiled/directives/cache/types.d.ts +7 -0
- package/transpiled/directives/cache/types.js +3 -0
- package/transpiled/directives/cache/types.js.map +1 -0
- 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/Development.js +29 -0
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +7 -0
- package/transpiled/directives/dev/Stub.js +14 -0
- package/transpiled/directives/dev/Stub.js.map +1 -0
- package/transpiled/directives/dev/Throw.d.ts +7 -0
- package/transpiled/directives/dev/Throw.js +14 -0
- package/transpiled/directives/dev/Throw.js.map +1 -0
- package/transpiled/directives/dev/index.d.ts +2 -0
- package/transpiled/directives/dev/index.js +6 -0
- package/transpiled/directives/dev/index.js.map +1 -0
- package/transpiled/directives/dev/types.d.ts +4 -0
- package/transpiled/directives/dev/types.js +3 -0
- package/transpiled/directives/dev/types.js.map +1 -0
- package/transpiled/directives/index.d.ts +4 -0
- package/transpiled/directives/index.js +13 -0
- package/transpiled/directives/index.js.map +1 -0
- 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 +8 -0
- package/transpiled/directives/octets/Context.js +42 -0
- package/transpiled/directives/octets/Context.js.map +1 -0
- package/transpiled/directives/octets/Delete.d.ts +20 -0
- package/transpiled/directives/octets/Delete.js +84 -0
- package/transpiled/directives/octets/Delete.js.map +1 -0
- 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 +18 -0
- package/transpiled/directives/octets/Fetch.js +92 -0
- package/transpiled/directives/octets/Fetch.js.map +1 -0
- package/transpiled/directives/octets/List.d.ts +16 -0
- package/transpiled/directives/octets/List.js +74 -0
- package/transpiled/directives/octets/List.js.map +1 -0
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/Octets.js +55 -0
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +11 -0
- package/transpiled/directives/octets/Permute.js +58 -0
- package/transpiled/directives/octets/Permute.js.map +1 -0
- package/transpiled/directives/octets/Store.d.ts +24 -0
- package/transpiled/directives/octets/Store.js +95 -0
- package/transpiled/directives/octets/Store.js.map +1 -0
- 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 -0
- package/transpiled/directives/octets/index.js +6 -0
- package/transpiled/directives/octets/index.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +13 -0
- package/transpiled/directives/octets/schemas.js +18 -0
- package/transpiled/directives/octets/schemas.js.map +1 -0
- package/transpiled/directives/octets/types.d.ts +5 -0
- package/transpiled/directives/octets/types.js +3 -0
- package/transpiled/directives/octets/types.js.map +1 -0
- 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/discovery.d.ts +1 -0
- package/transpiled/discovery.js +3 -0
- package/transpiled/discovery.js.map +1 -0
- package/transpiled/exceptions.d.ts +2 -0
- package/transpiled/exceptions.js +39 -0
- package/transpiled/exceptions.js.map +1 -0
- package/transpiled/index.d.ts +5 -0
- package/transpiled/index.js +12 -0
- package/transpiled/index.js.map +1 -0
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.d.ts +3 -0
- package/transpiled/manifest.js +66 -0
- package/transpiled/manifest.js.map +1 -0
- package/transpiled/root.d.ts +2 -0
- package/transpiled/root.js +44 -0
- package/transpiled/root.js.map +1 -0
- package/transpiled/schemas.d.ts +7 -0
- package/transpiled/schemas.js +14 -0
- package/transpiled/schemas.js.map +1 -0
- package/transpiled/tsconfig.tsbuildinfo +1 -0
- package/source/HTTP/Server.fixtures.ts +0 -41
|
@@ -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()
|
|
@@ -2,11 +2,14 @@ import { type Component } from '@toa.io/core'
|
|
|
2
2
|
import { type Maybe } from '@toa.io/types'
|
|
3
3
|
import { type Parameter } from '../../RTD'
|
|
4
4
|
import type * as http from '../../HTTP'
|
|
5
|
-
import type * as
|
|
5
|
+
import type * as io from '../../io'
|
|
6
6
|
|
|
7
7
|
export interface Directive {
|
|
8
|
-
authorize: (
|
|
9
|
-
|
|
8
|
+
authorize: (
|
|
9
|
+
identity: Identity | null,
|
|
10
|
+
input: Input,
|
|
11
|
+
parameters: Parameter[],
|
|
12
|
+
) => boolean | Promise<boolean>
|
|
10
13
|
|
|
11
14
|
reply?: (identity: Identity | null) => http.OutgoingMessage
|
|
12
15
|
|
|
@@ -28,10 +31,10 @@ export interface Ban {
|
|
|
28
31
|
banned: boolean
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
export type Input =
|
|
34
|
+
export type Input = io.Input & Extension
|
|
32
35
|
export type AuthenticationResult = Maybe<{ identity: Identity, refresh: boolean }>
|
|
33
36
|
|
|
34
|
-
export type Scheme = 'basic' | 'token'
|
|
35
|
-
export type Remote = 'basic' | 'tokens' | 'roles' | 'bans'
|
|
37
|
+
export type Scheme = 'basic' | 'token' | 'bearer'
|
|
38
|
+
export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans'
|
|
36
39
|
export type Discovery = Record<Remote, Promise<Component>>
|
|
37
40
|
export type Schemes = Record<Scheme, Component>
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type Input, type Output, type Family } from '../../Directive'
|
|
2
1
|
import { Control } from './Control'
|
|
3
|
-
import { type Directive } from './types'
|
|
4
2
|
import { Exact } from './Exact'
|
|
3
|
+
import type { Input, Output } from '../../io'
|
|
4
|
+
import type { Directive } from './types'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
5
6
|
import type * as http from '../../HTTP'
|
|
6
7
|
|
|
7
|
-
class Cache implements
|
|
8
|
+
export class Cache implements DirectiveFamily<Directive> {
|
|
8
9
|
public readonly name: string = 'cache'
|
|
9
10
|
public readonly mandatory: boolean = false
|
|
10
11
|
|
|
@@ -22,9 +23,9 @@ class Cache implements Family<Directive> {
|
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
public async settle
|
|
25
|
-
(directives: Directive[],
|
|
26
|
+
(directives: Directive[], input: Input, response: http.OutgoingMessage): Promise<void> {
|
|
26
27
|
response.headers ??= new Headers()
|
|
27
|
-
directives[0]?.set(
|
|
28
|
+
directives[0]?.set(input, response.headers)
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -32,5 +33,3 @@ const constructors: Record<string, new (value: any) => Directive> = {
|
|
|
32
33
|
control: Control,
|
|
33
34
|
exact: Exact
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
export = new Cache()
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { match } from 'matchacho'
|
|
2
|
-
import type {
|
|
2
|
+
import type { AuthenticatedContext, Directive } from './types'
|
|
3
3
|
|
|
4
4
|
export class Control implements Directive {
|
|
5
5
|
protected readonly value: string
|
|
@@ -9,16 +9,16 @@ export class Control implements Directive {
|
|
|
9
9
|
this.value = value
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
public set (
|
|
13
|
-
if (!['GET', 'HEAD', 'OPTIONS'].includes(request.method))
|
|
12
|
+
public set (context: AuthenticatedContext, headers: Headers): void {
|
|
13
|
+
if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
|
|
14
14
|
return
|
|
15
15
|
|
|
16
|
-
this.cache ??= this.resolve(
|
|
16
|
+
this.cache ??= this.resolve(context)
|
|
17
17
|
|
|
18
18
|
headers.set('cache-control', this.cache)
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
protected resolve (request:
|
|
21
|
+
protected resolve (request: AuthenticatedContext): string {
|
|
22
22
|
if (request.identity === null)
|
|
23
23
|
return this.value
|
|
24
24
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Cache } from './Cache'
|
|
2
2
|
|
|
3
|
-
export =
|
|
3
|
+
export const cache = new Cache()
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Input } from '../../io'
|
|
2
2
|
|
|
3
3
|
export interface Directive {
|
|
4
4
|
set: (input: Input, headers: Headers) => void
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
export interface
|
|
7
|
+
export interface AuthenticatedContext extends Input {
|
|
8
8
|
identity?: unknown | null
|
|
9
9
|
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Input, Output } from '../../io'
|
|
2
|
+
import type { Interceptor } from '../../Interception'
|
|
3
|
+
|
|
4
|
+
export class CORS implements Interceptor {
|
|
5
|
+
public readonly name = 'cors'
|
|
6
|
+
|
|
7
|
+
private readonly requestHeaders = new Set<string>([
|
|
8
|
+
'accept',
|
|
9
|
+
'authorization',
|
|
10
|
+
'content-type',
|
|
11
|
+
'etag',
|
|
12
|
+
'if-match',
|
|
13
|
+
'if-none-match'
|
|
14
|
+
])
|
|
15
|
+
|
|
16
|
+
private readonly headers = new Headers({
|
|
17
|
+
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
|
|
18
|
+
'access-control-allow-credentials': 'true',
|
|
19
|
+
'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
|
|
20
|
+
'access-control-max-age': '3600',
|
|
21
|
+
'cache-control': 'max-age=3600',
|
|
22
|
+
vary: 'origin'
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
public intercept (input: Input): Output {
|
|
26
|
+
const origin = input.request.headers.origin
|
|
27
|
+
|
|
28
|
+
if (origin === undefined)
|
|
29
|
+
return null
|
|
30
|
+
|
|
31
|
+
if (input.request.method === 'OPTIONS')
|
|
32
|
+
return this.preflightResponse(origin)
|
|
33
|
+
|
|
34
|
+
input.pipelines.response.push((output) => {
|
|
35
|
+
output.headers ??= new Headers()
|
|
36
|
+
output.headers.set('access-control-allow-origin', origin)
|
|
37
|
+
output.headers.set('access-control-expose-headers',
|
|
38
|
+
'authorization, content-type, content-length, etag')
|
|
39
|
+
|
|
40
|
+
const method = input.request.method
|
|
41
|
+
|
|
42
|
+
if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS')
|
|
43
|
+
output.headers.append('vary', 'origin')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public allow (header: string): void {
|
|
50
|
+
this.requestHeaders.add(header.toLowerCase())
|
|
51
|
+
this.headers.set('access-control-allow-headers', Array.from(this.requestHeaders).join(', '))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private preflightResponse (origin: string): Output {
|
|
55
|
+
this.headers.set('access-control-allow-origin', origin)
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
status: 204,
|
|
59
|
+
headers: this.headers
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { type Input, type Output, type Family } from '../../Directive'
|
|
2
1
|
import { Stub } from './Stub'
|
|
3
2
|
import { Throw } from './Throw'
|
|
4
3
|
import { type Directive } from './types'
|
|
4
|
+
import type { Input, Output } from '../../io'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
5
6
|
|
|
6
|
-
class Development implements
|
|
7
|
+
export class Development implements DirectiveFamily<Directive> {
|
|
7
8
|
public readonly name: string = 'dev'
|
|
8
9
|
public readonly mandatory: boolean = false
|
|
9
10
|
|
|
10
|
-
public create (name: string, value:
|
|
11
|
+
public create (name: string, value: unknown): Directive {
|
|
11
12
|
const Class = constructors[name]
|
|
12
13
|
|
|
13
14
|
if (Class === undefined)
|
|
@@ -32,5 +33,3 @@ const constructors: Record<string, new (value: any) => Directive> = {
|
|
|
32
33
|
stub: Stub,
|
|
33
34
|
throw: Throw
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
export = new Development()
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Output } from '../../io'
|
|
2
|
+
import type { Directive } from './types'
|
|
3
3
|
|
|
4
4
|
export class Stub implements Directive {
|
|
5
|
-
private readonly value:
|
|
5
|
+
private readonly value: unknown
|
|
6
6
|
|
|
7
|
-
public constructor (value:
|
|
7
|
+
public constructor (value: unknown) {
|
|
8
8
|
this.value = value
|
|
9
9
|
}
|
|
10
10
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Output } from '../../io'
|
|
2
|
+
import type { Directive } from './types'
|
|
3
3
|
|
|
4
4
|
export class Throw implements Directive {
|
|
5
|
-
private readonly message:
|
|
5
|
+
private readonly message: string
|
|
6
6
|
|
|
7
|
-
public constructor (message:
|
|
7
|
+
public constructor (message: string) {
|
|
8
8
|
this.message = message
|
|
9
9
|
}
|
|
10
10
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Development } from './Development'
|
|
2
2
|
|
|
3
|
-
export =
|
|
3
|
+
export const dev = new Development()
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
1
|
+
import { authorization } from './auth'
|
|
2
|
+
import { cache } from './cache'
|
|
3
|
+
import { cors } from './cors'
|
|
4
|
+
import { dev } from './dev'
|
|
5
|
+
import { octets } from './octets'
|
|
6
|
+
import { io } from './io'
|
|
7
|
+
import { vary } from './vary'
|
|
8
|
+
import type { DirectiveFamily } from '../RTD'
|
|
9
|
+
import type { Interceptor } from '../Interception'
|
|
6
10
|
|
|
7
|
-
export const families:
|
|
11
|
+
export const families: DirectiveFamily[] = [authorization, io, cache, vary, octets, dev]
|
|
12
|
+
export const interceptors: Interceptor[] = [cors]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Output } from './Output'
|
|
2
|
+
import { Input } from './Input'
|
|
3
|
+
import type { Constructor, Directive } from './Directive'
|
|
4
|
+
import type { Input as Context } from '../../io'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
6
|
+
|
|
7
|
+
export class IO implements DirectiveFamily<Directive> {
|
|
8
|
+
public readonly name = 'io'
|
|
9
|
+
public readonly mandatory = true
|
|
10
|
+
|
|
11
|
+
public create (name: string, value: unknown): Directive {
|
|
12
|
+
if (!(name in constructors))
|
|
13
|
+
throw new Error(`Directive 'io:${name}' is not implemented.`)
|
|
14
|
+
|
|
15
|
+
const Directive = constructors[name]
|
|
16
|
+
|
|
17
|
+
Directive.validate(value)
|
|
18
|
+
|
|
19
|
+
return new Directive(value)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public preflight (directives: Directive[], context: Context): null {
|
|
23
|
+
let restricted = false
|
|
24
|
+
|
|
25
|
+
for (const directive of directives) {
|
|
26
|
+
restricted ||= directive instanceof Output
|
|
27
|
+
|
|
28
|
+
directive.attach(context)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!restricted)
|
|
32
|
+
DENIAL.attach(context)
|
|
33
|
+
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const constructors: Record<string, Constructor> = {
|
|
39
|
+
output: Output,
|
|
40
|
+
input: Input
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DENIAL: Output = new Output([])
|