@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.
- package/dist/context/data-context.d.ts +4 -4
- package/dist/context/data-context.js +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context/index.js +4 -0
- package/dist/context/user-context-singleton.js +13 -14
- package/dist/context/user-context.d.ts +4 -4
- package/dist/context/user-context.js +48 -31
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/assistants.js +35 -24
- package/dist/data/change-tracking.d.ts +8 -8
- package/dist/data/change-tracking.js +45 -39
- package/dist/data/channels.js +5 -5
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.js +21 -23
- package/dist/data/data-locks.test.js +73 -75
- package/dist/data/device-sync-info.d.ts +1 -1
- package/dist/data/device-sync-info.js +4 -4
- package/dist/data/devices.d.ts +1 -1
- package/dist/data/devices.js +9 -12
- package/dist/data/embeddings.js +14 -11
- package/dist/data/files/file-read-stream.d.ts +2 -2
- package/dist/data/files/file-read-stream.js +23 -14
- package/dist/data/files/file-write-stream.d.ts +2 -2
- package/dist/data/files/file-write-stream.js +8 -8
- package/dist/data/files/file.types.d.ts +2 -2
- package/dist/data/files/file.types.js +17 -11
- package/dist/data/files/files.d.ts +6 -6
- package/dist/data/files/files.js +17 -19
- package/dist/data/files/files.test.js +213 -214
- package/dist/data/files/index.d.ts +4 -4
- package/dist/data/files/index.js +4 -4
- package/dist/data/group-member-roles.js +2 -2
- package/dist/data/group-members.d.ts +5 -5
- package/dist/data/group-members.js +27 -18
- package/dist/data/group-members.test.js +73 -73
- package/dist/data/group-permissions.d.ts +3 -3
- package/dist/data/group-permissions.js +13 -11
- package/dist/data/group-share.d.ts +2 -2
- package/dist/data/group-share.js +29 -24
- package/dist/data/groups.d.ts +4 -4
- package/dist/data/groups.js +27 -19
- package/dist/data/groups.test.js +44 -44
- package/dist/data/index.d.ts +6 -6
- package/dist/data/index.js +6 -6
- package/dist/data/knowledge/peer-types.js +9 -9
- package/dist/data/messages.d.ts +5 -5
- package/dist/data/messages.js +43 -30
- package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +10 -12
- package/dist/data/orm/cursor.d.ts +1 -1
- package/dist/data/orm/cursor.js +2 -2
- package/dist/data/orm/cursor.test.js +92 -93
- package/dist/data/orm/data-query.d.ts +3 -3
- package/dist/data/orm/data-query.js +24 -18
- package/dist/data/orm/data-query.mongo.d.ts +1 -1
- package/dist/data/orm/data-query.mongo.js +49 -51
- package/dist/data/orm/data-query.mongo.test.js +173 -204
- package/dist/data/orm/data-query.sqlite.d.ts +1 -1
- package/dist/data/orm/data-query.sqlite.js +84 -73
- package/dist/data/orm/data-query.sqlite.test.js +164 -176
- package/dist/data/orm/data-query.test.js +216 -224
- package/dist/data/orm/decorators.js +3 -3
- package/dist/data/orm/dependency-injection.test.js +53 -56
- package/dist/data/orm/doc.d.ts +4 -4
- package/dist/data/orm/doc.js +17 -21
- package/dist/data/orm/event-registry.d.ts +1 -1
- package/dist/data/orm/event-registry.test.js +16 -16
- package/dist/data/orm/factory.d.ts +2 -2
- package/dist/data/orm/factory.js +33 -33
- package/dist/data/orm/index.d.ts +10 -10
- package/dist/data/orm/index.js +10 -10
- package/dist/data/orm/multi-cursors.d.ts +1 -1
- package/dist/data/orm/multi-cursors.js +6 -6
- package/dist/data/orm/multi-cursors.test.js +152 -144
- package/dist/data/orm/sql.data-source.d.ts +7 -7
- package/dist/data/orm/sql.data-source.js +88 -93
- package/dist/data/orm/sql.data-source.test.js +109 -101
- package/dist/data/orm/subscribable.data-source.d.ts +4 -4
- package/dist/data/orm/subscribable.data-source.js +5 -5
- package/dist/data/orm/table-container-events.test.js +34 -26
- package/dist/data/orm/table-container.d.ts +6 -6
- package/dist/data/orm/table-container.js +33 -21
- package/dist/data/orm/table-container.test.js +64 -53
- package/dist/data/orm/table-definitions.system.d.ts +3 -3
- package/dist/data/orm/table-definitions.system.js +3 -3
- package/dist/data/orm/table-definitions.type.d.ts +5 -5
- package/dist/data/orm/table-dependencies.d.ts +2 -2
- package/dist/data/orm/table.d.ts +5 -5
- package/dist/data/orm/table.event-source.test.js +105 -115
- package/dist/data/orm/table.js +35 -34
- package/dist/data/orm/types.d.ts +3 -3
- package/dist/data/orm/types.js +26 -25
- package/dist/data/orm/types.test.js +166 -92
- package/dist/data/package-permissions.d.ts +1 -1
- package/dist/data/package-permissions.js +2 -2
- package/dist/data/package-version-permissions.d.ts +1 -1
- package/dist/data/package-version-permissions.js +2 -2
- package/dist/data/package-versions.d.ts +9 -9
- package/dist/data/package-versions.js +47 -33
- package/dist/data/packages.d.ts +2 -2
- package/dist/data/packages.js +36 -18
- package/dist/data/packages.utils.d.ts +2 -2
- package/dist/data/packages.utils.js +4 -4
- package/dist/data/persistent-vars.d.ts +15 -15
- package/dist/data/persistent-vars.js +165 -154
- package/dist/data/table-definitions-table.d.ts +5 -5
- package/dist/data/table-definitions-table.js +13 -12
- package/dist/data/tool-tests.js +6 -6
- package/dist/data/tools.js +29 -19
- package/dist/data/user-permissions.d.ts +1 -1
- package/dist/data/user-permissions.js +5 -5
- package/dist/data/user-permissions.test.js +90 -88
- package/dist/data/user-trust-levels.js +10 -10
- package/dist/data/users.d.ts +4 -4
- package/dist/data/users.js +16 -15
- package/dist/data/voice-messages.d.ts +2 -2
- package/dist/data/voice-messages.js +13 -13
- package/dist/data/welcome-modal.pvar.js +3 -1
- package/dist/data/workflow-logs.js +26 -18
- package/dist/data/workflow-runs.d.ts +6 -6
- package/dist/data/workflow-runs.js +70 -44
- package/dist/data/workflows.d.ts +2 -2
- package/dist/data/workflows.js +7 -9
- package/dist/device/binary-peer-connection-v2.d.ts +7 -7
- package/dist/device/binary-peer-connection-v2.js +32 -28
- package/dist/device/binary-peer-connection-v2.test.js +80 -67
- package/dist/device/binary-peer-connection.d.ts +7 -7
- package/dist/device/binary-peer-connection.js +29 -28
- package/dist/device/binary-peer-connection.test.js +35 -31
- package/dist/device/connection.d.ts +5 -5
- package/dist/device/connection.js +59 -48
- package/dist/device/connection.test.js +74 -68
- package/dist/device/device-election.d.ts +2 -2
- package/dist/device/device-election.js +25 -20
- package/dist/device/device-election.test.js +35 -36
- package/dist/device/device.d.ts +2 -2
- package/dist/device/device.js +10 -4
- package/dist/device/device.test.js +16 -17
- package/dist/device/get-trust-level-fn.d.ts +2 -2
- package/dist/device/get-trust-level-fn.js +22 -11
- package/dist/device/get-trust-level-fn.test.js +58 -58
- package/dist/device/socket-io-binary-peer.d.ts +1 -1
- package/dist/device/socket-io-binary-peer.js +16 -13
- package/dist/device/socket.type.d.ts +2 -2
- package/dist/device/streamed-socket.d.ts +2 -2
- package/dist/device/streamed-socket.js +8 -8
- package/dist/device/streamed-socket.test.js +40 -40
- package/dist/device/tx-encoding.test.js +77 -77
- package/dist/events.d.ts +1 -1
- package/dist/events.js +5 -2
- package/dist/group-invite/group-invite.js +110 -19
- package/dist/group-invite/group-invite.pvars.d.ts +2 -2
- package/dist/group-invite/group-invite.pvars.js +21 -13
- package/dist/group-invite/group-invite.types.d.ts +1 -1
- package/dist/group-invite/index.d.ts +3 -3
- package/dist/group-invite/index.js +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.js +30 -25
- package/dist/keys.d.ts +3 -3
- package/dist/keys.js +31 -30
- package/dist/keys.test.js +69 -61
- package/dist/logging/console-logger.d.ts +1 -1
- package/dist/logging/console-logger.js +35 -40
- package/dist/logging/console-logger.test.js +115 -115
- package/dist/logging/console-logs.table.d.ts +3 -3
- package/dist/logging/console-logs.table.js +28 -23
- package/dist/mentions.js +16 -12
- package/dist/observable.d.ts +2 -2
- package/dist/observable.js +15 -9
- package/dist/observable.test.js +47 -47
- package/dist/package-loader/get-require.js +3 -4
- package/dist/package-loader/package-loader.d.ts +2 -2
- package/dist/package-loader/package-loader.js +52 -34
- package/dist/peers-ui/peers-ui.d.ts +2 -2
- package/dist/peers-ui/peers-ui.js +2 -4
- package/dist/peers-ui/peers-ui.types.d.ts +3 -3
- package/dist/peers-ui/peers-ui.types.js +0 -1
- package/dist/rpc-types.d.ts +61 -59
- package/dist/rpc-types.js +61 -55
- package/dist/serial-json.d.ts +1 -1
- package/dist/serial-json.js +50 -43
- package/dist/serial-json.test.js +22 -22
- package/dist/system-ids.js +8 -8
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/tools-factory.d.ts +1 -1
- package/dist/tools/tools-factory.js +2 -2
- package/dist/types/assistant-runner-args.d.ts +3 -3
- package/dist/types/peer-device.d.ts +1 -1
- package/dist/types/peers-package.d.ts +3 -3
- package/dist/types/workflow-logger.d.ts +1 -1
- package/dist/types/workflow-run-context.d.ts +4 -4
- package/dist/types/workflow.d.ts +4 -4
- package/dist/types/workflow.js +27 -14
- package/dist/types/zod-types.d.ts +2 -1
- package/dist/types/zod-types.js +9 -3
- package/dist/user-connect/connection-code.d.ts +1 -1
- package/dist/user-connect/connection-code.js +7 -7
- package/dist/user-connect/connection-code.test.js +106 -106
- package/dist/user-connect/index.d.ts +3 -3
- package/dist/user-connect/index.js +1 -1
- package/dist/user-connect/user-connect.pvars.js +13 -11
- package/dist/user-connect/user-connect.types.d.ts +3 -3
- package/dist/users.query.d.ts +2 -2
- package/dist/users.query.js +40 -30
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +34 -32
- package/dist/utils.test.js +12 -8
- package/dist/workflow-log-formatter.d.ts +1 -1
- package/dist/workflow-log-formatter.js +17 -18
- package/package.json +14 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type ConsoleLevel =
|
|
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 =
|
|
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
|
|
30
|
-
let consoleLogsProxySubscription
|
|
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(
|
|
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 = [
|
|
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] =
|
|
49
|
+
console[level] = (...args) => {
|
|
50
50
|
// Always call original console method first (preserve terminal output)
|
|
51
51
|
original.apply(console, args);
|
|
52
|
-
defaultLogger
|
|
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 ===
|
|
66
|
-
const resetCode =
|
|
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(
|
|
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(
|
|
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(
|
|
167
|
-
return lines.slice(4).join(
|
|
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(
|
|
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(
|
|
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] ===
|
|
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 ===
|
|
219
|
+
if (typeof a === "object" && !((0, lodash_1.isDate)(a) || a === null)) {
|
|
222
220
|
break;
|
|
223
221
|
}
|
|
224
|
-
message +=
|
|
222
|
+
message += ` ${args.shift()}`;
|
|
225
223
|
}
|
|
226
|
-
|
|
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 ===
|
|
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(
|
|
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) ||
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
18
|
+
const { __mockTable: mockTable } = require("./console-logs.table");
|
|
19
19
|
// Mock utils
|
|
20
|
-
jest.mock(
|
|
21
|
-
newid: () =>
|
|
22
|
-
getTimestamp: () =>
|
|
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(
|
|
25
|
+
describe("console-logger", () => {
|
|
26
26
|
let originalConsole;
|
|
27
|
-
describe(
|
|
28
|
-
it(
|
|
29
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
30
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
31
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
34
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
35
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
38
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
39
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
42
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
43
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
46
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
49
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
50
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
51
|
-
expect((0, console_logger_1.extractCoreMessage)(
|
|
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(
|
|
81
|
-
it(
|
|
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(
|
|
88
|
+
throw new Error("Database error");
|
|
89
89
|
}
|
|
90
90
|
return Promise.resolve();
|
|
91
91
|
});
|
|
92
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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(
|
|
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(
|
|
106
|
-
it(
|
|
107
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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(
|
|
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(
|
|
124
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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(
|
|
141
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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 =
|
|
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(
|
|
178
|
-
it(
|
|
179
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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(
|
|
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(
|
|
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(
|
|
199
|
-
it(
|
|
200
|
-
(0, console_logger_1.setupConsoleLogsProxy)(
|
|
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(
|
|
205
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
206
|
-
console.error(
|
|
207
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
208
|
-
console.warn(
|
|
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(
|
|
217
|
-
it(
|
|
218
|
-
const logger = new console_logger_1.Logger(
|
|
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(
|
|
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(
|
|
227
|
-
expect(call[0].message).toBe(
|
|
226
|
+
expect(call[0].source).toBe("MyModule");
|
|
227
|
+
expect(call[0].message).toBe("Test message");
|
|
228
228
|
});
|
|
229
|
-
it(
|
|
230
|
-
const logger = new console_logger_1.Logger(
|
|
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(
|
|
235
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
236
|
-
logger.info(
|
|
237
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
238
|
-
logger.log(
|
|
239
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
240
|
-
logger.warn(
|
|
241
|
-
await new Promise(resolve => setTimeout(resolve, 20));
|
|
242
|
-
logger.error(
|
|
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(
|
|
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(
|
|
257
|
+
const { ConsoleLogs } = require("./console-logs.table");
|
|
258
258
|
ConsoleLogs.mockReturnValueOnce(delayedPromise);
|
|
259
|
-
const logger = new console_logger_1.Logger(
|
|
259
|
+
const logger = new console_logger_1.Logger("EarlyModule");
|
|
260
260
|
// Log before initialization
|
|
261
|
-
logger.log(
|
|
262
|
-
logger.warn(
|
|
263
|
-
logger.error(
|
|
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(
|
|
276
|
-
const logger = new console_logger_1.Logger(
|
|
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(
|
|
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(
|
|
283
|
+
expect(mockTable.insert.mock.calls[0][0].message).toBe("Direct message");
|
|
284
284
|
});
|
|
285
|
-
it(
|
|
286
|
-
const logger1 = new console_logger_1.Logger(
|
|
287
|
-
const logger2 = new console_logger_1.Logger(
|
|
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(
|
|
292
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
293
|
-
logger2.log(
|
|
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(
|
|
297
|
-
expect(mockTable.insert.mock.calls[1][0].source).toBe(
|
|
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
|
});
|