@toa.io/extensions.exposition 1.0.0-alpha.9 → 1.0.0-alpha.91
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 +14 -6
- 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 +20 -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 +8 -6
- 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 +11 -9
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +32 -15
- 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/assertions-as-values.js +4 -2
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
- 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/assertions-as-values.ts +5 -2
- 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 +16 -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 -4
- 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 +9 -11
- package/components/octets.storage/operations/get.js +3 -3
- package/components/octets.storage/operations/head.js +7 -0
- package/components/octets.storage/operations/put.js +121 -0
- package/documentation/access.md +75 -38
- package/documentation/authorities.md +49 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +61 -22
- package/documentation/flow.md +44 -0
- package/documentation/identity.md +17 -22
- package/documentation/introspection.md +82 -0
- package/documentation/octets.md +95 -67
- package/documentation/protocol.md +13 -3
- 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 +77 -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 +2 -0
- package/features/cache.feature +109 -5
- package/features/cors.feature +6 -1
- package/features/debug.feature +34 -0
- package/features/directives.feature +3 -0
- package/features/dynamic.feature +48 -0
- package/features/errors.feature +32 -7
- package/features/etag.feature +108 -0
- package/features/flow.feature +96 -0
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +97 -26
- package/features/identity.feature +18 -6
- package/features/identity.federation.feature +66 -11
- package/features/identity.roles.feature +250 -7
- package/features/identity.tokens.feature +54 -4
- package/features/introspection.feature +153 -0
- package/features/io.feature +38 -1
- package/features/methods.feature +47 -0
- package/features/{octets.meta.feature → octets.attributes.feature} +16 -12
- package/features/octets.cloudinary.feature +68 -0
- package/features/octets.download.feature +189 -0
- package/features/octets.entries.feature +13 -55
- package/features/octets.feature +83 -107
- package/features/octets.workflows.feature +242 -58
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +77 -2
- package/features/realtime.feature +34 -0
- package/features/require.feature +67 -0
- package/features/response.feature +38 -3
- package/features/routes.feature +93 -2
- package/features/server.feature +21 -0
- package/features/steps/.env.example +3 -0
- package/features/steps/Database.ts +16 -9
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +30 -25
- package/features/steps/Parameters.ts +44 -1
- package/features/steps/Realtime.ts +151 -0
- 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 -2
- package/features/steps/components/octets.tester/operations/authority.js +7 -0
- package/features/steps/components/octets.tester/operations/bar.js +0 -1
- package/features/steps/components/octets.tester/operations/baz.js +0 -2
- package/features/steps/components/octets.tester/operations/foo.js +1 -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 +5 -0
- package/features/timing.feature +4 -1
- package/features/vary.feature +71 -0
- package/package.json +23 -14
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/method.cos.yaml +1 -1
- package/schemas/node.cos.yaml +2 -0
- package/schemas/octets/put.cos.yaml +25 -0
- package/schemas/query.cos.yaml +4 -10
- package/source/Annotation.ts +3 -3
- package/source/Branch.ts +1 -0
- package/source/Composition.ts +0 -6
- package/source/Context.ts +1 -0
- package/source/Directive.test.ts +1 -1
- package/source/Directive.ts +5 -6
- package/source/Endpoint.ts +59 -17
- package/source/Factory.ts +22 -13
- package/source/Gateway.ts +65 -18
- package/source/HTTP/Context.ts +26 -3
- package/source/HTTP/Server.ts +60 -46
- package/source/HTTP/exceptions.ts +13 -1
- package/source/HTTP/formats/index.ts +3 -3
- package/source/HTTP/messages.test.ts +45 -2
- package/source/HTTP/messages.ts +32 -8
- package/source/Introspection.ts +11 -0
- package/source/Mapping.ts +68 -21
- package/source/Query.test.ts +3 -3
- package/source/Query.ts +123 -33
- package/source/RTD/Context.ts +1 -1
- 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/Tree.ts +2 -2
- package/source/RTD/factory.ts +5 -2
- package/source/RTD/syntax/parse.test.ts +1 -1
- package/source/RTD/syntax/parse.ts +37 -24
- package/source/RTD/syntax/types.ts +6 -4
- package/source/Remotes.ts +7 -6
- package/source/Tenant.ts +6 -20
- package/source/deployment.ts +33 -23
- package/source/directives/auth/Authorization.ts +45 -22
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Echo.ts +19 -5
- 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/Scheme.ts +1 -1
- package/source/directives/auth/split.ts +1 -1
- package/source/directives/auth/types.ts +2 -2
- package/source/directives/cache/Cache.ts +13 -6
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +1 -1
- package/source/directives/dev/Development.ts +1 -1
- package/source/directives/flow/Compose.ts +68 -0
- package/source/directives/flow/Fetch.ts +86 -0
- package/source/directives/flow/Flow.ts +42 -0
- package/source/directives/flow/index.ts +3 -0
- package/source/directives/flow/types.ts +7 -0
- package/source/directives/index.ts +3 -1
- package/source/directives/io/IO.ts +1 -1
- package/source/directives/io/Input.ts +4 -4
- package/source/directives/io/Output.ts +5 -4
- package/source/directives/octets/Context.ts +3 -2
- package/source/directives/octets/Delete.ts +11 -11
- package/source/directives/octets/Get.ts +84 -0
- package/source/directives/octets/Octets.ts +8 -12
- package/source/directives/octets/{Store.ts → Put.ts} +36 -21
- package/source/directives/octets/Workflow.ts +1 -1
- package/source/directives/octets/bytes.test.ts +30 -0
- package/source/directives/octets/bytes.ts +18 -0
- package/source/directives/octets/schemas.ts +4 -8
- package/source/directives/octets/workflows/Execution.ts +60 -8
- package/source/directives/octets/workflows/Workflow.ts +4 -4
- 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/Language.ts +2 -2
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +17 -11
- package/source/manifest.ts +10 -11
- package/source/root.ts +5 -5
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Branch.d.ts +1 -0
- package/transpiled/Composition.d.ts +0 -1
- package/transpiled/Composition.js +0 -4
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +1 -0
- package/transpiled/Directive.js +5 -5
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +6 -4
- package/transpiled/Endpoint.js +39 -9
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +3 -2
- package/transpiled/Factory.js +18 -10
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +3 -0
- package/transpiled/Gateway.js +49 -10
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +9 -2
- package/transpiled/HTTP/Context.js +16 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +46 -39
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +7 -1
- package/transpiled/HTTP/exceptions.js +13 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/index.js +3 -3
- package/transpiled/HTTP/formats/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +2 -1
- package/transpiled/HTTP/messages.js +30 -7
- 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 +11 -2
- package/transpiled/Mapping.js +50 -19
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +10 -1
- package/transpiled/Query.js +87 -30
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +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/Tree.d.ts +1 -1
- package/transpiled/RTD/Tree.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 +4 -4
- package/transpiled/Remotes.js +6 -5
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +5 -5
- package/transpiled/Tenant.js +2 -13
- 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 +1 -1
- package/transpiled/directives/auth/Authorization.js +33 -19
- 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/Echo.d.ts +4 -3
- package/transpiled/directives/auth/Echo.js +13 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- 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/Scheme.js +1 -1
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/split.js +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +10 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -1
- package/transpiled/directives/cache/Control.js +29 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.js +1 -1
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/flow/Compose.d.ts +8 -0
- package/transpiled/directives/flow/Compose.js +74 -0
- package/transpiled/directives/flow/Compose.js.map +1 -0
- package/transpiled/directives/flow/Fetch.d.ts +12 -0
- package/transpiled/directives/flow/Fetch.js +58 -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 +33 -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 +6 -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/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +2 -2
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +2 -2
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/octets/Context.js +4 -24
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js +8 -8
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
- package/transpiled/directives/octets/{Fetch.js → Get.js} +24 -29
- package/transpiled/directives/octets/Get.js.map +1 -0
- package/transpiled/directives/octets/Octets.js +8 -12
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +7 -2
- package/transpiled/directives/octets/{Store.js → Put.js} +26 -19
- package/transpiled/directives/octets/Put.js.map +1 -0
- package/transpiled/directives/octets/Workflow.js +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.d.ts +1 -0
- package/transpiled/directives/octets/bytes.js +21 -0
- package/transpiled/directives/octets/bytes.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +4 -8
- package/transpiled/directives/octets/schemas.js +3 -6
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
- package/transpiled/directives/octets/workflows/Execution.js +44 -9
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.d.ts +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/Language.js +2 -2
- 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 +10 -5
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/manifest.js +10 -11
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +5 -5
- 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/tsconfig.json +8 -2
- 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/fetch.js +0 -46
- package/components/octets.storage/operations/list.js +0 -7
- package/components/octets.storage/operations/permute.js +0 -7
- package/components/octets.storage/operations/store.js +0 -11
- package/features/steps/components/octets.tester/operations/diversify.js +0 -14
- package/schemas/octets/context.cos.yaml +0 -1
- package/schemas/octets/fetch.cos.yaml +0 -3
- package/schemas/octets/permute.cos.yaml +0 -1
- package/schemas/octets/store.cos.yaml +0 -3
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Fetch.ts +0 -100
- package/source/directives/octets/List.ts +0 -72
- package/source/directives/octets/Permute.ts +0 -44
- package/transpiled/directives/octets/Fetch.js.map +0 -1
- package/transpiled/directives/octets/List.d.ts +0 -16
- package/transpiled/directives/octets/List.js +0 -74
- package/transpiled/directives/octets/List.js.map +0 -1
- package/transpiled/directives/octets/Permute.d.ts +0 -11
- package/transpiled/directives/octets/Permute.js +0 -58
- package/transpiled/directives/octets/Permute.js.map +0 -1
- package/transpiled/directives/octets/Store.js.map +0 -1
- /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
- /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { PassThrough } from 'node:stream'
|
|
2
2
|
import { match } from 'matchacho'
|
|
3
|
-
import
|
|
3
|
+
import * as http from '../../HTTP'
|
|
4
4
|
import { cors } from '../cors'
|
|
5
5
|
import * as schemas from './schemas'
|
|
6
6
|
import { Workflow } from './workflows'
|
|
7
7
|
import { Directive } from './Directive'
|
|
8
|
+
import { toBytes } from './bytes'
|
|
8
9
|
import type { Readable } from 'stream'
|
|
9
10
|
import type { Parameter } from '../../RTD'
|
|
10
11
|
import type { Unit } from './workflows'
|
|
@@ -15,10 +16,13 @@ import type { Component } from '@toa.io/core'
|
|
|
15
16
|
import type { Output } from '../../io'
|
|
16
17
|
import type { Input } from './types'
|
|
17
18
|
|
|
18
|
-
export class
|
|
19
|
+
export class Put extends Directive {
|
|
19
20
|
public readonly targeted = false
|
|
20
21
|
|
|
21
22
|
private readonly accept?: string
|
|
23
|
+
private readonly limit: number
|
|
24
|
+
private readonly limitString: string
|
|
25
|
+
private readonly trust?: Array<string | RegExp>
|
|
22
26
|
private readonly workflow?: Workflow
|
|
23
27
|
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
24
28
|
private storage: Component | null = null
|
|
@@ -26,7 +30,8 @@ export class Store extends Directive {
|
|
|
26
30
|
public constructor
|
|
27
31
|
(options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
|
|
28
32
|
super()
|
|
29
|
-
|
|
33
|
+
|
|
34
|
+
schemas.put.validate<Options>(options)
|
|
30
35
|
|
|
31
36
|
this.accept = match(options?.accept,
|
|
32
37
|
String, (value: string) => value,
|
|
@@ -36,9 +41,16 @@ export class Store extends Directive {
|
|
|
36
41
|
if (options?.workflow !== undefined)
|
|
37
42
|
this.workflow = new Workflow(options.workflow, remotes)
|
|
38
43
|
|
|
44
|
+
if (options?.trust !== undefined)
|
|
45
|
+
this.trust = options.trust.map((value: string) =>
|
|
46
|
+
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value)
|
|
47
|
+
|
|
48
|
+
this.limitString = options?.limit ?? '64MiB'
|
|
49
|
+
this.limit = toBytes(this.limitString)
|
|
39
50
|
this.discovery.storage = discovery
|
|
40
51
|
|
|
41
|
-
cors.allow('content-
|
|
52
|
+
cors.allow('content-attributes')
|
|
53
|
+
cors.allow('content-location')
|
|
42
54
|
}
|
|
43
55
|
|
|
44
56
|
public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
|
|
@@ -47,19 +59,14 @@ export class Store extends Directive {
|
|
|
47
59
|
const request: StoreRequest = {
|
|
48
60
|
input: {
|
|
49
61
|
storage,
|
|
50
|
-
request: input.request
|
|
62
|
+
request: input.request,
|
|
63
|
+
accept: this.accept,
|
|
64
|
+
limit: this.limit,
|
|
65
|
+
trust: this.trust
|
|
51
66
|
}
|
|
52
67
|
}
|
|
53
68
|
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
if (this.accept !== undefined)
|
|
57
|
-
request.input.accept = this.accept
|
|
58
|
-
|
|
59
|
-
if (meta !== undefined)
|
|
60
|
-
request.input.meta = this.parseMeta(meta)
|
|
61
|
-
|
|
62
|
-
const entry = await this.storage.invoke<Entry>('store', request)
|
|
69
|
+
const entry = await this.storage.invoke<Entry>('put', request)
|
|
63
70
|
|
|
64
71
|
return match<Output>(entry,
|
|
65
72
|
Error, (error: ErrorType) => this.throw(error),
|
|
@@ -89,31 +96,37 @@ export class Store extends Directive {
|
|
|
89
96
|
|
|
90
97
|
private throw (error: ErrorType): never {
|
|
91
98
|
throw match(error.code,
|
|
92
|
-
'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
|
|
93
|
-
'TYPE_MISMATCH', () => new BadRequest(),
|
|
99
|
+
'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
|
|
100
|
+
'TYPE_MISMATCH', () => new http.BadRequest(),
|
|
101
|
+
'LIMIT_EXCEEDED', () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
|
|
102
|
+
'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
|
|
103
|
+
'LOCATION_LENGTH', () => new http.BadRequest(error.message),
|
|
104
|
+
'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
|
|
94
105
|
error)
|
|
95
106
|
}
|
|
96
107
|
|
|
97
|
-
private
|
|
108
|
+
private attributes (value: string | string[]): Record<string, string> {
|
|
98
109
|
if (Array.isArray(value))
|
|
99
110
|
value = value.join(',')
|
|
100
111
|
|
|
101
|
-
const
|
|
112
|
+
const attributes: Record<string, string> = {}
|
|
102
113
|
|
|
103
114
|
for (const pair of value.split(',')) {
|
|
104
115
|
const eq = pair.indexOf('=')
|
|
105
116
|
const key = (eq === -1 ? pair : pair.slice(0, eq)).trim()
|
|
106
117
|
|
|
107
|
-
|
|
118
|
+
attributes[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
|
|
108
119
|
}
|
|
109
120
|
|
|
110
|
-
return
|
|
121
|
+
return attributes
|
|
111
122
|
}
|
|
112
123
|
}
|
|
113
124
|
|
|
114
125
|
export interface Options {
|
|
115
126
|
accept?: string | string[]
|
|
127
|
+
limit?: string
|
|
116
128
|
workflow?: Unit[] | Unit
|
|
129
|
+
trust?: string[]
|
|
117
130
|
}
|
|
118
131
|
|
|
119
132
|
interface StoreRequest {
|
|
@@ -121,6 +134,8 @@ interface StoreRequest {
|
|
|
121
134
|
storage: string
|
|
122
135
|
request: Input['request']
|
|
123
136
|
accept?: string
|
|
124
|
-
|
|
137
|
+
limit?: number
|
|
138
|
+
trust?: Array<string | RegExp>
|
|
139
|
+
attributes?: Record<string, string>
|
|
125
140
|
}
|
|
126
141
|
}
|
|
@@ -29,7 +29,7 @@ export class WorkflowDirective extends Directive {
|
|
|
29
29
|
public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
|
|
30
30
|
this.storage ??= await this.discovery
|
|
31
31
|
|
|
32
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('
|
|
32
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('head',
|
|
33
33
|
{
|
|
34
34
|
input: {
|
|
35
35
|
storage,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { toBytes } from './bytes'
|
|
2
|
+
|
|
3
|
+
it('should parse bytes', async () => {
|
|
4
|
+
expect(toBytes('10')).toBe(10)
|
|
5
|
+
expect(toBytes('10B')).toBe(10)
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
it('should parse binary prefix', async () => {
|
|
9
|
+
expect(toBytes('10KiB')).toBe(10240)
|
|
10
|
+
expect(toBytes('10MiB')).toBe(10485760)
|
|
11
|
+
expect(toBytes('10GiB')).toBe(10737418240)
|
|
12
|
+
expect(toBytes('10TiB')).toBe(10995116277760)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('should parse decimal prefix', async () => {
|
|
16
|
+
expect(toBytes('10kB')).toBe(10000)
|
|
17
|
+
expect(toBytes('10MB')).toBe(10000000)
|
|
18
|
+
expect(toBytes('10GB')).toBe(10000000000)
|
|
19
|
+
expect(toBytes('10TB')).toBe(10000000000000)
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
it('should parse incorrect value as binary', async () => {
|
|
23
|
+
expect(toBytes('10b')).toBe(10)
|
|
24
|
+
expect(toBytes('10kb')).toBe(10240)
|
|
25
|
+
expect(toBytes('10kib')).toBe(10240)
|
|
26
|
+
expect(toBytes('10mb')).toBe(10485760)
|
|
27
|
+
expect(toBytes('10gb')).toBe(10737418240)
|
|
28
|
+
expect(toBytes('10tib')).toBe(10995116277760)
|
|
29
|
+
expect(toBytes('10Mb')).toBe(10485760)
|
|
30
|
+
})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
|
|
3
|
+
export function toBytes (input: string): number {
|
|
4
|
+
const match = RX.exec(input)
|
|
5
|
+
|
|
6
|
+
assert.ok(match !== null, `Invalid bytes format: ${input}`)
|
|
7
|
+
|
|
8
|
+
const value = parseFloat(match.groups!.value)
|
|
9
|
+
const prefix = match.groups!.prefix?.[0].toLowerCase() ?? ''
|
|
10
|
+
const binary = match.groups!.binary !== undefined || match.groups!.unit === 'b'
|
|
11
|
+
const base = binary ? 1024 : 1000
|
|
12
|
+
const power = POWERS.indexOf(prefix)
|
|
13
|
+
|
|
14
|
+
return value * Math.pow(base, power)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const POWERS = ['', 'k', 'm', 'g', 't']
|
|
18
|
+
const RX = /^(?<value>(\d+)(\.\d+)?)(?<prefix>[kmgt](?<binary>i)?)?(?<unit>b)?$/i
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { resolve } from 'node:path'
|
|
2
2
|
import schemas from '@toa.io/schemas'
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import type { Options as StoreOptions } from './Store'
|
|
3
|
+
import type { Options as GetOptions } from './Get'
|
|
4
|
+
import type { Options as PutOptions } from './Put'
|
|
6
5
|
import type { Options as DeleteOptions } from './Delete'
|
|
7
6
|
import type { Schema } from '@toa.io/schemas'
|
|
8
7
|
import type { Unit } from './workflows'
|
|
@@ -10,10 +9,7 @@ import type { Unit } from './workflows'
|
|
|
10
9
|
const path = resolve(__dirname, '../../../schemas/octets')
|
|
11
10
|
const namespace = schemas.namespace(path)
|
|
12
11
|
|
|
13
|
-
export const
|
|
14
|
-
export const
|
|
15
|
-
export const fetch: Schema<FetchPermissions | null> = namespace.schema('fetch')
|
|
12
|
+
export const put: Schema<PutOptions | null> = namespace.schema('put')
|
|
13
|
+
export const get: Schema<GetOptions | null> = namespace.schema('get')
|
|
16
14
|
export const remove: Schema<DeleteOptions | null> = namespace.schema('delete')
|
|
17
|
-
export const list: Schema<ListPermissions | null> = namespace.schema('list')
|
|
18
|
-
export const permute: Schema<null> = namespace.schema('permute')
|
|
19
15
|
export const workflow: Schema<Unit[] | Unit> = namespace.schema('workflow')
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Readable } from 'stream'
|
|
1
|
+
import { Readable } from 'node:stream'
|
|
2
|
+
import { console } from 'openspan'
|
|
2
3
|
import type { Unit } from './Workflow'
|
|
3
4
|
import type { Remotes } from '../../../Remotes'
|
|
4
5
|
import type { Component } from '@toa.io/core'
|
|
@@ -39,25 +40,68 @@ export class Execution extends Readable {
|
|
|
39
40
|
|
|
40
41
|
private async execute (unit: Unit): Promise<void> {
|
|
41
42
|
const promises = Object.entries(unit).map(async ([step, endpoint]) => {
|
|
42
|
-
|
|
43
|
+
try {
|
|
44
|
+
const result = await this.call(endpoint)
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
if (result instanceof Readable)
|
|
47
|
+
return await this.stream(step, result)
|
|
48
|
+
|
|
49
|
+
this.report(step, result)
|
|
50
|
+
} catch (e: unknown) {
|
|
51
|
+
this.exception(step, e)
|
|
52
|
+
}
|
|
49
53
|
})
|
|
50
54
|
|
|
51
55
|
await Promise.all(promises)
|
|
52
56
|
}
|
|
53
57
|
|
|
58
|
+
private async stream (step: string, stream: Readable): Promise<void> {
|
|
59
|
+
try {
|
|
60
|
+
for await (const result of stream)
|
|
61
|
+
this.report(step, result, false)
|
|
62
|
+
|
|
63
|
+
this.report(step, undefined, true)
|
|
64
|
+
} catch (e: unknown) {
|
|
65
|
+
this.exception(step, e)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private report (step: string, result?: Maybe<unknown>, completed = true): void {
|
|
70
|
+
const report: Report = { step }
|
|
71
|
+
|
|
72
|
+
if (completed)
|
|
73
|
+
report.status = 'completed'
|
|
74
|
+
|
|
75
|
+
if (result instanceof Error) {
|
|
76
|
+
report.error = result
|
|
77
|
+
this.interrupted = true
|
|
78
|
+
} else if (result !== undefined)
|
|
79
|
+
report.output = result
|
|
80
|
+
|
|
81
|
+
this.push(report)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private exception (step: string, error: unknown): void {
|
|
85
|
+
this.push({ step, status: 'exception' } satisfies Report)
|
|
86
|
+
this.interrupted = true
|
|
87
|
+
|
|
88
|
+
console.error('Workflow exception', error as Error)
|
|
89
|
+
}
|
|
90
|
+
|
|
54
91
|
private async call (endpoint: string): Promise<Maybe<unknown>> {
|
|
92
|
+
let task = false
|
|
93
|
+
|
|
94
|
+
if (endpoint.startsWith('task:')) {
|
|
95
|
+
endpoint = endpoint.slice(5)
|
|
96
|
+
task = true
|
|
97
|
+
}
|
|
98
|
+
|
|
55
99
|
const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
|
|
56
100
|
const key = `${namespace}.${component}`
|
|
57
101
|
|
|
58
102
|
this.components[key] ??= await this.discover(key, namespace, component)
|
|
59
103
|
|
|
60
|
-
return
|
|
104
|
+
return this.components[key].invoke(operation, { input: this.context, task })
|
|
61
105
|
}
|
|
62
106
|
|
|
63
107
|
private async discover (key: string, namespace: string, component: string): Promise<Component> {
|
|
@@ -69,8 +113,16 @@ export class Execution extends Readable {
|
|
|
69
113
|
}
|
|
70
114
|
|
|
71
115
|
export interface Context {
|
|
116
|
+
authority: string
|
|
72
117
|
storage: string
|
|
73
118
|
path: string
|
|
74
119
|
entry: Entry
|
|
75
120
|
parameters: Record<string, string>
|
|
76
121
|
}
|
|
122
|
+
|
|
123
|
+
interface Report {
|
|
124
|
+
step: string
|
|
125
|
+
status?: 'completed' | 'exception'
|
|
126
|
+
output?: unknown
|
|
127
|
+
error?: Error
|
|
128
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { posix } from 'node:path'
|
|
2
2
|
import { match } from 'matchacho'
|
|
3
3
|
import { Execution } from './Execution'
|
|
4
|
+
import type { Entry } from '@toa.io/extensions.storages'
|
|
4
5
|
import type { Context } from './Execution'
|
|
5
6
|
import type { Parameter } from '../../../RTD'
|
|
6
7
|
import type { Input } from '../types'
|
|
7
|
-
import type { Entry } from '@toa.io/extensions.storages'
|
|
8
8
|
import type { Remotes } from '../../../Remotes'
|
|
9
9
|
|
|
10
10
|
export class Workflow {
|
|
@@ -20,15 +20,15 @@ export class Workflow {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
// eslint-disable-next-line max-params
|
|
23
|
-
public execute
|
|
24
|
-
(input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
|
|
23
|
+
public execute (input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
|
|
25
24
|
const path = posix.join(input.request.url, entry.id)
|
|
25
|
+
const authority = input.authority
|
|
26
26
|
const parameters: Record<string, string> = {}
|
|
27
27
|
|
|
28
28
|
for (const { name, value } of params)
|
|
29
29
|
parameters[name] = value
|
|
30
30
|
|
|
31
|
-
const context: Context = { storage, path, entry, parameters }
|
|
31
|
+
const context: Context = { authority, storage, path, entry, parameters }
|
|
32
32
|
|
|
33
33
|
return new Execution(context, this.units, this.remotes)
|
|
34
34
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BadRequest } from '../../HTTP'
|
|
2
|
+
import type { Input } from '../../io'
|
|
3
|
+
import type { Directive } from './Directive'
|
|
4
|
+
|
|
5
|
+
export class Headers implements Directive {
|
|
6
|
+
private readonly headers: string[]
|
|
7
|
+
|
|
8
|
+
public constructor (headers: string[]) {
|
|
9
|
+
if (!Array.isArray(headers))
|
|
10
|
+
headers = [headers]
|
|
11
|
+
|
|
12
|
+
this.headers = headers
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public preflight (context: Input): void {
|
|
16
|
+
for (const header of this.headers)
|
|
17
|
+
if (context.request.headers[header] === undefined)
|
|
18
|
+
throw new BadRequest(`Header required: ${header}`)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
import { Headers } from './Headers'
|
|
3
|
+
import type { Input } from '../../io'
|
|
4
|
+
import type { Directive } from './Directive'
|
|
5
|
+
import type { DirectiveFamily } from '../../RTD'
|
|
6
|
+
|
|
7
|
+
export class Require implements DirectiveFamily {
|
|
8
|
+
public readonly name = 'require'
|
|
9
|
+
public readonly mandatory = false
|
|
10
|
+
|
|
11
|
+
public create (name: string, value: unknown): Directive {
|
|
12
|
+
assert.ok(name in directives, `Unknown directive: require:${name}`)
|
|
13
|
+
|
|
14
|
+
return new directives[name](value)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public preflight (instances: Directive[], context: Input): null {
|
|
18
|
+
for (const instance of instances)
|
|
19
|
+
instance.preflight(context)
|
|
20
|
+
|
|
21
|
+
return null
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const directives: Record<string, new (value: any) => Directive> = {
|
|
26
|
+
header: Headers,
|
|
27
|
+
headers: Headers
|
|
28
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Properties } from './Properties'
|
|
2
2
|
import type { Input } from '../../io'
|
|
3
|
+
import type { Parameter } from '../../RTD'
|
|
3
4
|
|
|
4
5
|
export interface Directive {
|
|
5
|
-
preflight: (
|
|
6
|
+
preflight: (context: Input, properties: Properties, parameters: Parameter[]) => void
|
|
6
7
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import assert from 'node:assert'
|
|
2
|
-
import { Header, embeddings } from './embeddings'
|
|
2
|
+
import { Header, embeddings, Parameter } from './embeddings'
|
|
3
3
|
import type { Embedding } from './embeddings'
|
|
4
4
|
import type { Input } from '../../io'
|
|
5
5
|
import type { Directive } from './Directive'
|
|
6
6
|
import type { Properties } from './Properties'
|
|
7
|
+
import type * as RTD from '../../RTD'
|
|
7
8
|
|
|
8
9
|
export class Embed implements Directive {
|
|
9
10
|
private readonly embeddings: Array<[string, Embedding[]]> = []
|
|
@@ -16,6 +17,9 @@ export class Embed implements Directive {
|
|
|
16
17
|
if (name[0] === ':')
|
|
17
18
|
return new Header(name.slice(1))
|
|
18
19
|
|
|
20
|
+
if (name.slice(0, 2) === '/:')
|
|
21
|
+
return new Parameter(name.slice(2))
|
|
22
|
+
|
|
19
23
|
assert.ok(name in embeddings, `Unknown embedding: ${name}`)
|
|
20
24
|
|
|
21
25
|
return new embeddings[name]()
|
|
@@ -25,27 +29,29 @@ export class Embed implements Directive {
|
|
|
25
29
|
}
|
|
26
30
|
}
|
|
27
31
|
|
|
28
|
-
public preflight (
|
|
32
|
+
public preflight (context: Input, properties: Properties, parameters: RTD.Parameter[]): void {
|
|
29
33
|
const values: Record<string, unknown> = {}
|
|
30
34
|
|
|
31
35
|
for (const [key, instances] of this.embeddings)
|
|
32
|
-
values[key] = this.resolve(instances,
|
|
36
|
+
values[key] = this.resolve(instances, context, properties, parameters)
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
context.pipelines.body.push(this.embedding(values))
|
|
35
39
|
}
|
|
36
40
|
|
|
37
|
-
|
|
41
|
+
// eslint-disable-next-line max-params
|
|
42
|
+
private resolve (instances: Embedding[],
|
|
43
|
+
input: Input,
|
|
44
|
+
properties: Properties,
|
|
45
|
+
parameters: RTD.Parameter[]): unknown {
|
|
38
46
|
let value
|
|
39
47
|
|
|
40
48
|
for (const instance of instances) {
|
|
41
|
-
value = instance.resolve(input, properties)
|
|
49
|
+
value = instance.resolve(input, properties, parameters)
|
|
42
50
|
|
|
43
51
|
if (value !== undefined)
|
|
44
52
|
break
|
|
45
53
|
}
|
|
46
54
|
|
|
47
|
-
assert.ok(value !== undefined, 'Neither embedding resolved a value.')
|
|
48
|
-
|
|
49
55
|
return value
|
|
50
56
|
}
|
|
51
57
|
|
|
@@ -3,7 +3,7 @@ import { properties, Property } from './Properties'
|
|
|
3
3
|
import { Embed } from './Embed'
|
|
4
4
|
import type { Properties } from './Properties'
|
|
5
5
|
import type { Directive } from './Directive'
|
|
6
|
-
import type { DirectiveFamily } from '../../RTD'
|
|
6
|
+
import type { DirectiveFamily, Parameter } from '../../RTD'
|
|
7
7
|
import type { Input, Output } from '../../io'
|
|
8
8
|
|
|
9
9
|
export class Vary implements DirectiveFamily {
|
|
@@ -15,11 +15,13 @@ export class Vary implements DirectiveFamily {
|
|
|
15
15
|
() => name in properties, (name: PN) => new Property(name, value as PV),
|
|
16
16
|
() => name in directives, (name: keyof typeof directives) => new directives[name](value),
|
|
17
17
|
() => {
|
|
18
|
-
throw new Error(`
|
|
18
|
+
throw new Error(`Directive 'vary:${name}' is not implemented`)
|
|
19
19
|
})
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
public preflight (instances: Array<Directive | Property>,
|
|
22
|
+
public preflight (instances: Array<Directive | Property>,
|
|
23
|
+
context: Input,
|
|
24
|
+
parameters: Parameter[]): Output {
|
|
23
25
|
/*
|
|
24
26
|
To stop constructing `properties` object on each request, Directive Families must be refactored
|
|
25
27
|
from singleton factories to per-Node instances on the Tree.
|
|
@@ -34,7 +36,7 @@ export class Vary implements DirectiveFamily {
|
|
|
34
36
|
directives.push(instance)
|
|
35
37
|
|
|
36
38
|
for (const directive of directives)
|
|
37
|
-
directive.preflight(
|
|
39
|
+
directive.preflight(context, properties, parameters)
|
|
38
40
|
|
|
39
41
|
return null
|
|
40
42
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Properties } from '../Properties'
|
|
2
2
|
import type { Input } from '../../../io'
|
|
3
|
+
import type { Parameter } from '../../../RTD'
|
|
3
4
|
|
|
4
5
|
export interface Embedding {
|
|
5
|
-
resolve: (input: Input, properties: Properties) => string | undefined
|
|
6
|
+
resolve: (input: Input, properties: Properties, parameters: Parameter[]) => string | undefined
|
|
6
7
|
}
|
|
@@ -12,10 +12,10 @@ export class Language implements Embedding {
|
|
|
12
12
|
|
|
13
13
|
public resolve (input: Input, properties: Properties): string | undefined {
|
|
14
14
|
assert.ok(properties.languages !== undefined,
|
|
15
|
-
'Supported languages are not defined. Use `vary:languages` directive
|
|
15
|
+
'Supported languages are not defined. Use `vary:languages` directive')
|
|
16
16
|
|
|
17
17
|
assert.ok(properties.languages.length > 0,
|
|
18
|
-
'List of supported languages is empty
|
|
18
|
+
'List of supported languages is empty')
|
|
19
19
|
|
|
20
20
|
const negotiator = new Negotiator(input.request)
|
|
21
21
|
const language = negotiator.language(properties.languages) ?? properties.languages[0]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Embedding } from './Embedding'
|
|
2
|
+
import type * as RTD from '../../../RTD'
|
|
3
|
+
|
|
4
|
+
export class Parameter implements Embedding {
|
|
5
|
+
private readonly name: string
|
|
6
|
+
|
|
7
|
+
public constructor (name: string) {
|
|
8
|
+
this.name = name
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public resolve (_: unknown, __: unknown, parameters: RTD.Parameter[]): string | undefined {
|
|
12
|
+
return parameters.find((parameter) => parameter.name === this.name)?.value
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { Language } from './Language'
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { Authority } from './Authority'
|
|
4
3
|
import type { Embedding } from './Embedding'
|
|
5
4
|
|
|
6
5
|
export const embeddings: Record<string, new () => Embedding> = {
|
|
7
|
-
language: Language
|
|
6
|
+
language: Language,
|
|
7
|
+
authority: Authority
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export { Header }
|
|
11
10
|
export type { Embedding }
|
|
11
|
+
|
|
12
|
+
export { Header } from './Header'
|
|
13
|
+
export { Parameter } from './Parameter'
|
package/source/exceptions.ts
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
-
import { type Exception } from '@toa.io/core'
|
|
2
1
|
import { match } from 'matchacho'
|
|
2
|
+
import { console } from 'openspan'
|
|
3
3
|
import * as http from './HTTP'
|
|
4
|
+
import { Exception as HTTPException } from './HTTP'
|
|
5
|
+
import type { Exception } from '@toa.io/core'
|
|
4
6
|
|
|
5
|
-
export function rethrow (exception: Exception): void {
|
|
6
|
-
|
|
7
|
+
export function rethrow (exception: Exception | HTTPException): void {
|
|
8
|
+
if (exception instanceof HTTPException)
|
|
9
|
+
throw exception
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
// see /runtime/core/src/exceptions.js
|
|
12
|
+
throw match(exception.code,
|
|
13
|
+
badRequest, () => new http.BadRequest(exception.message),
|
|
10
14
|
302, NOT_FOUND,
|
|
11
15
|
303, PRECONDITION_FAILED,
|
|
12
|
-
306, () => new http.Conflict(
|
|
13
|
-
() =>
|
|
16
|
+
306, () => new http.Conflict(),
|
|
17
|
+
() => {
|
|
18
|
+
console.error('Request processing exception', exception)
|
|
19
|
+
|
|
20
|
+
return exception
|
|
21
|
+
})
|
|
14
22
|
}
|
|
15
23
|
|
|
16
|
-
function badRequest (
|
|
17
|
-
return (code
|
|
18
|
-
return (exception.code >= 200 && exception.code < 210) || exception.code === 221
|
|
19
|
-
}
|
|
24
|
+
function badRequest (code: number): boolean {
|
|
25
|
+
return (code >= 200 && code < 210) || code === 221
|
|
20
26
|
}
|
|
21
27
|
|
|
22
28
|
const NOT_FOUND = new http.NotFound()
|