@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.toa.yaml +12 -0
- package/components/identity.bans/manifest.toa.yaml +2 -1
- package/components/identity.basic/manifest.toa.yaml +5 -1
- package/components/identity.basic/operations/authenticate.js +1 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/source/authenticate.ts +0 -1
- package/components/identity.federation/events/principal.js +22 -0
- package/components/identity.federation/manifest.toa.yaml +94 -0
- package/components/identity.federation/operations/authenticate.d.ts +3 -0
- package/components/identity.federation/operations/authenticate.js +20 -0
- package/components/identity.federation/operations/authenticate.js.map +1 -0
- package/components/identity.federation/operations/create.d.ts +10 -0
- package/components/identity.federation/operations/create.js +15 -0
- package/components/identity.federation/operations/create.js.map +1 -0
- package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
- package/components/identity.federation/operations/lib/jwt.js +136 -0
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +59 -0
- package/components/identity.federation/operations/schemas.js +9 -0
- package/components/identity.federation/operations/schemas.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.federation/operations/types.d.ts +51 -0
- package/components/identity.federation/operations/types.js +3 -0
- package/components/identity.federation/operations/types.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +28 -0
- package/components/identity.federation/source/create.ts +26 -0
- package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/lib/jwt.ts +171 -0
- package/components/identity.federation/source/schemas.ts +61 -0
- package/components/identity.federation/source/types.ts +56 -0
- package/components/identity.federation/tsconfig.json +9 -0
- package/components/identity.roles/manifest.toa.yaml +17 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +20 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +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 +31 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +1 -1
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/octets.storage/manifest.toa.yaml +1 -0
- package/components/octets.storage/operations/store.js +3 -3
- package/cucumber.js +0 -1
- package/documentation/access.md +11 -11
- package/documentation/components.md +48 -12
- package/documentation/identity.md +14 -7
- package/documentation/io.md +56 -0
- package/documentation/octets.md +102 -37
- package/documentation/protocol.md +21 -1
- package/documentation/query.md +51 -6
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +69 -0
- package/features/access.feature +13 -2
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +3 -0
- package/features/cors.feature +72 -0
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +4 -3
- package/features/etag.feature +97 -0
- package/features/identity.basic.feature +68 -0
- package/features/identity.feature +19 -3
- package/features/identity.federation.feature +153 -0
- package/features/identity.roles.feature +151 -0
- package/features/identity.tokens.feature +3 -0
- package/features/io.feature +167 -0
- package/features/octets.entries.feature +123 -0
- package/features/octets.feature +4 -28
- package/features/octets.meta.feature +66 -0
- package/features/octets.workflows.feature +177 -4
- package/features/queries.feature +9 -1
- package/features/response.feature +68 -0
- package/features/routes.feature +54 -10
- package/features/steps/Captures.ts +6 -0
- package/features/steps/Components.ts +18 -6
- package/features/steps/Database.ts +1 -1
- package/features/steps/Gateway.ts +4 -2
- package/features/steps/HTTP.ts +34 -6
- package/features/steps/IdP.ts +149 -0
- package/features/steps/Parameters.ts +8 -2
- package/features/steps/Workspace.ts +5 -7
- package/features/steps/components/echo/manifest.toa.yaml +1 -0
- package/features/steps/components/echo/operations/error.js +11 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
- package/features/steps/components/octets.tester/operations/concat.js +7 -0
- package/features/steps/components/octets.tester/operations/echo.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users/manifest.toa.yaml +4 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
- package/features/steps/tsconfig.json +1 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +180 -0
- package/package.json +16 -20
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/schemas/octets/delete.cos.yaml +2 -1
- package/schemas/octets/list.cos.yaml +2 -1
- package/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +14 -8
- package/source/Directive.ts +26 -49
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +23 -12
- package/source/Gateway.ts +45 -42
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +61 -134
- package/source/HTTP/Server.ts +83 -87
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/formats/msgpack.ts +9 -6
- package/source/HTTP/formats/text.ts +1 -1
- package/source/HTTP/formats/yaml.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +38 -42
- package/source/Interception.ts +24 -0
- package/source/Mapping.ts +7 -8
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +19 -15
- package/source/RTD/factory.ts +2 -5
- package/source/RTD/syntax/parse.ts +6 -6
- package/source/RTD/syntax/types.ts +1 -1
- package/source/deployment.ts +7 -2
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
- package/source/directives/auth/Delegate.ts +32 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.ts +5 -3
- package/source/directives/auth/Rule.ts +2 -2
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/index.ts +2 -2
- package/source/directives/auth/schemes.ts +2 -1
- package/source/directives/auth/types.ts +9 -6
- package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
- package/source/directives/cache/Control.ts +5 -5
- package/source/directives/cache/index.ts +2 -2
- package/source/directives/cache/types.ts +2 -2
- package/source/directives/cors/CORS.ts +62 -0
- package/source/directives/cors/index.ts +3 -0
- package/source/directives/dev/{Family.ts → Development.ts} +4 -5
- package/source/directives/dev/Stub.ts +4 -4
- package/source/directives/dev/Throw.ts +4 -4
- package/source/directives/dev/index.ts +2 -2
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/index.ts +11 -6
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +6 -5
- package/source/directives/octets/Delete.ts +64 -11
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +44 -29
- package/source/directives/octets/List.ts +50 -10
- package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
- package/source/directives/octets/Permute.ts +18 -11
- package/source/directives/octets/Store.ts +70 -102
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/index.ts +2 -2
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +13 -6
- package/source/directives/octets/types.ts +2 -8
- package/source/directives/octets/workflows/Execution.ts +76 -0
- package/source/directives/octets/workflows/Workflow.ts +37 -0
- package/source/directives/octets/workflows/index.ts +1 -0
- package/source/directives/vary/Directive.ts +6 -0
- package/source/directives/vary/Embed.ts +62 -0
- package/source/directives/vary/Properties.ts +17 -0
- package/source/directives/vary/Vary.ts +48 -0
- package/source/directives/vary/embeddings/Embedding.ts +6 -0
- package/source/directives/vary/embeddings/Header.ts +32 -0
- package/source/directives/vary/embeddings/Language.ts +31 -0
- package/source/directives/vary/embeddings/index.ts +11 -0
- package/source/directives/vary/index.ts +3 -0
- package/source/exceptions.ts +13 -9
- package/source/io.ts +4 -0
- package/source/manifest.test.ts +6 -14
- package/source/manifest.ts +9 -6
- package/source/root.ts +5 -0
- package/source/schemas.ts +7 -3
- package/transpiled/Annotation.d.ts +1 -0
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +11 -25
- package/transpiled/Directive.js +17 -18
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +58 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +0 -1
- package/transpiled/Factory.js +14 -7
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +7 -8
- package/transpiled/Gateway.js +25 -25
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +10 -7
- package/transpiled/HTTP/Server.js +80 -70
- 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/formats/msgpack.d.ts +2 -2
- package/transpiled/HTTP/formats/msgpack.js +8 -29
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.d.ts +3 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +1 -1
- package/transpiled/HTTP/formats/yaml.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 -16
- package/transpiled/HTTP/messages.js +28 -25
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Mapping.js +7 -7
- package/transpiled/Mapping.js.map +1 -1
- 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/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +5 -0
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/deployment.js +6 -2
- 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/{Family.d.ts → Authorization.d.ts} +4 -5
- package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
- package/transpiled/directives/auth/Authorization.js.map +1 -0
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +27 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +11 -6
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.js +5 -3
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.d.ts +2 -2
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/index.d.ts +2 -2
- package/transpiled/directives/auth/index.js +4 -5
- package/transpiled/directives/auth/index.js.map +1 -1
- package/transpiled/directives/auth/schemes.js +2 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +4 -4
- package/transpiled/directives/cache/Cache.d.ts +11 -0
- package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
- package/transpiled/directives/cache/Cache.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +3 -3
- package/transpiled/directives/cache/Control.js +3 -3
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/index.d.ts +2 -2
- package/transpiled/directives/cache/index.js +4 -5
- package/transpiled/directives/cache/index.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +2 -2
- package/transpiled/directives/cors/CORS.d.ts +10 -0
- package/transpiled/directives/cors/CORS.js +51 -0
- package/transpiled/directives/cors/CORS.js.map +1 -0
- package/transpiled/directives/cors/index.d.ts +2 -0
- package/transpiled/directives/cors/index.js +6 -0
- package/transpiled/directives/cors/index.js.map +1 -0
- package/transpiled/directives/dev/Development.d.ts +9 -0
- package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +3 -3
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.d.ts +3 -3
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/dev/index.d.ts +2 -2
- package/transpiled/directives/dev/index.js +4 -5
- package/transpiled/directives/dev/index.js.map +1 -1
- package/transpiled/directives/dev/types.d.ts +1 -1
- package/transpiled/directives/index.d.ts +4 -2
- package/transpiled/directives/index.js +10 -9
- 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/io/Input.js +63 -0
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +5 -5
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +15 -5
- package/transpiled/directives/octets/Delete.js +45 -8
- 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 +9 -9
- package/transpiled/directives/octets/Fetch.js +36 -21
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +11 -5
- package/transpiled/directives/octets/List.js +34 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +5 -4
- package/transpiled/directives/octets/Permute.js +15 -8
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +14 -23
- package/transpiled/directives/octets/Store.js +41 -70
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/index.d.ts +2 -2
- package/transpiled/directives/octets/index.js +4 -5
- package/transpiled/directives/octets/index.js.map +1 -1
- package/transpiled/directives/octets/schemas.d.ts +13 -6
- package/transpiled/directives/octets/schemas.js +2 -1
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +2 -6
- package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
- package/transpiled/directives/octets/workflows/Execution.js +54 -0
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
- package/transpiled/directives/octets/workflows/Workflow.js +25 -0
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.d.ts +1 -0
- package/transpiled/directives/octets/workflows/index.js +6 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +5 -0
- package/transpiled/directives/vary/Directive.js +3 -0
- package/transpiled/directives/vary/Directive.js.map +1 -0
- package/transpiled/directives/vary/Embed.d.ts +10 -0
- package/transpiled/directives/vary/Embed.js +49 -0
- package/transpiled/directives/vary/Embed.js.map +1 -0
- package/transpiled/directives/vary/Properties.d.ts +9 -0
- package/transpiled/directives/vary/Properties.js +16 -0
- package/transpiled/directives/vary/Properties.js.map +1 -0
- package/transpiled/directives/vary/Vary.d.ts +10 -0
- package/transpiled/directives/vary/Vary.js +36 -0
- package/transpiled/directives/vary/Vary.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
- package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Header.js +28 -0
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Language.js +28 -0
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/index.js +10 -0
- package/transpiled/directives/vary/embeddings/index.js.map +1 -0
- package/transpiled/directives/vary/index.d.ts +2 -0
- package/transpiled/directives/vary/index.js +6 -0
- package/transpiled/directives/vary/index.js.map +1 -0
- package/transpiled/exceptions.js +7 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.js +10 -5
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +7 -3
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/source/HTTP/Server.fixtures.ts +0 -41
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
- package/transpiled/HTTP/Server.fixtures.js +0 -32
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/auth/Family.js.map +0 -1
- package/transpiled/directives/cache/Family.d.ts +0 -12
- package/transpiled/directives/cache/Family.js.map +0 -1
- package/transpiled/directives/dev/Family.d.ts +0 -10
- package/transpiled/directives/dev/Family.js.map +0 -1
- package/transpiled/directives/octets/Family.d.ts +0 -12
- package/transpiled/directives/octets/Family.js.map +0 -1
package/source/HTTP/Server.ts
CHANGED
|
@@ -1,144 +1,136 @@
|
|
|
1
1
|
import fs from 'node:fs'
|
|
2
2
|
import os from 'node:os'
|
|
3
|
-
import
|
|
4
|
-
import
|
|
3
|
+
import * as http from 'node:http'
|
|
4
|
+
import assert from 'node:assert'
|
|
5
|
+
import { once } from 'node:events'
|
|
5
6
|
import { Connector } from '@toa.io/core'
|
|
6
7
|
import { promex } from '@toa.io/generic'
|
|
7
|
-
import
|
|
8
|
-
import { read, write, type IncomingMessage, type OutgoingMessage } from './messages'
|
|
8
|
+
import { type OutgoingMessage, write } from './messages'
|
|
9
9
|
import { ClientError, Exception } from './exceptions'
|
|
10
|
-
import {
|
|
11
|
-
import type {
|
|
12
|
-
import type * as http from 'node:http'
|
|
13
|
-
import type { Express, Request, Response, NextFunction } from 'express'
|
|
10
|
+
import { Context } from './Context'
|
|
11
|
+
import type { IncomingMessage } from './Context'
|
|
14
12
|
|
|
15
13
|
export class Server extends Connector {
|
|
16
|
-
private readonly
|
|
17
|
-
private readonly
|
|
18
|
-
private
|
|
14
|
+
private readonly server: http.Server = http.createServer()
|
|
15
|
+
private readonly properties: Properties
|
|
16
|
+
private process?: Processing
|
|
19
17
|
|
|
20
|
-
private constructor (
|
|
18
|
+
private constructor (properties: Properties) {
|
|
21
19
|
super()
|
|
22
20
|
|
|
23
|
-
this.
|
|
24
|
-
|
|
21
|
+
this.properties = properties
|
|
22
|
+
|
|
23
|
+
this.server.on('request', (req, res) => this.listener(req, res))
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public get port (): number {
|
|
27
|
+
if (this.properties.port !== 0)
|
|
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
|
|
25
36
|
}
|
|
26
37
|
|
|
27
38
|
public static create (options?: Partial<Properties>): Server {
|
|
28
|
-
const properties
|
|
39
|
+
const properties = options === undefined
|
|
29
40
|
? DEFAULTS
|
|
30
41
|
: { ...DEFAULTS, ...options }
|
|
31
42
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
app.disable('x-powered-by')
|
|
35
|
-
app.use(cors({ allowedHeaders: ['content-type'] }))
|
|
36
|
-
app.use(supportedMethods(properties.methods))
|
|
37
|
-
|
|
38
|
-
return new Server(app, properties.debug)
|
|
43
|
+
return new Server(properties)
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
public attach (process: Processing): void {
|
|
42
|
-
this.
|
|
43
|
-
this.extend(request)
|
|
44
|
-
.then(process)
|
|
45
|
-
.then(this.success(request, response))
|
|
46
|
-
.catch(this.fail(request, response))
|
|
47
|
-
})
|
|
47
|
+
this.process = process
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
protected override async open (): Promise<void> {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this.server = this.app.listen(8000, listening.callback)
|
|
51
|
+
this.server.listen(this.properties.port)
|
|
54
52
|
|
|
55
|
-
await listening
|
|
53
|
+
await once(this.server, 'listening')
|
|
56
54
|
|
|
57
55
|
console.info('HTTP Server is listening.')
|
|
58
56
|
}
|
|
59
57
|
|
|
60
58
|
protected override async close (): Promise<void> {
|
|
61
|
-
|
|
59
|
+
this.server.close()
|
|
62
60
|
|
|
63
|
-
|
|
61
|
+
console.info('HTTP Server stopped accepting new connections.')
|
|
64
62
|
|
|
65
|
-
await
|
|
66
|
-
}
|
|
63
|
+
await once(this.server, 'close')
|
|
67
64
|
|
|
68
|
-
protected override dispose (): void {
|
|
69
65
|
console.info('HTTP Server has been stopped.')
|
|
70
66
|
}
|
|
71
67
|
|
|
72
|
-
private
|
|
73
|
-
|
|
68
|
+
private listener (request: http.IncomingMessage, response: http.ServerResponse): void {
|
|
69
|
+
if (request.method === undefined || !this.properties.methods.has(request.method)) {
|
|
70
|
+
response.writeHead(501).end()
|
|
71
|
+
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
74
|
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
if (request.url === undefined) {
|
|
76
|
+
response.writeHead(400).end()
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
assert.ok(this.process !== undefined,
|
|
82
|
+
'No processing function has been attached to the server.')
|
|
83
|
+
|
|
84
|
+
const context = new Context(request as IncomingMessage, this.properties.trace)
|
|
85
|
+
|
|
86
|
+
this.process(context)
|
|
87
|
+
.then(this.success(context, response))
|
|
88
|
+
.catch(this.fail(context, response))
|
|
79
89
|
}
|
|
80
90
|
|
|
81
|
-
private success (
|
|
91
|
+
private success (context: Context, response: http.ServerResponse) {
|
|
82
92
|
return (message: OutgoingMessage) => {
|
|
83
93
|
let status = message.status
|
|
84
94
|
|
|
85
95
|
if (status === undefined)
|
|
86
|
-
if (message.body === null)
|
|
87
|
-
|
|
88
|
-
else if (
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
response.end()
|
|
96
|
+
if (message.body === null)
|
|
97
|
+
status = 404
|
|
98
|
+
else if (context.request.method === 'POST')
|
|
99
|
+
status = 201
|
|
100
|
+
else if (message.body === undefined)
|
|
101
|
+
status = 204
|
|
102
|
+
else
|
|
103
|
+
status = 200
|
|
104
|
+
|
|
105
|
+
response.statusCode = message.status = status
|
|
106
|
+
write(context, response, message)
|
|
98
107
|
}
|
|
99
108
|
}
|
|
100
109
|
|
|
101
|
-
private fail (
|
|
110
|
+
private fail (context: Context, response: http.ServerResponse) {
|
|
102
111
|
return async (exception: Error) => {
|
|
103
|
-
if (!request.complete)
|
|
104
|
-
await adam(request)
|
|
112
|
+
if (!context.request.complete)
|
|
113
|
+
await adam(context.request)
|
|
105
114
|
|
|
106
|
-
|
|
115
|
+
response.statusCode = exception instanceof Exception
|
|
107
116
|
? exception.status
|
|
108
117
|
: 500
|
|
109
118
|
|
|
110
|
-
response.
|
|
111
|
-
|
|
112
|
-
const outputAllowed = exception instanceof ClientError || this.debug
|
|
119
|
+
const message: OutgoingMessage = { status: response.statusCode }
|
|
120
|
+
const verbose = exception instanceof ClientError || this.properties.debug
|
|
113
121
|
|
|
114
|
-
if (
|
|
115
|
-
|
|
122
|
+
if (verbose)
|
|
123
|
+
message.body = exception instanceof Exception
|
|
116
124
|
? exception.body
|
|
117
125
|
: (exception.stack ?? exception.message)
|
|
118
126
|
|
|
119
|
-
|
|
120
|
-
} else
|
|
121
|
-
response.end()
|
|
127
|
+
write(context, response, message)
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
}
|
|
125
131
|
|
|
126
|
-
function supportedMethods (methods: Set<string>) {
|
|
127
|
-
return (req: Request, res: Response, next: NextFunction): void => {
|
|
128
|
-
if (methods.has(req.method)) next()
|
|
129
|
-
else res.sendStatus(501)
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function negotiate (request: Request): Format | null {
|
|
134
|
-
const negotiator = new Negotiator(request)
|
|
135
|
-
const mediaType = negotiator.mediaType(types)
|
|
136
|
-
|
|
137
|
-
return mediaType === undefined ? null : formats[mediaType]
|
|
138
|
-
}
|
|
139
|
-
|
|
140
132
|
// https://github.com/whatwg/fetch/issues/1254
|
|
141
|
-
async function adam (request:
|
|
133
|
+
async function adam (request: http.IncomingMessage): Promise<void> {
|
|
142
134
|
const completed = promex()
|
|
143
135
|
const devnull = fs.createWriteStream(os.devNull)
|
|
144
136
|
|
|
@@ -146,17 +138,21 @@ async function adam (request: Request): Promise<void> {
|
|
|
146
138
|
.on('end', completed.callback)
|
|
147
139
|
.pipe(devnull)
|
|
148
140
|
|
|
149
|
-
return
|
|
141
|
+
return completed
|
|
150
142
|
}
|
|
151
143
|
|
|
152
|
-
const DEFAULTS = {
|
|
153
|
-
methods: new Set<string>(['GET', '
|
|
154
|
-
debug: false
|
|
144
|
+
const DEFAULTS: Properties = {
|
|
145
|
+
methods: new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
|
|
146
|
+
debug: false,
|
|
147
|
+
trace: false,
|
|
148
|
+
port: 8000
|
|
155
149
|
}
|
|
156
150
|
|
|
157
151
|
interface Properties {
|
|
158
152
|
methods: Set<string>
|
|
159
153
|
debug: boolean
|
|
154
|
+
trace: boolean
|
|
155
|
+
port: number
|
|
160
156
|
}
|
|
161
157
|
|
|
162
|
-
export type Processing = (input:
|
|
158
|
+
export type Processing = (input: Context) => Promise<OutgoingMessage>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { performance } from 'node:perf_hooks'
|
|
2
|
+
import type { ServerResponse } from 'node:http'
|
|
3
|
+
|
|
4
|
+
export class Timing {
|
|
5
|
+
private readonly skip: boolean
|
|
6
|
+
private readonly start = performance.now()
|
|
7
|
+
private readonly breakpoints: Breakpoint[] = []
|
|
8
|
+
|
|
9
|
+
public constructor (enabled: boolean) {
|
|
10
|
+
this.skip = !enabled
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public async capture<T> (id: string, promise: Promise<T>): Promise<T> {
|
|
14
|
+
if (this.skip)
|
|
15
|
+
return promise
|
|
16
|
+
|
|
17
|
+
const start = performance.now()
|
|
18
|
+
const result = promise instanceof Promise ? await promise : promise
|
|
19
|
+
|
|
20
|
+
this.breakpoints.push({ id, duration: performance.now() - start })
|
|
21
|
+
|
|
22
|
+
return result
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public append (response: ServerResponse): void {
|
|
26
|
+
if (this.skip)
|
|
27
|
+
return
|
|
28
|
+
|
|
29
|
+
this.breakpoints.push({ id: 'total', duration: performance.now() - this.start })
|
|
30
|
+
|
|
31
|
+
for (const breakpoint of this.breakpoints)
|
|
32
|
+
response.appendHeader('server-timing',
|
|
33
|
+
`${breakpoint.id};dur=${breakpoint.duration.toFixed(3)}`)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface Breakpoint {
|
|
38
|
+
id: string
|
|
39
|
+
duration: number
|
|
40
|
+
}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { type Buffer } from 'node:buffer'
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
export const type = 'application/msgpack'
|
|
5
|
-
export const multipart = 'multipart/msgpack'
|
|
2
|
+
import { pack, unpack } from 'msgpackr'
|
|
6
3
|
|
|
7
4
|
export function decode (buffer: Buffer): any {
|
|
8
|
-
return
|
|
5
|
+
return unpack(buffer)
|
|
9
6
|
}
|
|
10
7
|
|
|
11
8
|
export function encode (value: any): Buffer {
|
|
12
|
-
|
|
9
|
+
if (typeof value === 'object' && value !== null)
|
|
10
|
+
Object.setPrototypeOf(value, null)
|
|
11
|
+
|
|
12
|
+
return pack(value)
|
|
13
13
|
}
|
|
14
|
+
|
|
15
|
+
export const type = 'application/msgpack'
|
|
16
|
+
export const multipart = 'multipart/msgpack'
|
package/source/HTTP/index.ts
CHANGED
|
@@ -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,22 +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
|
-
(
|
|
9
|
+
(context: Context, response: http.ServerResponse, message: OutgoingMessage): void {
|
|
10
|
+
for (const transform of context.pipelines.response)
|
|
11
|
+
transform(message)
|
|
12
|
+
|
|
13
|
+
message.headers?.forEach((value, key) => response.setHeader(key, value))
|
|
14
|
+
context.timing.append(response)
|
|
15
|
+
|
|
12
16
|
if (message.body instanceof Readable)
|
|
13
|
-
stream(message,
|
|
17
|
+
stream(message, context, response)
|
|
14
18
|
else
|
|
15
|
-
send(message,
|
|
19
|
+
send(message, context, response)
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
export async function read (
|
|
19
|
-
const type = request.headers['content-type']
|
|
22
|
+
export async function read (context: Context): Promise<any> {
|
|
23
|
+
const type = context.request.headers['content-type']
|
|
20
24
|
|
|
21
25
|
if (type === undefined)
|
|
22
26
|
return undefined
|
|
@@ -25,8 +29,7 @@ export async function read (request: Request): Promise<any> {
|
|
|
25
29
|
throw new UnsupportedMediaType()
|
|
26
30
|
|
|
27
31
|
const format = formats[type]
|
|
28
|
-
|
|
29
|
-
const buf = await buffer(request)
|
|
32
|
+
const buf = await context.timing.capture('buffer', buffer(context.request))
|
|
30
33
|
|
|
31
34
|
try {
|
|
32
35
|
return format.decode(buf)
|
|
@@ -35,30 +38,33 @@ export async function read (request: Request): Promise<any> {
|
|
|
35
38
|
}
|
|
36
39
|
}
|
|
37
40
|
|
|
38
|
-
function send
|
|
39
|
-
|
|
41
|
+
function send
|
|
42
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
43
|
+
if (message.body === undefined || message.body === null) {
|
|
40
44
|
response.end()
|
|
41
45
|
|
|
42
46
|
return
|
|
43
47
|
}
|
|
44
48
|
|
|
45
|
-
if (
|
|
49
|
+
if (context.encoder === null)
|
|
46
50
|
throw new NotAcceptable()
|
|
47
51
|
|
|
48
|
-
const buf =
|
|
52
|
+
const buf = context.encoder.encode(message.body)
|
|
49
53
|
|
|
50
|
-
response
|
|
51
|
-
|
|
54
|
+
response
|
|
55
|
+
.setHeader('content-type', context.encoder.type)
|
|
56
|
+
.appendHeader('vary', 'accept')
|
|
57
|
+
.end(buf)
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
function stream
|
|
55
|
-
(message: OutgoingMessage,
|
|
61
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
56
62
|
const encoded = message.headers !== undefined && message.headers.has('content-type')
|
|
57
63
|
|
|
58
64
|
if (encoded)
|
|
59
|
-
pipe(
|
|
65
|
+
message.body.pipe(response)
|
|
60
66
|
else
|
|
61
|
-
multipart(message,
|
|
67
|
+
multipart(message, context, response)
|
|
62
68
|
|
|
63
69
|
message.body.on('error', (e: Error) => {
|
|
64
70
|
console.error(e)
|
|
@@ -66,49 +72,39 @@ function stream
|
|
|
66
72
|
})
|
|
67
73
|
}
|
|
68
74
|
|
|
69
|
-
function
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function multipart (message: OutgoingMessage, request: IncomingMessage, response: Response): void {
|
|
75
|
-
if (request.encoder === null)
|
|
75
|
+
function multipart
|
|
76
|
+
(message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
|
|
77
|
+
if (context.encoder === null)
|
|
76
78
|
throw new NotAcceptable()
|
|
77
79
|
|
|
78
|
-
const encoder =
|
|
80
|
+
const encoder = context.encoder
|
|
79
81
|
|
|
80
|
-
response.
|
|
82
|
+
response.setHeader('content-type', `${encoder.multipart}; boundary=${BOUNDARY}`)
|
|
81
83
|
|
|
82
84
|
message.body
|
|
83
|
-
.map((part: unknown) => Buffer.concat([CUT, encoder.encode(part)]))
|
|
85
|
+
.map((part: unknown) => Buffer.concat([CUT, encoder.encode(part), CRLF]))
|
|
84
86
|
.on('end', () => response.end(FINALCUT))
|
|
85
87
|
.pipe(response)
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
const BOUNDARY = 'cut'
|
|
89
91
|
const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
|
|
92
|
+
const CRLF = Buffer.from('\r\n')
|
|
90
93
|
const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
|
|
91
94
|
|
|
92
|
-
export interface IncomingMessage extends Request {
|
|
93
|
-
method: string
|
|
94
|
-
path: string
|
|
95
|
-
url: string
|
|
96
|
-
headers: IncomingHttpHeaders
|
|
97
|
-
query: Query
|
|
98
|
-
parse: <T> () => Promise<T>
|
|
99
|
-
encoder: Format | null
|
|
100
|
-
}
|
|
101
|
-
|
|
102
95
|
export interface OutgoingMessage {
|
|
103
96
|
status?: number
|
|
104
97
|
headers?: Headers
|
|
105
98
|
body?: any
|
|
106
99
|
}
|
|
107
100
|
|
|
108
|
-
export interface Query
|
|
101
|
+
export interface Query {
|
|
102
|
+
[key: string]: string | number | undefined
|
|
103
|
+
|
|
109
104
|
id?: string
|
|
110
105
|
criteria?: string
|
|
111
106
|
sort?: string
|
|
112
107
|
omit?: string
|
|
113
108
|
limit?: string
|
|
109
|
+
version?: number
|
|
114
110
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Input, Output } from './io'
|
|
2
|
+
|
|
3
|
+
export class Interception implements Interceptor {
|
|
4
|
+
private readonly interceptors: Interceptor[]
|
|
5
|
+
|
|
6
|
+
public constructor (interceptors: Interceptor[]) {
|
|
7
|
+
this.interceptors = interceptors
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public async intercept (input: Input): Promise<Output> {
|
|
11
|
+
for (const interceptor of this.interceptors) {
|
|
12
|
+
const output = await interceptor.intercept(input)
|
|
13
|
+
|
|
14
|
+
if (output !== null)
|
|
15
|
+
return output
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return null
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface Interceptor {
|
|
23
|
+
intercept: (input: Input) => Output | Promise<Output>
|
|
24
|
+
}
|
package/source/Mapping.ts
CHANGED
|
@@ -29,7 +29,10 @@ 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
|
|
|
@@ -38,14 +41,10 @@ class InputMapping extends Mapping {
|
|
|
38
41
|
if (input === undefined && parameters.length > 0)
|
|
39
42
|
input = {}
|
|
40
43
|
|
|
41
|
-
if (typeof input === 'object')
|
|
42
|
-
|
|
44
|
+
if (typeof input === 'object' && input !== null)
|
|
45
|
+
for (const parameter of parameters)
|
|
46
|
+
input[parameter.name] = parameter.value
|
|
43
47
|
|
|
44
48
|
return { input }
|
|
45
49
|
}
|
|
46
|
-
|
|
47
|
-
private assign (input: Record<string, any>, parameters: Parameter[]): void {
|
|
48
|
-
for (const parameter of parameters)
|
|
49
|
-
input[parameter.name] = parameter.value
|
|
50
|
-
}
|
|
51
50
|
}
|
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
|
}
|