From 8c8c263aa382a4399a370a64d5a7e413cf6448f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 12:57:01 -0300 Subject: [PATCH 1/8] feat: implement logging interface and integrate logger into session management --- index.d.ts | 12 ++++++++++-- src/curve.d.ts | 8 ++++++-- src/curve.js | 14 +++++++------- src/noop_logger.js | 11 +++++++++++ src/queue_job.js | 3 ++- src/session_builder.js | 9 +++++---- src/session_cipher.js | 14 ++++++++------ src/session_record.js | 29 +++++++++++++++++------------ 8 files changed, 66 insertions(+), 34 deletions(-) create mode 100644 src/noop_logger.js diff --git a/index.d.ts b/index.d.ts index 94e46d8d..d3ac0bfc 100644 --- a/index.d.ts +++ b/index.d.ts @@ -12,6 +12,14 @@ interface E2ESession { }; } +export interface ILogger { + info(obj?: any, msg?: string): void; + warn(obj?: any, msg?: string): void; + error(obj?: any, msg?: string): void; + debug(obj?: any, msg?: string): void; + trace(obj?: any, msg?: string): void; +} + export interface SignalStorage { loadSession(id: string): Promise; storeSession(id: string, session: SessionRecord): Promise; @@ -43,13 +51,13 @@ export class SessionRecord { } export class SessionCipher { - constructor(storage: SignalStorage, remoteAddress: ProtocolAddress); + constructor(storage: SignalStorage, remoteAddress: ProtocolAddress, logger?: ILogger); public decryptPreKeyWhisperMessage(ciphertext: Uint8Array): Promise; public decryptWhisperMessage(ciphertext: Uint8Array): Promise; public encrypt(data: Uint8Array): Promise<{ type: number; body: string }>; } export class SessionBuilder { - constructor(storage: SignalStorage, remoteAddress: ProtocolAddress); + constructor(storage: SignalStorage, remoteAddress: ProtocolAddress, logger?: ILogger); public initOutgoing(session: E2ESession): Promise; } diff --git a/src/curve.d.ts b/src/curve.d.ts index ba5437fa..92d4bf96 100644 --- a/src/curve.d.ts +++ b/src/curve.d.ts @@ -1,3 +1,5 @@ +import type { ILogger } from '../index'; + export interface KeyPairType { pubKey: Uint8Array; privKey: Uint8Array; @@ -7,7 +9,8 @@ export function generateKeyPair(): KeyPairType; export function calculateAgreement( publicKey: Uint8Array, - privateKey: Uint8Array + privateKey: Uint8Array, + logger?: ILogger ): Uint8Array; export function calculateSignature( @@ -18,5 +21,6 @@ export function calculateSignature( export function verifySignature( publicKey: Uint8Array, message: Uint8Array, - signature: Uint8Array + signature: Uint8Array, + logger?: ILogger ): boolean; diff --git a/src/curve.js b/src/curve.js index 55b4b809..1cbc904d 100644 --- a/src/curve.js +++ b/src/curve.js @@ -1,8 +1,8 @@ - 'use strict'; const curveJs = require('curve25519-js'); const nodeCrypto = require('crypto'); +const noopLogger = require('./noop_logger'); // from: https://github.com/digitalbazaar/x25519-key-agreement-key-2019/blob/master/lib/crypto.js const PUBLIC_KEY_DER_PREFIX = Buffer.from([ 48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0 @@ -30,7 +30,7 @@ function validatePrivKey(privKey) { } } -function scrubPubKeyFormat(pubKey) { +function scrubPubKeyFormat(pubKey, logger = noopLogger) { if (!(pubKey instanceof Buffer)) { throw new Error(`Invalid public key type: ${pubKey.constructor.name}`); } @@ -40,7 +40,7 @@ function scrubPubKeyFormat(pubKey) { if (pubKey.byteLength == 33) { return pubKey.slice(1); } else { - console.error("WARNING: Expected pubkey of length 33, please report the ST and client that generated the pubkey"); + logger.error("WARNING: Expected pubkey of length 33, please report the ST and client that generated the pubkey"); return pubKey; } } @@ -90,8 +90,8 @@ exports.generateKeyPair = function() { } }; -exports.calculateAgreement = function(pubKey, privKey) { - pubKey = scrubPubKeyFormat(pubKey); +exports.calculateAgreement = function(pubKey, privKey, logger = noopLogger) { + pubKey = scrubPubKeyFormat(pubKey, logger); validatePrivKey(privKey); if (!pubKey || pubKey.byteLength != 32) { throw new Error("Invalid public key"); @@ -127,8 +127,8 @@ exports.calculateSignature = function(privKey, message) { return Buffer.from(curveJs.sign(privKey, message)); }; -exports.verifySignature = function(pubKey, msg, sig, isInit) { - pubKey = scrubPubKeyFormat(pubKey); +exports.verifySignature = function(pubKey, msg, sig, isInit, logger = noopLogger) { + pubKey = scrubPubKeyFormat(pubKey, logger); if (!pubKey || pubKey.byteLength != 32) { throw new Error("Invalid public key"); } diff --git a/src/noop_logger.js b/src/noop_logger.js new file mode 100644 index 00000000..167e1d46 --- /dev/null +++ b/src/noop_logger.js @@ -0,0 +1,11 @@ +// vim: ts=4:sw=4:expandtab + +const noopLogger = { + info: () => {}, + warn: () => {}, + error: () => {}, + debug: () => {}, + trace: () => {}, +}; + +module.exports = noopLogger; diff --git a/src/queue_job.js b/src/queue_job.js index baab89c4..3138d0b5 100644 --- a/src/queue_job.js +++ b/src/queue_job.js @@ -6,6 +6,7 @@ */ 'use strict'; +const noopLogger = require('./noop_logger'); const _queueAsyncBuckets = new Map(); const _gcLimit = 10000; @@ -47,7 +48,7 @@ module.exports = function(bucket, awaitable) { if (typeof bucket === 'string') { awaitable.name = bucket; } else { - console.warn("Unhandled bucket type (for naming):", typeof bucket, bucket); + noopLogger.warn("Unhandled bucket type (for naming):", typeof bucket, bucket); } } let inactive; diff --git a/src/session_builder.js b/src/session_builder.js index 7b7d8520..7c026fb1 100644 --- a/src/session_builder.js +++ b/src/session_builder.js @@ -1,4 +1,3 @@ - 'use strict'; const BaseKeyType = require('./base_key_type'); @@ -8,13 +7,15 @@ const crypto = require('./crypto'); const curve = require('./curve'); const errors = require('./errors'); const queueJob = require('./queue_job'); +const noopLogger = require('./noop_logger'); class SessionBuilder { - constructor(storage, protocolAddress) { + constructor(storage, protocolAddress, logger) { this.addr = protocolAddress; this.storage = storage; + this.logger = logger || noopLogger; } async initOutgoing(device) { @@ -43,7 +44,7 @@ class SessionBuilder { } else { const openSession = record.getOpenSession(); if (openSession) { - console.warn("Closing stale open session for new outgoing prekey bundle"); + this.logger.warn("Closing stale open session for new outgoing prekey bundle"); record.closeSession(openSession); } } @@ -71,7 +72,7 @@ class SessionBuilder { } const existingOpenSession = record.getOpenSession(); if (existingOpenSession) { - console.warn("Closing open session in favor of incoming prekey bundle"); + this.logger.warn("Closing open session in favor of incoming prekey bundle"); record.closeSession(existingOpenSession); } record.setSession(await this.initSession(false, preKeyPair, signedPreKeyPair, diff --git a/src/session_cipher.js b/src/session_cipher.js index 0e6df11e..8fab704a 100644 --- a/src/session_cipher.js +++ b/src/session_cipher.js @@ -9,6 +9,7 @@ const curve = require('./curve'); const errors = require('./errors'); const protobufs = require('./protobufs'); const queueJob = require('./queue_job'); +const noopLogger = require('./noop_logger'); const VERSION = 3; @@ -22,12 +23,13 @@ function assertBuffer(value) { class SessionCipher { - constructor(storage, protocolAddress) { + constructor(storage, protocolAddress, logger) { if (!(protocolAddress instanceof ProtocolAddress)) { throw new TypeError("protocolAddress must be a ProtocolAddress"); } this.addr = protocolAddress; this.storage = storage; + this.logger = logger || noopLogger; } _encodeTupleByte(number1, number2) { @@ -54,7 +56,7 @@ class SessionCipher { } async storeRecord(record) { - record.removeOldSessions(); + record.removeOldSessions(this.logger); await this.storage.storeSession(this.addr.toString(), record); } @@ -154,9 +156,9 @@ class SessionCipher { errs.push(e); } } - console.error("Failed to decrypt message with any known session..."); + this.logger.error("Failed to decrypt message with any known session..."); for (const e of errs) { - console.error("Session error:" + e, e.stack); + this.logger.error({ err: e, stack: e.stack }, "Session decryption error"); } throw new errors.SessionError("No matching sessions found for message"); } @@ -179,7 +181,7 @@ class SessionCipher { // was the most current. Simply make a note of it and continue. If our // actual open session is for reason invalid, that must be handled via // a full SessionError response. - console.warn("Decrypted message with closed session."); + this.logger.warn("Decrypted message with closed session."); } await this.storeRecord(record); return result.plaintext; @@ -201,7 +203,7 @@ class SessionCipher { } record = new SessionRecord(); } - const builder = new SessionBuilder(this.storage, this.addr); + const builder = new SessionBuilder(this.storage, this.addr, this.logger); const preKeyId = await builder.initIncoming(record, preKeyProto); const session = record.getSession(preKeyProto.baseKey); const plaintext = await this.doDecryptWhisperMessage(preKeyProto.message, session); diff --git a/src/session_record.js b/src/session_record.js index 7626a392..ceaaed92 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -1,6 +1,7 @@ // vim: ts=4:sw=4 const BaseKeyType = require('./base_key_type'); +const noopLogger = require('./noop_logger'); const CLOSED_SESSIONS_MAX = 40; const SESSION_RECORD_VERSION = 'v1'; @@ -159,7 +160,8 @@ class SessionEntry { const migrations = [{ version: 'v1', - migrate: function migrateV1(data) { + migrate: function migrateV1(data, logger) { + logger = logger || noopLogger; const sessions = data._sessions; if (data.registrationId) { for (const key in sessions) { @@ -170,7 +172,7 @@ const migrations = [{ } else { for (const key in sessions) { if (sessions[key].indexInfo.closed === -1) { - console.error('V1 session storage migration error: registrationId', + logger.error('V1 session storage migration error: registrationId', data.registrationId, 'for open session version', data.version); } @@ -190,8 +192,8 @@ class SessionRecord { let run = (data.version === undefined); for (let i = 0; i < migrations.length; ++i) { if (run) { - console.info("Migrating session to:", migrations[i].version); - migrations[i].migrate(data); + noopLogger.info("Migrating session to:", migrations[i].version); + migrations[i].migrate(data, noopLogger); } else if (migrations[i].version === data.version) { run = true; } @@ -265,20 +267,22 @@ class SessionRecord { }); } - closeSession(session) { + closeSession(session, logger) { + logger = logger || noopLogger; if (this.isClosed(session)) { - console.warn("Session already closed", session); + logger.warn("Session already closed", session); return; } - console.info("Closing session:", session); + logger.info("Closing session:", session); session.indexInfo.closed = Date.now(); } - openSession(session) { + openSession(session, logger) { + logger = logger || noopLogger; if (!this.isClosed(session)) { - console.warn("Session already open"); + logger.warn("Session already open"); } - console.info("Opening session:", session); + logger.info("Opening session:", session); session.indexInfo.closed = -1; } @@ -286,7 +290,8 @@ class SessionRecord { return session.indexInfo.closed !== -1; } - removeOldSessions() { + removeOldSessions(logger) { + logger = logger || noopLogger; while (Object.keys(this.sessions).length > CLOSED_SESSIONS_MAX) { let oldestKey; let oldestSession; @@ -298,7 +303,7 @@ class SessionRecord { } } if (oldestKey) { - console.info("Removing old closed session:", oldestSession); + logger.info("Removing old closed session:", oldestSession); delete this.sessions[oldestKey]; } else { throw new Error('Corrupt sessions object'); From 29475ef5c3314987bf5c4af8918f2654de72ed24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:03:18 -0300 Subject: [PATCH 2/8] feat: enhance logging by integrating logger into queueJob and session management --- src/noop_logger.js | 10 +++++----- src/queue_job.js | 4 ++-- src/session_builder.js | 2 +- src/session_cipher.js | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/noop_logger.js b/src/noop_logger.js index 167e1d46..6df40296 100644 --- a/src/noop_logger.js +++ b/src/noop_logger.js @@ -1,11 +1,11 @@ // vim: ts=4:sw=4:expandtab const noopLogger = { - info: () => {}, - warn: () => {}, - error: () => {}, - debug: () => {}, - trace: () => {}, + info: () => console.log, + warn: () => console.warn, + error: () => console.error, + debug: () => console.debug, + trace: () => console.trace, }; module.exports = noopLogger; diff --git a/src/queue_job.js b/src/queue_job.js index 3138d0b5..955346f1 100644 --- a/src/queue_job.js +++ b/src/queue_job.js @@ -38,7 +38,7 @@ async function _asyncQueueExecutor(queue, cleanup) { cleanup(); } -module.exports = function(bucket, awaitable) { +module.exports = function(bucket, awaitable, logger = noopLogger) { /* Run the async awaitable only when all other async calls registered * here have completed (or thrown). The bucket argument is a hashable * key representing the task queue to use. */ @@ -48,7 +48,7 @@ module.exports = function(bucket, awaitable) { if (typeof bucket === 'string') { awaitable.name = bucket; } else { - noopLogger.warn("Unhandled bucket type (for naming):", typeof bucket, bucket); + logger.warn("Unhandled bucket type (for naming):", typeof bucket, bucket); } } let inactive; diff --git a/src/session_builder.js b/src/session_builder.js index 7c026fb1..2ecc19ee 100644 --- a/src/session_builder.js +++ b/src/session_builder.js @@ -50,7 +50,7 @@ class SessionBuilder { } record.setSession(session); await this.storage.storeSession(fqAddr, record); - }); + }, this.logger); } async initIncoming(record, message) { diff --git a/src/session_cipher.js b/src/session_cipher.js index 8fab704a..db99d40a 100644 --- a/src/session_cipher.js +++ b/src/session_cipher.js @@ -61,7 +61,7 @@ class SessionCipher { } async queueJob(awaitable) { - return await queueJob(this.addr.toString(), awaitable); + return await queueJob(this.addr.toString(), awaitable, this.logger); } async encrypt(data) { @@ -133,7 +133,7 @@ class SessionCipher { body, registrationId: session.registrationId }; - }); + }, this.logger); } async decryptWithSessions(data, sessions) { @@ -185,7 +185,7 @@ class SessionCipher { } await this.storeRecord(record); return result.plaintext; - }); + }, this.logger); } async decryptPreKeyWhisperMessage(data) { @@ -212,7 +212,7 @@ class SessionCipher { await this.storage.removePreKey(preKeyId); } return plaintext; - }); + }, this.logger); } async doDecryptWhisperMessage(messageBuffer, session) { @@ -318,7 +318,7 @@ class SessionCipher { return false; } return record.haveOpenSession(); - }); + }, this.logger); } async closeOpenSession() { @@ -331,7 +331,7 @@ class SessionCipher { await this.storeRecord(record); } } - }); + }, this.logger); } } From 808b3308f04990f7a37113a12d67a259999adbe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:13:21 -0300 Subject: [PATCH 3/8] refactor: update noopLogger to use no-op functions and adjust logger usage in session migration --- src/noop_logger.js | 10 +++++----- src/session_cipher.js | 10 +++++----- src/session_record.js | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/noop_logger.js b/src/noop_logger.js index 6df40296..167e1d46 100644 --- a/src/noop_logger.js +++ b/src/noop_logger.js @@ -1,11 +1,11 @@ // vim: ts=4:sw=4:expandtab const noopLogger = { - info: () => console.log, - warn: () => console.warn, - error: () => console.error, - debug: () => console.debug, - trace: () => console.trace, + info: () => {}, + warn: () => {}, + error: () => {}, + debug: () => {}, + trace: () => {}, }; module.exports = noopLogger; diff --git a/src/session_cipher.js b/src/session_cipher.js index db99d40a..3658214b 100644 --- a/src/session_cipher.js +++ b/src/session_cipher.js @@ -133,7 +133,7 @@ class SessionCipher { body, registrationId: session.registrationId }; - }, this.logger); + }); } async decryptWithSessions(data, sessions) { @@ -185,7 +185,7 @@ class SessionCipher { } await this.storeRecord(record); return result.plaintext; - }, this.logger); + }); } async decryptPreKeyWhisperMessage(data) { @@ -212,7 +212,7 @@ class SessionCipher { await this.storage.removePreKey(preKeyId); } return plaintext; - }, this.logger); + }); } async doDecryptWhisperMessage(messageBuffer, session) { @@ -318,7 +318,7 @@ class SessionCipher { return false; } return record.haveOpenSession(); - }, this.logger); + }); } async closeOpenSession() { @@ -331,7 +331,7 @@ class SessionCipher { await this.storeRecord(record); } } - }, this.logger); + }); } } diff --git a/src/session_record.js b/src/session_record.js index ceaaed92..f0f05855 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -161,7 +161,6 @@ class SessionEntry { const migrations = [{ version: 'v1', migrate: function migrateV1(data, logger) { - logger = logger || noopLogger; const sessions = data._sessions; if (data.registrationId) { for (const key in sessions) { @@ -188,12 +187,12 @@ class SessionRecord { return new SessionEntry(); } - static migrate(data) { + static migrate(data, logger) { let run = (data.version === undefined); for (let i = 0; i < migrations.length; ++i) { if (run) { - noopLogger.info("Migrating session to:", migrations[i].version); - migrations[i].migrate(data, noopLogger); + logger.info("Migrating session to:", migrations[i].version); + migrations[i].migrate(data, logger); } else if (migrations[i].version === data.version) { run = true; } @@ -203,9 +202,10 @@ class SessionRecord { } } - static deserialize(data) { + static deserialize(data, logger) { + logger = logger || noopLogger; if (data.version !== SESSION_RECORD_VERSION) { - this.migrate(data); + this.migrate(data, logger); } const obj = new this(); if (data._sessions) { From 7a6c19f298e1717a06384dfda84635b67fc44fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:19:34 -0300 Subject: [PATCH 4/8] feat: pass logger to closeSession method in SessionBuilder and SessionCipher, and update migration logging in SessionRecord --- index.d.ts | 2 +- src/session_builder.js | 4 ++-- src/session_cipher.js | 2 +- src/session_record.js | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/index.d.ts b/index.d.ts index d3ac0bfc..0c5ea133 100644 --- a/index.d.ts +++ b/index.d.ts @@ -45,7 +45,7 @@ export class ProtocolAddress { } export class SessionRecord { - static deserialize(serialized: Uint8Array): SessionRecord; + static deserialize(serialized: Uint8Array, logger?: ILogger): SessionRecord; public serialize(): Uint8Array; public haveOpenSession(): boolean; } diff --git a/src/session_builder.js b/src/session_builder.js index 2ecc19ee..964aa908 100644 --- a/src/session_builder.js +++ b/src/session_builder.js @@ -45,7 +45,7 @@ class SessionBuilder { const openSession = record.getOpenSession(); if (openSession) { this.logger.warn("Closing stale open session for new outgoing prekey bundle"); - record.closeSession(openSession); + record.closeSession(openSession, this.logger); } } record.setSession(session); @@ -73,7 +73,7 @@ class SessionBuilder { const existingOpenSession = record.getOpenSession(); if (existingOpenSession) { this.logger.warn("Closing open session in favor of incoming prekey bundle"); - record.closeSession(existingOpenSession); + record.closeSession(existingOpenSession, this.logger); } record.setSession(await this.initSession(false, preKeyPair, signedPreKeyPair, message.identityKey, message.baseKey, diff --git a/src/session_cipher.js b/src/session_cipher.js index 3658214b..f933681a 100644 --- a/src/session_cipher.js +++ b/src/session_cipher.js @@ -327,7 +327,7 @@ class SessionCipher { if (record) { const openSession = record.getOpenSession(); if (openSession) { - record.closeSession(openSession); + record.closeSession(openSession, this.logger); await this.storeRecord(record); } } diff --git a/src/session_record.js b/src/session_record.js index f0f05855..7884519c 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -188,6 +188,7 @@ class SessionRecord { } static migrate(data, logger) { + logger = logger || noopLogger; let run = (data.version === undefined); for (let i = 0; i < migrations.length; ++i) { if (run) { From bc3ebc67e003adb6e4590925463aa40c09e95980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:39:36 -0300 Subject: [PATCH 5/8] refactor: format constructor parameters for SessionCipher and SessionBuilder for improved readability --- index.d.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/index.d.ts b/index.d.ts index 0c5ea133..3adcf0ed 100644 --- a/index.d.ts +++ b/index.d.ts @@ -38,6 +38,9 @@ export interface SignalStorage { } export class ProtocolAddress { + public readonly id: string; + public readonly deviceId: number; + constructor(name: string, deviceId: number); public getName(): string; public getDeviceId(): number; @@ -51,13 +54,21 @@ export class SessionRecord { } export class SessionCipher { - constructor(storage: SignalStorage, remoteAddress: ProtocolAddress, logger?: ILogger); + constructor( + storage: SignalStorage, + remoteAddress: ProtocolAddress, + logger?: ILogger + ); public decryptPreKeyWhisperMessage(ciphertext: Uint8Array): Promise; public decryptWhisperMessage(ciphertext: Uint8Array): Promise; public encrypt(data: Uint8Array): Promise<{ type: number; body: string }>; } export class SessionBuilder { - constructor(storage: SignalStorage, remoteAddress: ProtocolAddress, logger?: ILogger); + constructor( + storage: SignalStorage, + remoteAddress: ProtocolAddress, + logger?: ILogger + ); public initOutgoing(session: E2ESession): Promise; } From 21b367531db4b754bcec10bc80315ca9757cdf7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:48:21 -0300 Subject: [PATCH 6/8] feat: enhance logging in session migration and management with structured messages --- src/session_record.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/session_record.js b/src/session_record.js index 7884519c..219e978c 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -171,9 +171,10 @@ const migrations = [{ } else { for (const key in sessions) { if (sessions[key].indexInfo.closed === -1) { - logger.error('V1 session storage migration error: registrationId', - data.registrationId, 'for open session version', - data.version); + logger.error({ + registrationId: data.registrationId, + version: data.version + }, 'V1 session storage migration error'); } } } @@ -192,7 +193,7 @@ class SessionRecord { let run = (data.version === undefined); for (let i = 0; i < migrations.length; ++i) { if (run) { - logger.info("Migrating session to:", migrations[i].version); + logger.info({ toVersion: migrations[i].version }, "Migrating session"); migrations[i].migrate(data, logger); } else if (migrations[i].version === data.version) { run = true; @@ -271,19 +272,19 @@ class SessionRecord { closeSession(session, logger) { logger = logger || noopLogger; if (this.isClosed(session)) { - logger.warn("Session already closed", session); + logger.warn({ session: session.toString() }, "Session already closed"); return; } - logger.info("Closing session:", session); + logger.info({ session: session.toString() }, "Closing session"); session.indexInfo.closed = Date.now(); } openSession(session, logger) { logger = logger || noopLogger; if (!this.isClosed(session)) { - logger.warn("Session already open"); + logger.warn({ session: session.toString() }, "Session already open"); } - logger.info("Opening session:", session); + logger.info({ session: session.toString() }, "Opening session"); session.indexInfo.closed = -1; } @@ -304,7 +305,7 @@ class SessionRecord { } } if (oldestKey) { - logger.info("Removing old closed session:", oldestSession); + logger.info({ session: oldestSession.toString() }, "Removing old closed session"); delete this.sessions[oldestKey]; } else { throw new Error('Corrupt sessions object'); From 00aa5ceaa51c815ee44271acc0381b820fea0659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:51:28 -0300 Subject: [PATCH 7/8] feat: improve logging in closeSession and openSession methods for better clarity --- src/session_record.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/session_record.js b/src/session_record.js index 219e978c..5d5bf2ec 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -272,19 +272,19 @@ class SessionRecord { closeSession(session, logger) { logger = logger || noopLogger; if (this.isClosed(session)) { - logger.warn({ session: session.toString() }, "Session already closed"); + logger.warn({ session }, "Session already closed"); return; } - logger.info({ session: session.toString() }, "Closing session"); + logger.info({ session }, "Closing session"); session.indexInfo.closed = Date.now(); } openSession(session, logger) { logger = logger || noopLogger; if (!this.isClosed(session)) { - logger.warn({ session: session.toString() }, "Session already open"); + logger.warn({ session }, "Session already open"); } - logger.info({ session: session.toString() }, "Opening session"); + logger.info({ session }, "Opening session"); session.indexInfo.closed = -1; } @@ -305,7 +305,7 @@ class SessionRecord { } } if (oldestKey) { - logger.info({ session: oldestSession.toString() }, "Removing old closed session"); + logger.info({ session: oldestSession }, "Removing old closed session"); delete this.sessions[oldestKey]; } else { throw new Error('Corrupt sessions object'); From 98e361089320a9dbac04e5304ede77b7dfa1628a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lucas?= Date: Tue, 21 Oct 2025 13:53:34 -0300 Subject: [PATCH 8/8] refactor: change log level from info to debug for closing session --- src/session_record.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/session_record.js b/src/session_record.js index 5d5bf2ec..8ea11d9d 100644 --- a/src/session_record.js +++ b/src/session_record.js @@ -275,7 +275,7 @@ class SessionRecord { logger.warn({ session }, "Session already closed"); return; } - logger.info({ session }, "Closing session"); + logger.debug({ session }, "Closing session"); session.indexInfo.closed = Date.now(); }