🚀 Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more
Socket
Book a DemoInstallSign in
Socket

cojson-storage-sqlite

Package Overview
Dependencies
Maintainers
1
Versions
178
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

cojson-storage-sqlite - npm Package Compare versions

Comparing version

to
0.13.29

12

CHANGELOG.md
# cojson-storage-sqlite
## 0.13.29
### Patch Changes
- 91e0c09: Use a sync storage manager instead of an async one
- Updated dependencies [e2d6ba3]
- Updated dependencies [eef1a5d]
- Updated dependencies [191ae38]
- Updated dependencies [daee7b9]
- cojson-storage@0.13.29
- cojson@0.13.29
## 0.13.28

@@ -4,0 +16,0 @@

4

dist/sqliteClient.d.ts
import type { Database as DatabaseT } from "better-sqlite3";
import { type CojsonInternalTypes, type OutgoingSyncQueue, type SessionID } from "cojson";
import type { DBClientInterface, SessionRow, SignatureAfterRow, StoredCoValueRow, StoredSessionRow, TransactionRow } from "cojson-storage";
import type { DBClientInterfaceSync, SessionRow, SignatureAfterRow, StoredCoValueRow, StoredSessionRow, TransactionRow } from "cojson-storage";
type RawCoID = CojsonInternalTypes.RawCoID;

@@ -17,3 +17,3 @@ type Signature = CojsonInternalTypes.Signature;

