supastash 0.2.4 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/desktop/utils/sync/pullFromRemote/updateLocalDb.d.ts.map +1 -1
- package/dist/desktop/utils/sync/pullFromRemote/updateLocalDb.js +1 -2
- package/dist/native/utils/sync/pullFromRemote/updateLocalDb.d.ts.map +1 -1
- package/dist/native/utils/sync/pullFromRemote/updateLocalDb.js +1 -0
- package/dist/shared/db/adapters/tauri.d.ts.map +1 -1
- package/dist/shared/db/adapters/tauri.js +4 -0
- package/dist/shared/utils/schema/createSyncStatus.d.ts +5 -3
- package/dist/shared/utils/schema/createSyncStatus.d.ts.map +1 -1
- package/dist/shared/utils/schema/createSyncStatus.js +29 -23
- package/dist/shared/utils/sync/pushLocal/deleteChunks.d.ts.map +1 -1
- package/dist/shared/utils/sync/pushLocal/deleteChunks.js +5 -7
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../../src/desktop/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAiB7E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,EAAE,EAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAmGhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AACF,wBAAsB,eAAe,CAAC,EACpC,EAAE,EACF,KAAK,EACL,OAAO,GACR,EAAE;IACD,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../../src/desktop/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAiB7E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,EAAE,EAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAmGhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AACF,wBAAsB,eAAe,CAAC,EACpC,EAAE,EACF,KAAK,EACL,OAAO,GACR,EAAE;IACD,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8FhB"}
|
|
@@ -211,7 +211,6 @@ export async function upsertChunkData({ tx, table, records, }) {
|
|
|
211
211
|
const slice = incomingIds.slice(i, i + CHUNK_SIZE);
|
|
212
212
|
const placeholders = slice.map(() => "?").join(", ");
|
|
213
213
|
const rows = await db.getAllAsync(`SELECT id, updated_at FROM ${table} WHERE id IN (${placeholders})`, slice);
|
|
214
|
-
console.log("rows", rows.length);
|
|
215
214
|
for (const row of rows ?? []) {
|
|
216
215
|
localStamp.set(row.id, row.updated_at ?? null);
|
|
217
216
|
}
|
|
@@ -228,7 +227,6 @@ export async function upsertChunkData({ tx, table, records, }) {
|
|
|
228
227
|
return true;
|
|
229
228
|
return new Date(remoteUpdated) > new Date(localUpdated);
|
|
230
229
|
});
|
|
231
|
-
console.log("toUpsert", toUpsert.length);
|
|
232
230
|
if (!toUpsert.length)
|
|
233
231
|
return;
|
|
234
232
|
// Step 3: Build INSERT … ON CONFLICT(id) DO UPDATE in param-limit-safe chunks
|
|
@@ -260,6 +258,7 @@ export async function upsertChunkData({ tx, table, records, }) {
|
|
|
260
258
|
}
|
|
261
259
|
catch (error) {
|
|
262
260
|
logError(`[Supastash] Error upserting chunk for ${table}`, error);
|
|
261
|
+
throw error;
|
|
263
262
|
}
|
|
264
263
|
}
|
|
265
264
|
if (successfulIds.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../../src/native/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAiB7E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,EAAE,EAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAkGhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AACF,wBAAsB,eAAe,CAAC,EACpC,EAAE,EACF,KAAK,EACL,OAAO,GACR,EAAE;IACD,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"updateLocalDb.d.ts","sourceRoot":"","sources":["../../../../../src/native/utils/sync/pullFromRemote/updateLocalDb.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAiB7E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,eAAe,EAAE,EAC3B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,iBAkGhD;AAID;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,EAC/B,EAAE,EACF,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqElC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;EAyBE;AACF,wBAAsB,eAAe,CAAC,EACpC,EAAE,EACF,KAAK,EACL,OAAO,GACR,EAAE;IACD,EAAE,CAAC,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,CAAC;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../../../src/shared/db/adapters/tauri.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,iBAAiB,EAClB,MAAM,mCAAmC,CAAC;AAG3C,eAAO,MAAM,kBAAkB,EAAE,sBAAsB,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tauri.d.ts","sourceRoot":"","sources":["../../../../src/shared/db/adapters/tauri.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,iBAAiB,EAClB,MAAM,mCAAmC,CAAC;AAG3C,eAAO,MAAM,kBAAkB,EAAE,sBAAsB,CAAC,iBAAiB,CAsJxE,CAAC"}
|
|
@@ -2,6 +2,10 @@ import { interpolate, namedToPositional } from "../normalizer";
|
|
|
2
2
|
export const SQLiteAdapterTauri = {
|
|
3
3
|
async openDatabaseAsync(name, sqliteClient) {
|
|
4
4
|
const db = await sqliteClient.load(`sqlite:${name}`);
|
|
5
|
+
// Enable WAL mode for concurrent read/write and set a busy timeout so
|
|
6
|
+
// writers wait instead of immediately returning SQLITE_BUSY (code 5).
|
|
7
|
+
await db.execute("PRAGMA journal_mode=WAL;", []);
|
|
8
|
+
await db.execute("PRAGMA busy_timeout=5000;", []);
|
|
5
9
|
const normalizeParams = (params) => {
|
|
6
10
|
return (params ?? []).map((v) => typeof v === "boolean" ? (v ? 1 : 0) : v);
|
|
7
11
|
};
|
|
@@ -11,9 +11,11 @@ export declare const ADD_PK_TO_SYNC_MARKS_SQL = "\n ALTER TABLE supastash_sync_
|
|
|
11
11
|
export declare const INDEX_SYNC_MARKS_SQL = "\n CREATE INDEX IF NOT EXISTS idx_supastash_marks_updated\n ON supastash_sync_marks(updated_at);\n";
|
|
12
12
|
export declare const INDEX_SERVER_SYNC_MARKS_SQL = "\n CREATE INDEX IF NOT EXISTS idx_supastash_server_marks_updated\n ON supastash_server_sync_marks(updated_at);\n";
|
|
13
13
|
/**
|
|
14
|
-
* Creates the supastash_sync_marks table if it doesn't exist
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* Creates the supastash_sync_marks table if it doesn't exist.
|
|
15
|
+
* Guarded by a singleton promise so concurrent callers share one
|
|
16
|
+
* initialization pass instead of racing on DDL writes.
|
|
17
17
|
*/
|
|
18
18
|
export declare function createSyncStatusTable(): Promise<void>;
|
|
19
|
+
/** Reset the singleton (useful for tests or after closeSupastashDb). */
|
|
20
|
+
export declare function resetSyncStatusTableCache(): void;
|
|
19
21
|
//# sourceMappingURL=createSyncStatus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createSyncStatus.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/schema/createSyncStatus.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,wBAAwB,kBAE7C;AAED,eAAO,MAAM,sBAAsB,0ZAUhC,CAAC;AAEJ,eAAO,MAAM,6BAA6B,6eAezC,CAAC;AAEF,eAAO,MAAM,wBAAwB,mFAEpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,2GAGhC,CAAC;AAEF,eAAO,MAAM,2BAA2B,yHAGvC,CAAC;AAIF;;;;GAIG;AACH,wBAAsB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"createSyncStatus.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/schema/createSyncStatus.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,wBAAwB,kBAE7C;AAED,eAAO,MAAM,sBAAsB,0ZAUhC,CAAC;AAEJ,eAAO,MAAM,6BAA6B,6eAezC,CAAC;AAEF,eAAO,MAAM,wBAAwB,mFAEpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,2GAGhC,CAAC;AAEF,eAAO,MAAM,2BAA2B,yHAGvC,CAAC;AAIF;;;;GAIG;AACH,wBAAsB,qBAAqB,kBAuB1C;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,SAExC"}
|
|
@@ -47,30 +47,36 @@ export const INDEX_SERVER_SYNC_MARKS_SQL = `
|
|
|
47
47
|
CREATE INDEX IF NOT EXISTS idx_supastash_server_marks_updated
|
|
48
48
|
ON supastash_server_sync_marks(updated_at);
|
|
49
49
|
`;
|
|
50
|
-
let
|
|
50
|
+
let syncStatusTablePromise = null;
|
|
51
51
|
/**
|
|
52
|
-
* Creates the supastash_sync_marks table if it doesn't exist
|
|
53
|
-
*
|
|
54
|
-
*
|
|
52
|
+
* Creates the supastash_sync_marks table if it doesn't exist.
|
|
53
|
+
* Guarded by a singleton promise so concurrent callers share one
|
|
54
|
+
* initialization pass instead of racing on DDL writes.
|
|
55
55
|
*/
|
|
56
56
|
export async function createSyncStatusTable() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
await
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
57
|
+
if (syncStatusTablePromise)
|
|
58
|
+
return syncStatusTablePromise;
|
|
59
|
+
syncStatusTablePromise = (async () => {
|
|
60
|
+
const db = await getSupastashDb();
|
|
61
|
+
const cfg = getSupastashConfig();
|
|
62
|
+
if (cfg.replicationMode === "server-side") {
|
|
63
|
+
await db.execAsync(SERVER_SYNC_STATUS_TABLES_SQL);
|
|
64
|
+
await db.execAsync(INDEX_SERVER_SYNC_MARKS_SQL);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
await db.execAsync(SYNC_STATUS_TABLES_SQL);
|
|
68
|
+
await db.execAsync(INDEX_SYNC_MARKS_SQL);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
await db.execAsync(ADD_PK_TO_SYNC_MARKS_SQL);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Ignore — column already exists
|
|
75
|
+
}
|
|
76
|
+
})();
|
|
77
|
+
return syncStatusTablePromise;
|
|
78
|
+
}
|
|
79
|
+
/** Reset the singleton (useful for tests or after closeSupastashDb). */
|
|
80
|
+
export function resetSyncStatusTableCache() {
|
|
81
|
+
syncStatusTablePromise = null;
|
|
76
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deleteChunks.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/sync/pushLocal/deleteChunks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"deleteChunks.d.ts","sourceRoot":"","sources":["../../../../../src/shared/utils/sync/pushLocal/deleteChunks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA2DzD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,eAAe,EAAE,WAAW,EAAE,iBAc/B"}
|
|
@@ -12,13 +12,11 @@ const SQL_CHUNK = 999;
|
|
|
12
12
|
*/
|
|
13
13
|
async function permanentlyDeleteLocally(table, ids) {
|
|
14
14
|
const db = await getSupastashDb();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
});
|
|
15
|
+
for (let i = 0; i < ids.length; i += SQL_CHUNK) {
|
|
16
|
+
const slice = ids.slice(i, i + SQL_CHUNK);
|
|
17
|
+
const placeholders = slice.map(() => "?").join(", ");
|
|
18
|
+
await db.runAsync(`DELETE FROM ${table} WHERE id IN (${placeholders})`, slice);
|
|
19
|
+
}
|
|
22
20
|
}
|
|
23
21
|
/**
|
|
24
22
|
* Deletes a chunk of data from the remote database
|