@carbonvoice/cv-mcp-server 1.1.3 → 2.0.1

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.
Files changed (43) hide show
  1. package/dist/auth/auth.service.js +79 -0
  2. package/dist/auth/auth.service.js.map +1 -0
  3. package/dist/auth/index.js +15 -0
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/interfaces/auth.types.js +3 -0
  6. package/dist/auth/interfaces/auth.types.js.map +1 -0
  7. package/dist/auth/interfaces/index.js +1 -0
  8. package/dist/auth/interfaces/index.js.map +1 -1
  9. package/dist/cv-api.js +13 -5
  10. package/dist/cv-api.js.map +1 -1
  11. package/dist/server.js +30 -30
  12. package/dist/server.js.map +1 -1
  13. package/dist/transports/http/interfaces/index.js +3 -0
  14. package/dist/transports/http/interfaces/index.js.map +1 -0
  15. package/dist/transports/http/middleware/add-mcp-session-id.middleware.js +20 -13
  16. package/dist/transports/http/middleware/add-mcp-session-id.middleware.js.map +1 -1
  17. package/dist/transports/http/middleware/add-request-id.middlware.js +13 -4
  18. package/dist/transports/http/middleware/add-request-id.middlware.js.map +1 -1
  19. package/dist/transports/http/session/index.js +34 -0
  20. package/dist/transports/http/session/index.js.map +1 -0
  21. package/dist/transports/http/session/session-cleanup.js +60 -0
  22. package/dist/transports/http/session/session-cleanup.js.map +1 -0
  23. package/dist/transports/http/session/session-manager.js +52 -0
  24. package/dist/transports/http/session/session-manager.js.map +1 -0
  25. package/dist/transports/http/session/session.config.js +29 -0
  26. package/dist/transports/http/session/session.config.js.map +1 -0
  27. package/dist/transports/http/session/session.logger.js +77 -0
  28. package/dist/transports/http/session/session.logger.js.map +1 -0
  29. package/dist/transports/http/session/session.service.js +192 -0
  30. package/dist/transports/http/session/session.service.js.map +1 -0
  31. package/dist/transports/http/session/session.types.js +31 -0
  32. package/dist/transports/http/session/session.types.js.map +1 -0
  33. package/dist/transports/http/streamable.js +172 -422
  34. package/dist/transports/http/streamable.js.map +1 -1
  35. package/dist/transports/http/utils/request-context.js +78 -0
  36. package/dist/transports/http/utils/request-context.js.map +1 -0
  37. package/dist/utils/axios-instance.js +7 -10
  38. package/dist/utils/axios-instance.js.map +1 -1
  39. package/dist/utils/logger.js +34 -11
  40. package/dist/utils/logger.js.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/auth/auth-middleware.js +0 -203
  43. package/dist/auth/auth-middleware.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.sessionService = exports.sessionManager = exports.SessionConfig = void 0;
