@backendkit-labs/agent-web 0.6.2 → 0.6.3
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/session/SessionManager.d.ts +8 -0
- package/dist/session/SessionManager.d.ts.map +1 -1
- package/dist/session/SessionManager.js +15 -6
- package/dist/session/SessionManager.js.map +1 -1
- package/dist/store/SessionMetaStore.d.ts +4 -0
- package/dist/store/SessionMetaStore.d.ts.map +1 -1
- package/dist/store/SessionMetaStore.js +26 -3
- package/dist/store/SessionMetaStore.js.map +1 -1
- package/package.json +3 -3
|
@@ -27,6 +27,12 @@ export interface SessionManagerOptions {
|
|
|
27
27
|
metrics?: MetricsCollector;
|
|
28
28
|
/** Optional durable store for session metadata (Redis, etc.). */
|
|
29
29
|
store?: SessionMetaStore;
|
|
30
|
+
/**
|
|
31
|
+
* Minimum time between writes of one session's `lastActivityAt` to the store. `get()` runs on every
|
|
32
|
+
* message, and a write per message turned each of them into a store round trip. In-memory activity is
|
|
33
|
+
* always exact; the stored value lags by at most this much. Default 30000; 0 writes on every `get()`.
|
|
34
|
+
*/
|
|
35
|
+
activityPersistIntervalMs?: number;
|
|
30
36
|
}
|
|
31
37
|
export declare class SessionManager {
|
|
32
38
|
private sessions;
|
|
@@ -36,6 +42,8 @@ export declare class SessionManager {
|
|
|
36
42
|
private readonly monitorBus;
|
|
37
43
|
private readonly metrics;
|
|
38
44
|
private readonly store;
|
|
45
|
+
private readonly activityPersistIntervalMs;
|
|
46
|
+
private readonly lastPersisted;
|
|
39
47
|
private sweepTimer;
|
|
40
48
|
constructor(opts: SessionManagerOptions);
|
|
41
49
|
/** Create a new session and wire a WebSocket to it. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,KAAK,WAAW,CAAC;AAE9F,MAAM,WAAW,qBAAqB;IAClC,uFAAuF;IACvF,aAAa,EAAE,aAAa,CAAC;IAC7B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,IAAI,CAAC;IACrB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,KAAK,WAAW,CAAC;AAE9F,MAAM,WAAW,qBAAqB;IAClC,uFAAuF;IACvF,aAAa,EAAE,aAAa,CAAC;IAC7B,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,iEAAiE;IACjE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,UAAU,CAA+C;gBAErD,IAAI,EAAE,qBAAqB;IAcvC,uDAAuD;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IA8CnD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAkBpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAYzB,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,WAAW,GAAG,gBAAgB,GAAG,QAAQ,CAAC,EAAE;IAMzE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,SAAS;CAQpB"}
|
|
@@ -11,6 +11,8 @@ class SessionManager {
|
|
|
11
11
|
monitorBus;
|
|
12
12
|
metrics;
|
|
13
13
|
store;
|
|
14
|
+
activityPersistIntervalMs;
|
|
15
|
+
lastPersisted = new Map();
|
|
14
16
|
sweepTimer = null;
|
|
15
17
|
constructor(opts) {
|
|
16
18
|
this.engineFactory = opts.engineFactory;
|
|
@@ -19,6 +21,7 @@ class SessionManager {
|
|
|
19
21
|
this.monitorBus = opts.monitorBus;
|
|
20
22
|
this.metrics = opts.metrics;
|
|
21
23
|
this.store = opts.store;
|
|
24
|
+
this.activityPersistIntervalMs = opts.activityPersistIntervalMs ?? 30_000;
|
|
22
25
|
// sweep idle sessions every minute
|
|
23
26
|
this.sweepTimer = setInterval(() => this.sweepIdle(), 60_000);
|
|
24
27
|
this.sweepTimer.unref?.();
|
|
@@ -52,6 +55,7 @@ class SessionManager {
|
|
|
52
55
|
this.sessions.set(id, session);
|
|
53
56
|
this.monitorBus?.notifySessionOpen(id, userId);
|
|
54
57
|
this.metrics?.sessionOpened();
|
|
58
|
+
this.lastPersisted.set(id, now.getTime());
|
|
55
59
|
this.store?.set(id, {
|
|
56
60
|
id,
|
|
57
61
|
createdAt: now.toISOString(),
|
|
@@ -65,12 +69,16 @@ class SessionManager {
|
|
|
65
69
|
const session = this.sessions.get(id);
|
|
66
70
|
if (session) {
|
|
67
71
|
session.lastActivityAt = new Date();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
const now = session.lastActivityAt.getTime();
|
|
73
|
+
if (this.store && now - (this.lastPersisted.get(id) ?? 0) >= this.activityPersistIntervalMs) {
|
|
74
|
+
this.lastPersisted.set(id, now);
|
|
75
|
+
this.store.set(id, {
|
|
76
|
+
id,
|
|
77
|
+
createdAt: session.createdAt.toISOString(),
|
|
78
|
+
lastActivityAt: session.lastActivityAt.toISOString(),
|
|
79
|
+
userId: session.userId,
|
|
80
|
+
}).catch(() => { });
|
|
81
|
+
}
|
|
74
82
|
}
|
|
75
83
|
return session;
|
|
76
84
|
}
|
|
@@ -87,6 +95,7 @@ class SessionManager {
|
|
|
87
95
|
}
|
|
88
96
|
catch { /* may already be closed */ }
|
|
89
97
|
this.sessions.delete(id);
|
|
98
|
+
this.lastPersisted.delete(id);
|
|
90
99
|
this.monitorBus?.notifySessionClose(id);
|
|
91
100
|
this.metrics?.sessionClosed();
|
|
92
101
|
this.store?.delete(id).catch(() => { });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAEzC,wEAAqE;
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ export interface RedisLike {
|
|
|
26
26
|
set(key: string, value: string, expiryMode: string, time: number): Promise<unknown>;
|
|
27
27
|
del(key: string): Promise<unknown>;
|
|
28
28
|
keys(pattern: string): Promise<string[]>;
|
|
29
|
+
scan?(cursor: string, matchToken: 'MATCH', pattern: string, countToken: 'COUNT', count: number): Promise<[string, string[]]>;
|
|
30
|
+
mget?(keys: string[]): Promise<Array<string | null>>;
|
|
29
31
|
quit(): Promise<unknown>;
|
|
30
32
|
}
|
|
31
33
|
export declare class RedisSessionMetaStore implements SessionMetaStore {
|
|
@@ -41,6 +43,8 @@ export declare class RedisSessionMetaStore implements SessionMetaStore {
|
|
|
41
43
|
get(id: string): Promise<SessionMeta | null>;
|
|
42
44
|
delete(id: string): Promise<void>;
|
|
43
45
|
list(): Promise<SessionMeta[]>;
|
|
46
|
+
/** SCAN walks the keyspace in small steps; KEYS does it in one blocking call. */
|
|
47
|
+
private listKeys;
|
|
44
48
|
close(): Promise<void>;
|
|
45
49
|
}
|
|
46
50
|
//# sourceMappingURL=SessionMetaStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMetaStore.d.ts","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAID,qBAAa,wBAAyB,YAAW,gBAAgB;IAC7D,OAAO,CAAC,IAAI,CAAkC;IAExC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAI5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;
|
|
1
|
+
{"version":3,"file":"SessionMetaStore.d.ts","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,8 @@ class InMemorySessionMetaStore {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
exports.InMemorySessionMetaStore = InMemorySessionMetaStore;
|
|
38
|
+
const SCAN_COUNT = 200;
|
|
39
|
+
const MGET_CHUNK = 500;
|
|
38
40
|
class RedisSessionMetaStore {
|
|
39
41
|
redis;
|
|
40
42
|
prefix;
|
|
@@ -58,12 +60,33 @@ class RedisSessionMetaStore {
|
|
|
58
60
|
await this.redis.del(this.key(id));
|
|
59
61
|
}
|
|
60
62
|
async list() {
|
|
61
|
-
const keys = await this.
|
|
62
|
-
const
|
|
63
|
-
|
|
63
|
+
const keys = await this.listKeys();
|
|
64
|
+
const values = [];
|
|
65
|
+
for (let i = 0; i < keys.length; i += MGET_CHUNK) {
|
|
66
|
+
const chunk = keys.slice(i, i + MGET_CHUNK);
|
|
67
|
+
values.push(...(this.redis.mget
|
|
68
|
+
? await this.redis.mget(chunk)
|
|
69
|
+
: await Promise.all(chunk.map(k => this.redis.get(k)))));
|
|
70
|
+
}
|
|
71
|
+
return values
|
|
64
72
|
.filter((r) => r !== null)
|
|
65
73
|
.map(r => JSON.parse(r));
|
|
66
74
|
}
|
|
75
|
+
/** SCAN walks the keyspace in small steps; KEYS does it in one blocking call. */
|
|
76
|
+
async listKeys() {
|
|
77
|
+
const pattern = `${this.prefix}*`;
|
|
78
|
+
if (!this.redis.scan)
|
|
79
|
+
return this.redis.keys(pattern);
|
|
80
|
+
const seen = new Set(); // SCAN may return a key more than once
|
|
81
|
+
let cursor = '0';
|
|
82
|
+
do {
|
|
83
|
+
const [next, batch] = await this.redis.scan(cursor, 'MATCH', pattern, 'COUNT', SCAN_COUNT);
|
|
84
|
+
for (const k of batch)
|
|
85
|
+
seen.add(k);
|
|
86
|
+
cursor = next;
|
|
87
|
+
} while (cursor !== '0');
|
|
88
|
+
return [...seen];
|
|
89
|
+
}
|
|
67
90
|
async close() {
|
|
68
91
|
await this.redis.quit();
|
|
69
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionMetaStore.js","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":";AAAA,kFAAkF;AAClF,EAAE;AACF,kFAAkF;AAClF,iEAAiE;AACjE,EAAE;AACF,+EAA+E;AAC/E,+BAA+B;AAC/B,4DAA4D;AAC5D,6DAA6D;AAC7D,0DAA0D;AAC1D,EAAE;AACF,mBAAmB;AACnB,oEAAoE;AACpE,iFAAiF;;;AAmBjF,iFAAiF;AAEjF,MAAa,wBAAwB;IACzB,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE9C,KAAK,CAAC,GAAG,CAAC,EAAU,EAAE,IAAiB;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACJ;AAtBD,4DAsBC;
|
|
1
|
+
{"version":3,"file":"SessionMetaStore.js","sourceRoot":"","sources":["../../src/store/SessionMetaStore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backendkit-labs/agent-web",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "HTTP/WebSocket server layer for agent-core — browser-ready streaming agent sessions",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"prepublishOnly": "npm run build"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
|
-
"@backendkit-labs/agent-core": ">=0.24.0 <0.
|
|
20
|
+
"@backendkit-labs/agent-core": ">=0.24.0 <0.38.0"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@fastify/websocket": "^11.0.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"node-cron": "^4.2.1"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@backendkit-labs/agent-core": "^0.
|
|
34
|
+
"@backendkit-labs/agent-core": "^0.37.0",
|
|
35
35
|
"@types/jest": "^29.5.14",
|
|
36
36
|
"@types/jsonwebtoken": "^9.0.0",
|
|
37
37
|
"@types/node": "^20.0.0",
|