@nestjs-mcp/server 0.4.0 → 1.0.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.
Files changed (44) hide show
  1. package/README.md +77 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/interfaces/context.interface.d.ts +10 -5
  6. package/dist/mcp-core.module.js +27 -8
  7. package/dist/mcp-core.module.js.map +1 -1
  8. package/dist/mcp.constants.d.ts +5 -3
  9. package/dist/mcp.constants.js +6 -4
  10. package/dist/mcp.constants.js.map +1 -1
  11. package/dist/mcp.types.d.ts +8 -1
  12. package/dist/services/logger.service.js +2 -1
  13. package/dist/services/logger.service.js.map +1 -1
  14. package/dist/services/registry.service.js +32 -20
  15. package/dist/services/registry.service.js.map +1 -1
  16. package/dist/services/session.manager.d.ts +5 -1
  17. package/dist/services/session.manager.js +21 -2
  18. package/dist/services/session.manager.js.map +1 -1
  19. package/dist/transports/sse/sse.service.d.ts +14 -3
  20. package/dist/transports/sse/sse.service.js +87 -9
  21. package/dist/transports/sse/sse.service.js.map +1 -1
  22. package/dist/transports/streamable/streamable.service.d.ts +13 -3
  23. package/dist/transports/streamable/streamable.service.js +101 -8
  24. package/dist/transports/streamable/streamable.service.js.map +1 -1
  25. package/dist/tsconfig.build.tsbuildinfo +1 -1
  26. package/dist/types/handler-args.types.d.ts +23 -0
  27. package/dist/types/handler-args.types.js +3 -0
  28. package/dist/types/handler-args.types.js.map +1 -0
  29. package/package.json +19 -19
  30. package/dist/classes/index.d.ts +0 -4
  31. package/dist/classes/index.js +0 -21
  32. package/dist/classes/index.js.map +0 -1
  33. package/dist/classes/prompt.args.d.ts +0 -8
  34. package/dist/classes/prompt.args.js +0 -16
  35. package/dist/classes/prompt.args.js.map +0 -1
  36. package/dist/classes/resource-template.args.d.ts +0 -8
  37. package/dist/classes/resource-template.args.js +0 -18
  38. package/dist/classes/resource-template.args.js.map +0 -1
  39. package/dist/classes/resource-uri.args.d.ts +0 -7
  40. package/dist/classes/resource-uri.args.js +0 -16
  41. package/dist/classes/resource-uri.args.js.map +0 -1
  42. package/dist/classes/tool.args.d.ts +0 -8
  43. package/dist/classes/tool.args.js +0 -16
  44. package/dist/classes/tool.args.js.map +0 -1
@@ -16,40 +16,116 @@ exports.SseService = void 0;
16
16
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
17
17
  const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
18
18
  const common_1 = require("@nestjs/common");
19
+ const mcp_constants_1 = require("../../mcp.constants");
19
20
  const logger_service_1 = require("../../services/logger.service");
20
21
  const registry_service_1 = require("../../services/registry.service");
21
22
  const session_manager_1 = require("../../services/session.manager");
