mirror of
https://github.com/benjamin-wilson/public-pool.git
synced 2026-09-29 17:15:03 -07:00
Migrate pool storage to TimescaleDB and Redis
This commit is contained in:
@@ -3,6 +3,8 @@ import { Controller, Get, NotFoundException, Param } from '@nestjs/common';
|
||||
import { AddressSettingsService } from '../../ORM/address-settings/address-settings.service';
|
||||
import { ClientStatisticsService } from '../../ORM/client-statistics/client-statistics.service';
|
||||
import { ClientService } from '../../ORM/client/client.service';
|
||||
import { ShareAccountingService } from '../../ORM/share-accounting/share-accounting.service';
|
||||
import { RedisMessagingService } from '../../services/redis-messaging.service';
|
||||
|
||||
|
||||
@Controller('client')
|
||||
@@ -11,29 +13,38 @@ export class ClientController {
|
||||
constructor(
|
||||
private readonly clientService: ClientService,
|
||||
private readonly clientStatisticsService: ClientStatisticsService,
|
||||
private readonly addressSettingsService: AddressSettingsService
|
||||
private readonly addressSettingsService: AddressSettingsService,
|
||||
private readonly shareAccountingService: ShareAccountingService,
|
||||
private readonly redisMessagingService: RedisMessagingService
|
||||
) { }
|
||||
|
||||
|
||||
@Get(':address')
|
||||
async getClientInfo(@Param('address') address: string) {
|
||||
|
||||
const workers = await this.clientService.getByAddress(address);
|
||||
const workers = await this.redisMessagingService.getClientPresenceByAddress(address);
|
||||
const sessionSummaries = await this.shareAccountingService.getSessionSummaries(workers.map(worker => worker.clientId));
|
||||
|
||||
const addressSettings = await this.addressSettingsService.getSettings(address, false);
|
||||
|
||||
return {
|
||||
bestDifficulty: addressSettings?.bestDifficulty,
|
||||
workersCount: workers.length,
|
||||
accounting: await this.shareAccountingService.getAddressSummary(address),
|
||||
workers: await Promise.all(
|
||||
workers.map(async (worker) => {
|
||||
const sessionSummary = sessionSummaries.get(worker.clientId);
|
||||
const bestDifficulty = Math.max(
|
||||
Number(worker.bestDifficulty ?? 0),
|
||||
Number(sessionSummary?.bestSubmissionDifficulty ?? 0),
|
||||
);
|
||||
return {
|
||||
sessionId: worker.sessionId,
|
||||
name: worker.clientName,
|
||||
bestDifficulty: parseFloat(worker.bestDifficulty as any).toFixed(2),
|
||||
hashRate: worker.hashRate,
|
||||
bestDifficulty: bestDifficulty.toFixed(2),
|
||||
hashRate: sessionSummary?.hashRateLast10Minutes ?? worker.hashRate,
|
||||
startTime: worker.startTime,
|
||||
lastSeen: worker.updatedAt
|
||||
lastSeen: sessionSummary?.latestShareAt ?? worker.lastSeen
|
||||
};
|
||||
})
|
||||
)
|
||||
@@ -49,7 +60,8 @@ export class ClientController {
|
||||
@Get(':address/:workerName')
|
||||
async getWorkerGroupInfo(@Param('address') address: string, @Param('workerName') workerName: string) {
|
||||
|
||||
const workers = await this.clientService.getByName(address, workerName);
|
||||
const workers = (await this.redisMessagingService.getClientPresenceByAddress(address))
|
||||
.filter(worker => worker.clientName === workerName);
|
||||
|
||||
const bestDifficulty = workers.reduce((pre, cur, idx, arr) => {
|
||||
if (cur.bestDifficulty > pre) {
|
||||
@@ -63,6 +75,7 @@ export class ClientController {
|
||||
|
||||
name: workerName,
|
||||
bestDifficulty: Math.floor(bestDifficulty),
|
||||
accounting: await this.shareAccountingService.getWorkerGroupSummary(address, workerName),
|
||||
chartData: chartData,
|
||||
|
||||
}
|
||||
@@ -71,7 +84,17 @@ export class ClientController {
|
||||
@Get(':address/:workerName/:sessionId')
|
||||
async getWorkerInfo(@Param('address') address: string, @Param('workerName') workerName: string, @Param('sessionId') sessionId: string) {
|
||||
|
||||
const worker = await this.clientService.getBySessionId(address, workerName, sessionId);
|
||||
const presenceWorker = (await this.redisMessagingService.getClientPresenceByAddress(address))
|
||||
.find(worker => worker.clientName === workerName && worker.sessionId === sessionId);
|
||||
const worker = presenceWorker == null
|
||||
? await this.clientService.getBySessionId(address, workerName, sessionId)
|
||||
: {
|
||||
id: presenceWorker.clientId,
|
||||
sessionId: presenceWorker.sessionId,
|
||||
clientName: presenceWorker.clientName,
|
||||
bestDifficulty: presenceWorker.bestDifficulty,
|
||||
startTime: presenceWorker.startTime,
|
||||
};
|
||||
if (worker == null) {
|
||||
return new NotFoundException();
|
||||
}
|
||||
@@ -81,6 +104,7 @@ export class ClientController {
|
||||
sessionId: worker.sessionId,
|
||||
name: worker.clientName,
|
||||
bestDifficulty: Math.floor(worker.bestDifficulty),
|
||||
accounting: await this.shareAccountingService.getSessionSummary(worker.id),
|
||||
chartData: chartData,
|
||||
startTime: worker.startTime
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user