mirror of
https://github.com/VibedByKaKi/t3-code-android-nightly.git
synced 2026-10-10 12:21:16 +02:00
67 lines
2 KiB
TypeScript
67 lines
2 KiB
TypeScript
import * as Alchemy from "alchemy";
|
|
import * as Cloudflare from "alchemy/Cloudflare";
|
|
import { Config } from "effect";
|
|
import * as Effect from "effect/Effect";
|
|
import type { Counter as CounterClass } from "./src/worker.ts";
|
|
|
|
export const DB = Cloudflare.D1.Database("DB");
|
|
|
|
export const Bucket = Cloudflare.R2.Bucket("Bucket", { forceDestroy: true });
|
|
|
|
// Queue producer + consumer wiring (both sides exercised by the same worker).
|
|
// The Worker sends a message via `env.QUEUE.send(...)` from POST /queue/send,
|
|
// then receives and persists it via its `queue(batch)` handler — end-to-end
|
|
// regression guard for the Queue, QueueWrite, and Consumer resources.
|
|
export const Queue = Cloudflare.Queues.Queue("Queue");
|
|
|
|
export const Counter = Cloudflare.DurableObject<CounterClass>("Counter", {
|
|
className: "Counter",
|
|
});
|
|
|
|
export type WorkerEnv = Cloudflare.InferEnv<typeof Worker>;
|
|
|
|
export const Worker = Cloudflare.Worker("Worker", {
|
|
main: "./src/worker.ts",
|
|
assets: {
|
|
directory: "./public",
|
|
},
|
|
env: {
|
|
// Self-contained default so the example deploys without external secrets;
|
|
// the integ test asserts this value round-trips through env.API_KEY.
|
|
API_KEY: Config.Redacted("SOME_API_KEY").pipe(
|
|
Config.withDefault("SOME_API_KEY"),
|
|
),
|
|
DB,
|
|
Bucket,
|
|
Queue,
|
|
Counter,
|
|
},
|
|
});
|
|
|
|
export default Alchemy.Stack(
|
|
"CloudflareWorker",
|
|
{
|
|
providers: Cloudflare.providers(),
|
|
state: Cloudflare.state(),
|
|
},
|
|
Effect.gen(function* () {
|
|
const queue = yield* Queue;
|
|
const worker = yield* Worker;
|
|
// create a random resource to test redacted storage
|
|
yield* Alchemy.Random("Random");
|
|
|
|
// Register the same worker script as a consumer of Queue. The worker's
|
|
// `queue(batch)` handler (see src/worker.ts) receives each message batch.
|
|
yield* Cloudflare.Queues.Consumer("Consumer", {
|
|
queueId: queue.queueId,
|
|
scriptName: worker.workerName,
|
|
settings: {
|
|
batchSize: 10,
|
|
maxRetries: 3,
|
|
maxWaitTimeMs: 5000,
|
|
},
|
|
});
|
|
|
|
return { url: worker.url.as<string>() };
|
|
}),
|
|
);
|