Browse Source

Add response error handling to IPC package

dev
David Ludwig 4 years ago
parent
commit
1cdcaf96f4
3 changed files with 30 additions and 10 deletions
  1. +9
    -5
      packages/ipc/src/IpcClientService.ts
  2. +16
    -0
      packages/ipc/src/IpcError.ts
  3. +5
    -5
      packages/ipc/src/schema.ts

+ 9
- 5
packages/ipc/src/IpcClientService.ts View File

@ -3,7 +3,7 @@ import assert from "assert";
import { Microservice } from "@autoplex/microservice"; import { Microservice } from "@autoplex/microservice";
import AbstractIpcService from "./AbstractIpcService"; import AbstractIpcService from "./AbstractIpcService";
import { IIpcResponse, IIpcRequest, IPC } from "./schema"; import { IIpcResponse, IIpcRequest, IPC } from "./schema";
import { IpcConnectionError, IpcTimeoutError } from "./IpcError";
import { IpcConnectionError, IpcError, IpcResponseError, IpcTimeoutError } from "./IpcError";
export abstract class IpcClientService<M extends Microservice = Microservice> extends AbstractIpcService<M> export abstract class IpcClientService<M extends Microservice = Microservice> extends AbstractIpcService<M>
{ {
@ -123,8 +123,8 @@ export abstract class IpcClientService<M extends Microservice = Microservice> ex
/** /**
* Perform a general request and wait for a response * Perform a general request and wait for a response
*/ */
protected async request(method: string, data?: any, timeout: number|null = null) {
return new Promise<IIpcResponse>((resolve, reject) => {
protected async request<T = any>(method: string, data?: T, timeout: number|null = null) {
return new Promise<IIpcResponse<T>>((resolve, reject) => {
// If the client is not connected to a server, reject immediately // If the client is not connected to a server, reject immediately
if (!this.__isConnected || this.__socket === null) { if (!this.__isConnected || this.__socket === null) {
reject(new IpcConnectionError("Not connected")); reject(new IpcConnectionError("Not connected"));
@ -143,12 +143,16 @@ export abstract class IpcClientService<M extends Microservice = Microservice> ex
this.__socket.off("destroy", respond); this.__socket.off("destroy", respond);
}; };
// Handle the response // Handle the response
let respond = (response: IIpcResponse) => {
let respond = (response: IIpcResponse<T>) => {
cleanUp(); cleanUp();
if (response.error !== undefined) {
reject(new IpcResponseError<T>(response.error, response.data));
return;
}
resolve(response); resolve(response);
}; };
// Abort the request // Abort the request
let abort = (error: Error) => {
let abort = (error: IpcError) => {
cleanUp(); cleanUp();
reject(error); reject(error);
}; };


+ 16
- 0
packages/ipc/src/IpcError.ts View File

@ -27,3 +27,19 @@ export class IpcTimeoutError extends IpcError {
Object.setPrototypeOf(this, IpcTimeoutError.prototype); Object.setPrototypeOf(this, IpcTimeoutError.prototype);
} }
} }
/**
* IPC response error type
*/
export class IpcResponseError<T> 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);
}
}

+ 5
- 5
packages/ipc/src/schema.ts View File

@ -4,16 +4,16 @@ import type RawIPC = require("node-ipc");
* The IPC request structure * The IPC request structure
*/ */
export interface IIpcRequest { export interface IIpcRequest {
id: number|null,
data ?: any
id : number|null,
data?: any
} }
/** /**
* The IPC response structure * The IPC response structure
*/ */
export interface IIpcResponse {
data ?: any,
error?: string | Error
export interface IIpcResponse<T> {
data : T,
error?: string
} }
/** /**


Loading…
Cancel
Save