@qawolf/run-globals-ios 0.0.18
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/README.md +232 -0
- package/dist/audio.d.ts +98 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +145 -0
- package/dist/audio.js.map +1 -0
- package/dist/barcode.d.ts +58 -0
- package/dist/barcode.d.ts.map +1 -0
- package/dist/barcode.js +45 -0
- package/dist/barcode.js.map +1 -0
- package/dist/beacon.d.ts +48 -0
- package/dist/beacon.d.ts.map +1 -0
- package/dist/beacon.js +49 -0
- package/dist/beacon.js.map +1 -0
- package/dist/configuration-profile.d.ts +27 -0
- package/dist/configuration-profile.d.ts.map +1 -0
- package/dist/configuration-profile.js +40 -0
- package/dist/configuration-profile.js.map +1 -0
- package/dist/gateway.d.ts +443 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +433 -0
- package/dist/gateway.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/injectionHelpers.d.ts +18 -0
- package/dist/injectionHelpers.d.ts.map +1 -0
- package/dist/injectionHelpers.js +68 -0
- package/dist/injectionHelpers.js.map +1 -0
- package/dist/media.d.ts +79 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +82 -0
- package/dist/media.js.map +1 -0
- package/dist/photo.d.ts +117 -0
- package/dist/photo.d.ts.map +1 -0
- package/dist/photo.js +143 -0
- package/dist/photo.js.map +1 -0
- package/dist/typings.d.ts +773 -0
- package/dist/webview.d.ts +23 -0
- package/dist/webview.d.ts.map +1 -0
- package/dist/webview.js +25 -0
- package/dist/webview.js.map +1 -0
- package/package.json +68 -0
package/dist/beacon.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { pushJsonConfig, pushRawContent } from "./injectionHelpers.js";
|
|
2
|
+
/**
|
|
3
|
+
* Inject iBeacon detections into the app's CLLocationManager.
|
|
4
|
+
*
|
|
5
|
+
* Always pushes the `{uuid}.region` file, which triggers
|
|
6
|
+
* `locationManager(_:didEnterRegion:)`. When `beacons` is provided, also
|
|
7
|
+
* pushes `{uuid}.beacon` so the app receives
|
|
8
|
+
* `locationManager(_:didRangeBeacons:inRegion:)` callbacks.
|
|
9
|
+
*
|
|
10
|
+
* @param driver - The WebDriverIO browser instance
|
|
11
|
+
* @param bundleId - Bundle ID of the target app
|
|
12
|
+
* @param config - Beacon configuration with UUID and (optional) beacon list
|
|
13
|
+
* @returns Cleanup function that removes the injection config files
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Region entry + ranging
|
|
18
|
+
* const cleanup = await ios.injectBeacon(driver, "com.example.app", {
|
|
19
|
+
* uuid: "8613BEAD-5465-4515-8F9C-AEEA717484C9",
|
|
20
|
+
* beacons: [{ major: 1, minor: 7 }],
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* // Region entry only (no ranging)
|
|
24
|
+
* const cleanup = await ios.injectBeacon(driver, "com.example.app", {
|
|
25
|
+
* uuid: "e62c96fd-014a-454f-9b41-32245d802bb3",
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* await cleanup();
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export async function injectBeacon(driver, bundleId, config) {
|
|
32
|
+
const cleanups = [];
|
|
33
|
+
if (config.beacons && config.beacons.length > 0) {
|
|
34
|
+
const beaconData = config.beacons.map((b) => ({
|
|
35
|
+
uuid: config.uuid,
|
|
36
|
+
major: String(b.major),
|
|
37
|
+
minor: String(b.minor),
|
|
38
|
+
}));
|
|
39
|
+
cleanups.push(await pushJsonConfig(driver, bundleId, `${config.uuid}.beacon`, beaconData));
|
|
40
|
+
}
|
|
41
|
+
// Push empty region file: {uuid}.region (triggers region entry)
|
|
42
|
+
cleanups.push(await pushRawContent(driver, bundleId, `${config.uuid}.region`, ""));
|
|
43
|
+
return async () => {
|
|
44
|
+
for (const cleanup of cleanups) {
|
|
45
|
+
await cleanup();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=beacon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../src/beacon.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAgBvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAe,EACf,QAAgB,EAChB,MAAoB;IAEpB,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAE7C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;SACvB,CAAC,CAAC,CAAC;QACJ,QAAQ,CAAC,IAAI,CACX,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,SAAS,EAAE,UAAU,CAAC,CAC5E,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CACX,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,CAAC,CACpE,CAAC;IAEF,OAAO,KAAK,IAAI,EAAE;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Browser } from "webdriverio";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* Schema for configuration profile options
|
|
5
|
+
*/
|
|
6
|
+
export declare const ConfigurationProfileOptionsSchema: z.ZodObject<{
|
|
7
|
+
profileString: z.ZodString;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
/**
|
|
10
|
+
* Options for installing a configuration profile
|
|
11
|
+
*/
|
|
12
|
+
export type ConfigurationProfileOptions = z.input<typeof ConfigurationProfileOptionsSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* Install a configuration profile on the iOS device.
|
|
15
|
+
*
|
|
16
|
+
* @param driver - The WebDriverIO browser instance
|
|
17
|
+
* @param profileString - The configuration profile plist string
|
|
18
|
+
* @returns A function to uninstall the configuration profile
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const uninstall = await ios.installConfigurationProfile(driver, profilePlistString);
|
|
22
|
+
* // ... run your test ...
|
|
23
|
+
* await uninstall(); // Clean up after the test
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function installConfigurationProfile(driver: Browser, profileString: string): Promise<() => Promise<unknown>>;
|
|
27
|
+
//# sourceMappingURL=configuration-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-profile.d.ts","sourceRoot":"","sources":["../src/configuration-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,iCAAiC;;iBAG5C,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAoBjC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import plist from "plist";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* Schema for configuration profile options
|
|
5
|
+
*/
|
|
6
|
+
export const ConfigurationProfileOptionsSchema = z.object({
|
|
7
|
+
/** The configuration profile plist string */
|
|
8
|
+
profileString: z.string(),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Install a configuration profile on the iOS device.
|
|
12
|
+
*
|
|
13
|
+
* @param driver - The WebDriverIO browser instance
|
|
14
|
+
* @param profileString - The configuration profile plist string
|
|
15
|
+
* @returns A function to uninstall the configuration profile
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const uninstall = await ios.installConfigurationProfile(driver, profilePlistString);
|
|
19
|
+
* // ... run your test ...
|
|
20
|
+
* await uninstall(); // Clean up after the test
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export async function installConfigurationProfile(driver, profileString) {
|
|
24
|
+
const parsedOptions = ConfigurationProfileOptionsSchema.parse({ profileString });
|
|
25
|
+
try {
|
|
26
|
+
plist.parse(parsedOptions.profileString);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error("Failed to parse configuration profile. Please make sure it is a valid plist file.");
|
|
30
|
+
}
|
|
31
|
+
await driver.execute("qawolf: installConfigurationProfile", {
|
|
32
|
+
profileString: parsedOptions.profileString,
|
|
33
|
+
});
|
|
34
|
+
return () => {
|
|
35
|
+
return driver.execute("qawolf: uninstallConfigurationProfile", {
|
|
36
|
+
profileString: parsedOptions.profileString,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=configuration-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configuration-profile.js","sourceRoot":"","sources":["../src/configuration-profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,CAAC,MAAM,CAAC;IACxD,6CAA6C;IAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAOH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAe,EACf,aAAqB;IAErB,MAAM,aAAa,GAAG,iCAAiC,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAEjF,IAAI,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,mFAAmF,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE;QAC1D,aAAa,EAAE,aAAa,CAAC,aAAa;KAC3C,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,OAAO,MAAM,CAAC,OAAO,CAAC,uCAAuC,EAAE;YAC7D,aAAa,EAAE,aAAa,CAAC,aAAa;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const RouteTypeSchema: z.ZodEnum<{
|
|
3
|
+
direct: "direct";
|
|
4
|
+
"http-proxy": "http-proxy";
|
|
5
|
+
wireguard: "wireguard";
|
|
6
|
+
openvpn: "openvpn";
|
|
7
|
+
relay: "relay";
|
|
8
|
+
}>;
|
|
9
|
+
export type RouteType = z.infer<typeof RouteTypeSchema>;
|
|
10
|
+
export declare const TunnelStatusSchema: z.ZodEnum<{
|
|
11
|
+
down: "down";
|
|
12
|
+
starting: "starting";
|
|
13
|
+
up: "up";
|
|
14
|
+
error: "error";
|
|
15
|
+
}>;
|
|
16
|
+
export type TunnelStatus = z.infer<typeof TunnelStatusSchema>;
|
|
17
|
+
export declare const TunnelStateSchema: z.ZodObject<{
|
|
18
|
+
status: z.ZodEnum<{
|
|
19
|
+
down: "down";
|
|
20
|
+
starting: "starting";
|
|
21
|
+
up: "up";
|
|
22
|
+
error: "error";
|
|
23
|
+
}>;
|
|
24
|
+
interface: z.ZodOptional<z.ZodString>;
|
|
25
|
+
error: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, z.core.$strip>;
|
|
27
|
+
export type TunnelState = z.infer<typeof TunnelStateSchema>;
|
|
28
|
+
export declare const TunnelStatusMapSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
29
|
+
status: z.ZodEnum<{
|
|
30
|
+
down: "down";
|
|
31
|
+
starting: "starting";
|
|
32
|
+
up: "up";
|
|
33
|
+
error: "error";
|
|
34
|
+
}>;
|
|
35
|
+
interface: z.ZodOptional<z.ZodString>;
|
|
36
|
+
error: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>>;
|
|
38
|
+
export type TunnelStatusMap = z.infer<typeof TunnelStatusMapSchema>;
|
|
39
|
+
export declare const HttpProxyTunnelSchema: z.ZodObject<{
|
|
40
|
+
type: z.ZodLiteral<"http-proxy">;
|
|
41
|
+
host: z.ZodString;
|
|
42
|
+
port: z.ZodNumber;
|
|
43
|
+
username: z.ZodOptional<z.ZodString>;
|
|
44
|
+
password: z.ZodOptional<z.ZodString>;
|
|
45
|
+
}, z.core.$strip>;
|
|
46
|
+
export type HttpProxyTunnel = z.infer<typeof HttpProxyTunnelSchema>;
|
|
47
|
+
export declare const WireGuardTunnelSchema: z.ZodObject<{
|
|
48
|
+
type: z.ZodLiteral<"wireguard">;
|
|
49
|
+
configPath: z.ZodString;
|
|
50
|
+
}, z.core.$strip>;
|
|
51
|
+
export type WireGuardTunnel = z.infer<typeof WireGuardTunnelSchema>;
|
|
52
|
+
export declare const OpenVPNTunnelSchema: z.ZodObject<{
|
|
53
|
+
type: z.ZodLiteral<"openvpn">;
|
|
54
|
+
configPath: z.ZodString;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
export type OpenVPNTunnel = z.infer<typeof OpenVPNTunnelSchema>;
|
|
57
|
+
export declare const RelayTunnelSchema: z.ZodObject<{
|
|
58
|
+
type: z.ZodLiteral<"relay">;
|
|
59
|
+
host: z.ZodString;
|
|
60
|
+
port: z.ZodNumber;
|
|
61
|
+
username: z.ZodString;
|
|
62
|
+
password: z.ZodString;
|
|
63
|
+
dialer: z.ZodOptional<z.ZodEnum<{
|
|
64
|
+
tls: "tls";
|
|
65
|
+
tcp: "tcp";
|
|
66
|
+
}>>;
|
|
67
|
+
secure: z.ZodOptional<z.ZodBoolean>;
|
|
68
|
+
}, z.core.$strip>;
|
|
69
|
+
export type RelayTunnel = z.infer<typeof RelayTunnelSchema>;
|
|
70
|
+
export declare const DirectTunnelSchema: z.ZodObject<{
|
|
71
|
+
type: z.ZodLiteral<"direct">;
|
|
72
|
+
}, z.core.$strip>;
|
|
73
|
+
export type DirectTunnel = z.infer<typeof DirectTunnelSchema>;
|
|
74
|
+
export declare const TunnelConfigSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
75
|
+
type: z.ZodLiteral<"direct">;
|
|
76
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
77
|
+
type: z.ZodLiteral<"http-proxy">;
|
|
78
|
+
host: z.ZodString;
|
|
79
|
+
port: z.ZodNumber;
|
|
80
|
+
username: z.ZodOptional<z.ZodString>;
|
|
81
|
+
password: z.ZodOptional<z.ZodString>;
|
|
82
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
83
|
+
type: z.ZodLiteral<"wireguard">;
|
|
84
|
+
configPath: z.ZodString;
|
|
85
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
86
|
+
type: z.ZodLiteral<"openvpn">;
|
|
87
|
+
configPath: z.ZodString;
|
|
88
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
89
|
+
type: z.ZodLiteral<"relay">;
|
|
90
|
+
host: z.ZodString;
|
|
91
|
+
port: z.ZodNumber;
|
|
92
|
+
username: z.ZodString;
|
|
93
|
+
password: z.ZodString;
|
|
94
|
+
dialer: z.ZodOptional<z.ZodEnum<{
|
|
95
|
+
tls: "tls";
|
|
96
|
+
tcp: "tcp";
|
|
97
|
+
}>>;
|
|
98
|
+
secure: z.ZodOptional<z.ZodBoolean>;
|
|
99
|
+
}, z.core.$strip>]>;
|
|
100
|
+
export type TunnelConfig = z.infer<typeof TunnelConfigSchema>;
|
|
101
|
+
export declare const RouteTrafficConfigSchema: z.ZodObject<{
|
|
102
|
+
apps: z.ZodArray<z.ZodString>;
|
|
103
|
+
domains: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
104
|
+
tunnel: z.ZodUnion<readonly [z.ZodObject<{
|
|
105
|
+
type: z.ZodLiteral<"direct">;
|
|
106
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
107
|
+
type: z.ZodLiteral<"http-proxy">;
|
|
108
|
+
host: z.ZodString;
|
|
109
|
+
port: z.ZodNumber;
|
|
110
|
+
username: z.ZodOptional<z.ZodString>;
|
|
111
|
+
password: z.ZodOptional<z.ZodString>;
|
|
112
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
113
|
+
type: z.ZodLiteral<"wireguard">;
|
|
114
|
+
configPath: z.ZodString;
|
|
115
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
116
|
+
type: z.ZodLiteral<"openvpn">;
|
|
117
|
+
configPath: z.ZodString;
|
|
118
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
119
|
+
type: z.ZodLiteral<"relay">;
|
|
120
|
+
host: z.ZodString;
|
|
121
|
+
port: z.ZodNumber;
|
|
122
|
+
username: z.ZodString;
|
|
123
|
+
password: z.ZodString;
|
|
124
|
+
dialer: z.ZodOptional<z.ZodEnum<{
|
|
125
|
+
tls: "tls";
|
|
126
|
+
tcp: "tcp";
|
|
127
|
+
}>>;
|
|
128
|
+
secure: z.ZodOptional<z.ZodBoolean>;
|
|
129
|
+
}, z.core.$strip>]>;
|
|
130
|
+
socksHost: z.ZodOptional<z.ZodString>;
|
|
131
|
+
socksPort: z.ZodOptional<z.ZodNumber>;
|
|
132
|
+
inspect: z.ZodOptional<z.ZodBoolean>;
|
|
133
|
+
}, z.core.$strip>;
|
|
134
|
+
export type RouteTrafficConfig = z.infer<typeof RouteTrafficConfigSchema>;
|
|
135
|
+
export declare const RoutingTablesSchema: z.ZodObject<{
|
|
136
|
+
activeTable: z.ZodString;
|
|
137
|
+
tables: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
|
|
138
|
+
}, z.core.$strip>;
|
|
139
|
+
export type RoutingTables = z.infer<typeof RoutingTablesSchema>;
|
|
140
|
+
export declare const RouteStatsSchema: z.ZodObject<{
|
|
141
|
+
packets: z.ZodNumber;
|
|
142
|
+
bytes: z.ZodNumber;
|
|
143
|
+
}, z.core.$strip>;
|
|
144
|
+
export type RouteStats = z.infer<typeof RouteStatsSchema>;
|
|
145
|
+
export declare const InterfaceStatsSchema: z.ZodObject<{
|
|
146
|
+
rxPackets: z.ZodNumber;
|
|
147
|
+
txPackets: z.ZodNumber;
|
|
148
|
+
rxBytes: z.ZodNumber;
|
|
149
|
+
txBytes: z.ZodNumber;
|
|
150
|
+
}, z.core.$strip>;
|
|
151
|
+
export type InterfaceStats = z.infer<typeof InterfaceStatsSchema>;
|
|
152
|
+
export declare const TrafficStatsSchema: z.ZodObject<{
|
|
153
|
+
routes: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
154
|
+
packets: z.ZodNumber;
|
|
155
|
+
bytes: z.ZodNumber;
|
|
156
|
+
}, z.core.$strip>>;
|
|
157
|
+
interfaces: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
158
|
+
rxPackets: z.ZodNumber;
|
|
159
|
+
txPackets: z.ZodNumber;
|
|
160
|
+
rxBytes: z.ZodNumber;
|
|
161
|
+
txBytes: z.ZodNumber;
|
|
162
|
+
}, z.core.$strip>>;
|
|
163
|
+
}, z.core.$strip>;
|
|
164
|
+
export type TrafficStats = z.infer<typeof TrafficStatsSchema>;
|
|
165
|
+
export declare const NetworkStatusSchema: z.ZodObject<{
|
|
166
|
+
route: z.ZodEnum<{
|
|
167
|
+
direct: "direct";
|
|
168
|
+
"http-proxy": "http-proxy";
|
|
169
|
+
wireguard: "wireguard";
|
|
170
|
+
openvpn: "openvpn";
|
|
171
|
+
relay: "relay";
|
|
172
|
+
}>;
|
|
173
|
+
tunnels: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
174
|
+
status: z.ZodEnum<{
|
|
175
|
+
down: "down";
|
|
176
|
+
starting: "starting";
|
|
177
|
+
up: "up";
|
|
178
|
+
error: "error";
|
|
179
|
+
}>;
|
|
180
|
+
interface: z.ZodOptional<z.ZodString>;
|
|
181
|
+
error: z.ZodOptional<z.ZodString>;
|
|
182
|
+
}, z.core.$strip>>;
|
|
183
|
+
routingTables: z.ZodOptional<z.ZodObject<{
|
|
184
|
+
activeTable: z.ZodString;
|
|
185
|
+
tables: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
|
|
186
|
+
}, z.core.$strip>>;
|
|
187
|
+
traffic: z.ZodOptional<z.ZodObject<{
|
|
188
|
+
routes: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
189
|
+
packets: z.ZodNumber;
|
|
190
|
+
bytes: z.ZodNumber;
|
|
191
|
+
}, z.core.$strip>>;
|
|
192
|
+
interfaces: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
193
|
+
rxPackets: z.ZodNumber;
|
|
194
|
+
txPackets: z.ZodNumber;
|
|
195
|
+
rxBytes: z.ZodNumber;
|
|
196
|
+
txBytes: z.ZodNumber;
|
|
197
|
+
}, z.core.$strip>>;
|
|
198
|
+
}, z.core.$strip>>;
|
|
199
|
+
vpnApp: z.ZodObject<{
|
|
200
|
+
bundleId: z.ZodString;
|
|
201
|
+
installed: z.ZodBoolean;
|
|
202
|
+
pid: z.ZodOptional<z.ZodNumber>;
|
|
203
|
+
}, z.core.$strip>;
|
|
204
|
+
routedApps: z.ZodArray<z.ZodString>;
|
|
205
|
+
routedDomains: z.ZodArray<z.ZodString>;
|
|
206
|
+
}, z.core.$strip>;
|
|
207
|
+
export type NetworkStatus = z.infer<typeof NetworkStatusSchema>;
|
|
208
|
+
export declare const NetworkConditionConfigSchema: z.ZodObject<{
|
|
209
|
+
bandwidthKbps: z.ZodOptional<z.ZodNumber>;
|
|
210
|
+
latencyMs: z.ZodOptional<z.ZodNumber>;
|
|
211
|
+
jitterMs: z.ZodOptional<z.ZodNumber>;
|
|
212
|
+
packetLossPercent: z.ZodOptional<z.ZodNumber>;
|
|
213
|
+
}, z.core.$strip>;
|
|
214
|
+
export type NetworkConditionConfig = z.infer<typeof NetworkConditionConfigSchema>;
|
|
215
|
+
/** 2G EDGE: ~240 Kbps, 300ms latency, high jitter */
|
|
216
|
+
export declare const NETWORK_2G_EDGE: {
|
|
217
|
+
readonly bandwidthKbps: 240;
|
|
218
|
+
readonly latencyMs: 300;
|
|
219
|
+
readonly jitterMs: 100;
|
|
220
|
+
readonly packetLossPercent: 1.5;
|
|
221
|
+
};
|
|
222
|
+
/** 3G: ~1.8 Mbps, 100ms latency */
|
|
223
|
+
export declare const NETWORK_3G: {
|
|
224
|
+
readonly bandwidthKbps: 1800;
|
|
225
|
+
readonly latencyMs: 100;
|
|
226
|
+
readonly jitterMs: 30;
|
|
227
|
+
readonly packetLossPercent: 0.5;
|
|
228
|
+
};
|
|
229
|
+
/** 4G LTE: ~12 Mbps, 30ms latency */
|
|
230
|
+
export declare const NETWORK_4G_LTE: {
|
|
231
|
+
readonly bandwidthKbps: 12000;
|
|
232
|
+
readonly latencyMs: 30;
|
|
233
|
+
readonly jitterMs: 10;
|
|
234
|
+
readonly packetLossPercent: 0.1;
|
|
235
|
+
};
|
|
236
|
+
/** 5G: ~100 Mbps, 10ms latency */
|
|
237
|
+
export declare const NETWORK_5G: {
|
|
238
|
+
readonly bandwidthKbps: 100000;
|
|
239
|
+
readonly latencyMs: 10;
|
|
240
|
+
readonly jitterMs: 3;
|
|
241
|
+
readonly packetLossPercent: 0.01;
|
|
242
|
+
};
|
|
243
|
+
/** Satellite: ~5 Mbps, 600ms latency */
|
|
244
|
+
export declare const NETWORK_SATELLITE: {
|
|
245
|
+
readonly bandwidthKbps: 5000;
|
|
246
|
+
readonly latencyMs: 600;
|
|
247
|
+
readonly jitterMs: 50;
|
|
248
|
+
readonly packetLossPercent: 1;
|
|
249
|
+
};
|
|
250
|
+
/** Congested WiFi: ~2 Mbps, 50ms latency, high jitter and packet loss */
|
|
251
|
+
export declare const NETWORK_WIFI_CONGESTED: {
|
|
252
|
+
readonly bandwidthKbps: 2000;
|
|
253
|
+
readonly latencyMs: 50;
|
|
254
|
+
readonly jitterMs: 40;
|
|
255
|
+
readonly packetLossPercent: 3;
|
|
256
|
+
};
|
|
257
|
+
/** Very bad network: ~100 Kbps, 500ms latency, extreme jitter and packet loss */
|
|
258
|
+
export declare const NETWORK_VERY_BAD: {
|
|
259
|
+
readonly bandwidthKbps: 100;
|
|
260
|
+
readonly latencyMs: 500;
|
|
261
|
+
readonly jitterMs: 200;
|
|
262
|
+
readonly packetLossPercent: 10;
|
|
263
|
+
};
|
|
264
|
+
/** Offline: 100% packet loss — drops all packets to simulate no connectivity */
|
|
265
|
+
export declare const NETWORK_OFFLINE: {
|
|
266
|
+
readonly packetLossPercent: 100;
|
|
267
|
+
};
|
|
268
|
+
export declare const NetworkConditionStatusSchema: z.ZodObject<{
|
|
269
|
+
enabled: z.ZodBoolean;
|
|
270
|
+
config: z.ZodOptional<z.ZodObject<{
|
|
271
|
+
bandwidthKbps: z.ZodOptional<z.ZodNumber>;
|
|
272
|
+
latencyMs: z.ZodOptional<z.ZodNumber>;
|
|
273
|
+
jitterMs: z.ZodOptional<z.ZodNumber>;
|
|
274
|
+
packetLossPercent: z.ZodOptional<z.ZodNumber>;
|
|
275
|
+
}, z.core.$strip>>;
|
|
276
|
+
interface: z.ZodOptional<z.ZodString>;
|
|
277
|
+
}, z.core.$strip>;
|
|
278
|
+
export type NetworkConditionStatus = z.infer<typeof NetworkConditionStatusSchema>;
|
|
279
|
+
/**
|
|
280
|
+
* Get the current network routing status via the Appium server's sessionless endpoint.
|
|
281
|
+
*
|
|
282
|
+
* Appium URL is resolved from APPIUM_HOST / APPIUM_PORT env vars (default 127.0.0.1:4723).
|
|
283
|
+
*
|
|
284
|
+
* @returns Combined network status
|
|
285
|
+
*/
|
|
286
|
+
export declare function getNetworkStatus(): Promise<NetworkStatus>;
|
|
287
|
+
/** A recorded network entry from GOST MITM inspection */
|
|
288
|
+
export interface RecordedEntry {
|
|
289
|
+
service: string;
|
|
290
|
+
network: string;
|
|
291
|
+
remote?: string;
|
|
292
|
+
local?: string;
|
|
293
|
+
host?: string;
|
|
294
|
+
proto?: string;
|
|
295
|
+
http?: {
|
|
296
|
+
host: string;
|
|
297
|
+
method: string;
|
|
298
|
+
proto: string;
|
|
299
|
+
scheme: string;
|
|
300
|
+
uri: string;
|
|
301
|
+
statusCode: number;
|
|
302
|
+
request?: {
|
|
303
|
+
contentLength: number;
|
|
304
|
+
header: Record<string, string[]>;
|
|
305
|
+
body: string | null;
|
|
306
|
+
};
|
|
307
|
+
response?: {
|
|
308
|
+
contentLength: number;
|
|
309
|
+
header: Record<string, string[]>;
|
|
310
|
+
body: string | null;
|
|
311
|
+
};
|
|
312
|
+
};
|
|
313
|
+
websocket?: {
|
|
314
|
+
from: string;
|
|
315
|
+
fin: boolean;
|
|
316
|
+
rsv1: boolean;
|
|
317
|
+
rsv2: boolean;
|
|
318
|
+
rsv3: boolean;
|
|
319
|
+
opcode: number;
|
|
320
|
+
masked: boolean;
|
|
321
|
+
maskKey: number;
|
|
322
|
+
length: number;
|
|
323
|
+
payload: string;
|
|
324
|
+
};
|
|
325
|
+
tls?: {
|
|
326
|
+
serverName: string;
|
|
327
|
+
cipherSuite: string;
|
|
328
|
+
version: string;
|
|
329
|
+
proto?: string;
|
|
330
|
+
};
|
|
331
|
+
dns?: {
|
|
332
|
+
id: number;
|
|
333
|
+
name: string;
|
|
334
|
+
class: string;
|
|
335
|
+
type: string;
|
|
336
|
+
question: string;
|
|
337
|
+
answer: string;
|
|
338
|
+
cached: boolean;
|
|
339
|
+
};
|
|
340
|
+
sid: string;
|
|
341
|
+
time: string;
|
|
342
|
+
duration: number;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Route traffic from specific apps through the gateway.
|
|
346
|
+
*
|
|
347
|
+
* This is the main entry point for traffic routing. It handles:
|
|
348
|
+
* 1. Setting up the per-app VPN to intercept traffic from specified apps
|
|
349
|
+
* 2. Optionally starting a tunnel (HTTP proxy, WireGuard, or OpenVPN)
|
|
350
|
+
* 3. Activating the route (tunnel type, or "direct" when no tunnel)
|
|
351
|
+
*
|
|
352
|
+
* When tunnel type is "direct", traffic flows through the gateway in direct mode
|
|
353
|
+
* (GOST SOCKS5 → internet). This is useful for network condition simulation
|
|
354
|
+
* without needing a proxy or VPN.
|
|
355
|
+
*
|
|
356
|
+
* Uses the Appium server's sessionless REST endpoint so no active WebDriver
|
|
357
|
+
* session is required. This allows routing to be set up *before* creating a
|
|
358
|
+
* browser session, giving the VPN time to become active.
|
|
359
|
+
*
|
|
360
|
+
* Appium URL is resolved from APPIUM_HOST / APPIUM_PORT env vars (default 127.0.0.1:4723).
|
|
361
|
+
*
|
|
362
|
+
* Returns a cleanup function that tears down everything in the correct order.
|
|
363
|
+
*
|
|
364
|
+
* @param config - Traffic routing configuration
|
|
365
|
+
* @returns Cleanup function to stop routing and tear down tunnel
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* ```typescript
|
|
369
|
+
* // Direct mode — route through gateway without a tunnel
|
|
370
|
+
* const cleanup = await ios.routeTraffic({
|
|
371
|
+
* apps: ["com.apple.mobilesafari"],
|
|
372
|
+
* tunnel: { type: "direct" },
|
|
373
|
+
* socksHost: "192.168.2.1",
|
|
374
|
+
* });
|
|
375
|
+
*
|
|
376
|
+
* // With a tunnel
|
|
377
|
+
* const cleanup = await ios.routeTraffic({
|
|
378
|
+
* apps: ["com.apple.mobilesafari"],
|
|
379
|
+
* domains: ["*.example.com"],
|
|
380
|
+
* tunnel: {
|
|
381
|
+
* type: "http-proxy",
|
|
382
|
+
* host: "proxy.example.com",
|
|
383
|
+
* port: 8080,
|
|
384
|
+
* },
|
|
385
|
+
* });
|
|
386
|
+
*
|
|
387
|
+
* // ... run tests ...
|
|
388
|
+
*
|
|
389
|
+
* await cleanup();
|
|
390
|
+
* ```
|
|
391
|
+
*/
|
|
392
|
+
type NetworkLogHandler = (entry: RecordedEntry) => void;
|
|
393
|
+
export interface NetworkLogSubscription {
|
|
394
|
+
on(handler: NetworkLogHandler): void;
|
|
395
|
+
close(): void;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Subscribe to real-time network entries streamed via SSE from the
|
|
399
|
+
* Appium plugin. Requires `routeTraffic()` to have been called first
|
|
400
|
+
* with `inspect: true`.
|
|
401
|
+
*
|
|
402
|
+
* Each call opens its own SSE connection to the plugin; closing the
|
|
403
|
+
* subscription tears it down. No shared state.
|
|
404
|
+
*
|
|
405
|
+
* @example
|
|
406
|
+
* ```typescript
|
|
407
|
+
* const logs = ios.subscribeNetworkLogs();
|
|
408
|
+
* logs.on((entry) => {
|
|
409
|
+
* if (entry.http) console.log(`${entry.http.method} ${entry.http.uri} → ${entry.http.statusCode}`);
|
|
410
|
+
* if (entry.dns) console.log(`DNS ${entry.dns.name} → ${entry.dns.answer}`);
|
|
411
|
+
* });
|
|
412
|
+
*
|
|
413
|
+
* // ... run tests ...
|
|
414
|
+
*
|
|
415
|
+
* logs.close();
|
|
416
|
+
* ```
|
|
417
|
+
*/
|
|
418
|
+
export declare function subscribeNetworkLogs(): NetworkLogSubscription;
|
|
419
|
+
export declare function routeTraffic(config: RouteTrafficConfig): Promise<() => Promise<void>>;
|
|
420
|
+
/**
|
|
421
|
+
* Simulate a network condition (bandwidth limit, latency, jitter, packet loss)
|
|
422
|
+
* on traffic flowing through the gateway.
|
|
423
|
+
*
|
|
424
|
+
* Returns a cleanup function that clears the condition.
|
|
425
|
+
*
|
|
426
|
+
* @example
|
|
427
|
+
* ```typescript
|
|
428
|
+
* // Use a built-in preset
|
|
429
|
+
* const cleanup = await ios.simulateNetworkCondition(ios.NETWORK_3G);
|
|
430
|
+
* await cleanup();
|
|
431
|
+
*
|
|
432
|
+
* // Custom config
|
|
433
|
+
* const cleanup = await ios.simulateNetworkCondition({ bandwidthKbps: 500, latencyMs: 200 });
|
|
434
|
+
* await cleanup();
|
|
435
|
+
* ```
|
|
436
|
+
*/
|
|
437
|
+
export declare function simulateNetworkCondition(config: NetworkConditionConfig): Promise<() => Promise<void>>;
|
|
438
|
+
/**
|
|
439
|
+
* Get the current network condition status.
|
|
440
|
+
*/
|
|
441
|
+
export declare function getNetworkCondition(): Promise<NetworkConditionStatus>;
|
|
442
|
+
export {};
|
|
443
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}
|