rn-network-quality 0.1.0
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/LICENSE +20 -0
- package/README.md +899 -0
- package/android/build.gradle +60 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/com/rnnetworkquality/CellularInfo.kt +34 -0
- package/android/src/main/java/com/rnnetworkquality/DownloadPolicy.kt +26 -0
- package/android/src/main/java/com/rnnetworkquality/Mappers.kt +106 -0
- package/android/src/main/java/com/rnnetworkquality/NetworkMonitor.kt +263 -0
- package/android/src/main/java/com/rnnetworkquality/NetworkProbe.kt +668 -0
- package/android/src/main/java/com/rnnetworkquality/NetworkQualityModule.kt +287 -0
- package/android/src/main/java/com/rnnetworkquality/NetworkQualityPackage.kt +25 -0
- package/android/src/main/java/com/rnnetworkquality/NetworkSnapshot.kt +83 -0
- package/android/src/main/java/com/rnnetworkquality/SnapshotBuilder.kt +92 -0
- package/android/src/main/java/com/rnnetworkquality/Throttler.kt +100 -0
- package/ios/CellularInfo.swift +47 -0
- package/ios/NetworkProbe.swift +391 -0
- package/ios/NetworkQuality.h +8 -0
- package/ios/NetworkQuality.mm +88 -0
- package/ios/NetworkQualityImpl.swift +371 -0
- package/ios/PathSnapshot.swift +109 -0
- package/ios/PrivacyInfo.xcprivacy +23 -0
- package/ios/Throttler.swift +174 -0
- package/lib/module/NativeNetworkQuality.js +5 -0
- package/lib/module/NativeNetworkQuality.js.map +1 -0
- package/lib/module/classify.js +126 -0
- package/lib/module/classify.js.map +1 -0
- package/lib/module/constants.js +52 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/errors.js +18 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/hooks.js +78 -0
- package/lib/module/hooks.js.map +1 -0
- package/lib/module/index.js +19 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/manager.js +595 -0
- package/lib/module/manager.js.map +1 -0
- package/lib/module/normalize.js +35 -0
- package/lib/module/normalize.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeNetworkQuality.d.ts +50 -0
- package/lib/typescript/src/NativeNetworkQuality.d.ts.map +1 -0
- package/lib/typescript/src/classify.d.ts +12 -0
- package/lib/typescript/src/classify.d.ts.map +1 -0
- package/lib/typescript/src/constants.d.ts +15 -0
- package/lib/typescript/src/constants.d.ts.map +1 -0
- package/lib/typescript/src/errors.d.ts +13 -0
- package/lib/typescript/src/errors.d.ts.map +1 -0
- package/lib/typescript/src/hooks.d.ts +18 -0
- package/lib/typescript/src/hooks.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +13 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/manager.d.ts +98 -0
- package/lib/typescript/src/manager.d.ts.map +1 -0
- package/lib/typescript/src/normalize.d.ts +5 -0
- package/lib/typescript/src/normalize.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +171 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/mock.js +318 -0
- package/package.json +161 -0
- package/rn-network-quality.podspec +32 -0
- package/src/NativeNetworkQuality.ts +58 -0
- package/src/classify.ts +208 -0
- package/src/constants.ts +48 -0
- package/src/errors.ts +23 -0
- package/src/hooks.ts +110 -0
- package/src/index.tsx +25 -0
- package/src/manager.ts +891 -0
- package/src/normalize.ts +81 -0
- package/src/types.ts +207 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TRANSPORTS","CELLULAR_GENERATIONS","UNSATISFIED_REASONS","includes","values","value","some","candidate","normalizeSnapshot","snapshot","transport","cellularGeneration","unsatisfiedReason","isConnected","isValidated","isCaptivePortal","isVpn","isExpensive","isConstrained","isRoaming","downlinkKbps","uplinkKbps","signalStrength","supportsIPv4","supportsIPv6","supportsDNS","timestamp"],"sourceRoot":"..\\..\\src","sources":["normalize.ts"],"mappings":";;AAQA,MAAMA,UAAU,GAAG,CACjB,MAAM,EACN,UAAU,EACV,UAAU,EACV,WAAW,EACX,KAAK,EACL,OAAO,EACP,MAAM,EACN,SAAS,CAC8B;AAEzC,MAAMC,oBAAoB,GAAG,CAC3B,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,IAAI,CAC4C;AAElD,MAAMC,mBAAmB,GAAG,CAC1B,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,SAAS,CACsC;AAEjD,SAASC,QAAQA,CACfC,MAAoB,EACpBC,KAAa,EACD;EACZ,OAAOD,MAAM,CAACE,IAAI,CAAEC,SAAS,IAAKA,SAAS,KAAKF,KAAK,CAAC;AACxD;;AAEA;AACA,OAAO,SAASG,iBAAiBA,CAC/BC,QAA+B,EACd;EACjB,MAAMC,SAAS,GAAGP,QAAQ,CAACH,UAAU,EAAES,QAAQ,CAACC,SAAS,CAAC,GACtDD,QAAQ,CAACC,SAAS,GAClB,SAAS;EACb,MAAMC,kBAAkB,GACtBF,QAAQ,CAACE,kBAAkB,KAAK,IAAI,IACpCR,QAAQ,CAACF,oBAAoB,EAAEQ,QAAQ,CAACE,kBAAkB,CAAC,GACvDF,QAAQ,CAACE,kBAAkB,GAC3B,IAAI;EACV,MAAMC,iBAAiB,GACrBH,QAAQ,CAACG,iBAAiB,KAAK,IAAI,GAC/B,IAAI,GACJT,QAAQ,CAACD,mBAAmB,EAAEO,QAAQ,CAACG,iBAAiB,CAAC,GACvDH,QAAQ,CAACG,iBAAiB,GAC1B,SAAS;EAEjB,OAAO;IACLC,WAAW,EAAEJ,QAAQ,CAACI,WAAW;IACjCC,WAAW,EAAEL,QAAQ,CAACK,WAAW;IACjCC,eAAe,EAAEN,QAAQ,CAACM,eAAe;IACzCL,SAAS;IACTM,KAAK,EAAEP,QAAQ,CAACO,KAAK;IACrBC,WAAW,EAAER,QAAQ,CAACQ,WAAW;IACjCC,aAAa,EAAET,QAAQ,CAACS,aAAa;IACrCC,SAAS,EAAEV,QAAQ,CAACU,SAAS;IAC7BC,YAAY,EAAEX,QAAQ,CAACW,YAAY;IACnCC,UAAU,EAAEZ,QAAQ,CAACY,UAAU;IAC/BC,cAAc,EAAEb,QAAQ,CAACa,cAAc;IACvCX,kBAAkB;IAClBY,YAAY,EAAEd,QAAQ,CAACc,YAAY;IACnCC,YAAY,EAAEf,QAAQ,CAACe,YAAY;IACnCC,WAAW,EAAEhB,QAAQ,CAACgB,WAAW;IACjCb,iBAAiB;IACjBc,SAAS,EAAEjB,QAAQ,CAACiB;EACtB,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"..\\..\\src","sources":["types.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type CodegenTypes, type TurboModule } from 'react-native';
|
|
2
|
+
export type NativeNetworkSnapshot = {
|
|
3
|
+
isConnected: boolean;
|
|
4
|
+
isValidated: boolean | null;
|
|
5
|
+
isCaptivePortal: boolean | null;
|
|
6
|
+
transport: string;
|
|
7
|
+
isVpn: boolean | null;
|
|
8
|
+
isExpensive: boolean;
|
|
9
|
+
isConstrained: boolean;
|
|
10
|
+
isRoaming: boolean | null;
|
|
11
|
+
downlinkKbps: number | null;
|
|
12
|
+
uplinkKbps: number | null;
|
|
13
|
+
signalStrength: number | null;
|
|
14
|
+
cellularGeneration: string | null;
|
|
15
|
+
supportsIPv4: boolean | null;
|
|
16
|
+
supportsIPv6: boolean | null;
|
|
17
|
+
supportsDNS: boolean | null;
|
|
18
|
+
unsatisfiedReason: string | null;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
};
|
|
21
|
+
export type NativeMonitorOptions = {
|
|
22
|
+
throttleMs: number;
|
|
23
|
+
bandwidthChangeThresholdPct: number;
|
|
24
|
+
};
|
|
25
|
+
export type NativeProbeOptions = {
|
|
26
|
+
latencyUrl: string;
|
|
27
|
+
downloadUrl: string | null;
|
|
28
|
+
latencySamples: number;
|
|
29
|
+
timeoutMs: number;
|
|
30
|
+
downloadMaxDurationMs: number;
|
|
31
|
+
downloadMaxBytes: number;
|
|
32
|
+
};
|
|
33
|
+
export type NativeProbeResult = {
|
|
34
|
+
rttMs: number | null;
|
|
35
|
+
downlinkKbps: number | null;
|
|
36
|
+
bytesReceived: number;
|
|
37
|
+
durationMs: number;
|
|
38
|
+
downloadError: string | null;
|
|
39
|
+
timestamp: number;
|
|
40
|
+
};
|
|
41
|
+
export interface Spec extends TurboModule {
|
|
42
|
+
getCurrentState(): Promise<NativeNetworkSnapshot>;
|
|
43
|
+
startMonitoring(options: NativeMonitorOptions): void;
|
|
44
|
+
stopMonitoring(): void;
|
|
45
|
+
probe(options: NativeProbeOptions): Promise<NativeProbeResult>;
|
|
46
|
+
readonly onNetworkStateChange: CodegenTypes.EventEmitter<NativeNetworkSnapshot>;
|
|
47
|
+
}
|
|
48
|
+
declare const _default: Spec | null | undefined;
|
|
49
|
+
export default _default;
|
|
50
|
+
//# sourceMappingURL=NativeNetworkQuality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeNetworkQuality.d.ts","sourceRoot":"","sources":["../../../src/NativeNetworkQuality.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,eAAe,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAClD,eAAe,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrD,cAAc,IAAI,IAAI,CAAC;IACvB,KAAK,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC/D,QAAQ,CAAC,oBAAoB,EAAE,YAAY,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;CACjF;;AAED,wBAA+D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { NetworkQuality, NetworkQualityClassificationContext, NetworkQualityConfig, NetworkQualityState, NetworkSnapshot, ProbeResult } from './types.js';
|
|
2
|
+
type Classification = Pick<NetworkQualityState, 'quality' | 'qualitySource' | 'effectiveDownlinkKbps' | 'effectiveRttMs' | 'reasons'>;
|
|
3
|
+
type ClassifierConfig = Pick<NetworkQualityConfig, 'thresholds' | 'probe'> & Partial<Pick<NetworkQualityConfig, 'validationGraceMs'>>;
|
|
4
|
+
/**
|
|
5
|
+
* Classifies a snapshot using a fresh active probe, an OS estimate, or a
|
|
6
|
+
* cellular-generation heuristic. The function is pure and deterministic.
|
|
7
|
+
*/
|
|
8
|
+
export declare function classifyNetworkQuality(snapshot: NetworkSnapshot, probe: ProbeResult | null, config?: ClassifierConfig, now?: number, context?: NetworkQualityClassificationContext): Classification;
|
|
9
|
+
/** Returns whether a ranked quality tier meets or exceeds a minimum tier. */
|
|
10
|
+
export declare function isQualityAtLeast(quality: NetworkQuality, minimum: NetworkQuality): boolean;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/classify.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,mCAAmC,EACnC,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,WAAW,EAGZ,MAAM,YAAS,CAAC;AAEjB,KAAK,cAAc,GAAG,IAAI,CACxB,mBAAmB,EACjB,SAAS,GACT,eAAe,GACf,uBAAuB,GACvB,gBAAgB,GAChB,SAAS,CACZ,CAAC;AAEF,KAAK,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,OAAO,CAAC,GACxE,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AA+C3D;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,eAAe,EACzB,KAAK,EAAE,WAAW,GAAG,IAAI,EACzB,MAAM,GAAE,gBAAiC,EACzC,GAAG,GAAE,MAAmB,EACxB,OAAO,GAAE,mCAAwC,GAChD,cAAc,CAuHhB;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,GACtB,OAAO,CAGT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NetworkQuality, NetworkQualityConfig } from './types.js';
|
|
2
|
+
/** Default monitoring, classifier, and probe configuration. */
|
|
3
|
+
export declare const DEFAULT_CONFIG: NetworkQualityConfig;
|
|
4
|
+
/** Ranked quality tiers from worst to best. `unknown` is intentionally unranked. */
|
|
5
|
+
export declare const QUALITY_ORDER: NetworkQuality[];
|
|
6
|
+
/** Error codes that can be returned by the package. */
|
|
7
|
+
export declare const ERROR_CODES: {
|
|
8
|
+
readonly unsupported: "E_UNSUPPORTED";
|
|
9
|
+
readonly offline: "E_OFFLINE";
|
|
10
|
+
readonly invalidUrl: "E_INVALID_URL";
|
|
11
|
+
readonly probeTimeout: "E_PROBE_TIMEOUT";
|
|
12
|
+
readonly probeFailed: "E_PROBE_FAILED";
|
|
13
|
+
readonly probeSkipped: "E_PROBE_SKIPPED";
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAS,CAAC;AAEpE,+DAA+D;AAC/D,eAAO,MAAM,cAAc,EAAE,oBAyB5B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,aAAa,EAAE,cAAc,EAMzC,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NetworkQualityErrorCode } from './types.js';
|
|
2
|
+
/** Error raised by monitoring and probing operations. */
|
|
3
|
+
export declare class NetworkQualityError extends Error {
|
|
4
|
+
/** Stable machine-readable error code. */
|
|
5
|
+
readonly code: NetworkQualityErrorCode;
|
|
6
|
+
/** Original platform error, when one is available. */
|
|
7
|
+
readonly cause?: unknown;
|
|
8
|
+
/** Creates a network-quality error with a stable code and helpful message. */
|
|
9
|
+
constructor(code: NetworkQualityErrorCode, message: string, options?: {
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAS,CAAC;AAEvD,yDAAyD;AACzD,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,0CAA0C;IAC1C,SAAgB,IAAI,EAAE,uBAAuB,CAAC;IAE9C,sDAAsD;IACtD,SAAyB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzC,8EAA8E;gBAE5E,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQhC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NetworkQualityError } from './errors.js';
|
|
2
|
+
import type { NetworkQualityState, ProbeConfig, ProbeResult } from './types.js';
|
|
3
|
+
/** Subscribes a React component to the referentially stable live state. */
|
|
4
|
+
export declare function useNetworkQuality(): NetworkQualityState | null;
|
|
5
|
+
/** State and trigger returned by `useNetworkProbe`. */
|
|
6
|
+
export interface UseNetworkProbeResult {
|
|
7
|
+
/** Starts a de-duplicated active network probe. */
|
|
8
|
+
probe: (options?: Partial<ProbeConfig>) => Promise<ProbeResult>;
|
|
9
|
+
/** Whether this hook's most recent request is still running. */
|
|
10
|
+
isProbing: boolean;
|
|
11
|
+
/** Most recent successful result started by this hook. */
|
|
12
|
+
result: ProbeResult | null;
|
|
13
|
+
/** Most recent probe failure started by this hook. */
|
|
14
|
+
error: NetworkQualityError | null;
|
|
15
|
+
}
|
|
16
|
+
/** Provides imperative probing with React-friendly loading and error state. */
|
|
17
|
+
export declare function useNetworkProbe(): UseNetworkProbeResult;
|
|
18
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAU,CAAC;AAO/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAS,CAAC;AAa7E,2EAA2E;AAC3E,wBAAgB,iBAAiB,IAAI,mBAAmB,GAAG,IAAI,CAQ9D;AAED,uDAAuD;AACvD,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAChE,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,sDAAsD;IACtD,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACnC;AAYD,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,qBAAqB,CA+CvD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Purely classifies a network snapshot and optional active-probe result. */
|
|
2
|
+
export { classifyNetworkQuality, isQualityAtLeast } from './classify.js';
|
|
3
|
+
/** Default configuration and ranked quality tiers. */
|
|
4
|
+
export { DEFAULT_CONFIG, QUALITY_ORDER } from './constants.js';
|
|
5
|
+
/** Error type used by all package operations. */
|
|
6
|
+
export { NetworkQualityError } from './errors.js';
|
|
7
|
+
/** React hooks for live state and on-demand active probes. */
|
|
8
|
+
export { useNetworkProbe, useNetworkQuality } from './hooks.js';
|
|
9
|
+
/** Runtime configuration, snapshots, listeners, and active probing. */
|
|
10
|
+
export { addNetworkQualityListener, configure, getConfig, getLastProbeResult, getNetworkQuality, isSupported, probeNetwork, } from './manager.js';
|
|
11
|
+
/** Public network-quality types. */
|
|
12
|
+
export type * from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,eAAY,CAAC;AAEtE,sDAAsD;AACtD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAa,CAAC;AAE5D,iDAAiD;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAU,CAAC;AAE/C,8DAA8D;AAC9D,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAS,CAAC;AAE7D,uEAAuE;AACvE,OAAO,EACL,yBAAyB,EACzB,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,cAAW,CAAC;AAEnB,oCAAoC;AACpC,mBAAmB,YAAS,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type AppStateStatus } from 'react-native';
|
|
2
|
+
import { type NativeMonitorOptions, type NativeNetworkSnapshot, type NativeProbeOptions, type NativeProbeResult } from './NativeNetworkQuality.js';
|
|
3
|
+
import type { DeepPartial, NetworkQualityConfig, NetworkQualityState, ProbeConfig, ProbeResult } from './types.js';
|
|
4
|
+
type RemovableSubscription = {
|
|
5
|
+
remove(): void;
|
|
6
|
+
};
|
|
7
|
+
/** Minimal native surface consumed by the TypeScript manager. */
|
|
8
|
+
export interface NetworkQualityNativeModule {
|
|
9
|
+
getCurrentState(): Promise<NativeNetworkSnapshot>;
|
|
10
|
+
startMonitoring(options: NativeMonitorOptions): void;
|
|
11
|
+
stopMonitoring(): void;
|
|
12
|
+
probe(options: NativeProbeOptions): Promise<NativeProbeResult>;
|
|
13
|
+
onNetworkStateChange(listener: (snapshot: NativeNetworkSnapshot) => void): RemovableSubscription;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal AppState surface consumed by the TypeScript manager. */
|
|
16
|
+
export interface NetworkQualityAppState {
|
|
17
|
+
readonly currentState: string | null | undefined;
|
|
18
|
+
addEventListener(type: 'change', listener: (state: AppStateStatus) => void): RemovableSubscription;
|
|
19
|
+
}
|
|
20
|
+
/** Coordinates the native module, cached state, listeners, and auto-probes. */
|
|
21
|
+
export declare class NetworkQualityManager {
|
|
22
|
+
private readonly nativeModule;
|
|
23
|
+
private readonly appStateApi;
|
|
24
|
+
private config;
|
|
25
|
+
private readonly listeners;
|
|
26
|
+
private nativeSubscription;
|
|
27
|
+
private appStateSubscription;
|
|
28
|
+
private latestSnapshot;
|
|
29
|
+
private cachedState;
|
|
30
|
+
private lastProbe;
|
|
31
|
+
private lastProbeFailure;
|
|
32
|
+
private lastProbeResultTtlMs;
|
|
33
|
+
private lastProbeFailureTtlMs;
|
|
34
|
+
private networkChangedAt;
|
|
35
|
+
private inFlightProbe;
|
|
36
|
+
private probeExpiry;
|
|
37
|
+
private validationGraceExpiry;
|
|
38
|
+
private autoProbeInterval;
|
|
39
|
+
private transportDebounce;
|
|
40
|
+
private appStateStatus;
|
|
41
|
+
private monitoringStopVersion;
|
|
42
|
+
private stateVersion;
|
|
43
|
+
constructor(nativeModule?: NetworkQualityNativeModule | null, appStateApi?: NetworkQualityAppState);
|
|
44
|
+
/** Returns whether the native TurboModule is linked and available. */
|
|
45
|
+
isSupported(): boolean;
|
|
46
|
+
/** Deep-merges and validates runtime monitoring and probe configuration. */
|
|
47
|
+
configure(patch: DeepPartial<NetworkQualityConfig>): void;
|
|
48
|
+
/** Returns a defensive copy of the active runtime configuration. */
|
|
49
|
+
getConfig(): NetworkQualityConfig;
|
|
50
|
+
/** Fetches, normalizes, classifies, and caches the current native snapshot. */
|
|
51
|
+
getNetworkQuality(): Promise<NetworkQualityState>;
|
|
52
|
+
/** Adds a live-state listener and starts native monitoring when necessary. */
|
|
53
|
+
addNetworkQualityListener(listener: (state: NetworkQualityState) => void): RemovableSubscription;
|
|
54
|
+
/** Runs one active probe, de-duplicating concurrent calls. */
|
|
55
|
+
probeNetwork(options?: Partial<ProbeConfig>): Promise<ProbeResult>;
|
|
56
|
+
/** Returns the most recent successful active-probe result. */
|
|
57
|
+
getLastProbeResult(): ProbeResult | null;
|
|
58
|
+
/** Returns the referentially stable state snapshot used by React. */
|
|
59
|
+
getCachedState(): NetworkQualityState | null;
|
|
60
|
+
private requireNativeModule;
|
|
61
|
+
private nativeMonitorOptions;
|
|
62
|
+
private acceptNativeSnapshot;
|
|
63
|
+
private buildState;
|
|
64
|
+
private acceptState;
|
|
65
|
+
private reclassifyCachedSnapshot;
|
|
66
|
+
private scheduleProbeExpiry;
|
|
67
|
+
private clearProbeExpiry;
|
|
68
|
+
private scheduleValidationGraceExpiry;
|
|
69
|
+
private clearValidationGraceExpiry;
|
|
70
|
+
private recordProbeFailure;
|
|
71
|
+
private refreshAutoProbeLifecycle;
|
|
72
|
+
private stopAutoProbeLifecycle;
|
|
73
|
+
private startAutoProbeInterval;
|
|
74
|
+
private clearAutoProbeInterval;
|
|
75
|
+
private clearTransportDebounce;
|
|
76
|
+
private scheduleTransportChangeProbe;
|
|
77
|
+
private runAutoProbe;
|
|
78
|
+
}
|
|
79
|
+
/** Internal render-time support assertion used by the React hooks. */
|
|
80
|
+
export declare function assertNetworkQualitySupported(): void;
|
|
81
|
+
/** Returns whether the native TurboModule is linked and available. */
|
|
82
|
+
export declare function isSupported(): boolean;
|
|
83
|
+
/** Deep-merges runtime options into the current configuration. */
|
|
84
|
+
export declare function configure(config: DeepPartial<NetworkQualityConfig>): void;
|
|
85
|
+
/** Returns a defensive copy of the current configuration. */
|
|
86
|
+
export declare function getConfig(): NetworkQualityConfig;
|
|
87
|
+
/** Fetches the current network-quality state. */
|
|
88
|
+
export declare function getNetworkQuality(): Promise<NetworkQualityState>;
|
|
89
|
+
/** Subscribes to live network-quality state changes. */
|
|
90
|
+
export declare function addNetworkQualityListener(listener: (state: NetworkQualityState) => void): RemovableSubscription;
|
|
91
|
+
/** Runs an active latency and optional throughput probe. */
|
|
92
|
+
export declare function probeNetwork(options?: Partial<ProbeConfig>): Promise<ProbeResult>;
|
|
93
|
+
/** Returns the most recent successful active-probe result. */
|
|
94
|
+
export declare function getLastProbeResult(): ProbeResult | null;
|
|
95
|
+
/** Internal stable snapshot getter used by `useSyncExternalStore`. */
|
|
96
|
+
export declare function getCachedNetworkQualityState(): NetworkQualityState | null;
|
|
97
|
+
export {};
|
|
98
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { NativeNetworkSnapshot } from './NativeNetworkQuality.js';
|
|
2
|
+
import type { NetworkSnapshot } from './types.js';
|
|
3
|
+
/** Narrows a native snapshot to the stable public string unions. */
|
|
4
|
+
export declare function normalizeSnapshot(snapshot: NativeNetworkSnapshot): NetworkSnapshot;
|
|
5
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../src/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAAwB,CAAC;AACpE,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,YAAS,CAAC;AAoCjB,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,GAC9B,eAAe,CAmCjB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/** The network interface carrying the default route. */
|
|
2
|
+
export type Transport = 'wifi' | 'cellular' | 'ethernet' | 'bluetooth' | 'vpn' | 'other' | 'none' | 'unknown';
|
|
3
|
+
/** A coarse cellular radio generation reported by the operating system. */
|
|
4
|
+
export type CellularGeneration = '2g' | '3g' | '4g' | '5g';
|
|
5
|
+
/** The derived connection-quality tier. */
|
|
6
|
+
export type NetworkQuality = 'unknown' | 'offline' | 'poor' | 'moderate' | 'good' | 'excellent';
|
|
7
|
+
/** The signal source that determined the current quality tier. */
|
|
8
|
+
export type QualitySource = 'probe' | 'os-estimate' | 'heuristic' | 'none';
|
|
9
|
+
/** The reason iOS reported an unsatisfied network path. */
|
|
10
|
+
export type UnsatisfiedReason = 'notAvailable' | 'cellularDenied' | 'wifiDenied' | 'localNetworkDenied' | 'vpnInactive' | 'unknown';
|
|
11
|
+
/** Raw link signals reported by the operating system. `null` means unavailable. */
|
|
12
|
+
export interface NetworkSnapshot {
|
|
13
|
+
/** Whether the default network can carry internet traffic. */
|
|
14
|
+
isConnected: boolean;
|
|
15
|
+
/** Whether the operating system validated internet access. */
|
|
16
|
+
isValidated: boolean | null;
|
|
17
|
+
/** Whether the operating system detected a captive portal. */
|
|
18
|
+
isCaptivePortal: boolean | null;
|
|
19
|
+
/** The interface carrying the default route. */
|
|
20
|
+
transport: Transport;
|
|
21
|
+
/** Whether a VPN transport is present, when detectable. */
|
|
22
|
+
isVpn: boolean | null;
|
|
23
|
+
/** Whether use of the connection may incur monetary or data cost. */
|
|
24
|
+
isExpensive: boolean;
|
|
25
|
+
/** Whether the user enabled a reduced-data mode. */
|
|
26
|
+
isConstrained: boolean;
|
|
27
|
+
/** Whether the cellular connection is roaming, when detectable. */
|
|
28
|
+
isRoaming: boolean | null;
|
|
29
|
+
/** Operating-system downstream bandwidth estimate in kilobits per second. */
|
|
30
|
+
downlinkKbps: number | null;
|
|
31
|
+
/** Operating-system upstream bandwidth estimate in kilobits per second. */
|
|
32
|
+
uplinkKbps: number | null;
|
|
33
|
+
/** Bearer-dependent signal-strength value reported by the operating system. */
|
|
34
|
+
signalStrength: number | null;
|
|
35
|
+
/** Coarse cellular radio generation, when available. */
|
|
36
|
+
cellularGeneration: CellularGeneration | null;
|
|
37
|
+
/** Whether the current route supports IPv4. */
|
|
38
|
+
supportsIPv4: boolean | null;
|
|
39
|
+
/** Whether the current route supports IPv6. */
|
|
40
|
+
supportsIPv6: boolean | null;
|
|
41
|
+
/** Whether the current route has DNS support. */
|
|
42
|
+
supportsDNS: boolean | null;
|
|
43
|
+
/** Why an iOS path is unsatisfied, when available. */
|
|
44
|
+
unsatisfiedReason: UnsatisfiedReason | null;
|
|
45
|
+
/** Milliseconds since the Unix epoch. */
|
|
46
|
+
timestamp: number;
|
|
47
|
+
}
|
|
48
|
+
/** Measurements returned by an explicitly requested active network probe. */
|
|
49
|
+
export interface ProbeResult {
|
|
50
|
+
/** Median round-trip time to the latency endpoint in milliseconds. */
|
|
51
|
+
rttMs: number | null;
|
|
52
|
+
/** Measured downstream throughput in kilobits per second. */
|
|
53
|
+
downlinkKbps: number | null;
|
|
54
|
+
/** Number of response-body bytes read during the throughput phase. */
|
|
55
|
+
bytesReceived: number;
|
|
56
|
+
/** Total probe duration in milliseconds. */
|
|
57
|
+
durationMs: number;
|
|
58
|
+
/** Transport active when the probe was run. */
|
|
59
|
+
transport: Transport;
|
|
60
|
+
/** Non-fatal throughput-phase error, if one occurred. */
|
|
61
|
+
downloadError: string | null;
|
|
62
|
+
/** Milliseconds since the Unix epoch. */
|
|
63
|
+
timestamp: number;
|
|
64
|
+
}
|
|
65
|
+
/** Metadata captured when an active probe fails before producing a result. */
|
|
66
|
+
export interface ProbeFailure {
|
|
67
|
+
/** Stable library error code returned by the failed probe. */
|
|
68
|
+
code: NetworkQualityErrorCode;
|
|
69
|
+
/** Human-readable native or JavaScript error message. */
|
|
70
|
+
message: string;
|
|
71
|
+
/** Transport active when the failed probe was started. */
|
|
72
|
+
transport: Transport;
|
|
73
|
+
/** Failure time in Unix-epoch milliseconds. */
|
|
74
|
+
timestamp: number;
|
|
75
|
+
}
|
|
76
|
+
/** Optional manager-owned inputs used by the pure classifier. */
|
|
77
|
+
export interface NetworkQualityClassificationContext {
|
|
78
|
+
/** Most recent probe failure, when one is still relevant. */
|
|
79
|
+
lastProbeFailure?: ProbeFailure | null;
|
|
80
|
+
/** Time when connectivity or transport last changed. */
|
|
81
|
+
networkChangedAt?: number | null;
|
|
82
|
+
/** TTL used by the most recent successful probe override. */
|
|
83
|
+
probeResultTtlMs?: number;
|
|
84
|
+
/** TTL used by the most recent failed probe override. */
|
|
85
|
+
probeFailureTtlMs?: number;
|
|
86
|
+
}
|
|
87
|
+
/** A raw snapshot enriched with a classified quality tier and probe metadata. */
|
|
88
|
+
export interface NetworkQualityState extends NetworkSnapshot {
|
|
89
|
+
/** The derived quality tier. */
|
|
90
|
+
quality: NetworkQuality;
|
|
91
|
+
/** The signal source used to derive `quality`. */
|
|
92
|
+
qualitySource: QualitySource;
|
|
93
|
+
/** Downstream value used by the classifier. */
|
|
94
|
+
effectiveDownlinkKbps: number | null;
|
|
95
|
+
/** Round-trip value used by the classifier. */
|
|
96
|
+
effectiveRttMs: number | null;
|
|
97
|
+
/** Most recent successful probe result. */
|
|
98
|
+
lastProbe: ProbeResult | null;
|
|
99
|
+
/** Most recent relevant failed probe. */
|
|
100
|
+
lastProbeFailure: ProbeFailure | null;
|
|
101
|
+
/** Human-readable classifier decisions, intended for diagnostics. */
|
|
102
|
+
reasons: string[];
|
|
103
|
+
}
|
|
104
|
+
/** Boundaries for a single connection-quality tier. */
|
|
105
|
+
export interface TierThreshold {
|
|
106
|
+
/** Minimum downstream bandwidth in kilobits per second. */
|
|
107
|
+
minDownlinkKbps: number;
|
|
108
|
+
/** Maximum round-trip time in milliseconds. */
|
|
109
|
+
maxRttMs: number;
|
|
110
|
+
}
|
|
111
|
+
/** Configurable excellent, good, and moderate quality boundaries. */
|
|
112
|
+
export interface QualityThresholds {
|
|
113
|
+
/** Excellent-quality boundaries. */
|
|
114
|
+
excellent: TierThreshold;
|
|
115
|
+
/** Good-quality boundaries. */
|
|
116
|
+
good: TierThreshold;
|
|
117
|
+
/** Moderate-quality boundaries. */
|
|
118
|
+
moderate: TierThreshold;
|
|
119
|
+
}
|
|
120
|
+
/** Options controlling an active latency and throughput probe. */
|
|
121
|
+
export interface ProbeConfig {
|
|
122
|
+
/** HTTP(S) endpoint used for latency samples. */
|
|
123
|
+
latencyUrl: string;
|
|
124
|
+
/** HTTP(S) payload endpoint, or `null` to skip throughput measurement. */
|
|
125
|
+
downloadUrl: string | null;
|
|
126
|
+
/** Retained latency samples (1–100), excluding one warm-up request. */
|
|
127
|
+
latencySamples: number;
|
|
128
|
+
/** Positive whole-probe timeout in milliseconds, capped at 2,147,483,647. */
|
|
129
|
+
timeoutMs: number;
|
|
130
|
+
/** Maximum throughput-measurement time after the first response byte. */
|
|
131
|
+
downloadMaxDurationMs: number;
|
|
132
|
+
/** Maximum response-body bytes consumed by the throughput measurement. */
|
|
133
|
+
downloadMaxBytes: number;
|
|
134
|
+
/** Time for which a result may influence classification. */
|
|
135
|
+
resultTtlMs: number;
|
|
136
|
+
}
|
|
137
|
+
/** Options controlling background-safe automatic probes. */
|
|
138
|
+
export interface AutoProbeConfig {
|
|
139
|
+
/** Whether automatic probing is enabled. */
|
|
140
|
+
enabled: boolean;
|
|
141
|
+
/** Delay between automatic probes in milliseconds. */
|
|
142
|
+
intervalMs: number;
|
|
143
|
+
/** Whether a transport change schedules a probe. */
|
|
144
|
+
onTransportChange: boolean;
|
|
145
|
+
/** Whether automatic probes may run on expensive networks. */
|
|
146
|
+
allowOnExpensive: boolean;
|
|
147
|
+
/** Whether automatic probes may run on constrained networks. */
|
|
148
|
+
allowOnConstrained: boolean;
|
|
149
|
+
}
|
|
150
|
+
/** Complete runtime configuration for monitoring, classification, and probing. */
|
|
151
|
+
export interface NetworkQualityConfig {
|
|
152
|
+
/** Minimum interval between minor native signal updates. */
|
|
153
|
+
throttleMs: number;
|
|
154
|
+
/** Percentage change required for bandwidth or signal updates. */
|
|
155
|
+
bandwidthChangeThresholdPct: number;
|
|
156
|
+
/** Grace period before a newly connected, unvalidated network is poor. */
|
|
157
|
+
validationGraceMs: number;
|
|
158
|
+
/** Classifier boundaries. */
|
|
159
|
+
thresholds: QualityThresholds;
|
|
160
|
+
/** Active-probe defaults. */
|
|
161
|
+
probe: ProbeConfig;
|
|
162
|
+
/** Automatic-probe behavior. */
|
|
163
|
+
autoProbe: AutoProbeConfig;
|
|
164
|
+
}
|
|
165
|
+
/** Error codes surfaced by native and JavaScript operations. */
|
|
166
|
+
export type NetworkQualityErrorCode = 'E_UNSUPPORTED' | 'E_OFFLINE' | 'E_INVALID_URL' | 'E_PROBE_TIMEOUT' | 'E_PROBE_FAILED' | 'E_PROBE_SKIPPED';
|
|
167
|
+
/** Recursively optional object fields accepted by `configure`. */
|
|
168
|
+
export type DeepPartial<T> = {
|
|
169
|
+
[Key in keyof T]?: T[Key] extends object ? DeepPartial<T[Key]> : T[Key];
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"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"}
|