@peers-app/peers-sdk 0.14.0 → 0.15.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.
Files changed (210) hide show
  1. package/dist/context/data-context.d.ts +4 -4
  2. package/dist/context/data-context.js +1 -1
  3. package/dist/context/index.d.ts +3 -3
  4. package/dist/context/index.js +4 -0
  5. package/dist/context/user-context-singleton.js +13 -14
  6. package/dist/context/user-context.d.ts +4 -4
  7. package/dist/context/user-context.js +48 -31
  8. package/dist/data/assistants.d.ts +1 -1
  9. package/dist/data/assistants.js +35 -24
  10. package/dist/data/change-tracking.d.ts +8 -8
  11. package/dist/data/change-tracking.js +45 -39
  12. package/dist/data/channels.js +5 -5
  13. package/dist/data/data-locks.d.ts +2 -2
  14. package/dist/data/data-locks.js +21 -23
  15. package/dist/data/data-locks.test.js +73 -75
  16. package/dist/data/device-sync-info.d.ts +1 -1
  17. package/dist/data/device-sync-info.js +4 -4
  18. package/dist/data/devices.d.ts +1 -1
  19. package/dist/data/devices.js +9 -12
  20. package/dist/data/embeddings.js +14 -11
  21. package/dist/data/files/file-read-stream.d.ts +2 -2
  22. package/dist/data/files/file-read-stream.js +23 -14
  23. package/dist/data/files/file-write-stream.d.ts +2 -2
  24. package/dist/data/files/file-write-stream.js +8 -8
  25. package/dist/data/files/file.types.d.ts +2 -2
  26. package/dist/data/files/file.types.js +17 -11
  27. package/dist/data/files/files.d.ts +6 -6
  28. package/dist/data/files/files.js +17 -19
  29. package/dist/data/files/files.test.js +213 -214
  30. package/dist/data/files/index.d.ts +4 -4
  31. package/dist/data/files/index.js +4 -4
  32. package/dist/data/group-member-roles.js +2 -2
  33. package/dist/data/group-members.d.ts +5 -5
  34. package/dist/data/group-members.js +27 -18
  35. package/dist/data/group-members.test.js +73 -73
  36. package/dist/data/group-permissions.d.ts +3 -3
  37. package/dist/data/group-permissions.js +13 -11
  38. package/dist/data/group-share.d.ts +2 -2
  39. package/dist/data/group-share.js +29 -24
  40. package/dist/data/groups.d.ts +4 -4
  41. package/dist/data/groups.js +27 -19
  42. package/dist/data/groups.test.js +44 -44
  43. package/dist/data/index.d.ts +6 -6
  44. package/dist/data/index.js +6 -6
  45. package/dist/data/knowledge/peer-types.js +9 -9
  46. package/dist/data/messages.d.ts +5 -5
  47. package/dist/data/messages.js +43 -30
  48. package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
  49. package/dist/data/orm/client-proxy.data-source.js +10 -12
  50. package/dist/data/orm/cursor.d.ts +1 -1
  51. package/dist/data/orm/cursor.js +2 -2
  52. package/dist/data/orm/cursor.test.js +92 -93
  53. package/dist/data/orm/data-query.d.ts +3 -3
  54. package/dist/data/orm/data-query.js +24 -18
  55. package/dist/data/orm/data-query.mongo.d.ts +1 -1
  56. package/dist/data/orm/data-query.mongo.js +49 -51
  57. package/dist/data/orm/data-query.mongo.test.js +173 -204
  58. package/dist/data/orm/data-query.sqlite.d.ts +1 -1
  59. package/dist/data/orm/data-query.sqlite.js +84 -73
  60. package/dist/data/orm/data-query.sqlite.test.js +164 -176
  61. package/dist/data/orm/data-query.test.js +216 -224
  62. package/dist/data/orm/decorators.js +3 -3
  63. package/dist/data/orm/dependency-injection.test.js +53 -56
  64. package/dist/data/orm/doc.d.ts +4 -4
  65. package/dist/data/orm/doc.js +17 -21
  66. package/dist/data/orm/event-registry.d.ts +1 -1
  67. package/dist/data/orm/event-registry.test.js +16 -16
  68. package/dist/data/orm/factory.d.ts +2 -2
  69. package/dist/data/orm/factory.js +33 -33
  70. package/dist/data/orm/index.d.ts +10 -10
  71. package/dist/data/orm/index.js +10 -10
  72. package/dist/data/orm/multi-cursors.d.ts +1 -1
  73. package/dist/data/orm/multi-cursors.js +6 -6
  74. package/dist/data/orm/multi-cursors.test.js +152 -144
  75. package/dist/data/orm/sql.data-source.d.ts +7 -7
  76. package/dist/data/orm/sql.data-source.js +88 -93
  77. package/dist/data/orm/sql.data-source.test.js +109 -101
  78. package/dist/data/orm/subscribable.data-source.d.ts +4 -4
  79. package/dist/data/orm/subscribable.data-source.js +5 -5
  80. package/dist/data/orm/table-container-events.test.js +34 -26
  81. package/dist/data/orm/table-container.d.ts +6 -6
  82. package/dist/data/orm/table-container.js +33 -21
  83. package/dist/data/orm/table-container.test.js +64 -53
  84. package/dist/data/orm/table-definitions.system.d.ts +3 -3
  85. package/dist/data/orm/table-definitions.system.js +3 -3
  86. package/dist/data/orm/table-definitions.type.d.ts +5 -5
  87. package/dist/data/orm/table-dependencies.d.ts +2 -2
  88. package/dist/data/orm/table.d.ts +5 -5
  89. package/dist/data/orm/table.event-source.test.js +105 -115
  90. package/dist/data/orm/table.js +35 -34
  91. package/dist/data/orm/types.d.ts +3 -3
  92. package/dist/data/orm/types.js +26 -25
  93. package/dist/data/orm/types.test.js +166 -92
  94. package/dist/data/package-permissions.d.ts +1 -1
  95. package/dist/data/package-permissions.js +2 -2
  96. package/dist/data/package-version-permissions.d.ts +1 -1
  97. package/dist/data/package-version-permissions.js +2 -2
  98. package/dist/data/package-versions.d.ts +9 -9
  99. package/dist/data/package-versions.js +47 -33
  100. package/dist/data/packages.d.ts +2 -2
  101. package/dist/data/packages.js +36 -18
  102. package/dist/data/packages.utils.d.ts +2 -2
  103. package/dist/data/packages.utils.js +4 -4
  104. package/dist/data/persistent-vars.d.ts +15 -15
  105. package/dist/data/persistent-vars.js +165 -154
  106. package/dist/data/table-definitions-table.d.ts +5 -5
  107. package/dist/data/table-definitions-table.js +13 -12
  108. package/dist/data/tool-tests.js +6 -6
  109. package/dist/data/tools.js +29 -19
  110. package/dist/data/user-permissions.d.ts +1 -1
  111. package/dist/data/user-permissions.js +5 -5
  112. package/dist/data/user-permissions.test.js +90 -88
  113. package/dist/data/user-trust-levels.js +10 -10
  114. package/dist/data/users.d.ts +4 -4
  115. package/dist/data/users.js +16 -15
  116. package/dist/data/voice-messages.d.ts +2 -2
  117. package/dist/data/voice-messages.js +13 -13
  118. package/dist/data/welcome-modal.pvar.js +3 -1
  119. package/dist/data/workflow-logs.js +26 -18
  120. package/dist/data/workflow-runs.d.ts +6 -6
  121. package/dist/data/workflow-runs.js +70 -44
  122. package/dist/data/workflows.d.ts +2 -2
  123. package/dist/data/workflows.js +7 -9
  124. package/dist/device/binary-peer-connection-v2.d.ts +7 -7
  125. package/dist/device/binary-peer-connection-v2.js +32 -28
  126. package/dist/device/binary-peer-connection-v2.test.js +80 -67
  127. package/dist/device/binary-peer-connection.d.ts +7 -7
  128. package/dist/device/binary-peer-connection.js +29 -28
  129. package/dist/device/binary-peer-connection.test.js +35 -31
  130. package/dist/device/connection.d.ts +5 -5
  131. package/dist/device/connection.js +59 -48
  132. package/dist/device/connection.test.js +74 -68
  133. package/dist/device/device-election.d.ts +2 -2
  134. package/dist/device/device-election.js +25 -20
  135. package/dist/device/device-election.test.js +35 -36
  136. package/dist/device/device.d.ts +2 -2
  137. package/dist/device/device.js +10 -4
  138. package/dist/device/device.test.js +16 -17
  139. package/dist/device/get-trust-level-fn.d.ts +2 -2
  140. package/dist/device/get-trust-level-fn.js +22 -11
  141. package/dist/device/get-trust-level-fn.test.js +58 -58
  142. package/dist/device/socket-io-binary-peer.d.ts +1 -1
  143. package/dist/device/socket-io-binary-peer.js +16 -13
  144. package/dist/device/socket.type.d.ts +2 -2
  145. package/dist/device/streamed-socket.d.ts +2 -2
  146. package/dist/device/streamed-socket.js +8 -8
  147. package/dist/device/streamed-socket.test.js +40 -40
  148. package/dist/device/tx-encoding.test.js +77 -77
  149. package/dist/events.d.ts +1 -1
  150. package/dist/events.js +5 -2
  151. package/dist/group-invite/group-invite.js +110 -19
  152. package/dist/group-invite/group-invite.pvars.d.ts +2 -2
  153. package/dist/group-invite/group-invite.pvars.js +21 -13
  154. package/dist/group-invite/group-invite.types.d.ts +1 -1
  155. package/dist/group-invite/index.d.ts +3 -3
  156. package/dist/group-invite/index.js +1 -1
  157. package/dist/index.d.ts +25 -24
  158. package/dist/index.js +30 -25
  159. package/dist/keys.d.ts +3 -3
  160. package/dist/keys.js +31 -30
  161. package/dist/keys.test.js +69 -61
  162. package/dist/logging/console-logger.d.ts +1 -1
  163. package/dist/logging/console-logger.js +35 -40
  164. package/dist/logging/console-logger.test.js +115 -115
  165. package/dist/logging/console-logs.table.d.ts +3 -3
  166. package/dist/logging/console-logs.table.js +28 -23
  167. package/dist/mentions.js +16 -12
  168. package/dist/observable.d.ts +2 -2
  169. package/dist/observable.js +15 -9
  170. package/dist/observable.test.js +47 -47
  171. package/dist/package-loader/get-require.js +3 -4
  172. package/dist/package-loader/package-loader.d.ts +2 -2
  173. package/dist/package-loader/package-loader.js +52 -34
  174. package/dist/peers-ui/peers-ui.d.ts +2 -2
  175. package/dist/peers-ui/peers-ui.js +2 -4
  176. package/dist/peers-ui/peers-ui.types.d.ts +3 -3
  177. package/dist/peers-ui/peers-ui.types.js +0 -1
  178. package/dist/rpc-types.d.ts +61 -59
  179. package/dist/rpc-types.js +61 -55
  180. package/dist/serial-json.d.ts +1 -1
  181. package/dist/serial-json.js +50 -43
  182. package/dist/serial-json.test.js +22 -22
  183. package/dist/system-ids.js +8 -8
  184. package/dist/tools/index.d.ts +1 -1
  185. package/dist/tools/tools-factory.d.ts +1 -1
  186. package/dist/tools/tools-factory.js +2 -2
  187. package/dist/types/assistant-runner-args.d.ts +3 -3
  188. package/dist/types/peer-device.d.ts +1 -1
  189. package/dist/types/peers-package.d.ts +3 -3
  190. package/dist/types/workflow-logger.d.ts +1 -1
  191. package/dist/types/workflow-run-context.d.ts +4 -4
  192. package/dist/types/workflow.d.ts +4 -4
  193. package/dist/types/workflow.js +27 -14
  194. package/dist/types/zod-types.d.ts +2 -1
  195. package/dist/types/zod-types.js +9 -3
  196. package/dist/user-connect/connection-code.d.ts +1 -1
  197. package/dist/user-connect/connection-code.js +7 -7
  198. package/dist/user-connect/connection-code.test.js +106 -106
  199. package/dist/user-connect/index.d.ts +3 -3
  200. package/dist/user-connect/index.js +1 -1
  201. package/dist/user-connect/user-connect.pvars.js +13 -11
  202. package/dist/user-connect/user-connect.types.d.ts +3 -3
  203. package/dist/users.query.d.ts +2 -2
  204. package/dist/users.query.js +40 -30
  205. package/dist/utils.d.ts +2 -2
  206. package/dist/utils.js +34 -32
  207. package/dist/utils.test.js +12 -8
  208. package/dist/workflow-log-formatter.d.ts +1 -1
  209. package/dist/workflow-log-formatter.js +17 -18
  210. package/package.json +14 -8
