@verdant-web/server 2.1.3 → 3.0.0-next.0
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/esm/ClientConnection.js.map +1 -1
- package/dist/esm/Presence.js.map +1 -1
- package/dist/esm/Profiles.js.map +1 -1
- package/dist/esm/ReplicaKeepaliveTimers.js.map +1 -1
- package/dist/esm/Server.js +29 -30
- package/dist/esm/Server.js.map +1 -1
- package/dist/esm/ServerLibrary.js +151 -127
- package/dist/esm/ServerLibrary.js.map +1 -1
- package/dist/esm/ServerLibrary.test.js +369 -0
- package/dist/esm/ServerLibrary.test.js.map +1 -0
- package/dist/esm/TokenVerifier.js.map +1 -1
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/storage/Storage.js +2 -0
- package/dist/esm/storage/Storage.js.map +1 -0
- package/dist/esm/storage/index.js +3 -0
- package/dist/esm/storage/index.js.map +1 -0
- package/dist/esm/storage/sql/SqlBaselines.js +101 -0
- package/dist/esm/storage/sql/SqlBaselines.js.map +1 -0
- package/dist/esm/storage/sql/SqlFileMetadata.js +69 -0
- package/dist/esm/storage/sql/SqlFileMetadata.js.map +1 -0
- package/dist/esm/storage/sql/SqlOperations.js +104 -0
- package/dist/esm/storage/sql/SqlOperations.js.map +1 -0
- package/dist/esm/storage/sql/SqlReplicas.js +163 -0
- package/dist/esm/storage/sql/SqlReplicas.js.map +1 -0
- package/dist/esm/storage/sql/migrations/v1.js +59 -0
- package/dist/esm/storage/sql/migrations/v1.js.map +1 -0
- package/dist/esm/storage/sql/migrations.js +3 -0
- package/dist/esm/storage/sql/migrations.js.map +1 -0
- package/dist/esm/storage/sql/sqlStorage.js +43 -0
- package/dist/esm/storage/sql/sqlStorage.js.map +1 -0
- package/dist/esm/storage/sql/tables.js +2 -0
- package/dist/esm/storage/sql/tables.js.map +1 -0
- package/package.json +20 -14
- package/src/Server.ts +37 -43
- package/src/ServerLibrary.test.ts +447 -0
- package/src/ServerLibrary.ts +239 -163
- package/src/storage/Storage.ts +118 -0
- package/src/storage/index.ts +2 -0
- package/src/storage/sql/SqlBaselines.ts +141 -0
- package/src/storage/sql/SqlFileMetadata.ts +94 -0
- package/src/storage/sql/SqlOperations.ts +149 -0
- package/src/storage/sql/SqlReplicas.ts +234 -0
- package/src/storage/sql/migrations/v1.ts +64 -0
- package/src/storage/sql/migrations.ts +3 -0
- package/src/storage/sql/sqlStorage.ts +59 -0
- package/src/storage/sql/tables.ts +45 -0
- package/src/types.ts +15 -4
- package/bin/server.mjs +0 -115
- package/dist/cjs/Baselines.d.ts +0 -16
- package/dist/cjs/Baselines.js +0 -128
- package/dist/cjs/Baselines.js.map +0 -1
- package/dist/cjs/ClientConnection.d.ts +0 -20
- package/dist/cjs/ClientConnection.js +0 -139
- package/dist/cjs/ClientConnection.js.map +0 -1
- package/dist/cjs/MessageSender.d.ts +0 -5
- package/dist/cjs/MessageSender.js +0 -3
- package/dist/cjs/MessageSender.js.map +0 -1
- package/dist/cjs/OperationHistory.d.ts +0 -36
- package/dist/cjs/OperationHistory.js +0 -165
- package/dist/cjs/OperationHistory.js.map +0 -1
- package/dist/cjs/Presence.d.ts +0 -15
- package/dist/cjs/Presence.js +0 -60
- package/dist/cjs/Presence.js.map +0 -1
- package/dist/cjs/Profiles.d.ts +0 -10
- package/dist/cjs/Profiles.js +0 -20
- package/dist/cjs/Profiles.js.map +0 -1
- package/dist/cjs/ReplicaKeepaliveTimers.d.ts +0 -17
- package/dist/cjs/ReplicaKeepaliveTimers.js +0 -31
- package/dist/cjs/ReplicaKeepaliveTimers.js.map +0 -1
- package/dist/cjs/Replicas.d.ts +0 -25
- package/dist/cjs/Replicas.js +0 -196
- package/dist/cjs/Replicas.js.map +0 -1
- package/dist/cjs/Server.d.ts +0 -167
- package/dist/cjs/Server.js +0 -552
- package/dist/cjs/Server.js.map +0 -1
- package/dist/cjs/ServerLibrary.d.ts +0 -65
- package/dist/cjs/ServerLibrary.js +0 -505
- package/dist/cjs/ServerLibrary.js.map +0 -1
- package/dist/cjs/TokenProvider.d.ts +0 -19
- package/dist/cjs/TokenProvider.js +0 -27
- package/dist/cjs/TokenProvider.js.map +0 -1
- package/dist/cjs/TokenVerifier.d.ts +0 -16
- package/dist/cjs/TokenVerifier.js +0 -40
- package/dist/cjs/TokenVerifier.js.map +0 -1
- package/dist/cjs/files/FileMetadata.d.ts +0 -28
- package/dist/cjs/files/FileMetadata.js +0 -69
- package/dist/cjs/files/FileMetadata.js.map +0 -1
- package/dist/cjs/files/FileStorage.d.ts +0 -35
- package/dist/cjs/files/FileStorage.js +0 -72
- package/dist/cjs/files/FileStorage.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -10
- package/dist/cjs/index.js +0 -12
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/migrations/v0.d.ts +0 -1
- package/dist/cjs/migrations/v0.js +0 -30
- package/dist/cjs/migrations/v0.js.map +0 -1
- package/dist/cjs/migrations/v1.d.ts +0 -1
- package/dist/cjs/migrations/v1.js +0 -32
- package/dist/cjs/migrations/v1.js.map +0 -1
- package/dist/cjs/migrations/v2.d.ts +0 -1
- package/dist/cjs/migrations/v2.js +0 -29
- package/dist/cjs/migrations/v2.js.map +0 -1
- package/dist/cjs/migrations/v3.d.ts +0 -1
- package/dist/cjs/migrations/v3.js +0 -15
- package/dist/cjs/migrations/v3.js.map +0 -1
- package/dist/cjs/migrations/v4.d.ts +0 -1
- package/dist/cjs/migrations/v4.js +0 -9
- package/dist/cjs/migrations/v4.js.map +0 -1
- package/dist/cjs/migrations/v5.d.ts +0 -2
- package/dist/cjs/migrations/v5.js +0 -37
- package/dist/cjs/migrations/v5.js.map +0 -1
- package/dist/cjs/migrations/v6.d.ts +0 -1
- package/dist/cjs/migrations/v6.js +0 -8
- package/dist/cjs/migrations/v6.js.map +0 -1
- package/dist/cjs/migrations/v7.d.ts +0 -1
- package/dist/cjs/migrations/v7.js +0 -10
- package/dist/cjs/migrations/v7.js.map +0 -1
- package/dist/cjs/migrations.d.ts +0 -6
- package/dist/cjs/migrations.js +0 -72
- package/dist/cjs/migrations.js.map +0 -1
- package/dist/cjs/migrations.test.d.ts +0 -1
- package/dist/cjs/migrations.test.js +0 -121
- package/dist/cjs/migrations.test.js.map +0 -1
- package/dist/cjs/types.d.ts +0 -38
- package/dist/cjs/types.js +0 -3
- package/dist/cjs/types.js.map +0 -1
- package/dist/esm/Baselines.d.ts +0 -16
- package/dist/esm/Baselines.js +0 -124
- package/dist/esm/Baselines.js.map +0 -1
- package/dist/esm/ClientConnection.d.ts +0 -20
- package/dist/esm/MessageSender.d.ts +0 -5
- package/dist/esm/OperationHistory.d.ts +0 -36
- package/dist/esm/OperationHistory.js +0 -161
- package/dist/esm/OperationHistory.js.map +0 -1
- package/dist/esm/Presence.d.ts +0 -15
- package/dist/esm/Profiles.d.ts +0 -10
- package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
- package/dist/esm/Replicas.d.ts +0 -25
- package/dist/esm/Replicas.js +0 -192
- package/dist/esm/Replicas.js.map +0 -1
- package/dist/esm/Server.d.ts +0 -167
- package/dist/esm/ServerLibrary.d.ts +0 -65
- package/dist/esm/TokenProvider.d.ts +0 -19
- package/dist/esm/TokenVerifier.d.ts +0 -16
- package/dist/esm/files/FileMetadata.d.ts +0 -28
- package/dist/esm/files/FileMetadata.js +0 -65
- package/dist/esm/files/FileMetadata.js.map +0 -1
- package/dist/esm/files/FileStorage.d.ts +0 -35
- package/dist/esm/index.d.ts +0 -10
- package/dist/esm/migrations/v0.d.ts +0 -1
- package/dist/esm/migrations/v0.js +0 -27
- package/dist/esm/migrations/v0.js.map +0 -1
- package/dist/esm/migrations/v1.d.ts +0 -1
- package/dist/esm/migrations/v1.js +0 -29
- package/dist/esm/migrations/v1.js.map +0 -1
- package/dist/esm/migrations/v2.d.ts +0 -1
- package/dist/esm/migrations/v2.js +0 -26
- package/dist/esm/migrations/v2.js.map +0 -1
- package/dist/esm/migrations/v3.d.ts +0 -1
- package/dist/esm/migrations/v3.js +0 -12
- package/dist/esm/migrations/v3.js.map +0 -1
- package/dist/esm/migrations/v4.d.ts +0 -1
- package/dist/esm/migrations/v4.js +0 -6
- package/dist/esm/migrations/v4.js.map +0 -1
- package/dist/esm/migrations/v5.d.ts +0 -2
- package/dist/esm/migrations/v5.js +0 -33
- package/dist/esm/migrations/v5.js.map +0 -1
- package/dist/esm/migrations/v6.d.ts +0 -1
- package/dist/esm/migrations/v6.js +0 -5
- package/dist/esm/migrations/v6.js.map +0 -1
- package/dist/esm/migrations/v7.d.ts +0 -1
- package/dist/esm/migrations/v7.js +0 -7
- package/dist/esm/migrations/v7.js.map +0 -1
- package/dist/esm/migrations.d.ts +0 -6
- package/dist/esm/migrations.js +0 -45
- package/dist/esm/migrations.js.map +0 -1
- package/dist/esm/migrations.test.d.ts +0 -1
- package/dist/esm/migrations.test.js +0 -116
- package/dist/esm/migrations.test.js.map +0 -1
- package/dist/esm/types.d.ts +0 -38
- package/dist/tsconfig-cjs.tsbuildinfo +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/Baselines.ts +0 -198
- package/src/OperationHistory.ts +0 -232
- package/src/Replicas.ts +0 -274
- package/src/files/FileMetadata.ts +0 -112
- package/src/migrations/v0.ts +0 -26
- package/src/migrations/v1.ts +0 -28
- package/src/migrations/v2.ts +0 -26
- package/src/migrations/v3.ts +0 -12
- package/src/migrations/v4.ts +0 -6
- package/src/migrations/v5.ts +0 -49
- package/src/migrations/v6.ts +0 -4
- package/src/migrations/v7.ts +0 -6
- package/src/migrations.test.ts +0 -133
- package/src/migrations.ts +0 -61
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const vitest_1 = require("vitest");
|
|
7
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
8
|
-
const migrations_js_1 = require("./migrations.js");
|
|
9
|
-
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
(0, vitest_1.describe)('the v5->v6 migration', () => {
|
|
11
|
-
let dbFile;
|
|
12
|
-
let db;
|
|
13
|
-
(0, vitest_1.beforeAll)(() => {
|
|
14
|
-
dbFile = `v5-migration-test-${Math.random()}.sqlite`;
|
|
15
|
-
db = (0, better_sqlite3_1.default)(dbFile);
|
|
16
|
-
});
|
|
17
|
-
(0, vitest_1.afterAll)(() => {
|
|
18
|
-
db.close();
|
|
19
|
-
fs_1.default.rmSync(dbFile);
|
|
20
|
-
});
|
|
21
|
-
(0, vitest_1.it)('rewrites legacy oids in all ops and baselines', () => {
|
|
22
|
-
// manually migrate to v4 before starting and seed the database with some
|
|
23
|
-
// operations and baselines.
|
|
24
|
-
(0, migrations_js_1.migrations)(db, 5);
|
|
25
|
-
// manually insert some operations and baselines
|
|
26
|
-
db.transaction(() => {
|
|
27
|
-
[
|
|
28
|
-
{
|
|
29
|
-
libraryId: 'test-1',
|
|
30
|
-
replicaId: 'foo',
|
|
31
|
-
oid: 'weirds/b',
|
|
32
|
-
data: {
|
|
33
|
-
op: 'set',
|
|
34
|
-
value: { '@@type': 'ref', id: 'weirds/b.objectMap.one:ghi' },
|
|
35
|
-
},
|
|
36
|
-
timestamp: '1',
|
|
37
|
-
serverOrder: 1,
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
libraryId: 'test-1',
|
|
41
|
-
replicaId: 'foo',
|
|
42
|
-
oid: 'weirds/b.list:ghi',
|
|
43
|
-
data: {
|
|
44
|
-
op: 'list-push',
|
|
45
|
-
value: { '@@type': 'ref', id: 'weirds/b.list.#:abc' },
|
|
46
|
-
},
|
|
47
|
-
timestamp: '1',
|
|
48
|
-
serverOrder: 2,
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
libraryId: 'test-1',
|
|
52
|
-
replicaId: 'foo',
|
|
53
|
-
oid: 'weirds/b.list:ghi',
|
|
54
|
-
data: {
|
|
55
|
-
op: 'list-remove',
|
|
56
|
-
value: { '@@type': 'ref', id: 'weirds/b.list.#:abc' },
|
|
57
|
-
},
|
|
58
|
-
timestamp: '2',
|
|
59
|
-
serverOrder: 3,
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
libraryId: 'test-2',
|
|
63
|
-
replicaId: 'bar',
|
|
64
|
-
oid: 'weirds/b',
|
|
65
|
-
data: {
|
|
66
|
-
op: 'set',
|
|
67
|
-
value: { '@@type': 'ref', id: 'weirds/b.objectMap.one:ghi' },
|
|
68
|
-
},
|
|
69
|
-
timestamp: '1a',
|
|
70
|
-
serverOrder: 1,
|
|
71
|
-
},
|
|
72
|
-
].forEach(({ libraryId, replicaId, oid, data, timestamp, serverOrder }) => {
|
|
73
|
-
db.prepare(
|
|
74
|
-
/* sql */ `
|
|
75
|
-
INSERT INTO OperationHistory (libraryId, replicaId, oid, data, timestamp, serverOrder)
|
|
76
|
-
VALUES (?, ?, ?, ?, ?, ?);
|
|
77
|
-
`).run(libraryId, replicaId, oid, JSON.stringify(data), timestamp, serverOrder);
|
|
78
|
-
});
|
|
79
|
-
[
|
|
80
|
-
{
|
|
81
|
-
libraryId: 'test-1',
|
|
82
|
-
oid: 'weirds/b.objectMap.one:ghi',
|
|
83
|
-
snapshot: { '@@type': 'ref', id: 'weirds/b.list.#:abc' },
|
|
84
|
-
timestamp: '1',
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
libraryId: 'test-2',
|
|
88
|
-
oid: 'weirds/b.objectMap.one:ghi',
|
|
89
|
-
snapshot: { '@@type': 'ref', id: 'weirds/b.list.#:abc' },
|
|
90
|
-
timestamp: '1a',
|
|
91
|
-
},
|
|
92
|
-
].forEach(({ libraryId, oid, snapshot, timestamp }) => {
|
|
93
|
-
db.prepare(
|
|
94
|
-
/* sql */ `
|
|
95
|
-
INSERT INTO DocumentBaseline (libraryId, oid, snapshot, timestamp)
|
|
96
|
-
VALUES (?, ?, ?, ?);
|
|
97
|
-
`).run(libraryId, oid, JSON.stringify(snapshot), timestamp);
|
|
98
|
-
});
|
|
99
|
-
})();
|
|
100
|
-
(0, migrations_js_1.migrations)(db);
|
|
101
|
-
// check that the operations and baselines have been rewritten
|
|
102
|
-
db.transaction(() => {
|
|
103
|
-
const operations = db
|
|
104
|
-
.prepare(
|
|
105
|
-
/* sql */ `
|
|
106
|
-
SELECT * from OperationHistory;
|
|
107
|
-
`)
|
|
108
|
-
.all();
|
|
109
|
-
(0, vitest_1.expect)(operations).toMatchSnapshot();
|
|
110
|
-
const baselines = db
|
|
111
|
-
.prepare(
|
|
112
|
-
/* sql */ `
|
|
113
|
-
SELECT * from DocumentBaseline;
|
|
114
|
-
`)
|
|
115
|
-
.all();
|
|
116
|
-
(0, vitest_1.expect)(baselines).toMatchSnapshot();
|
|
117
|
-
})();
|
|
118
|
-
db.close();
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=migrations.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../src/migrations.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/types.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { DocumentBaseline, Operation, ReplicaInfo, ReplicaType } from '@verdant-web/common';
|
|
2
|
-
export interface OperationSpec extends Operation {
|
|
3
|
-
serverOrder: number;
|
|
4
|
-
replicaId: string;
|
|
5
|
-
}
|
|
6
|
-
export interface DocumentBaselineSpec extends Omit<DocumentBaseline<any>, 'snapshot'> {
|
|
7
|
-
snapshot: string;
|
|
8
|
-
libraryId: string;
|
|
9
|
-
serverOrder: number;
|
|
10
|
-
}
|
|
11
|
-
export interface ReplicaInfoSpec extends ReplicaInfo {
|
|
12
|
-
libraryId: string;
|
|
13
|
-
clientId: string;
|
|
14
|
-
lastSeenWallClockTime: number | null;
|
|
15
|
-
type: ReplicaType;
|
|
16
|
-
ackedServerOrder: number;
|
|
17
|
-
}
|
|
18
|
-
export declare type LibraryInfo<Profile = unknown> = {
|
|
19
|
-
id: string;
|
|
20
|
-
replicas: {
|
|
21
|
-
id: string;
|
|
22
|
-
ackedLogicalTime: string | null;
|
|
23
|
-
ackedServerOrder: number;
|
|
24
|
-
type: ReplicaType;
|
|
25
|
-
truant: boolean;
|
|
26
|
-
profile: Profile;
|
|
27
|
-
}[];
|
|
28
|
-
latestServerOrder: number;
|
|
29
|
-
operationsCount: number;
|
|
30
|
-
baselinesCount: number;
|
|
31
|
-
globalAck: string | null;
|
|
32
|
-
};
|
|
33
|
-
declare global {
|
|
34
|
-
interface File {
|
|
35
|
-
readonly lastModified: number;
|
|
36
|
-
readonly name: string;
|
|
37
|
-
}
|
|
38
|
-
}
|
package/dist/cjs/types.js
DELETED
package/dist/cjs/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
|
package/dist/esm/Baselines.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { DocumentBaseline, Operation, Ref } from '@verdant-web/common';
|
|
2
|
-
import { Database } from 'better-sqlite3';
|
|
3
|
-
export declare class Baselines {
|
|
4
|
-
private db;
|
|
5
|
-
constructor(db: Database);
|
|
6
|
-
get: (libraryId: string, oid: string) => DocumentBaseline<any> | null;
|
|
7
|
-
getAllWithSubObjects: (libraryId: string, oid: string) => DocumentBaseline<any>[];
|
|
8
|
-
set: (libraryId: string, baseline: DocumentBaseline) => import("better-sqlite3").RunResult;
|
|
9
|
-
insertAll: (libraryId: string, baselines: DocumentBaseline[]) => void;
|
|
10
|
-
private hydrateSnapshot;
|
|
11
|
-
getAllAfter: (libraryId: string, timestamp: string | null) => DocumentBaseline<any>[];
|
|
12
|
-
getFromServerOrder: (libraryId: string, serverOrder: number) => DocumentBaseline<any>[];
|
|
13
|
-
applyOperations: (libraryId: string, oid: string, operations: Operation[], deletedRefs?: Ref[]) => never[] | undefined;
|
|
14
|
-
deleteAll: (libraryId: string) => void;
|
|
15
|
-
getCount: (libraryId: string) => number;
|
|
16
|
-
}
|
package/dist/esm/Baselines.js
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { applyPatch, } from '@verdant-web/common';
|
|
2
|
-
export class Baselines {
|
|
3
|
-
constructor(db) {
|
|
4
|
-
this.db = db;
|
|
5
|
-
this.get = (libraryId, oid) => {
|
|
6
|
-
const row = this.db
|
|
7
|
-
.prepare(`
|
|
8
|
-
SELECT * FROM DocumentBaseline
|
|
9
|
-
WHERE libraryId = ? AND oid = ?
|
|
10
|
-
`)
|
|
11
|
-
.get(libraryId, oid);
|
|
12
|
-
if (!row) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
return this.hydrateSnapshot(row);
|
|
16
|
-
};
|
|
17
|
-
this.getAllWithSubObjects = (libraryId, oid) => {
|
|
18
|
-
const rows = this.db
|
|
19
|
-
.prepare(`
|
|
20
|
-
SELECT * FROM DocumentBaseline
|
|
21
|
-
WHERE libraryId = ? AND oid LIKE ?
|
|
22
|
-
`)
|
|
23
|
-
.all(libraryId, `${oid}%`);
|
|
24
|
-
return rows.map(this.hydrateSnapshot);
|
|
25
|
-
};
|
|
26
|
-
this.set = (libraryId, baseline) => {
|
|
27
|
-
if (!baseline.snapshot) {
|
|
28
|
-
return this.db
|
|
29
|
-
.prepare(`
|
|
30
|
-
DELETE FROM DocumentBaseline
|
|
31
|
-
WHERE libraryId = ? AND oid = ?
|
|
32
|
-
`)
|
|
33
|
-
.run(libraryId, baseline.oid);
|
|
34
|
-
}
|
|
35
|
-
return this.db
|
|
36
|
-
.prepare(`
|
|
37
|
-
INSERT OR REPLACE INTO DocumentBaseline (libraryId, oid, snapshot, timestamp)
|
|
38
|
-
VALUES (?, ?, ?, ?)
|
|
39
|
-
`)
|
|
40
|
-
.run(libraryId, baseline.oid, JSON.stringify(baseline.snapshot), baseline.timestamp);
|
|
41
|
-
};
|
|
42
|
-
this.insertAll = (libraryId, baselines) => {
|
|
43
|
-
const tx = this.db.transaction(() => {
|
|
44
|
-
for (const baseline of baselines) {
|
|
45
|
-
this.db
|
|
46
|
-
.prepare(`
|
|
47
|
-
INSERT OR REPLACE INTO DocumentBaseline (libraryId, oid, snapshot, timestamp)
|
|
48
|
-
VALUES (?, ?, ?, ?)
|
|
49
|
-
`)
|
|
50
|
-
.run(libraryId, baseline.oid, JSON.stringify(baseline.snapshot), baseline.timestamp);
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
tx();
|
|
54
|
-
};
|
|
55
|
-
this.hydrateSnapshot = (snapshot) => {
|
|
56
|
-
return Object.assign(Object.assign({}, snapshot), { snapshot: JSON.parse(snapshot.snapshot) });
|
|
57
|
-
};
|
|
58
|
-
this.getAllAfter = (libraryId, timestamp) => {
|
|
59
|
-
if (!timestamp) {
|
|
60
|
-
return this.db
|
|
61
|
-
.prepare(`
|
|
62
|
-
SELECT * FROM DocumentBaseline
|
|
63
|
-
WHERE libraryId = ?
|
|
64
|
-
ORDER BY timestamp ASC
|
|
65
|
-
`)
|
|
66
|
-
.all(libraryId)
|
|
67
|
-
.map(this.hydrateSnapshot);
|
|
68
|
-
}
|
|
69
|
-
return this.db
|
|
70
|
-
.prepare(`
|
|
71
|
-
SELECT * FROM DocumentBaseline
|
|
72
|
-
WHERE libraryId = ? AND timestamp > ?
|
|
73
|
-
ORDER BY timestamp ASC
|
|
74
|
-
`)
|
|
75
|
-
.all(libraryId, timestamp)
|
|
76
|
-
.map(this.hydrateSnapshot);
|
|
77
|
-
};
|
|
78
|
-
this.getFromServerOrder = (libraryId, serverOrder) => {
|
|
79
|
-
return this.db
|
|
80
|
-
.prepare(`
|
|
81
|
-
SELECT * FROM DocumentBaseline
|
|
82
|
-
WHERE libraryId = ? AND serverOrder >= ?
|
|
83
|
-
ORDER BY serverOrder ASC
|
|
84
|
-
`)
|
|
85
|
-
.all(libraryId, serverOrder)
|
|
86
|
-
.map(this.hydrateSnapshot);
|
|
87
|
-
};
|
|
88
|
-
this.applyOperations = (libraryId, oid, operations, deletedRefs) => {
|
|
89
|
-
if (operations.length === 0)
|
|
90
|
-
return [];
|
|
91
|
-
let baseline = this.get(libraryId, oid);
|
|
92
|
-
if (!baseline) {
|
|
93
|
-
baseline = {
|
|
94
|
-
oid,
|
|
95
|
-
snapshot: {},
|
|
96
|
-
timestamp: operations[0].timestamp,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
for (const operation of operations) {
|
|
100
|
-
baseline.snapshot = applyPatch(baseline.snapshot, operation.data, deletedRefs);
|
|
101
|
-
}
|
|
102
|
-
baseline.timestamp = operations[operations.length - 1].timestamp;
|
|
103
|
-
this.set(libraryId, baseline);
|
|
104
|
-
};
|
|
105
|
-
this.deleteAll = (libraryId) => {
|
|
106
|
-
this.db
|
|
107
|
-
.prepare(`
|
|
108
|
-
DELETE FROM DocumentBaseline
|
|
109
|
-
WHERE libraryId = ?
|
|
110
|
-
`)
|
|
111
|
-
.run(libraryId);
|
|
112
|
-
};
|
|
113
|
-
this.getCount = (libraryId) => {
|
|
114
|
-
var _a, _b;
|
|
115
|
-
return ((_b = (_a = this.db
|
|
116
|
-
.prepare(`
|
|
117
|
-
SELECT COUNT(*) AS count FROM DocumentBaseline
|
|
118
|
-
WHERE libraryId = ?
|
|
119
|
-
`)
|
|
120
|
-
.get(libraryId)) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0);
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=Baselines.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Baselines.js","sourceRoot":"","sources":["../../src/Baselines.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { ServerMessage } from '@verdant-web/common';
|
|
3
|
-
import { IncomingMessage, ServerResponse } from 'http';
|
|
4
|
-
import { WebSocket } from 'ws';
|
|
5
|
-
import { TokenInfo } from './TokenVerifier.js';
|
|
6
|
-
export declare class ClientConnectionManager {
|
|
7
|
-
private readonly connections;
|
|
8
|
-
private getLibraryConnections;
|
|
9
|
-
addSocket: (libraryId: string, key: string, socket: WebSocket, info: TokenInfo) => void;
|
|
10
|
-
addRequest: (libraryId: string, key: string, request: IncomingMessage, response: ServerResponse, info: TokenInfo) => () => void;
|
|
11
|
-
addFetch: (libraryId: string, key: string, req: Request, info: TokenInfo) => (() => Response);
|
|
12
|
-
remove: (libraryId: string, key: string) => void;
|
|
13
|
-
respond: (libraryId: string, key: string, message: ServerMessage) => void;
|
|
14
|
-
/**
|
|
15
|
-
* Broadcasts a message to all live-connected clients in a library.
|
|
16
|
-
* This does not reach push/pull clients.
|
|
17
|
-
*/
|
|
18
|
-
broadcast: (libraryId: string, message: ServerMessage, omitKeys?: string[]) => void;
|
|
19
|
-
disconnectAll: (libraryId: string) => void;
|
|
20
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Operation } from '@verdant-web/common';
|
|
2
|
-
import { Database } from 'better-sqlite3';
|
|
3
|
-
import { OperationSpec } from './types.js';
|
|
4
|
-
export declare class OperationHistory {
|
|
5
|
-
private db;
|
|
6
|
-
constructor(db: Database);
|
|
7
|
-
private hydratePatch;
|
|
8
|
-
getAllFor: (libraryId: string, oid: string) => OperationSpec[];
|
|
9
|
-
getEarliest: (libraryId: string, count: number) => OperationSpec[];
|
|
10
|
-
getAfter: (libraryId: string, timestamp?: string | null) => OperationSpec[];
|
|
11
|
-
/**
|
|
12
|
-
* Returns all operations before the given server order
|
|
13
|
-
* in ascending chronological order
|
|
14
|
-
*/
|
|
15
|
-
getBeforeServerOrder: (libraryId: string, beforeServerOrder: number) => OperationSpec[];
|
|
16
|
-
/**
|
|
17
|
-
* Returns all operations after a given server order. Useful
|
|
18
|
-
* for retrieving operations that were created after a client
|
|
19
|
-
* last synced.
|
|
20
|
-
*/
|
|
21
|
-
getFromServerOrder: (libraryId: string, serverOrder: number) => OperationSpec[];
|
|
22
|
-
getLatestServerOrder: (libraryId: string) => number;
|
|
23
|
-
getCount: (libraryId: string) => number;
|
|
24
|
-
/**
|
|
25
|
-
* Adds a new operation or replaces an existing one.
|
|
26
|
-
* The server order will be set to the current max + 1
|
|
27
|
-
*/
|
|
28
|
-
insert: (libraryId: string, replicaId: string, item: Operation) => import("better-sqlite3").RunResult;
|
|
29
|
-
/**
|
|
30
|
-
* Inserts all operations and updates the server
|
|
31
|
-
* order for this library
|
|
32
|
-
*/
|
|
33
|
-
insertAll: (libraryId: string, replicaId: string, items: Operation[]) => Promise<void>;
|
|
34
|
-
dropAll: (libraryId: string, items: Pick<OperationSpec, 'replicaId' | 'oid' | 'timestamp'>[]) => Promise<void>;
|
|
35
|
-
deleteAll: (libraryId: string) => void;
|
|
36
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
-
var t = {};
|
|
3
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
-
t[p] = s[p];
|
|
5
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
-
t[p[i]] = s[p[i]];
|
|
9
|
-
}
|
|
10
|
-
return t;
|
|
11
|
-
};
|
|
12
|
-
export class OperationHistory {
|
|
13
|
-
constructor(db) {
|
|
14
|
-
this.db = db;
|
|
15
|
-
this.hydratePatch = (_a) => {
|
|
16
|
-
var { libraryId: _, data } = _a, rest = __rest(_a, ["libraryId", "data"]);
|
|
17
|
-
return Object.assign(Object.assign({}, rest), { data: JSON.parse(data) });
|
|
18
|
-
};
|
|
19
|
-
this.getAllFor = (libraryId, oid) => {
|
|
20
|
-
return this.db
|
|
21
|
-
.prepare(`
|
|
22
|
-
SELECT * FROM OperationHistory
|
|
23
|
-
WHERE libraryId = ? AND oid = ?
|
|
24
|
-
ORDER BY timestamp ASC
|
|
25
|
-
`)
|
|
26
|
-
.all(libraryId, oid)
|
|
27
|
-
.map(this.hydratePatch);
|
|
28
|
-
};
|
|
29
|
-
this.getEarliest = (libraryId, count) => {
|
|
30
|
-
return this.db
|
|
31
|
-
.prepare(`
|
|
32
|
-
SELECT * FROM OperationHistory
|
|
33
|
-
WHERE libraryId = ?
|
|
34
|
-
ORDER BY timestamp ASC
|
|
35
|
-
LIMIT ?
|
|
36
|
-
`)
|
|
37
|
-
.all(libraryId, count)
|
|
38
|
-
.map(this.hydratePatch);
|
|
39
|
-
};
|
|
40
|
-
this.getAfter = (libraryId, timestamp = null) => {
|
|
41
|
-
if (timestamp === null) {
|
|
42
|
-
return this.db
|
|
43
|
-
.prepare(`
|
|
44
|
-
SELECT * FROM OperationHistory
|
|
45
|
-
WHERE libraryId = ?
|
|
46
|
-
ORDER BY timestamp ASC
|
|
47
|
-
`)
|
|
48
|
-
.all(libraryId)
|
|
49
|
-
.map(this.hydratePatch);
|
|
50
|
-
}
|
|
51
|
-
return this.db
|
|
52
|
-
.prepare(`
|
|
53
|
-
SELECT * FROM OperationHistory
|
|
54
|
-
WHERE libraryId = ? AND timestamp > ?
|
|
55
|
-
ORDER BY timestamp ASC
|
|
56
|
-
`)
|
|
57
|
-
.all(libraryId, timestamp)
|
|
58
|
-
.map(this.hydratePatch);
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* Returns all operations before the given server order
|
|
62
|
-
* in ascending chronological order
|
|
63
|
-
*/
|
|
64
|
-
this.getBeforeServerOrder = (libraryId, beforeServerOrder) => {
|
|
65
|
-
return this.db
|
|
66
|
-
.prepare(`
|
|
67
|
-
SELECT * FROM OperationHistory
|
|
68
|
-
WHERE libraryId = ? AND serverOrder < ?
|
|
69
|
-
ORDER BY timestamp ASC
|
|
70
|
-
`)
|
|
71
|
-
.all(libraryId, beforeServerOrder)
|
|
72
|
-
.map(this.hydratePatch);
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Returns all operations after a given server order. Useful
|
|
76
|
-
* for retrieving operations that were created after a client
|
|
77
|
-
* last synced.
|
|
78
|
-
*/
|
|
79
|
-
this.getFromServerOrder = (libraryId, serverOrder) => {
|
|
80
|
-
const result = this.db
|
|
81
|
-
.prepare(`
|
|
82
|
-
SELECT * FROM OperationHistory
|
|
83
|
-
WHERE libraryId = ? AND serverOrder > ?
|
|
84
|
-
`)
|
|
85
|
-
.all(libraryId, serverOrder);
|
|
86
|
-
return (result || []).map(this.hydratePatch);
|
|
87
|
-
};
|
|
88
|
-
this.getLatestServerOrder = (libraryId) => {
|
|
89
|
-
const result = this.db
|
|
90
|
-
.prepare(`
|
|
91
|
-
SELECT MAX(serverOrder) AS serverOrder FROM OperationHistory
|
|
92
|
-
WHERE libraryId = ?
|
|
93
|
-
`)
|
|
94
|
-
.get(libraryId);
|
|
95
|
-
return (result === null || result === void 0 ? void 0 : result.serverOrder) || 0;
|
|
96
|
-
};
|
|
97
|
-
this.getCount = (libraryId) => {
|
|
98
|
-
const result = this.db
|
|
99
|
-
.prepare(`
|
|
100
|
-
SELECT COUNT(*) AS count FROM OperationHistory
|
|
101
|
-
WHERE libraryId = ?
|
|
102
|
-
`)
|
|
103
|
-
.get(libraryId);
|
|
104
|
-
return (result === null || result === void 0 ? void 0 : result.count) || 0;
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Adds a new operation or replaces an existing one.
|
|
108
|
-
* The server order will be set to the current max + 1
|
|
109
|
-
*/
|
|
110
|
-
this.insert = (libraryId, replicaId, item) => {
|
|
111
|
-
return this.db
|
|
112
|
-
.prepare(`
|
|
113
|
-
INSERT OR REPLACE INTO OperationHistory (libraryId, oid, data, timestamp, replicaId, serverOrder)
|
|
114
|
-
VALUES (?, ?, ?, ?, ?, (SELECT COALESCE(MAX(serverOrder), 0) FROM OperationHistory WHERE libraryId = ?) + 1)
|
|
115
|
-
`)
|
|
116
|
-
.run(libraryId, item.oid, JSON.stringify(item.data), item.timestamp, replicaId);
|
|
117
|
-
};
|
|
118
|
-
/**
|
|
119
|
-
* Inserts all operations and updates the server
|
|
120
|
-
* order for this library
|
|
121
|
-
*/
|
|
122
|
-
this.insertAll = async (libraryId, replicaId, items) => {
|
|
123
|
-
const tx = this.db.transaction(() => {
|
|
124
|
-
let orderResult = this.db
|
|
125
|
-
.prepare(`
|
|
126
|
-
SELECT COALESCE(MAX(serverOrder), 0) AS serverOrder FROM OperationHistory WHERE libraryId = ?
|
|
127
|
-
`)
|
|
128
|
-
.get(libraryId);
|
|
129
|
-
let currentServerOrder = orderResult.serverOrder || 0;
|
|
130
|
-
const insertStatement = this.db.prepare(`
|
|
131
|
-
INSERT OR REPLACE INTO OperationHistory (libraryId, oid, data, timestamp, replicaId, serverOrder)
|
|
132
|
-
VALUES (?, ?, ?, ?, ?, ?)
|
|
133
|
-
`);
|
|
134
|
-
for (const item of items) {
|
|
135
|
-
insertStatement.run(libraryId, item.oid, JSON.stringify(item.data), item.timestamp, replicaId, ++currentServerOrder);
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
tx();
|
|
139
|
-
};
|
|
140
|
-
this.dropAll = async (libraryId, items) => {
|
|
141
|
-
const deleteStatement = this.db.prepare(`
|
|
142
|
-
DELETE FROM OperationHistory
|
|
143
|
-
WHERE libraryId = ? AND replicaId = ? AND oid = ? AND timestamp = ?
|
|
144
|
-
`);
|
|
145
|
-
this.db.transaction(() => {
|
|
146
|
-
for (const item of items) {
|
|
147
|
-
deleteStatement.run(libraryId, item.replicaId, item.oid, item.timestamp);
|
|
148
|
-
}
|
|
149
|
-
})();
|
|
150
|
-
};
|
|
151
|
-
this.deleteAll = (libraryId) => {
|
|
152
|
-
this.db
|
|
153
|
-
.prepare(`
|
|
154
|
-
DELETE FROM OperationHistory
|
|
155
|
-
WHERE libraryId = ?
|
|
156
|
-
`)
|
|
157
|
-
.run(libraryId);
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=OperationHistory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperationHistory.js","sourceRoot":"","sources":["../../src/OperationHistory.ts"],"names":[],"mappings":";;;;;;;;;;;AAWA,MAAM,OAAO,gBAAgB;IAC5B,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;QAExB,iBAAY,GAAG,CAAC,EAIK,EAAiB,EAAE;gBAJxB,EACvB,SAAS,EAAE,CAAC,EACZ,IAAI,OAEwB,EADzB,IAAI,cAHgB,qBAIvB,CADO;YAEP,uCACI,IAAI,KACP,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IACrB;QACH,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;;KAIC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC;iBACnB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAE,EAAE;YAClD,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;;;KAKC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC;iBACrB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,SAAiB,EAAE,YAA2B,IAAI,EAAE,EAAE;YACjE,IAAI,SAAS,KAAK,IAAI,EAAE;gBACvB,OAAO,IAAI,CAAC,EAAE;qBACZ,OAAO,CACP;;;;KAIA,CACA;qBACA,GAAG,CAAC,SAAS,CAAC;qBACd,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;aACzB;YACD,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;;KAIC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;iBACzB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF;;;WAGG;QACH,yBAAoB,GAAG,CAAC,SAAiB,EAAE,iBAAyB,EAAE,EAAE;YACvE,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;;GAID,CACC;iBACA,GAAG,CAAC,SAAS,EAAE,iBAAiB,CAAC;iBACjC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF;;;;WAIG;QACH,uBAAkB,GAAG,CAAC,SAAiB,EAAE,WAAmB,EAAE,EAAE;YAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CACP;;;GAGD,CACC;iBACA,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAE9B,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC,CAAC;QAEF,yBAAoB,GAAG,CAAC,SAAiB,EAAU,EAAE;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CACP;;;GAGD,CACC;iBACA,GAAG,CAAC,SAAS,CAAC,CAAC;YAEjB,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,KAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,aAAQ,GAAG,CAAC,SAAiB,EAAU,EAAE;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CACP;;;GAGD,CACC;iBACA,GAAG,CAAC,SAAS,CAAC,CAAC;YAEjB,OAAO,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,KAAI,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF;;;WAGG;QACH,WAAM,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAe,EAAE,EAAE;YAClE,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;KAGC,CACD;iBACA,GAAG,CACH,SAAS,EACT,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,SAAS,EACd,SAAS,CACT,CAAC;QACJ,CAAC,CAAC;QAEF;;;WAGG;QACH,cAAS,GAAG,KAAK,EAChB,SAAiB,EACjB,SAAiB,EACjB,KAAkB,EACjB,EAAE;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBACnC,IAAI,WAAW,GAAG,IAAI,CAAC,EAAE;qBACvB,OAAO,CACP;;KAEA,CACA;qBACA,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjB,IAAI,kBAAkB,GAAG,WAAW,CAAC,WAAW,IAAI,CAAC,CAAC;gBACtD,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACtC;;;KAGC,CACD,CAAC;gBACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACzB,eAAe,CAAC,GAAG,CAClB,SAAS,EACT,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,SAAS,EACd,SAAS,EACT,EAAE,kBAAkB,CACpB,CAAC;iBACF;YACF,CAAC,CAAC,CAAC;YAEH,EAAE,EAAE,CAAC;QACN,CAAC,CAAC;QAEF,YAAO,GAAG,KAAK,EACd,SAAiB,EACjB,KAA+D,EAC9D,EAAE;YACH,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CACtC;;;IAGC,CACD,CAAC;YAEF,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;gBACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACzB,eAAe,CAAC,GAAG,CAClB,SAAS,EACT,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,SAAS,CACd,CAAC;iBACF;YACF,CAAC,CAAC,EAAE,CAAC;QACN,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,EAAE;YACjC,IAAI,CAAC,EAAE;iBACL,OAAO,CACP;;;IAGA,CACA;iBACA,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,CAAC,CAAC;IA1NiC,CAAC;CA2NpC"}
|
package/dist/esm/Presence.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { UserInfo } from '@verdant-web/common';
|
|
3
|
-
import EventEmitter from 'events';
|
|
4
|
-
/**
|
|
5
|
-
* Stores client presence in-memory for connected
|
|
6
|
-
* clients
|
|
7
|
-
*/
|
|
8
|
-
export declare class Presence extends EventEmitter {
|
|
9
|
-
private presences;
|
|
10
|
-
private getLibrary;
|
|
11
|
-
set: (libraryId: string, userId: string, presence: UserInfo<any, any>) => void;
|
|
12
|
-
removeReplica: (libraryId: string, replicaId: string) => void;
|
|
13
|
-
all: (libraryId: string) => Record<string, UserInfo<any, any>>;
|
|
14
|
-
clear: (libraryId: string) => void;
|
|
15
|
-
}
|
package/dist/esm/Profiles.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface UserProfiles<Profile> {
|
|
2
|
-
get(userId: string): Promise<Profile>;
|
|
3
|
-
}
|
|
4
|
-
export declare class UserProfileLoader<Profile> {
|
|
5
|
-
private source;
|
|
6
|
-
private cache;
|
|
7
|
-
constructor(source: UserProfiles<Profile>);
|
|
8
|
-
get: (userId: string) => Promise<Profile>;
|
|
9
|
-
evict: (userId: string) => void;
|
|
10
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { EventSubscriber } from '@verdant-web/common';
|
|
2
|
-
/**
|
|
3
|
-
* A set of timers per-replica which are
|
|
4
|
-
* refreshed whenever the replica sends
|
|
5
|
-
* a message to the server. If a timer expires,
|
|
6
|
-
* the replica is removed from presence. This
|
|
7
|
-
* is a failsafe for socket-based replicas but
|
|
8
|
-
* essential for pull-based replicas.
|
|
9
|
-
*/
|
|
10
|
-
export declare class ReplicaKeepaliveTimers extends EventSubscriber<{
|
|
11
|
-
lost: (libraryId: string, replicaId: string) => void;
|
|
12
|
-
}> {
|
|
13
|
-
private timeout;
|
|
14
|
-
private timers;
|
|
15
|
-
constructor(timeout?: number);
|
|
16
|
-
refresh: (libraryId: string, replicaId: string) => void;
|
|
17
|
-
}
|
package/dist/esm/Replicas.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Database } from 'better-sqlite3';
|
|
2
|
-
import { TokenInfo } from './TokenVerifier.js';
|
|
3
|
-
import { ReplicaInfoSpec } from './types.js';
|
|
4
|
-
export declare class ReplicaInfos {
|
|
5
|
-
private db;
|
|
6
|
-
private readonly replicaTruancyMinutes;
|
|
7
|
-
constructor(db: Database, replicaTruancyMinutes: number);
|
|
8
|
-
get truantCutoff(): number;
|
|
9
|
-
get: (libraryId: string, replicaId: string) => ReplicaInfoSpec | null;
|
|
10
|
-
getOrCreate: (libraryId: string, replicaId: string, info: TokenInfo) => {
|
|
11
|
-
status: 'new' | 'existing' | 'truant';
|
|
12
|
-
replicaInfo: ReplicaInfoSpec;
|
|
13
|
-
};
|
|
14
|
-
getAllNonTruant: (libraryId: string) => ReplicaInfoSpec[];
|
|
15
|
-
getAll: (libraryId: string) => ReplicaInfoSpec[];
|
|
16
|
-
updateLastSeen: (libraryId: string, replicaId: string) => import("better-sqlite3").RunResult;
|
|
17
|
-
updateAcknowledged: (libraryId: string, replicaId: string, timestamp: string) => void;
|
|
18
|
-
updateServerOrder: (libraryId: string, replicaId: string, serverOrder: number) => void;
|
|
19
|
-
getEarliestAckedServerOrder: (libraryId: string) => number | null;
|
|
20
|
-
acknowledgeOperation: (libraryId: string, replicaId: string, timestamp: string) => void;
|
|
21
|
-
getGlobalAck: (libraryId: string, onlineReplicaIds?: string[]) => string | undefined;
|
|
22
|
-
delete: (libraryId: string, replicaId: string) => import("better-sqlite3").RunResult;
|
|
23
|
-
deleteAll: (libraryId: string) => import("better-sqlite3").RunResult;
|
|
24
|
-
deleteAllForUser: (libraryId: string, userId: string) => import("better-sqlite3").RunResult;
|
|
25
|
-
}
|