@toa.io/extensions.exposition 1.0.0-alpha.6 → 1.0.0-alpha.60
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 +5 -7
- package/components/octets.storage/operations/store.js +105 -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 +64 -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 +5 -0
- 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/octets.download.feature +117 -0
- package/features/octets.entries.feature +8 -1
- package/features/octets.feature +58 -64
- 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/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/node.cos.yaml +1 -0
- package/schemas/octets/store.cos.yaml +1 -0
- 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 +50 -43
- package/source/HTTP/exceptions.ts +7 -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/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 +2 -2
- 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 +14 -12
- package/source/directives/octets/List.ts +9 -7
- package/source/directives/octets/Octets.ts +4 -5
- package/source/directives/octets/Store.ts +21 -8
- package/source/directives/octets/Workflow.ts +10 -3
- package/source/directives/octets/schemas.ts +4 -4
- 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 +37 -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/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/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/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 +6 -5
- package/transpiled/directives/octets/Fetch.js +10 -8
- 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 +6 -3
- package/transpiled/directives/octets/Store.js +12 -6
- 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/schemas.d.ts +4 -4
- 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/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
|
@@ -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]
|
|
@@ -23,13 +23,13 @@ export class Input implements Directive {
|
|
|
23
23
|
try {
|
|
24
24
|
schemas.message.validate(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
|
}
|
|
@@ -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,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)
|
|
@@ -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,10 @@
|
|
|
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'
|
|
7
8
|
import type { Readable } from 'stream'
|
|
8
9
|
import type { Parameter } from '../../RTD'
|
|
9
10
|
import type { Unit } from './workflows'
|
|
@@ -12,18 +13,20 @@ 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
|
|
22
|
+
private readonly trust?: Array<string | RegExp>
|
|
21
23
|
private readonly workflow?: Workflow
|
|
22
24
|
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
23
25
|
private storage: Component | null = null
|
|
24
26
|
|
|
25
27
|
public constructor
|
|
26
28
|
(options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
29
|
+
super()
|
|
27
30
|
schemas.store.validate(options)
|
|
28
31
|
|
|
29
32
|
this.accept = match(options?.accept,
|
|
@@ -34,6 +37,10 @@ export class Store implements Directive {
|
|
|
34
37
|
if (options?.workflow !== undefined)
|
|
35
38
|
this.workflow = new Workflow(options.workflow, remotes)
|
|
36
39
|
|
|
40
|
+
if (options?.trust !== undefined)
|
|
41
|
+
this.trust = options.trust.map((value: string) =>
|
|
42
|
+
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value)
|
|
43
|
+
|
|
37
44
|
this.discovery.storage = discovery
|
|
38
45
|
|
|
39
46
|
cors.allow('content-meta')
|
|
@@ -45,7 +52,8 @@ export class Store implements Directive {
|
|
|
45
52
|
const request: StoreRequest = {
|
|
46
53
|
input: {
|
|
47
54
|
storage,
|
|
48
|
-
request: input.request
|
|
55
|
+
request: input.request,
|
|
56
|
+
trust: this.trust
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
59
|
|
|
@@ -55,7 +63,7 @@ export class Store implements Directive {
|
|
|
55
63
|
request.input.accept = this.accept
|
|
56
64
|
|
|
57
65
|
if (meta !== undefined)
|
|
58
|
-
request.input.meta = this.
|
|
66
|
+
request.input.meta = this.meta(meta)
|
|
59
67
|
|
|
60
68
|
const entry = await this.storage.invoke<Entry>('store', request)
|
|
61
69
|
|
|
@@ -87,12 +95,15 @@ export class Store implements Directive {
|
|
|
87
95
|
|
|
88
96
|
private throw (error: ErrorType): never {
|
|
89
97
|
throw match(error.code,
|
|
90
|
-
'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
|
|
91
|
-
'TYPE_MISMATCH', () => new BadRequest(),
|
|
98
|
+
'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
|
|
99
|
+
'TYPE_MISMATCH', () => new http.BadRequest(),
|
|
100
|
+
'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
|
|
101
|
+
'LOCATION_LENGTH', () => new http.BadRequest(error.message),
|
|
102
|
+
'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
|
|
92
103
|
error)
|
|
93
104
|
}
|
|
94
105
|
|
|
95
|
-
private
|
|
106
|
+
private meta (value: string | string[]): Record<string, string> {
|
|
96
107
|
if (Array.isArray(value))
|
|
97
108
|
value = value.join(',')
|
|
98
109
|
|
|
@@ -112,6 +123,7 @@ export class Store implements Directive {
|
|
|
112
123
|
export interface Options {
|
|
113
124
|
accept?: string | string[]
|
|
114
125
|
workflow?: Unit[] | Unit
|
|
126
|
+
trust?: string[]
|
|
115
127
|
}
|
|
116
128
|
|
|
117
129
|
interface StoreRequest {
|
|
@@ -119,6 +131,7 @@ interface StoreRequest {
|
|
|
119
131
|
storage: string
|
|
120
132
|
request: Input['request']
|
|
121
133
|
accept?: string
|
|
134
|
+
trust?: Array<string | RegExp>
|
|
122
135
|
meta?: Record<string, string>
|
|
123
136
|
}
|
|
124
137
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { NotFound } from '../../HTTP'
|
|
2
2
|
import * as schemas from './schemas'
|
|
3
3
|
import { Workflow } from './workflows'
|
|
4
|
+
import { Directive } from './Directive'
|
|
4
5
|
import type { Unit } from './workflows'
|
|
5
|
-
import type {
|
|
6
|
+
import type { Input } from './types'
|
|
6
7
|
import type { Component } from '@toa.io/core'
|
|
7
8
|
import type { Output } from '../../io'
|
|
8
9
|
import type { Remotes } from '../../Remotes'
|
|
@@ -10,7 +11,7 @@ import type { Maybe } from '@toa.io/types'
|
|
|
10
11
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
11
12
|
import type { Parameter } from '../../RTD'
|
|
12
13
|
|
|
13
|
-
export class WorkflowDirective
|
|
14
|
+
export class WorkflowDirective extends Directive {
|
|
14
15
|
public readonly targeted = true
|
|
15
16
|
|
|
16
17
|
private readonly workflow: Workflow
|
|
@@ -18,6 +19,7 @@ export class WorkflowDirective implements Directive {
|
|
|
18
19
|
private storage: Component | null = null
|
|
19
20
|
|
|
20
21
|
public constructor (units: Unit[] | Unit, discovery: Promise<Component>, remotes: Remotes) {
|
|
22
|
+
super()
|
|
21
23
|
schemas.workflow.validate(units)
|
|
22
24
|
|
|
23
25
|
this.workflow = new Workflow(units, remotes)
|
|
@@ -28,7 +30,12 @@ export class WorkflowDirective implements Directive {
|
|
|
28
30
|
this.storage ??= await this.discovery
|
|
29
31
|
|
|
30
32
|
const entry = await this.storage.invoke<Maybe<Entry>>('get',
|
|
31
|
-
{
|
|
33
|
+
{
|
|
34
|
+
input: {
|
|
35
|
+
storage,
|
|
36
|
+
path: input.request.url
|
|
37
|
+
}
|
|
38
|
+
})
|
|
32
39
|
|
|
33
40
|
if (entry instanceof Error)
|
|
34
41
|
throw new NotFound()
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolve } from 'node:path'
|
|
2
2
|
import schemas from '@toa.io/schemas'
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
3
|
+
import type { Options as FetchOptions } from './Fetch'
|
|
4
|
+
import type { Options as ListOptions } from './List'
|
|
5
5
|
import type { Options as StoreOptions } from './Store'
|
|
6
6
|
import type { Options as DeleteOptions } from './Delete'
|
|
7
7
|
import type { Schema } from '@toa.io/schemas'
|
|
@@ -12,8 +12,8 @@ const namespace = schemas.namespace(path)
|
|
|
12
12
|
|
|
13
13
|
export const context: Schema<string> = namespace.schema('context')
|
|
14
14
|
export const store: Schema<StoreOptions | null> = namespace.schema('store')
|
|
15
|
-
export const fetch: Schema<
|
|
15
|
+
export const fetch: Schema<FetchOptions | null> = namespace.schema('fetch')
|
|
16
16
|
export const remove: Schema<DeleteOptions | null> = namespace.schema('delete')
|
|
17
|
-
export const list: Schema<
|
|
17
|
+
export const list: Schema<ListOptions | null> = namespace.schema('list')
|
|
18
18
|
export const permute: Schema<null> = namespace.schema('permute')
|
|
19
19
|
export const workflow: Schema<Unit[] | Unit> = namespace.schema('workflow')
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
import type { Parameter } from '../../RTD'
|
|
2
1
|
import type * as io from '../../io'
|
|
3
2
|
|
|
4
|
-
export interface Directive {
|
|
5
|
-
readonly targeted: boolean
|
|
6
|
-
|
|
7
|
-
apply: (storage: string, input: Input, parameters: Parameter[]) => io.Output | Promise<io.Output>
|
|
8
|
-
}
|
|
9
|
-
|
|
10
3
|
export interface Extension {
|
|
11
4
|
octets?: string
|
|
12
5
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Readable } from 'stream'
|
|
1
|
+
import { Readable } from 'node:stream'
|
|
2
2
|
import type { Unit } from './Workflow'
|
|
3
3
|
import type { Remotes } from '../../../Remotes'
|
|
4
4
|
import type { Component } from '@toa.io/core'
|
|
@@ -39,25 +39,68 @@ export class Execution extends Readable {
|
|
|
39
39
|
|
|
40
40
|
private async execute (unit: Unit): Promise<void> {
|
|
41
41
|
const promises = Object.entries(unit).map(async ([step, endpoint]) => {
|
|
42
|
-
|
|
42
|
+
try {
|
|
43
|
+
const result = await this.call(endpoint)
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
if (result instanceof Readable)
|
|
46
|
+
return await this.stream(step, result)
|
|
47
|
+
|
|
48
|
+
this.report(step, result)
|
|
49
|
+
} catch (e: unknown) {
|
|
50
|
+
this.exception(step, e)
|
|
51
|
+
}
|
|
49
52
|
})
|
|
50
53
|
|
|
51
54
|
await Promise.all(promises)
|
|
52
55
|
}
|
|
53
56
|
|
|
57
|
+
private async stream (step: string, stream: Readable): Promise<void> {
|
|
58
|
+
try {
|
|
59
|
+
for await (const result of stream)
|
|
60
|
+
this.report(step, result, false)
|
|
61
|
+
|
|
62
|
+
this.report(step, undefined, true)
|
|
63
|
+
} catch (e: unknown) {
|
|
64
|
+
this.exception(step, e)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private report (step: string, result?: Maybe<unknown>, completed = true): void {
|
|
69
|
+
const report: Report = { step }
|
|
70
|
+
|
|
71
|
+
if (completed)
|
|
72
|
+
report.status = 'completed'
|
|
73
|
+
|
|
74
|
+
if (result instanceof Error) {
|
|
75
|
+
report.error = result
|
|
76
|
+
this.interrupted = true
|
|
77
|
+
} else if (result !== undefined)
|
|
78
|
+
report.output = result
|
|
79
|
+
|
|
80
|
+
this.push(report)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private exception (step: string, error: unknown): void {
|
|
84
|
+
this.push({ step, status: 'exception' } satisfies Report)
|
|
85
|
+
this.interrupted = true
|
|
86
|
+
|
|
87
|
+
console.error(error)
|
|
88
|
+
}
|
|
89
|
+
|
|
54
90
|
private async call (endpoint: string): Promise<Maybe<unknown>> {
|
|
91
|
+
let task = false
|
|
92
|
+
|
|
93
|
+
if (endpoint.startsWith('task:')) {
|
|
94
|
+
endpoint = endpoint.slice(5)
|
|
95
|
+
task = true
|
|
96
|
+
}
|
|
97
|
+
|
|
55
98
|
const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
|
|
56
99
|
const key = `${namespace}.${component}`
|
|
57
100
|
|
|
58
101
|
this.components[key] ??= await this.discover(key, namespace, component)
|
|
59
102
|
|
|
60
|
-
return
|
|
103
|
+
return this.components[key].invoke(operation, { input: this.context, task })
|
|
61
104
|
}
|
|
62
105
|
|
|
63
106
|
private async discover (key: string, namespace: string, component: string): Promise<Component> {
|
|
@@ -69,8 +112,16 @@ export class Execution extends Readable {
|
|
|
69
112
|
}
|
|
70
113
|
|
|
71
114
|
export interface Context {
|
|
115
|
+
authority: string
|
|
72
116
|
storage: string
|
|
73
117
|
path: string
|
|
74
118
|
entry: Entry
|
|
75
119
|
parameters: Record<string, string>
|
|
76
120
|
}
|
|
121
|
+
|
|
122
|
+
interface Report {
|
|
123
|
+
step: string
|
|
124
|
+
status?: 'completed' | 'exception'
|
|
125
|
+
output?: unknown
|
|
126
|
+
error?: Error
|
|
127
|
+
}
|
|
@@ -23,12 +23,13 @@ export class Workflow {
|
|
|
23
23
|
public execute
|
|
24
24
|
(input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
|
|
25
25
|
const path = posix.join(input.request.url, entry.id)
|
|
26
|
+
const authority = input.authority
|
|
26
27
|
const parameters: Record<string, string> = {}
|
|
27
28
|
|
|
28
29
|
for (const { name, value } of params)
|
|
29
30
|
parameters[name] = value
|
|
30
31
|
|
|
31
|
-
const context: Context = { storage, path, entry, parameters }
|
|
32
|
+
const context: Context = { authority, storage, path, entry, parameters }
|
|
32
33
|
|
|
33
34
|
return new Execution(context, this.units, this.remotes)
|
|
34
35
|
}
|