@toa.io/extensions.exposition 1.0.0-alpha.8 → 1.0.0-alpha.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/context.toa.yaml +2 -2
- package/components/identity.bans/manifest.toa.yaml +15 -7
- package/components/identity.bans/operations/transit.d.ts +14 -0
- package/components/identity.bans/operations/transit.js +11 -0
- package/components/identity.bans/operations/transit.js.map +1 -0
- package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.bans/source/transit.ts +21 -0
- package/components/identity.bans/tsconfig.json +9 -0
- package/components/identity.basic/manifest.toa.yaml +20 -11
- package/components/identity.basic/operations/authenticate.d.ts +5 -1
- package/components/identity.basic/operations/authenticate.js +5 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/incept.d.ts +12 -0
- package/components/identity.basic/operations/incept.js +26 -0
- package/components/identity.basic/operations/incept.js.map +1 -0
- package/components/identity.basic/operations/transit.d.ts +4 -4
- package/components/identity.basic/operations/transit.js +5 -3
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/operations/types.d.ts +8 -4
- package/components/identity.basic/source/authenticate.ts +16 -5
- package/components/identity.basic/source/incept.ts +38 -0
- package/components/identity.basic/source/transit.ts +8 -6
- package/components/identity.basic/source/types.ts +8 -4
- package/components/identity.federation/manifest.toa.yaml +32 -16
- package/components/identity.federation/operations/authenticate.d.ts +2 -2
- package/components/identity.federation/operations/authenticate.js +4 -11
- 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/assertions-as-values.js +4 -2
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
- package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
- package/components/identity.federation/operations/lib/jwt.js +25 -12
- package/components/identity.federation/operations/lib/jwt.js.map +1 -1
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/operations/types/configuration.d.ts +14 -0
- package/components/identity.federation/operations/types/configuration.js +3 -0
- package/components/identity.federation/operations/types/configuration.js.map +1 -0
- package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
- 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/entity.js +3 -0
- 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 +6 -19
- package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
- package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
- package/components/identity.federation/source/lib/jwt.test.ts +123 -4
- package/components/identity.federation/source/lib/jwt.ts +36 -16
- package/components/identity.federation/source/types/configuration.ts +15 -0
- package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
- 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 +5 -4
- package/components/identity.roles/manifest.toa.yaml +17 -8
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +21 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +32 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +19 -5
- package/components/identity.tokens/operations/authenticate.d.ts +2 -2
- package/components/identity.tokens/operations/authenticate.js +12 -5
- 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 +14 -6
- 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 +6 -7
- package/components/octets.storage/operations/get.js +2 -2
- package/components/octets.storage/operations/store.js +113 -3
- package/documentation/access.md +75 -38
- package/documentation/authorities.md +49 -0
- package/documentation/cache.md +8 -1
- package/documentation/components.md +47 -22
- package/documentation/flow.md +31 -0
- package/documentation/identity.md +17 -22
- package/documentation/introspection.md +82 -0
- package/documentation/octets.md +81 -23
- package/documentation/protocol.md +13 -3
- package/documentation/query.md +29 -4
- package/documentation/require.md +15 -0
- package/documentation/tree.md +13 -0
- package/documentation/vary.md +14 -14
- package/features/access.feature +78 -46
- package/features/annotation.feature +1 -0
- package/features/auth.claim.feature +170 -0
- package/features/authorities.basic.feature +141 -0
- package/features/authorities.feature +32 -0
- package/features/authorities.federation.feature +100 -0
- package/features/authorities.tokens.feature +117 -0
- package/features/body.feature +2 -0
- package/features/cache.feature +109 -5
- package/features/cors.feature +6 -1
- package/features/debug.feature +34 -0
- package/features/directives.feature +3 -0
- package/features/dynamic.feature +48 -0
- package/features/errors.feature +32 -7
- package/features/etag.feature +31 -0
- package/features/flow.feature +45 -0
- package/features/identity.bans.feature +137 -0
- package/features/identity.basic.feature +113 -23
- package/features/identity.feature +7 -2
- package/features/identity.federation.feature +66 -11
- package/features/identity.roles.feature +250 -7
- package/features/identity.tokens.feature +54 -4
- package/features/introspection.feature +153 -0
- package/features/io.feature +38 -1
- package/features/methods.feature +47 -0
- package/features/octets.download.feature +189 -0
- package/features/octets.entries.feature +8 -1
- package/features/octets.feature +82 -54
- package/features/octets.meta.feature +3 -0
- package/features/octets.workflows.feature +239 -19
- package/features/probes.feature +14 -0
- package/features/{queries.feature → query.feature} +65 -2
- package/features/realtime.feature +34 -0
- package/features/require.feature +67 -0
- package/features/response.feature +38 -3
- package/features/routes.feature +93 -2
- package/features/steps/Database.ts +16 -9
- package/features/steps/Gateway.ts +23 -6
- package/features/steps/IdP.ts +30 -25
- package/features/steps/Parameters.ts +4 -1
- package/features/steps/Realtime.ts +151 -0
- package/features/steps/components/echo/manifest.toa.yaml +14 -1
- package/features/steps/components/echo/operations/identity.js +7 -0
- package/features/steps/components/echo/operations/parameters.js +7 -0
- package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
- package/features/steps/components/echo.beacon/operations/hello.js +5 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
- package/features/steps/components/octets.tester/operations/authority.js +7 -0
- package/features/steps/components/octets.tester/operations/baz.js +1 -2
- package/features/steps/components/octets.tester/operations/diversify.js +3 -1
- package/features/steps/components/octets.tester/operations/foo.js +2 -2
- package/features/steps/components/octets.tester/operations/redirect.js +12 -0
- package/features/steps/components/octets.tester/operations/yex.js +16 -0
- package/features/steps/components/octets.tester/operations/yield.js +13 -0
- package/features/steps/components/pots/manifest.toa.yaml +14 -3
- package/features/steps/components/users/manifest.toa.yaml +0 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
- package/features/streams.feature +5 -0
- package/features/timing.feature +4 -1
- package/features/vary.feature +71 -0
- package/package.json +23 -14
- package/readme.md +19 -14
- package/schemas/annotation.cos.yaml +1 -1
- package/schemas/method.cos.yaml +1 -1
- package/schemas/node.cos.yaml +2 -0
- package/schemas/octets/store.cos.yaml +25 -3
- package/schemas/query.cos.yaml +4 -10
- package/source/Annotation.ts +3 -3
- package/source/Branch.ts +1 -0
- package/source/Composition.ts +0 -6
- package/source/Context.ts +1 -0
- package/source/Directive.ts +4 -5
- package/source/Endpoint.ts +55 -15
- package/source/Factory.ts +22 -13
- package/source/Gateway.ts +67 -19
- package/source/HTTP/Context.ts +25 -2
- package/source/HTTP/Server.ts +54 -44
- package/source/HTTP/exceptions.ts +13 -1
- package/source/HTTP/formats/index.ts +3 -3
- package/source/HTTP/messages.test.ts +45 -2
- package/source/HTTP/messages.ts +23 -5
- package/source/Introspection.ts +11 -0
- package/source/Mapping.ts +63 -21
- package/source/Query.test.ts +3 -3
- package/source/Query.ts +117 -33
- package/source/RTD/Context.ts +1 -1
- package/source/RTD/Endpoint.ts +3 -0
- package/source/RTD/Method.ts +16 -0
- package/source/RTD/Node.ts +29 -13
- package/source/RTD/Route.ts +5 -4
- package/source/RTD/Tree.ts +2 -2
- package/source/RTD/factory.ts +5 -2
- package/source/RTD/syntax/parse.ts +37 -24
- package/source/RTD/syntax/types.ts +6 -4
- package/source/Remotes.ts +7 -6
- package/source/Tenant.ts +6 -20
- package/source/deployment.ts +33 -23
- package/source/directives/auth/Authorization.ts +37 -14
- package/source/directives/auth/Delegate.ts +42 -0
- package/source/directives/auth/Federation.ts +84 -0
- package/source/directives/auth/Incept.ts +4 -3
- package/source/directives/auth/Role.test.ts +53 -6
- package/source/directives/auth/Role.ts +22 -14
- package/source/directives/auth/split.ts +1 -1
- package/source/directives/auth/types.ts +1 -1
- package/source/directives/cache/Cache.ts +13 -6
- package/source/directives/cache/Control.ts +42 -16
- package/source/directives/cors/CORS.ts +1 -1
- package/source/directives/dev/Development.ts +1 -1
- package/source/directives/flow/Fetch.ts +88 -0
- package/source/directives/flow/Flow.ts +34 -0
- package/source/directives/flow/index.ts +3 -0
- package/source/directives/flow/types.ts +6 -0
- package/source/directives/index.ts +3 -1
- package/source/directives/io/Input.ts +4 -4
- package/source/directives/io/Output.ts +4 -3
- package/source/directives/octets/Context.ts +3 -2
- package/source/directives/octets/Fetch.ts +11 -10
- package/source/directives/octets/List.ts +5 -5
- package/source/directives/octets/Octets.ts +1 -3
- package/source/directives/octets/Store.ts +30 -10
- package/source/directives/octets/bytes.test.ts +30 -0
- package/source/directives/octets/bytes.ts +18 -0
- package/source/directives/octets/schemas.ts +4 -6
- package/source/directives/octets/workflows/Execution.ts +60 -8
- package/source/directives/octets/workflows/Workflow.ts +2 -1
- 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 +6 -4
- package/source/directives/vary/embeddings/Authority.ts +8 -0
- package/source/directives/vary/embeddings/Embedding.ts +2 -1
- package/source/directives/vary/embeddings/Parameter.ts +14 -0
- package/source/directives/vary/embeddings/index.ts +6 -4
- package/source/exceptions.ts +17 -11
- package/source/manifest.ts +10 -11
- package/source/schemas.ts +1 -1
- package/transpiled/Annotation.d.ts +3 -3
- package/transpiled/Branch.d.ts +1 -0
- package/transpiled/Composition.d.ts +0 -1
- package/transpiled/Composition.js +0 -4
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +1 -0
- package/transpiled/Directive.js +4 -4
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +6 -4
- package/transpiled/Endpoint.js +35 -7
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +3 -2
- package/transpiled/Factory.js +18 -10
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +3 -0
- package/transpiled/Gateway.js +51 -12
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +8 -1
- package/transpiled/HTTP/Context.js +16 -2
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +13 -2
- package/transpiled/HTTP/Server.js +41 -36
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/exceptions.d.ts +7 -1
- package/transpiled/HTTP/exceptions.js +13 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/index.js +3 -3
- package/transpiled/HTTP/formats/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +1 -0
- package/transpiled/HTTP/messages.js +24 -5
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Introspection.d.ts +9 -0
- package/transpiled/Introspection.js +3 -0
- package/transpiled/Introspection.js.map +1 -0
- package/transpiled/Mapping.d.ts +10 -2
- package/transpiled/Mapping.js +48 -19
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +10 -1
- package/transpiled/Query.js +83 -30
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +1 -1
- package/transpiled/RTD/Endpoint.d.ts +1 -0
- package/transpiled/RTD/Method.d.ts +4 -0
- package/transpiled/RTD/Method.js +11 -0
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -1
- package/transpiled/RTD/Node.js +23 -12
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.d.ts +1 -1
- package/transpiled/RTD/Route.js +0 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +5 -2
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +34 -22
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +5 -3
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.d.ts +4 -4
- package/transpiled/Remotes.js +6 -5
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +5 -5
- package/transpiled/Tenant.js +2 -13
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +1 -1
- package/transpiled/deployment.js +28 -20
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +26 -10
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.d.ts +10 -0
- package/transpiled/directives/auth/Delegate.js +34 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Federation.d.ts +16 -0
- package/transpiled/directives/auth/Federation.js +57 -0
- package/transpiled/directives/auth/Federation.js.map +1 -0
- package/transpiled/directives/auth/Incept.js +4 -3
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.d.ts +4 -1
- package/transpiled/directives/auth/Role.js +20 -14
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/split.js +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/cache/Cache.d.ts +3 -3
- package/transpiled/directives/cache/Cache.js +10 -4
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.d.ts +2 -1
- package/transpiled/directives/cache/Control.js +29 -12
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cors/CORS.js +1 -1
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/flow/Fetch.d.ts +13 -0
- package/transpiled/directives/flow/Fetch.js +59 -0
- package/transpiled/directives/flow/Fetch.js.map +1 -0
- package/transpiled/directives/flow/Flow.d.ts +10 -0
- package/transpiled/directives/flow/Flow.js +27 -0
- package/transpiled/directives/flow/Flow.js.map +1 -0
- package/transpiled/directives/flow/index.d.ts +2 -0
- package/transpiled/directives/flow/index.js +6 -0
- package/transpiled/directives/flow/index.js.map +1 -0
- package/transpiled/directives/flow/types.d.ts +5 -0
- package/transpiled/directives/flow/types.js.map +1 -0
- package/transpiled/directives/index.js +3 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Input.js +2 -2
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +2 -2
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/octets/Context.js +4 -24
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Fetch.d.ts +3 -3
- package/transpiled/directives/octets/Fetch.js +8 -8
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +3 -3
- package/transpiled/directives/octets/List.js +3 -3
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -3
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +6 -1
- package/transpiled/directives/octets/Store.js +17 -7
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/bytes.d.ts +1 -0
- package/transpiled/directives/octets/bytes.js +21 -0
- package/transpiled/directives/octets/bytes.js.map +1 -0
- package/transpiled/directives/octets/schemas.d.ts +4 -6
- package/transpiled/directives/octets/schemas.js +1 -3
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
- package/transpiled/directives/octets/workflows/Execution.js +44 -9
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js +2 -1
- 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 +2 -2
- package/transpiled/directives/vary/Vary.js +3 -3
- package/transpiled/directives/vary/Vary.js.map +1 -1
- package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Authority.js +10 -0
- package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
- package/transpiled/directives/vary/embeddings/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 +10 -5
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/manifest.js +10 -11
- package/transpiled/manifest.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/tsconfig.json +9 -7
- 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/schemas/octets/context.cos.yaml +0 -1
- package/source/HTTP/Server.test.ts +0 -126
- package/source/directives/octets/Permute.ts +0 -44
- package/transpiled/directives/octets/Permute.d.ts +0 -11
- package/transpiled/directives/octets/Permute.js +0 -58
- package/transpiled/directives/octets/Permute.js.map +0 -1
- /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
|
@@ -7,11 +7,13 @@ Feature: Response
|
|
|
7
7
|
io:output: true
|
|
8
8
|
GET:
|
|
9
9
|
anonymous: true
|
|
10
|
-
dev:stub:
|
|
10
|
+
dev:stub:
|
|
11
|
+
hello: world
|
|
11
12
|
"""
|
|
12
13
|
When the following request is received:
|
|
13
14
|
"""
|
|
14
15
|
GET / HTTP/1.1
|
|
16
|
+
host: nex.toa.io
|
|
15
17
|
accept: application/json
|
|
16
18
|
"""
|
|
17
19
|
Then the following reply is sent:
|
|
@@ -19,6 +21,37 @@ Feature: Response
|
|
|
19
21
|
200 OK
|
|
20
22
|
content-type: application/json
|
|
21
23
|
vary: accept
|
|
24
|
+
|
|
25
|
+
{"hello":"world"}
|
|
26
|
+
"""
|
|
27
|
+
When the following request is received:
|
|
28
|
+
"""
|
|
29
|
+
GET / HTTP/1.1
|
|
30
|
+
host: nex.toa.io
|
|
31
|
+
accept: application/yaml
|
|
32
|
+
"""
|
|
33
|
+
Then the following reply is sent:
|
|
34
|
+
"""
|
|
35
|
+
200 OK
|
|
36
|
+
content-type: application/yaml
|
|
37
|
+
vary: accept
|
|
38
|
+
|
|
39
|
+
hello: world
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
# default is JSON
|
|
43
|
+
When the following request is received:
|
|
44
|
+
"""
|
|
45
|
+
GET / HTTP/1.1
|
|
46
|
+
host: nex.toa.io
|
|
47
|
+
"""
|
|
48
|
+
Then the following reply is sent:
|
|
49
|
+
"""
|
|
50
|
+
200 OK
|
|
51
|
+
content-type: application/json
|
|
52
|
+
vary: accept
|
|
53
|
+
|
|
54
|
+
{"hello":"world"}
|
|
22
55
|
"""
|
|
23
56
|
|
|
24
57
|
Scenario: Error as YAML
|
|
@@ -32,11 +65,12 @@ Feature: Response
|
|
|
32
65
|
When the following request is received:
|
|
33
66
|
"""
|
|
34
67
|
GET /echo/ HTTP/1.1
|
|
68
|
+
host: nex.toa.io
|
|
35
69
|
accept: application/yaml
|
|
36
70
|
"""
|
|
37
71
|
Then the following reply is sent:
|
|
38
72
|
"""
|
|
39
|
-
|
|
73
|
+
422 Unprocessable Entity
|
|
40
74
|
content-type: application/yaml
|
|
41
75
|
|
|
42
76
|
code: CODE
|
|
@@ -54,11 +88,12 @@ Feature: Response
|
|
|
54
88
|
When the following request is received:
|
|
55
89
|
"""
|
|
56
90
|
GET /echo/ HTTP/1.1
|
|
91
|
+
host: nex.toa.io
|
|
57
92
|
accept: application/msgpack
|
|
58
93
|
"""
|
|
59
94
|
Then the following reply is sent:
|
|
60
95
|
"""
|
|
61
|
-
|
|
96
|
+
422 Unprocessable Entity
|
|
62
97
|
content-type: application/msgpack
|
|
63
98
|
"""
|
|
64
99
|
And response body contains MessagePack-encoded value:
|
package/features/routes.feature
CHANGED
|
@@ -18,6 +18,7 @@ Feature: Routes
|
|
|
18
18
|
When the following request is received:
|
|
19
19
|
"""
|
|
20
20
|
GET /basic/greeter<route> HTTP/1.1
|
|
21
|
+
host: nex.toa.io
|
|
21
22
|
accept: text/plain
|
|
22
23
|
"""
|
|
23
24
|
Then the following reply is sent:
|
|
@@ -42,6 +43,7 @@ Feature: Routes
|
|
|
42
43
|
When the following request is received:
|
|
43
44
|
"""
|
|
44
45
|
GET /greeter/ HTTP/1.1
|
|
46
|
+
host: nex.toa.io
|
|
45
47
|
accept: text/plain
|
|
46
48
|
"""
|
|
47
49
|
Then the following reply is sent:
|
|
@@ -65,6 +67,7 @@ Feature: Routes
|
|
|
65
67
|
When the following request is received:
|
|
66
68
|
"""
|
|
67
69
|
GET /greeter/baz/ HTTP/1.1
|
|
70
|
+
host: nex.toa.io
|
|
68
71
|
accept: text/plain
|
|
69
72
|
"""
|
|
70
73
|
Then the following reply is sent:
|
|
@@ -76,6 +79,7 @@ Feature: Routes
|
|
|
76
79
|
When the following request is received:
|
|
77
80
|
"""
|
|
78
81
|
GET /greeter/baz/qux/ HTTP/1.1
|
|
82
|
+
host: nex.toa.io
|
|
79
83
|
"""
|
|
80
84
|
Then the following reply is sent:
|
|
81
85
|
"""
|
|
@@ -84,6 +88,7 @@ Feature: Routes
|
|
|
84
88
|
When the following request is received:
|
|
85
89
|
"""
|
|
86
90
|
GET /greeter/foo/baz/bar/ HTTP/1.1
|
|
91
|
+
host: nex.toa.io
|
|
87
92
|
accept: text/plain
|
|
88
93
|
"""
|
|
89
94
|
Then the following reply is sent:
|
|
@@ -94,8 +99,7 @@ Feature: Routes
|
|
|
94
99
|
"""
|
|
95
100
|
|
|
96
101
|
Scenario: Routes with naming conflicts
|
|
97
|
-
Given the
|
|
98
|
-
And the `users` is running with the following manifest:
|
|
102
|
+
Given the `users` is running with the following manifest:
|
|
99
103
|
"""yaml
|
|
100
104
|
exposition:
|
|
101
105
|
/:
|
|
@@ -112,6 +116,7 @@ Feature: Routes
|
|
|
112
116
|
When the following request is received:
|
|
113
117
|
"""
|
|
114
118
|
GET /users/properties/b5534021e30042259badffbd1831e472/ HTTP/1.1
|
|
119
|
+
host: nex.toa.io
|
|
115
120
|
accept: application/yaml
|
|
116
121
|
"""
|
|
117
122
|
Then the following reply is sent:
|
|
@@ -123,6 +128,7 @@ Feature: Routes
|
|
|
123
128
|
When the following request is received:
|
|
124
129
|
"""
|
|
125
130
|
POST /users/ HTTP/1.1
|
|
131
|
+
host: nex.toa.io
|
|
126
132
|
content-type: application/yaml
|
|
127
133
|
|
|
128
134
|
name: Alice
|
|
@@ -131,3 +137,88 @@ Feature: Routes
|
|
|
131
137
|
"""
|
|
132
138
|
201 Created
|
|
133
139
|
"""
|
|
140
|
+
|
|
141
|
+
Scenario: Routes with default namespace conflicts
|
|
142
|
+
Given the `echo` is running with the following manifest:
|
|
143
|
+
"""yaml
|
|
144
|
+
exposition:
|
|
145
|
+
/:foo:
|
|
146
|
+
io:output: true
|
|
147
|
+
PUT: compute
|
|
148
|
+
"""
|
|
149
|
+
And the `echo.beacon` is running with the following manifest:
|
|
150
|
+
"""yaml
|
|
151
|
+
exposition:
|
|
152
|
+
/:
|
|
153
|
+
io:output: true
|
|
154
|
+
GET: hello
|
|
155
|
+
"""
|
|
156
|
+
When the following request is received:
|
|
157
|
+
"""
|
|
158
|
+
GET /echo/beacon/ HTTP/1.1
|
|
159
|
+
host: nex.toa.io
|
|
160
|
+
accept: application/yaml
|
|
161
|
+
"""
|
|
162
|
+
Then the following reply is sent:
|
|
163
|
+
"""
|
|
164
|
+
200 OK
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
Scenario: Routes with parameters
|
|
168
|
+
Given the `echo` is running with the following manifest:
|
|
169
|
+
"""yaml
|
|
170
|
+
exposition:
|
|
171
|
+
/:a/:b:
|
|
172
|
+
io:output: true
|
|
173
|
+
GET: parameters
|
|
174
|
+
"""
|
|
175
|
+
When the following request is received:
|
|
176
|
+
"""
|
|
177
|
+
GET /echo/foo/bar/ HTTP/1.1
|
|
178
|
+
host: nex.toa.io
|
|
179
|
+
accept: application/yaml
|
|
180
|
+
"""
|
|
181
|
+
Then the following reply is sent:
|
|
182
|
+
"""
|
|
183
|
+
200 OK
|
|
184
|
+
|
|
185
|
+
a: foo
|
|
186
|
+
b: bar
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
Scenario: Route forwarding
|
|
190
|
+
Given the `echo` is running with the following manifest:
|
|
191
|
+
"""yaml
|
|
192
|
+
exposition:
|
|
193
|
+
/show/:a/:b:
|
|
194
|
+
io:output: true
|
|
195
|
+
GET: parameters
|
|
196
|
+
/hello: /echo/show/foo/bar
|
|
197
|
+
/mirror/:a/:b: /echo/show/:a/:b
|
|
198
|
+
"""
|
|
199
|
+
When the following request is received:
|
|
200
|
+
"""
|
|
201
|
+
GET /echo/hello/ HTTP/1.1
|
|
202
|
+
host: nex.toa.io
|
|
203
|
+
accept: application/yaml
|
|
204
|
+
"""
|
|
205
|
+
Then the following reply is sent:
|
|
206
|
+
"""
|
|
207
|
+
200 OK
|
|
208
|
+
|
|
209
|
+
a: foo
|
|
210
|
+
b: bar
|
|
211
|
+
"""
|
|
212
|
+
When the following request is received:
|
|
213
|
+
"""
|
|
214
|
+
GET /echo/mirror/bar/baz/ HTTP/1.1
|
|
215
|
+
host: nex.toa.io
|
|
216
|
+
accept: application/yaml
|
|
217
|
+
"""
|
|
218
|
+
Then the following reply is sent:
|
|
219
|
+
"""
|
|
220
|
+
200 OK
|
|
221
|
+
|
|
222
|
+
a: bar
|
|
223
|
+
b: baz
|
|
224
|
+
"""
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { afterAll, beforeAll, binding, given } from 'cucumber-tsflow'
|
|
2
2
|
import { MongoClient } from 'mongodb'
|
|
3
|
+
import type { Collection } from 'mongodb'
|
|
3
4
|
import type { DataTable } from '@cucumber/cucumber'
|
|
4
5
|
|
|
5
6
|
@binding()
|
|
@@ -8,9 +9,7 @@ export class Database {
|
|
|
8
9
|
|
|
9
10
|
@given('the `{word}` database contains:')
|
|
10
11
|
public async upsert (id: string, table: DataTable): Promise<void> {
|
|
11
|
-
const
|
|
12
|
-
const collection = Database.client.db(namespace).collection(name)
|
|
13
|
-
|
|
12
|
+
const collection = this.collection(id)
|
|
14
13
|
const columns = table.raw()[0]
|
|
15
14
|
const rows = table.rows()
|
|
16
15
|
const documents: Document[] = []
|
|
@@ -22,7 +21,11 @@ export class Database {
|
|
|
22
21
|
const str = rows[r][c]
|
|
23
22
|
const int = parseInt(str)
|
|
24
23
|
|
|
25
|
-
document[columns[c]] = int.toString() === str
|
|
24
|
+
document[columns[c]] = int.toString() === str
|
|
25
|
+
? int
|
|
26
|
+
: str === 'null'
|
|
27
|
+
? null
|
|
28
|
+
: str
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
documents.push(document)
|
|
@@ -36,10 +39,7 @@ export class Database {
|
|
|
36
39
|
|
|
37
40
|
@given('the `{word}` database is empty')
|
|
38
41
|
public async truncate (id: string): Promise<void> {
|
|
39
|
-
|
|
40
|
-
const collection = Database.client.db(namespace).collection(name)
|
|
41
|
-
|
|
42
|
-
await collection.deleteMany({})
|
|
42
|
+
await this.collection(id).deleteMany({})
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
@beforeAll()
|
|
@@ -53,6 +53,13 @@ export class Database {
|
|
|
53
53
|
public static async disconnect (): Promise<void> {
|
|
54
54
|
await this.client.close()
|
|
55
55
|
}
|
|
56
|
+
|
|
57
|
+
private collection (id: string): Collection {
|
|
58
|
+
const [name, namespace = 'default'] = id.split('.').reverse()
|
|
59
|
+
const collection = `${namespace}_${name}`.toLowerCase()
|
|
60
|
+
|
|
61
|
+
return Database.client.db('toa-dev').collection(collection)
|
|
62
|
+
}
|
|
56
63
|
}
|
|
57
64
|
|
|
58
|
-
type Document = Record<string, string | number>
|
|
65
|
+
type Document = Record<string, string | number | null>
|
|
@@ -6,6 +6,7 @@ import { encode, timeout } from '@toa.io/generic'
|
|
|
6
6
|
import { Factory } from '../../source'
|
|
7
7
|
import * as syntax from '../../source/RTD/syntax'
|
|
8
8
|
import { shortcuts } from '../../source/Directive'
|
|
9
|
+
import type * as http from '../../source/HTTP'
|
|
9
10
|
|
|
10
11
|
let instance: Connector | null = null
|
|
11
12
|
|
|
@@ -23,11 +24,19 @@ export class Gateway {
|
|
|
23
24
|
process.env.TOA_EXPOSITION = encode(tree)
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
const { debug, trace, authorities } = annotation
|
|
28
|
+
const properties = Object.assign({}, DEFAULT_PROPERTIES)
|
|
28
29
|
|
|
29
|
-
if (
|
|
30
|
-
|
|
30
|
+
if (debug !== undefined)
|
|
31
|
+
properties.debug = debug
|
|
32
|
+
|
|
33
|
+
if (trace !== undefined)
|
|
34
|
+
properties.trace = trace
|
|
35
|
+
|
|
36
|
+
if (authorities !== undefined)
|
|
37
|
+
properties.authorities = authorities
|
|
38
|
+
|
|
39
|
+
process.env.TOA_EXPOSITION_PROPERTIES = encode(properties)
|
|
31
40
|
|
|
32
41
|
await Gateway.stop()
|
|
33
42
|
|
|
@@ -54,7 +63,8 @@ export class Gateway {
|
|
|
54
63
|
if (instance !== null)
|
|
55
64
|
return
|
|
56
65
|
|
|
57
|
-
process.env.TOA_EXPOSITION ??=
|
|
66
|
+
process.env.TOA_EXPOSITION ??= DEFAULT_TREE
|
|
67
|
+
process.env.TOA_EXPOSITION_PROPERTIES ??= encode(DEFAULT_PROPERTIES)
|
|
58
68
|
|
|
59
69
|
this.writeConfiguration()
|
|
60
70
|
|
|
@@ -76,6 +86,7 @@ export class Gateway {
|
|
|
76
86
|
return
|
|
77
87
|
|
|
78
88
|
delete process.env.TOA_EXPOSITION
|
|
89
|
+
delete process.env.TOA_EXPOSITION_PROPERTIES
|
|
79
90
|
|
|
80
91
|
await Gateway.stop()
|
|
81
92
|
}
|
|
@@ -96,7 +107,7 @@ export class Gateway {
|
|
|
96
107
|
}
|
|
97
108
|
}
|
|
98
109
|
|
|
99
|
-
const
|
|
110
|
+
const DEFAULT_TREE = encode({
|
|
100
111
|
routes: [],
|
|
101
112
|
methods: [],
|
|
102
113
|
directives: [
|
|
@@ -108,6 +119,12 @@ const DEFAULT_ANNOTATION = encode({
|
|
|
108
119
|
]
|
|
109
120
|
} satisfies syntax.Node)
|
|
110
121
|
|
|
122
|
+
const DEFAULT_PROPERTIES: Partial<http.Options> = {
|
|
123
|
+
authorities: {
|
|
124
|
+
nex: 'nex.toa.io'
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
111
128
|
const DEFAULT_CONFIGURATION: Record<string, object> = {
|
|
112
129
|
'identity.tokens': {
|
|
113
130
|
key0: 'k3.local.pIZT8-9Fa6U_QtfQHOSStfGtmyzPINyKQq2Xk-hd7vA'
|
package/features/steps/IdP.ts
CHANGED
|
@@ -14,7 +14,8 @@ export class IdP {
|
|
|
14
14
|
private static privateKey?: crypto.KeyObject
|
|
15
15
|
private static issuer?: string
|
|
16
16
|
|
|
17
|
-
public constructor (private readonly captures: Captures) {
|
|
17
|
+
public constructor (private readonly captures: Captures) {
|
|
18
|
+
}
|
|
18
19
|
|
|
19
20
|
@afterAll()
|
|
20
21
|
public static async stop (): Promise<void> {
|
|
@@ -29,14 +30,21 @@ export class IdP {
|
|
|
29
30
|
if (IdP.server instanceof http.Server) return
|
|
30
31
|
|
|
31
32
|
// creating the key
|
|
32
|
-
const {
|
|
33
|
+
const {
|
|
34
|
+
publicKey,
|
|
35
|
+
privateKey
|
|
36
|
+
} = await util.promisify(crypto.generateKeyPair)('rsa', {
|
|
33
37
|
modulusLength: 2048
|
|
34
38
|
})
|
|
35
39
|
|
|
36
40
|
IdP.privateKey = privateKey
|
|
37
41
|
|
|
38
42
|
const jwk = JSON.stringify({
|
|
39
|
-
keys: [{
|
|
43
|
+
keys: [{
|
|
44
|
+
use: 'sig',
|
|
45
|
+
alg: 'RS256',
|
|
46
|
+
...publicKey.export({ format: 'jwk' })
|
|
47
|
+
}]
|
|
40
48
|
})
|
|
41
49
|
|
|
42
50
|
const JWK_URL = '/.well-known/jwks'
|
|
@@ -54,24 +62,23 @@ export class IdP {
|
|
|
54
62
|
response.end(jwk)
|
|
55
63
|
break
|
|
56
64
|
|
|
57
|
-
case '/.well-known/openid-configuration':
|
|
58
|
-
{
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
65
|
+
case '/.well-known/openid-configuration': {
|
|
66
|
+
const openIdConfiguration = JSON.stringify({
|
|
67
|
+
issuer: IdP.issuer,
|
|
68
|
+
jwks_uri: IdP.issuer + JWK_URL,
|
|
69
|
+
response_types_supported: ['id_token'],
|
|
70
|
+
subject_types_supported: ['public'],
|
|
71
|
+
id_token_signing_alg_values_supported: ['RS256'],
|
|
72
|
+
scopes_supported: ['openid']
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
response.writeHead(200, {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
'Cache-Control': 'public, max-age=3600',
|
|
78
|
+
'Content-Length': openIdConfiguration.length
|
|
79
|
+
})
|
|
80
|
+
response.end(openIdConfiguration)
|
|
81
|
+
}
|
|
75
82
|
|
|
76
83
|
break
|
|
77
84
|
|
|
@@ -102,7 +109,7 @@ export class IdP {
|
|
|
102
109
|
},
|
|
103
110
|
{
|
|
104
111
|
iss: IdP.issuer,
|
|
105
|
-
sub:
|
|
112
|
+
sub: user,
|
|
106
113
|
aud: 'test',
|
|
107
114
|
iat: Math.floor(Date.now() / 1000),
|
|
108
115
|
exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
|
|
@@ -120,8 +127,6 @@ export class IdP {
|
|
|
120
127
|
|
|
121
128
|
@given('the IDP {word} token for {word} is issued with following secret:')
|
|
122
129
|
public async issueSymmetricToken (alg: string, user: string, secret: string): Promise<void> {
|
|
123
|
-
console.log('Sym token for %s with secret "%s"', user, secret)
|
|
124
|
-
|
|
125
130
|
const jwt = [
|
|
126
131
|
{
|
|
127
132
|
typ: 'JWT',
|
|
@@ -129,7 +134,7 @@ export class IdP {
|
|
|
129
134
|
},
|
|
130
135
|
{
|
|
131
136
|
iss: IdP.issuer,
|
|
132
|
-
sub:
|
|
137
|
+
sub: user,
|
|
133
138
|
aud: 'test',
|
|
134
139
|
iat: Math.floor(Date.now() / 1000),
|
|
135
140
|
exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { setDefaultTimeout } from '@cucumber/cucumber'
|
|
2
2
|
import { encode } from '@toa.io/generic'
|
|
3
|
+
import { console } from 'openspan'
|
|
3
4
|
|
|
4
5
|
export class Parameters {
|
|
5
6
|
public readonly origin: string
|
|
@@ -11,11 +12,13 @@ export class Parameters {
|
|
|
11
12
|
|
|
12
13
|
setDefaultTimeout(30 * 1000)
|
|
13
14
|
|
|
15
|
+
console.configure({ format: 'terminal' })
|
|
16
|
+
|
|
14
17
|
process.env.TOA_DEV = '1'
|
|
15
18
|
|
|
16
19
|
process.env.TOA_STORAGES = encode({
|
|
17
20
|
octets: {
|
|
18
21
|
provider: 'tmp',
|
|
19
|
-
directory:
|
|
22
|
+
directory: Math.random().toString(36).substring(2)
|
|
20
23
|
}
|
|
21
24
|
})
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { EventEmitter, once } from 'node:events'
|
|
2
|
+
import * as assert from 'node:assert'
|
|
3
|
+
import { after, binding, given, afterAll, then } from 'cucumber-tsflow'
|
|
4
|
+
import { Factory } from '@toa.io/extensions.realtime'
|
|
5
|
+
import * as boot from '@toa.io/boot'
|
|
6
|
+
import { encode, match } from '@toa.io/generic'
|
|
7
|
+
import { parse } from '@toa.io/yaml'
|
|
8
|
+
import { Agent } from '@toa.io/agent'
|
|
9
|
+
import { Parameters } from './Parameters'
|
|
10
|
+
import { Gateway } from './Gateway'
|
|
11
|
+
import { Captures } from './Captures'
|
|
12
|
+
import type { Connector } from '@toa.io/core'
|
|
13
|
+
|
|
14
|
+
@binding([Gateway, Parameters, Captures])
|
|
15
|
+
export class Realtime {
|
|
16
|
+
private static instance: Connector | null = null
|
|
17
|
+
private readonly gateway: Gateway
|
|
18
|
+
private readonly agent: Agent
|
|
19
|
+
private readonly events = new EventEmitter()
|
|
20
|
+
private log: Record<string, unknown[]> = {}
|
|
21
|
+
private aborted = false
|
|
22
|
+
|
|
23
|
+
public constructor (gateway: Gateway, parameters: Parameters, captures: Captures) {
|
|
24
|
+
this.gateway = gateway
|
|
25
|
+
this.agent = new Agent(parameters.origin, captures)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@given('the Realtime is running with the following annotation:')
|
|
29
|
+
public async start (yaml: string): Promise<void> {
|
|
30
|
+
await Realtime.stop()
|
|
31
|
+
|
|
32
|
+
const annotation = parse(yaml)
|
|
33
|
+
const routes = []
|
|
34
|
+
|
|
35
|
+
for (const [event, property] of Object.entries(annotation))
|
|
36
|
+
routes.push({ event, properties: [property] })
|
|
37
|
+
|
|
38
|
+
process.env.TOA_REALTIME = encode(routes)
|
|
39
|
+
|
|
40
|
+
const factory = new Factory(boot)
|
|
41
|
+
|
|
42
|
+
Realtime.instance = factory.service()
|
|
43
|
+
|
|
44
|
+
void Realtime.instance.connect()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
@given('the identity {word} is consuming realtime events')
|
|
48
|
+
public async connect (name: string): Promise<void> {
|
|
49
|
+
await this.gateway.start()
|
|
50
|
+
|
|
51
|
+
const id = await this.createIdentity(name)
|
|
52
|
+
|
|
53
|
+
const parts = await this.agent.parts(`
|
|
54
|
+
GET /realtime/streams/\${{ ${name}.id }}/ HTTP/1.1
|
|
55
|
+
authorization: Token \${{ ${name}.token }}
|
|
56
|
+
accept: application/json
|
|
57
|
+
`) as AsyncIterable<Uint8Array>
|
|
58
|
+
|
|
59
|
+
void this.consume(id, parts).catch((e) => {
|
|
60
|
+
if (!this.aborted)
|
|
61
|
+
console.debug('Consumption interrupted', e)
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@then('the following event `{word}` is received by {word}:')
|
|
66
|
+
public async received (label: string, name: string, yaml: string): Promise<void> {
|
|
67
|
+
const id = this.agent.captures.get(`${name}.id`)
|
|
68
|
+
const tag = `${id}:${label}`
|
|
69
|
+
const expected = parse(yaml)
|
|
70
|
+
|
|
71
|
+
if (this.log[tag] !== undefined)
|
|
72
|
+
for (const data of this.log[tag])
|
|
73
|
+
// eslint-disable-next-line max-depth
|
|
74
|
+
if (match(data, expected))
|
|
75
|
+
return
|
|
76
|
+
|
|
77
|
+
const [event] = await once(this.events, tag)
|
|
78
|
+
|
|
79
|
+
assert.ok(match(event, expected), 'Event does not match')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@after()
|
|
83
|
+
public abort (): void {
|
|
84
|
+
this.aborted = true
|
|
85
|
+
this.agent.abort()
|
|
86
|
+
this.log = {}
|
|
87
|
+
this.events.removeAllListeners()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@afterAll()
|
|
91
|
+
public static async stop (): Promise<void> {
|
|
92
|
+
if (this.instance === null)
|
|
93
|
+
return
|
|
94
|
+
|
|
95
|
+
await this.instance.disconnect()
|
|
96
|
+
|
|
97
|
+
this.instance = null
|
|
98
|
+
process.env.TOA_REALTIME = undefined
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private async createIdentity (name: string): Promise<string> {
|
|
102
|
+
const password = Math.random().toString(36).slice(2)
|
|
103
|
+
const username = name + Math.random().toString(36).slice(2)
|
|
104
|
+
|
|
105
|
+
await this.agent.request(`
|
|
106
|
+
POST /identity/basic/ HTTP/1.1
|
|
107
|
+
accept: application/yaml
|
|
108
|
+
content-type: application/yaml
|
|
109
|
+
|
|
110
|
+
username: ${username}
|
|
111
|
+
password: ${password}
|
|
112
|
+
`)
|
|
113
|
+
|
|
114
|
+
this.agent.responseIncludes(`
|
|
115
|
+
201 Created
|
|
116
|
+
`)
|
|
117
|
+
|
|
118
|
+
const credentials = Buffer.from(`${username}:${password}`).toString('base64')
|
|
119
|
+
|
|
120
|
+
await this.agent.request(`
|
|
121
|
+
GET /identity/ HTTP/1.1
|
|
122
|
+
authorization: Basic ${credentials}
|
|
123
|
+
accept: application/yaml
|
|
124
|
+
`)
|
|
125
|
+
|
|
126
|
+
this.agent.responseIncludes(`
|
|
127
|
+
200 OK
|
|
128
|
+
authorization: Token \${{ ${name}.token }}
|
|
129
|
+
|
|
130
|
+
id: \${{ ${name}.id }}
|
|
131
|
+
`)
|
|
132
|
+
|
|
133
|
+
return this.agent.captures.get(`${name}.id`)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private async consume (id: string, parts: any): Promise<void> {
|
|
137
|
+
for await (const part of parts) {
|
|
138
|
+
const text = Buffer.from(part.body).toString('utf8')
|
|
139
|
+
const event = JSON.parse(text)
|
|
140
|
+
|
|
141
|
+
if (typeof event === 'string')
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
const tag = `${id}:${event.event}`
|
|
145
|
+
|
|
146
|
+
this.events.emit(tag, event.data)
|
|
147
|
+
this.log[tag] ??= []
|
|
148
|
+
this.log[tag].push(event.data)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
name: echo
|
|
2
|
-
version: 0.0.0
|
|
3
2
|
|
|
4
3
|
operations:
|
|
5
4
|
compute:
|
|
@@ -8,3 +7,17 @@ operations:
|
|
|
8
7
|
affect:
|
|
9
8
|
input:
|
|
10
9
|
name*: string
|
|
10
|
+
identity:
|
|
11
|
+
input:
|
|
12
|
+
identity:
|
|
13
|
+
id: string
|
|
14
|
+
roles: [string]
|
|
15
|
+
parameters:
|
|
16
|
+
input: ¶meters
|
|
17
|
+
type: object
|
|
18
|
+
properties:
|
|
19
|
+
a:
|
|
20
|
+
type: string
|
|
21
|
+
b:
|
|
22
|
+
type: string
|
|
23
|
+
output: *parameters
|