@n1k1t/mock-server
Version:
Powerful util to setup mocks over HTTP APIs
54 lines • 2.29 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.AnalyticsService = void 0;
const rxjs_1 = require("rxjs");
const utils_1 = require("../utils");
const models_1 = require("../models");
const logger_1 = require("../../logger");
const config_1 = __importDefault(require("../../config"));
const logger = logger_1.Logger.build('Services.Analytics');
class AnalyticsService extends models_1.Service {
iterateRedisKeys(prefix) {
if (!this.server.databases.redis) {
return (0, rxjs_1.of)();
}
const { systemKeyPrefix } = config_1.default.get('database');
const subject = new rxjs_1.Subject();
const match = `${this.server.databases.redis.options.keyPrefix ?? ''}${prefix ?? ''}*`;
const stream = this.server.databases.redis.scanStream({ match });
stream.once('end', () => setImmediate(() => subject.complete()));
stream.once('error', (error) => {
logger.error('Got error while scan execution', error?.stack ?? error);
stream.close();
subject.error(error);
});
stream.on('data', (keys) => keys.forEach((key) => key.includes(systemKeyPrefix)
? null
: subject.next(key)));
return subject.asObservable();
}
async calculateRedisUsage(prefix) {
if (!this.server.databases.redis) {
return { count: 0, bytes: 0 };
}
const converter = utils_1.RxConverter.build(this.iterateRedisKeys(prefix));
const result = { count: 0, bytes: 0 };
for await (const key of converter.iterate()) {
const usage = await this.server.databases.redis.call('MEMORY', 'USAGE', key).catch((error) => {
logger.error('Got error while fetching memory usage', error?.stack ?? error);
throw error;
});
result.count += 1;
result.bytes += Number(usage);
}
return result;
}
static build(server) {
return new AnalyticsService(server);
}
}
exports.AnalyticsService = AnalyticsService;
//# sourceMappingURL=analytics.service.js.map