@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.
@@ -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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"}
@@ -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