@toa.io/extensions.exposition 1.0.0-alpha.4 → 1.0.0-alpha.41
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 +22 -9
- 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 +28 -22
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +3 -10
- 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 +4 -5
- package/components/identity.federation/operations/lib/jwt.js +3 -3
- 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} +13 -6
- 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.js → types/entity.js} +1 -1
- 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 +5 -18
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/jwt.test.ts +2 -2
- package/components/identity.federation/source/lib/jwt.ts +7 -8
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +15 -5
- 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 +2 -2
- package/components/identity.roles/manifest.toa.yaml +18 -6
- 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 +10 -4
- 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 +12 -5
- 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 +0 -7
- package/documentation/access.md +27 -16
- package/documentation/authorities.md +53 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +47 -22
- package/documentation/identity.md +17 -22
- package/documentation/io.md +56 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +17 -11
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +14 -14
- package/features/access.feature +89 -47
- package/features/annotation.feature +2 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +99 -0
- package/features/authorities.tokens.feature +118 -0
- package/features/body.feature +4 -0
- package/features/cache.feature +112 -5
- package/features/cors.feature +7 -2
- package/features/debug.feature +34 -0
- package/features/directives.feature +5 -0
- package/features/dynamic.feature +18 -7
- package/features/errors.feature +18 -4
- package/features/etag.feature +18 -1
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +142 -19
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +67 -14
- package/features/identity.roles.feature +220 -4
- package/features/identity.tokens.feature +57 -4
- package/features/io.feature +205 -0
- package/features/octets.entries.feature +10 -0
- package/features/octets.feature +60 -64
- package/features/octets.meta.feature +7 -3
- package/features/octets.workflows.feature +14 -0
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +50 -3
- package/features/require.feature +67 -0
- package/features/response.feature +12 -3
- package/features/routes.feature +25 -12
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +28 -23
- package/features/steps/components/echo/manifest.toa.yaml +5 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +2 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/streams.feature +1 -0
- package/features/timing.feature +27 -1
- package/features/vary.feature +105 -3
- package/package.json +12 -11
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- 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/source/Annotation.ts +3 -3
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +4 -4
- package/source/Directive.ts +11 -38
- package/source/Endpoint.ts +43 -8
- package/source/Factory.ts +11 -7
- package/source/Gateway.ts +16 -44
- package/source/HTTP/Context.ts +24 -2
- package/source/HTTP/Server.ts +56 -43
- package/source/HTTP/exceptions.ts +7 -1
- package/source/HTTP/messages.test.ts +38 -2
- package/source/HTTP/messages.ts +7 -3
- package/source/Mapping.ts +6 -1
- package/source/Query.test.ts +1 -1
- package/source/Query.ts +35 -24
- 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 +17 -16
- package/source/RTD/factory.ts +3 -6
- package/source/Tenant.ts +0 -8
- package/source/deployment.ts +32 -22
- package/source/directives/auth/Authorization.ts +38 -19
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Incept.ts +3 -2
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +15 -8
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +13 -7
- package/source/directives/dev/Development.ts +4 -4
- package/source/directives/index.ts +6 -4
- 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 +4 -3
- package/source/directives/octets/Delete.ts +4 -2
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +4 -3
- package/source/directives/octets/List.ts +4 -2
- package/source/directives/octets/Octets.ts +6 -8
- package/source/directives/octets/Store.ts +12 -4
- package/source/directives/octets/Workflow.ts +10 -3
- package/source/directives/octets/types.ts +0 -7
- 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 +7 -5
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Header.ts +8 -6
- package/source/directives/vary/embeddings/Language.ts +1 -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/root.ts +5 -0
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +4 -17
- package/transpiled/Directive.js +4 -7
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +5 -3
- package/transpiled/Endpoint.js +30 -5
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +9 -4
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +1 -4
- package/transpiled/Gateway.js +10 -26
- 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 +41 -35
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +4 -1
- package/transpiled/HTTP/exceptions.js +7 -1
- package/transpiled/HTTP/exceptions.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/Mapping.js +4 -1
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +1 -0
- package/transpiled/Query.js +21 -20
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +4 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.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.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +26 -12
- 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/Incept.js +3 -2
- 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/cache/Cache.d.ts +5 -5
- 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.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +13 -7
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.d.ts +3 -3
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/index.d.ts +2 -2
- package/transpiled/directives/index.js +5 -3
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -26
- 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 +3 -3
- package/transpiled/directives/octets/Context.js +4 -2
- 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 +3 -2
- package/transpiled/directives/octets/Fetch.js +3 -1
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +3 -2
- package/transpiled/directives/octets/List.js +3 -1
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +2 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +3 -2
- package/transpiled/directives/octets/Store.js +10 -3
- 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/types.d.ts +0 -5
- 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 +3 -3
- 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/Header.js +8 -6
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +1 -1
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -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/root.js +5 -0
- package/transpiled/root.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/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/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.map +0 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { Control } from './Control'
|
|
2
2
|
import { Exact } from './Exact'
|
|
3
|
-
import type {
|
|
4
|
-
import type { Directive } from './types'
|
|
5
|
-
import type {
|
|
3
|
+
import type { Output } from '../../io'
|
|
4
|
+
import type { AuthenticatedContext, Directive } from './types'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
6
6
|
import type * as http from '../../HTTP'
|
|
7
7
|
|
|
8
|
-
export class Cache implements
|
|
8
|
+
export class Cache implements DirectiveFamily<Directive> {
|
|
9
9
|
public readonly name: string = 'cache'
|
|
10
|
-
public readonly mandatory: boolean =
|
|
10
|
+
public readonly mandatory: boolean = true
|
|
11
11
|
|
|
12
12
|
public create (name: string, value: any): Directive {
|
|
13
13
|
const Class = constructors[name]
|
|
14
14
|
|
|
15
15
|
if (Class === undefined)
|
|
16
|
-
throw new Error(`Directive '
|
|
16
|
+
throw new Error(`Directive 'cache:${name}' is not implemented.`)
|
|
17
17
|
|
|
18
18
|
return new Class(value)
|
|
19
19
|
}
|
|
@@ -23,9 +23,16 @@ export class Cache implements Family<Directive> {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
public async settle
|
|
26
|
-
(directives: Directive[],
|
|
26
|
+
(directives: Directive[], context: AuthenticatedContext, response: http.OutgoingMessage): Promise<void> {
|
|
27
|
+
const directive = directives[0]
|
|
28
|
+
|
|
27
29
|
response.headers ??= new Headers()
|
|
28
|
-
|
|
30
|
+
|
|
31
|
+
if (directive === undefined) {
|
|
32
|
+
if (context.identity !== null && !Control.disabled(response.headers))
|
|
33
|
+
response.headers.set('cache-control', 'private')
|
|
34
|
+
} else
|
|
35
|
+
directive.set(context, response.headers)
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
38
|
|
|
@@ -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
|
|
@@ -3,16 +3,22 @@ import type { Interceptor } from '../../Interception'
|
|
|
3
3
|
|
|
4
4
|
export class CORS implements Interceptor {
|
|
5
5
|
public readonly name = 'cors'
|
|
6
|
-
public readonly mandatory = true
|
|
7
6
|
|
|
8
|
-
private readonly
|
|
7
|
+
private readonly requestHeaders = new Set<string>([
|
|
8
|
+
'accept',
|
|
9
|
+
'authorization',
|
|
10
|
+
'content-type',
|
|
11
|
+
'etag',
|
|
12
|
+
'if-match',
|
|
13
|
+
'if-none-match'
|
|
14
|
+
])
|
|
9
15
|
|
|
10
16
|
private readonly headers = new Headers({
|
|
11
17
|
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
|
|
12
18
|
'access-control-allow-credentials': 'true',
|
|
13
|
-
'access-control-allow-headers': Array.from(this.
|
|
19
|
+
'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
|
|
14
20
|
'access-control-max-age': '3600',
|
|
15
|
-
'cache-control': '
|
|
21
|
+
'cache-control': 'max-age=3600',
|
|
16
22
|
vary: 'origin'
|
|
17
23
|
})
|
|
18
24
|
|
|
@@ -40,9 +46,9 @@ export class CORS implements Interceptor {
|
|
|
40
46
|
return null
|
|
41
47
|
}
|
|
42
48
|
|
|
43
|
-
public
|
|
44
|
-
this.
|
|
45
|
-
this.headers.set('access-control-allow-headers', Array.from(this.
|
|
49
|
+
public allow (header: string): void {
|
|
50
|
+
this.requestHeaders.add(header.toLowerCase())
|
|
51
|
+
this.headers.set('access-control-allow-headers', Array.from(this.requestHeaders).join(', '))
|
|
46
52
|
}
|
|
47
53
|
|
|
48
54
|
private preflightResponse (origin: string): Output {
|
|
@@ -2,17 +2,17 @@ import { Stub } from './Stub'
|
|
|
2
2
|
import { Throw } from './Throw'
|
|
3
3
|
import { type Directive } from './types'
|
|
4
4
|
import type { Input, Output } from '../../io'
|
|
5
|
-
import type {
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
6
6
|
|
|
7
|
-
export class Development implements
|
|
7
|
+
export class Development implements DirectiveFamily<Directive> {
|
|
8
8
|
public readonly name: string = 'dev'
|
|
9
9
|
public readonly mandatory: boolean = false
|
|
10
10
|
|
|
11
|
-
public create (name: string, value:
|
|
11
|
+
public create (name: string, value: unknown): 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
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { dev } from './dev'
|
|
2
1
|
import { authorization } from './auth'
|
|
3
2
|
import { cache } from './cache'
|
|
4
|
-
import { octets } from './octets'
|
|
5
3
|
import { cors } from './cors'
|
|
4
|
+
import { dev } from './dev'
|
|
5
|
+
import { octets } from './octets'
|
|
6
|
+
import { io } from './io'
|
|
6
7
|
import { vary } from './vary'
|
|
7
|
-
import
|
|
8
|
+
import { req } from './require'
|
|
9
|
+
import type { DirectiveFamily } from '../RTD'
|
|
8
10
|
import type { Interceptor } from '../Interception'
|
|
9
11
|
|
|
10
|
-
export const families:
|
|
12
|
+
export const families: DirectiveFamily[] = [authorization, io, cache, vary, req, octets, dev]
|
|
11
13
|
export const interceptors: Interceptor[] = [cors]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Output } from './Output'
|
|
2
|
+
import { Input } from './Input'
|
|
3
|
+
import type { Constructor, Directive } from './Directive'
|
|
4
|
+
import type { Input as Context } from '../../io'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
6
|
+
|
|
7
|
+
export class IO implements DirectiveFamily<Directive> {
|
|
8
|
+
public readonly name = 'io'
|
|
9
|
+
public readonly mandatory = true
|
|
10
|
+
|
|
11
|
+
public create (name: string, value: unknown): Directive {
|
|
12
|
+
if (!(name in constructors))
|
|
13
|
+
throw new Error(`Directive 'io:${name}' is not implemented.`)
|
|
14
|
+
|
|
15
|
+
const Directive = constructors[name]
|
|
16
|
+
|
|
17
|
+
Directive.validate(value)
|
|
18
|
+
|
|
19
|
+
return new Directive(value)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public preflight (directives: Directive[], context: Context): null {
|
|
23
|
+
let restricted = false
|
|
24
|
+
|
|
25
|
+
for (const directive of directives) {
|
|
26
|
+
restricted ||= directive instanceof Output
|
|
27
|
+
|
|
28
|
+
directive.attach(context)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (!restricted)
|
|
32
|
+
DENIAL.attach(context)
|
|
33
|
+
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const constructors: Record<string, Constructor> = {
|
|
39
|
+
output: Output,
|
|
40
|
+
input: Input
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const DENIAL: Output = new Output([])
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BadRequest } from '../../HTTP'
|
|
2
|
+
import * as schemas from './schemas'
|
|
3
|
+
import type { Message } from './Message'
|
|
4
|
+
import type { Directive } from './Directive'
|
|
5
|
+
import type { Input as Context } from '../../io'
|
|
6
|
+
|
|
7
|
+
export class Input implements Directive {
|
|
8
|
+
private readonly permissions: Permissions
|
|
9
|
+
|
|
10
|
+
public constructor (permissions: Permissions) {
|
|
11
|
+
this.permissions = permissions
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static validate (permissions: unknown): asserts permissions is Permissions {
|
|
15
|
+
schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public attach (context: Context): void {
|
|
19
|
+
context.pipelines.body.push((body) => this.check(body))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private check (body: unknown): unknown {
|
|
23
|
+
try {
|
|
24
|
+
schemas.message.validate(body)
|
|
25
|
+
} catch {
|
|
26
|
+
throw new BadRequest('Invalid request body.')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const property = this.violation(body)
|
|
30
|
+
|
|
31
|
+
if (property !== undefined)
|
|
32
|
+
throw new BadRequest(`Unexpected input: ${property}.`)
|
|
33
|
+
|
|
34
|
+
return body
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private violation (value: Message | Message[]): string | undefined {
|
|
38
|
+
if (!Array.isArray(value))
|
|
39
|
+
return Object.keys(value).find((key) => !this.permissions.includes(key))
|
|
40
|
+
|
|
41
|
+
for (const item of value) {
|
|
42
|
+
const property = this.violation(item)
|
|
43
|
+
|
|
44
|
+
if (property !== undefined)
|
|
45
|
+
return property
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type Permissions = string[]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Message = Record<string, unknown>
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Stream } from 'node:stream'
|
|
2
|
+
import * as schemas from './schemas'
|
|
3
|
+
import type { Message } from './Message'
|
|
4
|
+
import type { Directive } from './Directive'
|
|
5
|
+
import type { Input as Context } from '../../io'
|
|
6
|
+
import type { OutgoingMessage } from '../../HTTP'
|
|
7
|
+
|
|
8
|
+
export class Output implements Directive {
|
|
9
|
+
private readonly disabled: boolean = false
|
|
10
|
+
private readonly omitted: boolean = true
|
|
11
|
+
private readonly permissions: string[] = []
|
|
12
|
+
|
|
13
|
+
public constructor (permissions: Permissions) {
|
|
14
|
+
if (typeof permissions === 'boolean')
|
|
15
|
+
if (permissions)
|
|
16
|
+
this.disabled = true
|
|
17
|
+
else
|
|
18
|
+
this.omitted = false
|
|
19
|
+
|
|
20
|
+
else
|
|
21
|
+
this.permissions = permissions
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static validate (permissions: unknown): asserts permissions is Permissions {
|
|
25
|
+
schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public attach (context: Context): void {
|
|
29
|
+
context.pipelines.response.push(this.restriction(context))
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private restriction (context: Context) {
|
|
33
|
+
return (message: OutgoingMessage): void => {
|
|
34
|
+
const error = message.status !== undefined && message.status >= 300
|
|
35
|
+
const stream = message.body instanceof Stream
|
|
36
|
+
const none = message.body === undefined || message.body === null
|
|
37
|
+
|
|
38
|
+
if (this.disabled || error || stream || none)
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
if (typeof message.body !== 'object' || this.permissions.length === 0) {
|
|
42
|
+
if (this.omitted)
|
|
43
|
+
console.warn('Permissions for \'io:output\' are not specified properly ' +
|
|
44
|
+
`(${context.request.url}). Response omitted.`)
|
|
45
|
+
|
|
46
|
+
delete message.body
|
|
47
|
+
|
|
48
|
+
return
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
schemas.message.validate(message.body,
|
|
52
|
+
'\'io:output\' expects response to be an object or array of objects')
|
|
53
|
+
|
|
54
|
+
if (Array.isArray(message.body))
|
|
55
|
+
message.body = message.body.map((entity) => this.fit(entity))
|
|
56
|
+
else
|
|
57
|
+
message.body = this.fit(message.body)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private fit (message: Message): Message | undefined {
|
|
62
|
+
const entries = Object.entries(message)
|
|
63
|
+
.filter(([key]) => this.permissions.includes(key))
|
|
64
|
+
|
|
65
|
+
return Object.fromEntries(entries)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type Permissions = string[] | boolean
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolve } from 'node:path'
|
|
2
|
+
import schemas, { type Schema } from '@toa.io/schemas'
|
|
3
|
+
import type { Permissions as InputPermissions } from './Input'
|
|
4
|
+
import type { Permissions as OutputPermissions } from './Output'
|
|
5
|
+
import type { Message } from './Message'
|
|
6
|
+
|
|
7
|
+
const path = resolve(__dirname, '../../../schemas/io')
|
|
8
|
+
const namespace = schemas.namespace(path)
|
|
9
|
+
|
|
10
|
+
export const message: Schema<Message | Message[]> = namespace.schema('message')
|
|
11
|
+
export const input: Schema<InputPermissions> = namespace.schema('input')
|
|
12
|
+
export const output: Schema<OutputPermissions> = namespace.schema('output')
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import * as schemas from './schemas'
|
|
2
|
+
import { 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
|
+
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
|
}
|
|
@@ -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,15 +1,15 @@
|
|
|
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
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
15
|
private readonly permissions: Required<Permissions> = {
|
|
@@ -21,6 +21,7 @@ export class Fetch implements Directive {
|
|
|
21
21
|
private storage: Component = null as unknown as Component
|
|
22
22
|
|
|
23
23
|
public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
|
|
24
|
+
super()
|
|
24
25
|
schemas.fetch.validate(permissions)
|
|
25
26
|
|
|
26
27
|
Object.assign(this.permissions, permissions)
|
|
@@ -1,14 +1,15 @@
|
|
|
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
15
|
private readonly permissions: Required<Permissions> = { meta: false }
|
|
@@ -16,6 +17,7 @@ export class List implements Directive {
|
|
|
16
17
|
private storage: Component | null = null
|
|
17
18
|
|
|
18
19
|
public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
|
|
20
|
+
super()
|
|
19
21
|
schemas.list.validate(permissions)
|
|
20
22
|
|
|
21
23
|
Object.assign(this.permissions, permissions)
|
|
@@ -4,16 +4,15 @@ 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
|
-
import type {
|
|
13
|
-
import type {
|
|
14
|
-
import type { Parameter } from '../../RTD'
|
|
12
|
+
import type { Parameter, DirectiveFamily } from '../../RTD'
|
|
13
|
+
import type { Input } from './types'
|
|
15
14
|
|
|
16
|
-
export class Octets implements
|
|
15
|
+
export class Octets implements DirectiveFamily<Directive> {
|
|
17
16
|
public readonly name: string = 'octets'
|
|
18
17
|
public readonly mandatory: boolean = false
|
|
19
18
|
|
|
@@ -23,7 +22,7 @@ export class Octets implements Family<Directive> {
|
|
|
23
22
|
const Class = DIRECTIVES[name]
|
|
24
23
|
|
|
25
24
|
if (Class === undefined)
|
|
26
|
-
throw new Error(`Directive '
|
|
25
|
+
throw new Error(`Directive 'octets:${name}' is not implemented.`)
|
|
27
26
|
|
|
28
27
|
this.discovery ??= remotes.discover('octets', 'storage')
|
|
29
28
|
|
|
@@ -56,7 +55,7 @@ export class Octets implements Family<Directive> {
|
|
|
56
55
|
throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
|
|
57
56
|
|
|
58
57
|
// noinspection JSObjectNullOrUndefined
|
|
59
|
-
return action.apply(context.storage, input, parameters)
|
|
58
|
+
return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
|
|
60
59
|
}
|
|
61
60
|
}
|
|
62
61
|
|
|
@@ -66,7 +65,6 @@ const DIRECTIVES: Record<string, Constructor> = {
|
|
|
66
65
|
fetch: Fetch,
|
|
67
66
|
list: List,
|
|
68
67
|
delete: Delete,
|
|
69
|
-
permute: Permute,
|
|
70
68
|
workflow: WorkflowDirective
|
|
71
69
|
}
|
|
72
70
|
|
|
@@ -4,6 +4,7 @@ import { BadRequest, UnsupportedMediaType } 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'
|
|
7
8
|
import type { Readable } from 'stream'
|
|
8
9
|
import type { Parameter } from '../../RTD'
|
|
9
10
|
import type { Unit } from './workflows'
|
|
@@ -12,9 +13,9 @@ import type { Remotes } from '../../Remotes'
|
|
|
12
13
|
import type { ErrorType } from 'error-value'
|
|
13
14
|
import type { Component } from '@toa.io/core'
|
|
14
15
|
import type { Output } from '../../io'
|
|
15
|
-
import type {
|
|
16
|
+
import type { Input } from './types'
|
|
16
17
|
|
|
17
|
-
export class Store
|
|
18
|
+
export class Store extends Directive {
|
|
18
19
|
public readonly targeted = false
|
|
19
20
|
|
|
20
21
|
private readonly accept?: string
|
|
@@ -24,6 +25,7 @@ export class Store implements Directive {
|
|
|
24
25
|
|
|
25
26
|
public constructor
|
|
26
27
|
(options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
28
|
+
super()
|
|
27
29
|
schemas.store.validate(options)
|
|
28
30
|
|
|
29
31
|
this.accept = match(options?.accept,
|
|
@@ -36,13 +38,19 @@ export class Store implements Directive {
|
|
|
36
38
|
|
|
37
39
|
this.discovery.storage = discovery
|
|
38
40
|
|
|
39
|
-
cors.
|
|
41
|
+
cors.allow('content-meta')
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
|
|
43
45
|
this.storage ??= await this.discovery.storage
|
|
44
46
|
|
|
45
|
-
const request: StoreRequest = {
|
|
47
|
+
const request: StoreRequest = {
|
|
48
|
+
input: {
|
|
49
|
+
storage,
|
|
50
|
+
request: input.request
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
46
54
|
const meta = input.request.headers['content-meta']
|
|
47
55
|
|
|
48
56
|
if (this.accept !== undefined)
|