@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.
- package/bin/server.mjs +110 -107
- package/dist/esm/TokenVerifier.d.ts +1 -0
- package/dist/esm/TokenVerifier.js +3 -0
- package/dist/esm/TokenVerifier.js.map +1 -1
- package/dist/esm/adapters/node/errorHandler.d.ts +2 -0
- package/dist/esm/adapters/node/errorHandler.js +12 -0
- package/dist/esm/adapters/node/errorHandler.js.map +1 -0
- package/dist/esm/adapters/node/getRequestToken.d.ts +1 -0
- package/dist/esm/adapters/node/getRequestToken.js +25 -0
- package/dist/esm/adapters/node/getRequestToken.js.map +1 -0
- package/dist/esm/adapters/node/httpRouter.d.ts +47 -0
- package/dist/esm/adapters/node/httpRouter.js +88 -0
- package/dist/esm/adapters/node/httpRouter.js.map +1 -0
- package/dist/esm/adapters/node/index.d.ts +5 -0
- package/dist/esm/adapters/node/index.js +6 -0
- package/dist/esm/adapters/node/index.js.map +1 -0
- package/dist/esm/adapters/node/tokenMiddleware.d.ts +7 -0
- package/dist/esm/adapters/node/tokenMiddleware.js +22 -0
- package/dist/esm/adapters/node/tokenMiddleware.js.map +1 -0
- package/dist/esm/adapters/node/websocketHandler.d.ts +4 -0
- package/dist/esm/adapters/node/websocketHandler.js +54 -0
- package/dist/esm/adapters/node/websocketHandler.js.map +1 -0
- package/dist/esm/connections/ClientConnection.d.ts +25 -0
- package/dist/esm/{ClientConnection.js → connections/ClientConnection.js} +47 -38
- package/dist/esm/connections/ClientConnection.js.map +1 -0
- package/dist/esm/connections/MessageSender.d.ts +5 -0
- package/dist/esm/connections/MessageSender.js.map +1 -0
- package/dist/esm/connections/Presence.d.ts +23 -0
- package/dist/esm/connections/Presence.js +65 -0
- package/dist/esm/connections/Presence.js.map +1 -0
- package/dist/esm/core.d.ts +15 -0
- package/dist/esm/core.js +15 -0
- package/dist/esm/core.js.map +1 -0
- package/dist/esm/defaults.d.ts +2 -0
- package/dist/esm/defaults.js +3 -0
- package/dist/esm/defaults.js.map +1 -0
- package/dist/esm/files/FileStorage.d.ts +12 -3
- package/dist/esm/files/FileStorage.js +20 -0
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/index.d.ts +7 -7
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internals.d.ts +14 -0
- package/dist/esm/internals.js +12 -0
- package/dist/esm/internals.js.map +1 -0
- package/dist/esm/libraries/Library.d.ts +78 -0
- package/dist/esm/{ServerLibrary.js → libraries/Library.js} +153 -144
- package/dist/esm/libraries/Library.js.map +1 -0
- package/dist/esm/{ServerLibrary.test.js → libraries/Library.test.js} +42 -33
- package/dist/esm/libraries/Library.test.js.map +1 -0
- package/dist/esm/libraries/generic.d.ts +8 -0
- package/dist/esm/libraries/generic.js +2 -0
- package/dist/esm/libraries/generic.js.map +1 -0
- package/dist/esm/libraries/singleNode.d.ts +53 -0
- package/dist/esm/libraries/singleNode.js +88 -0
- package/dist/esm/libraries/singleNode.js.map +1 -0
- package/dist/esm/logger.d.ts +1 -0
- package/dist/esm/logger.js +2 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/storage/Storage.d.ts +39 -38
- package/dist/esm/storage/StorageManager.d.ts +11 -0
- package/dist/esm/storage/StorageManager.js +32 -0
- package/dist/esm/storage/StorageManager.js.map +1 -0
- package/dist/esm/storage/index.d.ts +1 -2
- package/dist/esm/storage/index.js +1 -2
- package/dist/esm/storage/index.js.map +1 -1
- package/dist/esm/storage/sqlShard/Databases.d.ts +5 -3
- package/dist/esm/storage/sqlShard/Databases.js +11 -7
- package/dist/esm/storage/sqlShard/Databases.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlBaselines.d.ts +16 -17
- package/dist/esm/storage/sqlShard/SqlBaselines.js +55 -59
- package/dist/esm/storage/sqlShard/SqlBaselines.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlFileMetadata.d.ts +13 -13
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js +44 -57
- package/dist/esm/storage/sqlShard/SqlFileMetadata.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlOperations.d.ts +12 -12
- package/dist/esm/storage/sqlShard/SqlOperations.js +38 -73
- package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
- package/dist/esm/storage/sqlShard/SqlReplicas.d.ts +18 -17
- package/dist/esm/storage/sqlShard/SqlReplicas.js +63 -100
- package/dist/esm/storage/sqlShard/SqlReplicas.js.map +1 -1
- package/dist/esm/storage/sqlShard/database.d.ts +25 -5
- package/dist/esm/storage/sqlShard/database.js +47 -15
- package/dist/esm/storage/sqlShard/database.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v1.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v1.js +42 -47
- package/dist/esm/storage/sqlShard/migrations/v1.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations/v2.d.ts +2 -3
- package/dist/esm/storage/sqlShard/migrations/v2.js +5 -15
- package/dist/esm/storage/sqlShard/migrations/v2.js.map +1 -1
- package/dist/esm/storage/sqlShard/migrations.d.ts +5 -7
- package/dist/esm/storage/sqlShard/migrations.js +48 -1
- package/dist/esm/storage/sqlShard/migrations.js.map +1 -1
- package/dist/esm/storage/sqlShard/sqlShardStorage.d.ts +25 -4
- package/dist/esm/storage/sqlShard/sqlShardStorage.js +43 -40
- package/dist/esm/storage/sqlShard/sqlShardStorage.js.map +1 -1
- package/dist/esm/storage/sqlShard/tables.d.ts +9 -6
- package/dist/esm/types.d.ts +1 -2
- package/package.json +24 -13
- package/src/TokenVerifier.ts +4 -0
- package/src/adapters/node/errorHandler.ts +18 -0
- package/src/adapters/node/getRequestToken.ts +34 -0
- package/src/adapters/node/httpRouter.ts +139 -0
- package/src/adapters/node/index.ts +5 -0
- package/src/adapters/node/tokenMiddleware.ts +32 -0
- package/src/adapters/node/websocketHandler.ts +79 -0
- package/src/{ClientConnection.ts → connections/ClientConnection.ts} +64 -57
- package/src/connections/MessageSender.ts +6 -0
- package/src/connections/Presence.ts +95 -0
- package/src/core.ts +36 -0
- package/src/defaults.ts +2 -0
- package/src/files/FileStorage.ts +36 -3
- package/src/index.ts +7 -7
- package/src/internals.ts +14 -0
- package/src/{ServerLibrary.test.ts → libraries/Library.test.ts} +51 -49
- package/src/{ServerLibrary.ts → libraries/Library.ts} +203 -206
- package/src/libraries/generic.ts +9 -0
- package/src/libraries/singleNode.ts +145 -0
- package/src/logger.ts +4 -0
- package/src/storage/Storage.ts +37 -66
- package/src/storage/StorageManager.ts +39 -0
- package/src/storage/index.ts +1 -2
- package/src/storage/sqlShard/Databases.ts +26 -13
- package/src/storage/sqlShard/SqlBaselines.ts +58 -67
- package/src/storage/sqlShard/SqlFileMetadata.ts +51 -72
- package/src/storage/sqlShard/SqlOperations.ts +57 -81
- package/src/storage/sqlShard/SqlReplicas.ts +80 -121
- package/src/storage/sqlShard/database.ts +82 -18
- package/src/storage/sqlShard/migrations/v1.ts +42 -52
- package/src/storage/sqlShard/migrations/v2.ts +5 -19
- package/src/storage/sqlShard/migrations.ts +66 -1
- package/src/storage/sqlShard/sqlShardStorage.ts +56 -55
- package/src/storage/sqlShard/tables.ts +6 -6
- package/src/types.ts +1 -2
- package/dist/esm/ClientConnection.d.ts +0 -19
- package/dist/esm/ClientConnection.js.map +0 -1
- package/dist/esm/MessageSender.d.ts +0 -5
- package/dist/esm/MessageSender.js.map +0 -1
- package/dist/esm/Presence.d.ts +0 -18
- package/dist/esm/Presence.js +0 -65
- package/dist/esm/Presence.js.map +0 -1
- package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
- package/dist/esm/ReplicaKeepaliveTimers.js +0 -27
- package/dist/esm/ReplicaKeepaliveTimers.js.map +0 -1
- package/dist/esm/Server.d.ts +0 -166
- package/dist/esm/Server.js +0 -572
- package/dist/esm/Server.js.map +0 -1
- package/dist/esm/ServerLibrary.d.ts +0 -64
- package/dist/esm/ServerLibrary.js.map +0 -1
- package/dist/esm/ServerLibrary.test.js.map +0 -1
- package/dist/esm/storage/sql/SqlBaselines.d.ts +0 -22
- package/dist/esm/storage/sql/SqlBaselines.js +0 -107
- package/dist/esm/storage/sql/SqlBaselines.js.map +0 -1
- package/dist/esm/storage/sql/SqlFileMetadata.d.ts +0 -18
- package/dist/esm/storage/sql/SqlFileMetadata.js +0 -69
- package/dist/esm/storage/sql/SqlFileMetadata.js.map +0 -1
- package/dist/esm/storage/sql/SqlOperations.d.ts +0 -19
- package/dist/esm/storage/sql/SqlOperations.js +0 -122
- package/dist/esm/storage/sql/SqlOperations.js.map +0 -1
- package/dist/esm/storage/sql/SqlReplicas.d.ts +0 -32
- package/dist/esm/storage/sql/SqlReplicas.js +0 -163
- package/dist/esm/storage/sql/SqlReplicas.js.map +0 -1
- package/dist/esm/storage/sql/database.d.ts +0 -9
- package/dist/esm/storage/sql/database.js +0 -24
- package/dist/esm/storage/sql/database.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v1.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v1.js +0 -59
- package/dist/esm/storage/sql/migrations/v1.js.map +0 -1
- package/dist/esm/storage/sql/migrations/v2.d.ts +0 -3
- package/dist/esm/storage/sql/migrations/v2.js +0 -16
- package/dist/esm/storage/sql/migrations/v2.js.map +0 -1
- package/dist/esm/storage/sql/migrations.d.ts +0 -7
- package/dist/esm/storage/sql/migrations.js +0 -4
- package/dist/esm/storage/sql/migrations.js.map +0 -1
- package/dist/esm/storage/sql/sqlStorage.d.ts +0 -6
- package/dist/esm/storage/sql/sqlStorage.js +0 -35
- package/dist/esm/storage/sql/sqlStorage.js.map +0 -1
- package/dist/esm/storage/sql/tables.d.ts +0 -44
- package/dist/esm/storage/sql/tables.js +0 -2
- package/dist/esm/storage/sql/tables.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.d.ts +0 -7
- package/dist/esm/storage/sqlShard/transfer.js +0 -90
- package/dist/esm/storage/sqlShard/transfer.js.map +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.d.ts +0 -1
- package/dist/esm/storage/sqlShard/transfer.test.js +0 -109
- package/dist/esm/storage/sqlShard/transfer.test.js.map +0 -1
- package/src/MessageSender.ts +0 -10
- package/src/Presence.ts +0 -86
- package/src/ReplicaKeepaliveTimers.ts +0 -34
- package/src/Server.ts +0 -859
- package/src/storage/sql/SqlBaselines.ts +0 -147
- package/src/storage/sql/SqlFileMetadata.ts +0 -94
- package/src/storage/sql/SqlOperations.ts +0 -160
- package/src/storage/sql/SqlReplicas.ts +0 -234
- package/src/storage/sql/database.ts +0 -32
- package/src/storage/sql/migrations/v1.ts +0 -64
- package/src/storage/sql/migrations/v2.ts +0 -20
- package/src/storage/sql/migrations.ts +0 -4
- package/src/storage/sql/sqlStorage.ts +0 -57
- package/src/storage/sql/tables.ts +0 -51
- package/src/storage/sqlShard/transfer.test.ts +0 -149
- package/src/storage/sqlShard/transfer.ts +0 -123
- /package/dist/esm/{MessageSender.js → connections/MessageSender.js} +0 -0
- /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,
|
|
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.
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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 = (
|
|
103
|
-
const lib = this.getLibraryConnections(libraryId);
|
|
115
|
+
this.addRequest = (key, request, response, info) => {
|
|
104
116
|
const connection = new RequestClientConnection(key, request, response, info);
|
|
105
|
-
|
|
117
|
+
this.connections.set(key, connection);
|
|
106
118
|
return () => {
|
|
107
119
|
connection.end();
|
|
108
|
-
|
|
120
|
+
this.connections.delete(key);
|
|
109
121
|
};
|
|
110
122
|
};
|
|
111
|
-
this.addFetch = (
|
|
112
|
-
const lib = this.getLibraryConnections(libraryId);
|
|
123
|
+
this.addFetch = (key, req, info) => {
|
|
113
124
|
const connection = new FetchClientConnection(key, req, info);
|
|
114
|
-
|
|
125
|
+
this.connections.set(key, connection);
|
|
115
126
|
return () => {
|
|
116
127
|
connection.end();
|
|
117
|
-
|
|
128
|
+
this.connections.delete(key);
|
|
118
129
|
return connection.res;
|
|
119
130
|
};
|
|
120
131
|
};
|
|
121
|
-
this.remove = (
|
|
122
|
-
|
|
123
|
-
|
|
132
|
+
this.remove = (key) => {
|
|
133
|
+
this.connections.delete(key);
|
|
134
|
+
this.presence.removeConnection(key);
|
|
124
135
|
};
|
|
125
|
-
this.respond = (
|
|
126
|
-
const
|
|
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
|
|
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 = (
|
|
140
|
-
const
|
|
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 = (
|
|
148
|
-
const
|
|
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
|
-
|
|
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 @@
|
|
|
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>;
|
package/dist/esm/core.js
ADDED
|
@@ -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 @@
|
|
|
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:
|
|
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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"FileStorage.js","sourceRoot":"","sources":["../../../src/files/FileStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -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 {
|
|
6
|
-
export {
|
|
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 {
|
|
9
|
-
export type
|
|
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 {
|
|
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
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
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
|
+
}
|