@verdant-web/server 3.3.11 → 4.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 (204) hide show
  1. package/bin/server.mjs +110 -107
  2. package/dist/esm/TokenVerifier.d.ts +1 -0
  3. package/dist/esm/TokenVerifier.js +3 -0
  4. package/dist/esm/TokenVerifier.js.map +1 -1
  5. package/dist/esm/adapters/node/errorHandler.d.ts +2 -0
  6. package/dist/esm/adapters/node/errorHandler.js +12 -0
  7. package/dist/esm/adapters/node/errorHandler.js.map +1 -0
  8. package/dist/esm/adapters/node/getRequestToken.d.ts +1 -0
  9. package/dist/esm/adapters/node/getRequestToken.js +25 -0
  10. package/dist/esm/adapters/node/getRequestToken.js.map +1 -0
  11. package/dist/esm/adapters/node/httpRouter.d.ts +47 -0
  12. package/dist/esm/adapters/node/httpRouter.js +88 -0
  13. package/dist/esm/adapters/node/httpRouter.js.map +1 -0
  14. package/dist/esm/adapters/node/index.d.ts +5 -0
  15. package/dist/esm/adapters/node/index.js +6 -0
  16. package/dist/esm/adapters/node/index.js.map +1 -0
  17. package/dist/esm/adapters/node/tokenMiddleware.d.ts +7 -0
  18. package/dist/esm/adapters/node/tokenMiddleware.js +22 -0
  19. package/dist/esm/adapters/node/tokenMiddleware.js.map +1 -0
  20. package/dist/esm/adapters/node/websocketHandler.d.ts +4 -0
  21. package/dist/esm/adapters/node/websocketHandler.js +54 -0
  22. package/dist/esm/adapters/node/websocketHandler.js.map +1 -0
  23. package/dist/esm/connections/ClientConnection.d.ts +25 -0
  24. package/dist/esm/{ClientConnection.js → connections/ClientConnection.js} +47 -38
  25. package/dist/esm/connections/ClientConnection.js.map +1 -0
  26. package/dist/esm/connections/MessageSender.d.ts +5 -0
  27. package/dist/esm/connections/MessageSender.js.map +1 -0
  28. package/dist/esm/connections/Presence.d.ts +23 -0
  29. package/dist/esm/connections/Presence.js +65 -0
  30. package/dist/esm/connections/Presence.js.map +1 -0
  31. package/dist/esm/core.d.ts +15 -0
  32. package/dist/esm/core.js +15 -0
  33. package/dist/esm/core.js.map +1 -0
  34. package/dist/esm/defaults.d.ts +2 -0
  35. package/dist/esm/defaults.js +3 -0
  36. package/dist/esm/defaults.js.map +1 -0
  37. package/dist/esm/files/FileStorage.d.ts +12 -3
  38. package/dist/esm/files/FileStorage.js +20 -0
  39. package/dist/esm/files/FileStorage.js.map +1 -1
  40. package/dist/esm/index.d.ts +7 -7
  41. package/dist/esm/index.js +2 -2
  42. package/dist/esm/index.js.map +1 -1
  43. package/dist/esm/internals.d.ts +14 -0
  44. package/dist/esm/internals.js +12 -0
  45. package/dist/esm/internals.js.map +1 -0
  46. package/dist/esm/libraries/Library.d.ts +78 -0
  47. package/dist/esm/{ServerLibrary.js → libraries/Library.js} +153 -144
  48. package/dist/esm/libraries/Library.js.map +1 -0
  49. package/dist/esm/{ServerLibrary.test.js → libraries/Library.test.js} +42 -33
  50. package/dist/esm/libraries/Library.test.js.map +1 -0
  51. package/dist/esm/libraries/generic.d.ts +8 -0
  52. package/dist/esm/libraries/generic.js +2 -0
  53. package/dist/esm/libraries/generic.js.map +1 -0
  54. package/dist/esm/libraries/singleNode.d.ts +53 -0
  55. package/dist/esm/libraries/singleNode.js +88 -0
  56. package/dist/esm/libraries/singleNode.js.map +1 -0
  57. package/dist/esm/logger.d.ts +1 -0
  58. package/dist/esm/logger.js +2 -0
  59. package/dist/esm/logger.js.map +1 -0
  60. package/dist/esm/storage/Storage.d.ts +39 -38
  61. package/dist/esm/storage/StorageManager.d.ts +11 -0
  62. package/dist/esm/storage/StorageManager.js +32 -0
  63. package/dist/esm/storage/StorageManager.js.map +1 -0
  64. package/dist/esm/storage/index.d.ts +1 -2
  65. package/dist/esm/storage/index.js +1 -2
  66. package/dist/esm/storage/index.js.map +1 -1
  67. package/dist/esm/storage/sqlShard/Databases.d.ts +5 -3
  68. package/dist/esm/storage/sqlShard/Databases.js +11 -7
  69. package/dist/esm/storage/sqlShard/Databases.js.map +1 -1
  70. package/dist/esm/storage/sqlShard/SqlBaselines.d.ts +16 -17
  71. package/dist/esm/storage/sqlShard/SqlBaselines.js +55 -59
  72. package/dist/esm/storage/sqlShard/SqlBaselines.js.map +1 -1
  73. package/dist/esm/storage/sqlShard/SqlFileMetadata.d.ts +13 -13
  74. package/dist/esm/storage/sqlShard/SqlFileMetadata.js +44 -57
  75. package/dist/esm/storage/sqlShard/SqlFileMetadata.js.map +1 -1
  76. package/dist/esm/storage/sqlShard/SqlOperations.d.ts +12 -12
  77. package/dist/esm/storage/sqlShard/SqlOperations.js +38 -73
  78. package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
  79. package/dist/esm/storage/sqlShard/SqlReplicas.d.ts +18 -17
  80. package/dist/esm/storage/sqlShard/SqlReplicas.js +63 -100
  81. package/dist/esm/storage/sqlShard/SqlReplicas.js.map +1 -1
  82. package/dist/esm/storage/sqlShard/database.d.ts +25 -5
  83. package/dist/esm/storage/sqlShard/database.js +47 -15
  84. package/dist/esm/storage/sqlShard/database.js.map +1 -1
  85. package/dist/esm/storage/sqlShard/migrations/v1.d.ts +2 -3
  86. package/dist/esm/storage/sqlShard/migrations/v1.js +42 -47
  87. package/dist/esm/storage/sqlShard/migrations/v1.js.map +1 -1
  88. package/dist/esm/storage/sqlShard/migrations/v2.d.ts +2 -3
  89. package/dist/esm/storage/sqlShard/migrations/v2.js +5 -15
  90. package/dist/esm/storage/sqlShard/migrations/v2.js.map +1 -1
  91. package/dist/esm/storage/sqlShard/migrations.d.ts +5 -7
  92. package/dist/esm/storage/sqlShard/migrations.js +48 -1
  93. package/dist/esm/storage/sqlShard/migrations.js.map +1 -1
  94. package/dist/esm/storage/sqlShard/sqlShardStorage.d.ts +25 -4
  95. package/dist/esm/storage/sqlShard/sqlShardStorage.js +43 -40
  96. package/dist/esm/storage/sqlShard/sqlShardStorage.js.map +1 -1
  97. package/dist/esm/storage/sqlShard/tables.d.ts +9 -6
  98. package/dist/esm/types.d.ts +1 -2
  99. package/package.json +24 -13
  100. package/src/TokenVerifier.ts +4 -0
  101. package/src/adapters/node/errorHandler.ts +18 -0
  102. package/src/adapters/node/getRequestToken.ts +34 -0
  103. package/src/adapters/node/httpRouter.ts +139 -0
  104. package/src/adapters/node/index.ts +5 -0
  105. package/src/adapters/node/tokenMiddleware.ts +32 -0
  106. package/src/adapters/node/websocketHandler.ts +79 -0
  107. package/src/{ClientConnection.ts → connections/ClientConnection.ts} +64 -57
  108. package/src/connections/MessageSender.ts +6 -0
  109. package/src/connections/Presence.ts +95 -0
  110. package/src/core.ts +36 -0
  111. package/src/defaults.ts +2 -0
  112. package/src/files/FileStorage.ts +36 -3
  113. package/src/index.ts +7 -7
  114. package/src/internals.ts +14 -0
  115. package/src/{ServerLibrary.test.ts → libraries/Library.test.ts} +51 -49
  116. package/src/{ServerLibrary.ts → libraries/Library.ts} +203 -206
  117. package/src/libraries/generic.ts +9 -0
  118. package/src/libraries/singleNode.ts +145 -0
  119. package/src/logger.ts +4 -0
  120. package/src/storage/Storage.ts +37 -66
  121. package/src/storage/StorageManager.ts +39 -0
  122. package/src/storage/index.ts +1 -2
  123. package/src/storage/sqlShard/Databases.ts +26 -13
  124. package/src/storage/sqlShard/SqlBaselines.ts +58 -67
  125. package/src/storage/sqlShard/SqlFileMetadata.ts +51 -72
  126. package/src/storage/sqlShard/SqlOperations.ts +57 -81
  127. package/src/storage/sqlShard/SqlReplicas.ts +80 -121
  128. package/src/storage/sqlShard/database.ts +82 -18
  129. package/src/storage/sqlShard/migrations/v1.ts +42 -52
  130. package/src/storage/sqlShard/migrations/v2.ts +5 -19
  131. package/src/storage/sqlShard/migrations.ts +66 -1
  132. package/src/storage/sqlShard/sqlShardStorage.ts +56 -55
  133. package/src/storage/sqlShard/tables.ts +6 -6
  134. package/src/types.ts +1 -2
  135. package/dist/esm/ClientConnection.d.ts +0 -19
  136. package/dist/esm/ClientConnection.js.map +0 -1
  137. package/dist/esm/MessageSender.d.ts +0 -5
  138. package/dist/esm/MessageSender.js.map +0 -1
  139. package/dist/esm/Presence.d.ts +0 -18
  140. package/dist/esm/Presence.js +0 -65
  141. package/dist/esm/Presence.js.map +0 -1
  142. package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
  143. package/dist/esm/ReplicaKeepaliveTimers.js +0 -27
  144. package/dist/esm/ReplicaKeepaliveTimers.js.map +0 -1
  145. package/dist/esm/Server.d.ts +0 -166
  146. package/dist/esm/Server.js +0 -572
  147. package/dist/esm/Server.js.map +0 -1
  148. package/dist/esm/ServerLibrary.d.ts +0 -64
  149. package/dist/esm/ServerLibrary.js.map +0 -1
  150. package/dist/esm/ServerLibrary.test.js.map +0 -1
  151. package/dist/esm/storage/sql/SqlBaselines.d.ts +0 -22
  152. package/dist/esm/storage/sql/SqlBaselines.js +0 -107
  153. package/dist/esm/storage/sql/SqlBaselines.js.map +0 -1
  154. package/dist/esm/storage/sql/SqlFileMetadata.d.ts +0 -18
  155. package/dist/esm/storage/sql/SqlFileMetadata.js +0 -69
  156. package/dist/esm/storage/sql/SqlFileMetadata.js.map +0 -1
  157. package/dist/esm/storage/sql/SqlOperations.d.ts +0 -19
  158. package/dist/esm/storage/sql/SqlOperations.js +0 -122
  159. package/dist/esm/storage/sql/SqlOperations.js.map +0 -1
  160. package/dist/esm/storage/sql/SqlReplicas.d.ts +0 -32
  161. package/dist/esm/storage/sql/SqlReplicas.js +0 -163
  162. package/dist/esm/storage/sql/SqlReplicas.js.map +0 -1
  163. package/dist/esm/storage/sql/database.d.ts +0 -9
  164. package/dist/esm/storage/sql/database.js +0 -24
  165. package/dist/esm/storage/sql/database.js.map +0 -1
  166. package/dist/esm/storage/sql/migrations/v1.d.ts +0 -3
  167. package/dist/esm/storage/sql/migrations/v1.js +0 -59
  168. package/dist/esm/storage/sql/migrations/v1.js.map +0 -1
  169. package/dist/esm/storage/sql/migrations/v2.d.ts +0 -3
  170. package/dist/esm/storage/sql/migrations/v2.js +0 -16
  171. package/dist/esm/storage/sql/migrations/v2.js.map +0 -1
  172. package/dist/esm/storage/sql/migrations.d.ts +0 -7
  173. package/dist/esm/storage/sql/migrations.js +0 -4
  174. package/dist/esm/storage/sql/migrations.js.map +0 -1
  175. package/dist/esm/storage/sql/sqlStorage.d.ts +0 -6
  176. package/dist/esm/storage/sql/sqlStorage.js +0 -35
  177. package/dist/esm/storage/sql/sqlStorage.js.map +0 -1
  178. package/dist/esm/storage/sql/tables.d.ts +0 -44
  179. package/dist/esm/storage/sql/tables.js +0 -2
  180. package/dist/esm/storage/sql/tables.js.map +0 -1
  181. package/dist/esm/storage/sqlShard/transfer.d.ts +0 -7
  182. package/dist/esm/storage/sqlShard/transfer.js +0 -90
  183. package/dist/esm/storage/sqlShard/transfer.js.map +0 -1
  184. package/dist/esm/storage/sqlShard/transfer.test.d.ts +0 -1
  185. package/dist/esm/storage/sqlShard/transfer.test.js +0 -109
  186. package/dist/esm/storage/sqlShard/transfer.test.js.map +0 -1
  187. package/src/MessageSender.ts +0 -10
  188. package/src/Presence.ts +0 -86
  189. package/src/ReplicaKeepaliveTimers.ts +0 -34
  190. package/src/Server.ts +0 -859
  191. package/src/storage/sql/SqlBaselines.ts +0 -147
  192. package/src/storage/sql/SqlFileMetadata.ts +0 -94
  193. package/src/storage/sql/SqlOperations.ts +0 -160
  194. package/src/storage/sql/SqlReplicas.ts +0 -234
  195. package/src/storage/sql/database.ts +0 -32
  196. package/src/storage/sql/migrations/v1.ts +0 -64
  197. package/src/storage/sql/migrations/v2.ts +0 -20
  198. package/src/storage/sql/migrations.ts +0 -4
  199. package/src/storage/sql/sqlStorage.ts +0 -57
  200. package/src/storage/sql/tables.ts +0 -51
  201. package/src/storage/sqlShard/transfer.test.ts +0 -149
  202. package/src/storage/sqlShard/transfer.ts +0 -123
  203. /package/dist/esm/{MessageSender.js → connections/MessageSender.js} +0 -0
  204. /package/dist/esm/{ServerLibrary.test.d.ts → libraries/Library.test.d.ts} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { authz } from '@verdant-web/common';
