UNPKG

ib-client

Version:

Interactive Brokers API client library for Node.js

115 lines (95 loc) 7.33 kB
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _lodash = require("lodash"); var _net = require("net"); var _events = require("events");function _typeof(obj) {"@babel/helpers - typeof";if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {_typeof = function _typeof(obj) {return typeof obj;};} else {_typeof = function _typeof(obj) {return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;};}return _typeof(obj);}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}function _inherits(subClass, superClass) {if (typeof superClass !== "function" && superClass !== null) {throw new TypeError("Super expression must either be null or a function");}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });if (superClass) _setPrototypeOf(subClass, superClass);}function _setPrototypeOf(o, p) {_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {o.__proto__ = p;return o;};return _setPrototypeOf(o, p);}function _createSuper(Derived) {var hasNativeReflectConstruct = _isNativeReflectConstruct();return function _createSuperInternal() {var Super = _getPrototypeOf(Derived),result;if (hasNativeReflectConstruct) {var NewTarget = _getPrototypeOf(this).constructor;result = Reflect.construct(Super, arguments, NewTarget);} else {result = Super.apply(this, arguments);}return _possibleConstructorReturn(this, result);};}function _possibleConstructorReturn(self, call) {if (call && (_typeof(call) === "object" || typeof call === "function")) {return call;}return _assertThisInitialized(self);}function _assertThisInitialized(self) {if (self === void 0) {throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}function _isNativeReflectConstruct() {if (typeof Reflect === "undefined" || !Reflect.construct) return false;if (Reflect.construct.sham) return false;if (typeof Proxy === "function") return true;try {Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));return true;} catch (e) {return false;}}function _getPrototypeOf(o) {_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {return o.__proto__ || Object.getPrototypeOf(o);};return _getPrototypeOf(o);}var _default = /*#__PURE__*/function (_EventEmitter) {_inherits(_default, _EventEmitter);var _super = _createSuper(_default); function _default() {var _this;var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { host: null, port: null };_classCallCheck(this, _default); _this = _super.call(this); _this._options = options; _this._firstReceived = true; _this._socket = _this._wrapSocket(new _net.Socket()); _this._connected = false; _this._dataFragment = '';return _this; }_createClass(_default, [{ key: "onConnected", value: function onConnected() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {}; this.on('connected', cb); return this; } }, { key: "onResponse", value: function onResponse() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (data) {}; this.on('response-data', cb); return this; } }, { key: "onServerData", value: function onServerData() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (serverData) {}; this.on('server', cb); return this; } }, { key: "onError", value: function onError() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (error) {}; this.on('error', cb); return this; } }, { key: "onClose", value: function onClose() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {}; this.on('close', cb); return this; } }, { key: "connect", value: function connect() {var cb = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function () {}; this._socket.connect(this._options, cb); return this; } }, { key: "disconnect", value: function disconnect() { this._socket.end(); } }, { key: "isConnected", value: function isConnected() { return this._connected; } }, { key: "write", value: function write( data, cb) { // flatten if needed var tokens = (0, _lodash.flattenDeep)(data); var buffer = Buffer.from(tokens); if (!this._socket.write(buffer)) { this._socket.once('drain', function () {return cb(buffer);}); } else { process.nextTick(function () {return cb(buffer);}); } } }, { key: "_wrapSocket", value: function _wrapSocket( socket) {var _this2 = this; return socket. on('connect', function () {}). on('ready', function () {return _this2._onConnect();}). on('data', function (data) {return _this2._onData(data);}). on('error', function (error) {return _this2._onError(error);}). on('end', function () {return _this2._onClose();}). on('close', function (hadError) {return _this2._onClose(hadError);}). on('timeout', function () {}). on('drain', function () {return function () {};}); } }, { key: "_onConnect", value: function _onConnect() { this._connected = true; this.emit('connected'); } }, { key: "_shiftHeader", value: function _shiftHeader( buffer) { var mask = 0xffffffff; return ( (mask & buffer.shift()) << 24 | (mask & buffer.shift()) << 16 | (mask & buffer.shift()) << 8 | mask & buffer.shift()); } }, { key: "_processBuffer", value: function _processBuffer( buffer) { var length = this._shiftHeader(buffer); this.emit('response-data', buffer.slice(0, length)); if (buffer.length > length) this._processBuffer(buffer.slice(length)); } }, { key: "_onData", value: function _onData( data) { if (this._firstReceived) { this.emit('server', Array.from(data)); this._firstReceived = false; } else { this._processBuffer(Array.from(data)); } } }, { key: "_onError", value: function _onError( error) { this.emit('error', error); } }, { key: "_onClose", value: function _onClose() {var error = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; this._connected = false; this._firstReceived = true; this.emit('close', error); } }]);return _default;}(_events.EventEmitter);exports["default"] = _default;