@@ -1,4 +1,4 @@
1
- type ConsoleLevel = 'debug' | 'info' | 'log' | 'warn' | 'error';
1
+ type ConsoleLevel = "debug" | "info" | "log" | "warn" | "error";
2
2
  /**
3
3
  * Setup console proxy to capture all console output and write to ConsoleLogs table.
4
4
  * Also subscribes to dataChanged events to output logs from other process instances.
@@ -17,8 +17,8 @@ const originalConsole = {
17
17
  error: console.error,
18
18
  };
19
19
  let isConsoleLogsProxySetup = false;
20
- let currentProcessName = 'unknown';
21
- let currentProcessInstanceId = '';
20
+ let currentProcessName = "unknown";
21
+ let currentProcessInstanceId = "";
22
22
  // Guard against cross-process infinite loops
23
23
  // Track recent log signatures (hash of message + level + source)
24
24
  const recentLogSignatures = new Map();
@@ -26,8 +26,8 @@ const LOG_SIGNATURE_WINDOW_MS = 5000; // 5 second window
26
26
  const MAX_IDENTICAL_LOGS_IN_WINDOW = 10; // Max same log in window
27
27
  // Track initialization state
28
28
  const MAX_PENDING_LOGS = 1000; // Prevent memory buildup if initialization never happens
29
- let defaultLogger = undefined;
30
- let consoleLogsProxySubscription = undefined;
29
+ let defaultLogger;
30
+ let consoleLogsProxySubscription;
31
31
  /**
32
32
  * Setup console proxy to capture all console output and write to ConsoleLogs table.
33
33
  * Also subscribes to dataChanged events to output logs from other process instances.
@@ -35,21 +35,21 @@ let consoleLogsProxySubscription = undefined;
35
35
  */
