@principal-ai/control-tower-core 0.1.24 → 0.2.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/abstractions/AuthAdapter.d.ts +1 -1
- package/dist/abstractions/AuthAdapter.d.ts.map +1 -1
- package/dist/abstractions/DefaultLockManager.d.ts +2 -2
- package/dist/abstractions/DefaultLockManager.d.ts.map +1 -1
- package/dist/abstractions/DefaultLockManager.js +7 -8
- package/dist/abstractions/DefaultPresenceManager.d.ts +4 -4
- package/dist/abstractions/DefaultPresenceManager.d.ts.map +1 -1
- package/dist/abstractions/DefaultPresenceManager.js +25 -25
- package/dist/abstractions/DefaultRoomManager.d.ts +3 -3
- package/dist/abstractions/DefaultRoomManager.d.ts.map +1 -1
- package/dist/abstractions/DefaultRoomManager.js +6 -4
- package/dist/abstractions/EventEmitter.d.ts.map +1 -1
- package/dist/abstractions/LockManager.d.ts +1 -1
- package/dist/abstractions/LockManager.d.ts.map +1 -1
- package/dist/abstractions/LockManager.js +1 -1
- package/dist/abstractions/PresenceExtension.d.ts +2 -2
- package/dist/abstractions/PresenceExtension.d.ts.map +1 -1
- package/dist/abstractions/PresenceManager.d.ts +1 -1
- package/dist/abstractions/PresenceManager.d.ts.map +1 -1
- package/dist/abstractions/PresenceManager.js +5 -5
- package/dist/abstractions/RoomManager.d.ts +2 -2
- package/dist/abstractions/RoomManager.d.ts.map +1 -1
- package/dist/abstractions/StorageAdapter.d.ts +4 -4
- package/dist/abstractions/StorageAdapter.d.ts.map +1 -1
- package/dist/abstractions/TransportAdapter.d.ts +4 -4
- package/dist/abstractions/TransportAdapter.d.ts.map +1 -1
- package/dist/abstractions/index.d.ts +11 -11
- package/dist/abstractions/index.d.ts.map +1 -1
- package/dist/abstractions/index.js +9 -9
- package/dist/adapters/mock/MockAuthAdapter.d.ts +2 -2
- package/dist/adapters/mock/MockAuthAdapter.d.ts.map +1 -1
- package/dist/adapters/mock/MockAuthAdapter.js +13 -11
- package/dist/adapters/mock/MockRTCDataChannel.d.ts +83 -0
- package/dist/adapters/mock/MockRTCDataChannel.d.ts.map +1 -0
- package/dist/adapters/mock/MockRTCDataChannel.js +146 -0
- package/dist/adapters/mock/MockRTCPeerConnection.d.ts +168 -0
- package/dist/adapters/mock/MockRTCPeerConnection.d.ts.map +1 -0
- package/dist/adapters/mock/MockRTCPeerConnection.js +449 -0
- package/dist/adapters/mock/MockStorageAdapter.d.ts +1 -1
- package/dist/adapters/mock/MockStorageAdapter.d.ts.map +1 -1
- package/dist/adapters/mock/MockStorageAdapter.js +18 -18
- package/dist/adapters/mock/MockTransportAdapter.d.ts +2 -2
- package/dist/adapters/mock/MockTransportAdapter.d.ts.map +1 -1
- package/dist/adapters/mock/MockTransportAdapter.js +38 -38
- package/dist/adapters/mock/index.d.ts +5 -3
- package/dist/adapters/mock/index.d.ts.map +1 -1
- package/dist/adapters/mock/index.js +10 -5
- package/dist/adapters/webrtc/WebRTCSignalingAdapter.d.ts +135 -0
- package/dist/adapters/webrtc/WebRTCSignalingAdapter.d.ts.map +1 -0
- package/dist/adapters/webrtc/WebRTCSignalingAdapter.js +368 -0
- package/dist/adapters/webrtc/index.d.ts +2 -0
- package/dist/adapters/webrtc/index.d.ts.map +1 -0
- package/dist/adapters/webrtc/index.js +5 -0
- package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.d.ts +75 -0
- package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.d.ts.map +1 -0
- package/dist/adapters/websocket/BrowserWebSocketTransportAdapter.js +231 -0
- package/dist/adapters/websocket/WebSocketClientTransportAdapter.d.ts +3 -3
- package/dist/adapters/websocket/WebSocketClientTransportAdapter.d.ts.map +1 -1
- package/dist/adapters/websocket/WebSocketClientTransportAdapter.js +38 -38
- package/dist/adapters/websocket/WebSocketServerTransportAdapter.d.ts +7 -7
- package/dist/adapters/websocket/WebSocketServerTransportAdapter.d.ts.map +1 -1
- package/dist/adapters/websocket/WebSocketServerTransportAdapter.js +94 -91
- package/dist/adapters/websocket/browser.d.ts +2 -0
- package/dist/adapters/websocket/browser.d.ts.map +1 -0
- package/dist/adapters/websocket/browser.js +6 -0
- package/dist/adapters/websocket/index.d.ts +3 -2
- package/dist/adapters/websocket/index.d.ts.map +1 -1
- package/dist/adapters/websocket/index.js +7 -3
- package/dist/adapters/websocket/node.d.ts +3 -0
- package/dist/adapters/websocket/node.d.ts.map +1 -0
- package/dist/adapters/websocket/node.js +8 -0
- package/dist/client/BaseClient.d.ts +6 -6
- package/dist/client/BaseClient.d.ts.map +1 -1
- package/dist/client/BaseClient.js +86 -72
- package/dist/client/ClientBuilder.d.ts +5 -5
- package/dist/client/ClientBuilder.d.ts.map +1 -1
- package/dist/client/ClientBuilder.js +3 -3
- package/dist/client/PresenceClient.d.ts +4 -4
- package/dist/client/PresenceClient.d.ts.map +1 -1
- package/dist/client/PresenceClient.js +30 -30
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -19
- package/dist/index.js.map +27 -23
- package/dist/index.mjs +1590 -558
- package/dist/index.mjs.map +27 -23
- package/dist/server/BaseServer.d.ts +13 -13
- package/dist/server/BaseServer.d.ts.map +1 -1
- package/dist/server/BaseServer.js +224 -143
- package/dist/server/ExperimentalAPI.d.ts +7 -7
- package/dist/server/ExperimentalAPI.d.ts.map +1 -1
- package/dist/server/ExperimentalAPI.js +22 -22
- package/dist/server/ServerBuilder.d.ts +11 -11
- package/dist/server/ServerBuilder.d.ts.map +1 -1
- package/dist/server/ServerBuilder.js +10 -10
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -3
- package/dist/types/auth.d.ts.map +1 -1
- package/dist/types/events.d.ts +10 -10
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/experimental.d.ts +2 -2
- package/dist/types/experimental.d.ts.map +1 -1
- package/dist/types/experimental.js +1 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -2
- package/dist/types/lock.d.ts +2 -2
- package/dist/types/lock.d.ts.map +1 -1
- package/dist/types/presence.d.ts +3 -3
- package/dist/types/presence.d.ts.map +1 -1
- package/dist/types/room.d.ts +4 -4
- package/dist/types/room.d.ts.map +1 -1
- package/dist/types/room.js +2 -2
- package/package.json +15 -7
|
@@ -4,18 +4,18 @@ exports.WebSocketServerTransportAdapter = void 0;
|
|
|
4
4
|
const ws_1 = require("ws");
|
|
5
5
|
class WebSocketServerTransportAdapter {
|
|
6
6
|
constructor(config) {
|
|
7
|
-
this.state =
|
|
7
|
+
this.state = "disconnected";
|
|
8
8
|
this.messageHandlers = new Set();
|
|
9
9
|
this.errorHandlers = new Set();
|
|
10
10
|
this.closeHandlers = new Set();
|
|
11
11
|
// Client management
|
|
12
12
|
this.clients = new Map();
|
|
13
|
-
this.mode =
|
|
13
|
+
this.mode = "standalone";
|
|
14
14
|
this.config = {
|
|
15
15
|
authTimeout: config?.authTimeout ?? 5000,
|
|
16
16
|
closeOnAuthFailure: config?.closeOnAuthFailure ?? false,
|
|
17
17
|
requireAuth: config?.requireAuth ?? false,
|
|
18
|
-
...config
|
|
18
|
+
...config,
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
// Set the auth adapter
|
|
@@ -33,83 +33,83 @@ class WebSocketServerTransportAdapter {
|
|
|
33
33
|
}
|
|
34
34
|
// Standalone mode implementation
|
|
35
35
|
async connect(url, _options) {
|
|
36
|
-
if (this.state ===
|
|
37
|
-
throw new Error(
|
|
36
|
+
if (this.state === "connected" || this.state === "connecting") {
|
|
37
|
+
throw new Error("Already connected or connecting");
|
|
38
38
|
}
|
|
39
|
-
this.state =
|
|
39
|
+
this.state = "connecting";
|
|
40
40
|
this.serverUrl = url;
|
|
41
|
-
this.mode =
|
|
41
|
+
this.mode = "standalone";
|
|
42
42
|
try {
|
|
43
43
|
// Extract port from URL
|
|
44
44
|
const urlObj = new URL(url);
|
|
45
|
-
const port = parseInt(urlObj.port) || (urlObj.protocol ===
|
|
45
|
+
const port = parseInt(urlObj.port) || (urlObj.protocol === "wss:" ? 443 : 80);
|
|
46
46
|
// Create WebSocket server
|
|
47
47
|
this.wss = new ws_1.WebSocketServer({ port });
|
|
48
|
-
this.wss.on(
|
|
48
|
+
this.wss.on("connection", (ws, req) => {
|
|
49
49
|
this.handleConnection(ws, req);
|
|
50
50
|
});
|
|
51
|
-
this.wss.on(
|
|
52
|
-
this.errorHandlers.forEach(handler => handler(error));
|
|
51
|
+
this.wss.on("error", (error) => {
|
|
52
|
+
this.errorHandlers.forEach((handler) => handler(error));
|
|
53
53
|
});
|
|
54
|
-
this.wss.on(
|
|
55
|
-
this.state =
|
|
56
|
-
this.closeHandlers.forEach(handler => handler(1000,
|
|
54
|
+
this.wss.on("close", () => {
|
|
55
|
+
this.state = "disconnected";
|
|
56
|
+
this.closeHandlers.forEach((handler) => handler(1000, "Server closed"));
|
|
57
57
|
});
|
|
58
|
-
this.state =
|
|
58
|
+
this.state = "connected";
|
|
59
59
|
}
|
|
60
60
|
catch (error) {
|
|
61
|
-
this.state =
|
|
61
|
+
this.state = "disconnected";
|
|
62
62
|
throw error;
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
// Integration mode implementation
|
|
66
|
-
async attach(server, path =
|
|
67
|
-
if (this.state ===
|
|
68
|
-
throw new Error(
|
|
66
|
+
async attach(server, path = "/ws") {
|
|
67
|
+
if (this.state === "connected" || this.state === "connecting") {
|
|
68
|
+
throw new Error("Already connected or connecting");
|
|
69
69
|
}
|
|
70
|
-
this.state =
|
|
70
|
+
this.state = "connecting";
|
|
71
71
|
this.attachedServer = server;
|
|
72
72
|
this.webSocketPath = path;
|
|
73
|
-
this.mode =
|
|
73
|
+
this.mode = "integration";
|
|
74
74
|
try {
|
|
75
75
|
// Create WebSocket server attached to the existing HTTP server
|
|
76
76
|
this.wss = new ws_1.WebSocketServer({
|
|
77
77
|
server,
|
|
78
78
|
path,
|
|
79
|
-
perMessageDeflate: false
|
|
79
|
+
perMessageDeflate: false,
|
|
80
80
|
});
|
|
81
|
-
this.wss.on(
|
|
81
|
+
this.wss.on("connection", (ws, req) => {
|
|
82
82
|
this.handleConnection(ws, req);
|
|
83
83
|
});
|
|
84
|
-
this.wss.on(
|
|
85
|
-
this.errorHandlers.forEach(handler => handler(error));
|
|
84
|
+
this.wss.on("error", (error) => {
|
|
85
|
+
this.errorHandlers.forEach((handler) => handler(error));
|
|
86
86
|
});
|
|
87
|
-
this.state =
|
|
87
|
+
this.state = "connected";
|
|
88
88
|
}
|
|
89
89
|
catch (error) {
|
|
90
|
-
this.state =
|
|
90
|
+
this.state = "disconnected";
|
|
91
91
|
throw error;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
94
|
async attachToWebSocketServer(wss) {
|
|
95
|
-
if (this.state ===
|
|
96
|
-
throw new Error(
|
|
95
|
+
if (this.state === "connected" || this.state === "connecting") {
|
|
96
|
+
throw new Error("Already connected or connecting");
|
|
97
97
|
}
|
|
98
|
-
this.state =
|
|
98
|
+
this.state = "connecting";
|
|
99
99
|
this.attachedWss = wss;
|
|
100
|
-
this.mode =
|
|
100
|
+
this.mode = "integration";
|
|
101
101
|
try {
|
|
102
102
|
this.wss = wss;
|
|
103
|
-
this.wss.on(
|
|
103
|
+
this.wss.on("connection", (ws, req) => {
|
|
104
104
|
this.handleConnection(ws, req);
|
|
105
105
|
});
|
|
106
|
-
this.wss.on(
|
|
107
|
-
this.errorHandlers.forEach(handler => handler(error));
|
|
106
|
+
this.wss.on("error", (error) => {
|
|
107
|
+
this.errorHandlers.forEach((handler) => handler(error));
|
|
108
108
|
});
|
|
109
|
-
this.state =
|
|
109
|
+
this.state = "connected";
|
|
110
110
|
}
|
|
111
111
|
catch (error) {
|
|
112
|
-
this.state =
|
|
112
|
+
this.state = "disconnected";
|
|
113
113
|
throw error;
|
|
114
114
|
}
|
|
115
115
|
}
|
|
@@ -141,17 +141,17 @@ class WebSocketServerTransportAdapter {
|
|
|
141
141
|
authenticated,
|
|
142
142
|
userId,
|
|
143
143
|
metadata,
|
|
144
|
-
connectedAt: Date.now()
|
|
144
|
+
connectedAt: Date.now(),
|
|
145
145
|
};
|
|
146
146
|
this.clients.set(clientId, client);
|
|
147
147
|
// Step 3: Set up message handling
|
|
148
|
-
ws.on(
|
|
148
|
+
ws.on("message", (data) => {
|
|
149
149
|
this.handleClientMessage(clientId, data);
|
|
150
150
|
});
|
|
151
|
-
ws.on(
|
|
152
|
-
this.errorHandlers.forEach(handler => handler(error));
|
|
151
|
+
ws.on("error", (error) => {
|
|
152
|
+
this.errorHandlers.forEach((handler) => handler(error));
|
|
153
153
|
});
|
|
154
|
-
ws.on(
|
|
154
|
+
ws.on("close", (_code, _reason) => {
|
|
155
155
|
// Clear auth timeout if exists
|
|
156
156
|
if (client.authTimeout) {
|
|
157
157
|
clearTimeout(client.authTimeout);
|
|
@@ -162,7 +162,7 @@ class WebSocketServerTransportAdapter {
|
|
|
162
162
|
if (!authenticated && this.config.requireAuth && this.authAdapter) {
|
|
163
163
|
client.authTimeout = setTimeout(() => {
|
|
164
164
|
if (!client.authenticated) {
|
|
165
|
-
ws.close(1008,
|
|
165
|
+
ws.close(1008, "Authentication timeout");
|
|
166
166
|
this.clients.delete(clientId);
|
|
167
167
|
}
|
|
168
168
|
}, this.config.authTimeout);
|
|
@@ -170,16 +170,16 @@ class WebSocketServerTransportAdapter {
|
|
|
170
170
|
// Step 5: Notify about connection (with auth status)
|
|
171
171
|
const connectionMessage = {
|
|
172
172
|
id: this.generateId(),
|
|
173
|
-
type:
|
|
173
|
+
type: "connection",
|
|
174
174
|
payload: {
|
|
175
175
|
clientId,
|
|
176
176
|
authenticated,
|
|
177
177
|
userId: client.userId,
|
|
178
|
-
metadata: client.metadata
|
|
178
|
+
metadata: client.metadata,
|
|
179
179
|
},
|
|
180
|
-
timestamp: Date.now()
|
|
180
|
+
timestamp: Date.now(),
|
|
181
181
|
};
|
|
182
|
-
this.messageHandlers.forEach(handler => handler(connectionMessage));
|
|
182
|
+
this.messageHandlers.forEach((handler) => handler(connectionMessage));
|
|
183
183
|
}
|
|
184
184
|
async handleClientMessage(clientId, data) {
|
|
185
185
|
const client = this.clients.get(clientId);
|
|
@@ -188,7 +188,9 @@ class WebSocketServerTransportAdapter {
|
|
|
188
188
|
try {
|
|
189
189
|
const message = JSON.parse(data.toString());
|
|
190
190
|
// Special handling for authentication messages
|
|
191
|
-
if (message.type ===
|
|
191
|
+
if (message.type === "authenticate" &&
|
|
192
|
+
!client.authenticated &&
|
|
193
|
+
this.authAdapter) {
|
|
192
194
|
await this.handleAuthMessage(client, message);
|
|
193
195
|
return;
|
|
194
196
|
}
|
|
@@ -196,9 +198,9 @@ class WebSocketServerTransportAdapter {
|
|
|
196
198
|
if (this.config.requireAuth && !client.authenticated) {
|
|
197
199
|
this.sendToClient(client, {
|
|
198
200
|
id: this.generateId(),
|
|
199
|
-
type:
|
|
200
|
-
payload: { error:
|
|
201
|
-
timestamp: Date.now()
|
|
201
|
+
type: "error",
|
|
202
|
+
payload: { error: "Authentication required" },
|
|
203
|
+
timestamp: Date.now(),
|
|
202
204
|
});
|
|
203
205
|
return;
|
|
204
206
|
}
|
|
@@ -207,33 +209,33 @@ class WebSocketServerTransportAdapter {
|
|
|
207
209
|
...message,
|
|
208
210
|
payload: {
|
|
209
211
|
...message.payload,
|
|
210
|
-
clientId
|
|
211
|
-
}
|
|
212
|
+
clientId,
|
|
213
|
+
},
|
|
212
214
|
};
|
|
213
|
-
this.messageHandlers.forEach(handler => handler(enrichedMessage));
|
|
215
|
+
this.messageHandlers.forEach((handler) => handler(enrichedMessage));
|
|
214
216
|
}
|
|
215
217
|
catch (error) {
|
|
216
|
-
this.errorHandlers.forEach(handler => handler(error));
|
|
218
|
+
this.errorHandlers.forEach((handler) => handler(error));
|
|
217
219
|
}
|
|
218
220
|
}
|
|
219
221
|
async handleAuthMessage(client, message) {
|
|
220
222
|
if (!this.authAdapter) {
|
|
221
223
|
this.sendToClient(client, {
|
|
222
224
|
id: this.generateId(),
|
|
223
|
-
type:
|
|
224
|
-
payload: { success: false, error:
|
|
225
|
-
timestamp: Date.now()
|
|
225
|
+
type: "auth_result",
|
|
226
|
+
payload: { success: false, error: "No auth adapter configured" },
|
|
227
|
+
timestamp: Date.now(),
|
|
226
228
|
});
|
|
227
229
|
return;
|
|
228
230
|
}
|
|
229
231
|
const payload = message.payload;
|
|
230
232
|
// Token-based authentication only
|
|
231
|
-
if (!payload.token || typeof payload.token !==
|
|
233
|
+
if (!payload.token || typeof payload.token !== "string") {
|
|
232
234
|
this.sendToClient(client, {
|
|
233
235
|
id: this.generateId(),
|
|
234
|
-
type:
|
|
235
|
-
payload: { success: false, error:
|
|
236
|
-
timestamp: Date.now()
|
|
236
|
+
type: "auth_result",
|
|
237
|
+
payload: { success: false, error: "Token required for authentication" },
|
|
238
|
+
timestamp: Date.now(),
|
|
237
239
|
});
|
|
238
240
|
return;
|
|
239
241
|
}
|
|
@@ -251,45 +253,45 @@ class WebSocketServerTransportAdapter {
|
|
|
251
253
|
// Send success response
|
|
252
254
|
this.sendToClient(client, {
|
|
253
255
|
id: this.generateId(),
|
|
254
|
-
type:
|
|
256
|
+
type: "auth_result",
|
|
255
257
|
payload: {
|
|
256
258
|
success: true,
|
|
257
|
-
userId: client.userId
|
|
259
|
+
userId: client.userId,
|
|
258
260
|
},
|
|
259
|
-
timestamp: Date.now()
|
|
261
|
+
timestamp: Date.now(),
|
|
260
262
|
});
|
|
261
263
|
// Notify handlers about authentication
|
|
262
264
|
const authMessage = {
|
|
263
265
|
id: this.generateId(),
|
|
264
|
-
type:
|
|
266
|
+
type: "client_authenticated",
|
|
265
267
|
payload: {
|
|
266
268
|
clientId: client.id,
|
|
267
269
|
userId: client.userId,
|
|
268
|
-
metadata: client.metadata
|
|
270
|
+
metadata: client.metadata,
|
|
269
271
|
},
|
|
270
|
-
timestamp: Date.now()
|
|
272
|
+
timestamp: Date.now(),
|
|
271
273
|
};
|
|
272
|
-
this.messageHandlers.forEach(handler => handler(authMessage));
|
|
274
|
+
this.messageHandlers.forEach((handler) => handler(authMessage));
|
|
273
275
|
}
|
|
274
276
|
catch (error) {
|
|
275
277
|
this.sendToClient(client, {
|
|
276
278
|
id: this.generateId(),
|
|
277
|
-
type:
|
|
279
|
+
type: "auth_result",
|
|
278
280
|
payload: {
|
|
279
281
|
success: false,
|
|
280
|
-
error: error.message
|
|
282
|
+
error: error.message,
|
|
281
283
|
},
|
|
282
|
-
timestamp: Date.now()
|
|
284
|
+
timestamp: Date.now(),
|
|
283
285
|
});
|
|
284
286
|
// Optionally close connection on auth failure
|
|
285
287
|
if (this.config.closeOnAuthFailure) {
|
|
286
|
-
client.ws.close(1008,
|
|
288
|
+
client.ws.close(1008, "Authentication failed");
|
|
287
289
|
this.clients.delete(client.id);
|
|
288
290
|
}
|
|
289
291
|
}
|
|
290
292
|
}
|
|
291
293
|
extractBearerToken(authHeader) {
|
|
292
|
-
if (authHeader.startsWith(
|
|
294
|
+
if (authHeader.startsWith("Bearer ")) {
|
|
293
295
|
return authHeader.substring(7);
|
|
294
296
|
}
|
|
295
297
|
return null;
|
|
@@ -300,17 +302,17 @@ class WebSocketServerTransportAdapter {
|
|
|
300
302
|
}
|
|
301
303
|
}
|
|
302
304
|
async disconnect() {
|
|
303
|
-
if (this.state ===
|
|
305
|
+
if (this.state === "disconnected") {
|
|
304
306
|
return;
|
|
305
307
|
}
|
|
306
|
-
this.state =
|
|
308
|
+
this.state = "disconnecting";
|
|
307
309
|
// Close all client connections
|
|
308
310
|
for (const [_clientId, client] of this.clients) {
|
|
309
311
|
try {
|
|
310
312
|
if (client.authTimeout) {
|
|
311
313
|
clearTimeout(client.authTimeout);
|
|
312
314
|
}
|
|
313
|
-
client.ws.close(1000,
|
|
315
|
+
client.ws.close(1000, "Server shutting down");
|
|
314
316
|
}
|
|
315
317
|
catch {
|
|
316
318
|
// Ignore errors when closing individual connections
|
|
@@ -318,25 +320,25 @@ class WebSocketServerTransportAdapter {
|
|
|
318
320
|
}
|
|
319
321
|
this.clients.clear();
|
|
320
322
|
// Close the WebSocket server (only if we created it)
|
|
321
|
-
if (this.wss && this.mode ===
|
|
323
|
+
if (this.wss && this.mode === "standalone") {
|
|
322
324
|
await new Promise((resolve) => {
|
|
323
325
|
this.wss.close(() => resolve());
|
|
324
326
|
});
|
|
325
327
|
}
|
|
326
|
-
this.state =
|
|
328
|
+
this.state = "disconnected";
|
|
327
329
|
this.wss = undefined;
|
|
328
330
|
this.attachedServer = undefined;
|
|
329
331
|
this.attachedWss = undefined;
|
|
330
332
|
}
|
|
331
333
|
async send(message) {
|
|
332
|
-
if (this.state !==
|
|
333
|
-
throw new Error(
|
|
334
|
+
if (this.state !== "connected") {
|
|
335
|
+
throw new Error("Not connected");
|
|
334
336
|
}
|
|
335
337
|
// Extract clientId from message payload for routing
|
|
336
338
|
const payload = message.payload;
|
|
337
339
|
const { clientId, ...clientMessage } = payload;
|
|
338
340
|
if (!clientId) {
|
|
339
|
-
throw new Error(
|
|
341
|
+
throw new Error("Message must contain clientId in payload for routing");
|
|
340
342
|
}
|
|
341
343
|
const client = this.clients.get(clientId);
|
|
342
344
|
if (!client) {
|
|
@@ -348,20 +350,21 @@ class WebSocketServerTransportAdapter {
|
|
|
348
350
|
// Fully unwrap the server_message envelope
|
|
349
351
|
// The server_message wrapper is used internally for routing between BaseServer and transport
|
|
350
352
|
// We need to extract the actual message from inside the wrapper before sending to the client
|
|
351
|
-
const messageToSend = message.type ===
|
|
353
|
+
const messageToSend = message.type === "server_message" && clientMessage.type
|
|
352
354
|
? {
|
|
353
355
|
id: message.id,
|
|
354
356
|
type: clientMessage.type,
|
|
355
|
-
payload: clientMessage.payload ||
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
357
|
+
payload: clientMessage.payload ||
|
|
358
|
+
(() => {
|
|
359
|
+
// If there's no explicit payload field, use all remaining fields except 'type'
|
|
360
|
+
const { type, ...rest } = clientMessage;
|
|
361
|
+
return rest;
|
|
362
|
+
})(),
|
|
363
|
+
timestamp: message.timestamp,
|
|
361
364
|
}
|
|
362
365
|
: {
|
|
363
366
|
...message,
|
|
364
|
-
payload: clientMessage
|
|
367
|
+
payload: clientMessage,
|
|
365
368
|
};
|
|
366
369
|
client.ws.send(JSON.stringify(messageToSend));
|
|
367
370
|
}
|
|
@@ -378,14 +381,14 @@ class WebSocketServerTransportAdapter {
|
|
|
378
381
|
return this.state;
|
|
379
382
|
}
|
|
380
383
|
isConnected() {
|
|
381
|
-
return this.state ===
|
|
384
|
+
return this.state === "connected";
|
|
382
385
|
}
|
|
383
386
|
// Utility methods
|
|
384
387
|
getConnectedClients() {
|
|
385
388
|
return Array.from(this.clients.values());
|
|
386
389
|
}
|
|
387
390
|
getAuthenticatedClients() {
|
|
388
|
-
return Array.from(this.clients.values()).filter(c => c.authenticated);
|
|
391
|
+
return Array.from(this.clients.values()).filter((c) => c.authenticated);
|
|
389
392
|
}
|
|
390
393
|
getClientCount() {
|
|
391
394
|
return this.clients.size;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/adapters/websocket/browser.ts"],"names":[],"mappings":"AACA,OAAO,EACN,gCAAgC,EAChC,KAAK,sBAAsB,GAC3B,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BrowserWebSocketTransportAdapter = void 0;
|
|
4
|
+
// Browser WebSocket adapter (uses native WebSocket API, no dependencies)
|
|
5
|
+
var BrowserWebSocketTransportAdapter_js_1 = require("./BrowserWebSocketTransportAdapter.js");
|
|
6
|
+
Object.defineProperty(exports, "BrowserWebSocketTransportAdapter", { enumerable: true, get: function () { return BrowserWebSocketTransportAdapter_js_1.BrowserWebSocketTransportAdapter; } });
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { type WebSocketClientConfig, WebSocketClientTransportAdapter, } from "./WebSocketClientTransportAdapter.js";
|
|
2
|
+
export { WebSocketServerTransportAdapter, type WebSocketServerTransportConfig, } from "./WebSocketServerTransportAdapter.js";
|
|
3
|
+
export { BrowserWebSocketTransportAdapter, type BrowserWebSocketConfig, } from "./BrowserWebSocketTransportAdapter.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/websocket/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/websocket/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,qBAAqB,EAC1B,+BAA+B,GAC/B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACN,+BAA+B,EAC/B,KAAK,8BAA8B,GACnC,MAAM,sCAAsC,CAAC;AAG9C,OAAO,EACN,gCAAgC,EAChC,KAAK,sBAAsB,GAC3B,MAAM,uCAAuC,CAAC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "WebSocketServerTransportAdapter", { enumerable: true, get: function () { return WebSocketServerTransportAdapter_js_1.WebSocketServerTransportAdapter; } });
|
|
3
|
+
exports.BrowserWebSocketTransportAdapter = exports.WebSocketServerTransportAdapter = exports.WebSocketClientTransportAdapter = void 0;
|
|
4
|
+
// Node.js WebSocket adapter (requires 'ws' package)
|
|
6
5
|
var WebSocketClientTransportAdapter_js_1 = require("./WebSocketClientTransportAdapter.js");
|
|
7
6
|
Object.defineProperty(exports, "WebSocketClientTransportAdapter", { enumerable: true, get: function () { return WebSocketClientTransportAdapter_js_1.WebSocketClientTransportAdapter; } });
|
|
7
|
+
var WebSocketServerTransportAdapter_js_1 = require("./WebSocketServerTransportAdapter.js");
|
|
8
|
+
Object.defineProperty(exports, "WebSocketServerTransportAdapter", { enumerable: true, get: function () { return WebSocketServerTransportAdapter_js_1.WebSocketServerTransportAdapter; } });
|
|
9
|
+
// Browser WebSocket adapter (uses native WebSocket API)
|
|
10
|
+
var BrowserWebSocketTransportAdapter_js_1 = require("./BrowserWebSocketTransportAdapter.js");
|
|
11
|
+
Object.defineProperty(exports, "BrowserWebSocketTransportAdapter", { enumerable: true, get: function () { return BrowserWebSocketTransportAdapter_js_1.BrowserWebSocketTransportAdapter; } });
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type WebSocketClientConfig, WebSocketClientTransportAdapter, } from "./WebSocketClientTransportAdapter.js";
|
|
2
|
+
export { WebSocketServerTransportAdapter, type WebSocketServerTransportConfig, } from "./WebSocketServerTransportAdapter.js";
|
|
3
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/adapters/websocket/node.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,qBAAqB,EAC1B,+BAA+B,GAC/B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACN,+BAA+B,EAC/B,KAAK,8BAA8B,GACnC,MAAM,sCAAsC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketServerTransportAdapter = exports.WebSocketClientTransportAdapter = void 0;
|
|
4
|
+
// Node.js WebSocket adapters (requires 'ws' package)
|
|
5
|
+
var WebSocketClientTransportAdapter_js_1 = require("./WebSocketClientTransportAdapter.js");
|
|
6
|
+
Object.defineProperty(exports, "WebSocketClientTransportAdapter", { enumerable: true, get: function () { return WebSocketClientTransportAdapter_js_1.WebSocketClientTransportAdapter; } });
|
|
7
|
+
var WebSocketServerTransportAdapter_js_1 = require("./WebSocketServerTransportAdapter.js");
|
|
8
|
+
Object.defineProperty(exports, "WebSocketServerTransportAdapter", { enumerable: true, get: function () { return WebSocketServerTransportAdapter_js_1.WebSocketServerTransportAdapter; } });
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
1
|
+
import type { IAuthAdapter } from "../abstractions/AuthAdapter.js";
|
|
2
|
+
import { TypedEventEmitter } from "../abstractions/EventEmitter.js";
|
|
3
|
+
import type { IStorageAdapter } from "../abstractions/StorageAdapter.js";
|
|
4
|
+
import type { ITransportAdapter } from "../abstractions/TransportAdapter.js";
|
|
5
|
+
import type { AuthenticatePayload, ConnectionState, Event, Lock, LockRequest, RoomState, RoomUser } from "../types/index.js";
|
|
6
6
|
export interface ClientConfig {
|
|
7
7
|
transport: ITransportAdapter;
|
|
8
8
|
auth?: IAuthAdapter;
|
|
@@ -95,7 +95,7 @@ export declare class BaseClient extends TypedEventEmitter<ClientEvents> {
|
|
|
95
95
|
* @param options Optional authentication options including deviceId and metadata
|
|
96
96
|
* @throws Error if client is not connected or no auth token is available
|
|
97
97
|
*/
|
|
98
|
-
authenticate(options?: Omit<AuthenticatePayload,
|
|
98
|
+
authenticate(options?: Omit<AuthenticatePayload, "token">): Promise<void>;
|
|
99
99
|
/**
|
|
100
100
|
* Check if the client has an auth token available.
|
|
101
101
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseClient.d.ts","sourceRoot":"","sources":["../../src/client/BaseClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"BaseClient.d.ts","sourceRoot":"","sources":["../../src/client/BaseClient.ts"],"names":[],"mappings":"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"}
|