From e81d782d19c14ab195f0b5d0647b75e059d4d161 Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Thu, 27 Oct 2022 16:33:34 +0100 Subject: [PATCH 1/6] Refactor configuration Replace ElectrifyOptions with a {ElectricConfig, ElectrifyOptions} params. --- README.md | 6 ++--- src/bridge/index.ts | 9 +++++--- src/drivers/absurd-sql/index.ts | 4 ++-- src/drivers/absurd-sql/mock.ts | 12 +++++----- src/drivers/absurd-sql/worker.ts | 18 ++++++++------- src/drivers/better-sqlite3/index.ts | 15 +++++++------ src/drivers/cordova-sqlite-storage/index.ts | 15 +++++++------ src/drivers/cordova-sqlite-storage/test.ts | 21 +++++++++--------- src/drivers/expo-sqlite/index.ts | 15 +++++++------ src/drivers/expo-sqlite/test.ts | 19 ++++++++-------- .../react-native-sqlite-storage/index.ts | 15 +++++++------ .../react-native-sqlite-storage/test.ts | 17 +++++++------- src/electric/index.ts | 4 ++-- src/satellite/config.ts | 11 +++++++--- src/satellite/index.ts | 4 ++-- src/satellite/registry.ts | 18 +++++++++------ test/drivers/better-sqlite3.test.ts | 22 +++++++++---------- test/satellite/integration.ts | 3 ++- test/satellite/registry.test.ts | 2 +- test/support/mock-worker.js | 2 +- 20 files changed, 127 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index 4a07d6e..fe43c60 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ SQLite.enablePromise(true) // Open a database connection and electrify it. SQLite.openDatabase('example.db') - .then(db => electrify(db)) + .then(db => electrify(db, { app: "my-app", env: "prod", migrations: [] })) .then(db => { // Use as normal, e.g.: db.transaction(tx => tx.executeSql('SELECT 1')) }) @@ -63,7 +63,7 @@ First create a `worker.js` file that imports and starts an ElectricWorker proces // worker.js import { ElectricWorker } from 'electric-sql/browser' -ElectricWorker.start(self) +ElectricWorker.start(self, { app: "my-app", env: "prod", migrations: [] }) ``` Then, in your main application: @@ -112,7 +112,7 @@ export default const App = () => { useEffect(() => { SQLite.openDatabase('example.db') - .then(db => electrify(db)) + .then(db => electrify(db, { app: "my-app", env: "prod" })) .then(db => setDb(db)) }, []) diff --git a/src/bridge/index.ts b/src/bridge/index.ts index 0a207d5..369bdf8 100644 --- a/src/bridge/index.ts +++ b/src/bridge/index.ts @@ -3,6 +3,7 @@ import { ElectrifyOptions } from '../electric/index' import { ChangeCallback, ChangeNotification } from '../notifiers/index' import { randomValue } from '../util/random' import { AnyFunction, DbName, StatementId } from '../util/types' +import { ElectricConfig } from '../satellite/config' declare global { interface Worker { @@ -176,14 +177,16 @@ export abstract class WorkerServer { SQL?: any worker: Worker - opts: ElectrifyOptions + config: ElectricConfig + opts?: ElectrifyOptions _dbs: { [key: DbName]: AnyWorkerThreadElectricDatabase } - constructor(worker: Worker, opts: ElectrifyOptions) { + constructor(worker: Worker, config: ElectricConfig, opts?: ElectrifyOptions) { this.worker = worker + this.config = config this.opts = opts this._dbs = {} @@ -284,7 +287,7 @@ export abstract class WorkerServer { } } - static start(_worker: Worker, _opts: any = {}): void { + static start(_worker: Worker, _config: ElectricConfig, _opts: any = {}): void { throw new Error('Sub-classes must implement `WorkerServer.start`') } } diff --git a/src/drivers/absurd-sql/index.ts b/src/drivers/absurd-sql/index.ts index 43a2abb..6c5403d 100644 --- a/src/drivers/absurd-sql/index.ts +++ b/src/drivers/absurd-sql/index.ts @@ -1,7 +1,7 @@ import { initBackend } from '@aphro/absurd-sql/dist/indexeddb-main-thread' import { ServerMethod, WorkerClient } from '../../bridge/index' -import { ElectricNamespace } from '../../electric/index' +import { ElectricNamespace, ElectrifyOptions } from '../../electric/index' import { MainThreadBridgeNotifier } from '../../notifiers/bridge' import { proxyOriginal } from '../../proxy/original' import { DbName } from '../../util/types' @@ -48,7 +48,7 @@ export const initElectricSqlJs = async (worker: Worker, locateOpts: LocateFileOp await workerClient.request(init, locator.serialise()) // we remove opts type info here to implement target interface - const openDatabase = async (dbName: DbName, opts?: any): Promise => { + const openDatabase = async (dbName: DbName, opts?: ElectrifyOptions): Promise => { const open: ServerMethod = { target: 'server', name: 'open' diff --git a/src/drivers/absurd-sql/mock.ts b/src/drivers/absurd-sql/mock.ts index 576e0e0..c94f43a 100644 --- a/src/drivers/absurd-sql/mock.ts +++ b/src/drivers/absurd-sql/mock.ts @@ -118,19 +118,19 @@ export class MockElectricWorker extends WorkerServer { } const opts = this.opts - const registry = opts.registry || new MockRegistry() + const registry = opts?.registry || new MockRegistry() if (!(dbName in this._dbs)) { const db = new MockDatabase(dbName) - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new MockMigrator() - const notifier = opts.notifier || new MockNotifier(dbName) - const socket = opts.socket || new MockSocket() + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new MockMigrator() + const notifier = opts?.notifier || new MockNotifier(dbName) + const socket = opts?.socket || new MockSocket() const namespace = new ElectricNamespace(adapter, notifier) this._dbs[dbName] = new ElectricDatabase(db, namespace, this.worker.user_defined_functions) - await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, opts) + await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, this.config) } else { await registry.ensureAlreadyStarted(dbName) diff --git a/src/drivers/absurd-sql/worker.ts b/src/drivers/absurd-sql/worker.ts index 8abbdfe..bf74232 100644 --- a/src/drivers/absurd-sql/worker.ts +++ b/src/drivers/absurd-sql/worker.ts @@ -7,6 +7,7 @@ import { ElectricNamespace, ElectrifyOptions } from '../../electric/index' import { BundleMigrator } from '../../migrators/bundle' import { WorkerBridgeNotifier } from '../../notifiers/bridge' import { globalRegistry } from '../../satellite/registry' +import { ElectricConfig } from '../../satellite/config' import { DbName } from '../../util/types' import { DatabaseAdapter } from './adapter' @@ -42,7 +43,8 @@ export class ElectricWorker extends WorkerServer { } const opts = this.opts - const registry = opts.registry || globalRegistry + const config = this.config + const registry = opts?.registry || globalRegistry if (!(dbName in this._dbs)) { const SQL = this.SQL @@ -57,15 +59,15 @@ export class ElectricWorker extends WorkerServer { const db = new SQL.Database(path, {filename: true}) db.exec(`PRAGMA journal_mode=MEMORY; PRAGMA page_size=8192;`) - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new BundleMigrator(adapter, opts.migrations) - const notifier = opts.notifier || new WorkerBridgeNotifier(dbName, this) - const socket = opts.socket || new WebSocketWeb() + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new BundleMigrator(adapter, config.migrations) + const notifier = opts?.notifier || new WorkerBridgeNotifier(dbName, this) + const socket = opts?.socket || new WebSocketWeb() const namespace = new ElectricNamespace(adapter, notifier) this._dbs[dbName] = new ElectricDatabase(db, namespace, this.worker.user_defined_functions) - await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, this.opts) + await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, config) } else { await registry.ensureAlreadyStarted(dbName) @@ -76,8 +78,8 @@ export class ElectricWorker extends WorkerServer { // Static entrypoint allows us to maintain a reference to the // instance. Passing opts allows the user to configure. - static start(worker: Worker, opts: ElectrifyOptions): void { - const ref = new ElectricWorker(worker, opts) + static start(worker: Worker, config: ElectricConfig, opts?: ElectrifyOptions): void { + const ref = new ElectricWorker(worker, config, opts) refs.push(ref) } diff --git a/src/drivers/better-sqlite3/index.ts b/src/drivers/better-sqlite3/index.ts index 91240b3..f2dc59f 100644 --- a/src/drivers/better-sqlite3/index.ts +++ b/src/drivers/better-sqlite3/index.ts @@ -9,6 +9,7 @@ import { import { BundleMigrator } from '../../migrators/bundle' import { EventNotifier } from '../../notifiers/event' import { globalRegistry } from '../../satellite/registry' +import { ElectricConfig } from '../../satellite/config' import { WebSocketNode } from '../../sockets/node' import { DbName } from '../../util/types' @@ -18,18 +19,18 @@ import { Database, ElectricDatabase, ElectrifiedDatabase } from './database' export { ElectricDatabase, DatabaseAdapter } export type { Database, ElectrifiedDatabase } -export const electrify = async (db: Database, opts: ElectrifyOptions): Promise => { +export const electrify = async (db: Database, config: ElectricConfig, opts?: ElectrifyOptions): Promise => { const dbName: DbName = db.name - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new BundleMigrator(adapter, opts.migrations) - const notifier = opts.notifier || new EventNotifier(dbName) - const socket = opts.socket || new WebSocketNode() - const registry = opts.registry || globalRegistry + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new BundleMigrator(adapter, config.migrations) + const notifier = opts?.notifier || new EventNotifier(dbName) + const socket = opts?.socket || new WebSocketNode() + const registry = opts?.registry || globalRegistry const namespace = new ElectricNamespace(adapter, notifier) const electric = new ElectricDatabase(db, namespace) - const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return electrified as unknown as ElectrifiedDatabase } diff --git a/src/drivers/cordova-sqlite-storage/index.ts b/src/drivers/cordova-sqlite-storage/index.ts index 8d10bff..62210a0 100644 --- a/src/drivers/cordova-sqlite-storage/index.ts +++ b/src/drivers/cordova-sqlite-storage/index.ts @@ -12,6 +12,7 @@ import { import { BundleMigrator } from '../../migrators/bundle' import { EventNotifier } from '../../notifiers/event' import { globalRegistry } from '../../satellite/registry' +import { ElectricConfig } from '../../satellite/config' import { DatabaseAdapter } from './adapter' import { Database, ElectricDatabase, ElectrifiedDatabase } from './database' @@ -20,18 +21,18 @@ import { MockSocket } from '../../sockets/mock' export { DatabaseAdapter, ElectricDatabase } export type { Database, ElectrifiedDatabase } -export const electrify = async (db: Database, opts: ElectrifyOptions): Promise => { +export const electrify = async (db: Database, config: ElectricConfig, opts?: ElectrifyOptions): Promise => { const dbName: DbName = db.dbname - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new BundleMigrator(adapter, opts.migrations) - const notifier = opts.notifier || new EventNotifier(dbName) - const socket = opts.socket || new MockSocket() // TODO - const registry = opts.registry || globalRegistry + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new BundleMigrator(adapter, config.migrations) + const notifier = opts?.notifier || new EventNotifier(dbName) + const socket = opts?.socket || new MockSocket() // TODO + const registry = opts?.registry || globalRegistry const namespace = new ElectricNamespace(adapter, notifier) const electric = new ElectricDatabase(db, namespace) - const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return electrified as unknown as ElectrifiedDatabase } diff --git a/src/drivers/cordova-sqlite-storage/test.ts b/src/drivers/cordova-sqlite-storage/test.ts index 424dbe6..a670191 100644 --- a/src/drivers/cordova-sqlite-storage/test.ts +++ b/src/drivers/cordova-sqlite-storage/test.ts @@ -6,8 +6,9 @@ import { ElectricNamespace, electrify, ElectrifyOptions } from '../../electric/i import { MockMigrator } from '../../migrators/mock' import { Notifier } from '../../notifiers/index' -import { MockNotifier } from '../../notifiers/mock' -import { MockRegistry } from '../../satellite/mock' +import { MockNotifier } from '../../notifiers/mock' +import { ElectricConfig } from '../../satellite/config' +import { MockRegistry } from '../../satellite/mock' import { DatabaseAdapter } from './adapter' import { Database, ElectricDatabase, ElectrifiedDatabase } from './database' @@ -16,20 +17,20 @@ import { MockSocket } from '../../sockets/mock' type RetVal = Promise<[Database, Notifier, ElectrifiedDatabase]> -const testOpts = { config: {app: "app", replication: {address: "", port: 0}}} +const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} -export const initTestable = async (dbName: DbName, opts: ElectrifyOptions = testOpts): RetVal => { +export const initTestable = async (dbName: DbName, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = new MockDatabase(dbName) - const adapter = opts.adapter || new DatabaseAdapter(db) - const notifier = opts.notifier || new MockNotifier(dbName) - const migrator = opts.migrator || new MockMigrator() - const socket = opts.socket || new MockSocket() - const registry = opts.registry || new MockRegistry() + const adapter = opts?.adapter || new DatabaseAdapter(db) + const notifier = opts?.notifier || new MockNotifier(dbName) + const migrator = opts?.migrator || new MockMigrator() + const socket = opts?.socket || new MockSocket() + const registry = opts?.registry || new MockRegistry() const namespace = new ElectricNamespace(adapter, notifier) const electric = new ElectricDatabase(db, namespace) - const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return [db, notifier, electrified as unknown as ElectrifiedDatabase] } diff --git a/src/drivers/expo-sqlite/index.ts b/src/drivers/expo-sqlite/index.ts index bcf515a..35e1646 100644 --- a/src/drivers/expo-sqlite/index.ts +++ b/src/drivers/expo-sqlite/index.ts @@ -12,6 +12,7 @@ import { import { BundleMigrator } from '../../migrators/bundle' import { EventNotifier } from '../../notifiers/event' import { globalRegistry } from '../../satellite/registry' +import { ElectricConfig } from '../../satellite/config' import { DatabaseAdapter } from './adapter' import { Database, ElectricDatabase, ElectricWebSQLDatabase, ElectrifiedDatabase } from './database' @@ -23,14 +24,14 @@ import 'fastestsmallesttextencoderdecoder' export { DatabaseAdapter, ElectricDatabase, ElectricWebSQLDatabase } export type { Database, ElectrifiedDatabase } -export const electrify = async (db: Database, opts: ElectrifyOptions): Promise => { +export const electrify = async (db: Database, config: ElectricConfig, opts?: ElectrifyOptions): Promise => { const dbName: DbName = db._name - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new BundleMigrator(adapter, opts.migrations) - const notifier = opts.notifier || new EventNotifier(dbName) - const socket = opts.socket || new WebSocketReactNative() - const registry = opts.registry || globalRegistry + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new BundleMigrator(adapter, config.migrations) + const notifier = opts?.notifier || new EventNotifier(dbName) + const socket = opts?.socket || new WebSocketReactNative() + const registry = opts?.registry || globalRegistry const namespace = new ElectricNamespace(adapter, notifier) @@ -42,6 +43,6 @@ export const electrify = async (db: Database, opts: ElectrifyOptions): Promise -const testOpts = { config: {app: "app", replication: {address: "", port: 0}}} +const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} -export const initTestable = async (dbName: DbName, useWebSQLDatabase: boolean = false, opts: ElectrifyOptions = testOpts): RetVal => { +export const initTestable = async (dbName: DbName, useWebSQLDatabase: boolean = false, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = useWebSQLDatabase ? new MockWebSQLDatabase(dbName) : new MockDatabase(dbName) - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new MockMigrator() - const notifier = opts.notifier || new MockNotifier(dbName) - const socket = opts.socket || new MockSocket() - const registry = opts.registry || new MockRegistry() + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new MockMigrator() + const notifier = opts?.notifier || new MockNotifier(dbName) + const socket = opts?.socket || new MockSocket() + const registry = opts?.registry || new MockRegistry() const namespace = new ElectricNamespace(adapter, notifier) @@ -38,6 +39,6 @@ export const initTestable = async (dbName: DbName, useWebSQLDatabase: boolean = electric = new ElectricDatabase(db, namespace) } - const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return [db, notifier, electrified as unknown as ElectrifiedDatabase] } diff --git a/src/drivers/react-native-sqlite-storage/index.ts b/src/drivers/react-native-sqlite-storage/index.ts index ab7e569..066f0a5 100644 --- a/src/drivers/react-native-sqlite-storage/index.ts +++ b/src/drivers/react-native-sqlite-storage/index.ts @@ -12,6 +12,7 @@ import { import { BundleMigrator } from '../../migrators/bundle' import { EventNotifier } from '../../notifiers/event' import { globalRegistry } from '../../satellite/registry' +import { ElectricConfig } from '../../satellite/config' import { DatabaseAdapter } from './adapter' import { Database, ElectricDatabase, ElectrifiedDatabase } from './database' @@ -23,18 +24,18 @@ import 'fastestsmallesttextencoderdecoder' export { DatabaseAdapter, ElectricDatabase } export type { Database, ElectrifiedDatabase } -export const electrify = async (db: Database, promisesEnabled: boolean, opts: ElectrifyOptions): Promise => { +export const electrify = async (db: Database, promisesEnabled: boolean, config: ElectricConfig, opts?: ElectrifyOptions): Promise => { const dbName: DbName = db.dbName - const adapter = opts.adapter || new DatabaseAdapter(db, promisesEnabled) - const migrator = opts.migrator || new BundleMigrator(adapter, opts.migrations) - const notifier = opts.notifier || new EventNotifier(dbName) - const socket = opts.socket || new WebSocketReactNative() - const registry = opts.registry || globalRegistry + const adapter = opts?.adapter || new DatabaseAdapter(db, promisesEnabled) + const migrator = opts?.migrator || new BundleMigrator(adapter, config.migrations) + const notifier = opts?.notifier || new EventNotifier(dbName) + const socket = opts?.socket || new WebSocketReactNative() + const registry = opts?.registry || globalRegistry const namespace = new ElectricNamespace(adapter, notifier) const electric = new ElectricDatabase(db, namespace, promisesEnabled) - const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await baseElectrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return electrified as unknown as ElectrifiedDatabase } diff --git a/src/drivers/react-native-sqlite-storage/test.ts b/src/drivers/react-native-sqlite-storage/test.ts index 9f61688..9f5a9c3 100644 --- a/src/drivers/react-native-sqlite-storage/test.ts +++ b/src/drivers/react-native-sqlite-storage/test.ts @@ -8,6 +8,7 @@ import { MockMigrator } from '../../migrators/mock' import { Notifier } from '../../notifiers/index' import { MockNotifier } from '../../notifiers/mock' import { MockRegistry } from '../../satellite/mock' +import { ElectricConfig } from '../../satellite/config' import { DatabaseAdapter } from './adapter' import { Database, ElectricDatabase, ElectrifiedDatabase } from './database' @@ -16,20 +17,20 @@ import { MockSocket } from '../../sockets/mock' type RetVal = Promise<[Database, Notifier, ElectrifiedDatabase]> -const testOpts = { config: {app: "app", replication: {address: "", port: 0}}} +const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} -export const initTestable = async (dbName: DbName, opts: ElectrifyOptions = testOpts): RetVal => { +export const initTestable = async (dbName: DbName, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = new MockDatabase(dbName) - const adapter = opts.adapter || new DatabaseAdapter(db) - const migrator = opts.migrator || new MockMigrator() - const notifier = opts.notifier || new MockNotifier(dbName) - const socket = opts.socket || new MockSocket() - const registry = opts.registry || new MockRegistry() + const adapter = opts?.adapter || new DatabaseAdapter(db) + const migrator = opts?.migrator || new MockMigrator() + const notifier = opts?.notifier || new MockNotifier(dbName) + const socket = opts?.socket || new MockSocket() + const registry = opts?.registry || new MockRegistry() const namespace = new ElectricNamespace(adapter, notifier) const electric = new ElectricDatabase(db, namespace) - const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, opts) + const electrified = await electrify(dbName, db, electric, adapter, migrator, notifier, socket, registry, config) return [db, notifier, electrified as unknown as ElectrifiedDatabase] } diff --git a/src/electric/index.ts b/src/electric/index.ts index 66075ae..107a07d 100644 --- a/src/electric/index.ts +++ b/src/electric/index.ts @@ -53,9 +53,9 @@ export const electrify = async ( notifier: Notifier, socket: Socket, registry: Registry, - opts: ElectrifyOptions, + config: ElectricConfig, ): Promise => { - await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, opts) + await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, config) return proxyOriginal(db, electric) } diff --git a/src/satellite/config.ts b/src/satellite/config.ts index 6aeb1f3..76b585b 100644 --- a/src/satellite/config.ts +++ b/src/satellite/config.ts @@ -1,4 +1,5 @@ import { QualifiedTablename } from '../util/tablename' +import { Migration } from '../migrators/index' export interface SatelliteOpts { // The database table where Satellite keeps its processing metadata. @@ -34,7 +35,8 @@ export const satelliteDefaults: SatelliteOpts = { } export interface SatelliteClientOpts { - appId: string + app: string + env: string token: string port: number address: string @@ -48,7 +50,8 @@ export const satelliteClientDefaults = { } export interface SatelliteClientOverrides { - appId: string + app: string + env: string token: string port: number address: string @@ -59,7 +62,9 @@ export interface SatelliteClientOverrides { // Config spec export interface ElectricConfig { app: string - replication: { + env: string + migrations?: Migration[], + replication?: { address: string port: number } diff --git a/src/satellite/index.ts b/src/satellite/index.ts index f8fe9f6..45e6687 100644 --- a/src/satellite/index.ts +++ b/src/satellite/index.ts @@ -1,5 +1,4 @@ import { AuthState } from '../auth/index' -import { ElectrifyOptions } from '../electric' import { DatabaseAdapter } from '../electric/adapter' import { Migrator } from '../migrators/index' import { Notifier } from '../notifiers/index' @@ -8,10 +7,11 @@ import { AckCallback, AuthResponse, DbName, LSN, SatelliteError, Transaction } f export { SatelliteProcess } from './process' export { GlobalRegistry, globalRegistry } from './registry' +import { ElectricConfig } from './config' // `Registry` that starts one Satellite process per database. export interface Registry { - ensureStarted(dbName: DbName, adapter: DatabaseAdapter, migrator: Migrator, notifier: Notifier, socket: Socket, opts: ElectrifyOptions, authState?: AuthState): Promise + ensureStarted(dbName: DbName, adapter: DatabaseAdapter, migrator: Migrator, notifier: Notifier, socket: Socket, config: ElectricConfig, authState?: AuthState): Promise ensureAlreadyStarted(dbName: DbName): Promise stop(dbName: DbName): Promise stopAll(): Promise diff --git a/src/satellite/registry.ts b/src/satellite/registry.ts index f6a0a0f..060cb33 100644 --- a/src/satellite/registry.ts +++ b/src/satellite/registry.ts @@ -9,7 +9,6 @@ import { satelliteDefaults, ElectricConfig, satelliteClientDefaults, validateCon import { SatelliteProcess } from './process' import { Socket } from '../sockets' import { SatelliteClient } from './client' -import { ElectrifyOptions } from '../electric' export abstract class BaseRegistry implements Registry { satellites: { @@ -40,14 +39,14 @@ export abstract class BaseRegistry implements Registry { throw `Subclasses must implement startProcess` } - async ensureStarted(dbName: DbName, adapter: DatabaseAdapter, migrator: Migrator, notifier: Notifier, socket: Socket, opts: ElectrifyOptions, authState?: AuthState): Promise { + async ensureStarted(dbName: DbName, adapter: DatabaseAdapter, migrator: Migrator, notifier: Notifier, socket: Socket, config: ElectricConfig, authState?: AuthState): Promise { // If we're in the process of stopping the satellite process for this // dbName, then we wait for the process to be stopped and then we // call this function again to retry starting it. const stoppingPromises = this.stoppingPromises const stopping = stoppingPromises[dbName] if (stopping !== undefined) { - return stopping.then(() => this.ensureStarted(dbName, adapter, migrator, notifier, socket, opts, authState)) + return stopping.then(() => this.ensureStarted(dbName, adapter, migrator, notifier, socket, config, authState)) } // If we're in the process of starting the satellite process for this @@ -72,7 +71,7 @@ export abstract class BaseRegistry implements Registry { } // Otherwise we need to fire it up! - const startingPromise = this.startProcess(dbName, adapter, migrator, notifier, socket, opts.config, authState) + const startingPromise = this.startProcess(dbName, adapter, migrator, notifier, socket, config, authState) .then((satellite) => { delete startingPromises[dbName] @@ -165,11 +164,16 @@ export class GlobalRegistry extends BaseRegistry { throw Error(`invalid config: ${foundErrors}`); } + // FIXME: what should these be? + const defaultAddress = `${config.app}-${config.env}.electric-sql.com` + const defaultPort = 5133 + const satelliteClientOpts = { ...satelliteClientDefaults, - appId: config.app, - address: config.replication.address, - port: config.replication.port, + app: config.app, + env: config.env, + address: config.replication?.address || defaultAddress, + port: config.replication?.port || defaultPort, token: "TODO" } diff --git a/test/drivers/better-sqlite3.test.ts b/test/drivers/better-sqlite3.test.ts index bd3fa3f..1417d1e 100644 --- a/test/drivers/better-sqlite3.test.ts +++ b/test/drivers/better-sqlite3.test.ts @@ -12,7 +12,7 @@ import { QualifiedTablename } from '../../src/util/tablename' test('electrify returns an equivalent database client', async t => { const original = new Database('test.db') const registry = new MockRegistry() - const db = await electrify(original, {registry: registry}) + const db = await electrify(original, {}, {registry: registry}) const originalKeys = Object.getOwnPropertyNames(original) const originalPrototype = Object.getPrototypeOf(original) @@ -25,7 +25,7 @@ test('electrify returns an equivalent database client', async t => { test('electrify does not remove non-patched properties and methods', async t => { const original = new Database('test.db') const registry = new MockRegistry() - const db = await electrify(original, {registry: registry}) + const db = await electrify(original, {}, {registry: registry}) t.is(typeof db.pragma, 'function') }) @@ -34,7 +34,7 @@ test('the electrified database has `.electric.potentiallyChanged()`', async t => const original = new Database('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -47,7 +47,7 @@ test('exec\'ing a dangerous statement calls potentiallyChanged', async t => { const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -60,7 +60,7 @@ test('exec\'ing a non dangerous statement doesn\'t call potentiallyChanged', asy const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -73,7 +73,7 @@ test('running a transaction function calls potentiallyChanged', async t => { const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -87,7 +87,7 @@ test('running a transaction sub function calls potentiallyChanged', async t => { const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) const a = db.transaction(() => {}) const b = db.transaction(() => {}) @@ -109,7 +109,7 @@ test('electrify preserves chainability', async t => { const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -124,7 +124,7 @@ test('running a prepared statement outside of a transaction notifies', async t = const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -138,7 +138,7 @@ test('running a prepared statement *inside* of a transaction does *not* notify', const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) @@ -157,7 +157,7 @@ test('iterating a prepared statement works', async t => { const original = new MockDatabase('test.db') const notifier = new MockNotifier(original.name) const registry = new MockRegistry() - const db = await electrify(original, {notifier: notifier, registry: registry}) + const db = await electrify(original, {}, {notifier: notifier, registry: registry}) t.is(notifier.notifications.length, 0) diff --git a/test/satellite/integration.ts b/test/satellite/integration.ts index 7d3fd34..39f9e7b 100644 --- a/test/satellite/integration.ts +++ b/test/satellite/integration.ts @@ -30,7 +30,8 @@ const opts = Object.assign({}, satelliteDefaults, { }) const clientOpts = Object.assign({}, satelliteClientDefaults, { - appId: "fake_id", + app: "fake_id", + env: "prod", token: "fake_token", address: '127.0.0.1', port: 5133, diff --git a/test/satellite/registry.test.ts b/test/satellite/registry.test.ts index 5ea60c4..548e277 100644 --- a/test/satellite/registry.test.ts +++ b/test/satellite/registry.test.ts @@ -11,7 +11,7 @@ const adapter = {} as DatabaseAdapter const migrator = {} as Migrator const notifier = {} as Notifier const socket = {} as Socket -const opts = { config: {app: "app", replication: {address: "", port: 0}}} +const opts = {app: "app", env: "test", replication: {address: "", port: 0}} const args = [dbName, adapter, migrator, notifier, socket, opts] as const test('starting a satellite process works', async t => { diff --git a/test/support/mock-worker.js b/test/support/mock-worker.js index 1885eca..2d2600f 100644 --- a/test/support/mock-worker.js +++ b/test/support/mock-worker.js @@ -13,4 +13,4 @@ self.user_defined_functions = { const notifier = new MockNotifier('test.db') const registry = new MockRegistry() -const ref = new MockElectricWorker(self, {notifier: notifier, registry: registry}) +const ref = new MockElectricWorker(self, {}, {notifier: notifier, registry: registry}) From c0a3caa8743206b88708dd69649920b88a10a199 Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Mon, 31 Oct 2022 11:14:56 +0000 Subject: [PATCH 2/6] add prepare task for publishing via github --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index a2b6d68..08b0acc 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,8 @@ "test": "ava", "pretest": "yarn build", "prepublishOnly": "yarn test", - "lint": "eslint src --fix" + "lint": "eslint src --fix", + "prepare": "npm run build" }, "ava": { "timeout": "10m", From 9c8a0421f5ab887329560f34aead2dfd30b40f7c Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Mon, 31 Oct 2022 12:03:19 +0000 Subject: [PATCH 3/6] remove migrations and config from ElectrifyOptions --- src/electric/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/electric/index.ts b/src/electric/index.ts index 107a07d..8a28618 100644 --- a/src/electric/index.ts +++ b/src/electric/index.ts @@ -1,6 +1,6 @@ import { AnyDatabase, AnyElectricDatabase, AnyElectrifiedDatabase } from '../drivers/index' import { DatabaseAdapter } from '../electric/adapter' -import { Migration, Migrator } from '../migrators/index' +import { Migrator } from '../migrators/index' import { Notifier } from '../notifiers/index' import { Registry } from '../satellite/index' import { Socket } from '../sockets/index' @@ -12,13 +12,11 @@ import { ElectricConfig } from '../satellite/config' // entrypoint. They are all optional to optionally allow different / mock // implementations to be passed in to facilitate testing. export interface ElectrifyOptions { - migrations?: Migration[], adapter?: DatabaseAdapter, migrator?: Migrator, notifier?: Notifier, socket?: Socket, registry?: Registry, - config: ElectricConfig, } // This is the namespace that's patched onto the user's database client From c4915004356fdd0e7d6cac4eae348b0df0e590cc Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Mon, 31 Oct 2022 12:04:29 +0000 Subject: [PATCH 4/6] remove out-of-date comment --- src/drivers/absurd-sql/index.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/drivers/absurd-sql/index.ts b/src/drivers/absurd-sql/index.ts index 6c5403d..78f3c15 100644 --- a/src/drivers/absurd-sql/index.ts +++ b/src/drivers/absurd-sql/index.ts @@ -47,7 +47,6 @@ export const initElectricSqlJs = async (worker: Worker, locateOpts: LocateFileOp } await workerClient.request(init, locator.serialise()) - // we remove opts type info here to implement target interface const openDatabase = async (dbName: DbName, opts?: ElectrifyOptions): Promise => { const open: ServerMethod = { target: 'server', @@ -56,8 +55,8 @@ export const initElectricSqlJs = async (worker: Worker, locateOpts: LocateFileOp await workerClient.request(open, dbName) const db = new MainThreadDatabaseProxy(dbName, workerClient) - const adapter = opts && opts.adapter || new DatabaseAdapter(db) - const notifier = opts && opts.notifier || new MainThreadBridgeNotifier(dbName, workerClient) + const adapter = opts?.adapter || new DatabaseAdapter(db) + const notifier = opts?.notifier || new MainThreadBridgeNotifier(dbName, workerClient) const namespace = new ElectricNamespace(adapter, notifier) return proxyOriginal(db, {electric: namespace}) as ElectrifiedDatabase From 6dbb0af7abf10fe73dab0dbe5b2ace04aa162b55 Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Tue, 1 Nov 2022 09:21:18 +0000 Subject: [PATCH 5/6] move configuration out of worker and into open db otherwise its difficult to pass in generated configuration like the authentication token --- README.md | 4 ++-- src/bridge/index.ts | 7 ++---- src/drivers/absurd-sql/index.ts | 7 +++--- src/drivers/absurd-sql/mock.ts | 5 ++-- src/drivers/absurd-sql/worker.ts | 7 +++--- test/drivers/absurd-sql.test.ts | 41 ++++++++++++++++---------------- test/support/mock-worker.js | 2 +- 7 files changed, 36 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index fe43c60..16b3731 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ First create a `worker.js` file that imports and starts an ElectricWorker proces // worker.js import { ElectricWorker } from 'electric-sql/browser' -ElectricWorker.start(self, { app: "my-app", env: "prod", migrations: [] }) +ElectricWorker.start(self) ``` Then, in your main application: @@ -78,7 +78,7 @@ const worker = new Worker(url, {type: "module"}) // Electrify the SQL.js / absurd-sql machinery and then open // a persistent, named database. initElectricSqlJs(worker, {locateFile: file => `/${file}`}) - .then(SQL => SQL.openDatabase('example.db')) + .then(SQL => SQL.openDatabase('example.db', { app: "my-app", env: "prod", token: "token", migrations: [] })) .then(db => db.exec('SELECT 1')) ``` diff --git a/src/bridge/index.ts b/src/bridge/index.ts index 369bdf8..2a0879b 100644 --- a/src/bridge/index.ts +++ b/src/bridge/index.ts @@ -3,7 +3,6 @@ import { ElectrifyOptions } from '../electric/index' import { ChangeCallback, ChangeNotification } from '../notifiers/index' import { randomValue } from '../util/random' import { AnyFunction, DbName, StatementId } from '../util/types' -import { ElectricConfig } from '../satellite/config' declare global { interface Worker { @@ -177,16 +176,14 @@ export abstract class WorkerServer { SQL?: any worker: Worker - config: ElectricConfig opts?: ElectrifyOptions _dbs: { [key: DbName]: AnyWorkerThreadElectricDatabase } - constructor(worker: Worker, config: ElectricConfig, opts?: ElectrifyOptions) { + constructor(worker: Worker, opts?: ElectrifyOptions) { this.worker = worker - this.config = config this.opts = opts this._dbs = {} @@ -287,7 +284,7 @@ export abstract class WorkerServer { } } - static start(_worker: Worker, _config: ElectricConfig, _opts: any = {}): void { + static start(_worker: Worker, _opts: any = {}): void { throw new Error('Sub-classes must implement `WorkerServer.start`') } } diff --git a/src/drivers/absurd-sql/index.ts b/src/drivers/absurd-sql/index.ts index 78f3c15..bff7864 100644 --- a/src/drivers/absurd-sql/index.ts +++ b/src/drivers/absurd-sql/index.ts @@ -4,6 +4,7 @@ import { ServerMethod, WorkerClient } from '../../bridge/index' import { ElectricNamespace, ElectrifyOptions } from '../../electric/index' import { MainThreadBridgeNotifier } from '../../notifiers/bridge' import { proxyOriginal } from '../../proxy/original' +import { ElectricConfig } from '../../satellite/config' import { DbName } from '../../util/types' import { DatabaseAdapter } from './adapter' @@ -33,7 +34,7 @@ export { resultToRows } from './result' export { ElectricWorker } from './worker' export interface SQL { - openDatabase(dbName: DbName): Promise + openDatabase(dbName: DbName, config: ElectricConfig): Promise } export const initElectricSqlJs = async (worker: Worker, locateOpts: LocateFileOpts = {}): Promise => { @@ -47,12 +48,12 @@ export const initElectricSqlJs = async (worker: Worker, locateOpts: LocateFileOp } await workerClient.request(init, locator.serialise()) - const openDatabase = async (dbName: DbName, opts?: ElectrifyOptions): Promise => { + const openDatabase = async (dbName: DbName, config: ElectricConfig, opts?: ElectrifyOptions): Promise => { const open: ServerMethod = { target: 'server', name: 'open' } - await workerClient.request(open, dbName) + await workerClient.request(open, dbName, config) const db = new MainThreadDatabaseProxy(dbName, workerClient) const adapter = opts?.adapter || new DatabaseAdapter(db) diff --git a/src/drivers/absurd-sql/mock.ts b/src/drivers/absurd-sql/mock.ts index c94f43a..237a39f 100644 --- a/src/drivers/absurd-sql/mock.ts +++ b/src/drivers/absurd-sql/mock.ts @@ -10,6 +10,7 @@ import { MockRegistry } from '../../satellite/mock' import { DatabaseAdapter } from './adapter' import { Config, Database, ElectricDatabase, QueryExecResult, Statement } from './database' import { MockSocket } from '../../sockets/mock' +import { ElectricConfig } from '../../satellite/config' interface TestData { notifications: Notification[] @@ -112,7 +113,7 @@ export class MockElectricWorker extends WorkerServer { return true } - async open(dbName: DbName): Promise { + async open(dbName: DbName, config: ElectricConfig): Promise { if (!this.SQL) { throw new RequestError(400, 'Must init before opening') } @@ -130,7 +131,7 @@ export class MockElectricWorker extends WorkerServer { const namespace = new ElectricNamespace(adapter, notifier) this._dbs[dbName] = new ElectricDatabase(db, namespace, this.worker.user_defined_functions) - await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, this.config) + await registry.ensureStarted(dbName, adapter, migrator, notifier, socket, config) } else { await registry.ensureAlreadyStarted(dbName) diff --git a/src/drivers/absurd-sql/worker.ts b/src/drivers/absurd-sql/worker.ts index bf74232..bd0c533 100644 --- a/src/drivers/absurd-sql/worker.ts +++ b/src/drivers/absurd-sql/worker.ts @@ -37,13 +37,12 @@ export class ElectricWorker extends WorkerServer { return true } - async open(dbName: DbName): Promise { + async open(dbName: DbName, config: ElectricConfig): Promise { if (this.SQL === undefined) { throw new RequestError(400, 'Must init before opening') } const opts = this.opts - const config = this.config const registry = opts?.registry || globalRegistry if (!(dbName in this._dbs)) { @@ -78,8 +77,8 @@ export class ElectricWorker extends WorkerServer { // Static entrypoint allows us to maintain a reference to the // instance. Passing opts allows the user to configure. - static start(worker: Worker, config: ElectricConfig, opts?: ElectrifyOptions): void { - const ref = new ElectricWorker(worker, config, opts) + static start(worker: Worker, opts?: ElectrifyOptions): void { + const ref = new ElectricWorker(worker, opts) refs.push(ref) } diff --git a/test/drivers/absurd-sql.test.ts b/test/drivers/absurd-sql.test.ts index 9f11a81..42f9684 100644 --- a/test/drivers/absurd-sql.test.ts +++ b/test/drivers/absurd-sql.test.ts @@ -10,6 +10,7 @@ const initMethod: ServerMethod = {target: 'server', name: 'init'} const openMethod: ServerMethod = {target: 'server', name: 'open'} const getTestData: ServerMethod = {target: 'server', name: '_get_test_data'} +const electricConfig = {app: "my-app", env: "my-env", token: "my-token"} const makeWorker = () => { return new Worker('./test/support/mock-worker.js', {type: 'module'}) @@ -19,7 +20,7 @@ const makeDb = async () => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) return new MainThreadDatabaseProxy('test.db', client) } @@ -29,7 +30,7 @@ test('init and open works', async t => { const client = new WorkerClient(worker) t.true(await client.request(initMethod, '')) - t.true(await client.request(openMethod, 'test.db')) + t.true(await client.request(openMethod, 'test.db', electricConfig)) }) test('the main thread proxy provides the expected methods', async t => { @@ -56,7 +57,7 @@ test('can\'t open before you init', async t => { const worker = makeWorker() const client = new WorkerClient(worker) - await t.throwsAsync(client.request(openMethod, 'test.db'), { + await t.throwsAsync(client.request(openMethod, 'test.db', electricConfig), { message: 'Must init before opening' }) }) @@ -77,8 +78,8 @@ test('can open the same database twice', async t => { const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) + await client.request(openMethod, 'test.db', electricConfig) t.assert(true) }) @@ -87,7 +88,7 @@ test('must open the right database', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('another.db', client) await t.throwsAsync(db.exec('select 1'), { @@ -110,8 +111,8 @@ test('can query multiple databases', async t => { const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'foo.db') - await client.request(openMethod, 'bar.db') + await client.request(openMethod, 'foo.db', electricConfig) + await client.request(openMethod, 'bar.db', electricConfig) const fooDb = new MainThreadDatabaseProxy('foo.db', client) const barDb = new MainThreadDatabaseProxy('bar.db', client) @@ -352,7 +353,7 @@ test('db.exec harmless sql does not notify', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) await db.exec('select 1') @@ -367,7 +368,7 @@ test('db.exec dangerous sql does notify', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) await db.exec('insert foo into bar') @@ -382,7 +383,7 @@ test('db.run harmless sql does not notify', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) await db.run('select 1') @@ -397,7 +398,7 @@ test('db.run dangerous sql notifies', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) await db.run('insert foo into bar') @@ -412,7 +413,7 @@ test('db.each notifies', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) @@ -431,7 +432,7 @@ test('db.iterateStatements doesn\'t notify on its own', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const statements = 'select 1; insert into 2; select 3; insert into 4' @@ -458,7 +459,7 @@ test('statement run notifies when dangerous', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') @@ -474,7 +475,7 @@ test('statement step notifies when dangerous', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') @@ -490,7 +491,7 @@ test('statement step only notifies once', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') @@ -507,7 +508,7 @@ test('statement bind and reset allows reuse with notify', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') @@ -527,7 +528,7 @@ test('statement get notifies if called with params', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') @@ -554,7 +555,7 @@ test('statement getAsObject notifies if called with params', async t => { const worker = makeWorker() const client = new WorkerClient(worker) await client.request(initMethod, '') - await client.request(openMethod, 'test.db') + await client.request(openMethod, 'test.db', electricConfig) const db = new MainThreadDatabaseProxy('test.db', client) const stmt = await db.prepare('insert foo into bar') diff --git a/test/support/mock-worker.js b/test/support/mock-worker.js index 2d2600f..1885eca 100644 --- a/test/support/mock-worker.js +++ b/test/support/mock-worker.js @@ -13,4 +13,4 @@ self.user_defined_functions = { const notifier = new MockNotifier('test.db') const registry = new MockRegistry() -const ref = new MockElectricWorker(self, {}, {notifier: notifier, registry: registry}) +const ref = new MockElectricWorker(self, {notifier: notifier, registry: registry}) From d6f68ffe79ca5f05721773eb24c1ae447f9405c1 Mon Sep 17 00:00:00 2001 From: Garry Hill Date: Tue, 1 Nov 2022 09:22:20 +0000 Subject: [PATCH 6/6] add token placeholders to configurations --- README.md | 4 ++-- src/drivers/cordova-sqlite-storage/test.ts | 2 +- src/drivers/expo-sqlite/test.ts | 2 +- src/drivers/react-native-sqlite-storage/test.ts | 2 +- src/satellite/config.ts | 1 + src/satellite/registry.ts | 2 +- test/satellite/registry.test.ts | 2 +- 7 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 16b3731..6bf75b1 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ SQLite.enablePromise(true) // Open a database connection and electrify it. SQLite.openDatabase('example.db') - .then(db => electrify(db, { app: "my-app", env: "prod", migrations: [] })) + .then(db => electrify(db, { app: "my-app", env: "prod", token: "token", migrations: [] })) .then(db => { // Use as normal, e.g.: db.transaction(tx => tx.executeSql('SELECT 1')) }) @@ -112,7 +112,7 @@ export default const App = () => { useEffect(() => { SQLite.openDatabase('example.db') - .then(db => electrify(db, { app: "my-app", env: "prod" })) + .then(db => electrify(db, { app: "my-app", env: "prod", token: "token" })) .then(db => setDb(db)) }, []) diff --git a/src/drivers/cordova-sqlite-storage/test.ts b/src/drivers/cordova-sqlite-storage/test.ts index a670191..d2d5268 100644 --- a/src/drivers/cordova-sqlite-storage/test.ts +++ b/src/drivers/cordova-sqlite-storage/test.ts @@ -17,7 +17,7 @@ import { MockSocket } from '../../sockets/mock' type RetVal = Promise<[Database, Notifier, ElectrifiedDatabase]> -const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} +const testConfig = {app: "app", env: "test", token: "token", replication: {address: "", port: 0}} export const initTestable = async (dbName: DbName, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = new MockDatabase(dbName) diff --git a/src/drivers/expo-sqlite/test.ts b/src/drivers/expo-sqlite/test.ts index 73c0a64..fb64ad3 100644 --- a/src/drivers/expo-sqlite/test.ts +++ b/src/drivers/expo-sqlite/test.ts @@ -16,7 +16,7 @@ import { MockDatabase, MockWebSQLDatabase } from './mock' import { MockSocket } from '../../sockets/mock' type RetVal = Promise<[Database, Notifier, ElectrifiedDatabase]> -const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} +const testConfig = {app: "app", env: "test", token: "token", replication: {address: "", port: 0}} export const initTestable = async (dbName: DbName, useWebSQLDatabase: boolean = false, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = useWebSQLDatabase diff --git a/src/drivers/react-native-sqlite-storage/test.ts b/src/drivers/react-native-sqlite-storage/test.ts index 9f5a9c3..404bb29 100644 --- a/src/drivers/react-native-sqlite-storage/test.ts +++ b/src/drivers/react-native-sqlite-storage/test.ts @@ -17,7 +17,7 @@ import { MockSocket } from '../../sockets/mock' type RetVal = Promise<[Database, Notifier, ElectrifiedDatabase]> -const testConfig = {app: "app", env: "test", replication: {address: "", port: 0}} +const testConfig = {app: "app", env: "test", token: "token", replication: {address: "", port: 0}} export const initTestable = async (dbName: DbName, config: ElectricConfig = testConfig, opts?: ElectrifyOptions): RetVal => { const db = new MockDatabase(dbName) diff --git a/src/satellite/config.ts b/src/satellite/config.ts index 76b585b..5eee756 100644 --- a/src/satellite/config.ts +++ b/src/satellite/config.ts @@ -63,6 +63,7 @@ export interface SatelliteClientOverrides { export interface ElectricConfig { app: string env: string + token: string migrations?: Migration[], replication?: { address: string diff --git a/src/satellite/registry.ts b/src/satellite/registry.ts index 060cb33..9eb2b70 100644 --- a/src/satellite/registry.ts +++ b/src/satellite/registry.ts @@ -172,9 +172,9 @@ export class GlobalRegistry extends BaseRegistry { ...satelliteClientDefaults, app: config.app, env: config.env, + token: config.token, address: config.replication?.address || defaultAddress, port: config.replication?.port || defaultPort, - token: "TODO" } const client = new SatelliteClient(socket, satelliteClientOpts) diff --git a/test/satellite/registry.test.ts b/test/satellite/registry.test.ts index 548e277..fc884af 100644 --- a/test/satellite/registry.test.ts +++ b/test/satellite/registry.test.ts @@ -11,7 +11,7 @@ const adapter = {} as DatabaseAdapter const migrator = {} as Migrator const notifier = {} as Notifier const socket = {} as Socket -const opts = {app: "app", env: "test", replication: {address: "", port: 0}} +const opts = {app: "app", env: "test", token: "token", replication: {address: "", port: 0}} const args = [dbName, adapter, migrator, notifier, socket, opts] as const test('starting a satellite process works', async t => {