341
342
constructor(private protocol: IMessagePassingProtocol, private ctx: TContext, private logger: IIPCLogger | null = null, private timeoutDelay = 1000) {
343
>
this.protocolListener = this.protocol.onMessage(msg => this.onRawMessage(msg));
ipc.ts
344
>
this.sendResponse({ type: ResponseType.Initialize });
345
>
}
346
347
registerChannel(channelName: string, channel: IServerChannel<TContext>): void {
348
>
this.channels.set(channelName, channel);
ipc.ts
349
>
350
>
// https://github.com/microsoft/vscode/issues/72531
351
>
setTimeout(() => this.flushPendingRequests(channelName), 0);
352
>
}
353
354
private sendResponse(response: IRawResponse): void {
355
>
switch (response.type) {
ipc.ts
356
>
case ResponseType.Initialize: {
357
>
const msgLength = this.send([response.type]);
358
>
this.logger?.logOutgoing(msgLength, 0, RequestInitiator.OtherSide, responseTypeToStr(response.type));
359
>
return;
360
>
}
361
>
362
>
case ResponseType.PromiseSuccess:
363
>
case ResponseType.PromiseError:
364
>
case ResponseType.EventFire:
365
>
case ResponseType.PromiseErrorObj: {
366
const msgLength = this.send([response.type, response.id], response.data);
367
this.logger?.logOutgoing(msgLength, response.id, RequestInitiator.OtherSide, responseTypeToStr(response.type), response.data);
368
return;
369
}
371
>
}
372
373
private send(header: unknown, body: any = undefined): number {
374
>
const writer = new BufferWriter();
ipc.ts
375
>
try {
376
>
serialize(writer, header);
377
>
serialize(writer, body);
378
>
return this.sendBuffer(writer.buffer);
379
>
} finally {
380
>
writer.dispose();
381
>
}
382
>
}
383
384
private sendBuffer(message: VSBuffer): number {
386
>
this.protocol.send(message);
387
>
return message.byteLength;
388
>
} catch (err) {
389
// noop
390
return 0;
391
}
393
394
private onRawMessage(message: VSBuffer): void {
395
>
const reader = new BufferReader(message);
ipc.ts
396
>
const header = deserialize(reader);
397
>
const body = deserialize(reader);
398
>
const type = header[0] as RequestType;
399
>
400
>
switch (type) {
401
>
case RequestType.Promise:
402
this.logger?.logIncoming(message.byteLength, header[1], RequestInitiator.OtherSide, `${requestTypeToStr(type)}: ${header[2]}.${header[3]}`, body);
403
return this.onPromise({ type, id: header[1], channelName: header[2], name: header[3], arg: body });
404
>
case RequestType.EventListen:
ipc.ts
405
this.logger?.logIncoming(message.byteLength, header[1], RequestInitiator.OtherSide, `${requestTypeToStr(type)}: ${header[2]}.${header[3]}`, body);
406
return this.onEventListen({ type, id: header[1], channelName: header[2], name: header[3], arg: body });
407
>
case RequestType.PromiseCancel:
ipc.ts
408
this.logger?.logIncoming(message.byteLength, header[1], RequestInitiator.OtherSide, `${requestTypeToStr(type)}`);
409
return this.disposeActiveRequest({ type, id: header[1] });
410
>
case RequestType.EventDispose:
ipc.ts
411
this.logger?.logIncoming(message.byteLength, header[1], RequestInitiator.OtherSide, `${requestTypeToStr(type)}`);
412
return this.disposeActiveRequest({ type, id: header[1] });
414
>
}
415
416
private onPromise(request: IRawPromiseRequest): void {