36
36
  function setupConsoleLogsProxy(processName) {
37
37
  if (isConsoleLogsProxySetup) {
38
- originalConsole.warn('Console logs proxy already setup, skipping...');
38
+ originalConsole.warn("Console logs proxy already setup, skipping...");
39
39
  return;
40
40
  }
41
41
  isConsoleLogsProxySetup = true;
42
42
  currentProcessName = processName;
43
43
  currentProcessInstanceId = (0, utils_1.newid)(); // Unique ID for this process instance
44
44
  defaultLogger = new Logger(currentProcessName);
45
- const levels = ['debug', 'info', 'log', 'warn', 'error'];
45
+ const levels = ["debug", "info", "log", "warn", "error"];
46
46
  // Monkey-patch console methods to capture local logs
47
47
  levels.forEach((level) => {
48
48
  const original = originalConsole[level];
49
- console[level] = function (...args) {
49
+ console[level] = (...args) => {
50
50
  // Always call original console method first (preserve terminal output)
51
51
  original.apply(console, args);
52
- defaultLogger.writeLog(level, args);
52
+ defaultLogger?.writeLog(level, args);
53
53
  };
54
54
  });
55
55
  // Subscribe to dataChanged events to output logs from OTHER process instances
@@ -62,8 +62,8 @@ function setupConsoleLogsProxy(processName) {
62
62
  return;
63
63
  }
64
64
  // Output log from another process with prefix
65
- const colorCode = log.process === 'renderer' ? '\x1b[36m' : '\x1b[35m'; // cyan for renderer, magenta for main
66
- const resetCode = '\x1b[0m';
65
+ const colorCode = log.process === "renderer" ? "\x1b[36m" : "\x1b[35m"; // cyan for renderer, magenta for main
66
+ const resetCode = "\x1b[0m";
67
67
  const prefix = `${colorCode}[${log.process}]${resetCode}`;
68
68
  const logLevel = log.level;
69
69
  const logArgs = [prefix, log.message];
@@ -83,7 +83,7 @@ function setupConsoleLogsProxy(processName) {
83
83
  });
84
84
  }
85
85
  catch (err) {
86
- originalConsole.error('Failed to subscribe to console logs dataChanged:', err);
86
+ originalConsole.error("Failed to subscribe to console logs dataChanged:", err);
87
87
  }
88
88
  });
89
89
  originalConsole.log(`Console proxy initialized for process: ${processName} (instance: ${currentProcessInstanceId})`);
@@ -103,7 +103,7 @@ function restoreConsole() {
103
103
  console.warn = originalConsole.warn;
104
104
  console.error = originalConsole.error;
105
105
  isConsoleLogsProxySetup = false;
106
- originalConsole.log('Console proxy removed, original console restored');
106
+ originalConsole.log("Console proxy removed, original console restored");
107
107
  }
