@lspeasy/core 1.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.
- package/LICENSE +21 -0
- package/README.md +550 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/jsonrpc/framing.d.ts +32 -0
- package/dist/jsonrpc/framing.d.ts.map +1 -0
- package/dist/jsonrpc/framing.js +96 -0
- package/dist/jsonrpc/framing.js.map +1 -0
- package/dist/jsonrpc/messages.d.ts +64 -0
- package/dist/jsonrpc/messages.d.ts.map +1 -0
- package/dist/jsonrpc/messages.js +23 -0
- package/dist/jsonrpc/messages.js.map +1 -0
- package/dist/jsonrpc/reader.d.ts +44 -0
- package/dist/jsonrpc/reader.d.ts.map +1 -0
- package/dist/jsonrpc/reader.js +107 -0
- package/dist/jsonrpc/reader.js.map +1 -0
- package/dist/jsonrpc/schemas.d.ts +103 -0
- package/dist/jsonrpc/schemas.d.ts.map +1 -0
- package/dist/jsonrpc/schemas.js +66 -0
- package/dist/jsonrpc/schemas.js.map +1 -0
- package/dist/jsonrpc/writer.d.ts +43 -0
- package/dist/jsonrpc/writer.d.ts.map +1 -0
- package/dist/jsonrpc/writer.js +110 -0
- package/dist/jsonrpc/writer.js.map +1 -0
- package/dist/middleware/compose.d.ts +3 -0
- package/dist/middleware/compose.d.ts.map +1 -0
- package/dist/middleware/compose.js +16 -0
- package/dist/middleware/compose.js.map +1 -0
- package/dist/middleware/index.d.ts +6 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/pipeline.d.ts +5 -0
- package/dist/middleware/pipeline.d.ts.map +1 -0
- package/dist/middleware/pipeline.js +54 -0
- package/dist/middleware/pipeline.js.map +1 -0
- package/dist/middleware/scoped.d.ts +9 -0
- package/dist/middleware/scoped.d.ts.map +1 -0
- package/dist/middleware/scoped.js +20 -0
- package/dist/middleware/scoped.js.map +1 -0
- package/dist/middleware/typed.d.ts +3 -0
- package/dist/middleware/typed.d.ts.map +1 -0
- package/dist/middleware/typed.js +18 -0
- package/dist/middleware/typed.js.map +1 -0
- package/dist/middleware/types.d.ts +45 -0
- package/dist/middleware/types.d.ts.map +1 -0
- package/dist/middleware/types.js +2 -0
- package/dist/middleware/types.js.map +1 -0
- package/dist/protocol/capabilities.d.ts +93 -0
- package/dist/protocol/capabilities.d.ts.map +1 -0
- package/dist/protocol/capabilities.js +143 -0
- package/dist/protocol/capabilities.js.map +1 -0
- package/dist/protocol/capability-methods.d.ts +270 -0
- package/dist/protocol/capability-methods.d.ts.map +1 -0
- package/dist/protocol/capability-methods.js +14 -0
- package/dist/protocol/capability-methods.js.map +1 -0
- package/dist/protocol/enums.d.ts +336 -0
- package/dist/protocol/enums.d.ts.map +1 -0
- package/dist/protocol/enums.js +417 -0
- package/dist/protocol/enums.js.map +1 -0
- package/dist/protocol/infer.d.ts +112 -0
- package/dist/protocol/infer.d.ts.map +1 -0
- package/dist/protocol/infer.js +58 -0
- package/dist/protocol/infer.js.map +1 -0
- package/dist/protocol/namespaces.d.ts +1432 -0
- package/dist/protocol/namespaces.d.ts.map +1 -0
- package/dist/protocol/namespaces.js +570 -0
- package/dist/protocol/namespaces.js.map +1 -0
- package/dist/protocol/partial.d.ts +29 -0
- package/dist/protocol/partial.d.ts.map +1 -0
- package/dist/protocol/partial.js +24 -0
- package/dist/protocol/partial.js.map +1 -0
- package/dist/protocol/progress.d.ts +32 -0
- package/dist/protocol/progress.d.ts.map +1 -0
- package/dist/protocol/progress.js +60 -0
- package/dist/protocol/progress.js.map +1 -0
- package/dist/protocol/schemas.d.ts +534 -0
- package/dist/protocol/schemas.d.ts.map +1 -0
- package/dist/protocol/schemas.js +271 -0
- package/dist/protocol/schemas.js.map +1 -0
- package/dist/protocol/types.d.ts +19 -0
- package/dist/protocol/types.d.ts.map +1 -0
- package/dist/protocol/types.js +8 -0
- package/dist/protocol/types.js.map +1 -0
- package/dist/protocol/watching.d.ts +29 -0
- package/dist/protocol/watching.d.ts.map +1 -0
- package/dist/protocol/watching.js +36 -0
- package/dist/protocol/watching.js.map +1 -0
- package/dist/protocol/workspace.d.ts +24 -0
- package/dist/protocol/workspace.d.ts.map +1 -0
- package/dist/protocol/workspace.js +26 -0
- package/dist/protocol/workspace.js.map +1 -0
- package/dist/transport/events.d.ts +27 -0
- package/dist/transport/events.d.ts.map +1 -0
- package/dist/transport/events.js +34 -0
- package/dist/transport/events.js.map +1 -0
- package/dist/transport/stdio.d.ts +55 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +147 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/transport/transport.d.ts +38 -0
- package/dist/transport/transport.d.ts.map +1 -0
- package/dist/transport/transport.js +5 -0
- package/dist/transport/transport.js.map +1 -0
- package/dist/transport/websocket.d.ts +142 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +324 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/utils/cancellation.d.ts +47 -0
- package/dist/utils/cancellation.d.ts.map +1 -0
- package/dist/utils/cancellation.js +77 -0
- package/dist/utils/cancellation.js.map +1 -0
- package/dist/utils/disposable-event-emitter.d.ts +26 -0
- package/dist/utils/disposable-event-emitter.d.ts.map +1 -0
- package/dist/utils/disposable-event-emitter.js +62 -0
- package/dist/utils/disposable-event-emitter.js.map +1 -0
- package/dist/utils/disposable.d.ts +34 -0
- package/dist/utils/disposable.d.ts.map +1 -0
- package/dist/utils/disposable.js +55 -0
- package/dist/utils/disposable.js.map +1 -0
- package/dist/utils/document.d.ts +20 -0
- package/dist/utils/document.d.ts.map +1 -0
- package/dist/utils/document.js +54 -0
- package/dist/utils/document.js.map +1 -0
- package/dist/utils/errors.d.ts +69 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +104 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/handler-registry.d.ts +35 -0
- package/dist/utils/handler-registry.d.ts.map +1 -0
- package/dist/utils/handler-registry.js +68 -0
- package/dist/utils/handler-registry.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/internal.d.ts +3 -0
- package/dist/utils/internal.d.ts.map +1 -0
- package/dist/utils/internal.js +3 -0
- package/dist/utils/internal.js.map +1 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +61 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pending-request-tracker.d.ts +36 -0
- package/dist/utils/pending-request-tracker.d.ts.map +1 -0
- package/dist/utils/pending-request-tracker.js +93 -0
- package/dist/utils/pending-request-tracker.js.map +1 -0
- package/dist/utils/transport-attachment.d.ts +34 -0
- package/dist/utils/transport-attachment.d.ts.map +1 -0
- package/dist/utils/transport-attachment.js +48 -0
- package/dist/utils/transport-attachment.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageWriter class for serializing JSON-RPC messages with framing
|
|
3
|
+
* Pattern: MCP SDK's message serialization
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { serializeMessage } from './framing.js';
|
|
7
|
+
/**
|
|
8
|
+
* MessageWriter writes JSON-RPC messages to a stream
|
|
9
|
+
*/
|
|
10
|
+
export class MessageWriter extends EventEmitter {
|
|
11
|
+
stream;
|
|
12
|
+
closed;
|
|
13
|
+
writing;
|
|
14
|
+
queue;
|
|
15
|
+
constructor(stream) {
|
|
16
|
+
super();
|
|
17
|
+
this.stream = stream;
|
|
18
|
+
this.closed = false;
|
|
19
|
+
this.writing = false;
|
|
20
|
+
this.queue = [];
|
|
21
|
+
// Set up stream event handlers
|
|
22
|
+
this.stream.on('error', this.onError.bind(this));
|
|
23
|
+
this.stream.on('close', this.onClose.bind(this));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write a message to the stream
|
|
27
|
+
*/
|
|
28
|
+
async write(message) {
|
|
29
|
+
if (this.closed) {
|
|
30
|
+
throw new Error('MessageWriter is closed');
|
|
31
|
+
}
|
|
32
|
+
const buffer = serializeMessage(message);
|
|
33
|
+
this.queue.push(buffer);
|
|
34
|
+
if (!this.writing) {
|
|
35
|
+
await this.flush();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Flush all queued messages
|
|
40
|
+
*/
|
|
41
|
+
async flush() {
|
|
42
|
+
if (this.writing || this.queue.length === 0) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.writing = true;
|
|
46
|
+
while (this.queue.length > 0 && !this.closed) {
|
|
47
|
+
const buffer = this.queue.shift();
|
|
48
|
+
try {
|
|
49
|
+
await this.writeBuffer(buffer);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.emit('error', error instanceof Error ? error : new Error(String(error)));
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
this.writing = false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write a buffer to the stream
|
|
60
|
+
*/
|
|
61
|
+
writeBuffer(buffer) {
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
this.stream.write(buffer, (error) => {
|
|
64
|
+
if (error) {
|
|
65
|
+
reject(error);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
resolve();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Handle stream error
|
|
75
|
+
*/
|
|
76
|
+
onError(error) {
|
|
77
|
+
if (!this.closed) {
|
|
78
|
+
this.emit('error', error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Handle stream close
|
|
83
|
+
*/
|
|
84
|
+
onClose() {
|
|
85
|
+
if (!this.closed) {
|
|
86
|
+
this.close();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Close the writer
|
|
91
|
+
*/
|
|
92
|
+
close() {
|
|
93
|
+
if (this.closed) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.closed = true;
|
|
97
|
+
this.queue = [];
|
|
98
|
+
// Remove stream listeners
|
|
99
|
+
this.stream.removeAllListeners();
|
|
100
|
+
// Emit close event
|
|
101
|
+
this.emit('close');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if writer is closed
|
|
105
|
+
*/
|
|
106
|
+
isClosed() {
|
|
107
|
+
return this.closed;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/jsonrpc/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IAKhB,MAAM;IAJ3B,MAAM,CAAU;IAChB,OAAO,CAAU;IACjB,KAAK,CAAW;IAExB,YAA6B,MAAgB,EAAE;QAC7C,KAAK,EAAE,CAAC;sBADmB,MAAM;QAEjC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAAA,CAClD;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAiB;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IAAA,CACF;IAED;;OAEG;IACK,KAAK,CAAC,KAAK,GAAkB;QACnC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YAEnC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9E,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IAAA,CACtB;IAED;;OAEG;IACK,WAAW,CAAC,MAAc,EAAiB;QACjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YAAA,CACF,CAAC,CAAC;QAAA,CACJ,CAAC,CAAC;IAAA,CACJ;IAED;;OAEG;IACK,OAAO,CAAC,KAAY,EAAQ;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;IAAA,CACF;IAED;;OAEG;IACK,OAAO,GAAS;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IAAA,CACF;IAED;;OAEG;IACH,KAAK,GAAS;QACZ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAEhB,0BAA0B;QAC1B,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAEjC,mBAAmB;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAAA,CACpB;IAED;;OAEG;IACH,QAAQ,GAAY;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC;IAAA,CACpB;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/middleware/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,GAAG,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAiB1E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function composeMiddleware(...middlewares) {
|
|
2
|
+
return async (context, next) => {
|
|
3
|
+
const dispatch = async (index) => {
|
|
4
|
+
if (index >= middlewares.length) {
|
|
5
|
+
return next();
|
|
6
|
+
}
|
|
7
|
+
const middleware = middlewares[index];
|
|
8
|
+
if (!middleware) {
|
|
9
|
+
return next();
|
|
10
|
+
}
|
|
11
|
+
return middleware(context, () => dispatch(index + 1));
|
|
12
|
+
};
|
|
13
|
+
return dispatch(0);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=compose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/middleware/compose.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,GAAG,WAAyB,EAAc;IAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAoC,EAAE,CAAC;QAChE,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAoC,EAAE,CAAC;YAC1E,IAAI,KAAK,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBAChC,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,OAAO,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAAA,CACvD,CAAC;QAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IAAA,CACpB,CAAC;AAAA,CACH"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { Middleware, MiddlewareContext, MiddlewareDirection, MiddlewareMessage, MiddlewareMessageType, MiddlewareNext, MiddlewareResult, MethodFilter, ScopedMiddleware, TypedMiddleware, TypedMiddlewareContext, TypedParams, TypedResult, LSPMethod } from './types.js';
|
|
2
|
+
export { composeMiddleware } from './compose.js';
|
|
3
|
+
export { executeMiddlewarePipeline } from './pipeline.js';
|
|
4
|
+
export { createScopedMiddleware } from './scoped.js';
|
|
5
|
+
export { createTypedMiddleware } from './typed.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Middleware, MiddlewareContext, MiddlewareResult, ScopedMiddleware } from './types.js';
|
|
2
|
+
type MiddlewareRegistration = Middleware | ScopedMiddleware;
|
|
3
|
+
export declare function executeMiddlewarePipeline(registrations: MiddlewareRegistration[] | undefined, context: MiddlewareContext, finalHandler: () => Promise<void | MiddlewareResult>): Promise<void | MiddlewareResult>;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/middleware/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGpG,KAAK,sBAAsB,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAsC5D,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,sBAAsB,EAAE,GAAG,SAAS,EACnD,OAAO,EAAE,iBAAiB,EAC1B,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,GACnD,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CA6BlC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { isScopedMiddleware, matchesFilter } from './scoped.js';
|
|
2
|
+
function getMessageId(message) {
|
|
3
|
+
if ('id' in message) {
|
|
4
|
+
return message.id;
|
|
5
|
+
}
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
function assertMessageIdUnchanged(before, context) {
|
|
9
|
+
const after = getMessageId(context.message);
|
|
10
|
+
if (before !== after) {
|
|
11
|
+
throw new Error('Middleware cannot modify JSON-RPC message id');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function getMiddleware(registration) {
|
|
15
|
+
if (isScopedMiddleware(registration)) {
|
|
16
|
+
return registration.middleware;
|
|
17
|
+
}
|
|
18
|
+
return registration;
|
|
19
|
+
}
|
|
20
|
+
function shouldRun(registration, context) {
|
|
21
|
+
if (!isScopedMiddleware(registration)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return matchesFilter(registration.filter, {
|
|
25
|
+
method: context.method,
|
|
26
|
+
direction: context.direction,
|
|
27
|
+
messageType: context.messageType
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export async function executeMiddlewarePipeline(registrations, context, finalHandler) {
|
|
31
|
+
const entries = registrations ?? [];
|
|
32
|
+
if (entries.length === 0) {
|
|
33
|
+
return finalHandler();
|
|
34
|
+
}
|
|
35
|
+
const dispatch = async (index) => {
|
|
36
|
+
if (index >= entries.length) {
|
|
37
|
+
return finalHandler();
|
|
38
|
+
}
|
|
39
|
+
const registration = entries[index];
|
|
40
|
+
if (!registration || !shouldRun(registration, context)) {
|
|
41
|
+
return dispatch(index + 1);
|
|
42
|
+
}
|
|
43
|
+
const middleware = getMiddleware(registration);
|
|
44
|
+
const messageIdBefore = getMessageId(context.message);
|
|
45
|
+
const result = await middleware(context, () => dispatch(index + 1));
|
|
46
|
+
assertMessageIdUnchanged(messageIdBefore, context);
|
|
47
|
+
if (result?.shortCircuit) {
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
};
|
|
52
|
+
return dispatch(0);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/middleware/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIhE,SAAS,YAAY,CAAC,OAAqC,EAAsC;IAC/F,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CAClB;AAED,SAAS,wBAAwB,CAC/B,MAA0C,EAC1C,OAA0B,EACpB;IACN,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;AAAA,CACF;AAED,SAAS,aAAa,CAAC,YAAoC,EAAc;IACvE,IAAI,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,UAAU,CAAC;IACjC,CAAC;IACD,OAAO,YAAY,CAAC;AAAA,CACrB;AAED,SAAS,SAAS,CAAC,YAAoC,EAAE,OAA0B,EAAW;IAC5F,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;AAAA,CACJ;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,aAAmD,EACnD,OAA0B,EAC1B,YAAoD,EAClB;IAClC,MAAM,OAAO,GAAG,aAAa,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAoC,EAAE,CAAC;QAC1E,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,YAAY,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;YACvD,OAAO,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,wBAAwB,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAEnD,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,MAAM,CAAC;IAAA,CACf,CAAC;IAEF,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AAAA,CACpB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MethodFilter, Middleware, MiddlewareMessageType, ScopedMiddleware } from './types.js';
|
|
2
|
+
export declare function createScopedMiddleware(filter: MethodFilter, middleware: Middleware): ScopedMiddleware;
|
|
3
|
+
export declare function isScopedMiddleware(value: Middleware | ScopedMiddleware): value is ScopedMiddleware;
|
|
4
|
+
export declare function matchesFilter(filter: MethodFilter, context: {
|
|
5
|
+
method: string;
|
|
6
|
+
direction: 'clientToServer' | 'serverToClient';
|
|
7
|
+
messageType: MiddlewareMessageType;
|
|
8
|
+
}): boolean;
|
|
9
|
+
//# sourceMappingURL=scoped.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped.d.ts","sourceRoot":"","sources":["../../src/middleware/scoped.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpG,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,UAAU,GACrB,gBAAgB,CAElB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,UAAU,GAAG,gBAAgB,GACnC,KAAK,IAAI,gBAAgB,CAE3B;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IAC/C,WAAW,EAAE,qBAAqB,CAAC;CACpC,GACA,OAAO,CAeT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function createScopedMiddleware(filter, middleware) {
|
|
2
|
+
return { filter, middleware };
|
|
3
|
+
}
|
|
4
|
+
export function isScopedMiddleware(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && 'middleware' in value && 'filter' in value;
|
|
6
|
+
}
|
|
7
|
+
export function matchesFilter(filter, context) {
|
|
8
|
+
const direction = filter.direction ?? 'both';
|
|
9
|
+
if (direction !== 'both' && direction !== context.direction) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (filter.messageType && !filter.messageType.includes(context.messageType)) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (Array.isArray(filter.methods)) {
|
|
16
|
+
return filter.methods.includes(context.method);
|
|
17
|
+
}
|
|
18
|
+
return filter.methods.test(context.method);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=scoped.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scoped.js","sourceRoot":"","sources":["../../src/middleware/scoped.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CACpC,MAAoB,EACpB,UAAsB,EACJ;IAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,CAC/B;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAoC,EACT;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,CAClG;AAED,MAAM,UAAU,aAAa,CAC3B,MAAoB,EACpB,OAIC,EACQ;IACT,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;IAC7C,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAAA,CAC5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed.d.ts","sourceRoot":"","sources":["../../src/middleware/typed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAIhB,MAAM,YAAY,CAAC;AAGpB,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,SAAS,EACvD,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,GAC7B,gBAAgB,CAkBlB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createScopedMiddleware } from './scoped.js';
|
|
2
|
+
export function createTypedMiddleware(method, middleware) {
|
|
3
|
+
return createScopedMiddleware({ methods: [method] }, async (context, next) => {
|
|
4
|
+
const typedContextBase = {
|
|
5
|
+
...context,
|
|
6
|
+
method,
|
|
7
|
+
params: ('params' in context.message ? context.message.params : undefined)
|
|
8
|
+
};
|
|
9
|
+
const typedContext = 'result' in context.message
|
|
10
|
+
? {
|
|
11
|
+
...typedContextBase,
|
|
12
|
+
result: context.message.result
|
|
13
|
+
}
|
|
14
|
+
: typedContextBase;
|
|
15
|
+
return middleware(typedContext, next);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=typed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed.js","sourceRoot":"","sources":["../../src/middleware/typed.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,qBAAqB,CACnC,MAAS,EACT,UAA8B,EACZ;IAClB,OAAO,sBAAsB,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5E,MAAM,gBAAgB,GAAG;YACvB,GAAG,OAAO;YACV,MAAM;YACN,MAAM,EAAE,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAmB;SAC7F,CAAC;QAEF,MAAM,YAAY,GAChB,QAAQ,IAAI,OAAO,CAAC,OAAO;YACzB,CAAC,CAAC;gBACE,GAAG,gBAAgB;gBACnB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,MAAwB;aACjD;YACH,CAAC,CAAC,gBAAgB,CAAC;QAEvB,OAAO,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAAA,CACvC,CAAC,CAAC;AAAA,CACJ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ErrorResponseMessage, Message, NotificationMessage, RequestMessage, ResponseMessage } from '../jsonrpc/messages.js';
|
|
2
|
+
import type { LSPNotificationMethod, LSPRequestMethod, ParamsForNotification, ParamsForRequest, ResultForRequest } from '../protocol/infer.js';
|
|
3
|
+
export type MiddlewareDirection = 'clientToServer' | 'serverToClient';
|
|
4
|
+
export type MiddlewareMessageType = 'request' | 'response' | 'notification' | 'error';
|
|
5
|
+
type ImmutableId<T> = T extends {
|
|
6
|
+
id: infer I;
|
|
7
|
+
} ? Omit<T, 'id'> & {
|
|
8
|
+
readonly id: I;
|
|
9
|
+
} : T;
|
|
10
|
+
export type MiddlewareMessage = ImmutableId<Message>;
|
|
11
|
+
export interface MiddlewareContext {
|
|
12
|
+
direction: MiddlewareDirection;
|
|
13
|
+
messageType: MiddlewareMessageType;
|
|
14
|
+
method: string;
|
|
15
|
+
message: MiddlewareMessage;
|
|
16
|
+
metadata: Record<string, unknown>;
|
|
17
|
+
transport: string;
|
|
18
|
+
}
|
|
19
|
+
export type LSPMethod = LSPRequestMethod | LSPNotificationMethod;
|
|
20
|
+
export type TypedParams<M extends LSPMethod> = M extends LSPRequestMethod ? ParamsForRequest<M> : M extends LSPNotificationMethod ? ParamsForNotification<M> : never;
|
|
21
|
+
export type TypedResult<M extends LSPMethod> = M extends LSPRequestMethod ? ResultForRequest<M> : void;
|
|
22
|
+
export interface TypedMiddlewareContext<M extends LSPMethod> extends MiddlewareContext {
|
|
23
|
+
method: M;
|
|
24
|
+
params: TypedParams<M>;
|
|
25
|
+
result?: TypedResult<M>;
|
|
26
|
+
}
|
|
27
|
+
export interface MiddlewareResult {
|
|
28
|
+
shortCircuit?: boolean;
|
|
29
|
+
response?: ResponseMessage | RequestMessage | NotificationMessage;
|
|
30
|
+
error?: ErrorResponseMessage;
|
|
31
|
+
}
|
|
32
|
+
export type MiddlewareNext = () => Promise<void | MiddlewareResult>;
|
|
33
|
+
export type Middleware = (context: MiddlewareContext, next: MiddlewareNext) => Promise<void | MiddlewareResult>;
|
|
34
|
+
export type TypedMiddleware<M extends LSPMethod> = (context: TypedMiddlewareContext<M>, next: MiddlewareNext) => Promise<void | MiddlewareResult>;
|
|
35
|
+
export interface MethodFilter {
|
|
36
|
+
methods: string[] | RegExp;
|
|
37
|
+
direction?: MiddlewareDirection | 'both';
|
|
38
|
+
messageType?: MiddlewareMessageType[];
|
|
39
|
+
}
|
|
40
|
+
export interface ScopedMiddleware {
|
|
41
|
+
filter: MethodFilter;
|
|
42
|
+
middleware: Middleware;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,OAAO,EACP,mBAAmB,EACnB,cAAc,EACd,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EACV,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAEtE,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,CAAC;AAEtF,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,EAAE,qBAAqB,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,iBAAiB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,qBAAqB,CAAC;AAEjE,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,gBAAgB,GACrE,gBAAgB,CAAC,CAAC,CAAC,GACnB,CAAC,SAAS,qBAAqB,GAC7B,qBAAqB,CAAC,CAAC,CAAC,GACxB,KAAK,CAAC;AAEZ,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,SAAS,gBAAgB,GACrE,gBAAgB,CAAC,CAAC,CAAC,GACnB,IAAI,CAAC;AAET,MAAM,WAAW,sBAAsB,CAAC,CAAC,SAAS,SAAS,CAAE,SAAQ,iBAAiB;IACpF,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc,GAAG,mBAAmB,CAAC;IAClE,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEpE,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEtC,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,SAAS,IAAI,CACjD,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,EAClC,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAEtC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACzC,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-aware type utilities for LSP protocol
|
|
3
|
+
*
|
|
4
|
+
* @module protocol/capabilities
|
|
5
|
+
*/
|
|
6
|
+
import type { ServerCapabilities, ClientCapabilities } from 'vscode-languageserver-protocol';
|
|
7
|
+
import type { Paths, PickDeep } from 'type-fest';
|
|
8
|
+
import { type LSPNotificationMethod, type LSPRequestMethod, type ClientCapabilityForNotification, type ClientCapabilityForRequest, type ServerCapabilityForNotification, type ServerCapabilityForRequest } from './infer.js';
|
|
9
|
+
export type { ServerCapabilities, ClientCapabilities };
|
|
10
|
+
/**
|
|
11
|
+
* Map of LSP methods to their corresponding server capability keys
|
|
12
|
+
* This is derived from the namespace structure
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Get the capability key for a given method at runtime
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Check if a method is supported by the given server capabilities
|
|
19
|
+
*/
|
|
20
|
+
export declare function serverSupportsRequest<M extends LSPRequestMethod<'clientToServer'>>(method: M, capabilities: ServerCapabilities): capabilities is ServerCapabilities & PickDeep<ServerCapabilities, ServerCapabilityForRequest<M>>;
|
|
21
|
+
export declare function serverSupportsNotification<M extends LSPNotificationMethod<'clientToServer'>, T extends Partial<ServerCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ServerCapabilities, ServerCapabilityForNotification<M>>;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a method is supported by the given client capabilities
|
|
24
|
+
*/
|
|
25
|
+
export declare function clientSupportsRequest<M extends LSPRequestMethod<'serverToClient'>, T extends Partial<ClientCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ClientCapabilities, ClientCapabilityForRequest<M>>;
|
|
26
|
+
export declare function clientSupportsNotification<M extends LSPNotificationMethod<'serverToClient'>, T extends Partial<ClientCapabilities>>(method: M, capabilities: T): capabilities is T & PickDeep<ClientCapabilities, ClientCapabilityForNotification<M>>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a server capability is enabled
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasServerCapability<K extends Paths<ServerCapabilities>, T extends Partial<ServerCapabilities>>(capabilities: T, capability: K): capabilities is T & PickDeep<ServerCapabilities, K>;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a client capability is enabled
|
|
33
|
+
*/
|
|
34
|
+
export declare function hasClientCapability<K extends Paths<ClientCapabilities>, T extends Partial<ClientCapabilities>>(capabilities: T, capability: K): capabilities is T & PickDeep<ClientCapabilities, K>;
|
|
35
|
+
/**
|
|
36
|
+
* Helper to check if hover is supported
|
|
37
|
+
*/
|
|
38
|
+
export declare function supportsHover(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
39
|
+
hoverProvider: NonNullable<ServerCapabilities['hoverProvider']>;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Helper to check if completion is supported
|
|
43
|
+
*/
|
|
44
|
+
export declare function supportsCompletion(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
45
|
+
completionProvider: NonNullable<ServerCapabilities['completionProvider']>;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Helper to check if definition is supported
|
|
49
|
+
*/
|
|
50
|
+
export declare function supportsDefinition(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
51
|
+
definitionProvider: NonNullable<ServerCapabilities['definitionProvider']>;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Helper to check if references are supported
|
|
55
|
+
*/
|
|
56
|
+
export declare function supportsReferences(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
57
|
+
referencesProvider: NonNullable<ServerCapabilities['referencesProvider']>;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Helper to check if document symbols are supported
|
|
61
|
+
*/
|
|
62
|
+
export declare function supportsDocumentSymbol(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
63
|
+
documentSymbolProvider: NonNullable<ServerCapabilities['documentSymbolProvider']>;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Helper to check if workspace folders are supported
|
|
67
|
+
*/
|
|
68
|
+
export declare function supportsWorkspaceFolders(capabilities: ServerCapabilities): capabilities is ServerCapabilities & {
|
|
69
|
+
workspace: {
|
|
70
|
+
workspaceFolders: {
|
|
71
|
+
supported: true;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Helper to check if file watching is supported
|
|
77
|
+
*/
|
|
78
|
+
export declare function supportsFileWatching(capabilities: ClientCapabilities): capabilities is ClientCapabilities & {
|
|
79
|
+
workspace: {
|
|
80
|
+
didChangeWatchedFiles: {
|
|
81
|
+
dynamicRegistration: true;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Helper to check if work done progress is supported
|
|
87
|
+
*/
|
|
88
|
+
export declare function supportsWorkDoneProgress(capabilities: ClientCapabilities): capabilities is ClientCapabilities & {
|
|
89
|
+
window: {
|
|
90
|
+
workDoneProgress: true;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/protocol/capabilities.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC7F,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAKL,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAChC,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAC;AAoCvD;;;GAGG;AAEH;;GAEG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,gBAAgB,CAAC,gBAAgB,CAAC,EAChF,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GACnC,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAO5D;AAED,wBAAgB,0BAA0B,CACxC,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EACjD,CAAC,SAAS,OAAO,CAAC,kBAAkB,CAAC,EAErC,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,CAAC,GACd,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAOtF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,gBAAgB,CAAC,gBAAgB,CAAC,EAC5C,CAAC,SAAS,OAAO,CAAC,kBAAkB,CAAC,EAErC,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,CAAC,GACd,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAOjF;AAED,wBAAgB,0BAA0B,CACxC,CAAC,SAAS,qBAAqB,CAAC,gBAAgB,CAAC,EACjD,CAAC,SAAS,OAAO,CAAC,kBAAkB,CAAC,EAErC,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,CAAC,GACd,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC,CAAC,CAAC,CAOtF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,KAAK,CAAC,kBAAkB,CAAC,EACnC,CAAC,SAAS,OAAO,CAAC,kBAAkB,CAAC,EACrC,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAGrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,SAAS,KAAK,CAAC,kBAAkB,CAAC,EACnC,CAAC,SAAS,OAAO,CAAC,kBAAkB,CAAC,EACrC,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAGrF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,aAAa,EAAE,WAAW,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC;CACjE,CAEA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC;CAC3E,CAEA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC;CAC3E,CAEA;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAC,CAAC;CAC3E,CAEA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,sBAAsB,EAAE,WAAW,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,CAAC,CAAC;CACnF,CAEA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IAAE,SAAS,EAAE;QAAE,gBAAgB,EAAE;YAAE,SAAS,EAAE,IAAI,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,CAE/F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IACtC,SAAS,EAAE;QAAE,qBAAqB,EAAE;YAAE,mBAAmB,EAAE,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;CACrE,CAEA;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,kBAAkB,GAC/B,YAAY,IAAI,kBAAkB,GAAG;IAAE,MAAM,EAAE;QAAE,gBAAgB,EAAE,IAAI,CAAA;KAAE,CAAA;CAAE,CAE7E"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-aware type utilities for LSP protocol
|
|
3
|
+
*
|
|
4
|
+
* @module protocol/capabilities
|
|
5
|
+
*/
|
|
6
|
+
import { getClientCapabilityForNotificationMethod, getClientCapabilityForRequestMethod, getCapabilityForNotificationMethod, getCapabilityForRequestMethod } from './infer.js';
|
|
7
|
+
/**
|
|
8
|
+
* Extract all request definition types from the namespace structure
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Filter request definitions that have a ServerCapability field
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Map a method to its server capability provider key
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Check if a capability value indicates the feature is enabled
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Extract supported request methods based on server capabilities
|
|
21
|
+
*
|
|
22
|
+
* This type automatically traverses the LSP namespace structure to determine
|
|
23
|
+
* which methods are available based on the provided server capabilities.
|
|
24
|
+
*/
|
|
25
|
+
function getProperty(obj, key) {
|
|
26
|
+
const keys = key.split('.');
|
|
27
|
+
let result = obj;
|
|
28
|
+
for (const k of keys) {
|
|
29
|
+
if (result == null) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
result = result[k];
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Map of LSP methods to their corresponding server capability keys
|
|
38
|
+
* This is derived from the namespace structure
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* Get the capability key for a given method at runtime
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* Check if a method is supported by the given server capabilities
|
|
45
|
+
*/
|
|
46
|
+
export function serverSupportsRequest(method, capabilities) {
|
|
47
|
+
const capabilityKey = getCapabilityForRequestMethod(method);
|
|
48
|
+
if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
const value = getProperty(capabilities, capabilityKey);
|
|
52
|
+
return value !== null && value !== undefined && value !== false;
|
|
53
|
+
}
|
|
54
|
+
export function serverSupportsNotification(method, capabilities) {
|
|
55
|
+
const capabilityKey = getCapabilityForNotificationMethod(method);
|
|
56
|
+
if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const value = getProperty(capabilities, capabilityKey);
|
|
60
|
+
return value !== null && value !== undefined && value !== false;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if a method is supported by the given client capabilities
|
|
64
|
+
*/
|
|
65
|
+
export function clientSupportsRequest(method, capabilities) {
|
|
66
|
+
const capabilityKey = getClientCapabilityForRequestMethod(method);
|
|
67
|
+
if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const value = getProperty(capabilities, capabilityKey);
|
|
71
|
+
return value !== null && value !== undefined && value !== false;
|
|
72
|
+
}
|
|
73
|
+
export function clientSupportsNotification(method, capabilities) {
|
|
74
|
+
const capabilityKey = getClientCapabilityForNotificationMethod(method);
|
|
75
|
+
if (capabilityKey === 'alwaysOn' || capabilityKey === null) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
const value = getProperty(capabilities, capabilityKey);
|
|
79
|
+
return value !== null && value !== undefined && value !== false;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if a server capability is enabled
|
|
83
|
+
*/
|
|
84
|
+
export function hasServerCapability(capabilities, capability) {
|
|
85
|
+
const value = getProperty(capabilities, capability);
|
|
86
|
+
return value !== null && value !== undefined && value !== false;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if a client capability is enabled
|
|
90
|
+
*/
|
|
91
|
+
export function hasClientCapability(capabilities, capability) {
|
|
92
|
+
const value = getProperty(capabilities, capability);
|
|
93
|
+
return value !== null && value !== undefined && value !== false;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Helper to check if hover is supported
|
|
97
|
+
*/
|
|
98
|
+
export function supportsHover(capabilities) {
|
|
99
|
+
return serverSupportsRequest('textDocument/hover', capabilities);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Helper to check if completion is supported
|
|
103
|
+
*/
|
|
104
|
+
export function supportsCompletion(capabilities) {
|
|
105
|
+
return serverSupportsRequest('textDocument/completion', capabilities);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Helper to check if definition is supported
|
|
109
|
+
*/
|
|
110
|
+
export function supportsDefinition(capabilities) {
|
|
111
|
+
return serverSupportsRequest('textDocument/definition', capabilities);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Helper to check if references are supported
|
|
115
|
+
*/
|
|
116
|
+
export function supportsReferences(capabilities) {
|
|
117
|
+
return serverSupportsRequest('textDocument/references', capabilities);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Helper to check if document symbols are supported
|
|
121
|
+
*/
|
|
122
|
+
export function supportsDocumentSymbol(capabilities) {
|
|
123
|
+
return serverSupportsRequest('textDocument/documentSymbol', capabilities);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Helper to check if workspace folders are supported
|
|
127
|
+
*/
|
|
128
|
+
export function supportsWorkspaceFolders(capabilities) {
|
|
129
|
+
return capabilities.workspace?.workspaceFolders?.supported === true;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Helper to check if file watching is supported
|
|
133
|
+
*/
|
|
134
|
+
export function supportsFileWatching(capabilities) {
|
|
135
|
+
return capabilities.workspace?.didChangeWatchedFiles?.dynamicRegistration === true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Helper to check if work done progress is supported
|
|
139
|
+
*/
|
|
140
|
+
export function supportsWorkDoneProgress(capabilities) {
|
|
141
|
+
return capabilities.window?.workDoneProgress === true;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/protocol/capabilities.ts"],"names":[],"mappings":"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"}
|