-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
196 lines (182 loc) · 6.42 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
const runApplescript = require('run-applescript');
let delay = 1;
/**
* Sets the delay for actions in applescript
* @param {int} delay timedelay in seconds
*/
exports.setDelay = (delay) => {
delay = delay;
}
/**
* switches Network Link Conditioner to "on"
* @returns promise
*/
exports.on = async () => {
return new Promise(async (resolve, reject) => {
try {
await runApplescript(`
delay ${delay}
tell application "System Preferences"
activate
delay ${delay}
set current pane to pane "com.apple.Network-Link-Conditioner"
end tell
tell application "System Events"
tell process "System Preferences"
tell window "Network Link Conditioner"
delay ${delay}
click button "ON"
end tell
end tell
end tell
`);
this.closeSystemPreferences(true);
resolve();
} catch (e) {
reject(e);
}
})
},
/**
* switches Network Link Conditioner to "off"
* @returns promise
*/
exports.off = async () => {
return new Promise(async (resolve, reject) => {
try {
await runApplescript(`
delay ${delay}
tell application "System Preferences"
activate
delay ${delay}
set current pane to pane "com.apple.Network-Link-Conditioner"
end tell
tell application "System Events"
tell process "System Preferences"
tell window "Network Link Conditioner"
delay ${delay}
click button "OFF"
delay ${delay}
end tell
end tell
end tell
`);
this.closeSystemPreferences(true);
resolve();
} catch (e) {
console.error(e);
reject(e)
}
})
},
/**
* Sets a profile in the link conditioner
* @param {string} profileName exact name of the profile to set
* @returns promise
*/
exports.setProfile = async (profileName = "") => {
return new Promise(async (resolve, reject) => {
if (profileName == "") {
return;
}
try {
const result = await runApplescript(`
delay ${delay}
tell application "System Preferences"
activate
delay ${delay}
set current pane to pane "com.apple.Network-Link-Conditioner"
end tell
tell application "System Events"
tell process "System Preferences"
tell window "Network Link Conditioner"
delay ${delay}
tell group 1
click pop up button 1
click menu item "${profileName}" of menu 1 of pop up button 1
end tell
end tell
end tell
end tell
`);
await this.closeSystemPreferences(true);
resolve()
} catch (e) {
reject(e);
console.error(e);
}
})
},
/**
* Gets names of available profiles
* @returns promise that resolves to an array
*/
exports.getProfileNames = async () => {
return new Promise(async (resolve, reject) => {
try {
const result = await runApplescript(`
delay ${delay}
tell application "System Preferences"
activate
delay ${delay}
set current pane to pane "com.apple.Network-Link-Conditioner"
end tell
tell application "System Events"
tell process "System Preferences"
tell window "Network Link Conditioner"
delay ${delay}
tell group 1
click pop up button 1
click menu of menu 1 of pop up button 1
get menu item of menu 1 of pop up button 1
end tell
end tell
end tell
end tell
`);
await this.closeSystemPreferences(true);
const menuItemRegex = /\ *menu\ item\ (.+?)\ of\ menu\ \d of pop up button \d\ of\ group\ \d of\ window Network Link Conditioner of application process System Preferences\ ?/gi;
const menuItems = result.match(menuItemRegex);
let profiles = [];
for (const menuItemString of menuItems) {
let regex = menuItemRegex;
regex.lastIndex = 0;
let profileMatch = regex.exec(menuItemString);
if (profileMatch != undefined && profileMatch != null && profileMatch[1] !== undefined) {
const profileName = profileMatch[1];
if (profileName !== "Preset Profiles" && profileName !== "Custom Profiles") {//those are greyed out
profiles.push(profileName);
}
}
}
resolve(profiles)
} catch (e) {
this.closeSystemPreferences(true);
reject(e);
}
});
},
/**
* Closes the system preferences if they are open
* @param {boolean} silentErrors sets if errors are handled silently. Default is false.
* @returns Promise
*/
closeSystemPreferences = (silentErrors = false) => {
return new Promise(async (resolve, reject) => {
try {
const close = await runApplescript(`
if application "System Preferences" is running then
tell application "System Preferences" to quit
end if`);
resolve();
} catch (e) {
if (!silentErrors) {
reject(e);
} else {
console.error(e);
resolve();
}
}
});
}
exports.closeSystemPreferences = closeSystemPreferences;