108
108
  /**
109
109
  * Extract core message by removing common prefixes that might be added by different processes
@@ -114,15 +114,15 @@ function extractCoreMessage(message) {
114
114
  let core = message;
115
115
  // Remove common process/context prefixes like [main], [renderer], [process-name]
116
116
  // Keep removing until no more matches found
117
- let previousCore = '';
117
+ let previousCore = "";
118
118
  while (core !== previousCore) {
119
119
  previousCore = core;
120
120
  // Remove [xxx] prefixes
121
- core = core.replace(/^\[[^\]]+\]\s*/g, '');
121
+ core = core.replace(/^\[[^\]]+\]\s*/g, "");
122
122
  // Remove common timestamp patterns
123
- core = core.replace(/^\d{4}-\d{2}-\d{2}[T\s]\d{2}:\d{2}:\d{2}[^\s]*\s*/g, '');
123
+ core = core.replace(/^\d{4}-\d{2}-\d{2}[T\s]\d{2}:\d{2}:\d{2}[^\s]*\s*/g, "");
124
124
  // Remove "Error: " prefix that might be added
125
- core = core.replace(/^Error:\s*/i, '');
125
+ core = core.replace(/^Error:\s*/i, "");
126
126
  }
127
127
  return core.trim();
128
128
  }
@@ -163,8 +163,8 @@ function getStackTrace() {
163
163
  if (!stack)
164
164
  return undefined;
165
165
  // Remove first few lines (Error message and this function's frames)
166
- const lines = stack.split('\n');
167
- return lines.slice(4).join('\n');
166
+ const lines = stack.split("\n");
167
+ return lines.slice(4).join("\n");
168
168
  }
