123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /* global __filename, Strophe */
- /**
- * Strophe logger implementation. Logs from level WARN and above.
- */
- import {getLogger} from "jitsi-meet-logger";
- const logger = getLogger(__filename);
- import GlobalOnErrorHandler from "../util/GlobalOnErrorHandler";
-
- /**
- * This is the last HTTP error status captured from Strophe debug logs.
- * The purpose of storing it is to distinguish between the network and
- * infrastructure reason for connection being dropped (see connectionHandler in
- * xmpp.js). The value will be cleared (-1) if the subsequent request succeeds
- * which means that the failure could be transient.
- *
- * FIXME in the latest Strophe (not released on npm) there is API to handle
- * particular HTTP errors, but there is no way to learn if the subsequent
- * request succeeded in order to tell if the error was one time incident or if
- * it was the reason for dropping the connection by Strophe (the connection is
- * dropped after 5 subsequent failures). Ideally Strophe should provide more
- * details about the reason on why the connection stopped.
- *
- * @type {number}
- */
- let lastErrorStatus = -1;
-
- /**
- * A regular expression used to catch Strophe's log message indicating that the
- * last BOSH request was successful. When there is such message seen the
- * {@link lastErrorStatus} will be set back to '-1'.
- * @type {RegExp}
- */
- const resetLastErrorStatusRegExpr = /request id \d+.\d+ got 200/;
-
- /**
- * A regular expression used to capture the current value of the BOSH request
- * error status (HTTP error code or '0' or something else).
- * @type {RegExp}
- */
- const lastErrorStatusRegExpr
- = /request errored, status: (\d+), number of errors: \d+/;
-
- export default function () {
-
- Strophe.log = function (level, msg) {
- // Our global handler reports uncaught errors to the stats which may
- // interpret those as partial call failure.
- // Strophe log entry about secondary request timeout does not mean that
- // it's a final failure(the request will be restarted), so we lower it's
- // level here to a warning.
- logger.trace("Strophe", level, msg);
- if (typeof msg === 'string' &&
- msg.indexOf("Request ") !== -1 &&
- msg.indexOf("timed out (secondary), restarting") !== -1) {
- level = Strophe.LogLevel.WARN;
- }
- /* eslint-disable no-case-declarations */
- switch (level) {
- case Strophe.LogLevel.DEBUG:
- // The log message which reports successful status is logged
- // on Strophe's DEBUG level
- if (lastErrorStatus !== -1 &&
- resetLastErrorStatusRegExpr.test(msg)) {
- logger.debug("Reset lastErrorStatus");
- lastErrorStatus = -1;
- }
- break;
- case Strophe.LogLevel.WARN:
- logger.warn("Strophe: " + msg);
- const errStatusCapture = lastErrorStatusRegExpr.exec(msg);
- if (errStatusCapture && errStatusCapture.length === 2) {
- lastErrorStatus = parseInt(errStatusCapture[1]);
- logger.debug(
- "lastErrorStatus set to: " + lastErrorStatus);
- }
- break;
- case Strophe.LogLevel.ERROR:
- case Strophe.LogLevel.FATAL:
- msg = "Strophe: " + msg;
- GlobalOnErrorHandler.callErrorHandler(new Error(msg));
- logger.error(msg);
- break;
- }
- /* eslint-enable no-case-declarations */
- };
-
- /**
- * Returns error status (HTTP error code) of the last BOSH request.
- *
- * @return {number} HTTP error code, '0' for unknown or "god knows what"
- * (this is a hack).
- */
- Strophe.getLastErrorStatus = function () {
- return lastErrorStatus;
- };
-
- Strophe.getStatusString = function (status) {
- switch (status) {
- case Strophe.Status.ERROR:
- return "ERROR";
- case Strophe.Status.CONNECTING:
- return "CONNECTING";
- case Strophe.Status.CONNFAIL:
- return "CONNFAIL";
- case Strophe.Status.AUTHENTICATING:
- return "AUTHENTICATING";
- case Strophe.Status.AUTHFAIL:
- return "AUTHFAIL";
- case Strophe.Status.CONNECTED:
- return "CONNECTED";
- case Strophe.Status.DISCONNECTED:
- return "DISCONNECTED";
- case Strophe.Status.DISCONNECTING:
- return "DISCONNECTING";
- case Strophe.Status.ATTACHED:
- return "ATTACHED";
- default:
- return "unknown";
- }
- };
- }
|