All files / services NewsService.js

64.81% Statements 35/54
80% Branches 4/5
50% Functions 2/4
64.81% Lines 35/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 541x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x           1x 1x             1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                 1x 1x 1x 1x 1x
import {isSet, nowHuman, nowISO8601, toHuman} from "../lib/Common.js";
import {cacheEvictKey, cacheGetTtlObject} from "../lib/MemoryCache.js";
import {setTimeout} from 'node:timers/promises';// https://nodejs.org/api/timers.html#settimeoutcallback-delay-args
 
export const NEWS_LABEL = "News 📢";
export const NEWS_CACHE_KEY = "cache:news";
export const ONE_DAY_SECOND = 60 * 60 * 24;
export default class NewsService {
    constructor(loggerService, logtailService) {
        this.max = 30;
        this.since = nowISO8601();
        this.lastNews = [];
        this.logtailService = logtailService;
        this.loggerNews = loggerService.getLogger().child({label: NEWS_LABEL});
        this.loggerService = loggerService.getLogger().child({label: 'NewsService'});
    }
 
    addNewsEntry(dt, msg) {
        this.lastNews.splice(0, 0, {dt, msg});
        if (this.lastNews.length > this.max) {
            this.lastNews.splice(this.lastNews.length - 1, 1);
        }
    }
 
    add(news) {
        let dt = nowISO8601();
        this.addNewsEntry(dt, news);
        this.loggerNews.info(news);
        setTimeout(5000, NEWS_CACHE_KEY)
            .then(cacheEvictKey);// wait a few seconds to get all logs recorded on logtail side
    }
 
    getNews() {
        const {loggerService, logtailService, since, lastNews} = this;
        return new Promise(resolve => {
            const to = nowHuman();
            const oldSchoolNews = {"since": toHuman(since), to, "data": lastNews};
            if (!logtailService.isAvailable()) {
                loggerService.debug(`logtailService is not available`);
                return resolve(oldSchoolNews);
            }
            cacheGetTtlObject(NEWS_CACHE_KEY, ONE_DAY_SECOND, logtailService.getRecentNews.bind(logtailService))
                .then(cacheNews => {
                    return isSet(cacheNews) ? resolve(cacheNews) : resolve(oldSchoolNews);
                })
                .catch(err => {
                    loggerService.error(`unable to retrieve cached logtail news : ${err.message}`);
                    return resolve(oldSchoolNews);
                });
        });
    }
 
 
}