Compare commits

...

2 Commits

Author SHA1 Message Date
anonpenguin23
ca81e60bcb Refactor HttpClient error logging and SQL query handling
- Improved logging for expected 404 responses in find-one calls, now logged as warnings instead of errors for better clarity.
- Enhanced SQL query detail logging by refining the formatting of arguments in the console output.
- Cleaned up code by removing unnecessary checks for expected 404 errors related to blocked users and conversation participants.
2025-11-21 14:41:04 +02:00
anonpenguin23
091a6d5751 Enhance HttpClient to log SQL query details for rqlite operations
- Added functionality to extract and log SQL query details when making requests to rqlite endpoints, including direct SQL queries and table-based queries.
- Improved error handling for expected 404 responses, logging them as warnings instead of errors for better visibility.
- Updated console logging to include query details when available, enhancing debugging capabilities.
2025-11-21 14:39:07 +02:00

View File

@ -135,6 +135,51 @@ export class HttpClient {
fetchOptions.body = JSON.stringify(options.body);
}
// Extract and log SQL query details for rqlite operations
const isRqliteOperation = path.includes("/v1/rqlite/");
let queryDetails: string | null = null;
if (isRqliteOperation && options.body) {
try {
const body =
typeof options.body === "string"
? JSON.parse(options.body)
: options.body;
if (body.sql) {
// Direct SQL query (query/exec endpoints)
queryDetails = `SQL: ${body.sql}`;
if (body.args && body.args.length > 0) {
queryDetails += ` | Args: [${body.args
.map((a: any) => (typeof a === "string" ? `"${a}"` : a))
.join(", ")}]`;
}
} else if (body.table) {
// Table-based query (find/find-one/select endpoints)
queryDetails = `Table: ${body.table}`;
if (body.criteria && Object.keys(body.criteria).length > 0) {
queryDetails += ` | Criteria: ${JSON.stringify(body.criteria)}`;
}
if (body.options) {
queryDetails += ` | Options: ${JSON.stringify(body.options)}`;
}
if (body.select) {
queryDetails += ` | Select: ${JSON.stringify(body.select)}`;
}
if (body.where) {
queryDetails += ` | Where: ${JSON.stringify(body.where)}`;
}
if (body.limit) {
queryDetails += ` | Limit: ${body.limit}`;
}
if (body.offset) {
queryDetails += ` | Offset: ${body.offset}`;
}
}
} catch (e) {
// Failed to parse body, ignore
}
}
try {
const result = await this.requestWithRetry(
url.toString(),
@ -144,74 +189,42 @@ export class HttpClient {
);
const duration = performance.now() - startTime;
if (typeof console !== "undefined") {
console.log(
`[HttpClient] ${method} ${path} completed in ${duration.toFixed(2)}ms`
);
const logMessage = `[HttpClient] ${method} ${path} completed in ${duration.toFixed(
2
)}ms`;
if (queryDetails) {
console.log(logMessage);
console.log(`[HttpClient] ${queryDetails}`);
} else {
console.log(logMessage);
}
}
return result;
} catch (error) {
const duration = performance.now() - startTime;
if (typeof console !== "undefined") {
// Cache "key not found" (404 or error message) is expected behavior - don't log as error
const isCacheGetNotFound =
path === "/v1/cache/get" &&
error instanceof SDKError &&
(error.httpStatus === 404 ||
(error.httpStatus === 500 &&
error.message?.toLowerCase().includes("key not found")));
// "Not found" (404) for blocked_users is expected behavior - don't log as error
// This happens when checking if users are blocked (most users aren't blocked)
const isBlockedUsersNotFound =
// For 404 errors on find-one calls, log at warn level (not error) since "not found" is expected
// Application layer handles these cases in try-catch blocks
const is404FindOne =
path === "/v1/rqlite/find-one" &&
error instanceof SDKError &&
error.httpStatus === 404 &&
options.body &&
(() => {
try {
const body =
typeof options.body === "string"
? JSON.parse(options.body)
: options.body;
return body.table === "blocked_users";
} catch {
return false;
}
})();
error.httpStatus === 404;
// "Not found" (404) for conversation_participants is expected behavior - don't log as error
// This happens when checking if a user is a participant (e.g., on first group join)
const isConversationParticipantNotFound =
path === "/v1/rqlite/find-one" &&
error instanceof SDKError &&
error.httpStatus === 404 &&
options.body &&
(() => {
try {
const body =
typeof options.body === "string"
? JSON.parse(options.body)
: options.body;
return body.table === "conversation_participants";
} catch {
return false;
}
})();
if (
isCacheGetNotFound ||
isBlockedUsersNotFound ||
isConversationParticipantNotFound
) {
// Log cache miss, non-blocked status, or non-participant status as debug/info, not error
// These are expected behaviors
} else {
console.error(
`[HttpClient] ${method} ${path} failed after ${duration.toFixed(
if (is404FindOne) {
// Log as warning for visibility, but not as error since it's expected behavior
console.warn(
`[HttpClient] ${method} ${path} returned 404 after ${duration.toFixed(
2
)}ms:`,
error
)}ms (expected for optional lookups)`
);
} else {
const errorMessage = `[HttpClient] ${method} ${path} failed after ${duration.toFixed(
2
)}ms:`;
console.error(errorMessage, error);
if (queryDetails) {
console.error(`[HttpClient] ${queryDetails}`);
}
}
}
throw error;