openvidu/openvidu-dashboard/dashboard-ce/typings
juancarmore d45e9f1a1a openvidu-dashboard: the browser vocabulary counts sessions without a browser as none
Adds the writer-review-fixes change: the server names the room of an ingress state, the egress status history keeps one entry per status, and the rollups count sessions that report no browser under none. The contract, its fixture and the data generator follow.
2026-11-03 11:10:23 +01:00
..
contract openvidu-dashboard: the browser vocabulary counts sessions without a browser as none 2026-11-03 11:10:23 +01:00
fixtures openvidu-dashboard: the browser vocabulary counts sessions without a browser as none 2026-11-03 11:10:23 +01:00
schema openvidu-dashboard: the browser vocabulary counts sessions without a browser as none 2026-11-03 11:10:23 +01:00
src openvidu-dashboard: the browser vocabulary counts sessions without a browser as none 2026-11-03 11:10:23 +01:00
test openvidu-dashboard: info no longer reports a license 2026-10-27 13:43:58 +01:00
README.md openvidu-dashboard: OpenVidu Dashboard CE 2026-10-25 16:35:47 +01:00
package.json openvidu-dashboard: OpenVidu Dashboard CE 2026-10-25 16:35:47 +01:00
tsconfig.build.json openvidu-dashboard: OpenVidu Dashboard CE 2026-10-25 16:35:47 +01:00
tsconfig.json openvidu-dashboard: OpenVidu Dashboard CE 2026-10-25 16:35:47 +01:00
vitest.config.ts openvidu-dashboard: OpenVidu Dashboard CE 2026-10-25 16:35:47 +01:00

README.md

@openvidu-dashboard/typings

Contracts shared by the dashboard backend and frontend, including the analytics data model that the OpenVidu server (openvidu-livekit, openvidu/analytics/) writes and the dashboard reads.

Analytics data model contract

Path Content
src/schema-version.ts SCHEMA_VERSION and MIN_SUPPORTED_SCHEMA_VERSION
src/data-model/ Document types, enums, collection names, retention defaults
schema/*.schema.json One MongoDB $jsonSchema validator per collection
schema/indexes.json Every index the writer creates (keys, options, TTL as fixed seconds or retention class)
schema/collections.json Collections in creation order, validator file, retention class, time-series options
schema/contract_version.txt SCHEMA_VERSION as text, read by the writer's contract test
fixtures/*.json Canonical documents per collection, in Extended JSON with explicit BSON number types
contract/ Sources of schema/ and fixtures/ (schema builder, index list, fixture scenario)

schema/ and fixtures/ are generated: edit contract/ and run pnpm --filter @openvidu-dashboard/typings contract. The tests fail when a generated file is out of date.

Conventions

  • Dates are UTC Date; durations integer milliseconds (…Ms); sizes integer bytes; jitter in milliseconds as a double; score is the LiveKit MOS (1.0–4.5).
  • Counters are int32 (int64 accepted); milliseconds and bytes are int64 (int32 accepted); ratios and scores are double.
  • An optional field is absent while unknown, never null. Exception: expiresAt is null while an entity is open.
  • Rollup counters are created by their first increment: an absent counter is zero.
  • Protocol enums keep the protocol name without prefix (API_DELETE, CLIENT_INITIATED); model statuses are lower case. Rollup map keys are enum names or fixed vocabularies, never user input.
  • internal holds writer bookkeeping (id sets behind counters); the dashboard never reads it.
  • Validators reject unknown fields; the writer applies them with validationAction: warn in production and error in tests. Time-series collections do not accept validators, so track_stats is validated only in the plain-collection fallback.

Reconciler closures

The writer's reconciler closes rooms, participant sessions, egress and ingress sessions whose end event never arrived (node crash, unflushed shutdown, lost event):

  • Closed documents carry closedBy: "reconciler"; entities closed by their own event carry closedBy: "event".
  • Rooms get endReason: "RECONCILED", participants disconnectReason: "RECONCILED" (left, or aborted when the session never became active), egress status: "failed" with error: "egress lost (reconciled)", ingress sessions status: "error".
  • The end time is estimated from the last signal of the entity, max(lastStatsAt, lastEventAt) (at most one stats interval early); tracks and subscriptions closed with a participant inherit its end time.
  • Every closure has one raw event of the matching close type with synthetic: true and _id: "AE_SYN_<entity id>"; its payload adds reconciler.reason (node-dead, absent-live, cascade, room-closed-node-dead).
  • Counters and rollups count a closure once. A real close event that arrives later replaces the end time, the reason and closedBy, and is not counted again.
  • schema_meta _id: "reconciler" records the last run.

When to bump SCHEMA_VERSION

Once a version has shipped in a release, bump it in the same coordinated change on both sides when the other side must know about the change:

  • a collection, field or index is added, removed or renamed;
  • a field changes type, unit or meaning, or an enum gains or loses a value;
  • a retention class or the shape of a schema_meta document changes.

Descriptions, fixture values and tests do not need a bump. Until the first release that ships a version, that version may still change without a bump. Raise MIN_SUPPORTED_SCHEMA_VERSION only when the dashboard depends on the new contract.

Sharing the contract with the writer

The writer vendors schema/ and fixtures/ under openvidu-livekit/openvidu/analytics/schema/contract/ and fails its tests when contract_version.txt differs from its own schema version constant:

dashboard-ce/typings/contract/vendor.sh ../openvidu-livekit

Commands

pnpm --filter @openvidu-dashboard/typings test       # contract tests (Vitest)
pnpm --filter @openvidu-dashboard/typings contract   # regenerate schema/ and fixtures/