@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
package/source/Gateway.ts
CHANGED
|
@@ -5,16 +5,13 @@ import type { Interception } from './Interception'
|
|
|
5
5
|
import type { Method, Parameter, Tree } from './RTD'
|
|
6
6
|
import type { Label } from './discovery'
|
|
7
7
|
import type { Branch } from './Branch'
|
|
8
|
-
import type { Endpoint } from './Endpoint'
|
|
9
|
-
import type { Directives } from './Directive'
|
|
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
|
|
14
12
|
private readonly interceptor: Interception
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
public constructor (broadcast: Broadcast, tree: Tree<Endpoint, Directives>, interception: Interception) {
|
|
14
|
+
public constructor (broadcast: Broadcast, tree: Tree, interception: Interception) {
|
|
18
15
|
super()
|
|
19
16
|
|
|
20
17
|
this.broadcast = broadcast
|
|
@@ -25,7 +22,7 @@ export class Gateway extends Connector {
|
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
public async process (context: http.Context): Promise<http.OutgoingMessage> {
|
|
28
|
-
const interception = await context.timing.capture('
|
|
25
|
+
const interception = await context.timing.capture('intercept',
|
|
29
26
|
this.interceptor.intercept(context))
|
|
30
27
|
|
|
31
28
|
if (interception !== null)
|
|
@@ -34,25 +31,23 @@ export class Gateway extends Connector {
|
|
|
34
31
|
const match = this.tree.match(context.url.pathname)
|
|
35
32
|
|
|
36
33
|
if (match === null)
|
|
37
|
-
throw new http.NotFound()
|
|
34
|
+
throw new http.NotFound('Route not found')
|
|
38
35
|
|
|
39
|
-
const {
|
|
40
|
-
node,
|
|
41
|
-
parameters
|
|
42
|
-
} = match
|
|
36
|
+
const { node, parameters } = match
|
|
43
37
|
|
|
44
38
|
if (!(context.request.method in node.methods))
|
|
45
39
|
throw new http.MethodNotAllowed()
|
|
46
40
|
|
|
47
41
|
const method = node.methods[context.request.method]
|
|
48
42
|
|
|
49
|
-
const interruption = await context.timing.capture('
|
|
50
|
-
method.directives.preflight(context, parameters))
|
|
43
|
+
const interruption = await context.timing.capture('preflight',
|
|
44
|
+
method.directives.preflight(context, parameters)).catch(rethrow)
|
|
51
45
|
|
|
52
46
|
const response = interruption ??
|
|
53
|
-
await context.timing.capture('
|
|
47
|
+
await context.timing.capture('call', this.call(method, context, parameters))
|
|
54
48
|
|
|
55
|
-
await context.timing.capture('
|
|
49
|
+
await context.timing.capture('settle',
|
|
50
|
+
method.directives.settle(context, response)).catch(rethrow)
|
|
56
51
|
|
|
57
52
|
return response
|
|
58
53
|
}
|
|
@@ -60,18 +55,16 @@ export class Gateway extends Connector {
|
|
|
60
55
|
protected override async open (): Promise<void> {
|
|
61
56
|
await this.discover()
|
|
62
57
|
|
|
63
|
-
console.info('Gateway has started and is awaiting resource branches
|
|
58
|
+
console.info('Gateway has started and is awaiting resource branches')
|
|
64
59
|
}
|
|
65
60
|
|
|
66
61
|
protected override dispose (): void {
|
|
67
|
-
console.info('Gateway is closed
|
|
62
|
+
console.info('Gateway is closed')
|
|
68
63
|
}
|
|
69
64
|
|
|
70
|
-
private async call
|
|
71
|
-
(method: Method<Endpoint, Directives>, context: http.Context, parameters: Parameter[]):
|
|
72
|
-
Promise<http.OutgoingMessage> {
|
|
65
|
+
private async call (method: Method, context: http.Context, parameters: Parameter[]): Promise<http.OutgoingMessage> {
|
|
73
66
|
if (context.url.pathname[context.url.pathname.length - 1] !== '/')
|
|
74
|
-
throw new http.NotFound('Trailing slash is required
|
|
67
|
+
throw new http.NotFound('Trailing slash is required')
|
|
75
68
|
|
|
76
69
|
if (context.encoder === null)
|
|
77
70
|
throw new http.NotAcceptable()
|
|
@@ -79,30 +72,11 @@ export class Gateway extends Connector {
|
|
|
79
72
|
if (method.endpoint === null)
|
|
80
73
|
throw new http.MethodNotAllowed()
|
|
81
74
|
|
|
82
|
-
const body = await context.body()
|
|
83
|
-
const query = this.query(context)
|
|
84
|
-
|
|
85
75
|
return await method.endpoint
|
|
86
|
-
.call(
|
|
76
|
+
.call(context, parameters)
|
|
87
77
|
.catch(rethrow) as http.OutgoingMessage
|
|
88
78
|
}
|
|
89
79
|
|
|
90
|
-
private query (context: http.Context): http.Query {
|
|
91
|
-
const query: http.Query = Object.fromEntries(context.url.searchParams)
|
|
92
|
-
const etag = context.request.headers['if-match']
|
|
93
|
-
|
|
94
|
-
if (etag !== undefined) {
|
|
95
|
-
const match = etag.match(ETAG)
|
|
96
|
-
|
|
97
|
-
if (match === null)
|
|
98
|
-
throw new http.BadRequest('Invalid ETag.')
|
|
99
|
-
else
|
|
100
|
-
query.version = parseInt(match.groups!.version)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return query
|
|
104
|
-
}
|
|
105
|
-
|
|
106
80
|
private async discover (): Promise<void> {
|
|
107
81
|
await this.broadcast.receive<Branch>('expose', this.merge.bind(this))
|
|
108
82
|
await this.broadcast.transmit<null>('ping', null)
|
|
@@ -113,13 +87,11 @@ export class Gateway extends Connector {
|
|
|
113
87
|
this.tree.merge(branch.node, branch)
|
|
114
88
|
|
|
115
89
|
console.info('Resource branch of ' +
|
|
116
|
-
`'${branch.namespace}.${branch.component}' has been merged
|
|
90
|
+
`'${branch.namespace}.${branch.component}' has been merged`)
|
|
117
91
|
} catch (exception) {
|
|
118
92
|
console.error(exception)
|
|
119
93
|
}
|
|
120
94
|
}
|
|
121
95
|
}
|
|
122
96
|
|
|
123
|
-
const ETAG = /^"(?<version>\d{1,32})"$/
|
|
124
|
-
|
|
125
97
|
export type Broadcast = bindings.Broadcast<Label>
|
package/source/HTTP/Context.ts
CHANGED
|
@@ -6,22 +6,29 @@ import type { OutgoingMessage } from './messages'
|
|
|
6
6
|
import type * as http from 'node:http'
|
|
7
7
|
|
|
8
8
|
export class Context {
|
|
9
|
+
public readonly authority: string
|
|
9
10
|
public readonly request: IncomingMessage
|
|
10
11
|
public readonly url: URL
|
|
11
12
|
public readonly subtype: string | null = null
|
|
12
13
|
public readonly encoder: Format | null = null
|
|
13
14
|
public readonly timing: Timing
|
|
15
|
+
public readonly debug: boolean
|
|
14
16
|
|
|
15
17
|
public readonly pipelines: Pipelines = {
|
|
16
18
|
body: [],
|
|
17
19
|
response: []
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
public constructor (request: IncomingMessage,
|
|
22
|
+
public constructor (authority: string, request: IncomingMessage, properties: Properties) {
|
|
23
|
+
this.authority = authority
|
|
21
24
|
this.request = request
|
|
22
25
|
|
|
23
26
|
this.url = new URL(request.url, `https://${request.headers.host}`)
|
|
24
|
-
this.timing = new Timing(trace)
|
|
27
|
+
this.timing = new Timing(properties.trace)
|
|
28
|
+
this.debug = properties.debug
|
|
29
|
+
|
|
30
|
+
if (this.debug)
|
|
31
|
+
this.log(request)
|
|
25
32
|
|
|
26
33
|
if (this.request.headers.accept !== undefined) {
|
|
27
34
|
const match = SUBTYPE.exec(this.request.headers.accept)
|
|
@@ -52,6 +59,16 @@ export class Context {
|
|
|
52
59
|
? value
|
|
53
60
|
: this.pipelines.body.reduce((value, transform) => transform(value), value)
|
|
54
61
|
}
|
|
62
|
+
|
|
63
|
+
private log (request: IncomingMessage): void {
|
|
64
|
+
const message = `${request.method} ${request.url}`
|
|
65
|
+
const { authorization, ...headers } = request.headers
|
|
66
|
+
|
|
67
|
+
if (authorization !== undefined)
|
|
68
|
+
headers.authorization = authorization.slice(0, authorization.indexOf(' '))
|
|
69
|
+
|
|
70
|
+
console.debug(message, headers)
|
|
71
|
+
}
|
|
55
72
|
}
|
|
56
73
|
|
|
57
74
|
export interface IncomingMessage extends http.IncomingMessage {
|
|
@@ -64,4 +81,9 @@ interface Pipelines {
|
|
|
64
81
|
response: Array<(output: OutgoingMessage) => void>
|
|
65
82
|
}
|
|
66
83
|
|
|
84
|
+
interface Properties {
|
|
85
|
+
debug: boolean
|
|
86
|
+
trace: boolean
|
|
87
|
+
}
|
|
88
|
+
|
|
67
89
|
const SUBTYPE = /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/
|
package/source/HTTP/Server.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import fs from 'node:fs'
|
|
2
2
|
import os from 'node:os'
|
|
3
3
|
import * as http from 'node:http'
|
|
4
|
-
import assert from 'node:assert'
|
|
5
4
|
import { once } from 'node:events'
|
|
5
|
+
import { setTimeout } from 'node:timers/promises'
|
|
6
6
|
import { Connector } from '@toa.io/core'
|
|
7
|
-
import { promex } from '@toa.io/generic'
|
|
8
7
|
import { type OutgoingMessage, write } from './messages'
|
|
9
8
|
import { ClientError, Exception } from './exceptions'
|
|
10
9
|
import { Context } from './Context'
|
|
@@ -13,32 +12,22 @@ import type { IncomingMessage } from './Context'
|
|
|
13
12
|
export class Server extends Connector {
|
|
14
13
|
private readonly server: http.Server = http.createServer()
|
|
15
14
|
private readonly properties: Properties
|
|
15
|
+
private readonly authorities: Record<string, string>
|
|
16
16
|
private process?: Processing
|
|
17
|
+
private ready: boolean = false
|
|
18
|
+
private startedAt: number = 0
|
|
17
19
|
|
|
18
20
|
private constructor (properties: Properties) {
|
|
19
21
|
super()
|
|
20
22
|
|
|
21
23
|
this.properties = properties
|
|
24
|
+
this.authorities = Object.fromEntries(Object.entries(properties.authorities).map(([key, value]) => [value, key]))
|
|
22
25
|
|
|
23
26
|
this.server.on('request', (req, res) => this.listener(req, res))
|
|
24
27
|
}
|
|
25
28
|
|
|
26
|
-
public
|
|
27
|
-
|
|
28
|
-
return this.properties.port
|
|
29
|
-
|
|
30
|
-
const address = this.server.address()
|
|
31
|
-
|
|
32
|
-
if (address === null || typeof address === 'string')
|
|
33
|
-
throw new Error('Server is not listening on a port.')
|
|
34
|
-
|
|
35
|
-
return address.port
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public static create (options?: Partial<Properties>): Server {
|
|
39
|
-
const properties = options === undefined
|
|
40
|
-
? DEFAULTS
|
|
41
|
-
: { ...DEFAULTS, ...options }
|
|
29
|
+
public static create (options: Options): Server {
|
|
30
|
+
const properties: Properties = Object.assign({}, DEFAULTS, options)
|
|
42
31
|
|
|
43
32
|
return new Server(properties)
|
|
44
33
|
}
|
|
@@ -48,21 +37,29 @@ export class Server extends Connector {
|
|
|
48
37
|
}
|
|
49
38
|
|
|
50
39
|
protected override async open (): Promise<void> {
|
|
40
|
+
this.startedAt = Date.now()
|
|
51
41
|
this.server.listen(this.properties.port)
|
|
52
42
|
|
|
53
43
|
await once(this.server, 'listening')
|
|
54
44
|
|
|
55
|
-
console.info('HTTP Server is listening
|
|
45
|
+
console.info('HTTP Server is listening')
|
|
46
|
+
|
|
47
|
+
await setTimeout(this.properties.delay)
|
|
48
|
+
|
|
49
|
+
this.ready = true
|
|
50
|
+
|
|
51
|
+
console.info('Ready')
|
|
56
52
|
}
|
|
57
53
|
|
|
58
54
|
protected override async close (): Promise<void> {
|
|
59
55
|
this.server.close()
|
|
56
|
+
this.ready = false
|
|
60
57
|
|
|
61
|
-
console.info('HTTP Server stopped accepting new connections
|
|
58
|
+
console.info('HTTP Server stopped accepting new connections')
|
|
62
59
|
|
|
63
60
|
await once(this.server, 'close')
|
|
64
61
|
|
|
65
|
-
console.info('HTTP Server has been stopped
|
|
62
|
+
console.info('HTTP Server has been stopped')
|
|
66
63
|
}
|
|
67
64
|
|
|
68
65
|
private listener (request: http.IncomingMessage, response: http.ServerResponse): void {
|
|
@@ -72,18 +69,28 @@ export class Server extends Connector {
|
|
|
72
69
|
return
|
|
73
70
|
}
|
|
74
71
|
|
|
75
|
-
if (request.url ===
|
|
76
|
-
|
|
72
|
+
if (request.url === '/.ready') {
|
|
73
|
+
if (this.ready)
|
|
74
|
+
response.writeHead(200, { 'cache-control': 'no-store' }).end()
|
|
75
|
+
else {
|
|
76
|
+
const remaining = (Math.ceil((Date.now() - this.startedAt) / 1000)).toString()
|
|
77
|
+
|
|
78
|
+
response.writeHead(503, { 'retry-after': remaining }).end()
|
|
79
|
+
}
|
|
77
80
|
|
|
78
81
|
return
|
|
79
82
|
}
|
|
80
83
|
|
|
81
|
-
|
|
82
|
-
'
|
|
84
|
+
if (request.headers.host === undefined || !(request.headers.host in this.authorities)) {
|
|
85
|
+
response.writeHead(404).end('Unknown authority')
|
|
86
|
+
|
|
87
|
+
return
|
|
88
|
+
}
|
|
83
89
|
|
|
84
|
-
const
|
|
90
|
+
const authority = this.authorities[request.headers.host]
|
|
91
|
+
const context = new Context(authority, request as IncomingMessage, this.properties)
|
|
85
92
|
|
|
86
|
-
this.process(context)
|
|
93
|
+
this.process!(context)
|
|
87
94
|
.then(this.success(context, response))
|
|
88
95
|
.catch(this.fail(context, response))
|
|
89
96
|
}
|
|
@@ -102,7 +109,7 @@ export class Server extends Connector {
|
|
|
102
109
|
else
|
|
103
110
|
status = 200
|
|
104
111
|
|
|
105
|
-
response.statusCode = status
|
|
112
|
+
response.statusCode = message.status = status
|
|
106
113
|
write(context, response, message)
|
|
107
114
|
}
|
|
108
115
|
}
|
|
@@ -112,17 +119,16 @@ export class Server extends Connector {
|
|
|
112
119
|
if (!context.request.complete)
|
|
113
120
|
await adam(context.request)
|
|
114
121
|
|
|
115
|
-
response.statusCode = exception instanceof Exception
|
|
116
|
-
? exception.status
|
|
117
|
-
: 500
|
|
122
|
+
response.statusCode = exception instanceof Exception ? exception.status : 500
|
|
118
123
|
|
|
119
|
-
const message: OutgoingMessage = {}
|
|
124
|
+
const message: OutgoingMessage = { status: response.statusCode }
|
|
120
125
|
const verbose = exception instanceof ClientError || this.properties.debug
|
|
121
126
|
|
|
122
127
|
if (verbose)
|
|
123
|
-
message.body =
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
message.body =
|
|
129
|
+
exception instanceof Exception
|
|
130
|
+
? exception.body
|
|
131
|
+
: exception.stack ?? exception.message
|
|
126
132
|
|
|
127
133
|
write(context, response, message)
|
|
128
134
|
}
|
|
@@ -130,29 +136,36 @@ export class Server extends Connector {
|
|
|
130
136
|
}
|
|
131
137
|
|
|
132
138
|
// https://github.com/whatwg/fetch/issues/1254
|
|
133
|
-
async function adam (request: http.IncomingMessage): Promise<
|
|
134
|
-
const completed = promex()
|
|
139
|
+
async function adam (request: http.IncomingMessage): Promise<any> {
|
|
135
140
|
const devnull = fs.createWriteStream(os.devNull)
|
|
136
141
|
|
|
137
|
-
request
|
|
138
|
-
.on('end', completed.callback)
|
|
139
|
-
.pipe(devnull)
|
|
142
|
+
request.pipe(devnull)
|
|
140
143
|
|
|
141
|
-
return
|
|
144
|
+
return once(request, 'end')
|
|
142
145
|
}
|
|
143
146
|
|
|
144
|
-
const
|
|
147
|
+
export const PORT = 8000
|
|
148
|
+
export const DELAY = 3 // seconds
|
|
149
|
+
|
|
150
|
+
const DEFAULTS: Omit<Properties, 'authorities'> = {
|
|
145
151
|
methods: new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
|
|
146
152
|
debug: false,
|
|
147
153
|
trace: false,
|
|
148
|
-
port:
|
|
154
|
+
port: PORT,
|
|
155
|
+
delay: DELAY * 1000
|
|
149
156
|
}
|
|
150
157
|
|
|
151
158
|
interface Properties {
|
|
159
|
+
authorities: Record<string, string>
|
|
152
160
|
methods: Set<string>
|
|
153
161
|
debug: boolean
|
|
154
162
|
trace: boolean
|
|
155
163
|
port: number
|
|
164
|
+
delay: number
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type Options = { authorities: Properties['authorities'] } & {
|
|
168
|
+
[K in Exclude<keyof Properties, 'authorities'>]?: Properties[K]
|
|
156
169
|
}
|
|
157
170
|
|
|
158
171
|
export type Processing = (input: Context) => Promise<OutgoingMessage>
|
|
@@ -37,11 +37,17 @@ export class NotFound extends ClientError {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
export class Conflict extends ClientError {
|
|
40
|
-
public constructor (body
|
|
40
|
+
public constructor (body?: any) {
|
|
41
41
|
super(409, body)
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
export class UnprocessableEntity extends ClientError {
|
|
46
|
+
public constructor (body?: any) {
|
|
47
|
+
super(422, body)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
45
51
|
export class MethodNotAllowed extends ClientError {
|
|
46
52
|
public constructor () {
|
|
47
53
|
super(405)
|
package/source/HTTP/messages.ts
CHANGED
|
@@ -29,7 +29,7 @@ export async function read (context: Context): Promise<any> {
|
|
|
29
29
|
throw new UnsupportedMediaType()
|
|
30
30
|
|
|
31
31
|
const format = formats[type]
|
|
32
|
-
const buf = await context.timing.capture('
|
|
32
|
+
const buf = await context.timing.capture('buffer', buffer(context.request))
|
|
33
33
|
|
|
34
34
|
try {
|
|
35
35
|
return format.decode(buf)
|
package/source/Mapping.ts
CHANGED
|
@@ -38,6 +38,8 @@ class QueryableMapping extends Mapping {
|
|
|
38
38
|
|
|
39
39
|
class InputMapping extends Mapping {
|
|
40
40
|
public fit (input: any, _: unknown, parameters: Parameter[]): core.Request {
|
|
41
|
+
const request: core.Request = {}
|
|
42
|
+
|
|
41
43
|
if (input === undefined && parameters.length > 0)
|
|
42
44
|
input = {}
|
|
43
45
|
|
|
@@ -45,6 +47,9 @@ class InputMapping extends Mapping {
|
|
|
45
47
|
for (const parameter of parameters)
|
|
46
48
|
input[parameter.name] = parameter.value
|
|
47
49
|
|
|
48
|
-
|
|
50
|
+
if (input !== undefined)
|
|
51
|
+
request.input = input
|
|
52
|
+
|
|
53
|
+
return request
|
|
49
54
|
}
|
|
50
55
|
}
|
package/source/Query.test.ts
CHANGED
|
@@ -16,7 +16,7 @@ it('should combine request criteria', async () => {
|
|
|
16
16
|
const instance = new Query(query)
|
|
17
17
|
const result = instance.fit({ criteria: 'qux==4' }, parameters)
|
|
18
18
|
|
|
19
|
-
expect(result.criteria).toStrictEqual('(
|
|
19
|
+
expect(result.criteria).toStrictEqual('(bar==2;baz==3);(foo==1);(qux==4)')
|
|
20
20
|
})
|
|
21
21
|
|
|
22
22
|
it('should set id parameter as query.id', async () => {
|
package/source/Query.ts
CHANGED
|
@@ -7,13 +7,20 @@ import type * as core from '@toa.io/core'
|
|
|
7
7
|
export class Query {
|
|
8
8
|
private readonly query: syntax.Query
|
|
9
9
|
private readonly closed: boolean = false
|
|
10
|
+
private readonly prepend: ',' | ';' = ';'
|
|
10
11
|
|
|
11
12
|
public constructor (query: syntax.Query) {
|
|
12
13
|
if (query.criteria !== undefined) {
|
|
13
|
-
|
|
14
|
+
if (query.criteria.endsWith(';'))
|
|
15
|
+
query.criteria = query.criteria.slice(0, -1)
|
|
16
|
+
else
|
|
17
|
+
this.closed = true
|
|
14
18
|
|
|
15
|
-
if (
|
|
16
|
-
|
|
19
|
+
if (query.criteria.startsWith(',') || query.criteria.startsWith(';')) {
|
|
20
|
+
this.prepend = query.criteria[0] as ',' | ';'
|
|
21
|
+
|
|
22
|
+
query.criteria = query.criteria.slice(1)
|
|
23
|
+
}
|
|
17
24
|
}
|
|
18
25
|
|
|
19
26
|
this.query = query
|
|
@@ -33,11 +40,7 @@ export class Query {
|
|
|
33
40
|
}
|
|
34
41
|
|
|
35
42
|
private fitCriteria (query: http.Query, parameters: Parameter[]): void {
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
if (this.query.criteria !== undefined)
|
|
39
|
-
criteria.push(this.query.criteria)
|
|
40
|
-
|
|
43
|
+
const groups: CriteriaGroup[] = []
|
|
41
44
|
const idx = parameters.findIndex((parameter) => parameter.name === 'id')
|
|
42
45
|
|
|
43
46
|
if (idx !== -1) {
|
|
@@ -47,27 +50,28 @@ export class Query {
|
|
|
47
50
|
}
|
|
48
51
|
|
|
49
52
|
if (parameters.length > 0) {
|
|
50
|
-
const
|
|
53
|
+
const criteria = parameters
|
|
51
54
|
.map(({ name, value }) => `${name}==${value}`)
|
|
52
55
|
.join(';')
|
|
53
56
|
|
|
54
|
-
|
|
57
|
+
groups.push({ criteria, operator: this.prepend })
|
|
55
58
|
}
|
|
56
59
|
|
|
60
|
+
if (this.query.criteria !== undefined)
|
|
61
|
+
groups.push({ criteria: this.query.criteria, operator: ';' })
|
|
62
|
+
|
|
57
63
|
if (query.criteria !== undefined)
|
|
58
|
-
if (this.closed)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
break
|
|
70
|
-
}
|
|
64
|
+
if (this.closed)
|
|
65
|
+
throw new http.BadRequest('Query criteria is closed')
|
|
66
|
+
else
|
|
67
|
+
groups.push({ criteria: query.criteria, operator: WHATEVER })
|
|
68
|
+
|
|
69
|
+
if (groups.length > 0)
|
|
70
|
+
query.criteria = groups.reduce((acc, { criteria, operator }, i) => {
|
|
71
|
+
return i === groups.length - 1
|
|
72
|
+
? `${acc}(${criteria})`
|
|
73
|
+
: `${acc}(${criteria})${operator}`
|
|
74
|
+
}, '')
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
private fitRanges (qs: http.Query): void {
|
|
@@ -99,7 +103,14 @@ function fit (string: string, range: [number, number], name: string): number {
|
|
|
99
103
|
|
|
100
104
|
if (number < range[0] || number > range[1])
|
|
101
105
|
throw new http.BadRequest(`Query ${name} must be between ` +
|
|
102
|
-
`${range[0]} and ${range[1]} inclusive
|
|
106
|
+
`${range[0]} and ${range[1]} inclusive`)
|
|
103
107
|
|
|
104
108
|
return number
|
|
105
109
|
}
|
|
110
|
+
|
|
111
|
+
const WHATEVER = ';'
|
|
112
|
+
|
|
113
|
+
interface CriteriaGroup {
|
|
114
|
+
criteria: string
|
|
115
|
+
operator: ',' | ';'
|
|
116
|
+
}
|
package/source/RTD/Context.ts
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type
|
|
1
|
+
import { type DirectiveFactory } from './Directives'
|
|
2
|
+
import { type EndpointsFactory } from './Endpoint'
|
|
3
|
+
import type { Directive } from './syntax'
|
|
3
4
|
|
|
4
|
-
export interface Context<
|
|
5
|
-
TEndpoint extends Endpoint = any,
|
|
6
|
-
TDirectives extends Directives<TDirectives> = any,
|
|
7
|
-
TExtension = any
|
|
8
|
-
> {
|
|
5
|
+
export interface Context<TExtension = any> {
|
|
9
6
|
readonly protected: boolean
|
|
10
|
-
readonly endpoints: EndpointsFactory
|
|
7
|
+
readonly endpoints: EndpointsFactory
|
|
11
8
|
readonly directives: {
|
|
12
|
-
readonly factory:
|
|
13
|
-
stack:
|
|
9
|
+
readonly factory: DirectiveFactory
|
|
10
|
+
stack: Directive[]
|
|
14
11
|
}
|
|
15
12
|
readonly extension?: TExtension
|
|
16
13
|
}
|
package/source/RTD/Directives.ts
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
|
+
import type { Parameter } from './Match'
|
|
1
2
|
import type * as syntax from './syntax'
|
|
3
|
+
import type { Context, OutgoingMessage } from '../HTTP'
|
|
4
|
+
import type { Output } from '../io'
|
|
2
5
|
|
|
3
|
-
export interface Directives
|
|
4
|
-
|
|
6
|
+
export interface Directives {
|
|
7
|
+
preflight: (context: Context, parameters: Parameter[]) => Promise<Output>
|
|
8
|
+
settle: (context: Context, response: OutgoingMessage) => Promise<void>
|
|
5
9
|
}
|
|
6
10
|
|
|
7
|
-
export interface
|
|
8
|
-
create: (directives: syntax.Directive[]) =>
|
|
11
|
+
export interface DirectiveFactory {
|
|
12
|
+
create: (directives: syntax.Directive[]) => Directives
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface DirectiveSet {
|
|
16
|
+
family: DirectiveFamily
|
|
17
|
+
directives: any[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface DirectiveFamily<TDirective = any, TExtension = any> {
|
|
21
|
+
readonly name: string
|
|
22
|
+
readonly mandatory: boolean
|
|
23
|
+
|
|
24
|
+
create: (name: string, ...rest: any[]) => TDirective
|
|
25
|
+
|
|
26
|
+
preflight?: (directives: TDirective[],
|
|
27
|
+
request: Context & TExtension,
|
|
28
|
+
parameters: Parameter[]) => Output | Promise<Output>
|
|
29
|
+
|
|
30
|
+
settle?: (directives: TDirective[],
|
|
31
|
+
request: Context & TExtension,
|
|
32
|
+
response: OutgoingMessage) => void | Promise<void>
|
|
9
33
|
}
|
package/source/RTD/Endpoint.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type Context } from './Context'
|
|
2
|
+
import type * as http from '../HTTP'
|
|
2
3
|
import type * as syntax from './syntax'
|
|
4
|
+
import type * as RTD from './index'
|
|
3
5
|
|
|
4
|
-
export interface Endpoint
|
|
5
|
-
call:
|
|
6
|
+
export interface Endpoint {
|
|
7
|
+
call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
|
|
6
8
|
close: () => Promise<void>
|
|
7
9
|
}
|
|
8
10
|
|
|
9
|
-
export interface EndpointsFactory
|
|
10
|
-
create: (method: syntax.Method, context: Context) =>
|
|
11
|
+
export interface EndpointsFactory {
|
|
12
|
+
create: (method: syntax.Method, context: Context) => Endpoint
|
|
11
13
|
}
|
package/source/RTD/Match.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { type Node } from './Node'
|
|
2
|
-
import { type Directives } from './Directives'
|
|
3
|
-
import { type Endpoint } from './Endpoint'
|
|
4
2
|
|
|
5
|
-
export interface Match
|
|
6
|
-
|
|
7
|
-
TDirectives extends Directives<TDirectives> = any
|
|
8
|
-
> {
|
|
9
|
-
node: Node<TEndpoint, TDirectives>
|
|
3
|
+
export interface Match {
|
|
4
|
+
node: Node
|
|
10
5
|
parameters: Parameter[]
|
|
11
6
|
}
|
|
12
7
|
|
package/source/RTD/Method.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Endpoint } from './Endpoint'
|
|
2
|
+
import type { Directives } from './Directives'
|
|
3
3
|
|
|
4
|
-
export class Method
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
> {
|
|
8
|
-
public readonly endpoint: TEndpoint | null
|
|
9
|
-
public readonly directives: TDirectives
|
|
4
|
+
export class Method {
|
|
5
|
+
public readonly endpoint: Endpoint | null
|
|
6
|
+
public readonly directives: Directives
|
|
10
7
|
|
|
11
|
-
public constructor (endpoint:
|
|
8
|
+
public constructor (endpoint: Endpoint | null, directives: Directives) {
|
|
12
9
|
this.endpoint = endpoint
|
|
13
10
|
this.directives = directives
|
|
14
11
|
}
|
|
@@ -18,7 +15,4 @@ export class Method<
|
|
|
18
15
|
}
|
|
19
16
|
}
|
|
20
17
|
|
|
21
|
-
export type Methods<
|
|
22
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
23
|
-
TDirectives extends Directives<TDirectives> = any
|
|
24
|
-
> = Record<string, Method<TEndpoint, TDirectives>>
|
|
18
|
+
export type Methods = Record<string, Method>
|