1 | import {set} from './utilities';
|
2 |
|
3 | export interface NavigatorWithConnection extends Navigator {
|
4 | connection: {
|
5 | downlink: number;
|
6 | effectiveType: string;
|
7 | onchange: null | Function;
|
8 | rtt: number;
|
9 | saveData: boolean;
|
10 | };
|
11 | }
|
12 |
|
13 | export class Connection {
|
14 | private isUsingMockConnection = false;
|
15 | private originalConnection?: NavigatorWithConnection['connection'];
|
16 |
|
17 | mock(timing: Partial<NavigatorWithConnection['connection']> = {}) {
|
18 | const globalNavigator = navigator as NavigatorWithConnection;
|
19 | if (this.isUsingMockConnection) {
|
20 | throw new Error(
|
21 | 'You tried to mock navigator.connection when it was already mocked.',
|
22 | );
|
23 | }
|
24 |
|
25 | this.originalConnection = globalNavigator.connection;
|
26 |
|
27 | const mockConnection: NavigatorWithConnection['connection'] = {
|
28 | downlink: 0,
|
29 | effectiveType: '3g',
|
30 | onchange: null,
|
31 | rtt: 100,
|
32 | saveData: false,
|
33 | ...timing,
|
34 | };
|
35 |
|
36 | set(globalNavigator, 'connection', mockConnection);
|
37 | this.isUsingMockConnection = true;
|
38 | }
|
39 |
|
40 | restore() {
|
41 | const globalNavigator = navigator as NavigatorWithConnection;
|
42 | if (!this.isUsingMockConnection) {
|
43 | throw new Error(
|
44 | 'You tried to restore navigator.connection when it was already restored.',
|
45 | );
|
46 | }
|
47 |
|
48 | set(globalNavigator, 'connection', this.originalConnection);
|
49 | this.isUsingMockConnection = false;
|
50 | }
|
51 |
|
52 | isMocked() {
|
53 | return this.isUsingMockConnection;
|
54 | }
|
55 | }
|