@verdant-web/server 2.1.3 → 3.0.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.
Files changed (198) hide show
  1. package/dist/esm/ClientConnection.d.ts +1 -0
  2. package/dist/esm/ClientConnection.js.map +1 -1
  3. package/dist/esm/Presence.js.map +1 -1
  4. package/dist/esm/Profiles.js.map +1 -1
  5. package/dist/esm/ReplicaKeepaliveTimers.js.map +1 -1
  6. package/dist/esm/Server.d.ts +15 -11
  7. package/dist/esm/Server.js +29 -30
  8. package/dist/esm/Server.js.map +1 -1
  9. package/dist/esm/ServerLibrary.d.ts +10 -17
  10. package/dist/esm/ServerLibrary.js +151 -127
  11. package/dist/esm/ServerLibrary.js.map +1 -1
  12. package/dist/esm/ServerLibrary.test.js +369 -0
  13. package/dist/esm/ServerLibrary.test.js.map +1 -0
  14. package/dist/esm/TokenVerifier.js.map +1 -1
  15. package/dist/esm/files/FileStorage.js.map +1 -1
  16. package/dist/esm/storage/Storage.d.ts +67 -0
  17. package/dist/esm/storage/Storage.js +2 -0
  18. package/dist/esm/storage/Storage.js.map +1 -0
  19. package/dist/esm/storage/index.d.ts +2 -0
  20. package/dist/esm/storage/index.js +3 -0
  21. package/dist/esm/storage/index.js.map +1 -0
  22. package/dist/esm/storage/sql/SqlBaselines.d.ts +22 -0
  23. package/dist/esm/storage/sql/SqlBaselines.js +101 -0
  24. package/dist/esm/storage/sql/SqlBaselines.js.map +1 -0
  25. package/dist/esm/storage/sql/SqlFileMetadata.d.ts +18 -0
  26. package/dist/esm/storage/sql/SqlFileMetadata.js +69 -0
  27. package/dist/esm/storage/sql/SqlFileMetadata.js.map +1 -0
  28. package/dist/esm/storage/sql/SqlOperations.d.ts +19 -0
  29. package/dist/esm/storage/sql/SqlOperations.js +104 -0
  30. package/dist/esm/storage/sql/SqlOperations.js.map +1 -0
  31. package/dist/esm/storage/sql/SqlReplicas.d.ts +32 -0
  32. package/dist/esm/storage/sql/SqlReplicas.js +163 -0
  33. package/dist/esm/storage/sql/SqlReplicas.js.map +1 -0
  34. package/dist/esm/storage/sql/migrations/v1.d.ts +3 -0
  35. package/dist/esm/storage/sql/migrations/v1.js +59 -0
  36. package/dist/esm/storage/sql/migrations/v1.js.map +1 -0
  37. package/dist/esm/storage/sql/migrations.d.ts +5 -0
  38. package/dist/esm/storage/sql/migrations.js +3 -0
  39. package/dist/esm/storage/sql/migrations.js.map +1 -0
  40. package/dist/esm/storage/sql/sqlStorage.d.ts +5 -0
  41. package/dist/esm/storage/sql/sqlStorage.js +43 -0
  42. package/dist/esm/storage/sql/sqlStorage.js.map +1 -0
  43. package/dist/esm/storage/sql/tables.d.ts +40 -0
  44. package/dist/esm/storage/sql/tables.js +2 -0
  45. package/dist/esm/storage/sql/tables.js.map +1 -0
  46. package/dist/esm/types.d.ts +14 -5
  47. package/package.json +20 -14
  48. package/src/Server.ts +37 -43
  49. package/src/ServerLibrary.test.ts +447 -0
  50. package/src/ServerLibrary.ts +239 -163
  51. package/src/storage/Storage.ts +118 -0
  52. package/src/storage/index.ts +2 -0
  53. package/src/storage/sql/SqlBaselines.ts +141 -0
  54. package/src/storage/sql/SqlFileMetadata.ts +94 -0
  55. package/src/storage/sql/SqlOperations.ts +149 -0
  56. package/src/storage/sql/SqlReplicas.ts +234 -0
  57. package/src/storage/sql/migrations/v1.ts +64 -0
  58. package/src/storage/sql/migrations.ts +3 -0
  59. package/src/storage/sql/sqlStorage.ts +59 -0
  60. package/src/storage/sql/tables.ts +45 -0
  61. package/src/types.ts +15 -4
  62. package/bin/server.mjs +0 -115
  63. package/dist/cjs/Baselines.d.ts +0 -16
  64. package/dist/cjs/Baselines.js +0 -128
  65. package/dist/cjs/Baselines.js.map +0 -1
  66. package/dist/cjs/ClientConnection.d.ts +0 -20
  67. package/dist/cjs/ClientConnection.js +0 -139
  68. package/dist/cjs/ClientConnection.js.map +0 -1
  69. package/dist/cjs/MessageSender.d.ts +0 -5
  70. package/dist/cjs/MessageSender.js +0 -3
  71. package/dist/cjs/MessageSender.js.map +0 -1
  72. package/dist/cjs/OperationHistory.d.ts +0 -36
  73. package/dist/cjs/OperationHistory.js +0 -165
  74. package/dist/cjs/OperationHistory.js.map +0 -1
  75. package/dist/cjs/Presence.d.ts +0 -15
  76. package/dist/cjs/Presence.js +0 -60
  77. package/dist/cjs/Presence.js.map +0 -1
  78. package/dist/cjs/Profiles.d.ts +0 -10
  79. package/dist/cjs/Profiles.js +0 -20
  80. package/dist/cjs/Profiles.js.map +0 -1
  81. package/dist/cjs/ReplicaKeepaliveTimers.d.ts +0 -17
  82. package/dist/cjs/ReplicaKeepaliveTimers.js +0 -31
  83. package/dist/cjs/ReplicaKeepaliveTimers.js.map +0 -1
  84. package/dist/cjs/Replicas.d.ts +0 -25
  85. package/dist/cjs/Replicas.js +0 -196
  86. package/dist/cjs/Replicas.js.map +0 -1
  87. package/dist/cjs/Server.d.ts +0 -167
  88. package/dist/cjs/Server.js +0 -552
  89. package/dist/cjs/Server.js.map +0 -1
  90. package/dist/cjs/ServerLibrary.d.ts +0 -65
  91. package/dist/cjs/ServerLibrary.js +0 -505
  92. package/dist/cjs/ServerLibrary.js.map +0 -1
  93. package/dist/cjs/TokenProvider.d.ts +0 -19
  94. package/dist/cjs/TokenProvider.js +0 -27
  95. package/dist/cjs/TokenProvider.js.map +0 -1
  96. package/dist/cjs/TokenVerifier.d.ts +0 -16
  97. package/dist/cjs/TokenVerifier.js +0 -40
  98. package/dist/cjs/TokenVerifier.js.map +0 -1
  99. package/dist/cjs/files/FileMetadata.d.ts +0 -28
  100. package/dist/cjs/files/FileMetadata.js +0 -69
  101. package/dist/cjs/files/FileMetadata.js.map +0 -1
  102. package/dist/cjs/files/FileStorage.d.ts +0 -35
  103. package/dist/cjs/files/FileStorage.js +0 -72
  104. package/dist/cjs/files/FileStorage.js.map +0 -1
  105. package/dist/cjs/index.d.ts +0 -10
  106. package/dist/cjs/index.js +0 -12
  107. package/dist/cjs/index.js.map +0 -1
  108. package/dist/cjs/migrations/v0.d.ts +0 -1
  109. package/dist/cjs/migrations/v0.js +0 -30
  110. package/dist/cjs/migrations/v0.js.map +0 -1
  111. package/dist/cjs/migrations/v1.d.ts +0 -1
  112. package/dist/cjs/migrations/v1.js +0 -32
  113. package/dist/cjs/migrations/v1.js.map +0 -1
  114. package/dist/cjs/migrations/v2.d.ts +0 -1
  115. package/dist/cjs/migrations/v2.js +0 -29
  116. package/dist/cjs/migrations/v2.js.map +0 -1
  117. package/dist/cjs/migrations/v3.d.ts +0 -1
  118. package/dist/cjs/migrations/v3.js +0 -15
  119. package/dist/cjs/migrations/v3.js.map +0 -1
  120. package/dist/cjs/migrations/v4.d.ts +0 -1
  121. package/dist/cjs/migrations/v4.js +0 -9
  122. package/dist/cjs/migrations/v4.js.map +0 -1
  123. package/dist/cjs/migrations/v5.d.ts +0 -2
  124. package/dist/cjs/migrations/v5.js +0 -37
  125. package/dist/cjs/migrations/v5.js.map +0 -1
  126. package/dist/cjs/migrations/v6.d.ts +0 -1
  127. package/dist/cjs/migrations/v6.js +0 -8
  128. package/dist/cjs/migrations/v6.js.map +0 -1
  129. package/dist/cjs/migrations/v7.d.ts +0 -1
  130. package/dist/cjs/migrations/v7.js +0 -10
  131. package/dist/cjs/migrations/v7.js.map +0 -1
  132. package/dist/cjs/migrations.d.ts +0 -6
  133. package/dist/cjs/migrations.js +0 -72
  134. package/dist/cjs/migrations.js.map +0 -1
  135. package/dist/cjs/migrations.test.js +0 -121
  136. package/dist/cjs/migrations.test.js.map +0 -1
  137. package/dist/cjs/types.d.ts +0 -38
  138. package/dist/cjs/types.js +0 -3
  139. package/dist/cjs/types.js.map +0 -1
  140. package/dist/esm/Baselines.d.ts +0 -16
  141. package/dist/esm/Baselines.js +0 -124
  142. package/dist/esm/Baselines.js.map +0 -1
  143. package/dist/esm/OperationHistory.d.ts +0 -36
  144. package/dist/esm/OperationHistory.js +0 -161
  145. package/dist/esm/OperationHistory.js.map +0 -1
  146. package/dist/esm/Replicas.d.ts +0 -25
  147. package/dist/esm/Replicas.js +0 -192
  148. package/dist/esm/Replicas.js.map +0 -1
  149. package/dist/esm/files/FileMetadata.d.ts +0 -28
  150. package/dist/esm/files/FileMetadata.js +0 -65
  151. package/dist/esm/files/FileMetadata.js.map +0 -1
  152. package/dist/esm/migrations/v0.d.ts +0 -1
  153. package/dist/esm/migrations/v0.js +0 -27
  154. package/dist/esm/migrations/v0.js.map +0 -1
  155. package/dist/esm/migrations/v1.d.ts +0 -1
  156. package/dist/esm/migrations/v1.js +0 -29
  157. package/dist/esm/migrations/v1.js.map +0 -1
  158. package/dist/esm/migrations/v2.d.ts +0 -1
  159. package/dist/esm/migrations/v2.js +0 -26
  160. package/dist/esm/migrations/v2.js.map +0 -1
  161. package/dist/esm/migrations/v3.d.ts +0 -1
  162. package/dist/esm/migrations/v3.js +0 -12
  163. package/dist/esm/migrations/v3.js.map +0 -1
  164. package/dist/esm/migrations/v4.d.ts +0 -1
  165. package/dist/esm/migrations/v4.js +0 -6
  166. package/dist/esm/migrations/v4.js.map +0 -1
  167. package/dist/esm/migrations/v5.d.ts +0 -2
  168. package/dist/esm/migrations/v5.js +0 -33
  169. package/dist/esm/migrations/v5.js.map +0 -1
  170. package/dist/esm/migrations/v6.d.ts +0 -1
  171. package/dist/esm/migrations/v6.js +0 -5
  172. package/dist/esm/migrations/v6.js.map +0 -1
  173. package/dist/esm/migrations/v7.d.ts +0 -1
  174. package/dist/esm/migrations/v7.js +0 -7
  175. package/dist/esm/migrations/v7.js.map +0 -1
  176. package/dist/esm/migrations.d.ts +0 -6
  177. package/dist/esm/migrations.js +0 -45
  178. package/dist/esm/migrations.js.map +0 -1
  179. package/dist/esm/migrations.test.d.ts +0 -1
  180. package/dist/esm/migrations.test.js +0 -116
  181. package/dist/esm/migrations.test.js.map +0 -1
  182. package/dist/tsconfig-cjs.tsbuildinfo +0 -1
  183. package/dist/tsconfig.tsbuildinfo +0 -1
  184. package/src/Baselines.ts +0 -198
  185. package/src/OperationHistory.ts +0 -232
  186. package/src/Replicas.ts +0 -274
  187. package/src/files/FileMetadata.ts +0 -112
  188. package/src/migrations/v0.ts +0 -26
  189. package/src/migrations/v1.ts +0 -28
  190. package/src/migrations/v2.ts +0 -26
  191. package/src/migrations/v3.ts +0 -12
  192. package/src/migrations/v4.ts +0 -6
  193. package/src/migrations/v5.ts +0 -49
  194. package/src/migrations/v6.ts +0 -4
  195. package/src/migrations/v7.ts +0 -6
  196. package/src/migrations.test.ts +0 -133
  197. package/src/migrations.ts +0 -61
  198. /package/dist/{cjs/migrations.test.d.ts → esm/ServerLibrary.test.d.ts} +0 -0
