onlineManager.mjs 2.1 KB

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