_onEnter: async function()

in source/stale-playlist-detector/playlist.js [136:171]


                    _onEnter: async function(input) {
                        // compare current sample to last changed sample
                        if (classobject.changed(input)) {
                            // changed
                            let change_duration_seconds = input.timeseconds - classobject.last_sample.timeseconds;
                            classobject.last_sample = input;
                            logger.info(`changed after ${change_duration_seconds}s [${classobject.options.url}]`);
                            classobject.change_durations.push(change_duration_seconds);
                            while (classobject.change_durations.length > classobject.change_durations_max) {
                                classobject.change_durations.shift();
                            }
                            // logger.info(JSON.stringify(classobject.change_durations));
                            classobject.p90_duration = jstat.percentile(classobject.change_durations, 0.90).toFixed(1);
                            classobject.mean_duration = jstat.mean(classobject.change_durations).toFixed(1);
                            classobject.median_duration = jstat.median(classobject.change_durations).toFixed(1);
                            classobject.min_duration = jstat.min(classobject.change_durations).toFixed(1);
                            classobject.max_duration = jstat.max(classobject.change_durations).toFixed(1);
                            logger.info(`p90 duration is ${classobject.p90_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
                            logger.info(`mean duration is ${classobject.mean_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
                            logger.info(`median duration is ${classobject.median_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
                            logger.info(`min duration is ${classobject.min_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
                            logger.info(`max duration is ${classobject.max_duration}s from ${classobject.change_durations.length} samples [${classobject.options.url}]`);
                            this.transition("fresh");
                        } else {
                            // not changed
                            let max_duration = Number.parseInt(classobject.last_sample.duration * classobject.options.detector_options.duration_multiplier);
                            logger.info(`maximum allowed duration is ${max_duration}s [${classobject.options.url}]`);
                            let expected_update = classobject.last_sample.timeseconds + max_duration;
                            logger.info(`change due by ${new Date(expected_update * 1000).toTimeString()} ${expected_update} [${classobject.options.url}]`);
                            if (input.timeseconds > expected_update) {
                                this.transition("stale");
                            } else {
                                this.transition("fresh");
                            }
                        }
                    }