openvibers/openvibe.network Commits
Open stats: a number a source does not know stays unknown, never a zero (#549)
Changes
@@@ -34,7 +34,9 @@ const shareCard = require('openvibe-shared/social').url('network', 'https://openconst PLUMBING = /^(\/metrics|\/api\/(ready|health)|static|\/release\.json|\/robots\.txt|\/favicon\.ico|\/internal\/|\/api\/frame\/hit|\/oauth\/token|\/\.well-known\/|\/api\/admin)/;const dayOf = (ms) => new Date(ms).toISOString().slice(0, 10);--const num = (v) => (Number.isFinite(Number(v)) ? Number(v) : null);++// A number, or null when the source does not know it. Number(null) is 0: a source's null (Live's chat count while++// Chat's numbers are not read yet) must stay unknown, not become a zero on the public page (11-03: "Messages 0").++const num = (v) => (v == null || v === '' || !Number.isFinite(Number(v)) ? null : Number(v));const fmt = (n) => {if (n == null || !Number.isFinite(Number(n))) return '—';const v = Number(n), a = Math.abs(v);@@@ -40,7 +40,7 @@ const { createOpenStats, render } = require('../server/stats/open');const d = Number(u.searchParams.get('days'));return json({ ok: true, summary: { total_pageviews: d === 7 ? 500 : 800, total_unique_visitors: 120, total_unique_users: 30 } });}-- if (u.pathname === '/api/home/hero') return json({ stats: { liveNow: 2, viewersNow: 9, streamers: 127, users: 437, chatMessages: 74680, vods: 829 } });++ if (u.pathname === '/api/home/hero') return json({ stats: { liveNow: 2, viewersNow: 9, streamers: 127, users: 437, chatMessages: 74680, vods: 829, weeklyActive: null } });throw new Error('down');};const stats = createOpenStats({ db, selfToken: () => 'tok', statusRows: () => [{ exposure: { state: 'live' }, status: 'up' }, { exposure: { state: 'live' }, status: 'down' }],@@@ -59,6 +59,8 @@ const { createOpenStats, render } = require('../server/stats/open');assert.strictEqual(d.accounts.prev, 1);assert.deepStrictEqual(d.totals.services, { up: 1, checked: 2 });assert.strictEqual(d.live.live_now, 2);++ assert.strictEqual(d.live.chatted_7d, null, 'a number Live does not know yet (null) stays unknown, never a zero');++ assert.strictEqual(d.live.messages, 74680);assert.strictEqual(d.busiest_pages_24h, null, 'Prometheus down: no traffic part, never zeros');assert.strictEqual(site('tools').traffic_24h, null);
@@ -34,7 +34,9 @@ const shareCard = require('openvibe-shared/social').url('network', 'https://open
@@ -34,7 +34,9 @@ const shareCard = require('openvibe-shared/social').url('network', 'https://open
const PLUMBING = /^(\/metrics|\/api\/(ready|health)|static|\/release\.json|\/robots\.txt|\/favicon\.ico|\/internal\/|\/api\/frame\/hit|\/oauth\/token|\/\.well-known\/|\/api\/admin)/;
const PLUMBING = /^(\/metrics|\/api\/(ready|health)|static|\/release\.json|\/robots\.txt|\/favicon\.ico|\/internal\/|\/api\/frame\/hit|\/oauth\/token|\/\.well-known\/|\/api\/admin)/;
const dayOf = (ms) => new Date(ms).toISOString().slice(0, 10);
const dayOf = (ms) => new Date(ms).toISOString().slice(0, 10);
-const num = (v) => (Number.isFinite(Number(v)) ? Number(v) : null);
+// A number, or null when the source does not know it. Number(null) is 0: a source's null (Live's chat count while
+// Chat's numbers are not read yet) must stay unknown, not become a zero on the public page (11-03: "Messages 0").
+const num = (v) => (v == null || v === '' || !Number.isFinite(Number(v)) ? null : Number(v));
const fmt = (n) => {
const fmt = (n) => {
if (n == null || !Number.isFinite(Number(n))) return '—';
if (n == null || !Number.isFinite(Number(n))) return '—';
const v = Number(n), a = Math.abs(v);
const v = Number(n), a = Math.abs(v);
@@ -40,7 +40,7 @@ const { createOpenStats, render } = require('../server/stats/open');
@@ -40,7 +40,7 @@ const { createOpenStats, render } = require('../server/stats/open');
const d = Number(u.searchParams.get('days'));
const d = Number(u.searchParams.get('days'));
return json({ ok: true, summary: { total_pageviews: d === 7 ? 500 : 800, total_unique_visitors: 120, total_unique_users: 30 } });
return json({ ok: true, summary: { total_pageviews: d === 7 ? 500 : 800, total_unique_visitors: 120, total_unique_users: 30 } });
}
}
- if (u.pathname === '/api/home/hero') return json({ stats: { liveNow: 2, viewersNow: 9, streamers: 127, users: 437, chatMessages: 74680, vods: 829 } });
+ if (u.pathname === '/api/home/hero') return json({ stats: { liveNow: 2, viewersNow: 9, streamers: 127, users: 437, chatMessages: 74680, vods: 829, weeklyActive: null } });
throw new Error('down');
throw new Error('down');
};
};
const stats = createOpenStats({ db, selfToken: () => 'tok', statusRows: () => [{ exposure: { state: 'live' }, status: 'up' }, { exposure: { state: 'live' }, status: 'down' }],
const stats = createOpenStats({ db, selfToken: () => 'tok', statusRows: () => [{ exposure: { state: 'live' }, status: 'up' }, { exposure: { state: 'live' }, status: 'down' }],
@@ -59,6 +59,8 @@ const { createOpenStats, render } = require('../server/stats/open');
@@ -59,6 +59,8 @@ const { createOpenStats, render } = require('../server/stats/open');
assert.strictEqual(d.accounts.prev, 1);
assert.strictEqual(d.accounts.prev, 1);
assert.deepStrictEqual(d.totals.services, { up: 1, checked: 2 });
assert.deepStrictEqual(d.totals.services, { up: 1, checked: 2 });
assert.strictEqual(d.live.live_now, 2);
assert.strictEqual(d.live.live_now, 2);
+ assert.strictEqual(d.live.chatted_7d, null, 'a number Live does not know yet (null) stays unknown, never a zero');
+ assert.strictEqual(d.live.messages, 74680);
assert.strictEqual(d.busiest_pages_24h, null, 'Prometheus down: no traffic part, never zeros');
assert.strictEqual(d.busiest_pages_24h, null, 'Prometheus down: no traffic part, never zeros');
assert.strictEqual(site('tools').traffic_24h, null);
assert.strictEqual(site('tools').traffic_24h, null);