@toa.io/extensions.exposition 1.0.0-alpha.0 → 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.toa.yaml +12 -0
- package/components/identity.bans/manifest.toa.yaml +2 -1
- package/components/identity.basic/manifest.toa.yaml +6 -2
- package/components/identity.basic/operations/authenticate.d.ts +9 -0
- package/components/identity.basic/operations/authenticate.js +24 -0
- package/components/identity.basic/operations/authenticate.js.map +1 -0
- package/components/identity.basic/operations/create.d.ts +10 -0
- package/components/identity.basic/operations/create.js +10 -0
- package/components/identity.basic/operations/create.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +12 -0
- package/components/identity.basic/operations/transit.js +53 -0
- package/components/identity.basic/operations/transit.js.map +1 -0
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.basic/operations/types.d.ts +38 -0
- package/components/identity.basic/operations/types.js +3 -0
- package/components/identity.basic/operations/types.js.map +1 -0
- package/components/identity.basic/source/authenticate.ts +0 -1
- package/components/identity.federation/events/principal.js +22 -0
- package/components/identity.federation/manifest.toa.yaml +94 -0
- package/components/identity.federation/operations/authenticate.d.ts +3 -0
- package/components/identity.federation/operations/authenticate.js +20 -0
- package/components/identity.federation/operations/authenticate.js.map +1 -0
- package/components/identity.federation/operations/create.d.ts +10 -0
- package/components/identity.federation/operations/create.js +15 -0
- package/components/identity.federation/operations/create.js.map +1 -0
- package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
- package/components/identity.federation/operations/lib/jwt.js +136 -0
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +59 -0
- package/components/identity.federation/operations/schemas.js +9 -0
- package/components/identity.federation/operations/schemas.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.federation/operations/types.d.ts +51 -0
- package/components/identity.federation/operations/types.js +3 -0
- package/components/identity.federation/operations/types.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +28 -0
- package/components/identity.federation/source/create.ts +26 -0
- package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/lib/jwt.ts +171 -0
- package/components/identity.federation/source/schemas.ts +61 -0
- package/components/identity.federation/source/types.ts +56 -0
- package/components/identity.federation/tsconfig.json +9 -0
- package/components/identity.roles/manifest.toa.yaml +18 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +20 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +2 -0
- package/components/identity.roles/operations/list.js +8 -0
- package/components/identity.roles/operations/list.js.map +1 -0
- package/components/identity.roles/operations/principal.d.ts +13 -0
- package/components/identity.roles/operations/principal.js +13 -0
- package/components/identity.roles/operations/principal.js.map +1 -0
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.roles/source/grant.ts +31 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +1 -1
- package/components/identity.tokens/operations/authenticate.d.ts +9 -0
- package/components/identity.tokens/operations/authenticate.js +32 -0
- package/components/identity.tokens/operations/authenticate.js.map +1 -0
- package/components/identity.tokens/operations/decrypt.d.ts +3 -0
- package/components/identity.tokens/operations/decrypt.js +32 -0
- package/components/identity.tokens/operations/decrypt.js.map +1 -0
- package/components/identity.tokens/operations/encrypt.d.ts +8 -0
- package/components/identity.tokens/operations/encrypt.js +22 -0
- package/components/identity.tokens/operations/encrypt.js.map +1 -0
- package/components/identity.tokens/operations/revoke.d.ts +2 -0
- package/components/identity.tokens/operations/revoke.js +8 -0
- package/components/identity.tokens/operations/revoke.js.map +1 -0
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.tokens/operations/types.d.ts +40 -0
- package/components/identity.tokens/operations/types.js +3 -0
- package/components/identity.tokens/operations/types.js.map +1 -0
- package/components/octets.storage/manifest.toa.yaml +1 -0
- package/components/octets.storage/operations/store.js +3 -3
- package/cucumber.js +0 -1
- package/documentation/access.md +11 -11
- package/documentation/components.md +49 -13
- package/documentation/identity.md +14 -7
- package/documentation/io.md +56 -0
- package/documentation/octets.md +105 -40
- package/documentation/protocol.md +21 -1
- package/documentation/query.md +51 -6
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +69 -0
- package/features/access.feature +13 -2
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +3 -0
- package/features/cors.feature +72 -0
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +4 -3
- package/features/etag.feature +97 -0
- package/features/identity.basic.feature +68 -0
- package/features/identity.feature +19 -3
- package/features/identity.federation.feature +197 -0
- package/features/identity.roles.feature +151 -0
- package/features/identity.tokens.feature +3 -0
- package/features/io.feature +167 -0
- package/features/octets.entries.feature +123 -0
- package/features/octets.feature +4 -28
- package/features/octets.meta.feature +66 -0
- package/features/octets.workflows.feature +177 -4
- package/features/queries.feature +9 -1
- package/features/response.feature +68 -0
- package/features/routes.feature +54 -10
- package/features/steps/Captures.ts +6 -0
- package/features/steps/Components.ts +18 -6
- package/features/steps/Database.ts +1 -1
- package/features/steps/Gateway.ts +4 -2
- package/features/steps/HTTP.ts +40 -87
- package/features/steps/IdP.ts +149 -0
- package/features/steps/Parameters.ts +8 -2
- package/features/steps/Workspace.ts +5 -7
- package/features/steps/components/echo/manifest.toa.yaml +1 -0
- package/features/steps/components/echo/operations/error.js +11 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
- package/features/steps/components/octets.tester/operations/concat.js +7 -0
- package/features/steps/components/octets.tester/operations/echo.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users/manifest.toa.yaml +4 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
- package/features/steps/tsconfig.json +1 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +180 -0
- package/package.json +16 -20
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/schemas/octets/delete.cos.yaml +2 -1
- package/schemas/octets/list.cos.yaml +2 -1
- package/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +14 -8
- package/source/Directive.ts +26 -49
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +23 -12
- package/source/Gateway.ts +45 -42
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +61 -134
- package/source/HTTP/Server.ts +96 -87
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/formats/msgpack.ts +9 -6
- package/source/HTTP/formats/text.ts +1 -1
- package/source/HTTP/formats/yaml.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +38 -42
- package/source/Interception.ts +24 -0
- package/source/Mapping.ts +7 -8
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +19 -15
- package/source/RTD/factory.ts +2 -5
- package/source/RTD/syntax/parse.ts +6 -6
- package/source/RTD/syntax/types.ts +1 -1
- package/source/deployment.ts +7 -2
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
- package/source/directives/auth/Delegate.ts +32 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.ts +5 -3
- package/source/directives/auth/Rule.ts +2 -2
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/index.ts +2 -2
- package/source/directives/auth/schemes.ts +2 -1
- package/source/directives/auth/types.ts +9 -6
- package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
- package/source/directives/cache/Control.ts +5 -5
- package/source/directives/cache/index.ts +2 -2
- package/source/directives/cache/types.ts +2 -2
- package/source/directives/cors/CORS.ts +62 -0
- package/source/directives/cors/index.ts +3 -0
- package/source/directives/dev/{Family.ts → Development.ts} +4 -5
- package/source/directives/dev/Stub.ts +4 -4
- package/source/directives/dev/Throw.ts +4 -4
- package/source/directives/dev/index.ts +2 -2
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/index.ts +11 -6
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +6 -5
- package/source/directives/octets/Delete.ts +64 -11
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +44 -29
- package/source/directives/octets/List.ts +50 -10
- package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
- package/source/directives/octets/Permute.ts +18 -11
- package/source/directives/octets/Store.ts +70 -102
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/index.ts +2 -2
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +13 -6
- package/source/directives/octets/types.ts +2 -8
- package/source/directives/octets/workflows/Execution.ts +76 -0
- package/source/directives/octets/workflows/Workflow.ts +37 -0
- package/source/directives/octets/workflows/index.ts +1 -0
- package/source/directives/vary/Directive.ts +6 -0
- package/source/directives/vary/Embed.ts +62 -0
- package/source/directives/vary/Properties.ts +17 -0
- package/source/directives/vary/Vary.ts +48 -0
- package/source/directives/vary/embeddings/Embedding.ts +6 -0
- package/source/directives/vary/embeddings/Header.ts +32 -0
- package/source/directives/vary/embeddings/Language.ts +31 -0
- package/source/directives/vary/embeddings/index.ts +11 -0
- package/source/directives/vary/index.ts +3 -0
- package/source/exceptions.ts +13 -9
- package/source/io.ts +4 -0
- package/source/manifest.test.ts +6 -14
- package/source/manifest.ts +9 -6
- package/source/root.ts +5 -0
- package/source/schemas.ts +7 -3
- package/transpiled/Annotation.d.ts +8 -0
- package/transpiled/Annotation.js +3 -0
- package/transpiled/Annotation.js.map +1 -0
- package/transpiled/Branch.d.ts +7 -0
- package/transpiled/Branch.js +3 -0
- package/transpiled/Branch.js.map +1 -0
- package/transpiled/Composition.d.ts +14 -0
- package/transpiled/Composition.js +43 -0
- package/transpiled/Composition.js.map +1 -0
- package/transpiled/Context.d.ts +7 -0
- package/transpiled/Context.js +3 -0
- package/transpiled/Context.js.map +1 -0
- package/transpiled/Directive.d.ts +18 -0
- package/transpiled/Directive.js +75 -0
- package/transpiled/Directive.js.map +1 -0
- package/transpiled/Endpoint.d.ts +22 -0
- package/transpiled/Endpoint.js +101 -0
- package/transpiled/Endpoint.js.map +1 -0
- package/transpiled/Factory.d.ts +9 -0
- package/transpiled/Factory.js +73 -0
- package/transpiled/Factory.js.map +1 -0
- package/transpiled/Gateway.d.ts +18 -0
- package/transpiled/Gateway.js +92 -0
- package/transpiled/Gateway.js.map +1 -0
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +25 -0
- package/transpiled/HTTP/Server.js +141 -0
- package/transpiled/HTTP/Server.js.map +1 -0
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/exceptions.d.ts +34 -0
- package/transpiled/HTTP/exceptions.js +71 -0
- package/transpiled/HTTP/exceptions.js.map +1 -0
- package/transpiled/HTTP/formats/index.d.ts +10 -0
- package/transpiled/HTTP/formats/index.js +38 -0
- package/transpiled/HTTP/formats/index.js.map +1 -0
- package/transpiled/HTTP/formats/json.d.ts +6 -0
- package/transpiled/HTTP/formats/json.js +17 -0
- package/transpiled/HTTP/formats/json.js.map +1 -0
- package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
- package/transpiled/HTTP/formats/msgpack.js +17 -0
- package/transpiled/HTTP/formats/msgpack.js.map +1 -0
- package/transpiled/HTTP/formats/text.d.ts +8 -0
- package/transpiled/HTTP/formats/text.js +15 -0
- package/transpiled/HTTP/formats/text.js.map +1 -0
- package/transpiled/HTTP/formats/yaml.d.ts +6 -0
- package/transpiled/HTTP/formats/yaml.js +41 -0
- package/transpiled/HTTP/formats/yaml.js.map +1 -0
- package/transpiled/HTTP/index.d.ts +4 -0
- package/transpiled/HTTP/index.js +21 -0
- package/transpiled/HTTP/index.js.map +1 -0
- package/transpiled/HTTP/messages.d.ts +19 -0
- package/transpiled/HTTP/messages.js +73 -0
- package/transpiled/HTTP/messages.js.map +1 -0
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Mapping.d.ts +8 -0
- package/transpiled/Mapping.js +38 -0
- package/transpiled/Mapping.js.map +1 -0
- package/transpiled/Query.d.ts +13 -0
- package/transpiled/Query.js +107 -0
- package/transpiled/Query.js.map +1 -0
- package/transpiled/RTD/Context.d.ts +12 -0
- package/transpiled/RTD/Context.js +3 -0
- package/transpiled/RTD/Context.js.map +1 -0
- package/transpiled/RTD/Directives.d.ts +22 -0
- package/transpiled/RTD/Directives.js +3 -0
- package/transpiled/RTD/Directives.js.map +1 -0
- package/transpiled/RTD/Endpoint.d.ts +11 -0
- package/transpiled/RTD/Endpoint.js +3 -0
- package/transpiled/RTD/Endpoint.js.map +1 -0
- package/transpiled/RTD/Match.d.ts +9 -0
- package/transpiled/RTD/Match.js +3 -0
- package/transpiled/RTD/Match.js.map +1 -0
- package/transpiled/RTD/Method.d.ts +9 -0
- package/transpiled/RTD/Method.js +16 -0
- package/transpiled/RTD/Method.js.map +1 -0
- package/transpiled/RTD/Node.d.ts +19 -0
- package/transpiled/RTD/Node.js +62 -0
- package/transpiled/RTD/Node.js.map +1 -0
- package/transpiled/RTD/Route.d.ts +14 -0
- package/transpiled/RTD/Route.js +49 -0
- package/transpiled/RTD/Route.js.map +1 -0
- package/transpiled/RTD/Tree.d.ts +14 -0
- package/transpiled/RTD/Tree.js +45 -0
- package/transpiled/RTD/Tree.js.map +1 -0
- package/transpiled/RTD/factory.d.ts +4 -0
- package/transpiled/RTD/factory.js +36 -0
- package/transpiled/RTD/factory.js.map +1 -0
- package/transpiled/RTD/index.d.ts +8 -0
- package/transpiled/RTD/index.js +38 -0
- package/transpiled/RTD/index.js.map +1 -0
- package/transpiled/RTD/segment.d.ts +8 -0
- package/transpiled/RTD/segment.js +25 -0
- package/transpiled/RTD/segment.js.map +1 -0
- package/transpiled/RTD/syntax/index.d.ts +2 -0
- package/transpiled/RTD/syntax/index.js +19 -0
- package/transpiled/RTD/syntax/index.js.map +1 -0
- package/transpiled/RTD/syntax/parse.d.ts +4 -0
- package/transpiled/RTD/syntax/parse.js +128 -0
- package/transpiled/RTD/syntax/parse.js.map +1 -0
- package/transpiled/RTD/syntax/types.d.ts +41 -0
- package/transpiled/RTD/syntax/types.js +5 -0
- package/transpiled/RTD/syntax/types.js.map +1 -0
- package/transpiled/Remotes.d.ts +9 -0
- package/transpiled/Remotes.js +25 -0
- package/transpiled/Remotes.js.map +1 -0
- package/transpiled/Tenant.d.ts +13 -0
- package/transpiled/Tenant.js +34 -0
- package/transpiled/Tenant.js.map +1 -0
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +71 -0
- package/transpiled/deployment.js.map +1 -0
- package/transpiled/directives/auth/Anonymous.d.ts +6 -0
- package/transpiled/directives/auth/Anonymous.js +16 -0
- package/transpiled/directives/auth/Anonymous.js.map +1 -0
- package/transpiled/directives/auth/Authorization.d.ts +19 -0
- package/transpiled/directives/auth/Authorization.js +127 -0
- package/transpiled/directives/auth/Authorization.js.map +1 -0
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +27 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Echo.d.ts +6 -0
- package/transpiled/directives/auth/Echo.js +13 -0
- package/transpiled/directives/auth/Echo.js.map +1 -0
- package/transpiled/directives/auth/Id.d.ts +7 -0
- package/transpiled/directives/auth/Id.js +17 -0
- package/transpiled/directives/auth/Id.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +10 -0
- package/transpiled/directives/auth/Incept.js +63 -0
- package/transpiled/directives/auth/Incept.js.map +1 -0
- package/transpiled/directives/auth/Role.d.ts +11 -0
- package/transpiled/directives/auth/Role.js +46 -0
- package/transpiled/directives/auth/Role.js.map +1 -0
- package/transpiled/directives/auth/Rule.d.ts +9 -0
- package/transpiled/directives/auth/Rule.js +22 -0
- package/transpiled/directives/auth/Rule.js.map +1 -0
- package/transpiled/directives/auth/Scheme.d.ts +7 -0
- package/transpiled/directives/auth/Scheme.js +47 -0
- package/transpiled/directives/auth/Scheme.js.map +1 -0
- package/transpiled/directives/auth/index.d.ts +2 -0
- package/transpiled/directives/auth/index.js +6 -0
- package/transpiled/directives/auth/index.js.map +1 -0
- package/transpiled/directives/auth/schemes.d.ts +3 -0
- package/transpiled/directives/auth/schemes.js +10 -0
- package/transpiled/directives/auth/schemes.js.map +1 -0
- package/transpiled/directives/auth/split.d.ts +2 -0
- package/transpiled/directives/auth/split.js +38 -0
- package/transpiled/directives/auth/split.js.map +1 -0
- package/transpiled/directives/auth/types.d.ts +31 -0
- package/transpiled/directives/auth/types.js +3 -0
- package/transpiled/directives/auth/types.js.map +1 -0
- package/transpiled/directives/cache/Cache.d.ts +11 -0
- package/transpiled/directives/cache/Cache.js +28 -0
- package/transpiled/directives/cache/Cache.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +9 -0
- package/transpiled/directives/cache/Control.js +42 -0
- package/transpiled/directives/cache/Control.js.map +1 -0
- package/transpiled/directives/cache/Exact.d.ts +4 -0
- package/transpiled/directives/cache/Exact.js +11 -0
- package/transpiled/directives/cache/Exact.js.map +1 -0
- package/transpiled/directives/cache/index.d.ts +2 -0
- package/transpiled/directives/cache/index.js +6 -0
- package/transpiled/directives/cache/index.js.map +1 -0
- package/transpiled/directives/cache/types.d.ts +7 -0
- package/transpiled/directives/cache/types.js +3 -0
- package/transpiled/directives/cache/types.js.map +1 -0
- package/transpiled/directives/cors/CORS.d.ts +10 -0
- package/transpiled/directives/cors/CORS.js +51 -0
- package/transpiled/directives/cors/CORS.js.map +1 -0
- package/transpiled/directives/cors/index.d.ts +2 -0
- package/transpiled/directives/cors/index.js +6 -0
- package/transpiled/directives/cors/index.js.map +1 -0
- package/transpiled/directives/dev/Development.d.ts +9 -0
- package/transpiled/directives/dev/Development.js +29 -0
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +7 -0
- package/transpiled/directives/dev/Stub.js +14 -0
- package/transpiled/directives/dev/Stub.js.map +1 -0
- package/transpiled/directives/dev/Throw.d.ts +7 -0
- package/transpiled/directives/dev/Throw.js +14 -0
- package/transpiled/directives/dev/Throw.js.map +1 -0
- package/transpiled/directives/dev/index.d.ts +2 -0
- package/transpiled/directives/dev/index.js +6 -0
- package/transpiled/directives/dev/index.js.map +1 -0
- package/transpiled/directives/dev/types.d.ts +4 -0
- package/transpiled/directives/dev/types.js +3 -0
- package/transpiled/directives/dev/types.js.map +1 -0
- package/transpiled/directives/index.d.ts +4 -0
- package/transpiled/directives/index.js +13 -0
- package/transpiled/directives/index.js.map +1 -0
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/io/Input.js +63 -0
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +8 -0
- package/transpiled/directives/octets/Context.js +42 -0
- package/transpiled/directives/octets/Context.js.map +1 -0
- package/transpiled/directives/octets/Delete.d.ts +20 -0
- package/transpiled/directives/octets/Delete.js +84 -0
- package/transpiled/directives/octets/Delete.js.map +1 -0
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +18 -0
- package/transpiled/directives/octets/Fetch.js +92 -0
- package/transpiled/directives/octets/Fetch.js.map +1 -0
- package/transpiled/directives/octets/List.d.ts +16 -0
- package/transpiled/directives/octets/List.js +74 -0
- package/transpiled/directives/octets/List.js.map +1 -0
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/Octets.js +55 -0
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +11 -0
- package/transpiled/directives/octets/Permute.js +58 -0
- package/transpiled/directives/octets/Permute.js.map +1 -0
- package/transpiled/directives/octets/Store.d.ts +24 -0
- package/transpiled/directives/octets/Store.js +95 -0
- package/transpiled/directives/octets/Store.js.map +1 -0
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/index.d.ts +2 -0
- package/transpiled/directives/octets/index.js +6 -0
- package/transpiled/directives/octets/index.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +13 -0
- package/transpiled/directives/octets/schemas.js +18 -0
- package/transpiled/directives/octets/schemas.js.map +1 -0
- package/transpiled/directives/octets/types.d.ts +5 -0
- package/transpiled/directives/octets/types.js +3 -0
- package/transpiled/directives/octets/types.js.map +1 -0
- package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
- package/transpiled/directives/octets/workflows/Execution.js +54 -0
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
- package/transpiled/directives/octets/workflows/Workflow.js +25 -0
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.d.ts +1 -0
- package/transpiled/directives/octets/workflows/index.js +6 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +5 -0
- package/transpiled/directives/vary/Directive.js +3 -0
- package/transpiled/directives/vary/Directive.js.map +1 -0
- package/transpiled/directives/vary/Embed.d.ts +10 -0
- package/transpiled/directives/vary/Embed.js +49 -0
- package/transpiled/directives/vary/Embed.js.map +1 -0
- package/transpiled/directives/vary/Properties.d.ts +9 -0
- package/transpiled/directives/vary/Properties.js +16 -0
- package/transpiled/directives/vary/Properties.js.map +1 -0
- package/transpiled/directives/vary/Vary.d.ts +10 -0
- package/transpiled/directives/vary/Vary.js +36 -0
- package/transpiled/directives/vary/Vary.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
- package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Header.js +28 -0
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Language.js +28 -0
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/index.js +10 -0
- package/transpiled/directives/vary/embeddings/index.js.map +1 -0
- package/transpiled/directives/vary/index.d.ts +2 -0
- package/transpiled/directives/vary/index.js +6 -0
- package/transpiled/directives/vary/index.js.map +1 -0
- package/transpiled/discovery.d.ts +1 -0
- package/transpiled/discovery.js +3 -0
- package/transpiled/discovery.js.map +1 -0
- package/transpiled/exceptions.d.ts +2 -0
- package/transpiled/exceptions.js +39 -0
- package/transpiled/exceptions.js.map +1 -0
- package/transpiled/index.d.ts +5 -0
- package/transpiled/index.js +12 -0
- package/transpiled/index.js.map +1 -0
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.d.ts +3 -0
- package/transpiled/manifest.js +66 -0
- package/transpiled/manifest.js.map +1 -0
- package/transpiled/root.d.ts +2 -0
- package/transpiled/root.js +44 -0
- package/transpiled/root.js.map +1 -0
- package/transpiled/schemas.d.ts +7 -0
- package/transpiled/schemas.js +14 -0
- package/transpiled/schemas.js.map +1 -0
- package/transpiled/tsconfig.tsbuildinfo +1 -0
- package/source/HTTP/Server.fixtures.ts +0 -41
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
workflow+: <string>
|
|
2
|
+
_: true
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
meta: boolean
|
|
2
|
+
_: true
|
package/source/Annotation.ts
CHANGED
package/source/Context.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { type Endpoint } from './Endpoint'
|
|
2
|
-
import { type Directives } from './Directive'
|
|
3
|
-
import { type Branch } from './Branch'
|
|
4
1
|
import type * as RTD from './RTD'
|
|
5
2
|
|
|
6
|
-
export type Context = RTD.Context<
|
|
3
|
+
export type Context = RTD.Context<Extension>
|
|
4
|
+
|
|
5
|
+
interface Extension {
|
|
6
|
+
namespace: string
|
|
7
|
+
component: string
|
|
8
|
+
}
|
package/source/Directive.test.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
1
2
|
import { generate } from 'randomstring'
|
|
2
|
-
import { DirectivesFactory
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { DirectivesFactory } from './Directive'
|
|
4
|
+
import type { syntax, DirectiveFamily } from './RTD'
|
|
5
|
+
import type { Remotes } from './Remotes'
|
|
6
|
+
import type { Context } from './HTTP'
|
|
6
7
|
|
|
7
|
-
const families: Array<jest.
|
|
8
|
+
const families: Array<jest.MockedObjectDeep<DirectiveFamily>> = [
|
|
8
9
|
{
|
|
9
10
|
name: 'foo',
|
|
10
11
|
mandatory: true,
|
|
@@ -26,6 +27,9 @@ let factory: DirectivesFactory
|
|
|
26
27
|
beforeEach(() => {
|
|
27
28
|
jest.clearAllMocks()
|
|
28
29
|
|
|
30
|
+
assert.ok(families[0].preflight !== undefined)
|
|
31
|
+
assert.ok(families[1].preflight !== undefined)
|
|
32
|
+
|
|
29
33
|
families[0].preflight.mockImplementation(() => null)
|
|
30
34
|
families[1].preflight.mockImplementation(() => null)
|
|
31
35
|
factory = new DirectivesFactory(families, {} as unknown as Remotes)
|
|
@@ -61,7 +65,7 @@ it('should throw error if directive family is not found', async () => {
|
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
expect(() => factory.create([declaration]))
|
|
64
|
-
.toThrowError(`Directive family '${declaration.family}' not found.`)
|
|
68
|
+
.toThrowError(`Directive family '${declaration.family}' is not found.`)
|
|
65
69
|
})
|
|
66
70
|
|
|
67
71
|
it('should apply directive', async () => {
|
|
@@ -72,18 +76,20 @@ it('should apply directive', async () => {
|
|
|
72
76
|
}
|
|
73
77
|
|
|
74
78
|
const directives = factory.create([declaration])
|
|
75
|
-
const request = generate() as unknown as
|
|
79
|
+
const request = generate() as unknown as Context
|
|
76
80
|
const directive = families[0].create.mock.results[0].value
|
|
77
81
|
|
|
78
82
|
await directives.preflight(request, [])
|
|
79
83
|
|
|
84
|
+
assert.ok(families[0].preflight !== undefined)
|
|
85
|
+
|
|
80
86
|
expect(families[0].preflight.mock.calls[0][0]).toStrictEqual([directive])
|
|
81
87
|
expect(families[0].preflight.mock.calls[0][1]).toEqual(request)
|
|
82
88
|
})
|
|
83
89
|
|
|
84
90
|
it('should apply mandatory families', async () => {
|
|
85
91
|
const directives = factory.create([])
|
|
86
|
-
const request = generate() as unknown as
|
|
92
|
+
const request = generate() as unknown as Context
|
|
87
93
|
|
|
88
94
|
await directives.preflight(request, [])
|
|
89
95
|
|
package/source/Directive.ts
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Context, OutgoingMessage } from './HTTP'
|
|
2
|
+
import type { Remotes } from './Remotes'
|
|
3
|
+
import type { Output } from './io'
|
|
3
4
|
import type * as RTD from './RTD'
|
|
4
5
|
|
|
5
|
-
export class Directives implements RTD.Directives
|
|
6
|
-
private readonly
|
|
6
|
+
export class Directives implements RTD.Directives {
|
|
7
|
+
private readonly sets: RTD.DirectiveSet[]
|
|
7
8
|
|
|
8
|
-
public constructor (
|
|
9
|
-
this.
|
|
9
|
+
public constructor (sets: RTD.DirectiveSet[]) {
|
|
10
|
+
this.sets = sets
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
public async preflight (
|
|
13
|
-
for (const
|
|
14
|
-
|
|
13
|
+
public async preflight (context: Context, parameters: RTD.Parameter[]): Promise<Output> {
|
|
14
|
+
for (const set of this.sets) {
|
|
15
|
+
if (set.family.preflight === undefined)
|
|
16
|
+
continue
|
|
17
|
+
|
|
18
|
+
const output = await set.family.preflight(set.directives, context, parameters)
|
|
15
19
|
|
|
16
20
|
if (output !== null) {
|
|
17
|
-
await this.settle(
|
|
21
|
+
await this.settle(context, output)
|
|
18
22
|
|
|
19
23
|
return output
|
|
20
24
|
}
|
|
@@ -23,23 +27,19 @@ export class Directives implements RTD.Directives<Directives> {
|
|
|
23
27
|
return null
|
|
24
28
|
}
|
|
25
29
|
|
|
26
|
-
public async settle (
|
|
27
|
-
for (const
|
|
28
|
-
if (
|
|
29
|
-
await
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public merge (directives: Directives): void {
|
|
33
|
-
this.directives.push(...directives.directives)
|
|
30
|
+
public async settle (context: Context, response: OutgoingMessage): Promise<void> {
|
|
31
|
+
for (const set of this.sets)
|
|
32
|
+
if (set.family.settle !== undefined)
|
|
33
|
+
await set.family.settle(set.directives, context, response)
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export class DirectivesFactory implements RTD.
|
|
38
|
-
private readonly
|
|
39
|
-
private readonly families: Record<string,
|
|
37
|
+
export class DirectivesFactory implements RTD.DirectiveFactory {
|
|
38
|
+
private readonly remotes: Remotes
|
|
39
|
+
private readonly families: Record<string, RTD.DirectiveFamily> = {}
|
|
40
40
|
private readonly mandatory: string[] = []
|
|
41
41
|
|
|
42
|
-
public constructor (families:
|
|
42
|
+
public constructor (families: RTD.DirectiveFamily[], remotes: Remotes) {
|
|
43
43
|
for (const family of families) {
|
|
44
44
|
this.families[family.name] = family
|
|
45
45
|
|
|
@@ -47,7 +47,7 @@ export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
|
|
|
47
47
|
this.mandatory.push(family.name)
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
this.
|
|
50
|
+
this.remotes = remotes
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
public create (declarations: RTD.syntax.Directive[]): Directives {
|
|
@@ -61,16 +61,16 @@ export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
|
|
|
61
61
|
const family = this.families[declaration.family]
|
|
62
62
|
|
|
63
63
|
if (family === undefined)
|
|
64
|
-
throw new Error(`Directive family '${declaration.family}' not found.`)
|
|
64
|
+
throw new Error(`Directive family '${declaration.family}' is not found.`)
|
|
65
65
|
|
|
66
|
-
const directive = family.create(declaration.name, declaration.value, this.
|
|
66
|
+
const directive = family.create(declaration.name, declaration.value, this.remotes)
|
|
67
67
|
|
|
68
68
|
groups[family.name] ??= []
|
|
69
69
|
groups[family.name].push(directive)
|
|
70
70
|
mandatory.delete(family.name)
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
const sets: DirectiveSet[] = []
|
|
73
|
+
const sets: RTD.DirectiveSet[] = []
|
|
74
74
|
|
|
75
75
|
for (const family of mandatory)
|
|
76
76
|
sets.push({
|
|
@@ -95,26 +95,3 @@ export const shortcuts: RTD.syntax.Shortcuts = new Map([
|
|
|
95
95
|
['rule', 'auth:rule'],
|
|
96
96
|
['incept', 'auth:incept']
|
|
97
97
|
])
|
|
98
|
-
|
|
99
|
-
export interface Family<TDirective = any, TExtension = any> {
|
|
100
|
-
readonly name: string
|
|
101
|
-
readonly mandatory: boolean
|
|
102
|
-
|
|
103
|
-
create: (name: string, value: any, remotes: Remotes) => TDirective
|
|
104
|
-
|
|
105
|
-
preflight: (directives: TDirective[],
|
|
106
|
-
request: IncomingMessage & TExtension,
|
|
107
|
-
parameters: RTD.Parameter[]) => Output | Promise<Output>
|
|
108
|
-
|
|
109
|
-
settle?: (directives: TDirective[],
|
|
110
|
-
request: IncomingMessage & TExtension,
|
|
111
|
-
response: OutgoingMessage) => void | Promise<void>
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
interface DirectiveSet {
|
|
115
|
-
family: Family
|
|
116
|
-
directives: any[]
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
export type Input = IncomingMessage
|
|
120
|
-
export type Output = OutgoingMessage | null
|
package/source/Endpoint.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { type Component
|
|
1
|
+
import { type Component } from '@toa.io/core'
|
|
2
2
|
import { type Remotes } from './Remotes'
|
|
3
3
|
import { Mapping } from './Mapping'
|
|
4
4
|
import { type Context } from './Context'
|
|
5
|
+
import * as http from './HTTP'
|
|
5
6
|
import type * as RTD from './RTD'
|
|
6
|
-
import type * as http from './HTTP'
|
|
7
7
|
|
|
8
|
-
export class Endpoint implements RTD.Endpoint
|
|
8
|
+
export class Endpoint implements RTD.Endpoint {
|
|
9
9
|
private readonly endpoint: string
|
|
10
10
|
private readonly mapping: Mapping
|
|
11
11
|
private readonly discovery: Promise<Component>
|
|
@@ -17,12 +17,38 @@ export class Endpoint implements RTD.Endpoint<Endpoint> {
|
|
|
17
17
|
this.discovery = discovery
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public async call
|
|
20
|
+
public async call
|
|
21
|
+
(context: http.Context, parameters: RTD.Parameter[]): Promise<http.OutgoingMessage> {
|
|
22
|
+
const body = await context.body()
|
|
23
|
+
const query = this.query(context)
|
|
21
24
|
const request = this.mapping.fit(body, query, parameters)
|
|
22
25
|
|
|
23
26
|
this.remote ??= await this.discovery
|
|
24
27
|
|
|
25
|
-
|
|
28
|
+
const reply = await this.remote.invoke(this.endpoint, request)
|
|
29
|
+
|
|
30
|
+
if (reply instanceof Error)
|
|
31
|
+
throw new http.Conflict(reply)
|
|
32
|
+
|
|
33
|
+
const message: http.OutgoingMessage = {}
|
|
34
|
+
|
|
35
|
+
if (typeof reply === 'object' && reply !== null && '_version' in reply) {
|
|
36
|
+
const etag = context.request.headers['if-none-match']
|
|
37
|
+
|
|
38
|
+
message.headers ??= new Headers()
|
|
39
|
+
|
|
40
|
+
if (etag !== undefined && reply._version === this.version(etag)) {
|
|
41
|
+
message.status = 304
|
|
42
|
+
message.headers.set('etag', etag)
|
|
43
|
+
|
|
44
|
+
return message
|
|
45
|
+
} else
|
|
46
|
+
message.headers.set('etag', `"${reply._version.toString()}"`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
message.body = reply
|
|
50
|
+
|
|
51
|
+
return message
|
|
26
52
|
}
|
|
27
53
|
|
|
28
54
|
public async close (): Promise<void> {
|
|
@@ -30,9 +56,28 @@ export class Endpoint implements RTD.Endpoint<Endpoint> {
|
|
|
30
56
|
|
|
31
57
|
await this.remote.disconnect(INTERRUPT)
|
|
32
58
|
}
|
|
59
|
+
|
|
60
|
+
private query (context: http.Context): http.Query {
|
|
61
|
+
const query: http.Query = Object.fromEntries(context.url.searchParams)
|
|
62
|
+
const etag = context.request.headers['if-match']
|
|
63
|
+
|
|
64
|
+
if (etag !== undefined)
|
|
65
|
+
query.version = this.version(etag)
|
|
66
|
+
|
|
67
|
+
return query
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private version (etag: string): number {
|
|
71
|
+
const match = etag.match(ETAG)
|
|
72
|
+
|
|
73
|
+
if (match === null)
|
|
74
|
+
throw new http.BadRequest('Invalid ETag.')
|
|
75
|
+
|
|
76
|
+
return Number.parseInt(match.groups!.version)
|
|
77
|
+
}
|
|
33
78
|
}
|
|
34
79
|
|
|
35
|
-
export class EndpointsFactory implements RTD.EndpointsFactory
|
|
80
|
+
export class EndpointsFactory implements RTD.EndpointsFactory {
|
|
36
81
|
private readonly remotes: Remotes
|
|
37
82
|
|
|
38
83
|
public constructor (remotes: Remotes) {
|
|
@@ -56,4 +101,6 @@ export class EndpointsFactory implements RTD.EndpointsFactory<Endpoint> {
|
|
|
56
101
|
}
|
|
57
102
|
}
|
|
58
103
|
|
|
104
|
+
const ETAG = /^"(?<version>\d{1,32})"$/
|
|
105
|
+
|
|
59
106
|
const INTERRUPT = true
|
package/source/Factory.ts
CHANGED
|
@@ -3,45 +3,56 @@ import { Gateway } from './Gateway'
|
|
|
3
3
|
import { Remotes } from './Remotes'
|
|
4
4
|
import { Tree, syntax } from './RTD'
|
|
5
5
|
import { Server } from './HTTP'
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {
|
|
6
|
+
import { EndpointsFactory } from './Endpoint'
|
|
7
|
+
import { families, interceptors } from './directives'
|
|
8
|
+
import { DirectivesFactory } from './Directive'
|
|
9
9
|
import { Composition } from './Composition'
|
|
10
10
|
import * as root from './root'
|
|
11
|
+
import { Interception } from './Interception'
|
|
12
|
+
import type { Broadcast } from './Gateway'
|
|
11
13
|
import type { Connector, Locator, extensions } from '@toa.io/core'
|
|
12
14
|
|
|
13
15
|
export class Factory implements extensions.Factory {
|
|
14
16
|
private readonly boot: Bootloader
|
|
15
|
-
private readonly families: Family[]
|
|
16
17
|
|
|
17
18
|
public constructor (boot: Bootloader) {
|
|
18
19
|
this.boot = boot
|
|
19
|
-
this.families = directives.families
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
public tenant (locator: Locator, node: syntax.Node): Connector {
|
|
23
|
-
const broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id)
|
|
23
|
+
const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id)
|
|
24
24
|
|
|
25
25
|
return new Tenant(broadcast, locator, node)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
public service (): Connector | null {
|
|
29
29
|
const debug = process.env.TOA_EXPOSITION_DEBUG === '1'
|
|
30
|
-
const
|
|
31
|
-
const
|
|
30
|
+
const trace = process.env.TOA_EXPOSITION_TRACE === '1'
|
|
31
|
+
const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL)
|
|
32
|
+
|
|
33
|
+
const server = Server.create({
|
|
34
|
+
methods: syntax.verbs,
|
|
35
|
+
debug,
|
|
36
|
+
trace
|
|
37
|
+
})
|
|
38
|
+
|
|
32
39
|
const remotes = new Remotes(this.boot)
|
|
33
40
|
const node = root.resolve()
|
|
34
41
|
const methods = new EndpointsFactory(remotes)
|
|
35
|
-
const directives = new DirectivesFactory(
|
|
36
|
-
const
|
|
42
|
+
const directives = new DirectivesFactory(families, remotes)
|
|
43
|
+
const interception = new Interception(interceptors)
|
|
44
|
+
const tree = new Tree(node, methods, directives)
|
|
37
45
|
|
|
38
46
|
const composition = new Composition(this.boot)
|
|
39
|
-
const gateway = new Gateway(broadcast,
|
|
47
|
+
const gateway = new Gateway(broadcast, tree, interception)
|
|
40
48
|
|
|
41
49
|
gateway.depends(remotes)
|
|
42
50
|
gateway.depends(composition)
|
|
43
51
|
|
|
44
|
-
|
|
52
|
+
server.attach(gateway.process.bind(gateway))
|
|
53
|
+
server.depends(gateway)
|
|
54
|
+
|
|
55
|
+
return server
|
|
45
56
|
}
|
|
46
57
|
}
|
|
47
58
|
|
package/source/Gateway.ts
CHANGED
|
@@ -1,81 +1,84 @@
|
|
|
1
1
|
import { type bindings, Connector } from '@toa.io/core'
|
|
2
|
-
import { type Maybe } from '@toa.io/types'
|
|
3
2
|
import * as http from './HTTP'
|
|
4
3
|
import { rethrow } from './exceptions'
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { type Directives } from './Directive'
|
|
4
|
+
import type { Interception } from './Interception'
|
|
5
|
+
import type { Method, Parameter, Tree } from './RTD'
|
|
6
|
+
import type { Label } from './discovery'
|
|
7
|
+
import type { Branch } from './Branch'
|
|
10
8
|
|
|
11
9
|
export class Gateway extends Connector {
|
|
12
10
|
private readonly broadcast: Broadcast
|
|
13
|
-
private readonly tree: Tree
|
|
11
|
+
private readonly tree: Tree
|
|
12
|
+
private readonly interceptor: Interception
|
|
14
13
|
|
|
15
|
-
public constructor (broadcast: Broadcast,
|
|
14
|
+
public constructor (broadcast: Broadcast, tree: Tree, interception: Interception) {
|
|
16
15
|
super()
|
|
17
16
|
|
|
18
17
|
this.broadcast = broadcast
|
|
19
18
|
this.tree = tree
|
|
19
|
+
this.interceptor = interception
|
|
20
20
|
|
|
21
21
|
this.depends(broadcast)
|
|
22
|
-
this.depends(server)
|
|
23
|
-
|
|
24
|
-
server.attach(this.process.bind(this))
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
await
|
|
29
|
-
|
|
30
|
-
console.info('Gateway has started and is awaiting resource branches.')
|
|
31
|
-
}
|
|
24
|
+
public async process (context: http.Context): Promise<http.OutgoingMessage> {
|
|
25
|
+
const interception = await context.timing.capture('intercept',
|
|
26
|
+
this.interceptor.intercept(context))
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
28
|
+
if (interception !== null)
|
|
29
|
+
return interception
|
|
36
30
|
|
|
37
|
-
|
|
38
|
-
const match = this.tree.match(request.path)
|
|
31
|
+
const match = this.tree.match(context.url.pathname)
|
|
39
32
|
|
|
40
33
|
if (match === null)
|
|
41
34
|
throw new http.NotFound()
|
|
42
35
|
|
|
43
|
-
const {
|
|
36
|
+
const {
|
|
37
|
+
node,
|
|
38
|
+
parameters
|
|
39
|
+
} = match
|
|
44
40
|
|
|
45
|
-
if (!(request.method in node.methods))
|
|
41
|
+
if (!(context.request.method in node.methods))
|
|
46
42
|
throw new http.MethodNotAllowed()
|
|
47
43
|
|
|
48
|
-
const method = node.methods[request.method]
|
|
49
|
-
const interruption = await method.directives.preflight(request, parameters)
|
|
50
|
-
const response = interruption ?? await this.call(method, request, parameters)
|
|
44
|
+
const method = node.methods[context.request.method]
|
|
51
45
|
|
|
52
|
-
await
|
|
46
|
+
const interruption = await context.timing.capture('preflight',
|
|
47
|
+
method.directives.preflight(context, parameters)).catch(rethrow)
|
|
48
|
+
|
|
49
|
+
const response = interruption ??
|
|
50
|
+
await context.timing.capture('call', this.call(method, context, parameters))
|
|
51
|
+
|
|
52
|
+
await context.timing.capture('settle',
|
|
53
|
+
method.directives.settle(context, response)).catch(rethrow)
|
|
53
54
|
|
|
54
55
|
return response
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
58
|
+
protected override async open (): Promise<void> {
|
|
59
|
+
await this.discover()
|
|
60
|
+
|
|
61
|
+
console.info('Gateway has started and is awaiting resource branches.')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected override dispose (): void {
|
|
65
|
+
console.info('Gateway is closed.')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private async call (method: Method, context: http.Context, parameters: Parameter[]):
|
|
59
69
|
Promise<http.OutgoingMessage> {
|
|
60
|
-
if (
|
|
70
|
+
if (context.url.pathname[context.url.pathname.length - 1] !== '/')
|
|
61
71
|
throw new http.NotFound('Trailing slash is required.')
|
|
62
72
|
|
|
63
|
-
if (
|
|
73
|
+
if (context.encoder === null)
|
|
64
74
|
throw new http.NotAcceptable()
|
|
65
75
|
|
|
66
76
|
if (method.endpoint === null)
|
|
67
77
|
throw new http.MethodNotAllowed()
|
|
68
78
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.call(body, request.query, parameters)
|
|
73
|
-
.catch(rethrow) as Maybe<unknown>
|
|
74
|
-
|
|
75
|
-
if (reply instanceof Error)
|
|
76
|
-
throw new http.Conflict(reply)
|
|
77
|
-
|
|
78
|
-
return { body: reply }
|
|
79
|
+
return await method.endpoint
|
|
80
|
+
.call(context, parameters)
|
|
81
|
+
.catch(rethrow) as http.OutgoingMessage
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
private async discover (): Promise<void> {
|
|
@@ -95,4 +98,4 @@ export class Gateway extends Connector {
|
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
100
|
|
|
98
|
-
type Broadcast = bindings.Broadcast<Label>
|
|
101
|
+
export type Broadcast = bindings.Broadcast<Label>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import Negotiator from 'negotiator'
|
|
2
|
+
import { Timing } from './Timing'
|
|
3
|
+
import { type Format, formats, types } from './formats'
|
|
4
|
+
import { read } from './messages'
|
|
5
|
+
import type { OutgoingMessage } from './messages'
|
|
6
|
+
import type * as http from 'node:http'
|
|
7
|
+
|
|
8
|
+
export class Context {
|
|
9
|
+
public readonly request: IncomingMessage
|
|
10
|
+
public readonly url: URL
|
|
11
|
+
public readonly subtype: string | null = null
|
|
12
|
+
public readonly encoder: Format | null = null
|
|
13
|
+
public readonly timing: Timing
|
|
14
|
+
|
|
15
|
+
public readonly pipelines: Pipelines = {
|
|
16
|
+
body: [],
|
|
17
|
+
response: []
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public constructor (request: IncomingMessage, trace = false) {
|
|
21
|
+
this.request = request
|
|
22
|
+
|
|
23
|
+
this.url = new URL(request.url, `https://${request.headers.host}`)
|
|
24
|
+
this.timing = new Timing(trace)
|
|
25
|
+
|
|
26
|
+
if (this.request.headers.accept !== undefined) {
|
|
27
|
+
const match = SUBTYPE.exec(this.request.headers.accept)
|
|
28
|
+
|
|
29
|
+
if (match !== null) {
|
|
30
|
+
const {
|
|
31
|
+
type,
|
|
32
|
+
subtype,
|
|
33
|
+
suffix
|
|
34
|
+
} = match.groups!
|
|
35
|
+
|
|
36
|
+
this.request.headers.accept = `${type}/${suffix}`
|
|
37
|
+
this.subtype = subtype
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const negotiator = new Negotiator(this.request)
|
|
42
|
+
const mediaType = negotiator.mediaType(types)
|
|
43
|
+
|
|
44
|
+
if (mediaType !== undefined)
|
|
45
|
+
this.encoder = formats[mediaType]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public async body<T> (): Promise<T> {
|
|
49
|
+
const value = await read(this)
|
|
50
|
+
|
|
51
|
+
return this.pipelines.body.length === 0
|
|
52
|
+
? value
|
|
53
|
+
: this.pipelines.body.reduce((value, transform) => transform(value), value)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface IncomingMessage extends http.IncomingMessage {
|
|
58
|
+
url: string
|
|
59
|
+
method: string
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
interface Pipelines {
|
|
63
|
+
body: Array<(input: unknown) => unknown>
|
|
64
|
+
response: Array<(output: OutgoingMessage) => void>
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const SUBTYPE = /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/
|