@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
|
@@ -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([])
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BadRequest } from '../../HTTP'
|
|
2
|
+
import * as schemas from './schemas'
|
|
3
|
+
import type { Message } from './Message'
|
|
4
|
+
import type { Directive } from './Directive'
|
|
5
|
+
import type { Input as Context } from '../../io'
|
|
6
|
+
|
|
7
|
+
export class Input implements Directive {
|
|
8
|
+
private readonly permissions: Permissions
|
|
9
|
+
|
|
10
|
+
public constructor (permissions: Permissions) {
|
|
11
|
+
this.permissions = permissions
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static validate (permissions: unknown): asserts permissions is Permissions {
|
|
15
|
+
schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public attach (context: Context): void {
|
|
19
|
+
context.pipelines.body.push((body) => this.check(body))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private check (body: unknown): unknown {
|
|
23
|
+
try {
|
|
24
|
+
schemas.message.validate(body)
|
|
25
|
+
} catch {
|
|
26
|
+
throw new BadRequest('Invalid request body.')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const property = this.violation(body)
|
|
30
|
+
|
|
31
|
+
if (property !== undefined)
|
|
32
|
+
throw new BadRequest(`Unexpected input: ${property}.`)
|
|
33
|
+
|
|
34
|
+
return body
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private violation (value: Message | Message[]): string | undefined {
|
|
38
|
+
if (!Array.isArray(value))
|
|
39
|
+
return Object.keys(value).find((key) => !this.permissions.includes(key))
|
|
40
|
+
|
|
41
|
+
for (const item of value) {
|
|
42
|
+
const property = this.violation(item)
|
|
43
|
+
|
|
44
|
+
if (property !== undefined)
|
|
45
|
+
return property
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type Permissions = string[]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Message = Record<string, unknown>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Stream } from 'node:stream'
|
|
2
|
+
import * as schemas from './schemas'
|
|
3
|
+
import type { Message } from './Message'
|
|
4
|
+
import type { Directive } from './Directive'
|
|
5
|
+
import type { Input as Context } from '../../io'
|
|
6
|
+
import type { OutgoingMessage } from '../../HTTP'
|
|
7
|
+
|
|
8
|
+
export class Output implements Directive {
|
|
9
|
+
private readonly disabled: boolean = false
|
|
10
|
+
private readonly omitted: boolean = true
|
|
11
|
+
private readonly permissions: string[] = []
|
|
12
|
+
|
|
13
|
+
public constructor (permissions: Permissions) {
|
|
14
|
+
if (typeof permissions === 'boolean')
|
|
15
|
+
if (permissions)
|
|
16
|
+
this.disabled = true
|
|
17
|
+
else
|
|
18
|
+
this.omitted = false
|
|
19
|
+
|
|
20
|
+
else
|
|
21
|
+
this.permissions = permissions
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static validate (permissions: unknown): asserts permissions is Permissions {
|
|
25
|
+
schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public attach (context: Context): void {
|
|
29
|
+
context.pipelines.response.push(this.restriction(context))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private restriction (context: Context) {
|
|
33
|
+
return (message: OutgoingMessage): void => {
|
|
34
|
+
const error = message.status !== undefined && message.status >= 300
|
|
35
|
+
const stream = message.body instanceof Stream
|
|
36
|
+
const none = message.body === undefined || message.body === null
|
|
37
|
+
|
|
38
|
+
if (this.disabled || error || stream || none)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
if (typeof message.body !== 'object' || this.permissions.length === 0) {
|
|
42
|
+
if (this.omitted)
|
|
43
|
+
console.warn('Permissions for \'io:output\' are not specified properly ' +
|
|
44
|
+
`(${context.request.url}). Response omitted.`)
|
|
45
|
+
|
|
46
|
+
delete message.body
|
|
47
|
+
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
schemas.message.validate(message.body,
|
|
52
|
+
'\'io:output\' expects response to be an object or array of objects')
|
|
53
|
+
|
|
54
|
+
if (Array.isArray(message.body))
|
|
55
|
+
message.body = message.body.map((entity) => this.fit(entity))
|
|
56
|
+
else
|
|
57
|
+
message.body = this.fit(message.body)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private fit (message: Message): Message | undefined {
|
|
62
|
+
const entries = Object.entries(message)
|
|
63
|
+
.filter(([key]) => this.permissions.includes(key))
|
|
64
|
+
|
|
65
|
+
return Object.fromEntries(entries)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type Permissions = string[] | boolean
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import schemas, { type Schema } from '@toa.io/schemas'
|
|
3
|
+
import type { Permissions as InputPermissions } from './Input'
|
|
4
|
+
import type { Permissions as OutputPermissions } from './Output'
|
|
5
|
+
import type { Message } from './Message'
|
|
6
|
+
|
|
7
|
+
const path = resolve(__dirname, '../../../schemas/io')
|
|
8
|
+
const namespace = schemas.namespace(path)
|
|
9
|
+
|
|
10
|
+
export const message: Schema<Message | Message[]> = namespace.schema('message')
|
|
11
|
+
export const input: Schema<InputPermissions> = namespace.schema('input')
|
|
12
|
+
export const output: Schema<OutputPermissions> = namespace.schema('output')
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import * as schemas from './schemas'
|
|
2
|
-
import
|
|
3
|
-
import type {
|
|
2
|
+
import { Directive } from './Directive'
|
|
3
|
+
import type { Output } from '../../io'
|
|
4
4
|
|
|
5
|
-
export class Context
|
|
5
|
+
export class Context extends Directive {
|
|
6
6
|
public readonly targeted = false
|
|
7
7
|
public readonly storage: string
|
|
8
8
|
|
|
9
|
-
public constructor (value:
|
|
9
|
+
public constructor (value: unknown) {
|
|
10
|
+
super()
|
|
10
11
|
schemas.context.validate(value)
|
|
11
12
|
|
|
12
13
|
this.storage = value
|
|
13
14
|
}
|
|
14
15
|
|
|
15
|
-
public apply (): Output {
|
|
16
|
+
public async apply (): Promise<Output> {
|
|
16
17
|
return null
|
|
17
18
|
}
|
|
18
19
|
}
|
|
@@ -1,32 +1,85 @@
|
|
|
1
|
+
import { Readable } from 'stream'
|
|
1
2
|
import { NotFound } from '../../HTTP'
|
|
2
3
|
import * as schemas from './schemas'
|
|
4
|
+
import { Workflow } from './workflows'
|
|
5
|
+
import { Directive } from './Directive'
|
|
6
|
+
import type { Parameter } from '../../RTD'
|
|
7
|
+
import type { Unit } from './workflows'
|
|
3
8
|
import type { Maybe } from '@toa.io/types'
|
|
4
9
|
import type { Component } from '@toa.io/core'
|
|
5
|
-
import type { Output } from '../../
|
|
10
|
+
import type { Output } from '../../io'
|
|
11
|
+
import type { Input } from './types'
|
|
12
|
+
import type { Remotes } from '../../Remotes'
|
|
13
|
+
import type { Entry } from '@toa.io/extensions.storages'
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export class Delete implements Directive {
|
|
15
|
+
export class Delete extends Directive {
|
|
10
16
|
public readonly targeted = true
|
|
11
17
|
|
|
18
|
+
private readonly workflow?: Workflow
|
|
12
19
|
private readonly discovery: Promise<Component>
|
|
13
20
|
private storage: Component | null = null
|
|
14
21
|
|
|
15
|
-
public constructor (
|
|
16
|
-
|
|
22
|
+
public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
23
|
+
super()
|
|
24
|
+
schemas.remove.validate(options)
|
|
25
|
+
|
|
26
|
+
if (options?.workflow !== undefined)
|
|
27
|
+
this.workflow = new Workflow(options.workflow, remotes)
|
|
17
28
|
|
|
18
29
|
this.discovery = discovery
|
|
19
30
|
}
|
|
20
31
|
|
|
21
|
-
public async apply (storage: string,
|
|
32
|
+
public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
|
|
22
33
|
this.storage ??= await this.discovery
|
|
23
34
|
|
|
24
|
-
const
|
|
25
|
-
|
|
35
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('get',
|
|
36
|
+
{
|
|
37
|
+
input: {
|
|
38
|
+
storage,
|
|
39
|
+
path: input.request.url
|
|
40
|
+
}
|
|
41
|
+
})
|
|
26
42
|
|
|
27
|
-
if (
|
|
43
|
+
if (entry instanceof Error)
|
|
28
44
|
throw new NotFound()
|
|
29
45
|
|
|
30
|
-
|
|
46
|
+
const output: Output = {}
|
|
47
|
+
|
|
48
|
+
if (this.workflow !== undefined) {
|
|
49
|
+
output.status = 202
|
|
50
|
+
output.body = Readable.from(this.execute(input, storage, entry, parameters))
|
|
51
|
+
} else
|
|
52
|
+
await this.delete(storage, input)
|
|
53
|
+
|
|
54
|
+
return output
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private async delete (storage: string, input: Input): Promise<void> {
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
59
|
+
await this.storage!.invoke('delete',
|
|
60
|
+
{
|
|
61
|
+
input: {
|
|
62
|
+
storage,
|
|
63
|
+
path: input.request.url
|
|
64
|
+
}
|
|
65
|
+
})
|
|
31
66
|
}
|
|
67
|
+
|
|
68
|
+
// eslint-disable-next-line max-params
|
|
69
|
+
private async * execute
|
|
70
|
+
(input: Input, storage: string, entry: Entry, parameters: Parameter[]): AsyncGenerator {
|
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
72
|
+
for await (const chunk of this.workflow!.execute(input, storage, entry, parameters)) {
|
|
73
|
+
yield chunk
|
|
74
|
+
|
|
75
|
+
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk)
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
await this.delete(storage, input)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface Options {
|
|
84
|
+
workflow?: Unit[] | Unit
|
|
32
85
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Input } from './types'
|
|
2
|
+
import type { Parameter } from '../../RTD'
|
|
3
|
+
import type * as io from '../../io'
|
|
4
|
+
|
|
5
|
+
export abstract class Directive {
|
|
6
|
+
public readonly name = 'octets.' + this.constructor.name.toLowerCase()
|
|
7
|
+
public abstract readonly targeted: boolean
|
|
8
|
+
|
|
9
|
+
public abstract apply (storage: string, input: Input, parameters: Parameter[]): Promise<io.Output>
|
|
10
|
+
}
|