@principal-ai/control-tower-core 0.1.11 → 0.1.13
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 -0
- package/dist/abstractions/AuthAdapter.d.ts.map +1 -1
- package/dist/abstractions/DefaultPresenceManager.d.ts +27 -4
- package/dist/abstractions/DefaultPresenceManager.d.ts.map +1 -1
- package/dist/abstractions/DefaultPresenceManager.js +145 -4
- package/dist/abstractions/PresenceExtension.d.ts +121 -0
- package/dist/abstractions/PresenceExtension.d.ts.map +1 -0
- package/dist/abstractions/PresenceExtension.js +14 -0
- package/dist/abstractions/index.d.ts +1 -0
- package/dist/abstractions/index.d.ts.map +1 -1
- package/dist/client/BaseClient.d.ts.map +1 -1
- package/dist/client/BaseClient.js +21 -3
- package/dist/client/PresenceClient.d.ts +152 -0
- package/dist/client/PresenceClient.d.ts.map +1 -0
- package/dist/client/PresenceClient.js +193 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +8 -7
- package/dist/index.mjs +305 -12
- package/dist/index.mjs.map +8 -7
- package/dist/server/BaseServer.d.ts +27 -0
- package/dist/server/BaseServer.d.ts.map +1 -1
- package/dist/server/BaseServer.js +57 -4
- package/dist/server/ServerBuilder.d.ts +5 -0
- package/dist/server/ServerBuilder.d.ts.map +1 -1
- package/dist/server/ServerBuilder.js +50 -1
- package/package.json +1 -1
|
@@ -125,6 +125,8 @@ export declare class BaseServer extends TypedEventEmitter<ServerEvents> {
|
|
|
125
125
|
private config;
|
|
126
126
|
private clients;
|
|
127
127
|
private clientMessageHandlers;
|
|
128
|
+
private clientUserMap;
|
|
129
|
+
private userClientMap;
|
|
128
130
|
private running;
|
|
129
131
|
private initialized;
|
|
130
132
|
private mode;
|
|
@@ -185,5 +187,30 @@ export declare class BaseServer extends TypedEventEmitter<ServerEvents> {
|
|
|
185
187
|
* Get presence manager (if configured)
|
|
186
188
|
*/
|
|
187
189
|
getPresenceManager(): PresenceManager | undefined;
|
|
190
|
+
/**
|
|
191
|
+
* Get user ID from client ID
|
|
192
|
+
*
|
|
193
|
+
* @param clientId - Client identifier
|
|
194
|
+
* @returns User ID, or undefined if not found or not authenticated
|
|
195
|
+
*/
|
|
196
|
+
getUserIdFromClientId(clientId: string): string | undefined;
|
|
197
|
+
/**
|
|
198
|
+
* Get all client IDs for a user
|
|
199
|
+
*
|
|
200
|
+
* A user may have multiple connected devices/clients.
|
|
201
|
+
*
|
|
202
|
+
* @param userId - User identifier
|
|
203
|
+
* @returns Array of client IDs
|
|
204
|
+
*/
|
|
205
|
+
getClientIdsForUser(userId: string): string[];
|
|
206
|
+
/**
|
|
207
|
+
* Get device ID from client ID
|
|
208
|
+
*
|
|
209
|
+
* In Control Tower architecture, clientId === deviceId
|
|
210
|
+
*
|
|
211
|
+
* @param clientId - Client identifier
|
|
212
|
+
* @returns Device ID (same as clientId)
|
|
213
|
+
*/
|
|
214
|
+
getDeviceIdFromClientId(clientId: string): string;
|
|
188
215
|
}
|
|
189
216
|
//# sourceMappingURL=BaseServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseServer.d.ts","sourceRoot":"","sources":["../../src/server/BaseServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BaseServer.d.ts","sourceRoot":"","sources":["../../src/server/BaseServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
8
8
|
super();
|
|
9
9
|
this.clients = new Map();
|
|
10
10
|
this.clientMessageHandlers = new Map();
|
|
11
|
+
this.clientUserMap = new Map(); // clientId -> userId
|
|
12
|
+
this.userClientMap = new Map(); // userId -> Set<clientId>
|
|
11
13
|
this.running = false;
|
|
12
14
|
this.initialized = false;
|
|
13
15
|
this.config = config;
|
|
@@ -179,6 +181,8 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
179
181
|
}
|
|
180
182
|
this.clients.clear();
|
|
181
183
|
this.clientMessageHandlers.clear();
|
|
184
|
+
this.clientUserMap.clear();
|
|
185
|
+
this.userClientMap.clear();
|
|
182
186
|
// Clear presence data
|
|
183
187
|
if (this.presenceManager) {
|
|
184
188
|
await this.presenceManager.clear();
|
|
@@ -291,6 +295,12 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
291
295
|
if (client) {
|
|
292
296
|
client.authenticated = true;
|
|
293
297
|
client.userId = payload.userId;
|
|
298
|
+
// Auto-update client mappings
|
|
299
|
+
this.clientUserMap.set(payload.clientId, payload.userId);
|
|
300
|
+
if (!this.userClientMap.has(payload.userId)) {
|
|
301
|
+
this.userClientMap.set(payload.userId, new Set());
|
|
302
|
+
}
|
|
303
|
+
this.userClientMap.get(payload.userId).add(payload.clientId);
|
|
294
304
|
await this.emit('client_authenticated', {
|
|
295
305
|
clientId: payload.clientId,
|
|
296
306
|
userId: payload.userId
|
|
@@ -328,6 +338,17 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
328
338
|
if (!client) {
|
|
329
339
|
return;
|
|
330
340
|
}
|
|
341
|
+
// Auto-clean client mappings
|
|
342
|
+
if (client.userId) {
|
|
343
|
+
this.clientUserMap.delete(clientId);
|
|
344
|
+
const clientSet = this.userClientMap.get(client.userId);
|
|
345
|
+
if (clientSet) {
|
|
346
|
+
clientSet.delete(clientId);
|
|
347
|
+
if (clientSet.size === 0) {
|
|
348
|
+
this.userClientMap.delete(client.userId);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
331
352
|
// Unregister from presence manager
|
|
332
353
|
if (this.presenceManager?.isEnabled() && client.userId) {
|
|
333
354
|
try {
|
|
@@ -377,6 +398,10 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
377
398
|
if (!client) {
|
|
378
399
|
return;
|
|
379
400
|
}
|
|
401
|
+
// Auto-update presence activity on ANY message
|
|
402
|
+
if (this.presenceManager?.isEnabled() && client.userId && client.authenticated) {
|
|
403
|
+
await this.updatePresenceActivity(client.userId, clientId, 'message');
|
|
404
|
+
}
|
|
380
405
|
switch (message.type) {
|
|
381
406
|
case 'authenticate':
|
|
382
407
|
await this.handleAuthenticate(clientId, message.payload);
|
|
@@ -398,10 +423,7 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
398
423
|
break;
|
|
399
424
|
case 'ping':
|
|
400
425
|
await this.sendToClient(clientId, { type: 'pong', timestamp: Date.now() });
|
|
401
|
-
//
|
|
402
|
-
if (this.presenceManager?.isEnabled() && client.userId) {
|
|
403
|
-
await this.updatePresenceActivity(client.userId, clientId, 'heartbeat');
|
|
404
|
-
}
|
|
426
|
+
// Presence activity already updated automatically above
|
|
405
427
|
break;
|
|
406
428
|
default:
|
|
407
429
|
await this.sendToClient(clientId, {
|
|
@@ -676,5 +698,36 @@ class BaseServer extends EventEmitter_js_1.TypedEventEmitter {
|
|
|
676
698
|
getPresenceManager() {
|
|
677
699
|
return this.presenceManager;
|
|
678
700
|
}
|
|
701
|
+
/**
|
|
702
|
+
* Get user ID from client ID
|
|
703
|
+
*
|
|
704
|
+
* @param clientId - Client identifier
|
|
705
|
+
* @returns User ID, or undefined if not found or not authenticated
|
|
706
|
+
*/
|
|
707
|
+
getUserIdFromClientId(clientId) {
|
|
708
|
+
return this.clientUserMap.get(clientId);
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* Get all client IDs for a user
|
|
712
|
+
*
|
|
713
|
+
* A user may have multiple connected devices/clients.
|
|
714
|
+
*
|
|
715
|
+
* @param userId - User identifier
|
|
716
|
+
* @returns Array of client IDs
|
|
717
|
+
*/
|
|
718
|
+
getClientIdsForUser(userId) {
|
|
719
|
+
return Array.from(this.userClientMap.get(userId) || []);
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* Get device ID from client ID
|
|
723
|
+
*
|
|
724
|
+
* In Control Tower architecture, clientId === deviceId
|
|
725
|
+
*
|
|
726
|
+
* @param clientId - Client identifier
|
|
727
|
+
* @returns Device ID (same as clientId)
|
|
728
|
+
*/
|
|
729
|
+
getDeviceIdFromClientId(clientId) {
|
|
730
|
+
return clientId;
|
|
731
|
+
}
|
|
679
732
|
}
|
|
680
733
|
exports.BaseServer = BaseServer;
|
|
@@ -49,5 +49,10 @@ export declare class ServerBuilder {
|
|
|
49
49
|
*/
|
|
50
50
|
withExperimentalFeatures(features: ExperimentalFeatureConfig): this;
|
|
51
51
|
build(): BaseServer;
|
|
52
|
+
/**
|
|
53
|
+
* Wire presence extension hooks to server events
|
|
54
|
+
* @private
|
|
55
|
+
*/
|
|
56
|
+
private wirePresenceExtensionHooks;
|
|
52
57
|
}
|
|
53
58
|
//# sourceMappingURL=ServerBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerBuilder.d.ts","sourceRoot":"","sources":["../../src/server/ServerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerBuilder.d.ts","sourceRoot":"","sources":["../../src/server/ServerBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAqB,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAE1C,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAC,CAAoB;IACtC,OAAO,CAAC,IAAI,CAAC,CAAe;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAChD,OAAO,CAAC,UAAU,CAAC,CAA2B;IAC9C,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,oBAAoB,CAAC,CAA4B;IAEzD,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAKjD,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKlC,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAK3C,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAK/C,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAK/C;;;;;;;OAOG;IACH,mBAAmB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAK3D,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI;IAKxD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAKtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKrC,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAK/C;;;;;;;OAOG;IACH,wBAAwB,CAAC,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAKnE,KAAK,IAAI,UAAU;IAkDnB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;CAyCnC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServerBuilder = void 0;
|
|
4
|
+
const DefaultPresenceManager_js_1 = require("../abstractions/DefaultPresenceManager.js");
|
|
4
5
|
const BaseServer_js_1 = require("./BaseServer.js");
|
|
5
6
|
class ServerBuilder {
|
|
6
7
|
withTransport(transport) {
|
|
@@ -94,7 +95,55 @@ class ServerBuilder {
|
|
|
94
95
|
trackUsageMetrics: false
|
|
95
96
|
}
|
|
96
97
|
};
|
|
97
|
-
|
|
98
|
+
const server = new BaseServer_js_1.BaseServer(config);
|
|
99
|
+
// Auto-link presence manager to server for broadcasting
|
|
100
|
+
if (this.presenceManager instanceof DefaultPresenceManager_js_1.DefaultPresenceManager) {
|
|
101
|
+
this.presenceManager.setServer(server);
|
|
102
|
+
}
|
|
103
|
+
// Auto-wire presence extension hooks to server events
|
|
104
|
+
if (this.presenceManager instanceof DefaultPresenceManager_js_1.DefaultPresenceManager) {
|
|
105
|
+
this.wirePresenceExtensionHooks(server, this.presenceManager);
|
|
106
|
+
}
|
|
107
|
+
return server;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Wire presence extension hooks to server events
|
|
111
|
+
* @private
|
|
112
|
+
*/
|
|
113
|
+
wirePresenceExtensionHooks(server, presenceManager) {
|
|
114
|
+
// Initialize extensions when server starts
|
|
115
|
+
server.on('started', async () => {
|
|
116
|
+
await presenceManager.initializeExtensions();
|
|
117
|
+
});
|
|
118
|
+
// Wire room join/leave events to presence extensions
|
|
119
|
+
server.on('client_joined_room', async ({ clientId, roomId }) => {
|
|
120
|
+
const userId = server.getUserIdFromClientId(clientId);
|
|
121
|
+
if (userId && presenceManager.isEnabled()) {
|
|
122
|
+
// Call onRoomJoined for all extensions
|
|
123
|
+
const extensions = presenceManager.extensions;
|
|
124
|
+
if (extensions) {
|
|
125
|
+
for (const ext of extensions) {
|
|
126
|
+
await ext.onRoomJoined?.(userId, roomId, clientId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
server.on('client_left_room', async ({ clientId, roomId }) => {
|
|
132
|
+
const userId = server.getUserIdFromClientId(clientId);
|
|
133
|
+
if (userId && presenceManager.isEnabled()) {
|
|
134
|
+
// Call onRoomLeft for all extensions
|
|
135
|
+
const extensions = presenceManager.extensions;
|
|
136
|
+
if (extensions) {
|
|
137
|
+
for (const ext of extensions) {
|
|
138
|
+
await ext.onRoomLeft?.(userId, roomId, clientId);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
// Destroy extensions when server stops
|
|
144
|
+
server.on('stopped', async () => {
|
|
145
|
+
await presenceManager.destroyExtensions();
|
|
146
|
+
});
|
|
98
147
|
}
|
|
99
148
|
}
|
|
100
149
|
exports.ServerBuilder = ServerBuilder;
|
package/package.json
CHANGED