@toa.io/extensions.exposition 1.0.0-alpha.0 → 1.0.0-alpha.11
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 +18 -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 +197 -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
|
@@ -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
|
+
}
|
|
@@ -1,49 +1,61 @@
|
|
|
1
1
|
import { posix } from 'node:path'
|
|
2
2
|
import { Forbidden, NotFound } from '../../HTTP'
|
|
3
3
|
import * as schemas from './schemas'
|
|
4
|
+
import { Directive } from './Directive'
|
|
4
5
|
import type { Maybe } from '@toa.io/types'
|
|
5
6
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
6
7
|
import type { Readable } from 'node:stream'
|
|
7
8
|
import type { Component } from '@toa.io/core'
|
|
8
|
-
import type { Output } from '../../
|
|
9
|
+
import type { Output } from '../../io'
|
|
10
|
+
import type { Input } from './types'
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export class Fetch implements Directive {
|
|
12
|
+
export class Fetch extends Directive {
|
|
13
13
|
public readonly targeted = true
|
|
14
14
|
|
|
15
|
-
private readonly permissions: Permissions = {
|
|
15
|
+
private readonly permissions: Required<Permissions> = {
|
|
16
|
+
blob: true,
|
|
17
|
+
meta: false
|
|
18
|
+
}
|
|
19
|
+
|
|
16
20
|
private readonly discovery: Promise<Component>
|
|
17
21
|
private storage: Component = null as unknown as Component
|
|
18
22
|
|
|
19
|
-
public constructor (permissions:
|
|
23
|
+
public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
|
|
24
|
+
super()
|
|
20
25
|
schemas.fetch.validate(permissions)
|
|
21
26
|
|
|
22
27
|
Object.assign(this.permissions, permissions)
|
|
23
28
|
this.discovery = discovery
|
|
24
29
|
}
|
|
25
30
|
|
|
26
|
-
public async apply (storage: string,
|
|
31
|
+
public async apply (storage: string, input: Input): Promise<Output> {
|
|
27
32
|
this.storage ??= await this.discovery
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
else
|
|
32
|
-
return await this.fetch(storage, request)
|
|
33
|
-
}
|
|
34
|
+
const variant = posix.basename(input.request.url).includes('.')
|
|
35
|
+
const metadata = input.subtype === 'octets.entry'
|
|
34
36
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if (!variant && metadata)
|
|
38
|
+
if (this.permissions.meta)
|
|
39
|
+
return this.get(storage, input)
|
|
40
|
+
else
|
|
41
|
+
throw new Forbidden('Metadata is not accessible.')
|
|
38
42
|
|
|
39
43
|
if (!variant && !this.permissions.blob)
|
|
40
44
|
throw new Forbidden('BLOB variant must be specified.')
|
|
41
45
|
|
|
42
|
-
|
|
46
|
+
return await this.fetch(storage, input)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private async fetch (storage: string, input: Input): Promise<Output> {
|
|
50
|
+
if ('if-none-match' in input.request.headers)
|
|
43
51
|
return { status: 304 }
|
|
44
52
|
|
|
45
|
-
const
|
|
46
|
-
|
|
53
|
+
const result = await this.storage.invoke<Maybe<FetchResult>>('fetch', {
|
|
54
|
+
input: {
|
|
55
|
+
storage,
|
|
56
|
+
path: input.request.url
|
|
57
|
+
}
|
|
58
|
+
})
|
|
47
59
|
|
|
48
60
|
if (result instanceof Error)
|
|
49
61
|
throw new NotFound()
|
|
@@ -54,16 +66,19 @@ export class Fetch implements Directive {
|
|
|
54
66
|
etag: result.checksum
|
|
55
67
|
})
|
|
56
68
|
|
|
57
|
-
return {
|
|
69
|
+
return {
|
|
70
|
+
headers,
|
|
71
|
+
body: result.stream
|
|
72
|
+
}
|
|
58
73
|
}
|
|
59
74
|
|
|
60
|
-
private async get (storage: string,
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
private async get (storage: string, input: Input): Promise<Output> {
|
|
76
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('get', {
|
|
77
|
+
input: {
|
|
78
|
+
storage,
|
|
79
|
+
path: input.request.url
|
|
80
|
+
}
|
|
81
|
+
})
|
|
67
82
|
|
|
68
83
|
if (entry instanceof Error)
|
|
69
84
|
throw new NotFound()
|
|
@@ -72,9 +87,9 @@ export class Fetch implements Directive {
|
|
|
72
87
|
}
|
|
73
88
|
}
|
|
74
89
|
|
|
75
|
-
interface Permissions {
|
|
76
|
-
blob
|
|
77
|
-
meta
|
|
90
|
+
export interface Permissions {
|
|
91
|
+
blob?: boolean
|
|
92
|
+
meta?: boolean
|
|
78
93
|
}
|
|
79
94
|
|
|
80
95
|
interface FetchResult {
|
|
@@ -1,32 +1,72 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { posix } from 'node:path'
|
|
2
|
+
import { Forbidden, NotFound } from '../../HTTP'
|
|
2
3
|
import * as schemas from './schemas'
|
|
4
|
+
import { Directive } from './Directive'
|
|
5
|
+
import type { Entry } from '@toa.io/extensions.storages'
|
|
3
6
|
import type { Maybe } from '@toa.io/types'
|
|
4
7
|
import type { Component } from '@toa.io/core'
|
|
5
|
-
import type { Output } from '../../
|
|
8
|
+
import type { Output } from '../../io'
|
|
6
9
|
|
|
7
|
-
import type {
|
|
10
|
+
import type { Input } from './types'
|
|
8
11
|
|
|
9
|
-
export class List
|
|
12
|
+
export class List extends Directive {
|
|
10
13
|
public readonly targeted = false
|
|
11
14
|
|
|
15
|
+
private readonly permissions: Required<Permissions> = { meta: false }
|
|
12
16
|
private readonly discovery: Promise<Component>
|
|
13
17
|
private storage: Component | null = null
|
|
14
18
|
|
|
15
|
-
public constructor (
|
|
16
|
-
|
|
19
|
+
public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
|
|
20
|
+
super()
|
|
21
|
+
schemas.list.validate(permissions)
|
|
17
22
|
|
|
23
|
+
Object.assign(this.permissions, permissions)
|
|
18
24
|
this.discovery = discovery
|
|
19
25
|
}
|
|
20
26
|
|
|
21
|
-
public async apply (storage: string,
|
|
27
|
+
public async apply (storage: string, input: Input): Promise<Output> {
|
|
22
28
|
this.storage ??= await this.discovery
|
|
23
29
|
|
|
24
|
-
const
|
|
25
|
-
|
|
30
|
+
const metadata = input.subtype === 'octets.entries'
|
|
31
|
+
|
|
32
|
+
if (metadata && !this.permissions.meta)
|
|
33
|
+
throw new Forbidden('Metadata is not accessible.')
|
|
34
|
+
|
|
35
|
+
const list = await this.storage.invoke<Maybe<string[]>>('list', {
|
|
36
|
+
input: {
|
|
37
|
+
storage,
|
|
38
|
+
path: input.request.url
|
|
39
|
+
}
|
|
40
|
+
})
|
|
26
41
|
|
|
27
42
|
if (list instanceof Error)
|
|
28
43
|
throw new NotFound()
|
|
29
44
|
|
|
30
|
-
|
|
45
|
+
const body = metadata
|
|
46
|
+
? await this.expand(storage, input.request.url, list)
|
|
47
|
+
: list
|
|
48
|
+
|
|
49
|
+
return { body }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private async expand (storage: string, prefix: string, list: string[]):
|
|
53
|
+
Promise<Array<Maybe<Entry>>> {
|
|
54
|
+
const promises = list.map(async (id) => {
|
|
55
|
+
const path = posix.join(prefix, id)
|
|
56
|
+
|
|
57
|
+
const input = {
|
|
58
|
+
storage,
|
|
59
|
+
path
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- ensured in `apply`
|
|
63
|
+
return this.storage!.invoke<Maybe<Entry>>('get', { input })
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
return await Promise.all(promises)
|
|
31
67
|
}
|
|
32
68
|
}
|
|
69
|
+
|
|
70
|
+
export interface Permissions {
|
|
71
|
+
meta?: boolean
|
|
72
|
+
}
|
|
@@ -5,12 +5,15 @@ import { Fetch } from './Fetch'
|
|
|
5
5
|
import { List } from './List'
|
|
6
6
|
import { Delete } from './Delete'
|
|
7
7
|
import { Permute } from './Permute'
|
|
8
|
+
import { WorkflowDirective } from './Workflow'
|
|
9
|
+
import type { Directive } from './Directive'
|
|
10
|
+
import type { Output } from '../../io'
|
|
8
11
|
import type { Component } from '@toa.io/core'
|
|
9
12
|
import type { Remotes } from '../../Remotes'
|
|
10
|
-
import type {
|
|
11
|
-
import type {
|
|
13
|
+
import type { Parameter, DirectiveFamily } from '../../RTD'
|
|
14
|
+
import type { Input } from './types'
|
|
12
15
|
|
|
13
|
-
class Octets implements
|
|
16
|
+
export class Octets implements DirectiveFamily<Directive> {
|
|
14
17
|
public readonly name: string = 'octets'
|
|
15
18
|
public readonly mandatory: boolean = false
|
|
16
19
|
|
|
@@ -27,7 +30,8 @@ class Octets implements Family<Directive> {
|
|
|
27
30
|
return new Class(value, this.discovery, remotes)
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
public async preflight
|
|
33
|
+
public async preflight
|
|
34
|
+
(directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
|
|
31
35
|
let context: Context | null = null
|
|
32
36
|
let action: Directive | null = null
|
|
33
37
|
|
|
@@ -42,15 +46,17 @@ class Octets implements Family<Directive> {
|
|
|
42
46
|
if (action === null)
|
|
43
47
|
return null
|
|
44
48
|
|
|
49
|
+
// noinspection PointlessBooleanExpressionJS
|
|
45
50
|
if (context === null)
|
|
46
51
|
throw new Error('Octets context is not defined.')
|
|
47
52
|
|
|
48
|
-
const targeted = input.
|
|
53
|
+
const targeted = input.request.url[input.request.url.length - 1] !== '/'
|
|
49
54
|
|
|
50
55
|
if (targeted !== action.targeted)
|
|
51
56
|
throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
|
|
52
57
|
|
|
53
|
-
|
|
58
|
+
// noinspection JSObjectNullOrUndefined
|
|
59
|
+
return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
|
|
54
60
|
}
|
|
55
61
|
}
|
|
56
62
|
|
|
@@ -60,9 +66,8 @@ const DIRECTIVES: Record<string, Constructor> = {
|
|
|
60
66
|
fetch: Fetch,
|
|
61
67
|
list: List,
|
|
62
68
|
delete: Delete,
|
|
63
|
-
permute: Permute
|
|
69
|
+
permute: Permute,
|
|
70
|
+
workflow: WorkflowDirective
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
type Constructor = new (value: any, discovery: Promise<Component>, remotes: Remotes) => Directive
|
|
67
|
-
|
|
68
|
-
export = new Octets()
|
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
import { NotAcceptable, NotFound } from '../../HTTP'
|
|
2
2
|
import * as schemas from './schemas'
|
|
3
|
+
import { Directive } from './Directive'
|
|
3
4
|
import type { Maybe } from '@toa.io/types'
|
|
4
5
|
import type { Component } from '@toa.io/core'
|
|
5
|
-
import type { Output } from '../../
|
|
6
|
+
import type { Output } from '../../io'
|
|
7
|
+
import type { Input } from './types'
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export class Permute implements Directive {
|
|
9
|
+
export class Permute extends Directive {
|
|
10
10
|
public readonly targeted = false
|
|
11
11
|
|
|
12
12
|
private readonly discovery: Promise<Component>
|
|
13
13
|
private storage: Component | null = null
|
|
14
14
|
|
|
15
15
|
public constructor (value: null, discovery: Promise<Component>) {
|
|
16
|
-
|
|
16
|
+
super()
|
|
17
|
+
schemas.permute.validate(value)
|
|
17
18
|
|
|
18
19
|
this.discovery = discovery
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
public async apply (storage: string,
|
|
22
|
+
public async apply (storage: string, input: Input): Promise<Output> {
|
|
22
23
|
this.storage ??= await this.discovery
|
|
23
24
|
|
|
24
|
-
if (
|
|
25
|
+
if (input.encoder === null)
|
|
25
26
|
throw new NotAcceptable()
|
|
26
27
|
|
|
27
|
-
const path = request.
|
|
28
|
-
const list = await
|
|
29
|
-
|
|
30
|
-
const error = await this.storage.invoke<Maybe<unknown>>('permute', {
|
|
28
|
+
const path = input.request.url
|
|
29
|
+
const list = await input.body()
|
|
30
|
+
|
|
31
|
+
const error = await this.storage.invoke<Maybe<unknown>>('permute', {
|
|
32
|
+
input: {
|
|
33
|
+
storage,
|
|
34
|
+
path,
|
|
35
|
+
list
|
|
36
|
+
}
|
|
37
|
+
})
|
|
31
38
|
|
|
32
39
|
if (error instanceof Error)
|
|
33
40
|
throw new NotFound()
|