fix(stats): lazy initialization for statistics Sets
Internet Explorer is throwing an error when doing a for...of over
Sets. This is because IE needs a Set polyfill, which may be applied
after lib-jitsi-meet has loaded. However, lib-jitsi-meet on load
creates two Sets, one for CallStats.fabrics and another for
Statistics.instances. When the polyfill is then applied, the two
existing Sets do not get new methods. The fix is to lazily
initialize the Sets to allow for polyfills to be applied.
Will emit BEFORE_STATISTICS_DISPOSED event, before the last CallStats
fabric is terminated to make sure that the final logs batch is reported
correctly.
Also adds a check for CallStats instance to queue events when
the backend has been initialized, but there is no CallStats instance
available to report on.
* ref(CallStats): cleanup constructor
Changes CallStats constructor to not take the whole JingleSessionPC as
it only needs an alias and the TraceablePeerConnection instance.
Describes the arguments in JSDoc.
* ref(CallStats): rename var
Everything is callstats c'mon...
* ref(CallStats): remove _checkInitialize
The _checkInitialize was trying to workaround CallStats lib issue
without really checking for any specific type of error on whether or not
it makes sense to retry.
Also it depended on some internal fields of 'callStatsBackend' and was
binding 'initCallback' to the backend instead of CallStats instance
which made no sense (it means it's very likely this functionality was
broken anyway).
It would be hard to fix it in a clean way, because CallStats instance
fields would have to be stored in static variables in order to make
the initCallback work (called from '_checkInitialize').
We also need to have more than one CallStats instance running at the
same time, because of the P2P which makes things even more complex.
* fix(CallStats): do not catch 'sendApplicationLog'
Wrapping 'sendApplicationLog' in 'tryCatch' will result in an endless
loop, because it will be logged on the logger.error which then tries
to send the logs immediately again.
* ref(CallStats): do not use call on static
There's nothing more confusing that seeing 'this' in a static method.
Wow maybe these methods are not really static !?
* ref(stats): fix var name
* feat(stats): report P2P to CallStats
Will create new CallStats fabric for the P2P peerconnection in order to
log peer to peer connections.
Refactoring was required in the statistics and CallStats module to be
able to have more than one CallStats instance. Because each CallStats
fabric reports one peer connection now each CallStats will correspond to
one TraceablePeerConnection. CallStats instances are now stored in a Map
mapped by the TraceablePeerConnection.id field.
In order to be able to execute some global/static CallStats reporting
methods all Statistics instances also need to be stored in a static
field.
CallStats API backend(new callstats()) will be initialized only once for
the values provided in the first call to initializeBackend. It is not
possible to have more that one CallStats backend running at the same
time (at the time of this writing). If we would have a routine for
disposing global "Statistics" module we could try to cleanup static
reference and allow to initialize it with new values (but no such use
case yet).
* ref(CallStats): move initCallback
Since there is no alphabetic order preserved in this file anyway at
least place it closer to it's usage.
* ref(CallStats): remove tryCatch
Temporarily removes tryCatch to make the ES6 conversion easier.
* ref(CallStats): convert to ES6
* style(CallStats): fix indentation
* fix(statistics): use import for CallStats
* ref(CallStats): convert static methods
Some of the methods should not be static, because it only make sense
to call it when there is CallStats instance available.
* ref(CallStats): rename var
* doc(CallStats): remove misplaced comment
* chore(CallStats): remove invalid eslint comment
* fix(CallStats): undefined CallStats namespace
If no CallStats ID namespace option is provided the conference will be
reported without it.
* style(stats|CallStats): remove extra lines
* fix(CallStats): do not log error from tryCatch
GlobalOnErrorHandler calls logger.error anyway.
* fix(CallStats): cleanup tryCatch
If I understand correctly our initial intention with doing tryCatch was
to avoid crashing the whole app in case the CallStats backend would
crash. With this commit the tryCatch is done by wrapping original
backend instance methods or using explicit try catch block where
the method is called only from one place or a value needs to be returned
in case of a crash.
* ref(CallStats): make backend a static var
* fix(CallStats): invalid eslint comments
* ref(CallStats): use for..of
* ref(CallStats): fixes around REST args
* ref(CallStats): rename var
* ref(CallStats): reorder static methods
Also renamed some callbacks
* doc(CallStats): adds some docs
* ref(CallStats): make methods not static
Both 'sendDominantSpeakerEvent' and 'sendScreenSharingEvent' methods are
not really static as they require instance to be called.
* fix(CallStats): invalid key
* fix(CallStats): reduce amount of debug logs
* feat(p2p|CallStats): log hold/resume
Will put CallStats fabric for the JVB connection "on hold" while in p2p
mode.
* doc(CallStats): add FIXME
* doc(JitsiConference,CallStats): typos and renaming
Our JSHint configuration is not extensive and we have excluded multiple
files from linting. Additionally, we have seen JSHint to be unable to
parse newer ECMAScript features such as the object spread operator
(proposal).
On the other hand, we have seen ESLint to beautifully work on React and
React Native source code in addition to ES2015 and later. Introduce
ESLint alongside JSHint as an intermediate step to eventually switching
from JSHint to ESLint.
As our source code does not fully follow even the JSHint rules we have,
it is very difficult to introduce ESLint with many rules. At the
beginning, introduce it with as little rules as possible. Morever,
ESLint is able to automatically fix certain rule offenders so once we
have ESLint merged we can incrementally add new rules while keeping our
commits' modification on as little subjects as possible.
Call addNewFabric only if callstats is initialized, there are certain situations when the init callback for some reason is slow and we call addNewFabric before callstats is initialized and we skip the peerconnection reported so we are missing the stats. Reports data only if callstats had initialized, adds caching of associateMstWithUserID calls.