All files API.js

61.29% Statements 19/31
20% Branches 1/5
50% Functions 4/8
62.07% Lines 18/29
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 781x 1x 1x 1x 1x   1x   4x                                           26x 26x   26x 26x 26x       1x             1x             1x             1x                 29x               1x
const debug = require('debug')('socketcluster-api:API');
const Codec = require('sc-codec-protobuf');
const Router = require('./Router');
const protobuf = require('./protobuf');
const { serialize, deserialize } = require('./protobufCodec');
 
const { defineProperty } = Object;
 
const request = (scSocket, method, pbRoot) => (resource, [ dataType, plain ]) => new Promise((resolve, reject) => {
  debug('request: %s %s', method, resource);
  const buffer = serialize(pbRoot.lookupType(dataType), plain);
  scSocket.emit('#api', { resource, method, dataType, buffer }, (err, data) => {
    debug('response: %o', data);
    if (err) {
      // This is *not* a socketclusterapi error. This is a lower level stack error.
      return reject(err);
    }
 
    const clientData = deserialize(pbRoot.lookupType(data.dataType), data.buffer);
    if (data.isError) {
      reject(clientData);
    } else {
      resolve(clientData);
    }
  });
});
 
class API {
 
  constructor(protobufs = []) {
    const { encode, decode, messageTypes, pbRoot } = Codec(...protobufs, protobuf);
    messageTypes.addEvent('#api', '.socketclusterapi.ApiCall', '.socketclusterapi.ApiResponse');
 
    this._pbRoot = pbRoot;
    this._encode = encode;
    this._decode = decode;
  }
 
  defineEndpoints(scSocket) {
    defineProperty(scSocket, 'get', {
      configurable: false,
      enumerable: false,
      writable: false,
      value: request(scSocket, 'get', this._pbRoot)
    });
 
    defineProperty(scSocket, 'post', {
      configurable: false,
      enumerable: false,
      writable: false,
      value: request(scSocket, 'post', this._pbRoot)
    });
 
    defineProperty(scSocket, 'put', {
      configurable: false,
      enumerable: false,
      writable: false,
      value: request(scSocket, 'put', this._pbRoot)
    });
 
    defineProperty(scSocket, 'delete', {
      configurable: false,
      enumerable: false,
      writable: false,
      value: request(scSocket, 'delete', this._pbRoot)
    });
  }
 
  router() {
    return new Router(this._pbRoot);
  }
 
  get codec() {
    return ({ encode: this._encode, decode: this._decode });
  }
}
 
module.exports = API;