@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,75 +0,0 @@
|
|
|
1
|
-
import { type Component } from '@toa.io/core'
|
|
2
|
-
import type { Maybe } from '@toa.io/core/types'
|
|
3
|
-
import { type Parameter } from '../../RTD/index.js'
|
|
4
|
-
import type { Introspection } from '../../Introspection.js'
|
|
5
|
-
import type * as http from '../../HTTP/index.js'
|
|
6
|
-
import type * as io from '../../io.js'
|
|
7
|
-
|
|
8
|
-
export interface Directive {
|
|
9
|
-
priority?: number
|
|
10
|
-
|
|
11
|
-
authorize: (
|
|
12
|
-
identity: Identity | null,
|
|
13
|
-
context: Context,
|
|
14
|
-
parameters: Parameter[]
|
|
15
|
-
) => boolean | Promise<boolean>
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Whether this admits the identity where that can be told without a request — which is
|
|
19
|
-
* what describing a method is. `undefined` says it cannot be told: a directive reading a
|
|
20
|
-
* route variable's value or the body has neither here, and one that is not implemented
|
|
21
|
-
* says the same by its absence. Nothing here may have an effect on the request.
|
|
22
|
-
*/
|
|
23
|
-
admits?: (
|
|
24
|
-
identity: Identity | null,
|
|
25
|
-
context: Context
|
|
26
|
-
) => boolean | undefined | Promise<boolean | undefined>
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* What this directive makes of what the method says about itself, which is the reverse of
|
|
30
|
-
* what it does to a request: a property it fills from the identity is taken out of the
|
|
31
|
-
* input, because it is not the caller's to send — and a description that offers one invites
|
|
32
|
-
* a caller to name an identity that is not theirs. Nothing here may have an effect on the
|
|
33
|
-
* request.
|
|
34
|
-
*/
|
|
35
|
-
describe?: (introspection: Introspection) => Introspection
|
|
36
|
-
|
|
37
|
-
reply?: (context: Context) => http.OutgoingMessage | null
|
|
38
|
-
|
|
39
|
-
settle?: (context: Context, response: http.OutgoingMessage) => Promise<void>
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface Identity {
|
|
43
|
-
readonly id: string
|
|
44
|
-
roles?: string[]
|
|
45
|
-
permissions?: Record<string, string[]>
|
|
46
|
-
scheme: string | null // null for transient identities
|
|
47
|
-
|
|
48
|
-
/** The component that verified the credentials; none for a transient identity. */
|
|
49
|
-
provider?: Remote
|
|
50
|
-
refresh: boolean
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface Extension {
|
|
54
|
-
identity: Identity | null
|
|
55
|
-
|
|
56
|
-
/** the error code the presented credentials were rejected with, when they were */
|
|
57
|
-
rejection?: string
|
|
58
|
-
|
|
59
|
-
/** whether the identity was checked against the bans while being resolved */
|
|
60
|
-
vetted?: boolean
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface Ban {
|
|
64
|
-
banned: boolean
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export type Context = io.Input & Extension
|
|
68
|
-
export type AuthenticationResult = Maybe<{ identity: Identity; refresh: boolean }>
|
|
69
|
-
|
|
70
|
-
export type Scheme = 'basic' | 'token' | 'bearer' | 'code' | 'otp'
|
|
71
|
-
export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans' | 'otp'
|
|
72
|
-
export type Discovery = Record<Remote, Promise<Component>>
|
|
73
|
-
export type Components = Partial<Record<Remote, Component>>
|
|
74
|
-
|
|
75
|
-
export type Create = (name: string, value: any, ...args: any[]) => Directive
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { Control } from './Control.js'
|
|
2
|
-
import { Exact } from './Exact.js'
|
|
3
|
-
import { matches, tag } from './etag.js'
|
|
4
|
-
import type { Output } from '../../io.js'
|
|
5
|
-
import type { AuthenticatedContext, Directive } from './types.js'
|
|
6
|
-
import type { DirectiveFamily } from '../../RTD/index.js'
|
|
7
|
-
import type * as http from '../../HTTP/index.js'
|
|
8
|
-
|
|
9
|
-
export class Cache implements DirectiveFamily<Directive> {
|
|
10
|
-
public readonly name: string = 'cache'
|
|
11
|
-
public readonly mandatory: boolean = true
|
|
12
|
-
|
|
13
|
-
public create(name: string, value: any): Directive {
|
|
14
|
-
const Class = constructors[name]
|
|
15
|
-
|
|
16
|
-
if (Class === undefined)
|
|
17
|
-
throw new Error(`Directive 'cache:${name}' is not implemented`)
|
|
18
|
-
|
|
19
|
-
return new Class(value)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
public precall(): Output {
|
|
23
|
-
return null
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public async settle(
|
|
27
|
-
directives: Directive[],
|
|
28
|
-
context: AuthenticatedContext,
|
|
29
|
-
response: http.OutgoingMessage
|
|
30
|
-
): Promise<void> {
|
|
31
|
-
const directive = directives[0]
|
|
32
|
-
const method = context.request.method
|
|
33
|
-
const safe = method === 'GET' || method === 'HEAD'
|
|
34
|
-
|
|
35
|
-
response.headers ??= new Headers()
|
|
36
|
-
|
|
37
|
-
validate(context, response, response.headers, safe)
|
|
38
|
-
|
|
39
|
-
// `cache:exact` sets what it is given, whatever the method: whether a reply may be
|
|
40
|
-
// stored at all is not a question about the method's cacheability, and a token
|
|
41
|
-
// endpoint answers a POST it must not have kept
|
|
42
|
-
if (directive instanceof Exact) {
|
|
43
|
-
directive.set(context, response.headers)
|
|
44
|
-
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
if (!safe) return
|
|
49
|
-
|
|
50
|
-
if (directive === undefined) {
|
|
51
|
-
if (context.identity !== null && !Control.disabled(response.headers)) {
|
|
52
|
-
response.headers.set('cache-control', 'private')
|
|
53
|
-
response.headers.append('vary', 'authorization')
|
|
54
|
-
}
|
|
55
|
-
} else directive.set(context, response.headers)
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* The validators a reply carries: the timestamp as `last-modified`, whatever the method, and
|
|
61
|
-
* on a safe one the version as its `etag`. A client that sends the tag back in `if-none-match`
|
|
62
|
-
* already has the representation and is told so, with the tag as it sent it. A reply without
|
|
63
|
-
* a version has no tag: nothing identifies it but its body, and hashing that on every reply
|
|
64
|
-
* is what a version is for.
|
|
65
|
-
*/
|
|
66
|
-
// eslint-disable-next-line max-params
|
|
67
|
-
function validate(
|
|
68
|
-
context: AuthenticatedContext,
|
|
69
|
-
response: http.OutgoingMessage,
|
|
70
|
-
headers: Headers,
|
|
71
|
-
safe: boolean
|
|
72
|
-
): void {
|
|
73
|
-
const { version, modified } = response
|
|
74
|
-
|
|
75
|
-
if (modified !== undefined)
|
|
76
|
-
headers.set('last-modified', new Date(modified).toUTCString())
|
|
77
|
-
|
|
78
|
-
if (version === undefined || !safe) return
|
|
79
|
-
|
|
80
|
-
const sent = context.request.headers['if-none-match']
|
|
81
|
-
|
|
82
|
-
if (sent !== undefined && matches(sent, version)) {
|
|
83
|
-
response.status = 304
|
|
84
|
-
response.body = undefined
|
|
85
|
-
headers.set('etag', sent)
|
|
86
|
-
} else headers.set('etag', tag(version))
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const constructors: Record<string, new (value: any) => Directive> = {
|
|
90
|
-
control: Control,
|
|
91
|
-
exact: Exact
|
|
92
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { match } from 'matchacho'
|
|
2
|
-
import type { AuthenticatedContext, Directive } from './types.js'
|
|
3
|
-
|
|
4
|
-
export class Control implements Directive {
|
|
5
|
-
protected readonly value: string
|
|
6
|
-
private control: string | null = null
|
|
7
|
-
private vary: boolean = false
|
|
8
|
-
|
|
9
|
-
public constructor(value: string) {
|
|
10
|
-
this.value = value
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
public static disabled(headers: Headers): boolean {
|
|
14
|
-
const value = headers.get('cache-control')
|
|
15
|
-
|
|
16
|
-
if (value === null) return false
|
|
17
|
-
|
|
18
|
-
const directives = mask(value)
|
|
19
|
-
|
|
20
|
-
return (directives & NO_STORE) === NO_STORE
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public set(context: AuthenticatedContext, headers: Headers): void {
|
|
24
|
-
this.control ??= this.resolve(context)
|
|
25
|
-
|
|
26
|
-
if (Control.disabled(headers)) return
|
|
27
|
-
|
|
28
|
-
headers.set('cache-control', this.control)
|
|
29
|
-
|
|
30
|
-
if (this.vary) headers.append('vary', 'authorization')
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
protected resolve(request: AuthenticatedContext): string {
|
|
34
|
-
if (request.identity === null) return this.value
|
|
35
|
-
|
|
36
|
-
const directives = mask(this.value)
|
|
37
|
-
|
|
38
|
-
if ((directives & PRIVATE) === PRIVATE) this.vary = true
|
|
39
|
-
|
|
40
|
-
if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC) return 'no-cache, ' + this.value
|
|
41
|
-
|
|
42
|
-
if ((directives & (PUBLIC | PRIVATE)) === 0) {
|
|
43
|
-
this.vary = true
|
|
44
|
-
|
|
45
|
-
return 'private, ' + this.value
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return this.value
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function mask(value: string): number {
|
|
53
|
-
const directives = value.match(DIRECTIVES_RX)
|
|
54
|
-
|
|
55
|
-
if (directives === null) return 0
|
|
56
|
-
|
|
57
|
-
let mask = 0
|
|
58
|
-
|
|
59
|
-
for (const directive of directives)
|
|
60
|
-
mask |= match<number>(
|
|
61
|
-
directive,
|
|
62
|
-
'private',
|
|
63
|
-
PRIVATE,
|
|
64
|
-
'public',
|
|
65
|
-
PUBLIC,
|
|
66
|
-
'no-cache',
|
|
67
|
-
NO_CACHE,
|
|
68
|
-
'no-store',
|
|
69
|
-
NO_STORE,
|
|
70
|
-
0
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
return mask
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/gi
|
|
77
|
-
|
|
78
|
-
const PUBLIC = 1
|
|
79
|
-
const PRIVATE = 2
|
|
80
|
-
const NO_CACHE = 4
|
|
81
|
-
const NO_STORE = 8
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An entity tag is its version in quotes, `"3"`, or the same marked weak, `W/"3"`. A client
|
|
3
|
-
* sends one back in `if-match` and `if-none-match`; what it sent is compared here as a string
|
|
4
|
-
* and parsed only where a version is needed of it.
|
|
5
|
-
*/
|
|
6
|
-
export function tag(version: number): string {
|
|
7
|
-
return `"${version}"`
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** Whether the tag a client sent names the version, strong or weak. */
|
|
11
|
-
export function matches(sent: string, version: number): boolean {
|
|
12
|
-
const strong = tag(version)
|
|
13
|
-
|
|
14
|
-
return sent === strong || sent === 'W/' + strong
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** The version a tag names, or nothing for a tag that is not one. */
|
|
18
|
-
export function parse(sent: string): number | null {
|
|
19
|
-
const strong = sent.startsWith('W/') ? sent.slice(2) : sent
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
strong.length < 3 ||
|
|
23
|
-
strong.length > 34 ||
|
|
24
|
-
!strong.startsWith('"') ||
|
|
25
|
-
!strong.endsWith('"')
|
|
26
|
-
)
|
|
27
|
-
return null
|
|
28
|
-
|
|
29
|
-
const digits = strong.slice(1, -1)
|
|
30
|
-
|
|
31
|
-
for (let i = 0; i < digits.length; i++) {
|
|
32
|
-
const code = digits.charCodeAt(i)
|
|
33
|
-
|
|
34
|
-
if (code < 48 || code > 57) return null
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return Number.parseInt(digits)
|
|
38
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { describe, it, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { CORS } from './CORS.js'
|
|
5
|
-
import type { Input } from '../../io.js'
|
|
6
|
-
|
|
7
|
-
const input = (method: string, headers: Record<string, string>): Input =>
|
|
8
|
-
({
|
|
9
|
-
request: { method, headers },
|
|
10
|
-
pipelines: { body: [], response: [] }
|
|
11
|
-
}) as unknown as Input
|
|
12
|
-
|
|
13
|
-
describe('cors', () => {
|
|
14
|
-
let cors: CORS
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
cors = new CORS()
|
|
18
|
-
cors.reset()
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
it('should answer a preflight', () => {
|
|
22
|
-
const output = cors.intercept(
|
|
23
|
-
input('OPTIONS', {
|
|
24
|
-
origin: 'https://hello.world',
|
|
25
|
-
'access-control-request-method': 'GET'
|
|
26
|
-
})
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
assert.equal(output?.status, 204)
|
|
30
|
-
assert.equal(output?.headers?.get('access-control-allow-origin'), 'https://hello.world')
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
it('should allow OPTIONS, so that one can be preflighted at all', () => {
|
|
34
|
-
const output = cors.intercept(
|
|
35
|
-
input('OPTIONS', {
|
|
36
|
-
origin: 'https://hello.world',
|
|
37
|
-
'access-control-request-method': 'OPTIONS'
|
|
38
|
-
})
|
|
39
|
-
)
|
|
40
|
-
|
|
41
|
-
assert.match(output?.headers?.get('access-control-allow-methods') ?? '', /\bOPTIONS\b/)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
it('should pass an OPTIONS that is not a preflight through', () => {
|
|
45
|
-
/*
|
|
46
|
-
* A browser puts `Origin` on every request whose method is not `GET` or `HEAD`, its own
|
|
47
|
-
* `OPTIONS` included — so answering this one here would put introspection out of reach
|
|
48
|
-
* of any page. Do not restore the `Origin`-only test.
|
|
49
|
-
*/
|
|
50
|
-
const output = cors.intercept(input('OPTIONS', { origin: 'https://hello.world' }))
|
|
51
|
-
|
|
52
|
-
assert.equal(output, null)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('should decorate a reply that is not a preflight', () => {
|
|
56
|
-
const request = input('OPTIONS', { origin: 'https://hello.world' })
|
|
57
|
-
|
|
58
|
-
cors.intercept(request)
|
|
59
|
-
|
|
60
|
-
const message = {}
|
|
61
|
-
|
|
62
|
-
for (const transform of request.pipelines.response) transform(message)
|
|
63
|
-
|
|
64
|
-
const headers = (message as { headers?: Headers }).headers
|
|
65
|
-
|
|
66
|
-
assert.equal(headers?.get('access-control-allow-origin'), 'https://hello.world')
|
|
67
|
-
assert.equal(headers?.get('access-control-allow-credentials'), 'true')
|
|
68
|
-
assert.equal(headers?.get('vary'), 'origin')
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('should pass a request carrying no origin through', () => {
|
|
72
|
-
assert.equal(cors.intercept(input('OPTIONS', {})), null)
|
|
73
|
-
assert.equal(cors.intercept(input('GET', {})), null)
|
|
74
|
-
})
|
|
75
|
-
})
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { Input, Output } from '../../io.js'
|
|
2
|
-
import type { Interceptor } from '../../Interception.js'
|
|
3
|
-
|
|
4
|
-
/** What is allowed before any directive asks for more. */
|
|
5
|
-
const REQUEST_HEADERS = [
|
|
6
|
-
'accept',
|
|
7
|
-
'authorization',
|
|
8
|
-
'content-type',
|
|
9
|
-
'if-match',
|
|
10
|
-
'if-none-match'
|
|
11
|
-
]
|
|
12
|
-
|
|
13
|
-
export class CORS implements Interceptor {
|
|
14
|
-
public readonly name = 'cors'
|
|
15
|
-
|
|
16
|
-
private requestHeaders = new Set<string>(REQUEST_HEADERS)
|
|
17
|
-
|
|
18
|
-
private readonly headers = new Headers({
|
|
19
|
-
'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, LOCK, UNLOCK, OPTIONS',
|
|
20
|
-
'access-control-allow-credentials': 'true',
|
|
21
|
-
'access-control-allow-headers': this.allowedHeaders(),
|
|
22
|
-
'access-control-max-age': '3600',
|
|
23
|
-
'cache-control': 'max-age=3600',
|
|
24
|
-
vary: 'origin'
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
public intercept(input: Input): Output {
|
|
28
|
-
const origin = input.request.headers.origin
|
|
29
|
-
const requested = input.request.headers['access-control-request-method']
|
|
30
|
-
|
|
31
|
-
/*
|
|
32
|
-
* A preflight is `OPTIONS` carrying `Access-Control-Request-Method`, and only that. A
|
|
33
|
-
* browser puts `Origin` on every request whose method is not `GET` or `HEAD` — its own
|
|
34
|
-
* `OPTIONS` included, same-origin or not — so answering that one here would put
|
|
35
|
-
* introspection out of reach of any page.
|
|
36
|
-
*/
|
|
37
|
-
if (origin !== undefined && requested !== undefined && input.request.method === 'OPTIONS')
|
|
38
|
-
return this.preflightResponse(origin)
|
|
39
|
-
|
|
40
|
-
input.pipelines.response.push((output) => {
|
|
41
|
-
output.headers ??= new Headers()
|
|
42
|
-
|
|
43
|
-
if (origin !== undefined) {
|
|
44
|
-
output.headers.set('access-control-allow-origin', origin)
|
|
45
|
-
output.headers.set('access-control-allow-credentials', 'true')
|
|
46
|
-
output.headers.set(
|
|
47
|
-
'access-control-expose-headers',
|
|
48
|
-
'authorization, content-type, content-length, date, etag, last-modified'
|
|
49
|
-
)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const method = input.request.method
|
|
53
|
-
|
|
54
|
-
if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS')
|
|
55
|
-
output.headers.append('vary', 'origin')
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
return null
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public reset(): void {
|
|
62
|
-
this.requestHeaders = new Set(REQUEST_HEADERS)
|
|
63
|
-
this.headers.set('access-control-allow-headers', this.allowedHeaders())
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
public allow(header: string): void {
|
|
67
|
-
this.requestHeaders.add(header.toLowerCase())
|
|
68
|
-
this.headers.set('access-control-allow-headers', this.allowedHeaders())
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Sorted, because the set is filled as branches merge and their order is not
|
|
73
|
-
* fixed — an unsorted value would differ between otherwise identical processes,
|
|
74
|
-
* and between one restart and the next.
|
|
75
|
-
*/
|
|
76
|
-
private allowedHeaders(): string {
|
|
77
|
-
return Array.from(this.requestHeaders).sort().join(', ')
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
private preflightResponse(origin: string): Output {
|
|
81
|
-
this.headers.set('access-control-allow-origin', origin)
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
status: 204,
|
|
85
|
-
headers: this.headers
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { Stub } from './Stub.js'
|
|
2
|
-
import { Throw } from './Throw.js'
|
|
3
|
-
import { Sleep } from './Sleep.js'
|
|
4
|
-
import { Faulty } from './Faulty.js'
|
|
5
|
-
import { type Directive } from './types.js'
|
|
6
|
-
import type { Input, Output } from '../../io.js'
|
|
7
|
-
import type { DirectiveFamily } from '../../RTD/index.js'
|
|
8
|
-
|
|
9
|
-
export class Development implements DirectiveFamily<Directive> {
|
|
10
|
-
public readonly name: string = 'dev'
|
|
11
|
-
public readonly mandatory: boolean = false
|
|
12
|
-
|
|
13
|
-
public create(name: string, value: unknown): Directive {
|
|
14
|
-
const Class = constructors[name]
|
|
15
|
-
|
|
16
|
-
if (Class === undefined) throw new Error(`Directive 'dev:${name}' is not implemented`)
|
|
17
|
-
|
|
18
|
-
return new Class(value)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public async precall(directives: Directive[], input: Input): Promise<Output> {
|
|
22
|
-
let output = null
|
|
23
|
-
|
|
24
|
-
for (const directive of directives) {
|
|
25
|
-
const out = await directive.apply(input)
|
|
26
|
-
|
|
27
|
-
if (out !== null)
|
|
28
|
-
if (output !== null) throw new Error('`dev` directives ambiguous output')
|
|
29
|
-
else output = out
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return output
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const constructors: Record<string, new (value: any) => Directive> = {
|
|
37
|
-
stub: Stub,
|
|
38
|
-
throw: Throw,
|
|
39
|
-
sleep: Sleep,
|
|
40
|
-
faulty: Faulty
|
|
41
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { ServiceUnavailable } from '../../HTTP/index.js'
|
|
3
|
-
import { cors } from '../cors/index.js'
|
|
4
|
-
import type { Output } from '../../io.js'
|
|
5
|
-
import type { Directive } from './types.js'
|
|
6
|
-
|
|
7
|
-
export class Faulty implements Directive {
|
|
8
|
-
private static readonly warned = false
|
|
9
|
-
private readonly probability: number
|
|
10
|
-
|
|
11
|
-
public constructor(probability: number) {
|
|
12
|
-
assert.ok(
|
|
13
|
-
typeof probability === 'number',
|
|
14
|
-
'`dev:faulty` directive value must be a number'
|
|
15
|
-
)
|
|
16
|
-
assert.ok(
|
|
17
|
-
probability > 0 && probability <= 1,
|
|
18
|
-
'`dev:faulty` directive value must be in the range (0, 1]'
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
this.probability = probability
|
|
22
|
-
|
|
23
|
-
cors.allow('faulty')
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
public async apply(): Promise<Output> {
|
|
27
|
-
if (Math.random() > this.probability) return null
|
|
28
|
-
|
|
29
|
-
throw new ServiceUnavailable()
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { setTimeout } from 'node:timers/promises'
|
|
3
|
-
import { console } from 'openspan'
|
|
4
|
-
import { cors } from '../cors/index.js'
|
|
5
|
-
import { BadRequest } from '../../HTTP/index.js'
|
|
6
|
-
import type { Directive } from './types.js'
|
|
7
|
-
import type { Input, Output } from '../../io.js'
|
|
8
|
-
|
|
9
|
-
export class Sleep implements Directive {
|
|
10
|
-
private static warned = false
|
|
11
|
-
private readonly maximum: number
|
|
12
|
-
|
|
13
|
-
public constructor(value: number) {
|
|
14
|
-
assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
|
|
15
|
-
|
|
16
|
-
if (!Sleep.warned) {
|
|
17
|
-
console.warn('Sleep directive is enabled', { maximum: value })
|
|
18
|
-
Sleep.warned = true
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
cors.allow('sleep')
|
|
22
|
-
this.maximum = value
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
public async apply(input: Input): Promise<Output> {
|
|
26
|
-
const value = input.request.headers.sleep as string | undefined
|
|
27
|
-
|
|
28
|
-
if (value === undefined) return null
|
|
29
|
-
|
|
30
|
-
const [min, max] = this.parse(value)
|
|
31
|
-
|
|
32
|
-
if (min < 0 || max < 0 || min > max || max > this.maximum)
|
|
33
|
-
throw new BadRequest('Invalid sleep duration')
|
|
34
|
-
|
|
35
|
-
const duration = Math.floor(Math.random() * (max - min)) + min
|
|
36
|
-
|
|
37
|
-
await setTimeout(duration)
|
|
38
|
-
|
|
39
|
-
return null
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private parse(value: string): [number, number] {
|
|
43
|
-
try {
|
|
44
|
-
const pair = JSON.parse(value) as [number, number]
|
|
45
|
-
|
|
46
|
-
if (!Array.isArray(pair) || pair.length !== 2) throw new Error()
|
|
47
|
-
|
|
48
|
-
return pair
|
|
49
|
-
} catch {
|
|
50
|
-
throw new BadRequest('Invalid sleep duration value')
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Output } from '../../io.js'
|
|
2
|
-
import type { Directive } from './types.js'
|
|
3
|
-
|
|
4
|
-
export class Stub implements Directive {
|
|
5
|
-
private readonly value: unknown
|
|
6
|
-
|
|
7
|
-
public constructor(value: unknown) {
|
|
8
|
-
this.value = value
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
public apply(): Output {
|
|
12
|
-
return { body: this.value }
|
|
13
|
-
}
|
|
14
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { Output } from '../../io.js'
|
|
2
|
-
import type { Directive } from './types.js'
|
|
3
|
-
|
|
4
|
-
export class Throw implements Directive {
|
|
5
|
-
private readonly message: string
|
|
6
|
-
|
|
7
|
-
public constructor(message: string) {
|
|
8
|
-
this.message = message
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
public apply(): Output {
|
|
12
|
-
throw new Error(this.message)
|
|
13
|
-
}
|
|
14
|
-
}
|