2
+ import { Presence } from './Presence.js';
2
3
  class ClientConnection {
3
4
  constructor(key, info) {
4
5
  this.key = key;
@@ -72,87 +73,95 @@ class FetchClientConnection extends ClientConnection {
72
73
  };
73
74
  }
74
75
  }
76
+ function subscribeToSocketEvent(socket, event, handler) {
77
+ if ('on' in socket) {
78
+ socket.on(event, handler);
79
+ return () => socket.off(event, handler);
80
+ }
81
+ else {
82
+ socket.addEventListener(event, (evt) => handler(evt.data));
83
+ return () => socket.removeEventListener(event, handler);
84
+ }
85
+ }
75
86
  class WebSocketClientConnection extends ClientConnection {
76
- constructor(key, ws, info) {
87
+ constructor(key,
88
+ // supports either NodeJS+WS mock websocket or native WebSocket
89
+ // for Cloudflare / Edge environments
90
+ ws, info) {
77
91
  super(key, info);
78
92
  this.ws = ws;
79
93
  this.type = 'websocket';
80
94
  this.handleMessage = (message) => {
81
- this.ws.send(JSON.stringify(message));
95
+ return this.ws.send(JSON.stringify(message));
82
96
  };
83
97
  }
84
98
  }
85
99
  export class ClientConnectionManager {
86
- constructor() {
87
- this.connections = {};
88
- this.getLibraryConnections = (libraryId) => {
89
- if (!this.connections[libraryId]) {
90
- this.connections[libraryId] = new Map();
91
- }
92
- return this.connections[libraryId];
93
- };
94
- this.addSocket = (libraryId, key, socket, info) => {
95
- const lib = this.getLibraryConnections(libraryId);
100
+ constructor({ profiles }) {
101
+ this.connections = new Map();
102
+ this.addSocket = (key, socket, info) => {
96
103
  const connection = new WebSocketClientConnection(key, socket, info);
97
- lib.set(key, connection);
98
- socket.on('close', () => {
99
- lib.delete(key);
100
- });
104
+ this.connections.set(key, connection);
105
+ const unsubscribes = [];
106
+ unsubscribes.push(subscribeToSocketEvent(socket, 'close', () => {
107
+ this.connections.delete(key);
108
+ this.presence.removeConnection(key);
109
+ unsubscribes.forEach((u) => u());
110
+ }));
111
+ unsubscribes.push(subscribeToSocketEvent(socket, 'messsage', () => {
112
+ this.presence.keepAlive(key);
113
+ }));
101
114
  };
102
- this.addRequest = (libraryId, key, request, response, info) => {
103
- const lib = this.getLibraryConnections(libraryId);
115
+ this.addRequest = (key, request, response, info) => {
104
116
  const connection = new RequestClientConnection(key, request, response, info);
105
- lib.set(key, connection);
117
+ this.connections.set(key, connection);
106
118
  return () => {
107
119
  connection.end();
108
- lib.delete(key);
120
+ this.connections.delete(key);
109
121
  };
110
122
  };
111
- this.addFetch = (libraryId, key, req, info) => {
112
- const lib = this.getLibraryConnections(libraryId);
123
+ this.addFetch = (key, req, info) => {
113
124
  const connection = new FetchClientConnection(key, req, info);
114
- lib.set(key, connection);
125
+ this.connections.set(key, connection);
115
126
  return () => {
116
127
  connection.end();
117
- lib.delete(key);
128
+ this.connections.delete(key);
118
129
  return connection.res;
119
130
  };
120
131
  };
121
- this.remove = (libraryId, key) => {
122
- const lib = this.getLibraryConnections(libraryId);
123
- lib.delete(key);
132
+ this.remove = (key) => {
133
+ this.connections.delete(key);
134
+ this.presence.removeConnection(key);
124
135
  };
125
- this.respond = (libraryId, key, message) => {
126
- const lib = this.getLibraryConnections(libraryId);
127
- const connection = lib.get(key);
136
+ this.respond = (key, message) => {
137
+ const connection = this.connections.get(key);
128
138
  if (connection) {
129
139
  connection.respond(message);
130
140
  }
131
141
  else {
132
- throw new Error(`No connection found for library ${libraryId}, key ${key}`);
142
+ throw new Error(`No connection found for key ${key}`);
133
143
  }
134
144
  };
135
145
  /**
136
146
  * Broadcasts a message to all live-connected clients in a library.
137
147
  * This does not reach push/pull clients.
138
148
  */
139
- this.broadcast = (libraryId, message, omitKeys = []) => {
140
- const lib = this.getLibraryConnections(libraryId);
141
- for (const [key, connection] of lib) {
149
+ this.broadcast = (message, omitKeys = []) => {
150
+ for (const [key, connection] of this.connections) {
142
151
  if (!omitKeys.includes(key)) {
143
152
  connection.respond(message);
144
153
  }
145
154
  }
146
155
  };
147
- this.disconnectAll = (libraryId) => {
148
- const lib = this.getLibraryConnections(libraryId);
149
- for (const connection of lib.values()) {
156
+ this.disconnectAll = () => {
157
+ for (const connection of this.connections.values()) {
150
158
  if (connection instanceof WebSocketClientConnection) {
151
159
  connection.ws.close();
152
160
  }
153
161
  }
154
- lib.clear();
162
+ this.connections.clear();
155
163
  };
164
+ this.presence = new Presence(profiles);
156
165
  }
157
166
  }
158
167
  //# sourceMappingURL=ClientConnection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientConnection.js","sourceRoot":"","sources":["../../../src/connections/ClientConnection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { ServerMessage } from '@verdant-web/common';
2
+ export interface MessageSender {
3
+ broadcast(message: ServerMessage, omitKeys?: string[]): void;
4
+ respond(clientKey: string, message: ServerMessage): void;
5
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageSender.js","sourceRoot":"","sources":["../../../src/connections/MessageSender.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { EventSubscriber, UserInfo, UserInfoUpdate } from '@verdant-web/common';
2
+ import { UserProfiles } from '../Profiles.js';
3
+ export type PresenceEvents = {
4
+ lost: (connectionKey: string, userId: string) => void;
5
+ };
6
+ /**
7
+ * Stores client presence in-memory for connected
8
+ * clients
9
+ */
10
+ export declare class Presence extends EventSubscriber<PresenceEvents> {
11
+ private profiles;
12
+ private presences;
13
+ private connectionToUser;
14
+ private userToConnection;
15
+ private keepalives;
16
+ constructor(profiles: UserProfiles<any>);
17
+ set: (connectionKey: string, userId: string, userInfo: UserInfoUpdate) => Promise<UserInfo<any, any>>;
18
+ keepAlive: (connectionKey: string) => void;
19
+ get: (userId: string) => UserInfo<any, any>;
20
+ removeConnection: (connectionKey: string) => void;
21
+ all: () => Record<string, UserInfo<any, any>>;
22
+ clear: () => void;
23
+ }
@@ -0,0 +1,65 @@
1
+ import { EventSubscriber, initialInternalPresence, } from '@verdant-web/common';
2
+ /**
3
+ * Stores client presence in-memory for connected
4
+ * clients
5
+ */
6
+ export class Presence extends EventSubscriber {
7
+ constructor(profiles) {
8
+ super();
9
+ this.profiles = profiles;
10
+ this.presences = {};
11
+ this.connectionToUser = {};
12
+ this.userToConnection = {};
13
+ this.keepalives = new Map();
14
+ this.set = async (connectionKey, userId, userInfo) => {
15
+ if (!this.presences[userId]) {
16
+ this.presences[userId] = Object.assign(Object.assign({}, userInfo), { profile: await this.profiles.get(userId), internal: userInfo.internal || initialInternalPresence });
17
+ }
18
+ else {
19
+ Object.assign(this.presences[userId], userInfo);
20
+ }
21
+ this.connectionToUser[connectionKey] = userId;
22
+ this.userToConnection[userId] =
23
+ this.userToConnection[userId] || new Set();
24
+ this.userToConnection[userId].add(connectionKey);
25
+ this.keepAlive(connectionKey);
26
+ return this.presences[userId];
27
+ };
28
+ this.keepAlive = (connectionKey) => {
29
+ const existing = this.keepalives.get(connectionKey);
30
+ if (existing) {
31
+ clearTimeout(existing);
32
+ }
33
+ this.keepalives.set(connectionKey, setTimeout(() => {
34
+ this.removeConnection(connectionKey);
35
+ this.keepalives.delete(connectionKey);
36
+ }, 30 * 1000));
37
+ };
38
+ this.get = (userId) => {
39
+ return this.presences[userId];
40
+ };
41
+ this.removeConnection = (connectionKey) => {
42
+ const userId = this.connectionToUser[connectionKey];
43
+ if (!userId)
44
+ return;
45
+ this.userToConnection[userId].delete(connectionKey);
46
+ if (this.userToConnection[userId].size === 0) {
47
+ delete this.presences[userId];
48
+ this.emit('lost', connectionKey, userId);
49
+ // memory cleanup
50
+ if (Object.keys(this.presences).length === 0) {
51
+ this.clear();
52
+ }
53
+ }
54
+ };
55
+ this.all = () => {
56
+ return this.presences;
57
+ };
58
+ this.clear = () => {
59
+ this.presences = {};
60
+ this.connectionToUser = {};
61
+ this.userToConnection = {};
62
+ };
63
+ }
64
+ }
65
+ //# sourceMappingURL=Presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Presence.js","sourceRoot":"","sources":["../../../src/connections/Presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { FileStorage } from './files/FileStorage.js';
2
+ import { SingleNodeLibraryManager } from './libraries/singleNode.js';
3
+ import { Logger } from './logger.js';
4
+ import { UserProfiles } from './Profiles.js';
5
+ import { StorageFactory } from './storage/Storage.js';
6
+ export declare function createVerdant({ profiles: profilesSource, storage, tokenSecret, disableRebasing, fileStorage, log, __testMode, }: {
7
+ profiles: UserProfiles<any>;
8
+ storage: StorageFactory;
9
+ tokenSecret: string;
10
+ disableRebasing?: boolean;
11
+ fileStorage?: FileStorage;
12
+ log?: Logger;
13
+ __testMode?: boolean;
14
+ }): SingleNodeLibraryManager;
15
+ export type VerdantCore = ReturnType<typeof createVerdant>;
@@ -0,0 +1,15 @@
1
+ import { SingleNodeLibraryManager } from './libraries/singleNode.js';
2
+ import { UserProfileLoader } from './Profiles.js';
3
+ export function createVerdant({ profiles: profilesSource, storage, tokenSecret, disableRebasing, fileStorage, log, __testMode, }) {
4
+ const profiles = new UserProfileLoader(profilesSource);
5
+ return new SingleNodeLibraryManager({
6
+ profiles,
7
+ storage,
8
+ tokenSecret,
9
+ disableRebasing,
10
+ fileStorage,
11
+ log,
12
+ __testMode,
13
+ });
14
+ }
15
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAGhE,MAAM,UAAU,aAAa,CAAC,EAC7B,QAAQ,EAAE,cAAc,EACxB,OAAO,EACP,WAAW,EACX,eAAe,EACf,WAAW,EACX,GAAG,EACH,UAAU,GASV;IACA,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACvD,OAAO,IAAI,wBAAwB,CAAC;QACnC,QAAQ;QACR,OAAO;QACP,WAAW;QACX,eAAe;QACf,WAAW;QACX,GAAG;QACH,UAAU;KACV,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const defaultFileExpirationDays = 14;
2
+ export declare const defaultReplicaTruancyMinutes: number;
@@ -0,0 +1,3 @@
1
+ export const defaultFileExpirationDays = 14;
2
+ export const defaultReplicaTruancyMinutes = 7 * 24 * 60; // 7 days
3
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS"}
@@ -1,4 +1,5 @@
1
- import { Readable } from 'stream';
1
+ import type { Readable } from 'stream';
2
+ import { ReadableStream } from 'stream/web';
2
3
  export interface FileInfo {
3
4
  fileName: string;
4
5
  id: string;
@@ -14,7 +15,7 @@ export interface FileInfo {
14
15
  * even if the file is not yet uploaded, based on its metadata.
15
16
  */
16
17
  export interface FileStorage {
17
- put(fileStream: Readable, data: FileInfo): Promise<void>;
18
+ put(fileStream: Readable | ReadableStream | any, data: FileInfo): Promise<void>;
18
19
  getUrl(data: FileInfo): string | Promise<string>;
19
20
  delete(data: FileInfo): Promise<void>;
20
21
  }
@@ -28,9 +29,17 @@ export declare class LocalFileStorage implements FileStorage {
28
29
  log?: (level: string, ...args: any[]) => void;
29
30
  });
30
31
  private prepareHost;
31
- put(fileStream: Readable, data: FileInfo): Promise<void>;
32
+ put(fileStream: any, data: FileInfo): Promise<void>;
32
33
  getUrl(data: FileInfo): string;
33
34
  delete(data: FileInfo): Promise<void>;
34
35
  private getPath;
35
36
  private getStorageLocation;
36
37
  }
38
+ export declare class FileStorageLibraryDelegate {
39
+ private libraryId;
40
+ private fileStorage;
41
+ constructor(libraryId: string, fileStorage: FileStorage);
42
+ put: (fileStream: Readable, data: Omit<FileInfo, "libraryId">) => Promise<void>;
43
+ getUrl: (data: Omit<FileInfo, "libraryId">) => string | Promise<string>;
44
+ delete: (data: Omit<FileInfo, "libraryId">) => Promise<void>;
45
+ }
@@ -1,5 +1,6 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
+ import { ReadableStream } from 'stream/web';
3
4
  export class LocalFileStorage {
4
5
  constructor({ rootDirectory, host, log, }) {
5
6
  this.prepareHost = (host) => {
@@ -22,6 +23,10 @@ export class LocalFileStorage {
22
23
  const location = this.getStorageLocation(data);
23
24
  const dest = fs.createWriteStream(location);
24
25
  this.log('info', 'File saving to', location);
26
+ if (fileStream instanceof ReadableStream) {
27
+ // @ts-ignore
28
+ fileStream = Readable.fromWeb(fileStream);
29
+ }
25
30
  fileStream.pipe(dest);
26
31
  }
27
32
  getUrl(data) {
@@ -56,4 +61,19 @@ export class LocalFileStorage {
56
61
  return path.join(this.rootDirectory, this.getPath(data));
57
62
  }
58
63
  }
64
+ export class FileStorageLibraryDelegate {
65
+ constructor(libraryId, fileStorage) {
66
+ this.libraryId = libraryId;
67
+ this.fileStorage = fileStorage;
68
+ this.put = (fileStream, data) => {
69
+ return this.fileStorage.put(fileStream, Object.assign(Object.assign({}, data), { libraryId: this.libraryId }));
70
+ };
71
+ this.getUrl = (data) => {
72
+ return this.fileStorage.getUrl(Object.assign(Object.assign({}, data), { libraryId: this.libraryId }));
73
+ };
74
+ this.delete = (data) => {
75
+ return this.fileStorage.delete(Object.assign(Object.assign({}, data), { libraryId: this.libraryId }));
76
+ };
77
+ }
78
+ }
59
79
  //# sourceMappingURL=FileStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileStorage.js","sourceRoot":"","sources":["../../../src/files/FileStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileStorage.js","sourceRoot":"","sources":["../../../src/files/FileStorage.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- export type { MessageSender } from './MessageSender.js';
2
- export type { UserProfiles } from './Profiles.js';
3
- export type { ClientMessage, ServerMessage } from '@verdant-web/common';
4
1
  export { ReplicaType } from '@verdant-web/common';
5
- export { Server } from './Server.js';
6
- export { TokenProvider } from './TokenProvider.js';
2
+ export type { ClientMessage, ServerMessage } from '@verdant-web/common';
3
+ export { createVerdant, type VerdantCore } from './core.js';
7
4
  export { LocalFileStorage } from './files/FileStorage.js';
8
- export type { FileStorage, FileInfo } from './files/FileStorage.js';
9
- export type { TokenInfo } from './TokenVerifier.js';
5
+ export type { FileInfo, FileStorage } from './files/FileStorage.js';
6
+ export { type LibraryApi } from './libraries/generic.js';
7
+ export type { UserProfiles } from './Profiles.js';
8
+ export { TokenProvider } from './TokenProvider.js';
9
+ export { type TokenInfo } from './TokenVerifier.js';
10
10
  export type { LibraryInfo } from './types.js';
package/dist/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { ReplicaType } from '@verdant-web/common';
2
- export { Server } from './Server.js';
3
- export { TokenProvider } from './TokenProvider.js';
2
+ export { createVerdant } from './core.js';
4
3
  export { LocalFileStorage } from './files/FileStorage.js';
4
+ export { TokenProvider } from './TokenProvider.js';
5
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAoB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export { errorHandler } from './adapters/node/errorHandler.js';
2
+ export { createHttpRouter as createHonoRouter } from './adapters/node/httpRouter.js';
3
+ export { tokenMiddleware } from './adapters/node/tokenMiddleware.js';
4
+ export { ClientConnectionManager } from './connections/ClientConnection.js';
5
+ export { FileStorageLibraryDelegate } from './files/FileStorage.js';
6
+ export type * from './libraries/generic.js';
7
+ export { Library, type LibraryEvents } from './libraries/Library.js';
8
+ export { type Logger } from './logger.js';
9
+ export { UserProfileLoader } from './Profiles.js';
10
+ export { SqliteExecutor } from './storage/sqlShard/database.js';
11
+ export { migrateToLatest } from './storage/sqlShard/migrations.js';
12
+ export { SqlShardStorage } from './storage/sqlShard/sqlShardStorage.js';
13
+ export type { Database as DatabaseTypes } from './storage/sqlShard/tables.js';
14
+ export { TokenVerifier } from './TokenVerifier.js';
@@ -0,0 +1,12 @@
1
+ export { errorHandler } from './adapters/node/errorHandler.js';
2
+ export { createHttpRouter as createHonoRouter } from './adapters/node/httpRouter.js';
3
+ export { tokenMiddleware } from './adapters/node/tokenMiddleware.js';
4
+ export { ClientConnectionManager } from './connections/ClientConnection.js';
5
+ export { FileStorageLibraryDelegate } from './files/FileStorage.js';
6
+ export { Library } from './libraries/Library.js';
7
+ export { UserProfileLoader } from './Profiles.js';
8
+ export { SqliteExecutor } from './storage/sqlShard/database.js';
9
+ export { migrateToLatest } from './storage/sqlShard/migrations.js';
10
+ export { SqlShardStorage } from './storage/sqlShard/sqlShardStorage.js';
11
+ export { TokenVerifier } from './TokenVerifier.js';
12
+ //# sourceMappingURL=internals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals.js","sourceRoot":"","sources":["../../src/internals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAsB,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { ClientMessage, DocumentBaseline, EventSubscriber, Operation } from '@verdant-web/common';
2
+ import { MessageSender } from '../connections/MessageSender.js';
3
+ import { Presence } from '../connections/Presence.js';
4
+ import { FileInfo, FileStorageLibraryDelegate } from '../files/FileStorage.js';
5
+ import { Logger } from '../logger.js';
6
+ import { Storage } from '../storage/Storage.js';
7
+ import { TokenInfo } from '../TokenVerifier.js';
8
+ import { LibraryInfo } from '../types.js';
9
+ export type LibraryEvents = {
10
+ changes: (info: TokenInfo, operations: Operation[], baselines: DocumentBaseline[]) => void;
11
+ };
12
+ export interface LibraryFileInfo {
13
+ id: string;
14
+ name: string;
15
+ type: string;
16
+ url: string | null;
17
+ libraryId: string;
18
+ }
19
+ export declare class Library {
20
+ private storage;
21
+ private sender;
22
+ private disableRebasing;
23
+ private fileStorage;
24
+ private events;
25
+ private id;
26
+ private presence;
27
+ private log;
28
+ constructor({ storage, sender, log, disableRebasing, fileStorage, events, id, presence, }: {
29
+ storage: Storage;
30
+ sender: MessageSender;
31
+ log?: Logger;
32
+ disableRebasing?: boolean;
33
+ fileStorage?: FileStorageLibraryDelegate;
34
+ events?: EventSubscriber<LibraryEvents>;
35
+ id: string;
36
+ presence: Presence;
37
+ });
38
+ private validateReplicaAccess;
39
+ private hasWriteAccess;
40
+ handleMessage: (message: ClientMessage, clientKey: string, info: TokenInfo) => Promise<void>;
41
+ private rebroadcastOperations;
42
+ private handleOperation;
43
+ /**
44
+ * If a replica inserts operations when it's already
45
+ * up to date, we can preemptively update its ackedServerOrder
46
+ * to avoid a round trip.
47
+ */
48
+ private preemptiveUpdateServerOrder;
49
+ private handleSync;
50
+ private createAckNonce;
51
+ private handleAck;
52
+ private updateHighwater;
53
+ private pendingRebaseTimeout;
54
+ private enqueueRebase;
55
+ private rebase;
56
+ private handleHeartbeat;
57
+ private handlePresenceUpdate;
58
+ private onPresenceLost;
59
+ destroy: () => Promise<void>;
60
+ getPresence: () => Promise<Record<string, import("@verdant-web/common").UserInfo<any, any>>>;
61
+ getInfo: () => Promise<LibraryInfo | null>;
62
+ evictUser: (userId: string) => Promise<void>;
63
+ forceTruant: (replicaId: string) => Promise<void>;
64
+ getDocumentSnapshot: (oid: string) => Promise<any>;
65
+ getFileInfo: (fileId: string) => Promise<{
66
+ libraryId: string;
67
+ id: string;
68
+ name: string;
69
+ type: string;
70
+ url: string | null;
71
+ } | null>;
72
+ putFileInfo: (info: FileInfo) => Promise<void>;
73
+ private getObjectSnapshot;
74
+ private hydrateObject;
75
+ private hydrateFile;
76
+ private removeBaselineExtras;
77
+ private removeOperationExtras;
78
+ }