fix: rTorrent null-safety, configurable SAB_HISTORY_LIMIT, lastError visibility (#68)
Build and Push Docker Image / build (push) Successful in 59s
Docs Check / Markdown lint (push) Failing after 1m45s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 2m7s
CI / Security audit (push) Successful in 2m33s
Docs Check / Mermaid diagram parse check (push) Successful in 2m55s
CI / Swagger Validation & Coverage (push) Successful in 3m19s
CI / Tests & coverage (push) Successful in 3m29s
Build and Push Docker Image / build (push) Successful in 59s
Docs Check / Markdown lint (push) Failing after 1m45s
Licence Check / Licence compatibility and copyright header verification (push) Successful in 2m7s
CI / Security audit (push) Successful in 2m33s
Docs Check / Mermaid diagram parse check (push) Successful in 2m55s
CI / Swagger Validation & Coverage (push) Successful in 3m19s
CI / Tests & coverage (push) Successful in 3m29s
- RTorrentClient: guard d.multicall2 returning non-array, per-row try/catch, explicit Number()/String() coercions, _extractArrInfo null-safe - RTorrentClient.getClientStatus: coerce rates through Number.isFinite - SABnzbdClient: history limit now reads SAB_HISTORY_LIMIT env var (default 10) - DownloadClient: added _recordLastError, _clearLastError, getLastError on base - All four clients call _recordLastError on failure, _clearLastError on success - DownloadClientRegistry.getAllClientStatuses: includes lastError in result - GET /api/status/status: exposes downloadClients[] array with per-client lastError - Tests: RTorrentClient null-safety + lastError, SABnzbd history limit + lastError, downloadClients.test expectation updated for new lastError field
This commit is contained in:
@@ -25,6 +25,41 @@ class DownloadClient {
|
||||
this.apiKey = instanceConfig.apiKey;
|
||||
this.username = instanceConfig.username;
|
||||
this.password = instanceConfig.password;
|
||||
|
||||
// Last error encountered while talking to this client.
|
||||
// Cleared on successful calls via _clearLastError(); set via _recordLastError().
|
||||
// Surfaced through getAllClientStatuses() so the admin status panel can show
|
||||
// a per-client failure indicator without needing to scrape logs.
|
||||
this.lastError = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Record an error encountered while talking to this client.
|
||||
* @param {string} operation - Short description of the operation (e.g. 'getActiveDownloads')
|
||||
* @param {Error|string} error - Error object or message
|
||||
*/
|
||||
_recordLastError(operation, error) {
|
||||
const message = (error && error.message) ? error.message : String(error || 'unknown error');
|
||||
this.lastError = {
|
||||
operation,
|
||||
message,
|
||||
at: new Date().toISOString()
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the last error (called when an operation succeeds).
|
||||
*/
|
||||
_clearLastError() {
|
||||
this.lastError = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public accessor for the last recorded error, or null if none.
|
||||
* @returns {{operation:string, message:string, at:string}|null}
|
||||
*/
|
||||
getLastError() {
|
||||
return this.lastError;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user