@toa.io/extensions.exposition 1.0.0-alpha.6 → 1.0.0-alpha.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.toa.yaml +2 -2
- package/components/identity.bans/manifest.toa.yaml +15 -7
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +21 -10
- package/components/identity.basic/operations/authenticate.d.ts +5 -1
- package/components/identity.basic/operations/authenticate.js +5 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/incept.d.ts +12 -0
- package/components/identity.basic/operations/incept.js +26 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +4 -4
- package/components/identity.basic/operations/transit.js +5 -3
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/types.d.ts +8 -4
- package/components/identity.basic/source/authenticate.ts +16 -5
- package/components/identity.basic/source/incept.ts +38 -0
- package/components/identity.basic/source/transit.ts +8 -6
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +32 -16
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +4 -11
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/incept.d.ts +11 -0
- package/components/identity.federation/operations/{create.js → incept.js} +6 -7
- package/components/identity.federation/operations/incept.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
- package/components/identity.federation/operations/lib/jwt.js +25 -12
- package/components/identity.federation/operations/lib/jwt.js.map +1 -1
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/configuration.d.ts +14 -0
- package/components/identity.federation/operations/types/configuration.js +3 -0
- package/components/identity.federation/operations/types/configuration.js.map +1 -0
- package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
- package/components/identity.federation/operations/types/context.js +3 -0
- package/components/identity.federation/operations/types/context.js.map +1 -0
- package/components/identity.federation/operations/types/entity.d.ts +6 -0
- package/components/identity.federation/operations/types/entity.js +3 -0
- package/components/identity.federation/operations/types/entity.js.map +1 -0
- package/components/identity.federation/operations/types/index.d.ts +3 -0
- package/components/identity.federation/operations/types/index.js +20 -0
- package/components/identity.federation/operations/types/index.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +6 -19
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/jwt.test.ts +123 -4
- package/components/identity.federation/source/lib/jwt.ts +36 -16
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
- package/components/identity.federation/source/types/entity.ts +6 -0
- package/components/identity.federation/source/types/index.ts +3 -0
- package/components/identity.federation/tsconfig.json +5 -4
- package/components/identity.roles/manifest.toa.yaml +18 -7
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -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 +32 -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 +19 -5
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +12 -5
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js +1 -0
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.js +5 -1
- package/components/identity.tokens/operations/encrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/operations/types.d.ts +8 -2
- package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
- package/components/identity.tokens/source/authenticate.test.ts +11 -4
- package/components/identity.tokens/source/authenticate.ts +14 -6
- package/components/identity.tokens/source/decrypt.test.ts +5 -3
- package/components/identity.tokens/source/decrypt.ts +9 -8
- package/components/identity.tokens/source/encrypt.test.ts +26 -2
- package/components/identity.tokens/source/encrypt.ts +5 -1
- package/components/identity.tokens/source/types.ts +9 -2
- package/components/octets.storage/manifest.toa.yaml +6 -7
- package/components/octets.storage/operations/get.js +2 -2
- package/components/octets.storage/operations/store.js +113 -3
- package/documentation/access.md +75 -38
- package/documentation/authorities.md +49 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +47 -22
- package/documentation/flow.md +31 -0
- package/documentation/identity.md +17 -22
- package/documentation/introspection.md +82 -0
- package/documentation/octets.md +81 -23
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +29 -4
- package/documentation/require.md +15 -0
- package/documentation/tree.md +13 -0
- package/documentation/vary.md +14 -14
- package/features/access.feature +78 -46
- package/features/annotation.feature +1 -0
- package/features/auth.claim.feature +170 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +100 -0
- package/features/authorities.tokens.feature +117 -0
- package/features/body.feature +3 -0
- package/features/cache.feature +109 -5
- package/features/cors.feature +6 -1
- package/features/debug.feature +34 -0
- package/features/directives.feature +3 -0
- package/features/dynamic.feature +4 -0
- package/features/errors.feature +20 -7
- package/features/etag.feature +31 -0
- package/features/flow.feature +45 -0
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +125 -23
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +66 -11
- package/features/identity.roles.feature +250 -7
- package/features/identity.tokens.feature +54 -4
- package/features/introspection.feature +153 -0
- package/features/io.feature +38 -1
- package/features/methods.feature +47 -0
- package/features/octets.download.feature +189 -0
- package/features/octets.entries.feature +8 -1
- package/features/octets.feature +82 -54
- package/features/octets.meta.feature +3 -0
- package/features/octets.workflows.feature +239 -19
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +65 -2
- package/features/require.feature +67 -0
- package/features/response.feature +38 -3
- package/features/routes.feature +93 -2
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +30 -25
- package/features/steps/Parameters.ts +1 -1
- package/features/steps/components/echo/manifest.toa.yaml +14 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/echo/operations/parameters.js +7 -0
- package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
- package/features/steps/components/echo.beacon/operations/hello.js +5 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
- package/features/steps/components/octets.tester/operations/authority.js +7 -0
- package/features/steps/components/octets.tester/operations/baz.js +1 -2
- package/features/steps/components/octets.tester/operations/diversify.js +3 -1
- package/features/steps/components/octets.tester/operations/foo.js +2 -2
- package/features/steps/components/octets.tester/operations/redirect.js +12 -0
- package/features/steps/components/octets.tester/operations/yex.js +16 -0
- package/features/steps/components/octets.tester/operations/yield.js +13 -0
- package/features/steps/components/pots/manifest.toa.yaml +14 -3
- package/features/steps/components/users/manifest.toa.yaml +0 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
- package/features/streams.feature +1 -0
- package/features/timing.feature +27 -1
- package/features/vary.feature +71 -0
- package/package.json +22 -14
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/method.cos.yaml +1 -1
- package/schemas/node.cos.yaml +1 -0
- package/schemas/octets/store.cos.yaml +25 -3
- package/schemas/query.cos.yaml +4 -10
- package/source/Annotation.ts +3 -3
- package/source/Composition.ts +2 -2
- package/source/Directive.ts +4 -5
- package/source/Endpoint.ts +48 -12
- package/source/Factory.ts +10 -11
- package/source/Gateway.ts +49 -20
- package/source/HTTP/Context.ts +24 -2
- package/source/HTTP/Server.ts +51 -44
- package/source/HTTP/exceptions.ts +13 -1
- package/source/HTTP/formats/index.ts +3 -3
- package/source/HTTP/messages.test.ts +39 -2
- package/source/HTTP/messages.ts +7 -3
- package/source/Introspection.ts +11 -0
- package/source/Mapping.ts +63 -21
- package/source/Query.test.ts +3 -3
- package/source/Query.ts +117 -33
- package/source/RTD/Endpoint.ts +3 -0
- package/source/RTD/Method.ts +16 -0
- package/source/RTD/Node.ts +29 -13
- package/source/RTD/Route.ts +5 -4
- package/source/RTD/factory.ts +5 -2
- package/source/RTD/syntax/parse.ts +37 -24
- package/source/RTD/syntax/types.ts +6 -4
- package/source/Remotes.ts +2 -9
- package/source/Tenant.ts +0 -8
- package/source/deployment.ts +32 -22
- package/source/directives/auth/Authorization.ts +37 -14
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Federation.ts +84 -0
- package/source/directives/auth/Incept.ts +4 -3
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/split.ts +1 -1
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +13 -6
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +1 -1
- package/source/directives/dev/Development.ts +1 -1
- package/source/directives/flow/Fetch.ts +88 -0
- package/source/directives/flow/Flow.ts +34 -0
- package/source/directives/flow/index.ts +3 -0
- package/source/directives/flow/types.ts +6 -0
- package/source/directives/index.ts +3 -1
- package/source/directives/io/Input.ts +4 -4
- package/source/directives/io/Output.ts +1 -1
- package/source/directives/octets/Context.ts +7 -5
- package/source/directives/octets/Delete.ts +4 -2
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +15 -13
- package/source/directives/octets/List.ts +9 -7
- package/source/directives/octets/Octets.ts +4 -5
- package/source/directives/octets/Store.ts +34 -12
- package/source/directives/octets/Workflow.ts +10 -3
- package/source/directives/octets/bytes.test.ts +30 -0
- package/source/directives/octets/bytes.ts +18 -0
- package/source/directives/octets/schemas.ts +4 -6
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/octets/workflows/Execution.ts +59 -8
- package/source/directives/octets/workflows/Workflow.ts +2 -1
- package/source/directives/require/Directive.ts +5 -0
- package/source/directives/require/Headers.ts +20 -0
- package/source/directives/require/Require.ts +28 -0
- package/source/directives/require/index.ts +3 -0
- package/source/directives/vary/Directive.ts +2 -1
- package/source/directives/vary/Embed.ts +14 -8
- package/source/directives/vary/Vary.ts +6 -4
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +22 -11
- package/source/manifest.ts +10 -11
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Composition.js +2 -2
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +4 -4
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +6 -4
- package/transpiled/Endpoint.js +28 -4
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +1 -1
- package/transpiled/Factory.js +9 -8
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -0
- package/transpiled/Gateway.js +36 -12
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +8 -1
- package/transpiled/HTTP/Context.js +15 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +38 -36
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +7 -1
- package/transpiled/HTTP/exceptions.js +13 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/index.js +3 -3
- package/transpiled/HTTP/formats/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +1 -0
- package/transpiled/HTTP/messages.js +9 -3
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Introspection.d.ts +9 -0
- package/transpiled/Introspection.js +3 -0
- package/transpiled/Introspection.js.map +1 -0
- package/transpiled/Mapping.d.ts +10 -2
- package/transpiled/Mapping.js +48 -19
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +10 -1
- package/transpiled/Query.js +83 -30
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +1 -0
- package/transpiled/RTD/Method.d.ts +4 -0
- package/transpiled/RTD/Method.js +11 -0
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -1
- package/transpiled/RTD/Node.js +23 -12
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.d.ts +1 -1
- package/transpiled/RTD/Route.js +0 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/factory.js +5 -2
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +34 -22
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +5 -3
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.d.ts +2 -4
- package/transpiled/Remotes.js +0 -5
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +0 -1
- package/transpiled/Tenant.js +0 -6
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/deployment.js +28 -20
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +26 -10
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +10 -0
- package/transpiled/directives/auth/Delegate.js +34 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Federation.d.ts +16 -0
- package/transpiled/directives/auth/Federation.js +57 -0
- package/transpiled/directives/auth/Federation.js.map +1 -0
- package/transpiled/directives/auth/Incept.js +4 -3
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +20 -14
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/split.js +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +10 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -1
- package/transpiled/directives/cache/Control.js +29 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.js +1 -1
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/flow/Fetch.d.ts +13 -0
- package/transpiled/directives/flow/Fetch.js +59 -0
- package/transpiled/directives/flow/Fetch.js.map +1 -0
- package/transpiled/directives/flow/Flow.d.ts +10 -0
- package/transpiled/directives/flow/Flow.js +27 -0
- package/transpiled/directives/flow/Flow.js.map +1 -0
- package/transpiled/directives/flow/index.d.ts +2 -0
- package/transpiled/directives/flow/index.js +6 -0
- package/transpiled/directives/flow/index.js.map +1 -0
- package/transpiled/directives/flow/types.d.ts +5 -0
- package/transpiled/directives/flow/types.js.map +1 -0
- package/transpiled/directives/index.js +3 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Input.js +2 -2
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/octets/Context.d.ts +3 -3
- package/transpiled/directives/octets/Context.js +8 -26
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +3 -2
- package/transpiled/directives/octets/Delete.js +3 -1
- 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 +6 -5
- package/transpiled/directives/octets/Fetch.js +11 -9
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +6 -5
- package/transpiled/directives/octets/List.js +6 -4
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +2 -1
- package/transpiled/directives/octets/Octets.js +2 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +9 -3
- package/transpiled/directives/octets/Store.js +20 -8
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +3 -2
- package/transpiled/directives/octets/Workflow.js +9 -2
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.d.ts +1 -0
- package/transpiled/directives/octets/bytes.js +21 -0
- package/transpiled/directives/octets/bytes.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +4 -6
- package/transpiled/directives/octets/schemas.js +1 -3
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
- package/transpiled/directives/octets/workflows/Execution.js +43 -9
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js +2 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +2 -1
- package/transpiled/directives/vary/Embed.d.ts +2 -1
- package/transpiled/directives/vary/Embed.js +8 -6
- package/transpiled/directives/vary/Embed.js.map +1 -1
- package/transpiled/directives/vary/Vary.d.ts +2 -2
- package/transpiled/directives/vary/Vary.js +3 -3
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Authority.js +10 -0
- package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
- package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
- package/transpiled/directives/vary/embeddings/index.js +8 -4
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +13 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/manifest.js +10 -11
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/schemas.d.ts +1 -1
- package/transpiled/schemas.js +2 -2
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/tsconfig.json +9 -7
- package/components/identity.basic/operations/create.d.ts +0 -10
- package/components/identity.basic/operations/create.js +0 -10
- package/components/identity.basic/operations/create.js.map +0 -1
- package/components/identity.basic/source/create.ts +0 -18
- package/components/identity.federation/operations/create.d.ts +0 -10
- package/components/identity.federation/operations/create.js.map +0 -1
- package/components/identity.federation/operations/schemas.d.ts +0 -59
- package/components/identity.federation/operations/schemas.js +0 -9
- package/components/identity.federation/operations/schemas.js.map +0 -1
- package/components/identity.federation/operations/types.js.map +0 -1
- package/components/identity.federation/source/schemas.ts +0 -61
- package/components/octets.storage/operations/permute.js +0 -7
- package/schemas/octets/context.cos.yaml +0 -1
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Permute.ts +0 -43
- package/transpiled/directives/octets/Permute.d.ts +0 -10
- package/transpiled/directives/octets/Permute.js +0 -56
- package/transpiled/directives/octets/Permute.js.map +0 -1
- /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
|
@@ -4,56 +4,82 @@ import type { AuthenticatedContext, Directive } from './types'
|
|
|
4
4
|
export class Control implements Directive {
|
|
5
5
|
protected readonly value: string
|
|
6
6
|
private cache: string | null = null
|
|
7
|
+
private vary: boolean = false
|
|
7
8
|
|
|
8
9
|
public constructor (value: string) {
|
|
9
10
|
this.value = value
|
|
10
11
|
}
|
|
11
12
|
|
|
13
|
+
public static disabled (headers: Headers): boolean {
|
|
14
|
+
const value = headers.get('cache-control')
|
|
15
|
+
|
|
16
|
+
if (value === null)
|
|
17
|
+
return false
|
|
18
|
+
|
|
19
|
+
const directives = mask(value)
|
|
20
|
+
|
|
21
|
+
return (directives & NO_STORE) === NO_STORE
|
|
22
|
+
}
|
|
23
|
+
|
|
12
24
|
public set (context: AuthenticatedContext, headers: Headers): void {
|
|
13
25
|
if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
|
|
14
26
|
return
|
|
15
27
|
|
|
16
28
|
this.cache ??= this.resolve(context)
|
|
17
29
|
|
|
30
|
+
if (Control.disabled(headers))
|
|
31
|
+
return
|
|
32
|
+
|
|
18
33
|
headers.set('cache-control', this.cache)
|
|
34
|
+
|
|
35
|
+
if (this.vary !== null)
|
|
36
|
+
headers.append('vary', 'authorization')
|
|
19
37
|
}
|
|
20
38
|
|
|
21
39
|
protected resolve (request: AuthenticatedContext): string {
|
|
22
40
|
if (request.identity === null)
|
|
23
41
|
return this.value
|
|
24
42
|
|
|
25
|
-
const directives = this.
|
|
43
|
+
const directives = mask(this.value)
|
|
44
|
+
|
|
45
|
+
if ((directives & PRIVATE) === PRIVATE)
|
|
46
|
+
this.vary = true
|
|
26
47
|
|
|
27
48
|
if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
|
|
28
49
|
return 'no-cache, ' + this.value
|
|
29
50
|
|
|
30
|
-
if ((directives & (PUBLIC | PRIVATE)) === 0)
|
|
51
|
+
if ((directives & (PUBLIC | PRIVATE)) === 0) {
|
|
52
|
+
this.vary = true
|
|
53
|
+
|
|
31
54
|
return 'private, ' + this.value
|
|
55
|
+
}
|
|
32
56
|
|
|
33
57
|
return this.value
|
|
34
58
|
}
|
|
59
|
+
}
|
|
35
60
|
|
|
36
|
-
|
|
37
|
-
|
|
61
|
+
function mask (value: string): number {
|
|
62
|
+
const directives = value.match(DIRECTIVES_RX)
|
|
38
63
|
|
|
39
|
-
|
|
40
|
-
|
|
64
|
+
if (directives === null)
|
|
65
|
+
return 0
|
|
41
66
|
|
|
42
|
-
|
|
67
|
+
let mask = 0
|
|
43
68
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
69
|
+
for (const directive of directives)
|
|
70
|
+
mask |= match<number>(directive,
|
|
71
|
+
'private', PRIVATE,
|
|
72
|
+
'public', PUBLIC,
|
|
73
|
+
'no-cache', NO_CACHE,
|
|
74
|
+
'no-store', NO_STORE,
|
|
75
|
+
0)
|
|
50
76
|
|
|
51
|
-
|
|
52
|
-
}
|
|
77
|
+
return mask
|
|
53
78
|
}
|
|
54
79
|
|
|
55
|
-
const DIRECTIVES_RX = /\b(private|public|no-cache)\b/ig
|
|
80
|
+
const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/ig
|
|
56
81
|
|
|
57
82
|
const PUBLIC = 1
|
|
58
83
|
const PRIVATE = 2
|
|
59
84
|
const NO_CACHE = 4
|
|
85
|
+
const NO_STORE = 8
|
|
@@ -14,7 +14,7 @@ export class CORS implements Interceptor {
|
|
|
14
14
|
])
|
|
15
15
|
|
|
16
16
|
private readonly headers = new Headers({
|
|
17
|
-
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
|
|
17
|
+
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, LOCK, UNLOCK',
|
|
18
18
|
'access-control-allow-credentials': 'true',
|
|
19
19
|
'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
|
|
20
20
|
'access-control-max-age': '3600',
|
|
@@ -12,7 +12,7 @@ export class Development implements DirectiveFamily<Directive> {
|
|
|
12
12
|
const Class = constructors[name]
|
|
13
13
|
|
|
14
14
|
if (Class === undefined)
|
|
15
|
-
throw new Error(`Directive '
|
|
15
|
+
throw new Error(`Directive 'dev:${name}' is not implemented.`)
|
|
16
16
|
|
|
17
17
|
return new Class(value)
|
|
18
18
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Readable } from 'node:stream'
|
|
2
|
+
import assert from 'node:assert'
|
|
3
|
+
import { match } from 'matchacho'
|
|
4
|
+
import { NotFound } from '../../HTTP'
|
|
5
|
+
import type { Directive } from './types'
|
|
6
|
+
import type { ReadableStream } from 'node:stream/web'
|
|
7
|
+
import type { Remotes } from '../../Remotes'
|
|
8
|
+
import type { Maybe } from '@toa.io/types'
|
|
9
|
+
import type { Component } from '@toa.io/core'
|
|
10
|
+
import type { Output } from '../../io'
|
|
11
|
+
import type { Input } from '../octets/types'
|
|
12
|
+
import type { Parameter } from '../../RTD'
|
|
13
|
+
|
|
14
|
+
export class Fetch implements Directive {
|
|
15
|
+
public readonly targeted = true
|
|
16
|
+
|
|
17
|
+
private readonly connecting: Promise<Component>
|
|
18
|
+
private remote: Component | null = null
|
|
19
|
+
private readonly operation: string
|
|
20
|
+
|
|
21
|
+
public constructor (endpoint: string, discovery: Remotes) {
|
|
22
|
+
assert.equal(typeof endpoint, 'string', '`flow:redirect` must be a string')
|
|
23
|
+
|
|
24
|
+
const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
|
|
25
|
+
|
|
26
|
+
this.operation = operation
|
|
27
|
+
this.connecting = discovery.discover(namespace, name)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public async apply (input: Input, parameters: Parameter[]): Promise<Output> {
|
|
31
|
+
if ('if-none-match' in input.request.headers)
|
|
32
|
+
return { status: 304 }
|
|
33
|
+
|
|
34
|
+
this.remote ??= await this.connecting
|
|
35
|
+
|
|
36
|
+
const request = await this.remote.invoke<Maybe<Request | string>>(this.operation, {
|
|
37
|
+
input: {
|
|
38
|
+
authority: input.authority,
|
|
39
|
+
path: input.request.url,
|
|
40
|
+
parameters: Object.fromEntries(parameters.map(({ name, value }) => [name, value]))
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
if (request instanceof Error)
|
|
45
|
+
throw new NotFound(request)
|
|
46
|
+
|
|
47
|
+
const { url, options } = match<Request>(request,
|
|
48
|
+
String, { url: request },
|
|
49
|
+
(request: Request): Request => ({
|
|
50
|
+
url: request.url,
|
|
51
|
+
options: {
|
|
52
|
+
method: request.options?.method ?? 'GET',
|
|
53
|
+
body: request.options?.body,
|
|
54
|
+
headers: request.options?.headers
|
|
55
|
+
}
|
|
56
|
+
}))
|
|
57
|
+
|
|
58
|
+
const response = await fetch(url, options)
|
|
59
|
+
|
|
60
|
+
if (!response.ok)
|
|
61
|
+
throw new NotFound()
|
|
62
|
+
|
|
63
|
+
const headers = new Headers()
|
|
64
|
+
|
|
65
|
+
for (const header of ['content-type', 'content-length', 'etag']) {
|
|
66
|
+
const value = response.headers.get(header)
|
|
67
|
+
|
|
68
|
+
if (value !== null)
|
|
69
|
+
headers.set(header, value)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
headers,
|
|
74
|
+
body: response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface Request {
|
|
80
|
+
url: string
|
|
81
|
+
options?: RequestOptions
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface RequestOptions {
|
|
85
|
+
method?: string
|
|
86
|
+
body?: string
|
|
87
|
+
headers?: Record<string, string>
|
|
88
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Fetch } from './Fetch'
|
|
2
|
+
import type { Directive } from './types'
|
|
3
|
+
import type { Input, Output } from '../../io'
|
|
4
|
+
import type { DirectiveFamily, Parameter } from '../../RTD'
|
|
5
|
+
import type { Remotes } from '../../Remotes'
|
|
6
|
+
|
|
7
|
+
export class Flow implements DirectiveFamily<Directive> {
|
|
8
|
+
public readonly name: string = 'flow'
|
|
9
|
+
public readonly mandatory: boolean = false
|
|
10
|
+
|
|
11
|
+
public create (name: string, value: unknown, remotes: Remotes): Directive {
|
|
12
|
+
const Class = constructors[name]
|
|
13
|
+
|
|
14
|
+
if (Class === undefined)
|
|
15
|
+
throw new Error(`Directive '${this.name}:${name}' is not implemented.`)
|
|
16
|
+
|
|
17
|
+
return new Class(value, remotes)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async preflight (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
|
|
21
|
+
for (const directive of directives) {
|
|
22
|
+
const output = await directive.apply(input, parameters)
|
|
23
|
+
|
|
24
|
+
if (output !== null)
|
|
25
|
+
return output
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const constructors: Record<string, new (value: any, discovery: Remotes) => Directive> = {
|
|
33
|
+
fetch: Fetch
|
|
34
|
+
}
|
|
@@ -5,8 +5,10 @@ import { dev } from './dev'
|
|
|
5
5
|
import { octets } from './octets'
|
|
6
6
|
import { io } from './io'
|
|
7
7
|
import { vary } from './vary'
|
|
8
|
+
import { req } from './require'
|
|
9
|
+
import { flow } from './flow'
|
|
8
10
|
import type { DirectiveFamily } from '../RTD'
|
|
9
11
|
import type { Interceptor } from '../Interception'
|
|
10
12
|
|
|
11
|
-
export const families: DirectiveFamily[] = [authorization, io, cache, vary, octets, dev]
|
|
13
|
+
export const families: DirectiveFamily[] = [authorization, io, cache, vary, req, flow, octets, dev]
|
|
12
14
|
export const interceptors: Interceptor[] = [cors]
|
|
@@ -12,7 +12,7 @@ export class Input implements Directive {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
public static validate (permissions: unknown): asserts permissions is Permissions {
|
|
15
|
-
schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
|
|
15
|
+
schemas.input.validate<Permissions>(permissions, 'Incorrect \'io:input\' format')
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
public attach (context: Context): void {
|
|
@@ -21,15 +21,15 @@ export class Input implements Directive {
|
|
|
21
21
|
|
|
22
22
|
private check (body: unknown): unknown {
|
|
23
23
|
try {
|
|
24
|
-
schemas.message.validate(body)
|
|
24
|
+
schemas.message.validate<Message | Message[]>(body)
|
|
25
25
|
} catch {
|
|
26
|
-
throw new BadRequest('Invalid request body
|
|
26
|
+
throw new BadRequest('Invalid request body')
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
const property = this.violation(body)
|
|
30
30
|
|
|
31
31
|
if (property !== undefined)
|
|
32
|
-
throw new BadRequest(`Unexpected input: ${property}
|
|
32
|
+
throw new BadRequest(`Unexpected input: ${property}`)
|
|
33
33
|
|
|
34
34
|
return body
|
|
35
35
|
}
|
|
@@ -48,7 +48,7 @@ export class Output implements Directive {
|
|
|
48
48
|
return
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
schemas.message.validate(message.body,
|
|
51
|
+
schemas.message.validate<Message>(message.body,
|
|
52
52
|
'\'io:output\' expects response to be an object or array of objects')
|
|
53
53
|
|
|
54
54
|
if (Array.isArray(message.body))
|
|
@@ -1,18 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
import { Directive } from './Directive'
|
|
2
3
|
import type { Output } from '../../io'
|
|
3
|
-
import type { Directive } from './types'
|
|
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
9
|
public constructor (value: unknown) {
|
|
10
|
-
|
|
10
|
+
super()
|
|
11
|
+
|
|
12
|
+
assert.ok(typeof value === 'string', 'Directive \'octets:context\' must must be a string')
|
|
11
13
|
|
|
12
14
|
this.storage = value
|
|
13
15
|
}
|
|
14
16
|
|
|
15
|
-
public apply (): Output {
|
|
17
|
+
public async apply (): Promise<Output> {
|
|
16
18
|
return null
|
|
17
19
|
}
|
|
18
20
|
}
|
|
@@ -2,16 +2,17 @@ import { Readable } from 'stream'
|
|
|
2
2
|
import { NotFound } from '../../HTTP'
|
|
3
3
|
import * as schemas from './schemas'
|
|
4
4
|
import { Workflow } from './workflows'
|
|
5
|
+
import { Directive } from './Directive'
|
|
5
6
|
import type { Parameter } from '../../RTD'
|
|
6
7
|
import type { Unit } from './workflows'
|
|
7
8
|
import type { Maybe } from '@toa.io/types'
|
|
8
9
|
import type { Component } from '@toa.io/core'
|
|
9
10
|
import type { Output } from '../../io'
|
|
10
|
-
import type {
|
|
11
|
+
import type { Input } from './types'
|
|
11
12
|
import type { Remotes } from '../../Remotes'
|
|
12
13
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
13
14
|
|
|
14
|
-
export class Delete
|
|
15
|
+
export class Delete extends Directive {
|
|
15
16
|
public readonly targeted = true
|
|
16
17
|
|
|
17
18
|
private readonly workflow?: Workflow
|
|
@@ -19,6 +20,7 @@ export class Delete implements Directive {
|
|
|
19
20
|
private storage: Component | null = null
|
|
20
21
|
|
|
21
22
|
public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
23
|
+
super()
|
|
22
24
|
schemas.remove.validate(options)
|
|
23
25
|
|
|
24
26
|
if (options?.workflow !== undefined)
|
|
@@ -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,29 +1,31 @@
|
|
|
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'
|
|
5
|
+
import type { Readable } from 'node:stream'
|
|
4
6
|
import type { Maybe } from '@toa.io/types'
|
|
5
7
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
6
|
-
import type { Readable } from 'node:stream'
|
|
7
8
|
import type { Component } from '@toa.io/core'
|
|
8
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
|
|
15
|
+
private readonly options: Required<Options> = {
|
|
16
16
|
blob: true,
|
|
17
17
|
meta: false
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
private readonly discovery: Promise<Component>
|
|
21
|
-
private storage
|
|
21
|
+
private storage!: Component
|
|
22
|
+
|
|
23
|
+
public constructor (options: Options | null, discovery: Promise<Component>) {
|
|
24
|
+
super()
|
|
22
25
|
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
schemas.fetch.validate(options)
|
|
27
|
+
Object.assign(this.options, options)
|
|
25
28
|
|
|
26
|
-
Object.assign(this.permissions, permissions)
|
|
27
29
|
this.discovery = discovery
|
|
28
30
|
}
|
|
29
31
|
|
|
@@ -34,12 +36,12 @@ export class Fetch implements Directive {
|
|
|
34
36
|
const metadata = input.subtype === 'octets.entry'
|
|
35
37
|
|
|
36
38
|
if (!variant && metadata)
|
|
37
|
-
if (this.
|
|
39
|
+
if (this.options.meta)
|
|
38
40
|
return this.get(storage, input)
|
|
39
41
|
else
|
|
40
42
|
throw new Forbidden('Metadata is not accessible.')
|
|
41
43
|
|
|
42
|
-
if (!variant && !this.
|
|
44
|
+
if (!variant && !this.options.blob)
|
|
43
45
|
throw new Forbidden('BLOB variant must be specified.')
|
|
44
46
|
|
|
45
47
|
return await this.fetch(storage, input)
|
|
@@ -62,7 +64,7 @@ export class Fetch implements Directive {
|
|
|
62
64
|
const headers = new Headers({
|
|
63
65
|
'content-type': result.type,
|
|
64
66
|
'content-length': result.size.toString(),
|
|
65
|
-
etag: result.checksum
|
|
67
|
+
etag: `"${result.checksum}"`
|
|
66
68
|
})
|
|
67
69
|
|
|
68
70
|
return {
|
|
@@ -86,7 +88,7 @@ export class Fetch implements Directive {
|
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
90
|
|
|
89
|
-
export interface
|
|
91
|
+
export interface Options {
|
|
90
92
|
blob?: boolean
|
|
91
93
|
meta?: boolean
|
|
92
94
|
}
|
|
@@ -1,24 +1,26 @@
|
|
|
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 { Entry } from '@toa.io/extensions.storages'
|
|
5
6
|
import type { Maybe } from '@toa.io/types'
|
|
6
7
|
import type { Component } from '@toa.io/core'
|
|
7
8
|
import type { Output } from '../../io'
|
|
8
9
|
|
|
9
|
-
import type {
|
|
10
|
+
import type { Input } from './types'
|
|
10
11
|
|
|
11
|
-
export class List
|
|
12
|
+
export class List extends Directive {
|
|
12
13
|
public readonly targeted = false
|
|
13
14
|
|
|
14
|
-
private readonly
|
|
15
|
+
private readonly options: Required<Options> = { meta: false }
|
|
15
16
|
private readonly discovery: Promise<Component>
|
|
16
17
|
private storage: Component | null = null
|
|
17
18
|
|
|
18
|
-
public constructor (permissions:
|
|
19
|
+
public constructor (permissions: Options | null, discovery: Promise<Component>) {
|
|
20
|
+
super()
|
|
19
21
|
schemas.list.validate(permissions)
|
|
20
22
|
|
|
21
|
-
Object.assign(this.
|
|
23
|
+
Object.assign(this.options, permissions)
|
|
22
24
|
this.discovery = discovery
|
|
23
25
|
}
|
|
24
26
|
|
|
@@ -27,7 +29,7 @@ export class List implements Directive {
|
|
|
27
29
|
|
|
28
30
|
const metadata = input.subtype === 'octets.entries'
|
|
29
31
|
|
|
30
|
-
if (metadata && !this.
|
|
32
|
+
if (metadata && !this.options.meta)
|
|
31
33
|
throw new Forbidden('Metadata is not accessible.')
|
|
32
34
|
|
|
33
35
|
const list = await this.storage.invoke<Maybe<string[]>>('list', {
|
|
@@ -65,6 +67,6 @@ export class List implements Directive {
|
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
export interface
|
|
70
|
+
export interface Options {
|
|
69
71
|
meta?: boolean
|
|
70
72
|
}
|
|
@@ -4,13 +4,13 @@ import { Store } from './Store'
|
|
|
4
4
|
import { Fetch } from './Fetch'
|
|
5
5
|
import { List } from './List'
|
|
6
6
|
import { Delete } from './Delete'
|
|
7
|
-
import { Permute } from './Permute'
|
|
8
7
|
import { WorkflowDirective } from './Workflow'
|
|
8
|
+
import type { Directive } from './Directive'
|
|
9
9
|
import type { Output } from '../../io'
|
|
10
10
|
import type { Component } from '@toa.io/core'
|
|
11
11
|
import type { Remotes } from '../../Remotes'
|
|
12
12
|
import type { Parameter, DirectiveFamily } from '../../RTD'
|
|
13
|
-
import type {
|
|
13
|
+
import type { Input } from './types'
|
|
14
14
|
|
|
15
15
|
export class Octets implements DirectiveFamily<Directive> {
|
|
16
16
|
public readonly name: string = 'octets'
|
|
@@ -22,7 +22,7 @@ export class Octets implements DirectiveFamily<Directive> {
|
|
|
22
22
|
const Class = DIRECTIVES[name]
|
|
23
23
|
|
|
24
24
|
if (Class === undefined)
|
|
25
|
-
throw new Error(`Directive '
|
|
25
|
+
throw new Error(`Directive 'octets:${name}' is not implemented.`)
|
|
26
26
|
|
|
27
27
|
this.discovery ??= remotes.discover('octets', 'storage')
|
|
28
28
|
|
|
@@ -55,7 +55,7 @@ export class Octets implements DirectiveFamily<Directive> {
|
|
|
55
55
|
throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
|
|
56
56
|
|
|
57
57
|
// noinspection JSObjectNullOrUndefined
|
|
58
|
-
return action.apply(context.storage, input, parameters)
|
|
58
|
+
return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
@@ -65,7 +65,6 @@ const DIRECTIVES: Record<string, Constructor> = {
|
|
|
65
65
|
fetch: Fetch,
|
|
66
66
|
list: List,
|
|
67
67
|
delete: Delete,
|
|
68
|
-
permute: Permute,
|
|
69
68
|
workflow: WorkflowDirective
|
|
70
69
|
}
|
|
71
70
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { PassThrough } from 'node:stream'
|
|
2
2
|
import { match } from 'matchacho'
|
|
3
|
-
import
|
|
3
|
+
import * as http from '../../HTTP'
|
|
4
4
|
import { cors } from '../cors'
|
|
5
5
|
import * as schemas from './schemas'
|
|
6
6
|
import { Workflow } from './workflows'
|
|
7
|
+
import { Directive } from './Directive'
|
|
8
|
+
import { toBytes } from './bytes'
|
|
7
9
|
import type { Readable } from 'stream'
|
|
8
10
|
import type { Parameter } from '../../RTD'
|
|
9
11
|
import type { Unit } from './workflows'
|
|
@@ -12,19 +14,24 @@ import type { Remotes } from '../../Remotes'
|
|
|
12
14
|
import type { ErrorType } from 'error-value'
|
|
13
15
|
import type { Component } from '@toa.io/core'
|
|
14
16
|
import type { Output } from '../../io'
|
|
15
|
-
import type {
|
|
17
|
+
import type { Input } from './types'
|
|
16
18
|
|
|
17
|
-
export class Store
|
|
19
|
+
export class Store extends Directive {
|
|
18
20
|
public readonly targeted = false
|
|
19
21
|
|
|
20
22
|
private readonly accept?: string
|
|
23
|
+
private readonly limit: number
|
|
24
|
+
private readonly limitString: string
|
|
25
|
+
private readonly trust?: Array<string | RegExp>
|
|
21
26
|
private readonly workflow?: Workflow
|
|
22
27
|
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
23
28
|
private storage: Component | null = null
|
|
24
29
|
|
|
25
30
|
public constructor
|
|
26
31
|
(options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
27
|
-
|
|
32
|
+
super()
|
|
33
|
+
|
|
34
|
+
schemas.store.validate<Options>(options)
|
|
28
35
|
|
|
29
36
|
this.accept = match(options?.accept,
|
|
30
37
|
String, (value: string) => value,
|
|
@@ -34,9 +41,16 @@ export class Store implements Directive {
|
|
|
34
41
|
if (options?.workflow !== undefined)
|
|
35
42
|
this.workflow = new Workflow(options.workflow, remotes)
|
|
36
43
|
|
|
44
|
+
if (options?.trust !== undefined)
|
|
45
|
+
this.trust = options.trust.map((value: string) =>
|
|
46
|
+
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value)
|
|
47
|
+
|
|
48
|
+
this.limitString = options?.limit ?? '64MiB'
|
|
49
|
+
this.limit = toBytes(this.limitString)
|
|
37
50
|
this.discovery.storage = discovery
|
|
38
51
|
|
|
39
52
|
cors.allow('content-meta')
|
|
53
|
+
cors.allow('content-location')
|
|
40
54
|
}
|
|
41
55
|
|
|
42
56
|
public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
|
|
@@ -45,17 +59,17 @@ export class Store implements Directive {
|
|
|
45
59
|
const request: StoreRequest = {
|
|
46
60
|
input: {
|
|
47
61
|
storage,
|
|
48
|
-
request: input.request
|
|
62
|
+
request: input.request,
|
|
63
|
+
accept: this.accept,
|
|
64
|
+
limit: this.limit,
|
|
65
|
+
trust: this.trust
|
|
49
66
|
}
|
|
50
67
|
}
|
|
51
68
|
|
|
52
69
|
const meta = input.request.headers['content-meta']
|
|
53
70
|
|
|
54
|
-
if (this.accept !== undefined)
|
|
55
|
-
request.input.accept = this.accept
|
|
56
|
-
|
|
57
71
|
if (meta !== undefined)
|
|
58
|
-
request.input.meta = this.
|
|
72
|
+
request.input.meta = this.meta(meta)
|
|
59
73
|
|
|
60
74
|
const entry = await this.storage.invoke<Entry>('store', request)
|
|
61
75
|
|
|
@@ -87,12 +101,16 @@ export class Store implements Directive {
|
|
|
87
101
|
|
|
88
102
|
private throw (error: ErrorType): never {
|
|
89
103
|
throw match(error.code,
|
|
90
|
-
'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
|
|
91
|
-
'TYPE_MISMATCH', () => new BadRequest(),
|
|
104
|
+
'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
|
|
105
|
+
'TYPE_MISMATCH', () => new http.BadRequest(),
|
|
106
|
+
'LIMIT_EXCEEDED', () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
|
|
107
|
+
'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
|
|
108
|
+
'LOCATION_LENGTH', () => new http.BadRequest(error.message),
|
|
109
|
+
'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
|
|
92
110
|
error)
|
|
93
111
|
}
|
|
94
112
|
|
|
95
|
-
private
|
|
113
|
+
private meta (value: string | string[]): Record<string, string> {
|
|
96
114
|
if (Array.isArray(value))
|
|
97
115
|
value = value.join(',')
|
|
98
116
|
|
|
@@ -111,7 +129,9 @@ export class Store implements Directive {
|
|
|
111
129
|
|
|
112
130
|
export interface Options {
|
|
113
131
|
accept?: string | string[]
|
|
132
|
+
limit?: string
|
|
114
133
|
workflow?: Unit[] | Unit
|
|
134
|
+
trust?: string[]
|
|
115
135
|
}
|
|
116
136
|
|
|
117
137
|
interface StoreRequest {
|
|
@@ -119,6 +139,8 @@ interface StoreRequest {
|
|
|
119
139
|
storage: string
|
|
120
140
|
request: Input['request']
|
|
121
141
|
accept?: string
|
|
142
|
+
limit?: number
|
|
143
|
+
trust?: Array<string | RegExp>
|
|
122
144
|
meta?: Record<string, string>
|
|
123
145
|
}
|
|
124
146
|
}
|