UNPKG

@iotize/device-client.js

Version:

IoTize Device client for Javascript

187 lines (186 loc) 6.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var response_1 = require("../../../client/impl/response/response"); var request_1 = require("../../../client/impl/request"); var format_helper_1 = require("../../../core/format/format-helper"); var logger_1 = require("../../../logger"); var byte_buffer_1 = require("../../../core/buffer/byte-buffer"); var logger = logger_1.default('MockProtocol'); var EqualRequestFilter = /** @class */ (function () { function EqualRequestFilter(command) { this.command = command; } EqualRequestFilter.prototype.test = function (command) { if (!command) { return true; } return this.command.toString() === command.toString(); }; EqualRequestFilter.prototype.toString = function () { return "EqualRequestFilter " + this.command; }; return EqualRequestFilter; }()); exports.EqualRequestFilter = EqualRequestFilter; var RegExpFilter = /** @class */ (function () { function RegExpFilter(regex) { this.regex = regex; } RegExpFilter.prototype.test = function (input) { var cmdString = input.toString(); return Boolean(cmdString.match(this.regex)); }; return RegExpFilter; }()); exports.RegExpFilter = RegExpFilter; var Util = /** @class */ (function () { function Util() { } // public static REQUEST_REGEX: RegExp = /^(GET|PUT|POST) ((\/[a-zA-Z0-9])+) (0x([a-zA-Z0-9]+))?$/i; Util.parseApiRequestString = function (cmdString) { var parts = cmdString.split(' '); var methodtype = parts[0].toUpperCase(); if (['GET', 'PUT', 'POST'].indexOf(methodtype) === -1) { throw new Error("Invalid command type: " + methodtype + ". From command: \"" + cmdString + "\""); } var methodPath = parts[1]; var payload = undefined; if (parts.length >= 3) { payload = format_helper_1.FormatHelper.hexStringToBuffer(parts[2]); } // TODO improve as we can call anyother static function // It should be reduce to GET, PUT, POST return request_1.ApiRequest[methodtype](methodPath, payload); }; return Util; }()); exports.Util = Util; var Router = /** @class */ (function () { function Router() { this._routes = []; } Object.defineProperty(Router.prototype, "routes", { get: function () { return this._routes; }, enumerable: true, configurable: true }); Router.prototype.findRoute = function (request) { var adapter; for (var _i = 0, _a = this._routes; _i < _a.length; _i++) { var route = _a[_i]; // debug("\t- MockProtocol", `Check route: ${route.filter.toString()}`); if (route.predicate.test(request)) { adapter = route.adapter; break; } } var response; if (!adapter) { return null; } else { response = adapter.adapt(request); } return response; }; Router.prototype.addRoute = function (left, right) { var filter; if (typeof left === 'string') { left = Util.parseApiRequestString(left); } if (left instanceof request_1.ApiRequest) { filter = new EqualRequestFilter(left); } else if (left instanceof RegExp) { filter = new RegExpFilter(left); } else if (typeof left === 'function') { filter = { test: left }; } else { filter = left; } var adapter; if (right instanceof response_1.Response) { adapter = new (/** @class */ (function () { function tmp() { } tmp.prototype.adapt = function (command) { return right; }; return tmp; }())); } else if (right instanceof Uint8Array) { adapter = new (/** @class */ (function () { function tmp() { } tmp.prototype.adapt = function (command) { return new response_1.Response(right); }; return tmp; }())); } else if (typeof right === 'function') { adapter = { adapt: right }; } else { adapter = right; } this._routes.push({ predicate: filter, adapter: adapter }); return this; }; /** * Mapping a command (represented as a string with format "<request-type> <path> [data]" * ie: GET /3//3 0xABCD or POST /1024//0 0xtest * * Response must either be: * - an hexadecimal data represented as a string (0xABCD) * - An object with a coreRet and a body * - A Uint8Array */ Router.prototype.addRoutes = function (map) { for (var pathString in map) { var info = map[pathString]; var command = Util.parseApiRequestString(pathString); var response = void 0; if (info instanceof Uint8Array) { response = new response_1.Response(info); } else if (info instanceof response_1.Response) { response = info; } else if (typeof info === "number") { response = response_1.Response.create(info); } else if (typeof info === "string") { response = new response_1.Response(format_helper_1.FormatHelper.hexStringToBuffer(info)); } else if (typeof info === "object") { var codeRet = info.codeRet; response = new response_1.Response(byte_buffer_1.ByteBuffer.merge(Uint8Array.from([codeRet]), info.body || new Uint8Array(0)).data); } else { throw new Error("Invalid response type " + typeof info + " with value: " + JSON.stringify(info)); } logger.debug("\t- Add map " + command + " -> " + response); this.addRoute(command, response); } return this; }; Router.prototype.clearRoutes = function () { this._routes = []; return this; }; return Router; }()); exports.Router = Router;