@flighthq/connectivity 0.4.0-next.1898.266773a → 0.4.0-next.1908.751021c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connectivity.d.ts +5 -1
- package/dist/connectivity.d.ts.map +1 -1
- package/dist/connectivity.js +61 -25
- package/dist/connectivity.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/connectivity.test.ts +81 -0
package/dist/connectivity.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Connectivity, ConnectivityBackend, ConnectivityReachability, ConnectivityReachabilityOptions, ConnectivityStatus } from '@flighthq/types/contract';
|
|
1
|
+
import type { BackendExplanation, Connectivity, ConnectivityBackend, ConnectivityReachability, ConnectivityReachabilityOptions, ConnectivityStatus } from '@flighthq/types/contract';
|
|
2
2
|
export declare function attachConnectivity(net: Connectivity): void;
|
|
3
3
|
export declare function createConnectivity(): Connectivity;
|
|
4
4
|
export declare function createConnectivityStatus(): ConnectivityStatus;
|
|
@@ -6,11 +6,15 @@ export declare function createWebConnectivityBackend(): ConnectivityBackend;
|
|
|
6
6
|
export declare function detachConnectivity(net: Connectivity): void;
|
|
7
7
|
export declare function detectConnectivityReachability(options: Readonly<ConnectivityReachabilityOptions>, out: ConnectivityReachability): Promise<ConnectivityReachability>;
|
|
8
8
|
export declare function disposeConnectivity(net: Connectivity): void;
|
|
9
|
+
export declare function explainConnectivityBackend(): BackendExplanation;
|
|
9
10
|
export declare function getConnectivityBackend(): ConnectivityBackend;
|
|
10
11
|
export declare function getConnectivityStatus(out: ConnectivityStatus): ConnectivityStatus;
|
|
11
12
|
export declare function hasConnectivityStatusChanged(a: Readonly<ConnectivityStatus>, b: Readonly<ConnectivityStatus>): boolean;
|
|
13
|
+
export declare function installConnectivityHostBackend(backend: ConnectivityBackend): void;
|
|
12
14
|
export declare function isConnectivityMetered(): boolean;
|
|
13
15
|
export declare function isConnectivityOnline(): boolean;
|
|
14
16
|
export declare function isConnectivitySaveDataEnabled(): boolean;
|
|
17
|
+
export declare function observeConnectivityHostResult(operation: string, succeeded: boolean): void;
|
|
18
|
+
export declare function resetConnectivityBackendForTest(): void;
|
|
15
19
|
export declare function setConnectivityBackend(backend: ConnectivityBackend | null): void;
|
|
16
20
|
//# sourceMappingURL=connectivity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectivity.d.ts","sourceRoot":"","sources":["../src/connectivity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EAEnB,wBAAwB,EACxB,+BAA+B,EAC/B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"connectivity.d.ts","sourceRoot":"","sources":["../src/connectivity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EAEnB,wBAAwB,EACxB,+BAA+B,EAC/B,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAwB1D;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAQjD;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAW7D;AAID,wBAAgB,4BAA4B,IAAI,mBAAmB,CAuDlE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAM1D;AAED,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,QAAQ,CAAC,+BAA+B,CAAC,EAClD,GAAG,EAAE,wBAAwB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAcnC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED,wBAAgB,0BAA0B,IAAI,kBAAkB,CAa/D;AAED,wBAAgB,sBAAsB,IAAI,mBAAmB,CAE5D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,kBAAkB,CAEjF;AAED,wBAAgB,4BAA4B,CAC1C,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAC/B,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAC9B,OAAO,CAWT;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAMjF;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAKzF;AAED,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAEhF"}
|
package/dist/connectivity.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { createSignal, emitSignal } from '@flighthq/signals/contract';
|
|
2
|
-
// Begins delivering connectivity changes to `net`'s signals by subscribing to the active backend. On
|
|
3
|
-
// each change it reads a fresh status and emits onChange plus edge-triggered signals. Idempotent: a
|
|
4
|
-
// prior subscription is torn down first. Pair with detachConnectivity/disposeConnectivity.
|
|
5
2
|
export function attachConnectivity(net) {
|
|
6
3
|
detachConnectivity(net);
|
|
7
4
|
const backend = getConnectivityBackend();
|
|
@@ -27,7 +24,6 @@ export function attachConnectivity(net) {
|
|
|
27
24
|
});
|
|
28
25
|
_subscriptions.set(net, unsubscribe);
|
|
29
26
|
}
|
|
30
|
-
// Allocates a Connectivity event entity with inert signals; call attachConnectivity to start delivery.
|
|
31
27
|
export function createConnectivity() {
|
|
32
28
|
return {
|
|
33
29
|
onChange: createSignal(),
|
|
@@ -37,7 +33,6 @@ export function createConnectivity() {
|
|
|
37
33
|
onOnline: createSignal(),
|
|
38
34
|
};
|
|
39
35
|
}
|
|
40
|
-
// Allocates a zeroed ConnectivityStatus, suitable as the `out` for getConnectivityStatus.
|
|
41
36
|
export function createConnectivityStatus() {
|
|
42
37
|
return {
|
|
43
38
|
downlink: -1,
|
|
@@ -110,7 +105,6 @@ export function createWebConnectivityBackend() {
|
|
|
110
105
|
},
|
|
111
106
|
};
|
|
112
107
|
}
|
|
113
|
-
// Stops delivery to `net` and forgets its subscription. Safe to call when not attached.
|
|
114
108
|
export function detachConnectivity(net) {
|
|
115
109
|
const unsubscribe = _subscriptions.get(net);
|
|
116
110
|
if (unsubscribe !== undefined) {
|
|
@@ -118,11 +112,6 @@ export function detachConnectivity(net) {
|
|
|
118
112
|
_subscriptions.delete(net);
|
|
119
113
|
}
|
|
120
114
|
}
|
|
121
|
-
// Performs a one-shot reachability probe against the given URL using the active backend's
|
|
122
|
-
// detectReachability, falling back to a fetch-based implementation when the backend does not provide
|
|
123
|
-
// one. Writes the result into `out` and returns it. Returns a sentinel on failure rather than throwing.
|
|
124
|
-
// NOTE: navigator.onLine reports an interface, not internet reachability. Use this function when you
|
|
125
|
-
// need to distinguish "a network interface is up" from "the internet is actually reachable."
|
|
126
115
|
export async function detectConnectivityReachability(options, out) {
|
|
127
116
|
const backend = getConnectivityBackend();
|
|
128
117
|
if (backend.detectReachability !== undefined) {
|
|
@@ -139,22 +128,29 @@ export async function detectConnectivityReachability(options, out) {
|
|
|
139
128
|
out.latency = -1;
|
|
140
129
|
return out;
|
|
141
130
|
}
|
|
142
|
-
// Releases `net` for garbage collection by detaching its backend subscription. The signals remain
|
|
143
|
-
// plain GC-managed memory afterward.
|
|
144
131
|
export function disposeConnectivity(net) {
|
|
145
132
|
detachConnectivity(net);
|
|
146
133
|
}
|
|
147
|
-
|
|
134
|
+
export function explainConnectivityBackend() {
|
|
135
|
+
if (_custom !== null) {
|
|
136
|
+
return { conflict: _hostConflict, layer: 'custom', operation: null, viability: 'unobserved' };
|
|
137
|
+
}
|
|
138
|
+
if (_host !== null) {
|
|
139
|
+
return {
|
|
140
|
+
conflict: _hostConflict,
|
|
141
|
+
layer: 'host',
|
|
142
|
+
operation: _hostObservation !== null ? _hostObservation.operation : null,
|
|
143
|
+
viability: _hostObservation !== null ? _hostObservation.viability : 'unobserved',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return { conflict: false, layer: 'host-not-enabled', operation: null, viability: 'unobserved' };
|
|
147
|
+
}
|
|
148
148
|
export function getConnectivityBackend() {
|
|
149
|
-
|
|
150
|
-
_backend = createWebConnectivityBackend();
|
|
151
|
-
return _backend;
|
|
149
|
+
return _custom ?? _host ?? _sentinel;
|
|
152
150
|
}
|
|
153
|
-
// Fills `out` with the current connectivity snapshot and returns it.
|
|
154
151
|
export function getConnectivityStatus(out) {
|
|
155
152
|
return getConnectivityBackend().getStatus(out);
|
|
156
153
|
}
|
|
157
|
-
// Returns a diff of two status snapshots. Returns true if any field differs.
|
|
158
154
|
export function hasConnectivityStatusChanged(a, b) {
|
|
159
155
|
return (a.online !== b.online ||
|
|
160
156
|
a.type !== b.type ||
|
|
@@ -165,24 +161,64 @@ export function hasConnectivityStatusChanged(a, b) {
|
|
|
165
161
|
a.saveData !== b.saveData ||
|
|
166
162
|
a.metered !== b.metered);
|
|
167
163
|
}
|
|
168
|
-
|
|
164
|
+
export function installConnectivityHostBackend(backend) {
|
|
165
|
+
if (_host !== null) {
|
|
166
|
+
if (_host !== backend)
|
|
167
|
+
_hostConflict = true;
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
_host = backend;
|
|
171
|
+
}
|
|
169
172
|
export function isConnectivityMetered() {
|
|
170
173
|
return getConnectivityBackend().getStatus(_scratch).metered;
|
|
171
174
|
}
|
|
172
|
-
// True when the host currently reports connectivity. Convenience over getConnectivityStatus.
|
|
173
175
|
export function isConnectivityOnline() {
|
|
174
176
|
return getConnectivityBackend().getStatus(_scratch).online;
|
|
175
177
|
}
|
|
176
|
-
// True when the user or OS has requested reduced data usage. Convenience over getConnectivityStatus.
|
|
177
178
|
export function isConnectivitySaveDataEnabled() {
|
|
178
179
|
return getConnectivityBackend().getStatus(_scratch).saveData;
|
|
179
180
|
}
|
|
180
|
-
|
|
181
|
+
export function observeConnectivityHostResult(operation, succeeded) {
|
|
182
|
+
_hostObservation = {
|
|
183
|
+
operation,
|
|
184
|
+
viability: succeeded ? 'available' : 'runtime-api-unavailable',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export function resetConnectivityBackendForTest() {
|
|
188
|
+
_custom = null;
|
|
189
|
+
_host = null;
|
|
190
|
+
_hostConflict = false;
|
|
191
|
+
_hostObservation = null;
|
|
192
|
+
}
|
|
181
193
|
export function setConnectivityBackend(backend) {
|
|
182
|
-
|
|
194
|
+
_custom = backend;
|
|
183
195
|
}
|
|
184
|
-
let
|
|
196
|
+
let _custom = null;
|
|
197
|
+
let _host = null;
|
|
198
|
+
let _hostConflict = false;
|
|
199
|
+
let _hostObservation = null;
|
|
185
200
|
const _scratch = createConnectivityStatus();
|
|
201
|
+
const _sentinel = {
|
|
202
|
+
getStatus(out) {
|
|
203
|
+
out.online = false;
|
|
204
|
+
out.type = 'unknown';
|
|
205
|
+
out.downlink = -1;
|
|
206
|
+
out.downlinkMax = -1;
|
|
207
|
+
out.effectiveType = '';
|
|
208
|
+
out.rtt = -1;
|
|
209
|
+
out.saveData = false;
|
|
210
|
+
out.metered = false;
|
|
211
|
+
return out;
|
|
212
|
+
},
|
|
213
|
+
async detectReachability(_options, out) {
|
|
214
|
+
out.reachable = false;
|
|
215
|
+
out.latency = -1;
|
|
216
|
+
return out;
|
|
217
|
+
},
|
|
218
|
+
subscribe() {
|
|
219
|
+
return () => { };
|
|
220
|
+
},
|
|
221
|
+
};
|
|
186
222
|
const _subscriptions = new WeakMap();
|
|
187
223
|
// Combines two AbortSignals: aborts when either fires.
|
|
188
224
|
function anyAbortSignal(a, b) {
|
package/dist/connectivity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectivity.js","sourceRoot":"","sources":["../src/connectivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"connectivity.js","sourceRoot":"","sources":["../src/connectivity.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { attachConnectivity, createConnectivity, detachConnectivity, detectConnectivityReachability, disposeConnectivity, getConnectivityStatus, hasConnectivityStatusChanged, isConnectivityMetered, isConnectivityOnline, isConnectivitySaveDataEnabled, } from './contract';
|
|
1
|
+
export { explainConnectivityBackend, attachConnectivity, createConnectivity, detachConnectivity, detectConnectivityReachability, disposeConnectivity, getConnectivityStatus, hasConnectivityStatusChanged, isConnectivityMetered, isConnectivityOnline, isConnectivitySaveDataEnabled, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { attachConnectivity, createConnectivity, detachConnectivity, detectConnectivityReachability, disposeConnectivity, getConnectivityStatus, hasConnectivityStatusChanged, isConnectivityMetered, isConnectivityOnline, isConnectivitySaveDataEnabled, } from './contract';
|
|
1
|
+
export { explainConnectivityBackend, attachConnectivity, createConnectivity, detachConnectivity, detectConnectivityReachability, disposeConnectivity, getConnectivityStatus, hasConnectivityStatusChanged, isConnectivityMetered, isConnectivityOnline, isConnectivitySaveDataEnabled, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/connectivity",
|
|
3
|
-
"version": "0.4.0-next.
|
|
3
|
+
"version": "0.4.0-next.1908.751021c",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/signals": "0.4.0-next.
|
|
42
|
-
"@flighthq/types": "0.4.0-next.
|
|
41
|
+
"@flighthq/signals": "0.4.0-next.1908.751021c",
|
|
42
|
+
"@flighthq/types": "0.4.0-next.1908.751021c"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"typescript": "^5.3.0"
|
package/src/connectivity.test.ts
CHANGED
|
@@ -16,6 +16,10 @@ import {
|
|
|
16
16
|
isConnectivityOnline,
|
|
17
17
|
isConnectivitySaveDataEnabled,
|
|
18
18
|
setConnectivityBackend,
|
|
19
|
+
explainConnectivityBackend,
|
|
20
|
+
installConnectivityHostBackend,
|
|
21
|
+
observeConnectivityHostResult,
|
|
22
|
+
resetConnectivityBackendForTest,
|
|
19
23
|
} from './connectivity';
|
|
20
24
|
|
|
21
25
|
function fakeBackend(
|
|
@@ -266,6 +270,34 @@ describe('disposeConnectivity', () => {
|
|
|
266
270
|
});
|
|
267
271
|
});
|
|
268
272
|
|
|
273
|
+
describe('explainConnectivityBackend', () => {
|
|
274
|
+
afterEach(() => resetConnectivityBackendForTest());
|
|
275
|
+
|
|
276
|
+
it('reports host-not-enabled when no backend is installed', () => {
|
|
277
|
+
resetConnectivityBackendForTest();
|
|
278
|
+
const explanation = explainConnectivityBackend();
|
|
279
|
+
expect(explanation.layer).toBe('host-not-enabled');
|
|
280
|
+
expect(explanation.conflict).toBe(false);
|
|
281
|
+
expect(explanation.viability).toBe('unobserved');
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it('reports custom layer when a custom backend is set', () => {
|
|
285
|
+
setConnectivityBackend(fakeBackend());
|
|
286
|
+
expect(explainConnectivityBackend().layer).toBe('custom');
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it('reports host layer when a host backend is installed', () => {
|
|
290
|
+
installConnectivityHostBackend(fakeBackend());
|
|
291
|
+
expect(explainConnectivityBackend().layer).toBe('host');
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('reports conflict when two different host backends are installed', () => {
|
|
295
|
+
installConnectivityHostBackend(fakeBackend());
|
|
296
|
+
installConnectivityHostBackend(fakeBackend());
|
|
297
|
+
expect(explainConnectivityBackend().conflict).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
269
301
|
describe('getConnectivityBackend', () => {
|
|
270
302
|
it('falls back to a web backend', () => {
|
|
271
303
|
expect(getConnectivityBackend()).not.toBeNull();
|
|
@@ -326,6 +358,25 @@ describe('hasConnectivityStatusChanged', () => {
|
|
|
326
358
|
});
|
|
327
359
|
});
|
|
328
360
|
|
|
361
|
+
describe('installConnectivityHostBackend', () => {
|
|
362
|
+
afterEach(() => resetConnectivityBackendForTest());
|
|
363
|
+
|
|
364
|
+
it('installs a host backend that getConnectivityBackend returns', () => {
|
|
365
|
+
const backend = fakeBackend();
|
|
366
|
+
installConnectivityHostBackend(backend);
|
|
367
|
+
expect(getConnectivityBackend()).toBe(backend);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it('is first-host-wins: a second different backend sets conflict', () => {
|
|
371
|
+
const first = fakeBackend();
|
|
372
|
+
const second = fakeBackend();
|
|
373
|
+
installConnectivityHostBackend(first);
|
|
374
|
+
installConnectivityHostBackend(second);
|
|
375
|
+
expect(getConnectivityBackend()).toBe(first);
|
|
376
|
+
expect(explainConnectivityBackend().conflict).toBe(true);
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
|
|
329
380
|
describe('isConnectivityMetered', () => {
|
|
330
381
|
it('returns false for a non-metered connection', () => {
|
|
331
382
|
setConnectivityBackend(fakeBackend({ metered: false }));
|
|
@@ -363,6 +414,36 @@ describe('isConnectivitySaveDataEnabled', () => {
|
|
|
363
414
|
});
|
|
364
415
|
});
|
|
365
416
|
|
|
417
|
+
describe('observeConnectivityHostResult', () => {
|
|
418
|
+
afterEach(() => resetConnectivityBackendForTest());
|
|
419
|
+
|
|
420
|
+
it('records a successful observation', () => {
|
|
421
|
+
installConnectivityHostBackend(fakeBackend());
|
|
422
|
+
observeConnectivityHostResult('getStatus', true);
|
|
423
|
+
const explanation = explainConnectivityBackend();
|
|
424
|
+
expect(explanation.operation).toBe('getStatus');
|
|
425
|
+
expect(explanation.viability).toBe('available');
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('records a failed observation', () => {
|
|
429
|
+
installConnectivityHostBackend(fakeBackend());
|
|
430
|
+
observeConnectivityHostResult('getStatus', false);
|
|
431
|
+
expect(explainConnectivityBackend().viability).toBe('runtime-api-unavailable');
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
describe('resetConnectivityBackendForTest', () => {
|
|
436
|
+
it('clears all backend slots', () => {
|
|
437
|
+
setConnectivityBackend(fakeBackend());
|
|
438
|
+
installConnectivityHostBackend(fakeBackend());
|
|
439
|
+
observeConnectivityHostResult('getStatus', true);
|
|
440
|
+
resetConnectivityBackendForTest();
|
|
441
|
+
expect(explainConnectivityBackend().layer).toBe('host-not-enabled');
|
|
442
|
+
expect(explainConnectivityBackend().conflict).toBe(false);
|
|
443
|
+
expect(explainConnectivityBackend().viability).toBe('unobserved');
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
|
|
366
447
|
describe('setConnectivityBackend', () => {
|
|
367
448
|
it('clears back to the web fallback when passed null', () => {
|
|
368
449
|
setConnectivityBackend(fakeBackend());
|