Utils.js 9.1 KB

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