From 5fa254331d71bcb2efb8a5f72b1ac837a41cd7cc Mon Sep 17 00:00:00 2001 From: Matt <1009003+tantaman@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:36:39 -0500 Subject: [PATCH] method to get db from db wrapper --- packages/ws-litefs/src/internal/LiteFSDB.ts | 20 +++++++++++++++++++ .../src/internal/PrimaryConnection.ts | 4 ++++ packages/ws-server/src/DB.ts | 12 +++++++++++ 3 files changed, 36 insertions(+) diff --git a/packages/ws-litefs/src/internal/LiteFSDB.ts b/packages/ws-litefs/src/internal/LiteFSDB.ts index 0f3a44a..db692a9 100644 --- a/packages/ws-litefs/src/internal/LiteFSDB.ts +++ b/packages/ws-litefs/src/internal/LiteFSDB.ts @@ -2,6 +2,7 @@ import { Change } from "@vlcn.io/ws-common"; import { IDB } from "@vlcn.io/ws-server"; import { PrimaryConnection } from "./PrimaryConnection.js"; import logger from "../logger.js"; +import type BetterSqlite3 from "better-sqlite3"; export class LiteFSDB implements IDB { readonly #proxied; @@ -28,6 +29,25 @@ export class LiteFSDB implements IDB { return this.#proxied.schemaVersion; } + getDB(): BetterSqlite3.Database { + throw new Error( + "get db is unsafe under litefs deployments as litefs requires write forwarding to the primary" + ); + } + + // read(sql: string, params: unknown[]): T[] { + // return this.#proxied.read(sql, params); + // } + + // async write(sql: string, params: unknown[]): Promise { + // if (!this.#primaryConnection.isPrimary()) { + // logger.info("Proxying write to primary"); + // await this.#primaryConnection.writeOnPrimary(this.#room, sql, params); + // } else { + // await this.#proxied.write(sql, params); + // } + // } + getLastSeen(site: Uint8Array): [bigint, number] { return this.#proxied.getLastSeen(site); } diff --git a/packages/ws-litefs/src/internal/PrimaryConnection.ts b/packages/ws-litefs/src/internal/PrimaryConnection.ts index 5fbf6c3..056d316 100644 --- a/packages/ws-litefs/src/internal/PrimaryConnection.ts +++ b/packages/ws-litefs/src/internal/PrimaryConnection.ts @@ -118,6 +118,10 @@ export class PrimaryConnection { }); } + writeOnPrimary(room: string, sql: string, params: unknown[]): Promise { + throw new Error("not implemented"); + } + applyChangesOnPrimary( room: string, changes: readonly Change[], diff --git a/packages/ws-server/src/DB.ts b/packages/ws-server/src/DB.ts index f35d0b4..5046501 100644 --- a/packages/ws-server/src/DB.ts +++ b/packages/ws-server/src/DB.ts @@ -1,4 +1,5 @@ import Database from "better-sqlite3"; +import type BetterSqlite3 from "better-sqlite3"; import { Config } from "./config.js"; import path from "node:path"; import fs from "node:fs"; @@ -13,6 +14,13 @@ export interface IDB { readonly schemaName: string; readonly schemaVersion: bigint; + /** + * This will work for single-node SQLite setups. + * Does not work under Turso. + * Will work for reads under LiteFS but not writes. + */ + getDB(): BetterSqlite3.Database; + getLastSeen(site: Uint8Array): [bigint, number]; applyChangesetAndSetLastSeen( changes: readonly Change[], @@ -208,6 +216,10 @@ export default class DB implements IDB { return this.#schemaVersion; } + getDB(): BetterSqlite3.Database { + return this.#db; + } + getLastSeen(site: Uint8Array): [bigint, number] { const result = this.#getLastSeenStmt.raw(true).get(site) as | [bigint, bigint]