@toa.io/extensions.exposition 1.0.0-alpha.292 → 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 +24 -13
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.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/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +2 -12
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- 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/{aLpTDmOc.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 -42
- 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 -239
- 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/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 -435
- 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 -1
- 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/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 -10
- package/source/io.ts +0 -4
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/service.ts +0 -95
- package/source/userland.ts +0 -47
- 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/BaWe3aOV.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
- package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
|
@@ -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
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { NotFound } from '../../HTTP/index.js'
|
|
2
|
-
import * as schemas from './schemas.js'
|
|
3
|
-
import { Workflow } from './workflows/index.js'
|
|
4
|
-
import { Directive } from './Directive.js'
|
|
5
|
-
import type { Unit, Location } from './workflows/index.js'
|
|
6
|
-
import type { Input } from './types.js'
|
|
7
|
-
import type { Component } from '@toa.io/core'
|
|
8
|
-
import type { Output } from '../../io.js'
|
|
9
|
-
import type { Remotes } from '../../Remotes.js'
|
|
10
|
-
import type { Maybe } from '@toa.io/core/types'
|
|
11
|
-
import type { Entry } from '@toa.io/extensions.storages'
|
|
12
|
-
import type { Parameter } from '../../RTD/index.js'
|
|
13
|
-
|
|
14
|
-
export class WorkflowDirective extends Directive {
|
|
15
|
-
public readonly targeted = true
|
|
16
|
-
|
|
17
|
-
private readonly workflow: Workflow
|
|
18
|
-
private readonly discovery: Promise<Component>
|
|
19
|
-
private storage: Component | null = null
|
|
20
|
-
|
|
21
|
-
public constructor(
|
|
22
|
-
units: Unit[] | Unit,
|
|
23
|
-
discovery: Promise<Component>,
|
|
24
|
-
remotes: Remotes
|
|
25
|
-
) {
|
|
26
|
-
super()
|
|
27
|
-
schemas.workflow.validate(units)
|
|
28
|
-
|
|
29
|
-
this.workflow = new Workflow(units, remotes)
|
|
30
|
-
this.discovery = discovery
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
public async apply(
|
|
34
|
-
storage: string,
|
|
35
|
-
input: Input,
|
|
36
|
-
parameters: Parameter[]
|
|
37
|
-
): Promise<Output> {
|
|
38
|
-
this.storage ??= await this.discovery
|
|
39
|
-
|
|
40
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
41
|
-
input: {
|
|
42
|
-
storage,
|
|
43
|
-
path: input.request.url
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
if (entry instanceof Error) throw new NotFound()
|
|
48
|
-
|
|
49
|
-
const location: Location = {
|
|
50
|
-
storage,
|
|
51
|
-
authority: input.authority,
|
|
52
|
-
path: input.request.url
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
status: 202,
|
|
57
|
-
body: this.workflow.execute(location, entry, parameters)
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { toBytes } from './bytes.js'
|
|
5
|
-
|
|
6
|
-
it('should parse bytes', async () => {
|
|
7
|
-
assert.strictEqual(toBytes('10'), 10)
|
|
8
|
-
assert.strictEqual(toBytes('10B'), 10)
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
it('should parse binary prefix', async () => {
|
|
12
|
-
assert.strictEqual(toBytes('10KiB'), 10240)
|
|
13
|
-
assert.strictEqual(toBytes('10MiB'), 10485760)
|
|
14
|
-
assert.strictEqual(toBytes('10GiB'), 10737418240)
|
|
15
|
-
assert.strictEqual(toBytes('10TiB'), 10995116277760)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('should parse decimal prefix', async () => {
|
|
19
|
-
assert.strictEqual(toBytes('10kB'), 10000)
|
|
20
|
-
assert.strictEqual(toBytes('10MB'), 10000000)
|
|
21
|
-
assert.strictEqual(toBytes('10GB'), 10000000000)
|
|
22
|
-
assert.strictEqual(toBytes('10TB'), 10000000000000)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
it('should parse incorrect value as binary', async () => {
|
|
26
|
-
assert.strictEqual(toBytes('10b'), 10)
|
|
27
|
-
assert.strictEqual(toBytes('10kb'), 10240)
|
|
28
|
-
assert.strictEqual(toBytes('10kib'), 10240)
|
|
29
|
-
assert.strictEqual(toBytes('10mb'), 10485760)
|
|
30
|
-
assert.strictEqual(toBytes('10gb'), 10737418240)
|
|
31
|
-
assert.strictEqual(toBytes('10tib'), 10995116277760)
|
|
32
|
-
assert.strictEqual(toBytes('10Mb'), 10485760)
|
|
33
|
-
})
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
|
|
3
|
-
export function toBytes(input: string): number {
|
|
4
|
-
const match = RX.exec(input)
|
|
5
|
-
|
|
6
|
-
assert.ok(match !== null, `Invalid bytes format: ${input}`)
|
|
7
|
-
|
|
8
|
-
const value = parseFloat(match.groups!.value)
|
|
9
|
-
const prefix = match.groups!.prefix?.[0].toLowerCase() ?? ''
|
|
10
|
-
const binary = match.groups!.binary !== undefined || match.groups!.unit === 'b'
|
|
11
|
-
const base = binary ? 1024 : 1000
|
|
12
|
-
const power = POWERS.indexOf(prefix)
|
|
13
|
-
|
|
14
|
-
return value * Math.pow(base, power)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const POWERS = ['', 'k', 'm', 'g', 't']
|
|
18
|
-
const RX = /^(?<value>(\d+)(\.\d+)?)(?<prefix>[kmgt](?<binary>i)?)?(?<unit>b)?$/i
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import * as schemas from './schemas.js'
|
|
5
|
-
|
|
6
|
-
describe('workflow', () => {
|
|
7
|
-
const ok = [{ echo: 'hello world' }, [{ echo: 'hello world' }, { ok: 'ok' }]]
|
|
8
|
-
|
|
9
|
-
const oh = [{ echo: [] }, { echo: 'hello world', ok: { not: 'ok' } }]
|
|
10
|
-
|
|
11
|
-
for (const workflow of ok)
|
|
12
|
-
it('should be valid', () => {
|
|
13
|
-
assert.doesNotThrow(() => schemas.workflow.validate(workflow))
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
for (const workflow of oh)
|
|
17
|
-
it('should not be valid', () => {
|
|
18
|
-
assert.throws(() => schemas.workflow.validate(workflow))
|
|
19
|
-
})
|
|
20
|
-
})
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path'
|
|
2
|
-
import * as schemas from '@toa.io/schemas'
|
|
3
|
-
import type { Options as GetOptions } from './Get.js'
|
|
4
|
-
import type { Options as PutOptions } from './Put.js'
|
|
5
|
-
import type { Options as DeleteOptions } from './Delete.js'
|
|
6
|
-
import type { Schema } from '@toa.io/schemas'
|
|
7
|
-
import type { Unit } from './workflows/index.js'
|
|
8
|
-
|
|
9
|
-
const path = resolve(import.meta.dirname, '../../../schemas/octets')
|
|
10
|
-
const namespace = schemas.namespace(path)
|
|
11
|
-
|
|
12
|
-
export const put: Schema<PutOptions | null> = namespace.schema('put')
|
|
13
|
-
export const get: Schema<GetOptions | null> = namespace.schema('get')
|
|
14
|
-
export const remove: Schema<DeleteOptions | null> = namespace.schema('delete')
|
|
15
|
-
export const workflow: Schema<Unit[] | Unit> = namespace.schema('workflow')
|