UNPKG

json-rpc-dual-engine

Version:

JSON-RPC-2.0 client and server protocol-agnostic engine.

64 lines (63 loc) 3.13 kB
export var JsonRpcResponse; (function (JsonRpcResponse) { const PARSED_SYMBOL = Symbol('JsonRpcResponse.PARSED'); function parse(message) { const subject = typeof message === 'string' ? JSON.parse(message) : message; if (typeof subject === 'object' && subject !== null && PARSED_SYMBOL in subject) { return subject; } if (typeof subject !== 'object' || subject === null) { throw new Error('Failed to parse json-rpc response. Cause: The response is not an object.', { cause: { message } }); } if (!('jsonrpc' in subject) || subject.jsonrpc !== '2.0') { throw new Error('Failed to parse json-rpc response. Cause: The response is not a json-rpc 2.0 response.', { cause: { message } }); } if (!('id' in subject) || typeof subject.id !== 'string' && typeof subject.id !== 'number' && subject.id !== null) { throw new Error('Failed to parse json-rpc response. Cause: The response id is neither a string nor a number.', { cause: { message } }); } if ('result' in subject) { return markSuccess({ jsonrpc: '2.0', result: subject.result, id: subject.id }); } if (!('error' in subject) || typeof subject.error !== 'object' || subject.error === null) { throw new Error('Failed to parse json-rpc response. Cause: The response is neither success nor error. It lacks both the "result" and the "error" fields.', { cause: { message } }); } if (!('code' in subject.error) || typeof subject.error.code !== 'number') { throw new Error('Failed to parse json-rpc response. Cause: The error code is not a number.', { cause: { message } }); } if (!('message' in subject.error) || typeof subject.error.message !== 'string') { throw new Error('Failed to parse json-rpc response. Cause: The error message is not a string.', { cause: { message } }); } return markError({ jsonrpc: '2.0', error: { code: subject.error.code, message: subject.error.message, data: 'data' in subject.error ? subject.error.data : undefined, }, id: subject.id }); } JsonRpcResponse.parse = parse; function markSuccess(response) { Object.defineProperty(response, PARSED_SYMBOL, { value: 'success', enumerable: false }); return response; } function markError(response) { Object.defineProperty(response, PARSED_SYMBOL, { value: 'error', enumerable: false }); return response; } function isSuccess(response) { return PARSED_SYMBOL in response ? response[PARSED_SYMBOL] === 'success' : 'result' in response; } JsonRpcResponse.isSuccess = isSuccess; function isError(response) { return PARSED_SYMBOL in response ? response[PARSED_SYMBOL] === 'error' : 'error' in response; } JsonRpcResponse.isError = isError; })(JsonRpcResponse || (JsonRpcResponse = {}));