agora-foundation 3.3.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,13 +18,17 @@ var _trace = function _trace(originalMethod, context) {
18
18
  var methodName = String(context.name);
19
19
  if (context.kind === 'method') {
20
20
  context.addInitializer(function () {
21
- var handler = (0, _handler.createLogHandler)((0, _logger.getLogger)('default'));
21
+ var handler = (0, _handler.createLogHandler)((0, _logger.getLogger)({
22
+ label: 'default'
23
+ }));
22
24
  this[context.name] = (0, _proxy.proxyMethod)(this[context.name], this, methodName, handler);
23
25
  });
24
26
  }
25
27
  };
26
28
  _trace.to = function (label) {
27
- var logger = (0, _logger.getLogger)(label);
29
+ var logger = (0, _logger.getLogger)({
30
+ label: label
31
+ });
28
32
  return function (originalMethod, context) {
29
33
  var methodName = String(context.name);
30
34
  if (context.kind === 'method') {
@@ -1,8 +1,14 @@
1
- import { LogLevel, Logger, LogManager } from "./type";
2
- export declare const getLogger: (label?: string) => Logger;
1
+ import { LogLevel, Logger, LogManager } from './type';
2
+ export declare const getLogger: (opts?: {
3
+ label?: string;
4
+ }) => Logger;
5
+ export declare const createLogger: (opts?: {
6
+ label?: string;
7
+ prefix?: string;
8
+ }) => Logger;
3
9
  export declare const getLogManager: () => LogManager;
4
10
  export declare const setLogLevel: (_logLevel: LogLevel) => void;
5
- export { LogLevel } from "./type";
6
- export type { LogManager, Logger } from "./type";
7
- export { restoreConsoleHijack, setupConsoleHijack } from "./hijack";
8
- export { logLevelMap } from "./constants";
11
+ export { LogLevel } from './type';
12
+ export type { LogManager, Logger } from './type';
13
+ export { restoreConsoleHijack, setupConsoleHijack } from './hijack';
14
+ export { logLevelMap } from './constants';
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "LogLevel", {
10
10
  return _type.LogLevel;
11
11
  }
12
12
  });
13
- exports.getLogger = exports.getLogManager = void 0;
13
+ exports.getLogger = exports.getLogManager = exports.createLogger = void 0;
14
14
  Object.defineProperty(exports, "logLevelMap", {
15
15
  enumerable: true,
16
16
  get: function get() {
@@ -63,15 +63,24 @@ var _constants = require("./constants");
63
63
  var loggerRegistrar = new Map();
64
64
  var logLevel = _type.LogLevel.DEBUG;
65
65
  var getLogger = exports.getLogger = function getLogger() {
66
- var label = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "default";
66
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
67
+ var label = opts.label || 'default';
67
68
  if (!loggerRegistrar.has(label)) {
68
- loggerRegistrar.set(label, new _loggerImpl.LoggerImpl(label, {
69
+ loggerRegistrar.set(label, new _loggerImpl.LoggerImpl(label, {}, {
69
70
  console: true,
70
71
  database: true
71
72
  }, logLevel, (0, _worker.getWorkerSingleton)()));
72
73
  }
73
74
  return loggerRegistrar.get(label);
74
75
  };
76
+ var createLogger = exports.createLogger = function createLogger() {
77
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
78
+ var label = opts.label || 'default';
79
+ return new _loggerImpl.LoggerImpl(label, opts, {
80
+ console: true,
81
+ database: true
82
+ }, logLevel, (0, _worker.getWorkerSingleton)());
83
+ };
75
84
  var logManager;
76
85
  var getLogManager = exports.getLogManager = function getLogManager() {
77
86
  if (!logManager) {
@@ -1,10 +1,13 @@
1
1
  import { LogLevel, Logger, LogWorkerInteractor } from './type';
2
2
  export declare class LoggerImpl implements Logger {
3
3
  private _label;
4
+ private _opts;
4
5
  private _dest;
5
6
  private _logLevel;
6
7
  private _logWorkerInteractor;
7
- constructor(_label: string, _dest: {
8
+ constructor(_label: string, _opts: {
9
+ prefix?: string;
10
+ }, _dest: {
8
11
  console: boolean;
9
12
  database: boolean;
10
13
  }, _logLevel: LogLevel, _logWorkerInteractor: LogWorkerInteractor);
@@ -19,9 +19,10 @@ var _type = require("./type");
19
19
  var _hijack = require("./hijack");
20
20
  var _padEnd = _interopRequireDefault(require("lodash/padEnd"));
21
21
  var LoggerImpl = exports.LoggerImpl = /*#__PURE__*/function () {
22
- function LoggerImpl(_label, _dest, _logLevel, _logWorkerInteractor) {
22
+ function LoggerImpl(_label, _opts, _dest, _logLevel, _logWorkerInteractor) {
23
23
  (0, _classCallCheck2["default"])(this, LoggerImpl);
24
24
  this._label = _label;
25
+ this._opts = _opts;
25
26
  this._dest = _dest;
26
27
  this._logLevel = _logLevel;
27
28
  this._logWorkerInteractor = _logWorkerInteractor;
@@ -69,10 +70,15 @@ var LoggerImpl = exports.LoggerImpl = /*#__PURE__*/function () {
69
70
  if (logLevel > this._logLevel) {
70
71
  return;
71
72
  }
72
- // prepend log level to second position of the log message
73
+
74
+ // prepend prefix to the log message if it exists
73
75
  for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
74
76
  args[_key5 - 1] = arguments[_key5];
75
77
  }
78
+ if (this._opts.prefix) {
79
+ args.unshift("[".concat(this._opts.prefix, "]"));
80
+ }
81
+ // prepend log level to second position of the log message
76
82
  args.unshift((0, _padEnd["default"])((0, _upperCase["default"])(_constants.logLevelMap[logLevel] || 'unknown'), 5, ' '));
77
83
  // prepend log level to first position of the log message
78
84
  args.unshift((0, _dayjs["default"])().format('YYYY-MM-DD HH:mm:ss'));
@@ -7,5 +7,6 @@ export declare class AgoraObservable<T> {
7
7
  removeObserver(observer: T): void;
8
8
  notifyObservers<K extends keyof T>(eventName: K, ...args: EventParameters<T[K]>): void;
9
9
  countOfObservers(): number;
10
+ removeAllObservers(): void;
10
11
  }
11
12
  export {};
@@ -95,5 +95,11 @@ var AgoraObservable = exports.AgoraObservable = /*#__PURE__*/function () {
95
95
  value: function countOfObservers() {
96
96
  return this._observers;
97
97
  }
98
+ }, {
99
+ key: "removeAllObservers",
100
+ value: function removeAllObservers() {
101
+ this._observers = 0;
102
+ this._observerSet.clear();
103
+ }
98
104
  }]);
99
105
  }();
@@ -136,7 +136,11 @@ var isFile = /*#__PURE__*/function () {
136
136
  return _context2.abrupt("return", new Promise(function (resolve, reject) {
137
137
  fs.stat(filePath, function (err, stats) {
138
138
  if (err) reject(err);
139
- resolve(stats.isFile());
139
+ if (!stats) {
140
+ resolve(false);
141
+ } else {
142
+ resolve(stats.isFile());
143
+ }
140
144
  });
141
145
  }));
142
146
  case 2:
@@ -7,5 +7,6 @@ export declare enum WorkerDirectives {
7
7
  UNPERSIST_BUFFER = "unpersistBuffer",
8
8
  GET_BUFFER = "getBuffer",
9
9
  CLEAR_TEMP_LOGS = "clearTempLogs",
10
- COLLECT_LOGS_ON_FS = "collectLogsOnFs"
10
+ COLLECT_LOGS_ON_FS = "collectLogsOnFs",
11
+ INIT_LOG_PATH = "initLogPath"
11
12
  }
@@ -15,5 +15,6 @@ var WorkerDirectives = exports.WorkerDirectives = /*#__PURE__*/function (WorkerD
15
15
  WorkerDirectives["GET_BUFFER"] = "getBuffer";
16
16
  WorkerDirectives["CLEAR_TEMP_LOGS"] = "clearTempLogs";
17
17
  WorkerDirectives["COLLECT_LOGS_ON_FS"] = "collectLogsOnFs";
18
+ WorkerDirectives["INIT_LOG_PATH"] = "initLogPath";
18
19
  return WorkerDirectives;
19
20
  }({});
@@ -9,4 +9,6 @@ export declare const writeLog: (self: WorkerContext, callId: number, log: Log) =
9
9
  export declare const collectLogs: (self: WorkerContext, callId: number, labels: string[]) => Promise<void>;
10
10
  export declare const deleteLogs: (self: WorkerContext, callId: number, labels: string[], lastId: number) => Promise<void>;
11
11
  export declare const setMaxRecords: (self: WorkerContext, callId: number, max: number) => void;
12
+ export declare const initLogPath: (logPath: string) => void;
13
+ export declare const writingToDisk: (log: string) => void;
12
14
  export {};
@@ -10,7 +10,6 @@ require("core-js/modules/es.array.is-array.js");
10
10
  require("core-js/modules/es.array.slice.js");
11
11
  require("core-js/modules/es.function.name.js");
12
12
  require("core-js/modules/es.object.define-property.js");
13
- require("core-js/modules/es.object.to-string.js");
14
13
  require("core-js/modules/es.regexp.exec.js");
15
14
  require("core-js/modules/es.regexp.test.js");
16
15
  require("core-js/modules/es.regexp.to-string.js");
@@ -18,15 +17,21 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
18
17
  Object.defineProperty(exports, "__esModule", {
19
18
  value: true
20
19
  });
21
- exports.writeLog = exports.setMaxRecords = exports.deleteLogs = exports.collectLogs = void 0;
20
+ exports.writingToDisk = exports.writeLog = exports.setMaxRecords = exports.initLogPath = exports.deleteLogs = exports.collectLogs = void 0;
22
21
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
23
22
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
24
23
  require("core-js/modules/es.array.concat.js");
24
+ require("core-js/modules/es.array.for-each.js");
25
25
  require("core-js/modules/es.array.iterator.js");
26
26
  require("core-js/modules/es.array.push.js");
27
27
  require("core-js/modules/es.array.reverse.js");
28
28
  require("core-js/modules/es.date.to-string.js");
29
+ require("core-js/modules/es.object.to-string.js");
29
30
  require("core-js/modules/es.string.iterator.js");
31
+ require("core-js/modules/esnext.async-iterator.for-each.js");
32
+ require("core-js/modules/esnext.iterator.constructor.js");
33
+ require("core-js/modules/esnext.iterator.for-each.js");
34
+ require("core-js/modules/web.dom-collections.for-each.js");
30
35
  require("core-js/modules/web.dom-collections.iterator.js");
31
36
  var _debounce = _interopRequireDefault(require("lodash/debounce"));
32
37
  var _db = require("./db");
@@ -35,6 +40,7 @@ var _constants = require("../constants");
35
40
  var _reply = require("./reply");
36
41
  var _raceCondition = require("../../utilities/race-condition");
37
42
  var _jszip = _interopRequireDefault(require("jszip"));
43
+ var _env = require("../../utilities/env");
38
44
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
39
45
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
40
46
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -42,12 +48,14 @@ var MAX_WAIT_TIME = 3000;
42
48
  var mutex = new _mutex.Mutex();
43
49
  var maxRecords = 50000;
44
50
  var logsCount = 0;
51
+ var winstonLogger;
45
52
  var logs = [];
46
53
  var writeLog = exports.writeLog = function writeLog(self, callId, log) {
47
54
  logsCount++;
48
55
  log.content = "[".concat(logsCount, "]").concat(log.content);
49
56
  logs.push(log);
50
57
  debouncedWriting();
58
+
51
59
  // reply(self, callId, WorkerDirectives.WRITE_LOG, { isSuccess: true });
52
60
  };
53
61
  var debouncedWriting = (0, _debounce["default"])(function () {
@@ -60,50 +68,60 @@ var debouncedWriting = (0, _debounce["default"])(function () {
60
68
  time1 = new Date().getTime();
61
69
  logscopy = logs;
62
70
  logs = [];
63
- _context.prev = 3;
64
- _context.next = 6;
71
+ if (!(0, _env.isElectron)()) {
72
+ _context.next = 7;
73
+ break;
74
+ }
75
+ logscopy.forEach(function (log) {
76
+ writingToDisk(log.content);
77
+ });
78
+ _context.next = 36;
79
+ break;
80
+ case 7:
81
+ _context.prev = 7;
82
+ _context.next = 10;
65
83
  return _db.db.logs.count();
66
- case 6:
84
+ case 10:
67
85
  count = _context.sent;
68
86
  exceedNo = logscopy.length + count - maxRecords;
69
87
  if (!(exceedNo > 0)) {
70
- _context.next = 15;
88
+ _context.next = 19;
71
89
  break;
72
90
  }
73
91
  console.log("[worker] the count of stored logs exceeded limit of ".concat(maxRecords, " for ").concat(exceedNo, "."));
74
92
  console.log("[worker] start deleting records. exceeded: ".concat(exceedNo));
75
- _context.next = 13;
93
+ _context.next = 17;
76
94
  return _db.db.logs.orderBy(':id').reverse().limit(exceedNo)["delete"]();
77
- case 13:
95
+ case 17:
78
96
  total = _context.sent;
79
97
  console.log("[worker] done deleting records. total: ".concat(total));
80
- case 15:
81
- _context.next = 20;
98
+ case 19:
99
+ _context.next = 24;
82
100
  break;
83
- case 17:
84
- _context.prev = 17;
85
- _context.t0 = _context["catch"](3);
101
+ case 21:
102
+ _context.prev = 21;
103
+ _context.t0 = _context["catch"](7);
86
104
  console.error("[worker] clear db failed.", _context.t0);
87
- case 20:
88
- _context.prev = 20;
105
+ case 24:
106
+ _context.prev = 24;
89
107
  console.log("[worker] start writing logs. total: ".concat(logscopy.length));
90
- _context.next = 24;
108
+ _context.next = 28;
91
109
  return _db.db.logs.bulkPut(logscopy);
92
- case 24:
110
+ case 28:
93
111
  pk = _context.sent;
94
112
  time2 = new Date().getTime();
95
113
  console.log("[worker] done writing logs in ".concat(time2 - time1, "ms. total: ").concat(logscopy.length, ", lastId: ").concat(pk));
96
- _context.next = 32;
114
+ _context.next = 36;
97
115
  break;
98
- case 29:
99
- _context.prev = 29;
100
- _context.t1 = _context["catch"](20);
116
+ case 33:
117
+ _context.prev = 33;
118
+ _context.t1 = _context["catch"](24);
101
119
  console.error("[worker] bulkPut ".concat(logscopy.length, " failed."), _context.t1);
102
- case 32:
120
+ case 36:
103
121
  case "end":
104
122
  return _context.stop();
105
123
  }
106
- }, _callee, null, [[3, 17], [20, 29]]);
124
+ }, _callee, null, [[7, 21], [24, 33]]);
107
125
  }))(), MAX_WAIT_TIME);
108
126
  })["catch"](function (e) {
109
127
  console.log('[worker] an error during dispatching writeLog', e);
@@ -243,4 +261,41 @@ var setMaxRecords = exports.setMaxRecords = function setMaxRecords(self, callId,
243
261
  (0, _reply.reply)(self, callId, _constants.WorkerDirectives.SET_MAX_RECORDS, {
244
262
  isSuccess: true
245
263
  });
264
+ };
265
+ var initFsLogger = /*#__PURE__*/function () {
266
+ var _ref4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(logPath) {
267
+ var winston;
268
+ return _regenerator["default"].wrap(function _callee4$(_context5) {
269
+ while (1) switch (_context5.prev = _context5.next) {
270
+ case 0:
271
+ winston = eval('require("winston")');
272
+ winstonLogger = winston.createLogger({
273
+ format: winston.format.printf(function (_ref5) {
274
+ var message = _ref5.message;
275
+ return "".concat(message);
276
+ }),
277
+ transports: [new winston.transports.File({
278
+ filename: logPath,
279
+ maxFiles: 5,
280
+ maxsize: 1048576 //1MB,
281
+ })]
282
+ });
283
+ case 2:
284
+ case "end":
285
+ return _context5.stop();
286
+ }
287
+ }, _callee4);
288
+ }));
289
+ return function initFsLogger(_x8) {
290
+ return _ref4.apply(this, arguments);
291
+ };
292
+ }();
293
+ var initLogPath = exports.initLogPath = function initLogPath(logPath) {
294
+ console.log("[worker] log path is set to ".concat(logPath));
295
+ initFsLogger(logPath);
296
+ };
297
+ var writingToDisk = exports.writingToDisk = function writingToDisk(log) {
298
+ if (winstonLogger) {
299
+ winstonLogger.info(log);
300
+ }
246
301
  };
@@ -13,7 +13,7 @@ export declare class WorkerInteractor implements LogWorkerInteractor {
13
13
  deleteLogs(labels: string[], lastId: number): Promise<void>;
14
14
  persistBinary(id: number, buffer: Buffer): Promise<void>;
15
15
  unpersistBinary(id: number): Promise<void>;
16
- getBinary(id: number): Promise<Buffer | null>;
16
+ getBinary(id: number): Promise<Buffer<ArrayBufferLike> | null>;
17
17
  collectLogsOnFs(logDirPath: string): Promise<File>;
18
18
  private _handleMessageCallback;
19
19
  private _handleErrorCallback;
@@ -24,6 +24,7 @@ var _constants = require("./constants");
24
24
  var _dayjs = _interopRequireDefault(require("dayjs"));
25
25
  var _events = require("../utilities/events");
26
26
  var _raceCondition = require("../utilities/race-condition");
27
+ var _env = require("../utilities/env");
27
28
  var _excluded = ["isSuccess"];
28
29
  var MAX_WAIT_TIME = 10000;
29
30
  var WorkerInteractor = exports.WorkerInteractor = /*#__PURE__*/function () {
@@ -335,6 +336,16 @@ var WorkerInteractor = exports.WorkerInteractor = /*#__PURE__*/function () {
335
336
  value: function _spawnNewWorker() {
336
337
  console.info('[WorkerInteractor] spawned a new log worker');
337
338
  var logWorker = (0, _workerFactory.createWorkerInstance)();
339
+ if ((0, _env.isElectron)()) {
340
+ var path = window.require('path');
341
+ var _window$require = window.require('@electron/remote'),
342
+ app = _window$require.app;
343
+ var logPath = path.resolve(app.getPath('logs'), 'logs', 'meeting-runtime.log');
344
+ logWorker.postMessage({
345
+ type: _constants.WorkerDirectives.INIT_LOG_PATH,
346
+ data: logPath
347
+ });
348
+ }
338
349
  return logWorker;
339
350
  }
340
351
  }, {
@@ -1,2 +1,2 @@
1
- import { WorkerContext } from "./type";
1
+ import { WorkerContext } from './type';
2
2
  export declare const installHandler: (self: WorkerContext) => void;
@@ -14,7 +14,7 @@ var _constants = require("./constants");
14
14
  var _reply = require("./handler/reply");
15
15
  var installHandler = exports.installHandler = function installHandler(self) {
16
16
  console.log("[worker] worker initialzied.");
17
- self.addEventListener("message", function (evt) {
17
+ self.addEventListener('message', function (evt) {
18
18
  if (evt.data) {
19
19
  var _evt$data = evt.data,
20
20
  type = _evt$data.type,
@@ -30,6 +30,8 @@ var installHandler = exports.installHandler = function installHandler(self) {
30
30
  created_at: +Date.now(),
31
31
  timestamp: "".concat(now)
32
32
  });
33
+ } else if (type === _constants.WorkerDirectives.INIT_LOG_PATH) {
34
+ (0, _log.initLogPath)(evt.data.data);
33
35
  } else if (type === _constants.WorkerDirectives.SET_MAX_RECORDS) {
34
36
  (0, _log.setMaxRecords)(self, callId, evt.data.data.maxRecords || 50000);
35
37
  } else if (type === _constants.WorkerDirectives.COLLECT_LOGS) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agora-foundation",
3
- "version": "3.3.0",
3
+ "version": "3.4.0",
4
4
  "license": "MIT",
5
5
  "scripts": {
6
6
  "build": "agora-tc-transpile",
@@ -21,7 +21,8 @@
21
21
  "@types/lodash": "^4.14.168",
22
22
  "@types/node": "^20.11.30",
23
23
  "tslib": "^2.6.2",
24
- "agora-toolchain": "^3.3.0"
24
+ "agora-toolchain": "^3.4.0",
25
+ "winston": "^3.16.0"
25
26
  },
26
27
  "dependencies": {
27
28
  "async-await-retry": "^2.0.1",
@@ -30,4 +31,4 @@
30
31
  "jszip": "^3.10.1",
31
32
  "lodash": "^4.17.21"
32
33
  }
33
- }
34
+ }