UNPKG

13.6 kBJavaScriptView Raw
1'use strict';
2
3var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
4
5var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
6
7var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
8
9var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
10
11var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
12
13var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
14
15var _createClass2 = require('babel-runtime/helpers/createClass');
16
17var _createClass3 = _interopRequireDefault(_createClass2);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21var ExecInfo = require('./ExecInfo');
22var Promise = require('bluebird');
23var _ = require('lodash');
24
25var _require = require('./utils');
26
27var execHook = _require.execHook;
28var logError = _require.logError;
29var possiblyCallback = _require.possiblyCallback;
30var resultsTransform = _require.resultsTransform;
31
32// Implements command functions binding and wrapping.
33
34var 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
147module.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