Skip to content
Source
Sign inSign up
Open History to see the last commit

loader-stack.ts

56 lines1.7 KB

1/**
2 * The Git host with its pack hasher on dynamically loaded Workers (DESIGN
3 * §22.12): the same building-block assembly as `stack.ts`, with
4 * `HasherWorkerLoader` in place of the in-process hasher.
5 */
6import * as Cloudflare from "@alchemy.run/cloudflare";
7import {
8 BlobStoreR2,
9 GIT_WORKER_OPTIONS,
10 ApiHandlersLive,
11 ReposDurableObject,
12 RegistryDurableObject,
13} from "@alchemy.run/git";
14import { HasherWorkerLoader } from "@alchemy.run/git/Hasher";
15import * as Alchemy from "alchemy";
16import * as Effect from "effect/Effect";
17import * as HttpRouter from "effect/http/HttpRouter";
18import * as Layer from "effect/Layer";
19import { TestRoutes } from "./http.ts";
20import { TEST_SECRET, TestApi, TestAuthLive } from "./stack.ts";
21export { TEST_SECRET };
22​
23const GitObjects = Cloudflare.R2.Bucket("GitLoaderObjects", {
24 forceDestroy: true,
25});
26​
27const GitLive = TestRoutes.pipe(
28 Layer.provide(ApiHandlersLive),
29 Layer.provide(ReposDurableObject),
30 Layer.provide(RegistryDurableObject),
31 Layer.provide(HasherWorkerLoader()),
32 Layer.provide(BlobStoreR2(GitObjects)),
33);
34​
35export default class LoaderGitHost extends Cloudflare.Worker<LoaderGitHost>()(
36 "GitLoaderWorker",
37 {
38 main: import.meta.url,
39 ...GIT_WORKER_OPTIONS,
40 observability: { enabled: true },
41 },
42 Effect.gen(function* () {
43 const fetch = yield* HttpRouter.toHttpEffect(GitLive);
44 return { fetch };
45 }).pipe(Effect.provide(Cloudflare.R2.ReadWriteBucketBinding)),
46) {}
47​
48export const makeLoaderTestStack = (name: string) =>
49 Alchemy.Stack(
50 name,
51 { providers: Cloudflare.providers(), state: Cloudflare.state() },
52 Effect.gen(function* () {
53 const host = yield* LoaderGitHost;
54 return { url: host.url.as<string>() };
55 }),
56 );