UNPKG

@iotize/device-client.js

Version:

IoTize Device client for Javascript

238 lines (237 loc) 11.5 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var logger_1 = require("../../logger"); var format_1 = require("../../core/format"); var logger = logger_1.default('Relay'); var ComRelayError = /** @class */ (function (_super) { __extends(ComRelayError, _super); function ComRelayError(code, msg) { var _this = _super.call(this, msg) || this; _this.code = code; return _this; } ComRelayError.illegalArgument = function (message) { return new ComRelayError(ComRelayError.Code.IllegalArgmentError, message); }; return ComRelayError; }(Error)); exports.ComRelayError = ComRelayError; (function (ComRelayError) { var Code; (function (Code) { Code["IllegalArgmentError"] = "IllegalArgmentError"; })(Code = ComRelayError.Code || (ComRelayError.Code = {})); })(ComRelayError = exports.ComRelayError || (exports.ComRelayError = {})); exports.ComRelayError = ComRelayError; /** * This is an experimental feature. * * @experimental */ var ComRelay = /** @class */ (function () { // private IRelayCallback mCallback; // public final RelayServiceInfoModel mRelayInfo; // private DefaultSocketServer mSocketServer; // private WebSocketServer mWebSocketServer; /** * @param sourceProtocol protocol that will received commands * @param targetProtocol protocol on wich commmand will be sent */ function ComRelay(sourceProtocol, targetProtocol) { if (sourceProtocol) { this.setSourceProtocol(sourceProtocol); } if (targetProtocol) { this.setTargetProtocol(targetProtocol); } } ComRelay.prototype.setSourceProtocol = function (protocol) { if (this.mSourceProtocol) { this.removeSourceProtocol(); } this.mSourceProtocol = protocol; return this; }; ComRelay.prototype.removeSourceProtocol = function () { if (this._sourceProtocolSubscription) { this._sourceProtocolSubscription.unsubscribe(); this._sourceProtocolSubscription = undefined; } this.mSourceProtocol = undefined; return this; }; ComRelay.prototype.setTargetProtocol = function (protocol) { this.mTargetProtocol = protocol; return this; }; ComRelay.prototype.start = function (options) { return __awaiter(this, void 0, void 0, function () { var _this = this; return __generator(this, function (_a) { return [2 /*return*/, promiseTimout(options ? options.timeout || -1 : -1, function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () { var ex_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 5, , 6]); if (!this.mSourceProtocol) { throw ComRelayError.illegalArgument('Missing source protocol'); } if (!this.mTargetProtocol) { throw ComRelayError.illegalArgument("Missing target protocol"); } if (!!this.mSourceProtocol.isConnected()) return [3 /*break*/, 2]; logger.log("Connecting to source protocol..."); return [4 /*yield*/, this.mSourceProtocol.connect().toPromise()]; case 1: _a.sent(); _a.label = 2; case 2: if (!!this.mTargetProtocol.isConnected()) return [3 /*break*/, 4]; logger.log("Connecting to target protocol..."); return [4 /*yield*/, this.mTargetProtocol.connect().toPromise()]; case 3: _a.sent(); _a.label = 4; case 4: logger.log("Source/Target are now connected. Listening to messages..."); // We need to reconnect this.listenToDataStream(); resolve(); return [3 /*break*/, 6]; case 5: ex_1 = _a.sent(); reject(ex_1); return [3 /*break*/, 6]; case 6: return [2 /*return*/]; } }); }); })]; }); }); }; ComRelay.prototype.stop = function () { if (this.mTargetProtocol && this.mTargetProtocol.isConnected()) { this.mSourceProtocol.disconnect(); } if (this.mSourceProtocol && this.mSourceProtocol.isConnected()) { this.mSourceProtocol.disconnect(); } }; ComRelay.prototype.listenToDataStream = function () { var _this = this; // if (!this.mSourceProtocol!.isConnected()){ // await this.mSourceProtocol!.connect(); // } return new Promise(function (resolve, reject) { _this._sourceProtocolSubscription = _this.mSourceProtocol .receiveStream() .subscribe({ next: function (data) { if (!data) { logger.error("Received null event..."); return; } if (!_this.mTargetProtocol) { logger.error("Target protocol is null. Cannot redirect message to it"); return; } try { logger.debug("Received new message", format_1.FormatHelper.toHexString(data)); _this.mTargetProtocol .send(data) .toPromise() // .catch((err) => { // logger.error(`Source cannot send to target protocol`, err); // // TODO check if we are still connected // return Response.create(); // }) .then(function (response) { logger.debug("Target protocol responded with: ", format_1.FormatHelper.toHexString(response)); return _this.mSourceProtocol.write(response); }) .then(function () { logger.debug("Successfully sent response!"); }) .catch(function (err) { logger.error("Cannot transfer response to source protocol: " + err + " JSON=" + JSON.stringify(err), err); }); } catch (err) { logger.error("Source cannot transfer data to target due to error: " + err, err); } }, error: function (err) { logger.error("Error occured " + err); }, complete: function () { resolve(); } }); }); }; ComRelay.prototype.onStop = function () { // TODO cleanup return this; }; return ComRelay; }()); exports.ComRelay = ComRelay; function promiseTimout(ms, callback) { return new Promise(function (resolve, reject) { logger.log("promiseTimout start with " + ms + " milliseconds"); // Set up the real work callback(resolve, reject); // Set up the timeout if (ms >= 0) { setTimeout(function () { reject('Promise timed out after ' + ms + ' ms'); }, ms); } }); }