From 6967698d325c7c1e246b9cb87cf96011ee540c0a Mon Sep 17 00:00:00 2001 From: Tom French <tom@tomfren.ch> Date: Sun, 15 May 2022 23:15:04 +0100 Subject: [PATCH] refactor: move crdt files into separate directory --- packages/loot-core/bin/get-db-schema | 1 - packages/loot-core/bin/profile-sql.js | 1 - packages/loot-core/src/server/api.js | 2 +- .../loot-core/src/server/aql/schema/executors.test.js | 2 +- packages/loot-core/src/server/crdt/index.js | 4 ++++ packages/loot-core/src/server/{ => crdt}/merkle.js | 0 .../loot-core/src/server/{ => crdt}/merkle.test.js | 2 +- packages/loot-core/src/server/{ => crdt}/timestamp.js | 6 +++--- .../loot-core/src/server/{ => crdt}/timestamp.test.js | 2 +- packages/loot-core/src/server/db/index.js | 7 ++++--- packages/loot-core/src/server/main.js | 11 ++++++----- packages/loot-core/src/server/main.test.js | 2 +- packages/loot-core/src/server/prefs.js | 2 +- packages/loot-core/src/server/sync/index.js | 9 +++++---- packages/loot-core/src/server/sync/migrate.js | 2 +- packages/loot-core/src/server/sync/repair.js | 3 +-- .../loot-core/src/server/sync/sync.property.test.js | 2 +- packages/loot-core/src/server/sync/sync.test.js | 3 ++- packages/loot-core/src/server/tests/mockSyncServer.js | 4 ++-- packages/loot-core/src/server/undo.js | 2 +- 20 files changed, 36 insertions(+), 31 deletions(-) mode change 100755 => 100644 packages/loot-core/bin/get-db-schema create mode 100644 packages/loot-core/src/server/crdt/index.js rename packages/loot-core/src/server/{ => crdt}/merkle.js (100%) rename packages/loot-core/src/server/{ => crdt}/merkle.test.js (99%) rename packages/loot-core/src/server/{ => crdt}/timestamp.js (98%) rename packages/loot-core/src/server/{ => crdt}/timestamp.test.js (99%) diff --git a/packages/loot-core/bin/get-db-schema b/packages/loot-core/bin/get-db-schema old mode 100755 new mode 100644 index f419e7045..2e17a5cec --- a/packages/loot-core/bin/get-db-schema +++ b/packages/loot-core/bin/get-db-schema @@ -3,7 +3,6 @@ process.env.LOOT_DATA_DIR = __dirname + '/../../../../data'; import * as sqlite from '../platform/server/sqlite'; import * as db from '../server/db'; import { getMessages } from '../server/sync'; -import Timestamp from '../server/timestamp'; let dbPath = process.argv[2]; let tables = [ diff --git a/packages/loot-core/bin/profile-sql.js b/packages/loot-core/bin/profile-sql.js index ac1c0839e..484202587 100755 --- a/packages/loot-core/bin/profile-sql.js +++ b/packages/loot-core/bin/profile-sql.js @@ -4,7 +4,6 @@ import os from 'os'; import * as sqlite from '../src/platform/server/sqlite'; import * as db from '../src/server/db'; import { batchMessages, setSyncingMode } from '../src/server/sync'; -import Timestamp from '../src/server/timestamp'; import { runQuery } from '../src/server/aql/schema/run-query'; import asyncStorage from '../src/platform/server/asyncStorage'; import { makeChild } from '../src/shared/transactions'; diff --git a/packages/loot-core/src/server/api.js b/packages/loot-core/src/server/api.js index 6c538cad4..460fa5802 100644 --- a/packages/loot-core/src/server/api.js +++ b/packages/loot-core/src/server/api.js @@ -17,7 +17,7 @@ import * as prefs from './prefs'; import * as monthUtils from '../shared/months'; import * as cloudStorage from './cloud-storage'; import { setSyncingMode, batchMessages } from './sync'; -import { getClock } from './timestamp'; +import { getClock } from './crdt'; import { runMutator } from './mutators'; import { integerToAmount } from '../shared/util'; import { runQuery as aqlQuery } from './aql/schema/run-query'; diff --git a/packages/loot-core/src/server/aql/schema/executors.test.js b/packages/loot-core/src/server/aql/schema/executors.test.js index ba3f0a383..0bd4a1ab3 100644 --- a/packages/loot-core/src/server/aql/schema/executors.test.js +++ b/packages/loot-core/src/server/aql/schema/executors.test.js @@ -2,7 +2,7 @@ import fc from 'fast-check'; import * as db from '../../db'; import query from '../../../shared/query'; import { batchMessages, setSyncingMode } from '../../sync/index'; -import { setClock } from '../../timestamp'; +import { setClock } from '../../crdt'; import { groupById } from '../../../shared/util'; import arbs from '../../../mocks/arbitrary-schema'; import { runQuery } from './run-query'; diff --git a/packages/loot-core/src/server/crdt/index.js b/packages/loot-core/src/server/crdt/index.js new file mode 100644 index 000000000..a62ee7991 --- /dev/null +++ b/packages/loot-core/src/server/crdt/index.js @@ -0,0 +1,4 @@ +import * as merkle from "./merkle"; + +export { merkle }; +export { getClock, setClock, makeClock, makeClientId, serializeClock, deserializeClock, Timestamp } from "./timestamp" diff --git a/packages/loot-core/src/server/merkle.js b/packages/loot-core/src/server/crdt/merkle.js similarity index 100% rename from packages/loot-core/src/server/merkle.js rename to packages/loot-core/src/server/crdt/merkle.js diff --git a/packages/loot-core/src/server/merkle.test.js b/packages/loot-core/src/server/crdt/merkle.test.js similarity index 99% rename from packages/loot-core/src/server/merkle.test.js rename to packages/loot-core/src/server/crdt/merkle.test.js index 41e4b78da..f7bef4d7d 100644 --- a/packages/loot-core/src/server/merkle.test.js +++ b/packages/loot-core/src/server/crdt/merkle.test.js @@ -1,5 +1,5 @@ import * as merkle from './merkle'; -import Timestamp from './timestamp'; +import { Timestamp } from './timestamp'; function pretty(n) { if (n < 60) { diff --git a/packages/loot-core/src/server/timestamp.js b/packages/loot-core/src/server/crdt/timestamp.js similarity index 98% rename from packages/loot-core/src/server/timestamp.js rename to packages/loot-core/src/server/crdt/timestamp.js index 39bae07da..b78a1610a 100644 --- a/packages/loot-core/src/server/timestamp.js +++ b/packages/loot-core/src/server/crdt/timestamp.js @@ -1,5 +1,5 @@ import murmurhash from 'murmurhash'; -const uuid = require('../platform/uuid'); +const uuid = require('../../platform/uuid'); /** * Hybrid Unique Logical Clock (HULC) timestamp generator @@ -81,7 +81,7 @@ const MAX_NODE_LENGTH = 16; /** * timestamp instance class */ -export default class Timestamp { +export class Timestamp { constructor(millis, counter, node) { this._state = { millis: millis, @@ -124,7 +124,7 @@ export default class Timestamp { } } -export class MutableTimestamp extends Timestamp { +class MutableTimestamp extends Timestamp { setMillis(n) { this._state.millis = n; } diff --git a/packages/loot-core/src/server/timestamp.test.js b/packages/loot-core/src/server/crdt/timestamp.test.js similarity index 99% rename from packages/loot-core/src/server/timestamp.test.js rename to packages/loot-core/src/server/crdt/timestamp.test.js index 0a1d99431..a9c04fab9 100644 --- a/packages/loot-core/src/server/timestamp.test.js +++ b/packages/loot-core/src/server/crdt/timestamp.test.js @@ -1,4 +1,4 @@ -import Timestamp from './timestamp'; +import { Timestamp } from './timestamp'; describe('Timestamp', function() { let now = 0; diff --git a/packages/loot-core/src/server/db/index.js b/packages/loot-core/src/server/db/index.js index 1ffdf3363..249ec845b 100644 --- a/packages/loot-core/src/server/db/index.js +++ b/packages/loot-core/src/server/db/index.js @@ -11,13 +11,14 @@ import { payeeRuleModel } from '../models'; import { groupById } from '../../shared/util'; -import Timestamp, { +import { makeClock, setClock, serializeClock, deserializeClock, - makeClientId -} from '../timestamp'; + makeClientId, + Timestamp +} from '../crdt'; import { convertForInsert, convertForUpdate, diff --git a/packages/loot-core/src/server/main.js b/packages/loot-core/src/server/main.js index ada202d61..cbda0e7fb 100644 --- a/packages/loot-core/src/server/main.js +++ b/packages/loot-core/src/server/main.js @@ -30,8 +30,7 @@ import * as bankSync from './accounts/sync'; import * as link from './accounts/link'; import { uniqueFileName, idFromFileName } from './util/budget-name'; import { mutator, runHandler } from './mutators'; -import * as timestamp from './timestamp'; -import * as merkle from './merkle'; +import { getClock, setClock, makeClock, makeClientId, serializeClock, deserializeClock, Timestamp, merkle } from './crdt'; import { initialFullSync, fullSync, @@ -1968,10 +1967,10 @@ async function loadBudget(id, appVersion, { showUpdate } = {}) { // // TODO: The client id should be stored elsewhere. It shouldn't // work this way, but it's fine for now. - timestamp.getClock().timestamp.setNode(timestamp.makeClientId()); + getClock().timestamp.setNode(makeClientId()); await db.runQuery( 'INSERT OR REPLACE INTO messages_clock (id, clock) VALUES (1, ?)', - [timestamp.serializeClock(timestamp.getClock())] + [serializeClock(getClock())] ); await prefs.savePrefs({ resetClock: false }); @@ -2253,7 +2252,9 @@ export const lib = { // Expose CRDT mechanisms so server can use them merkle, - timestamp, + timestamp: { + getClock, setClock, makeClock, makeClientId, serializeClock, deserializeClock, Timestamp + }, SyncProtoBuf: SyncPb }; diff --git a/packages/loot-core/src/server/main.test.js b/packages/loot-core/src/server/main.test.js index a67f0bbfe..3edc1d451 100644 --- a/packages/loot-core/src/server/main.test.js +++ b/packages/loot-core/src/server/main.test.js @@ -3,7 +3,7 @@ import * as prefs from './prefs'; import * as db from './db'; import * as budget from './budget/base'; import * as monthUtils from '../shared/months'; -import { getClock, deserializeClock } from './timestamp'; +import { getClock, deserializeClock } from './crdt'; import { runHandler, runMutator, diff --git a/packages/loot-core/src/server/prefs.js b/packages/loot-core/src/server/prefs.js index c88b33627..fb7df9165 100644 --- a/packages/loot-core/src/server/prefs.js +++ b/packages/loot-core/src/server/prefs.js @@ -1,5 +1,5 @@ import { sendMessages } from './sync'; -import Timestamp from './timestamp'; +import { Timestamp } from './crdt'; const fs = require('../platform/server/fs'); let prefs = null; diff --git a/packages/loot-core/src/server/sync/index.js b/packages/loot-core/src/server/sync/index.js index e26975310..0e91185c8 100644 --- a/packages/loot-core/src/server/sync/index.js +++ b/packages/loot-core/src/server/sync/index.js @@ -11,12 +11,13 @@ import { triggerBudgetChanges, setType as setBudgetType } from '../budget/base'; import * as undo from '../undo'; import { runMutator } from '../mutators'; import { setIn, getIn } from '../../shared/util'; -import Timestamp, { +import { serializeClock, deserializeClock, - getClock -} from '../timestamp'; -import * as merkle from '../merkle'; + getClock, + Timestamp, + merkle +} from '../crdt'; import * as encoder from './encoder'; import { getServer } from '../server-config'; import { rebuildMerkleHash } from './repair'; diff --git a/packages/loot-core/src/server/sync/migrate.js b/packages/loot-core/src/server/sync/migrate.js index 394a8ec33..40fcaa3d9 100644 --- a/packages/loot-core/src/server/sync/migrate.js +++ b/packages/loot-core/src/server/sync/migrate.js @@ -1,5 +1,5 @@ import { addSyncListener, applyMessages } from './index'; -import Timestamp from '../timestamp'; +import { Timestamp } from '../crdt'; function migrateParentIds(oldValues, newValues) { newValues.forEach((items, table) => { diff --git a/packages/loot-core/src/server/sync/repair.js b/packages/loot-core/src/server/sync/repair.js index 50b16b71b..9ebedd8c2 100644 --- a/packages/loot-core/src/server/sync/repair.js +++ b/packages/loot-core/src/server/sync/repair.js @@ -1,6 +1,5 @@ import * as db from '../db'; -import Timestamp, { serializeClock, getClock } from '../timestamp'; -import * as merkle from '../merkle'; +import { serializeClock, getClock, Timestamp, merkle } from '../crdt'; export function rebuildMerkleHash() { let rows = db.runQuery('SELECT timestamp FROM messages_crdt', [], true); diff --git a/packages/loot-core/src/server/sync/sync.property.test.js b/packages/loot-core/src/server/sync/sync.property.test.js index 7239ad7b1..66a8c7d32 100644 --- a/packages/loot-core/src/server/sync/sync.property.test.js +++ b/packages/loot-core/src/server/sync/sync.property.test.js @@ -2,7 +2,7 @@ import * as prefs from '../prefs'; import * as db from '../db'; import * as sheet from '../sheet'; import * as sync from './index'; -import Timestamp, { getClock } from '../timestamp'; +import { getClock, Timestamp } from '../crdt'; import * as merkle from '../merkle'; import * as encoder from './encoder'; const jsc = require('jsverify'); diff --git a/packages/loot-core/src/server/sync/sync.test.js b/packages/loot-core/src/server/sync/sync.test.js index f4018a82d..575a7e832 100644 --- a/packages/loot-core/src/server/sync/sync.test.js +++ b/packages/loot-core/src/server/sync/sync.test.js @@ -1,7 +1,8 @@ import * as prefs from '../prefs'; import * as db from '../db'; import * as sheet from '../sheet'; -import Timestamp, { getClock } from '../timestamp'; +import { getClock, Timestamp } from '../crdt'; +import { resolveName } from '../spreadsheet/util'; import { setSyncingMode, sendMessages, applyMessages, fullSync } from './index'; import * as encoder from './encoder'; const mockSyncServer = require('../tests/mockSyncServer'); diff --git a/packages/loot-core/src/server/tests/mockSyncServer.js b/packages/loot-core/src/server/tests/mockSyncServer.js index 4e221a673..ceb12d7b9 100644 --- a/packages/loot-core/src/server/tests/mockSyncServer.js +++ b/packages/loot-core/src/server/tests/mockSyncServer.js @@ -1,5 +1,5 @@ -import * as merkle from '../merkle'; -import Timestamp, { makeClock } from '../timestamp'; +import dateFns from 'date-fns'; +import { makeClock, Timestamp, merkle } from '../crdt'; const defaultMockData = require('./mockData').basic; const SyncPb = require('../sync/proto/sync_pb'); diff --git a/packages/loot-core/src/server/undo.js b/packages/loot-core/src/server/undo.js index a6525b21e..bc96741c7 100644 --- a/packages/loot-core/src/server/undo.js +++ b/packages/loot-core/src/server/undo.js @@ -1,6 +1,6 @@ import { sendMessages } from './sync'; import { getIn } from '../shared/util'; -import Timestamp from './timestamp'; +import { Timestamp } from './crdt'; import { withMutatorContext, getMutatorContext } from './mutators'; const connection = require('../platform/server/connection'); -- GitLab