@lspeasy/core 1.0.1 → 2.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 (61) hide show
  1. package/README.md +33 -9
  2. package/dist/index.d.ts +10 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +5 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/node.d.ts +17 -0
  7. package/dist/node.d.ts.map +1 -0
  8. package/dist/node.js +16 -0
  9. package/dist/node.js.map +1 -0
  10. package/dist/protocol/capabilities.d.ts +3 -0
  11. package/dist/protocol/capabilities.d.ts.map +1 -1
  12. package/dist/protocol/capabilities.js +3 -0
  13. package/dist/protocol/capabilities.js.map +1 -1
  14. package/dist/protocol/dynamic-registration.d.ts +50 -0
  15. package/dist/protocol/dynamic-registration.d.ts.map +1 -0
  16. package/dist/protocol/dynamic-registration.js +25 -0
  17. package/dist/protocol/dynamic-registration.js.map +1 -0
  18. package/dist/protocol/partial-results.d.ts +15 -0
  19. package/dist/protocol/partial-results.d.ts.map +1 -0
  20. package/dist/protocol/partial-results.js +2 -0
  21. package/dist/protocol/partial-results.js.map +1 -0
  22. package/dist/transport/dedicated-worker.d.ts +27 -0
  23. package/dist/transport/dedicated-worker.d.ts.map +1 -0
  24. package/dist/transport/dedicated-worker.js +81 -0
  25. package/dist/transport/dedicated-worker.js.map +1 -0
  26. package/dist/transport/events.d.ts +9 -2
  27. package/dist/transport/events.d.ts.map +1 -1
  28. package/dist/transport/events.js +2 -2
  29. package/dist/transport/events.js.map +1 -1
  30. package/dist/transport/ipc.d.ts +49 -0
  31. package/dist/transport/ipc.d.ts.map +1 -0
  32. package/dist/transport/ipc.js +92 -0
  33. package/dist/transport/ipc.js.map +1 -0
  34. package/dist/transport/shared-worker.d.ts +28 -0
  35. package/dist/transport/shared-worker.d.ts.map +1 -0
  36. package/dist/transport/shared-worker.js +114 -0
  37. package/dist/transport/shared-worker.js.map +1 -0
  38. package/dist/transport/tcp.d.ts +46 -0
  39. package/dist/transport/tcp.d.ts.map +1 -0
  40. package/dist/transport/tcp.js +185 -0
  41. package/dist/transport/tcp.js.map +1 -0
  42. package/dist/transport/worker-types.d.ts +40 -0
  43. package/dist/transport/worker-types.d.ts.map +1 -0
  44. package/dist/transport/worker-types.js +17 -0
  45. package/dist/transport/worker-types.js.map +1 -0
  46. package/dist/utils/cancellation.d.ts.map +1 -1
  47. package/dist/utils/cancellation.js +5 -9
  48. package/dist/utils/cancellation.js.map +1 -1
  49. package/dist/utils/disposable-event-emitter.d.ts +4 -0
  50. package/dist/utils/disposable-event-emitter.d.ts.map +1 -1
  51. package/dist/utils/disposable-event-emitter.js +27 -0
  52. package/dist/utils/disposable-event-emitter.js.map +1 -1
  53. package/dist/utils/document.d.ts +27 -0
  54. package/dist/utils/document.d.ts.map +1 -1
  55. package/dist/utils/document.js +21 -0
  56. package/dist/utils/document.js.map +1 -1
  57. package/dist/utils/pending-request-tracker.d.ts.map +1 -1
  58. package/dist/utils/pending-request-tracker.js +1 -2
  59. package/dist/utils/pending-request-tracker.js.map +1 -1
  60. package/package.json +16 -10
  61. package/LICENSE +0 -21
