callstats.io infers the call state based on events, i.e., the call starts when the first participant calls addNewFabric() and the call is stopped when all endpoints (except for one) calls fabricTerminated. However, we additionally observe that endpoints sometimes crash or people close their browser window/tab instead of explicitly ending the call. We do not want to keep the calls alive forever, hence, callstats.io waits for a 30s of inactivity from all participants before timing out the call. If any participant sends any event/stats within 30s, the call state remains active. If a call starts after the timeout, callstats.io begins a new call state, hence, it shows up as a new call.
Sometimes it may seem that the participants did not leave, but lost connectivity or there was a network disruption for longer than 30 seconds, in these cases the callstats.io will terminate the call and if and when the endpoints regain connectivity, the stats will be captured in a new call.
The value of the timeout was chosen based on the exponential backoff used by endpoints to close connections (related to ICE and NAT traversal, where it is 31s).