nponiros/sync_client

View on GitHub
src/connection_status.js

Summary

Maintainability
A
1 hr
Test Coverage
const CONNECTION_CHECK_PATH = 'check';

export default function initConnectionStatus(global) {
  function checkServerConnection(url) {
    return global.fetch(url, { method: 'HEAD' });
  }

  function isOnline(url) {
    // If we have no URL we are offline
    if (!url) {
      return Promise.resolve(false);
    }
    const serverUrl = url[url.length - 1] === '/'
        ? `${url}${CONNECTION_CHECK_PATH}`
        : `${url}/${CONNECTION_CHECK_PATH}`;

    if (global.navigator.onLine) {
      return checkServerConnection(serverUrl)
          .then(() => {
            return true;
          })
          .catch(() => {
            return false;
          });
    }
    return Promise.resolve(false);
  }

  function onlineStatusChanged(url, cb) {
    global.addEventListener('online', () => {
      isOnline(url)
          .then((status) => {
            cb(status);
          });
    });

    global.addEventListener('offline', () => {
      cb(false);
    });

    // Set initial status
    isOnline(url)
        .then((status) => {
          cb(status);
        });
  }

  return { isOnline, onlineStatusChanged };
}