@@ -0,0 +1,92 @@
1
+ function isMessage(candidate) {
2
+ return (typeof candidate === 'object' &&
3
+ candidate !== null &&
4
+ candidate['jsonrpc'] === '2.0');
5
+ }
6
+ /** JSON-RPC transport over Node.js process IPC channels. */
7
+ export class IpcTransport {
8
+ endpoint;
9
+ connected = true;
10
+ messageHandlers = new Set();
11
+ errorHandlers = new Set();
12
+ closeHandlers = new Set();
13
+ onEndpointMessage = (message) => {
14
+ if (!this.connected || !isMessage(message)) {
15
+ return;
16
+ }
17
+ for (const handler of this.messageHandlers) {
18
+ handler(message);
19
+ }
20
+ };
21
+ onEndpointError = (error) => {
22
+ for (const handler of this.errorHandlers) {
23
+ handler(error);
24
+ }
25
+ };
26
+ onEndpointClose = () => {
27
+ this.connected = false;
28
+ for (const handler of this.closeHandlers) {
29
+ handler();
30
+ }
31
+ };
32
+ constructor(options) {
33
+ this.endpoint =
34
+ options.process ?? (options.role === 'child' ? process : undefined);
35
+ if (!this.endpoint) {
36
+ throw new Error('IpcTransport requires a process endpoint');
37
+ }
38
+ this.endpoint.on('message', this.onEndpointMessage);
39
+ this.endpoint.on('error', this.onEndpointError);
40
+ if (options.role === 'parent') {
41
+ this.endpoint.on('exit', this.onEndpointClose);
42
+ }
43
+ else {
44
+ this.endpoint.on('disconnect', this.onEndpointClose);
45
+ }
46
+ }
47
+ async send(message) {
48
+ if (!this.connected) {
49
+ throw new Error('Transport is not connected');
50
+ }
51
+ if (typeof this.endpoint.send !== 'function') {
52
+ throw new Error('IPC endpoint cannot send messages');
53
+ }
54
+ const ok = this.endpoint.send(message);
55
+ if (!ok) {
56
+ throw new Error('IPC send failed');
57
+ }
58
+ }
59
+ onMessage(handler) {
60
+ this.messageHandlers.add(handler);
61
+ return { dispose: () => this.messageHandlers.delete(handler) };
62
+ }
63
+ onError(handler) {
64
+ this.errorHandlers.add(handler);
65
+ return { dispose: () => this.errorHandlers.delete(handler) };
66
+ }
67
+ onClose(handler) {
68
+ this.closeHandlers.add(handler);
69
+ return { dispose: () => this.closeHandlers.delete(handler) };
70
+ }
71
+ async close() {
72
+ if (!this.connected) {
73
+ return;
74
+ }
75
+ this.connected = false;
76
+ this.endpoint.off('message', this.onEndpointMessage);
77
+ this.endpoint.off('error', this.onEndpointError);
78
+ this.endpoint.off('exit', this.onEndpointClose);
79
+ this.endpoint.off('disconnect', this.onEndpointClose);
80
+ this.endpoint.disconnect?.();
81
+ for (const handler of this.closeHandlers) {
82
+ handler();
83
+ }
84
+ this.messageHandlers.clear();
85
+ this.errorHandlers.clear();
86
+ this.closeHandlers.clear();
87
+ }
88
+ isConnected() {
89
+ return this.connected;
90
+ }
91
+ }
92
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/transport/ipc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Message } from '../jsonrpc/messages.js';
2
+ import type { Disposable } from '../utils/disposable.js';
3
+ import type { Transport } from './transport.js';
4
+ import type { MessagePortLike, SharedWorkerLike } from './worker-types.js';
5
+ export interface SharedWorkerTransportOptions {
6
+ port?: MessagePortLike;
7
+ worker?: SharedWorkerLike;
8
+ clientId: string;
9
+ }
10
+ /** JSON-RPC transport for Shared Worker environments with per-client envelope routing. */
11
+ export declare class SharedWorkerTransport implements Transport {
12
+ private readonly port;
13
+ private readonly clientId;
14
+ private readonly messageHandlers;
15
+ private readonly errorHandlers;
16
+ private readonly closeHandlers;
17
+ private connected;
18
+ private readonly onPortMessage;
19
+ private readonly onPortError;
20
+ constructor(options: SharedWorkerTransportOptions);
21
+ send(message: Message): Promise<void>;
22
+ onMessage(handler: (message: Message) => void): Disposable;
23
+ onError(handler: (error: Error) => void): Disposable;
24
+ onClose(handler: () => void): Disposable;
25
+ close(): Promise<void>;
26
+ isConnected(): boolean;
27
+ }
28
+ //# sourceMappingURL=shared-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-worker.d.ts","sourceRoot":"","sources":["../../src/transport/shared-worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAGjB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,4BAA4B;IAC3C,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,0FAA0F;AAC1F,qBAAa,qBAAsB,YAAW,SAAS;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IACzE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IACvD,OAAO,CAAC,SAAS,CAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAmC5B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAM1B;IAEF,YAAY,OAAO,EAAE,4BAA4B,EAahD;IAEK,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAW1C;IAED,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,UAAU,CAOzD;IAED,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,UAAU,CAOnD;IAED,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,UAAU,CAOvC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB3B;IAED,WAAW,IAAI,OAAO,CAErB;CACF"}
@@ -0,0 +1,114 @@
1
+ import { messageSchema } from '../jsonrpc/schemas.js';
2
+ import { isMessage, isWorkerTransportEnvelope } from './worker-types.js';
3
+ /** JSON-RPC transport for Shared Worker environments with per-client envelope routing. */
4
+ export class SharedWorkerTransport {
5
+ port;
6
+ clientId;
7
+ messageHandlers = new Set();
8
+ errorHandlers = new Set();
9
+ closeHandlers = new Set();
10
+ connected = true;
11
+ onPortMessage = (event) => {
12
+ if (!this.connected) {
13
+ return;
14
+ }
15
+ const data = event.data;
16
+ if (isMessage(data)) {
17
+ const validated = messageSchema.safeParse(data);
18
+ if (!validated.success) {
19
+ this.onPortError(new Error('Invalid JSON-RPC message received on SharedWorker transport'));
20
+ return;
21
+ }
22
+ for (const handler of this.messageHandlers) {
23
+ handler(validated.data);
24
+ }
25
+ return;
26
+ }
27
+ if (isWorkerTransportEnvelope(data)) {
28
+ if (data.clientId !== this.clientId) {
29
+ return;
30
+ }
31
+ const validated = messageSchema.safeParse(data.message);
32
+ if (!validated.success) {
33
+ this.onPortError(new Error('Invalid JSON-RPC envelope message on SharedWorker transport'));
34
+ return;
35
+ }
36
+ for (const handler of this.messageHandlers) {
37
+ handler(validated.data);
38
+ }
39
+ }
40
+ };
41
+ onPortError = (event) => {
42
+ const error = event instanceof Error ? event : new Error('Shared worker transport error');
43
+ for (const handler of this.errorHandlers) {
44
+ handler(error);
45
+ }
46
+ };
47
+ constructor(options) {
48
+ this.clientId = options.clientId;
49
+ this.port =
50
+ options.port ??
51
+ options.worker?.port ??
52
+ (() => {
53
+ throw new Error('SharedWorkerTransport requires a MessagePort or SharedWorker');
54
+ })();
55
+ this.port.start?.();
56
+ this.port.addEventListener('message', this.onPortMessage);
57
+ this.port.addEventListener('messageerror', this.onPortError);
58
+ this.port.addEventListener('error', this.onPortError);
59
+ }
60
+ async send(message) {
61
+ if (!this.connected) {
62
+ throw new Error('Transport is not connected');
63
+ }
64
+ const payload = {
65
+ clientId: this.clientId,
66
+ message
67
+ };
68
+ this.port.postMessage(payload);
69
+ }
70
+ onMessage(handler) {
71
+ this.messageHandlers.add(handler);
72
+ return {
73
+ dispose: () => {
74
+ this.messageHandlers.delete(handler);
75
+ }
76
+ };
77
+ }
78
+ onError(handler) {
79
+ this.errorHandlers.add(handler);
80
+ return {
81
+ dispose: () => {
82
+ this.errorHandlers.delete(handler);
83
+ }
84
+ };
85
+ }
86
+ onClose(handler) {
87
+ this.closeHandlers.add(handler);
88
+ return {
89
+ dispose: () => {
90
+ this.closeHandlers.delete(handler);
91
+ }
92
+ };
93
+ }
94
+ async close() {
95
+ if (!this.connected) {
96
+ return;
97
+ }
98
+ this.connected = false;
99
+ this.port.removeEventListener('message', this.onPortMessage);
100
+ this.port.removeEventListener('messageerror', this.onPortError);
101
+ this.port.removeEventListener('error', this.onPortError);
102
+ this.port.close?.();
103
+ for (const handler of this.closeHandlers) {
104
+ handler();
105
+ }
106
+ this.messageHandlers.clear();
107
+ this.errorHandlers.clear();
108
+ this.closeHandlers.clear();
109
+ }
110
+ isConnected() {
111
+ return this.connected;
112
+ }
113
+ }
114
+ //# sourceMappingURL=shared-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-worker.js","sourceRoot":"","sources":["../../src/transport/shared-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { Message } from '../jsonrpc/messages.js';
2
+ import type { Disposable } from '../utils/disposable.js';
3
+ import type { Transport } from './transport.js';
4
+ export interface TcpReconnectOptions {
5
+ enabled?: boolean;
6
+ initialDelayMs?: number;
7
+ maxDelayMs?: number;
8
+ multiplier?: number;
9
+ maxAttempts?: number;
10
+ }
11
+ /** Options for TCP transport in client or server mode. */
12
+ export interface TcpTransportOptions {
13
+ mode: 'client' | 'server';
14
+ host?: string;
15
+ port: number;
16
+ reconnect?: TcpReconnectOptions;
17
+ }
18
+ /** JSON-RPC transport over Node.js TCP sockets. */
19
+ export declare class TcpTransport implements Transport {
20
+ private readonly options;
21
+ private socket;
22
+ private listener;
23
+ private reader;
24
+ private writer;
25
+ private connected;
26
+ private reconnectTimer;
27
+ private reconnectAttempts;
28
+ private intentionallyClosed;
29
+ private readonly messageHandlers;
30
+ private readonly errorHandlers;
31
+ private readonly closeHandlers;
32
+ constructor(options: TcpTransportOptions);
33
+ private connectClient;
34
+ private listenServer;
35
+ private attachSocket;
36
+ private scheduleReconnect;
37
+ send(message: Message): Promise<void>;
38
+ onMessage(handler: (message: Message) => void): Disposable;
39
+ onError(handler: (error: Error) => void): Disposable;
40
+ onClose(handler: () => void): Disposable;
41
+ close(): Promise<void>;
42
+ isConnected(): boolean;
43
+ private emitError;
44
+ private emitClose;
45
+ }
46
+ //# sourceMappingURL=tcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.d.ts","sourceRoot":"","sources":["../../src/transport/tcp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAItD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED,mDAAmD;AACnD,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IAEpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyC;IACzE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,YAAY,OAAO,EAAE,mBAAmB,EAWvC;IAED,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,YAAY;IA6BpB,OAAO,CAAC,YAAY;IAoDpB,OAAO,CAAC,iBAAiB;IAuBnB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1C;IAED,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,UAAU,CAGzD;IAED,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,UAAU,CAGnD;IAED,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,UAAU,CAGvC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B3B;IAED,WAAW,IAAI,OAAO,CAErB;IAED,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,185 @@
1
+ import { createServer, connect as connectTcp } from 'node:net';
2
+ import { MessageReader } from '../jsonrpc/reader.js';
3
+ import { MessageWriter } from '../jsonrpc/writer.js';
4
+ import { messageSchema } from '../jsonrpc/schemas.js';
5
+ /** JSON-RPC transport over Node.js TCP sockets. */
6
+ export class TcpTransport {
7
+ options;
8
+ socket;
9
+ listener;
10
+ reader;
11
+ writer;
12
+ connected = false;
13
+ reconnectTimer;
14
+ reconnectAttempts = 0;
15
+ intentionallyClosed = false;
16
+ messageHandlers = new Set();
17
+ errorHandlers = new Set();
18
+ closeHandlers = new Set();
19
+ constructor(options) {
20
+ this.options = {
21
+ ...options,
22
+ host: options.host ?? '127.0.0.1'
23
+ };
24
+ if (this.options.mode === 'client') {
25
+ this.connectClient();
26
+ }
27
+ else {
28
+ this.listenServer();
29
+ }
30
+ }
31
+ connectClient() {
32
+ // Clean up old socket and listeners before reconnecting
33
+ if (this.socket) {
34
+ this.socket.removeAllListeners();
35
+ this.socket.destroy();
36
+ }
37
+ if (this.reader) {
38
+ this.reader.removeAllListeners();
39
+ this.reader.close();
40
+ }
41
+ if (this.writer) {
42
+ this.writer.removeAllListeners();
43
+ this.writer.close();
44
+ }
45
+ const socket = connectTcp({ host: this.options.host, port: this.options.port });
46
+ this.attachSocket(socket);
47
+ }
48
+ listenServer() {
49
+ this.listener = createServer((socket) => {
50
+ // Clean up old socket if it exists but is no longer connected
51
+ if (this.socket) {
52
+ if (this.connected) {
53
+ this.emitError(new Error('TCP transport already has an active connection'));
54
+ socket.destroy();
55
+ return;
56
+ }
57
+ // Clean up stale socket reference
58
+ this.socket.removeAllListeners();
59
+ this.socket.destroy();
60
+ if (this.reader) {
61
+ this.reader.removeAllListeners();
62
+ this.reader.close();
63
+ }
64
+ if (this.writer) {
65
+ this.writer.removeAllListeners();
66
+ this.writer.close();
67
+ }
68
+ }
69
+ this.attachSocket(socket);
70
+ });
71
+ this.listener.on('error', (error) => this.emitError(error));
72
+ this.listener.listen(this.options.port, this.options.host);
73
+ }
74
+ attachSocket(socket) {
75
+ this.socket = socket;
76
+ this.reader = new MessageReader(socket);
77
+ this.writer = new MessageWriter(socket);
78
+ if (!socket.connecting) {
79
+ this.connected = true;
80
+ this.reconnectAttempts = 0;
81
+ }
82
+ socket.on('connect', () => {
83
+ this.connected = true;
84
+ this.reconnectAttempts = 0;
85
+ });
86
+ socket.on('close', () => {
87
+ const wasConnected = this.connected;
88
+ this.connected = false;
89
+ this.reader?.close();
90
+ this.writer?.close();
91
+ if (this.options.mode === 'client' &&
92
+ wasConnected &&
93
+ !this.intentionallyClosed &&
94
+ this.options.reconnect?.enabled) {
95
+ this.scheduleReconnect();
96
+ }
97
+ this.emitClose();
98
+ });
99
+ socket.on('error', (error) => this.emitError(error));
100
+ this.reader.on('message', (message) => {
101
+ const validated = messageSchema.safeParse(message);
102
+ if (!validated.success) {
103
+ this.emitError(new Error('Invalid JSON-RPC message received on TCP transport'));
104
+ return;
105
+ }
106
+ for (const handler of this.messageHandlers) {
107
+ handler(validated.data);
108
+ }
109
+ });
110
+ this.reader.on('error', (error) => this.emitError(error));
111
+ this.writer.on('error', (error) => this.emitError(error));
112
+ }
113
+ scheduleReconnect() {
114
+ const reconnect = this.options.reconnect;
115
+ if (!reconnect?.enabled) {
116
+ return;
117
+ }
118
+ const maxAttempts = reconnect.maxAttempts ?? 5;
119
+ if (this.reconnectAttempts >= maxAttempts) {
120
+ return;
121
+ }
122
+ const initial = reconnect.initialDelayMs ?? 250;
123
+ const max = reconnect.maxDelayMs ?? 5000;
124
+ const multiplier = reconnect.multiplier ?? 2;
125
+ const delay = Math.min(initial * multiplier ** this.reconnectAttempts, max);
126
+ this.reconnectAttempts += 1;
127
+ this.reconnectTimer = setTimeout(() => {
128
+ this.connectClient();
129
+ }, delay);
130
+ }
131
+ async send(message) {
132
+ if (!this.connected || !this.writer) {
133
+ throw new Error('Transport is not connected');
134
+ }
135
+ await this.writer.write(message);
136
+ }
137
+ onMessage(handler) {
138
+ this.messageHandlers.add(handler);
139
+ return { dispose: () => this.messageHandlers.delete(handler) };
140
+ }
141
+ onError(handler) {
142
+ this.errorHandlers.add(handler);
143
+ return { dispose: () => this.errorHandlers.delete(handler) };
144
+ }
145
+ onClose(handler) {
146
+ this.closeHandlers.add(handler);
147
+ return { dispose: () => this.closeHandlers.delete(handler) };
148
+ }
149
+ async close() {
150
+ if (this.intentionallyClosed) {
151
+ return;
152
+ }
153
+ this.intentionallyClosed = true;
154
+ this.connected = false;
155
+ if (this.reconnectTimer) {
156
+ clearTimeout(this.reconnectTimer);
157
+ this.reconnectTimer = undefined;
158
+ }
159
+ this.socket?.destroy();
160
+ this.reader?.close();
161
+ this.writer?.close();
162
+ if (this.listener) {
163
+ if (this.listener.listening) {
164
+ await new Promise((resolve) => {
165
+ this.listener.close(() => resolve());
166
+ });
167
+ }
168
+ }
169
+ this.emitClose();
170
+ }
171
+ isConnected() {
172
+ return this.connected;
173
+ }
174
+ emitError(error) {
175
+ for (const handler of this.errorHandlers) {
176
+ handler(error);
177
+ }
178
+ }
179
+ emitClose() {
180
+ for (const handler of this.closeHandlers) {
181
+ handler();
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=tcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../src/transport/tcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { Message } from '../jsonrpc/messages.js';
2
+ /** Lightweight event shape shared by worker and message port adapters. */
3
+ export interface WorkerMessageEventLike {
4
+ data: unknown;
5
+ }
6
+ /** Minimal worker contract required by dedicated worker transport. */
7
+ export interface WorkerLike {
8
+ postMessage(message: Message): void;
9
+ addEventListener(event: 'message', handler: (event: WorkerMessageEventLike) => void): void;
10
+ addEventListener(event: 'error', handler: (event: unknown) => void): void;
11
+ removeEventListener(event: 'message', handler: (event: WorkerMessageEventLike) => void): void;
12
+ removeEventListener(event: 'error', handler: (event: unknown) => void): void;
13
+ terminate?(): void;
14
+ }
15
+ /** Minimal message port contract required by shared worker transport. */
16
+ export interface MessagePortLike {
17
+ postMessage(message: unknown): void;
18
+ addEventListener(event: 'message', handler: (event: WorkerMessageEventLike) => void): void;
19
+ addEventListener(event: 'messageerror', handler: (event: unknown) => void): void;
20
+ addEventListener(event: 'error', handler: (event: unknown) => void): void;
21
+ removeEventListener(event: 'message', handler: (event: WorkerMessageEventLike) => void): void;
22
+ removeEventListener(event: 'messageerror', handler: (event: unknown) => void): void;
23
+ removeEventListener(event: 'error', handler: (event: unknown) => void): void;
24
+ start?(): void;
25
+ close?(): void;
26
+ }
27
+ /** Shared worker wrapper exposing a message port. */
28
+ export interface SharedWorkerLike {
29
+ port: MessagePortLike;
30
+ }
31
+ /** Envelope used by shared worker transport to preserve client isolation. */
32
+ export interface WorkerTransportEnvelope {
33
+ clientId: string;
34
+ message: Message;
35
+ }
36
+ /** Runtime guard for JSON-RPC message envelopes. */
37
+ export declare function isMessage(value: unknown): value is Message;
38
+ /** Runtime guard for shared worker transport envelope payloads. */
39
+ export declare function isWorkerTransportEnvelope(value: unknown): value is WorkerTransportEnvelope;
40
+ //# sourceMappingURL=worker-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-types.d.ts","sourceRoot":"","sources":["../../src/transport/worker-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD,0EAA0E;AAC1E,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9F,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7E,SAAS,CAAC,IAAI,IAAI,CAAC;CACpB;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACjF,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9F,mBAAmB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACpF,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7E,KAAK,CAAC,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAO1D;AAED,mEAAmE;AACnE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,uBAAuB,CAO1F"}
@@ -0,0 +1,17 @@
1
+ /** Runtime guard for JSON-RPC message envelopes. */
2
+ export function isMessage(value) {
3
+ if (typeof value !== 'object' || value === null) {
4
+ return false;
5
+ }
6
+ const candidate = value;
7
+ return candidate['jsonrpc'] === '2.0';
8
+ }
9
+ /** Runtime guard for shared worker transport envelope payloads. */
10
+ export function isWorkerTransportEnvelope(value) {
11
+ if (typeof value !== 'object' || value === null) {
12
+ return false;
13
+ }
14
+ const candidate = value;
15
+ return typeof candidate['clientId'] === 'string' && isMessage(candidate['message']);
16
+ }
17
+ //# sourceMappingURL=worker-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-types.js","sourceRoot":"","sources":["../../src/transport/worker-types.ts"],"names":[],"mappings":"AAyCA,oDAAoD;AACpD,MAAM,UAAU,SAAS,CAAC,KAAc,EAAoB;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,KAAK,CAAC;AAAA,CACvC;AAED,mEAAmE;AACnE,MAAM,UAAU,yBAAyB,CAAC,KAAc,EAAoC;IAC1F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AAAA,CACrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../src/utils/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAE1C;;;OAGG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;CAC3D;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAE3C,cA6BC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED;;OAEG;IACH,MAAM,IAAI,IAAI,CAOb;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAEd;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;CAQ7B,CAAC"}
1
+ {"version":3,"file":"cancellation.d.ts","sourceRoot":"","sources":["../../src/utils/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAE1C;;;OAGG;IACH,uBAAuB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;CAC3D;AAMD;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,SAAS,CAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAE3C,cAyBC;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED;;OAEG;IACH,MAAM,IAAI,IAAI,CAOb;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAEd;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;CAQ7B,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Cancellation token implementation
3
3
  * Pattern: MCP SDK's CancellationToken and CancellationTokenSource
4
4
  */
5
- import { EventEmitter } from 'node:events';
5
+ import { DisposableEventEmitter } from './disposable-event-emitter.js';
6
6
  /**
7
7
  * Source that controls a CancellationToken
8
8
  */
@@ -11,7 +11,7 @@ export class CancellationTokenSource {
11
11
  cancelled;
12
12
  _token;
13
13
  constructor() {
14
- this.emitter = new EventEmitter();
14
+ this.emitter = new DisposableEventEmitter();
15
15
  this.cancelled = false;
16
16
  // Create token with proper arrow function binding
17
17
  this._token = {
@@ -23,12 +23,8 @@ export class CancellationTokenSource {
23
23
  return { dispose: () => { } };
24
24
  }
25
25
  else {
26
- this.emitter.once('cancelled', callback);
27
- return {
28
- dispose: () => {
29
- this.emitter.off('cancelled', callback);
30
- }
31
- };
26
+ // Use the disposable returned by DisposableEventEmitter (once-only)
27
+ return this.emitter.once('cancelled', callback);
32
28
  }
33
29
  }
34
30
  };
@@ -59,7 +55,7 @@ export class CancellationTokenSource {
59
55
  * Dispose the source
60
56
  */
61
57
  dispose() {
62
- this.emitter.removeAllListeners();
58
+ this.emitter.dispose();
63
59
  }
64
60
  }
65
61
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../src/utils/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,CAAe;IACtB,SAAS,CAAU;IACV,MAAM,CAAoB;IAE3C,cAAc;QACZ,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,kDAAkD;QAClD,IAAI,CAAC,MAAM,GAAG;YACZ,uBAAuB,EAAE,KAAK;YAC9B,uBAAuB,EAAE,CAAC,QAAoB,EAAc,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,sCAAsC;oBACtC,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;oBACzC,OAAO;wBACL,OAAO,EAAE,GAAG,EAAE,CAAC;4BACb,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;wBAAA,CACzC;qBACF,CAAC;gBACJ,CAAC;YAAA,CACF;SACF,CAAC;QAEF,2EAA2E;QAC3E,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,EAAE;YAC5D,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IAAA,CACJ;IAED;;OAEG;IACH,IAAI,KAAK,GAAsB;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC;IAAA,CACpB;IAED;;OAEG;IACH,MAAM,GAAS;QACb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAAA,CAChC;IAED;;OAEG;IACH,OAAO,GAAS;QACd,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAAA,CACnC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE;QACJ,uBAAuB,EAAE,KAAK;QAC9B,uBAAuB,EAAE,GAAe,EAAE,CAAC;YACzC,uBAAuB;YACvB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC;QAAA,CAC9B;KACmB;CACvB,CAAC"}
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../src/utils/cancellation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAuBvE;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,CAA+C;IACtD,SAAS,CAAU;IACV,MAAM,CAAoB;IAE3C,cAAc;QACZ,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,kDAAkD;QAClD,IAAI,CAAC,MAAM,GAAG;YACZ,uBAAuB,EAAE,KAAK;YAC9B,uBAAuB,EAAE,CAAC,QAAoB,EAAc,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACnB,sCAAsC;oBACtC,QAAQ,EAAE,CAAC;oBACX,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAClD,CAAC;YAAA,CACF;SACF,CAAC;QAEF,2EAA2E;QAC3E,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,yBAAyB,EAAE;YAC5D,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IAAA,CACJ;IAED;;OAEG;IACH,IAAI,KAAK,GAAsB;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC;IAAA,CACpB;IAED;;OAEG;IACH,MAAM,GAAS;QACb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAAA,CAChC;IAED;;OAEG;IACH,OAAO,GAAS;QACd,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CACxB;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE;QACJ,uBAAuB,EAAE,KAAK;QAC9B,uBAAuB,EAAE,GAAe,EAAE,CAAC;YACzC,uBAAuB;YACvB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC;QAAA,CAC9B;KACmB;CACvB,CAAC"}
@@ -13,6 +13,10 @@ export declare class DisposableEventEmitter<TEvents extends Record<string, unkno
13
13
  * Register a listener and receive a disposable to unregister it.
14
14
  */
15
15
  on<K extends keyof TEvents>(event: K, listener: Listener<TEvents, K>): Disposable;
16
+ /**
17
+ * Register a one-time listener that automatically unregisters after first emission.
18
+ */
19
+ once<K extends keyof TEvents>(event: K, listener: Listener<TEvents, K>): Disposable;
16
20
  /**
17
21
  * Emit an event to all registered listeners in registration order.
18
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"disposable-event-emitter.d.ts","sourceRoot":"","sources":["../../src/utils/disposable-event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,KAAK,QAAQ,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,OAAO,IAAI,CAClF,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAChB,IAAI,CAAC;AAEV;;GAEG;AACH,qBAAa,sBAAsB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,CAAC,SAAS,CAA+D;IAChF,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,UAAU,CAyBhF;IAED;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAajE;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAMd;CACF"}
1
+ {"version":3,"file":"disposable-event-emitter.d.ts","sourceRoot":"","sources":["../../src/utils/disposable-event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,KAAK,QAAQ,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,OAAO,IAAI,CAClF,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAChB,IAAI,CAAC;AAEV;;GAEG;AACH,qBAAa,sBAAsB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,CAAC,SAAS,CAA+D;IAChF,OAAO,CAAC,QAAQ,CAAS;IAEzB;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,UAAU,CAyBhF;IAED;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,UAAU,CA0BlF;IAED;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAajE;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAMd;CACF"}