@@ -1,128 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Baselines = void 0;
4
- const common_1 = require("@verdant-web/common");
5
- class Baselines {
6
- constructor(db) {
7
- this.db = db;
8
- this.get = (libraryId, oid) => {
9
- const row = this.db
10
- .prepare(`
11
- SELECT * FROM DocumentBaseline
12
- WHERE libraryId = ? AND oid = ?
13
- `)
14
- .get(libraryId, oid);
15
- if (!row) {
16
- return null;
17
- }
18
- return this.hydrateSnapshot(row);
19
- };
20
- this.getAllWithSubObjects = (libraryId, oid) => {
21
- const rows = this.db
22
- .prepare(`
23
- SELECT * FROM DocumentBaseline
24
- WHERE libraryId = ? AND oid LIKE ?
25
- `)
26
- .all(libraryId, `${oid}%`);
27
- return rows.map(this.hydrateSnapshot);
28
- };
29
- this.set = (libraryId, baseline) => {
30
- if (!baseline.snapshot) {
31
- return this.db
32
- .prepare(`
33
- DELETE FROM DocumentBaseline
34
- WHERE libraryId = ? AND oid = ?
35
- `)
36
- .run(libraryId, baseline.oid);
37
- }
38
- return this.db
39
- .prepare(`
40
- INSERT OR REPLACE INTO DocumentBaseline (libraryId, oid, snapshot, timestamp)
41
- VALUES (?, ?, ?, ?)
42
- `)
43
- .run(libraryId, baseline.oid, JSON.stringify(baseline.snapshot), baseline.timestamp);
44
- };
45
- this.insertAll = (libraryId, baselines) => {
46
- const tx = this.db.transaction(() => {
47
- for (const baseline of baselines) {
48
- this.db
49
- .prepare(`
50
- INSERT OR REPLACE INTO DocumentBaseline (libraryId, oid, snapshot, timestamp)
51
- VALUES (?, ?, ?, ?)
52
- `)
53
- .run(libraryId, baseline.oid, JSON.stringify(baseline.snapshot), baseline.timestamp);
54
- }
55
- });
56
- tx();
57
- };
58
- this.hydrateSnapshot = (snapshot) => {
59
- return Object.assign(Object.assign({}, snapshot), { snapshot: JSON.parse(snapshot.snapshot) });
60
- };
61
- this.getAllAfter = (libraryId, timestamp) => {
62
- if (!timestamp) {
63
- return this.db
64
- .prepare(`
65
- SELECT * FROM DocumentBaseline
66
- WHERE libraryId = ?
67
- ORDER BY timestamp ASC
68
- `)
69
- .all(libraryId)
70
- .map(this.hydrateSnapshot);
71
- }
72
- return this.db
73
- .prepare(`
74
- SELECT * FROM DocumentBaseline
75
- WHERE libraryId = ? AND timestamp > ?
76
- ORDER BY timestamp ASC
77
- `)
78
- .all(libraryId, timestamp)
79
- .map(this.hydrateSnapshot);
80
- };
81
- this.getFromServerOrder = (libraryId, serverOrder) => {
82
- return this.db
83
- .prepare(`
84
- SELECT * FROM DocumentBaseline
85
- WHERE libraryId = ? AND serverOrder >= ?
86
- ORDER BY serverOrder ASC
87
- `)
88
- .all(libraryId, serverOrder)
89
- .map(this.hydrateSnapshot);
90
- };
91
- this.applyOperations = (libraryId, oid, operations, deletedRefs) => {
92
- if (operations.length === 0)
93
- return [];
94
- let baseline = this.get(libraryId, oid);
95
- if (!baseline) {
96
- baseline = {
97
- oid,
98
- snapshot: {},
99
- timestamp: operations[0].timestamp,
100
- };
101
- }
102
- for (const operation of operations) {
103
- baseline.snapshot = (0, common_1.applyPatch)(baseline.snapshot, operation.data, deletedRefs);
104
- }
105
- baseline.timestamp = operations[operations.length - 1].timestamp;
106
- this.set(libraryId, baseline);
107
- };
108
- this.deleteAll = (libraryId) => {
109
- this.db
110
- .prepare(`
111
- DELETE FROM DocumentBaseline
112
- WHERE libraryId = ?
113
- `)
114
- .run(libraryId);
115
- };
116
- this.getCount = (libraryId) => {
117
- var _a, _b;
118
- return ((_b = (_a = this.db
119
- .prepare(`
120
- SELECT COUNT(*) AS count FROM DocumentBaseline
121
- WHERE libraryId = ?
122
- `)
123
- .get(libraryId)) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0);
124
- };
125
- }
126
- }
127
- exports.Baselines = Baselines;
128
- //# 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,139 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClientConnectionManager = void 0;
4
- class ClientConnection {
5
- constructor(key) {
6
- this.key = key;
7
- }
8
- }
9
- class RequestClientConnection extends ClientConnection {
10
- constructor(key, req, res, info) {
11
- super(key);
12
- this.req = req;
13
- this.res = res;
14
- this.info = info;
15
- this.type = 'request';
16
- this.responses = [];
17
- this.respond = (message) => {
18
- this.responses.push(message);
19
- };
20
- this.end = () => {
21
- this.res.writeHead(200, {
22
- 'Content-Type': 'application/json',
23
- });
24
- this.res.write(JSON.stringify({
25
- messages: this.responses,
26
- }));
27
- this.res.end();
28
- };
29
- }
30
- }
31
- class FetchClientConnection extends ClientConnection {
32
- constructor(key, req, info) {
33
- super(key);
34
- this.req = req;
35
- this.info = info;
36
- this.type = 'fetch';
37
- this.responses = [];
38
- this.res = new Response('', { status: 200 });
39
- this.respond = (message) => {
40
- this.responses.push(message);
41
- };
42
- this.end = () => {
43
- this.res = new Response(JSON.stringify({
44
- messages: this.responses,
45
- }), {
46
- status: 200,
47
- headers: {
48
- 'Content-Type': 'application/json',
49
- },
50
- });
51
- };
52
- }
53
- }
54
- class WebSocketClientConnection extends ClientConnection {
55
- constructor(key, ws, info) {
56
- super(key);
57
- this.ws = ws;
58
- this.info = info;
59
- this.type = 'websocket';
60
- this.respond = (message) => {
61
- this.ws.send(JSON.stringify(message));
62
- };
63
- }
64
- }
65
- class ClientConnectionManager {
66
- constructor() {
67
- this.connections = {};
68
- this.getLibraryConnections = (libraryId) => {
69
- if (!this.connections[libraryId]) {
70
- this.connections[libraryId] = new Map();
71
- }
72
- return this.connections[libraryId];
73
- };
74
- this.addSocket = (libraryId, key, socket, info) => {
75
- const lib = this.getLibraryConnections(libraryId);
76
- const connection = new WebSocketClientConnection(key, socket, info);
77
- lib.set(key, connection);
78
- socket.on('close', () => {
79
- lib.delete(key);
80
- });
81
- };
82
- this.addRequest = (libraryId, key, request, response, info) => {
83
- const lib = this.getLibraryConnections(libraryId);
84
- const connection = new RequestClientConnection(key, request, response, info);
85
- lib.set(key, connection);
86
- return () => {
87
- connection.end();
88
- lib.delete(key);
89
- };
90
- };
91
- this.addFetch = (libraryId, key, req, info) => {
92
- const lib = this.getLibraryConnections(libraryId);
93
- const connection = new FetchClientConnection(key, req, info);
94
- lib.set(key, connection);
95
- return () => {
96
- connection.end();
97
- lib.delete(key);
98
- return connection.res;
99
- };
100
- };
101
- this.remove = (libraryId, key) => {
102
- const lib = this.getLibraryConnections(libraryId);
103
- lib.delete(key);
104
- };
105
- this.respond = (libraryId, key, message) => {
106
- const lib = this.getLibraryConnections(libraryId);
107
- const connection = lib.get(key);
108
- if (connection) {
109
- connection.respond(message);
110
- }
111
- else {
112
- throw new Error(`No connection found for library ${libraryId}, key ${key}`);
113
- }
114
- };
115
- /**
116
- * Broadcasts a message to all live-connected clients in a library.
117
- * This does not reach push/pull clients.
118
- */
119
- this.broadcast = (libraryId, message, omitKeys = []) => {
120
- const lib = this.getLibraryConnections(libraryId);
121
- for (const [key, connection] of lib) {
122
- if (!omitKeys.includes(key)) {
123
- connection.respond(message);
124
- }
125
- }
126
- };
127
- this.disconnectAll = (libraryId) => {
128
- const lib = this.getLibraryConnections(libraryId);
129
- for (const connection of lib.values()) {
130
- if (connection instanceof WebSocketClientConnection) {
131
- connection.ws.close();
132
- }
133
- }
134
- lib.clear();
135
- };
136
- }
137
- }
138
- exports.ClientConnectionManager = ClientConnectionManager;
139
- //# sourceMappingURL=ClientConnection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClientConnection.js","sourceRoot":"","sources":["../../src/ClientConnection.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import { ServerMessage } from '@verdant-web/common';
2
- export interface MessageSender {
3
- broadcast(libraryId: string, message: ServerMessage, omitKeys?: string[]): void;
4
- send(libraryId: string, clientKey: string, message: ServerMessage): void;
5
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=MessageSender.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MessageSender.js","sourceRoot":"","sources":["../../src/MessageSender.ts"],"names":[],"mappings":""}
@@ -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,165 +0,0 @@
1
- "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.OperationHistory = void 0;
15
- class OperationHistory {
16
- constructor(db) {
17
- this.db = db;
18
- this.hydratePatch = (_a) => {
19
- var { libraryId: _, data } = _a, rest = __rest(_a, ["libraryId", "data"]);
20
- return Object.assign(Object.assign({}, rest), { data: JSON.parse(data) });
21
- };
22
- this.getAllFor = (libraryId, oid) => {
23
- return this.db
24
- .prepare(`
25
- SELECT * FROM OperationHistory
26
- WHERE libraryId = ? AND oid = ?
27
- ORDER BY timestamp ASC
28
- `)
29
- .all(libraryId, oid)
30
- .map(this.hydratePatch);
31
- };
32
- this.getEarliest = (libraryId, count) => {
33
- return this.db
34
- .prepare(`
35
- SELECT * FROM OperationHistory
36
- WHERE libraryId = ?
37
- ORDER BY timestamp ASC
38
- LIMIT ?
39
- `)
40
- .all(libraryId, count)
41
- .map(this.hydratePatch);
42
- };
43
- this.getAfter = (libraryId, timestamp = null) => {
44
- if (timestamp === null) {
45
- return this.db
46
- .prepare(`
47
- SELECT * FROM OperationHistory
48
- WHERE libraryId = ?
49
- ORDER BY timestamp ASC
50
- `)
51
- .all(libraryId)
52
- .map(this.hydratePatch);
53
- }
54
- return this.db
55
- .prepare(`
56
- SELECT * FROM OperationHistory
57
- WHERE libraryId = ? AND timestamp > ?
58
- ORDER BY timestamp ASC
59
- `)
60
- .all(libraryId, timestamp)
61
- .map(this.hydratePatch);
62
- };
63
- /**
64
- * Returns all operations before the given server order
65
- * in ascending chronological order
66
- */
67
- this.getBeforeServerOrder = (libraryId, beforeServerOrder) => {
68
- return this.db
69
- .prepare(`
70
- SELECT * FROM OperationHistory
71
- WHERE libraryId = ? AND serverOrder < ?
72
- ORDER BY timestamp ASC
73
- `)
74
- .all(libraryId, beforeServerOrder)
75
- .map(this.hydratePatch);
76
- };
77
- /**
78
- * Returns all operations after a given server order. Useful
79
- * for retrieving operations that were created after a client
80
- * last synced.
81
- */
82
- this.getFromServerOrder = (libraryId, serverOrder) => {
83
- const result = this.db
84
- .prepare(`
85
- SELECT * FROM OperationHistory
86
- WHERE libraryId = ? AND serverOrder > ?
87
- `)
88
- .all(libraryId, serverOrder);
89
- return (result || []).map(this.hydratePatch);
90
- };
91
- this.getLatestServerOrder = (libraryId) => {
92
- const result = this.db
93
- .prepare(`
94
- SELECT MAX(serverOrder) AS serverOrder FROM OperationHistory
95
- WHERE libraryId = ?
96
- `)
97
- .get(libraryId);
98
- return (result === null || result === void 0 ? void 0 : result.serverOrder) || 0;
99
- };
100
- this.getCount = (libraryId) => {
101
- const result = this.db
102
- .prepare(`
103
- SELECT COUNT(*) AS count FROM OperationHistory
104
- WHERE libraryId = ?
105
- `)
106
- .get(libraryId);
107
- return (result === null || result === void 0 ? void 0 : result.count) || 0;
108
- };
109
- /**
110
- * Adds a new operation or replaces an existing one.
111
- * The server order will be set to the current max + 1
112
- */
113
- this.insert = (libraryId, replicaId, item) => {
114
- return this.db
115
- .prepare(`
116
- INSERT OR REPLACE INTO OperationHistory (libraryId, oid, data, timestamp, replicaId, serverOrder)
117
- VALUES (?, ?, ?, ?, ?, (SELECT COALESCE(MAX(serverOrder), 0) FROM OperationHistory WHERE libraryId = ?) + 1)
118
- `)
119
- .run(libraryId, item.oid, JSON.stringify(item.data), item.timestamp, replicaId);
120
- };
121
- /**
122
- * Inserts all operations and updates the server
123
- * order for this library
124
- */
125
- this.insertAll = async (libraryId, replicaId, items) => {
126
- const tx = this.db.transaction(() => {
127
- let orderResult = this.db
128
- .prepare(`
129
- SELECT COALESCE(MAX(serverOrder), 0) AS serverOrder FROM OperationHistory WHERE libraryId = ?
130
- `)
131
- .get(libraryId);
132
- let currentServerOrder = orderResult.serverOrder || 0;
133
- const insertStatement = this.db.prepare(`
134
- INSERT OR REPLACE INTO OperationHistory (libraryId, oid, data, timestamp, replicaId, serverOrder)
135
- VALUES (?, ?, ?, ?, ?, ?)
136
- `);
137
- for (const item of items) {
138
- insertStatement.run(libraryId, item.oid, JSON.stringify(item.data), item.timestamp, replicaId, ++currentServerOrder);
139
- }
140
- });
141
- tx();
142
- };
143
- this.dropAll = async (libraryId, items) => {
144
- const deleteStatement = this.db.prepare(`
145
- DELETE FROM OperationHistory
146
- WHERE libraryId = ? AND replicaId = ? AND oid = ? AND timestamp = ?
147
- `);
148
- this.db.transaction(() => {
149
- for (const item of items) {
150
- deleteStatement.run(libraryId, item.replicaId, item.oid, item.timestamp);
151
- }
152
- })();
153
- };
154
- this.deleteAll = (libraryId) => {
155
- this.db
156
- .prepare(`
157
- DELETE FROM OperationHistory
158
- WHERE libraryId = ?
159
- `)
160
- .run(libraryId);
161
- };
162
- }
163
- }
164
- exports.OperationHistory = OperationHistory;
165
- //# sourceMappingURL=OperationHistory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationHistory.js","sourceRoot":"","sources":["../../src/OperationHistory.ts"],"names":[],"mappings":"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"}
@@ -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
- }
@@ -1,60 +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
- exports.Presence = void 0;
7
- const events_1 = __importDefault(require("events"));
8
- /**
9
- * Stores client presence in-memory for connected
10
- * clients
11
- */
12
- class Presence extends events_1.default {
13
- constructor() {
14
- super(...arguments);
15
- this.presences = new Map();
16
- this.getLibrary = (libraryId) => {
17
- let map = this.presences.get(libraryId);
18
- if (!map) {
19
- map = {
20
- presences: {},
21
- replicaToUser: {},
22
- userToReplica: {},
23
- };
24
- this.presences.set(libraryId, map);
25
- }
26
- return map;
27
- };
28
- this.set = (libraryId, userId, presence) => {
29
- const lib = this.getLibrary(libraryId);
30
- lib.presences[userId] = presence;
31
- lib.replicaToUser[presence.replicaId] = userId;
32
- lib.userToReplica[userId] = lib.userToReplica[userId] || new Set();
33
- lib.userToReplica[userId].add(presence.replicaId);
34
- };
35
- this.removeReplica = (libraryId, replicaId) => {
36
- const lib = this.getLibrary(libraryId);
37
- const userId = lib.replicaToUser[replicaId];
38
- if (!userId)
39
- return;
40
- lib.userToReplica[userId].delete(replicaId);
41
- if (lib.userToReplica[userId].size === 0) {
42
- delete lib.presences[userId];
43
- this.emit('lost', libraryId, replicaId, userId);
44
- // memory cleanup
45
- if (Object.keys(lib.presences).length === 0) {
46
- this.clear(libraryId);
47
- }
48
- }
49
- };
50
- this.all = (libraryId) => {
51
- var _a;
52
- return ((_a = this.presences.get(libraryId)) === null || _a === void 0 ? void 0 : _a.presences) || {};
53
- };
54
- this.clear = (libraryId) => {
55
- this.presences.delete(libraryId);
56
- };
57
- }
58
- }
59
- exports.Presence = Presence;
60
- //# sourceMappingURL=Presence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Presence.js","sourceRoot":"","sources":["../../src/Presence.ts"],"names":[],"mappings":";;;;;;AACA,oDAAkC;AAElC;;;GAGG;AACH,MAAa,QAAS,SAAQ,gBAAY;IAA1C;;QACS,cAAS,GAOb,IAAI,GAAG,EAAE,CAAC;QAEN,eAAU,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,EAAE;gBACT,GAAG,GAAG;oBACL,SAAS,EAAE,EAAE;oBACb,aAAa,EAAE,EAAE;oBACjB,aAAa,EAAE,EAAE;iBACjB,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;aACnC;YACD,OAAO,GAAG,CAAC;QACZ,CAAC,CAAC;QAEF,QAAG,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,QAA4B,EAAE,EAAE;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACvC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC;YACjC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;YAC/C,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC3E,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,kBAAa,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5C,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE;gBACzC,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;gBAEhD,iBAAiB;gBACjB,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC5C,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;iBACtB;aACD;QACF,CAAC,CAAC;QAEF,QAAG,GAAG,CAAC,SAAiB,EAAE,EAAE;;YAC3B,OAAO,CAAA,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,0CAAE,SAAS,KAAI,EAAE,CAAC;QACvD,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC,CAAC;IACH,CAAC;CAAA;AAvDD,4BAuDC"}
@@ -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,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UserProfileLoader = void 0;
4
- class UserProfileLoader {
5
- constructor(source) {
6
- this.source = source;
7
- this.cache = new Map();
8
- this.get = async (userId) => {
9
- if (!this.cache.has(userId)) {
10
- this.cache.set(userId, this.source.get(userId));
11
- }
12
- return this.cache.get(userId);
13
- };
14
- this.evict = (userId) => {
15
- this.cache.delete(userId);
16
- };
17
- }
18
- }
19
- exports.UserProfileLoader = UserProfileLoader;
20
- //# sourceMappingURL=Profiles.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Profiles.js","sourceRoot":"","sources":["../../src/Profiles.ts"],"names":[],"mappings":";;;AAIA,MAAa,iBAAiB;IAG7B,YAAoB,MAA6B;QAA7B,WAAM,GAAN,MAAM,CAAuB;QAFzC,UAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;QAIpD,QAAG,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;aAChD;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAChC,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,MAAc,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC;IAZkD,CAAC;CAarD;AAhBD,8CAgBC"}
@@ -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
- }