fix(core): update
This commit is contained in:
parent
4d6ae3ba87
commit
e6c15b2d81
@ -1,6 +1,6 @@
|
||||
import { tap, expect } from '@pushrocks/tapbundle';
|
||||
|
||||
import * as webdetector from '../ts/index.js';
|
||||
import * as webdetector from '../ts/webdetector.classes.webdetector.js';
|
||||
let testWebDetector: webdetector.WebDetector;
|
||||
|
||||
tap.test('first test', async () => {
|
||||
@ -27,6 +27,11 @@ tap.test('should detect the platform', async () => {
|
||||
console.log(platform);
|
||||
});
|
||||
|
||||
tap.test('should detect if the app is installed', async () => {
|
||||
const isInstalled = testWebDetector.pwa.isInstalled();
|
||||
expect(isInstalled).toBeFalse();
|
||||
});
|
||||
|
||||
console.log('hi');
|
||||
|
||||
tap.start();
|
||||
|
@ -3,6 +3,6 @@
|
||||
*/
|
||||
export const commitinfo = {
|
||||
name: '@pushrocks/webdetector',
|
||||
version: '2.0.2',
|
||||
version: '2.0.3',
|
||||
description: 'detect different environments within the browser'
|
||||
}
|
||||
|
70
ts/index.ts
70
ts/index.ts
@ -1,69 +1 @@
|
||||
import * as plugins from './webdetector.plugins.js';
|
||||
|
||||
import { Platform } from './webdetector.classes.platform.js';
|
||||
|
||||
export interface IWebDetectorOptions {
|
||||
checkOnlineUrl: string;
|
||||
}
|
||||
|
||||
export class WebDetector {
|
||||
// subclasses
|
||||
public platform = new Platform();
|
||||
|
||||
options: IWebDetectorOptions;
|
||||
private onlineObservableIntake = new plugins.smartrx.ObservableIntake();
|
||||
public onlineObservable = this.onlineObservableIntake.observable.pipe(
|
||||
plugins.smartrx.rxjs.ops.throttleTime(10000)
|
||||
);
|
||||
latestState: 'online' | 'offline' = 'online';
|
||||
|
||||
constructor(optionsArg: IWebDetectorOptions) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
async isOnline() {
|
||||
let reachesInternet: boolean = false;
|
||||
const controller = new AbortController();
|
||||
const fetchPromise = fetch(this.options.checkOnlineUrl, { signal: controller.signal });
|
||||
const timeout = setTimeout(() => {
|
||||
controller.abort();
|
||||
}, 1000);
|
||||
|
||||
await fetchPromise
|
||||
.then(async (response) => {
|
||||
reachesInternet = true;
|
||||
})
|
||||
.catch((err) => {
|
||||
// console.log(`request to ${this.options.checkOnlineUrl} failed}`)
|
||||
});
|
||||
const latestLocalState = (() => {
|
||||
if (reachesInternet) {
|
||||
return 'online';
|
||||
} else {
|
||||
return 'offline';
|
||||
}
|
||||
})();
|
||||
if (latestLocalState !== this.latestState) {
|
||||
this.onlineObservableIntake.push(this.latestState);
|
||||
}
|
||||
this.latestState = latestLocalState;
|
||||
return reachesInternet;
|
||||
}
|
||||
|
||||
private periodicChecksRunning = false;
|
||||
|
||||
public async startPeriodicChecks() {
|
||||
this.periodicChecksRunning = true;
|
||||
while (this.periodicChecksRunning) {
|
||||
await this.isOnline();
|
||||
await plugins.smartdelay.delayFor(3000);
|
||||
}
|
||||
}
|
||||
|
||||
public async stopPeriodicChecks() {
|
||||
this.periodicChecksRunning = false;
|
||||
}
|
||||
}
|
||||
export * from './webdetector.classes.webdetector.js';
|
||||
|
12
ts/webdetector.classes.pwa.ts
Normal file
12
ts/webdetector.classes.pwa.ts
Normal file
@ -0,0 +1,12 @@
|
||||
export class Pwa {
|
||||
public isInstalled(): boolean {
|
||||
let isInstalled: boolean;
|
||||
if (globalThis?.matchMedia?.('(display-mode: standalone)').matches) {
|
||||
isInstalled = true;
|
||||
console.log('PWA installed');
|
||||
} else {
|
||||
isInstalled = false;
|
||||
}
|
||||
return isInstalled;
|
||||
}
|
||||
}
|
71
ts/webdetector.classes.webdetector.ts
Normal file
71
ts/webdetector.classes.webdetector.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import * as plugins from './webdetector.plugins.js';
|
||||
|
||||
import { Platform } from './webdetector.classes.platform.js';
|
||||
import { Pwa } from './webdetector.classes.pwa.js';
|
||||
|
||||
export interface IWebDetectorOptions {
|
||||
checkOnlineUrl: string;
|
||||
}
|
||||
|
||||
export class WebDetector {
|
||||
// subclasses
|
||||
public platform = new Platform();
|
||||
public pwa = new Pwa();
|
||||
|
||||
options: IWebDetectorOptions;
|
||||
private onlineObservableIntake = new plugins.smartrx.ObservableIntake();
|
||||
public onlineObservable = this.onlineObservableIntake.observable.pipe(
|
||||
plugins.smartrx.rxjs.ops.throttleTime(10000)
|
||||
);
|
||||
latestState: 'online' | 'offline' = 'online';
|
||||
|
||||
constructor(optionsArg: IWebDetectorOptions) {
|
||||
this.options = optionsArg;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
async isOnline() {
|
||||
let reachesInternet: boolean = false;
|
||||
const controller = new AbortController();
|
||||
const fetchPromise = fetch(this.options.checkOnlineUrl, { signal: controller.signal });
|
||||
const timeout = setTimeout(() => {
|
||||
controller.abort();
|
||||
}, 1000);
|
||||
|
||||
await fetchPromise
|
||||
.then(async (response) => {
|
||||
reachesInternet = true;
|
||||
})
|
||||
.catch((err) => {
|
||||
// console.log(`request to ${this.options.checkOnlineUrl} failed}`)
|
||||
});
|
||||
const latestLocalState = (() => {
|
||||
if (reachesInternet) {
|
||||
return 'online';
|
||||
} else {
|
||||
return 'offline';
|
||||
}
|
||||
})();
|
||||
if (latestLocalState !== this.latestState) {
|
||||
this.onlineObservableIntake.push(this.latestState);
|
||||
}
|
||||
this.latestState = latestLocalState;
|
||||
return reachesInternet;
|
||||
}
|
||||
|
||||
private periodicChecksRunning = false;
|
||||
|
||||
public async startPeriodicChecks() {
|
||||
this.periodicChecksRunning = true;
|
||||
while (this.periodicChecksRunning) {
|
||||
await this.isOnline();
|
||||
await plugins.smartdelay.delayFor(3000);
|
||||
}
|
||||
}
|
||||
|
||||
public async stopPeriodicChecks() {
|
||||
this.periodicChecksRunning = false;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user