@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,66 +0,0 @@
|
|
|
1
|
-
import { documents, type Documents } from './documents.js'
|
|
2
|
-
import type * as http from '../../HTTP/index.js'
|
|
3
|
-
import type { Input, Output } from '../../io.js'
|
|
4
|
-
import type { Interceptor } from '../../Interception.js'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* What a client reads before it can authenticate: where the authorization server is, and
|
|
8
|
-
* what this resource expects. Both are fixed paths a specification names, both must be
|
|
9
|
-
* answered to anyone, and both are a function of the annotation alone — nothing is read to
|
|
10
|
-
* build them, so they are built once per authority and served as they are.
|
|
11
|
-
*
|
|
12
|
-
* An interceptor rather than a route because `auth` runs before any directive: a client
|
|
13
|
-
* re-reading discovery while holding a stale token would have it verified, and then be
|
|
14
|
-
* refused a document that has to be public.
|
|
15
|
-
*/
|
|
16
|
-
export class Discovery implements Interceptor {
|
|
17
|
-
/**
|
|
18
|
-
* A map, because the key is the request's authority and an unconfigured host is passed
|
|
19
|
-
* through as itself: `Host: constructor` names something a plain object answers on its own.
|
|
20
|
-
*/
|
|
21
|
-
private readonly authorities = new Map<string, Documents>()
|
|
22
|
-
|
|
23
|
-
public mount(options: http.Options): void {
|
|
24
|
-
this.authorities.clear()
|
|
25
|
-
|
|
26
|
-
if (options.oauth === undefined) return
|
|
27
|
-
|
|
28
|
-
/*
|
|
29
|
-
* `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
|
|
30
|
-
* authorization server be one — the loopback exception is a client's redirect URI, not
|
|
31
|
-
* a server's address. A gateway served without TLS has no authorization server a client
|
|
32
|
-
* may use, and naming it `http` would hide that behind documents none should accept.
|
|
33
|
-
*
|
|
34
|
-
* The host is the configured one, not the request's, which is the client's to write: a
|
|
35
|
-
* forged one would have these documents name someone else's token endpoint.
|
|
36
|
-
*/
|
|
37
|
-
for (const [authority, host] of Object.entries(options.authorities))
|
|
38
|
-
this.authorities.set(authority, documents(`https://${host}`, options.oauth))
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public reset(): void {
|
|
42
|
-
this.authorities.clear()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
public intercept(input: Input): Output {
|
|
46
|
-
const known = this.authorities.get(input.authority)
|
|
47
|
-
|
|
48
|
-
if (known === undefined) return null
|
|
49
|
-
|
|
50
|
-
// every reply, not just a document's: the challenge is what points a client here
|
|
51
|
-
input.pipelines.response.push((response) => {
|
|
52
|
-
if (response.status !== UNAUTHORIZED) return
|
|
53
|
-
|
|
54
|
-
response.headers ??= new Headers()
|
|
55
|
-
response.headers.set('www-authenticate', known.challenge(input.url.pathname))
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
const body = known.read(input.url.pathname)
|
|
59
|
-
|
|
60
|
-
if (body === undefined) return null
|
|
61
|
-
|
|
62
|
-
return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const UNAUTHORIZED = 401
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import type { OAuth } from '../../Annotation.js'
|
|
2
|
-
|
|
3
|
-
/** The discovery documents of one authority, and the challenge that points at them. */
|
|
4
|
-
export interface Documents {
|
|
5
|
-
/** The document a path names, or nothing when it names none. */
|
|
6
|
-
read: (pathname: string) => object | undefined
|
|
7
|
-
|
|
8
|
-
/** `WWW-Authenticate` for a request to this path, which names the resource it failed at. */
|
|
9
|
-
challenge: (pathname: string) => string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function documents(issuer: string, oauth: OAuth): Documents {
|
|
13
|
-
const server = authorizationServer(issuer, oauth)
|
|
14
|
-
const resources = protectedResources(issuer, oauth)
|
|
15
|
-
const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
|
|
16
|
-
|
|
17
|
-
function read(pathname: string): object | undefined {
|
|
18
|
-
if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
|
|
19
|
-
return server
|
|
20
|
-
|
|
21
|
-
if (pathname.startsWith(PROTECTED_RESOURCE))
|
|
22
|
-
return resources.get(pathname.slice(PROTECTED_RESOURCE.length))
|
|
23
|
-
|
|
24
|
-
return undefined
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function challenge(pathname: string): string {
|
|
28
|
-
return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return { read, challenge }
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* RFC 8414. `authorization_endpoint` is the application's own page and may be anywhere;
|
|
36
|
-
* everything else this extension serves. Both flags are load-bearing for a client that
|
|
37
|
-
* prefers Client ID Metadata Documents: without either it falls back to registration.
|
|
38
|
-
*/
|
|
39
|
-
function authorizationServer(issuer: string, oauth: OAuth): object {
|
|
40
|
-
const metadata: Record<string, unknown> = {
|
|
41
|
-
issuer,
|
|
42
|
-
authorization_endpoint: oauth.authorize,
|
|
43
|
-
token_endpoint: `${issuer}${TOKEN}`,
|
|
44
|
-
response_types_supported: ['code'],
|
|
45
|
-
grant_types_supported: ['authorization_code'],
|
|
46
|
-
code_challenge_methods_supported: ['S256'],
|
|
47
|
-
token_endpoint_auth_methods_supported: ['none'],
|
|
48
|
-
client_id_metadata_document_supported: true,
|
|
49
|
-
authorization_response_iss_parameter_supported: true
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (oauth.registration === 'open')
|
|
53
|
-
metadata.registration_endpoint = `${issuer}${REGISTRATION}`
|
|
54
|
-
|
|
55
|
-
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
56
|
-
|
|
57
|
-
return metadata
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* RFC 9728, keyed by the path the well-known segment is followed by: a client resolving
|
|
62
|
-
* `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
|
|
63
|
-
* no path reads the document at the origin.
|
|
64
|
-
*/
|
|
65
|
-
function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
|
|
66
|
-
const map = new Map<string, object>()
|
|
67
|
-
|
|
68
|
-
for (const path of oauth.resources ?? [])
|
|
69
|
-
map.set(canonical(path), resource(issuer, canonical(path), oauth))
|
|
70
|
-
|
|
71
|
-
map.set('', resource(issuer, '', oauth))
|
|
72
|
-
|
|
73
|
-
return map
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function resource(issuer: string, path: string, oauth: OAuth): object {
|
|
77
|
-
const metadata: Record<string, unknown> = {
|
|
78
|
-
resource: issuer + path,
|
|
79
|
-
authorization_servers: [issuer],
|
|
80
|
-
bearer_methods_supported: ['header']
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
|
|
84
|
-
|
|
85
|
-
return metadata
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/** The document a request to this path was refused against: the longest resource holding it. */
|
|
89
|
-
function suffix(oauth: OAuth, pathname: string): string {
|
|
90
|
-
let longest = ''
|
|
91
|
-
|
|
92
|
-
for (const path of oauth.resources ?? [])
|
|
93
|
-
if (pathname.startsWith(path) && path.length > longest.length) longest = path
|
|
94
|
-
|
|
95
|
-
return canonical(longest)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* A resource is identified without its trailing slash — the form MCP asks for — while a
|
|
100
|
-
* route is declared with one, so `/mcp/` identifies `…/mcp`.
|
|
101
|
-
*/
|
|
102
|
-
function canonical(path: string): string {
|
|
103
|
-
return path.endsWith('/') ? path.slice(0, -1) : path
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const AUTHORIZATION_SERVER = '/.well-known/oauth-authorization-server'
|
|
107
|
-
const PROTECTED_RESOURCE = '/.well-known/oauth-protected-resource'
|
|
108
|
-
const OPENID_CONFIGURATION = '/.well-known/openid-configuration'
|
|
109
|
-
const TOKEN = '/identity/grants/'
|
|
110
|
-
const REGISTRATION = '/identity/clients/'
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { Directive } from './Directive.js'
|
|
3
|
-
import type { Output } from '../../io.js'
|
|
4
|
-
|
|
5
|
-
export class Context extends Directive {
|
|
6
|
-
public readonly targeted = false
|
|
7
|
-
public readonly storage: string
|
|
8
|
-
|
|
9
|
-
public constructor(value: unknown) {
|
|
10
|
-
super()
|
|
11
|
-
|
|
12
|
-
assert.ok(
|
|
13
|
-
typeof value === 'string',
|
|
14
|
-
"Directive 'octets:context' must must be a string"
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
this.storage = value
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public async apply(): Promise<Output> {
|
|
21
|
-
return null
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { Readable } from 'stream'
|
|
2
|
-
import { NotFound } from '../../HTTP/index.js'
|
|
3
|
-
import * as schemas from './schemas.js'
|
|
4
|
-
import { Workflow } from './workflows/index.js'
|
|
5
|
-
import { Directive } from './Directive.js'
|
|
6
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
7
|
-
import type { Unit, Location } from './workflows/index.js'
|
|
8
|
-
import type { Maybe } from '@toa.io/core/types'
|
|
9
|
-
import type { Component } from '@toa.io/core'
|
|
10
|
-
import type { Output } from '../../io.js'
|
|
11
|
-
import type { Input } from './types.js'
|
|
12
|
-
import type { Remotes } from '../../Remotes.js'
|
|
13
|
-
import type { Entry } from '@toa.io/extensions.storages'
|
|
14
|
-
|
|
15
|
-
export class Delete extends Directive {
|
|
16
|
-
public readonly targeted = true
|
|
17
|
-
|
|
18
|
-
private readonly workflow?: Workflow
|
|
19
|
-
private readonly discovery: Promise<Component>
|
|
20
|
-
private storage!: Component
|
|
21
|
-
|
|
22
|
-
public constructor(
|
|
23
|
-
options: Options | null,
|
|
24
|
-
discovery: Promise<Component>,
|
|
25
|
-
remotes: Remotes
|
|
26
|
-
) {
|
|
27
|
-
super()
|
|
28
|
-
schemas.remove.validate(options)
|
|
29
|
-
|
|
30
|
-
if (options?.workflow !== undefined)
|
|
31
|
-
this.workflow = new Workflow(options.workflow, remotes)
|
|
32
|
-
|
|
33
|
-
this.discovery = discovery
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public async apply(
|
|
37
|
-
storage: string,
|
|
38
|
-
input: Input,
|
|
39
|
-
parameters: Parameter[]
|
|
40
|
-
): Promise<Output> {
|
|
41
|
-
this.storage ??= await this.discovery
|
|
42
|
-
|
|
43
|
-
const output: Output = {}
|
|
44
|
-
|
|
45
|
-
if (this.workflow !== undefined) {
|
|
46
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
47
|
-
input: {
|
|
48
|
-
storage,
|
|
49
|
-
path: input.request.url
|
|
50
|
-
}
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
if (entry instanceof Error) throw new NotFound()
|
|
54
|
-
|
|
55
|
-
output.status = 202
|
|
56
|
-
output.body = Readable.from(this.execute(input, storage, entry, parameters))
|
|
57
|
-
} else await this.delete(storage, input)
|
|
58
|
-
|
|
59
|
-
return output
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
private async delete(storage: string, input: Input): Promise<void> {
|
|
63
|
-
await this.storage.invoke('delete', {
|
|
64
|
-
input: {
|
|
65
|
-
storage,
|
|
66
|
-
path: input.request.url
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// eslint-disable-next-line max-params
|
|
72
|
-
private async *execute(
|
|
73
|
-
input: Input,
|
|
74
|
-
storage: string,
|
|
75
|
-
entry: Entry,
|
|
76
|
-
parameters: Parameter[]
|
|
77
|
-
): AsyncGenerator {
|
|
78
|
-
const location: Location = {
|
|
79
|
-
storage,
|
|
80
|
-
authority: input.authority,
|
|
81
|
-
path: input.request.url
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
for await (const chunk of this.workflow!.execute(location, entry, parameters)) {
|
|
85
|
-
yield chunk
|
|
86
|
-
|
|
87
|
-
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk) return
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
await this.delete(storage, input)
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface Options {
|
|
95
|
-
workflow?: Unit[] | Unit
|
|
96
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { Input } from './types.js'
|
|
2
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
3
|
-
import type { Introspection } from '../../Introspection.js'
|
|
4
|
-
import type * as io from '../../io.js'
|
|
5
|
-
|
|
6
|
-
export abstract class Directive {
|
|
7
|
-
public readonly name = 'octets.' + this.constructor.name.toLowerCase()
|
|
8
|
-
public abstract readonly targeted: boolean
|
|
9
|
-
|
|
10
|
-
public abstract apply(
|
|
11
|
-
storage: string,
|
|
12
|
-
input: Input,
|
|
13
|
-
parameters: Parameter[]
|
|
14
|
-
): Promise<io.Output>
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* What a caller has to know to make the request. Only sending a file takes anything a
|
|
18
|
-
* schema does not already say; reading one and deleting one take nothing.
|
|
19
|
-
*/
|
|
20
|
-
public describe?(introspection: Introspection): void
|
|
21
|
-
}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { Forbidden, NotFound } from '../../HTTP/index.js'
|
|
2
|
-
import * as schemas from './schemas.js'
|
|
3
|
-
import { Directive } from './Directive.js'
|
|
4
|
-
import type { Maybe } from '@toa.io/core/types'
|
|
5
|
-
import type { Entry, Stream } from '@toa.io/extensions.storages'
|
|
6
|
-
import type { Component } from '@toa.io/core'
|
|
7
|
-
import type { Output } from '../../io.js'
|
|
8
|
-
import type { Input } from './types.js'
|
|
9
|
-
|
|
10
|
-
export class Get extends Directive {
|
|
11
|
-
public readonly targeted = true
|
|
12
|
-
|
|
13
|
-
private readonly options: Required<Options> = {
|
|
14
|
-
meta: false
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
private readonly discovery: Promise<Component>
|
|
18
|
-
private storage!: Component
|
|
19
|
-
|
|
20
|
-
public constructor(options: Options | null, discovery: Promise<Component>) {
|
|
21
|
-
super()
|
|
22
|
-
|
|
23
|
-
schemas.get.validate(options)
|
|
24
|
-
Object.assign(this.options, options)
|
|
25
|
-
|
|
26
|
-
this.discovery = discovery
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
public async apply(storage: string, input: Input): Promise<Output> {
|
|
30
|
-
this.storage ??= await this.discovery
|
|
31
|
-
|
|
32
|
-
if (input.subtype === 'octets.entry')
|
|
33
|
-
if (this.options.meta) return this.head(storage, input)
|
|
34
|
-
else throw new Forbidden('Metadata is not accessible')
|
|
35
|
-
else return await this.get(storage, input)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
private async get(storage: string, input: Input): Promise<Output> {
|
|
39
|
-
if ('if-none-match' in input.request.headers) return { status: 304 }
|
|
40
|
-
|
|
41
|
-
const endpoint = input.request.method === 'GET' ? 'get' : 'head'
|
|
42
|
-
|
|
43
|
-
const entry = await this.storage.invoke<Maybe<Stream>>(endpoint, {
|
|
44
|
-
input: {
|
|
45
|
-
storage,
|
|
46
|
-
path: input.request.url,
|
|
47
|
-
range: input.request.headers.range,
|
|
48
|
-
agent: input.request.headers['user-agent']
|
|
49
|
-
}
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
if (entry instanceof Error) throw new NotFound()
|
|
53
|
-
|
|
54
|
-
const headers = new Headers({
|
|
55
|
-
'content-type': entry.type,
|
|
56
|
-
etag: `"${entry.checksum}"`
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
if (entry.range !== undefined) headers.set('content-range', entry.range)
|
|
60
|
-
|
|
61
|
-
// an absent content-length is what says the length is unknown; naming the encoding
|
|
62
|
-
// is redundant over HTTP/1.1 and forbidden over HTTP/2
|
|
63
|
-
if (entry.size !== null) headers.set('content-length', entry.size.toString())
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
status: entry.partial === true ? 206 : 200,
|
|
67
|
-
headers,
|
|
68
|
-
body: endpoint === 'get' ? entry.stream : undefined
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
private async head(storage: string, input: Input): Promise<Output> {
|
|
73
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
74
|
-
input: {
|
|
75
|
-
storage,
|
|
76
|
-
path: input.request.url
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
if (entry instanceof Error) throw new NotFound()
|
|
81
|
-
|
|
82
|
-
return { body: entry }
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export interface Options {
|
|
87
|
-
meta?: boolean
|
|
88
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { NotFound } from '../../HTTP/index.js'
|
|
2
|
-
import { Context } from './Context.js'
|
|
3
|
-
import { Put } from './Put.js'
|
|
4
|
-
import { Get } from './Get.js'
|
|
5
|
-
import { Delete } from './Delete.js'
|
|
6
|
-
import { WorkflowDirective } from './Workflow.js'
|
|
7
|
-
import type { Directive } from './Directive.js'
|
|
8
|
-
import type { Output } from '../../io.js'
|
|
9
|
-
import type { Component } from '@toa.io/core'
|
|
10
|
-
import type { Remotes } from '../../Remotes.js'
|
|
11
|
-
import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
|
|
12
|
-
import type { Introspection } from '../../Introspection.js'
|
|
13
|
-
import type { Input } from './types.js'
|
|
14
|
-
|
|
15
|
-
export class Octets implements DirectiveFamily<Directive> {
|
|
16
|
-
public readonly name: string = 'octets'
|
|
17
|
-
public readonly mandatory: boolean = false
|
|
18
|
-
|
|
19
|
-
private discovery = null as unknown as Promise<Component>
|
|
20
|
-
|
|
21
|
-
public create(name: string, value: any, remotes: Remotes): Directive {
|
|
22
|
-
const Class = DIRECTIVES[name]
|
|
23
|
-
|
|
24
|
-
if (Class === undefined)
|
|
25
|
-
throw new Error(`Directive 'octets:${name}' is not implemented`)
|
|
26
|
-
|
|
27
|
-
this.discovery ??= remotes.discover('exposition', 'octets')
|
|
28
|
-
|
|
29
|
-
return new Class(value, this.discovery, remotes)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** What the request takes, which only sending a file says anything about. */
|
|
33
|
-
public explain(directives: Directive[], _: Input, introspection: Introspection): Introspection {
|
|
34
|
-
for (const directive of directives) directive.describe?.(introspection)
|
|
35
|
-
|
|
36
|
-
return introspection
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
public async precall(
|
|
40
|
-
directives: Directive[],
|
|
41
|
-
input: Input,
|
|
42
|
-
parameters: Parameter[]
|
|
43
|
-
): Promise<Output> {
|
|
44
|
-
let context: Context | null = null
|
|
45
|
-
let action: Directive | null = null
|
|
46
|
-
|
|
47
|
-
for (const directive of directives)
|
|
48
|
-
if (directive instanceof Context) context ??= directive
|
|
49
|
-
else if (action === null) action = directive
|
|
50
|
-
else throw new Error('Octets action is ambiguous')
|
|
51
|
-
|
|
52
|
-
if (action === null) return null
|
|
53
|
-
|
|
54
|
-
// noinspection PointlessBooleanExpressionJS
|
|
55
|
-
if (context === null) throw new Error('Octets context is not defined')
|
|
56
|
-
|
|
57
|
-
const targeted = input.request.url[input.request.url.length - 1] !== '/'
|
|
58
|
-
|
|
59
|
-
if (targeted !== action.targeted)
|
|
60
|
-
throw new NotFound(
|
|
61
|
-
`Trailing slash is ${action.targeted ? 'redundant' : 'required'}`
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
// noinspection JSObjectNullOrUndefined
|
|
65
|
-
return await action.apply(context.storage, input, parameters)
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const DIRECTIVES: Record<string, Constructor> = {
|
|
70
|
-
context: Context,
|
|
71
|
-
put: Put,
|
|
72
|
-
get: Get,
|
|
73
|
-
head: Get,
|
|
74
|
-
delete: Delete,
|
|
75
|
-
workflow: WorkflowDirective
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
type Constructor = new (
|
|
79
|
-
value: any,
|
|
80
|
-
discovery: Promise<Component>,
|
|
81
|
-
remotes: Remotes
|
|
82
|
-
) => Directive
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { PassThrough } from 'node:stream'
|
|
2
|
-
import { match } from 'matchacho'
|
|
3
|
-
import * as http from '../../HTTP/index.js'
|
|
4
|
-
import { cors } from '../cors/index.js'
|
|
5
|
-
import * as schemas from './schemas.js'
|
|
6
|
-
import { Workflow } from './workflows/index.js'
|
|
7
|
-
import { Directive } from './Directive.js'
|
|
8
|
-
import { toBytes } from './bytes.js'
|
|
9
|
-
import type { Readable } from 'stream'
|
|
10
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
11
|
-
import type { Unit, Location } from './workflows/index.js'
|
|
12
|
-
import type { Entry } from '@toa.io/extensions.storages'
|
|
13
|
-
import type { Remotes } from '../../Remotes.js'
|
|
14
|
-
import type { Component } from '@toa.io/core'
|
|
15
|
-
import type { Introspection } from '../../Introspection.js'
|
|
16
|
-
import type { Output } from '../../io.js'
|
|
17
|
-
import type { Input } from './types.js'
|
|
18
|
-
|
|
19
|
-
export class Put extends Directive {
|
|
20
|
-
public readonly targeted = false
|
|
21
|
-
|
|
22
|
-
private readonly location?: string
|
|
23
|
-
private readonly accept?: string
|
|
24
|
-
private readonly limit: number
|
|
25
|
-
private readonly limitString: string
|
|
26
|
-
private readonly trust?: Array<string | RegExp>
|
|
27
|
-
private readonly workflow?: Workflow
|
|
28
|
-
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
29
|
-
private storage: Component | null = null
|
|
30
|
-
|
|
31
|
-
public constructor(
|
|
32
|
-
options: Options | null,
|
|
33
|
-
discovery: Promise<Component>,
|
|
34
|
-
remotes: Remotes
|
|
35
|
-
) {
|
|
36
|
-
super()
|
|
37
|
-
|
|
38
|
-
schemas.put.validate<Options>(options)
|
|
39
|
-
|
|
40
|
-
this.accept = match(
|
|
41
|
-
options?.accept,
|
|
42
|
-
String,
|
|
43
|
-
(value: string) => value,
|
|
44
|
-
Array,
|
|
45
|
-
(types: string[]) => types.join(','),
|
|
46
|
-
undefined
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
if (options?.workflow !== undefined)
|
|
50
|
-
this.workflow = new Workflow(options.workflow, remotes)
|
|
51
|
-
|
|
52
|
-
if (options?.trust !== undefined)
|
|
53
|
-
this.trust = options.trust.map((value: string) =>
|
|
54
|
-
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
if (options?.location !== undefined) this.location = options.location
|
|
58
|
-
|
|
59
|
-
this.limitString = options?.limit ?? '64MiB'
|
|
60
|
-
this.limit = toBytes(this.limitString)
|
|
61
|
-
this.discovery.storage = discovery
|
|
62
|
-
|
|
63
|
-
cors.allow('content-attributes')
|
|
64
|
-
cors.allow('content-location')
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/** What sending a file here takes: what may be sent, how much of it, and what comes back. */
|
|
68
|
-
public override describe(introspection: Introspection): void {
|
|
69
|
-
introspection.octets = {
|
|
70
|
-
...(this.accept === undefined ? {} : { accept: this.accept }),
|
|
71
|
-
limit: this.limitString,
|
|
72
|
-
...(this.workflow === undefined ? {} : { stream: true })
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
public async apply(
|
|
77
|
-
storage: string,
|
|
78
|
-
input: Input,
|
|
79
|
-
parameters: Parameter[]
|
|
80
|
-
): Promise<Output> {
|
|
81
|
-
this.storage ??= await this.discovery.storage
|
|
82
|
-
|
|
83
|
-
const request: StoreRequest = {
|
|
84
|
-
input: {
|
|
85
|
-
storage,
|
|
86
|
-
request: input.request,
|
|
87
|
-
location: this.location,
|
|
88
|
-
accept: this.accept,
|
|
89
|
-
limit: this.limit,
|
|
90
|
-
trust: this.trust
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const entry = await this.storage.invoke<Entry>('put', request)
|
|
95
|
-
|
|
96
|
-
return match<Output>(
|
|
97
|
-
entry,
|
|
98
|
-
Error,
|
|
99
|
-
(error: CodedError) => this.throw(error),
|
|
100
|
-
() => this.reply(input, storage, entry, parameters)
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// eslint-disable-next-line max-params
|
|
105
|
-
private reply(
|
|
106
|
-
input: Input,
|
|
107
|
-
storage: string,
|
|
108
|
-
entry: Entry,
|
|
109
|
-
parameters: Parameter[]
|
|
110
|
-
): Output {
|
|
111
|
-
const body =
|
|
112
|
-
this.workflow === undefined
|
|
113
|
-
? entry
|
|
114
|
-
: this.execute(input, storage, entry, parameters)
|
|
115
|
-
|
|
116
|
-
return { body }
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// eslint-disable-next-line max-params
|
|
120
|
-
private execute(
|
|
121
|
-
input: Input,
|
|
122
|
-
storage: string,
|
|
123
|
-
entry: Entry,
|
|
124
|
-
parameters: Parameter[]
|
|
125
|
-
): Readable {
|
|
126
|
-
const stream = new PassThrough({ objectMode: true })
|
|
127
|
-
|
|
128
|
-
stream.push(entry)
|
|
129
|
-
|
|
130
|
-
const location: Location = {
|
|
131
|
-
storage,
|
|
132
|
-
authority: input.authority,
|
|
133
|
-
identity: input.identity?.id,
|
|
134
|
-
path: this.location ?? input.request.url
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
this.workflow!.execute(location, entry, parameters).pipe(stream)
|
|
138
|
-
|
|
139
|
-
return stream
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private throw(error: CodedError): never {
|
|
143
|
-
throw match(
|
|
144
|
-
error.code,
|
|
145
|
-
'NOT_ACCEPTABLE',
|
|
146
|
-
() => new http.UnsupportedMediaType(),
|
|
147
|
-
'TYPE_MISMATCH',
|
|
148
|
-
() => new http.BadRequest(),
|
|
149
|
-
'LIMIT_EXCEEDED',
|
|
150
|
-
() => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
|
|
151
|
-
'LOCATION_UNTRUSTED',
|
|
152
|
-
() => new http.Forbidden(error.message),
|
|
153
|
-
'LOCATION_LENGTH',
|
|
154
|
-
() => new http.BadRequest(error.message),
|
|
155
|
-
'LOCATION_UNAVAILABLE',
|
|
156
|
-
() => new http.NotFound(error.message),
|
|
157
|
-
'INVALID_ID',
|
|
158
|
-
() => new http.BadRequest(error.message),
|
|
159
|
-
error
|
|
160
|
-
)
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export interface Options {
|
|
165
|
-
location?: string
|
|
166
|
-
accept?: string | string[]
|
|
167
|
-
limit?: string
|
|
168
|
-
workflow?: Unit[] | Unit
|
|
169
|
-
trust?: string[]
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
interface StoreRequest {
|
|
173
|
-
input: {
|
|
174
|
-
storage: string
|
|
175
|
-
request: Input['request']
|
|
176
|
-
location?: string
|
|
177
|
-
accept?: string
|
|
178
|
-
limit?: number
|
|
179
|
-
trust?: Array<string | RegExp>
|
|
180
|
-
attributes?: Record<string, string>
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
interface CodedError extends Error {
|
|
185
|
-
code: string
|
|
186
|
-
}
|