@lspeasy/server 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 +218 -0
- package/dist/capability-guard.d.ts +56 -0
- package/dist/capability-guard.d.ts.map +1 -0
- package/dist/capability-guard.js +212 -0
- package/dist/capability-guard.js.map +1 -0
- package/dist/capability-proxy.d.ts +19 -0
- package/dist/capability-proxy.d.ts.map +1 -0
- package/dist/capability-proxy.js +121 -0
- package/dist/capability-proxy.js.map +1 -0
- package/dist/dispatcher.d.ts +52 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +174 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +39 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +66 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/progress.d.ts +40 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +50 -0
- package/dist/progress.js.map +1 -0
- package/dist/server.d.ts +176 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +530 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +114 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +24 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +59 -0
- package/dist/validation.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Server - Main server class for handling LSP connections
|
|
3
|
+
*/
|
|
4
|
+
import { ConsoleLogger, executeMiddlewarePipeline, LogLevel, ResponseError, isRequestMessage, isResponseMessage } from '@lspeasy/core';
|
|
5
|
+
import { DisposableEventEmitter } from '@lspeasy/core/utils';
|
|
6
|
+
import { PendingRequestTracker, TransportAttachment } from '@lspeasy/core/utils/internal';
|
|
7
|
+
import { ServerState } from './types.js';
|
|
8
|
+
import { MessageDispatcher } from './dispatcher.js';
|
|
9
|
+
import { LifecycleManager } from './lifecycle.js';
|
|
10
|
+
import { validateParams } from './validation.js';
|
|
11
|
+
import { CapabilityGuard, ClientCapabilityGuard } from './capability-guard.js';
|
|
12
|
+
import { initializeServerHandlerMethods, initializeServerSendMethods } from './capability-proxy.js';
|
|
13
|
+
/**
|
|
14
|
+
* LSP Server class with dynamic capability-aware typing
|
|
15
|
+
*
|
|
16
|
+
* This class dynamically provides handler registration and send methods based on capabilities.
|
|
17
|
+
* Methods are type-safe and conditionally available based on the Capabilities type parameter.
|
|
18
|
+
*
|
|
19
|
+
* @template Capabilities - Server capabilities (defaults to ServerCapabilities)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // Create a server with specific capabilities
|
|
23
|
+
* type MyCaps = { hoverProvider: true; completionProvider: { triggerCharacters: ['.'] } };
|
|
24
|
+
* const server = new LSPServer<MyCaps>();
|
|
25
|
+
* server.setCapabilities({ hoverProvider: true, completionProvider: { triggerCharacters: ['.'] } });
|
|
26
|
+
* // server.textDocument.onHover is available for registration
|
|
27
|
+
* // server.textDocument.onCompletion is available for registration
|
|
28
|
+
*/
|
|
29
|
+
export class BaseLSPServer {
|
|
30
|
+
logger;
|
|
31
|
+
middlewareRegistrations;
|
|
32
|
+
dispatcher;
|
|
33
|
+
lifecycleManager;
|
|
34
|
+
name;
|
|
35
|
+
version;
|
|
36
|
+
options;
|
|
37
|
+
capabilityGuard;
|
|
38
|
+
clientCapabilityGuard;
|
|
39
|
+
events;
|
|
40
|
+
transportAttachment;
|
|
41
|
+
pendingRequests;
|
|
42
|
+
transport;
|
|
43
|
+
state = ServerState.Created;
|
|
44
|
+
cancellationTokens = new Map();
|
|
45
|
+
clientCapabilities;
|
|
46
|
+
clientInfo;
|
|
47
|
+
constructor(options = {}) {
|
|
48
|
+
this.options = options;
|
|
49
|
+
this.name = options.name ?? 'lsp-server';
|
|
50
|
+
this.version = options.version ?? '1.0.0';
|
|
51
|
+
this.events = new DisposableEventEmitter();
|
|
52
|
+
this.transportAttachment = new TransportAttachment();
|
|
53
|
+
this.pendingRequests = new PendingRequestTracker(this.options.requestTimeout);
|
|
54
|
+
// Setup logger
|
|
55
|
+
const logLevel = options.logLevel ?? LogLevel.Info;
|
|
56
|
+
this.logger = options.logger ?? new ConsoleLogger(logLevel);
|
|
57
|
+
this.middlewareRegistrations = options.middleware ?? [];
|
|
58
|
+
// Create dispatcher and lifecycle manager
|
|
59
|
+
this.dispatcher = new MessageDispatcher(this.logger);
|
|
60
|
+
this.lifecycleManager = new LifecycleManager(this.name, this.version, this.logger);
|
|
61
|
+
// Register built-in handlers
|
|
62
|
+
this.registerBuiltinHandlers();
|
|
63
|
+
}
|
|
64
|
+
// Implementation
|
|
65
|
+
onRequest(method, handler) {
|
|
66
|
+
// Check if handler can be registered based on capabilities
|
|
67
|
+
if (this.capabilityGuard && !this.capabilityGuard.canRegisterHandler(method)) {
|
|
68
|
+
// In non-strict mode, warning was already logged
|
|
69
|
+
if (!this.options.strictCapabilities) {
|
|
70
|
+
this.logger.debug(`Registering handler for ${method} despite missing capability (non-strict mode)`);
|
|
71
|
+
}
|
|
72
|
+
// In strict mode, canRegisterHandler already threw an error
|
|
73
|
+
}
|
|
74
|
+
// Wrap handler with validation
|
|
75
|
+
const wrappedHandler = async (params, token, context) => {
|
|
76
|
+
const validatedParams = this.options.validateParams === false
|
|
77
|
+
? params
|
|
78
|
+
: validateParams(method, params, context, this.options.onValidationError);
|
|
79
|
+
return handler(validatedParams, token, context);
|
|
80
|
+
};
|
|
81
|
+
this.dispatcher.registerRequest(method, wrappedHandler);
|
|
82
|
+
return {
|
|
83
|
+
dispose: () => {
|
|
84
|
+
this.dispatcher.unregisterRequest(method);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
// Implementation
|
|
89
|
+
onNotification(method, handler) {
|
|
90
|
+
// Check if handler can be registered based on capabilities
|
|
91
|
+
if (this.capabilityGuard && !this.capabilityGuard.canRegisterHandler(method)) {
|
|
92
|
+
// In non-strict mode, warning was already logged
|
|
93
|
+
if (!this.options.strictCapabilities) {
|
|
94
|
+
this.logger.debug(`Registering handler for ${method} despite missing capability (non-strict mode)`);
|
|
95
|
+
}
|
|
96
|
+
// In strict mode, canRegisterHandler already threw an error
|
|
97
|
+
}
|
|
98
|
+
// Wrap handler with validation
|
|
99
|
+
const wrappedHandler = async (params, context) => {
|
|
100
|
+
const validatedParams = this.options.validateParams === false
|
|
101
|
+
? params
|
|
102
|
+
: validateParams(method, params, context, this.options.onValidationError);
|
|
103
|
+
return handler(validatedParams, context);
|
|
104
|
+
};
|
|
105
|
+
this.dispatcher.registerNotification(method, wrappedHandler);
|
|
106
|
+
return {
|
|
107
|
+
dispose: () => {
|
|
108
|
+
this.dispatcher.unregisterNotification(method);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Set server capabilities
|
|
114
|
+
*/
|
|
115
|
+
setCapabilities(capabilities) {
|
|
116
|
+
this.lifecycleManager.setCapabilities(capabilities);
|
|
117
|
+
// Create capability guard with the new capabilities
|
|
118
|
+
this.capabilityGuard = new CapabilityGuard(capabilities, this.logger, this.options.strictCapabilities ?? false);
|
|
119
|
+
// Initialize capability-aware handler methods based on declared capabilities
|
|
120
|
+
initializeServerHandlerMethods(this);
|
|
121
|
+
initializeServerSendMethods(this);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get server capabilities
|
|
125
|
+
*/
|
|
126
|
+
getServerCapabilities() {
|
|
127
|
+
return this.lifecycleManager.getCapabilities();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get client capabilities (available after initialization)
|
|
131
|
+
*/
|
|
132
|
+
getClientCapabilities() {
|
|
133
|
+
return this.clientCapabilities;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Register a single capability, returning a new typed reference via intersection.
|
|
137
|
+
* The returned reference is the same instance, with a narrowed type that includes
|
|
138
|
+
* the newly registered capability.
|
|
139
|
+
*
|
|
140
|
+
* @template K - The capability key to register
|
|
141
|
+
* @param key - The server capability key (e.g. 'hoverProvider')
|
|
142
|
+
* @param value - The capability value
|
|
143
|
+
* @returns The same server instance with an expanded capability type
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* const server = new LSPServer();
|
|
147
|
+
* const withHover = server.registerCapability('hoverProvider', true);
|
|
148
|
+
* // withHover is typed as LSPServer<Capabilities & Pick<ServerCapabilities, 'hoverProvider'>>
|
|
149
|
+
*/
|
|
150
|
+
registerCapability(key, value) {
|
|
151
|
+
const current = this.getServerCapabilities();
|
|
152
|
+
const updated = { ...current, [key]: value };
|
|
153
|
+
this.setCapabilities(updated);
|
|
154
|
+
return this;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Zero-cost type narrowing for client capabilities.
|
|
158
|
+
* Returns `this` cast to include capability-aware send methods for the given ClientCaps.
|
|
159
|
+
*
|
|
160
|
+
* @template C - The expected client capabilities shape
|
|
161
|
+
* @returns The same server instance, typed with capability-aware methods
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* const server = new LSPServer<MyCaps>();
|
|
165
|
+
* const typed = server.expect<MyClientCaps>();
|
|
166
|
+
* // typed now has send methods gated by MyClientCaps
|
|
167
|
+
*/
|
|
168
|
+
expect() {
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Send a server-to-client request.
|
|
173
|
+
*/
|
|
174
|
+
async sendRequest(method, params) {
|
|
175
|
+
if (!this.transport) {
|
|
176
|
+
throw new Error('Server is not listening');
|
|
177
|
+
}
|
|
178
|
+
if (this.clientCapabilityGuard && !this.clientCapabilityGuard.canSendRequest(method)) {
|
|
179
|
+
this.logger.warn(`Client capability not declared for request ${method}`);
|
|
180
|
+
}
|
|
181
|
+
const { id, promise } = this.pendingRequests.create(this.options.requestTimeout, method);
|
|
182
|
+
const request = {
|
|
183
|
+
jsonrpc: '2.0',
|
|
184
|
+
id,
|
|
185
|
+
method,
|
|
186
|
+
params
|
|
187
|
+
};
|
|
188
|
+
void this.sendWithMiddleware({
|
|
189
|
+
direction: 'serverToClient',
|
|
190
|
+
messageType: 'request',
|
|
191
|
+
method,
|
|
192
|
+
message: request,
|
|
193
|
+
onSend: async () => {
|
|
194
|
+
await this.transport.send(request);
|
|
195
|
+
},
|
|
196
|
+
onShortCircuit: (result) => {
|
|
197
|
+
this.resolveShortCircuitRequest(String(id), result);
|
|
198
|
+
},
|
|
199
|
+
onError: (error) => {
|
|
200
|
+
this.pendingRequests.reject(String(id), error);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return promise;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Send a server-to-client notification.
|
|
207
|
+
*/
|
|
208
|
+
async sendNotification(method, params) {
|
|
209
|
+
if (!this.transport) {
|
|
210
|
+
throw new Error('Server is not listening');
|
|
211
|
+
}
|
|
212
|
+
if (this.clientCapabilityGuard && !this.clientCapabilityGuard.canSendNotification(method)) {
|
|
213
|
+
this.logger.warn(`Client capability not declared for notification ${method}`);
|
|
214
|
+
}
|
|
215
|
+
const notification = {
|
|
216
|
+
jsonrpc: '2.0',
|
|
217
|
+
method,
|
|
218
|
+
params
|
|
219
|
+
};
|
|
220
|
+
await this.sendWithMiddleware({
|
|
221
|
+
direction: 'serverToClient',
|
|
222
|
+
messageType: 'notification',
|
|
223
|
+
method,
|
|
224
|
+
message: notification,
|
|
225
|
+
onSend: async () => {
|
|
226
|
+
await this.transport.send(notification);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Start listening on a transport
|
|
232
|
+
*/
|
|
233
|
+
async listen(transport) {
|
|
234
|
+
if (this.transport) {
|
|
235
|
+
throw new Error('Server is already listening');
|
|
236
|
+
}
|
|
237
|
+
this.transport = transport;
|
|
238
|
+
this.logger.info(`Server listening: ${this.name} v${this.version}`);
|
|
239
|
+
this.transportAttachment.attach(transport, {
|
|
240
|
+
onMessage: (message) => {
|
|
241
|
+
void this.handleMessage(message);
|
|
242
|
+
},
|
|
243
|
+
onError: (error) => {
|
|
244
|
+
this.logger.error('Transport error:', error);
|
|
245
|
+
this.events.emit('error', error);
|
|
246
|
+
},
|
|
247
|
+
onClose: () => {
|
|
248
|
+
this.logger.info('Transport closed');
|
|
249
|
+
void this.close();
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
this.events.emit('listening');
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Graceful shutdown
|
|
256
|
+
*/
|
|
257
|
+
async shutdown(timeout = 5000) {
|
|
258
|
+
if (this.state === ServerState.Shutdown) {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
this.logger.info('Server shutting down...');
|
|
262
|
+
this.state = ServerState.ShuttingDown;
|
|
263
|
+
// Wait for pending requests with timeout
|
|
264
|
+
const startTime = Date.now();
|
|
265
|
+
while (this.cancellationTokens.size > 0 && Date.now() - startTime < timeout) {
|
|
266
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
267
|
+
}
|
|
268
|
+
// Cancel any remaining requests
|
|
269
|
+
for (const [id, controller] of this.cancellationTokens.entries()) {
|
|
270
|
+
this.logger.warn(`Cancelling pending request: ${id}`);
|
|
271
|
+
controller.abort();
|
|
272
|
+
}
|
|
273
|
+
this.events.emit('shutdown');
|
|
274
|
+
await this.close();
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Force close
|
|
278
|
+
*/
|
|
279
|
+
async close() {
|
|
280
|
+
if (this.state === ServerState.Shutdown) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
this.logger.info('Server closing...');
|
|
284
|
+
this.state = ServerState.Shutdown;
|
|
285
|
+
this.transportAttachment.detach();
|
|
286
|
+
this.pendingRequests.clear(new Error('Connection closed'));
|
|
287
|
+
// Close transport
|
|
288
|
+
if (this.transport) {
|
|
289
|
+
await this.transport.close();
|
|
290
|
+
this.transport = undefined;
|
|
291
|
+
}
|
|
292
|
+
this.logger.info('Server closed');
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if server is listening and initialized
|
|
296
|
+
*/
|
|
297
|
+
isListening() {
|
|
298
|
+
return this.state === ServerState.Initialized && this.transport !== undefined;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get current server state
|
|
302
|
+
*/
|
|
303
|
+
getState() {
|
|
304
|
+
return this.state;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get client info (available after initialization)
|
|
308
|
+
*/
|
|
309
|
+
getClientInfo() {
|
|
310
|
+
return this.clientInfo;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Subscribe to listening events
|
|
314
|
+
*/
|
|
315
|
+
onListening(handler) {
|
|
316
|
+
return this.events.on('listening', handler);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Subscribe to shutdown events
|
|
320
|
+
*/
|
|
321
|
+
onShutdown(handler) {
|
|
322
|
+
return this.events.on('shutdown', handler);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Subscribe to error events
|
|
326
|
+
*/
|
|
327
|
+
onError(handler) {
|
|
328
|
+
return this.events.on('error', handler);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Register built-in lifecycle handlers
|
|
332
|
+
*/
|
|
333
|
+
registerBuiltinHandlers() {
|
|
334
|
+
// Initialize request - use onRequest to get validation
|
|
335
|
+
this.onRequest('initialize', async (params, token, context) => {
|
|
336
|
+
if (this.state !== ServerState.Created) {
|
|
337
|
+
throw ResponseError.invalidRequest('Server already initialized');
|
|
338
|
+
}
|
|
339
|
+
this.state = ServerState.Initializing;
|
|
340
|
+
this.clientCapabilities = params.capabilities;
|
|
341
|
+
this.clientCapabilityGuard = new ClientCapabilityGuard(params.capabilities ?? {}, this.logger, this.options.strictCapabilities ?? false);
|
|
342
|
+
if (params.clientInfo) {
|
|
343
|
+
this.clientInfo = params.clientInfo;
|
|
344
|
+
}
|
|
345
|
+
this.dispatcher.setClientCapabilities(params.capabilities);
|
|
346
|
+
const result = await this.lifecycleManager.handleInitialize(params, this.transport, context.id);
|
|
347
|
+
this.state = ServerState.Initialized;
|
|
348
|
+
return result;
|
|
349
|
+
});
|
|
350
|
+
// Initialized notification - use onNotification to get validation
|
|
351
|
+
this.onNotification('initialized', (params) => {
|
|
352
|
+
this.lifecycleManager.handleInitialized(params);
|
|
353
|
+
});
|
|
354
|
+
// Shutdown request
|
|
355
|
+
this.onRequest('shutdown', async (_params, _token, context) => {
|
|
356
|
+
if (this.state !== ServerState.Initialized) {
|
|
357
|
+
throw ResponseError.invalidRequest('Server not initialized');
|
|
358
|
+
}
|
|
359
|
+
await this.lifecycleManager.handleShutdown(this.transport, context.id);
|
|
360
|
+
this.state = ServerState.ShuttingDown;
|
|
361
|
+
return null;
|
|
362
|
+
});
|
|
363
|
+
// Exit notification
|
|
364
|
+
this.onNotification('exit', () => {
|
|
365
|
+
this.lifecycleManager.handleExit();
|
|
366
|
+
void this.close();
|
|
367
|
+
});
|
|
368
|
+
// Cancellation notification
|
|
369
|
+
this.onNotification('$/cancelRequest', (params) => {
|
|
370
|
+
const controller = this.cancellationTokens.get(params.id);
|
|
371
|
+
if (controller) {
|
|
372
|
+
controller.abort();
|
|
373
|
+
this.cancellationTokens.delete(params.id);
|
|
374
|
+
this.logger.debug(`Cancelled request: ${params.id}`);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Handle incoming message
|
|
380
|
+
*/
|
|
381
|
+
async handleMessage(message) {
|
|
382
|
+
try {
|
|
383
|
+
if (isResponseMessage(message)) {
|
|
384
|
+
const method = this.pendingRequests.getMetadata(String(message.id)) ?? 'unknown';
|
|
385
|
+
await this.sendWithMiddleware({
|
|
386
|
+
direction: 'clientToServer',
|
|
387
|
+
messageType: 'error' in message ? 'error' : 'response',
|
|
388
|
+
method,
|
|
389
|
+
message,
|
|
390
|
+
onSend: async () => {
|
|
391
|
+
this.handleResponse(message);
|
|
392
|
+
},
|
|
393
|
+
onShortCircuit: (result) => {
|
|
394
|
+
this.resolveShortCircuitRequest(String(message.id), result);
|
|
395
|
+
},
|
|
396
|
+
onError: (error) => {
|
|
397
|
+
this.pendingRequests.reject(String(message.id), error);
|
|
398
|
+
}
|
|
399
|
+
});
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
// Check if server is initialized for non-lifecycle messages
|
|
403
|
+
if (isRequestMessage(message)) {
|
|
404
|
+
const method = message.method;
|
|
405
|
+
const isLifecycleMethod = ['initialize', 'shutdown'].includes(method);
|
|
406
|
+
if (!isLifecycleMethod && this.state !== ServerState.Initialized) {
|
|
407
|
+
await this.transport.send({
|
|
408
|
+
jsonrpc: '2.0',
|
|
409
|
+
id: message.id,
|
|
410
|
+
error: ResponseError.serverNotInitialized().toJSON()
|
|
411
|
+
});
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
await this.sendWithMiddleware({
|
|
416
|
+
direction: 'clientToServer',
|
|
417
|
+
messageType: this.getMessageType(message),
|
|
418
|
+
method: this.getMessageMethod(message),
|
|
419
|
+
message,
|
|
420
|
+
onSend: async () => {
|
|
421
|
+
await this.dispatcher.dispatch(message, this.transport, this.cancellationTokens);
|
|
422
|
+
},
|
|
423
|
+
onShortCircuit: async (result) => {
|
|
424
|
+
if (!this.transport || !isRequestMessage(message)) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (result.error) {
|
|
428
|
+
await this.transport.send(result.error);
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (result.response && 'id' in result.response) {
|
|
432
|
+
await this.transport.send(result.response);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
catch (error) {
|
|
438
|
+
this.logger.error('Error handling message:', error);
|
|
439
|
+
this.events.emit('error', error);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
getMessageType(message) {
|
|
443
|
+
if (isResponseMessage(message)) {
|
|
444
|
+
return 'error' in message ? 'error' : 'response';
|
|
445
|
+
}
|
|
446
|
+
if (isRequestMessage(message)) {
|
|
447
|
+
return 'request';
|
|
448
|
+
}
|
|
449
|
+
return 'notification';
|
|
450
|
+
}
|
|
451
|
+
getMessageMethod(message) {
|
|
452
|
+
if ('method' in message) {
|
|
453
|
+
return message.method;
|
|
454
|
+
}
|
|
455
|
+
if ('id' in message) {
|
|
456
|
+
return this.pendingRequests.getMetadata(String(message.id)) ?? 'unknown';
|
|
457
|
+
}
|
|
458
|
+
return 'unknown';
|
|
459
|
+
}
|
|
460
|
+
resolveShortCircuitRequest(id, result) {
|
|
461
|
+
if (result.error) {
|
|
462
|
+
this.pendingRequests.reject(id, new Error(`${result.error.error.message} (code: ${result.error.error.code})`));
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
if (result.response && 'error' in result.response && result.response.error) {
|
|
466
|
+
this.pendingRequests.reject(id, new Error(`${result.response.error.message} (code: ${result.response.error.code})`));
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
if (result.response && 'result' in result.response) {
|
|
470
|
+
this.pendingRequests.resolve(id, result.response.result);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
this.pendingRequests.reject(id, new Error('Middleware short-circuit missing response payload'));
|
|
474
|
+
}
|
|
475
|
+
buildMiddlewareContext(direction, messageType, method, message) {
|
|
476
|
+
return {
|
|
477
|
+
direction,
|
|
478
|
+
messageType,
|
|
479
|
+
method,
|
|
480
|
+
message,
|
|
481
|
+
metadata: {},
|
|
482
|
+
transport: this.transport?.constructor.name ?? 'unknown'
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
async sendWithMiddleware(options) {
|
|
486
|
+
const context = this.buildMiddlewareContext(options.direction, options.messageType, options.method, options.message);
|
|
487
|
+
try {
|
|
488
|
+
const result = await executeMiddlewarePipeline(this.middlewareRegistrations, context, async () => {
|
|
489
|
+
await options.onSend();
|
|
490
|
+
return undefined;
|
|
491
|
+
});
|
|
492
|
+
if (result?.shortCircuit && options.onShortCircuit) {
|
|
493
|
+
await options.onShortCircuit(result);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
const normalized = error instanceof Error ? error : new Error(String(error));
|
|
498
|
+
this.events.emit('error', normalized);
|
|
499
|
+
if (options.onError) {
|
|
500
|
+
options.onError(normalized);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
throw normalized;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Handle response messages for server-initiated requests.
|
|
508
|
+
*/
|
|
509
|
+
handleResponse(response) {
|
|
510
|
+
const { id } = response;
|
|
511
|
+
const method = this.pendingRequests.getMetadata(String(id));
|
|
512
|
+
if (!method) {
|
|
513
|
+
this.logger.warn(`Received response for unknown request ${id}`);
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if ('error' in response && response.error) {
|
|
517
|
+
this.logger.error(`Request ${method} failed`, response.error);
|
|
518
|
+
this.pendingRequests.reject(String(id), new Error(`${response.error.message} (code: ${response.error.code})`));
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if ('result' in response) {
|
|
522
|
+
this.pendingRequests.resolve(String(id), response.result);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
this.pendingRequests.reject(String(id), new Error('Invalid response message'));
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
// Generic constructor that preserves type parameters
|
|
529
|
+
export const LSPServer = BaseLSPServer;
|
|
530
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for @lspeasy/server
|
|
3
|
+
*/
|
|
4
|
+
import type { CancellationToken, Logger, ClientCapabilities, LogLevel, ServerCapabilities, Middleware, ScopedMiddleware } from '@lspeasy/core';
|
|
5
|
+
import type { ZodError } from 'zod';
|
|
6
|
+
import type { ResponseErrorInterface } from '@lspeasy/core';
|
|
7
|
+
/**
|
|
8
|
+
* Re-export Server type for convenience
|
|
9
|
+
*/
|
|
10
|
+
export type { Server } from '@lspeasy/core';
|
|
11
|
+
/**
|
|
12
|
+
* Server initialization options
|
|
13
|
+
*/
|
|
14
|
+
export interface ServerOptions<Capabilities extends Partial<ServerCapabilities> = ServerCapabilities> {
|
|
15
|
+
/**
|
|
16
|
+
* Server name (sent in initialize response)
|
|
17
|
+
*/
|
|
18
|
+
name?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Server version (sent in initialize response)
|
|
21
|
+
*/
|
|
22
|
+
version?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Logger instance (defaults to ConsoleLogger)
|
|
25
|
+
*/
|
|
26
|
+
logger?: Logger;
|
|
27
|
+
/**
|
|
28
|
+
* Log level (defaults to 'info')
|
|
29
|
+
*/
|
|
30
|
+
logLevel?: LogLevel;
|
|
31
|
+
/**
|
|
32
|
+
* Default request timeout in milliseconds for server-initiated requests
|
|
33
|
+
*/
|
|
34
|
+
requestTimeout?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Custom validation error handler
|
|
37
|
+
*/
|
|
38
|
+
onValidationError?: (error: ZodError, message: RequestContext | NotificationContext) => ResponseErrorInterface | void;
|
|
39
|
+
/**
|
|
40
|
+
* Enable parameter validation for requests and notifications
|
|
41
|
+
* Defaults to true
|
|
42
|
+
*/
|
|
43
|
+
validateParams?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Capabilities to declare during initialization
|
|
46
|
+
*/
|
|
47
|
+
capabilities?: Capabilities;
|
|
48
|
+
/**
|
|
49
|
+
* Strict capability checking mode
|
|
50
|
+
* When true, throws error if handler registered for unsupported capability
|
|
51
|
+
* When false, logs warning and allows registration (default: false)
|
|
52
|
+
*/
|
|
53
|
+
strictCapabilities?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Optional middleware chain for clientToServer/serverToClient messages.
|
|
56
|
+
*/
|
|
57
|
+
middleware?: Array<Middleware | ScopedMiddleware>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Context provided to request handlers
|
|
61
|
+
*/
|
|
62
|
+
export interface RequestContext {
|
|
63
|
+
/**
|
|
64
|
+
* Request ID for correlation
|
|
65
|
+
*/
|
|
66
|
+
id: number | string;
|
|
67
|
+
/**
|
|
68
|
+
* Method name
|
|
69
|
+
*/
|
|
70
|
+
method: string;
|
|
71
|
+
/**
|
|
72
|
+
* Client capabilities (available after initialization)
|
|
73
|
+
*/
|
|
74
|
+
clientCapabilities?: ClientCapabilities | undefined;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Context provided to notification handlers
|
|
78
|
+
*/
|
|
79
|
+
export interface NotificationContext {
|
|
80
|
+
/**
|
|
81
|
+
* Method name
|
|
82
|
+
*/
|
|
83
|
+
method: string;
|
|
84
|
+
/**
|
|
85
|
+
* Client capabilities (available after initialization)
|
|
86
|
+
*/
|
|
87
|
+
clientCapabilities?: ClientCapabilities | undefined;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Request handler function type
|
|
91
|
+
*/
|
|
92
|
+
export type RequestHandler<Params = unknown, Result = unknown> = (params: Params, token: CancellationToken, context: RequestContext) => Promise<Result> | Result;
|
|
93
|
+
/**
|
|
94
|
+
* Notification handler function type
|
|
95
|
+
*/
|
|
96
|
+
export type NotificationHandler<Params = unknown> = (params: Params, context: NotificationContext) => void | Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Internal handler registry entry
|
|
99
|
+
*/
|
|
100
|
+
export interface HandlerRegistration {
|
|
101
|
+
handler: RequestHandler<any, any> | NotificationHandler<any>;
|
|
102
|
+
isRequest: boolean;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Server state enum
|
|
106
|
+
*/
|
|
107
|
+
export declare enum ServerState {
|
|
108
|
+
Created = "created",
|
|
109
|
+
Initializing = "initializing",
|
|
110
|
+
Initialized = "initialized",
|
|
111
|
+
ShuttingDown = "shutting_down",
|
|
112
|
+
Shutdown = "shutdown"
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=types.d.ts.map
|