@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,572 +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
- import { Busboy } from '@fastify/busboy';
13
- import { assert, createOid, generateId, VerdantError, } from '@verdant-web/common';
14
- import EventEmitter from 'events';
15
- import { Server as HttpServer } from 'http';
16
- import { Readable } from 'stream';
17
- import { URL } from 'url';
18
- import { WebSocketServer } from 'ws';
19
- import { ClientConnectionManager } from './ClientConnection.js';
20
- import { UserProfileLoader } from './Profiles.js';
21
- import { ReplicaKeepaliveTimers } from './ReplicaKeepaliveTimers.js';
22
- import { ServerLibrary } from './ServerLibrary.js';
23
- import { TokenVerifier } from './TokenVerifier.js';
24
- class DefaultProfiles {
25
- constructor() {
26
- this.get = async (userId) => {
27
- return { id: userId };
28
- };
29
- }
30
- }
31
- export class Server extends EventEmitter {
32
- constructor(options) {
33
- var _a, _b;
34
- super();
35
- this.clientConnections = new ClientConnectionManager();
36
- this.keepalives = new ReplicaKeepaliveTimers();
37
- this.connectionToReplicaIdMap = new WeakMap();
38
- this.log = () => { };
39
- this.__testMode = false;
40
- /**
41
- * Attaches the Verdant server to an HttpServer instance, which
42
- * allows it to handle requests and websockets required for the
43
- * Verdant protocol.
44
- *
45
- * You can pass httpPath = false if you want to handle HTTP requests
46
- * yourself, and this will only attach the websocket handling.
47
- */
48
- this.attach = (server, options = {}) => {
49
- if (this.httpServer) {
50
- this.httpServer.off('upgrade', this.handleUpgrade);
51
- }
52
- this.httpServer = server;
53
- this.httpServer.on('upgrade', this.handleUpgrade);
54
- if (options.httpPath !== false) {
55
- this.httpServer.on('request', this.createInternalRequestHandler(options.httpPath));
56
- }
57
- };
58
- /**
59
- * Handles an HTTP upgrade request to a websocket connection.
60
- */
61
- this.handleUpgrade = async (req, socket, head) => {
62
- try {
63
- const info = this.authorizeRequest(req);
64
- this.wss.handleUpgrade(req, socket, head, (ws) => {
65
- this.wss.emit('connection', ws, req, info);
66
- });
67
- }
68
- catch (e) {
69
- this.emit('error', e);
70
- if (e instanceof VerdantError && e.httpStatus === 401) {
71
- socket.write('HTTP/1.1 401 Unauthorized\r\n' +
72
- 'Connection: close\r\n' +
73
- 'Content-Length: 0\r\n' +
74
- '\r\n');
75
- }
76
- socket.destroy();
77
- }
78
- };
79
- this.authorizeRequest = (req) => {
80
- return this.tokenVerifier.verifyToken(this.getRequestToken(req));
81
- };
82
- this.getRequestToken = (req) => {
83
- if (isFetch(req)) {
84
- const authHeader = req.headers.get('Authorization');
85
- if (!authHeader) {
86
- throw new VerdantError(VerdantError.Code.NoToken, undefined, 'Authorization header is required');
87
- }
88
- const [type, token] = authHeader.split(' ');
89
- if (type === 'Bearer') {
90
- return token;
91
- }
92
- return token;
93
- }
94
- if (req.headers.authorization) {
95
- const [type, token] = req.headers.authorization.split(' ');
96
- if (type === 'Bearer') {
97
- return token;
98
- }
99
- }
100
- if (req.headers['sec-websocket-protocol']) {
101
- // hack: read the token from the websocket protocol header
102
- const [type, token] = req.headers['sec-websocket-protocol'].split(',');
103
- if (type === 'Bearer') {
104
- return token.trim();
105
- }
106
- }
107
- assert(req.url, 'Request URL is required');
108
- const url = new URL(req.url, 'http://localhost');
109
- const token = url.searchParams.get('token');
110
- if (!token) {
111
- throw new VerdantError(VerdantError.Code.NoToken, undefined, 'Token query parameter is required');
112
- }
113
- return token;
114
- };
115
- this.createInternalRequestHandler = (pathPrefix = '/sync') => {
116
- const handleRequest = (req, res) => {
117
- const url = new URL(req.url || '', 'http://localhost');
118
- if (url.pathname.startsWith('sync')) {
119
- if (url.pathname === 'sync') {
120
- return this.handleRequest(req, res);
121
- }
122
- else if (url.pathname.startsWith('/sync/files/')) {
123
- return this.handleFileRequest(req, res);
124
- }
125
- }
126
- else {
127
- res.writeHead(404);
128
- res.end();
129
- }
130
- };
131
- return handleRequest;
132
- };
133
- /**
134
- * Handles an HTTP request from a verdant client.
135
- */
136
- this.handleRequest = async (req, res) => {
137
- var _a;
138
- try {
139
- if (req.method === 'POST') {
140
- const info = this.authorizeRequest(req);
141
- const key = generateId();
142
- const finish = this.clientConnections.addRequest(info.libraryId, key, req, res, info);
143
- // FIXME: extremely naive compatibility with connect-like
144
- // servers...
145
- const body = (_a = req.body) !== null && _a !== void 0 ? _a : (await new Promise((resolve, reject) => {
146
- let body = '';
147
- req.on('data', (chunk) => {
148
- body += chunk;
149
- });
150
- req.on('end', () => {
151
- resolve(JSON.parse(body));
152
- });
153
- req.on('error', (e) => {
154
- reject(e);
155
- });
156
- }));
157
- await this.handleRequestBody(key, info, body);
158
- finish();
159
- this.emit('request', info);
160
- }
161
- }
162
- catch (e) {
163
- return this.writeErrorResponse(e, res);
164
- }
165
- };
166
- /**
167
- * Handles a "fetch" style request. Complement to handleRequest, for servers
168
- * that use Request/Response style handlers.
169
- */
170
- this.handleFetch = async (req) => {
171
- try {
172
- const info = this.authorizeRequest(req);
173
- const key = generateId();
174
- const finish = this.clientConnections.addFetch(info.libraryId, key, req, info);
175
- const body = (await req.json());
176
- if (!body) {
177
- throw new VerdantError(VerdantError.Code.BodyRequired);
178
- }
179
- await this.handleRequestBody(key, info, body);
180
- const res = finish();
181
- this.emit('request', info);
182
- return res;
183
- }
184
- catch (e) {
185
- return this.getErrorResponse(e);
186
- }
187
- };
188
- this.handleRequestBody = async (key, info, body) => {
189
- for (const message of body.messages) {
190
- await this.handleMessage(key, info, message);
191
- }
192
- // update our keepalive timers for presence management
193
- const firstMessage = body.messages[0];
194
- if (firstMessage) {
195
- this.keepalives.refresh(info.libraryId, firstMessage.replicaId);
196
- }
197
- };
198
- /**
199
- * Handles a multipart upload of a file from a verdant client. The upload
200
- * will include parameters for the file's ID, name, and type. The request
201
- * must be authenticated with a token to tie it to a library.
202
- */
203
- this.handleFileRequest = async (req, res) => {
204
- this.log('info', 'Handling file request', req.url, req.method);
205
- try {
206
- const info = this.authorizeRequest(req);
207
- const url = new URL(req.originalUrl || req.baseUrl || req.url || '', 'http://localhost');
208
- const id = url.pathname.split('/').pop();
209
- if (!id || id === 'files') {
210
- throw new VerdantError(VerdantError.Code.NotFound);
211
- }
212
- if (req.method === 'POST') {
213
- await this.streamIncomingFile({
214
- req,
215
- info,
216
- headers: req.headers,
217
- id,
218
- });
219
- this.log('info', 'File upload complete', id);
220
- res.writeHead(200, {
221
- 'Content-Type': 'application/json',
222
- });
223
- res.write(JSON.stringify({ success: true }));
224
- res.end();
225
- }
226
- else if (req.method === 'GET') {
227
- const data = await this.getFileData(info.libraryId, id);
228
- res.writeHead(200, {
229
- 'Content-Type': 'application/json',
230
- });
231
- res.write(JSON.stringify(data));
232
- res.end();
233
- }
234
- }
235
- catch (e) {
236
- return this.writeErrorResponse(e, res);
237
- }
238
- };
239
- /**
240
- * Handles a "fetch" style file request. Complement to handleFileRequest,
241
- * for servers that use Request/Response style handlers.
242
- */
243
- this.handleFileFetch = async (req) => {
244
- this.log('info', 'Handling file fetch', req.url, req.method);
245
- try {
246
- const info = this.authorizeRequest(req);
247
- const url = new URL(req.url, 'http://localhost');
248
- const id = url.pathname.split('/').pop();
249
- if (!id || id === 'files') {
250
- throw new VerdantError(VerdantError.Code.NotFound);
251
- }
252
- if (req.method === 'POST') {
253
- if (!req.body) {
254
- throw new VerdantError(VerdantError.Code.InvalidRequest);
255
- }
256
- const headersAsRecord = Array.from(req.headers.entries()).reduce((acc, [key, value]) => {
257
- acc[key] = value;
258
- return acc;
259
- }, {});
260
- await this.streamIncomingFile({
261
- req: Readable.fromWeb(req.body),
262
- info,
263
- headers: headersAsRecord,
264
- id,
265
- });
266
- this.log('info', 'File upload complete', id);
267
- return new Response(JSON.stringify({ success: true }), {
268
- status: 200,
269
- headers: {
270
- 'Content-Type': 'application/json',
271
- },
272
- });
273
- }
274
- else if (req.method === 'GET') {
275
- const data = await this.getFileData(info.libraryId, id);
276
- return new Response(JSON.stringify(data), {
277
- status: 200,
278
- headers: {
279
- 'Content-Type': 'application/json',
280
- },
281
- });
282
- }
283
- else {
284
- throw new VerdantError(VerdantError.Code.InvalidRequest);
285
- }
286
- }
287
- catch (e) {
288
- return this.getErrorResponse(e);
289
- }
290
- };
291
- this.getFileStorageOrThrow = () => {
292
- if (!this.fileStorage) {
293
- throw new VerdantError(VerdantError.Code.NoFileStorage);
294
- }
295
- return this.fileStorage;
296
- };
297
- this.streamIncomingFile = ({ id, req, headers, info, }) => {
298
- const fs = this.getFileStorageOrThrow();
299
- // TODO: remove this once I figured out why the heck multipart
300
- // file uploads from the integration testing environment are
301
- // just completely hanging on request...
302
- if (this.__testMode) {
303
- this.log('warn', 'TEST MODE: FILE WILL NOT BE WRITTEN', '\n', 'This Verdant server was launched in Test Mode. This is only meant for use', 'in automated testing environments. The file just uploaded WILL NOT be', 'stored on disk or retrievable.');
304
- // Fake a file upload for testing
305
- return this.storage.ready
306
- .then(() => {
307
- return this.storage.fileMetadata.put(info.libraryId, {
308
- id,
309
- libraryId: info.libraryId,
310
- fileName: 'test.txt',
311
- type: 'text/plain',
312
- });
313
- })
314
- .then(() => {
315
- return fs.put(new Readable({
316
- read() {
317
- this.push('test');
318
- this.push(null);
319
- },
320
- }), {
321
- id,
322
- libraryId: info.libraryId,
323
- fileName: 'test.txt',
324
- type: 'text/plain',
325
- });
326
- });
327
- }
328
- return new Promise((resolve, reject) => {
329
- const bb = new Busboy({
330
- headers: Object.assign(Object.assign({}, headers), { 'content-type': headers['content-type'] }),
331
- });
332
- bb.on('file', async (fieldName, stream, fileName, _, mimeType) => {
333
- // too many 'info's....
334
- const lofiFileInfo = {
335
- id,
336
- libraryId: info.libraryId,
337
- fileName,
338
- type: mimeType,
339
- };
340
- // write metadata to storage
341
- try {
342
- await this.storage.ready;
343
- await this.storage.fileMetadata.put(info.libraryId, lofiFileInfo);
344
- fs.put(stream, lofiFileInfo);
345
- this.log('info', 'File uploading', lofiFileInfo);
346
- }
347
- catch (e) {
348
- reject(e);
349
- }
350
- });
351
- bb.on('finish', () => {
352
- this.log('info', 'File upload stream finished');
353
- resolve();
354
- });
355
- bb.on('error', (err) => {
356
- this.log('error', 'File upload stream error', err);
357
- reject(new VerdantError(VerdantError.Code.Unexpected, err));
358
- });
359
- bb.on('fieldsLimit', () => {
360
- reject(new VerdantError(VerdantError.Code.Unexpected, undefined, 'Fields limit exceeded'));
361
- });
362
- bb.on('filesLimit', () => {
363
- reject(new VerdantError(VerdantError.Code.Unexpected, undefined, 'Files limit exceeded'));
364
- });
365
- bb.on('partsLimit', () => {
366
- reject(new VerdantError(VerdantError.Code.Unexpected, undefined, 'Parts limit exceeded'));
367
- });
368
- req.pipe(bb);
369
- });
370
- };
371
- this.getFileData = async (library, fileId) => {
372
- const fs = this.getFileStorageOrThrow();
373
- await this.storage.ready;
374
- const fileInfo = await this.storage.fileMetadata.get(library, fileId);
375
- if (!fileInfo) {
376
- throw new VerdantError(VerdantError.Code.NotFound, undefined, `File ${fileId} not found`);
377
- }
378
- const url = await fs.getUrl({
379
- fileName: fileInfo.name,
380
- id: fileInfo.fileId,
381
- libraryId: library,
382
- type: fileInfo.type,
383
- });
384
- return {
385
- id: fileInfo.fileId,
386
- url,
387
- remote: true,
388
- name: fileInfo.name,
389
- type: fileInfo.type,
390
- };
391
- };
392
- this.broadcast = (libraryId, message, omitKeys = []) => {
393
- this.clientConnections.broadcast(libraryId, message, omitKeys);
394
- };
395
- this.send = (libraryId, key, message) => {
396
- this.clientConnections.respond(libraryId, key, message);
397
- };
398
- this.handleMessage = (clientKey, info, message) => {
399
- this.log('debug', 'Got message from user', info.userId, ', library', info.libraryId, JSON.stringify(message));
400
- return this.library.receive(message, clientKey, info);
401
- };
402
- this.handleConnection = (ws, req, info) => {
403
- const key = generateId();
404
- this.clientConnections.addSocket(info.libraryId, key, ws, info);
405
- ws.on('message', async (message) => {
406
- const data = JSON.parse(message.toString());
407
- if (data.replicaId) {
408
- this.connectionToReplicaIdMap.set(ws, data.replicaId);
409
- this.keepalives.refresh(info.libraryId, data.replicaId);
410
- }
411
- await this.handleMessage(key, info, data);
412
- });
413
- ws.on('close', () => {
414
- const replicaId = this.connectionToReplicaIdMap.get(ws);
415
- if (!replicaId) {
416
- this.emit('warning', 'Unknown replica disconnected', ws);
417
- return;
418
- }
419
- this.library.remove(info.libraryId, replicaId);
420
- this.emit('socket-close', info);
421
- });
422
- this.emit('socket-connection', info);
423
- };
424
- this.listen = (...params) => {
425
- this.httpServer.listen(...params);
426
- };
427
- this.close = async () => {
428
- await Promise.all([
429
- new Promise((resolve) => {
430
- setTimeout(() => {
431
- this.log('warn', 'HTTP server close timed out');
432
- resolve();
433
- }, 5 * 1000);
434
- this.httpServer.close(() => {
435
- resolve();
436
- this.log('info', 'HTTP server closed');
437
- });
438
- }),
439
- new Promise((resolve) => {
440
- setTimeout(() => {
441
- this.log('warn', 'Socket server close timed out');
442
- resolve();
443
- }, 5 * 1000);
444
- this.wss.close(() => {
445
- resolve();
446
- this.log('info', 'Socket server closed');
447
- });
448
- }),
449
- ]);
450
- await this.storage.close();
451
- };
452
- /**
453
- * Completely remove a library from the server.
454
- * This will remove all data associated with the library.
455
- * Use it very carefully! Data will still be stored on user
456
- * devices, so this is not as scary as it sounds - the next time
457
- * any replica connects, it will repopulate the library. But
458
- * you should still be careful.
459
- */
460
- this.evictLibrary = async (libraryId) => {
461
- // disconnect all clients
462
- this.clientConnections.disconnectAll(libraryId);
463
- await this.library.destroy(libraryId);
464
- this.log('info', 'Evicted library', libraryId);
465
- };
466
- /**
467
- * Returns currently connected replica info for a library
468
- */
469
- this.getLibraryPresence = (libraryId) => {
470
- return this.library.getPresence(libraryId);
471
- };
472
- /**
473
- * Returns helpful information about a library.
474
- * This is currently only the known replicas and some
475
- * more low-level metadata.
476
- */
477
- this.getLibraryInfo = (libraryId) => {
478
- return this.library.getInfo(libraryId);
479
- };
480
- /**
481
- * Removes all replicas associated with a User ID from
482
- * the server. Consistency algorithms will no longer wait on these
483
- * replicas before confirming and squashing changes.
484
- */
485
- this.evictUser = (libraryId, userId) => {
486
- this.library.evictUser(libraryId, userId);
487
- this.log('info', 'Evicted user', userId, 'from library', libraryId);
488
- };
489
- /**
490
- * Retrieves a snapshot of the full document contents at this time.
491
- * Useful for capturing the shape of data for static usage outside
492
- * of the live system.
493
- */
494
- this.getDocumentSnapshot = (libraryId, collection, documentId) => {
495
- return this.library.getDocumentSnapshot(libraryId, createOid(collection, documentId));
496
- };
497
- this.__testMode =
498
- process.env.NODE_ENV === 'test' && process.env.VITEST === 'true';
499
- this.log = options.log || this.log;
500
- this.tokenVerifier = new TokenVerifier({
501
- secret: options.tokenSecret,
502
- });
503
- this.fileStorage = options.fileStorage;
504
- this.storage = options.storage({
505
- fileDeleteExpirationDays: (_b = (_a = options.fileConfig) === null || _a === void 0 ? void 0 : _a.deleteExpirationDays) !== null && _b !== void 0 ? _b : 14,
506
- replicaTruancyMinutes: options.replicaTruancyMinutes || 60 * 24 * 14,
507
- });
508
- this.library = new ServerLibrary({
509
- storage: this.storage,
510
- sender: this,
511
- profiles: new UserProfileLoader(options.profiles || new DefaultProfiles()),
512
- log: this.log,
513
- disableRebasing: options.disableRebasing,
514
- fileStorage: this.fileStorage,
515
- });
516
- this.library.subscribe('changes', (_a, operations, baselines) => {
517
- var { token } = _a, info = __rest(_a, ["token"]);
518
- this.emit('changes', info, operations, baselines);
519
- });
520
- this.wss = new WebSocketServer({
521
- noServer: true,
522
- });
523
- this.wss.on('connection', this.handleConnection);
524
- if (options.httpServer) {
525
- // backwards compat with old httpServer option - it didn't attach path handlers
526
- this.attach(options.httpServer, { httpPath: false });
527
- }
528
- else {
529
- this.attach(new HttpServer(this.createInternalRequestHandler()));
530
- }
531
- this.keepalives.subscribe('lost', this.library.remove);
532
- }
533
- writeErrorResponse(e, res) {
534
- this.emit('error', e);
535
- this.log('error', 'Error handling request', e);
536
- if (e instanceof VerdantError) {
537
- // write error data to response
538
- res.writeHead(e.httpStatus);
539
- res.write(JSON.stringify(e.toResponse()));
540
- }
541
- else {
542
- res.writeHead(500);
543
- res.write(JSON.stringify(new VerdantError(VerdantError.Code.Unexpected).toResponse()));
544
- }
545
- res.end();
546
- }
547
- // for fetch-style
548
- getErrorResponse(e) {
549
- this.emit('error', e);
550
- this.log('error', 'Error handling request', e);
551
- if (e instanceof VerdantError) {
552
- return new Response(JSON.stringify(e.toResponse()), {
553
- status: e.httpStatus,
554
- headers: {
555
- 'Content-Type': 'application/json',
556
- },
557
- });
558
- }
559
- else {
560
- return new Response(JSON.stringify(new VerdantError(VerdantError.Code.Unexpected).toResponse()), {
561
- status: 500,
562
- headers: {
563
- 'Content-Type': 'application/json',
564
- },
565
- });
566
- }
567
- }
568
- }
569
- function isFetch(request) {
570
- return 'json' in request;
571
- }
572
- //# sourceMappingURL=Server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Server.js","sourceRoot":"","sources":["../../src/Server.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- import { ClientMessage, DocumentBaseline, EventSubscriber, Operation } from '@verdant-web/common';
2
- import { MessageSender } from './MessageSender.js';
3
- import { UserProfileLoader } from './Profiles.js';
4
- import { TokenInfo } from './TokenVerifier.js';
5
- import { FileStorage } from './files/FileStorage.js';
6
- import { Storage } from './storage/Storage.js';
7
- import { LibraryInfo } from './types.js';
8
- export type ServerLibraryEvents = {
9
- changes: (info: TokenInfo, operations: Operation[], baselines: DocumentBaseline[]) => void;
10
- };
11
- export declare class ServerLibrary extends EventSubscriber<ServerLibraryEvents> {
12
- private storage;
13
- private sender;
14
- private profiles;
15
- private presences;
16
- private disableRebasing;
17
- private fileStorage;
18
- private log;
19
- constructor({ storage, sender, profiles, log, disableRebasing, fileStorage, }: {
20
- storage: Storage;
21
- sender: MessageSender;
22
- profiles: UserProfileLoader<any>;
23
- log?: (...args: any[]) => void;
24
- disableRebasing?: boolean;
25
- fileStorage?: FileStorage;
26
- });
27
- /**
28
- * Validates a user's access to a replica. If the replica does not
29
- * exist, a user may create it. But if it does exist, its user (clientId)
30
- * must match the user making the request.
31
- */
32
- private validateReplicaAccess;
33
- private hasWriteAccess;
34
- receive: (message: ClientMessage, clientKey: string, info: TokenInfo) => Promise<void>;
35
- remove: (libraryId: string, replicaId: string) => void;
36
- private handleOperation;
37
- /**
38
- * If a replica inserts operations when it's already
39
- * up to date, we can preemptively update its ackedServerOrder
40
- * to avoid a round trip.
41
- */
42
- private preemptiveUpdateServerOrder;
43
- private rebroadcastOperations;
44
- private handleSync;
45
- private createAckNonce;
46
- private handleAck;
47
- private updateHighwater;
48
- private pendingRebaseTimeout;
49
- private enqueueRebase;
50
- private rebase;
51
- private handleHeartbeat;
52
- private handlePresenceUpdate;
53
- private onPresenceLost;
54
- destroy: (libraryId: string) => Promise<void>;
55
- getPresence: (libraryId: string) => Record<string, import("@verdant-web/common").UserInfo<any, any>>;
56
- getInfo: (libraryId: string) => Promise<LibraryInfo | null>;
57
- evictUser: (libraryId: string, userId: string) => Promise<void>;
58
- getDocumentSnapshot: (libraryId: string, oid: string) => Promise<any>;
59
- private getObjectSnapshot;
60
- private hydrateObject;
61
- private hydrateFile;
62
- private removeBaselineExtras;
63
- private removeOperationExtras;
64
- }