Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V <air@live.ca> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> Co-authored-by: Max Anderson <max.a.anderson95@gmail.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
57 lines
1.9 KiB
TypeScript
57 lines
1.9 KiB
TypeScript
export * as Database from "./database"
|
|
|
|
import { EffectDrizzleSqlite } from "@opencode-ai/effect-drizzle-sqlite"
|
|
import { layer as sqliteLayer } from "#sqlite"
|
|
import { Context, Effect, Layer } from "effect"
|
|
import { Global } from "../global"
|
|
import { Flag } from "../flag/flag"
|
|
import { isAbsolute, join } from "path"
|
|
import { DatabaseMigration } from "./migration"
|
|
import { InstallationChannel } from "../installation/version"
|
|
import { makeGlobalNode } from "../effect/app-node"
|
|
|
|
const makeDatabase = EffectDrizzleSqlite.makeWithDefaults()
|
|
type DatabaseShape = Effect.Success<typeof makeDatabase>
|
|
|
|
export interface Interface {
|
|
db: DatabaseShape
|
|
}
|
|
|
|
export class Service extends Context.Service<Service, Interface>()("@opencode/v2/storage/Database") {}
|
|
|
|
const layer = Layer.effect(
|
|
Service,
|
|
Effect.gen(function* () {
|
|
const db = yield* makeDatabase
|
|
|
|
yield* db.run("PRAGMA journal_mode = WAL")
|
|
yield* db.run("PRAGMA synchronous = NORMAL")
|
|
yield* db.run("PRAGMA busy_timeout = 5000")
|
|
yield* db.run("PRAGMA cache_size = -64000")
|
|
yield* db.run("PRAGMA foreign_keys = ON")
|
|
yield* db.run("PRAGMA wal_checkpoint(PASSIVE)")
|
|
yield* DatabaseMigration.apply(db)
|
|
|
|
return { db }
|
|
}).pipe(Effect.orDie),
|
|
)
|
|
|
|
export function layerFromPath(filename: string) {
|
|
return layer.pipe(Layer.provide(sqliteLayer({ filename })))
|
|
}
|
|
|
|
export function path() {
|
|
if (Flag.OPENCODE_DB) {
|
|
if (Flag.OPENCODE_DB === ":memory:" || isAbsolute(Flag.OPENCODE_DB)) return Flag.OPENCODE_DB
|
|
return join(Global.Path.data, Flag.OPENCODE_DB)
|
|
}
|
|
if (
|
|
["latest", "beta", "prod"].includes(InstallationChannel) ||
|
|
process.env.OPENCODE_DISABLE_CHANNEL_DB === "1" ||
|
|
process.env.OPENCODE_DISABLE_CHANNEL_DB === "true"
|
|
)
|
|
return join(Global.Path.data, "opencode.db")
|
|
return join(Global.Path.data, `opencode-${InstallationChannel.replace(/[^a-zA-Z0-9._-]/g, "-")}.db`)
|
|
}
|
|
|
|
export const node = makeGlobalNode({ service: Service, layer: layerFromPath(path()), deps: [] })
|