t3-code-android-nightly/.repos/alchemy-effect/packages/alchemy/test/Stripe/fixtures/event-source-worker.ts
Julius Marminge 6f9cea00ae
chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 (#16170)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 13:22:30 -07:00

59 lines
2.1 KiB
TypeScript

import * as Cloudflare from "@/Cloudflare/index.ts";
import * as Stripe from "@/Stripe/index.ts";
import * as Effect from "effect/Effect";
import { HttpServerRequest } from "effect/http/HttpServerRequest";
import * as HttpServerResponse from "effect/http/HttpServerResponse";
export default class StripeEventSourceWorker extends Cloudflare.Worker<StripeEventSourceWorker>()(
"StripeEventSourceWorker",
{
main: import.meta.url,
},
Effect.gen(function* () {
const log = yield* Cloudflare.KV.Namespace("EventLog");
const kv = yield* Cloudflare.KV.ReadWriteNamespace(log);
const createCustomer = yield* Stripe.CreateCustomer();
yield* Stripe.consumeEvents(
"Events",
{ events: [Stripe.CustomerCreated] },
Effect.fn(function* (event) {
yield* kv.put(event.object.id, "1").pipe(Effect.orDie);
yield* kv.put("lastCustomerId", event.object.id).pipe(Effect.orDie);
}),
).pipe(Effect.orDie);
return {
fetch: Effect.gen(function* () {
const request = yield* HttpServerRequest;
if (request.url.startsWith("/last/")) {
const id = request.url.slice("/last/".length).split("?")[0];
const seen = yield* kv.get(id).pipe(Effect.orDie);
return yield* HttpServerResponse.json({
id: seen === "1" ? id : null,
});
}
if (request.url.startsWith("/last")) {
const id = yield* kv.get("lastCustomerId").pipe(Effect.orDie);
return yield* HttpServerResponse.json({ id: id ?? null });
}
if (request.method === "POST" && request.url.startsWith("/customers")) {
const customer = yield* createCustomer({
email: "event-source@example.com",
}).pipe(Effect.orDie);
return yield* HttpServerResponse.json(
{ id: customer.id },
{ status: 201 },
);
}
return HttpServerResponse.text("ok");
}),
};
}).pipe(
Effect.provide([
Cloudflare.KV.ReadWriteNamespaceBinding,
Stripe.CreateCustomerHttp,
Stripe.ConsumeEventsLive,
]),
),
) {}