@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,175 +0,0 @@
|
|
|
1
|
-
import { describe as suite, it, afterEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { describe } from './tree.js'
|
|
5
|
-
import { Tree } from '../RTD/Tree.js'
|
|
6
|
-
import type * as http from '../HTTP/index.js'
|
|
7
|
-
import type { Introspection } from '../Introspection.js'
|
|
8
|
-
import type { EndpointsFactory } from '../Endpoint.js'
|
|
9
|
-
import type { DirectiveFactory } from '../RTD/Directives.js'
|
|
10
|
-
import type * as syntax from '../RTD/syntax/index.js'
|
|
11
|
-
|
|
12
|
-
/** A method with no mapping has no endpoint, so what it says is its directives' alone. */
|
|
13
|
-
const endpoints = {} as unknown as EndpointsFactory
|
|
14
|
-
|
|
15
|
-
/** What a method marked with this describes as, standing for a directive that refuses. */
|
|
16
|
-
const REFUSE = 'refuse'
|
|
17
|
-
|
|
18
|
-
const directives = {
|
|
19
|
-
create: (stack: syntax.Directive[]) => ({
|
|
20
|
-
declared: () => undefined,
|
|
21
|
-
precall: async () => null,
|
|
22
|
-
settle: async () => undefined,
|
|
23
|
-
dispose: () => undefined,
|
|
24
|
-
explain: async (_: unknown, introspection: Introspection) => {
|
|
25
|
-
const mark = stack.find((directive) => directive.family === 'test')?.value
|
|
26
|
-
|
|
27
|
-
if (mark === REFUSE) return null
|
|
28
|
-
|
|
29
|
-
return mark === undefined ? introspection : { ...introspection, description: mark }
|
|
30
|
-
}
|
|
31
|
-
}),
|
|
32
|
-
preflight: async () => undefined,
|
|
33
|
-
depart: async () => undefined,
|
|
34
|
-
dispose: () => undefined
|
|
35
|
-
} as unknown as DirectiveFactory
|
|
36
|
-
|
|
37
|
-
const method = (verb: string, mark?: string): syntax.Method => ({
|
|
38
|
-
verb,
|
|
39
|
-
directives: mark === undefined ? [] : [{ family: 'test', name: 'mark', value: mark }]
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
const node = (
|
|
43
|
-
path: string,
|
|
44
|
-
methods: syntax.Method[] = [],
|
|
45
|
-
routes: syntax.Route[] = []
|
|
46
|
-
): syntax.Route => ({ path, node: { routes, methods, directives: [] } })
|
|
47
|
-
|
|
48
|
-
const trunk = (routes: syntax.Route[], methods: syntax.Method[] = []): syntax.Node => ({
|
|
49
|
-
routes,
|
|
50
|
-
methods,
|
|
51
|
-
directives: []
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
const request = {} as unknown as http.Context
|
|
55
|
-
|
|
56
|
-
afterEach(() => {
|
|
57
|
-
delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
suite('discovery tree', () => {
|
|
61
|
-
it('should key the trunk by the root', async () => {
|
|
62
|
-
const tree = new Tree(trunk([], [method('GET')]), endpoints, directives)
|
|
63
|
-
|
|
64
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/'])
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
it('should key every route by the template it answers at', async () => {
|
|
68
|
-
const tree = new Tree(
|
|
69
|
-
trunk([
|
|
70
|
-
node('/pots', [method('GET'), method('POST')], [node('/:id', [method('GET')])])
|
|
71
|
-
]),
|
|
72
|
-
endpoints,
|
|
73
|
-
directives
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
const { routes: resources } = await describe(tree, request)
|
|
77
|
-
|
|
78
|
-
assert.deepEqual(Object.keys(resources), ['/pots', '/pots/:id'])
|
|
79
|
-
assert.deepEqual(Object.keys(resources['/pots']), ['GET', 'POST'])
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
it('should include a route no name can spell', async () => {
|
|
83
|
-
// `/.rpc` and `/.mcp` leave these out; HTTP addresses a route by its path
|
|
84
|
-
const tree = new Tree(
|
|
85
|
-
trunk([
|
|
86
|
-
node('/v1.0', [method('GET')]),
|
|
87
|
-
node('/files', [], [node('/**', [method('GET')])]),
|
|
88
|
-
node('/any', [], [node('/*', [method('GET')])])
|
|
89
|
-
]),
|
|
90
|
-
endpoints,
|
|
91
|
-
directives
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), [
|
|
95
|
-
'/any/*',
|
|
96
|
-
'/files/**',
|
|
97
|
-
'/v1.0'
|
|
98
|
-
])
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
it('should skip an intermediate node, whose route answers in its place', async () => {
|
|
102
|
-
const tree = new Tree(
|
|
103
|
-
trunk([node('/posts', [method('PATCH')], [node('/', [method('PUT')])])]),
|
|
104
|
-
endpoints,
|
|
105
|
-
directives
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/posts'])
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
it('should omit a resource this caller may reach no method of', async () => {
|
|
112
|
-
const tree = new Tree(
|
|
113
|
-
trunk([
|
|
114
|
-
node('/open', [method('GET')]),
|
|
115
|
-
node('/closed', [method('GET', REFUSE), method('POST', REFUSE)])
|
|
116
|
-
]),
|
|
117
|
-
endpoints,
|
|
118
|
-
directives
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/open'])
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('should carry only the verbs this caller may reach', async () => {
|
|
125
|
-
const tree = new Tree(
|
|
126
|
-
trunk([node('/pots', [method('GET'), method('POST', REFUSE)])]),
|
|
127
|
-
endpoints,
|
|
128
|
-
directives
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
const { routes: resources } = await describe(tree, request)
|
|
132
|
-
|
|
133
|
-
assert.deepEqual(Object.keys(resources['/pots']), ['GET'])
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
it('should answer the declaration a request would reach where two share a template', async () => {
|
|
137
|
-
// `/a/b` and `/a: { /b: }` are two routes and one template; the more specific matches
|
|
138
|
-
const tree = new Tree(
|
|
139
|
-
trunk([
|
|
140
|
-
node('/a/b', [method('GET', 'nested')]),
|
|
141
|
-
node('/a', [], [node('/b', [method('GET', 'adjacent')])])
|
|
142
|
-
]),
|
|
143
|
-
endpoints,
|
|
144
|
-
directives
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
const { routes: resources } = await describe(tree, request)
|
|
148
|
-
|
|
149
|
-
assert.deepEqual(Object.keys(resources), ['/a/b'])
|
|
150
|
-
assert.equal(resources['/a/b'].GET.description, 'nested')
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
it('should drop a branch that has expired', async () => {
|
|
154
|
-
process.env.__TESTING_EXPOSITION_BRANCH_TTL = '-1'
|
|
155
|
-
|
|
156
|
-
const tree = new Tree(trunk([]), endpoints, directives)
|
|
157
|
-
|
|
158
|
-
tree.merge(trunk([node('/pots', [method('GET')])]), {
|
|
159
|
-
namespace: 'default',
|
|
160
|
-
component: 'pots'
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), [])
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
it('should sort, because branches merge in the order their tenants answer', async () => {
|
|
167
|
-
const tree = new Tree(
|
|
168
|
-
trunk([node('/zed', [method('GET')]), node('/alpha', [method('GET')])]),
|
|
169
|
-
endpoints,
|
|
170
|
-
directives
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/alpha', '/zed'])
|
|
174
|
-
})
|
|
175
|
-
})
|
package/source/Discovery/tree.ts
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { describing } from '../Introspection.js'
|
|
2
|
-
import { template } from '../RPC/names.js'
|
|
3
|
-
import { variables } from '../RTD/segment.js'
|
|
4
|
-
import { guarded, resource, type Described } from '../directives/help/index.js'
|
|
5
|
-
import type * as http from '../HTTP/index.js'
|
|
6
|
-
import type { Tree } from '../RTD/index.js'
|
|
7
|
-
import type { Introspection } from '../Introspection.js'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Every route in the tree this caller may reach, keyed by the template it answers at, and
|
|
11
|
-
* each described exactly as `OPTIONS` on that path describes it — so a key can be taken
|
|
12
|
-
* from the answer and sent back as a request.
|
|
13
|
-
*
|
|
14
|
-
* A route a name cannot spell is here, unlike at `/.rpc` and `/.mcp`: HTTP addresses a
|
|
15
|
-
* route by its path, so leaving one out would make this disagree with the router. A
|
|
16
|
-
* resource no method of which this caller may reach is not here at all — `OPTIONS` answers
|
|
17
|
-
* `403` to one, and an empty entry would still say it exists.
|
|
18
|
-
*
|
|
19
|
-
* Sorted, because a branch is merged whenever its tenant answers and two replicas would
|
|
20
|
-
* otherwise order the same tree differently. Verbs keep the order they were declared in,
|
|
21
|
-
* which is the order `OPTIONS` answers them in.
|
|
22
|
-
*/
|
|
23
|
-
export async function describe(tree: Tree, request: http.Context): Promise<Discovered> {
|
|
24
|
-
const context = describing(request)
|
|
25
|
-
const routes = new Map<string, Mounted>()
|
|
26
|
-
|
|
27
|
-
/*
|
|
28
|
-
* Sequentially: there is no I/O to overlap — an endpoint's own description is read once
|
|
29
|
-
* and memoized — so awaiting the whole tree at once would only allocate every clone of
|
|
30
|
-
* it at the same moment.
|
|
31
|
-
*/
|
|
32
|
-
for (const { segments, verb, method } of tree.walk()) {
|
|
33
|
-
const introspection = await method.explain(context, variables(segments))
|
|
34
|
-
|
|
35
|
-
if (introspection === null) continue
|
|
36
|
-
|
|
37
|
-
const route = template(segments)
|
|
38
|
-
let mounted = routes.get(route)
|
|
39
|
-
|
|
40
|
-
if (mounted === undefined) {
|
|
41
|
-
mounted = { described: resource(method.directives), methods: {} }
|
|
42
|
-
routes.set(route, mounted)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// two declarations can walk to one template — `/a/b` and `/a: { /b: }` — and the walk
|
|
46
|
-
// is in the order `match` tries them, so the first is the one a request would reach
|
|
47
|
-
mounted.methods[verb] ??= introspection
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const described: Record<string, Resource> = {}
|
|
51
|
-
|
|
52
|
-
for (const route of Array.from(routes.keys()).sort()) {
|
|
53
|
-
const { described: stated, methods } = routes.get(route)!
|
|
54
|
-
|
|
55
|
-
// what the resource is, beside the methods it serves; a verb is upper case and cannot
|
|
56
|
-
// collide with either key
|
|
57
|
-
described[route] = { ...stated, ...guarded(methods), ...methods }
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return { routes: described }
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** What the tree answers. An object, so that what is said of the whole of it has somewhere to go. */
|
|
64
|
-
export interface Discovered {
|
|
65
|
-
routes: Record<string, Resource>
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** What one resource is, and what it serves; a verb is upper case, and nothing else here is. */
|
|
69
|
-
export interface Resource extends Described {
|
|
70
|
-
[verb: string]: unknown
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/** One route template as the walk found it, before the two are answered as one. */
|
|
74
|
-
interface Mounted {
|
|
75
|
-
described: Described | null
|
|
76
|
-
methods: Record<string, Introspection>
|
|
77
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import Negotiator from 'negotiator'
|
|
2
|
-
import { types } from '../HTTP/formats/index.js'
|
|
3
|
-
import { DISCOVERY } from '../const.js'
|
|
4
|
-
import type { Context, OutgoingMessage } from '../HTTP/index.js'
|
|
5
|
-
|
|
6
|
-
/** What a browser asks for, and what nothing else here answers with. */
|
|
7
|
-
const HTML = 'text/html'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Where a browser that asked for the trunk is sent. An application serves what it declares,
|
|
11
|
-
* and `/` is usually not one of those — a person who typed the address into a browser is
|
|
12
|
-
* looking for something to look at, and the page is the only thing here that is one.
|
|
13
|
-
*
|
|
14
|
-
* A client that asked for something in particular gets what it asked for: only an `accept`
|
|
15
|
-
* that prefers a page, or one that names no preference at all, is sent here. The second is
|
|
16
|
-
* what an unfurler sends — several ask for anything, and a link to an application would
|
|
17
|
-
* otherwise show nothing — and what `curl` sends, which the page serves no worse than the
|
|
18
|
-
* `405` it used to get.
|
|
19
|
-
*/
|
|
20
|
-
export function looking(context: Context): OutgoingMessage | null {
|
|
21
|
-
if (context.request.method !== 'GET' || context.procedural) return null
|
|
22
|
-
|
|
23
|
-
const accept = context.request.headers.accept
|
|
24
|
-
|
|
25
|
-
if (accept !== undefined && accept.trim() !== ANYTHING) {
|
|
26
|
-
if (new Negotiator(context.request).mediaType([...types, HTML]) !== HTML) return null
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return { status: 302, headers: new Headers({ location: DISCOVERY + '/' }) }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** An `accept` that names nothing, which is the same as naming none. */
|
|
33
|
-
const ANYTHING = '*/*'
|
package/source/Endpoint.test.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { Endpoint } from './Endpoint.js'
|
|
5
|
-
import { Mapping } from './Mapping.js'
|
|
6
|
-
import type { Remote } from '@toa.io/core'
|
|
7
|
-
import type { Parameter } from './RTD/index.js'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* What `Remote.explain` answers is the contract's own object, the same one every time and
|
|
11
|
-
* on every route that mounts the endpoint — which is what this stands in for.
|
|
12
|
-
*/
|
|
13
|
-
function remote(): Promise<Remote> {
|
|
14
|
-
const explanation = {
|
|
15
|
-
input: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
a: { type: 'string' },
|
|
19
|
-
b: { type: 'string' }
|
|
20
|
-
},
|
|
21
|
-
required: ['a', 'b']
|
|
22
|
-
},
|
|
23
|
-
output: null
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return Promise.resolve({
|
|
27
|
-
explain: async () => explanation
|
|
28
|
-
} as unknown as Remote)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const endpoint = (discovery: Promise<Remote>): Endpoint =>
|
|
32
|
-
new Endpoint('parameters', Mapping.create(), discovery)
|
|
33
|
-
|
|
34
|
-
const variable: Parameter[] = [{ name: 'a', value: 'a1b2' }]
|
|
35
|
-
|
|
36
|
-
describe('explain', () => {
|
|
37
|
-
it('should state a route variable as the route, not as the input', async () => {
|
|
38
|
-
const introspection = await endpoint(remote()).explain(variable)
|
|
39
|
-
|
|
40
|
-
assert.deepEqual(Object.keys(introspection.route ?? {}), ['a'])
|
|
41
|
-
assert.deepEqual(Object.keys((introspection.input as any).properties), ['b'])
|
|
42
|
-
assert.deepEqual((introspection.input as any).required, ['b'])
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
it('should leave the operation for the next route that mounts it', async () => {
|
|
46
|
-
const discovery = remote()
|
|
47
|
-
|
|
48
|
-
await endpoint(discovery).explain(variable)
|
|
49
|
-
|
|
50
|
-
// a second route on the same endpoint, taking no variable of its own
|
|
51
|
-
const introspection = await endpoint(discovery).explain([])
|
|
52
|
-
|
|
53
|
-
assert.deepEqual(Object.keys((introspection.input as any).properties), ['a', 'b'])
|
|
54
|
-
assert.deepEqual((introspection.input as any).required, ['a', 'b'])
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('should answer a copy, so what one caller narrows the next still sees', async () => {
|
|
58
|
-
const one = endpoint(remote())
|
|
59
|
-
const first = await one.explain(variable)
|
|
60
|
-
|
|
61
|
-
delete (first.input as any).properties.b
|
|
62
|
-
|
|
63
|
-
const second = await one.explain(variable)
|
|
64
|
-
|
|
65
|
-
assert.deepEqual(Object.keys((second.input as any).properties), ['b'])
|
|
66
|
-
})
|
|
67
|
-
})
|
package/source/Endpoint.ts
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { Readable } from 'node:stream'
|
|
2
|
-
import { Mapping } from './Mapping.js'
|
|
3
|
-
import { take } from './Introspection.js'
|
|
4
|
-
import { parse } from './directives/cache/etag.js'
|
|
5
|
-
import * as http from './HTTP/index.js'
|
|
6
|
-
import type { Introspection, Schema } from './Introspection.js'
|
|
7
|
-
import type { Remote } from '@toa.io/core'
|
|
8
|
-
import type { Remotes } from './Remotes.js'
|
|
9
|
-
import type { Context } from './Context.js'
|
|
10
|
-
import type * as RTD from './RTD/index.js'
|
|
11
|
-
|
|
12
|
-
export class Endpoint implements RTD.Endpoint {
|
|
13
|
-
private readonly endpoint: string
|
|
14
|
-
private readonly mapping: Mapping
|
|
15
|
-
private readonly discovery: Promise<Remote>
|
|
16
|
-
private remote: Remote | null = null
|
|
17
|
-
|
|
18
|
-
/** What the operation says, with what the route takes already split out of it. */
|
|
19
|
-
private introspection: Introspection | null = null
|
|
20
|
-
|
|
21
|
-
public constructor(endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
|
|
22
|
-
this.endpoint = endpoint
|
|
23
|
-
this.mapping = mapping
|
|
24
|
-
this.discovery = discovery
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public async call(
|
|
28
|
-
context: http.Context,
|
|
29
|
-
parameters: RTD.Parameter[]
|
|
30
|
-
): Promise<http.OutgoingMessage> {
|
|
31
|
-
const body = await context.body()
|
|
32
|
-
const query = this.query(context)
|
|
33
|
-
const request = this.mapping.fit(body, query, parameters)
|
|
34
|
-
|
|
35
|
-
this.remote ??= await this.discovery
|
|
36
|
-
|
|
37
|
-
const reply = await this.remote.invoke(this.endpoint, request)
|
|
38
|
-
|
|
39
|
-
if (reply instanceof Error) throw new http.UnprocessableEntity(reply)
|
|
40
|
-
|
|
41
|
-
const message: http.OutgoingMessage = { body: reply }
|
|
42
|
-
|
|
43
|
-
// what the reply carries for a cache to validate by; the `cache` family sets the headers
|
|
44
|
-
if (typeof reply === 'object' && reply !== null && !(reply instanceof Readable)) {
|
|
45
|
-
if ('VERSION' in reply) message.version = reply.VERSION
|
|
46
|
-
|
|
47
|
-
const modified = reply.UPDATED ?? reply.CREATED
|
|
48
|
-
|
|
49
|
-
if (modified !== undefined) message.modified = modified
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return message
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
public selection(): Record<string, Schema> | null {
|
|
56
|
-
return this.mapping.selection()
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
public async explain(parameters: RTD.Parameter[]): Promise<Introspection> {
|
|
60
|
-
this.introspection ??= await this.introspect(parameters)
|
|
61
|
-
|
|
62
|
-
// what a directive narrows is this caller's answer, not the next caller's
|
|
63
|
-
return structuredClone(this.introspection)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* `Remote.explain` answers the contract's own object, whose `input` is the manifest's by
|
|
68
|
-
* reference. What follows takes properties out of it, and two routes mounting one endpoint
|
|
69
|
-
* share one remote — so the copy is what keeps the second from describing what the first
|
|
70
|
-
* took away.
|
|
71
|
-
*/
|
|
72
|
-
private async introspect(parameters: RTD.Parameter[]): Promise<Introspection> {
|
|
73
|
-
this.remote ??= await this.discovery
|
|
74
|
-
|
|
75
|
-
const operation = structuredClone(await this.remote.explain(this.endpoint))
|
|
76
|
-
|
|
77
|
-
// what the operation states it is, is the Introspection's to read and not a resource's:
|
|
78
|
-
// an operation is written without knowledge of any route, and the same one mounted twice
|
|
79
|
-
// is two methods. What a method states is what its route states, which `mcp:tool` gives.
|
|
80
|
-
delete operation.description
|
|
81
|
-
|
|
82
|
-
let route: Record<string, Schema> | null = null
|
|
83
|
-
|
|
84
|
-
// a variable the operation names is taken by the path, so it is not the body's to send
|
|
85
|
-
for (const parameter of parameters) {
|
|
86
|
-
const schema = take(operation, parameter.name)
|
|
87
|
-
|
|
88
|
-
if (schema === undefined) continue
|
|
89
|
-
|
|
90
|
-
route ??= {}
|
|
91
|
-
route[parameter.name] = schema
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const query = this.mapping.explain(operation)
|
|
95
|
-
const introspection: Introspection = {}
|
|
96
|
-
|
|
97
|
-
if (route !== null) introspection.route = route
|
|
98
|
-
|
|
99
|
-
if (query !== null) introspection.query = query
|
|
100
|
-
|
|
101
|
-
Object.assign(introspection, operation)
|
|
102
|
-
|
|
103
|
-
return introspection
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public async close(): Promise<void> {
|
|
107
|
-
this.remote ??= await this.discovery
|
|
108
|
-
|
|
109
|
-
await this.remote.disconnect(INTERRUPT)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
private query(context: http.Context): http.Query {
|
|
113
|
-
const query: http.Query = Object.fromEntries(context.url.searchParams)
|
|
114
|
-
const etag = context.request.headers['if-match']
|
|
115
|
-
|
|
116
|
-
if (etag !== undefined && this.mapping.queryable) query.version = this.version(etag)
|
|
117
|
-
|
|
118
|
-
return query
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
private version(etag: string): number {
|
|
122
|
-
const version = parse(etag)
|
|
123
|
-
|
|
124
|
-
if (version === null) throw new http.BadRequest('Invalid ETag')
|
|
125
|
-
|
|
126
|
-
return version
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
export class EndpointsFactory implements RTD.EndpointsFactory {
|
|
131
|
-
private readonly remotes: Remotes
|
|
132
|
-
|
|
133
|
-
public constructor(remotes: Remotes) {
|
|
134
|
-
this.remotes = remotes
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
public create(method: RTD.syntax.Method, context: Context): Endpoint {
|
|
138
|
-
if (method.mapping === undefined)
|
|
139
|
-
throw new Error('Cannot create Endpoint without mapping')
|
|
140
|
-
|
|
141
|
-
const mapping = Mapping.create(method.mapping.query, method.mapping.paged)
|
|
142
|
-
|
|
143
|
-
const branch = context.extension
|
|
144
|
-
|
|
145
|
-
const namespace = method.mapping.namespace ?? branch?.namespace
|
|
146
|
-
const component = method.mapping.component ?? branch?.component
|
|
147
|
-
|
|
148
|
-
if (namespace === undefined || component === undefined)
|
|
149
|
-
throw new Error('Annotation endpoints must be fully qualified')
|
|
150
|
-
|
|
151
|
-
const discovery = this.remotes.discover(namespace, component, branch?.version)
|
|
152
|
-
|
|
153
|
-
return new Endpoint(method.mapping.endpoint, mapping, discovery)
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const INTERRUPT = true
|
package/source/Factory.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto'
|
|
2
|
-
import { Tenant } from './Tenant.js'
|
|
3
|
-
import { CHANNEL } from './const.js'
|
|
4
|
-
import type { Branch } from './Branch.js'
|
|
5
|
-
import type { syntax } from './RTD/index.js'
|
|
6
|
-
import type { Broadcast } from './Gateway.js'
|
|
7
|
-
import type { Connector, Locator } from '@toa.io/core'
|
|
8
|
-
import type { extensions } from '@toa.io/core/types'
|
|
9
|
-
|
|
10
|
-
export class Factory implements extensions.Factory {
|
|
11
|
-
private readonly host: Host
|
|
12
|
-
|
|
13
|
-
public constructor(host: Host) {
|
|
14
|
-
this.host = host
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public async tenant(locator: Locator, node: syntax.Node): Promise<Connector> {
|
|
18
|
-
const broadcast: Broadcast = await this.host.broadcast(CHANNEL, locator.id)
|
|
19
|
-
const hash = createHash('sha256').update(JSON.stringify(node)).digest('hex')
|
|
20
|
-
|
|
21
|
-
// no timestamp: the tenant stamps each announcement with its own start time
|
|
22
|
-
const branch: Omit<Branch, 'timestamp'> = {
|
|
23
|
-
// boot only ever hands a tenant a component's locator, which always has a namespace
|
|
24
|
-
namespace: locator.namespace!,
|
|
25
|
-
component: locator.name,
|
|
26
|
-
isolated: locator.namespace === 'identity',
|
|
27
|
-
node,
|
|
28
|
-
version: hash
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return new Tenant(broadcast, branch)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
public async service(): Promise<Connector | null> {
|
|
35
|
-
const { service } = await import('./service.js')
|
|
36
|
-
|
|
37
|
-
return await service(this.host)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
|
|
42
|
-
export type Host = extensions.Host
|