json-rpc-dual-engine
Version:
JSON-RPC-2.0 client and server protocol-agnostic engine.
64 lines (63 loc) • 3.13 kB
JavaScript
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 = {}));