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