export declare function getErrorMessage(error: unknown): string;
export declare class SQLiteClient implements DBClientInterface {
export declare class SQLiteClient implements DBClientInterfaceSync {
private readonly db;

@@ -20,0 +20,0 @@ private readonly toLocalNode;

import Database from "better-sqlite3";
import { cojsonInternals, logger, } from "cojson";
import { SyncManager } from "cojson-storage";
import { StorageManagerSync } from "cojson-storage";
import { SQLiteClient } from "./sqliteClient.js";

@@ -8,5 +8,6 @@ export class SQLiteNode {

this.dbClient = new SQLiteClient(db, toLocalNode);
this.syncManager = new SyncManager(this.dbClient, toLocalNode);
this.syncManager = new StorageManagerSync(this.dbClient, toLocalNode);
const processMessages = async () => {
let lastTimer = performance.now();
let runningTimer = false;
for await (const msg of fromLocalNode) {

@@ -17,5 +18,12 @@ try {

}
await this.syncManager.handleSyncMessage(msg);
// Since better-sqlite3 is synchronous there may be the case
// where a bulk of messages are processed using only microtasks
if (!runningTimer) {
runningTimer = true;
lastTimer = performance.now();
setTimeout(() => {
runningTimer = false;
}, 10);
}
this.syncManager.handleSyncMessage(msg);
// Since the DB APIs are synchronous there may be the case
// where a bulk of messages are processed without interruptions
// which may block other peers from sending messages.

@@ -22,0 +30,0 @@ // To avoid this we schedule a timer to downgrade the priority of the storage peer work

@@ -6,3 +6,3 @@ import { randomUUID } from "node:crypto";

import { LocalNode, cojsonInternals } from "cojson";
import { SyncManager } from "cojson-storage";
import { StorageManagerSync } from "cojson-storage";
import { WasmCrypto } from "cojson/crypto/WasmCrypto";

@@ -74,5 +74,6 @@ import { expect, onTestFinished, test, vi } from "vitest";

"storage -> CONTENT Group header: true new: After: 0 New: 3",
"client -> KNOWN Group sessions: header/3",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/3",
"client -> KNOWN Map sessions: header/1",
]

@@ -126,8 +127,9 @@ `);

"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
"client -> KNOWN ParentGroup sessions: header/4",
"storage -> KNOWN Group sessions: header/5",
"storage -> CONTENT Group header: true new: After: 0 New: 5",
"client -> KNOWN ParentGroup sessions: header/4",
"client -> KNOWN Group sessions: header/5",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/5",
"client -> KNOWN Map sessions: header/1",
]

@@ -171,8 +173,8 @@ `);

"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
"client -> KNOWN ParentGroup sessions: header/4",
"storage -> KNOWN Group sessions: header/5",
"storage -> CONTENT Group header: true new: After: 0 New: 5",
"client -> KNOWN ParentGroup sessions: header/4",
"client -> KNOWN Group sessions: header/5",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/5",
"client -> KNOWN Map sessions: header/1",

@@ -197,3 +199,3 @@ "client -> LOAD MapFromParent sessions: empty",

const mock = vi
.spyOn(SyncManager.prototype, "handleSyncMessage")
.spyOn(StorageManagerSync.prototype, "handleSyncMessage")
.mockImplementation(() => Promise.resolve());

@@ -244,5 +246,6 @@ map.set("1", 1);

"storage -> CONTENT Group header: true new: After: 0 New: 3",
"client -> KNOWN Group sessions: header/3",
"storage -> KNOWN Map sessions: header/4",
"storage -> CONTENT Map header: true new: After: 0 New: 4",
"client -> KNOWN Group sessions: header/3",
"client -> KNOWN Map sessions: header/4",
]

@@ -264,5 +267,5 @@ `);

serverNode.syncManager.addPeer(clientPeer);
const handleSyncMessage = SyncManager.prototype.handleSyncMessage;
const handleSyncMessage = StorageManagerSync.prototype.handleSyncMessage;
const mock = vi
.spyOn(SyncManager.prototype, "handleSyncMessage")
.spyOn(StorageManagerSync.prototype, "handleSyncMessage")
.mockImplementation(function (msg) {

@@ -269,0 +272,0 @@ if (msg.action === "content" &&

@@ -1,8 +0,8 @@

import { SyncManager } from "cojson-storage";
import { StorageManagerSync } from "cojson-storage";
import { onTestFinished } from "vitest";
export function trackMessages(node) {
const messages = [];
const originalHandleSyncMessage = SyncManager.prototype.handleSyncMessage;
const originalHandleSyncMessage = StorageManagerSync.prototype.handleSyncMessage;
const originalNodeSyncMessage = node.syncManager.handleSyncMessage;
SyncManager.prototype.handleSyncMessage = async function (msg) {
StorageManagerSync.prototype.handleSyncMessage = async function (msg) {
messages.push({

@@ -22,3 +22,3 @@ from: "client",

const restore = () => {
SyncManager.prototype.handleSyncMessage = originalHandleSyncMessage;
StorageManagerSync.prototype.handleSyncMessage = originalHandleSyncMessage;
node.syncManager.handleSyncMessage = originalNodeSyncMessage;

@@ -25,0 +25,0 @@ };

{
"name": "cojson-storage-sqlite",
"type": "module",
"version": "0.13.28",
"version": "0.13.29",
"main": "dist/index.js",

@@ -10,4 +10,4 @@ "types": "dist/index.d.ts",

"better-sqlite3": "^11.7.0",
"cojson": "0.13.28",
"cojson-storage": "0.13.28"
"cojson": "0.13.29",
"cojson-storage": "0.13.29"
},

@@ -14,0 +14,0 @@ "devDependencies": {

@@ -9,3 +9,3 @@ import type { Database as DatabaseT } from "better-sqlite3";

import type {
DBClientInterface,
DBClientInterfaceSync,
SessionRow,

@@ -37,3 +37,3 @@ SignatureAfterRow,

export class SQLiteClient implements DBClientInterface {
export class SQLiteClient implements DBClientInterfaceSync {
private readonly db: DatabaseT;

@@ -40,0 +40,0 @@ private readonly toLocalNode: OutgoingSyncQueue;

@@ -9,7 +9,7 @@ import Database, { type Database as DatabaseT } from "better-sqlite3";

} from "cojson";
import { SyncManager, type TransactionRow } from "cojson-storage";
import { StorageManagerSync, type TransactionRow } from "cojson-storage";
import { SQLiteClient } from "./sqliteClient.js";
export class SQLiteNode {
private readonly syncManager: SyncManager;
private readonly syncManager: StorageManagerSync;
private readonly dbClient: SQLiteClient;

@@ -23,6 +23,7 @@

this.dbClient = new SQLiteClient(db, toLocalNode);
this.syncManager = new SyncManager(this.dbClient, toLocalNode);
this.syncManager = new StorageManagerSync(this.dbClient, toLocalNode);
const processMessages = async () => {
let lastTimer = performance.now();
let runningTimer = false;

@@ -34,6 +35,15 @@ for await (const msg of fromLocalNode) {

}
await this.syncManager.handleSyncMessage(msg);
// Since better-sqlite3 is synchronous there may be the case
// where a bulk of messages are processed using only microtasks
if (!runningTimer) {
runningTimer = true;
lastTimer = performance.now();
setTimeout(() => {
runningTimer = false;
}, 10);
}
this.syncManager.handleSyncMessage(msg);
// Since the DB APIs are synchronous there may be the case
// where a bulk of messages are processed without interruptions
// which may block other peers from sending messages.

@@ -40,0 +50,0 @@

@@ -6,3 +6,3 @@ import { randomUUID } from "node:crypto";

import { LocalNode, cojsonInternals } from "cojson";
import { SyncManager } from "cojson-storage";
import { StorageManagerSync } from "cojson-storage";
import { WasmCrypto } from "cojson/crypto/WasmCrypto";

@@ -123,5 +123,6 @@ import { expect, onTestFinished, test, vi } from "vitest";

"storage -> CONTENT Group header: true new: After: 0 New: 3",
"client -> KNOWN Group sessions: header/3",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/3",
"client -> KNOWN Map sessions: header/1",
]

@@ -213,8 +214,9 @@ `);

"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
"client -> KNOWN ParentGroup sessions: header/4",
"storage -> KNOWN Group sessions: header/5",
"storage -> CONTENT Group header: true new: After: 0 New: 5",
"client -> KNOWN ParentGroup sessions: header/4",
"client -> KNOWN Group sessions: header/5",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/5",
"client -> KNOWN Map sessions: header/1",
]

