From 6ce23ff4520252e875cb8b5cf7eb72e6b4d86097 Mon Sep 17 00:00:00 2001 From: Bailey Hayes Date: Mon, 8 Jun 2026 20:19:26 -0400 Subject: [PATCH] fix(templates): multiple subscription, multi-component workload Refreshes http-api-with-distributed-workloads with multiple subs. This matches the template changes made in https://github.com/wasmCloud/wasmCloud/pull/5243 Signed-off-by: Bailey Hayes --- .../.gitignore | 4 +- .../.wash/config.yaml | 19 +- .../README.md | 152 ++-- .../wasi-clocks-monotonic-clock.d.ts | 10 - .../wasi-http-incoming-handler.d.ts | 18 - .../types/interfaces/wasi-http-types.d.ts | 764 ------------------ .../types/interfaces/wasi-io-error.d.ts | 11 - .../types/interfaces/wasi-io-poll.d.ts | 13 - .../types/interfaces/wasi-io-streams.d.ts | 45 -- .../wasmcloud-messaging-consumer.d.ts | 12 - .../interfaces/wasmcloud-messaging-types.d.ts | 10 - .../http-api/generated/types/wit.d.ts | 18 - .../http-api/src/component.ts | 7 +- .../http-api/src/index.html | 174 +++- .../wit/deps/wasi-cli-0.2.6/package.wit | 20 - .../wit/deps/wasi-clocks-0.2.6/package.wit | 29 - .../wit/deps/wasi-http-0.2.6/package.wit | 733 ----------------- .../wit/deps/wasi-io-0.2.6/package.wit | 48 -- .../wit/deps/wasi-random-0.2.6/package.wit | 8 - .../wasmcloud-messaging-0.2.0/package.wit | 29 - .../nodemon.json | 2 +- .../package.json | 7 +- .../.wash/config.yaml | 4 +- .../{task-worker => task-leet}/package.json | 4 +- .../rolldown.config.mjs | 0 .../src/component.ts | 48 +- .../{task-worker => task-leet}/tsconfig.json | 0 .../{task-worker => task-leet}/wit/world.wit | 1 + .../{task-worker => task-leet}/wkg.lock | 9 + .../task-reverse/.wash/config.yaml | 6 + .../task-reverse/package.json | 25 + .../task-reverse/rolldown.config.mjs | 10 + .../task-reverse/src/component.ts | 100 +++ .../task-reverse/tsconfig.json | 16 + .../task-reverse/wit/world.wit | 8 + .../task-reverse/wkg.lock | 21 + .../wasmcloud-messaging-consumer.d.ts | 12 - .../wasmcloud-messaging-handler.d.ts | 8 - .../interfaces/wasmcloud-messaging-types.d.ts | 10 - .../task-worker/generated/types/wit.d.ts | 8 - .../wasmcloud-messaging-0.2.0/package.wit | 29 - 41 files changed, 521 insertions(+), 1931 deletions(-) delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-clocks-monotonic-clock.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-incoming-handler.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-types.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-error.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-poll.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-streams.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-consumer.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-types.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/generated/types/wit.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasi-cli-0.2.6/package.wit delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasi-clocks-0.2.6/package.wit delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasi-http-0.2.6/package.wit delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasi-io-0.2.6/package.wit delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasi-random-0.2.6/package.wit delete mode 100644 templates/http-api-with-distributed-workloads/http-api/wit/deps/wasmcloud-messaging-0.2.0/package.wit rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/.wash/config.yaml (81%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/package.json (83%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/rolldown.config.mjs (100%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/src/component.ts (59%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/tsconfig.json (100%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/wit/world.wit (82%) rename templates/http-api-with-distributed-workloads/{task-worker => task-leet}/wkg.lock (59%) create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/.wash/config.yaml create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/package.json create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/rolldown.config.mjs create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/src/component.ts create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/tsconfig.json create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/wit/world.wit create mode 100644 templates/http-api-with-distributed-workloads/task-reverse/wkg.lock delete mode 100644 templates/http-api-with-distributed-workloads/task-worker/generated/types/interfaces/wasmcloud-messaging-consumer.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/task-worker/generated/types/interfaces/wasmcloud-messaging-handler.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/task-worker/generated/types/interfaces/wasmcloud-messaging-types.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/task-worker/generated/types/wit.d.ts delete mode 100644 templates/http-api-with-distributed-workloads/task-worker/wit/deps/wasmcloud-messaging-0.2.0/package.wit diff --git a/templates/http-api-with-distributed-workloads/.gitignore b/templates/http-api-with-distributed-workloads/.gitignore index c929de26..e34b7214 100644 --- a/templates/http-api-with-distributed-workloads/.gitignore +++ b/templates/http-api-with-distributed-workloads/.gitignore @@ -1,7 +1,7 @@ node_modules dist build -generated/** +**/generated/ *.tgz -wit/deps +**/wit/deps/ *.log diff --git a/templates/http-api-with-distributed-workloads/.wash/config.yaml b/templates/http-api-with-distributed-workloads/.wash/config.yaml index 546ad584..29af9d62 100644 --- a/templates/http-api-with-distributed-workloads/.wash/config.yaml +++ b/templates/http-api-with-distributed-workloads/.wash/config.yaml @@ -7,5 +7,20 @@ build: dev: components: - - name: task-worker - file: task-worker/dist/task_worker.wasm + # Each worker subscribes to its own subject, so `tasks.leet` routes to + # task-leet and `tasks.reverse` routes to task-reverse. `subscriptions` + # is per-component config read by the messaging backend (in-memory for + # `wash dev`, or NATS when `data_nats_url` is set). + - name: task-leet + file: task-leet/dist/task_leet.wasm + # Per-component config for this worker + config: + subscriptions: tasks.leet + leet.mode: aggressive + leet.prefix: "πŸ€– " + - name: task-reverse + file: task-reverse/dist/task_reverse.wasm + config: + subscriptions: tasks.reverse + reverse.mode: words + reverse.prefix: "πŸ” " diff --git a/templates/http-api-with-distributed-workloads/README.md b/templates/http-api-with-distributed-workloads/README.md index ae9a2d51..3a988bef 100644 --- a/templates/http-api-with-distributed-workloads/README.md +++ b/templates/http-api-with-distributed-workloads/README.md @@ -1,34 +1,36 @@ # http-api-with-distributed-workloads -A wasmCloud template demonstrating HTTP API with distributed workloads via -[`wasmcloud:messaging`][messaging]. Two WebAssembly components communicate -through the messaging interface: one dispatches tasks, the other processes them. +A wasmCloud template demonstrating an HTTP API with distributed workloads via +[`wasmcloud:messaging`][messaging]. An HTTP API receives requests and delegates +processing to background worker components over the messaging interface, with +each worker subscribed to its own subject. [messaging]: https://github.com/wasmCloud/wasmCloud/tree/main/wit/messaging | Part | Type | What it does | |---|---|---| -| `http-api/` | wasmCloud **component** | HTTP API β€” `POST /task` dispatches work via `wasmcloud:messaging/consumer` and returns the reply | -| `task-worker/` | wasmCloud **component** | Task processor β€” exports `wasmcloud:messaging/handler`, converts payloads to leet speak | +| `http-api/` | wasmCloud **component** | HTTP API β€” `POST /task` dispatches work to `tasks.{worker}` via `wasmcloud:messaging/consumer` and returns the reply | +| `task-leet/` | wasmCloud **component** | Worker subscribed to `tasks.leet` β€” exports `wasmcloud:messaging/handler`, converts payloads to leet speak | +| `task-reverse/` | wasmCloud **component** | Worker subscribed to `tasks.reverse` β€” exports `wasmcloud:messaging/handler`, reverses the text | ## Architecture ``` -HTTP client - β”‚ POST /task { worker, payload } - β–Ό -http-api component (exports wasi:http/incoming-handler) - β”‚ consumer::request("tasks.task-worker", body, 5000ms) - β–Ό -wasmCloud runtime - β”‚ routes to task-worker handler - β–Ό -task-worker component (exports wasmcloud:messaging/handler) - β”‚ toLeetSpeak(payload) β†’ reply - β–Ό -http-api component returns reply body to HTTP client +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Client │─────▢│ HTTP API │─────▢│ Message Broker │──┬──▢│ task-leet β”‚ tasks.leet +β”‚ │◀─────│ (:8000) │◀─────│ (in-memory or β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ NATS) β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ └──▢│ task-reverse β”‚ tasks.reverse + POST /task β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + { worker, payload } ``` +1. Client sends a POST request to `/task` with a JSON payload. +2. `http-api` publishes a request to subject `tasks.{worker}` (default: `tasks.leet`). +3. The broker routes the message to the worker subscribed to that subject. +4. The worker processes the payload and publishes the response to the `reply_to` subject. +5. `http-api` returns the transformed response to the HTTP client. + During development with `wash dev`, the wasmCloud runtime routes calls between components in-process β€” no NATS server required. In production, the runtime's built-in messaging plugin connects to NATS automatically when the host starts @@ -71,31 +73,82 @@ wash dev Then open http://localhost:8000 to use the web UI, or test with curl: ```shell +# Routes to task-leet (tasks.leet) +curl -s -X POST http://localhost:8000/task \ + -H 'Content-Type: application/json' \ + -d '{"worker": "leet", "payload": "Hello World"}' +# => πŸ€– H3110 W0r1d + +# Routes to task-reverse (tasks.reverse) curl -s -X POST http://localhost:8000/task \ -H 'Content-Type: application/json' \ - -d '{"worker": "task-worker", "payload": "Hello World"}' -# => H3110 W0r1d + -d '{"worker": "reverse", "payload": "Hello World"}' +# => πŸ” World Hello ``` +The `worker` field selects the subject (`tasks.{worker}`), routing the request +to the worker subscribed to it: `leet` β†’ task-leet, `reverse` β†’ task-reverse. +The request has a 5-second timeout for the worker to respond. + ## Project structure ``` . -β”œβ”€β”€ .wash/config.yaml # wash build & dev configuration +β”œβ”€β”€ .wash/config.yaml # wash build & dev configuration (workload + per-component config) β”œβ”€β”€ nodemon.json # file-watch config for `npm run dev` β”œβ”€β”€ package.json # npm workspace root β”‚ β”œβ”€β”€ http-api/ # HTTP front-end component β”‚ β”œβ”€β”€ src/component.ts # Hono app + messaging consumer usage +β”‚ β”œβ”€β”€ src/index.html # branded task-submission UI β”‚ β”œβ”€β”€ wit/world.wit # imports consumer, exports http/incoming-handler β”‚ └── ... β”‚ -└── task-worker/ # Leet-speak task worker component - β”œβ”€β”€ src/component.ts # messaging handler export + leet-speak logic - β”œβ”€β”€ wit/world.wit # imports consumer, exports messaging/handler +β”œβ”€β”€ task-leet/ # Leet-speak worker (tasks.leet) +β”‚ β”œβ”€β”€ src/component.ts # messaging handler + wasi:config + leet logic +β”‚ β”œβ”€β”€ wit/world.wit # imports consumer + wasi:config, exports messaging/handler +β”‚ └── ... +β”‚ +└── task-reverse/ # Reverse worker (tasks.reverse) + β”œβ”€β”€ src/component.ts # messaging handler + wasi:config + reverse logic + β”œβ”€β”€ wit/world.wit # imports consumer + wasi:config, exports messaging/handler └── ... ``` +## Per-component configuration + +`.wash/config.yaml` shows how config is layered across a multi-component +workload. + +```yaml +dev: + components: + - name: task-leet + file: task-leet/dist/task_leet.wasm + config: # this worker's overrides + subscriptions: tasks.leet + leet.mode: aggressive + leet.prefix: "πŸ€– " + - name: task-reverse + file: task-reverse/dist/task_reverse.wasm + config: + subscriptions: tasks.reverse + reverse.mode: words + reverse.prefix: "πŸ” " +``` + +Two kinds of per-component config are at work: + +- **`subscriptions`** is read by the messaging backend (in-memory for + `wash dev`, or NATS) to decide which subjects each worker receives. This is + what makes `tasks.leet` route to task-leet and `tasks.reverse` to + task-reverse rather than both workers competing for every message. +- **`leet.*` / `reverse.*`** are read by the worker itself via + `wasi:config/store` (see `task-leet/src/component.ts`, + `task-reverse/src/component.ts`). `leet.mode` toggles whether `l`/`t` are also + substituted; `reverse.mode` switches between reversing characters and words; + the `*.prefix` is prepended to each reply. + ## wasmcloud:messaging This template demonstrates both sides of the `wasmcloud:messaging` interface: @@ -105,17 +158,18 @@ This template demonstrates both sides of the `wasmcloud:messaging` interface: | `wasmcloud:messaging/consumer` | import | Send messages (`request`, `publish`) | | `wasmcloud:messaging/handler` | export | Receive messages (`handleMessage`) | -Both components import `consumer` β€” `http-api` to dispatch tasks via `request()`, -`task-worker` to publish replies via `publish()`. Only `task-worker` exports `handler`. +All three components import `consumer` β€” `http-api` to dispatch tasks via +`request()`, the workers to publish replies via `publish()`. Each worker exports +`handler` and subscribes to its own subject. -The `rolldown.config.mjs` in each component must extend the externals pattern to cover -`wasmcloud:` imports in addition to the default `wasi:`: +The `rolldown.config.mjs` in each component must extend the externals pattern to +cover `wasmcloud:` and `wasi:` imports: ```js external: [/wasi:.*/, /wasmcloud:.*/], ``` -## Build Wasm binary +## Build Wasm binaries ```bash npm run build @@ -123,7 +177,8 @@ npm run build Artifacts: - `http-api/dist/http_api.wasm` -- `task-worker/dist/task_worker.wasm` +- `task-leet/dist/task_leet.wasm` +- `task-reverse/dist/task_reverse.wasm` ## WIT interfaces @@ -136,16 +191,18 @@ world typescript-http-api-with-distributed-workloads-api { ``` ```wit -// task-worker/wit/world.wit +// task-leet/wit/world.wit and task-reverse/wit/world.wit world typescript-http-api-with-distributed-workloads-worker { import wasmcloud:messaging/consumer@0.2.0; + import wasi:config/store@0.2.0-rc.1; export wasmcloud:messaging/handler@0.2.0; } ``` ## Production deployment -Both components run on the same wasmCloud host. Deploy both components together using a `WorkloadDeployment` manifest: +All three components run on the same wasmCloud host. Deploy them together using +a `WorkloadDeployment` manifest, giving each worker its own `subscriptions`: ```yaml apiVersion: runtime.wasmcloud.dev/v1alpha1 @@ -163,24 +220,29 @@ spec: - incoming-handler config: host: your-domain.example.com # HTTP Host header used for routing - - namespace: wasmcloud - package: messaging - interfaces: - - consumer - - handler - config: - subscriptions: "tasks.>" # NATS subjects the task-worker subscribes to components: - name: http-api image: /http_api:latest - - name: task-worker - image: /task_worker:latest + - name: task-leet + image: /task_leet:latest + localResources: + config: + subscriptions: tasks.leet # subjects this worker subscribes to + leet.mode: aggressive + leet.prefix: "πŸ€– " + - name: task-reverse + image: /task_reverse:latest + localResources: + config: + subscriptions: tasks.reverse + reverse.mode: words + reverse.prefix: "πŸ” " ``` -The `hostInterfaces` block declares which built-in capabilities the workload needs. -No separate HTTP server or NATS messaging component is required; both are provided -by the runtime. Subscriptions are comma-separated NATS subject patterns; `tasks.>` -matches any subject starting with `tasks.`. +The `hostInterfaces` block declares which built-in capabilities the workload +needs. No separate HTTP server or NATS messaging component is required; both are +provided by the runtime. `subscriptions` is comma-separated NATS subject +patterns; e.g. `tasks.>` matches any subject starting with `tasks.`. For Kubernetes deployment, see the [runtime-operator documentation](https://github.com/wasmCloud/wasmCloud/tree/main/runtime-operator). diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-clocks-monotonic-clock.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-clocks-monotonic-clock.d.ts deleted file mode 100644 index cc2004e7..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-clocks-monotonic-clock.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/// -declare module 'wasi:clocks/monotonic-clock@0.2.6' { - export function now(): Instant; - export function resolution(): Duration; - export function subscribeInstant(when: Instant): Pollable; - export function subscribeDuration(when: Duration): Pollable; - export type Pollable = import('wasi:io/poll@0.2.6').Pollable; - export type Instant = bigint; - export type Duration = bigint; -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-incoming-handler.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-incoming-handler.d.ts deleted file mode 100644 index f04fec70..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-incoming-handler.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -declare module 'wasi:http/incoming-handler@0.2.6' { - /** - * This function is invoked with an incoming HTTP Request, and a resource - * `response-outparam` which provides the capability to reply with an HTTP - * Response. The response is sent by calling the `response-outparam.set` - * method, which allows execution to continue after the response has been - * sent. This enables both streaming to the response body, and performing other - * work. - * - * The implementor of this function must write a response to the - * `response-outparam` before returning, or else the caller will respond - * with an error on its behalf. - */ - export function handle(request: IncomingRequest, responseOut: ResponseOutparam): void; - export type IncomingRequest = import('wasi:http/types@0.2.6').IncomingRequest; - export type ResponseOutparam = import('wasi:http/types@0.2.6').ResponseOutparam; -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-types.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-types.d.ts deleted file mode 100644 index e37be220..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-http-types.d.ts +++ /dev/null @@ -1,764 +0,0 @@ -/// -/// -/// -/// -declare module 'wasi:http/types@0.2.6' { - /** - * Attempts to extract a http-related `error` from the wasi:io `error` - * provided. - * - * Stream operations which return - * `wasi:io/stream/stream-error::last-operation-failed` have a payload of - * type `wasi:io/error/error` with more information about the operation - * that failed. This payload can be passed through to this function to see - * if there's http-related information about the error to return. - * - * Note that this function is fallible because not all io-errors are - * http-related errors. - */ - export function httpErrorCode(err: IoError): ErrorCode | undefined; - export type Duration = import('wasi:clocks/monotonic-clock@0.2.6').Duration; - export type InputStream = import('wasi:io/streams@0.2.6').InputStream; - export type OutputStream = import('wasi:io/streams@0.2.6').OutputStream; - export type IoError = import('wasi:io/error@0.2.6').Error; - export type Pollable = import('wasi:io/poll@0.2.6').Pollable; - /** - * This type corresponds to HTTP standard Methods. - */ - export type Method = MethodGet | MethodHead | MethodPost | MethodPut | MethodDelete | MethodConnect | MethodOptions | MethodTrace | MethodPatch | MethodOther; - export interface MethodGet { - tag: 'get', - } - export interface MethodHead { - tag: 'head', - } - export interface MethodPost { - tag: 'post', - } - export interface MethodPut { - tag: 'put', - } - export interface MethodDelete { - tag: 'delete', - } - export interface MethodConnect { - tag: 'connect', - } - export interface MethodOptions { - tag: 'options', - } - export interface MethodTrace { - tag: 'trace', - } - export interface MethodPatch { - tag: 'patch', - } - export interface MethodOther { - tag: 'other', - val: string, - } - /** - * This type corresponds to HTTP standard Related Schemes. - */ - export type Scheme = SchemeHttp | SchemeHttps | SchemeOther; - export interface SchemeHttp { - tag: 'HTTP', - } - export interface SchemeHttps { - tag: 'HTTPS', - } - export interface SchemeOther { - tag: 'other', - val: string, - } - /** - * Defines the case payload type for `DNS-error` above: - */ - export interface DnsErrorPayload { - rcode?: string, - infoCode?: number, - } - /** - * Defines the case payload type for `TLS-alert-received` above: - */ - export interface TlsAlertReceivedPayload { - alertId?: number, - alertMessage?: string, - } - /** - * Defines the case payload type for `HTTP-response-{header,trailer}-size` above: - */ - export interface FieldSizePayload { - fieldName?: string, - fieldSize?: number, - } - /** - * These cases are inspired by the IANA HTTP Proxy Error Types: - * - */ - export type ErrorCode = ErrorCodeDnsTimeout | ErrorCodeDnsError | ErrorCodeDestinationNotFound | ErrorCodeDestinationUnavailable | ErrorCodeDestinationIpProhibited | ErrorCodeDestinationIpUnroutable | ErrorCodeConnectionRefused | ErrorCodeConnectionTerminated | ErrorCodeConnectionTimeout | ErrorCodeConnectionReadTimeout | ErrorCodeConnectionWriteTimeout | ErrorCodeConnectionLimitReached | ErrorCodeTlsProtocolError | ErrorCodeTlsCertificateError | ErrorCodeTlsAlertReceived | ErrorCodeHttpRequestDenied | ErrorCodeHttpRequestLengthRequired | ErrorCodeHttpRequestBodySize | ErrorCodeHttpRequestMethodInvalid | ErrorCodeHttpRequestUriInvalid | ErrorCodeHttpRequestUriTooLong | ErrorCodeHttpRequestHeaderSectionSize | ErrorCodeHttpRequestHeaderSize | ErrorCodeHttpRequestTrailerSectionSize | ErrorCodeHttpRequestTrailerSize | ErrorCodeHttpResponseIncomplete | ErrorCodeHttpResponseHeaderSectionSize | ErrorCodeHttpResponseHeaderSize | ErrorCodeHttpResponseBodySize | ErrorCodeHttpResponseTrailerSectionSize | ErrorCodeHttpResponseTrailerSize | ErrorCodeHttpResponseTransferCoding | ErrorCodeHttpResponseContentCoding | ErrorCodeHttpResponseTimeout | ErrorCodeHttpUpgradeFailed | ErrorCodeHttpProtocolError | ErrorCodeLoopDetected | ErrorCodeConfigurationError | ErrorCodeInternalError; - export interface ErrorCodeDnsTimeout { - tag: 'DNS-timeout', - } - export interface ErrorCodeDnsError { - tag: 'DNS-error', - val: DnsErrorPayload, - } - export interface ErrorCodeDestinationNotFound { - tag: 'destination-not-found', - } - export interface ErrorCodeDestinationUnavailable { - tag: 'destination-unavailable', - } - export interface ErrorCodeDestinationIpProhibited { - tag: 'destination-IP-prohibited', - } - export interface ErrorCodeDestinationIpUnroutable { - tag: 'destination-IP-unroutable', - } - export interface ErrorCodeConnectionRefused { - tag: 'connection-refused', - } - export interface ErrorCodeConnectionTerminated { - tag: 'connection-terminated', - } - export interface ErrorCodeConnectionTimeout { - tag: 'connection-timeout', - } - export interface ErrorCodeConnectionReadTimeout { - tag: 'connection-read-timeout', - } - export interface ErrorCodeConnectionWriteTimeout { - tag: 'connection-write-timeout', - } - export interface ErrorCodeConnectionLimitReached { - tag: 'connection-limit-reached', - } - export interface ErrorCodeTlsProtocolError { - tag: 'TLS-protocol-error', - } - export interface ErrorCodeTlsCertificateError { - tag: 'TLS-certificate-error', - } - export interface ErrorCodeTlsAlertReceived { - tag: 'TLS-alert-received', - val: TlsAlertReceivedPayload, - } - export interface ErrorCodeHttpRequestDenied { - tag: 'HTTP-request-denied', - } - export interface ErrorCodeHttpRequestLengthRequired { - tag: 'HTTP-request-length-required', - } - export interface ErrorCodeHttpRequestBodySize { - tag: 'HTTP-request-body-size', - val: bigint | undefined, - } - export interface ErrorCodeHttpRequestMethodInvalid { - tag: 'HTTP-request-method-invalid', - } - export interface ErrorCodeHttpRequestUriInvalid { - tag: 'HTTP-request-URI-invalid', - } - export interface ErrorCodeHttpRequestUriTooLong { - tag: 'HTTP-request-URI-too-long', - } - export interface ErrorCodeHttpRequestHeaderSectionSize { - tag: 'HTTP-request-header-section-size', - val: number | undefined, - } - export interface ErrorCodeHttpRequestHeaderSize { - tag: 'HTTP-request-header-size', - val: FieldSizePayload | undefined, - } - export interface ErrorCodeHttpRequestTrailerSectionSize { - tag: 'HTTP-request-trailer-section-size', - val: number | undefined, - } - export interface ErrorCodeHttpRequestTrailerSize { - tag: 'HTTP-request-trailer-size', - val: FieldSizePayload, - } - export interface ErrorCodeHttpResponseIncomplete { - tag: 'HTTP-response-incomplete', - } - export interface ErrorCodeHttpResponseHeaderSectionSize { - tag: 'HTTP-response-header-section-size', - val: number | undefined, - } - export interface ErrorCodeHttpResponseHeaderSize { - tag: 'HTTP-response-header-size', - val: FieldSizePayload, - } - export interface ErrorCodeHttpResponseBodySize { - tag: 'HTTP-response-body-size', - val: bigint | undefined, - } - export interface ErrorCodeHttpResponseTrailerSectionSize { - tag: 'HTTP-response-trailer-section-size', - val: number | undefined, - } - export interface ErrorCodeHttpResponseTrailerSize { - tag: 'HTTP-response-trailer-size', - val: FieldSizePayload, - } - export interface ErrorCodeHttpResponseTransferCoding { - tag: 'HTTP-response-transfer-coding', - val: string | undefined, - } - export interface ErrorCodeHttpResponseContentCoding { - tag: 'HTTP-response-content-coding', - val: string | undefined, - } - export interface ErrorCodeHttpResponseTimeout { - tag: 'HTTP-response-timeout', - } - export interface ErrorCodeHttpUpgradeFailed { - tag: 'HTTP-upgrade-failed', - } - export interface ErrorCodeHttpProtocolError { - tag: 'HTTP-protocol-error', - } - export interface ErrorCodeLoopDetected { - tag: 'loop-detected', - } - export interface ErrorCodeConfigurationError { - tag: 'configuration-error', - } - /** - * This is a catch-all error for anything that doesn't fit cleanly into a - * more specific case. It also includes an optional string for an - * unstructured description of the error. Users should not depend on the - * string for diagnosing errors, as it's not required to be consistent - * between implementations. - */ - export interface ErrorCodeInternalError { - tag: 'internal-error', - val: string | undefined, - } - /** - * This type enumerates the different kinds of errors that may occur when - * setting or appending to a `fields` resource. - */ - export type HeaderError = HeaderErrorInvalidSyntax | HeaderErrorForbidden | HeaderErrorImmutable; - /** - * This error indicates that a `field-name` or `field-value` was - * syntactically invalid when used with an operation that sets headers in a - * `fields`. - */ - export interface HeaderErrorInvalidSyntax { - tag: 'invalid-syntax', - } - /** - * This error indicates that a forbidden `field-name` was used when trying - * to set a header in a `fields`. - */ - export interface HeaderErrorForbidden { - tag: 'forbidden', - } - /** - * This error indicates that the operation on the `fields` was not - * permitted because the fields are immutable. - */ - export interface HeaderErrorImmutable { - tag: 'immutable', - } - /** - * Field keys are always strings. - * - * Field keys should always be treated as case insensitive by the `fields` - * resource for the purposes of equality checking. - * - * # Deprecation - * - * This type has been deprecated in favor of the `field-name` type. - */ - export type FieldKey = string; - /** - * Field names are always strings. - * - * Field names should always be treated as case insensitive by the `fields` - * resource for the purposes of equality checking. - */ - export type FieldName = FieldKey; - /** - * Field values should always be ASCII strings. However, in - * reality, HTTP implementations often have to interpret malformed values, - * so they are provided as a list of bytes. - */ - export type FieldValue = Uint8Array; - /** - * Headers is an alias for Fields. - */ - export type Headers = Fields; - /** - * Trailers is an alias for Fields. - */ - export type Trailers = Fields; - /** - * This type corresponds to the HTTP standard Status Code. - */ - export type StatusCode = number; - export type Result = { tag: 'ok', val: T } | { tag: 'err', val: E }; - - export class Fields implements Disposable { - /** - * Construct an empty HTTP Fields. - * - * The resulting `fields` is mutable. - */ - constructor() - /** - * Construct an HTTP Fields. - * - * The resulting `fields` is mutable. - * - * The list represents each name-value pair in the Fields. Names - * which have multiple values are represented by multiple entries in this - * list with the same name. - * - * The tuple is a pair of the field name, represented as a string, and - * Value, represented as a list of bytes. - * - * An error result will be returned if any `field-name` or `field-value` is - * syntactically invalid, or if a field is forbidden. - */ - static fromList(entries: Array<[FieldName, FieldValue]>): Fields; - /** - * Get all of the values corresponding to a name. If the name is not present - * in this `fields` or is syntactically invalid, an empty list is returned. - * However, if the name is present but empty, this is represented by a list - * with one or more empty field-values present. - */ - get(name: FieldName): Array; - /** - * Returns `true` when the name is present in this `fields`. If the name is - * syntactically invalid, `false` is returned. - */ - has(name: FieldName): boolean; - /** - * Set all of the values for a name. Clears any existing values for that - * name, if they have been set. - * - * Fails with `header-error.immutable` if the `fields` are immutable. - * - * Fails with `header-error.invalid-syntax` if the `field-name` or any of - * the `field-value`s are syntactically invalid. - */ - set(name: FieldName, value: Array): void; - /** - * Delete all values for a name. Does nothing if no values for the name - * exist. - * - * Fails with `header-error.immutable` if the `fields` are immutable. - * - * Fails with `header-error.invalid-syntax` if the `field-name` is - * syntactically invalid. - */ - 'delete'(name: FieldName): void; - /** - * Append a value for a name. Does not change or delete any existing - * values for that name. - * - * Fails with `header-error.immutable` if the `fields` are immutable. - * - * Fails with `header-error.invalid-syntax` if the `field-name` or - * `field-value` are syntactically invalid. - */ - append(name: FieldName, value: FieldValue): void; - /** - * Retrieve the full set of names and values in the Fields. Like the - * constructor, the list represents each name-value pair. - * - * The outer list represents each name-value pair in the Fields. Names - * which have multiple values are represented by multiple entries in this - * list with the same name. - * - * The names and values are always returned in the original casing and in - * the order in which they will be serialized for transport. - */ - entries(): Array<[FieldName, FieldValue]>; - /** - * Make a deep copy of the Fields. Equivalent in behavior to calling the - * `fields` constructor on the return value of `entries`. The resulting - * `fields` is mutable. - */ - clone(): Fields; - [Symbol.dispose](): void; - } - - export class FutureIncomingResponse implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns a pollable which becomes ready when either the Response has - * been received, or an error has occurred. When this pollable is ready, - * the `get` method will return `some`. - */ - subscribe(): Pollable; - /** - * Returns the incoming HTTP Response, or an error, once one is ready. - * - * The outer `option` represents future readiness. Users can wait on this - * `option` to become `some` using the `subscribe` method. - * - * The outer `result` is used to retrieve the response or error at most - * once. It will be success on the first call in which the outer option - * is `some`, and error on subsequent calls. - * - * The inner `result` represents that either the incoming HTTP Response - * status and headers have received successfully, or that an error - * occurred. Errors may also occur while consuming the response body, - * but those will be reported by the `incoming-body` and its - * `output-stream` child. - */ - get(): Result, void> | undefined; - [Symbol.dispose](): void; - } - - export class FutureTrailers implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns a pollable which becomes ready when either the trailers have - * been received, or an error has occurred. When this pollable is ready, - * the `get` method will return `some`. - */ - subscribe(): Pollable; - /** - * Returns the contents of the trailers, or an error which occurred, - * once the future is ready. - * - * The outer `option` represents future readiness. Users can wait on this - * `option` to become `some` using the `subscribe` method. - * - * The outer `result` is used to retrieve the trailers or error at most - * once. It will be success on the first call in which the outer option - * is `some`, and error on subsequent calls. - * - * The inner `result` represents that either the HTTP Request or Response - * body, as well as any trailers, were received successfully, or that an - * error occurred receiving them. The optional `trailers` indicates whether - * or not trailers were present in the body. - * - * When some `trailers` are returned by this method, the `trailers` - * resource is immutable, and a child. Use of the `set`, `append`, or - * `delete` methods will return an error, and the resource must be - * dropped before the parent `future-trailers` is dropped. - */ - get(): Result, void> | undefined; - [Symbol.dispose](): void; - } - - export class IncomingBody implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns the contents of the body, as a stream of bytes. - * - * Returns success on first call: the stream representing the contents - * can be retrieved at most once. Subsequent calls will return error. - * - * The returned `input-stream` resource is a child: it must be dropped - * before the parent `incoming-body` is dropped, or consumed by - * `incoming-body.finish`. - * - * This invariant ensures that the implementation can determine whether - * the user is consuming the contents of the body, waiting on the - * `future-trailers` to be ready, or neither. This allows for network - * backpressure is to be applied when the user is consuming the body, - * and for that backpressure to not inhibit delivery of the trailers if - * the user does not read the entire body. - */ - stream(): InputStream; - /** - * Takes ownership of `incoming-body`, and returns a `future-trailers`. - * This function will trap if the `input-stream` child is still alive. - */ - static finish(this_: IncomingBody): FutureTrailers; - [Symbol.dispose](): void; - } - - export class IncomingRequest implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns the method of the incoming request. - */ - method(): Method; - /** - * Returns the path with query parameters from the request, as a string. - */ - pathWithQuery(): string | undefined; - /** - * Returns the protocol scheme from the request. - */ - scheme(): Scheme | undefined; - /** - * Returns the authority of the Request's target URI, if present. - */ - authority(): string | undefined; - /** - * Get the `headers` associated with the request. - * - * The returned `headers` resource is immutable: `set`, `append`, and - * `delete` operations will fail with `header-error.immutable`. - * - * The `headers` returned are a child resource: it must be dropped before - * the parent `incoming-request` is dropped. Dropping this - * `incoming-request` before all children are dropped will trap. - */ - headers(): Headers; - /** - * Gives the `incoming-body` associated with this request. Will only - * return success at most once, and subsequent calls will return error. - */ - consume(): IncomingBody; - [Symbol.dispose](): void; - } - - export class IncomingResponse implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns the status code from the incoming response. - */ - status(): StatusCode; - /** - * Returns the headers from the incoming response. - * - * The returned `headers` resource is immutable: `set`, `append`, and - * `delete` operations will fail with `header-error.immutable`. - * - * This headers resource is a child: it must be dropped before the parent - * `incoming-response` is dropped. - */ - headers(): Headers; - /** - * Returns the incoming body. May be called at most once. Returns error - * if called additional times. - */ - consume(): IncomingBody; - [Symbol.dispose](): void; - } - - export class OutgoingBody implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Returns a stream for writing the body contents. - * - * The returned `output-stream` is a child resource: it must be dropped - * before the parent `outgoing-body` resource is dropped (or finished), - * otherwise the `outgoing-body` drop or `finish` will trap. - * - * Returns success on the first call: the `output-stream` resource for - * this `outgoing-body` may be retrieved at most once. Subsequent calls - * will return error. - */ - write(): OutputStream; - /** - * Finalize an outgoing body, optionally providing trailers. This must be - * called to signal that the response is complete. If the `outgoing-body` - * is dropped without calling `outgoing-body.finalize`, the implementation - * should treat the body as corrupted. - * - * Fails if the body's `outgoing-request` or `outgoing-response` was - * constructed with a Content-Length header, and the contents written - * to the body (via `write`) does not match the value given in the - * Content-Length. - */ - static finish(this_: OutgoingBody, trailers: Trailers | undefined): void; - [Symbol.dispose](): void; - } - - export class OutgoingRequest implements Disposable { - /** - * Construct a new `outgoing-request` with a default `method` of `GET`, and - * `none` values for `path-with-query`, `scheme`, and `authority`. - * - * * `headers` is the HTTP Headers for the Request. - * - * It is possible to construct, or manipulate with the accessor functions - * below, an `outgoing-request` with an invalid combination of `scheme` - * and `authority`, or `headers` which are not permitted to be sent. - * It is the obligation of the `outgoing-handler.handle` implementation - * to reject invalid constructions of `outgoing-request`. - */ - constructor(headers: Headers) - /** - * Returns the resource corresponding to the outgoing Body for this - * Request. - * - * Returns success on the first call: the `outgoing-body` resource for - * this `outgoing-request` can be retrieved at most once. Subsequent - * calls will return error. - */ - body(): OutgoingBody; - /** - * Get the Method for the Request. - */ - method(): Method; - /** - * Set the Method for the Request. Fails if the string present in a - * `method.other` argument is not a syntactically valid method. - */ - setMethod(method: Method): void; - /** - * Get the combination of the HTTP Path and Query for the Request. - * When `none`, this represents an empty Path and empty Query. - */ - pathWithQuery(): string | undefined; - /** - * Set the combination of the HTTP Path and Query for the Request. - * When `none`, this represents an empty Path and empty Query. Fails is the - * string given is not a syntactically valid path and query uri component. - */ - setPathWithQuery(pathWithQuery: string | undefined): void; - /** - * Get the HTTP Related Scheme for the Request. When `none`, the - * implementation may choose an appropriate default scheme. - */ - scheme(): Scheme | undefined; - /** - * Set the HTTP Related Scheme for the Request. When `none`, the - * implementation may choose an appropriate default scheme. Fails if the - * string given is not a syntactically valid uri scheme. - */ - setScheme(scheme: Scheme | undefined): void; - /** - * Get the authority of the Request's target URI. A value of `none` may be used - * with Related Schemes which do not require an authority. The HTTP and - * HTTPS schemes always require an authority. - */ - authority(): string | undefined; - /** - * Set the authority of the Request's target URI. A value of `none` may be used - * with Related Schemes which do not require an authority. The HTTP and - * HTTPS schemes always require an authority. Fails if the string given is - * not a syntactically valid URI authority. - */ - setAuthority(authority: string | undefined): void; - /** - * Get the headers associated with the Request. - * - * The returned `headers` resource is immutable: `set`, `append`, and - * `delete` operations will fail with `header-error.immutable`. - * - * This headers resource is a child: it must be dropped before the parent - * `outgoing-request` is dropped, or its ownership is transferred to - * another component by e.g. `outgoing-handler.handle`. - */ - headers(): Headers; - [Symbol.dispose](): void; - } - - export class OutgoingResponse implements Disposable { - /** - * Construct an `outgoing-response`, with a default `status-code` of `200`. - * If a different `status-code` is needed, it must be set via the - * `set-status-code` method. - * - * * `headers` is the HTTP Headers for the Response. - */ - constructor(headers: Headers) - /** - * Get the HTTP Status Code for the Response. - */ - statusCode(): StatusCode; - /** - * Set the HTTP Status Code for the Response. Fails if the status-code - * given is not a valid http status code. - */ - setStatusCode(statusCode: StatusCode): void; - /** - * Get the headers associated with the Request. - * - * The returned `headers` resource is immutable: `set`, `append`, and - * `delete` operations will fail with `header-error.immutable`. - * - * This headers resource is a child: it must be dropped before the parent - * `outgoing-request` is dropped, or its ownership is transferred to - * another component by e.g. `outgoing-handler.handle`. - */ - headers(): Headers; - /** - * Returns the resource corresponding to the outgoing Body for this Response. - * - * Returns success on the first call: the `outgoing-body` resource for - * this `outgoing-response` can be retrieved at most once. Subsequent - * calls will return error. - */ - body(): OutgoingBody; - [Symbol.dispose](): void; - } - - export class RequestOptions implements Disposable { - /** - * Construct a default `request-options` value. - */ - constructor() - /** - * The timeout for the initial connect to the HTTP Server. - */ - connectTimeout(): Duration | undefined; - /** - * Set the timeout for the initial connect to the HTTP Server. An error - * return value indicates that this timeout is not supported. - */ - setConnectTimeout(duration: Duration | undefined): void; - /** - * The timeout for receiving the first byte of the Response body. - */ - firstByteTimeout(): Duration | undefined; - /** - * Set the timeout for receiving the first byte of the Response body. An - * error return value indicates that this timeout is not supported. - */ - setFirstByteTimeout(duration: Duration | undefined): void; - /** - * The timeout for receiving subsequent chunks of bytes in the Response - * body stream. - */ - betweenBytesTimeout(): Duration | undefined; - /** - * Set the timeout for receiving subsequent chunks of bytes in the Response - * body stream. An error return value indicates that this timeout is not - * supported. - */ - setBetweenBytesTimeout(duration: Duration | undefined): void; - [Symbol.dispose](): void; - } - - export class ResponseOutparam implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - /** - * Set the value of the `response-outparam` to either send a response, - * or indicate an error. - * - * This method consumes the `response-outparam` to ensure that it is - * called at most once. If it is never called, the implementation - * will respond with an error. - * - * The user may provide an `error` to `response` to allow the - * implementation determine how to respond with an HTTP error response. - */ - static set(param: ResponseOutparam, response: Result): void; - [Symbol.dispose](): void; - } -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-error.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-error.d.ts deleted file mode 100644 index 0ad02f55..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-error.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare module 'wasi:io/error@0.2.6' { - - export class Error implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - toDebugString(): string; - [Symbol.dispose](): void; - } -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-poll.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-poll.d.ts deleted file mode 100644 index 44490bc5..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-poll.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -declare module 'wasi:io/poll@0.2.6' { - export function poll(in_: Array): Uint32Array; - - export class Pollable implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - ready(): boolean; - block(): void; - [Symbol.dispose](): void; - } -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-streams.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-streams.d.ts deleted file mode 100644 index 0b64c491..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasi-io-streams.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -/// -/// -declare module 'wasi:io/streams@0.2.6' { - export type Error = import('wasi:io/error@0.2.6').Error; - export type Pollable = import('wasi:io/poll@0.2.6').Pollable; - export type StreamError = StreamErrorLastOperationFailed | StreamErrorClosed; - export interface StreamErrorLastOperationFailed { - tag: 'last-operation-failed', - val: Error, - } - export interface StreamErrorClosed { - tag: 'closed', - } - - export class InputStream implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - read(len: bigint): Uint8Array; - blockingRead(len: bigint): Uint8Array; - skip(len: bigint): bigint; - blockingSkip(len: bigint): bigint; - subscribe(): Pollable; - [Symbol.dispose](): void; - } - - export class OutputStream implements Disposable { - /** - * This type does not have a public constructor. - */ - private constructor(); - checkWrite(): bigint; - write(contents: Uint8Array): void; - blockingWriteAndFlush(contents: Uint8Array): void; - flush(): void; - blockingFlush(): void; - subscribe(): Pollable; - writeZeroes(len: bigint): void; - blockingWriteZeroesAndFlush(len: bigint): void; - splice(src: InputStream, len: bigint): bigint; - blockingSplice(src: InputStream, len: bigint): bigint; - [Symbol.dispose](): void; - } -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-consumer.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-consumer.d.ts deleted file mode 100644 index e8f3f80f..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-consumer.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// -declare module 'wasmcloud:messaging/consumer@0.2.0' { - /** - * Perform a request operation on a subject - */ - export function request(subject: string, body: Uint8Array, timeoutMs: number): BrokerMessage; - /** - * Publish a message to a subject without awaiting a response - */ - export function publish(msg: BrokerMessage): void; - export type BrokerMessage = import('wasmcloud:messaging/types@0.2.0').BrokerMessage; -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-types.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-types.d.ts deleted file mode 100644 index 720f5fb0..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/interfaces/wasmcloud-messaging-types.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module 'wasmcloud:messaging/types@0.2.0' { - /** - * A message sent to or received from a broker - */ - export interface BrokerMessage { - subject: string, - body: Uint8Array, - replyTo?: string, - } -} diff --git a/templates/http-api-with-distributed-workloads/http-api/generated/types/wit.d.ts b/templates/http-api-with-distributed-workloads/http-api/generated/types/wit.d.ts deleted file mode 100644 index ed47fbb8..00000000 --- a/templates/http-api-with-distributed-workloads/http-api/generated/types/wit.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// -/// -/// -/// -/// -/// -/// -/// -declare module 'wasmcloud:templates/typescript-http-api-with-distributed-workloads-api@0.1.0' { - export type * as WasiClocksMonotonicClock026 from 'wasi:clocks/monotonic-clock@0.2.6'; // import wasi:clocks/monotonic-clock@0.2.6 - export type * as WasiHttpTypes026 from 'wasi:http/types@0.2.6'; // import wasi:http/types@0.2.6 - export type * as WasiIoError026 from 'wasi:io/error@0.2.6'; // import wasi:io/error@0.2.6 - export type * as WasiIoPoll026 from 'wasi:io/poll@0.2.6'; // import wasi:io/poll@0.2.6 - export type * as WasiIoStreams026 from 'wasi:io/streams@0.2.6'; // import wasi:io/streams@0.2.6 - export type * as WasmcloudMessagingConsumer020 from 'wasmcloud:messaging/consumer@0.2.0'; // import wasmcloud:messaging/consumer@0.2.0 - export type * as WasmcloudMessagingTypes020 from 'wasmcloud:messaging/types@0.2.0'; // import wasmcloud:messaging/types@0.2.0 - export * as incomingHandler from 'wasi:http/incoming-handler@0.2.6'; // export wasi:http/incoming-handler@0.2.6 -} diff --git a/templates/http-api-with-distributed-workloads/http-api/src/component.ts b/templates/http-api-with-distributed-workloads/http-api/src/component.ts index 66c21c01..3e389e5b 100644 --- a/templates/http-api-with-distributed-workloads/http-api/src/component.ts +++ b/templates/http-api-with-distributed-workloads/http-api/src/component.ts @@ -60,10 +60,11 @@ app.get('/', (c) => { /** * POST /task * - * Body: { "worker": "task-worker", "payload": "Hello World" } + * Body: { "worker": "leet", "payload": "Hello World" } * * Publishes a request to "tasks.{worker}" via wasmcloud:messaging and - * returns the worker's reply as plain text. + * returns the worker's reply as plain text. The worker name selects the + * subject, routing to the worker subscribed to it (see .wash/config.yaml). */ app.post('/task', async (c) => { let body: TaskRequest; @@ -77,7 +78,7 @@ app.post('/task', async (c) => { return c.text('Missing required field: payload', 400); } - const subject = `tasks.${body.worker ?? 'default'}`; + const subject = `tasks.${body.worker ?? 'leet'}`; const msgBody = encoder.encode(body.payload); try { diff --git a/templates/http-api-with-distributed-workloads/http-api/src/index.html b/templates/http-api-with-distributed-workloads/http-api/src/index.html index 4ea67375..0a6f273e 100644 --- a/templates/http-api-with-distributed-workloads/http-api/src/index.html +++ b/templates/http-api-with-distributed-workloads/http-api/src/index.html @@ -3,67 +3,189 @@ - Task API + Task API Β· wasmCloud -

Task API

-
- - +
+
+

Task API

+
+ Built with + +
+
+ +
+

Architecture

+
+
Browser
+
β”‚ POST /task
+
β–Ό
+
http-api :8000
+
β”‚ publish tasks.{worker}
+
β–Ό
+
Message Broker in-memory Β· NATS
+
β–Ό
+
+
+ tasks.leet +
task-leet
+
+
+ tasks.reverse +
task-reverse
+
+
+
+

The HTTP API publishes to tasks.{worker}; the broker routes to the worker subscribed to that subject, which replies back to the caller.

+
+ +
+ + + + + + - - + + - - +
+
-
+ +