All files / rpc-server/src/http1 util.ts

39.58% Statements 19/48
14.28% Branches 2/14
83.33% Functions 5/6
35.55% Lines 16/45

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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 891x         1x 2x 2x 2x 2x       2x 2x 2x         2x   2x   2x         1x             1x 2x 2x                                                                                                    
import {PayloadTooLarge} from '../errors';
import type {ConnectionContext} from '../types';
import type * as http from 'http';
import type {RpcCodecs} from '@jsonjoy.com/rpc-codec';
 
export const getBody = (request: http.IncomingMessage, max: number): Promise<Buffer[]> => {
  return new Promise<Buffer[]>((resolve, reject) => {
    let size = 0;
    const chunks: Buffer[] = [];
    request.on('error', (error) => {
      request.removeAllListeners();
      reject(error);
    });
    request.on('data', (chunk) => {
      size += chunk.length;
      Iif (size > max) {
        request.removeAllListeners();
        reject(new PayloadTooLarge());
        return;
      }
      chunks.push(chunk);
    });
    request.on('end', () => {
      // request.removeAllListeners();
      resolve(chunks);
    });
  });
};
 
const REGEX_CODECS_SPECIFIER = /rpc\.(\w{0,32})\.(\w{0,32})\.(\w{0,32})(?:\-(\w{0,32}))?/;
 
/**
 * @param specifier A string which may contain a codec specifier. For example:
 *  - `rpc.rx.compact.cbor` for Rx-RPC with compact messages and CBOR values.
 *  - `rpc.json2.verbose.json` for JSON-RPC 2.0 with verbose messages encoded as JSON.
 */
export const setCodecs = (ctx: ConnectionContext, specifier: string, codecs: RpcCodecs): void => {
  const match = REGEX_CODECS_SPECIFIER.exec(specifier);
  Eif (!match) return;
  const [, protocol, messageFormat, request, response] = match;
  switch (protocol) {
    case 'rx': {
      switch (messageFormat) {
        case 'compact': {
          ctx.msgCodec = codecs.msg.compact;
          break;
        }
        case 'binary': {
          ctx.msgCodec = codecs.msg.binary;
          break;
        }
      }
      break;
    }
    case 'json2': {
      ctx.msgCodec = codecs.msg.jsonRpc2;
      break;
    }
  }
  switch (request) {
    case 'cbor': {
      ctx.resCodec = ctx.reqCodec = codecs.val.cbor;
      break;
    }
    case 'json': {
      ctx.resCodec = ctx.reqCodec = codecs.val.json;
      break;
    }
    case 'msgpack': {
      ctx.resCodec = ctx.reqCodec = codecs.val.msgpack;
      break;
    }
  }
  switch (response) {
    case 'cbor': {
      ctx.resCodec = codecs.val.cbor;
      break;
    }
    case 'json': {
      ctx.resCodec = codecs.val.json;
      break;
    }
    case 'msgpack': {
      ctx.resCodec = codecs.val.msgpack;
      break;
    }
  }
};