22
23
  let SseService = class SseService {
23
24
  options;
25
+ sessionOptions;
26
+ transportOptions;
24
27
  registry;
25
28
  logger;
26
29
  sessionManager;
27
- server;
28
- constructor(options, registry, logger, sessionManager) {
30
+ sessionTimeoutMs;
31
+ maxConcurrentSessions;
32
+ cleanupIntervalMs;
33
+ enabled;
34
+ cleanupTimer;
35
+ constructor(options, sessionOptions, transportOptions, registry, logger, sessionManager) {
29
36
  this.options = options;
37
+ this.sessionOptions = sessionOptions;
38
+ this.transportOptions = transportOptions;
30
39
  this.registry = registry;
31
40
  this.logger = logger;
32
41
  this.sessionManager = sessionManager;
33
- this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
42
+ this.enabled = transportOptions?.sse?.enabled !== false;
43
+ this.sessionTimeoutMs = sessionOptions.sessionTimeoutMs ?? 1800000;
44
+ this.maxConcurrentSessions = sessionOptions.maxConcurrentSessions ?? 1000;
45
+ this.cleanupIntervalMs = sessionOptions.cleanupIntervalMs ?? 300000;
34
46
  }
35
47
  onModuleInit() {
36
- this.logger.log('Starting MCP controller registration', 'MCP_SERVER');
37
- this.registry.registerAll(this.server);
48
+ if (!this.enabled) {
49
+ this.logger.log('SSE transport disabled', 'MCP_SERVER');
50
+ return;
51
+ }
38
52
  this.logger.log('MCP initialization completed', 'MCP_SERVER');
53
+ this.startCleanupJob();
54
+ }
55
+ onModuleDestroy() {
56
+ this.stopCleanupJob();
57
+ }
58
+ startCleanupJob() {
59
+ this.cleanupTimer = setInterval(() => {
60
+ this.cleanupInactiveSessions();
61
+ }, this.cleanupIntervalMs);
62
+ }
63
+ stopCleanupJob() {
64
+ if (this.cleanupTimer) {
65
+ clearInterval(this.cleanupTimer);
66
+ }
67
+ }
68
+ cleanupInactiveSessions() {
69
+ const inactiveSessions = this.sessionManager.getInactiveSessions(this.sessionTimeoutMs);
70
+ if (inactiveSessions.length > 0) {
71
+ this.logger.debug(`Cleaning up ${inactiveSessions.length} inactive sessions`, 'SSE');
72
+ for (const sessionId of inactiveSessions) {
73
+ const session = this.sessionManager.getSession(sessionId);
74
+ if (session) {
75
+ try {
76
+ void session.transport.close();
77
+ }
78
+ catch (error) {
79
+ const errorMessage = error instanceof Error ? error.message : String(error);
80
+ this.logger.error(`Error closing transport for session ${sessionId}`, errorMessage, 'SSE');
81
+ }
82
+ this.sessionManager.deleteSession(sessionId);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ createServer() {
88
+ const server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
89
+ this.registry.registerAll(server);
90
+ return server;
39
91
  }
40
92
  async handleSse(req, res) {
93
+ if (!this.enabled) {
94
+ res.status(404).send('SSE transport is disabled');
95
+ return;
96
+ }
97
+ if (this.sessionManager.getActiveSessionCount() >= this.maxConcurrentSessions) {
98
+ this.logger.warn(`Maximum concurrent sessions reached: ${this.maxConcurrentSessions}`, 'SSE');
99
+ res
100
+ .status(503)
101
+ .send('Service temporarily unavailable: Maximum concurrent sessions reached');
102
+ return;
103
+ }
41
104
  const transport = new sse_js_1.SSEServerTransport('/messages', res);
42
105
  this.sessionManager.setSession(transport.sessionId, {
43
106
  transport,
44
107
  request: req,
45
108
  });
46
- this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'api');
109
+ this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'SSE');
47
110
  res.on('close', () => {
111
+ this.logger.debug(`SSE connection closed for session: ${transport.sessionId}`, 'SSE');
48
112
  this.sessionManager.deleteSession(transport.sessionId);
49
113
  });
50
- await this.server.connect(transport);
114
+ try {
115
+ const server = this.createServer();
116
+ await server.connect(transport);
117
+ }
118
+ catch (error) {
119
+ this.logger.error('Failed to create or connect server', error, 'SSE');
120
+ this.sessionManager.deleteSession(transport.sessionId);
121
+ res.status(500).send('Internal server error');
122
+ }
51
123
  }
52
124
  async handleMessage(req, res) {
125
+ if (!this.enabled) {
126
+ res.status(404).send('SSE transport is disabled');
127
+ return;
128
+ }
53
129
  const sessionId = req.query.sessionId;
54
130
  const session = this.sessionManager.getSession(sessionId);
55
131
  if (!session) {
@@ -85,8 +161,10 @@ let SseService = class SseService {
85
161
  exports.SseService = SseService;
86
162
  exports.SseService = SseService = __decorate([
87
163
  (0, common_1.Injectable)(),
88
- __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
89
- __metadata("design:paramtypes", [Object, registry_service_1.RegistryService,
164
+ __param(0, (0, common_1.Inject)(mcp_constants_1.MCP_SERVER_OPTIONS)),
165
+ __param(1, (0, common_1.Inject)(mcp_constants_1.MCP_SESSION_OPTIONS)),
166
+ __param(2, (0, common_1.Inject)(mcp_constants_1.MCP_TRANSPORT_OPTIONS)),
167
+ __metadata("design:paramtypes", [Object, Object, Object, registry_service_1.RegistryService,
90
168
  logger_service_1.McpLoggerService,
91
169
  session_manager_1.SessionManager])
92
170
  ], SseService);
@@ -1 +1 @@
1
- {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/transports/sse/sse.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAAoE;AACpE,oEAA6E;AAC7E,2CAAkE;AAIlE,kEAAiE;AACjE,sEAAkE;AAClE,oEAAgE;AAGzD,IAAM,UAAU,GAAhB,MAAM,UAAU;IAKF;IACA;IACA;IACA;IAPX,MAAM,CAAY;IAE1B,YAEmB,OAAyB,EACzB,QAAyB,EACzB,MAAwB,EACxB,cAA8B;QAH9B,YAAO,GAAP,OAAO,CAAkB;QACzB,aAAQ,GAAR,QAAQ,CAAiB;QACzB,WAAM,GAAN,MAAM,CAAkB;QACxB,mBAAc,GAAd,cAAc,CAAgB;QAE/C,IAAI,CAAC,MAAM,GAAG,IAAI,kBAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAED,YAAY;QACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IAOD,KAAK,CAAC,SAAS,CAAC,GAAY,EAAE,GAAa;QAEzC,MAAM,SAAS,GAAG,IAAI,2BAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAE3D,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,EAAE;YAClD,SAAS;YACT,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,+BAA+B,SAAS,CAAC,SAAS,EAAE,EACpD,KAAK,CACN,CAAC;QAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAKD,KAAK,CAAC,aAAa,CAAC,GAAY,EAAE,GAAa;QAC7C,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAmB,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,wCAAwC,SAAS,EAAE,EACnD,KAAK,CACN,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAE5E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,CAAC,SAAS,YAAY,2BAAkB,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAE3D,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8BAA8B,EAC9B,YAAY,EACZ,YAAY,CACb,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,UAAU,EAAE,GAAG;gBACf,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAA;AA9FY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,oBAAoB,CAAC,CAAA;6CAEF,kCAAe;QACjB,iCAAgB;QACR,gCAAc;GARtC,UAAU,CA8FtB"}
1
+ {"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/transports/sse/sse.service.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,28 @@
1
1
  import { OnModuleInit } from '@nestjs/common';
2
2
  import { Request, Response } from 'express';
3
- import { McpModuleTransportOptions, McpServerOptions } from '../../mcp.types';
3
+ import { McpModuleTransportOptions, McpServerOptions, McpSessionOptions } from '../../mcp.types';
4
4
  import { McpLoggerService } from '../../services/logger.service';
5
5
  import { RegistryService } from '../../services/registry.service';
6
6
  import { SessionManager } from '../../services/session.manager';
7
7
  export declare class StreamableService implements OnModuleInit {
8
8
  private readonly options;
9
9
  private readonly transportOptions;
10
+ private readonly sessionOptions;
10
11
  private readonly registry;
11
12
  private readonly logger;
12
13
  private readonly sessionManager;
13
- private server;
14
- constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
14
+ private readonly sessionTimeoutMs;
15
+ private readonly maxConcurrentSessions;
16
+ private readonly cleanupIntervalMs;
17
+ private readonly enabled;
18
+ private cleanupTimer?;
19
+ constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, sessionOptions: McpSessionOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
15
20
  onModuleInit(): void;
21
+ onModuleDestroy(): void;
22
+ private startCleanupJob;
23
+ private stopCleanupJob;
24
+ private cleanupInactiveSessions;
25
+ private createServer;
16
26
  handlePostRequest(req: Request, res: Response): Promise<void>;
17
27
  handleGetRequest(req: Request, res: Response): Promise<void>;
18
28
  handleDeleteRequest(req: Request, res: Response): Promise<void>;
@@ -18,32 +18,107 @@ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamable
18
18
  const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
19
19
  const common_1 = require("@nestjs/common");
20
20
  const crypto_1 = require("crypto");
21
+ const mcp_constants_1 = require("../../mcp.constants");
21
22
  const logger_service_1 = require("../../services/logger.service");
22
23
  const registry_service_1 = require("../../services/registry.service");
23
24
  const session_manager_1 = require("../../services/session.manager");
24
25
  let StreamableService = class StreamableService {
25
26
  options;
26
27
  transportOptions;
28
+ sessionOptions;
27
29
  registry;
28
30
  logger;
29
31
  sessionManager;
30
- server;
31
- constructor(options, transportOptions, registry, logger, sessionManager) {
32
+ sessionTimeoutMs;
33
+ maxConcurrentSessions;
34
+ cleanupIntervalMs;
35
+ enabled;
36
+ cleanupTimer;
37
+ constructor(options, transportOptions, sessionOptions, registry, logger, sessionManager) {
32
38
  this.options = options;
33
39
  this.transportOptions = transportOptions;
40
+ this.sessionOptions = sessionOptions;
34
41
  this.registry = registry;
35
42
  this.logger = logger;
36
43
  this.sessionManager = sessionManager;
37
- this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
44
+ this.enabled = transportOptions?.streamable?.enabled !== false;
45
+ this.sessionTimeoutMs = sessionOptions.sessionTimeoutMs ?? 1800000;
46
+ this.maxConcurrentSessions = sessionOptions.maxConcurrentSessions ?? 1000;
47
+ this.cleanupIntervalMs = sessionOptions.cleanupIntervalMs ?? 300000;
38
48
  }
39
49
  onModuleInit() {
40
- this.registry.registerAll(this.server);
50
+ if (!this.enabled) {
51
+ this.logger.log('Streamable transport disabled', 'MCP_SERVER');
52
+ return;
53
+ }
41
54
  this.logger.log('MCP STREAMEABLE initialization completed');
55
+ this.startCleanupJob();
56
+ }
57
+ onModuleDestroy() {
58
+ this.stopCleanupJob();
59
+ }
60
+ startCleanupJob() {
61
+ this.cleanupTimer = setInterval(() => {
62
+ this.cleanupInactiveSessions();
63
+ }, this.cleanupIntervalMs);
64
+ }
65
+ stopCleanupJob() {
66
+ if (this.cleanupTimer) {
67
+ clearInterval(this.cleanupTimer);
68
+ }
69
+ }
70
+ cleanupInactiveSessions() {
71
+ const inactiveSessions = this.sessionManager.getInactiveSessions(this.sessionTimeoutMs);
72
+ if (inactiveSessions.length > 0) {
73
+ this.logger.debug(`Cleaning up ${inactiveSessions.length} inactive sessions`, 'STREAMABLE');
74
+ for (const sessionId of inactiveSessions) {
75
+ const session = this.sessionManager.getSession(sessionId);
76
+ if (session) {
77
+ try {
78
+ void session.transport.close();
79
+ }
80
+ catch (error) {
81
+ const errorMessage = error instanceof Error ? error.message : String(error);
82
+ this.logger.error(`Error closing transport for session ${sessionId}`, errorMessage, 'STREAMABLE');
83
+ }
84
+ this.sessionManager.deleteSession(sessionId);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ createServer() {
90
+ const server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
91
+ this.registry.registerAll(server);
92
+ return server;
42
93
  }
43
94
  async handlePostRequest(req, res) {
95
+ if (!this.enabled) {
96
+ res.status(404).json({
97
+ jsonrpc: '2.0',
98
+ error: {
99
+ code: -32000,
100
+ message: 'Streamable transport is disabled',
101
+ },
102
+ id: null,
103
+ });
104
+ return;
105
+ }
44
106
  const sessionId = req.headers['mcp-session-id'];
45
107
  let transport;
46
108
  const { options } = this.transportOptions?.streamable || {};
109
+ if (!sessionId &&
110
+ this.sessionManager.getActiveSessionCount() >= this.maxConcurrentSessions) {
111
+ this.logger.warn(`Maximum concurrent sessions reached: ${this.maxConcurrentSessions}`, 'STREAMABLE');
112
+ res.status(503).json({
113
+ jsonrpc: '2.0',
114
+ error: {
115
+ code: -32000,
116
+ message: 'Service temporarily unavailable: Maximum concurrent sessions reached',
117
+ },
118
+ id: null,
119
+ });
120
+ return;
121
+ }
47
122
  if (sessionId && this.sessionManager.getSession(sessionId)) {
48
123
  const session = this.sessionManager.getSession(sessionId);
49
124
  if (!session) {
@@ -68,10 +143,27 @@ let StreamableService = class StreamableService {
68
143
  });
69
144
  transport.onclose = () => {
70
145
  if (transport.sessionId) {
146
+ this.logger.debug(`Transport closed for session: ${transport.sessionId}`, 'STREAMABLE');
71
147
  this.sessionManager.deleteSession(transport.sessionId);
72
148
  }
73
149
  };
74
- await this.server.connect(transport);
150
+ try {
151
+ const server = this.createServer();
152
+ await server.connect(transport);
153
+ }
154
+ catch (error) {
155
+ this.logger.error('Failed to create or connect server', error, 'STREAMABLE');
156
+ await transport.close();
157
+ res.status(500).json({
158
+ jsonrpc: '2.0',
159
+ error: {
160
+ code: -32603,
161
+ message: 'Internal server error',
162
+ },
163
+ id: null,
164
+ });
165
+ return;
166
+ }
75
167
  }
76
168
  else {
77
169
  res.status(400).json({
@@ -133,9 +225,10 @@ let StreamableService = class StreamableService {
133
225
  exports.StreamableService = StreamableService;
134
226
  exports.StreamableService = StreamableService = __decorate([
135
227
  (0, common_1.Injectable)(),
136
- __param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
137
- __param(1, (0, common_1.Inject)('MCP_TRANSPORT_OPTIONS')),
138
- __metadata("design:paramtypes", [Object, Object, registry_service_1.RegistryService,
228
+ __param(0, (0, common_1.Inject)(mcp_constants_1.MCP_SERVER_OPTIONS)),
229
+ __param(1, (0, common_1.Inject)(mcp_constants_1.MCP_TRANSPORT_OPTIONS)),
230
+ __param(2, (0, common_1.Inject)(mcp_constants_1.MCP_SESSION_OPTIONS)),
231
+ __metadata("design:paramtypes", [Object, Object, Object, registry_service_1.RegistryService,
139
232
  logger_service_1.McpLoggerService,
140
233
  session_manager_1.SessionManager])
141
234
  ], StreamableService);
@@ -1 +1 @@
1
- {"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/transports/streamable/streamable.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/transports/streamable/streamable.service.ts"],"names":[],"mappings":"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"}