@toa.io/extensions.exposition 1.0.0-alpha.4 → 1.0.0-alpha.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.toa.yaml +2 -2
- package/components/identity.bans/manifest.toa.yaml +15 -7
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +22 -9
- package/components/identity.basic/operations/authenticate.d.ts +5 -1
- package/components/identity.basic/operations/authenticate.js +5 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/incept.d.ts +12 -0
- package/components/identity.basic/operations/incept.js +26 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +4 -4
- package/components/identity.basic/operations/transit.js +5 -3
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/types.d.ts +8 -4
- package/components/identity.basic/source/authenticate.ts +16 -5
- package/components/identity.basic/source/incept.ts +38 -0
- package/components/identity.basic/source/transit.ts +8 -6
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +28 -22
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +3 -10
- package/components/identity.federation/operations/authenticate.js.map +1 -1
- package/components/identity.federation/operations/incept.d.ts +11 -0
- package/components/identity.federation/operations/{create.js → incept.js} +6 -7
- package/components/identity.federation/operations/incept.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +4 -5
- package/components/identity.federation/operations/lib/jwt.js +3 -3
- package/components/identity.federation/operations/lib/jwt.js.map +1 -1
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/configuration.d.ts +14 -0
- package/components/identity.federation/operations/types/configuration.js +3 -0
- package/components/identity.federation/operations/types/configuration.js.map +1 -0
- package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +13 -6
- package/components/identity.federation/operations/types/context.js +3 -0
- package/components/identity.federation/operations/types/context.js.map +1 -0
- package/components/identity.federation/operations/types/entity.d.ts +6 -0
- package/components/identity.federation/operations/{types.js → types/entity.js} +1 -1
- package/components/identity.federation/operations/types/entity.js.map +1 -0
- package/components/identity.federation/operations/types/index.d.ts +3 -0
- package/components/identity.federation/operations/types/index.js +20 -0
- package/components/identity.federation/operations/types/index.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +5 -18
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/jwt.test.ts +2 -2
- package/components/identity.federation/source/lib/jwt.ts +7 -8
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +15 -5
- package/components/identity.federation/source/types/entity.ts +6 -0
- package/components/identity.federation/source/types/index.ts +3 -0
- package/components/identity.federation/tsconfig.json +2 -2
- package/components/identity.roles/manifest.toa.yaml +18 -6
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +32 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +19 -5
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +10 -4
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js +1 -0
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/encrypt.js +5 -1
- package/components/identity.tokens/operations/encrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/operations/types.d.ts +8 -2
- package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
- package/components/identity.tokens/source/authenticate.test.ts +11 -4
- package/components/identity.tokens/source/authenticate.ts +12 -5
- package/components/identity.tokens/source/decrypt.test.ts +5 -3
- package/components/identity.tokens/source/decrypt.ts +9 -8
- package/components/identity.tokens/source/encrypt.test.ts +26 -2
- package/components/identity.tokens/source/encrypt.ts +5 -1
- package/components/identity.tokens/source/types.ts +9 -2
- package/components/octets.storage/manifest.toa.yaml +0 -7
- package/documentation/access.md +27 -16
- package/documentation/authorities.md +53 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +47 -22
- package/documentation/identity.md +17 -22
- package/documentation/io.md +56 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +17 -11
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +14 -14
- package/features/access.feature +89 -47
- package/features/annotation.feature +2 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +99 -0
- package/features/authorities.tokens.feature +118 -0
- package/features/body.feature +4 -0
- package/features/cache.feature +112 -5
- package/features/cors.feature +7 -2
- package/features/debug.feature +34 -0
- package/features/directives.feature +5 -0
- package/features/dynamic.feature +18 -7
- package/features/errors.feature +18 -4
- package/features/etag.feature +18 -1
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +142 -19
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +67 -14
- package/features/identity.roles.feature +220 -4
- package/features/identity.tokens.feature +57 -4
- package/features/io.feature +205 -0
- package/features/octets.entries.feature +10 -0
- package/features/octets.feature +60 -64
- package/features/octets.meta.feature +7 -3
- package/features/octets.workflows.feature +14 -0
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +50 -3
- package/features/require.feature +67 -0
- package/features/response.feature +12 -3
- package/features/routes.feature +25 -12
- package/features/steps/Database.ts +17 -10
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +28 -23
- package/features/steps/components/echo/manifest.toa.yaml +5 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +2 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/streams.feature +1 -0
- package/features/timing.feature +27 -1
- package/features/vary.feature +105 -3
- package/package.json +12 -11
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/source/Annotation.ts +3 -3
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +4 -4
- package/source/Directive.ts +11 -38
- package/source/Endpoint.ts +43 -8
- package/source/Factory.ts +11 -7
- package/source/Gateway.ts +16 -44
- package/source/HTTP/Context.ts +24 -2
- package/source/HTTP/Server.ts +56 -43
- package/source/HTTP/exceptions.ts +7 -1
- package/source/HTTP/messages.ts +1 -1
- package/source/Mapping.ts +6 -1
- package/source/Query.test.ts +1 -1
- package/source/Query.ts +35 -24
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +17 -16
- package/source/RTD/factory.ts +3 -6
- package/source/Tenant.ts +0 -8
- package/source/deployment.ts +32 -22
- package/source/directives/auth/Authorization.ts +38 -19
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Incept.ts +3 -2
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +15 -8
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +13 -7
- package/source/directives/dev/Development.ts +4 -4
- package/source/directives/index.ts +6 -4
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +4 -3
- package/source/directives/octets/Delete.ts +4 -2
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +4 -3
- package/source/directives/octets/List.ts +4 -2
- package/source/directives/octets/Octets.ts +6 -8
- package/source/directives/octets/Store.ts +12 -4
- package/source/directives/octets/Workflow.ts +10 -3
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/require/Directive.ts +5 -0
- package/source/directives/require/Headers.ts +20 -0
- package/source/directives/require/Require.ts +28 -0
- package/source/directives/require/index.ts +3 -0
- package/source/directives/vary/Directive.ts +2 -1
- package/source/directives/vary/Embed.ts +14 -8
- package/source/directives/vary/Vary.ts +7 -5
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Header.ts +8 -6
- package/source/directives/vary/embeddings/Language.ts +1 -1
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +22 -11
- package/source/root.ts +5 -0
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +4 -17
- package/transpiled/Directive.js +4 -7
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +5 -3
- package/transpiled/Endpoint.js +30 -5
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +9 -4
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +1 -4
- package/transpiled/Gateway.js +10 -26
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +8 -1
- package/transpiled/HTTP/Context.js +15 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +41 -35
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +4 -1
- package/transpiled/HTTP/exceptions.js +7 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/messages.js +1 -1
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Mapping.js +4 -1
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +1 -0
- package/transpiled/Query.js +21 -20
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +4 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/Tenant.d.ts +0 -1
- package/transpiled/Tenant.js +0 -6
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/deployment.js +28 -20
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Authorization.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +26 -12
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +10 -0
- package/transpiled/directives/auth/Delegate.js +34 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.js +3 -2
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +20 -14
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +5 -5
- package/transpiled/directives/cache/Cache.js +10 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -1
- package/transpiled/directives/cache/Control.js +29 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +13 -7
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.d.ts +3 -3
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/index.d.ts +2 -2
- package/transpiled/directives/index.js +5 -3
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -26
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +3 -3
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +3 -2
- package/transpiled/directives/octets/Delete.js +3 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +3 -2
- package/transpiled/directives/octets/Fetch.js +3 -1
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +3 -2
- package/transpiled/directives/octets/List.js +3 -1
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +2 -4
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +3 -2
- package/transpiled/directives/octets/Store.js +10 -3
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +3 -2
- package/transpiled/directives/octets/Workflow.js +9 -2
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +2 -1
- package/transpiled/directives/vary/Embed.d.ts +2 -1
- package/transpiled/directives/vary/Embed.js +8 -6
- package/transpiled/directives/vary/Embed.js.map +1 -1
- package/transpiled/directives/vary/Vary.d.ts +3 -3
- package/transpiled/directives/vary/Vary.js +3 -3
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Authority.js +10 -0
- package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/Header.js +8 -6
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +1 -1
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
- package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
- package/transpiled/directives/vary/embeddings/index.js +8 -4
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +13 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +1 -1
- package/transpiled/schemas.js +2 -2
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/create.d.ts +0 -10
- package/components/identity.basic/operations/create.js +0 -10
- package/components/identity.basic/operations/create.js.map +0 -1
- package/components/identity.basic/source/create.ts +0 -18
- package/components/identity.federation/operations/create.d.ts +0 -10
- package/components/identity.federation/operations/create.js.map +0 -1
- package/components/identity.federation/operations/schemas.d.ts +0 -59
- package/components/identity.federation/operations/schemas.js +0 -9
- package/components/identity.federation/operations/schemas.js.map +0 -1
- package/components/identity.federation/operations/types.js.map +0 -1
- package/components/identity.federation/source/schemas.ts +0 -61
- package/components/octets.storage/operations/permute.js +0 -7
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Permute.ts +0 -43
- package/transpiled/directives/octets/Permute.d.ts +0 -10
- package/transpiled/directives/octets/Permute.js.map +0 -1
|
@@ -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,10 +3,10 @@ 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 {
|
|
6
|
+
import type { DirectiveFamily, Parameter } from '../../RTD'
|
|
7
7
|
import type { Input, Output } from '../../io'
|
|
8
8
|
|
|
9
|
-
export class Vary implements
|
|
9
|
+
export class Vary implements DirectiveFamily {
|
|
10
10
|
public readonly name = 'vary'
|
|
11
11
|
public readonly mandatory = false
|
|
12
12
|
|
|
@@ -15,11 +15,13 @@ export class Vary implements Family {
|
|
|
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 Family {
|
|
|
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
|
}
|
|
@@ -6,9 +6,10 @@ export class Header implements Embedding {
|
|
|
6
6
|
private readonly name: string
|
|
7
7
|
|
|
8
8
|
public constructor (name: string) {
|
|
9
|
-
this.name = name
|
|
9
|
+
this.name = name.toLowerCase()
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
if (this.name !== 'host')
|
|
12
|
+
cors.allow(this.name)
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
public resolve (input: Input): string | undefined {
|
|
@@ -17,10 +18,11 @@ export class Header implements Embedding {
|
|
|
17
18
|
if (value === undefined)
|
|
18
19
|
return value
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
response.
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
if (this.name !== 'host')
|
|
22
|
+
input.pipelines.response.push((response) => {
|
|
23
|
+
response.headers ??= new Headers()
|
|
24
|
+
response.headers.append('vary', this.name)
|
|
25
|
+
})
|
|
24
26
|
|
|
25
27
|
if (Array.isArray(value))
|
|
26
28
|
return value.join(', ')
|
|
@@ -7,7 +7,7 @@ import type { Input } from '../../../io'
|
|
|
7
7
|
|
|
8
8
|
export class Language implements Embedding {
|
|
9
9
|
public constructor () {
|
|
10
|
-
cors.
|
|
10
|
+
cors.allow('accept-language')
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
public resolve (input: Input, properties: Properties): string | undefined {
|
|
@@ -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,17 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { match } from 'matchacho'
|
|
2
2
|
import * as http from './HTTP'
|
|
3
|
+
import { Exception as HTTPException } from './HTTP'
|
|
4
|
+
import type { Exception } from '@toa.io/core'
|
|
3
5
|
|
|
4
|
-
export function rethrow (exception: Exception): void {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
if ((exception.code >= 200 && exception.code < 210) || exception.code === 221)
|
|
8
|
-
throw new http.BadRequest(exception.message)
|
|
6
|
+
export function rethrow (exception: Exception | HTTPException): void {
|
|
7
|
+
if (exception instanceof HTTPException)
|
|
8
|
+
throw exception
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
// see /runtime/core/src/exceptions.js
|
|
11
|
+
throw match(exception.code,
|
|
12
|
+
badRequest, () => new http.BadRequest(exception.message),
|
|
13
|
+
302, NOT_FOUND,
|
|
14
|
+
303, PRECONDITION_FAILED,
|
|
15
|
+
306, () => new http.Conflict(),
|
|
16
|
+
() => {
|
|
17
|
+
console.error(exception)
|
|
12
18
|
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
return exception
|
|
20
|
+
})
|
|
21
|
+
}
|
|
15
22
|
|
|
16
|
-
|
|
23
|
+
function badRequest (code: number): boolean {
|
|
24
|
+
return (code >= 200 && code < 210) || code === 221
|
|
17
25
|
}
|
|
26
|
+
|
|
27
|
+
const NOT_FOUND = new http.NotFound()
|
|
28
|
+
const PRECONDITION_FAILED = new http.PreconditionFailed()
|
package/source/root.ts
CHANGED
package/source/schemas.ts
CHANGED
|
@@ -9,5 +9,5 @@ const path = resolve(__dirname, '../schemas')
|
|
|
9
9
|
const namespace = schemas.namespace(path)
|
|
10
10
|
|
|
11
11
|
export const querystring: Schema<Query> = namespace.schema('querystring')
|
|
12
|
-
export const
|
|
12
|
+
export const annotation: Schema<Annotation> = namespace.schema('annotation')
|
|
13
13
|
export const node: Schema<Node> = namespace.schema('node')
|
package/transpiled/Context.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
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
|
-
export type Context = RTD.Context<
|
|
2
|
+
export type Context = RTD.Context<Extension>;
|
|
3
|
+
interface Extension {
|
|
4
|
+
namespace: string;
|
|
5
|
+
component: string;
|
|
6
|
+
}
|
|
7
|
+
export {};
|
|
@@ -2,30 +2,17 @@ import type { Context, OutgoingMessage } from './HTTP';
|
|
|
2
2
|
import type { Remotes } from './Remotes';
|
|
3
3
|
import type { Output } from './io';
|
|
4
4
|
import type * as RTD from './RTD';
|
|
5
|
-
export declare class Directives implements RTD.Directives
|
|
5
|
+
export declare class Directives implements RTD.Directives {
|
|
6
6
|
private readonly sets;
|
|
7
|
-
constructor(sets: DirectiveSet[]);
|
|
7
|
+
constructor(sets: RTD.DirectiveSet[]);
|
|
8
8
|
preflight(context: Context, parameters: RTD.Parameter[]): Promise<Output>;
|
|
9
9
|
settle(context: Context, response: OutgoingMessage): Promise<void>;
|
|
10
|
-
merge(directives: Directives): void;
|
|
11
10
|
}
|
|
12
|
-
export declare class DirectivesFactory implements RTD.
|
|
11
|
+
export declare class DirectivesFactory implements RTD.DirectiveFactory {
|
|
13
12
|
private readonly remotes;
|
|
14
13
|
private readonly families;
|
|
15
14
|
private readonly mandatory;
|
|
16
|
-
constructor(families:
|
|
15
|
+
constructor(families: RTD.DirectiveFamily[], remotes: Remotes);
|
|
17
16
|
create(declarations: RTD.syntax.Directive[]): Directives;
|
|
18
17
|
}
|
|
19
18
|
export declare const shortcuts: RTD.syntax.Shortcuts;
|
|
20
|
-
export interface Family<TDirective = any, TExtension = any> {
|
|
21
|
-
readonly name: string;
|
|
22
|
-
readonly mandatory: boolean;
|
|
23
|
-
create: (name: string, value: any, remotes: Remotes) => TDirective;
|
|
24
|
-
preflight?: (directives: TDirective[], request: Context & TExtension, parameters: RTD.Parameter[]) => Output | Promise<Output>;
|
|
25
|
-
settle?: (directives: TDirective[], request: Context & TExtension, response: OutgoingMessage) => void | Promise<void>;
|
|
26
|
-
}
|
|
27
|
-
interface DirectiveSet {
|
|
28
|
-
family: Family;
|
|
29
|
-
directives: any[];
|
|
30
|
-
}
|
|
31
|
-
export {};
|
package/transpiled/Directive.js
CHANGED
|
@@ -11,10 +11,8 @@ class Directives {
|
|
|
11
11
|
if (set.family.preflight === undefined)
|
|
12
12
|
continue;
|
|
13
13
|
const output = await set.family.preflight(set.directives, context, parameters);
|
|
14
|
-
if (output !== null)
|
|
15
|
-
await this.settle(context, output);
|
|
14
|
+
if (output !== null)
|
|
16
15
|
return output;
|
|
17
|
-
}
|
|
18
16
|
}
|
|
19
17
|
return null;
|
|
20
18
|
}
|
|
@@ -23,9 +21,6 @@ class Directives {
|
|
|
23
21
|
if (set.family.settle !== undefined)
|
|
24
22
|
await set.family.settle(set.directives, context, response);
|
|
25
23
|
}
|
|
26
|
-
merge(directives) {
|
|
27
|
-
this.sets.push(...directives.sets);
|
|
28
|
-
}
|
|
29
24
|
}
|
|
30
25
|
exports.Directives = Directives;
|
|
31
26
|
class DirectivesFactory {
|
|
@@ -73,6 +68,8 @@ exports.shortcuts = new Map([
|
|
|
73
68
|
['id', 'auth:id'],
|
|
74
69
|
['role', 'auth:role'],
|
|
75
70
|
['rule', 'auth:rule'],
|
|
76
|
-
['incept', 'auth:incept']
|
|
71
|
+
['incept', 'auth:incept'],
|
|
72
|
+
['input', 'io:input'],
|
|
73
|
+
['output', 'io:output']
|
|
77
74
|
]);
|
|
78
75
|
//# sourceMappingURL=Directive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Directive.js","sourceRoot":"","sources":["../source/Directive.ts"],"names":[],"mappings":";;;AAKA,MAAa,UAAU;IACJ,IAAI,
|
|
1
|
+
{"version":3,"file":"Directive.js","sourceRoot":"","sources":["../source/Directive.ts"],"names":[],"mappings":"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"}
|
package/transpiled/Endpoint.d.ts
CHANGED
|
@@ -4,16 +4,18 @@ import { Mapping } from './Mapping';
|
|
|
4
4
|
import { type Context } from './Context';
|
|
5
5
|
import * as http from './HTTP';
|
|
6
6
|
import type * as RTD from './RTD';
|
|
7
|
-
export declare class Endpoint implements RTD.Endpoint
|
|
7
|
+
export declare class Endpoint implements RTD.Endpoint {
|
|
8
8
|
private readonly endpoint;
|
|
9
9
|
private readonly mapping;
|
|
10
10
|
private readonly discovery;
|
|
11
11
|
private remote;
|
|
12
12
|
constructor(endpoint: string, mapping: Mapping, discovery: Promise<Component>);
|
|
13
|
-
call(
|
|
13
|
+
call(context: http.Context, parameters: RTD.Parameter[]): Promise<http.OutgoingMessage>;
|
|
14
14
|
close(): Promise<void>;
|
|
15
|
+
private query;
|
|
16
|
+
private version;
|
|
15
17
|
}
|
|
16
|
-
export declare class EndpointsFactory implements RTD.EndpointsFactory
|
|
18
|
+
export declare class EndpointsFactory implements RTD.EndpointsFactory {
|
|
17
19
|
private readonly remotes;
|
|
18
20
|
constructor(remotes: Remotes);
|
|
19
21
|
create(method: RTD.syntax.Method, context: Context): Endpoint;
|
package/transpiled/Endpoint.js
CHANGED
|
@@ -36,24 +36,48 @@ class Endpoint {
|
|
|
36
36
|
this.mapping = mapping;
|
|
37
37
|
this.discovery = discovery;
|
|
38
38
|
}
|
|
39
|
-
async call(
|
|
39
|
+
async call(context, parameters) {
|
|
40
|
+
const body = await context.body();
|
|
41
|
+
const query = this.query(context);
|
|
40
42
|
const request = this.mapping.fit(body, query, parameters);
|
|
41
43
|
this.remote ??= await this.discovery;
|
|
44
|
+
if (context.debug)
|
|
45
|
+
console.debug('Call', `${this.remote.locator.id}.${this.endpoint}`, request);
|
|
42
46
|
const reply = await this.remote.invoke(this.endpoint, request);
|
|
43
47
|
if (reply instanceof Error)
|
|
44
|
-
throw new http.
|
|
45
|
-
const message = {
|
|
48
|
+
throw new http.UnprocessableEntity(reply);
|
|
49
|
+
const message = {};
|
|
46
50
|
if (typeof reply === 'object' && reply !== null && '_version' in reply) {
|
|
51
|
+
const etag = context.request.headers['if-none-match'];
|
|
47
52
|
message.headers ??= new Headers();
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
if (etag !== undefined && reply._version === this.version(etag)) {
|
|
54
|
+
message.status = 304;
|
|
55
|
+
message.headers.set('etag', etag);
|
|
56
|
+
return message;
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
message.headers.set('etag', `"${reply._version.toString()}"`);
|
|
50
60
|
}
|
|
61
|
+
message.body = reply;
|
|
51
62
|
return message;
|
|
52
63
|
}
|
|
53
64
|
async close() {
|
|
54
65
|
this.remote ??= await this.discovery;
|
|
55
66
|
await this.remote.disconnect(INTERRUPT);
|
|
56
67
|
}
|
|
68
|
+
query(context) {
|
|
69
|
+
const query = Object.fromEntries(context.url.searchParams);
|
|
70
|
+
const etag = context.request.headers['if-match'];
|
|
71
|
+
if (etag !== undefined)
|
|
72
|
+
query.version = this.version(etag);
|
|
73
|
+
return query;
|
|
74
|
+
}
|
|
75
|
+
version(etag) {
|
|
76
|
+
const match = etag.match(ETAG);
|
|
77
|
+
if (match === null)
|
|
78
|
+
throw new http.BadRequest('Invalid ETag.');
|
|
79
|
+
return Number.parseInt(match.groups.version);
|
|
80
|
+
}
|
|
57
81
|
}
|
|
58
82
|
exports.Endpoint = Endpoint;
|
|
59
83
|
class EndpointsFactory {
|
|
@@ -74,5 +98,6 @@ class EndpointsFactory {
|
|
|
74
98
|
}
|
|
75
99
|
}
|
|
76
100
|
exports.EndpointsFactory = EndpointsFactory;
|
|
101
|
+
const ETAG = /^"(?<version>\d{1,32})"$/;
|
|
77
102
|
const INTERRUPT = true;
|
|
78
103
|
//# sourceMappingURL=Endpoint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../source/Endpoint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAmC;AAEnC,6CAA8B;AAG9B,MAAa,QAAQ;IACF,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,SAAS,CAAoB;IACtC,MAAM,GAAqB,IAAI,CAAA;IAEvC,YAAoB,QAAgB,EAAE,OAAgB,EAAE,SAA6B;QACnF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../source/Endpoint.ts"],"names":[],"mappings":"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"}
|
package/transpiled/Factory.js
CHANGED
|
@@ -22,19 +22,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
25
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
29
|
exports.Factory = void 0;
|
|
30
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
31
|
+
const generic_1 = require("@toa.io/generic");
|
|
27
32
|
const Tenant_1 = require("./Tenant");
|
|
28
33
|
const Gateway_1 = require("./Gateway");
|
|
29
34
|
const Remotes_1 = require("./Remotes");
|
|
30
35
|
const RTD_1 = require("./RTD");
|
|
31
|
-
const HTTP_1 = require("./HTTP");
|
|
32
36
|
const Endpoint_1 = require("./Endpoint");
|
|
33
37
|
const directives_1 = require("./directives");
|
|
34
38
|
const Directive_1 = require("./Directive");
|
|
35
39
|
const Composition_1 = require("./Composition");
|
|
36
40
|
const root = __importStar(require("./root"));
|
|
37
41
|
const Interception_1 = require("./Interception");
|
|
42
|
+
const http = __importStar(require("./HTTP"));
|
|
38
43
|
class Factory {
|
|
39
44
|
boot;
|
|
40
45
|
constructor(boot) {
|
|
@@ -45,10 +50,10 @@ class Factory {
|
|
|
45
50
|
return new Tenant_1.Tenant(broadcast, locator, node);
|
|
46
51
|
}
|
|
47
52
|
service() {
|
|
48
|
-
|
|
49
|
-
const
|
|
53
|
+
node_assert_1.default.ok(process.env.TOA_EXPOSITION_PROPERTIES, 'TOA_EXPOSITION_PROPERTIES is undefined');
|
|
54
|
+
const options = (0, generic_1.decode)(process.env.TOA_EXPOSITION_PROPERTIES);
|
|
50
55
|
const broadcast = this.boot.bindings.broadcast(CHANNEL);
|
|
51
|
-
const server =
|
|
56
|
+
const server = http.Server.create({ ...options, methods: RTD_1.syntax.verbs });
|
|
52
57
|
const remotes = new Remotes_1.Remotes(this.boot);
|
|
53
58
|
const node = root.resolve();
|
|
54
59
|
const methods = new Endpoint_1.EndpointsFactory(remotes);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8DAAgC;AAChC,6CAAwC;AACxC,qCAAiC;AACjC,uCAAmC;AACnC,uCAAmC;AACnC,+BAAoC;AACpC,yCAA6C;AAC7C,6CAAqD;AACrD,2CAA+C;AAC/C,+CAA2C;AAC3C,6CAA8B;AAC9B,iDAA6C;AAC7C,6CAA8B;AAI9B,MAAa,OAAO;IACD,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEM,MAAM,CAAE,OAAgB,EAAE,IAAiB;QAChD,MAAM,SAAS,GAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;QAE9E,OAAO,IAAI,eAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAEM,OAAO;QACZ,qBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAC7C,wCAAwC,CAAC,CAAA;QAE3C,MAAM,OAAO,GAAG,IAAA,gBAAM,EAAe,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;QAC3E,MAAM,SAAS,GAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,YAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACxE,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,2BAAgB,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,6BAAiB,CAAC,qBAAQ,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAG,IAAI,2BAAY,CAAC,yBAAY,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,UAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QAEhD,MAAM,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;QAE1D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAEvB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAtCD,0BAsCC;AAED,MAAM,OAAO,GAAG,YAAY,CAAA"}
|
package/transpiled/Gateway.d.ts
CHANGED
|
@@ -3,18 +3,15 @@ import * as http from './HTTP';
|
|
|
3
3
|
import type { Interception } from './Interception';
|
|
4
4
|
import type { Tree } from './RTD';
|
|
5
5
|
import type { Label } from './discovery';
|
|
6
|
-
import type { Endpoint } from './Endpoint';
|
|
7
|
-
import type { Directives } from './Directive';
|
|
8
6
|
export declare class Gateway extends Connector {
|
|
9
7
|
private readonly broadcast;
|
|
10
8
|
private readonly tree;
|
|
11
9
|
private readonly interceptor;
|
|
12
|
-
constructor(broadcast: Broadcast, tree: Tree
|
|
10
|
+
constructor(broadcast: Broadcast, tree: Tree, interception: Interception);
|
|
13
11
|
process(context: http.Context): Promise<http.OutgoingMessage>;
|
|
14
12
|
protected open(): Promise<void>;
|
|
15
13
|
protected dispose(): void;
|
|
16
14
|
private call;
|
|
17
|
-
private query;
|
|
18
15
|
private discover;
|
|
19
16
|
private merge;
|
|
20
17
|
}
|