@toa.io/extensions.exposition 1.0.0-alpha.285 → 1.0.0-alpha.286
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/exposition.octets/operations/delete.js +1 -1
- package/components/exposition.octets/operations/get.js +5 -2
- package/components/exposition.octets/operations/head.js +1 -1
- package/components/exposition.octets/operations/put.js +29 -37
- package/components/exposition.octets/types/toa.d.ts +1 -1
- package/components/identity.bans/manifest.toa.yaml +12 -13
- package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.bans/operations/transit.js +1 -1
- package/components/identity.bans/source/transit.ts +1 -1
- package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
- package/components/identity.bans/types/toa.d.ts +5 -5
- package/components/identity.basic/events/principal.js +3 -1
- package/components/identity.basic/manifest.toa.yaml +17 -23
- package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
- package/components/identity.basic/operations/add.js +1 -1
- package/components/identity.basic/operations/authenticate.js +2 -2
- package/components/identity.basic/operations/check.js +4 -2
- package/components/identity.basic/operations/delete.js +1 -1
- package/components/identity.basic/operations/incept.js +1 -1
- package/components/identity.basic/operations/info.js +1 -1
- package/components/identity.basic/operations/lib/credentials.js +1 -1
- package/components/identity.basic/operations/transit.js +7 -8
- package/components/identity.basic/source/add.ts +5 -2
- package/components/identity.basic/source/authenticate.ts +11 -13
- package/components/identity.basic/source/check.ts +9 -6
- package/components/identity.basic/source/delete.ts +4 -1
- package/components/identity.basic/source/incept.ts +13 -10
- package/components/identity.basic/source/info.ts +4 -1
- package/components/identity.basic/source/lib/credentials.ts +2 -3
- package/components/identity.basic/source/transit.ts +27 -21
- package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/types/index.d.ts +7 -3
- package/components/identity.basic/types/toa.d.ts +5 -5
- package/components/identity.clients/manifest.toa.yaml +36 -40
- package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
- package/components/identity.clients/operations/describe.js +1 -1
- package/components/identity.clients/operations/lib/canonical.js +1 -1
- package/components/identity.clients/operations/lib/cimd.js +3 -2
- package/components/identity.clients/operations/lib/redirect.js +7 -4
- package/components/identity.clients/operations/register.js +2 -2
- package/components/identity.clients/source/describe.ts +6 -8
- package/components/identity.clients/source/lib/Context.ts +6 -3
- package/components/identity.clients/source/lib/Entity.ts +1 -1
- package/components/identity.clients/source/lib/canonical.ts +1 -1
- package/components/identity.clients/source/lib/cimd.test.ts +8 -6
- package/components/identity.clients/source/lib/cimd.ts +24 -19
- package/components/identity.clients/source/lib/redirect.test.ts +8 -2
- package/components/identity.clients/source/lib/redirect.ts +12 -8
- package/components/identity.clients/source/register.ts +18 -18
- package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
- package/components/identity.clients/types/toa.d.ts +5 -5
- package/components/identity.credentials/manifest.toa.yaml +4 -4
- package/components/identity.credentials/operations/list.js +8 -4
- package/components/identity.credentials/source/list.test.ts +39 -20
- package/components/identity.credentials/source/list.ts +12 -8
- package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
- package/components/identity.credentials/types/toa.d.ts +2 -2
- package/components/identity.federation/manifest.toa.yaml +23 -32
- package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
- package/components/identity.federation/operations/authenticate.js +4 -2
- package/components/identity.federation/operations/create.js +2 -2
- package/components/identity.federation/operations/decode.js +1 -1
- package/components/identity.federation/operations/delete.js +1 -1
- package/components/identity.federation/operations/incept.js +1 -1
- package/components/identity.federation/operations/lib/decode.js +1 -1
- package/components/identity.federation/operations/lib/discovery.js +2 -2
- package/components/identity.federation/operations/lib/exchange.js +8 -4
- package/components/identity.federation/operations/lib/principal.js +1 -1
- package/components/identity.federation/operations/lib/resolve.js +1 -1
- package/components/identity.federation/operations/list.js +2 -2
- package/components/identity.federation/source/authenticate.ts +19 -17
- package/components/identity.federation/source/create.ts +6 -7
- package/components/identity.federation/source/decode.ts +4 -1
- package/components/identity.federation/source/delete.ts +4 -1
- package/components/identity.federation/source/incept.ts +2 -3
- package/components/identity.federation/source/lib/decode.ts +4 -7
- package/components/identity.federation/source/lib/discovery.test.ts +15 -5
- package/components/identity.federation/source/lib/discovery.ts +10 -9
- package/components/identity.federation/source/lib/exchange.ts +18 -15
- package/components/identity.federation/source/lib/jose.d.ts +1 -1
- package/components/identity.federation/source/lib/principal.ts +5 -3
- package/components/identity.federation/source/lib/resolve.ts +5 -1
- package/components/identity.federation/source/list.test.ts +26 -10
- package/components/identity.federation/source/list.ts +5 -2
- package/components/identity.federation/source/types/context.ts +5 -2
- package/components/identity.federation/source/types/entity.ts +2 -2
- package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
- package/components/identity.federation/types/toa.d.ts +5 -5
- package/components/identity.grants/manifest.toa.yaml +27 -31
- package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
- package/components/identity.grants/operations/authorize.js +1 -1
- package/components/identity.grants/operations/exchange.js +5 -2
- package/components/identity.grants/operations/lib/code.js +1 -1
- package/components/identity.grants/operations/lib/identify.js +1 -1
- package/components/identity.grants/operations/list.js +1 -1
- package/components/identity.grants/operations/revoke.js +3 -2
- package/components/identity.grants/source/authorize.ts +27 -19
- package/components/identity.grants/source/exchange.ts +15 -11
- package/components/identity.grants/source/lib/code.ts +20 -8
- package/components/identity.grants/source/lib/identify.ts +1 -1
- package/components/identity.grants/source/list.ts +2 -2
- package/components/identity.grants/source/revoke.ts +9 -7
- package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
- package/components/identity.grants/types/index.d.ts +3 -3
- package/components/identity.grants/types/toa.d.ts +5 -5
- package/components/identity.keys/manifest.toa.yaml +18 -23
- package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
- package/components/identity.keys/operations/create.js +1 -1
- package/components/identity.keys/operations/disable.js +1 -1
- package/components/identity.keys/operations/revoke.js +1 -1
- package/components/identity.keys/source/create.ts +2 -3
- package/components/identity.keys/source/disable.ts +1 -1
- package/components/identity.keys/source/revoke.ts +2 -2
- package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.keys/types/toa.d.ts +5 -5
- package/components/identity.otp/manifest.toa.yaml +16 -24
- package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
- package/components/identity.otp/operations/authenticate.js +1 -1
- package/components/identity.otp/operations/issue.js +1 -1
- package/components/identity.otp/source/authenticate.ts +4 -7
- package/components/identity.otp/source/issue.ts +1 -1
- package/components/identity.otp/source/lib/Context.ts +1 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
- package/components/identity.otp/types/toa.d.ts +5 -5
- package/components/identity.passkeys/manifest.toa.yaml +45 -53
- package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
- package/components/identity.passkeys/operations/authenticate.js +1 -1
- package/components/identity.passkeys/operations/challenge.js +6 -3
- package/components/identity.passkeys/operations/create.js +1 -1
- package/components/identity.passkeys/operations/delete.js +1 -1
- package/components/identity.passkeys/operations/list.js +1 -1
- package/components/identity.passkeys/operations/use.js +1 -1
- package/components/identity.passkeys/source/authenticate.ts +3 -4
- package/components/identity.passkeys/source/challenge.ts +29 -25
- package/components/identity.passkeys/source/create.ts +8 -6
- package/components/identity.passkeys/source/delete.ts +4 -1
- package/components/identity.passkeys/source/list.ts +4 -1
- package/components/identity.passkeys/source/types/Context.ts +1 -1
- package/components/identity.passkeys/source/use.ts +12 -10
- package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
- package/components/identity.passkeys/types/toa.d.ts +5 -5
- package/components/identity.roles/manifest.toa.yaml +12 -16
- package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
- package/components/identity.roles/operations/grant.js +1 -1
- package/components/identity.roles/operations/list.js +1 -1
- package/components/identity.roles/operations/principal.js +2 -2
- package/components/identity.roles/source/grant.ts +7 -6
- package/components/identity.roles/source/list.ts +1 -1
- package/components/identity.roles/source/principal.ts +5 -7
- package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/types/toa.d.ts +5 -5
- package/components/identity.tokens/manifest.toa.yaml +17 -15
- package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
- package/components/identity.tokens/operations/authenticate.js +2 -2
- package/components/identity.tokens/operations/decrypt.js +11 -5
- package/components/identity.tokens/operations/encrypt.js +2 -2
- package/components/identity.tokens/operations/issue.js +2 -4
- package/components/identity.tokens/operations/lib/form.js +1 -1
- package/components/identity.tokens/operations/lib/key.js +1 -1
- package/components/identity.tokens/operations/revoke.js +1 -1
- package/components/identity.tokens/source/authenticate.test.ts +22 -16
- package/components/identity.tokens/source/authenticate.ts +7 -10
- package/components/identity.tokens/source/decrypt.test.ts +62 -29
- package/components/identity.tokens/source/decrypt.ts +30 -27
- package/components/identity.tokens/source/encrypt.test.ts +21 -16
- package/components/identity.tokens/source/encrypt.ts +8 -11
- package/components/identity.tokens/source/issue.test.ts +4 -2
- package/components/identity.tokens/source/issue.ts +6 -8
- package/components/identity.tokens/source/lib/form.ts +5 -9
- package/components/identity.tokens/source/lib/jose.d.ts +1 -1
- package/components/identity.tokens/source/lib/key.ts +1 -1
- package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
- package/components/identity.tokens/source/revoke.ts +1 -1
- package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/types/index.d.ts +13 -4
- package/components/identity.tokens/types/toa.d.ts +5 -5
- package/context.toa.yaml +2 -2
- package/cucumber.mjs +3 -0
- package/documentation/access.md +4 -3
- package/documentation/cache.md +17 -3
- package/documentation/components.md +2 -2
- package/documentation/credentials.md +2 -2
- package/documentation/identity.md +7 -9
- package/documentation/map.md +2 -2
- package/documentation/mcp.md +16 -16
- package/documentation/notes/peers.md +1 -1
- package/documentation/notes/throttling.md +1 -1
- package/documentation/octets.md +4 -4
- package/documentation/protocol.md +3 -3
- package/documentation/query.md +14 -8
- package/documentation/rpc.md +31 -21
- package/documentation/tracing.md +3 -3
- package/documentation/tree.md +1 -1
- package/features/auth.assert.feature +2 -2
- package/features/auth.bearer.feature +1 -1
- package/features/auth.claims.feature +5 -5
- package/features/auth.incept.feature +2 -2
- package/features/authorities.federation.feature +1 -1
- package/features/configuration.feature +3 -4
- package/features/credentials.feature +9 -9
- package/features/dev.feature +1 -0
- package/features/dynamic.feature +1 -0
- package/features/errors.feature +21 -0
- package/features/etag.feature +0 -86
- package/features/identity.bans.feature +3 -3
- package/features/identity.basic.feature +9 -9
- package/features/identity.federation.feature +11 -11
- package/features/identity.tokens.custom.feature +5 -5
- package/features/identity.tokens.feature +2 -2
- package/features/interruptions.feature +1 -0
- package/features/introspection.map.feature +4 -4
- package/features/io.throttle.feature +1 -0
- package/features/map.feature +2 -2
- package/features/octets.cloudinary.feature +1 -1
- package/features/octets.download.feature +1 -0
- package/features/require.feature +1 -2
- package/features/steps/Captures.ts +1 -1
- package/features/steps/Cloudinary.ts +1 -2
- package/features/steps/Common.ts +4 -5
- package/features/steps/Components.ts +17 -12
- package/features/steps/Database.ts +42 -23
- package/features/steps/Gateway.ts +55 -72
- package/features/steps/HTTP.ts +12 -15
- package/features/steps/IDP.ts +118 -94
- package/features/steps/Identity.ts +3 -3
- package/features/steps/OTP.ts +3 -3
- package/features/steps/Parameters.ts +20 -10
- package/features/steps/Probe.ts +9 -7
- package/features/steps/Realtime.ts +40 -22
- package/features/steps/Workspace.ts +10 -7
- package/features/steps/components/audit/operations/record.js +1 -1
- package/features/steps/components/echo/operations/affect.js +1 -1
- package/features/steps/components/echo/operations/compute.js +1 -1
- package/features/steps/components/echo/operations/echo.js +1 -1
- package/features/steps/components/echo/operations/error.js +1 -1
- package/features/steps/components/echo/operations/identity.js +1 -1
- package/features/steps/components/echo/operations/parameters.js +1 -1
- package/features/steps/components/echo/operations/ping.js +1 -1
- package/features/steps/components/echo/operations/unwrap.js +1 -1
- package/features/steps/components/greeter/operations/greet.js +1 -1
- package/features/steps/components/notify/operations/send.js +1 -1
- package/features/steps/components/octets.tester/operations/authority.js +1 -1
- package/features/steps/components/octets.tester/operations/bar.js +1 -1
- package/features/steps/components/octets.tester/operations/baz.js +1 -1
- package/features/steps/components/octets.tester/operations/concat.js +1 -1
- package/features/steps/components/octets.tester/operations/echo.js +1 -1
- package/features/steps/components/octets.tester/operations/err.js +1 -1
- package/features/steps/components/octets.tester/operations/foo.js +1 -1
- package/features/steps/components/octets.tester/operations/id.js +1 -1
- package/features/steps/components/octets.tester/operations/identity.js +1 -1
- package/features/steps/components/octets.tester/operations/redirect.js +6 -4
- package/features/steps/components/octets.tester/operations/yex.js +1 -1
- package/features/steps/components/octets.tester/operations/yield.js +1 -1
- package/features/steps/components/orders/manifest.toa.yaml +10 -12
- package/features/steps/components/orders/operations/create.js +4 -2
- package/features/steps/components/pots/manifest.toa.yaml +15 -20
- package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
- package/features/steps/components/pricing/operations/quote.js +1 -1
- package/features/steps/components/sequences/manifest.toa.yaml +0 -1
- package/features/steps/components/sequences/operations/numbers.js +1 -1
- package/features/steps/components/sequences/operations/tokens.js +3 -3
- package/features/steps/components/users/manifest.toa.yaml +3 -5
- package/features/steps/components/users/operations/create.js +1 -1
- package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
- package/features/steps/map.ts +2 -2
- package/features/timestamps.feature +1 -1
- package/package.json +7 -7
- package/readme.md +11 -11
- package/schemas/annotation.cos.yaml +1 -3
- package/schemas/method.cos.yaml +2 -0
- package/source/Branch.test.ts +2 -2
- package/source/Branch.ts +3 -5
- package/source/Composition.ts +5 -5
- package/source/Directive.test.ts +38 -20
- package/source/Directive.ts +61 -47
- package/source/Endpoint.test.ts +1 -1
- package/source/Endpoint.ts +27 -92
- package/source/Factory.ts +26 -12
- package/source/Gateway.ts +87 -76
- package/source/HTTP/Context.ts +23 -30
- package/source/HTTP/Probe.ts +7 -9
- package/source/HTTP/Server.ts +88 -69
- package/source/HTTP/Timing.ts +6 -21
- package/source/HTTP/address.test.ts +8 -2
- package/source/HTTP/address.ts +2 -3
- package/source/HTTP/exceptions.ts +20 -18
- package/source/HTTP/formats/form.ts +1 -1
- package/source/HTTP/formats/json.ts +2 -2
- package/source/HTTP/formats/msgpack.ts +3 -4
- package/source/HTTP/formats/text.ts +2 -2
- package/source/HTTP/formats/yaml.test.ts +4 -1
- package/source/HTTP/formats/yaml.ts +14 -11
- package/source/HTTP/messages.test.ts +38 -28
- package/source/HTTP/messages.ts +44 -98
- package/source/Interception.ts +3 -4
- package/source/Introspection.ts +26 -14
- package/source/MCP/Server.ts +114 -54
- package/source/MCP/discover.ts +6 -7
- package/source/MCP/errors.ts +7 -8
- package/source/MCP/schema.test.ts +9 -3
- package/source/MCP/schema.ts +12 -16
- package/source/MCP/tools.ts +33 -28
- package/source/Mapping.ts +25 -27
- package/source/Query.ts +58 -44
- package/source/RPC/Context.ts +8 -11
- package/source/RPC/Dispatcher.ts +46 -26
- package/source/RPC/errors.test.ts +41 -16
- package/source/RPC/errors.ts +9 -10
- package/source/RPC/names.test.ts +35 -16
- package/source/RPC/names.ts +22 -29
- package/source/RTD/Directives.ts +21 -10
- package/source/RTD/Endpoint.ts +4 -1
- package/source/RTD/Method.ts +8 -6
- package/source/RTD/Node.ts +32 -34
- package/source/RTD/Route.ts +18 -21
- package/source/RTD/Tree.ts +18 -18
- package/source/RTD/factory.ts +13 -16
- package/source/RTD/segment.ts +12 -10
- package/source/RTD/syntax/parse.test.ts +12 -6
- package/source/RTD/syntax/parse.ts +30 -26
- package/source/RTD/syntax/types.ts +17 -1
- package/source/RTD/walk.test.ts +59 -22
- package/source/Remotes.test.ts +25 -4
- package/source/Remotes.ts +9 -4
- package/source/Tenant.ts +12 -12
- package/source/deployment.ts +20 -20
- package/source/directives/auth/Anonymous.test.ts +8 -2
- package/source/directives/auth/Anonymous.ts +5 -8
- package/source/directives/auth/Anyone.ts +3 -3
- package/source/directives/auth/Assert.ts +10 -10
- package/source/directives/auth/Authorization.ts +83 -69
- package/source/directives/auth/Delegate.test.ts +2 -2
- package/source/directives/auth/Delegate.ts +8 -10
- package/source/directives/auth/Echo.ts +5 -8
- package/source/directives/auth/Federation.ts +30 -21
- package/source/directives/auth/Id.ts +7 -4
- package/source/directives/auth/Incept.ts +32 -26
- package/source/directives/auth/Input.ts +36 -20
- package/source/directives/auth/Role.test.ts +49 -23
- package/source/directives/auth/Role.ts +29 -22
- package/source/directives/auth/Rule.ts +13 -8
- package/source/directives/auth/Scheme.ts +7 -7
- package/source/directives/auth/create.ts +1 -1
- package/source/directives/auth/schemes.ts +1 -1
- package/source/directives/auth/split.ts +2 -3
- package/source/directives/auth/types.ts +5 -2
- package/source/directives/cache/Cache.ts +44 -9
- package/source/directives/cache/Control.ts +25 -26
- package/source/directives/cache/Exact.ts +1 -1
- package/source/directives/cache/etag.ts +38 -0
- package/source/directives/cors/CORS.ts +9 -7
- package/source/directives/dev/Development.ts +3 -4
- package/source/directives/dev/Faulty.ts +11 -6
- package/source/directives/dev/Sleep.ts +5 -7
- package/source/directives/dev/Stub.ts +2 -2
- package/source/directives/dev/Throw.ts +2 -2
- package/source/directives/flow/Compose.ts +26 -20
- package/source/directives/flow/Fetch.ts +15 -15
- package/source/directives/flow/Flow.ts +9 -8
- package/source/directives/index.ts +11 -2
- package/source/directives/io/IO.ts +29 -20
- package/source/directives/io/Input.ts +9 -12
- package/source/directives/io/Output.ts +20 -23
- package/source/directives/io/Status.test.ts +12 -8
- package/source/directives/io/Status.ts +9 -8
- package/source/directives/io/Throttle.ts +6 -7
- package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
- package/source/directives/io/lib/throttle/Configuration.ts +14 -9
- package/source/directives/io/lib/throttle/Keys.ts +15 -10
- package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
- package/source/directives/io/lib/throttle/Quotas.ts +20 -26
- package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
- package/source/directives/io/lib/throttle/Sync.ts +9 -12
- package/source/directives/io/lib/throttle/Warning.ts +3 -4
- package/source/directives/io/lib/throttle/components/IP.ts +4 -5
- package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
- package/source/directives/io/lib/throttle/components/Path.ts +1 -1
- package/source/directives/io/lib/throttle/components/Route.ts +2 -2
- package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
- package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
- package/source/directives/io/schemas.test.ts +12 -6
- package/source/directives/map/Authority.ts +2 -2
- package/source/directives/map/Buffer.ts +2 -2
- package/source/directives/map/Claims.ts +25 -20
- package/source/directives/map/Headers.ts +17 -13
- package/source/directives/map/Language.ts +8 -5
- package/source/directives/map/Languages.ts +9 -3
- package/source/directives/map/Map.ts +25 -12
- package/source/directives/map/Mapping.ts +9 -6
- package/source/directives/map/Properties.ts +1 -1
- package/source/directives/map/Segments.ts +22 -15
- package/source/directives/mcp/MCP.ts +9 -7
- package/source/directives/mcp/Tool.test.ts +21 -9
- package/source/directives/mcp/Tool.ts +23 -11
- package/source/directives/oauth/Discovery.ts +7 -11
- package/source/directives/oauth/documents.ts +11 -14
- package/source/directives/octets/Context.ts +6 -3
- package/source/directives/octets/Delete.ts +33 -25
- package/source/directives/octets/Directive.ts +5 -1
- package/source/directives/octets/Get.ts +13 -21
- package/source/directives/octets/Octets.ts +20 -15
- package/source/directives/octets/Put.ts +62 -27
- package/source/directives/octets/Workflow.ts +18 -12
- package/source/directives/octets/bytes.ts +1 -1
- package/source/directives/octets/schemas.test.ts +8 -14
- package/source/directives/octets/workflows/Execution.ts +19 -21
- package/source/directives/octets/workflows/Workflow.ts +10 -7
- package/source/directives/require/Headers.ts +3 -4
- package/source/directives/require/Require.ts +3 -4
- package/source/exceptions.ts +19 -12
- package/source/index.ts +1 -1
- package/source/manifest.test.ts +4 -1
- package/source/manifest.ts +19 -13
- package/source/octets.d.ts +1 -1
- package/source/root.ts +3 -2
- package/source/schemas.test.ts +17 -3
- package/transpiled/Branch.js.map +1 -1
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.js +6 -2
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +0 -2
- package/transpiled/Endpoint.js +11 -52
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +2 -1
- package/transpiled/Factory.js +1 -0
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +2 -1
- package/transpiled/Gateway.js +24 -15
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +0 -3
- package/transpiled/HTTP/Context.js +7 -9
- package/transpiled/HTTP/Context.js.map +1 -1
- package/transpiled/HTTP/Probe.js.map +1 -1
- package/transpiled/HTTP/Server.js +19 -4
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +1 -2
- package/transpiled/HTTP/Timing.js +2 -10
- package/transpiled/HTTP/Timing.js.map +1 -1
- package/transpiled/HTTP/address.js.map +1 -1
- package/transpiled/HTTP/exceptions.js.map +1 -1
- package/transpiled/HTTP/formats/form.js.map +1 -1
- package/transpiled/HTTP/formats/json.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +4 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +3 -2
- package/transpiled/HTTP/messages.js +1 -43
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.js.map +1 -1
- package/transpiled/Introspection.js +13 -2
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.js +15 -4
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.js.map +1 -1
- package/transpiled/MCP/errors.js.map +1 -1
- package/transpiled/MCP/schema.js +1 -1
- package/transpiled/MCP/schema.js.map +1 -1
- package/transpiled/MCP/tools.js +10 -7
- package/transpiled/MCP/tools.js.map +1 -1
- package/transpiled/Mapping.d.ts +2 -2
- package/transpiled/Mapping.js +3 -5
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.d.ts +6 -2
- package/transpiled/Query.js +23 -8
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Context.js +0 -7
- package/transpiled/RPC/Context.js.map +1 -1
- package/transpiled/RPC/Dispatcher.js +4 -1
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RPC/errors.js.map +1 -1
- package/transpiled/RPC/names.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +1 -1
- package/transpiled/RTD/Method.js +1 -3
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.js +5 -4
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js +4 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/segment.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.d.ts +6 -0
- package/transpiled/RTD/syntax/types.js +10 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/Remotes.js.map +1 -1
- package/transpiled/Tenant.d.ts +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/deployment.d.ts +3 -0
- package/transpiled/deployment.js +6 -1
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +1 -3
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/Anyone.js.map +1 -1
- package/transpiled/directives/auth/Assert.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +7 -3
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/auth/Delegate.js.map +1 -1
- package/transpiled/directives/auth/Echo.js +1 -3
- package/transpiled/directives/auth/Echo.js.map +1 -1
- package/transpiled/directives/auth/Federation.js +3 -7
- package/transpiled/directives/auth/Federation.js.map +1 -1
- package/transpiled/directives/auth/Id.js.map +1 -1
- package/transpiled/directives/auth/Incept.js +1 -1
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Input.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +1 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/create.js.map +1 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/split.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +3 -1
- package/transpiled/directives/cache/Cache.js +28 -2
- package/transpiled/directives/cache/Cache.js.map +1 -1
- package/transpiled/directives/cache/Control.js +1 -1
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/etag.d.ts +10 -0
- package/transpiled/directives/cache/etag.js +30 -0
- package/transpiled/directives/cache/etag.js.map +1 -0
- package/transpiled/directives/cors/CORS.js.map +1 -1
- package/transpiled/directives/dev/Development.js.map +1 -1
- package/transpiled/directives/dev/Faulty.js.map +1 -1
- package/transpiled/directives/dev/Sleep.js.map +1 -1
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/flow/Compose.js +7 -3
- package/transpiled/directives/flow/Compose.js.map +1 -1
- package/transpiled/directives/flow/Fetch.js.map +1 -1
- package/transpiled/directives/flow/Flow.js.map +1 -1
- package/transpiled/directives/index.js +11 -1
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/IO.d.ts +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/io/Input.js +1 -1
- package/transpiled/directives/io/Input.js.map +1 -1
- package/transpiled/directives/io/Output.js +3 -3
- package/transpiled/directives/io/Output.js.map +1 -1
- package/transpiled/directives/io/Status.js.map +1 -1
- package/transpiled/directives/io/Throttle.js +1 -1
- package/transpiled/directives/io/Throttle.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
- package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
- package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
- package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
- package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
- package/transpiled/directives/map/Authority.js.map +1 -1
- package/transpiled/directives/map/Buffer.js.map +1 -1
- package/transpiled/directives/map/Claims.js.map +1 -1
- package/transpiled/directives/map/Headers.js.map +1 -1
- package/transpiled/directives/map/Language.js.map +1 -1
- package/transpiled/directives/map/Languages.js.map +1 -1
- package/transpiled/directives/map/Map.js.map +1 -1
- package/transpiled/directives/map/Mapping.js.map +1 -1
- package/transpiled/directives/map/Properties.js.map +1 -1
- package/transpiled/directives/map/Segments.js.map +1 -1
- package/transpiled/directives/mcp/MCP.js +1 -1
- package/transpiled/directives/mcp/MCP.js.map +1 -1
- package/transpiled/directives/mcp/Tool.js +3 -1
- package/transpiled/directives/mcp/Tool.js.map +1 -1
- package/transpiled/directives/oauth/Discovery.js.map +1 -1
- package/transpiled/directives/oauth/documents.js.map +1 -1
- package/transpiled/directives/octets/Context.js +1 -1
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.js.map +1 -1
- package/transpiled/directives/octets/Get.js.map +1 -1
- package/transpiled/directives/octets/Octets.js +1 -1
- package/transpiled/directives/octets/Octets.js.map +1 -1
- package/transpiled/directives/octets/Put.js.map +1 -1
- package/transpiled/directives/octets/Workflow.js.map +1 -1
- package/transpiled/directives/octets/bytes.js.map +1 -1
- package/transpiled/directives/octets/workflows/Execution.js +1 -2
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
- package/transpiled/directives/require/Headers.js.map +1 -1
- package/transpiled/directives/require/Require.js.map +1 -1
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/index.d.ts +1 -1
- package/transpiled/index.js +1 -1
- package/transpiled/index.js.map +1 -1
- package/transpiled/manifest.js +5 -1
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/CHANGELOG.md +0 -552
- package/source/redact.test.ts +0 -27
- package/source/redact.ts +0 -21
- package/transpiled/redact.d.ts +0 -5
- package/transpiled/redact.js +0 -17
- package/transpiled/redact.js.map +0 -1
|
@@ -5,7 +5,7 @@ import { Workflow } from './workflows/index.js'
|
|
|
5
5
|
import { Directive } from './Directive.js'
|
|
6
6
|
import type { Parameter } from '../../RTD/index.js'
|
|
7
7
|
import type { Unit, Location } from './workflows/index.js'
|
|
8
|
-
import type { Maybe } from '@toa.io/core'
|
|
8
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
9
9
|
import type { Component } from '@toa.io/core'
|
|
10
10
|
import type { Output } from '../../io.js'
|
|
11
11
|
import type { Input } from './types.js'
|
|
@@ -19,7 +19,11 @@ export class Delete extends Directive {
|
|
|
19
19
|
private readonly discovery: Promise<Component>
|
|
20
20
|
private storage!: Component
|
|
21
21
|
|
|
22
|
-
public constructor
|
|
22
|
+
public constructor(
|
|
23
|
+
options: Options | null,
|
|
24
|
+
discovery: Promise<Component>,
|
|
25
|
+
remotes: Remotes
|
|
26
|
+
) {
|
|
23
27
|
super()
|
|
24
28
|
schemas.remove.validate(options)
|
|
25
29
|
|
|
@@ -29,43 +33,48 @@ export class Delete extends Directive {
|
|
|
29
33
|
this.discovery = discovery
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
public async apply
|
|
36
|
+
public async apply(
|
|
37
|
+
storage: string,
|
|
38
|
+
input: Input,
|
|
39
|
+
parameters: Parameter[]
|
|
40
|
+
): Promise<Output> {
|
|
33
41
|
this.storage ??= await this.discovery
|
|
34
42
|
|
|
35
43
|
const output: Output = {}
|
|
36
44
|
|
|
37
45
|
if (this.workflow !== undefined) {
|
|
38
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head',
|
|
39
|
-
{
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
})
|
|
46
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
47
|
+
input: {
|
|
48
|
+
storage,
|
|
49
|
+
path: input.request.url
|
|
50
|
+
}
|
|
51
|
+
})
|
|
45
52
|
|
|
46
|
-
if (entry instanceof Error)
|
|
47
|
-
throw new NotFound()
|
|
53
|
+
if (entry instanceof Error) throw new NotFound()
|
|
48
54
|
|
|
49
55
|
output.status = 202
|
|
50
56
|
output.body = Readable.from(this.execute(input, storage, entry, parameters))
|
|
51
|
-
} else
|
|
52
|
-
await this.delete(storage, input)
|
|
57
|
+
} else await this.delete(storage, input)
|
|
53
58
|
|
|
54
59
|
return output
|
|
55
60
|
}
|
|
56
61
|
|
|
57
|
-
private async delete
|
|
58
|
-
await this.storage.invoke('delete',
|
|
59
|
-
{
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
})
|
|
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
|
+
})
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
// eslint-disable-next-line max-params
|
|
68
|
-
private async *
|
|
72
|
+
private async *execute(
|
|
73
|
+
input: Input,
|
|
74
|
+
storage: string,
|
|
75
|
+
entry: Entry,
|
|
76
|
+
parameters: Parameter[]
|
|
77
|
+
): AsyncGenerator {
|
|
69
78
|
const location: Location = {
|
|
70
79
|
storage,
|
|
71
80
|
authority: input.authority,
|
|
@@ -75,8 +84,7 @@ export class Delete extends Directive {
|
|
|
75
84
|
for await (const chunk of this.workflow!.execute(location, entry, parameters)) {
|
|
76
85
|
yield chunk
|
|
77
86
|
|
|
78
|
-
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk)
|
|
79
|
-
return
|
|
87
|
+
if (typeof chunk === 'object' && chunk !== null && 'error' in chunk) return
|
|
80
88
|
}
|
|
81
89
|
|
|
82
90
|
await this.delete(storage, input)
|
|
@@ -6,5 +6,9 @@ export abstract class Directive {
|
|
|
6
6
|
public readonly name = 'octets.' + this.constructor.name.toLowerCase()
|
|
7
7
|
public abstract readonly targeted: boolean
|
|
8
8
|
|
|
9
|
-
public abstract apply
|
|
9
|
+
public abstract apply(
|
|
10
|
+
storage: string,
|
|
11
|
+
input: Input,
|
|
12
|
+
parameters: Parameter[]
|
|
13
|
+
): Promise<io.Output>
|
|
10
14
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Forbidden, NotFound } from '../../HTTP/index.js'
|
|
2
2
|
import * as schemas from './schemas.js'
|
|
3
3
|
import { Directive } from './Directive.js'
|
|
4
|
-
import type { Maybe } from '@toa.io/core'
|
|
4
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
5
5
|
import type { Entry, Stream } from '@toa.io/extensions.storages'
|
|
6
6
|
import type { Component } from '@toa.io/core'
|
|
7
7
|
import type { Output } from '../../io.js'
|
|
@@ -17,7 +17,7 @@ export class Get extends Directive {
|
|
|
17
17
|
private readonly discovery: Promise<Component>
|
|
18
18
|
private storage!: Component
|
|
19
19
|
|
|
20
|
-
public constructor
|
|
20
|
+
public constructor(options: Options | null, discovery: Promise<Component>) {
|
|
21
21
|
super()
|
|
22
22
|
|
|
23
23
|
schemas.get.validate(options)
|
|
@@ -26,21 +26,17 @@ export class Get extends Directive {
|
|
|
26
26
|
this.discovery = discovery
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
public async apply
|
|
29
|
+
public async apply(storage: string, input: Input): Promise<Output> {
|
|
30
30
|
this.storage ??= await this.discovery
|
|
31
31
|
|
|
32
32
|
if (input.subtype === 'octets.entry')
|
|
33
|
-
if (this.options.meta)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
throw new Forbidden('Metadata is not accessible')
|
|
37
|
-
else
|
|
38
|
-
return await this.get(storage, input)
|
|
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)
|
|
39
36
|
}
|
|
40
37
|
|
|
41
|
-
private async get
|
|
42
|
-
if ('if-none-match' in input.request.headers)
|
|
43
|
-
return { status: 304 }
|
|
38
|
+
private async get(storage: string, input: Input): Promise<Output> {
|
|
39
|
+
if ('if-none-match' in input.request.headers) return { status: 304 }
|
|
44
40
|
|
|
45
41
|
const endpoint = input.request.method === 'GET' ? 'get' : 'head'
|
|
46
42
|
|
|
@@ -53,21 +49,18 @@ export class Get extends Directive {
|
|
|
53
49
|
}
|
|
54
50
|
})
|
|
55
51
|
|
|
56
|
-
if (entry instanceof Error)
|
|
57
|
-
throw new NotFound()
|
|
52
|
+
if (entry instanceof Error) throw new NotFound()
|
|
58
53
|
|
|
59
54
|
const headers = new Headers({
|
|
60
55
|
'content-type': entry.type,
|
|
61
56
|
etag: `"${entry.checksum}"`
|
|
62
57
|
})
|
|
63
58
|
|
|
64
|
-
if (entry.range !== undefined)
|
|
65
|
-
headers.set('content-range', entry.range)
|
|
59
|
+
if (entry.range !== undefined) headers.set('content-range', entry.range)
|
|
66
60
|
|
|
67
61
|
// an absent content-length is what says the length is unknown; naming the encoding
|
|
68
62
|
// is redundant over HTTP/1.1 and forbidden over HTTP/2
|
|
69
|
-
if (entry.size !== null)
|
|
70
|
-
headers.set('content-length', entry.size.toString())
|
|
63
|
+
if (entry.size !== null) headers.set('content-length', entry.size.toString())
|
|
71
64
|
|
|
72
65
|
return {
|
|
73
66
|
status: entry.partial === true ? 206 : 200,
|
|
@@ -76,7 +69,7 @@ export class Get extends Directive {
|
|
|
76
69
|
}
|
|
77
70
|
}
|
|
78
71
|
|
|
79
|
-
private async head
|
|
72
|
+
private async head(storage: string, input: Input): Promise<Output> {
|
|
80
73
|
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
81
74
|
input: {
|
|
82
75
|
storage,
|
|
@@ -84,8 +77,7 @@ export class Get extends Directive {
|
|
|
84
77
|
}
|
|
85
78
|
})
|
|
86
79
|
|
|
87
|
-
if (entry instanceof Error)
|
|
88
|
-
throw new NotFound()
|
|
80
|
+
if (entry instanceof Error) throw new NotFound()
|
|
89
81
|
|
|
90
82
|
return { body: entry }
|
|
91
83
|
}
|
|
@@ -17,7 +17,7 @@ export class Octets implements DirectiveFamily<Directive> {
|
|
|
17
17
|
|
|
18
18
|
private discovery = null as unknown as Promise<Component>
|
|
19
19
|
|
|
20
|
-
public create
|
|
20
|
+
public create(name: string, value: any, remotes: Remotes): Directive {
|
|
21
21
|
const Class = DIRECTIVES[name]
|
|
22
22
|
|
|
23
23
|
if (Class === undefined)
|
|
@@ -28,32 +28,33 @@ export class Octets implements DirectiveFamily<Directive> {
|
|
|
28
28
|
return new Class(value, this.discovery, remotes)
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
public async precall
|
|
31
|
+
public async precall(
|
|
32
|
+
directives: Directive[],
|
|
33
|
+
input: Input,
|
|
34
|
+
parameters: Parameter[]
|
|
35
|
+
): Promise<Output> {
|
|
32
36
|
let context: Context | null = null
|
|
33
37
|
let action: Directive | null = null
|
|
34
38
|
|
|
35
39
|
for (const directive of directives)
|
|
36
|
-
if (directive instanceof Context)
|
|
37
|
-
|
|
38
|
-
else
|
|
39
|
-
action = directive
|
|
40
|
-
else
|
|
41
|
-
throw new Error('Octets action is ambiguous')
|
|
40
|
+
if (directive instanceof Context) context ??= directive
|
|
41
|
+
else if (action === null) action = directive
|
|
42
|
+
else throw new Error('Octets action is ambiguous')
|
|
42
43
|
|
|
43
|
-
if (action === null)
|
|
44
|
-
return null
|
|
44
|
+
if (action === null) return null
|
|
45
45
|
|
|
46
46
|
// noinspection PointlessBooleanExpressionJS
|
|
47
|
-
if (context === null)
|
|
48
|
-
throw new Error('Octets context is not defined')
|
|
47
|
+
if (context === null) throw new Error('Octets context is not defined')
|
|
49
48
|
|
|
50
49
|
const targeted = input.request.url[input.request.url.length - 1] !== '/'
|
|
51
50
|
|
|
52
51
|
if (targeted !== action.targeted)
|
|
53
|
-
throw new NotFound(
|
|
52
|
+
throw new NotFound(
|
|
53
|
+
`Trailing slash is ${action.targeted ? 'redundant' : 'required'}`
|
|
54
|
+
)
|
|
54
55
|
|
|
55
56
|
// noinspection JSObjectNullOrUndefined
|
|
56
|
-
return await
|
|
57
|
+
return await action.apply(context.storage, input, parameters)
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
|
|
@@ -66,4 +67,8 @@ const DIRECTIVES: Record<string, Constructor> = {
|
|
|
66
67
|
workflow: WorkflowDirective
|
|
67
68
|
}
|
|
68
69
|
|
|
69
|
-
type Constructor = new (
|
|
70
|
+
type Constructor = new (
|
|
71
|
+
value: any,
|
|
72
|
+
discovery: Promise<Component>,
|
|
73
|
+
remotes: Remotes
|
|
74
|
+
) => Directive
|
|
@@ -27,25 +27,33 @@ export class Put extends Directive {
|
|
|
27
27
|
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
28
28
|
private storage: Component | null = null
|
|
29
29
|
|
|
30
|
-
public constructor
|
|
30
|
+
public constructor(
|
|
31
|
+
options: Options | null,
|
|
32
|
+
discovery: Promise<Component>,
|
|
33
|
+
remotes: Remotes
|
|
34
|
+
) {
|
|
31
35
|
super()
|
|
32
36
|
|
|
33
37
|
schemas.put.validate<Options>(options)
|
|
34
38
|
|
|
35
|
-
this.accept = match(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
this.accept = match(
|
|
40
|
+
options?.accept,
|
|
41
|
+
String,
|
|
42
|
+
(value: string) => value,
|
|
43
|
+
Array,
|
|
44
|
+
(types: string[]) => types.join(','),
|
|
45
|
+
undefined
|
|
46
|
+
)
|
|
39
47
|
|
|
40
48
|
if (options?.workflow !== undefined)
|
|
41
49
|
this.workflow = new Workflow(options.workflow, remotes)
|
|
42
50
|
|
|
43
51
|
if (options?.trust !== undefined)
|
|
44
52
|
this.trust = options.trust.map((value: string) =>
|
|
45
|
-
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value
|
|
53
|
+
value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value
|
|
54
|
+
)
|
|
46
55
|
|
|
47
|
-
if (options?.location !== undefined)
|
|
48
|
-
this.location = options.location
|
|
56
|
+
if (options?.location !== undefined) this.location = options.location
|
|
49
57
|
|
|
50
58
|
this.limitString = options?.limit ?? '64MiB'
|
|
51
59
|
this.limit = toBytes(this.limitString)
|
|
@@ -55,7 +63,11 @@ export class Put extends Directive {
|
|
|
55
63
|
cors.allow('content-location')
|
|
56
64
|
}
|
|
57
65
|
|
|
58
|
-
public async apply
|
|
66
|
+
public async apply(
|
|
67
|
+
storage: string,
|
|
68
|
+
input: Input,
|
|
69
|
+
parameters: Parameter[]
|
|
70
|
+
): Promise<Output> {
|
|
59
71
|
this.storage ??= await this.discovery.storage
|
|
60
72
|
|
|
61
73
|
const request: StoreRequest = {
|
|
@@ -71,22 +83,36 @@ export class Put extends Directive {
|
|
|
71
83
|
|
|
72
84
|
const entry = await this.storage.invoke<Entry>('put', request)
|
|
73
85
|
|
|
74
|
-
return match<Output>(
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
return match<Output>(
|
|
87
|
+
entry,
|
|
88
|
+
Error,
|
|
89
|
+
(error: CodedError) => this.throw(error),
|
|
90
|
+
() => this.reply(input, storage, entry, parameters)
|
|
91
|
+
)
|
|
77
92
|
}
|
|
78
93
|
|
|
79
94
|
// eslint-disable-next-line max-params
|
|
80
|
-
private reply
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
95
|
+
private reply(
|
|
96
|
+
input: Input,
|
|
97
|
+
storage: string,
|
|
98
|
+
entry: Entry,
|
|
99
|
+
parameters: Parameter[]
|
|
100
|
+
): Output {
|
|
101
|
+
const body =
|
|
102
|
+
this.workflow === undefined
|
|
103
|
+
? entry
|
|
104
|
+
: this.execute(input, storage, entry, parameters)
|
|
84
105
|
|
|
85
106
|
return { body }
|
|
86
107
|
}
|
|
87
108
|
|
|
88
109
|
// eslint-disable-next-line max-params
|
|
89
|
-
private execute
|
|
110
|
+
private execute(
|
|
111
|
+
input: Input,
|
|
112
|
+
storage: string,
|
|
113
|
+
entry: Entry,
|
|
114
|
+
parameters: Parameter[]
|
|
115
|
+
): Readable {
|
|
90
116
|
const stream = new PassThrough({ objectMode: true })
|
|
91
117
|
|
|
92
118
|
stream.push(entry)
|
|
@@ -103,16 +129,25 @@ export class Put extends Directive {
|
|
|
103
129
|
return stream
|
|
104
130
|
}
|
|
105
131
|
|
|
106
|
-
private throw
|
|
107
|
-
throw match(
|
|
108
|
-
|
|
109
|
-
'
|
|
110
|
-
|
|
111
|
-
'
|
|
112
|
-
|
|
113
|
-
'
|
|
114
|
-
|
|
115
|
-
|
|
132
|
+
private throw(error: CodedError): never {
|
|
133
|
+
throw match(
|
|
134
|
+
error.code,
|
|
135
|
+
'NOT_ACCEPTABLE',
|
|
136
|
+
() => new http.UnsupportedMediaType(),
|
|
137
|
+
'TYPE_MISMATCH',
|
|
138
|
+
() => new http.BadRequest(),
|
|
139
|
+
'LIMIT_EXCEEDED',
|
|
140
|
+
() => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
|
|
141
|
+
'LOCATION_UNTRUSTED',
|
|
142
|
+
() => new http.Forbidden(error.message),
|
|
143
|
+
'LOCATION_LENGTH',
|
|
144
|
+
() => new http.BadRequest(error.message),
|
|
145
|
+
'LOCATION_UNAVAILABLE',
|
|
146
|
+
() => new http.NotFound(error.message),
|
|
147
|
+
'INVALID_ID',
|
|
148
|
+
() => new http.BadRequest(error.message),
|
|
149
|
+
error
|
|
150
|
+
)
|
|
116
151
|
}
|
|
117
152
|
}
|
|
118
153
|
|
|
@@ -7,7 +7,7 @@ import type { Input } from './types.js'
|
|
|
7
7
|
import type { Component } from '@toa.io/core'
|
|
8
8
|
import type { Output } from '../../io.js'
|
|
9
9
|
import type { Remotes } from '../../Remotes.js'
|
|
10
|
-
import type { Maybe } from '@toa.io/core'
|
|
10
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
11
11
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
12
12
|
import type { Parameter } from '../../RTD/index.js'
|
|
13
13
|
|
|
@@ -18,7 +18,11 @@ export class WorkflowDirective extends Directive {
|
|
|
18
18
|
private readonly discovery: Promise<Component>
|
|
19
19
|
private storage: Component | null = null
|
|
20
20
|
|
|
21
|
-
public constructor
|
|
21
|
+
public constructor(
|
|
22
|
+
units: Unit[] | Unit,
|
|
23
|
+
discovery: Promise<Component>,
|
|
24
|
+
remotes: Remotes
|
|
25
|
+
) {
|
|
22
26
|
super()
|
|
23
27
|
schemas.workflow.validate(units)
|
|
24
28
|
|
|
@@ -26,19 +30,21 @@ export class WorkflowDirective extends Directive {
|
|
|
26
30
|
this.discovery = discovery
|
|
27
31
|
}
|
|
28
32
|
|
|
29
|
-
public async apply
|
|
33
|
+
public async apply(
|
|
34
|
+
storage: string,
|
|
35
|
+
input: Input,
|
|
36
|
+
parameters: Parameter[]
|
|
37
|
+
): Promise<Output> {
|
|
30
38
|
this.storage ??= await this.discovery
|
|
31
39
|
|
|
32
|
-
const entry = await this.storage.invoke<Maybe<Entry>>('head',
|
|
33
|
-
{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
40
|
+
const entry = await this.storage.invoke<Maybe<Entry>>('head', {
|
|
41
|
+
input: {
|
|
42
|
+
storage,
|
|
43
|
+
path: input.request.url
|
|
44
|
+
}
|
|
45
|
+
})
|
|
39
46
|
|
|
40
|
-
if (entry instanceof Error)
|
|
41
|
-
throw new NotFound()
|
|
47
|
+
if (entry instanceof Error) throw new NotFound()
|
|
42
48
|
|
|
43
49
|
const location: Location = {
|
|
44
50
|
storage,
|
|
@@ -4,23 +4,17 @@ import assert from 'node:assert/strict'
|
|
|
4
4
|
import * as schemas from './schemas.js'
|
|
5
5
|
|
|
6
6
|
describe('workflow', () => {
|
|
7
|
-
const ok = [
|
|
8
|
-
{ echo: 'hello world' },
|
|
9
|
-
[{ echo: 'hello world' }, { ok: 'ok' }]
|
|
10
|
-
]
|
|
7
|
+
const ok = [{ echo: 'hello world' }, [{ echo: 'hello world' }, { ok: 'ok' }]]
|
|
11
8
|
|
|
12
|
-
const oh = [
|
|
13
|
-
{ echo: [] },
|
|
14
|
-
{ echo: 'hello world', ok: { not: 'ok' } }
|
|
15
|
-
]
|
|
9
|
+
const oh = [{ echo: [] }, { echo: 'hello world', ok: { not: 'ok' } }]
|
|
16
10
|
|
|
17
11
|
for (const workflow of ok)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
it('should be valid', () => {
|
|
13
|
+
assert.doesNotThrow(() => schemas.workflow.validate(workflow))
|
|
14
|
+
})
|
|
21
15
|
|
|
22
16
|
for (const workflow of oh)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
it('should not be valid', () => {
|
|
18
|
+
assert.throws(() => schemas.workflow.validate(workflow))
|
|
19
|
+
})
|
|
26
20
|
})
|
|
@@ -3,7 +3,7 @@ import { console } from 'openspan'
|
|
|
3
3
|
import type { Unit } from './Workflow.js'
|
|
4
4
|
import type { Remotes } from '../../../Remotes.js'
|
|
5
5
|
import type { Component } from '@toa.io/core'
|
|
6
|
-
import type { Maybe } from '@toa.io/core'
|
|
6
|
+
import type { Maybe } from '@toa.io/core/types'
|
|
7
7
|
import type { Entry } from '@toa.io/extensions.storages'
|
|
8
8
|
|
|
9
9
|
export class Execution extends Readable {
|
|
@@ -14,7 +14,7 @@ export class Execution extends Readable {
|
|
|
14
14
|
private readonly discovery: Record<string, Promise<Component>> = {}
|
|
15
15
|
private interrupted = false
|
|
16
16
|
|
|
17
|
-
public constructor
|
|
17
|
+
public constructor(context: Context, units: Unit[], remotes: Remotes) {
|
|
18
18
|
super({ objectMode: true })
|
|
19
19
|
|
|
20
20
|
this.context = context
|
|
@@ -24,27 +24,24 @@ export class Execution extends Readable {
|
|
|
24
24
|
void this.run()
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
public override _read
|
|
28
|
-
}
|
|
27
|
+
public override _read(): void {}
|
|
29
28
|
|
|
30
|
-
private async run
|
|
29
|
+
private async run(): Promise<void> {
|
|
31
30
|
for (const unit of this.units) {
|
|
32
31
|
await this.execute(unit)
|
|
33
32
|
|
|
34
|
-
if (this.interrupted)
|
|
35
|
-
break
|
|
33
|
+
if (this.interrupted) break
|
|
36
34
|
}
|
|
37
35
|
|
|
38
36
|
this.push(null)
|
|
39
37
|
}
|
|
40
38
|
|
|
41
|
-
private async execute
|
|
39
|
+
private async execute(unit: Unit): Promise<void> {
|
|
42
40
|
const promises = Object.entries(unit).map(async ([step, endpoint]) => {
|
|
43
41
|
try {
|
|
44
42
|
const result = await this.call(endpoint)
|
|
45
43
|
|
|
46
|
-
if (result instanceof Readable)
|
|
47
|
-
return await this.stream(step, result)
|
|
44
|
+
if (result instanceof Readable) return await this.stream(step, result)
|
|
48
45
|
|
|
49
46
|
this.report(step, result)
|
|
50
47
|
} catch (e: unknown) {
|
|
@@ -55,10 +52,9 @@ export class Execution extends Readable {
|
|
|
55
52
|
await Promise.all(promises)
|
|
56
53
|
}
|
|
57
54
|
|
|
58
|
-
private async stream
|
|
55
|
+
private async stream(step: string, stream: Readable): Promise<void> {
|
|
59
56
|
try {
|
|
60
|
-
for await (const result of stream)
|
|
61
|
-
this.report(step, result, false)
|
|
57
|
+
for await (const result of stream) this.report(step, result, false)
|
|
62
58
|
|
|
63
59
|
this.report(step, undefined, true)
|
|
64
60
|
} catch (e: unknown) {
|
|
@@ -66,11 +62,10 @@ export class Execution extends Readable {
|
|
|
66
62
|
}
|
|
67
63
|
}
|
|
68
64
|
|
|
69
|
-
private report
|
|
65
|
+
private report(step: string, result?: Maybe<unknown>, completed = true): void {
|
|
70
66
|
const report: Report = { step }
|
|
71
67
|
|
|
72
|
-
if (completed)
|
|
73
|
-
report.status = 'completed'
|
|
68
|
+
if (completed) report.status = 'completed'
|
|
74
69
|
|
|
75
70
|
if (result instanceof Error) {
|
|
76
71
|
// an Error cannot be serialized where it sits, and the encoders only unwrap
|
|
@@ -85,18 +80,17 @@ export class Execution extends Readable {
|
|
|
85
80
|
this.push(report)
|
|
86
81
|
}
|
|
87
82
|
|
|
88
|
-
private exception
|
|
83
|
+
private exception(step: string, error: unknown): void {
|
|
89
84
|
console.error('Workflow exception', error as Error)
|
|
90
85
|
|
|
91
86
|
this.push({ step, status: 'exception' } satisfies Report)
|
|
92
87
|
this.interrupted = true
|
|
93
88
|
}
|
|
94
89
|
|
|
95
|
-
private async call
|
|
90
|
+
private async call(endpoint: string): Promise<Maybe<unknown>> {
|
|
96
91
|
const task = endpoint.startsWith('task:')
|
|
97
92
|
|
|
98
|
-
if (task)
|
|
99
|
-
endpoint = endpoint.slice(5)
|
|
93
|
+
if (task) endpoint = endpoint.slice(5)
|
|
100
94
|
|
|
101
95
|
const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
|
|
102
96
|
const key = `${namespace}.${component}`
|
|
@@ -106,7 +100,11 @@ export class Execution extends Readable {
|
|
|
106
100
|
return this.components[key].invoke(operation, { input: this.context, task })
|
|
107
101
|
}
|
|
108
102
|
|
|
109
|
-
private async discover
|
|
103
|
+
private async discover(
|
|
104
|
+
key: string,
|
|
105
|
+
namespace: string,
|
|
106
|
+
component: string
|
|
107
|
+
): Promise<Component> {
|
|
110
108
|
if (this.discovery[key] === undefined)
|
|
111
109
|
this.discovery[key] = this.remotes.discover(namespace, component)
|
|
112
110
|
|
|
@@ -10,19 +10,22 @@ export class Workflow {
|
|
|
10
10
|
private readonly units: Unit[]
|
|
11
11
|
private readonly remotes: Remotes
|
|
12
12
|
|
|
13
|
-
public constructor
|
|
14
|
-
this.units = match<Unit[]>(
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
public constructor(units: Unit[] | Unit, remotes: Remotes) {
|
|
14
|
+
this.units = match<Unit[]>(
|
|
15
|
+
units,
|
|
16
|
+
Array,
|
|
17
|
+
(units: Unit[]) => units,
|
|
18
|
+
Object,
|
|
19
|
+
(unit: Unit) => [unit]
|
|
20
|
+
)
|
|
17
21
|
|
|
18
22
|
this.remotes = remotes
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
public execute
|
|
25
|
+
public execute(location: Location, entry: Entry, params: Parameter[]): Execution {
|
|
22
26
|
const parameters: Record<string, string> = {}
|
|
23
27
|
|
|
24
|
-
for (const { name, value } of params)
|
|
25
|
-
parameters[name] = value
|
|
28
|
+
for (const { name, value } of params) parameters[name] = value
|
|
26
29
|
|
|
27
30
|
const context: Context = {
|
|
28
31
|
authority: location.authority,
|
|
@@ -5,14 +5,13 @@ import type { Directive } from './Directive.js'
|
|
|
5
5
|
export class Headers implements Directive {
|
|
6
6
|
private readonly headers: string[]
|
|
7
7
|
|
|
8
|
-
public constructor
|
|
9
|
-
if (!Array.isArray(headers))
|
|
10
|
-
headers = [headers]
|
|
8
|
+
public constructor(headers: string[]) {
|
|
9
|
+
if (!Array.isArray(headers)) headers = [headers]
|
|
11
10
|
|
|
12
11
|
this.headers = headers
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
public precall
|
|
14
|
+
public precall(context: Input): void {
|
|
16
15
|
for (const header of this.headers)
|
|
17
16
|
if (context.request.headers[header] === undefined)
|
|
18
17
|
throw new BadRequest(`Header required: ${header}`)
|