Utils.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. "use strict";
  2. // Copyright (c) .NET Foundation. All rights reserved.
  3. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  4. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  5. return new (P || (P = Promise))(function (resolve, reject) {
  6. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  7. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  8. function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
  9. step((generator = generator.apply(thisArg, _arguments || [])).next());
  10. });
  11. };
  12. var __generator = (this && this.__generator) || function (thisArg, body) {
  13. var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
  14. return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
  15. function verb(n) { return function (v) { return step([n, v]); }; }
  16. function step(op) {
  17. if (f) throw new TypeError("Generator is already executing.");
  18. while (_) try {
  19. 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;
  20. if (y = 0, t) op = [op[0] & 2, t.value];
  21. switch (op[0]) {
  22. case 0: case 1: t = op; break;
  23. case 4: _.label++; return { value: op[1], done: false };
  24. case 5: _.label++; y = op[1]; op = [0]; continue;
  25. case 7: op = _.ops.pop(); _.trys.pop(); continue;
  26. default:
  27. if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
  28. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
  29. if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
  30. if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
  31. if (t[2]) _.ops.pop();
  32. _.trys.pop(); continue;
  33. }
  34. op = body.call(thisArg, _);
  35. } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
  36. if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
  37. }
  38. };
  39. Object.defineProperty(exports, "__esModule", { value: true });
  40. var ILogger_1 = require("./ILogger");
  41. var Loggers_1 = require("./Loggers");
  42. /** @private */
  43. var Arg = /** @class */ (function () {
  44. function Arg() {
  45. }
  46. Arg.isRequired = function (val, name) {
  47. if (val === null || val === undefined) {
  48. throw new Error("The '" + name + "' argument is required.");
  49. }
  50. };
  51. Arg.isIn = function (val, values, name) {
  52. // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.
  53. if (!(val in values)) {
  54. throw new Error("Unknown " + name + " value: " + val + ".");
  55. }
  56. };
  57. return Arg;
  58. }());
  59. exports.Arg = Arg;
  60. /** @private */
  61. function getDataDetail(data, includeContent) {
  62. var detail = "";
  63. if (isArrayBuffer(data)) {
  64. detail = "Binary data of length " + data.byteLength;
  65. if (includeContent) {
  66. detail += ". Content: '" + formatArrayBuffer(data) + "'";
  67. }
  68. }
  69. else if (typeof data === "string") {
  70. detail = "String data of length " + data.length;
  71. if (includeContent) {
  72. detail += ". Content: '" + data + "'";
  73. }
  74. }
  75. return detail;
  76. }
  77. exports.getDataDetail = getDataDetail;
  78. /** @private */
  79. function formatArrayBuffer(data) {
  80. var view = new Uint8Array(data);
  81. // Uint8Array.map only supports returning another Uint8Array?
  82. var str = "";
  83. view.forEach(function (num) {
  84. var pad = num < 16 ? "0" : "";
  85. str += "0x" + pad + num.toString(16) + " ";
  86. });
  87. // Trim of trailing space.
  88. return str.substr(0, str.length - 1);
  89. }
  90. exports.formatArrayBuffer = formatArrayBuffer;
  91. // Also in signalr-protocol-msgpack/Utils.ts
  92. /** @private */
  93. function isArrayBuffer(val) {
  94. return val && typeof ArrayBuffer !== "undefined" &&
  95. (val instanceof ArrayBuffer ||
  96. // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof
  97. (val.constructor && val.constructor.name === "ArrayBuffer"));
  98. }
  99. exports.isArrayBuffer = isArrayBuffer;
  100. /** @private */
  101. function sendMessage(logger, transportName, httpClient, url, accessTokenFactory, content, logMessageContent) {
  102. return __awaiter(this, void 0, void 0, function () {
  103. var _a, headers, token, responseType, response;
  104. return __generator(this, function (_b) {
  105. switch (_b.label) {
  106. case 0:
  107. if (!accessTokenFactory) return [3 /*break*/, 2];
  108. return [4 /*yield*/, accessTokenFactory()];
  109. case 1:
  110. token = _b.sent();
  111. if (token) {
  112. headers = (_a = {},
  113. _a["Authorization"] = "Bearer " + token,
  114. _a);
  115. }
  116. _b.label = 2;
  117. case 2:
  118. logger.log(ILogger_1.LogLevel.Trace, "(" + transportName + " transport) sending data. " + getDataDetail(content, logMessageContent) + ".");
  119. responseType = isArrayBuffer(content) ? "arraybuffer" : "text";
  120. return [4 /*yield*/, httpClient.post(url, {
  121. content: content,
  122. headers: headers,
  123. responseType: responseType,
  124. })];
  125. case 3:
  126. response = _b.sent();
  127. logger.log(ILogger_1.LogLevel.Trace, "(" + transportName + " transport) request complete. Response status: " + response.statusCode + ".");
  128. return [2 /*return*/];
  129. }
  130. });
  131. });
  132. }
  133. exports.sendMessage = sendMessage;
  134. /** @private */
  135. function createLogger(logger) {
  136. if (logger === undefined) {
  137. return new ConsoleLogger(ILogger_1.LogLevel.Information);
  138. }
  139. if (logger === null) {
  140. return Loggers_1.NullLogger.instance;
  141. }
  142. if (logger.log) {
  143. return logger;
  144. }
  145. return new ConsoleLogger(logger);
  146. }
  147. exports.createLogger = createLogger;
  148. /** @private */
  149. var Subject = /** @class */ (function () {
  150. function Subject() {
  151. this.observers = [];
  152. }
  153. Subject.prototype.next = function (item) {
  154. for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
  155. var observer = _a[_i];
  156. observer.next(item);
  157. }
  158. };
  159. Subject.prototype.error = function (err) {
  160. for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
  161. var observer = _a[_i];
  162. if (observer.error) {
  163. observer.error(err);
  164. }
  165. }
  166. };
  167. Subject.prototype.complete = function () {
  168. for (var _i = 0, _a = this.observers; _i < _a.length; _i++) {
  169. var observer = _a[_i];
  170. if (observer.complete) {
  171. observer.complete();
  172. }
  173. }
  174. };
  175. Subject.prototype.subscribe = function (observer) {
  176. this.observers.push(observer);
  177. return new SubjectSubscription(this, observer);
  178. };
  179. return Subject;
  180. }());
  181. exports.Subject = Subject;
  182. /** @private */
  183. var SubjectSubscription = /** @class */ (function () {
  184. function SubjectSubscription(subject, observer) {
  185. this.subject = subject;
  186. this.observer = observer;
  187. }
  188. SubjectSubscription.prototype.dispose = function () {
  189. var index = this.subject.observers.indexOf(this.observer);
  190. if (index > -1) {
  191. this.subject.observers.splice(index, 1);
  192. }
  193. if (this.subject.observers.length === 0 && this.subject.cancelCallback) {
  194. this.subject.cancelCallback().catch(function (_) { });
  195. }
  196. };
  197. return SubjectSubscription;
  198. }());
  199. exports.SubjectSubscription = SubjectSubscription;
  200. /** @private */
  201. var ConsoleLogger = /** @class */ (function () {
  202. function ConsoleLogger(minimumLogLevel) {
  203. this.minimumLogLevel = minimumLogLevel;
  204. }
  205. ConsoleLogger.prototype.log = function (logLevel, message) {
  206. if (logLevel >= this.minimumLogLevel) {
  207. switch (logLevel) {
  208. case ILogger_1.LogLevel.Critical:
  209. case ILogger_1.LogLevel.Error:
  210. console.error("[" + new Date().toISOString() + "] " + ILogger_1.LogLevel[logLevel] + ": " + message);
  211. break;
  212. case ILogger_1.LogLevel.Warning:
  213. console.warn("[" + new Date().toISOString() + "] " + ILogger_1.LogLevel[logLevel] + ": " + message);
  214. break;
  215. case ILogger_1.LogLevel.Information:
  216. console.info("[" + new Date().toISOString() + "] " + ILogger_1.LogLevel[logLevel] + ": " + message);
  217. break;
  218. default:
  219. // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug
  220. console.log("[" + new Date().toISOString() + "] " + ILogger_1.LogLevel[logLevel] + ": " + message);
  221. break;
  222. }
  223. }
  224. };
  225. return ConsoleLogger;
  226. }());
  227. exports.ConsoleLogger = ConsoleLogger;
  228. //# sourceMappingURL=Utils.js.map