@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,57 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
|
|
3
|
-
/** What a resource, a method or a parameter says of itself, in the order it is written. */
|
|
4
|
-
export interface Described {
|
|
5
|
-
title?: string
|
|
6
|
-
description?: string
|
|
7
|
-
|
|
8
|
-
/** what its methods are guarded by; see `guarded` */
|
|
9
|
-
authenticated?: boolean
|
|
10
|
-
private?: boolean
|
|
11
|
-
protected?: boolean
|
|
12
|
-
system?: boolean
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* A bare value is the title: it is the short thing, and the one a client has somewhere to
|
|
17
|
-
* put — a name is an address and reads as one. A sentence is written as a mapping, beside
|
|
18
|
-
* the title it explains, and either may stand alone.
|
|
19
|
-
*/
|
|
20
|
-
export function described(subject: string, value: unknown): Described {
|
|
21
|
-
const stated = typeof value === 'string' ? { title: value } : value
|
|
22
|
-
|
|
23
|
-
assert.ok(
|
|
24
|
-
typeof stated === 'object' && stated !== null && !Array.isArray(stated),
|
|
25
|
-
`Directive ${subject}: the value is a title, or a \`title\` and a \`description\``
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
const { title, description, ...rest } = stated as Record<string, unknown>
|
|
29
|
-
|
|
30
|
-
assert.ok(
|
|
31
|
-
Object.keys(rest).length === 0,
|
|
32
|
-
`Directive ${subject}: unknown ${Object.keys(rest)
|
|
33
|
-
.map((key) => `'${key}'`)
|
|
34
|
-
.join(', ')}`
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
assert.ok(
|
|
38
|
-
title === undefined || (typeof title === 'string' && title.trim().length > 0),
|
|
39
|
-
`Directive ${subject}: a title cannot be empty`
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
assert.ok(
|
|
43
|
-
description === undefined ||
|
|
44
|
-
(typeof description === 'string' && description.trim().length > 0),
|
|
45
|
-
`Directive ${subject}: a description cannot be empty`
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
assert.ok(
|
|
49
|
-
title !== undefined || description !== undefined,
|
|
50
|
-
`Directive ${subject}: says nothing`
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
...(title === undefined ? {} : { title: title as string }),
|
|
55
|
-
...(description === undefined ? {} : { description: description as string })
|
|
56
|
-
}
|
|
57
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { Family, FAMILY } from './Family.js'
|
|
2
|
-
import type { Directive } from './Family.js'
|
|
3
|
-
import type { Described } from './described.js'
|
|
4
|
-
import type { Directives } from '../../RTD/index.js'
|
|
5
|
-
import type { Introspection } from '../../Introspection.js'
|
|
6
|
-
|
|
7
|
-
export const help = new Family()
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* What the resource a method is on says of itself, or nothing where it says nothing. Read
|
|
11
|
-
* from the method because that is what carries a route's directives; every method of one
|
|
12
|
-
* node carries the same declaration.
|
|
13
|
-
*/
|
|
14
|
-
export function resource(directives: Directives): Described | null {
|
|
15
|
-
const stated = Family.node(directives.declared<Directive>(FAMILY))
|
|
16
|
-
|
|
17
|
-
if (stated === null) return null
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
...(stated.title === undefined ? {} : { title: stated.title }),
|
|
21
|
-
...(stated.description === undefined ? {} : { description: stated.description })
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* What a resource is, taken from what its methods are: the flags are a method's, and a
|
|
27
|
-
* resource carries whichever of them any of its methods does — which is what a reader picks
|
|
28
|
-
* one icon by.
|
|
29
|
-
*/
|
|
30
|
-
export function guarded(methods: Record<string, Introspection>): Described {
|
|
31
|
-
const described: Described = {}
|
|
32
|
-
|
|
33
|
-
for (const introspection of Object.values(methods))
|
|
34
|
-
for (const flag of FLAGS) if (introspection[flag] === true) described[flag] = true
|
|
35
|
-
|
|
36
|
-
return described
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const FLAGS = ['authenticated', 'private', 'protected', 'system'] as const
|
|
40
|
-
|
|
41
|
-
export { FAMILY, Family } from './Family.js'
|
|
42
|
-
export { Help } from './Help.js'
|
|
43
|
-
export { Parameters } from './Parameters.js'
|
|
44
|
-
export type { Directive } from './Family.js'
|
|
45
|
-
export type { Described } from './described.js'
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { authorization } from './auth/index.js'
|
|
2
|
-
import { cache } from './cache/index.js'
|
|
3
|
-
import { cors } from './cors/index.js'
|
|
4
|
-
import { dev } from './dev/index.js'
|
|
5
|
-
import { octets } from './octets/index.js'
|
|
6
|
-
import { io } from './io/index.js'
|
|
7
|
-
import { map } from './map/index.js'
|
|
8
|
-
import { mcp } from './mcp/index.js'
|
|
9
|
-
import { req } from './require/index.js'
|
|
10
|
-
import { flow } from './flow/index.js'
|
|
11
|
-
import { help } from './help/index.js'
|
|
12
|
-
import { discovery } from './oauth/index.js'
|
|
13
|
-
import { Site } from '../Discovery/index.js'
|
|
14
|
-
import type { DirectiveFamily } from '../RTD/index.js'
|
|
15
|
-
import type { Interceptor } from '../Interception.js'
|
|
16
|
-
|
|
17
|
-
export const families: DirectiveFamily[] = [
|
|
18
|
-
authorization,
|
|
19
|
-
io,
|
|
20
|
-
cache,
|
|
21
|
-
map,
|
|
22
|
-
mcp,
|
|
23
|
-
help,
|
|
24
|
-
req,
|
|
25
|
-
flow,
|
|
26
|
-
octets,
|
|
27
|
-
dev
|
|
28
|
-
]
|
|
29
|
-
/**
|
|
30
|
-
* `cors` first, so a preflight is answered before anything reads the request; the page is
|
|
31
|
-
* last, and claims its own prefix.
|
|
32
|
-
*/
|
|
33
|
-
export const interceptors: Interceptor[] = [cors, discovery, new Site()]
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Sync } from './lib/throttle/index.js'
|
|
2
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
3
|
-
import type { Input as Context } from '../../io.js'
|
|
4
|
-
import type * as http from '../../HTTP/index.js'
|
|
5
|
-
|
|
6
|
-
export interface Directive {
|
|
7
|
-
precall: (context: Context, parameters: Parameter[]) => void
|
|
8
|
-
|
|
9
|
-
/** Synchronous by contract: settling holds the response, and none of it needs I/O. */
|
|
10
|
-
settle?: (context: Context, response: http.OutgoingMessage) => void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface Constructor {
|
|
14
|
-
validate: (value: unknown) => void
|
|
15
|
-
|
|
16
|
-
new (value: any, sync: Sync, route: string): Directive
|
|
17
|
-
}
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { restrict } from '../../Introspection.js'
|
|
2
|
-
import { Output } from './Output.js'
|
|
3
|
-
import { Input } from './Input.js'
|
|
4
|
-
import { Throttle } from './Throttle.js'
|
|
5
|
-
import { Status } from './Status.js'
|
|
6
|
-
import { Sync } from './lib/throttle/index.js'
|
|
7
|
-
import type * as http from '../../HTTP/index.js'
|
|
8
|
-
import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
|
|
9
|
-
import type { Remotes } from '../../Remotes.js'
|
|
10
|
-
import type { Constructor, Directive } from './Directive.js'
|
|
11
|
-
import type { Introspection } from '../../Introspection.js'
|
|
12
|
-
import { ATOM_GROUP } from '../../const.js'
|
|
13
|
-
import type { extensions } from '@toa.io/core/types'
|
|
14
|
-
|
|
15
|
-
export class IO implements DirectiveFamily<Directive> {
|
|
16
|
-
public readonly name = 'io'
|
|
17
|
-
public readonly mandatory = true
|
|
18
|
-
|
|
19
|
-
private host!: extensions.Host
|
|
20
|
-
|
|
21
|
-
/** Throttling reconciles through the atom of the gateways, one for every directive. */
|
|
22
|
-
private sync: Sync | null = null
|
|
23
|
-
|
|
24
|
-
public mount(host: extensions.Host): void {
|
|
25
|
-
this.host = host
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// eslint-disable-next-line max-params
|
|
29
|
-
public create(
|
|
30
|
-
name: string,
|
|
31
|
-
value: unknown,
|
|
32
|
-
remotes: Remotes,
|
|
33
|
-
route: string
|
|
34
|
-
): Directive {
|
|
35
|
-
if (!(name in constructors))
|
|
36
|
-
throw new Error(`Directive 'io:${name}' is not implemented`)
|
|
37
|
-
|
|
38
|
-
const Directive = constructors[name]
|
|
39
|
-
|
|
40
|
-
Directive.validate(value)
|
|
41
|
-
|
|
42
|
-
if (name === 'throttle') this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
|
|
43
|
-
|
|
44
|
-
return new Directive(value, this.sync!, route)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
public precall(
|
|
48
|
-
directives: Directive[],
|
|
49
|
-
context: http.Context,
|
|
50
|
-
parameters: Parameter[]
|
|
51
|
-
): null {
|
|
52
|
-
let restricted = false
|
|
53
|
-
|
|
54
|
-
for (const directive of directives) {
|
|
55
|
-
restricted ||= directive instanceof Output
|
|
56
|
-
|
|
57
|
-
directive.precall(context, parameters)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (!restricted) DENIAL.precall(context, parameters)
|
|
61
|
-
|
|
62
|
-
return null
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* What a whitelist admits is what the schema states. Without an `io:output` the reply is
|
|
67
|
-
* dropped before it is sent, so there is no output to describe at all.
|
|
68
|
-
*/
|
|
69
|
-
public explain(
|
|
70
|
-
directives: Directive[],
|
|
71
|
-
_: http.Context,
|
|
72
|
-
introspection: Introspection
|
|
73
|
-
): Introspection {
|
|
74
|
-
let restricted = false
|
|
75
|
-
|
|
76
|
-
for (const directive of directives) {
|
|
77
|
-
if (directive instanceof Input)
|
|
78
|
-
introspection.input = restrict(introspection.input, directive.allowed)
|
|
79
|
-
|
|
80
|
-
if (!(directive instanceof Output)) continue
|
|
81
|
-
|
|
82
|
-
restricted = true
|
|
83
|
-
|
|
84
|
-
if (!directive.disabled)
|
|
85
|
-
introspection.output = restrict(introspection.output, directive.allowed)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (!restricted) delete introspection.output
|
|
89
|
-
|
|
90
|
-
return introspection
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
public settle(
|
|
94
|
-
directives: Directive[],
|
|
95
|
-
context: http.Context,
|
|
96
|
-
output: http.OutgoingMessage
|
|
97
|
-
): void {
|
|
98
|
-
for (const directive of directives) directive.settle?.(context, output)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* The ticker belongs to the family rather than to any route's directives, and the
|
|
103
|
-
* factory disposes every route it made — so this runs once per route at shutdown,
|
|
104
|
-
* and disposing an already stopped ticker is what makes that harmless.
|
|
105
|
-
*/
|
|
106
|
-
public dispose(): void {
|
|
107
|
-
this.sync?.dispose()
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const constructors: Record<string, Constructor> = {
|
|
112
|
-
input: Input,
|
|
113
|
-
output: Output,
|
|
114
|
-
status: Status,
|
|
115
|
-
throttle: Throttle
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const DENIAL: Directive = new Output([])
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { BadRequest } from '../../HTTP/index.js'
|
|
2
|
-
import * as schemas from './schemas.js'
|
|
3
|
-
import type { Message } from './Message.js'
|
|
4
|
-
import type { Directive } from './Directive.js'
|
|
5
|
-
import type { Input as Context } from '../../io.js'
|
|
6
|
-
|
|
7
|
-
export class Input implements Directive {
|
|
8
|
-
/** what a client may send, which is therefore what the input schema states */
|
|
9
|
-
public readonly allowed: Set<string>
|
|
10
|
-
|
|
11
|
-
public constructor(permissions: Permissions) {
|
|
12
|
-
this.allowed = new Set(permissions)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public static validate(permissions: unknown): asserts permissions is Permissions {
|
|
16
|
-
schemas.input.validate<Permissions>(permissions, "Incorrect 'io:input' format")
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public precall(context: Context): void {
|
|
20
|
-
// Restrictions are on what the client sent, so the check goes to the front of the
|
|
21
|
-
// pipeline whatever order the families ran in: `auth:delegate` embeds the identity
|
|
22
|
-
// and `map:*` assigns mapped properties, and those additions are the server's own,
|
|
23
|
-
// not input to be restricted.
|
|
24
|
-
context.pipelines.body.unshift((body) => this.check(body))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
private check(body: unknown): Message | Message[] | undefined {
|
|
28
|
-
if (body === undefined) return body
|
|
29
|
-
|
|
30
|
-
try {
|
|
31
|
-
schemas.message.validate<Message | Message[]>(body)
|
|
32
|
-
} catch {
|
|
33
|
-
throw new BadRequest('Invalid request body')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const property = this.violation(body)
|
|
37
|
-
|
|
38
|
-
if (property !== undefined) throw new BadRequest(`Unexpected input: ${property}`)
|
|
39
|
-
|
|
40
|
-
return body
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
private violation(value: Message | Message[]): string | undefined {
|
|
44
|
-
if (!Array.isArray(value))
|
|
45
|
-
return Object.keys(value).find((key) => !this.allowed.has(key))
|
|
46
|
-
|
|
47
|
-
for (const item of value) {
|
|
48
|
-
const property = this.violation(item)
|
|
49
|
-
|
|
50
|
-
if (property !== undefined) return property
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export type Permissions = string[]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export type Message = Record<string, unknown>
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { Stream } from 'node:stream'
|
|
2
|
-
import { console } from 'openspan'
|
|
3
|
-
import * as schemas from './schemas.js'
|
|
4
|
-
import type { Message } from './Message.js'
|
|
5
|
-
import type { Directive } from './Directive.js'
|
|
6
|
-
import type { Input as Context } from '../../io.js'
|
|
7
|
-
import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
8
|
-
|
|
9
|
-
export class Output implements Directive {
|
|
10
|
-
/** whether the reply passes whole, which is when the schema is the operation's own */
|
|
11
|
-
public readonly disabled: boolean = false
|
|
12
|
-
|
|
13
|
-
/** what a reply may carry, which is therefore what the output schema states */
|
|
14
|
-
public readonly allowed: Set<string>
|
|
15
|
-
private readonly omitted: boolean = true
|
|
16
|
-
private readonly permissions: string[] = []
|
|
17
|
-
|
|
18
|
-
public constructor(permissions: Permissions) {
|
|
19
|
-
if (typeof permissions === 'boolean')
|
|
20
|
-
if (permissions) this.disabled = true
|
|
21
|
-
else this.omitted = false
|
|
22
|
-
else this.permissions = permissions
|
|
23
|
-
|
|
24
|
-
this.allowed = new Set(this.permissions)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public static validate(permissions: unknown): asserts permissions is Permissions {
|
|
28
|
-
schemas.output.validate(permissions, "Incorrect 'io:output' format")
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public precall(context: Context): void {
|
|
32
|
-
context.pipelines.response.push(this.restriction(context))
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private restriction(context: Context) {
|
|
36
|
-
return (message: OutgoingMessage): void => {
|
|
37
|
-
// what the gateway built is its own — a code and a message — and a restriction has
|
|
38
|
-
// nothing to say about it; everything else is a reply the operation returned, and is
|
|
39
|
-
// restricted whatever status it carries
|
|
40
|
-
const error = message.authentic === true
|
|
41
|
-
const stream = message.body instanceof Stream
|
|
42
|
-
const none = message.body === undefined || message.body === null
|
|
43
|
-
|
|
44
|
-
if (this.disabled || error || stream || none) return
|
|
45
|
-
|
|
46
|
-
if (typeof message.body !== 'object' || this.permissions.length === 0) {
|
|
47
|
-
if (this.omitted)
|
|
48
|
-
console.warn(
|
|
49
|
-
"Permissions for 'io:output' are not specified properly, response omitted",
|
|
50
|
-
{ path: context.url.pathname }
|
|
51
|
-
)
|
|
52
|
-
|
|
53
|
-
delete message.body
|
|
54
|
-
|
|
55
|
-
return
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
schemas.message.validate<Message>(
|
|
59
|
-
message.body,
|
|
60
|
-
"'io:output' expects response to be an object or array of objects"
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
if (Array.isArray(message.body))
|
|
64
|
-
message.body = message.body.map((entity) => this.fit(entity as Message))
|
|
65
|
-
else message.body = this.fit(message.body)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/** Runs per entity of a collection, hence the set and the absence of intermediates. */
|
|
70
|
-
private fit(message: Message): Message {
|
|
71
|
-
const output: Message = {}
|
|
72
|
-
|
|
73
|
-
// the keys of the entity, so that the response keeps the order it was built in
|
|
74
|
-
for (const key of Object.keys(message))
|
|
75
|
-
if (this.allowed.has(key)) output[key] = message[key]
|
|
76
|
-
|
|
77
|
-
return output
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export type Permissions = string[] | boolean
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { Status } from './Status.js'
|
|
5
|
-
import { Output } from './Output.js'
|
|
6
|
-
import type { Input as Context } from '../../io.js'
|
|
7
|
-
import type { OutgoingMessage } from '../../HTTP/index.js'
|
|
8
|
-
|
|
9
|
-
const status = new Status('status')
|
|
10
|
-
|
|
11
|
-
function context(): Context {
|
|
12
|
-
return {
|
|
13
|
-
pipelines: { body: [], response: [] },
|
|
14
|
-
url: { pathname: '/' }
|
|
15
|
-
} as unknown as Context
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
it('should take the status from the property and remove it', () => {
|
|
19
|
-
const response: OutgoingMessage = { body: { status: 400, error: 'invalid_request' } }
|
|
20
|
-
|
|
21
|
-
status.settle(context(), response)
|
|
22
|
-
|
|
23
|
-
assert.equal(response.status, 400)
|
|
24
|
-
assert.deepEqual(response.body, { error: 'invalid_request' })
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('should leave a reply that states no status alone', () => {
|
|
28
|
-
const response: OutgoingMessage = { body: { id: 'x' } }
|
|
29
|
-
|
|
30
|
-
status.settle(context(), response)
|
|
31
|
-
|
|
32
|
-
assert.equal(response.status, undefined)
|
|
33
|
-
assert.deepEqual(response.body, { id: 'x' })
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
it('should refuse a status that is not one', () => {
|
|
37
|
-
for (const value of ['400', null, {}, true])
|
|
38
|
-
assert.throws(() => {
|
|
39
|
-
status.settle(context(), { body: { status: value } } as OutgoingMessage)
|
|
40
|
-
}, /`io:status` expects 'status' to be a number/)
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
it('should refuse a declaration that is not a property name', () => {
|
|
44
|
-
for (const value of [1, null, {}, ['status']])
|
|
45
|
-
assert.throws(() => Status.validate(value), /`io:status` must be a string/)
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('should have a reply it named the status of restricted, whatever that status is', () => {
|
|
49
|
-
for (const stated of [200, 400]) {
|
|
50
|
-
const ctx = context()
|
|
51
|
-
const output = new Output(['code', 'error'])
|
|
52
|
-
|
|
53
|
-
output.precall(ctx, [])
|
|
54
|
-
|
|
55
|
-
const response: OutgoingMessage = {
|
|
56
|
-
body: { status: stated, code: 'SplxlO', error: 'invalid_grant', secret: 'x' }
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
status.settle(ctx, response)
|
|
60
|
-
|
|
61
|
-
for (const transform of ctx.pipelines.response) transform(response)
|
|
62
|
-
|
|
63
|
-
assert.equal(response.status, stated)
|
|
64
|
-
assert.deepEqual(response.body, { code: 'SplxlO', error: 'invalid_grant' })
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
it('should leave a failure the gateway built alone, on such a route too', () => {
|
|
69
|
-
const ctx = context()
|
|
70
|
-
const output = new Output(['code'])
|
|
71
|
-
|
|
72
|
-
output.precall(ctx, [])
|
|
73
|
-
|
|
74
|
-
// what `Server.fail` builds out of an exception, on a route that also declares `io:status`
|
|
75
|
-
const response: OutgoingMessage = {
|
|
76
|
-
status: 422,
|
|
77
|
-
authentic: true,
|
|
78
|
-
body: { code: 'NOT_FOUND', message: 'nope' }
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
for (const transform of ctx.pipelines.response) transform(response)
|
|
82
|
-
|
|
83
|
-
assert.deepEqual(
|
|
84
|
-
response.body,
|
|
85
|
-
{ code: 'NOT_FOUND', message: 'nope' },
|
|
86
|
-
'a code and a message are not what a restriction has anything to say about'
|
|
87
|
-
)
|
|
88
|
-
})
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import type { Directive } from './Directive.js'
|
|
3
|
-
import type * as http from '../../HTTP/index.js'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The status of the reply, taken from a property of what the operation returned and removed
|
|
7
|
-
* from it — an outcome the operation knows and the transport does not, like a protocol that
|
|
8
|
-
* states its error as a body rather than as a status of its own.
|
|
9
|
-
*
|
|
10
|
-
* Settled rather than transformed, so the status is set before anything reads it. A reply of
|
|
11
|
-
* 300 or above is left as the operation built it, which `io:output` does not restrict: a
|
|
12
|
-
* failure and a success are different shapes, and one list of permitted properties does not
|
|
13
|
-
* describe both.
|
|
14
|
-
*/
|
|
15
|
-
export class Status implements Directive {
|
|
16
|
-
private readonly property: string
|
|
17
|
-
|
|
18
|
-
public constructor(property: unknown) {
|
|
19
|
-
this.property = property as string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public static validate(value: unknown): asserts value is string {
|
|
23
|
-
assert.ok(typeof value === 'string', '`io:status` must be a string')
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public precall(): void {
|
|
27
|
-
// nothing to do until the operation has answered
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public settle(_: unknown, response: http.OutgoingMessage): void {
|
|
31
|
-
const body: unknown = response.body
|
|
32
|
-
|
|
33
|
-
if (body === null || typeof body !== 'object' || !(this.property in body)) return
|
|
34
|
-
|
|
35
|
-
const value: unknown = (body as Record<string, unknown>)[this.property]
|
|
36
|
-
|
|
37
|
-
assert.ok(
|
|
38
|
-
typeof value === 'number',
|
|
39
|
-
`\`io:status\` expects '${this.property}' to be a number`
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
response.status = value
|
|
43
|
-
|
|
44
|
-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
|
|
45
|
-
delete (body as Record<string, unknown>)[this.property]
|
|
46
|
-
}
|
|
47
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { TooManyRequests } from '../../HTTP/index.js'
|
|
2
|
-
import * as schemas from './schemas.js'
|
|
3
|
-
import { parse, Quotas, type Declaration, type Sync } from './lib/throttle/index.js'
|
|
4
|
-
import type * as http from '../../HTTP/index.js'
|
|
5
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
6
|
-
import type { Directive } from './Directive.js'
|
|
7
|
-
|
|
8
|
-
export class Throttle implements Directive {
|
|
9
|
-
private readonly quotas: Quotas
|
|
10
|
-
|
|
11
|
-
public constructor(declaration: Declaration, sync: Sync, route: string) {
|
|
12
|
-
this.quotas = Quotas.create(parse(declaration), route)
|
|
13
|
-
|
|
14
|
-
sync.register(this.quotas)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
public static validate(declaration: unknown): asserts declaration is Declaration {
|
|
18
|
-
schemas.throttle.validate(declaration, "Incorrect 'io:throttle' format")
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public precall(context: http.Context, parameters: Parameter[]): void {
|
|
22
|
-
const retry = this.quotas.check(context, parameters)
|
|
23
|
-
|
|
24
|
-
if (retry > 0) throw new TooManyRequests(retry)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public settle(context: http.Context, output: http.OutgoingMessage): void {
|
|
28
|
-
this.quotas.use(context, output)
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { parse, type Configuration } from './Configuration.js'
|
|
5
|
-
|
|
6
|
-
const rest: Omit<Configuration, 'key' | 'condition'> = {
|
|
7
|
-
interval: 1,
|
|
8
|
-
requests: 1
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
it('should convert key', () => {
|
|
12
|
-
const result: Partial<Configuration> = {
|
|
13
|
-
key: [
|
|
14
|
-
{
|
|
15
|
-
method: 'ip'
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
assert.partialDeepStrictEqual(parse({ key: 'ip', ...rest }), result)
|
|
21
|
-
assert.partialDeepStrictEqual(parse({ key: ['ip'], ...rest }), result)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('should convert condition', () => {
|
|
25
|
-
assert.partialDeepStrictEqual(
|
|
26
|
-
parse({ key: ['ip', 'path'], condition: { status: '404' }, ...rest }),
|
|
27
|
-
{
|
|
28
|
-
condition: [
|
|
29
|
-
{
|
|
30
|
-
method: 'status',
|
|
31
|
-
options: '404'
|
|
32
|
-
}
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
assert.partialDeepStrictEqual(
|
|
38
|
-
parse({ key: 'ip', condition: { status: '404' }, ...rest }),
|
|
39
|
-
{
|
|
40
|
-
condition: [
|
|
41
|
-
{
|
|
42
|
-
method: 'status',
|
|
43
|
-
options: '404'
|
|
44
|
-
}
|
|
45
|
-
]
|
|
46
|
-
}
|
|
47
|
-
)
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
it('should convert a key component that takes an argument', () => {
|
|
51
|
-
assert.partialDeepStrictEqual(parse({ key: { segment: 'id' }, ...rest }), {
|
|
52
|
-
key: [
|
|
53
|
-
{
|
|
54
|
-
method: 'segment',
|
|
55
|
-
options: 'id'
|
|
56
|
-
}
|
|
57
|
-
]
|
|
58
|
-
})
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('should convert a mixed key', () => {
|
|
62
|
-
assert.partialDeepStrictEqual(
|
|
63
|
-
parse({ key: ['route', { segment: 'id' }, 'identity'], ...rest }),
|
|
64
|
-
{
|
|
65
|
-
key: [
|
|
66
|
-
{ method: 'route' },
|
|
67
|
-
{ method: 'segment', options: 'id' },
|
|
68
|
-
{ method: 'identity' }
|
|
69
|
-
]
|
|
70
|
-
}
|
|
71
|
-
)
|
|
72
|
-
})
|