examples/storefront Public
components: storefront-api: kind: worker description: >- The public HTTP API (wrangler.jsonc, Worker storefront-api). Shoppers browse the catalog, fill carts and check out; the merchant edits products and uploads their images with the admin token. Its OrdersService entrypoint is how the other Workers change orders: it is the only Worker with the database binding. A cron trigger expires unpaid orders every five minutes. Payments go through the payments Worker; this Worker has no Stripe key. owns: [src/**] talks_to: - { to: db, via: d1 } - { to: images, via: r2 } - { to: payments, via: rpc } - { to: order-events, via: queue } payments: kind: worker description: >- Worker storefront-payments (workers/payments), the only holder of the Stripe keys. Its PaymentsService entrypoint creates and cancels PaymentIntents for storefront-api; its fetch handler takes Stripe's webhooks and settles orders through OrdersService. owns: [workers/payments/**] talks_to: - { to: storefront-api, via: rpc } - { to: stripe, via: https } fulfilment: kind: worker description: >- Worker storefront-fulfilment (workers/fulfilment). Consumes order-events, sends each paid order to the warehouse's shipments API and records the shipment through OrdersService. Failed messages retry with backoff and end in order-events-dlq after six attempts. owns: [workers/fulfilment/**] talks_to: - { to: storefront-api, via: rpc } db: kind: d1 description: >- The storefront database: products, carts, orders and their lines. Every schema change is a numbered file in migrations/, applied with wrangler d1 migrations apply. binding: DB owns: [migrations/**] images: kind: r2-bucket description: >- Bucket storefront-images: product images under products/<product>/<hash>.<ext>. A key is never overwritten, so every image URL can be cached for a year. Public on its custom domain (IMAGES_URL), where browsers load the images; storefront-api only writes to it. binding: IMAGES order-events: kind: queue description: >- Queue order-events: order.paid and order.cancelled, sent by OrdersService when an order changes state. Consumed by fulfilment (queues.consumers in its wrangler.jsonc). At least once, so consumers dedupe by order id. binding: ORDER_EVENTS stripe: kind: external description: >- Stripe, through the stripe npm package, called only by the payments Worker. It creates a PaymentIntent per order; the shopper confirms it in the browser with the Payment Element, and Stripe reports the outcome to the payments Worker's webhook. package: stripe