All files / core/blong-gogo/src/codec/adapter/jsonrpc receive.ts

78.46% Statements 51/65
50% Branches 7/14
100% Functions 1/1
78.46% Lines 51/65

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 661x 1x 1x 1x 6x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 9x 9x       9x 9x 5x 5x 5x 5x 9x           9x 9x 9x 9x 9x 56x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x     4x 4x 47x 43x     43x 43x     56x 6x  
import {handler, type IMeta, type ITypedError} from '@feasibleone/blong/types';
import {type Response} from 'got';
 
export default handler(({errors}) => ({
    async receive(
        response: Response<{
            jsonrpc?: string;
            error?: unknown;
            validation?: unknown;
            debug?: unknown;
            checkpoints?: unknown[];
        }>,
        $meta?: IMeta,
    ) {
        const {body} = super.receive ? await super.receive(response) : response;
        if (body?.error !== undefined) {
            const error: ITypedError = body.jsonrpc
                ? Object.assign(new Error(), body.error)
                : typeof body.error === 'string'
                  ? new Error(body.error)
                  : Object.assign(new Error(), body.error);
            if (error.type)
                Object.defineProperty(error, 'name', {
                    value: error.type,
                    configurable: true,
                    enumerable: false,
                });
            error.req = response.request && {
                httpVersion: response.httpVersion,
                url: response.request.requestUrl as URL,
                method: response.request.options.method,
                // ...config.debug && this.sanitize(params, $meta)
            };
            error.res = {
                httpVersion: response.httpVersion,
                statusCode: response.statusCode,
            };
            throw error;
        } else if (response.statusCode < 200 || response.statusCode >= 300) {
            throw errors.jsonrpcHttp({
                statusCode: response.statusCode,
                // statusText: response.statusText,
                statusMessage: response.statusMessage,
                httpVersion: response.httpVersion,
                validation: response.body?.validation,
                debug: response.body?.debug,
                body: response.body,
                params: {
                    code: response.statusCode,
                },
                ...(response.request && {
                    url: response.request.requestUrl,
                    method: response.request.options.method,
                }),
            });
        } else if (typeof body === 'object' && 'result' in body && !('error' in body)) {
            if ($meta && body.checkpoints?.length) {
                ($meta.checkpoints ??= []).push(...body.checkpoints);
            }
            return body.result;
        } else {
            throw errors.jsonrpcEmpty();
        }
    },
}));