UNPKG

pretur.sync

Version:

Front-end back-end communication infrastructure

271 lines 32.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); function buildResponder(options) { var errorToBundle = options.errorToBundle, pool = options.pool, operator = options.operator, validator = options.validator, transact = options.transact; return function responder(requests, context) { return tslib_1.__awaiter(this, void 0, void 0, function () { var responses, _i, requests_1, request, requestId, _a, tr, _b, data, count, error_1, error_2, _c, _d, error_3, error, transaction, _e, generatedIds, errors, error_4, batch, e, _f, _g, _h, action, id, type, failed, failReasons, batchTr, _j, _k, reqItem, action, type, itemId, _l, generatedIds, errors, error_5, error_6, _m, _o, resItem, _p, _q, error_7; return tslib_1.__generator(this, function (_r) { switch (_r.label) { case 0: if (!Array.isArray(requests) || requests.length === 0) { return [2 /*return*/, []]; } responses = []; _i = 0, requests_1 = requests; _r.label = 1; case 1: if (!(_i < requests_1.length)) return [3 /*break*/, 46]; request = requests_1[_i]; requestId = request.requestId; _a = request.type; switch (_a) { case 'select': return [3 /*break*/, 2]; case 'operate': return [3 /*break*/, 10]; case 'mutate': return [3 /*break*/, 14]; case 'batchMutate': return [3 /*break*/, 25]; case 'validate': return [3 /*break*/, 41]; } return [3 /*break*/, 45]; case 2: _r.trys.push([2, 8, , 9]); if (!transact || !pool) { throw new Error('select requests require transact and pool to operate.'); } return [4 /*yield*/, transact()]; case 3: tr = _r.sent(); _r.label = 4; case 4: _r.trys.push([4, 6, , 7]); return [4 /*yield*/, pool.resolve(tr, request.scope, request.model, request.query, context)]; case 5: _b = _r.sent(), data = _b.data, count = _b.count; tr.commit(); responses.push({ errors: [], count: count, data: data, requestId: requestId, type: 'select' }); return [3 /*break*/, 7]; case 6: error_1 = _r.sent(); responses.push({ errors: [errorToBundle(error_1)], count: 0, data: [], requestId: requestId, type: 'select', }); tr.rollback(); return [3 /*break*/, 7]; case 7: return [3 /*break*/, 9]; case 8: error_2 = _r.sent(); responses.push({ count: 0, data: [], errors: [errorToBundle(error_2)], requestId: requestId, type: 'select', }); return [3 /*break*/, 9]; case 9: return [3 /*break*/, 45]; case 10: _r.trys.push([10, 12, , 13]); if (!operator) { throw new Error('operate requests require an operator.'); } _d = (_c = responses).push; return [4 /*yield*/, operator(request, context)]; case 11: _d.apply(_c, [_r.sent()]); return [3 /*break*/, 13]; case 12: error_3 = _r.sent(); responses.push({ errors: [errorToBundle(error_3)], name: request.name, requestId: requestId, type: 'operate', }); return [3 /*break*/, 13]; case 13: return [3 /*break*/, 45]; case 14: if (!transact || !pool) { error = new Error('mutate requests require both transact and pool.'); responses.push({ action: request.action, errors: [errorToBundle(error)], requestId: requestId, type: request.type, }); return [3 /*break*/, 45]; } return [4 /*yield*/, transact()]; case 15: transaction = _r.sent(); _r.label = 16; case 16: _r.trys.push([16, 22, , 24]); return [4 /*yield*/, pool.sync(transaction, request, context)]; case 17: _e = _r.sent(), generatedIds = _e.generatedIds, errors = _e.errors; if (!(errors.length > 0)) return [3 /*break*/, 19]; return [4 /*yield*/, transaction.rollback()]; case 18: _r.sent(); responses.push({ action: request.action, errors: errors, requestId: requestId, type: request.type, }); return [3 /*break*/, 21]; case 19: return [4 /*yield*/, transaction.commit()]; case 20: _r.sent(); responses.push({ action: request.action, errors: [], generatedIds: generatedIds, requestId: requestId, type: request.type, }); _r.label = 21; case 21: return [3 /*break*/, 24]; case 22: error_4 = _r.sent(); return [4 /*yield*/, transaction.rollback()]; case 23: _r.sent(); responses.push({ action: request.action, errors: [errorToBundle(error_4)], requestId: requestId, type: request.type, }); return [3 /*break*/, 24]; case 24: return [3 /*break*/, 45]; case 25: batch = { errors: [], queue: [], requestId: requestId, type: request.type, }; if (!transact || !pool) { e = [errorToBundle(new Error('mutate requests require both transact and pool.'))]; for (_f = 0, _g = request.queue; _f < _g.length; _f++) { _h = _g[_f], action = _h.action, id = _h.requestId, type = _h.type; batch.queue.push({ action: action, errors: e, requestId: id, type: type }); } responses.push(tslib_1.__assign({}, batch, { errors: e })); return [3 /*break*/, 45]; } failed = false; failReasons = []; return [4 /*yield*/, transact()]; case 26: batchTr = _r.sent(); _r.label = 27; case 27: _r.trys.push([27, 36, , 38]); _j = 0, _k = request.queue; _r.label = 28; case 28: if (!(_j < _k.length)) return [3 /*break*/, 35]; reqItem = _k[_j]; action = reqItem.action, type = reqItem.type, itemId = reqItem.requestId; if (!!failed) return [3 /*break*/, 33]; _r.label = 29; case 29: _r.trys.push([29, 31, , 32]); return [4 /*yield*/, pool.sync(batchTr, reqItem, context)]; case 30: _l = _r.sent(), generatedIds = _l.generatedIds, errors = _l.errors; if (errors.length > 0) { failed = true; failReasons = errors; batchTr.rollback(); batch.queue.push({ action: action, type: type, requestId: itemId, errors: errors }); } else { batch.queue.push({ action: action, errors: errors, generatedIds: generatedIds, requestId: itemId, type: type, }); } return [3 /*break*/, 32]; case 31: error_5 = _r.sent(); failed = true; failReasons = [errorToBundle(error_5)]; batchTr.rollback(); batch.queue.push({ action: action, errors: failReasons, requestId: itemId, type: type }); return [3 /*break*/, 32]; case 32: return [3 /*break*/, 34]; case 33: batch.queue.push({ action: reqItem.action, errors: failReasons, requestId: reqItem.requestId, type: reqItem.type, }); _r.label = 34; case 34: _j++; return [3 /*break*/, 28]; case 35: return [3 /*break*/, 38]; case 36: error_6 = _r.sent(); return [4 /*yield*/, batchTr.rollback()]; case 37: _r.sent(); for (_m = 0, _o = batch.queue; _m < _o.length; _m++) { resItem = _o[_m]; resItem.errors = resItem.errors ? resItem.errors.concat([errorToBundle(error_6)]) : [errorToBundle(error_6)]; } failed = true; return [3 /*break*/, 38]; case 38: if (!!failed) return [3 /*break*/, 40]; return [4 /*yield*/, batchTr.commit()]; case 39: _r.sent(); _r.label = 40; case 40: responses.push(batch); return [3 /*break*/, 45]; case 41: _r.trys.push([41, 43, , 44]); if (!validator) { throw new Error('validate requests require a validator.'); } _q = (_p = responses).push; return [4 /*yield*/, validator(request, context)]; case 42: _q.apply(_p, [_r.sent()]); return [3 /*break*/, 44]; case 43: error_7 = _r.sent(); responses.push({ errors: [errorToBundle(error_7)], name: request.name, requestId: requestId, type: 'validate', }); return [3 /*break*/, 44]; case 44: return [3 /*break*/, 45]; case 45: _i++; return [3 /*break*/, 1]; case 46: return [2 /*return*/, responses]; } }); }); }; } exports.buildResponder = buildResponder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Jlc3BvbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUErQ0Esd0JBQWtDLE9BQTRCO0lBQ3BELElBQUEscUNBQWEsRUFBRSxtQkFBSSxFQUFFLDJCQUFRLEVBQUUsNkJBQVMsRUFBRSwyQkFBUSxDQUFhO0lBRXZFLE1BQU0sQ0FBQyxtQkFBeUIsUUFBbUIsRUFBRSxPQUFhOzs7Ozs7d0JBQ2hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3RELE1BQU0sZ0JBQUMsRUFBRSxFQUFDO3dCQUNaLENBQUM7d0JBRUssU0FBUyxHQUFlLEVBQUUsQ0FBQzs4QkFFSCxFQUFSLHFCQUFROzs7NkJBQVIsQ0FBQSxzQkFBUSxDQUFBO3dCQUFuQixPQUFPO3dCQUNWLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO3dCQUU1QixLQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUE7O2lDQUNiLFFBQVEsRUFBUixNQUFNLGtCQUFFO2lDQXFDUixTQUFTLEVBQVQsTUFBTSxtQkFBRztpQ0FlVCxRQUFRLEVBQVIsTUFBTSxtQkFBRTtpQ0EyQ1IsYUFBYSxFQUFiLE1BQU0sbUJBQU87aUNBMEViLFVBQVUsRUFBVixNQUFNLG1CQUFJOzs7Ozt3QkF2S1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDOzRCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7d0JBQzNFLENBQUM7d0JBQ1UscUJBQU0sUUFBUSxFQUFFLEVBQUE7O3dCQUFyQixFQUFFLEdBQUcsU0FBZ0I7Ozs7d0JBRUQscUJBQU0sSUFBSSxDQUFDLE9BQU8sQ0FDeEMsRUFBRSxFQUNGLE9BQU8sQ0FBQyxLQUFL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QUNULHFCQUFNLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBQTs7d0JBQXRCLFNBQXNCLENBQUM7Ozt3QkFHekIsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdEIseUJBQU07Ozt3QkFHSixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO3dCQUM1RCxDQUFDO3dCQUNELEtBQUEsQ0FBQSxLQUFBLFNBQVMsQ0FBQSxDQUFDLElBQUksQ0FBQTt3QkFBQyxxQkFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFBOzt3QkFBaEQsY0FBZSxTQUFpQyxFQUFDLENBQUM7Ozs7d0JBRWxELFNBQVMsQ0FBQyxJQUFJLENBQUM7NEJBQ2IsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQUssQ0FBQyxDQUFDOzRCQUM5QixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7NEJBQ2xCLFNBQVMsV0FBQTs0QkFDVCxJQUFJLEVBQUUsVUFBVTt5QkFDakIsQ0FBQyxDQUFDOzs2QkFFTCx5QkFBTTs7d0JBM0xVLElBQVEsQ0FBQTs7NkJBK0w5QixzQkFBTyxTQUFTLEVBQUM7Ozs7S0FDbEIsQ0FBQztBQUNKLENBQUM7QUEzTUQsd0NBMk1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW1wdHlTcGVjIH0gZnJvbSAncHJldHVyLnNwZWMnO1xyXG5pbXBvcnQgeyBCdW5kbGUgfSBmcm9tICdwcmV0dXIuaTE4bic7XHJcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XHJcbmltcG9ydCB7IFJlcXVlc3QsIE9wZXJhdGVSZXF1ZXN0LCBWYWxpZGF0ZVJlcXVlc3QsIE11dGF0ZVJlcXVlc3QgfSBmcm9tICcuL3JlcXVlc3QnO1xyXG5pbXBvcnQge1xyXG4gIFJlc3BvbnNlLCBPcGVyYXRlUmVzcG9uc2UsIFZhbGlkYXRlUmVzcG9uc2UsIE11dGF0ZVJlc3BvbnNlLCBCYXRjaE11dGF0ZVJlc3BvbnNlLFxyXG59IGZyb20gJy4vcmVzcG9uc2UnO1xyXG5cclxuLy8gTWFudWFsbHkgaW1wb3J0IHNvbWUgdHlwZXMgdG8gZGVjb3VwbGUgdGhlIGxpYnJhcmlyZXNcclxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkxpa2Uge1xyXG4gIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+O1xyXG4gIHJvbGxiYWNrKCk6IFByb21pc2U8dm9pZD47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZVJlc3VsdCB7XHJcbiAgZGF0YTogYW55W107XHJcbiAgY291bnQ6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTeW5jUmVzdWx0IHtcclxuICBlcnJvcnM6IEJ1bmRsZVtdO1xyXG4gIGdlbmVyYXRlZElkcz86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQb29sTGlrZTxDPiB7XHJcbiAgcmVzb2x2ZShcclxuICAgIHRyYW5zYWN0aW9uOiBhbnksXHJcbiAgICBzY29wZTogc3RyaW5nLFxyXG4gICAgbW9kZWw6IHN0cmluZyxcclxuICAgIHF1ZXJ5OiBRdWVyeTxFbXB0eVNwZWM+LFxyXG4gICAgY29udGV4dD86IEMsXHJcbiAgKTogUHJvbWlzZTxSZXNvbHZlUmVzdWx0PjtcclxuICBzeW5jKFxyXG4gICAgdHJhbnNhY3Rpb246IGFueSxcclxuICAgIGl0ZW06IE11dGF0ZVJlcXVlc3QsXHJcbiAgICBjb250ZXh0PzogQyxcclxuICApOiBQcm9taXNlPFN5bmNSZXN1bHQ+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbmRlck9wdGlvbnM8Qz4ge1xyXG4gIGVycm9yVG9CdW5kbGU6IChlcnJvcjogRXJyb3IpID0+IEJ1bmRsZTtcclxuICBwb29sPzogUG9vbExpa2U8Qz47XHJcbiAgb3BlcmF0b3I/OiAocmVxdWVzdDogT3BlcmF0ZVJlcXVlc3QsIGNvbnRleHQ/OiBDKSA9PiBQcm9taXNlTGlrZTxPcGVyYXRlUmVzcG9uc2U+O1xyXG4gIHZhbGlkYXRvcj86IChyZXF1ZXN0OiBWYWxpZGF0ZVJlcXVlc3QsIGNvbnRleHQ/OiBDKSA9PiBQcm9taXNlTGlrZTxWYWxpZGF0ZVJlc3BvbnNlPjtcclxuICB0cmFuc2FjdD86ICgpID0+IFByb21pc2VMaWtlPFRyYW5zYWN0aW9uTGlrZT47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJlc3BvbmRlcjxDPihvcHRpb25zOiBSZXNwb25kZXJPcHRpb25zPEM+KSB7XHJcbiAgY29uc3QgeyBlcnJvclRvQnVuZGxlLCBwb29sLCBvcGVyYXRvciwgdmFsaWRhdG9yLCB0cmFuc2FjdCB9ID0gb3B0aW9ucztcclxuXHJcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlc3BvbmRlcihyZXF1ZXN0czogUmVxdWVzdFtdLCBjb250ZXh0PzogYW55KTogUHJvbWlzZTxSZXNwb25zZVtdPiB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVxdWVzdHMpIHx8IHJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2VzOiBSZXNwb25zZVtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlcXVlc3QucmVxdWVzdElkO1xyXG5cclxuICAgICAgc3dpdGNoIChyZXF1ZXN0LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzZWxlY3QnOlxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCF0cmFuc2FjdCB8fCAhcG9vbCkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2VsZWN0IHJlcXVlc3RzIHJlcXVpcmUgdHJhbnNhY3QgYW5kIHBvb2wgdG8gb3BlcmF0ZS4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB0ciA9IGF3YWl0IHRyYW5zYWN0KCk7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhLCBjb3VudCB9ID0gYXdhaXQgcG9vbC5yZXNvbHZlKFxyXG4gICAgICAgICAgICAgICAgdHIsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnNjb3BlLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdC5tb2RlbCxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3QucXVlcnksXHJcbiAgICAgICAgICAgICAgICBjb250ZXh0LFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgdHIuY29tbWl0KCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goeyBlcnJvcnM6IFtdLCBjb3VudCwgZGF0YSwgcmVxdWVzdElkLCB0eXBlOiAnc2VsZWN0JyB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgICAgY291bnQ6IDAsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBjb3VudDogMCxcclxuICAgICAgICAgICAgICBkYXRhOiBbXSxcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgIHR5cGU6ICdzZWxlY3QnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ29wZXJhdGUnOlxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFvcGVyYXRvcikge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0ZSByZXF1ZXN0cyByZXF1aXJlIGFuIG9wZXJhdG9yLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGF3YWl0IG9wZXJhdG9yKHJlcXVlc3QsIGNvbnRleHQpKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgbmFtZTogcmVxdWVzdC5uYW1lLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICB0eXBlOiAnb3BlcmF0ZScsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbXV0YXRlJzpcclxuICAgICAgICAgIGlmICghdHJhbnNhY3QgfHwgIXBvb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ211dGF0ZSByZXF1ZXN0cyByZXF1aXJlIGJvdGggdHJhbnNhY3QgYW5kIHBvb2wuJyk7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKDxNdXRhdGVSZXNwb25zZT57XHJcbiAgICAgICAgICAgICAgYWN0aW9uOiByZXF1ZXN0LmFjdGlvbixcclxuICAgICAgICAgICAgICBlcnJvcnM6IFtlcnJvclRvQnVuZGxlKGVycm9yKV0sXHJcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgIHR5cGU6IHJlcXVlc3QudHlwZSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gYXdhaXQgdHJhbnNhY3QoKTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZ2VuZXJhdGVkSWRzLCBlcnJvcnMgfSA9IGF3YWl0IHBvb2wuc3luYyh0cmFuc2FjdGlvbiwgcmVxdWVzdCwgY29udGV4dCk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goPE11dGF0ZVJlc3BvbnNlPntcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBlcnJvcnMsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgdHJhbnNhY3Rpb24uY29tbWl0KCk7XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2goPE11dGF0ZVJlc3BvbnNlPntcclxuICAgICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBlcnJvcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVkSWRzLFxyXG4gICAgICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogcmVxdWVzdC50eXBlLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0cmFuc2FjdGlvbi5yb2xsYmFjaygpO1xyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCg8TXV0YXRlUmVzcG9uc2U+e1xyXG4gICAgICAgICAgICAgIGFjdGlvbjogcmVxdWVzdC5hY3Rpb24sXHJcbiAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnYmF0Y2hNdXRhdGUnOlxyXG4gICAgICAgICAgY29uc3QgYmF0Y2g6IEJhdGNoTXV0YXRlUmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGVycm9yczogW10sXHJcbiAgICAgICAgICAgIHF1ZXVlOiBbXSxcclxuICAgICAgICAgICAgcmVxdWVzdElkLFxyXG4gICAgICAgICAgICB0eXBlOiByZXF1ZXN0LnR5cGUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghdHJhbnNhY3QgfHwgIXBvb2wpIHtcclxuICAgICAgICAgICAgY29uc3QgZSA9IFtlcnJvclRvQnVuZGxlKG5ldyBFcnJvcignbXV0YXRlIHJlcXVlc3RzIHJlcXVpcmUgYm90aCB0cmFuc2FjdCBhbmQgcG9vbC4nKSldO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGFjdGlvbiwgcmVxdWVzdElkOiBpZCwgdHlwZSB9IG9mIHJlcXVlc3QucXVldWUpIHtcclxuICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKDxNdXRhdGVSZXNwb25zZT57IGFjdGlvbiwgZXJyb3JzOiBlLCByZXF1ZXN0SWQ6IGlkLCB0eXBlIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7IC4uLmJhdGNoLCBlcnJvcnM6IGUgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCBmYWlsZWQgPSBmYWxzZTtcclxuICAgICAgICAgIGxldCBmYWlsUmVhc29uczogQnVuZGxlW10gPSBbXTtcclxuICAgICAgICAgIGNvbnN0IGJhdGNoVHIgPSBhd2FpdCB0cmFuc2FjdCgpO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCByZXFJdGVtIG9mIHJlcXVlc3QucXVldWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB7IGFjdGlvbiwgdHlwZSwgcmVxdWVzdElkOiBpdGVtSWQgfSA9IHJlcUl0ZW07XHJcbiAgICAgICAgICAgICAgaWYgKCFmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZ2VuZXJhdGVkSWRzLCBlcnJvcnMgfSA9IGF3YWl0IHBvb2wuc3luYyhiYXRjaFRyLCByZXFJdGVtLCBjb250ZXh0KTtcclxuICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmYWlsUmVhc29ucyA9IGVycm9ycztcclxuICAgICAgICAgICAgICAgICAgICBiYXRjaFRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYmF0Y2gucXVldWUucHVzaCh7IGFjdGlvbiwgdHlwZSwgcmVxdWVzdElkOiBpdGVtSWQsIGVycm9ycyB9KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyxcclxuICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZElkcyxcclxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgZmFpbFJlYXNvbnMgPSBbZXJyb3JUb0J1bmRsZShlcnJvcildO1xyXG4gICAgICAgICAgICAgICAgICBiYXRjaFRyLnJvbGxiYWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgIGJhdGNoLnF1ZXVlLnB1c2goeyBhY3Rpb24sIGVycm9yczogZmFpbFJlYXNvbnMsIHJlcXVlc3RJZDogaXRlbUlkLCB0eXBlIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBiYXRjaC5xdWV1ZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiByZXFJdGVtLmFjdGlvbixcclxuICAgICAgICAgICAgICAgICAgZXJyb3JzOiBmYWlsUmVhc29ucyxcclxuICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXFJdGVtLnJlcXVlc3RJZCxcclxuICAgICAgICAgICAgICAgICAgdHlwZTogcmVxSXRlbS50eXBlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgYXdhaXQgYmF0Y2hUci5yb2xsYmFjaygpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlc0l0ZW0gb2YgYmF0Y2gucXVldWUpIHtcclxuICAgICAgICAgICAgICByZXNJdGVtLmVycm9ycyA9IHJlc0l0ZW0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICA/IFsuLi5yZXNJdGVtLmVycm9ycywgZXJyb3JUb0J1bmRsZShlcnJvcildXHJcbiAgICAgICAgICAgICAgICA6IFtlcnJvclRvQnVuZGxlKGVycm9yKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoIWZhaWxlZCkge1xyXG4gICAgICAgICAgICBhd2FpdCBiYXRjaFRyLmNvbW1pdCgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGJhdGNoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3ZhbGlkYXRlJzpcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghdmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWxpZGF0ZSByZXF1ZXN0cyByZXF1aXJlIGEgdmFsaWRhdG9yLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlcy5wdXNoKGF3YWl0IHZhbGlkYXRvcihyZXF1ZXN0LCBjb250ZXh0KSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXNwb25zZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgZXJyb3JzOiBbZXJyb3JUb0J1bmRsZShlcnJvcildLFxyXG4gICAgICAgICAgICAgIG5hbWU6IHJlcXVlc3QubmFtZSxcclxuICAgICAgICAgICAgICByZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgdHlwZTogJ3ZhbGlkYXRlJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXNwb25zZXM7XHJcbiAgfTtcclxufVxyXG4iXX0=