whistle 2.9.2-beta → 2.9.4
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/bin/plugin.d.ts +6 -0
- package/bin/plugin.js +70 -22
- package/biz/webui/htdocs/index.html +1 -1
- package/biz/webui/htdocs/js/index.js +43 -43
- package/index.d.ts +196 -0
- package/index.js +8 -3
- package/lib/config.js +16 -9
- package/lib/handlers/file-proxy.js +1 -1
- package/lib/https/ca.js +6 -2
- package/lib/https/index.js +9 -6
- package/lib/index.js +1 -0
- package/lib/inspectors/data.js +2 -2
- package/lib/inspectors/log.js +5 -1
- package/lib/inspectors/req.js +6 -2
- package/lib/inspectors/res.js +9 -19
- package/lib/plugins/get-plugins-sync.js +12 -8
- package/lib/plugins/get-plugins.js +8 -5
- package/lib/plugins/index.js +31 -11
- package/lib/plugins/load-plugin.js +2 -0
- package/lib/plugins/module-paths.js +23 -7
- package/lib/plugins/util.js +6 -1
- package/lib/rules/index.js +1 -1
- package/lib/rules/protocols.js +23 -1
- package/lib/rules/rules.js +17 -14
- package/lib/service/extract-saz.js +6 -0
- package/lib/service/generate-saz.js +2 -0
- package/lib/socket-mgr.js +1 -1
- package/lib/tunnel.js +12 -13
- package/lib/util/common.js +3 -3
- package/lib/util/data-server.js +5 -0
- package/lib/util/index.js +41 -16
- package/package.json +2 -3
package/bin/plugin.d.ts
ADDED
package/bin/plugin.js
CHANGED
|
@@ -3,9 +3,10 @@ var cp = require('child_process');
|
|
|
3
3
|
var fs = require('fs');
|
|
4
4
|
var path = require('path');
|
|
5
5
|
var fse = require('fs-extra2');
|
|
6
|
+
var getWhistlePath = require('../lib/util/common').getWhistlePath;
|
|
6
7
|
|
|
7
8
|
var CMD_SUFFIX = process.platform === 'win32' ? '.cmd' : '';
|
|
8
|
-
var
|
|
9
|
+
var WHISTLE_PLUGIN_RE = /^((?:@[\w-]+\/)?whistle\.[a-z\d_-]+)(?:\@([\w.^~*-]*))?$/;
|
|
9
10
|
var PLUGIN_PATH = path.join(getWhistlePath(), 'plugins');
|
|
10
11
|
var CUSTOM_PLUGIN_PATH = path.join(getWhistlePath(), 'custom_plugins');
|
|
11
12
|
var PACKAGE_JSON = '{"repository":"https://github.com/avwo/whistle","license":"MIT"}';
|
|
@@ -16,19 +17,9 @@ function getInstallPath(name, dir) {
|
|
|
16
17
|
return path.join(dir || CUSTOM_PLUGIN_PATH, name);
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
function getHomedir() {
|
|
20
|
-
//默认设置为`~`,防止Linux在开机启动时Node无法获取homedir
|
|
21
|
-
return (typeof os.homedir == 'function' ? os.homedir() :
|
|
22
|
-
process.env[process.platform == 'win32' ? 'USERPROFILE' : 'HOME']) || '~';
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function getWhistlePath() {
|
|
26
|
-
return process.env.WHISTLE_PATH || path.join(getHomedir(), '.WhistleAppData');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
20
|
function getPlugins(argv) {
|
|
30
21
|
return argv.filter(function(name) {
|
|
31
|
-
return
|
|
22
|
+
return WHISTLE_PLUGIN_RE.test(name);
|
|
32
23
|
});
|
|
33
24
|
}
|
|
34
25
|
|
|
@@ -54,6 +45,7 @@ function getTempName(name) {
|
|
|
54
45
|
}
|
|
55
46
|
|
|
56
47
|
function getInstallDir(argv) {
|
|
48
|
+
argv = argv.slice();
|
|
57
49
|
var result = { argv: argv };
|
|
58
50
|
for (var i = 0, len = argv.length; i < len; i++) {
|
|
59
51
|
var option = argv[i];
|
|
@@ -67,23 +59,29 @@ function getInstallDir(argv) {
|
|
|
67
59
|
return result;
|
|
68
60
|
}
|
|
69
61
|
|
|
70
|
-
function install(cmd, name, argv) {
|
|
62
|
+
function install(cmd, name, argv, ver, pluginsCache, callback) {
|
|
71
63
|
argv = argv.slice();
|
|
72
64
|
var result = getInstallDir(argv);
|
|
73
65
|
argv = result.argv;
|
|
74
66
|
var installPath = getInstallPath(getTempName(name), result.dir);
|
|
75
67
|
fse.ensureDirSync(installPath);
|
|
76
68
|
fse.emptyDirSync(installPath);
|
|
77
|
-
|
|
69
|
+
var pkgJson = PACKAGE_JSON;
|
|
70
|
+
if (ver) {
|
|
71
|
+
pkgJson = pkgJson.replace(',', ',"dependencies":{"' + name + '":"' + ver + '"},');
|
|
72
|
+
}
|
|
73
|
+
fs.writeFileSync(path.join(installPath, 'package.json'), pkgJson);
|
|
78
74
|
fs.writeFileSync(path.join(installPath, 'LICENSE'), LICENSE);
|
|
79
75
|
fs.writeFileSync(path.join(installPath, 'README.md'), RESP_URL);
|
|
80
76
|
argv.unshift('install', name);
|
|
77
|
+
pluginsCache[name] = 1;
|
|
81
78
|
cp.spawn(cmd, argv, {
|
|
82
79
|
stdio: 'inherit',
|
|
83
80
|
cwd: installPath
|
|
84
|
-
}).
|
|
81
|
+
}).once('exit', function(code) {
|
|
85
82
|
if (code) {
|
|
86
83
|
removeDir(installPath);
|
|
84
|
+
callback();
|
|
87
85
|
} else {
|
|
88
86
|
var realPath = getInstallPath(name, result.dir);
|
|
89
87
|
removeDir(realPath);
|
|
@@ -95,17 +93,67 @@ function install(cmd, name, argv) {
|
|
|
95
93
|
removeDir(installPath);
|
|
96
94
|
} catch (e) {}
|
|
97
95
|
}
|
|
96
|
+
var pkgPath = path.join(realPath, 'node_modules', name, 'package.json');
|
|
98
97
|
try {
|
|
99
|
-
var pkgPath = path.join(realPath, 'node_modules', name, 'package.json');
|
|
100
98
|
if (fs.statSync(pkgPath).mtime.getFullYear() < 2010) {
|
|
101
99
|
var now = new Date();
|
|
102
100
|
fs.utimesSync(pkgPath, now, now);
|
|
103
101
|
}
|
|
104
102
|
} catch (e) {}
|
|
103
|
+
callback(pkgPath);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function readJson(pkgPath) {
|
|
109
|
+
try {
|
|
110
|
+
return fse.readJsonSync(pkgPath);
|
|
111
|
+
} catch (e) {
|
|
112
|
+
try {
|
|
113
|
+
return fse.readJsonSync(pkgPath);
|
|
114
|
+
} catch (e) {}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function installPlugins(cmd, plugins, argv, pluginsCache, deep) {
|
|
119
|
+
deep = deep || 0;
|
|
120
|
+
var count = 0;
|
|
121
|
+
var peerPlugins = [];
|
|
122
|
+
var callback = function(pkgPath) {
|
|
123
|
+
if (pkgPath) {
|
|
124
|
+
var pkg = readJson(pkgPath) || {};
|
|
125
|
+
var list = pkg.whistleConfig && (pkg.whistleConfig.peerPluginList || pkg.whistleConfig.peerPlugins);
|
|
126
|
+
if (Array.isArray(list) && list.length < 16) {
|
|
127
|
+
list.forEach(function(name) {
|
|
128
|
+
if (typeof name === 'string' && WHISTLE_PLUGIN_RE.test(name.trim())) {
|
|
129
|
+
name = RegExp.$1;
|
|
130
|
+
if (peerPlugins.indexOf(name) === -1) {
|
|
131
|
+
peerPlugins.push(name);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (--count <= 0 && deep < 16) {
|
|
138
|
+
peerPlugins = peerPlugins.filter(function(name) {
|
|
139
|
+
return !pluginsCache[name];
|
|
140
|
+
});
|
|
141
|
+
peerPlugins.length && installPlugins(cmd, peerPlugins, argv, pluginsCache, ++deep);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
plugins.forEach(function(name) {
|
|
145
|
+
if (WHISTLE_PLUGIN_RE.test(name)) {
|
|
146
|
+
++count;
|
|
147
|
+
name = RegExp.$1;
|
|
148
|
+
var ver = RegExp.$2;
|
|
149
|
+
removeOldPlugin(name);
|
|
150
|
+
install(cmd, name, argv, ver, pluginsCache, callback);
|
|
105
151
|
}
|
|
106
152
|
});
|
|
107
153
|
}
|
|
108
154
|
|
|
155
|
+
exports.getWhistlePath = getWhistlePath;
|
|
156
|
+
|
|
109
157
|
exports.install = function(cmd, argv) {
|
|
110
158
|
var plugins = getPlugins(argv);
|
|
111
159
|
if (!plugins.length) {
|
|
@@ -117,18 +165,18 @@ exports.install = function(cmd, argv) {
|
|
|
117
165
|
|
|
118
166
|
cmd += CMD_SUFFIX;
|
|
119
167
|
argv.push('--no-package-lock');
|
|
120
|
-
|
|
121
|
-
removeOldPlugin(name);
|
|
122
|
-
install(cmd, name, argv);
|
|
123
|
-
});
|
|
168
|
+
installPlugins(cmd, plugins, argv, {});
|
|
124
169
|
};
|
|
125
170
|
|
|
126
171
|
exports.uninstall = function(plugins) {
|
|
127
172
|
var result = getInstallDir(plugins);
|
|
128
173
|
plugins = result.argv;
|
|
129
174
|
getPlugins(plugins).forEach(function(name) {
|
|
130
|
-
|
|
131
|
-
|
|
175
|
+
if (WHISTLE_PLUGIN_RE.test(name)) {
|
|
176
|
+
name = RegExp.$1;
|
|
177
|
+
!result.dir && removeOldPlugin(name);
|
|
178
|
+
removeDir(getInstallPath(name, result.dir));
|
|
179
|
+
}
|
|
132
180
|
});
|
|
133
181
|
};
|
|
134
182
|
|