@backendkit-labs/agent-web 0.4.0 → 0.4.2
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/README.md +664 -20
- package/dist/__tests__/JwtAuth.test.d.ts +2 -0
- package/dist/__tests__/JwtAuth.test.d.ts.map +1 -0
- package/dist/__tests__/JwtAuth.test.js +149 -0
- package/dist/__tests__/JwtAuth.test.js.map +1 -0
- package/dist/__tests__/SessionManager.test.d.ts +2 -0
- package/dist/__tests__/SessionManager.test.d.ts.map +1 -0
- package/dist/__tests__/SessionManager.test.js +303 -0
- package/dist/__tests__/SessionManager.test.js.map +1 -0
- package/dist/__tests__/TriggerBus.test.d.ts +2 -0
- package/dist/__tests__/TriggerBus.test.d.ts.map +1 -0
- package/dist/__tests__/TriggerBus.test.js +433 -0
- package/dist/__tests__/TriggerBus.test.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwtAuth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/JwtAuth.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
7
|
+
const JwtAuth_1 = require("../auth/JwtAuth");
|
|
8
|
+
const SECRET = 'test-secret-at-least-32-chars-long!';
|
|
9
|
+
function makeReq(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
headers: overrides.headers ?? {},
|
|
12
|
+
query: overrides.query ?? {},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function makeReply() {
|
|
16
|
+
const r = {};
|
|
17
|
+
r['code'] = jest.fn().mockReturnValue(r);
|
|
18
|
+
r['send'] = jest.fn().mockReturnValue(r);
|
|
19
|
+
return r;
|
|
20
|
+
}
|
|
21
|
+
// ── constructor ───────────────────────────────────────────────────────────────
|
|
22
|
+
describe('JwtAuth constructor', () => {
|
|
23
|
+
it('throws when neither secret nor publicKey is provided', () => {
|
|
24
|
+
expect(() => new JwtAuth_1.JwtAuth({})).toThrow('provide either secret');
|
|
25
|
+
});
|
|
26
|
+
it('does not throw when secret is provided', () => {
|
|
27
|
+
expect(() => new JwtAuth_1.JwtAuth({ secret: SECRET })).not.toThrow();
|
|
28
|
+
});
|
|
29
|
+
it('does not throw when publicKey is provided', () => {
|
|
30
|
+
const { generateKeyPairSync } = require('crypto');
|
|
31
|
+
const { publicKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
|
|
32
|
+
const pem = publicKey.export({ type: 'pkcs1', format: 'pem' });
|
|
33
|
+
expect(() => new JwtAuth_1.JwtAuth({ publicKey: pem })).not.toThrow();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
// ── verify() ─────────────────────────────────────────────────────────────────
|
|
37
|
+
describe('JwtAuth.verify()', () => {
|
|
38
|
+
const auth = new JwtAuth_1.JwtAuth({ secret: SECRET });
|
|
39
|
+
it('decodes a valid HS256 token and returns the payload', () => {
|
|
40
|
+
const token = jsonwebtoken_1.default.sign({ sub: 'user-1', email: 'a@b.com', roles: ['admin'] }, SECRET);
|
|
41
|
+
const user = auth.verify(token);
|
|
42
|
+
expect(user.sub).toBe('user-1');
|
|
43
|
+
expect(user.email).toBe('a@b.com');
|
|
44
|
+
expect(user.roles).toEqual(['admin']);
|
|
45
|
+
});
|
|
46
|
+
it('throws on a completely invalid token string', () => {
|
|
47
|
+
expect(() => auth.verify('not.a.token')).toThrow();
|
|
48
|
+
});
|
|
49
|
+
it('throws when the token was signed with a different secret', () => {
|
|
50
|
+
const token = jsonwebtoken_1.default.sign({ sub: 'x' }, 'wrong-secret');
|
|
51
|
+
expect(() => auth.verify(token)).toThrow();
|
|
52
|
+
});
|
|
53
|
+
it('throws on an expired token', () => {
|
|
54
|
+
const token = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { expiresIn: -10 });
|
|
55
|
+
expect(() => auth.verify(token)).toThrow();
|
|
56
|
+
});
|
|
57
|
+
it('validates audience when configured', () => {
|
|
58
|
+
const strictAuth = new JwtAuth_1.JwtAuth({ secret: SECRET, audience: 'my-api' });
|
|
59
|
+
const good = jsonwebtoken_1.default.sign({ sub: 'x', aud: 'my-api' }, SECRET);
|
|
60
|
+
const bad = jsonwebtoken_1.default.sign({ sub: 'x', aud: 'other' }, SECRET);
|
|
61
|
+
expect(() => strictAuth.verify(good)).not.toThrow();
|
|
62
|
+
expect(() => strictAuth.verify(bad)).toThrow();
|
|
63
|
+
});
|
|
64
|
+
it('validates issuer when configured', () => {
|
|
65
|
+
const strictAuth = new JwtAuth_1.JwtAuth({ secret: SECRET, issuer: 'auth.example.com' });
|
|
66
|
+
const good = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { issuer: 'auth.example.com' });
|
|
67
|
+
const bad = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { issuer: 'attacker.com' });
|
|
68
|
+
expect(() => strictAuth.verify(good)).not.toThrow();
|
|
69
|
+
expect(() => strictAuth.verify(bad)).toThrow();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// ── hook() ────────────────────────────────────────────────────────────────────
|
|
73
|
+
describe('JwtAuth.hook()', () => {
|
|
74
|
+
let auth;
|
|
75
|
+
let validToken;
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
auth = new JwtAuth_1.JwtAuth({ secret: SECRET });
|
|
78
|
+
validToken = jsonwebtoken_1.default.sign({ sub: 'user-42', roles: ['editor'] }, SECRET);
|
|
79
|
+
});
|
|
80
|
+
it('returns 401 when no token is present in headers or query', async () => {
|
|
81
|
+
const hook = auth.hook();
|
|
82
|
+
const req = makeReq();
|
|
83
|
+
const reply = makeReply();
|
|
84
|
+
await hook(req, reply);
|
|
85
|
+
expect(reply.code).toHaveBeenCalledWith(401);
|
|
86
|
+
expect(reply.send).toHaveBeenCalledWith({ error: 'Missing authentication token' });
|
|
87
|
+
});
|
|
88
|
+
it('sets req.user from a valid Authorization: Bearer header', async () => {
|
|
89
|
+
const hook = auth.hook();
|
|
90
|
+
const req = makeReq({ headers: { authorization: `Bearer ${validToken}` } });
|
|
91
|
+
const reply = makeReply();
|
|
92
|
+
await hook(req, reply);
|
|
93
|
+
expect(reply.code).not.toHaveBeenCalled();
|
|
94
|
+
expect(req.user.sub).toBe('user-42');
|
|
95
|
+
});
|
|
96
|
+
it('sets req.user from a valid ?token= query param', async () => {
|
|
97
|
+
const hook = auth.hook();
|
|
98
|
+
const req = makeReq({ query: { token: validToken } });
|
|
99
|
+
const reply = makeReply();
|
|
100
|
+
await hook(req, reply);
|
|
101
|
+
expect(reply.code).not.toHaveBeenCalled();
|
|
102
|
+
expect(req.user.sub).toBe('user-42');
|
|
103
|
+
});
|
|
104
|
+
it('prefers the Authorization header over the ?token= query param', async () => {
|
|
105
|
+
const otherToken = jsonwebtoken_1.default.sign({ sub: 'interloper' }, SECRET);
|
|
106
|
+
const hook = auth.hook();
|
|
107
|
+
const req = makeReq({
|
|
108
|
+
headers: { authorization: `Bearer ${validToken}` },
|
|
109
|
+
query: { token: otherToken },
|
|
110
|
+
});
|
|
111
|
+
const reply = makeReply();
|
|
112
|
+
await hook(req, reply);
|
|
113
|
+
const user = req.user;
|
|
114
|
+
expect(user.sub).toBe('user-42');
|
|
115
|
+
});
|
|
116
|
+
it('returns 401 when the token is invalid', async () => {
|
|
117
|
+
const hook = auth.hook();
|
|
118
|
+
const req = makeReq({ headers: { authorization: 'Bearer invalid.token.payload' } });
|
|
119
|
+
const reply = makeReply();
|
|
120
|
+
await hook(req, reply);
|
|
121
|
+
expect(reply.code).toHaveBeenCalledWith(401);
|
|
122
|
+
expect(reply.send).toHaveBeenCalledWith({ error: 'Invalid or expired token' });
|
|
123
|
+
});
|
|
124
|
+
it('returns 401 when the token is expired', async () => {
|
|
125
|
+
const expired = jsonwebtoken_1.default.sign({ sub: 'x' }, SECRET, { expiresIn: -10 });
|
|
126
|
+
const hook = auth.hook();
|
|
127
|
+
const req = makeReq({ headers: { authorization: `Bearer ${expired}` } });
|
|
128
|
+
const reply = makeReply();
|
|
129
|
+
await hook(req, reply);
|
|
130
|
+
expect(reply.code).toHaveBeenCalledWith(401);
|
|
131
|
+
expect(reply.send).toHaveBeenCalledWith({ error: 'Invalid or expired token' });
|
|
132
|
+
});
|
|
133
|
+
it('does not set req.user when auth fails', async () => {
|
|
134
|
+
const hook = auth.hook();
|
|
135
|
+
const req = makeReq({ headers: { authorization: 'Bearer bad' } });
|
|
136
|
+
const reply = makeReply();
|
|
137
|
+
await hook(req, reply);
|
|
138
|
+
expect(req.user).toBeUndefined();
|
|
139
|
+
});
|
|
140
|
+
it('ignores an Authorization header that does not start with "Bearer "', async () => {
|
|
141
|
+
const hook = auth.hook();
|
|
142
|
+
const req = makeReq({ headers: { authorization: `Basic ${validToken}` } });
|
|
143
|
+
const reply = makeReply();
|
|
144
|
+
await hook(req, reply);
|
|
145
|
+
// No token extracted → 401
|
|
146
|
+
expect(reply.code).toHaveBeenCalledWith(401);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=JwtAuth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JwtAuth.test.js","sourceRoot":"","sources":["../../src/__tests__/JwtAuth.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/SessionManager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const SessionManager_1 = require("../session/SessionManager");
|
|
4
|
+
function makeSocket() {
|
|
5
|
+
const listeners = {};
|
|
6
|
+
return {
|
|
7
|
+
on: jest.fn((event, cb) => {
|
|
8
|
+
(listeners[event] ??= []).push(cb);
|
|
9
|
+
}),
|
|
10
|
+
send: jest.fn(),
|
|
11
|
+
close: jest.fn(),
|
|
12
|
+
readyState: 1,
|
|
13
|
+
_trigger(event, ...args) {
|
|
14
|
+
listeners[event]?.forEach(h => h(...args));
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function makeEngine() {
|
|
19
|
+
return {
|
|
20
|
+
run: jest.fn().mockResolvedValue(undefined),
|
|
21
|
+
abort: jest.fn(),
|
|
22
|
+
use: jest.fn(),
|
|
23
|
+
getTools: jest.fn().mockReturnValue([]),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function makeMonitorBus() {
|
|
27
|
+
return {
|
|
28
|
+
notifySessionOpen: jest.fn(),
|
|
29
|
+
notifySessionClose: jest.fn(),
|
|
30
|
+
broadcast: jest.fn(),
|
|
31
|
+
broadcastRunInput: jest.fn(),
|
|
32
|
+
subscribe: jest.fn(),
|
|
33
|
+
size: 0,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function makeMetrics() {
|
|
37
|
+
return {
|
|
38
|
+
sessionOpened: jest.fn(),
|
|
39
|
+
sessionClosed: jest.fn(),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function makeStore() {
|
|
43
|
+
return {
|
|
44
|
+
set: jest.fn().mockResolvedValue(undefined),
|
|
45
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
46
|
+
close: jest.fn().mockResolvedValue(undefined),
|
|
47
|
+
getAll: jest.fn().mockResolvedValue([]),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ── Tests ─────────────────────────────────────────────────────────────────────
|
|
51
|
+
describe('SessionManager', () => {
|
|
52
|
+
let engine;
|
|
53
|
+
let engineFactory;
|
|
54
|
+
beforeEach(() => {
|
|
55
|
+
engine = makeEngine();
|
|
56
|
+
engineFactory = jest.fn().mockReturnValue(engine);
|
|
57
|
+
});
|
|
58
|
+
// ── create() ──────────────────────────────────────────────────────────────
|
|
59
|
+
describe('create()', () => {
|
|
60
|
+
it('returns a session with a uuid id and timestamps', () => {
|
|
61
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
62
|
+
const session = mgr.create(makeSocket());
|
|
63
|
+
expect(session.id).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
|
|
64
|
+
expect(session.createdAt).toBeInstanceOf(Date);
|
|
65
|
+
expect(session.lastActivityAt).toBeInstanceOf(Date);
|
|
66
|
+
expect(session.engine).toBe(engine);
|
|
67
|
+
mgr.close();
|
|
68
|
+
});
|
|
69
|
+
it('stores the optional userId', () => {
|
|
70
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
71
|
+
const session = mgr.create(makeSocket(), 'usr-99');
|
|
72
|
+
expect(session.userId).toBe('usr-99');
|
|
73
|
+
mgr.close();
|
|
74
|
+
});
|
|
75
|
+
it('increments size', () => {
|
|
76
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
77
|
+
expect(mgr.size).toBe(0);
|
|
78
|
+
mgr.create(makeSocket());
|
|
79
|
+
expect(mgr.size).toBe(1);
|
|
80
|
+
mgr.create(makeSocket());
|
|
81
|
+
expect(mgr.size).toBe(2);
|
|
82
|
+
mgr.close();
|
|
83
|
+
});
|
|
84
|
+
it('calls engineFactory with the session id and a transport', () => {
|
|
85
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
86
|
+
const session = mgr.create(makeSocket());
|
|
87
|
+
expect(engineFactory).toHaveBeenCalledWith(session.id, expect.any(Object));
|
|
88
|
+
mgr.close();
|
|
89
|
+
});
|
|
90
|
+
it('throws when maxSessions is reached', () => {
|
|
91
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, maxSessions: 2 });
|
|
92
|
+
mgr.create(makeSocket());
|
|
93
|
+
mgr.create(makeSocket());
|
|
94
|
+
expect(() => mgr.create(makeSocket())).toThrow('Max concurrent sessions (2) reached');
|
|
95
|
+
mgr.close();
|
|
96
|
+
});
|
|
97
|
+
it('notifies monitorBus.notifySessionOpen', () => {
|
|
98
|
+
const monitorBus = makeMonitorBus();
|
|
99
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
|
|
100
|
+
const session = mgr.create(makeSocket());
|
|
101
|
+
expect(monitorBus.notifySessionOpen).toHaveBeenCalledWith(session.id);
|
|
102
|
+
mgr.close();
|
|
103
|
+
});
|
|
104
|
+
it('calls metrics.sessionOpened()', () => {
|
|
105
|
+
const metrics = makeMetrics();
|
|
106
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, metrics });
|
|
107
|
+
mgr.create(makeSocket());
|
|
108
|
+
expect(metrics.sessionOpened).toHaveBeenCalledTimes(1);
|
|
109
|
+
mgr.close();
|
|
110
|
+
});
|
|
111
|
+
it('calls store.set() with session metadata', async () => {
|
|
112
|
+
const store = makeStore();
|
|
113
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, store });
|
|
114
|
+
const session = mgr.create(makeSocket());
|
|
115
|
+
await Promise.resolve(); // flush micro-tasks
|
|
116
|
+
expect(store.set).toHaveBeenCalledWith(session.id, expect.objectContaining({ id: session.id }));
|
|
117
|
+
mgr.close();
|
|
118
|
+
});
|
|
119
|
+
it('fan-outs AgentEvents to monitorBus.broadcast', () => {
|
|
120
|
+
const monitorBus = makeMonitorBus();
|
|
121
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
|
|
122
|
+
const session = mgr.create(makeSocket());
|
|
123
|
+
// Simulate the engine emitting an event via the transport
|
|
124
|
+
const event = { type: 'token', content: 'hi' };
|
|
125
|
+
session.transport.emit(event);
|
|
126
|
+
expect(monitorBus.broadcast).toHaveBeenCalledWith(session.id, event);
|
|
127
|
+
mgr.close();
|
|
128
|
+
});
|
|
129
|
+
it('destroys the session automatically on socket close', () => {
|
|
130
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
131
|
+
const socket = makeSocket();
|
|
132
|
+
mgr.create(socket);
|
|
133
|
+
expect(mgr.size).toBe(1);
|
|
134
|
+
socket._trigger('close');
|
|
135
|
+
expect(mgr.size).toBe(0);
|
|
136
|
+
mgr.close();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
// ── get() ─────────────────────────────────────────────────────────────────
|
|
140
|
+
describe('get()', () => {
|
|
141
|
+
it('returns undefined for an unknown id', () => {
|
|
142
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
143
|
+
expect(mgr.get('does-not-exist')).toBeUndefined();
|
|
144
|
+
mgr.close();
|
|
145
|
+
});
|
|
146
|
+
it('returns the session for a known id', () => {
|
|
147
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
148
|
+
const created = mgr.create(makeSocket());
|
|
149
|
+
const fetched = mgr.get(created.id);
|
|
150
|
+
expect(fetched).toBeDefined();
|
|
151
|
+
expect(fetched.id).toBe(created.id);
|
|
152
|
+
mgr.close();
|
|
153
|
+
});
|
|
154
|
+
it('updates lastActivityAt on each call', async () => {
|
|
155
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
156
|
+
const session = mgr.create(makeSocket());
|
|
157
|
+
const before = session.lastActivityAt.getTime();
|
|
158
|
+
await new Promise(r => setTimeout(r, 5));
|
|
159
|
+
mgr.get(session.id);
|
|
160
|
+
expect(session.lastActivityAt.getTime()).toBeGreaterThan(before);
|
|
161
|
+
mgr.close();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
// ── destroy() ─────────────────────────────────────────────────────────────
|
|
165
|
+
describe('destroy()', () => {
|
|
166
|
+
it('removes the session from the map', () => {
|
|
167
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
168
|
+
const session = mgr.create(makeSocket());
|
|
169
|
+
mgr.destroy(session.id);
|
|
170
|
+
expect(mgr.size).toBe(0);
|
|
171
|
+
expect(mgr.get(session.id)).toBeUndefined();
|
|
172
|
+
mgr.close();
|
|
173
|
+
});
|
|
174
|
+
it('calls engine.abort()', () => {
|
|
175
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
176
|
+
const session = mgr.create(makeSocket());
|
|
177
|
+
mgr.destroy(session.id);
|
|
178
|
+
expect(engine.abort).toHaveBeenCalled();
|
|
179
|
+
mgr.close();
|
|
180
|
+
});
|
|
181
|
+
it('notifies monitorBus.notifySessionClose', () => {
|
|
182
|
+
const monitorBus = makeMonitorBus();
|
|
183
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, monitorBus });
|
|
184
|
+
const session = mgr.create(makeSocket());
|
|
185
|
+
mgr.destroy(session.id);
|
|
186
|
+
expect(monitorBus.notifySessionClose).toHaveBeenCalledWith(session.id);
|
|
187
|
+
mgr.close();
|
|
188
|
+
});
|
|
189
|
+
it('calls metrics.sessionClosed()', () => {
|
|
190
|
+
const metrics = makeMetrics();
|
|
191
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, metrics });
|
|
192
|
+
const session = mgr.create(makeSocket());
|
|
193
|
+
mgr.destroy(session.id);
|
|
194
|
+
expect(metrics.sessionClosed).toHaveBeenCalledTimes(1);
|
|
195
|
+
mgr.close();
|
|
196
|
+
});
|
|
197
|
+
it('calls store.delete()', async () => {
|
|
198
|
+
const store = makeStore();
|
|
199
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, store });
|
|
200
|
+
const session = mgr.create(makeSocket());
|
|
201
|
+
mgr.destroy(session.id);
|
|
202
|
+
await Promise.resolve();
|
|
203
|
+
expect(store.delete).toHaveBeenCalledWith(session.id);
|
|
204
|
+
mgr.close();
|
|
205
|
+
});
|
|
206
|
+
it('is a no-op for an unknown id', () => {
|
|
207
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
208
|
+
expect(() => mgr.destroy('ghost')).not.toThrow();
|
|
209
|
+
mgr.close();
|
|
210
|
+
});
|
|
211
|
+
it('does not double-decrement when the same id is destroyed twice', () => {
|
|
212
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
213
|
+
const session = mgr.create(makeSocket());
|
|
214
|
+
mgr.destroy(session.id);
|
|
215
|
+
expect(() => mgr.destroy(session.id)).not.toThrow();
|
|
216
|
+
expect(engine.abort).toHaveBeenCalledTimes(1);
|
|
217
|
+
mgr.close();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
// ── list() ────────────────────────────────────────────────────────────────
|
|
221
|
+
describe('list()', () => {
|
|
222
|
+
it('returns an empty array when no sessions exist', () => {
|
|
223
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
224
|
+
expect(mgr.list()).toEqual([]);
|
|
225
|
+
mgr.close();
|
|
226
|
+
});
|
|
227
|
+
it('returns metadata for all active sessions', () => {
|
|
228
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
229
|
+
mgr.create(makeSocket(), 'alice');
|
|
230
|
+
mgr.create(makeSocket(), 'bob');
|
|
231
|
+
const list = mgr.list();
|
|
232
|
+
expect(list).toHaveLength(2);
|
|
233
|
+
expect(list[0]).toHaveProperty('id');
|
|
234
|
+
expect(list[0]).toHaveProperty('createdAt');
|
|
235
|
+
expect(list[0]).toHaveProperty('lastActivityAt');
|
|
236
|
+
});
|
|
237
|
+
it('does not expose engine or transport on list items', () => {
|
|
238
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
239
|
+
mgr.create(makeSocket());
|
|
240
|
+
const [item] = mgr.list();
|
|
241
|
+
expect(item).not.toHaveProperty('engine');
|
|
242
|
+
expect(item).not.toHaveProperty('transport');
|
|
243
|
+
mgr.close();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
// ── close() ───────────────────────────────────────────────────────────────
|
|
247
|
+
describe('close()', () => {
|
|
248
|
+
it('destroys all sessions', () => {
|
|
249
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory });
|
|
250
|
+
mgr.create(makeSocket());
|
|
251
|
+
mgr.create(makeSocket());
|
|
252
|
+
mgr.close();
|
|
253
|
+
expect(mgr.size).toBe(0);
|
|
254
|
+
});
|
|
255
|
+
it('calls engine.abort() for every open session', () => {
|
|
256
|
+
const eng2 = makeEngine();
|
|
257
|
+
const fac = jest.fn()
|
|
258
|
+
.mockReturnValueOnce(engine)
|
|
259
|
+
.mockReturnValueOnce(eng2);
|
|
260
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory: fac });
|
|
261
|
+
mgr.create(makeSocket());
|
|
262
|
+
mgr.create(makeSocket());
|
|
263
|
+
mgr.close();
|
|
264
|
+
expect(engine.abort).toHaveBeenCalled();
|
|
265
|
+
expect(eng2.abort).toHaveBeenCalled();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
// ── idle sweep ────────────────────────────────────────────────────────────
|
|
269
|
+
describe('idle sweep', () => {
|
|
270
|
+
beforeEach(() => jest.useFakeTimers());
|
|
271
|
+
afterEach(() => {
|
|
272
|
+
jest.clearAllTimers();
|
|
273
|
+
jest.useRealTimers();
|
|
274
|
+
});
|
|
275
|
+
it('evicts sessions idle longer than maxIdleMs', () => {
|
|
276
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 5_000 });
|
|
277
|
+
const session = mgr.create(makeSocket());
|
|
278
|
+
// Simulate the session being idle for 6 seconds
|
|
279
|
+
session.lastActivityAt = new Date(Date.now() - 6_000);
|
|
280
|
+
jest.advanceTimersByTime(60_001);
|
|
281
|
+
expect(mgr.size).toBe(0);
|
|
282
|
+
mgr.close();
|
|
283
|
+
});
|
|
284
|
+
it('keeps sessions that are still within maxIdleMs', () => {
|
|
285
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 120_000 });
|
|
286
|
+
mgr.create(makeSocket());
|
|
287
|
+
// Sweep fires (60s), session is only 60s old, max is 120s
|
|
288
|
+
jest.advanceTimersByTime(60_001);
|
|
289
|
+
expect(mgr.size).toBe(1);
|
|
290
|
+
mgr.close();
|
|
291
|
+
});
|
|
292
|
+
it('does not fire if close() was called before the interval', () => {
|
|
293
|
+
const mgr = new SessionManager_1.SessionManager({ engineFactory, maxIdleMs: 1 });
|
|
294
|
+
const session = mgr.create(makeSocket());
|
|
295
|
+
session.lastActivityAt = new Date(Date.now() - 10_000);
|
|
296
|
+
mgr.close(); // clears the timer
|
|
297
|
+
jest.advanceTimersByTime(60_001);
|
|
298
|
+
// sweep never ran — the session was already destroyed by close()
|
|
299
|
+
expect(engine.abort).toHaveBeenCalledTimes(1); // only from close()
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
//# sourceMappingURL=SessionManager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.test.js","sourceRoot":"","sources":["../../src/__tests__/SessionManager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TriggerBus.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/TriggerBus.test.ts"],"names":[],"mappings":""}
|