diff --git a/spikes/docker-compose-client/.babelrc b/docker-compose-client/.babelrc similarity index 69% rename from spikes/docker-compose-client/.babelrc rename to docker-compose-client/.babelrc index f234ed3f..a5ef51bb 100644 --- a/spikes/docker-compose-client/.babelrc +++ b/docker-compose-client/.babelrc @@ -11,7 +11,13 @@ ], "plugins": [ "babel-plugin-transform-flow-strip-types", - "external-helpers", - "istanbul" - ] + "external-helpers" + ], + "env": { + "test": { + "plugins": [ + "istanbul" + ] + } + } } diff --git a/spikes/docker-compose-client/.eslintrc b/docker-compose-client/.eslintrc similarity index 100% rename from spikes/docker-compose-client/.eslintrc rename to docker-compose-client/.eslintrc diff --git a/spikes/docker-compose-client/.flowconfig b/docker-compose-client/.flowconfig similarity index 100% rename from spikes/docker-compose-client/.flowconfig rename to docker-compose-client/.flowconfig diff --git a/docker-compose-client/dist/index.es.js b/docker-compose-client/dist/index.es.js new file mode 100644 index 00000000..2c821a28 --- /dev/null +++ b/docker-compose-client/dist/index.es.js @@ -0,0 +1,158 @@ +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = 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); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + + + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + +var newArrowCheck = function (innerThis, boundThis) { + if (innerThis !== boundThis) { + throw new TypeError("Cannot instantiate an arrow function"); + } +}; + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var _require = require('zerorpc'); +var Client = _require.Client; + +var _require2 = require('events'); +var EventEmitter = _require2.EventEmitter; + +var awaitify = require('apr-awaitify'); + +var DockerComposeClient = function (_EventEmitter) { + inherits(DockerComposeClient, _EventEmitter); + + function DockerComposeClient() { + var _this2 = this; + + var endpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'tcp://0.0.0.0:4242'; + classCallCheck(this, DockerComposeClient); + + var _this = possibleConstructorReturn(this, (DockerComposeClient.__proto__ || Object.getPrototypeOf(DockerComposeClient)).call(this)); + + _this.client = new Client({ + heartbeatInterval: 60 * 4 * 1000, // 4m + timeout: 60 * 30 }); + + _this.client.connect(endpoint); + _this.client.on('error', function (err) { + newArrowCheck(this, _this2); + return _this.emit('error', err); + }.bind(this)); + + _this._invoke = awaitify(_this._invoke.bind(_this)); + return _this; + } + + // Why isn't client.connect async with error?? + + + createClass(DockerComposeClient, [{ + key: '_invoke', + value: function _invoke(name) { + var _client; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return (_client = this.client).invoke.apply(_client, [name].concat(args)); + } + }, { + key: 'close', + value: function close() { + return this.client.close(); + } + }, { + key: 'provision', + value: function provision(_ref) { + var projectName = _ref.projectName, + manifest = _ref.manifest; + + // eslint-disable-next-line camelcase + return this._invoke('up', { project_name: projectName }, manifest); + } + }, { + key: 'scale', + value: function scale(_ref2) { + var _this3 = this; + + var projectName = _ref2.projectName, + services = _ref2.services, + manifest = _ref2.manifest; + + return this._invoke('scale', { + // eslint-disable-next-line camelcase + project_name: projectName, + services: Object.keys(services).map(function (name) { + newArrowCheck(this, _this3); + return { + name: name, + num: services[name] + }; + }.bind(this)) + }, manifest); + } + }]); + return DockerComposeClient; +}(EventEmitter); + +module.exports = DockerComposeClient; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB7IENsaWVudCB9ID0gcmVxdWlyZSgnemVyb3JwYycpO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuY29uc3QgYXdhaXRpZnkgPSByZXF1aXJlKCdhcHItYXdhaXRpZnknKTtcblxuY2xhc3MgRG9ja2VyQ29tcG9zZUNsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50ID0gJ3RjcDovLzAuMC4wLjA6NDI0MicpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgQ2xpZW50KHtcbiAgICAgIGhlYXJ0YmVhdEludGVydmFsOiA2MCAqIDQgKiAxMDAwLCAvLyA0bVxuICAgICAgdGltZW91dDogNjAgKiAzMCwgLy8gMzBtXG4gICAgfSk7XG5cbiAgICB0aGlzLmNsaWVudC5jb25uZWN0KGVuZHBvaW50KTtcbiAgICB0aGlzLmNsaWVudC5vbignZXJyb3InLCBlcnIgPT4gdGhpcy5lbWl0KCdlcnJvcicsIGVycikpO1xuXG4gICAgdGhpcy5faW52b2tlID0gYXdhaXRpZnkodGhpcy5faW52b2tlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gV2h5IGlzbid0IGNsaWVudC5jb25uZWN0IGFzeW5jIHdpdGggZXJyb3I/P1xuICBfaW52b2tlKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuaW52b2tlKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNsb3NlKCk7XG4gIH1cblxuICBwcm92aXNpb24oeyBwcm9qZWN0TmFtZSwgbWFuaWZlc3QgfSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKCd1cCcsIHsgcHJvamVjdF9uYW1lOiBwcm9qZWN0TmFtZSB9LCBtYW5pZmVzdCk7XG4gIH1cblxuICBzY2FsZSh7IHByb2plY3ROYW1lLCBzZXJ2aWNlcywgbWFuaWZlc3QgfSkge1xuICAgIHJldHVybiB0aGlzLl9pbnZva2UoXG4gICAgICAnc2NhbGUnLFxuICAgICAge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgICAgIHByb2plY3RfbmFtZTogcHJvamVjdE5hbWUsXG4gICAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubWFwKG5hbWUgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIG51bTogc2VydmljZXNbbmFtZV1cbiAgICAgICAgfSkpXG4gICAgICB9LFxuICAgICAgbWFuaWZlc3RcbiAgICApO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRG9ja2VyQ29tcG9zZUNsaWVudDtcbiJdLCJuYW1lcyI6WyJyZXF1aXJlIiwiQ2xpZW50IiwiRXZlbnRFbWl0dGVyIiwiYXdhaXRpZnkiLCJEb2NrZXJDb21wb3NlQ2xpZW50IiwiZW5kcG9pbnQiLCJjbGllbnQiLCJjb25uZWN0Iiwib24iLCJlbWl0IiwiZXJyIiwiX2ludm9rZSIsImJpbmQiLCJuYW1lIiwiYXJncyIsImludm9rZSIsImNsb3NlIiwicHJvamVjdE5hbWUiLCJtYW5pZmVzdCIsInByb2plY3RfbmFtZSIsInNlcnZpY2VzIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUFBbUJBLFFBQVEsU0FBUjtJQUFYQyxrQkFBQUE7O2dCQUNpQkQsUUFBUSxRQUFSO0lBQWpCRSx5QkFBQUE7O0FBQ1IsSUFBTUMsV0FBV0gsUUFBUSxjQUFSLENBQWpCOztJQUVNSTs7O2lDQUN5Qzs7O1FBQWpDQyxRQUFpQyx1RUFBdEIsb0JBQXNCOzs7OztVQUd0Q0MsTUFBTCxHQUFjLElBQUlMLE1BQUosQ0FBVzt5QkFDSixLQUFLLENBQUwsR0FBUyxJQURMO2VBRWQsS0FBSyxFQUZTLEVBQVgsQ0FBZDs7VUFLS0ssTUFBTCxDQUFZQyxPQUFaLENBQW9CRixRQUFwQjtVQUNLQyxNQUFMLENBQVlFLEVBQVosQ0FBZSxPQUFmLEVBQXdCOzthQUFPLE1BQUtDLElBQUwsQ0FBVSxPQUFWLEVBQW1CQyxHQUFuQixDQUFQO0tBQXhCOztVQUVLQyxPQUFMLEdBQWVSLFNBQVMsTUFBS1EsT0FBTCxDQUFhQyxJQUFiLE9BQVQsQ0FBZjs7Ozs7Ozs7OzRCQUlNQyxNQUFlOzs7d0NBQU5DLElBQU07WUFBQTs7O2FBQ2QsZ0JBQUtSLE1BQUwsRUFBWVMsTUFBWixpQkFBbUJGLElBQW5CLFNBQTRCQyxJQUE1QixFQUFQOzs7OzRCQUdNO2FBQ0MsS0FBS1IsTUFBTCxDQUFZVSxLQUFaLEVBQVA7Ozs7b0NBR21DO1VBQXpCQyxXQUF5QixRQUF6QkEsV0FBeUI7VUFBWkMsUUFBWSxRQUFaQSxRQUFZOzs7YUFFNUIsS0FBS1AsT0FBTCxDQUFhLElBQWIsRUFBbUIsRUFBRVEsY0FBY0YsV0FBaEIsRUFBbkIsRUFBa0RDLFFBQWxELENBQVA7Ozs7aUNBR3lDOzs7VUFBbkNELFdBQW1DLFNBQW5DQSxXQUFtQztVQUF0QkcsUUFBc0IsU0FBdEJBLFFBQXNCO1VBQVpGLFFBQVksU0FBWkEsUUFBWTs7YUFDbEMsS0FBS1AsT0FBTCxDQUNMLE9BREssRUFFTDs7c0JBRWdCTSxXQUZoQjtrQkFHWUksT0FBT0MsSUFBUCxDQUFZRixRQUFaLEVBQXNCRyxHQUF0QixDQUEwQjs7aUJBQVM7c0JBQUE7aUJBRXRDSCxTQUFTUCxJQUFUO1dBRjZCO1NBQTFCO09BTFAsRUFVTEssUUFWSyxDQUFQOzs7O0VBOUI4QmhCOztBQTZDbENzQixPQUFPQyxPQUFQLEdBQWlCckIsbUJBQWpCIn0= diff --git a/docker-compose-client/dist/index.umd.js b/docker-compose-client/dist/index.umd.js new file mode 100644 index 00000000..3400ee64 --- /dev/null +++ b/docker-compose-client/dist/index.umd.js @@ -0,0 +1,166 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory() : + typeof define === 'function' && define.amd ? define(factory) : + (factory()); +}(this, (function () { 'use strict'; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = 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); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + + + + + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; + + + + + +var newArrowCheck = function (innerThis, boundThis) { + if (innerThis !== boundThis) { + throw new TypeError("Cannot instantiate an arrow function"); + } +}; + + + + + +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; + +var _require = require('zerorpc'); +var Client = _require.Client; + +var _require2 = require('events'); +var EventEmitter = _require2.EventEmitter; + +var awaitify = require('apr-awaitify'); + +var DockerComposeClient = function (_EventEmitter) { + inherits(DockerComposeClient, _EventEmitter); + + function DockerComposeClient() { + var _this2 = this; + + var endpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'tcp://0.0.0.0:4242'; + classCallCheck(this, DockerComposeClient); + + var _this = possibleConstructorReturn(this, (DockerComposeClient.__proto__ || Object.getPrototypeOf(DockerComposeClient)).call(this)); + + _this.client = new Client({ + heartbeatInterval: 60 * 4 * 1000, // 4m + timeout: 60 * 30 }); + + _this.client.connect(endpoint); + _this.client.on('error', function (err) { + newArrowCheck(this, _this2); + return _this.emit('error', err); + }.bind(this)); + + _this._invoke = awaitify(_this._invoke.bind(_this)); + return _this; + } + + // Why isn't client.connect async with error?? + + + createClass(DockerComposeClient, [{ + key: '_invoke', + value: function _invoke(name) { + var _client; + + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return (_client = this.client).invoke.apply(_client, [name].concat(args)); + } + }, { + key: 'close', + value: function close() { + return this.client.close(); + } + }, { + key: 'provision', + value: function provision(_ref) { + var projectName = _ref.projectName, + manifest = _ref.manifest; + + // eslint-disable-next-line camelcase + return this._invoke('up', { project_name: projectName }, manifest); + } + }, { + key: 'scale', + value: function scale(_ref2) { + var _this3 = this; + + var projectName = _ref2.projectName, + services = _ref2.services, + manifest = _ref2.manifest; + + return this._invoke('scale', { + // eslint-disable-next-line camelcase + project_name: projectName, + services: Object.keys(services).map(function (name) { + newArrowCheck(this, _this3); + return { + name: name, + num: services[name] + }; + }.bind(this)) + }, manifest); + } + }]); + return DockerComposeClient; +}(EventEmitter); + +module.exports = DockerComposeClient; + +}))); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBDbGllbnQgfSA9IHJlcXVpcmUoJ3plcm9ycGMnKTtcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGF3YWl0aWZ5ID0gcmVxdWlyZSgnYXByLWF3YWl0aWZ5Jyk7XG5cbmNsYXNzIERvY2tlckNvbXBvc2VDbGllbnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihlbmRwb2ludCA9ICd0Y3A6Ly8wLjAuMC4wOjQyNDInKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY2xpZW50ID0gbmV3IENsaWVudCh7XG4gICAgICBoZWFydGJlYXRJbnRlcnZhbDogNjAgKiA0ICogMTAwMCwgLy8gNG1cbiAgICAgIHRpbWVvdXQ6IDYwICogMzAsIC8vIDMwbVxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGllbnQuY29ubmVjdChlbmRwb2ludCk7XG4gICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZXJyID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcblxuICAgIHRoaXMuX2ludm9rZSA9IGF3YWl0aWZ5KHRoaXMuX2ludm9rZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8vIFdoeSBpc24ndCBjbGllbnQuY29ubmVjdCBhc3luYyB3aXRoIGVycm9yPz9cbiAgX2ludm9rZShuYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lmludm9rZShuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICB9XG5cbiAgcHJvdmlzaW9uKHsgcHJvamVjdE5hbWUsIG1hbmlmZXN0IH0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndXAnLCB7IHByb2plY3RfbmFtZTogcHJvamVjdE5hbWUgfSwgbWFuaWZlc3QpO1xuICB9XG5cbiAgc2NhbGUoeyBwcm9qZWN0TmFtZSwgc2VydmljZXMsIG1hbmlmZXN0IH0pIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFxuICAgICAgJ3NjYWxlJyxcbiAgICAgIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuICAgICAgICBwcm9qZWN0X25hbWU6IHByb2plY3ROYW1lLFxuICAgICAgICBzZXJ2aWNlczogT2JqZWN0LmtleXMoc2VydmljZXMpLm1hcChuYW1lID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBudW06IHNlcnZpY2VzW25hbWVdXG4gICAgICAgIH0pKVxuICAgICAgfSxcbiAgICAgIG1hbmlmZXN0XG4gICAgKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERvY2tlckNvbXBvc2VDbGllbnQ7XG4iXSwibmFtZXMiOlsicmVxdWlyZSIsIkNsaWVudCIsIkV2ZW50RW1pdHRlciIsImF3YWl0aWZ5IiwiRG9ja2VyQ29tcG9zZUNsaWVudCIsImVuZHBvaW50IiwiY2xpZW50IiwiY29ubmVjdCIsIm9uIiwiZW1pdCIsImVyciIsIl9pbnZva2UiLCJiaW5kIiwibmFtZSIsImFyZ3MiLCJpbnZva2UiLCJjbG9zZSIsInByb2plY3ROYW1lIiwibWFuaWZlc3QiLCJwcm9qZWN0X25hbWUiLCJzZXJ2aWNlcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2VBQW1CQSxRQUFRLFNBQVI7SUFBWEMsa0JBQUFBOztnQkFDaUJELFFBQVEsUUFBUjtJQUFqQkUseUJBQUFBOztBQUNSLElBQU1DLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7SUFFTUk7OztpQ0FDeUM7OztRQUFqQ0MsUUFBaUMsdUVBQXRCLG9CQUFzQjs7Ozs7VUFHdENDLE1BQUwsR0FBYyxJQUFJTCxNQUFKLENBQVc7eUJBQ0osS0FBSyxDQUFMLEdBQVMsSUFETDtlQUVkLEtBQUssRUFGUyxFQUFYLENBQWQ7O1VBS0tLLE1BQUwsQ0FBWUMsT0FBWixDQUFvQkYsUUFBcEI7VUFDS0MsTUFBTCxDQUFZRSxFQUFaLENBQWUsT0FBZixFQUF3Qjs7YUFBTyxNQUFLQyxJQUFMLENBQVUsT0FBVixFQUFtQkMsR0FBbkIsQ0FBUDtLQUF4Qjs7VUFFS0MsT0FBTCxHQUFlUixTQUFTLE1BQUtRLE9BQUwsQ0FBYUMsSUFBYixPQUFULENBQWY7Ozs7Ozs7Ozs0QkFJTUMsTUFBZTs7O3dDQUFOQyxJQUFNO1lBQUE7OzthQUNkLGdCQUFLUixNQUFMLEVBQVlTLE1BQVosaUJBQW1CRixJQUFuQixTQUE0QkMsSUFBNUIsRUFBUDs7Ozs0QkFHTTthQUNDLEtBQUtSLE1BQUwsQ0FBWVUsS0FBWixFQUFQOzs7O29DQUdtQztVQUF6QkMsV0FBeUIsUUFBekJBLFdBQXlCO1VBQVpDLFFBQVksUUFBWkEsUUFBWTs7O2FBRTVCLEtBQUtQLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLEVBQUVRLGNBQWNGLFdBQWhCLEVBQW5CLEVBQWtEQyxRQUFsRCxDQUFQOzs7O2lDQUd5Qzs7O1VBQW5DRCxXQUFtQyxTQUFuQ0EsV0FBbUM7VUFBdEJHLFFBQXNCLFNBQXRCQSxRQUFzQjtVQUFaRixRQUFZLFNBQVpBLFFBQVk7O2FBQ2xDLEtBQUtQLE9BQUwsQ0FDTCxPQURLLEVBRUw7O3NCQUVnQk0sV0FGaEI7a0JBR1lJLE9BQU9DLElBQVAsQ0FBWUYsUUFBWixFQUFzQkcsR0FBdEIsQ0FBMEI7O2lCQUFTO3NCQUFBO2lCQUV0Q0gsU0FBU1AsSUFBVDtXQUY2QjtTQUExQjtPQUxQLEVBVUxLLFFBVkssQ0FBUDs7OztFQTlCOEJoQjs7QUE2Q2xDc0IsT0FBT0MsT0FBUCxHQUFpQnJCLG1CQUFqQjs7In0= diff --git a/spikes/docker-compose-client/flow-typed/npm/apr-awaitify_vx.x.x.js b/docker-compose-client/flow-typed/npm/apr-awaitify_vx.x.x.js similarity index 100% rename from spikes/docker-compose-client/flow-typed/npm/apr-awaitify_vx.x.x.js rename to docker-compose-client/flow-typed/npm/apr-awaitify_vx.x.x.js diff --git a/spikes/docker-compose-client/flow-typed/npm/ava_vx.x.x.js b/docker-compose-client/flow-typed/npm/ava_vx.x.x.js similarity index 100% rename from spikes/docker-compose-client/flow-typed/npm/ava_vx.x.x.js rename to docker-compose-client/flow-typed/npm/ava_vx.x.x.js diff --git a/spikes/docker-compose-client/flow-typed/npm/babelrc-rollup_vx.x.x.js b/docker-compose-client/flow-typed/npm/babelrc-rollup_vx.x.x.js similarity index 100% rename from spikes/docker-compose-client/flow-typed/npm/babelrc-rollup_vx.x.x.js rename to docker-compose-client/flow-typed/npm/babelrc-rollup_vx.x.x.js diff --git a/spikes/docker-compose-client/flow-typed/npm/rollup-plugin-babel_vx.x.x.js b/docker-compose-client/flow-typed/npm/rollup-plugin-babel_vx.x.x.js similarity index 100% rename from spikes/docker-compose-client/flow-typed/npm/rollup-plugin-babel_vx.x.x.js rename to docker-compose-client/flow-typed/npm/rollup-plugin-babel_vx.x.x.js diff --git a/spikes/docker-compose-client/flow-typed/npm/zerorpc_vx.x.x.js b/docker-compose-client/flow-typed/npm/zerorpc_vx.x.x.js similarity index 100% rename from spikes/docker-compose-client/flow-typed/npm/zerorpc_vx.x.x.js rename to docker-compose-client/flow-typed/npm/zerorpc_vx.x.x.js diff --git a/spikes/docker-compose-client/package.json b/docker-compose-client/package.json similarity index 81% rename from spikes/docker-compose-client/package.json rename to docker-compose-client/package.json index c3c7526d..6a312b57 100644 --- a/spikes/docker-compose-client/package.json +++ b/docker-compose-client/package.json @@ -1,12 +1,8 @@ { "name": "docker-compose-client", - "version": "1.0.0", - "private": true, - "description": "", - "license": "Apache-2.0", - "author": "Sérgio Ramos ", + "version": "1.0.4", + "license": "MPL2.0", "repository": "github:yldio/docker-compose-client", - "keywords": [], "files": [ "dist" ], @@ -26,11 +22,11 @@ "dev-start": "npm run build && node ." }, "dependencies": { - "apr-awaitify": "^1.0.2", + "apr-awaitify": "^1.0.4", "zerorpc": "^0.9.7" }, "devDependencies": { - "apr-intercept": "^1.0.2", + "apr-intercept": "^1.0.4", "ava": "0.19.1", "babel-eslint": "^7.2.3", "babel-plugin-external-helpers": "6.22.0", @@ -39,15 +35,15 @@ "babel-preset-env": "1.4.0", "babel-preset-flow": "^6.23.0", "babelrc-rollup": "3.0.0", - "cross-env": "^4.0.0", + "cross-env": "^5.0.0", "documentation": "4.0.0-rc.1", "eslint": "3.19.0", - "eslint-config-prettier": "2.0.0", + "eslint-config-prettier": "2.1.0", "eslint-config-xo-space": "^0.16.0", - "eslint-plugin-flowtype": "2.32.1", - "eslint-plugin-flowtype-errors": "3.2.0", + "eslint-plugin-flowtype": "2.33.0", + "eslint-plugin-flowtype-errors": "3.2.1", "eslint-plugin-prettier": "^2.0.1", - "flow-bin": "0.45.0", + "flow-bin": "0.46.0", "flow-typed": "^2.1.2", "js-yaml": "^3.8.4", "lint-staged": "3.4.1", diff --git a/spikes/docker-compose-client/readme.md b/docker-compose-client/readme.md similarity index 100% rename from spikes/docker-compose-client/readme.md rename to docker-compose-client/readme.md diff --git a/spikes/docker-compose-client/scripts/rollup.config.js b/docker-compose-client/scripts/rollup.config.js similarity index 100% rename from spikes/docker-compose-client/scripts/rollup.config.js rename to docker-compose-client/scripts/rollup.config.js diff --git a/spikes/docker-compose-client/src/index.js b/docker-compose-client/src/index.js similarity index 90% rename from spikes/docker-compose-client/src/index.js rename to docker-compose-client/src/index.js index 9d8e08f6..36a0c52c 100644 --- a/spikes/docker-compose-client/src/index.js +++ b/docker-compose-client/src/index.js @@ -6,7 +6,11 @@ class DockerComposeClient extends EventEmitter { constructor(endpoint = 'tcp://0.0.0.0:4242') { super(); - this.client = new Client(); + this.client = new Client({ + heartbeatInterval: 60 * 4 * 1000, // 4m + timeout: 60 * 30, // 30m + }); + this.client.connect(endpoint); this.client.on('error', err => this.emit('error', err)); diff --git a/spikes/docker-compose-client/src/types.js b/docker-compose-client/src/types.js similarity index 100% rename from spikes/docker-compose-client/src/types.js rename to docker-compose-client/src/types.js diff --git a/spikes/docker-compose-client/test/index.js b/docker-compose-client/test/index.js similarity index 100% rename from spikes/docker-compose-client/test/index.js rename to docker-compose-client/test/index.js diff --git a/spikes/docker-compose-client/yarn.lock b/docker-compose-client/yarn.lock similarity index 95% rename from spikes/docker-compose-client/yarn.lock rename to docker-compose-client/yarn.lock index 08d3a967..d45e5023 100644 --- a/spikes/docker-compose-client/yarn.lock +++ b/docker-compose-client/yarn.lock @@ -129,9 +129,13 @@ append-transform@^0.4.0: dependencies: default-require-extensions "^1.0.0" -apr-awaitify@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/apr-awaitify/-/apr-awaitify-1.0.2.tgz#2c6889c783de5147fd61ac4421ba459e2dd9ca27" +apr-awaitify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/apr-awaitify/-/apr-awaitify-1.0.4.tgz#a72074a0d333e090bb120be9f710fd106b48a90a" + +apr-intercept@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/apr-intercept/-/apr-intercept-1.0.4.tgz#01c64345f4af647b6b04f5aba4755195429b061a" aproba@^1.0.3: version "1.1.1" @@ -962,6 +966,14 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-polyfill@^6.6.1: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + babel-preset-env@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a" @@ -1143,8 +1155,8 @@ babelrc-rollup@3.0.0: resolve "^1.1.7" babylon@^6.1.0, babylon@^6.11.0, babylon@^6.11.4, babylon@^6.13.0, babylon@^6.15.0, babylon@^6.17.0: - version "6.17.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" + version "6.17.1" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f" babylon@7.0.0-beta.8: version "7.0.0-beta.8" @@ -1168,6 +1180,13 @@ binary-extensions@^1.0.0: version "1.8.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" +"binary@>= 0.3.0 < 1": + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + bindings@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" @@ -1245,6 +1264,10 @@ buffer-shims@^1.0.0, buffer-shims@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1308,8 +1331,8 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" caniuse-db@^1.0.30000639: - version "1.0.30000666" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000666.tgz#951ed9f3d3bfaa08a06dafbb5089ab07cce6ab90" + version "1.0.30000670" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000670.tgz#90d33b79e3090e25829c311113c56d6b1788bf43" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1330,6 +1353,12 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + dependencies: + traverse ">=0.3.0 <0.4" + chalk@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" @@ -1364,6 +1393,10 @@ character-reference-invalid@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.0.tgz#dec9ad1dfb9f8d06b4fcdaa2adc3c4fd97af1e68" +charenc@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + chokidar@^1.2.0, chokidar@^1.4.2: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1388,8 +1421,8 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" clean-stack@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.1.1.tgz#a1b3711122df162df7c7cb9b3c0470f28cb58adb" + version "1.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.2.0.tgz#a465128d62c31fb1a3606d00abfe59dcf652f568" clean-yaml-object@^0.1.0: version "0.1.0" @@ -1515,6 +1548,10 @@ color-name@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" @@ -1562,14 +1599,14 @@ concat-stream@~1.5.0: typedarray "~0.0.5" configstore@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.0.0.tgz#e1b8669c1803ccc50b545e92f8e6e79aa80e0196" + version "3.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" - mkdirp "^0.5.0" + make-dir "^1.0.0" unique-string "^1.0.0" - write-file-atomic "^1.1.2" + write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" console-control-strings@^1.0.0, console-control-strings@~1.1.0: @@ -1622,6 +1659,13 @@ create-error-class@^3.0.0: dependencies: capture-stack-trace "^1.0.0" +cross-env@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.0.0.tgz#565ccae4d09676441a5087f406fe7661a29c931b" + dependencies: + cross-spawn "^5.1.0" + is-windows "^1.0.0" + cross-spawn-async@^2.1.1: version "2.2.5" resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" @@ -1636,7 +1680,7 @@ cross-spawn@^4, cross-spawn@^4.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^5.0.1: +cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -1644,6 +1688,10 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +crypt@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1713,8 +1761,8 @@ deep-equal@^1.0.0: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" deep-extend@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" @@ -1891,8 +1939,8 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" electron-to-chromium@^1.2.7: - version "1.3.9" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.9.tgz#db1cba2a26aebcca2f7f5b8b034554468609157d" + version "1.3.10" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.10.tgz#63d62b785471f0d8dda85199d64579de8a449f08" elegant-spinner@^1.0.1: version "1.0.1" @@ -1933,8 +1981,8 @@ error@^7.0.0: xtend "~4.0.0" es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.16" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.16.tgz#1ef1b04f3d09db6a5d630226d62202f2e425e45a" + version "0.10.18" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.18.tgz#dc239d3dce4c22b9c939aa180878837a3c0b5c92" dependencies: es6-iterator "2" es6-symbol "~3.1" @@ -2001,9 +2049,9 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-prettier@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.0.0.tgz#073cdb2760c0ba817c9b3fbf2300110a77a35626" +eslint-config-prettier@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.1.0.tgz#cf78bc7864f98b0f87bcadf702459e933dfa659c" dependencies: get-stdin "^5.0.1" @@ -2017,17 +2065,16 @@ eslint-config-xo@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.18.1.tgz#f3bc873b33b2c82513d881eacb2ee3428407ad33" -eslint-plugin-flowtype-errors@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype-errors/-/eslint-plugin-flowtype-errors-3.2.0.tgz#28b3f6742e50e64562a21b6ab8bb054a4754199d" +eslint-plugin-flowtype-errors@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype-errors/-/eslint-plugin-flowtype-errors-3.2.1.tgz#2c206ebbc1a41d1fb02fafcd87a69858f6999320" dependencies: babel-plugin-transform-runtime "^6.23.0" - shelljs "^0.7.7" slash "^1.0.0" -eslint-plugin-flowtype@2.32.1: - version "2.32.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.32.1.tgz#bbee185dedf97e5f63ec975cdcddd199bd2a2501" +eslint-plugin-flowtype@2.33.0: + version "2.33.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.33.0.tgz#b2783814ed2ddcf729953b8f65ff73c90cabee4b" dependencies: lodash "^4.15.0" @@ -2304,14 +2351,34 @@ flesch@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/flesch/-/flesch-1.0.0.tgz#96bfaee5e208264ff63c4447c4f124b5d4361cd5" -flow-bin@0.45.0: - version "0.45.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.45.0.tgz#009dd0f577a3f665c74ca8be827ae8c2dd8fd6b5" +flow-bin@0.46.0: + version "0.46.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.46.0.tgz#06ad7fe19dddb1042264438064a2a32fee12b872" flow-parser@0.45.0: version "0.45.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.45.0.tgz#aa29d4ae27f06aa02817772bba0fcbefef7e62f0" +flow-typed@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.1.2.tgz#468f7a8b6bc18689856a1d101713b23bb39f01e4" + dependencies: + babel-polyfill "^6.6.1" + colors "^1.1.2" + fs-extra "^2.0.0" + github "^0.2.4" + glob "^7.0.6" + md5 "^2.1.0" + mkdirp "^0.5.1" + request "^2.69.0" + rimraf "^2.6.0" + semver "^5.1.0" + table "^3.7.8" + through "^2.3.8" + unzip "^0.1.11" + which "^1.2.11" + yargs "^4.2.0" + fn-name@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" @@ -2345,6 +2412,13 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +fs-extra@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -2373,6 +2447,15 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +"fstream@>= 0.1.30 < 1": + version "0.1.31" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" + dependencies: + graceful-fs "~3.0.2" + inherits "~2.0.0" + mkdirp "0.5" + rimraf "2" + function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" @@ -2456,6 +2539,12 @@ github-slugger@^1.0.0, github-slugger@^1.1.1, github-slugger@1.1.1: dependencies: emoji-regex "^6.0.0" +github@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/github/-/github-0.2.4.tgz#24fa7f0e13fa11b946af91134c51982a91ce538b" + dependencies: + mime "^1.2.11" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -2559,6 +2648,12 @@ graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +graceful-fs@~3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -2833,7 +2928,7 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" -is-buffer@^1.1.4, is-buffer@^1.1.5: +is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" @@ -3040,6 +3135,10 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-windows@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" + is-word-character@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.0.tgz#a3a9e5ddad70c5c2ee36f4a9cfc9a53f44535247" @@ -3197,7 +3296,7 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@^3.3.1, js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.8.2: +js-yaml@^3.3.1, js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@^3.8.2, js-yaml@^3.8.4: version "3.8.4" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6" dependencies: @@ -3234,13 +3333,19 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsonparse@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.0.tgz#85fc245b1d9259acc6941960b905adf64e7de0e8" + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" jsonpointer@^4.0.0: version "4.0.1" @@ -3408,6 +3513,10 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -3493,6 +3602,12 @@ lru-cache@^4.0.0, lru-cache@^4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + make-iterator@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-0.1.1.tgz#873d27b8198a465a81483b6f5d16da4e863ecf5b" @@ -3521,6 +3636,13 @@ markdown-table@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.0.tgz#1f5ae61659ced8808d882554c32e8b3f38dd1143" +"match-stream@>= 0.0.2 < 1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" + dependencies: + buffers "~0.1.1" + readable-stream "~1.0.0" + matcher@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/matcher/-/matcher-0.1.2.tgz#ef20cbde64c24c50cc61af5b83ee0b1b8ff00101" @@ -3543,6 +3665,14 @@ md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" +md5@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" + dependencies: + charenc "~0.0.1" + crypt "~0.0.1" + is-buffer "~1.1.1" + mdast-comment-marker@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdast-comment-marker/-/mdast-comment-marker-1.0.1.tgz#f0f26c33fc5d81e41d9ec36ff4f066bb50d217fb" @@ -3660,9 +3790,9 @@ mime-types@^2.1.12, mime-types@~2.1.7: dependencies: mime-db "~1.27.0" -mime@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +mime@^1.2.11, mime@^1.3.4: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" mimic-fn@^1.0.0: version "1.1.0" @@ -3686,7 +3816,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0": +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@0.5: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -3746,6 +3876,10 @@ nan@~2.3.0: version "2.3.5" resolved "https://registry.yarnpkg.com/nan/-/nan-2.3.5.tgz#822a0dc266290ce4cd3a12282ca3e7e364668a08" +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4012,6 +4146,10 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +"over@>= 0.0.5 < 1": + version "0.0.5" + resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4324,6 +4462,15 @@ pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +"pullstream@>= 0.4.1 < 1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" + dependencies: + over ">= 0.0.5 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.2 < 2" + slice-stream ">= 1.0.0 < 2" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -4426,7 +4573,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.0.0" util-deprecate "~1.0.1" -"readable-stream@>=1.0.33-1 <1.1.0-0": +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.0, readable-stream@~1.0.31: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: @@ -4673,7 +4820,7 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@^2.81.0: +request@^2.69.0, request@^2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -4860,7 +5007,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@2: +rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@2: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -4899,8 +5046,8 @@ rx-lite@^3.1.2: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" rxjs@^5.0.0-beta.11: - version "5.3.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.3.1.tgz#9ecc9e722247e4f4490d30a878577a3740fd0cb7" + version "5.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" dependencies: symbol-observable "^1.0.1" @@ -4930,6 +5077,10 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2": + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4940,7 +5091,7 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.7.5, shelljs@^0.7.7: +shelljs@^0.7.5: version "0.7.7" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" dependencies: @@ -4964,6 +5115,12 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" +"slice-stream@>= 1.0.0 < 2": + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" + dependencies: + readable-stream "~1.0.31" + slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -5273,7 +5430,7 @@ text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -through@^2.3.6, "through@>=2.2.7 <3": +through@^2.3.6, through@^2.3.8, "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -5346,6 +5503,10 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + trim-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.0.tgz#9926d03ede13ba18f7d42222631fb04c79ff26fe" @@ -5395,8 +5556,8 @@ typedarray@^0.0.6, typedarray@~0.0.5: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" uglify-js@^2.6: - version "2.8.23" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.23.tgz#8230dd9783371232d62a7821e2cf9a817270a8a0" + version "2.8.25" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.25.tgz#11b776e7c3925802853e4c3dd6d0ffad8eb72336" dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -5512,6 +5673,17 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" +unzip@^0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" + dependencies: + binary ">= 0.3.0 < 1" + fstream ">= 0.1.30 < 1" + match-stream ">= 0.0.2 < 1" + pullstream ">= 0.4.1 < 1" + readable-stream "~1.0.31" + setimmediate ">= 1.0.1 < 2" + update-notifier@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" @@ -5653,17 +5825,17 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.2.10, which@^1.2.4, which@^1.2.8, which@^1.2.9, which@1.2.x: +which@^1.2.10, which@^1.2.11, which@^1.2.4, which@^1.2.8, which@^1.2.9, which@1.2.x: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: isexe "^2.0.0" wide-align@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: - string-width "^1.0.1" + string-width "^1.0.2" widest-line@^1.0.0: version "1.0.0" @@ -5671,6 +5843,10 @@ widest-line@^1.0.0: dependencies: string-width "^1.0.1" +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" @@ -5698,7 +5874,7 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: +write-file-atomic@^1.1.4: version "1.3.4" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" dependencies: @@ -5706,15 +5882,23 @@ write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: imurmurhash "^0.1.4" slide "^1.1.5" +write-file-atomic@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + write-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.0.0.tgz#0eaec981fcf9288dbc2806cbd26e06ab9bdca4ed" + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.1.0.tgz#ba1cf3ac7ee89db26c3d528986e48421389046b7" dependencies: graceful-fs "^4.1.2" - mkdirp "^0.5.1" + make-dir "^1.0.0" pify "^2.0.0" sort-keys "^1.1.1" - write-file-atomic "^1.1.2" + write-file-atomic "^2.0.0" write-pkg@^2.0.0: version "2.1.0" @@ -5753,6 +5937,13 @@ yallist@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -5765,6 +5956,25 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" +yargs@^4.2.0: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + yargs@^6.0.0: version "6.6.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" diff --git a/portal-data/lib/index.js b/portal-data/lib/index.js index b98281bd..81cd48af 100644 --- a/portal-data/lib/index.js +++ b/portal-data/lib/index.js @@ -2,7 +2,8 @@ const Hoek = require('hoek'); const Penseur = require('penseur'); - +const DCClient = require('docker-compose-client'); +const awaitify = require('apr-awaitify'); const internals = { defaults: { @@ -10,189 +11,159 @@ const internals = { } }; - module.exports = class Data { - constructor (options) { + constructor(options) { const settings = Hoek.applyToDefaults(options || {}, internals.defaults); - const name = settings.name; - delete settings.name; // Penseur will assert that the options are correct - this._db = new Penseur.Db(name, settings); + this._db = new Penseur.Db(settings.name, settings); + this._docker = new DCClient(settings.dockerHost); + + this._db.establish = awaitify(this._db.establish); + this._db.deployments = awaitify(this._db.deployments); + + // promisify Penseur + [ + 'activities', + 'datacenters', + 'deployments', + 'manifests', + 'metrics' + ].forEach(tableName => + ['insert', 'get', 'update', 'remove', 'all'].forEach(methodName => { + this._db[tableName][methodName] = awaitify( + this._db[tableName][methodName] + ); + }) + ); } - connect (cb) { - return new Promise((resolve, reject) => { - this._db.establish(['activities', 'datacenters', 'deployments', 'manifests', 'metrics'], (err) => { - if (typeof cb === 'function') { - return cb(err); - } - - if (err) { - return reject(err); - } - - resolve(); - }); - }); + connect(cb) { + return this._db.establish(); } - createDeployment (deployment) { - return new Promise((resolve, reject) => { - deployment.services = []; - deployment.state = { current: 'stopped' }; + /* + * DeploymentGroupUuid + * Manifest + * id: UUID, + * created: Date.now(), + * type: 'docker-compose', + * format: 'yml', + * raw: 'original yml file content', + * obj: { } + */ + createDeployment({ deploymentGroupUuid, manifest, deployment }) { + // trigger deployment + // create deployment queue (we should think about what is a deployment queue) + // create the ConvergencePlans + // create a DeploymentPlan + // create a Version + // update the DeploymentGroup - this._db.deployments.insert(deployment, (err, key) => { - if (err) { - return reject(err); - } + // TODO + const updateDb = plan => { + // deployment.services = []; + // deployment.state = { current: 'stopped' }; - deployment.id = key; - - resolve(deployment); - }); - }); - } - - getDeployment (id) { - return new Promise((resolve, reject) => { - this._db.deployments.get(id, (err, deployment) => { - return err ? reject(err) : resolve(deployment); - }); - }); - } - - updateDeployment (deployment) { - return new Promise((resolve, reject) => { - this._db.deployments.update(deployment.id, deployment, (err) => { - return err ? reject(err) : resolve(deployment); - }); - }); - } - - deleteDeployment (id) { - return new Promise((resolve, reject) => { - this._db.deployments.remove(id, (err) => { - return err ? reject(err) : resolve(); - }); - }); - } - - getDeployments () { - return new Promise((resolve, reject) => { - this._db.deployments.all((err, deployments) => { - return err ? reject(err) : resolve(deployments); - }); - }); - } - - getDatacenters () { - return new Promise((resolve, reject) => { - this._db.datacenters.all((err, datacenters) => { - return err ? reject(err) : resolve(datacenters || []); - }); - }); - } - - createManifest (deploymentId, manifest) { - return new Promise((resolve, reject) => { - manifest.deploymentId = deploymentId; - manifest.created = Date.now(); - - this._db.manifests.insert(manifest, (err, id) => { - if (err) { - return reject(err); - } - - manifest.id = id; - resolve(manifest); - }); - }); - } - getManifest (id) { - return new Promise((resolve, reject) => { - this._db.manifests.get(id, (err, manifest) => { - return err ? reject(err) : resolve(manifest); - }); - }); - } - - getActivities (deploymentId) { - return new Promise((resolve, reject) => { - this._db.activities.query({ deploymentId }, (err, activities) => { - return err ? reject(err) : resolve(activities || []); - }); - }); - } - - getMetrics (containerId) { - return new Promise((resolve, reject) => { - this._db.metrics.get(containerId, (err, result) => { - return err ? reject(err) : resolve(result); - }); - }); - } - - insertMetrics (containerId, metrics) { - return new Promise((resolve, reject) => { - this._db.metrics.get(containerId, (err, existing) => { - if (err) { - return reject(err); - } - - if (existing) { - this._db.metrics.update(containerId, { metrics: this._db.append(metrics) }, (err) => { - return err ? reject(err) : resolve(existing); - }); - return; - } - - const entry = { id: containerId, metrics }; - this._db.metrics.insert(entry, { merge: true }, (err) => { - return err ? reject(err) : resolve(entry); + this._db.deployments + .insert({ + name: + }) + .then(key => { + deployment.id = key; + return deployment; }); - }); - }); + }; + + const provision = ({ name }) => + this._docker + .provision({ + projectName: name, + manifest: manifest.raw + }) + .then(updateDb); + + this.getDeployment(deploymentGroupUuid).then(provision); } - getServices (deploymentId) { - return new Promise((resolve, reject) => { - this._db.deployments.get(deploymentId, { filter: 'services' }, (err, deployment) => { - return err ? reject(err) : resolve(deployment.services); - }); - }); + getDeployment(id) { + return this._db.deployments.get(id); } - updateService (deploymentId, service) { - return new Promise((resolve, reject) => { - this._db.deployments.get(deploymentId, { filter: 'services' }, (err, deployment) => { - if (err) { - return reject(err); - } + updateDeployment(deployment) { + return this._db.deployments.update(deployment.id, deployment); + } - const serviceToUpdate = deployment.services.find((currentService) => { - return (currentService.name === service.name); + deleteDeployment(id) { + return this._db.deployments.remove(id); + } + + getDeployments() { + return this._db.deployments.all(); + } + + getDatacenters() { + return this._db.datacenters.all(); + } + + createManifest(deploymentId, manifest) { + manifest.deploymentId = deploymentId; + manifest.created = Date.now(); + + return this._db.manifests.insert().then(id => { + manifest.id = id; + return manifest; + }); + } + getManifest(id) { + return this._db.manifests.get(); + } + + getActivities(deploymentId) { + return this._db.activities.query({ deploymentId }); + } + + getMetrics(containerId) { + return this._db.metrics.get(containerId); + } + + insertMetrics(containerId, metrics) { + return this._db.metrics.get(containerId).then(existing => { + if (existing) { + return this._db.metrics.update(containerId, { + metrics: this._db.append(metrics) }); + } - if (!serviceToUpdate) { - deployment.services.push(service); - } else { - serviceToUpdate.count = service.count; - serviceToUpdate.containers = service.containers; - } + const entry = { id: containerId, metrics }; + return this._db.metrics.insert(entry, { merge: true }); + }); + } - this._db.deployments.update(deploymentId, { services: deployment.services }, (err) => { - return err ? reject(err) : resolve(service); - }); + getServices(deploymentId) { + this._db.deployments.get(deploymentId, { filter: 'services' }); + } + + updateService(deploymentId, service) { + this._db.deployments.get(deploymentId, { filter: 'services' }).then(() => { + const serviceToUpdate = deployment.services.find(currentService => { + return currentService.name === service.name; + }); + + if (!serviceToUpdate) { + deployment.services.push(service); + } else { + serviceToUpdate.count = service.count; + serviceToUpdate.containers = service.containers; + } + + return this._db.deployments.update(deploymentId, { + services: deployment.services }); }); } - deploymentChanges (handler) { - return new Promise((resolve, reject) => { - this._db.deployments.changes('*', { reconnect: true, handler }, (err) => { - return err ? reject(err) : resolve(); - }); - }); + deploymentChanges(handler) { + return this._db.deployments.changes('*', { reconnect: true, handler }); } }; diff --git a/portal-data/package.json b/portal-data/package.json index 62fab8b1..045ab489 100644 --- a/portal-data/package.json +++ b/portal-data/package.json @@ -6,6 +6,7 @@ "scripts": { "bootstrap": "node ./bootstrap-data", "lint": "belly-button", + "fmt": "prettier --write --single-quote {lib,test}/**/*.js", "rethinkdb-up": "docker run -d -p 8080:8080 -p 28015:28015 -p 29015:29015 --name rethinkdb rethinkdb", "rethinkdb-down": "docker rm -f rethinkdb", "test": "npm run lint && lab -t 40" @@ -13,13 +14,17 @@ "keywords": [], "author": "wyatt", "license": "MPL-2.0", + "dependencies": { + "apr-awaitify": "^1.0.4", + "docker-compose-client": "^1.0.3", + "hoek": "^4.1.1", + "penseur": "^7.8.1" + }, "devDependencies": { "belly-button": "^3.1.0", "code": "^4.0.0", - "lab": "^13.0.4" - }, - "dependencies": { - "hoek": "^4.1.1", - "penseur": "^7.8.1" + "lab": "^13.0.4", + "prettier": "^1.3.1", + "zerorpc": "^0.9.7" } } diff --git a/portal-data/test/index.js b/portal-data/test/index.js index 8291c37f..16c39866 100644 --- a/portal-data/test/index.js +++ b/portal-data/test/index.js @@ -1,33 +1,46 @@ 'use strict'; -const Code = require('code'); -const Lab = require('lab'); +const pkg = require('../package.json'); +const { expect } = require('code'); +const { before, describe, it, script } = require('lab'); +const { Server } = require('zerorpc'); const PortalData = require('../'); +exports.lab = script(); -// Test shortcuts - -const lab = exports.lab = Lab.script(); -const describe = lab.describe; -const it = lab.it; -const expect = Code.expect; - +const server = new Server({ + up: function(options, manifest, fn) { + fn(null, { + projectName: options.project_name + }); + } +}); const internals = { - options: { test: true, name: 'test' } + options: { test: true, name: 'test', dockerHost: 'tcp://0.0.0.0:4242'} }; -describe('createDeployment()', () => { - it('creates a deployment record in the deployment table', (done) => { - const data = new PortalData(internals.options); - data.connect().then(() => { - const deployment = { - name: 'User Services', - datacenter: 'us-sw-1' - }; +before(() => { + server.bind(internals.options.dockerHost); +}); - data.createDeployment(deployment).then((deployment) => { +after(() => { + server.close(); +}); + +describe('createDeployment()', () => { + it('creates a deployment record in the deployment table', done => { + const data = new PortalData(internals.options); + const deployment = { + name: 'User Services', + datacenter: 'us-sw-1' + }; + + data.connect().then(() => { + data.createDeployment({ + deployment + }).then(deployment => { expect(deployment.id).to.exist(); done(); }); @@ -35,9 +48,8 @@ describe('createDeployment()', () => { }); }); - describe('getDeployment()', () => { - it('will retrieve an existing deployment', (done) => { + it('will retrieve an existing deployment', done => { const data = new PortalData(internals.options); data.connect().then(() => { const deployment = { @@ -45,9 +57,9 @@ describe('getDeployment()', () => { datacenter: 'us-sw-1' }; - data.createDeployment(deployment).then((deployment) => { + data.createDeployment(deployment).then(deployment => { expect(deployment.id).to.exist(); - data.getDeployment(deployment.id).then((retrievedDeployment) => { + data.getDeployment(deployment.id).then(retrievedDeployment => { expect(deployment).to.equal(retrievedDeployment); done(); }); @@ -57,7 +69,7 @@ describe('getDeployment()', () => { }); describe('updateService()', () => { - it('will update the services for an existing deployment', (done) => { + it('will update the services for an existing deployment', done => { const data = new PortalData(internals.options); data.connect().then(() => { const deployment = { @@ -78,9 +90,9 @@ describe('updateService()', () => { count: 1 }; - data.createDeployment(deployment).then((deployment) => { + data.createDeployment(deployment).then(deployment => { expect(deployment.id).to.exist(); - data.updateService(deployment.id, service).then((updatedService) => { + data.updateService(deployment.id, service).then(updatedService => { expect(updatedService).to.equal(service); done(); }); @@ -90,7 +102,7 @@ describe('updateService()', () => { }); describe('deploymentChanges()', () => { - it('will execute the handler when a deployment service changes', (done) => { + it('will execute the handler when a deployment service changes', done => { const data = new PortalData(internals.options); data.connect().then(() => { const deployment = { @@ -139,35 +151,38 @@ describe('deploymentChanges()', () => { count: 3 }; - data.createDeployment(deployment).then((deployment) => { + data.createDeployment(deployment).then(deployment => { expect(deployment.id).to.exist(); - data.updateService(deployment.id, service1).then((updatedService1) => { + data.updateService(deployment.id, service1).then(updatedService1 => { expect(updatedService1).to.equal(service1); let executed = false; - data.deploymentChanges((err, changes) => { - if (executed) { - return; - } + data + .deploymentChanges((err, changes) => { + if (executed) { + return; + } - expect(changes.before).to.exist(); - expect(changes.after).to.exist(); - done(); - executed = true; - }).then(() => { - data.updateService(deployment.id, service2).then((updatedService2) => { - expect(updatedService2).to.equal(service2); + expect(changes.before).to.exist(); + expect(changes.after).to.exist(); + done(); + executed = true; + }) + .then(() => { + data + .updateService(deployment.id, service2) + .then(updatedService2 => { + expect(updatedService2).to.equal(service2); + }); }); - }); }); }); }); }); }); - describe('insertMetrics()', () => { - it('will add new metrics to a service and won\'t overwrite existing ones', (done) => { + it("will add new metrics to a service and won't overwrite existing ones", done => { const data = new PortalData(internals.options); data.connect().then(() => { const containerId = '81205d4a-92f4-c4d9-da8a-aafd689eeabb'; @@ -189,12 +204,12 @@ describe('insertMetrics()', () => { } ]; - data.insertMetrics(containerId, metrics1).then((result1) => { + data.insertMetrics(containerId, metrics1).then(result1 => { expect(result1.id).to.equal(containerId); expect(result1.metrics).to.equal(metrics1); - data.insertMetrics(containerId, metrics2).then((result2) => { + data.insertMetrics(containerId, metrics2).then(result2 => { expect(result2.id).to.equal(containerId); - data.getMetrics(containerId).then((results) => { + data.getMetrics(containerId).then(results => { expect(results.metrics.length).to.equal(2); done(); }); diff --git a/spikes/docker-compose-client/dist/index.es.js b/spikes/docker-compose-client/dist/index.es.js deleted file mode 100644 index 0a032f63..00000000 --- a/spikes/docker-compose-client/dist/index.es.js +++ /dev/null @@ -1,576 +0,0 @@ -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = 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); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - - - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - -var newArrowCheck = function (innerThis, boundThis) { - if (innerThis !== boundThis) { - throw new TypeError("Cannot instantiate an arrow function"); - } -}; - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var cov_1eyosjm197 = function () { - var path = '/Users/ramitos/dev/yld/joyent-portal/spikes/docker-compose-client/src/index.js', - hash = '384e02ed4692c70a8c8d9e69b30064cdb319bdf4', - global = new Function('return this')(), - gcv = '__coverage__', - coverageData = { - path: '/Users/ramitos/dev/yld/joyent-portal/spikes/docker-compose-client/src/index.js', - statementMap: { - '0': { - start: { - line: 1, - column: 19 - }, - end: { - line: 1, - column: 37 - } - }, - '1': { - start: { - line: 2, - column: 25 - }, - end: { - line: 2, - column: 42 - } - }, - '2': { - start: { - line: 3, - column: 17 - }, - end: { - line: 3, - column: 40 - } - }, - '3': { - start: { - line: 7, - column: 4 - }, - end: { - line: 7, - column: 12 - } - }, - '4': { - start: { - line: 9, - column: 4 - }, - end: { - line: 9, - column: 31 - } - }, - '5': { - start: { - line: 10, - column: 4 - }, - end: { - line: 10, - column: 34 - } - }, - '6': { - start: { - line: 11, - column: 4 - }, - end: { - line: 11, - column: 60 - } - }, - '7': { - start: { - line: 11, - column: 35 - }, - end: { - line: 11, - column: 58 - } - }, - '8': { - start: { - line: 13, - column: 4 - }, - end: { - line: 13, - column: 53 - } - }, - '9': { - start: { - line: 18, - column: 4 - }, - end: { - line: 18, - column: 45 - } - }, - '10': { - start: { - line: 22, - column: 4 - }, - end: { - line: 22, - column: 31 - } - }, - '11': { - start: { - line: 27, - column: 4 - }, - end: { - line: 27, - column: 71 - } - }, - '12': { - start: { - line: 31, - column: 4 - }, - end: { - line: 42, - column: 6 - } - }, - '13': { - start: { - line: 36, - column: 53 - }, - end: { - line: 39, - column: 9 - } - }, - '14': { - start: { - line: 46, - column: 0 - }, - end: { - line: 46, - column: 37 - } - } - }, - fnMap: { - '0': { - name: '(anonymous_0)', - decl: { - start: { - line: 6, - column: 2 - }, - end: { - line: 6, - column: 3 - } - }, - loc: { - start: { - line: 6, - column: 47 - }, - end: { - line: 14, - column: 3 - } - }, - line: 6 - }, - '1': { - name: '(anonymous_1)', - decl: { - start: { - line: 11, - column: 28 - }, - end: { - line: 11, - column: 29 - } - }, - loc: { - start: { - line: 11, - column: 35 - }, - end: { - line: 11, - column: 58 - } - }, - line: 11 - }, - '2': { - name: '(anonymous_2)', - decl: { - start: { - line: 17, - column: 2 - }, - end: { - line: 17, - column: 3 - } - }, - loc: { - start: { - line: 17, - column: 25 - }, - end: { - line: 19, - column: 3 - } - }, - line: 17 - }, - '3': { - name: '(anonymous_3)', - decl: { - start: { - line: 21, - column: 2 - }, - end: { - line: 21, - column: 3 - } - }, - loc: { - start: { - line: 21, - column: 10 - }, - end: { - line: 23, - column: 3 - } - }, - line: 21 - }, - '4': { - name: '(anonymous_4)', - decl: { - start: { - line: 25, - column: 2 - }, - end: { - line: 25, - column: 3 - } - }, - loc: { - start: { - line: 25, - column: 39 - }, - end: { - line: 28, - column: 3 - } - }, - line: 25 - }, - '5': { - name: '(anonymous_5)', - decl: { - start: { - line: 30, - column: 2 - }, - end: { - line: 30, - column: 3 - } - }, - loc: { - start: { - line: 30, - column: 45 - }, - end: { - line: 43, - column: 3 - } - }, - line: 30 - }, - '6': { - name: '(anonymous_6)', - decl: { - start: { - line: 36, - column: 44 - }, - end: { - line: 36, - column: 45 - } - }, - loc: { - start: { - line: 36, - column: 53 - }, - end: { - line: 39, - column: 9 - } - }, - line: 36 - } - }, - branchMap: { - '0': { - loc: { - start: { - line: 6, - column: 14 - }, - end: { - line: 6, - column: 45 - } - }, - type: 'default-arg', - locations: [{ - start: { - line: 6, - column: 25 - }, - end: { - line: 6, - column: 45 - } - }], - line: 6 - } - }, - s: { - '0': 0, - '1': 0, - '2': 0, - '3': 0, - '4': 0, - '5': 0, - '6': 0, - '7': 0, - '8': 0, - '9': 0, - '10': 0, - '11': 0, - '12': 0, - '13': 0, - '14': 0 - }, - f: { - '0': 0, - '1': 0, - '2': 0, - '3': 0, - '4': 0, - '5': 0, - '6': 0 - }, - b: { - '0': [0] - }, - _coverageSchema: '332fd63041d2c1bcb487cc26dd0d5f7d97098a6c' - }, - coverage = global[gcv] || (global[gcv] = {}); - - if (coverage[path] && coverage[path].hash === hash) { - return coverage[path]; - } - - coverageData.hash = hash; - return coverage[path] = coverageData; -}(); - -var _ref = (++cov_1eyosjm197.s[0], require('zerorpc')); -var Client = _ref.Client; - -var _ref2 = (++cov_1eyosjm197.s[1], require('events')); -var EventEmitter = _ref2.EventEmitter; - -var awaitify = (++cov_1eyosjm197.s[2], require('apr-awaitify')); - -var DockerComposeClient = function (_EventEmitter) { - inherits(DockerComposeClient, _EventEmitter); - - function DockerComposeClient() { - var _this2 = this; - - var endpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (++cov_1eyosjm197.b[0][0], 'tcp://0.0.0.0:4242'); - classCallCheck(this, DockerComposeClient); - ++cov_1eyosjm197.f[0]; - ++cov_1eyosjm197.s[3]; - - var _this = possibleConstructorReturn(this, (DockerComposeClient.__proto__ || Object.getPrototypeOf(DockerComposeClient)).call(this)); - - ++cov_1eyosjm197.s[4]; - - - _this.client = new Client(); - ++cov_1eyosjm197.s[5]; - _this.client.connect(endpoint); - ++cov_1eyosjm197.s[6]; - _this.client.on('error', function (err) { - newArrowCheck(this, _this2); - ++cov_1eyosjm197.f[1]; - ++cov_1eyosjm197.s[7]; - return _this.emit('error', err); - }.bind(this)); - - ++cov_1eyosjm197.s[8]; - _this._invoke = awaitify(_this._invoke.bind(_this)); - return _this; - } - - // Why isn't client.connect async with error?? - - - createClass(DockerComposeClient, [{ - key: '_invoke', - value: function _invoke(name) { - var _client; - - ++cov_1eyosjm197.f[2]; - ++cov_1eyosjm197.s[9]; - - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return (_client = this.client).invoke.apply(_client, [name].concat(args)); - } - }, { - key: 'close', - value: function close() { - ++cov_1eyosjm197.f[3]; - ++cov_1eyosjm197.s[10]; - - return this.client.close(); - } - }, { - key: 'provision', - value: function provision(_ref3) { - var projectName = _ref3.projectName, - manifest = _ref3.manifest; - ++cov_1eyosjm197.f[4]; - ++cov_1eyosjm197.s[11]; - - // eslint-disable-next-line camelcase - return this._invoke('up', { project_name: projectName }, manifest); - } - }, { - key: 'scale', - value: function scale(_ref4) { - var _this3 = this; - - var projectName = _ref4.projectName, - services = _ref4.services, - manifest = _ref4.manifest; - ++cov_1eyosjm197.f[5]; - ++cov_1eyosjm197.s[12]; - - return this._invoke('scale', { - // eslint-disable-next-line camelcase - project_name: projectName, - services: Object.keys(services).map(function (name) { - newArrowCheck(this, _this3); - ++cov_1eyosjm197.f[6]; - ++cov_1eyosjm197.s[13]; - return { - name: name, - num: services[name] - }; - }.bind(this)) - }, manifest); - } - }]); - return DockerComposeClient; -}(EventEmitter); - -++cov_1eyosjm197.s[14]; - - -module.exports = DockerComposeClient; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB7IENsaWVudCB9ID0gcmVxdWlyZSgnemVyb3JwYycpO1xuY29uc3QgeyBFdmVudEVtaXR0ZXIgfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuY29uc3QgYXdhaXRpZnkgPSByZXF1aXJlKCdhcHItYXdhaXRpZnknKTtcblxuY2xhc3MgRG9ja2VyQ29tcG9zZUNsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50ID0gJ3RjcDovLzAuMC4wLjA6NDI0MicpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgQ2xpZW50KCk7XG4gICAgdGhpcy5jbGllbnQuY29ubmVjdChlbmRwb2ludCk7XG4gICAgdGhpcy5jbGllbnQub24oJ2Vycm9yJywgZXJyID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcblxuICAgIHRoaXMuX2ludm9rZSA9IGF3YWl0aWZ5KHRoaXMuX2ludm9rZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8vIFdoeSBpc24ndCBjbGllbnQuY29ubmVjdCBhc3luYyB3aXRoIGVycm9yPz9cbiAgX2ludm9rZShuYW1lLCAuLi5hcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50Lmludm9rZShuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jbG9zZSgpO1xuICB9XG5cbiAgcHJvdmlzaW9uKHsgcHJvamVjdE5hbWUsIG1hbmlmZXN0IH0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZSgndXAnLCB7IHByb2plY3RfbmFtZTogcHJvamVjdE5hbWUgfSwgbWFuaWZlc3QpO1xuICB9XG5cbiAgc2NhbGUoeyBwcm9qZWN0TmFtZSwgc2VydmljZXMsIG1hbmlmZXN0IH0pIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFxuICAgICAgJ3NjYWxlJyxcbiAgICAgIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuICAgICAgICBwcm9qZWN0X25hbWU6IHByb2plY3ROYW1lLFxuICAgICAgICBzZXJ2aWNlczogT2JqZWN0LmtleXMoc2VydmljZXMpLm1hcChuYW1lID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBudW06IHNlcnZpY2VzW25hbWVdXG4gICAgICAgIH0pKVxuICAgICAgfSxcbiAgICAgIG1hbmlmZXN0XG4gICAgKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IERvY2tlckNvbXBvc2VDbGllbnQ7XG4iXSwibmFtZXMiOlsicmVxdWlyZSIsIkNsaWVudCIsIkV2ZW50RW1pdHRlciIsImF3YWl0aWZ5IiwiRG9ja2VyQ29tcG9zZUNsaWVudCIsImVuZHBvaW50IiwiY2xpZW50IiwiY29ubmVjdCIsIm9uIiwiZW1pdCIsImVyciIsIl9pbnZva2UiLCJiaW5kIiwibmFtZSIsImFyZ3MiLCJpbnZva2UiLCJjbG9zZSIsInByb2plY3ROYW1lIiwibWFuaWZlc3QiLCJwcm9qZWN0X25hbWUiLCJzZXJ2aWNlcyIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O21DQUFtQkEsUUFBUSxTQUFSO0lBQVhDLGNBQUFBOztvQ0FDaUJELFFBQVEsUUFBUjtJQUFqQkUscUJBQUFBOztBQUNSLElBQU1DLG1DQUFXSCxRQUFRLGNBQVIsQ0FBWCxDQUFOOztJQUVNSTs7O2lDQUN5Qzs7O1FBQWpDQyxRQUFpQyxrR0FBdEIsb0JBQXNCOzs7Ozs7Ozs7O1VBR3RDQyxNQUFMLEdBQWMsSUFBSUwsTUFBSixFQUFkOztVQUNLSyxNQUFMLENBQVlDLE9BQVosQ0FBb0JGLFFBQXBCOztVQUNLQyxNQUFMLENBQVlFLEVBQVosQ0FBZSxPQUFmLEVBQXdCLGVBQU87Ozs7bUJBQUtDLElBQUwsQ0FBVSxPQUFWLEVBQW1CQyxHQUFuQjtLQUEvQjs7O1VBRUtDLE9BQUwsR0FBZVIsU0FBUyxNQUFLUSxPQUFMLENBQWFDLElBQWIsT0FBVCxDQUFmOzs7Ozs7Ozs7NEJBSU1DLE1BQWU7Ozs7Ozt3Q0FBTkMsSUFBTTtZQUFBOzs7YUFDZCxnQkFBS1IsTUFBTCxFQUFZUyxNQUFaLGlCQUFtQkYsSUFBbkIsU0FBNEJDLElBQTVCLEVBQVA7Ozs7NEJBR007Ozs7YUFDQyxLQUFLUixNQUFMLENBQVlVLEtBQVosRUFBUDs7OztxQ0FHbUM7VUFBekJDLFdBQXlCLFNBQXpCQSxXQUF5QjtVQUFaQyxRQUFZLFNBQVpBLFFBQVk7Ozs7O2FBRTVCLEtBQUtQLE9BQUwsQ0FBYSxJQUFiLEVBQW1CLEVBQUVRLGNBQWNGLFdBQWhCLEVBQW5CLEVBQWtEQyxRQUFsRCxDQUFQOzs7O2lDQUd5Qzs7O1VBQW5DRCxXQUFtQyxTQUFuQ0EsV0FBbUM7VUFBdEJHLFFBQXNCLFNBQXRCQSxRQUFzQjtVQUFaRixRQUFZLFNBQVpBLFFBQVk7Ozs7YUFDbEMsS0FBS1AsT0FBTCxDQUNMLE9BREssRUFFTDs7c0JBRWdCTSxXQUZoQjtrQkFHWUksT0FBT0MsSUFBUCxDQUFZRixRQUFaLEVBQXNCRyxHQUF0QixDQUEwQixnQkFBUzs7Ozs7c0JBQUE7aUJBRXRDSCxTQUFTUCxJQUFUOztTQUZHO09BTFAsRUFVTEssUUFWSyxDQUFQOzs7O0VBMUI4QmhCOzs7OztBQXlDbENzQixPQUFPQyxPQUFQLEdBQWlCckIsbUJBQWpCIn0= diff --git a/spikes/docker-compose-client/dist/index.umd.js b/spikes/docker-compose-client/dist/index.umd.js deleted file mode 100644 index e001e866..00000000 --- a/spikes/docker-compose-client/dist/index.umd.js +++ /dev/null @@ -1,584 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory() : - typeof define === 'function' && define.amd ? define(factory) : - (factory()); -}(this, (function () { 'use strict'; - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = 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); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - - - - - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - -var newArrowCheck = function (innerThis, boundThis) { - if (innerThis !== boundThis) { - throw new TypeError("Cannot instantiate an arrow function"); - } -}; - - - - - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var cov_1eyosjm197 = function () { - var path = '/Users/ramitos/dev/yld/joyent-portal/spikes/docker-compose-client/src/index.js', - hash = '384e02ed4692c70a8c8d9e69b30064cdb319bdf4', - global = new Function('return this')(), - gcv = '__coverage__', - coverageData = { - path: '/Users/ramitos/dev/yld/joyent-portal/spikes/docker-compose-client/src/index.js', - statementMap: { - '0': { - start: { - line: 1, - column: 19 - }, - end: { - line: 1, - column: 37 - } - }, - '1': { - start: { - line: 2, - column: 25 - }, - end: { - line: 2, - column: 42 - } - }, - '2': { - start: { - line: 3, - column: 17 - }, - end: { - line: 3, - column: 40 - } - }, - '3': { - start: { - line: 7, - column: 4 - }, - end: { - line: 7, - column: 12 - } - }, - '4': { - start: { - line: 9, - column: 4 - }, - end: { - line: 9, - column: 31 - } - }, - '5': { - start: { - line: 10, - column: 4 - }, - end: { - line: 10, - column: 34 - } - }, - '6': { - start: { - line: 11, - column: 4 - }, - end: { - line: 11, - column: 60 - } - }, - '7': { - start: { - line: 11, - column: 35 - }, - end: { - line: 11, - column: 58 - } - }, - '8': { - start: { - line: 13, - column: 4 - }, - end: { - line: 13, - column: 53 - } - }, - '9': { - start: { - line: 18, - column: 4 - }, - end: { - line: 18, - column: 45 - } - }, - '10': { - start: { - line: 22, - column: 4 - }, - end: { - line: 22, - column: 31 - } - }, - '11': { - start: { - line: 27, - column: 4 - }, - end: { - line: 27, - column: 71 - } - }, - '12': { - start: { - line: 31, - column: 4 - }, - end: { - line: 42, - column: 6 - } - }, - '13': { - start: { - line: 36, - column: 53 - }, - end: { - line: 39, - column: 9 - } - }, - '14': { - start: { - line: 46, - column: 0 - }, - end: { - line: 46, - column: 37 - } - } - }, - fnMap: { - '0': { - name: '(anonymous_0)', - decl: { - start: { - line: 6, - column: 2 - }, - end: { - line: 6, - column: 3 - } - }, - loc: { - start: { - line: 6, - column: 47 - }, - end: { - line: 14, - column: 3 - } - }, - line: 6 - }, - '1': { - name: '(anonymous_1)', - decl: { - start: { - line: 11, - column: 28 - }, - end: { - line: 11, - column: 29 - } - }, - loc: { - start: { - line: 11, - column: 35 - }, - end: { - line: 11, - column: 58 - } - }, - line: 11 - }, - '2': { - name: '(anonymous_2)', - decl: { - start: { - line: 17, - column: 2 - }, - end: { - line: 17, - column: 3 - } - }, - loc: { - start: { - line: 17, - column: 25 - }, - end: { - line: 19, - column: 3 - } - }, - line: 17 - }, - '3': { - name: '(anonymous_3)', - decl: { - start: { - line: 21, - column: 2 - }, - end: { - line: 21, - column: 3 - } - }, - loc: { - start: { - line: 21, - column: 10 - }, - end: { - line: 23, - column: 3 - } - }, - line: 21 - }, - '4': { - name: '(anonymous_4)', - decl: { - start: { - line: 25, - column: 2 - }, - end: { - line: 25, - column: 3 - } - }, - loc: { - start: { - line: 25, - column: 39 - }, - end: { - line: 28, - column: 3 - } - }, - line: 25 - }, - '5': { - name: '(anonymous_5)', - decl: { - start: { - line: 30, - column: 2 - }, - end: { - line: 30, - column: 3 - } - }, - loc: { - start: { - line: 30, - column: 45 - }, - end: { - line: 43, - column: 3 - } - }, - line: 30 - }, - '6': { - name: '(anonymous_6)', - decl: { - start: { - line: 36, - column: 44 - }, - end: { - line: 36, - column: 45 - } - }, - loc: { - start: { - line: 36, - column: 53 - }, - end: { - line: 39, - column: 9 - } - }, - line: 36 - } - }, - branchMap: { - '0': { - loc: { - start: { - line: 6, - column: 14 - }, - end: { - line: 6, - column: 45 - } - }, - type: 'default-arg', - locations: [{ - start: { - line: 6, - column: 25 - }, - end: { - line: 6, - column: 45 - } - }], - line: 6 - } - }, - s: { - '0': 0, - '1': 0, - '2': 0, - '3': 0, - '4': 0, - '5': 0, - '6': 0, - '7': 0, - '8': 0, - '9': 0, - '10': 0, - '11': 0, - '12': 0, - '13': 0, - '14': 0 - }, - f: { - '0': 0, - '1': 0, - '2': 0, - '3': 0, - '4': 0, - '5': 0, - '6': 0 - }, - b: { - '0': [0] - }, - _coverageSchema: '332fd63041d2c1bcb487cc26dd0d5f7d97098a6c' - }, - coverage = global[gcv] || (global[gcv] = {}); - - if (coverage[path] && coverage[path].hash === hash) { - return coverage[path]; - } - - coverageData.hash = hash; - return coverage[path] = coverageData; -}(); - -var _ref = (++cov_1eyosjm197.s[0], require('zerorpc')); -var Client = _ref.Client; - -var _ref2 = (++cov_1eyosjm197.s[1], require('events')); -var EventEmitter = _ref2.EventEmitter; - -var awaitify = (++cov_1eyosjm197.s[2], require('apr-awaitify')); - -var DockerComposeClient = function (_EventEmitter) { - inherits(DockerComposeClient, _EventEmitter); - - function DockerComposeClient() { - var _this2 = this; - - var endpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (++cov_1eyosjm197.b[0][0], 'tcp://0.0.0.0:4242'); - classCallCheck(this, DockerComposeClient); - ++cov_1eyosjm197.f[0]; - ++cov_1eyosjm197.s[3]; - - var _this = possibleConstructorReturn(this, (DockerComposeClient.__proto__ || Object.getPrototypeOf(DockerComposeClient)).call(this)); - - ++cov_1eyosjm197.s[4]; - - - _this.client = new Client(); - ++cov_1eyosjm197.s[5]; - _this.client.connect(endpoint); - ++cov_1eyosjm197.s[6]; - _this.client.on('error', function (err) { - newArrowCheck(this, _this2); - ++cov_1eyosjm197.f[1]; - ++cov_1eyosjm197.s[7]; - return _this.emit('error', err); - }.bind(this)); - - ++cov_1eyosjm197.s[8]; - _this._invoke = awaitify(_this._invoke.bind(_this)); - return _this; - } - - // Why isn't client.connect async with error?? - - - createClass(DockerComposeClient, [{ - key: '_invoke', - value: function _invoke(name) { - var _client; - - ++cov_1eyosjm197.f[2]; - ++cov_1eyosjm197.s[9]; - - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - return (_client = this.client).invoke.apply(_client, [name].concat(args)); - } - }, { - key: 'close', - value: function close() { - ++cov_1eyosjm197.f[3]; - ++cov_1eyosjm197.s[10]; - - return this.client.close(); - } - }, { - key: 'provision', - value: function provision(_ref3) { - var projectName = _ref3.projectName, - manifest = _ref3.manifest; - ++cov_1eyosjm197.f[4]; - ++cov_1eyosjm197.s[11]; - - // eslint-disable-next-line camelcase - return this._invoke('up', { project_name: projectName }, manifest); - } - }, { - key: 'scale', - value: function scale(_ref4) { - var _this3 = this; - - var projectName = _ref4.projectName, - services = _ref4.services, - manifest = _ref4.manifest; - ++cov_1eyosjm197.f[5]; - ++cov_1eyosjm197.s[12]; - - return this._invoke('scale', { - // eslint-disable-next-line camelcase - project_name: projectName, - services: Object.keys(services).map(function (name) { - newArrowCheck(this, _this3); - ++cov_1eyosjm197.f[6]; - ++cov_1eyosjm197.s[13]; - return { - name: name, - num: services[name] - }; - }.bind(this)) - }, manifest); - } - }]); - return DockerComposeClient; -}(EventEmitter); - -++cov_1eyosjm197.s[14]; - - -module.exports = DockerComposeClient; - -}))); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBDbGllbnQgfSA9IHJlcXVpcmUoJ3plcm9ycGMnKTtcbmNvbnN0IHsgRXZlbnRFbWl0dGVyIH0gPSByZXF1aXJlKCdldmVudHMnKTtcbmNvbnN0IGF3YWl0aWZ5ID0gcmVxdWlyZSgnYXByLWF3YWl0aWZ5Jyk7XG5cbmNsYXNzIERvY2tlckNvbXBvc2VDbGllbnQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihlbmRwb2ludCA9ICd0Y3A6Ly8wLjAuMC4wOjQyNDInKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY2xpZW50ID0gbmV3IENsaWVudCgpO1xuICAgIHRoaXMuY2xpZW50LmNvbm5lY3QoZW5kcG9pbnQpO1xuICAgIHRoaXMuY2xpZW50Lm9uKCdlcnJvcicsIGVyciA9PiB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKSk7XG5cbiAgICB0aGlzLl9pbnZva2UgPSBhd2FpdGlmeSh0aGlzLl9pbnZva2UuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLyBXaHkgaXNuJ3QgY2xpZW50LmNvbm5lY3QgYXN5bmMgd2l0aCBlcnJvcj8/XG4gIF9pbnZva2UobmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5pbnZva2UobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2xvc2UoKTtcbiAgfVxuXG4gIHByb3Zpc2lvbih7IHByb2plY3ROYW1lLCBtYW5pZmVzdCB9KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuICAgIHJldHVybiB0aGlzLl9pbnZva2UoJ3VwJywgeyBwcm9qZWN0X25hbWU6IHByb2plY3ROYW1lIH0sIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHNjYWxlKHsgcHJvamVjdE5hbWUsIHNlcnZpY2VzLCBtYW5pZmVzdCB9KSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcbiAgICAgICdzY2FsZScsXG4gICAgICB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2VcbiAgICAgICAgcHJvamVjdF9uYW1lOiBwcm9qZWN0TmFtZSxcbiAgICAgICAgc2VydmljZXM6IE9iamVjdC5rZXlzKHNlcnZpY2VzKS5tYXAobmFtZSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgbnVtOiBzZXJ2aWNlc1tuYW1lXVxuICAgICAgICB9KSlcbiAgICAgIH0sXG4gICAgICBtYW5pZmVzdFxuICAgICk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEb2NrZXJDb21wb3NlQ2xpZW50O1xuIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJDbGllbnQiLCJFdmVudEVtaXR0ZXIiLCJhd2FpdGlmeSIsIkRvY2tlckNvbXBvc2VDbGllbnQiLCJlbmRwb2ludCIsImNsaWVudCIsImNvbm5lY3QiLCJvbiIsImVtaXQiLCJlcnIiLCJfaW52b2tlIiwiYmluZCIsIm5hbWUiLCJhcmdzIiwiaW52b2tlIiwiY2xvc2UiLCJwcm9qZWN0TmFtZSIsIm1hbmlmZXN0IiwicHJvamVjdF9uYW1lIiwic2VydmljZXMiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQ0FBbUJBLFFBQVEsU0FBUjtJQUFYQyxjQUFBQTs7b0NBQ2lCRCxRQUFRLFFBQVI7SUFBakJFLHFCQUFBQTs7QUFDUixJQUFNQyxtQ0FBV0gsUUFBUSxjQUFSLENBQVgsQ0FBTjs7SUFFTUk7OztpQ0FDeUM7OztRQUFqQ0MsUUFBaUMsa0dBQXRCLG9CQUFzQjs7Ozs7Ozs7OztVQUd0Q0MsTUFBTCxHQUFjLElBQUlMLE1BQUosRUFBZDs7VUFDS0ssTUFBTCxDQUFZQyxPQUFaLENBQW9CRixRQUFwQjs7VUFDS0MsTUFBTCxDQUFZRSxFQUFaLENBQWUsT0FBZixFQUF3QixlQUFPOzs7O21CQUFLQyxJQUFMLENBQVUsT0FBVixFQUFtQkMsR0FBbkI7S0FBL0I7OztVQUVLQyxPQUFMLEdBQWVSLFNBQVMsTUFBS1EsT0FBTCxDQUFhQyxJQUFiLE9BQVQsQ0FBZjs7Ozs7Ozs7OzRCQUlNQyxNQUFlOzs7Ozs7d0NBQU5DLElBQU07WUFBQTs7O2FBQ2QsZ0JBQUtSLE1BQUwsRUFBWVMsTUFBWixpQkFBbUJGLElBQW5CLFNBQTRCQyxJQUE1QixFQUFQOzs7OzRCQUdNOzs7O2FBQ0MsS0FBS1IsTUFBTCxDQUFZVSxLQUFaLEVBQVA7Ozs7cUNBR21DO1VBQXpCQyxXQUF5QixTQUF6QkEsV0FBeUI7VUFBWkMsUUFBWSxTQUFaQSxRQUFZOzs7OzthQUU1QixLQUFLUCxPQUFMLENBQWEsSUFBYixFQUFtQixFQUFFUSxjQUFjRixXQUFoQixFQUFuQixFQUFrREMsUUFBbEQsQ0FBUDs7OztpQ0FHeUM7OztVQUFuQ0QsV0FBbUMsU0FBbkNBLFdBQW1DO1VBQXRCRyxRQUFzQixTQUF0QkEsUUFBc0I7VUFBWkYsUUFBWSxTQUFaQSxRQUFZOzs7O2FBQ2xDLEtBQUtQLE9BQUwsQ0FDTCxPQURLLEVBRUw7O3NCQUVnQk0sV0FGaEI7a0JBR1lJLE9BQU9DLElBQVAsQ0FBWUYsUUFBWixFQUFzQkcsR0FBdEIsQ0FBMEIsZ0JBQVM7Ozs7O3NCQUFBO2lCQUV0Q0gsU0FBU1AsSUFBVDs7U0FGRztPQUxQLEVBVUxLLFFBVkssQ0FBUDs7OztFQTFCOEJoQjs7Ozs7QUF5Q2xDc0IsT0FBT0MsT0FBUCxHQUFpQnJCLG1CQUFqQjs7In0=