onlineManager.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var subscribable = require('./subscribable.js');
  4. var utils = require('./utils.js');
  5. const onlineEvents = ['online', 'offline'];
  6. class OnlineManager extends subscribable.Subscribable {
  7. constructor() {
  8. super();
  9. this.setup = onOnline => {
  10. // addEventListener does not exist in React Native, but window does
  11. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
  12. if (!utils.isServer && window.addEventListener) {
  13. const listener = () => onOnline(); // Listen to online
  14. onlineEvents.forEach(event => {
  15. window.addEventListener(event, listener, false);
  16. });
  17. return () => {
  18. // Be sure to unsubscribe if a new handler is set
  19. onlineEvents.forEach(event => {
  20. window.removeEventListener(event, listener);
  21. });
  22. };
  23. }
  24. return;
  25. };
  26. }
  27. onSubscribe() {
  28. if (!this.cleanup) {
  29. this.setEventListener(this.setup);
  30. }
  31. }
  32. onUnsubscribe() {
  33. if (!this.hasListeners()) {
  34. var _this$cleanup;
  35. (_this$cleanup = this.cleanup) == null ? void 0 : _this$cleanup.call(this);
  36. this.cleanup = undefined;
  37. }
  38. }
  39. setEventListener(setup) {
  40. var _this$cleanup2;
  41. this.setup = setup;
  42. (_this$cleanup2 = this.cleanup) == null ? void 0 : _this$cleanup2.call(this);
  43. this.cleanup = setup(online => {
  44. if (typeof online === 'boolean') {
  45. this.setOnline(online);
  46. } else {
  47. this.onOnline();
  48. }
  49. });
  50. }
  51. setOnline(online) {
  52. const changed = this.online !== online;
  53. if (changed) {
  54. this.online = online;
  55. this.onOnline();
  56. }
  57. }
  58. onOnline() {
  59. this.listeners.forEach(({
  60. listener
  61. }) => {
  62. listener();
  63. });
  64. }
  65. isOnline() {
  66. if (typeof this.online === 'boolean') {
  67. return this.online;
  68. }
  69. if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {
  70. return true;
  71. }
  72. return navigator.onLine;
  73. }
  74. }
  75. const onlineManager = new OnlineManager();
  76. exports.OnlineManager = OnlineManager;
  77. exports.onlineManager = onlineManager;
  78. //# sourceMappingURL=onlineManager.js.map