social bookmarking for atproto
1/*
2 * clippr: a social bookmarking service for the AT Protocol
3 * Copyright (c) 2025 clippr contributors.
4 * SPDX-License-Identifier: AGPL-3.0-only
5 */
6
7import { drizzle } from "drizzle-orm/libsql";
8import { Config } from "../config.js";
9import Logger from "../logger.js";
10
11const config = Config.getInstance().getConfig();
12const dbname = config.database.name;
13
14class DatabaseError extends Error {
15 constructor(message: string) {
16 super(message);
17 this.name = "DatabaseError";
18 }
19}
20
21export class Database {
22 private static instance: Database;
23 private readonly db;
24
25 private constructor() {
26 try {
27 this.db = drizzle({ connection: { url: `${dbname}` } });
28 } catch (e: unknown) {
29 if (e instanceof Error) {
30 throw new DatabaseError(e.message);
31 } else throw new DatabaseError("Unknown error");
32 }
33 }
34
35 static getInstance(): Database {
36 if (!Database.instance) {
37 try {
38 Database.instance = new Database();
39 } catch (e) {
40 Logger.error(e);
41 process.exit(1);
42 }
43 }
44 return Database.instance;
45 }
46
47 getDb() {
48 return this.db;
49 }
50}