* feat(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation and immutability
* feat(client): remove unused tap operator
* feat(client): implement generic type parameter
* feat(client): replace constructor based DI with inject functions
* feat(client): implement default date range
* feat(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation
* fix(client): remove dead code
* feat(client): enforce immutability
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert errors to signal
* feat(client): convert hasImpersonationId to signal
* feat(client): convert user to signal
* feat(client): convert to computed signals
* feat(client): convert historicalDataItems and isLoadingPerformance to signals
* feat(client): convert performance and precision to signals
* feat(client): implement OnPush change detection strategy
* fix(common): revert DateRange type change
* fix(client): format file
* fix(client): resolve errors
* feat(client): replace constructor based DI with inject function
* feat(client): enforce encapsulation
* fix(client): remove dead code
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert isLoading to signal
* feat(client): convert hasImpersonationId to signal
* feat(client): convert summary to signal
* feat(client): convert user and hasPermissionToUpdateUserSettings to signals
* feat(client): implement OnPush change detection strategy
* fix(client): remove nested subscription
* feat(client): resolve error
* feat(client): enforce encapsulation
* feat(client): enforce immutability
* feat(client): replace constructor based DI with inject function
* feat(client): replace deprecated getDeviceInfo
* feat(client): convert benchmarks to signal
* feat(client): convert historicalDataItems to signal
* feat(client): convert fearAndGreedIndex to signal
A portfolio snapshot computation that runs longer than the Bull queue's
lock duration is flagged as stalled and fails, surfacing as HTTP 500 on
all portfolio and account endpoints. Because the snapshot job uses the
user id as its job id and was only configured with removeOnComplete, the
failed job stayed in the queue and every later request re-read it, making
the 500 permanent until Redis was flushed by hand.
- Add removeOnFail to PORTFOLIO_SNAPSHOT_PROCESS_JOB_OPTIONS so a failed
job is removed and the next request recomputes instead of returning a
cached failure
- Increase the default portfolio snapshot computation timeout from 30s to
300s so large portfolios compute successfully out of the box (still
overridable via PROCESSOR_PORTFOLIO_SNAPSHOT_COMPUTATION_TIMEOUT)
Refs #6914, #3755