@toa.io/extensions.exposition 1.0.0-alpha.3 → 1.0.0-alpha.31
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 -6
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +21 -8
- 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 +20 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +3 -3
- 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 +2 -0
- package/components/identity.basic/source/authenticate.ts +16 -5
- package/components/identity.basic/source/incept.ts +32 -0
- package/components/identity.basic/source/transit.ts +7 -5
- package/components/identity.basic/source/types.ts +2 -0
- package/components/identity.federation/manifest.toa.yaml +28 -17
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +6 -5
- 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 +15 -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} +8 -3
- 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 +10 -9
- 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 +16 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +9 -4
- 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 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +32 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +19 -4
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +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 -6
- package/components/octets.storage/operations/store.js +1 -1
- package/documentation/access.md +27 -16
- package/documentation/authorities.md +53 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +52 -27
- package/documentation/identity.md +17 -22
- package/documentation/io.md +56 -0
- package/documentation/protocol.md +3 -0
- package/documentation/query.md +57 -8
- package/documentation/require.md +15 -0
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +14 -14
- package/entity.json +0 -0
- package/features/access.feature +83 -56
- 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 +5 -1
- package/features/cache.feature +78 -5
- package/features/cors.feature +6 -2
- package/features/debug.feature +34 -0
- package/features/directives.feature +5 -0
- package/features/dynamic.feature +18 -7
- package/features/errors.feature +19 -5
- package/features/etag.feature +103 -0
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +137 -14
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +61 -8
- package/features/identity.roles.feature +220 -4
- package/features/identity.tokens.feature +114 -4
- package/features/io.feature +205 -0
- package/features/octets.entries.feature +11 -1
- 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 +24 -4
- package/features/steps/IdP.ts +28 -23
- package/features/steps/components/echo/manifest.toa.yaml +5 -0
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
- package/features/streams.feature +1 -0
- package/features/timing.feature +69 -0
- package/features/vary.feature +105 -3
- package/package.json +12 -14
- package/readme.md +19 -13
- package/schemas/annotation.cos.yaml +2 -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/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +3 -2
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +7 -7
- package/source/Directive.ts +19 -46
- package/source/Endpoint.ts +55 -6
- package/source/Factory.ts +17 -9
- package/source/Gateway.ts +38 -53
- package/source/HTTP/Context.ts +89 -0
- package/source/HTTP/Server.ts +99 -121
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/exceptions.ts +7 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +32 -48
- package/source/Mapping.ts +12 -8
- 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 +33 -17
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/Authorization.ts +34 -21
- package/source/directives/auth/Delegate.ts +35 -0
- package/source/directives/auth/Incept.ts +13 -7
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +27 -17
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +5 -5
- package/source/directives/cache/Control.ts +48 -22
- package/source/directives/cache/types.ts +1 -1
- package/source/directives/cors/CORS.ts +18 -10
- 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 +5 -4
- package/source/directives/octets/Delete.ts +23 -11
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +33 -17
- package/source/directives/octets/List.ts +18 -8
- package/source/directives/octets/Octets.ts +9 -9
- package/source/directives/octets/Store.ts +29 -19
- package/source/directives/octets/Workflow.ts +12 -5
- package/source/directives/octets/types.ts +0 -7
- package/source/directives/octets/workflows/Workflow.ts +2 -2
- 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 +8 -6
- 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 +9 -7
- package/source/directives/vary/embeddings/Language.ts +2 -2
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +22 -11
- package/source/io.ts +2 -2
- package/source/root.ts +5 -0
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -2
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +8 -21
- package/transpiled/Directive.js +11 -14
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +60 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +11 -4
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +4 -8
- package/transpiled/Gateway.js +25 -35
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +31 -0
- package/transpiled/HTTP/Context.js +60 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +21 -9
- package/transpiled/HTTP/Server.js +98 -100
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/exceptions.d.ts +4 -1
- package/transpiled/HTTP/exceptions.js +7 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/index.d.ts +1 -0
- package/transpiled/HTTP/index.js +1 -0
- package/transpiled/HTTP/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +7 -21
- package/transpiled/HTTP/messages.js +24 -26
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Mapping.js +11 -8
- 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 -15
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +3 -4
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Authorization.d.ts +2 -3
- package/transpiled/directives/auth/Authorization.js +18 -11
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +29 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +13 -7
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +25 -17
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +3 -3
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +5 -4
- package/transpiled/directives/cache/Control.js +32 -15
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +1 -1
- package/transpiled/directives/cors/CORS.d.ts +2 -3
- package/transpiled/directives/cors/CORS.js +17 -10
- 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 -21
- 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 +4 -4
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +4 -3
- package/transpiled/directives/octets/Delete.js +22 -10
- 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 +4 -3
- package/transpiled/directives/octets/Fetch.js +31 -15
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +4 -3
- package/transpiled/directives/octets/List.js +16 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +4 -4
- package/transpiled/directives/octets/Octets.js +5 -5
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +4 -3
- package/transpiled/directives/octets/Store.js +20 -13
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +4 -3
- package/transpiled/directives/octets/Workflow.js +11 -4
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +0 -5
- package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js +2 -2
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Directive.d.ts +4 -0
- package/transpiled/directives/require/Directive.js +3 -0
- package/transpiled/directives/require/Directive.js.map +1 -0
- package/transpiled/directives/require/Headers.d.ts +7 -0
- package/transpiled/directives/require/Headers.js +19 -0
- package/transpiled/directives/require/Headers.js.map +1 -0
- package/transpiled/directives/require/Require.d.ts +9 -0
- package/transpiled/directives/require/Require.js +27 -0
- package/transpiled/directives/require/Require.js.map +1 -0
- package/transpiled/directives/require/index.d.ts +2 -0
- package/transpiled/directives/require/index.js +6 -0
- package/transpiled/directives/require/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +2 -1
- package/transpiled/directives/vary/Embed.d.ts +2 -1
- package/transpiled/directives/vary/Embed.js +8 -6
- package/transpiled/directives/vary/Embed.js.map +1 -1
- package/transpiled/directives/vary/Vary.d.ts +3 -3
- package/transpiled/directives/vary/Vary.js +4 -4
- 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 +9 -7
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Language.js +2 -2
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
- package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
- package/transpiled/directives/vary/embeddings/index.js +8 -4
- package/transpiled/directives/vary/embeddings/index.js.map +1 -1
- package/transpiled/exceptions.d.ts +3 -2
- package/transpiled/exceptions.js +13 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/io.d.ts +2 -2
- 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.fixtures.ts +0 -40
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Permute.ts +0 -37
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
- package/transpiled/HTTP/Server.fixtures.js +0 -31
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/octets/Permute.d.ts +0 -10
- package/transpiled/directives/octets/Permute.js.map +0 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { Readable } from 'node:stream'
|
|
1
2
|
import { generate } from 'randomstring'
|
|
2
3
|
import * as msgpack from 'msgpackr'
|
|
3
4
|
import { read } from './messages'
|
|
4
|
-
import { createRequest } from './Server.fixtures'
|
|
5
5
|
import { BadRequest, UnsupportedMediaType } from './exceptions'
|
|
6
|
+
import { Timing } from './Timing'
|
|
7
|
+
import type { Context } from './Context'
|
|
6
8
|
|
|
7
9
|
beforeEach(() => {
|
|
8
10
|
jest.clearAllMocks()
|
|
@@ -14,8 +16,8 @@ describe('read', () => {
|
|
|
14
16
|
const headers = { 'content-type': 'application/json' }
|
|
15
17
|
const input = { [generate()]: generate() }
|
|
16
18
|
const json = JSON.stringify(input)
|
|
17
|
-
const
|
|
18
|
-
const output = await read(
|
|
19
|
+
const context = createContext(path, headers, json)
|
|
20
|
+
const output = await read(context)
|
|
19
21
|
|
|
20
22
|
expect(output).toStrictEqual(input)
|
|
21
23
|
})
|
|
@@ -24,7 +26,7 @@ describe('read', () => {
|
|
|
24
26
|
const path = generate()
|
|
25
27
|
const headers = { 'content-type': 'application/yaml' }
|
|
26
28
|
const yaml = 'foo: 1'
|
|
27
|
-
const request =
|
|
29
|
+
const request = createContext(path, headers, yaml)
|
|
28
30
|
const value = await read(request)
|
|
29
31
|
|
|
30
32
|
expect(value).toStrictEqual({ foo: 1 })
|
|
@@ -35,7 +37,7 @@ describe('read', () => {
|
|
|
35
37
|
const headers = { 'content-type': 'application/msgpack' }
|
|
36
38
|
const input = { [generate()]: generate() }
|
|
37
39
|
const msg = msgpack.encode(input)
|
|
38
|
-
const request =
|
|
40
|
+
const request = createContext(path, headers, msg)
|
|
39
41
|
const output = await read(request)
|
|
40
42
|
|
|
41
43
|
expect(output).toStrictEqual(input)
|
|
@@ -45,7 +47,7 @@ describe('read', () => {
|
|
|
45
47
|
const path = generate()
|
|
46
48
|
const headers = { 'content-type': 'text/plain' }
|
|
47
49
|
const input = generate()
|
|
48
|
-
const request =
|
|
50
|
+
const request = createContext(path, headers, input)
|
|
49
51
|
const output = await read(request)
|
|
50
52
|
|
|
51
53
|
expect(output).toStrictEqual(input)
|
|
@@ -54,7 +56,7 @@ describe('read', () => {
|
|
|
54
56
|
it('should throw on unsupported request media type', async () => {
|
|
55
57
|
const path = generate()
|
|
56
58
|
const headers = { 'content-type': 'wtf/' + generate() }
|
|
57
|
-
const request =
|
|
59
|
+
const request = createContext(path, headers)
|
|
58
60
|
|
|
59
61
|
await expect(read(request)).rejects.toThrow(UnsupportedMediaType)
|
|
60
62
|
})
|
|
@@ -63,8 +65,25 @@ describe('read', () => {
|
|
|
63
65
|
const path = generate()
|
|
64
66
|
const text = '{ "foo": "val... oops '
|
|
65
67
|
const headers = { 'content-type': 'application/json' }
|
|
66
|
-
const request =
|
|
68
|
+
const request = createContext(path, headers, text)
|
|
67
69
|
|
|
68
70
|
await expect(read(request)).rejects.toThrow(BadRequest)
|
|
69
71
|
})
|
|
70
72
|
})
|
|
73
|
+
|
|
74
|
+
export function createContext
|
|
75
|
+
(url: string, headers: Record<string, string> = {}, content: string | Buffer = ''):
|
|
76
|
+
jest.MockedObject<Context> {
|
|
77
|
+
const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content)
|
|
78
|
+
const stream = Readable.from(buffer)
|
|
79
|
+
|
|
80
|
+
const mock: Partial<Context> = {
|
|
81
|
+
request: Object.assign(stream, {
|
|
82
|
+
url,
|
|
83
|
+
headers
|
|
84
|
+
}) as unknown as Context['request'],
|
|
85
|
+
timing: new Timing(false)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return mock as unknown as jest.MockedObject<Context>
|
|
89
|
+
}
|
package/source/HTTP/messages.ts
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import { type IncomingHttpHeaders } from 'node:http'
|
|
2
1
|
import { Readable } from 'node:stream'
|
|
3
|
-
import {
|
|
4
|
-
import { buffer } from '@toa.io/streams'
|
|
2
|
+
import { buffer } from 'node:stream/consumers'
|
|
5
3
|
import { formats } from './formats'
|
|
6
4
|
import { BadRequest, NotAcceptable, UnsupportedMediaType } from './exceptions'
|
|
7
|
-
import type {
|
|
8
|
-
import type
|
|
5
|
+
import type { Context } from './Context'
|
|
6
|
+
import type * as http from 'node:http'
|
|
9
7
|
|
|
10
8
|
export function write
|
|
11
|
-
(
|
|
12
|
-
for (const transform of
|
|
9
|
+
(context: Context, response: http.ServerResponse, message: OutgoingMessage): void {
|
|
10
|
+
for (const transform of context.pipelines.response)
|
|
13
11
|
transform(message)
|
|
14
12
|
|
|
15
|
-
message.headers?.forEach((value, key) => response.
|
|
13
|
+
message.headers?.forEach((value, key) => response.setHeader(key, value))
|
|
14
|
+
context.timing.append(response)
|
|
16
15
|
|
|
17
16
|
if (message.body instanceof Readable)
|
|
18
|
-
stream(message,
|
|
17
|
+
stream(message, context, response)
|
|
19
18
|
else
|
|
20
|
-
send(message,
|
|
19
|
+
send(message, context, response)
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
export async function read (
|
|
24
|
-
const type = request.headers['content-type']
|
|
22
|
+
export async function read (context: Context): Promise<any> {
|
|
23
|
+
const type = context.request.headers['content-type']
|
|
25
24
|
|
|
26
25
|
if (type === undefined)
|
|
27
26
|
return undefined
|
|
@@ -30,8 +29,7 @@ export async function read (request: Request): Promise<any> {
|
|
|
30
29
|
throw new UnsupportedMediaType()
|
|
31
30
|
|
|
32
31
|
const format = formats[type]
|
|
33
|
-
|
|
34
|
-
const buf = await buffer(request)
|
|
32
|
+
const buf = await context.timing.capture('buffer', buffer(context.request))
|
|
35
33
|
|
|
36
34
|
try {
|
|
37
35
|
return format.decode(buf)
|
|
@@ -40,32 +38,33 @@ export async function read (request: Request): Promise<any> {
|
|
|
40
38
|
}
|
|
41
39
|
}
|
|
42
40
|
|
|
43
|
-
function send
|
|
41
|
+
function send
|
|
42
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
44
43
|
if (message.body === undefined || message.body === null) {
|
|
45
44
|
response.end()
|
|
46
45
|
|
|
47
46
|
return
|
|
48
47
|
}
|
|
49
48
|
|
|
50
|
-
if (
|
|
49
|
+
if (context.encoder === null)
|
|
51
50
|
throw new NotAcceptable()
|
|
52
51
|
|
|
53
|
-
const buf =
|
|
52
|
+
const buf = context.encoder.encode(message.body)
|
|
54
53
|
|
|
55
54
|
response
|
|
56
|
-
.
|
|
57
|
-
.
|
|
55
|
+
.setHeader('content-type', context.encoder.type)
|
|
56
|
+
.appendHeader('vary', 'accept')
|
|
58
57
|
.end(buf)
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
function stream
|
|
62
|
-
(message: OutgoingMessage,
|
|
61
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
63
62
|
const encoded = message.headers !== undefined && message.headers.has('content-type')
|
|
64
63
|
|
|
65
64
|
if (encoded)
|
|
66
|
-
pipe(
|
|
65
|
+
message.body.pipe(response)
|
|
67
66
|
else
|
|
68
|
-
multipart(message,
|
|
67
|
+
multipart(message, context, response)
|
|
69
68
|
|
|
70
69
|
message.body.on('error', (e: Error) => {
|
|
71
70
|
console.error(e)
|
|
@@ -73,54 +72,39 @@ function stream
|
|
|
73
72
|
})
|
|
74
73
|
}
|
|
75
74
|
|
|
76
|
-
function
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function multipart (message: OutgoingMessage, request: IncomingMessage, response: Response): void {
|
|
82
|
-
if (request.encoder === null)
|
|
75
|
+
function multipart
|
|
76
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
77
|
+
if (context.encoder === null)
|
|
83
78
|
throw new NotAcceptable()
|
|
84
79
|
|
|
85
|
-
const encoder =
|
|
80
|
+
const encoder = context.encoder
|
|
86
81
|
|
|
87
|
-
response.
|
|
82
|
+
response.setHeader('content-type', `${encoder.multipart}; boundary=${BOUNDARY}`)
|
|
88
83
|
|
|
89
84
|
message.body
|
|
90
|
-
.map((part: unknown) => Buffer.concat([CUT, encoder.encode(part)]))
|
|
85
|
+
.map((part: unknown) => Buffer.concat([CUT, encoder.encode(part), CRLF]))
|
|
91
86
|
.on('end', () => response.end(FINALCUT))
|
|
92
87
|
.pipe(response)
|
|
93
88
|
}
|
|
94
89
|
|
|
95
90
|
const BOUNDARY = 'cut'
|
|
96
91
|
const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
|
|
92
|
+
const CRLF = Buffer.from('\r\n')
|
|
97
93
|
const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
|
|
98
94
|
|
|
99
|
-
export interface IncomingMessage extends Request {
|
|
100
|
-
method: string
|
|
101
|
-
path: string
|
|
102
|
-
url: string
|
|
103
|
-
headers: IncomingHttpHeaders
|
|
104
|
-
query: Query
|
|
105
|
-
parse: <T> () => Promise<T>
|
|
106
|
-
encoder: Format | null
|
|
107
|
-
subtype: string | null
|
|
108
|
-
pipelines: {
|
|
109
|
-
body: Array<(input: unknown) => unknown>
|
|
110
|
-
response: Array<(output: OutgoingMessage) => void>
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
95
|
export interface OutgoingMessage {
|
|
115
96
|
status?: number
|
|
116
97
|
headers?: Headers
|
|
117
98
|
body?: any
|
|
118
99
|
}
|
|
119
100
|
|
|
120
|
-
export interface Query
|
|
101
|
+
export interface Query {
|
|
102
|
+
[key: string]: string | number | undefined
|
|
103
|
+
|
|
121
104
|
id?: string
|
|
122
105
|
criteria?: string
|
|
123
106
|
sort?: string
|
|
124
107
|
omit?: string
|
|
125
108
|
limit?: string
|
|
109
|
+
version?: number
|
|
126
110
|
}
|
package/source/Mapping.ts
CHANGED
|
@@ -29,23 +29,27 @@ class QueryableMapping extends Mapping {
|
|
|
29
29
|
public fit (input: any, qs: http.Query, parameters: Parameter[]): core.Request {
|
|
30
30
|
const query = this.query.fit(qs, parameters)
|
|
31
31
|
|
|
32
|
-
return {
|
|
32
|
+
return {
|
|
33
|
+
input,
|
|
34
|
+
query
|
|
35
|
+
}
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
class InputMapping extends Mapping {
|
|
37
40
|
public fit (input: any, _: unknown, parameters: Parameter[]): core.Request {
|
|
41
|
+
const request: core.Request = {}
|
|
42
|
+
|
|
38
43
|
if (input === undefined && parameters.length > 0)
|
|
39
44
|
input = {}
|
|
40
45
|
|
|
41
|
-
if (typeof input === 'object')
|
|
42
|
-
|
|
46
|
+
if (typeof input === 'object' && input !== null)
|
|
47
|
+
for (const parameter of parameters)
|
|
48
|
+
input[parameter.name] = parameter.value
|
|
43
49
|
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
if (input !== undefined)
|
|
51
|
+
request.input = input
|
|
46
52
|
|
|
47
|
-
|
|
48
|
-
for (const parameter of parameters)
|
|
49
|
-
input[parameter.name] = parameter.value
|
|
53
|
+
return request
|
|
50
54
|
}
|
|
51
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>
|
package/source/RTD/Node.ts
CHANGED
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
import { type Route } from './Route'
|
|
2
2
|
import { type Methods } from './Method'
|
|
3
3
|
import { type Match, type Parameter } from './Match'
|
|
4
|
-
import { type Directives } from './Directives'
|
|
5
|
-
import { type Endpoint } from './Endpoint'
|
|
6
4
|
|
|
7
|
-
export class Node
|
|
8
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
9
|
-
TDirectives extends Directives<TDirectives> = any
|
|
10
|
-
> {
|
|
5
|
+
export class Node {
|
|
11
6
|
public intermediate: boolean
|
|
12
|
-
public methods: Methods
|
|
7
|
+
public methods: Methods
|
|
13
8
|
private readonly protected: boolean
|
|
14
9
|
private routes: Route[]
|
|
15
10
|
|
|
16
11
|
public constructor
|
|
17
|
-
(routes: Route[], methods: Methods
|
|
12
|
+
(routes: Route[], methods: Methods, properties: Properties) {
|
|
18
13
|
this.routes = routes
|
|
19
14
|
this.methods = methods
|
|
20
15
|
this.protected = properties.protected
|
|
@@ -34,26 +29,30 @@ export class Node<
|
|
|
34
29
|
return null
|
|
35
30
|
}
|
|
36
31
|
|
|
37
|
-
public merge (node: Node
|
|
32
|
+
public merge (node: Node): void {
|
|
38
33
|
this.intermediate = node.intermediate
|
|
39
34
|
|
|
40
|
-
if (!this.protected)
|
|
41
|
-
|
|
35
|
+
if (!this.protected)
|
|
36
|
+
this.replace(node)
|
|
37
|
+
else
|
|
38
|
+
this.append(node)
|
|
42
39
|
|
|
43
40
|
this.sort()
|
|
44
41
|
}
|
|
45
42
|
|
|
46
|
-
private replace (node: Node
|
|
43
|
+
private replace (node: Node): void {
|
|
47
44
|
const methods = Object.values(this.methods)
|
|
48
45
|
|
|
49
46
|
this.routes = node.routes
|
|
50
47
|
this.methods = node.methods
|
|
51
48
|
|
|
52
49
|
for (const method of methods)
|
|
53
|
-
void method.close()
|
|
50
|
+
void method.close()
|
|
51
|
+
|
|
52
|
+
// race condition is really unlikely
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
private append (node: Node
|
|
55
|
+
private append (node: Node): void {
|
|
57
56
|
for (const route of node.routes)
|
|
58
57
|
this.mergeRoute(route)
|
|
59
58
|
|
package/source/RTD/Tree.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { type Node } from './Node'
|
|
2
1
|
import { createNode } from './factory'
|
|
3
2
|
import { fragment } from './segment'
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
3
|
+
import type { Node } from './Node'
|
|
4
|
+
import type { Match } from './Match'
|
|
5
|
+
import type { Context } from './Context'
|
|
6
|
+
import type { DirectiveFactory } from './Directives'
|
|
7
|
+
import type { EndpointsFactory } from './Endpoint'
|
|
8
8
|
import type * as syntax from './syntax'
|
|
9
9
|
|
|
10
|
-
export class Tree
|
|
11
|
-
TEndpoint extends Endpoint<TEndpoint> = any,
|
|
12
|
-
TDirectives extends Directives<TDirectives> = any
|
|
13
|
-
> {
|
|
10
|
+
export class Tree {
|
|
14
11
|
private readonly root: syntax.Node
|
|
15
|
-
private readonly trunk: Node
|
|
16
|
-
private readonly endpoints: EndpointsFactory
|
|
17
|
-
private readonly directives:
|
|
12
|
+
private readonly trunk: Node
|
|
13
|
+
private readonly endpoints: EndpointsFactory
|
|
14
|
+
private readonly directives: DirectiveFactory
|
|
18
15
|
|
|
19
16
|
public constructor
|
|
20
|
-
(node: syntax.Node, endpoints: EndpointsFactory, directives:
|
|
17
|
+
(node: syntax.Node, endpoints: EndpointsFactory, directives: DirectiveFactory) {
|
|
21
18
|
this.endpoints = endpoints
|
|
22
19
|
this.directives = directives
|
|
23
20
|
this.trunk = this.createNode(node, PROTECTED)
|
|
24
21
|
this.root = node
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
public match (path: string): Match
|
|
24
|
+
public match (path: string): Match | null {
|
|
28
25
|
if (path === '/')
|
|
29
|
-
return {
|
|
26
|
+
return {
|
|
27
|
+
node: this.trunk,
|
|
28
|
+
parameters: []
|
|
29
|
+
}
|
|
30
30
|
|
|
31
31
|
const fragments = fragment(path)
|
|
32
32
|
|
|
@@ -39,7 +39,8 @@ export class Tree<
|
|
|
39
39
|
this.trunk.merge(branch)
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
private createNode
|
|
42
|
+
private createNode
|
|
43
|
+
(node: syntax.Node, protect: boolean, extension?: any): Node {
|
|
43
44
|
const context: Context = {
|
|
44
45
|
protected: protect,
|
|
45
46
|
endpoints: this.endpoints,
|
package/source/RTD/factory.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { Node, type Properties } from './Node'
|
|
2
2
|
import { Route } from './Route'
|
|
3
|
-
import { type Context } from './Context'
|
|
4
3
|
import { segment } from './segment'
|
|
5
4
|
import { Method, type Methods } from './Method'
|
|
6
|
-
import {
|
|
7
|
-
import { type Directives } from './Directives'
|
|
5
|
+
import type { Context } from './Context'
|
|
8
6
|
import type * as syntax from './syntax'
|
|
9
7
|
|
|
10
|
-
export function createNode
|
|
11
|
-
(node: syntax.Node, context: Context): Node<TEndpoint, TDirectives> {
|
|
8
|
+
export function createNode (node: syntax.Node, context: Context): Node {
|
|
12
9
|
if (node.isolated === true)
|
|
13
10
|
context.directives.stack = node.directives
|
|
14
11
|
else
|
|
@@ -36,7 +33,7 @@ function createRoute (route: syntax.Route, context: Context): Route {
|
|
|
36
33
|
}
|
|
37
34
|
|
|
38
35
|
function createMethod (method: syntax.Method, context: Context): Method {
|
|
39
|
-
const stack =
|
|
36
|
+
const stack = method.directives.concat(context.directives.stack)
|
|
40
37
|
const directives = context.directives.factory.create(stack)
|
|
41
38
|
|
|
42
39
|
const endpoint = method.mapping?.endpoint === undefined
|