39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import type { D1Database } from "@cloudflare/workers-types"
|
|
import { D1Client } from "@effect/sql-d1"
|
|
import { Context, Data, Effect, Layer } from "effect"
|
|
import { Miniflare } from "miniflare"
|
|
|
|
export class MiniflareError extends Data.TaggedError("MiniflareError")<{
|
|
cause: unknown
|
|
}> {}
|
|
|
|
export class D1Miniflare extends Context.Service<
|
|
D1Miniflare,
|
|
Miniflare
|
|
>()("test/D1Miniflare") {
|
|
static readonly layer = Layer.effect(this)(
|
|
Effect.acquireRelease(
|
|
Effect.try({
|
|
try: () =>
|
|
new Miniflare({
|
|
modules: true,
|
|
d1Databases: {
|
|
DB: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
},
|
|
script: ""
|
|
}),
|
|
catch: (cause) => new MiniflareError({ cause })
|
|
}),
|
|
(miniflare) => Effect.promise(() => miniflare.dispose())
|
|
)
|
|
)
|
|
|
|
static layerClient = Layer.unwrap(
|
|
Effect.gen(function*() {
|
|
const miniflare = yield* D1Miniflare
|
|
const db: D1Database = yield* Effect.tryPromise(() => miniflare.getD1Database("DB"))
|
|
return D1Client.layer({ db })
|
|
})
|
|
).pipe(Layer.provide(this.layer))
|
|
}
|