bpm-engine
Version:
Business Process Management Engine for JavaScript
239 lines (188 loc) • 23.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _create = require('babel-runtime/core-js/object/create');
var _create2 = _interopRequireDefault(_create);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _debug = require('../debug');
var _debug2 = _interopRequireDefault(_debug);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const log = (0, _debug2.default)('persist');
const findByProcessId = processId => el => el.processId === processId;
/**
* findByQuery
* @param {*} query
* @returns tokenInstance or null
*/
const findByQuery = query => el => {
let found = true;
(0, _keys2.default)(query).forEach(key => {
if (el[key] !== query[key]) {
found = false;
}
});
return found;
};
const remapPull = (json, tokenInstance) => {
const pull = json.$pull;
let index;
if (pull) {
delete json.$pull;
const key = (0, _keys2.default)(pull)[0];
if (tokenInstance[key]) {
index = tokenInstance[key].indexOf(pull[key]);
}
if (index !== -1) {
tokenInstance[key].splice(index, 1);
}
}
};
const remapSet = json => {
const set = json.$set;
if (set) {
delete json.$set;
}
(0, _assign2.default)(json, set);
};
const createEmptyStore = () => (0, _create2.default)({
processInstances: [],
tokenInstances: [],
workflowDefinitions: [],
timers: [],
tasks: []
});
class MemoryPersist {
constructor({ store = createEmptyStore() } = {}) {
this.processInstance = {
create: json => {
log('create process');
this.store.processInstances.push(json);
return JSON.parse((0, _stringify2.default)(json));
},
find: query => {
log('find process', query);
const processInstance = this.store.processInstances.find(findByProcessId(query.processId));
return JSON.parse((0, _stringify2.default)(processInstance));
},
update: (query, obj) => {
log('update process', query, obj);
const json = JSON.parse((0, _stringify2.default)(obj));
const processInstance = this.store.processInstances.find(findByProcessId(query.processId));
remapSet(json);
(0, _assign2.default)(processInstance, json);
return JSON.parse((0, _stringify2.default)(processInstance));
}
};
this.tokenInstance = {
create: obj => {
log('create token', obj);
this.store.tokenInstances.push(obj);
return JSON.parse((0, _stringify2.default)(obj));
},
find: query => {
log('find token', query);
const tokenInstance = this.store.tokenInstances.find(findByQuery(query));
return tokenInstance && JSON.parse((0, _stringify2.default)(tokenInstance));
},
update: (query, obj) => {
log('update token', query, obj);
const json = JSON.parse((0, _stringify2.default)(obj));
const tokenInstance = this.store.tokenInstances.find(findByQuery(query));
if (!tokenInstance) {
throw new Error(`tokenInstance not found ${query.tokenId}`);
}
remapSet(json);
remapPull(json, tokenInstance);
(0, _assign2.default)(tokenInstance, json);
return JSON.parse((0, _stringify2.default)(tokenInstance));
}
};
this.workflowDefinition = {
create: obj => {
log('create workflowDefinition (deploy)', obj);
this.store.workflowDefinitions.push(obj);
return JSON.parse((0, _stringify2.default)(obj));
},
find: query => {
log('find workflowDefinition', query);
const workflowDefinition = this.store.workflowDefinitions.find(findByQuery(query));
return workflowDefinition && JSON.parse((0, _stringify2.default)(workflowDefinition));
},
update: (query, obj) => {
log('update workflowDefinition', query, obj);
const json = JSON.parse((0, _stringify2.default)(obj));
const workflowDefinition = this.store.timers.find(findByQuery(query));
if (workflowDefinition) {
remapSet(json);
remapPull(json, workflowDefinition);
(0, _assign2.default)(workflowDefinition, json);
return JSON.parse((0, _stringify2.default)(workflowDefinition));
}
}
};
this.timer = {
create: obj => {
log('create timer', obj);
this.store.timers.push(obj);
return JSON.parse((0, _stringify2.default)(obj));
},
find: query => {
log('find timer', query);
const timer = this.store.timers.find(findByQuery(query));
return timer && JSON.parse((0, _stringify2.default)(timer));
},
getNext: time => {
log('find next timer');
const timers = this.store.timers.filter(a => a.status !== 'done').map(a => (0, _assign2.default)(a, { timeLeft: a.time - time })).filter(a => a.timeLeft <= 0).sort((a, b) => a.timeLeft < b.timeLeft);
return timers[0] && JSON.parse((0, _stringify2.default)(timers[0]));
},
update: (query, obj) => {
log('update timer', query, obj);
const json = JSON.parse((0, _stringify2.default)(obj));
const timer = this.store.timers.find(findByQuery(query));
if (timer) {
remapSet(json);
remapPull(json, timer);
(0, _assign2.default)(timer, json);
return JSON.parse((0, _stringify2.default)(timer));
}
}
};
this.task = {
create: obj => {
log('create task', obj);
this.store.tasks.push(obj);
return JSON.parse((0, _stringify2.default)(obj));
},
find: query => {
log('find tasks', query);
return this.store.tasks.find(findByQuery(query));
}
};
this.store = store;
log('creating persistence instance');
if (!this.store.processInstances) {
throw new Error('A store provided to the persisting-layer needs to have a processInstances key-value which will contain a collection of token instances');
}
if (!this.store.tokenInstances) {
throw new Error('A store provided to the persisting-layer needs to have a tokenInstances key-value which will contain a collection of token instances');
}
if (!this.store.workflowDefinitions) {
throw new Error('A store provided to the persisting-layer needs to have a workflowDefinitions key-value which will contain a collection of workflow definitions');
}
if (!this.store.timers) {
throw new Error('A store provided to the persisting-layer needs to have a timers key-value which will contain a collection of timers');
}
if (!this.store.tasks) {
throw new Error('A store provided to the persisting-layer needs to have a tasks key-value which will contain a collection of tasks');
}
}
}
exports.default = MemoryPersist;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZGVmYXVsdHMvTWVtb3J5UGVyc2lzdC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJmaW5kQnlQcm9jZXNzSWQiLCJwcm9jZXNzSWQiLCJlbCIsImZpbmRCeVF1ZXJ5IiwicXVlcnkiLCJmb3VuZCIsImZvckVhY2giLCJrZXkiLCJyZW1hcFB1bGwiLCJqc29uIiwidG9rZW5JbnN0YW5jZSIsInB1bGwiLCIkcHVsbCIsImluZGV4IiwiaW5kZXhPZiIsInNwbGljZSIsInJlbWFwU2V0Iiwic2V0IiwiJHNldCIsImNyZWF0ZUVtcHR5U3RvcmUiLCJwcm9jZXNzSW5zdGFuY2VzIiwidG9rZW5JbnN0YW5jZXMiLCJ3b3JrZmxvd0RlZmluaXRpb25zIiwidGltZXJzIiwidGFza3MiLCJNZW1vcnlQZXJzaXN0IiwiY29uc3RydWN0b3IiLCJzdG9yZSIsInByb2Nlc3NJbnN0YW5jZSIsImNyZWF0ZSIsInB1c2giLCJKU09OIiwicGFyc2UiLCJmaW5kIiwidXBkYXRlIiwib2JqIiwiRXJyb3IiLCJ0b2tlbklkIiwid29ya2Zsb3dEZWZpbml0aW9uIiwidGltZXIiLCJnZXROZXh0IiwidGltZSIsImZpbHRlciIsImEiLCJzdGF0dXMiLCJtYXAiLCJ0aW1lTGVmdCIsInNvcnQiLCJiIiwidGFzayJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7QUFFQSxNQUFNQSxNQUFNLHFCQUFNLFNBQU4sQ0FBWjs7QUFFQSxNQUFNQyxrQkFBa0JDLGFBQWFDLE1BQU1BLEdBQUdELFNBQUgsS0FBaUJBLFNBQTVEOztBQUVBOzs7OztBQUtBLE1BQU1FLGNBQWNDLFNBQVVGLEVBQUQsSUFBUTtBQUNuQyxNQUFJRyxRQUFRLElBQVo7O0FBRUEsc0JBQVlELEtBQVosRUFBbUJFLE9BQW5CLENBQTRCQyxHQUFELElBQVM7QUFDbEMsUUFBSUwsR0FBR0ssR0FBSCxNQUFZSCxNQUFNRyxHQUFOLENBQWhCLEVBQTRCO0FBQzFCRixjQUFR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O0FBQ0xwQixjQUFTTSxHQUFELElBQVM7QUFDZnBDLFlBQUksYUFBSixFQUFtQm9DLEdBQW5CO0FBQ0EsYUFBS1IsS0FBTCxDQUFXSCxLQUFYLENBQWlCTSxJQUFqQixDQUFzQkssR0FBdEI7QUFDQSxlQUFPSixLQUFLQyxLQUFMLENBQVcseUJBQWVHLEdBQWYsQ0FBWCxDQUFQO0FBQ0QsT0FMSTs7QUFPTEYsWUFBTzdCLEtBQUQsSUFBVztBQUNmTCxZQUFJLFlBQUosRUFBa0JLLEtBQWxCO0FBQ0EsZUFBTyxLQUFLdUIsS0FBTCxDQUFXSCxLQUFYLENBQWlCUyxJQUFqQixDQUFzQjlCLFlBQVlDLEtBQVosQ0FBdEIsQ0FBUDtBQUNEO0FBVkksS0F0SjBDOztBQUMvQyxTQUFLdUIsS0FBTCxHQUFhQSxLQUFiOztBQUVBNUIsUUFBSSwrQkFBSjs7QUFFQSxRQUFJLENBQUMsS0FBSzRCLEtBQUwsQ0FBV1AsZ0JBQWhCLEVBQWtDO0FBQ2hDLFlBQU0sSUFBSWdCLEtBQUosQ0FBVSx3SUFBVixDQUFOO0FBQ0Q7QUFDRCxRQUFJLENBQUMsS0FBS1QsS0FBTCxDQUFXTixjQUFoQixFQUFnQztBQUM5QixZQUFNLElBQUllLEtBQUosQ0FBVSxzSUFBVixDQUFOO0FBQ0Q7QUFDRCxRQUFJLENBQUMsS0FBS1QsS0FBTCxDQUFXTCxtQkFBaEIsRUFBcUM7QUFDbkMsWUFBTSxJQUFJYyxLQUFKLENBQVUsZ0pBQVYsQ0FBTjtBQUNEO0FBQ0QsUUFBSSxDQUFDLEtBQUtULEtBQUwsQ0FBV0osTUFBaEIsRUFBd0I7QUFDdEIsWUFBTSxJQUFJYSxLQUFKLENBQVUscUhBQVYsQ0FBTjtBQUNEO0FBQ0QsUUFBSSxDQUFDLEtBQUtULEtBQUwsQ0FBV0gsS0FBaEIsRUFBdUI7QUFDckIsWUFBTSxJQUFJWSxLQUFKLENBQVUsbUhBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBckJnQztrQkFBZFgsYSIsImZpbGUiOiJNZW1vcnlQZXJzaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlYnVnIGZyb20gJ2xpYi9kZWJ1Zyc7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdwZXJzaXN0Jyk7XG5cbmNvbnN0IGZpbmRCeVByb2Nlc3NJZCA9IHByb2Nlc3NJZCA9PiBlbCA9PiBlbC5wcm9jZXNzSWQgPT09IHByb2Nlc3NJZDtcblxuLyoqXG4gKiBmaW5kQnlRdWVyeVxuICogQHBhcmFtIHsqfSBxdWVyeVxuICogQHJldHVybnMgdG9rZW5JbnN0YW5jZSBvciBudWxsXG4gKi9cbmNvbnN0IGZpbmRCeVF1ZXJ5ID0gcXVlcnkgPT4gKGVsKSA9PiB7XG4gIGxldCBmb3VuZCA9IHRydWU7XG5cbiAgT2JqZWN0LmtleXMocXVlcnkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmIChlbFtrZXldICE9PSBxdWVyeVtrZXldKSB7XG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGZvdW5kO1xufTtcblxuY29uc3QgcmVtYXBQdWxsID0gKGpzb24sIHRva2VuSW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcHVsbCA9IGpzb24uJHB1bGw7XG4gIGxldCBpbmRleDtcbiAgaWYgKHB1bGwpIHtcbiAgICBkZWxldGUganNvbi4kcHVsbDtcbiAgICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhwdWxsKVswXTtcbiAgICBpZiAodG9rZW5JbnN0YW5jZVtrZXldKSB7XG4gICAgICBpbmRleCA9IHRva2VuSW5zdGFuY2Vba2V5XS5pbmRleE9mKHB1bGxba2V5XSk7XG4gICAgfVxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRva2VuSW5zdGFuY2Vba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcmVtYXBTZXQgPSAoanNvbikgPT4ge1xuICBjb25zdCBzZXQgPSBqc29uLiRzZXQ7XG4gIGlmIChzZXQpIHtcbiAgICBkZWxldGUganNvbi4kc2V0O1xuICB9XG4gIE9iamVjdC5hc3NpZ24oanNvbiwgc2V0KTtcbn07XG5cbmNvbnN0IGNyZWF0ZUVtcHR5U3RvcmUgPSAoKSA9PlxuICBPYmplY3QuY3JlYXRlKHtcbiAgICBwcm9jZXNzSW5zdGFuY2VzOiBbXSxcbiAgICB0b2tlbkluc3RhbmNlczogW10sXG4gICAgd29ya2Zsb3dEZWZpbml0aW9uczogW10sXG4gICAgdGltZXJzOiBbXSxcbiAgICB0YXNrczogW10sXG4gIH0pO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZW1vcnlQZXJzaXN0IHtcbiAgY29uc3RydWN0b3IoeyBzdG9yZSA9IGNyZWF0ZUVtcHR5U3RvcmUoKSB9ID0ge30pIHtcbiAgICB0aGlzLnN0b3JlID0gc3RvcmU7XG5cbiAgICBsb2coJ2NyZWF0aW5nIHBlcnNpc3RlbmNlIGluc3RhbmNlJyk7XG5cbiAgICBpZiAoIXRoaXMuc3RvcmUucHJvY2Vzc0luc3RhbmNlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHN0b3JlIHByb3ZpZGVkIHRvIHRoZSBwZXJzaXN0aW5nLWxheWVyIG5lZWRzIHRvIGhhdmUgYSBwcm9jZXNzSW5zdGFuY2VzIGtleS12YWx1ZSB3aGljaCB3aWxsIGNvbnRhaW4gYSBjb2xsZWN0aW9uIG9mIHRva2VuIGluc3RhbmNlcycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc3RvcmUudG9rZW5JbnN0YW5jZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdG9yZSBwcm92aWRlZCB0byB0aGUgcGVyc2lzdGluZy1sYXllciBuZWVkcyB0byBoYXZlIGEgdG9rZW5JbnN0YW5jZXMga2V5LXZhbHVlIHdoaWNoIHdpbGwgY29udGFpbiBhIGNvbGxlY3Rpb24gb2YgdG9rZW4gaW5zdGFuY2VzJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdG9yZS53b3JrZmxvd0RlZmluaXRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Egc3RvcmUgcHJvdmlkZWQgdG8gdGhlIHBlcnNpc3RpbmctbGF5ZXIgbmVlZHMgdG8gaGF2ZSBhIHdvcmtmbG93RGVmaW5pdGlvbnMga2V5LXZhbHVlIHdoaWNoIHdpbGwgY29udGFpbiBhIGNvbGxlY3Rpb24gb2Ygd29ya2Zsb3cgZGVmaW5pdGlvbnMnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN0b3JlLnRpbWVycykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHN0b3JlIHByb3ZpZGVkIHRvIHRoZSBwZXJzaXN0aW5nLWxheWVyIG5lZWRzIHRvIGhhdmUgYSB0aW1lcnMga2V5LXZhbHVlIHdoaWNoIHdpbGwgY29udGFpbiBhIGNvbGxlY3Rpb24gb2YgdGltZXJzJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdG9yZS50YXNrcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHN0b3JlIHByb3ZpZGVkIHRvIHRoZSBwZXJzaXN0aW5nLWxheWVyIG5lZWRzIHRvIGhhdmUgYSB0YXNrcyBrZXktdmFsdWUgd2hpY2ggd2lsbCBjb250YWluIGEgY29sbGVjdGlvbiBvZiB0YXNrcycpO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NJbnN0YW5jZSA9IHtcbiAgICBjcmVhdGU6IChqc29uKSA9PiB7XG4gICAgICBsb2coJ2NyZWF0ZSBwcm9jZXNzJyk7XG4gICAgICB0aGlzLnN0b3JlLnByb2Nlc3NJbnN0YW5jZXMucHVzaChqc29uKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGpzb24pKTtcbiAgICB9LFxuXG4gICAgZmluZDogKHF1ZXJ5KSA9PiB7XG4gICAgICBsb2coJ2ZpbmQgcHJvY2VzcycsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHByb2Nlc3NJbnN0YW5jZSA9IHRoaXMuc3RvcmUucHJvY2Vzc0luc3RhbmNlcy5maW5kKGZpbmRCeVByb2Nlc3NJZChxdWVyeS5wcm9jZXNzSWQpKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb2Nlc3NJbnN0YW5jZSkpO1xuICAgIH0sXG5cbiAgICB1cGRhdGU6IChxdWVyeSwgb2JqKSA9PiB7XG4gICAgICBsb2coJ3VwZGF0ZSBwcm9jZXNzJywgcXVlcnksIG9iaik7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcblxuICAgICAgY29uc3QgcHJvY2Vzc0luc3RhbmNlID0gdGhpcy5zdG9yZS5wcm9jZXNzSW5zdGFuY2VzLmZpbmQoZmluZEJ5UHJvY2Vzc0lkKHF1ZXJ5LnByb2Nlc3NJZCkpO1xuICAgICAgcmVtYXBTZXQoanNvbik7XG4gICAgICBPYmplY3QuYXNzaWduKHByb2Nlc3NJbnN0YW5jZSwganNvbik7XG5cbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb2Nlc3NJbnN0YW5jZSkpO1xuICAgIH0sXG4gIH07XG5cbiAgdG9rZW5JbnN0YW5jZSA9IHtcbiAgICBjcmVhdGU6IChvYmopID0+IHtcbiAgICAgIGxvZygnY3JlYXRlIHRva2VuJywgb2JqKTtcbiAgICAgIHRoaXMuc3RvcmUudG9rZW5JbnN0YW5jZXMucHVzaChvYmopO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gICAgfSxcblxuICAgIGZpbmQ6IChxdWVyeSkgPT4ge1xuICAgICAgbG9nKCdmaW5kIHRva2VuJywgcXVlcnkpO1xuICAgICAgY29uc3QgdG9rZW5JbnN0YW5jZSA9IHRoaXMuc3RvcmUudG9rZW5JbnN0YW5jZXMuZmluZChmaW5kQnlRdWVyeShxdWVyeSkpO1xuICAgICAgcmV0dXJuIHRva2VuSW5zdGFuY2UgJiYgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0b2tlbkluc3RhbmNlKSk7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogKHF1ZXJ5LCBvYmopID0+IHtcbiAgICAgIGxvZygndXBkYXRlIHRva2VuJywgcXVlcnksIG9iaik7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcblxuICAgICAgY29uc3QgdG9rZW5JbnN0YW5jZSA9IHRoaXMuc3RvcmUudG9rZW5JbnN0YW5jZXMuZmluZChmaW5kQnlRdWVyeShxdWVyeSkpO1xuXG4gICAgICBpZiAoIXRva2VuSW5zdGFuY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbkluc3RhbmNlIG5vdCBmb3VuZCAke3F1ZXJ5LnRva2VuSWR9YCk7XG4gICAgICB9XG5cbiAgICAgIHJlbWFwU2V0KGpzb24pO1xuICAgICAgcmVtYXBQdWxsKGpzb24sIHRva2VuSW5zdGFuY2UpO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHRva2VuSW5zdGFuY2UsIGpzb24pO1xuXG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0b2tlbkluc3RhbmNlKSk7XG4gICAgfSxcbiAgfTtcblxuICB3b3JrZmxvd0RlZmluaXRpb24gPSB7XG4gICAgY3JlYXRlOiAob2JqKSA9PiB7XG4gICAgICBsb2coJ2NyZWF0ZSB3b3JrZmxvd0RlZmluaXRpb24gKGRlcGxveSknLCBvYmopO1xuICAgICAgdGhpcy5zdG9yZS53b3JrZmxvd0RlZmluaXRpb25zLnB1c2gob2JqKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuICAgIH0sXG5cbiAgICBmaW5kOiAocXVlcnkpID0+IHtcbiAgICAgIGxvZygnZmluZCB3b3JrZmxvd0RlZmluaXRpb24nLCBxdWVyeSk7XG4gICAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb24gPSB0aGlzLnN0b3JlLndvcmtmbG93RGVmaW5pdGlvbnMuZmluZChmaW5kQnlRdWVyeShxdWVyeSkpO1xuICAgICAgcmV0dXJuIHdvcmtmbG93RGVmaW5pdGlvbiAmJiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHdvcmtmbG93RGVmaW5pdGlvbikpO1xuICAgIH0sXG5cbiAgICB1cGRhdGU6IChxdWVyeSwgb2JqKSA9PiB7XG4gICAgICBsb2coJ3VwZGF0ZSB3b3JrZmxvd0RlZmluaXRpb24nLCBxdWVyeSwgb2JqKTtcbiAgICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xuXG4gICAgICBjb25zdCB3b3JrZmxvd0RlZmluaXRpb24gPSB0aGlzLnN0b3JlLnRpbWVycy5maW5kKGZpbmRCeVF1ZXJ5KHF1ZXJ5KSk7XG5cbiAgICAgIGlmICh3b3JrZmxvd0RlZmluaXRpb24pIHtcbiAgICAgICAgcmVtYXBTZXQoanNvbik7XG4gICAgICAgIHJlbWFwUHVsbChqc29uLCB3b3JrZmxvd0RlZmluaXRpb24pO1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24od29ya2Zsb3dEZWZpbml0aW9uLCBqc29uKTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh3b3JrZmxvd0RlZmluaXRpb24pKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIHRpbWVyID0ge1xuICAgIGNyZWF0ZTogKG9iaikgPT4ge1xuICAgICAgbG9nKCdjcmVhdGUgdGltZXInLCBvYmopO1xuICAgICAgdGhpcy5zdG9yZS50aW1lcnMucHVzaChvYmopO1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG4gICAgfSxcblxuICAgIGZpbmQ6IChxdWVyeSkgPT4ge1xuICAgICAgbG9nKCdmaW5kIHRpbWVyJywgcXVlcnkpO1xuICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnN0b3JlLnRpbWVycy5maW5kKGZpbmRCeVF1ZXJ5KHF1ZXJ5KSk7XG4gICAgICByZXR1cm4gdGltZXIgJiYgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aW1lcikpO1xuICAgIH0sXG5cbiAgICBnZXROZXh0OiAodGltZSkgPT4ge1xuICAgICAgbG9nKCdmaW5kIG5leHQgdGltZXInKTtcbiAgICAgIGNvbnN0IHRpbWVycyA9IHRoaXMuc3RvcmUudGltZXJzXG4gICAgICAgIC5maWx0ZXIoYSA9PiBhLnN0YXR1cyAhPT0gJ2RvbmUnKVxuICAgICAgICAubWFwKGEgPT4gT2JqZWN0LmFzc2lnbihhLCB7IHRpbWVMZWZ0OiBhLnRpbWUgLSB0aW1lIH0pKVxuICAgICAgICAuZmlsdGVyKGEgPT4gYS50aW1lTGVmdCA8PSAwKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50aW1lTGVmdCA8IGIudGltZUxlZnQpO1xuXG4gICAgICByZXR1cm4gdGltZXJzWzBdICYmIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGltZXJzWzBdKSk7XG4gICAgfSxcblxuICAgIHVwZGF0ZTogKHF1ZXJ5LCBvYmopID0+IHtcbiAgICAgIGxvZygndXBkYXRlIHRpbWVyJywgcXVlcnksIG9iaik7XG4gICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcblxuICAgICAgY29uc3QgdGltZXIgPSB0aGlzLnN0b3JlLnRpbWVycy5maW5kKGZpbmRCeVF1ZXJ5KHF1ZXJ5KSk7XG5cbiAgICAgIGlmICh0aW1lcikge1xuICAgICAgICByZW1hcFNldChqc29uKTtcbiAgICAgICAgcmVtYXBQdWxsKGpzb24sIHRpbWVyKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRpbWVyLCBqc29uKTtcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aW1lcikpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgdGFzayA9IHtcbiAgICBjcmVhdGU6IChvYmopID0+IHtcbiAgICAgIGxvZygnY3JlYXRlIHRhc2snLCBvYmopO1xuICAgICAgdGhpcy5zdG9yZS50YXNrcy5wdXNoKG9iaik7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICB9LFxuXG4gICAgZmluZDogKHF1ZXJ5KSA9PiB7XG4gICAgICBsb2coJ2ZpbmQgdGFza3MnLCBxdWVyeSk7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yZS50YXNrcy5maW5kKGZpbmRCeVF1ZXJ5KHF1ZXJ5KSk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==