From 1cdcaf96f40f4062b47f327547457eca5d98056c Mon Sep 17 00:00:00 2001 From: David Ludwig Date: Wed, 23 Jun 2021 13:14:03 -0500 Subject: [PATCH] Add response error handling to IPC package --- packages/ipc/src/IpcClientService.ts | 14 +++++++++----- packages/ipc/src/IpcError.ts | 16 ++++++++++++++++ packages/ipc/src/schema.ts | 10 +++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/packages/ipc/src/IpcClientService.ts b/packages/ipc/src/IpcClientService.ts index 2bc6932..935812e 100644 --- a/packages/ipc/src/IpcClientService.ts +++ b/packages/ipc/src/IpcClientService.ts @@ -3,7 +3,7 @@ import assert from "assert"; import { Microservice } from "@autoplex/microservice"; import AbstractIpcService from "./AbstractIpcService"; import { IIpcResponse, IIpcRequest, IPC } from "./schema"; -import { IpcConnectionError, IpcTimeoutError } from "./IpcError"; +import { IpcConnectionError, IpcError, IpcResponseError, IpcTimeoutError } from "./IpcError"; export abstract class IpcClientService extends AbstractIpcService { @@ -123,8 +123,8 @@ export abstract class IpcClientService ex /** * Perform a general request and wait for a response */ - protected async request(method: string, data?: any, timeout: number|null = null) { - return new Promise((resolve, reject) => { + protected async request(method: string, data?: T, timeout: number|null = null) { + return new Promise>((resolve, reject) => { // If the client is not connected to a server, reject immediately if (!this.__isConnected || this.__socket === null) { reject(new IpcConnectionError("Not connected")); @@ -143,12 +143,16 @@ export abstract class IpcClientService ex this.__socket.off("destroy", respond); }; // Handle the response - let respond = (response: IIpcResponse) => { + let respond = (response: IIpcResponse) => { cleanUp(); + if (response.error !== undefined) { + reject(new IpcResponseError(response.error, response.data)); + return; + } resolve(response); }; // Abort the request - let abort = (error: Error) => { + let abort = (error: IpcError) => { cleanUp(); reject(error); }; diff --git a/packages/ipc/src/IpcError.ts b/packages/ipc/src/IpcError.ts index ec31523..d955436 100644 --- a/packages/ipc/src/IpcError.ts +++ b/packages/ipc/src/IpcError.ts @@ -27,3 +27,19 @@ export class IpcTimeoutError extends IpcError { Object.setPrototypeOf(this, IpcTimeoutError.prototype); } } + +/** + * IPC response error type + */ +export class IpcResponseError extends IpcError { + /** + * Store the response data + */ + public readonly data: T; + + constructor(message: string, data: T) { + super(message); + this.data = data; + Object.setPrototypeOf(this, IpcResponseError.prototype); + } +} diff --git a/packages/ipc/src/schema.ts b/packages/ipc/src/schema.ts index 3e7c673..f261c6b 100644 --- a/packages/ipc/src/schema.ts +++ b/packages/ipc/src/schema.ts @@ -4,16 +4,16 @@ import type RawIPC = require("node-ipc"); * The IPC request structure */ export interface IIpcRequest { - id: number|null, - data ?: any + id : number|null, + data?: any } /** * The IPC response structure */ -export interface IIpcResponse { - data ?: any, - error?: string | Error +export interface IIpcResponse { + data : T, + error?: string } /**