@@ -289,8 +291,8 @@ `);

"storage -> CONTENT ParentGroup header: true new: After: 0 New: 4",
"client -> KNOWN ParentGroup sessions: header/4",
"storage -> KNOWN Group sessions: header/5",
"storage -> CONTENT Group header: true new: After: 0 New: 5",
"client -> KNOWN ParentGroup sessions: header/4",
"client -> KNOWN Group sessions: header/5",
"storage -> KNOWN Map sessions: header/1",
"storage -> CONTENT Map header: true new: After: 0 New: 1",
"client -> KNOWN Group sessions: header/5",
"client -> KNOWN Map sessions: header/1",

@@ -329,3 +331,3 @@ "client -> LOAD MapFromParent sessions: empty",

const mock = vi
.spyOn(SyncManager.prototype, "handleSyncMessage")
.spyOn(StorageManagerSync.prototype, "handleSyncMessage")
.mockImplementation(() => Promise.resolve());

@@ -405,5 +407,6 @@

"storage -> CONTENT Group header: true new: After: 0 New: 3",
"client -> KNOWN Group sessions: header/3",
"storage -> KNOWN Map sessions: header/4",
"storage -> CONTENT Map header: true new: After: 0 New: 4",
"client -> KNOWN Group sessions: header/3",
"client -> KNOWN Map sessions: header/4",
]

@@ -439,7 +442,7 @@ `);

const handleSyncMessage = SyncManager.prototype.handleSyncMessage;
const handleSyncMessage = StorageManagerSync.prototype.handleSyncMessage;
const mock = vi
.spyOn(SyncManager.prototype, "handleSyncMessage")
.mockImplementation(function (this: SyncManager, msg) {
.spyOn(StorageManagerSync.prototype, "handleSyncMessage")
.mockImplementation(function (this: StorageManagerSync, msg) {
if (

@@ -446,0 +449,0 @@ msg.action === "content" &&

import type { LocalNode, SyncMessage } from "cojson";
import { SyncManager } from "cojson-storage";
import { StorageManagerSync } from "cojson-storage";
import { onTestFinished } from "vitest";

@@ -11,6 +11,7 @@

const originalHandleSyncMessage = SyncManager.prototype.handleSyncMessage;
const originalHandleSyncMessage =
StorageManagerSync.prototype.handleSyncMessage;
const originalNodeSyncMessage = node.syncManager.handleSyncMessage;
SyncManager.prototype.handleSyncMessage = async function (msg) {
StorageManagerSync.prototype.handleSyncMessage = async function (msg) {
messages.push({

@@ -32,3 +33,3 @@ from: "client",

const restore = () => {
SyncManager.prototype.handleSyncMessage = originalHandleSyncMessage;
StorageManagerSync.prototype.handleSyncMessage = originalHandleSyncMessage;
node.syncManager.handleSyncMessage = originalNodeSyncMessage;

@@ -35,0 +36,0 @@ };

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet