hunter-open-sdk 0.0.1
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 +92 -0
- package/lib/events/driver/command.js +33 -0
- package/lib/events/driver/service.js +47 -0
- package/lib/events/driver/winDriver.js +231 -0
- package/lib/getAndroidSn/index.js +61 -0
- package/lib/getGeneralReport/index.js +34 -0
- package/lib/index.js +16 -0
- package/lib/registerEvent/index.js +181 -0
- package/lib/resources/dll/x64.dll +0 -0
- package/lib/resources/mac/libinspectionkit_amd64_0.0.3.dylib +0 -0
- package/lib/resources/mac/libinspectionkit_arm64_0.0.3.dylib +0 -0
- package/lib/utils/utils.command.js +33 -0
- package/lib/utils/utils.initDll.js +39 -0
- package/lib/utils/utils.js +34 -0
- package/lib/utils/utils.path.js +16 -0
- package/package.json +65 -0
package/README.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# hunter-coruscant@0.0.1
|
|
2
|
+
|
|
3
|
+
采货侠SaaS版本桌面端sdk
|
|
4
|
+
|
|
5
|
+
> Git仓库地址:[GitLab](http://gitlab.zhuanspirit.com/u/hunter-coruscant)
|
|
6
|
+
>
|
|
7
|
+
> 文档线上地址:[文档](https://fe.zhuanspirit.com/u/hunter-coruscant/)
|
|
8
|
+
|
|
9
|
+
## 使用
|
|
10
|
+
|
|
11
|
+
### npm
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
$ npm i hunter-coruscant -S
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### CDN
|
|
18
|
+
|
|
19
|
+
<!-- 需要在 beetle 自行配置业务线和包名 -->
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<script src="https://m.zhuanzhuan.com/u/hunter-coruscant/static/js/0.0.1/index.js"></script>
|
|
23
|
+
<script src="https://m.zhuanzhuan.com/u/hunter-coruscant/static/js/0.0.1/index.min.js"></script>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 按需加载
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
$ npm i babel-plugin-import -D
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
此 `npm` 包实现了按需加载,使用时,需要设置 `babel` 配置,如下:
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
// babel.config.js
|
|
36
|
+
{
|
|
37
|
+
"plugins": [
|
|
38
|
+
["import", {
|
|
39
|
+
"libraryName": "hunter-coruscant"
|
|
40
|
+
}]
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 开发
|
|
46
|
+
|
|
47
|
+
### 命令行
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# 统一的 git commit 指令
|
|
51
|
+
$ npm run cz
|
|
52
|
+
|
|
53
|
+
# eslint 校验
|
|
54
|
+
$ npm run lint
|
|
55
|
+
|
|
56
|
+
# eslint 校验并修复
|
|
57
|
+
$ npm run fix
|
|
58
|
+
|
|
59
|
+
# eslint 校验暂存区的文件
|
|
60
|
+
$ npm run staged
|
|
61
|
+
|
|
62
|
+
# 本地测试模式
|
|
63
|
+
$ npm run dev
|
|
64
|
+
|
|
65
|
+
# 编译代码
|
|
66
|
+
$ npm run build
|
|
67
|
+
|
|
68
|
+
# 发布npm包,同时gitlab标签
|
|
69
|
+
$ npm run pub
|
|
70
|
+
|
|
71
|
+
# 发布npm的beta包,同时gitlab标签
|
|
72
|
+
$ npm run pub-beta
|
|
73
|
+
|
|
74
|
+
# 删除gitlab及npm包对应版本代码
|
|
75
|
+
$ npm run unpub
|
|
76
|
+
|
|
77
|
+
# 打开开发文档在浏览器中运行
|
|
78
|
+
$ npm run doc
|
|
79
|
+
|
|
80
|
+
# 编译开发文档
|
|
81
|
+
$ npm run build-doc
|
|
82
|
+
|
|
83
|
+
# 上传文档到ftp
|
|
84
|
+
$ npm run doc-upload
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 文档
|
|
88
|
+
|
|
89
|
+
按照 `tsdoc` 自动生成文档
|
|
90
|
+
### 更新日志
|
|
91
|
+
|
|
92
|
+
每次发正式包时务必更新当前版本的 `changelog`,否则会在 `npm run pub` 这一步被驳回
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.command = command;
|
|
7
|
+
var exec = require('child_process').exec;
|
|
8
|
+
function command(cmd) {
|
|
9
|
+
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : './';
|
|
10
|
+
// 任何你期望执行的cmd命令,ls都可以
|
|
11
|
+
var cmdStr1 = cmd;
|
|
12
|
+
var cmdPath = path;
|
|
13
|
+
// 子进程名称
|
|
14
|
+
var workerProcess;
|
|
15
|
+
runExec(cmdStr1);
|
|
16
|
+
function runExec(cmdStr) {
|
|
17
|
+
workerProcess = exec(cmdStr, {
|
|
18
|
+
cwd: cmdPath
|
|
19
|
+
});
|
|
20
|
+
// 打印正常的后台可执行程序输出
|
|
21
|
+
workerProcess.stdout.on('data', function (data) {
|
|
22
|
+
console.log('stdout: ' + data);
|
|
23
|
+
});
|
|
24
|
+
// 打印错误的后台可执行程序输出
|
|
25
|
+
workerProcess.stderr.on('data', function (data) {
|
|
26
|
+
console.log('stderr: ' + data);
|
|
27
|
+
});
|
|
28
|
+
// 退出之后的输出
|
|
29
|
+
workerProcess.on('close', function (code) {
|
|
30
|
+
console.log('out code:' + code);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
+
var _utils = require("../../utils/utils");
|
|
11
|
+
var _command = require("./command");
|
|
12
|
+
var _winDriver = require("./winDriver");
|
|
13
|
+
var path = require('path');
|
|
14
|
+
var Service = /*#__PURE__*/function () {
|
|
15
|
+
function Service() {
|
|
16
|
+
(0, _classCallCheck2.default)(this, Service);
|
|
17
|
+
}
|
|
18
|
+
(0, _createClass2.default)(Service, [{
|
|
19
|
+
key: "setup",
|
|
20
|
+
value:
|
|
21
|
+
// constructor () {}
|
|
22
|
+
function setup(mainWindow) {
|
|
23
|
+
console.log('Service setup');
|
|
24
|
+
if ((0, _utils.isMac)()) {
|
|
25
|
+
if ((0, _utils.isDev)()) {
|
|
26
|
+
(0, _command.command)(path.join(process.cwd(), './extraResources/ightools'));
|
|
27
|
+
}
|
|
28
|
+
if ((0, _utils.isProd)()) {
|
|
29
|
+
(0, _command.command)('nohup ' + path.join(process.resourcesPath, './extraResources/ightools') + ' > /dev/null 2>&1 & > ' + path.join(process.resourcesPath, './log/ightools.log'));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if ((0, _utils.isWin)()) {
|
|
33
|
+
(0, _winDriver.checkHasDriver)().then(function (res) {
|
|
34
|
+
console.log('------------checkHasDriver', res);
|
|
35
|
+
if (res) {
|
|
36
|
+
mainWindow.webContents.send("checkDriver", true);
|
|
37
|
+
} else {
|
|
38
|
+
mainWindow.webContents.send("checkDriver", false);
|
|
39
|
+
(0, _winDriver.downloadDriver)(mainWindow);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}]);
|
|
45
|
+
return Service;
|
|
46
|
+
}();
|
|
47
|
+
var _default = exports.default = Service;
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.checkHasDriver = checkHasDriver;
|
|
8
|
+
exports.downloadDriver = downloadDriver;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
11
|
+
var _utils = require("../../utils/utils");
|
|
12
|
+
var _utils2 = require("../../utils/utils.command");
|
|
13
|
+
// import { app } from 'electron'
|
|
14
|
+
|
|
15
|
+
var sudo = require('sudo-prompt');
|
|
16
|
+
var path = require('path');
|
|
17
|
+
var fs = require('fs');
|
|
18
|
+
var childProcess = require('child_process');
|
|
19
|
+
var compressing = require('compressing');
|
|
20
|
+
var exec = childProcess.exec;
|
|
21
|
+
var options = {
|
|
22
|
+
name: 'Electron'
|
|
23
|
+
};
|
|
24
|
+
var msiStr = 'AppleMobileDeviceService';
|
|
25
|
+
var reddirPath = 'C:/Program Files (x86)/Common Files/Apple/Apple Application Support';
|
|
26
|
+
var cmdStr = process.platform === 'win32' ? 'tasklist' : 'ps aux';
|
|
27
|
+
var CACHE_PATH = (0, _utils.isDev)() ? path.join(process.cwd(), './cache') : path.join(process.resourcesPath, './cache');
|
|
28
|
+
var filePath = path.join(CACHE_PATH, './iTunesOL_Lite_64_12.10.0.7.zip');
|
|
29
|
+
var mainWindowObj;
|
|
30
|
+
var checkProcess = function checkProcess() {
|
|
31
|
+
return new Promise(function (resolve, reject) {
|
|
32
|
+
exec(cmdStr, function (err, stdout, stderr) {
|
|
33
|
+
// console.log('stdout>>>', stdout)
|
|
34
|
+
// console.log('stderr>>>', stderr)
|
|
35
|
+
if (err) {
|
|
36
|
+
return reject(err);
|
|
37
|
+
}
|
|
38
|
+
if (stdout) {
|
|
39
|
+
var hasRroess = false;
|
|
40
|
+
stdout.split('\n').filter(function (line) {
|
|
41
|
+
var processMessage = line.trim().split(/\s+/);
|
|
42
|
+
var processName = processMessage[0];
|
|
43
|
+
// console.log('names.....', processName)
|
|
44
|
+
if (processName.indexOf(msiStr) > -1) {
|
|
45
|
+
hasRroess = true;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
resolve(hasRroess);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
var checkFs = function checkFs(paths) {
|
|
54
|
+
return new Promise(function (resolve) {
|
|
55
|
+
fs.readdir(paths, function (err) {
|
|
56
|
+
resolve(err ? false : true);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
var checkCache = function checkCache() {
|
|
61
|
+
return new Promise(function (resolve) {
|
|
62
|
+
fs.readFile(filePath, function (err) {
|
|
63
|
+
resolve(err ? false : true);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// 轮询检测是否存在进程
|
|
69
|
+
var checkProcessTimer = function checkProcessTimer() {
|
|
70
|
+
var timer = null;
|
|
71
|
+
clearTimeout(timer);
|
|
72
|
+
timer = setTimeout( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
73
|
+
var hasDriver;
|
|
74
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
75
|
+
while (1) switch (_context.prev = _context.next) {
|
|
76
|
+
case 0:
|
|
77
|
+
_context.next = 2;
|
|
78
|
+
return checkProcess();
|
|
79
|
+
case 2:
|
|
80
|
+
hasDriver = _context.sent;
|
|
81
|
+
if (!hasDriver) {
|
|
82
|
+
_context.next = 6;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
mainWindowObj.webContents.send("driverDone");
|
|
86
|
+
return _context.abrupt("return");
|
|
87
|
+
case 6:
|
|
88
|
+
checkProcessTimer();
|
|
89
|
+
case 7:
|
|
90
|
+
case "end":
|
|
91
|
+
return _context.stop();
|
|
92
|
+
}
|
|
93
|
+
}, _callee);
|
|
94
|
+
})), 1000);
|
|
95
|
+
};
|
|
96
|
+
var installDriver = function installDriver() {
|
|
97
|
+
var AppleApplicationSupport = path.join(CACHE_PATH, './AppleApplicationSupport.msi');
|
|
98
|
+
var AppleApplicationSupport64 = path.join(CACHE_PATH, './AppleApplicationSupport64.msi');
|
|
99
|
+
var AppleMobileDeviceSupport64 = path.join(CACHE_PATH, './AppleMobileDeviceSupport64.msi');
|
|
100
|
+
var Bonjour64 = path.join(CACHE_PATH, './Bonjour64.msi');
|
|
101
|
+
var cmdStr = "start /i /wait ".concat(AppleApplicationSupport, " /qn && start /i /wait ").concat(AppleApplicationSupport64, " /qn && start /i /wait ").concat(AppleMobileDeviceSupport64, " /qn && start /i /wait ").concat(Bonjour64, " /qn");
|
|
102
|
+
sudo.exec(cmdStr, options, function (error, stdout, stderr) {
|
|
103
|
+
console.log('安装 error>>', error);
|
|
104
|
+
console.log('安装 stdout>>>', stdout);
|
|
105
|
+
console.log('安装 stderr>>>', stderr);
|
|
106
|
+
if ((0, _utils.isDev)()) {
|
|
107
|
+
(0, _utils2.command)(path.join(process.cwd(), './extraResources/ightools.exe'));
|
|
108
|
+
} else {
|
|
109
|
+
(0, _utils2.command)(path.join(process.resourcesPath, './extraResources/ightools.exe'));
|
|
110
|
+
}
|
|
111
|
+
checkProcessTimer();
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
// 解压文件
|
|
115
|
+
var uncopressingFile = function uncopressingFile(filePath) {
|
|
116
|
+
return new Promise(function (resolve) {
|
|
117
|
+
compressing.zip.uncompress(filePath, CACHE_PATH).then(function (res) {
|
|
118
|
+
resolve(true);
|
|
119
|
+
}).catch(function (err) {
|
|
120
|
+
resolve(false);
|
|
121
|
+
console.log('error', err);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
function downloadDriver(mainWindow) {
|
|
126
|
+
mainWindowObj = mainWindow;
|
|
127
|
+
mainWindow.webContents.downloadURL('http://ljtools.zhuanstatic.com/download/iTunesDriver/iTunesOL_Lite_64_12.10.0.7.zip');
|
|
128
|
+
mainWindow.webContents.session.on('will-download', function (e, item) {
|
|
129
|
+
// 文件总大小
|
|
130
|
+
var totalBytes = item.getTotalBytes();
|
|
131
|
+
// 设置保存路径
|
|
132
|
+
var rootPath = path.join(CACHE_PATH, item.getFilename());
|
|
133
|
+
item.setSavePath(rootPath);
|
|
134
|
+
item.on('updated', function () {
|
|
135
|
+
try {
|
|
136
|
+
// 获取进度,设置进度条
|
|
137
|
+
var _process = item.getReceivedBytes() / totalBytes;
|
|
138
|
+
_process = Math.round(_process * 100);
|
|
139
|
+
mainWindow.webContents.send('downloadProcess', _process);
|
|
140
|
+
} catch (e) {
|
|
141
|
+
console.log('驱动下载失败');
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
// 下载完成
|
|
145
|
+
item.on('done', /*#__PURE__*/function () {
|
|
146
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(e, start) {
|
|
147
|
+
var uncopressing;
|
|
148
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
149
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
150
|
+
case 0:
|
|
151
|
+
_context2.next = 2;
|
|
152
|
+
return uncopressingFile(filePath);
|
|
153
|
+
case 2:
|
|
154
|
+
uncopressing = _context2.sent;
|
|
155
|
+
if (uncopressing) installDriver();
|
|
156
|
+
mainWindow.webContents.send('downloadDriverDone');
|
|
157
|
+
case 5:
|
|
158
|
+
case "end":
|
|
159
|
+
return _context2.stop();
|
|
160
|
+
}
|
|
161
|
+
}, _callee2);
|
|
162
|
+
}));
|
|
163
|
+
return function (_x, _x2) {
|
|
164
|
+
return _ref2.apply(this, arguments);
|
|
165
|
+
};
|
|
166
|
+
}());
|
|
167
|
+
item.on('error', function () {
|
|
168
|
+
console.log('驱动下载失败');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function checkHasDriver() {
|
|
173
|
+
return _checkHasDriver.apply(this, arguments);
|
|
174
|
+
}
|
|
175
|
+
function _checkHasDriver() {
|
|
176
|
+
_checkHasDriver = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
|
|
177
|
+
var hasDriver, hasCache, state, uncopressing;
|
|
178
|
+
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
179
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
180
|
+
case 0:
|
|
181
|
+
_context3.next = 2;
|
|
182
|
+
return checkProcess();
|
|
183
|
+
case 2:
|
|
184
|
+
if (!_context3.sent) {
|
|
185
|
+
_context3.next = 6;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
_context3.t0 = 1;
|
|
189
|
+
_context3.next = 7;
|
|
190
|
+
break;
|
|
191
|
+
case 6:
|
|
192
|
+
_context3.t0 = 0;
|
|
193
|
+
case 7:
|
|
194
|
+
hasDriver = _context3.t0;
|
|
195
|
+
_context3.next = 10;
|
|
196
|
+
return checkCache();
|
|
197
|
+
case 10:
|
|
198
|
+
if (!_context3.sent) {
|
|
199
|
+
_context3.next = 14;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
_context3.t1 = 2;
|
|
203
|
+
_context3.next = 15;
|
|
204
|
+
break;
|
|
205
|
+
case 14:
|
|
206
|
+
_context3.t1 = 0;
|
|
207
|
+
case 15:
|
|
208
|
+
hasCache = _context3.t1;
|
|
209
|
+
state = hasDriver + hasCache;
|
|
210
|
+
_context3.t2 = state;
|
|
211
|
+
_context3.next = _context3.t2 === 3 ? 20 : _context3.t2 === 1 ? 20 : _context3.t2 === 2 ? 21 : 26;
|
|
212
|
+
break;
|
|
213
|
+
case 20:
|
|
214
|
+
return _context3.abrupt("return", true);
|
|
215
|
+
case 21:
|
|
216
|
+
_context3.next = 23;
|
|
217
|
+
return uncopressingFile(filePath);
|
|
218
|
+
case 23:
|
|
219
|
+
uncopressing = _context3.sent;
|
|
220
|
+
if (uncopressing) installDriver();
|
|
221
|
+
return _context3.abrupt("return", true);
|
|
222
|
+
case 26:
|
|
223
|
+
return _context3.abrupt("return", false);
|
|
224
|
+
case 27:
|
|
225
|
+
case "end":
|
|
226
|
+
return _context3.stop();
|
|
227
|
+
}
|
|
228
|
+
}, _callee3);
|
|
229
|
+
}));
|
|
230
|
+
return _checkHasDriver.apply(this, arguments);
|
|
231
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
+
var _usb = require("usb");
|
|
11
|
+
var GetAndroidSn = function GetAndroidSn(params, callBack) {
|
|
12
|
+
_usb.usb.on('attach', /*#__PURE__*/function () {
|
|
13
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(device, res) {
|
|
14
|
+
var attachDeviceId, customWebUSB, deviceList, currentDevice;
|
|
15
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
16
|
+
while (1) switch (_context.prev = _context.next) {
|
|
17
|
+
case 0:
|
|
18
|
+
// 拿到当前连接的设备deviceAddress 作为标识去usb列表筛选
|
|
19
|
+
attachDeviceId = device.deviceAddress;
|
|
20
|
+
customWebUSB = new _usb.WebUSB({
|
|
21
|
+
allowAllDevices: true
|
|
22
|
+
});
|
|
23
|
+
_context.next = 4;
|
|
24
|
+
return customWebUSB.getDevices();
|
|
25
|
+
case 4:
|
|
26
|
+
deviceList = _context.sent;
|
|
27
|
+
// 删选出当前的设备信息 为获取到serialNumber
|
|
28
|
+
currentDevice = deviceList.filter(function (item) {
|
|
29
|
+
return item.device.deviceAddress == attachDeviceId;
|
|
30
|
+
});
|
|
31
|
+
if (currentDevice.length) {
|
|
32
|
+
_context.next = 9;
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
callBack({
|
|
36
|
+
code: -1,
|
|
37
|
+
data: {},
|
|
38
|
+
message: '获取SN失败'
|
|
39
|
+
});
|
|
40
|
+
return _context.abrupt("return");
|
|
41
|
+
case 9:
|
|
42
|
+
callBack({
|
|
43
|
+
code: 0,
|
|
44
|
+
data: {
|
|
45
|
+
SN: currentDevice[0].serialNumber
|
|
46
|
+
},
|
|
47
|
+
message: '获取SN成功'
|
|
48
|
+
});
|
|
49
|
+
case 10:
|
|
50
|
+
case "end":
|
|
51
|
+
return _context.stop();
|
|
52
|
+
}
|
|
53
|
+
}, _callee);
|
|
54
|
+
}));
|
|
55
|
+
return function (_x, _x2) {
|
|
56
|
+
return _ref.apply(this, arguments);
|
|
57
|
+
};
|
|
58
|
+
}());
|
|
59
|
+
_usb.usb.on('detach', function () {});
|
|
60
|
+
};
|
|
61
|
+
var _default = exports.default = GetAndroidSn;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var GetGeneralReport = function GetGeneralReport(params, callBack) {
|
|
8
|
+
var reportRes = window.HunterInspectionKit.InspectionKit(params, 'saas_report', params);
|
|
9
|
+
if (reportRes) {
|
|
10
|
+
var reportResObj = JSON.parse(reportRes);
|
|
11
|
+
var Code = reportResObj.Code,
|
|
12
|
+
Data = reportResObj.Data;
|
|
13
|
+
if (Code == 0 && Data) {
|
|
14
|
+
callBack({
|
|
15
|
+
code: 0,
|
|
16
|
+
data: Data,
|
|
17
|
+
message: '获取报告成功'
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
callBack({
|
|
21
|
+
code: -1,
|
|
22
|
+
data: {},
|
|
23
|
+
message: '获取报告结果为空'
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
callBack({
|
|
28
|
+
code: -1,
|
|
29
|
+
data: {},
|
|
30
|
+
message: '获取报告失败'
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var _default = exports.default = GetGeneralReport;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _registerEvent = _interopRequireDefault(require("./registerEvent"));
|
|
9
|
+
var _getGeneralReport = _interopRequireDefault(require("./getGeneralReport"));
|
|
10
|
+
var _getAndroidSn = _interopRequireDefault(require("./getAndroidSn"));
|
|
11
|
+
// 初始化
|
|
12
|
+
var _default = exports.default = {
|
|
13
|
+
registerEvent: _registerEvent.default,
|
|
14
|
+
getGeneralReport: _getGeneralReport.default,
|
|
15
|
+
getAndroidSn: _getAndroidSn.default
|
|
16
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
+
var _utils = require("../utils/utils");
|
|
11
|
+
var _utils2 = require("../utils/utils.initDll");
|
|
12
|
+
var _winDriver = require("../events/driver/winDriver");
|
|
13
|
+
var usbmux = require('usbmux');
|
|
14
|
+
var path = require('path');
|
|
15
|
+
var request = require("request");
|
|
16
|
+
var fs = require('fs');
|
|
17
|
+
|
|
18
|
+
// saas回调
|
|
19
|
+
var saasCallBack;
|
|
20
|
+
|
|
21
|
+
// 初始化dll
|
|
22
|
+
(0, _utils2.HunterInspectionKit)();
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 配对
|
|
26
|
+
* @param {String} udid 设备id
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
var DevicePair = /*#__PURE__*/function () {
|
|
30
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
31
|
+
var udid,
|
|
32
|
+
params,
|
|
33
|
+
paramsObj,
|
|
34
|
+
devicePair,
|
|
35
|
+
pairRes,
|
|
36
|
+
Code,
|
|
37
|
+
Data,
|
|
38
|
+
_args = arguments;
|
|
39
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
40
|
+
while (1) switch (_context.prev = _context.next) {
|
|
41
|
+
case 0:
|
|
42
|
+
udid = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
|
|
43
|
+
params = _args.length > 1 ? _args[1] : undefined;
|
|
44
|
+
// 通过调用read_pair来判断是否已配对【信任】
|
|
45
|
+
paramsObj = JSON.parse(params); // 合并参数
|
|
46
|
+
Object.assign(paramsObj, {
|
|
47
|
+
cmd: 'trust_status',
|
|
48
|
+
udid: udid
|
|
49
|
+
});
|
|
50
|
+
devicePair = window.HunterInspectionKit.TheForceKit(JSON.stringify(paramsObj));
|
|
51
|
+
if (!devicePair) {
|
|
52
|
+
_context.next = 15;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
pairRes = JSON.parse(devicePair);
|
|
56
|
+
Code = pairRes.Code, Data = pairRes.Data;
|
|
57
|
+
if (!(Code == 0 && Data.imei)) {
|
|
58
|
+
_context.next = 12;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
saasCallBack({
|
|
62
|
+
data: {
|
|
63
|
+
eventName: 'type_trust_result',
|
|
64
|
+
udid: udid,
|
|
65
|
+
eventCode: 0
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
_context.next = 15;
|
|
69
|
+
break;
|
|
70
|
+
case 12:
|
|
71
|
+
_context.next = 14;
|
|
72
|
+
return (0, _utils.sleep)();
|
|
73
|
+
case 14:
|
|
74
|
+
DevicePair(udid, params);
|
|
75
|
+
case 15:
|
|
76
|
+
case "end":
|
|
77
|
+
return _context.stop();
|
|
78
|
+
}
|
|
79
|
+
}, _callee);
|
|
80
|
+
}));
|
|
81
|
+
return function DevicePair() {
|
|
82
|
+
return _ref.apply(this, arguments);
|
|
83
|
+
};
|
|
84
|
+
}();
|
|
85
|
+
var updateDll = function updateDll(packageUrl) {
|
|
86
|
+
// 若需要更新 则下载完成后 覆盖本地dll文件
|
|
87
|
+
var dllOutPath;
|
|
88
|
+
if ((0, _utils.isMac)()) {
|
|
89
|
+
if ((0, _utils.isArm64)()) {
|
|
90
|
+
dllOutPath = path.resolve(__dirname, '../resources/mac/arm64.dylib');
|
|
91
|
+
}
|
|
92
|
+
if ((0, _utils.isAmd64)()) {
|
|
93
|
+
dllOutPath = path.resolve(__dirname, '../resources/mac/amd64.dylib');
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
dllOutPath = path.resolve(__dirname, "../resources/dll/x64.dll");
|
|
97
|
+
}
|
|
98
|
+
var dllStream = fs.createWriteStream(dllOutPath);
|
|
99
|
+
request(packageUrl).pipe(dllStream).on("close", function () {
|
|
100
|
+
// 下载完成后 重新初始化dll
|
|
101
|
+
(0, _utils2.HunterInspectionKit)();
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 更新下载dll文件 并重写本地版本号
|
|
107
|
+
* @param {String} udid 设备id
|
|
108
|
+
* @returns
|
|
109
|
+
*/
|
|
110
|
+
var updateDllFileCheck = function updateDllFileCheck() {
|
|
111
|
+
var updateParams = {
|
|
112
|
+
cmd: 'hot_update',
|
|
113
|
+
label: (0, _utils.isWin)() ? 'Windows' : 'Mac',
|
|
114
|
+
params: {}
|
|
115
|
+
};
|
|
116
|
+
var updateRes = window.HunterInspectionKit.TheForceKit(JSON.stringify(updateParams));
|
|
117
|
+
console.log('------updateRes', updateRes);
|
|
118
|
+
if (updateRes) {
|
|
119
|
+
var updateResObj = JSON.parse(updateRes);
|
|
120
|
+
var Code = updateResObj.Code,
|
|
121
|
+
Data = updateResObj.Data;
|
|
122
|
+
if (Code == 0) {
|
|
123
|
+
var isHot = Data.isHot,
|
|
124
|
+
url = Data.url;
|
|
125
|
+
if (isHot == 1) {
|
|
126
|
+
// 需要更新 则直接下载
|
|
127
|
+
updateDll(url);
|
|
128
|
+
} else {}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
var RegisterEvent = function RegisterEvent(params, callBack) {
|
|
133
|
+
saasCallBack = callBack;
|
|
134
|
+
|
|
135
|
+
// 检查是否需要更新dll
|
|
136
|
+
updateDllFileCheck();
|
|
137
|
+
new usbmux.createListener().on('attached', /*#__PURE__*/function () {
|
|
138
|
+
var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(udid) {
|
|
139
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
140
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
141
|
+
case 0:
|
|
142
|
+
if (udid) {
|
|
143
|
+
_context2.next = 2;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
return _context2.abrupt("return");
|
|
147
|
+
case 2:
|
|
148
|
+
if ((0, _utils.isWin)()) {
|
|
149
|
+
// windows检查驱动 mac不需要
|
|
150
|
+
// 检查是否有驱动
|
|
151
|
+
(0, _winDriver.checkHasDriver)().then(function (res) {
|
|
152
|
+
if (res) {
|
|
153
|
+
// 有驱动,直接运行脚本
|
|
154
|
+
DevicePair(udid, params);
|
|
155
|
+
} else {
|
|
156
|
+
(0, _winDriver.downloadDriver)();
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
} else {
|
|
160
|
+
// 有驱动,直接运行脚本
|
|
161
|
+
DevicePair(udid, params);
|
|
162
|
+
}
|
|
163
|
+
case 3:
|
|
164
|
+
case "end":
|
|
165
|
+
return _context2.stop();
|
|
166
|
+
}
|
|
167
|
+
}, _callee2);
|
|
168
|
+
}));
|
|
169
|
+
return function (_x) {
|
|
170
|
+
return _ref2.apply(this, arguments);
|
|
171
|
+
};
|
|
172
|
+
}()).on('detached', function (udid) {
|
|
173
|
+
console.log('--------udid', udid);
|
|
174
|
+
// clearInterval(pairTimer)
|
|
175
|
+
}).on('error', function (err) {
|
|
176
|
+
console.log('usb连接错误:', err);
|
|
177
|
+
var errMsg = "usb\u8FDE\u63A5\u9519\u8BEF\uFF1A".concat(err);
|
|
178
|
+
throw new Error(errMsg);
|
|
179
|
+
});
|
|
180
|
+
};
|
|
181
|
+
var _default = exports.default = RegisterEvent;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.command = command;
|
|
7
|
+
var exec = require('child_process').exec;
|
|
8
|
+
function command(cmd) {
|
|
9
|
+
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : './';
|
|
10
|
+
// 任何你期望执行的cmd命令,ls都可以
|
|
11
|
+
var cmdStr1 = cmd;
|
|
12
|
+
var cmdPath = path;
|
|
13
|
+
// 子进程名称
|
|
14
|
+
var workerProcess;
|
|
15
|
+
runExec(cmdStr1);
|
|
16
|
+
function runExec(cmdStr) {
|
|
17
|
+
workerProcess = exec(cmdStr, {
|
|
18
|
+
cwd: cmdPath
|
|
19
|
+
});
|
|
20
|
+
// 打印正常的后台可执行程序输出
|
|
21
|
+
workerProcess.stdout.on('data', function (data) {
|
|
22
|
+
console.log('stdout: ' + data);
|
|
23
|
+
});
|
|
24
|
+
// 打印错误的后台可执行程序输出
|
|
25
|
+
workerProcess.stderr.on('data', function (data) {
|
|
26
|
+
console.log('stderr: ' + data);
|
|
27
|
+
});
|
|
28
|
+
// 退出之后的输出
|
|
29
|
+
workerProcess.on('close', function (code) {
|
|
30
|
+
console.log('out code:' + code);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.HunterInspectionKit = void 0;
|
|
7
|
+
var _utils = require("./utils");
|
|
8
|
+
var ffi = require('ffi-napi');
|
|
9
|
+
var path = require('path');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 声明dll函数
|
|
13
|
+
* @param {String} udid 设备id
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
var HunterInspectionKit = exports.HunterInspectionKit = function HunterInspectionKit() {
|
|
18
|
+
var dllPath;
|
|
19
|
+
if ((0, _utils.isMac)()) {
|
|
20
|
+
if ((0, _utils.isArm64)()) {
|
|
21
|
+
dllPath = path.resolve(__dirname, '../resources/mac/arm64.dylib');
|
|
22
|
+
}
|
|
23
|
+
if ((0, _utils.isAmd64)()) {
|
|
24
|
+
dllPath = path.resolve(__dirname, '../resources/mac/amd64.dylib');
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
dllPath = path.resolve(__dirname, '../resources/dll/x64.dll');
|
|
28
|
+
}
|
|
29
|
+
if (!(0, _utils.isDev)()) {
|
|
30
|
+
// 如果是生产模式 则替换app.asar 路径 为了在生产调用dll
|
|
31
|
+
dllPath = dllPath.replace('app.asar', 'app.asar.unpacked');
|
|
32
|
+
}
|
|
33
|
+
var kitFn = new ffi.Library(dllPath, {
|
|
34
|
+
'InspectionKit': ['string', ['string', 'string', 'string']],
|
|
35
|
+
'TheForceKit': ['string', ['string']]
|
|
36
|
+
});
|
|
37
|
+
// 挂载全局window
|
|
38
|
+
window.HunterInspectionKit = kitFn;
|
|
39
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.sleep = exports.isWin = exports.isProd = exports.isMac = exports.isLinux = exports.isDev = exports.isArm64 = exports.isAmd64 = void 0;
|
|
7
|
+
var isMac = exports.isMac = function isMac() {
|
|
8
|
+
return process.platform === 'darwin';
|
|
9
|
+
};
|
|
10
|
+
var isWin = exports.isWin = function isWin() {
|
|
11
|
+
return process.platform === 'win32';
|
|
12
|
+
};
|
|
13
|
+
var isLinux = exports.isLinux = function isLinux() {
|
|
14
|
+
return process.platform === 'linux';
|
|
15
|
+
};
|
|
16
|
+
var isDev = exports.isDev = function isDev() {
|
|
17
|
+
return process.env.WEBPACK_DEV_SERVER === 'true';
|
|
18
|
+
};
|
|
19
|
+
var isProd = exports.isProd = function isProd() {
|
|
20
|
+
return process.env.NODE_ENV === 'production';
|
|
21
|
+
};
|
|
22
|
+
var isArm64 = exports.isArm64 = function isArm64() {
|
|
23
|
+
return process.arch === 'arm64';
|
|
24
|
+
};
|
|
25
|
+
var isAmd64 = exports.isAmd64 = function isAmd64() {
|
|
26
|
+
return process.arch === 'x64';
|
|
27
|
+
};
|
|
28
|
+
var sleep = exports.sleep = function sleep() {
|
|
29
|
+
return new Promise(function (resolve) {
|
|
30
|
+
setTimeout(function () {
|
|
31
|
+
resolve();
|
|
32
|
+
}, 2000);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.currentEnvPath = void 0;
|
|
7
|
+
var path = require('path');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 当前环境地址转换
|
|
11
|
+
* @param {*} path
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
var currentEnvPath = exports.currentEnvPath = function currentEnvPath(filePath) {
|
|
15
|
+
return path.resolve(__dirname, filePath);
|
|
16
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hunter-open-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "采货侠SaaS版本桌面端sdk",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"start": "zz dev",
|
|
7
|
+
"dev": "zz dev",
|
|
8
|
+
"dev-demo": "zz dev -d",
|
|
9
|
+
"build": "zz build",
|
|
10
|
+
"lint": "zz lint",
|
|
11
|
+
"fix": "zz lint --fix",
|
|
12
|
+
"staged": "zz lint --staged",
|
|
13
|
+
"staged-fix": "zz --staged --fix",
|
|
14
|
+
"pub": "zz pub",
|
|
15
|
+
"pub-beta": "zz pub --beta",
|
|
16
|
+
"unpub": "zz pub --unpub",
|
|
17
|
+
"doc": "zz doc && zz doc --upload",
|
|
18
|
+
"dev-doc": "zz doc --dev",
|
|
19
|
+
"build-doc": "zz doc",
|
|
20
|
+
"cz": "zz cz",
|
|
21
|
+
"test": "zz test",
|
|
22
|
+
"prepare": "npx lefthook install"
|
|
23
|
+
},
|
|
24
|
+
"main": "lib/index.js",
|
|
25
|
+
"types": "lib/index.d.ts",
|
|
26
|
+
"author": "xiexing <xiexing@zhuanzhuan.com>",
|
|
27
|
+
"license": "ISC",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"core-js": "3.6.5",
|
|
30
|
+
"ffi-napi": "^4.0.3",
|
|
31
|
+
"fs": "^0.0.1-security",
|
|
32
|
+
"lodash": "4.17.21",
|
|
33
|
+
"request": "^2.88.2",
|
|
34
|
+
"sudo-prompt": "^9.2.1",
|
|
35
|
+
"usb": "^2.15.0",
|
|
36
|
+
"usbmux": "^0.1.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@babel/plugin-transform-runtime": "7.21.0",
|
|
40
|
+
"@commitlint/cli": "8.3.5",
|
|
41
|
+
"@commitlint/config-conventional": "8.3.4",
|
|
42
|
+
"@evilmartians/lefthook": "0.8.0",
|
|
43
|
+
"@types/lodash": "4.14.182",
|
|
44
|
+
"@umijs/fabric": "2.12.2",
|
|
45
|
+
"@zz-common/bunlder-module-father": "^0.0.10",
|
|
46
|
+
"@zz-common/dev-standard": "^2.0.8",
|
|
47
|
+
"@zz-common/zz-cli": "^5.0.3",
|
|
48
|
+
"@zz-common/zz-cli-types": "^0.0.9",
|
|
49
|
+
"commitizen": "4.2.5",
|
|
50
|
+
"commitlint": "17.0.2",
|
|
51
|
+
"father": "4.1.6",
|
|
52
|
+
"lint-staged": "10.0.8",
|
|
53
|
+
"path-to-regexp": "2.4.0",
|
|
54
|
+
"typedoc": "0.23.9",
|
|
55
|
+
"typescript": "4.7.4"
|
|
56
|
+
},
|
|
57
|
+
"config": {
|
|
58
|
+
"commitizen": {
|
|
59
|
+
"path": "@zz-common/dev-standard/cz"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"lib"
|
|
64
|
+
]
|
|
65
|
+
}
|