18
+ // Types and interfaces
19
+ __exportStar(require("./session.types"), exports);
20
+ // Configuration
21
+ var session_config_1 = require("./session.config");
22
+ Object.defineProperty(exports, "SessionConfig", { enumerable: true, get: function () { return session_config_1.SessionConfig; } });
23
+ // Core services
24
+ __exportStar(require("./session-manager"), exports);
25
+ __exportStar(require("./session.service"), exports);
26
+ // Utilities
27
+ __exportStar(require("./session.logger"), exports);
28
+ __exportStar(require("./session-cleanup"), exports);
29
+ // Singleton instances
30
+ var session_manager_1 = require("./session-manager");
31
+ Object.defineProperty(exports, "sessionManager", { enumerable: true, get: function () { return session_manager_1.sessionManager; } });
32
+ var session_service_1 = require("./session.service");
33
+ Object.defineProperty(exports, "sessionService", { enumerable: true, get: function () { return session_service_1.sessionService; } });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/transports/http/session/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uBAAuB;AACvB,kDAAgC;AAEhC,gBAAgB;AAChB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,gBAAgB;AAChB,oDAAkC;AAClC,oDAAkC;AAElC,YAAY;AACZ,mDAAiC;AACjC,oDAAkC;AAElC,sBAAsB;AACtB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionCleanupService = void 0;
4
+ class SessionCleanupService {
5
+ constructor(sessionService, config, logger) {
6
+ this.sessionService = sessionService;
7
+ this.config = config;
8
+ this.logger = logger;
9
+ this.cleanupInterval = null;
10
+ this.isRunning = false;
11
+ }
12
+ start() {
13
+ if (this.isRunning) {
14
+ return;
15
+ }
16
+ this.isRunning = true;
17
+ this.cleanupInterval = setInterval(() => {
18
+ this.cleanupExpiredSessions();
19
+ }, this.config.cleanupIntervalMs);
20
+ // Log cleanup start
21
+ this.logger.logCleanupStarted(this.sessionService.getSessionCount());
22
+ }
23
+ stop() {
24
+ if (this.cleanupInterval) {
25
+ clearInterval(this.cleanupInterval);
26
+ this.cleanupInterval = null;
27
+ }
28
+ this.isRunning = false;
29
+ }
30
+ cleanupExpiredSessions() {
31
+ try {
32
+ const now = new Date();
33
+ const sessions = this.sessionService.getAllSessions();
34
+ let cleanedCount = 0;
35
+ for (const [sessionId, session] of sessions) {
36
+ if (session.metrics.expiresAt < now) {
37
+ // Log session timeout
38
+ this.logger.logSessionTimeout();
39
+ this.sessionService.destroySession(sessionId);
40
+ cleanedCount++;
41
+ }
42
+ }
43
+ const remainingCount = this.sessionService.getSessionCount();
44
+ // Log cleanup completion
45
+ this.logger.logCleanupCompleted(cleanedCount, remainingCount);
46
+ }
47
+ catch (error) {
48
+ // Log cleanup error
49
+ this.logger.logSessionError(error, {
50
+ context: 'cleanup-service',
51
+ sessionId: 'N/A', // No sessionId available here
52
+ });
53
+ }
54
+ }
55
+ isActive() {
56
+ return this.isRunning;
57
+ }
58
+ }
59
+ exports.SessionCleanupService = SessionCleanupService;
60
+ //# sourceMappingURL=session-cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cleanup.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session-cleanup.ts"],"names":[],"mappings":";;;AAIA,MAAa,qBAAqB;IAIhC,YACU,cAA+B,EAC/B,MAAqB,EACrB,MAAqB;QAFrB,mBAAc,GAAd,cAAc,CAAiB;QAC/B,WAAM,GAAN,MAAM,CAAe;QACrB,WAAM,GAAN,MAAM,CAAe;QANvB,oBAAe,GAA0B,IAAI,CAAC;QAC9C,cAAS,GAAG,KAAK,CAAC;IAMvB,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAElC,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACtD,IAAI,YAAY,GAAG,CAAC,CAAC;YAErB,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC5C,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;oBACpC,sBAAsB;oBACtB,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBAChC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBAC9C,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;YAC7D,yBAAyB;YACzB,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oBAAoB;YACpB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAc,EAAE;gBAC1C,OAAO,EAAE,iBAAiB;gBAC1B,SAAS,EAAE,KAAK,EAAE,8BAA8B;aACjD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AA9DD,sDA8DC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionManager = exports.SessionManager = void 0;
4
+ class SessionManager {
5
+ constructor() {
6
+ this.sessions = new Map();
7
+ }
8
+ getSession(sessionId) {
9
+ return this.sessions.get(sessionId);
10
+ }
11
+ setSession(sessionId, session) {
12
+ if (!sessionId) {
13
+ throw new Error('Session ID cannot be empty');
14
+ }
15
+ if (!session) {
16
+ throw new Error('Session cannot be null or undefined');
17
+ }
18
+ this.sessions.set(sessionId, session);
19
+ }
20
+ deleteSession(sessionId) {
21
+ if (!sessionId) {
22
+ return false;
23
+ }
24
+ return this.sessions.delete(sessionId);
25
+ }
26
+ getAllSessions() {
27
+ return new Map(this.sessions);
28
+ }
29
+ getAllSessionIds() {
30
+ return Array.from(this.sessions.keys());
31
+ }
32
+ hasSession(sessionId) {
33
+ return this.sessions.has(sessionId);
34
+ }
35
+ clearAllSessions() {
36
+ this.sessions.clear();
37
+ }
38
+ getSessionCount() {
39
+ return this.sessions.size;
40
+ }
41
+ // Additional utility methods
42
+ getSessionsByUserId(userId) {
43
+ return Array.from(this.sessions.values()).filter((session) => session.userId === userId);
44
+ }
45
+ getExpiredSessions(now = new Date()) {
46
+ return Array.from(this.sessions.values()).filter((session) => session.metrics.expiresAt < now);
47
+ }
48
+ }
49
+ exports.SessionManager = SessionManager;
50
+ // Singleton instance
51
+ exports.sessionManager = new SessionManager();
52
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session-manager.ts"],"names":[],"mappings":";;;AAEA,MAAa,cAAc;IAA3B;QACU,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAuDhD,CAAC;IArDC,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,UAAU,CAAC,SAAiB,EAAE,OAAgB;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB;QACd,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,6BAA6B;IAC7B,mBAAmB,CAAC,MAAc;QAChC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CACvC,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,MAAY,IAAI,IAAI,EAAE;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC9C,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,GAAG,GAAG,CAC7C,CAAC;IACJ,CAAC;CACF;AAxDD,wCAwDC;AAED,qBAAqB;AACR,QAAA,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionConfig = void 0;
4
+ class SessionConfig {
5
+ constructor(ttlMs = 1000 * 60 * 60, // 1 hour
6
+ maxSessions = 2000, cleanupIntervalMs = 1000 * 60 * 5) {
7
+ this.ttlMs = ttlMs;
8
+ this.maxSessions = maxSessions;
9
+ this.cleanupIntervalMs = cleanupIntervalMs;
10
+ }
11
+ static fromEnv() {
12
+ return new SessionConfig(1000 * 60 * 60, // 1 hour TTL
13
+ 2000, // Default max sessions
14
+ 1000 * 60 * 5);
15
+ }
16
+ validate() {
17
+ if (this.ttlMs <= 0) {
18
+ throw new Error('Session TTL must be positive');
19
+ }
20
+ if (this.maxSessions <= 0) {
21
+ throw new Error('Max sessions must be positive');
22
+ }
23
+ if (this.cleanupIntervalMs <= 0) {
24
+ throw new Error('Cleanup interval must be positive');
25
+ }
26
+ }
27
+ }
28
+ exports.SessionConfig = SessionConfig;
29
+ //# sourceMappingURL=session.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.config.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session.config.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IACxB,YACkB,QAAgB,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,SAAS;IACzC,cAAsB,IAAI,EAC1B,oBAA4B,IAAI,GAAG,EAAE,GAAG,CAAC;QAFzC,UAAK,GAAL,KAAK,CAAyB;QAC9B,gBAAW,GAAX,WAAW,CAAe;QAC1B,sBAAiB,GAAjB,iBAAiB,CAAwB;IACxD,CAAC;IAEJ,MAAM,CAAC,OAAO;QACZ,OAAO,IAAI,aAAa,CACtB,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,aAAa;QAC7B,IAAI,EAAE,uBAAuB;QAC7B,IAAI,GAAG,EAAE,GAAG,CAAC,CACd,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF;AA1BD,sCA0BC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionLogger = void 0;
4
+ const utils_1 = require("../../../utils");
5
+ class SessionLogger {
6
+ logSessionCreated() {
7
+ utils_1.logger.info('🆕 Session created', {
8
+ event: 'SESSION_CREATED',
9
+ timestamp: new Date().toISOString(),
10
+ });
11
+ }
12
+ logSessionDestroyed(duration, metrics) {
13
+ utils_1.logger.info('🗑️ Session destroyed', {
14
+ duration,
15
+ metrics,
16
+ event: 'SESSION_DESTROYED',
17
+ timestamp: new Date().toISOString(),
18
+ });
19
+ }
20
+ logSessionTimeout() {
21
+ utils_1.logger.info('⏰ Session timeout triggered', {
22
+ event: 'SESSION_TIMEOUT',
23
+ timestamp: new Date().toISOString(),
24
+ });
25
+ }
26
+ logSessionReused(totalInteractions) {
27
+ utils_1.logger.debug('🔄 Session reused', {
28
+ totalInteractions,
29
+ event: 'SESSION_REUSED',
30
+ timestamp: new Date().toISOString(),
31
+ });
32
+ }
33
+ logSessionError(error, context) {
34
+ utils_1.logger.error('❌ Session error', {
35
+ error: {
36
+ message: error.message,
37
+ name: error.name,
38
+ stack: error.stack,
39
+ },
40
+ context,
41
+ event: 'SESSION_ERROR',
42
+ timestamp: new Date().toISOString(),
43
+ });
44
+ }
45
+ logSessionDebug(message, context) {
46
+ utils_1.logger.debug('🔍 Session debug', {
47
+ message,
48
+ context,
49
+ event: 'SESSION_DEBUG',
50
+ timestamp: new Date().toISOString(),
51
+ });
52
+ }
53
+ logSessionMetrics(metrics) {
54
+ utils_1.logger.debug('📊 Session metrics', {
55
+ metrics,
56
+ event: 'SESSION_METRICS',
57
+ timestamp: new Date().toISOString(),
58
+ });
59
+ }
60
+ logCleanupStarted(totalSessions) {
61
+ utils_1.logger.info('🧹 Session cleanup started', {
62
+ totalSessions,
63
+ event: 'SESSION_CLEANUP_STARTED',
64
+ timestamp: new Date().toISOString(),
65
+ });
66
+ }
67
+ logCleanupCompleted(cleanedSessions, remainingSessions) {
68
+ utils_1.logger.info('✨ Session cleanup completed', {
69
+ cleanedSessions,
70
+ remainingSessions,
71
+ event: 'SESSION_CLEANUP_COMPLETED',
72
+ timestamp: new Date().toISOString(),
73
+ });
74
+ }
75
+ }
76
+ exports.SessionLogger = SessionLogger;
77
+ //# sourceMappingURL=session.logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.logger.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session.logger.ts"],"names":[],"mappings":";;;AAEA,0CAAwC;AAExC,MAAa,aAAa;IACxB,iBAAiB;QACf,cAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAChC,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,QAAgB,EAAE,OAAuB;QAC3D,cAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACnC,QAAQ;YACR,OAAO;YACP,KAAK,EAAE,mBAAmB;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;QACf,cAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,iBAAyB;QACxC,cAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;YAChC,iBAAiB;YACjB,KAAK,EAAE,gBAAgB;YACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,KAAY,EAAE,OAAiC;QAC7D,cAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC9B,KAAK,EAAE;gBACL,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB;YACD,OAAO;YACP,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,eAAe,CAAC,OAAe,EAAE,OAAiC;QAChE,cAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE;YAC/B,OAAO;YACP,OAAO;YACP,KAAK,EAAE,eAAe;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,OAAuB;QACvC,cAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;YACjC,OAAO;YACP,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,aAAqB;QACrC,cAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YACxC,aAAa;YACb,KAAK,EAAE,yBAAyB;YAChC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CACjB,eAAuB,EACvB,iBAAyB;QAEzB,cAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YACzC,eAAe;YACf,iBAAiB;YACjB,KAAK,EAAE,2BAA2B;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF;AAjFD,sCAiFC"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sessionService = exports.SessionService = void 0;
4
+ const session_config_1 = require("./session.config");
5
+ const session_logger_1 = require("./session.logger");
6
+ const session_types_1 = require("./session.types");
7
+ const session_manager_1 = require("./session-manager");
8
+ class SessionService {
9
+ constructor(sessionManager, config = new session_config_1.SessionConfig()) {
10
+ this.sessionManager = sessionManager;
11
+ this.config = config;
12
+ this.logger = new session_logger_1.SessionLogger();
13
+ this.config.validate();
14
+ }
15
+ createSession(transport, req, sessionId) {
16
+ var _a, _b;
17
+ // Validate inputs
18
+ if (!((_b = (_a = req.auth) === null || _a === void 0 ? void 0 : _a.extra) === null || _b === void 0 ? void 0 : _b.user)) {
19
+ throw new session_types_1.UserNotFoundError();
20
+ }
21
+ if (!sessionId) {
22
+ throw new Error('Session ID cannot be empty');
23
+ }
24
+ if (!transport) {
25
+ throw new Error('Transport cannot be null or undefined');
26
+ }
27
+ // Check if session already exists
28
+ if (this.sessionManager.hasSession(sessionId)) {
29
+ throw new Error(`Session already exists: ${sessionId}`);
30
+ }
31
+ // Check session limits
32
+ if (this.sessionManager.getSessionCount() >= this.config.maxSessions) {
33
+ throw new Error(`Maximum sessions limit reached: ${this.config.maxSessions}`);
34
+ }
35
+ const userId = req.auth.extra.user.id;
36
+ const now = new Date();
37
+ const expiresAt = new Date(now.getTime() + this.config.ttlMs);
38
+ // Create enhanced metrics
39
+ const metrics = {
40
+ sessionId,
41
+ userId,
42
+ createdAt: now,
43
+ expiresAt,
44
+ totalInteractions: 0,
45
+ totalToolCalls: 0,
46
+ lastActivityAt: now,
47
+ errorCount: 0,
48
+ averageResponseTime: 0,
49
+ };
50
+ // Create session with timeout
51
+ const timeout = setTimeout(() => {
52
+ this.logger.logSessionTimeout();
53
+ this.destroySession(sessionId);
54
+ }, this.config.ttlMs);
55
+ const session = {
56
+ transport,
57
+ timeout,
58
+ userId,
59
+ metrics,
60
+ };
61
+ // Store session
62
+ this.sessionManager.setSession(sessionId, session);
63
+ // Log session creation
64
+ this.logger.logSessionCreated();
65
+ return sessionId;
66
+ }
67
+ destroySession(sessionId) {
68
+ if (!sessionId) {
69
+ return;
70
+ }
71
+ const session = this.sessionManager.getSession(sessionId);
72
+ if (!session) {
73
+ return; // Session doesn't exist, nothing to destroy
74
+ }
75
+ if (session.destroying) {
76
+ this.logger.logSessionDebug(`Session already being destroyed: ${sessionId}`);
77
+ return;
78
+ }
79
+ try {
80
+ // Mark session as being destroyed to prevent recursive calls
81
+ session.destroying = true;
82
+ // Clear timeout
83
+ clearTimeout(session.timeout);
84
+ // Close transport
85
+ session.transport.close();
86
+ // Calculate duration
87
+ const durationInSeconds = (new Date().getTime() - session.metrics.createdAt.getTime()) / 1000;
88
+ // Log session destruction
89
+ this.logger.logSessionDestroyed(durationInSeconds, session.metrics);
90
+ // Remove from manager
91
+ this.sessionManager.deleteSession(sessionId);
92
+ }
93
+ catch (error) {
94
+ this.logger.logSessionError(error, {
95
+ action: 'destroySession',
96
+ sessionId,
97
+ });
98
+ // Still try to remove from manager even if cleanup fails
99
+ this.sessionManager.deleteSession(sessionId);
100
+ }
101
+ }
102
+ getSession(sessionId) {
103
+ if (!sessionId) {
104
+ return undefined;
105
+ }
106
+ return this.sessionManager.getSession(sessionId);
107
+ }
108
+ hasSession(sessionId) {
109
+ if (!sessionId) {
110
+ return false;
111
+ }
112
+ return this.sessionManager.hasSession(sessionId);
113
+ }
114
+ getAllSessions() {
115
+ return this.sessionManager.getAllSessions();
116
+ }
117
+ getAllSessionIds() {
118
+ return this.sessionManager.getAllSessionIds();
119
+ }
120
+ getSessionCount() {
121
+ return this.sessionManager.getSessionCount();
122
+ }
123
+ clearAllSessions() {
124
+ const sessions = this.sessionManager.getAllSessions();
125
+ for (const [sessionId] of sessions) {
126
+ this.destroySession(sessionId);
127
+ }
128
+ }
129
+ // Enhanced metrics tracking
130
+ recordInteraction(sessionId) {
131
+ const session = this.getSession(sessionId);
132
+ if (session) {
133
+ session.metrics.totalInteractions++;
134
+ session.metrics.lastActivityAt = new Date();
135
+ // Log metrics every 10 interactions to reduce noise
136
+ if (session.metrics.totalInteractions % 10 === 0) {
137
+ this.logger.logSessionMetrics(session.metrics);
138
+ }
139
+ }
140
+ }
141
+ recordToolCall(sessionId) {
142
+ const session = this.getSession(sessionId);
143
+ if (session) {
144
+ session.metrics.totalToolCalls++;
145
+ session.metrics.lastActivityAt = new Date();
146
+ // Log metrics on every tool call since these are significant events
147
+ this.logger.logSessionMetrics(session.metrics);
148
+ }
149
+ }
150
+ recordError(sessionId) {
151
+ const session = this.getSession(sessionId);
152
+ if (session) {
153
+ session.metrics.errorCount++;
154
+ // Log metrics on every error since these are important for debugging
155
+ this.logger.logSessionMetrics(session.metrics);
156
+ }
157
+ }
158
+ // Additional utility methods
159
+ getSessionMetrics(sessionId) {
160
+ const session = this.getSession(sessionId);
161
+ return session === null || session === void 0 ? void 0 : session.metrics;
162
+ }
163
+ isSessionExpired(sessionId) {
164
+ const session = this.getSession(sessionId);
165
+ if (!session) {
166
+ return true;
167
+ }
168
+ return session.metrics.expiresAt < new Date();
169
+ }
170
+ extendSession(sessionId, additionalTtlMs = this.config.ttlMs) {
171
+ const session = this.getSession(sessionId);
172
+ if (!session) {
173
+ return false;
174
+ }
175
+ // Clear existing timeout
176
+ clearTimeout(session.timeout);
177
+ // Extend expiration
178
+ const newExpiresAt = new Date(Date.now() + additionalTtlMs);
179
+ session.metrics.expiresAt = newExpiresAt;
180
+ // Set new timeout
181
+ session.timeout = setTimeout(() => {
182
+ this.logger.logSessionTimeout();
183
+ this.destroySession(sessionId);
184
+ }, additionalTtlMs);
185
+ this.logger.logSessionMetrics(session.metrics);
186
+ return true;
187
+ }
188
+ }
189
+ exports.SessionService = SessionService;
190
+ // Singleton instance
191
+ exports.sessionService = new SessionService(session_manager_1.sessionManager);
192
+ //# sourceMappingURL=session.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionAlreadyDestroyingError = exports.SessionNotFoundError = exports.UserNotFoundError = exports.SessionError = void 0;
4
+ // Error classes
5
+ class SessionError extends Error {
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'SessionError';
10
+ }
11
+ }
12
+ exports.SessionError = SessionError;
13
+ class UserNotFoundError extends SessionError {
14
+ constructor() {
15
+ super('User not found in session creation', 'USER_NOT_FOUND');
16
+ }
17
+ }
18
+ exports.UserNotFoundError = UserNotFoundError;
19
+ class SessionNotFoundError extends SessionError {
20
+ constructor(sessionId) {
21
+ super(`Session not found: ${sessionId}`, 'SESSION_NOT_FOUND');
22
+ }
23
+ }
24
+ exports.SessionNotFoundError = SessionNotFoundError;
25
+ class SessionAlreadyDestroyingError extends SessionError {
26
+ constructor(sessionId) {
27
+ super(`Session already being destroyed: ${sessionId}`, 'SESSION_ALREADY_DESTROYING');
28
+ }
29
+ }
30
+ exports.SessionAlreadyDestroyingError = SessionAlreadyDestroyingError;
31
+ //# sourceMappingURL=session.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.types.js","sourceRoot":"","sources":["../../../../src/transports/http/session/session.types.ts"],"names":[],"mappings":";;;AA8DA,gBAAgB;AAChB,MAAa,YAAa,SAAQ,KAAK;IACrC,YACE,OAAe,EACR,IAAY;QAEnB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,SAAI,GAAJ,IAAI,CAAQ;QAGnB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC;AAED,MAAa,iBAAkB,SAAQ,YAAY;IACjD;QACE,KAAK,CAAC,oCAAoC,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC;CACF;AAJD,8CAIC;AAED,MAAa,oBAAqB,SAAQ,YAAY;IACpD,YAAY,SAAiB;QAC3B,KAAK,CAAC,sBAAsB,SAAS,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAChE,CAAC;CACF;AAJD,oDAIC;AAED,MAAa,6BAA8B,SAAQ,YAAY;IAC7D,YAAY,SAAiB;QAC3B,KAAK,CACH,oCAAoC,SAAS,EAAE,EAC/C,4BAA4B,CAC7B,CAAC;IACJ,CAAC;CACF;AAPD,sEAOC"}