1 | ;
|
2 |
|
3 | var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
|
4 |
|
5 | var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
|
6 |
|
7 | var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
|
8 |
|
9 | var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
|
10 |
|
11 | var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
|
12 |
|
13 | var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
|
14 |
|
15 | var _createClass2 = require('babel-runtime/helpers/createClass');
|
16 |
|
17 | var _createClass3 = _interopRequireDefault(_createClass2);
|
18 |
|
19 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
20 |
|
21 | var ExecInfo = require('./ExecInfo');
|
22 | var Promise = require('bluebird');
|
23 | var _ = require('lodash');
|
24 |
|
25 | var _require = require('./utils');
|
26 |
|
27 | var execHook = _require.execHook;
|
28 | var logError = _require.logError;
|
29 | var possiblyCallback = _require.possiblyCallback;
|
30 | var resultsTransform = _require.resultsTransform;
|
31 |
|
32 | // Implements command functions binding and wrapping.
|
33 |
|
34 | var CommandBinder = function () {
|
35 | function CommandBinder(server, transport, userName) {
|
36 | (0, _classCallCheck3.default)(this, CommandBinder);
|
37 |
|
38 | this.server = server;
|
39 | this.transport = transport;
|
40 | this.userName = userName;
|
41 | }
|
42 |
|
43 | (0, _createClass3.default)(CommandBinder, [{
|
44 | key: 'commandWatcher',
|
45 | value: function commandWatcher(id, name) {
|
46 | var _this = this;
|
47 |
|
48 | this.server.runningCommands++;
|
49 | return Promise.resolve().disposer(function () {
|
50 | _this.server.runningCommands--;
|
51 | if (_this.transport.closed && _this.server.runningCommands <= 0) {
|
52 | _this.server.emit('commandsFinished');
|
53 | }
|
54 | });
|
55 | }
|
56 | }, {
|
57 | key: 'makeCommand',
|
58 | value: function makeCommand(name, fn) {
|
59 | var _this2 = this;
|
60 |
|
61 | var validator = this.server.validator;
|
62 |
|
63 | var beforeHook = this.server.hooks[name + 'Before'];
|
64 | var afterHook = this.server.hooks[name + 'After'];
|
65 | return function (args, info) {
|
66 | var execInfo = new ExecInfo();
|
67 | _.assign(execInfo, { server: _this2.server, userName: _this2.userName });
|
68 | _.assign(execInfo, info);
|
69 | _.assign(execInfo, validator.splitArguments(name, args));
|
70 | return Promise.using(_this2.commandWatcher(info.id, name), function () {
|
71 | return validator.checkArguments.apply(validator, [name].concat((0, _toConsumableArray3.default)(execInfo.args))).then(function () {
|
72 | if (beforeHook && !execInfo.bypassHooks) {
|
73 | return execHook(beforeHook, execInfo);
|
74 | } else {
|
75 | return Promise.resolve();
|
76 | }
|
77 | }).then(function (results) {
|
78 | if (results && results.length) {
|
79 | return results;
|
80 | }
|
81 | return fn.apply(undefined, (0, _toConsumableArray3.default)(execInfo.args).concat([execInfo])).then(function (result) {
|
82 | execInfo.results = [result];
|
83 | }, function (error) {
|
84 | execInfo.error = error;
|
85 | }).then(function () {
|
86 | if (afterHook && !execInfo.bypassHooks) {
|
87 | return execHook(afterHook, execInfo);
|
88 | } else {
|
89 | return Promise.resolve();
|
90 | }
|
91 | }).then(function (results) {
|
92 | if (results && results.length) {
|
93 | return results;
|
94 | } else if (execInfo.error) {
|
95 | return Promise.reject(execInfo.error);
|
96 | } else {
|
97 | return execInfo.results;
|
98 | }
|
99 | });
|
100 | });
|
101 | }).catch(function (error) {
|
102 | return logError(error);
|
103 | });
|
104 | };
|
105 | }
|
106 | }, {
|
107 | key: 'bindDisconnect',
|
108 | value: function bindDisconnect(id, fn) {
|
109 | var _this3 = this;
|
110 |
|
111 | var server = this.server;
|
112 | var hook = this.server.hooks.onDisconnect;
|
113 | this.transport.bindHandler(id, 'disconnect', function () {
|
114 | return Promise.using(_this3.commandWatcher(id, 'disconnect'), function () {
|
115 | return fn(id).catch(function (error) {
|
116 | return logError(error);
|
117 | }).catchReturn().then(function () {
|
118 | return execHook(hook, server, id);
|
119 | }).catch(function (error) {
|
120 | return logError(error);
|
121 | }).catchReturn();
|
122 | });
|
123 | });
|
124 | }
|
125 | }, {
|
126 | key: 'bindCommand',
|
127 | value: function bindCommand(id, name, fn) {
|
128 | var cmd = this.makeCommand(name, fn);
|
129 | var useErrorObjects = this.server.useRawErrorObjects;
|
130 | var info = { id: id };
|
131 | return this.transport.bindHandler(id, name, function () {
|
132 | var _possiblyCallback = possiblyCallback(arguments);
|
133 |
|
134 | var _possiblyCallback2 = (0, _slicedToArray3.default)(_possiblyCallback, 2);
|
135 |
|
136 | var args = _possiblyCallback2[0];
|
137 | var cb = _possiblyCallback2[1];
|
138 |
|
139 | var ack = resultsTransform(useErrorObjects, cb);
|
140 | return cmd(args, info).asCallback(ack, { spread: true });
|
141 | });
|
142 | }
|
143 | }]);
|
144 | return CommandBinder;
|
145 | }();
|
146 |
|
147 | module.exports = CommandBinder;
|
148 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21tYW5kQmluZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU0sV0FBVyxRQUFRLFlBQVIsQ0FBakI7QUFDQSxJQUFNLFVBQVUsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTSxJQUFJLFFBQVEsUUFBUixDQUFWOztlQUVRLFFBQVEsU0FBUixDOztJQURBLFEsWUFBQSxRO0lBQVUsUSxZQUFBLFE7SUFBVSxnQixZQUFBLGdCO0lBQWtCLGdCLFlBQUEsZ0I7O0FBRzlDOztJQUNNLGE7QUFFSix5QkFBYSxNQUFiLEVBQXFCLFNBQXJCLEVBQWdDLFFBQWhDLEVBQTBDO0FBQUE7O0FBQ3hDLFNBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxTQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDRDs7OzttQ0FFZSxFLEVBQUksSSxFQUFNO0FBQUE7O0FBQ3hCLFdBQUssTUFBTCxDQUFZLGVBQVo7QUFDQSxhQUFPLFFBQVEsT0FBUixHQUFrQixRQUFsQixDQUEyQixZQUFNO0FBQ3RDLGNBQUssTUFBTCxDQUFZLGVBQVo7QUFDQSxZQUFJLE1BQUssU0FBTCxDQUFlLE1BQWYsSUFBeUIsTUFBSyxNQUFMLENBQVksZUFBWixJQUErQixDQUE1RCxFQUErRDtBQUM3RCxnQkFBSyxNQUFMLENBQVksSUFBWixDQUFpQixrQkFBakI7QUFDRDtBQUNGLE9BTE0sQ0FBUDtBQU1EOzs7Z0NBRVksSSxFQUFNLEUsRUFBSTtBQUFBOztBQUFBLFVBQ2YsU0FEZSxHQUNELEtBQUssTUFESixDQUNmLFNBRGU7O0FBRXJCLFVBQUksYUFBYSxLQUFLLE1BQUwsQ0FBWSxLQUFaLENBQXFCLElBQXJCLFlBQWpCO0FBQ0EsVUFBSSxZQUFZLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBcUIsSUFBckIsV0FBaEI7QUFDQSxhQUFPLFVBQUMsSUFBRCxFQUFPLElBQVAsRUFBZ0I7QUFD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QWxDO0FBQ0EsVUFBSSxPQUFPLEVBQUMsTUFBRCxFQUFYO0FBQ0EsYUFBTyxLQUFLLFNBQUwsQ0FBZSxXQUFmLENBQTJCLEVBQTNCLEVBQStCLElBQS9CLEVBQXFDLFlBQVk7QUFBQSxnQ0FDckMsaUJBQWlCLFNBQWpCLENBRHFDOztBQUFBOztBQUFBLFlBQ2pELElBRGlEO0FBQUEsWUFDM0MsRUFEMkM7O0FBRXRELFlBQUksTUFBTSxpQkFBaUIsZUFBakIsRUFBa0MsRUFBbEMsQ0FBVjtBQUNBLGVBQU8sSUFBSSxJQUFKLEVBQVUsSUFBVixFQUFnQixVQUFoQixDQUEyQixHQUEzQixFQUFnQyxFQUFFLFFBQVEsSUFBVixFQUFoQyxDQUFQO0FBQ0QsT0FKTSxDQUFQO0FBS0Q7Ozs7O0FBSUgsT0FBTyxPQUFQLEdBQWlCLGFBQWpCIiwiZmlsZSI6IkNvbW1hbmRCaW5kZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuY29uc3QgRXhlY0luZm8gPSByZXF1aXJlKCcuL0V4ZWNJbmZvJylcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKCdibHVlYmlyZCcpXG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJylcbmNvbnN0IHsgZXhlY0hvb2ssIGxvZ0Vycm9yLCBwb3NzaWJseUNhbGxiYWNrLCByZXN1bHRzVHJhbnNmb3JtIH0gPVxuICAgICAgICByZXF1aXJlKCcuL3V0aWxzJylcblxuLy8gSW1wbGVtZW50cyBjb21tYW5kIGZ1bmN0aW9ucyBiaW5kaW5nIGFuZCB3cmFwcGluZy5cbmNsYXNzIENvbW1hbmRCaW5kZXIge1xuXG4gIGNvbnN0cnVjdG9yIChzZXJ2ZXIsIHRyYW5zcG9ydCwgdXNlck5hbWUpIHtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlclxuICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0XG4gICAgdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lXG4gIH1cblxuICBjb21tYW5kV2F0Y2hlciAoaWQsIG5hbWUpIHtcbiAgICB0aGlzLnNlcnZlci5ydW5uaW5nQ29tbWFuZHMrK1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS5kaXNwb3NlcigoKSA9PiB7XG4gICAgICB0aGlzLnNlcnZlci5ydW5uaW5nQ29tbWFuZHMtLVxuICAgICAgaWYgKHRoaXMudHJhbnNwb3J0LmNsb3NlZCAmJiB0aGlzLnNlcnZlci5ydW5uaW5nQ29tbWFuZHMgPD0gMCkge1xuICAgICAgICB0aGlzLnNlcnZlci5lbWl0KCdjb21tYW5kc0ZpbmlzaGVkJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbWFrZUNvbW1hbmQgKG5hbWUsIGZuKSB7XG4gICAgbGV0IHsgdmFsaWRhdG9yIH0gPSB0aGlzLnNlcnZlclxuICAgIGxldCBiZWZvcmVIb29rID0gdGhpcy5zZXJ2ZXIuaG9va3NbYCR7bmFtZX1CZWZvcmVgXVxuICAgIGxldCBhZnRlckhvb2sgPSB0aGlzLnNlcnZlci5ob29rc1tgJHtuYW1lfUFmdGVyYF1cbiAgICByZXR1cm4gKGFyZ3MsIGluZm8pID0+IHtcbiAgICAgIGxldCBleGVjSW5mbyA9IG5ldyBFeGVjSW5mbygpXG4gICAgICBfLmFzc2lnbihleGVjSW5mbywgeyBzZXJ2ZXI6IHRoaXMuc2VydmVyLCB1c2VyTmFtZTogdGhpcy51c2VyTmFtZSB9KVxuICAgICAgXy5hc3NpZ24oZXhlY0luZm8sIGluZm8pXG4gICAgICBfLmFzc2lnbihleGVjSW5mbywgdmFsaWRhdG9yLnNwbGl0QXJndW1lbnRzKG5hbWUsIGFyZ3MpKVxuICAgICAgcmV0dXJuIFByb21pc2UudXNpbmcoXG4gICAgICAgIHRoaXMuY29tbWFuZFdhdGNoZXIoaW5mby5pZCwgbmFtZSksXG4gICAgICAgICgpID0+IHZhbGlkYXRvci5jaGVja0FyZ3VtZW50cyhuYW1lLCAuLi5leGVjSW5mby5hcmdzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChiZWZvcmVIb29rICYmICFleGVjSW5mby5ieXBhc3NIb29rcykge1xuICAgICAgICAgICAgICByZXR1cm4gZXhlY0hvb2soYmVmb3JlSG9vaywgZXhlY0luZm8pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgIH0gfSlcbiAgICAgICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7IHJldHVybiByZXN1bHRzIH1cbiAgICAgICAgICAgIHJldHVybiBmbiguLi5leGVjSW5mby5hcmdzLCBleGVjSW5mbylcbiAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHsgZXhlY0luZm8ucmVzdWx0cyA9IFtyZXN1bHRdIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0+IHsgZXhlY0luZm8uZXJyb3IgPSBlcnJvciB9KVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVySG9vayAmJiAhZXhlY0luZm8uYnlwYXNzSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjSG9vayhhZnRlckhvb2ssIGV4ZWNJbmZvKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICB9IH0pXG4gICAgICAgICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY0luZm8uZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChleGVjSW5mby5lcnJvcilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWNJbmZvLnJlc3VsdHNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSkpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiBsb2dFcnJvcihlcnJvcikpXG4gICAgfVxuICB9XG5cbiAgYmluZERpc2Nvbm5lY3QgKGlkLCBmbikge1xuICAgIGxldCBzZXJ2ZXIgPSB0aGlzLnNlcnZlclxuICAgIGxldCBob29rID0gdGhpcy5zZXJ2ZXIuaG9va3Mub25EaXNjb25uZWN0XG4gICAgdGhpcy50cmFuc3BvcnQuYmluZEhhbmRsZXIoaWQsICdkaXNjb25uZWN0JywgKCkgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UudXNpbmcoXG4gICAgICAgIHRoaXMuY29tbWFuZFdhdGNoZXIoaWQsICdkaXNjb25uZWN0JyksXG4gICAgICAgICgpID0+IGZuKGlkKVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBsb2dFcnJvcihlcnJvcikpXG4gICAgICAgICAgLmNhdGNoUmV0dXJuKClcbiAgICAgICAgICAudGhlbigoKSA9PiBleGVjSG9vayhob29rLCBzZXJ2ZXIsIGlkKSlcbiAgICAgICAgICAuY2F0Y2goZXJyb3IgPT4gbG9nRXJyb3IoZXJyb3IpKVxuICAgICAgICAgIC5jYXRjaFJldHVybigpKVxuICAgIH0pXG4gIH1cblxuICBiaW5kQ29tbWFuZCAoaWQsIG5hbWUsIGZuKSB7XG4gICAgbGV0IGNtZCA9IHRoaXMubWFrZUNvbW1hbmQobmFtZSwgZm4pXG4gICAgbGV0IHVzZUVycm9yT2JqZWN0cyA9IHRoaXMuc2VydmVyLnVzZVJhd0Vycm9yT2JqZWN0c1xuICAgIGxldCBpbmZvID0ge2lkfVxuICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5iaW5kSGFuZGxlcihpZCwgbmFtZSwgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IFthcmdzLCBjYl0gPSBwb3NzaWJseUNhbGxiYWNrKGFyZ3VtZW50cylcbiAgICAgIGxldCBhY2sgPSByZXN1bHRzVHJhbnNmb3JtKHVzZUVycm9yT2JqZWN0cywgY2IpXG4gICAgICByZXR1cm4gY21kKGFyZ3MsIGluZm8pLmFzQ2FsbGJhY2soYWNrLCB7IHNwcmVhZDogdHJ1ZSB9KVxuICAgIH0pXG4gIH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbW1hbmRCaW5kZXJcbiJdfQ== |
\ | No newline at end of file |