169
169
  catch {
170
170
  return undefined;
@@ -177,7 +177,7 @@ function extractSource(stackTrace) {
177
177
  if (!stackTrace)
178
178
  return undefined;
179
179
  try {
180
- const lines = stackTrace.split('\n');
180
+ const lines = stackTrace.split("\n");
181
181
  if (lines.length === 0)
182
182
  return undefined;
183
183
  // Get first line of stack (caller's location)
@@ -189,7 +189,7 @@ function extractSource(stackTrace) {
189
189
  if (match) {
190
190
  const path = match[1] || match[2];
191
191
  // Extract just the filename
192
- const filename = path.split('/').pop()?.split('?')[0];
192
+ const filename = path.split("/").pop()?.split("?")[0];
193
193
  return filename;
194
194
  }
195
195
  }
@@ -205,9 +205,7 @@ async function writeLogToDatabaseWithSource(level, source, args) {
205
205
  try {
206
206
  const timestamp = (0, utils_1.getTimestamp)();
207
207
  // Format message from arguments
208
- let message = typeof args[0] === 'string' ?
209
- args.shift() :
210
- (0, serial_json_1.toJSONString)(args[0]);
208
+ let message = typeof args[0] === "string" ? args.shift() : (0, serial_json_1.toJSONString)(args[0]);
211
209
  // Check for infinite loop before writing
212
210
  // Extract core message to detect cross-process loops where prefixes are added
213
211
  const coreMessage = extractCoreMessage(message);
@@ -218,17 +216,14 @@ async function writeLogToDatabaseWithSource(level, source, args) {
218
216
  }
219
217
  // Extract context objects from arguments
220
218
  for (const a of [...args]) {
221
- if (typeof a === 'object' && !((0, lodash_1.isDate)(a) || a === null)) {
219
+ if (typeof a === "object" && !((0, lodash_1.isDate)(a) || a === null)) {
222
220
  break;
223
221
  }
224
- message += ' ' + args.shift();
222
+ message += ` ${args.shift()}`;
225
223
  }
226
- let context = args.length === 0 ?
227
- undefined : args.length === 1 ?
228
- args[0] :
229
- args;
224
+ const context = args.length === 0 ? undefined : args.length === 1 ? args[0] : args;
230
225
  // Get stack trace for errors
231
- const stackTrace = level === 'error' ? getStackTrace() : undefined;
226
+ const stackTrace = level === "error" ? getStackTrace() : undefined;
232
227
  const logRecord = {
233
228
  logId: (0, utils_1.newid)(),
234
229
  timestamp,
@@ -244,7 +239,7 @@ async function writeLogToDatabaseWithSource(level, source, args) {
244
239
  await consoleLogsTable.insert(logRecord);
245
240
  }
246
241
  catch (err) {
247
- originalConsole.error('[console-logger] Failed to write log to database:', err);
242
+ originalConsole.error("[console-logger] Failed to write log to database:", err);
248
243
  }
249
244
  }
250
245
  /**
@@ -265,7 +260,7 @@ class Logger {
265
260
  // If no source provided, try to extract from caller's location
266
261
  if (!source) {
267
262
  const stack = new Error().stack;
268
- source = extractSource(stack) || 'unknown';
263
+ source = extractSource(stack) || "unknown";
269
264
  }
270
265
  this.source = source;
271
266
  (0, console_logs_table_1.ConsoleLogs)().then(() => {
@@ -278,35 +273,35 @@ class Logger {
278
273
  */
279
274
  debug(...args) {
280
275
  originalConsole.debug(...args);
281
- this.writeLog('debug', args);
276
+ this.writeLog("debug", args);
282
277
  }
283
278
  /**
284
279
  * Log an info message
285
280
  */
286
281
  info(...args) {
287
282
  originalConsole.info(...args);
288
- this.writeLog('info', args);
283
+ this.writeLog("info", args);
289
284
  }
290
285
  /**
291
286
  * Log a general message
292
287
  */
293
288
  log(...args) {
294
289
  originalConsole.log(...args);
295
- this.writeLog('log', args);
290
+ this.writeLog("log", args);
296
291
  }
297
292
  /**
298
293
  * Log a warning message
299
294
  */
300
295
  warn(...args) {
301
296
  originalConsole.warn(...args);
302
- this.writeLog('warn', args);
297
+ this.writeLog("warn", args);
303
298
  }
304
299
  /**
305
300
  * Log an error message
306
301
  */
307
302
  error(...args) {
308
303
  originalConsole.error(...args);
309
- this.writeLog('error', args);
304
+ this.writeLog("error", args);
310
305
  }
311
306
  /**
312
307
  * Internal method to write log to database
@@ -320,14 +315,14 @@ class Logger {
320
315
  else {
321
316
  // Drop logs if queue is full to prevent memory issues
322
317
  if (this.pendingLogs.length === MAX_PENDING_LOGS) {
323
- originalConsole.warn('[console-logger] Pending log queue is full, dropping new logs until initialization');
318
+ originalConsole.warn("[console-logger] Pending log queue is full, dropping new logs until initialization");
324
319
  }
325
320
  }
326
321
  return;
327
322
  }
328
323
  // System is initialized, write directly
329
324
  writeLogToDatabaseWithSource(level, this.source, args).catch((err) => {
330
- originalConsole.error('[console-logger] Failed to write log:', err);
325
+ originalConsole.error("[console-logger] Failed to write log:", err);
331
326
  });
332
327
  }
333
328
  async flushPendingLogs() {
@@ -336,7 +331,7 @@ class Logger {
336
331
  for (const { level, args } of _pendingLogs) {
337
332
  await (0, utils_1.sleep)(10); // small delay to avoid stampede
338
333
  await writeLogToDatabaseWithSource(level, this.source, args).catch((err) => {
339
- originalConsole.error('[console-logger] Failed to flush pending log:', err);
334
+ originalConsole.error("[console-logger] Failed to flush pending log:", err);
340
335
  });
341
336
  }
342
337
  }
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const console_logger_1 = require("./console-logger");
4
4
  // Mock the ConsoleLogs table
5
- jest.mock('./console-logs.table', () => {
5
+ jest.mock("./console-logs.table", () => {
6
6
  const mockTable = {
7
7
  insert: jest.fn().mockResolvedValue(undefined),
8
8
  dataChanged: {
@@ -15,40 +15,40 @@ jest.mock('./console-logs.table', () => {
15
15
  };
16
16
  });
17
17
  // Get reference to mock table
18
- const { __mockTable: mockTable } = require('./console-logs.table');
18
+ const { __mockTable: mockTable } = require("./console-logs.table");
19
19
  // Mock utils
20
- jest.mock('../utils', () => ({
21
- newid: () => 'test-id-123',
22
- getTimestamp: () => '2024-01-01T00:00:00.000Z',
20
+ jest.mock("../utils", () => ({
21
+ newid: () => "test-id-123",
22
+ getTimestamp: () => "2024-01-01T00:00:00.000Z",
23
23
  sleep: jest.fn().mockResolvedValue(undefined),
24
24
  }));
25
- describe('console-logger', () => {
25
+ describe("console-logger", () => {
26
26
  let originalConsole;
27
- describe('extractCoreMessage', () => {
28
- it('should extract core message from messages with [prefix] tags', () => {
29
- expect((0, console_logger_1.extractCoreMessage)('[main] Error message')).toBe('Error message');
30
- expect((0, console_logger_1.extractCoreMessage)('[renderer] [main] Error message')).toBe('Error message');
31
- expect((0, console_logger_1.extractCoreMessage)('[process-1] [process-2] [process-3] Error message')).toBe('Error message');
27
+ describe("extractCoreMessage", () => {
28
+ it("should extract core message from messages with [prefix] tags", () => {
29
+ expect((0, console_logger_1.extractCoreMessage)("[main] Error message")).toBe("Error message");
30
+ expect((0, console_logger_1.extractCoreMessage)("[renderer] [main] Error message")).toBe("Error message");
31
+ expect((0, console_logger_1.extractCoreMessage)("[process-1] [process-2] [process-3] Error message")).toBe("Error message");
32
32
  });
33
- it('should remove Error: prefix', () => {
34
- expect((0, console_logger_1.extractCoreMessage)('Error: Something went wrong')).toBe('Something went wrong');
35
- expect((0, console_logger_1.extractCoreMessage)('[main] Error: Something went wrong')).toBe('Something went wrong');
33
+ it("should remove Error: prefix", () => {
34
+ expect((0, console_logger_1.extractCoreMessage)("Error: Something went wrong")).toBe("Something went wrong");
35
+ expect((0, console_logger_1.extractCoreMessage)("[main] Error: Something went wrong")).toBe("Something went wrong");
36
36
  });
37
- it('should remove timestamp patterns', () => {
38
- expect((0, console_logger_1.extractCoreMessage)('2024-01-01T12:00:00.000Z Error message')).toBe('Error message');
39
- expect((0, console_logger_1.extractCoreMessage)('2024-01-01 12:00:00 Error message')).toBe('Error message');
37
+ it("should remove timestamp patterns", () => {
38
+ expect((0, console_logger_1.extractCoreMessage)("2024-01-01T12:00:00.000Z Error message")).toBe("Error message");
39
+ expect((0, console_logger_1.extractCoreMessage)("2024-01-01 12:00:00 Error message")).toBe("Error message");
40
40
  });
41
- it('should handle combinations of prefixes', () => {
42
- expect((0, console_logger_1.extractCoreMessage)('[renderer] 2024-01-01T12:00:00.000Z Error: Failed to write log')).toBe('Failed to write log');
43
- expect((0, console_logger_1.extractCoreMessage)('[main] [renderer] Error: Failed to write log')).toBe('Failed to write log');
41
+ it("should handle combinations of prefixes", () => {
42
+ expect((0, console_logger_1.extractCoreMessage)("[renderer] 2024-01-01T12:00:00.000Z Error: Failed to write log")).toBe("Failed to write log");
43
+ expect((0, console_logger_1.extractCoreMessage)("[main] [renderer] Error: Failed to write log")).toBe("Failed to write log");
44
44
  });
45
- it('should return the same message if no prefixes found', () => {
46
- expect((0, console_logger_1.extractCoreMessage)('Plain error message')).toBe('Plain error message');
45
+ it("should return the same message if no prefixes found", () => {
46
+ expect((0, console_logger_1.extractCoreMessage)("Plain error message")).toBe("Plain error message");
47
47
  });
48
- it('should handle empty or whitespace messages', () => {
49
- expect((0, console_logger_1.extractCoreMessage)('')).toBe('');
50
- expect((0, console_logger_1.extractCoreMessage)(' ')).toBe('');
51
- expect((0, console_logger_1.extractCoreMessage)('[main]')).toBe('');
48
+ it("should handle empty or whitespace messages", () => {
49
+ expect((0, console_logger_1.extractCoreMessage)("")).toBe("");
50
+ expect((0, console_logger_1.extractCoreMessage)(" ")).toBe("");
51
+ expect((0, console_logger_1.extractCoreMessage)("[main]")).toBe("");
52
52
  });
53
53
  });
54
54
  beforeAll(() => {
@@ -77,76 +77,76 @@ describe('console-logger', () => {
77
77
  console.warn = originalConsole.warn;
78
78
  console.error = originalConsole.error;
79
79
  });
80
- describe('Single-process infinite loop detection', () => {
81
- it('should detect infinite loop when logging from within log handler', async () => {
80
+ describe("Single-process infinite loop detection", () => {
81
+ it("should detect infinite loop when logging from within log handler", async () => {
82
82
  // Setup mock to throw error that triggers another log
83
83
  let callCount = 0;
84
84
  mockTable.insert.mockImplementation(() => {
85
85
  callCount++;
86
86
  if (callCount < 10) {
87
87
  // This would trigger another log attempt
88
- throw new Error('Database error');
88
+ throw new Error("Database error");
89
89
  }
90
90
  return Promise.resolve();
91
91
  });
92
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
92
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
93
93
  // Wait for setup to complete
94
- await new Promise(resolve => setTimeout(resolve, 100));
94
+ await new Promise((resolve) => setTimeout(resolve, 100));
95
95
  // This should trigger the loop
96
- console.error('Initial error');
96
+ console.error("Initial error");
97
97
  // Wait for async operations
98
- await new Promise(resolve => setTimeout(resolve, 100));
98
+ await new Promise((resolve) => setTimeout(resolve, 100));
99
99
  // Should have called insert but stopped early due to recursion guard
100
100
  expect(mockTable.insert).toHaveBeenCalled();
101
101
  // The calls should be limited
102
102
  expect(callCount).toBeLessThanOrEqual(5);
103
103
  });
104
104
  });
105
- describe('Cross-process infinite loop detection', () => {
106
- it('should detect when same log is written too many times in window', async () => {
107
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
105
+ describe("Cross-process infinite loop detection", () => {
106
+ it("should detect when same log is written too many times in window", async () => {
107
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
108
108
  // Wait for setup
109
- await new Promise(resolve => setTimeout(resolve, 100));
109
+ await new Promise((resolve) => setTimeout(resolve, 100));
110
110
  mockTable.insert.mockClear();
111
111
  // Log the same message many times quickly (simulating cross-process loop)
112
112
  for (let i = 0; i < 15; i++) {
113
- console.error('Same error message');
113
+ console.error("Same error message");
114
114
  // Small delay to ensure they're processed
115
- await new Promise(resolve => setTimeout(resolve, 10));
115
+ await new Promise((resolve) => setTimeout(resolve, 10));
116
116
  }
117
117
  // Wait for async operations
118
- await new Promise(resolve => setTimeout(resolve, 100));
118
+ await new Promise((resolve) => setTimeout(resolve, 100));
119
119
  // Should have stopped writing after threshold (10)
120
120
  expect(mockTable.insert.mock.calls.length).toBeLessThan(15);
121
121
  expect(mockTable.insert.mock.calls.length).toBeGreaterThan(0);
122
122
  });
123
- it('should NOT detect loop for different messages', async () => {
124
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
123
+ it("should NOT detect loop for different messages", async () => {
124
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
125
125
  // Wait for setup
126
- await new Promise(resolve => setTimeout(resolve, 100));
126
+ await new Promise((resolve) => setTimeout(resolve, 100));
127
127
  // Clear setup log
128
128
  mockTable.insert.mockClear();
129
129
  // Log different messages
130
130
  for (let i = 0; i < 15; i++) {
131
131
  console.error(`Different error message ${i}`);
132
- await new Promise(resolve => setTimeout(resolve, 10));
132
+ await new Promise((resolve) => setTimeout(resolve, 10));
133
133
  }
134
134
  // Wait for async operations
135
- await new Promise(resolve => setTimeout(resolve, 100));
135
+ await new Promise((resolve) => setTimeout(resolve, 100));
136
136
  // Should have written most/all messages (allow for timing variance)
137
137
  expect(mockTable.insert.mock.calls.length).toBeGreaterThanOrEqual(14);
138
138
  expect(mockTable.insert.mock.calls.length).toBeLessThanOrEqual(15);
139
139
  });
140
- it('should detect loop even with modified messages (prefix added)', async () => {
141
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
140
+ it("should detect loop even with modified messages (prefix added)", async () => {
141
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
142
142
  // Wait for setup
143
- await new Promise(resolve => setTimeout(resolve, 100));
143
+ await new Promise((resolve) => setTimeout(resolve, 100));
144
144
  mockTable.insert.mockClear();
145
145
  // Simulate cross-process loop where each process adds a prefix
146
146
  // This represents Process A logging "Error X"
147
147
  // Process B seeing it and logging "[main] Error X"
148
148
  // Process A seeing that and logging "[renderer] [main] Error X"
149
- const baseMessage = 'Failed to write log to database';
149
+ const baseMessage = "Failed to write log to database";
150
150
  const messages = [
151
151
  baseMessage,
152
152
  `[main] ${baseMessage}`,
@@ -159,11 +159,11 @@ describe('console-logger', () => {
159
159
  for (let cycle = 0; cycle < 3; cycle++) {
160
160
  for (const msg of messages) {
161
161
  console.error(msg);
162
- await new Promise(resolve => setTimeout(resolve, 10));
162
+ await new Promise((resolve) => setTimeout(resolve, 10));
163
163
  }
164
164
  }
165
165
  // Wait for async operations
166
- await new Promise(resolve => setTimeout(resolve, 100));
166
+ await new Promise((resolve) => setTimeout(resolve, 100));
167
167
  // Should detect this as a loop even though messages have different prefixes
168
168
  // because extractCoreMessage normalizes them all to the same core message
169
169
  // We logged 15 messages (5 variants x 3 cycles), but they all have the same core
@@ -174,73 +174,73 @@ describe('console-logger', () => {
174
174
  expect(insertCount).toBeLessThan(17); // Definitely less than all 15 + setup
175
175
  });
176
176
  });
177
- describe('Loop detection recovery', () => {
178
- it('should allow logging again after window expires', async () => {
179
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
177
+ describe("Loop detection recovery", () => {
178
+ it("should allow logging again after window expires", async () => {
179
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
180
180
  // Wait for setup
181
- await new Promise(resolve => setTimeout(resolve, 100));
181
+ await new Promise((resolve) => setTimeout(resolve, 100));
182
182
  mockTable.insert.mockClear();
183
183
  // Trigger loop detection
184
184
  for (let i = 0; i < 12; i++) {
185
- console.error('Same error');
186
- await new Promise(resolve => setTimeout(resolve, 10));
185
+ console.error("Same error");
186
+ await new Promise((resolve) => setTimeout(resolve, 10));
187
187
  }
188
- await new Promise(resolve => setTimeout(resolve, 100));
188
+ await new Promise((resolve) => setTimeout(resolve, 100));
189
189
  const firstBatchCount = mockTable.insert.mock.calls.length;
190
190
  // Wait for window to expire (5 seconds in real code, but we can't easily test that)
191
191
  // Just verify the blocking is in place
192
- console.error('Same error');
193
- await new Promise(resolve => setTimeout(resolve, 100));
192
+ console.error("Same error");
193
+ await new Promise((resolve) => setTimeout(resolve, 100));
194
194
  // Should still be blocked
195
195
  expect(mockTable.insert.mock.calls.length).toBe(firstBatchCount);
196
196
  });
197
197
  });
198
- describe('Normal logging behavior', () => {
199
- it('should write logs to database for normal usage', async () => {
200
- (0, console_logger_1.setupConsoleLogsProxy)('test-process');
198
+ describe("Normal logging behavior", () => {
199
+ it("should write logs to database for normal usage", async () => {
200
+ (0, console_logger_1.setupConsoleLogsProxy)("test-process");
201
201
  // Wait for setup to complete
202
- await new Promise(resolve => setTimeout(resolve, 100));
202
+ await new Promise((resolve) => setTimeout(resolve, 100));
203
203
  mockTable.insert.mockClear();
204
- console.log('Test message');
205
- await new Promise(resolve => setTimeout(resolve, 50));
206
- console.error('Test error');
207
- await new Promise(resolve => setTimeout(resolve, 50));
208
- console.warn('Test warning');
209
- await new Promise(resolve => setTimeout(resolve, 50));
204
+ console.log("Test message");
205
+ await new Promise((resolve) => setTimeout(resolve, 50));
206
+ console.error("Test error");
207
+ await new Promise((resolve) => setTimeout(resolve, 50));
208
+ console.warn("Test warning");
209
+ await new Promise((resolve) => setTimeout(resolve, 50));
210
210
  // Verify at least the logs were attempted
211
211
  expect(mockTable.insert).toHaveBeenCalled();
212
212
  expect(mockTable.insert.mock.calls.length).toBeGreaterThanOrEqual(1);
213
213
  expect(mockTable.insert.mock.calls.length).toBeLessThanOrEqual(3);
214
214
  });
215
215
  });
216
- describe('Logger class', () => {
217
- it('should create logger with specified source', async () => {
218
- const logger = new console_logger_1.Logger('MyModule');
216
+ describe("Logger class", () => {
217
+ it("should create logger with specified source", async () => {
218
+ const logger = new console_logger_1.Logger("MyModule");
219
219
  // Wait for Logger to initialize
220
- await new Promise(resolve => setTimeout(resolve, 100));
220
+ await new Promise((resolve) => setTimeout(resolve, 100));
221
221
  mockTable.insert.mockClear();
222
- logger.log('Test message');
223
- await new Promise(resolve => setTimeout(resolve, 100));
222
+ logger.log("Test message");
223
+ await new Promise((resolve) => setTimeout(resolve, 100));
224
224
  expect(mockTable.insert).toHaveBeenCalled();
225
225
  const call = mockTable.insert.mock.calls[0];
226
- expect(call[0].source).toBe('MyModule');
227
- expect(call[0].message).toBe('Test message');
226
+ expect(call[0].source).toBe("MyModule");
227
+ expect(call[0].message).toBe("Test message");
228
228
  });
229
- it('should support all log levels', async () => {
230
- const logger = new console_logger_1.Logger('TestModule');
229
+ it("should support all log levels", async () => {
230
+ const logger = new console_logger_1.Logger("TestModule");
231
231
  // Wait for Logger to initialize
232
- await new Promise(resolve => setTimeout(resolve, 100));
232
+ await new Promise((resolve) => setTimeout(resolve, 100));
233
233
  mockTable.insert.mockClear();
234
- logger.debug('Debug message');
235
- await new Promise(resolve => setTimeout(resolve, 20));
236
- logger.info('Info message');
237
- await new Promise(resolve => setTimeout(resolve, 20));
238
- logger.log('Log message');
239
- await new Promise(resolve => setTimeout(resolve, 20));
240
- logger.warn('Warn message');
241
- await new Promise(resolve => setTimeout(resolve, 20));
242
- logger.error('Error message');
243
- await new Promise(resolve => setTimeout(resolve, 100));
234
+ logger.debug("Debug message");
235
+ await new Promise((resolve) => setTimeout(resolve, 20));
236
+ logger.info("Info message");
237
+ await new Promise((resolve) => setTimeout(resolve, 20));
238
+ logger.log("Log message");
239
+ await new Promise((resolve) => setTimeout(resolve, 20));
240
+ logger.warn("Warn message");
241
+ await new Promise((resolve) => setTimeout(resolve, 20));
242
+ logger.error("Error message");
243
+ await new Promise((resolve) => setTimeout(resolve, 100));
244
244
  // Should have most/all logs
245
245
  expect(mockTable.insert.mock.calls.length).toBeGreaterThanOrEqual(4);
246
246
  // Check that different levels were used
@@ -248,53 +248,53 @@ describe('console-logger', () => {
248
248
  const uniqueLevels = new Set(levels);
249
249
  expect(uniqueLevels.size).toBeGreaterThanOrEqual(4);
250
250
  });
251
- it('should queue logs before initialization and flush after', async () => {
251
+ it("should queue logs before initialization and flush after", async () => {
252
252
  // Create a delayed promise for ConsoleLogs
253
253
  let resolveConsoleLogs;
254
254
  const delayedPromise = new Promise((resolve) => {
255
255
  resolveConsoleLogs = resolve;
256
256
  });
257
- const { ConsoleLogs } = require('./console-logs.table');
257
+ const { ConsoleLogs } = require("./console-logs.table");
258
258
  ConsoleLogs.mockReturnValueOnce(delayedPromise);
259
- const logger = new console_logger_1.Logger('EarlyModule');
259
+ const logger = new console_logger_1.Logger("EarlyModule");
260
260
  // Log before initialization
261
- logger.log('Early message 1');
262
- logger.warn('Early message 2');
263
- logger.error('Early message 3');
261
+ logger.log("Early message 1");
262
+ logger.warn("Early message 2");
263
+ logger.error("Early message 3");
264
264
  // Small delay to ensure logs are queued
265
- await new Promise(resolve => setTimeout(resolve, 50));
265
+ await new Promise((resolve) => setTimeout(resolve, 50));
266
266
  // Should not have written yet
267
267
  expect(mockTable.insert).not.toHaveBeenCalled();
268
268
  // Now resolve the ConsoleLogs promise
269
269
  resolveConsoleLogs(mockTable);
270
270
  // Wait for flush
271
- await new Promise(resolve => setTimeout(resolve, 300));
271
+ await new Promise((resolve) => setTimeout(resolve, 300));
272
272
  // Should have flushed pending logs
273
273
  expect(mockTable.insert.mock.calls.length).toBeGreaterThanOrEqual(2);
274
274
  });
275
- it('should write logs directly after initialization', async () => {
276
- const logger = new console_logger_1.Logger('LateModule');
275
+ it("should write logs directly after initialization", async () => {
276
+ const logger = new console_logger_1.Logger("LateModule");
277
277
  // Wait for initialization
278
- await new Promise(resolve => setTimeout(resolve, 100));
278
+ await new Promise((resolve) => setTimeout(resolve, 100));
279
279
  mockTable.insert.mockClear();
280
- logger.log('Direct message');
281
- await new Promise(resolve => setTimeout(resolve, 100));
280
+ logger.log("Direct message");
281
+ await new Promise((resolve) => setTimeout(resolve, 100));
282
282
  expect(mockTable.insert).toHaveBeenCalledTimes(1);
283
- expect(mockTable.insert.mock.calls[0][0].message).toBe('Direct message');
283
+ expect(mockTable.insert.mock.calls[0][0].message).toBe("Direct message");
284
284
  });
285
- it('should use reliable source from constructor', async () => {
286
- const logger1 = new console_logger_1.Logger('SourceA');
287
- const logger2 = new console_logger_1.Logger('SourceB');
285
+ it("should use reliable source from constructor", async () => {
286
+ const logger1 = new console_logger_1.Logger("SourceA");
287
+ const logger2 = new console_logger_1.Logger("SourceB");
288
288
  // Wait for initialization
289
- await new Promise(resolve => setTimeout(resolve, 100));
289
+ await new Promise((resolve) => setTimeout(resolve, 100));
290
290
  mockTable.insert.mockClear();
291
- logger1.log('From A');
292
- await new Promise(resolve => setTimeout(resolve, 50));
293
- logger2.log('From B');
294
- await new Promise(resolve => setTimeout(resolve, 100));
291
+ logger1.log("From A");
292
+ await new Promise((resolve) => setTimeout(resolve, 50));
293
+ logger2.log("From B");
294
+ await new Promise((resolve) => setTimeout(resolve, 100));
295
295
  expect(mockTable.insert).toHaveBeenCalledTimes(2);
296
- expect(mockTable.insert.mock.calls[0][0].source).toBe('SourceA');
297
- expect(mockTable.insert.mock.calls[1][0].source).toBe('SourceB');
296
+ expect(mockTable.insert.mock.calls[0][0].source).toBe("SourceA");
297
+ expect(mockTable.insert.mock.calls[1][0].source).toBe("SourceB");
298
298
  });
299
299
  });
300
300
  });