@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293
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/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import * as http from '@toa.io/agent'
|
|
2
|
-
import tsflow from 'cucumber-tsflow'
|
|
3
|
-
|
|
4
|
-
const { binding } = tsflow
|
|
5
|
-
|
|
6
|
-
@binding()
|
|
7
|
-
export class Captures extends http.Captures {
|
|
8
|
-
public constructor() {
|
|
9
|
-
super(functions)
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const functions: http.Functions = {
|
|
14
|
-
otp: function (this: Captures, value: string, arg: string): string {
|
|
15
|
-
const identity = this.get(arg + '.id')
|
|
16
|
-
const code = this.get(arg + '.code')
|
|
17
|
-
|
|
18
|
-
return Buffer.from(`${identity}:${code}`).toString('base64')
|
|
19
|
-
}
|
|
20
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Before } from '@cucumber/cucumber'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* The Cloudinary scenarios upload to a real account, named by `features/steps/.env` — the
|
|
5
|
-
* environment and the keys `.env.example` lists. A checkout carries none, and an account is
|
|
6
|
-
* not something a run can stand up for itself, the way the compose file stands up a database.
|
|
7
|
-
* Without one the scenarios are skipped rather than failed, so `npm run features` answers on a
|
|
8
|
-
* fresh machine; with one they run, no flag to remember.
|
|
9
|
-
*/
|
|
10
|
-
Before({ tags: '@cloudinary' }, function () {
|
|
11
|
-
if (process.env.CLOUDINARY_ENVIRONMENT === undefined) return 'skipped'
|
|
12
|
-
})
|
package/features/steps/Common.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import * as assert from 'node:assert'
|
|
2
|
-
import tsflow from 'cucumber-tsflow'
|
|
3
|
-
import { timeout } from '@toa.io/generic'
|
|
4
|
-
import { Captures } from './Captures.js'
|
|
5
|
-
|
|
6
|
-
const { binding, given } = tsflow
|
|
7
|
-
|
|
8
|
-
@binding([Captures])
|
|
9
|
-
export class Common {
|
|
10
|
-
private readonly captures: Captures
|
|
11
|
-
|
|
12
|
-
public constructor(captures: Captures) {
|
|
13
|
-
this.captures = captures
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@given('after {float} second(s)')
|
|
17
|
-
public async timeout(interval: number): Promise<void> {
|
|
18
|
-
await timeout(interval * 1000)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
@given('the process is running')
|
|
22
|
-
public async noop(): Promise<void> {}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* A remote resource is whatever it is today. A scenario downloading one compares the reply
|
|
26
|
-
* against what the origin actually serves, not against a literal that goes stale when it changes.
|
|
27
|
-
*/
|
|
28
|
-
@given('the length of `{}` is captured as `{word}`')
|
|
29
|
-
public async length(url: string, name: string): Promise<void> {
|
|
30
|
-
const response = await fetch(url)
|
|
31
|
-
|
|
32
|
-
assert.equal(response.status, 200, `${url} answered ${response.status}`)
|
|
33
|
-
|
|
34
|
-
const body = await response.arrayBuffer()
|
|
35
|
-
|
|
36
|
-
this.captures.set(name, String(body.byteLength))
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'node:module'
|
|
2
|
-
import * as assert from 'node:assert'
|
|
3
|
-
import { dirname, join } from 'node:path'
|
|
4
|
-
import tsflow from 'cucumber-tsflow'
|
|
5
|
-
|
|
6
|
-
import * as boot from '@toa.io/boot'
|
|
7
|
-
import { type Connector } from '@toa.io/core'
|
|
8
|
-
import { environment } from '@toa.io/generic'
|
|
9
|
-
|
|
10
|
-
import { load as parse } from 'js-yaml'
|
|
11
|
-
import { Gateway } from './Gateway.js'
|
|
12
|
-
import { Workspace } from './Workspace.js'
|
|
13
|
-
import { components as map } from './map.js'
|
|
14
|
-
|
|
15
|
-
const { after, binding, given } = tsflow
|
|
16
|
-
|
|
17
|
-
const require = createRequire(import.meta.url)
|
|
18
|
-
|
|
19
|
-
const MAP = 'introspection'
|
|
20
|
-
const VALUES = 'configuration'
|
|
21
|
-
|
|
22
|
-
@binding([Workspace, Gateway])
|
|
23
|
-
export class Components {
|
|
24
|
-
private readonly workspace: Workspace
|
|
25
|
-
private readonly gateway: Gateway
|
|
26
|
-
private compositions: Record<string, Connector> = {}
|
|
27
|
-
|
|
28
|
-
public constructor(workspace: Workspace, gateway: Gateway) {
|
|
29
|
-
this.workspace = workspace
|
|
30
|
-
this.gateway = gateway
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@given('the `{word}` is running')
|
|
34
|
-
public async run(name: string): Promise<void> {
|
|
35
|
-
await this.runComponent(name)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@given('the `{word}` is running with the following manifest:')
|
|
39
|
-
public async patchAndRun(name: string, yaml: string): Promise<void> {
|
|
40
|
-
const manifest = parse(yaml) as object
|
|
41
|
-
|
|
42
|
-
await this.runComponent(name, manifest)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** One composition, as the explorer hosts them. */
|
|
46
|
-
@given('the introspection components are running')
|
|
47
|
-
public async runMap(): Promise<void> {
|
|
48
|
-
assert.ok(!(MAP in this.compositions), `Composition '${MAP}' is already running`)
|
|
49
|
-
|
|
50
|
-
this.compositions[MAP] = await boot.composition(map())
|
|
51
|
-
|
|
52
|
-
await this.compositions[MAP].connect()
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** The values component, as the configuration extension ships it; the service hosts it alone. */
|
|
56
|
-
@given('the configuration values are running')
|
|
57
|
-
public async runValues(): Promise<void> {
|
|
58
|
-
assert.ok(
|
|
59
|
-
!(VALUES in this.compositions),
|
|
60
|
-
`Composition '${VALUES}' is already running`
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
await this.gateway.start()
|
|
64
|
-
|
|
65
|
-
this.compositions[VALUES] = await boot.composition([values()])
|
|
66
|
-
|
|
67
|
-
await this.compositions[VALUES].connect()
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** What the deployment would tell the values service, as the scenario needs it. */
|
|
71
|
-
@given('the configuration values are deployed:')
|
|
72
|
-
public deployValues(yaml: string): void {
|
|
73
|
-
environment.set('TOA_CONFIGURATION_VALUES', JSON.stringify(parse(yaml)))
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
@given('the `{word}` is stopped')
|
|
77
|
-
public async stop(name: string): Promise<void> {
|
|
78
|
-
assert.ok(name in this.compositions, `Composition '${name}' is not running`)
|
|
79
|
-
|
|
80
|
-
await this.compositions[name].disconnect()
|
|
81
|
-
delete this.compositions[name]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@after()
|
|
85
|
-
public async shutdown(): Promise<void> {
|
|
86
|
-
const promises = Object.values(this.compositions).map((composition) =>
|
|
87
|
-
composition.disconnect()
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
await Promise.all(promises)
|
|
91
|
-
|
|
92
|
-
environment.delete('TOA_CONFIGURATION_VALUES')
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
private async runComponent(name: string, manifest?: object): Promise<void> {
|
|
96
|
-
assert.ok(!(name in this.compositions), `Composition '${name}' is already running`)
|
|
97
|
-
|
|
98
|
-
// the gateway first: a component announces itself when it opens, and that only
|
|
99
|
-
// reaches a gateway that is already listening. Started the other way round, the
|
|
100
|
-
// component waits for a knock, which the request that follows does not.
|
|
101
|
-
await this.gateway.start()
|
|
102
|
-
|
|
103
|
-
const path = await this.workspace.addComponent(name, manifest)
|
|
104
|
-
|
|
105
|
-
this.compositions[name] = await boot.composition([path])
|
|
106
|
-
|
|
107
|
-
await this.compositions[name].connect()
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function values(): string {
|
|
112
|
-
const root = dirname(require.resolve('@toa.io/extensions.configuration/package.json'))
|
|
113
|
-
|
|
114
|
-
return join(root, 'components', 'configuration.values')
|
|
115
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import tsflow from 'cucumber-tsflow'
|
|
2
|
-
|
|
3
|
-
import { MongoClient } from 'mongodb'
|
|
4
|
-
import type { Collection } from 'mongodb'
|
|
5
|
-
import type { DataTable } from '@cucumber/cucumber'
|
|
6
|
-
|
|
7
|
-
const { afterAll, beforeAll, binding, given } = tsflow
|
|
8
|
-
|
|
9
|
-
@binding()
|
|
10
|
-
export class Database {
|
|
11
|
-
private static client: MongoClient
|
|
12
|
-
|
|
13
|
-
@given('the `{word}` database contains:')
|
|
14
|
-
public async upsert(id: string, table: DataTable): Promise<void> {
|
|
15
|
-
const collection = this.collection(id)
|
|
16
|
-
const columns = table.raw()[0]
|
|
17
|
-
const rows = table.rows()
|
|
18
|
-
const documents: Document[] = []
|
|
19
|
-
|
|
20
|
-
for (let r = 0; r < rows.length; r++) {
|
|
21
|
-
const document = {} as Document
|
|
22
|
-
|
|
23
|
-
for (let c = 0; c < columns.length; c++) {
|
|
24
|
-
const str = rows[r][c]
|
|
25
|
-
const int = parseInt(str)
|
|
26
|
-
|
|
27
|
-
document[columns[c]] =
|
|
28
|
-
int.toString() === str
|
|
29
|
-
? int
|
|
30
|
-
: str === 'null'
|
|
31
|
-
? null
|
|
32
|
-
: str === 'true'
|
|
33
|
-
? true
|
|
34
|
-
: str === 'false'
|
|
35
|
-
? false
|
|
36
|
-
: str
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/*
|
|
40
|
-
* A record that has never been written carries no timestamps, and the entity stamps
|
|
41
|
-
* the ones it is missing as it is read — with the time it was read. The same row then
|
|
42
|
-
* enumerates differently on every request, which is a `last-modified` that moves and a
|
|
43
|
-
* collection that is never unmodified.
|
|
44
|
-
*/
|
|
45
|
-
document.CREATED ??= Date.now()
|
|
46
|
-
document.UPDATED ??= document.CREATED
|
|
47
|
-
|
|
48
|
-
// a table states a timestamp as the entity carries it; the storage holds it as a date
|
|
49
|
-
for (const name of TIMESTAMPS)
|
|
50
|
-
if (typeof document[name] === 'number') document[name] = new Date(document[name])
|
|
51
|
-
|
|
52
|
-
documents.push(document)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/*
|
|
56
|
-
* A component the scenario has already started writes to this collection too, and it may
|
|
57
|
-
* write the very row named here — introspection records a node under the same `_id` this
|
|
58
|
-
* derives. Emptying the collection and inserting leaves a window for it to land in
|
|
59
|
-
* between, and the insert then fails on a duplicate key. Replacing each row named, and
|
|
60
|
-
* deleting only what is not, has no such window.
|
|
61
|
-
*/
|
|
62
|
-
const ids = documents.map((document) => document._id)
|
|
63
|
-
|
|
64
|
-
await collection.deleteMany({ _id: { $nin: ids } })
|
|
65
|
-
|
|
66
|
-
if (documents.length > 0)
|
|
67
|
-
await collection.bulkWrite(
|
|
68
|
-
documents.map((document) => ({
|
|
69
|
-
replaceOne: {
|
|
70
|
-
filter: { _id: document._id },
|
|
71
|
-
replacement: document,
|
|
72
|
-
upsert: true
|
|
73
|
-
}
|
|
74
|
-
}))
|
|
75
|
-
)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@given('the `{word}` database is empty')
|
|
79
|
-
public async truncate(id: string): Promise<void> {
|
|
80
|
-
await this.collection(id).deleteMany({})
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
@beforeAll()
|
|
84
|
-
public static async connect(): Promise<void> {
|
|
85
|
-
this.client = new MongoClient('mongodb://developer:secret@localhost:31020')
|
|
86
|
-
|
|
87
|
-
await this.client.connect()
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@afterAll()
|
|
91
|
-
public static async disconnect(): Promise<void> {
|
|
92
|
-
await this.client.close()
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
private collection(id: string): Collection<Document> {
|
|
96
|
-
const [name, namespace = 'default'] = id.split('.').reverse()
|
|
97
|
-
const collection = `${namespace}_${name}`.toLowerCase()
|
|
98
|
-
|
|
99
|
-
return Database.client.db('toa-dev').collection(collection)
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const TIMESTAMPS = ['CREATED', 'UPDATED', 'DELETED']
|
|
104
|
-
|
|
105
|
-
/** Every fixture table names an `_id`, which is what a row is replaced by. */
|
|
106
|
-
type Document = Record<string, string | number | boolean | Date | null> & { _id: string }
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import tsflow from 'cucumber-tsflow'
|
|
2
|
-
|
|
3
|
-
import * as boot from '@toa.io/boot'
|
|
4
|
-
import { type Connector } from '@toa.io/core'
|
|
5
|
-
import { environment } from '@toa.io/generic'
|
|
6
|
-
|
|
7
|
-
import { load as parse } from 'js-yaml'
|
|
8
|
-
import { Factory } from '../../source/index.js'
|
|
9
|
-
import * as syntax from '../../source/RTD/syntax/index.js'
|
|
10
|
-
import { shortcuts } from '../../source/shortcuts.js'
|
|
11
|
-
import { manifests } from './map.js'
|
|
12
|
-
import { PORT, PROBE } from './Parameters.js'
|
|
13
|
-
import type * as http from '../../source/HTTP/index.js'
|
|
14
|
-
|
|
15
|
-
const { after, afterAll, binding, given } = tsflow
|
|
16
|
-
|
|
17
|
-
let instance: Connector | null = null
|
|
18
|
-
let deployment: string | null = null
|
|
19
|
-
|
|
20
|
-
@binding()
|
|
21
|
-
export class Gateway {
|
|
22
|
-
private written: string[] = []
|
|
23
|
-
|
|
24
|
-
@given('the annotation:')
|
|
25
|
-
public async annotate(yaml: string): Promise<void> {
|
|
26
|
-
const annotation = parse(yaml) as Partial<http.Options> & { '/'?: object }
|
|
27
|
-
|
|
28
|
-
if (annotation['/'] !== undefined) {
|
|
29
|
-
const tree = syntax.parse(annotation['/'], shortcuts)
|
|
30
|
-
|
|
31
|
-
environment.set('TOA_EXPOSITION', JSON.stringify(tree))
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const { debug, authorities, bouncer, ip, oauth, rpc, mcp } = annotation
|
|
35
|
-
const properties = Object.assign({}, DEFAULT_PROPERTIES)
|
|
36
|
-
|
|
37
|
-
if (debug !== undefined) properties.debug = debug
|
|
38
|
-
|
|
39
|
-
if (bouncer !== undefined) properties.bouncer = bouncer
|
|
40
|
-
|
|
41
|
-
if (ip !== undefined) properties.ip = ip
|
|
42
|
-
|
|
43
|
-
if (authorities !== undefined) properties.authorities = authorities
|
|
44
|
-
|
|
45
|
-
if (oauth !== undefined) properties.oauth = oauth
|
|
46
|
-
|
|
47
|
-
if (rpc !== undefined) properties.rpc = rpc
|
|
48
|
-
|
|
49
|
-
if (mcp !== undefined) properties.mcp = mcp
|
|
50
|
-
|
|
51
|
-
environment.set('TOA_EXPOSITION_PROPERTIES', JSON.stringify(properties))
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* The routes of the introspection map, taken from its own manifests. `norm` runs the
|
|
56
|
-
* exposition extension over them, so what lands here is what a deployment would carry.
|
|
57
|
-
*/
|
|
58
|
-
@given('the annotation of the introspection map')
|
|
59
|
-
public async annotateMap(): Promise<void> {
|
|
60
|
-
await this.annotateMapUnder()
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** The same routes under a root of the scenario's own: what an application declares around the map. */
|
|
64
|
-
@given('the annotation of the introspection map under:')
|
|
65
|
-
public async annotateMapUnder(yaml?: string): Promise<void> {
|
|
66
|
-
const tree: syntax.Node =
|
|
67
|
-
yaml === undefined
|
|
68
|
-
? { routes: [], methods: [], directives: [] }
|
|
69
|
-
: syntax.parse((parse(yaml) as { '/': object })['/'], shortcuts)
|
|
70
|
-
|
|
71
|
-
for (const manifest of await manifests()) {
|
|
72
|
-
const node = manifest.extensions?.[EXPOSITION] as syntax.Node | undefined
|
|
73
|
-
|
|
74
|
-
if (node === undefined)
|
|
75
|
-
throw new Error(`'${manifest.namespace}.${manifest.name}' declares no exposition`)
|
|
76
|
-
|
|
77
|
-
tree.routes.push(...node.routes)
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
environment.set('TOA_EXPOSITION', JSON.stringify(tree))
|
|
81
|
-
environment.set('TOA_EXPOSITION_PROPERTIES', JSON.stringify(DEFAULT_PROPERTIES))
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@given('the `{word}` configuration:')
|
|
85
|
-
public async configure(id: string, yaml: string): Promise<void> {
|
|
86
|
-
const [name, namespace = 'default'] = id.split('.').reverse()
|
|
87
|
-
const key = `TOA_CONFIGURATION_${namespace.toUpperCase()}_${name.toUpperCase()}`
|
|
88
|
-
const def = DEFAULT_CONFIGURATION[id] ?? {}
|
|
89
|
-
const patch = parse(yaml) as object
|
|
90
|
-
const configuration = Object.assign({}, def, patch)
|
|
91
|
-
|
|
92
|
-
// scenario-scoped, as the secrets it may refer to are: a configuration left behind
|
|
93
|
-
// outlives the secrets it points at, and the next scenario cannot resolve them
|
|
94
|
-
this.written.push(key)
|
|
95
|
-
environment.set(key, JSON.stringify(configuration))
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/** The secrets a scenario's configuration refers to. */
|
|
99
|
-
@given('the configuration secrets:')
|
|
100
|
-
public async secrets(yaml: string): Promise<void> {
|
|
101
|
-
const secrets = parse(yaml) as Record<string, string>
|
|
102
|
-
|
|
103
|
-
for (const [name, value] of Object.entries(secrets)) {
|
|
104
|
-
this.written.push(SECRET + name)
|
|
105
|
-
environment.set(SECRET + name, value)
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
@given('the branch TTL is {float} second(s)')
|
|
110
|
-
public async setBranchTTL(seconds: number): Promise<void> {
|
|
111
|
-
process.env.__TESTING_EXPOSITION_BRANCH_TTL = String(seconds * 1000)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
@given('the Gateway is running')
|
|
115
|
-
public async start(): Promise<void> {
|
|
116
|
-
if (!environment.has('TOA_EXPOSITION'))
|
|
117
|
-
environment.set('TOA_EXPOSITION', DEFAULT_TREE)
|
|
118
|
-
|
|
119
|
-
if (!environment.has('TOA_EXPOSITION_PROPERTIES'))
|
|
120
|
-
environment.set('TOA_EXPOSITION_PROPERTIES', JSON.stringify(DEFAULT_PROPERTIES))
|
|
121
|
-
|
|
122
|
-
this.writeConfiguration()
|
|
123
|
-
|
|
124
|
-
const signature = Gateway.signature()
|
|
125
|
-
|
|
126
|
-
/*
|
|
127
|
-
* A component is published without restarting the gateway, and a scenario that asks for
|
|
128
|
-
* the deployment already running gets that one. Only a different deployment is a restart,
|
|
129
|
-
* which is what an annotation, a configuration or a branch TTL of its own amounts to.
|
|
130
|
-
*/
|
|
131
|
-
if (instance !== null && signature === deployment) return
|
|
132
|
-
|
|
133
|
-
await Gateway.stop()
|
|
134
|
-
|
|
135
|
-
const factory = new Factory(boot.host())
|
|
136
|
-
const service = await factory.service()
|
|
137
|
-
|
|
138
|
-
if (service === null) throw new Error('?')
|
|
139
|
-
|
|
140
|
-
instance = service
|
|
141
|
-
|
|
142
|
-
await service.connect()
|
|
143
|
-
|
|
144
|
-
deployment = signature
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/** What the running gateway was built from: a different value is a different deployment. */
|
|
148
|
-
private static signature(): string {
|
|
149
|
-
const configuration = Object.entries(environment.entries('TOA_CONFIGURATION_')).sort()
|
|
150
|
-
|
|
151
|
-
return JSON.stringify([
|
|
152
|
-
environment.get('TOA_EXPOSITION'),
|
|
153
|
-
environment.get('TOA_EXPOSITION_PROPERTIES'),
|
|
154
|
-
process.env.__TESTING_EXPOSITION_BRANCH_TTL,
|
|
155
|
-
configuration
|
|
156
|
-
])
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
@after()
|
|
160
|
-
public async cleanup(): Promise<void> {
|
|
161
|
-
delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
162
|
-
|
|
163
|
-
for (const key of this.written) environment.delete(key)
|
|
164
|
-
|
|
165
|
-
this.written = []
|
|
166
|
-
|
|
167
|
-
environment.delete('TOA_EXPOSITION')
|
|
168
|
-
environment.delete('TOA_EXPOSITION_PROPERTIES')
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
@afterAll()
|
|
172
|
-
public static async stop(): Promise<void> {
|
|
173
|
-
await instance?.disconnect()
|
|
174
|
-
instance = null
|
|
175
|
-
deployment = null
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
private writeConfiguration(): void {
|
|
179
|
-
for (const [id, configuration] of Object.entries(DEFAULT_CONFIGURATION)) {
|
|
180
|
-
const [name, namespace = 'default'] = id.split('.').reverse()
|
|
181
|
-
const key = `TOA_CONFIGURATION_${namespace.toUpperCase()}_${name.toUpperCase()}`
|
|
182
|
-
|
|
183
|
-
if (!environment.has(key)) environment.set(key, JSON.stringify(configuration))
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
for (const [name, value] of Object.entries(DEFAULT_SECRETS))
|
|
187
|
-
if (!environment.has(SECRET + name)) environment.set(SECRET + name, value)
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const EXPOSITION = '@toa.io/extensions.exposition'
|
|
192
|
-
const SECRET = 'TOA_CONFIGURATION__'
|
|
193
|
-
|
|
194
|
-
const DEFAULT_TREE = JSON.stringify({
|
|
195
|
-
routes: [],
|
|
196
|
-
methods: [],
|
|
197
|
-
directives: [
|
|
198
|
-
{
|
|
199
|
-
family: 'auth',
|
|
200
|
-
name: 'anonymous',
|
|
201
|
-
value: true
|
|
202
|
-
}
|
|
203
|
-
]
|
|
204
|
-
} satisfies syntax.Node)
|
|
205
|
-
|
|
206
|
-
const DEFAULT_PROPERTIES: Partial<http.Options> = {
|
|
207
|
-
authorities: {
|
|
208
|
-
nex: 'nex.toa.io'
|
|
209
|
-
},
|
|
210
|
-
port: PORT,
|
|
211
|
-
probe: PROBE,
|
|
212
|
-
// `npm run features:h2c` runs the whole suite over cleartext HTTP/2
|
|
213
|
-
protocol: environment.get('TOA_EXPOSITION_PROTOCOL') === 'h2c' ? 'h2c' : 'h1'
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// the identity components boot inside the gateway, and without a variable each would wait
|
|
217
|
-
// for the values service, which these features do not run
|
|
218
|
-
const DEFAULT_CONFIGURATION: Record<string, object> = {
|
|
219
|
-
// a component declaring configuration waits for `configuration.values`, which these
|
|
220
|
-
// features do not run; the variable is the local override that stands in for it
|
|
221
|
-
'realtime.streams': {},
|
|
222
|
-
'identity.basic': {},
|
|
223
|
-
'identity.clients': {},
|
|
224
|
-
'identity.grants': {},
|
|
225
|
-
'identity.federation': {},
|
|
226
|
-
'identity.otp': {},
|
|
227
|
-
'identity.passkeys': {},
|
|
228
|
-
'identity.tokens': {
|
|
229
|
-
keys: [
|
|
230
|
-
{ id: 'key0', key: '$IDENTITY_TOKENS_KEY0' },
|
|
231
|
-
{ id: 'legacy0', key: '$IDENTITY_TOKENS_LEGACY0', format: 'paseto' }
|
|
232
|
-
]
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// a secret is given as a reference, and comes to the component as an object
|
|
237
|
-
const DEFAULT_SECRETS: Record<string, string> = {
|
|
238
|
-
IDENTITY_TOKENS_KEY0: 'sTxL6qVOadKkUJwh3FveU53XgTEo3Sdfg7k2FfiIKfs',
|
|
239
|
-
IDENTITY_TOKENS_LEGACY0: 'k3.local.pIZT8-9Fa6U_QtfQHOSStfGtmyzPINyKQq2Xk-hd7vA'
|
|
240
|
-
}
|
package/features/steps/HTTP.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import * as assert from 'node:assert'
|
|
2
|
-
import * as fs from 'node:fs'
|
|
3
|
-
import * as path from 'node:path'
|
|
4
|
-
import tsflow from 'cucumber-tsflow'
|
|
5
|
-
|
|
6
|
-
import * as http from '@toa.io/agent'
|
|
7
|
-
import * as msgpack from 'msgpackr'
|
|
8
|
-
import * as YAML from 'js-yaml'
|
|
9
|
-
import { Captures } from './Captures.js'
|
|
10
|
-
import { Parameters } from './Parameters.js'
|
|
11
|
-
import { Gateway } from './Gateway.js'
|
|
12
|
-
import type { Readable } from 'node:stream'
|
|
13
|
-
|
|
14
|
-
const { binding, then, when } = tsflow
|
|
15
|
-
|
|
16
|
-
@binding([Gateway, Parameters, Captures])
|
|
17
|
-
export class HTTP extends http.Agent {
|
|
18
|
-
private readonly gateway: Gateway
|
|
19
|
-
|
|
20
|
-
public constructor(gateway: Gateway, parameters: Parameters, captures: Captures) {
|
|
21
|
-
super(parameters.origin, captures)
|
|
22
|
-
this.gateway = gateway
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@when('the following request is received:')
|
|
26
|
-
public override async request(input: string): Promise<any> {
|
|
27
|
-
await this.gateway.start()
|
|
28
|
-
|
|
29
|
-
await super.request(input)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
@then('the following reply is sent:')
|
|
33
|
-
public override responseIncludes(expected: string): void {
|
|
34
|
-
super.responseIncludes(expected)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
@then('response body contains {word}-encoded value:')
|
|
38
|
-
public async bodyIs(format: string, yaml: string): Promise<void> {
|
|
39
|
-
assert.ok(this.bytes !== null, 'Response body is not available')
|
|
40
|
-
|
|
41
|
-
const value = encoders[format]?.(this.bytes)
|
|
42
|
-
const expected = YAML.load(yaml)
|
|
43
|
-
|
|
44
|
-
assert.deepEqual(value, expected, 'Values are not equal')
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
@then('the reply does not contain:')
|
|
48
|
-
public override responseExcludes(expected: string): void {
|
|
49
|
-
super.responseExcludes(expected)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@when('the stream of `{word}` is received with the following headers:')
|
|
53
|
-
public async streamRequest(filename: string, head: string): Promise<any> {
|
|
54
|
-
const stream = open(filename)
|
|
55
|
-
|
|
56
|
-
await this.gateway.start()
|
|
57
|
-
await super.stream(head, stream)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
@then('the stream equals to `{word}` is sent with the following headers:')
|
|
61
|
-
public async responseStreamMatch(filename: string, head: string): Promise<any> {
|
|
62
|
-
const stream = open(filename)
|
|
63
|
-
|
|
64
|
-
await super.streamMatch(head, stream)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
@when('the following request is interrupted after {float} second(s):')
|
|
68
|
-
public async interrupt(delay: number, input: string): Promise<any> {
|
|
69
|
-
const controller = new AbortController()
|
|
70
|
-
|
|
71
|
-
await this.gateway.start()
|
|
72
|
-
|
|
73
|
-
setTimeout(() => {
|
|
74
|
-
if (pending) controller.abort()
|
|
75
|
-
else console.error('Request cannot be interrupted as it is already completed')
|
|
76
|
-
}, delay * 1000)
|
|
77
|
-
|
|
78
|
-
let pending = true
|
|
79
|
-
|
|
80
|
-
await super.fetch(input, { signal: controller.signal }).catch((e) => {
|
|
81
|
-
if (e.name !== 'AbortError') throw e
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
pending = false
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const FILES_DIR = path.resolve(import.meta.dirname, '../../../storages/source/test')
|
|
89
|
-
|
|
90
|
-
function open(filename: string): Readable {
|
|
91
|
-
return fs.createReadStream(path.join(FILES_DIR, filename))
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const encoders: Record<string, (buf: Buffer | Uint8Array) => any> = {
|
|
95
|
-
MessagePack: msgpack.decode
|
|
96
|
-
}
|