@certd/basic 1.25.8 → 1.26.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/.eslintrc +22 -0
- package/CHANGELOG.md +10 -0
- package/LICENSE +661 -0
- package/build.md +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/utils/index.d.ts +39 -0
- package/dist/utils/index.js +33 -0
- package/dist/utils/util.cache.d.ts +2 -0
- package/dist/utils/util.cache.js +7 -0
- package/dist/utils/util.file.d.ts +5 -0
- package/dist/utils/util.file.js +15 -0
- package/dist/utils/util.hash.d.ts +5 -0
- package/dist/utils/util.hash.js +8 -0
- package/dist/utils/util.log.d.ts +4 -0
- package/dist/utils/util.log.js +32 -0
- package/dist/utils/util.merge.d.ts +11 -0
- package/dist/utils/util.merge.js +59 -0
- package/dist/utils/util.promise.d.ts +8 -0
- package/dist/utils/util.promise.js +50 -0
- package/dist/utils/util.request.d.ts +44 -0
- package/dist/utils/util.request.js +152 -0
- package/dist/utils/util.sleep.d.ts +1 -0
- package/dist/utils/util.sleep.js +8 -0
- package/dist/utils/util.sp.d.ts +22 -0
- package/dist/utils/util.sp.js +94 -0
- package/package.json +63 -6
- package/tsconfig.json +42 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/src/index.js +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export * from './util.request.js';
|
|
2
|
+
export * from './util.log.js';
|
|
3
|
+
export * from './util.file.js';
|
|
4
|
+
export * from './util.sp.js';
|
|
5
|
+
export * from './util.promise.js';
|
|
6
|
+
export * from './util.hash.js';
|
|
7
|
+
export * from './util.merge.js';
|
|
8
|
+
export * from './util.cache.js';
|
|
9
|
+
import sleep from './util.sleep.js';
|
|
10
|
+
import { nanoid } from 'nanoid';
|
|
11
|
+
import * as _ from 'lodash-es';
|
|
12
|
+
import dayjs from 'dayjs';
|
|
13
|
+
export declare const utils: {
|
|
14
|
+
sleep: typeof sleep;
|
|
15
|
+
http: import("./util.request.js").HttpClient;
|
|
16
|
+
sp: {
|
|
17
|
+
spawn: (opts: import("./util.sp.js").SpawnOption) => Promise<string>;
|
|
18
|
+
exec: (opts: import("./util.sp.js").ExecOption) => Promise<string>;
|
|
19
|
+
};
|
|
20
|
+
hash: {
|
|
21
|
+
md5: (data: string) => string;
|
|
22
|
+
};
|
|
23
|
+
promises: {
|
|
24
|
+
TimeoutPromise: typeof import("./util.promise.js").TimeoutPromise;
|
|
25
|
+
safePromise: typeof import("./util.promise.js").safePromise;
|
|
26
|
+
promisify: typeof import("./util.promise.js").promisify;
|
|
27
|
+
};
|
|
28
|
+
file: {
|
|
29
|
+
getFileRootDir: (rootDir?: string | undefined) => string;
|
|
30
|
+
};
|
|
31
|
+
_: typeof _;
|
|
32
|
+
mergeUtils: {
|
|
33
|
+
merge: (target: any, ...sources: any) => any;
|
|
34
|
+
cloneDeep: (target: any) => any;
|
|
35
|
+
};
|
|
36
|
+
cache: import("lru-cache").LRUCache<string, any, unknown>;
|
|
37
|
+
nanoid: typeof nanoid;
|
|
38
|
+
dayjs: typeof dayjs;
|
|
39
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export * from './util.request.js';
|
|
2
|
+
export * from './util.log.js';
|
|
3
|
+
export * from './util.file.js';
|
|
4
|
+
export * from './util.sp.js';
|
|
5
|
+
export * from './util.promise.js';
|
|
6
|
+
export * from './util.hash.js';
|
|
7
|
+
export * from './util.merge.js';
|
|
8
|
+
export * from './util.cache.js';
|
|
9
|
+
import sleep from './util.sleep.js';
|
|
10
|
+
import { http } from './util.request.js';
|
|
11
|
+
import { nanoid } from 'nanoid';
|
|
12
|
+
import { mergeUtils } from './util.merge.js';
|
|
13
|
+
import { sp } from './util.sp.js';
|
|
14
|
+
import { hashUtils } from './util.hash.js';
|
|
15
|
+
import { promises } from './util.promise.js';
|
|
16
|
+
import { fileUtils } from './util.file.js';
|
|
17
|
+
import * as _ from 'lodash-es';
|
|
18
|
+
import { cache } from './util.cache.js';
|
|
19
|
+
import dayjs from 'dayjs';
|
|
20
|
+
export const utils = {
|
|
21
|
+
sleep,
|
|
22
|
+
http,
|
|
23
|
+
sp,
|
|
24
|
+
hash: hashUtils,
|
|
25
|
+
promises,
|
|
26
|
+
file: fileUtils,
|
|
27
|
+
_,
|
|
28
|
+
mergeUtils,
|
|
29
|
+
cache,
|
|
30
|
+
nanoid,
|
|
31
|
+
dayjs,
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFDcEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxLQUFLLENBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsS0FBSztJQUNMLElBQUk7SUFDSixFQUFFO0lBQ0YsSUFBSSxFQUFFLFNBQVM7SUFDZixRQUFRO0lBQ1IsSUFBSSxFQUFFLFNBQVM7SUFDZixDQUFDO0lBQ0QsVUFBVTtJQUNWLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztDQUNOLENBQUMifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// LRUCache
|
|
2
|
+
import { LRUCache } from "lru-cache";
|
|
3
|
+
export const cache = new LRUCache({
|
|
4
|
+
max: 1000,
|
|
5
|
+
ttl: 1000 * 60 * 10,
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLmNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVc7QUFFWCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXJDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLFFBQVEsQ0FBYztJQUM3QyxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUU7Q0FDcEIsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
function getFileRootDir(rootDir) {
|
|
3
|
+
if (rootDir == null) {
|
|
4
|
+
const userHome = process.env.HOME || process.env.USERPROFILE;
|
|
5
|
+
rootDir = userHome + "/.certd/storage/";
|
|
6
|
+
}
|
|
7
|
+
if (!fs.existsSync(rootDir)) {
|
|
8
|
+
fs.mkdirSync(rootDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
return rootDir;
|
|
11
|
+
}
|
|
12
|
+
export const fileUtils = {
|
|
13
|
+
getFileRootDir,
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5maWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWwuZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsU0FBUyxjQUFjLENBQUMsT0FBZ0I7SUFDdEMsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDcEIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDN0QsT0FBTyxHQUFHLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM1QixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHO0lBQ3ZCLGNBQWM7Q0FDZixDQUFDIn0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import crypto from "crypto";
|
|
2
|
+
function md5(data) {
|
|
3
|
+
return crypto.createHash("md5").update(data).digest("hex");
|
|
4
|
+
}
|
|
5
|
+
export const hashUtils = {
|
|
6
|
+
md5,
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5oYXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWwuaGFzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsU0FBUyxHQUFHLENBQUMsSUFBWTtJQUN2QixPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHO0lBQ3ZCLEdBQUc7Q0FDSixDQUFDIn0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import log4js from "log4js";
|
|
2
|
+
const OutputAppender = {
|
|
3
|
+
configure: (config, layouts, findAppender, levels) => {
|
|
4
|
+
let layout = layouts.basicLayout;
|
|
5
|
+
if (config.layout) {
|
|
6
|
+
layout = layouts.layout(config.layout.type, config.layout);
|
|
7
|
+
}
|
|
8
|
+
function customAppender(layout, timezoneOffset) {
|
|
9
|
+
return (loggingEvent) => {
|
|
10
|
+
if (loggingEvent.context.outputHandler?.write) {
|
|
11
|
+
const text = `${layout(loggingEvent, timezoneOffset)}\n`;
|
|
12
|
+
loggingEvent.context.outputHandler.write(text);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return customAppender(layout, config.timezoneOffset);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
log4js.configure({
|
|
21
|
+
appenders: { std: { type: "stdout" }, output: { type: OutputAppender } },
|
|
22
|
+
categories: { default: { appenders: ["std"], level: "info" }, pipeline: { appenders: ["std", "output"], level: "info" } },
|
|
23
|
+
});
|
|
24
|
+
export const logger = log4js.getLogger("default");
|
|
25
|
+
export function buildLogger(write) {
|
|
26
|
+
const logger = log4js.getLogger("pipeline");
|
|
27
|
+
logger.addContext("outputHandler", {
|
|
28
|
+
write,
|
|
29
|
+
});
|
|
30
|
+
return logger;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5sb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvdXRpbC5sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFnQyxNQUFNLFFBQVEsQ0FBQztBQUV0RCxNQUFNLGNBQWMsR0FBRztJQUNyQixTQUFTLEVBQUUsQ0FBQyxNQUFXLEVBQUUsT0FBWSxFQUFFLFlBQWlCLEVBQUUsTUFBVyxFQUFFLEVBQUU7UUFDdkUsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUNqQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0QsQ0FBQztRQUNELFNBQVMsY0FBYyxDQUFDLE1BQVcsRUFBRSxjQUFtQjtZQUN0RCxPQUFPLENBQUMsWUFBMEIsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUM5QyxNQUFNLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLElBQUksQ0FBQztvQkFDekQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGLENBQUM7QUFFRixhQUFhO0FBQ2IsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUNmLFNBQVMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEVBQUU7SUFDeEUsVUFBVSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7Q0FDMUgsQ0FBQyxDQUFDO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFFbEQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUE2QjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFO1FBQ2pDLEtBQUs7S0FDTixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare function merge(target: any, ...sources: any): any;
|
|
2
|
+
declare function cloneDeep(target: any): any;
|
|
3
|
+
export declare class UnMergeable {
|
|
4
|
+
cloneable: boolean;
|
|
5
|
+
setCloneable(cloneable: any): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const mergeUtils: {
|
|
8
|
+
merge: typeof merge;
|
|
9
|
+
cloneDeep: typeof cloneDeep;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import _ from "lodash-es";
|
|
2
|
+
function isUnMergeable(srcValue) {
|
|
3
|
+
return srcValue != null && srcValue instanceof UnMergeable;
|
|
4
|
+
}
|
|
5
|
+
function isUnCloneable(value) {
|
|
6
|
+
return isUnMergeable(value) && !value.cloneable;
|
|
7
|
+
}
|
|
8
|
+
function merge(target, ...sources) {
|
|
9
|
+
/**
|
|
10
|
+
* 如果目标为不可合并对象,比如array、unMergeable、ref,则直接覆盖不合并
|
|
11
|
+
* @param objValue 被合并对象
|
|
12
|
+
* @param srcValue 来源对象
|
|
13
|
+
*/
|
|
14
|
+
function customizer(objValue, srcValue) {
|
|
15
|
+
if (srcValue == null) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// 如果被合并对象为数组,则直接被覆盖对象覆盖,只要覆盖对象不为空
|
|
19
|
+
if (_.isArray(objValue)) {
|
|
20
|
+
//原对象如果是数组
|
|
21
|
+
return srcValue; //来源对象
|
|
22
|
+
}
|
|
23
|
+
if (isUnMergeable(srcValue)) {
|
|
24
|
+
return srcValue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
let found = null;
|
|
28
|
+
for (const item of sources) {
|
|
29
|
+
if (isUnMergeable(item)) {
|
|
30
|
+
found = item;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (found) {
|
|
34
|
+
return found;
|
|
35
|
+
}
|
|
36
|
+
return _.mergeWith(target, ...sources, customizer);
|
|
37
|
+
}
|
|
38
|
+
function cloneDeep(target) {
|
|
39
|
+
if (isUnCloneable(target)) {
|
|
40
|
+
return target;
|
|
41
|
+
}
|
|
42
|
+
function customizer(value) {
|
|
43
|
+
if (isUnCloneable(value)) {
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return _.cloneDeepWith(target, customizer);
|
|
48
|
+
}
|
|
49
|
+
export class UnMergeable {
|
|
50
|
+
cloneable = false;
|
|
51
|
+
setCloneable(cloneable) {
|
|
52
|
+
this.cloneable = cloneable;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export const mergeUtils = {
|
|
56
|
+
merge,
|
|
57
|
+
cloneDeep,
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5tZXJnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLm1lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sQ0FBQyxNQUFNLFdBQVcsQ0FBQztBQUMxQixTQUFTLGFBQWEsQ0FBQyxRQUFhO0lBQ2xDLE9BQU8sUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLFlBQVksV0FBVyxDQUFDO0FBQzdELENBQUM7QUFDRCxTQUFTLGFBQWEsQ0FBQyxLQUFVO0lBQy9CLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztBQUNsRCxDQUFDO0FBQ0QsU0FBUyxLQUFLLENBQUMsTUFBVyxFQUFFLEdBQUcsT0FBWTtJQUN6Qzs7OztPQUlHO0lBQ0gsU0FBUyxVQUFVLENBQUMsUUFBYSxFQUFFLFFBQWE7UUFDOUMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsT0FBTztRQUNULENBQUM7UUFDRCxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEIsVUFBVTtZQUNWLE9BQU8sUUFBUSxDQUFDLENBQUMsTUFBTTtRQUN6QixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSyxHQUFRLElBQUksQ0FBQztJQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDeEIsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLE1BQVc7SUFDNUIsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsU0FBUyxVQUFVLENBQUMsS0FBVTtRQUM1QixJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFDRCxNQUFNLE9BQU8sV0FBVztJQUN0QixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWxCLFlBQVksQ0FBQyxTQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixLQUFLO0lBQ0wsU0FBUztDQUNWLENBQUMifQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function TimeoutPromise(callback: () => Promise<void>, ms?: number): Promise<unknown>;
|
|
2
|
+
export declare function safePromise<T>(callback: (resolve: (ret: T) => void, reject: (ret: any) => void) => void): Promise<T>;
|
|
3
|
+
export declare function promisify(func: any): (...args: any) => Promise<unknown>;
|
|
4
|
+
export declare const promises: {
|
|
5
|
+
TimeoutPromise: typeof TimeoutPromise;
|
|
6
|
+
safePromise: typeof safePromise;
|
|
7
|
+
promisify: typeof promisify;
|
|
8
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { logger } from "./util.log.js";
|
|
2
|
+
export function TimeoutPromise(callback, ms = 30 * 1000) {
|
|
3
|
+
let timeout;
|
|
4
|
+
return Promise.race([
|
|
5
|
+
callback(),
|
|
6
|
+
new Promise((resolve, reject) => {
|
|
7
|
+
timeout = setTimeout(() => {
|
|
8
|
+
reject(new Error(`Task timeout in ${ms} ms`));
|
|
9
|
+
}, ms);
|
|
10
|
+
}),
|
|
11
|
+
]).finally(() => {
|
|
12
|
+
clearTimeout(timeout);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function safePromise(callback) {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
try {
|
|
18
|
+
callback(resolve, reject);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
logger.error(e);
|
|
22
|
+
reject(e);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
export function promisify(func) {
|
|
27
|
+
return function (...args) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
try {
|
|
30
|
+
func(...args, (err, data) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
reject(err);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
resolve(data);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
reject(e);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export const promises = {
|
|
46
|
+
TimeoutPromise,
|
|
47
|
+
safePromise,
|
|
48
|
+
promisify,
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5wcm9taXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWwucHJvbWlzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE1BQU0sVUFBVSxjQUFjLENBQUMsUUFBNkIsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUk7SUFDMUUsSUFBSSxPQUFZLENBQUM7SUFDakIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ2xCLFFBQVEsRUFBRTtRQUNWLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzlCLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUN4QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDVCxDQUFDLENBQUM7S0FDSCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUNkLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFJLFFBQXlFO0lBQ3RHLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDO1lBQ0gsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsSUFBUztJQUNqQyxPQUFPLFVBQVUsR0FBRyxJQUFTO1FBQzNCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQVEsRUFBRSxJQUFTLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDUixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDaEIsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDdEIsY0FBYztJQUNkLFdBQVc7SUFDWCxTQUFTO0NBQ1YsQ0FBQyJ9
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { AxiosRequestConfig } from 'axios';
|
|
4
|
+
import { Logger } from 'log4js';
|
|
5
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
6
|
+
import nodeHttp from 'http';
|
|
7
|
+
import * as https from 'node:https';
|
|
8
|
+
export declare class HttpError extends Error {
|
|
9
|
+
status?: number;
|
|
10
|
+
statusText?: string;
|
|
11
|
+
code?: string;
|
|
12
|
+
request?: {
|
|
13
|
+
baseURL: string;
|
|
14
|
+
url: string;
|
|
15
|
+
method: string;
|
|
16
|
+
params?: any;
|
|
17
|
+
data?: any;
|
|
18
|
+
};
|
|
19
|
+
response?: {
|
|
20
|
+
data: any;
|
|
21
|
+
};
|
|
22
|
+
cause?: any;
|
|
23
|
+
constructor(error: any);
|
|
24
|
+
}
|
|
25
|
+
export declare const HttpCommonError: typeof HttpError;
|
|
26
|
+
/**
|
|
27
|
+
* @description 创建请求实例
|
|
28
|
+
*/
|
|
29
|
+
export declare function createAxiosService({ logger }: {
|
|
30
|
+
logger: Logger;
|
|
31
|
+
}): import("axios").AxiosInstance;
|
|
32
|
+
export declare const http: HttpClient;
|
|
33
|
+
export type HttpClientResponse<R> = any;
|
|
34
|
+
export type HttpRequestConfig<D> = {
|
|
35
|
+
skipSslVerify?: boolean;
|
|
36
|
+
skipCheckRes?: boolean;
|
|
37
|
+
} & AxiosRequestConfig<D>;
|
|
38
|
+
export type HttpClient = {
|
|
39
|
+
request<D = any, R = any>(config: HttpRequestConfig<D>): Promise<HttpClientResponse<R>>;
|
|
40
|
+
};
|
|
41
|
+
export declare function createAgent(opts?: nodeHttp.AgentOptions): {
|
|
42
|
+
httpAgent: nodeHttp.Agent;
|
|
43
|
+
httpsAgent: HttpsProxyAgent<string> | https.Agent;
|
|
44
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { logger } from './util.log.js';
|
|
3
|
+
import { HttpProxyAgent } from 'http-proxy-agent';
|
|
4
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
5
|
+
import nodeHttp from 'http';
|
|
6
|
+
import * as https from 'node:https';
|
|
7
|
+
export class HttpError extends Error {
|
|
8
|
+
status;
|
|
9
|
+
statusText;
|
|
10
|
+
code;
|
|
11
|
+
request;
|
|
12
|
+
response;
|
|
13
|
+
cause;
|
|
14
|
+
constructor(error) {
|
|
15
|
+
if (!error) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
super(error.message);
|
|
19
|
+
if (error?.message?.indexOf('ssl3_get_record:wrong version number') >= 0) {
|
|
20
|
+
this.message = 'http协议错误,服务端要求http协议,请检查是否使用了https请求';
|
|
21
|
+
}
|
|
22
|
+
this.name = error.name;
|
|
23
|
+
this.code = error.code;
|
|
24
|
+
this.cause = error.cause;
|
|
25
|
+
this.status = error.response?.status;
|
|
26
|
+
this.statusText = error.response?.statusText;
|
|
27
|
+
this.request = {
|
|
28
|
+
baseURL: error.config?.baseURL,
|
|
29
|
+
url: error.config?.url,
|
|
30
|
+
method: error.config?.method,
|
|
31
|
+
params: error.config?.params,
|
|
32
|
+
data: error.config?.data,
|
|
33
|
+
};
|
|
34
|
+
this.response = {
|
|
35
|
+
data: error.response?.data,
|
|
36
|
+
};
|
|
37
|
+
delete error.response;
|
|
38
|
+
delete error.config;
|
|
39
|
+
delete error.request;
|
|
40
|
+
// logger.error(error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const HttpCommonError = HttpError;
|
|
44
|
+
/**
|
|
45
|
+
* @description 创建请求实例
|
|
46
|
+
*/
|
|
47
|
+
export function createAxiosService({ logger }) {
|
|
48
|
+
// 创建一个 axios 实例
|
|
49
|
+
const service = axios.create();
|
|
50
|
+
const defaultAgents = createAgent();
|
|
51
|
+
// 请求拦截
|
|
52
|
+
service.interceptors.request.use((config) => {
|
|
53
|
+
logger.info(`http request:${config.url},method:${config.method},params:${JSON.stringify(config.params)}`);
|
|
54
|
+
if (config.timeout == null) {
|
|
55
|
+
config.timeout = 15000;
|
|
56
|
+
}
|
|
57
|
+
let agents = defaultAgents;
|
|
58
|
+
if (config.skipSslVerify) {
|
|
59
|
+
logger.info('跳过SSL验证');
|
|
60
|
+
agents = createAgent({ rejectUnauthorized: false });
|
|
61
|
+
}
|
|
62
|
+
delete config.skipSslVerify;
|
|
63
|
+
config.httpsAgent = agents.httpsAgent;
|
|
64
|
+
config.httpAgent = agents.httpAgent;
|
|
65
|
+
config.proxy = false; //必须 否则还会走一层代理,
|
|
66
|
+
return config;
|
|
67
|
+
}, (error) => {
|
|
68
|
+
// 发送失败
|
|
69
|
+
logger.error('接口请求失败:', error);
|
|
70
|
+
return Promise.reject(error);
|
|
71
|
+
});
|
|
72
|
+
// 响应拦截
|
|
73
|
+
service.interceptors.response.use((response) => {
|
|
74
|
+
logger.info('http response:', JSON.stringify(response?.data));
|
|
75
|
+
return response.data;
|
|
76
|
+
}, (error) => {
|
|
77
|
+
const status = error.response?.status;
|
|
78
|
+
switch (status) {
|
|
79
|
+
case 400:
|
|
80
|
+
error.message = '请求错误';
|
|
81
|
+
break;
|
|
82
|
+
case 401:
|
|
83
|
+
error.message = '未授权,请登录';
|
|
84
|
+
break;
|
|
85
|
+
case 403:
|
|
86
|
+
error.message = '拒绝访问';
|
|
87
|
+
break;
|
|
88
|
+
case 404:
|
|
89
|
+
error.message = `请求地址出错: ${error.response.config.url}`;
|
|
90
|
+
break;
|
|
91
|
+
case 408:
|
|
92
|
+
error.message = '请求超时';
|
|
93
|
+
break;
|
|
94
|
+
case 500:
|
|
95
|
+
error.message = '服务器内部错误';
|
|
96
|
+
break;
|
|
97
|
+
case 501:
|
|
98
|
+
error.message = '服务未实现';
|
|
99
|
+
break;
|
|
100
|
+
case 502:
|
|
101
|
+
error.message = '网关错误';
|
|
102
|
+
break;
|
|
103
|
+
case 503:
|
|
104
|
+
error.message = '服务不可用';
|
|
105
|
+
break;
|
|
106
|
+
case 504:
|
|
107
|
+
error.message = '网关超时';
|
|
108
|
+
break;
|
|
109
|
+
case 505:
|
|
110
|
+
error.message = 'HTTP版本不受支持';
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
logger.error(`请求出错:status:${error.response?.status},statusText:${error.response?.statusText},url:${error.config?.url},method:${error.config?.method}。`);
|
|
116
|
+
logger.error('返回数据:', JSON.stringify(error.response?.data));
|
|
117
|
+
if (error.response?.data) {
|
|
118
|
+
error.message = error.response.data.message || error.response.data.msg || error.response.data.error || error.response.data;
|
|
119
|
+
}
|
|
120
|
+
if (error instanceof AggregateError) {
|
|
121
|
+
logger.error('AggregateError', error);
|
|
122
|
+
}
|
|
123
|
+
const err = new HttpError(error);
|
|
124
|
+
return Promise.reject(err);
|
|
125
|
+
});
|
|
126
|
+
return service;
|
|
127
|
+
}
|
|
128
|
+
export const http = createAxiosService({ logger });
|
|
129
|
+
export function createAgent(opts = {}) {
|
|
130
|
+
let httpAgent, httpsAgent;
|
|
131
|
+
const httpProxy = process.env.HTTP_PROXY || process.env.http_proxy;
|
|
132
|
+
if (httpProxy) {
|
|
133
|
+
logger.info('use httpProxy:', httpProxy);
|
|
134
|
+
httpAgent = new HttpProxyAgent(httpProxy, opts);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
httpAgent = new nodeHttp.Agent(opts);
|
|
138
|
+
}
|
|
139
|
+
const httpsProxy = process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
140
|
+
if (httpsProxy) {
|
|
141
|
+
logger.info('use httpsProxy:', httpsProxy);
|
|
142
|
+
httpsAgent = new HttpsProxyAgent(httpsProxy, opts);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
httpsAgent = new https.Agent(opts);
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
httpAgent,
|
|
149
|
+
httpsAgent,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5yZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3V0aWwucmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQTZCLE1BQU0sT0FBTyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLFFBQVEsTUFBTSxNQUFNLENBQUM7QUFDNUIsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDcEMsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBQ2xDLE1BQU0sQ0FBVTtJQUNoQixVQUFVLENBQVU7SUFDcEIsSUFBSSxDQUFVO0lBQ2QsT0FBTyxDQUE4RTtJQUNyRixRQUFRLENBQWlCO0lBQ3pCLEtBQUssQ0FBTztJQUNaLFlBQVksS0FBVTtRQUNwQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckIsSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsc0NBQXNDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRXpCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFD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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (timeout: number): Promise<unknown>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export default function (timeout) {
|
|
2
|
+
return new Promise((resolve) => {
|
|
3
|
+
setTimeout(() => {
|
|
4
|
+
resolve({});
|
|
5
|
+
}, timeout);
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5zbGVlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLnNsZWVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLFdBQVcsT0FBZTtJQUN0QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNkLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ILogger } from "./util.log.js";
|
|
2
|
+
export type ExecOption = {
|
|
3
|
+
cmd: string | string[];
|
|
4
|
+
env: any;
|
|
5
|
+
logger?: ILogger;
|
|
6
|
+
options?: any;
|
|
7
|
+
};
|
|
8
|
+
declare function exec(opts: ExecOption): Promise<string>;
|
|
9
|
+
export type SpawnOption = {
|
|
10
|
+
cmd: string | string[];
|
|
11
|
+
onStdout?: (data: string) => void;
|
|
12
|
+
onStderr?: (data: string) => void;
|
|
13
|
+
env?: any;
|
|
14
|
+
logger?: ILogger;
|
|
15
|
+
options?: any;
|
|
16
|
+
};
|
|
17
|
+
declare function spawn(opts: SpawnOption): Promise<string>;
|
|
18
|
+
export declare const sp: {
|
|
19
|
+
spawn: typeof spawn;
|
|
20
|
+
exec: typeof exec;
|
|
21
|
+
};
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//转换为import
|
|
2
|
+
import childProcess from "child_process";
|
|
3
|
+
import { safePromise } from "./util.promise.js";
|
|
4
|
+
import { logger } from "./util.log.js";
|
|
5
|
+
async function exec(opts) {
|
|
6
|
+
let cmd = "";
|
|
7
|
+
const log = opts.logger || logger;
|
|
8
|
+
if (opts.cmd instanceof Array) {
|
|
9
|
+
for (const item of opts.cmd) {
|
|
10
|
+
if (cmd) {
|
|
11
|
+
cmd += " && " + item;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
cmd = item;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
log.info(`执行命令: ${cmd}`);
|
|
19
|
+
return safePromise((resolve, reject) => {
|
|
20
|
+
childProcess.exec(cmd, {
|
|
21
|
+
env: {
|
|
22
|
+
...process.env,
|
|
23
|
+
...opts.env,
|
|
24
|
+
},
|
|
25
|
+
...opts.options,
|
|
26
|
+
}, (error, stdout, stderr) => {
|
|
27
|
+
if (error) {
|
|
28
|
+
log.error(`exec error: ${error}`);
|
|
29
|
+
reject(error);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const res = stdout.toString("utf-8");
|
|
33
|
+
log.info(`stdout: ${res}`);
|
|
34
|
+
resolve(res);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function spawn(opts) {
|
|
40
|
+
let cmd = "";
|
|
41
|
+
const log = opts.logger || logger;
|
|
42
|
+
if (opts.cmd instanceof Array) {
|
|
43
|
+
for (const item of opts.cmd) {
|
|
44
|
+
if (cmd) {
|
|
45
|
+
cmd += " && " + item;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
cmd = item;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
cmd = opts.cmd;
|
|
54
|
+
}
|
|
55
|
+
log.info(`执行命令: ${cmd}`);
|
|
56
|
+
let stdout = "";
|
|
57
|
+
let stderr = "";
|
|
58
|
+
return safePromise((resolve, reject) => {
|
|
59
|
+
const ls = childProcess.spawn(cmd, {
|
|
60
|
+
shell: true,
|
|
61
|
+
env: {
|
|
62
|
+
...process.env,
|
|
63
|
+
...opts.env,
|
|
64
|
+
},
|
|
65
|
+
...opts.options,
|
|
66
|
+
});
|
|
67
|
+
ls.stdout.on("data", (data) => {
|
|
68
|
+
log.info(`stdout: ${data}`);
|
|
69
|
+
stdout += data;
|
|
70
|
+
});
|
|
71
|
+
ls.stderr.on("data", (data) => {
|
|
72
|
+
log.error(`stderr: ${data}`);
|
|
73
|
+
stderr += data;
|
|
74
|
+
});
|
|
75
|
+
ls.on("error", (error) => {
|
|
76
|
+
log.error(`child process error: ${error}`);
|
|
77
|
+
reject(error);
|
|
78
|
+
});
|
|
79
|
+
ls.on("close", (code) => {
|
|
80
|
+
if (code !== 0) {
|
|
81
|
+
log.error(`child process exited with code ${code}`);
|
|
82
|
+
reject(new Error(stderr));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
resolve(stdout);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export const sp = {
|
|
91
|
+
spawn,
|
|
92
|
+
exec,
|
|
93
|
+
};
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5zcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLnNwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVc7QUFDWCxPQUFPLFlBQVksTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFTaEQsS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFnQjtJQUNsQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQztJQUNsQyxJQUFJLElBQUksQ0FBQyxHQUFHLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDNUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixHQUFHLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxHQUFHLElBQUksQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLE9BQU8sV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLFlBQVksQ0FBQyxJQUFJLENBQ2YsR0FBRyxFQUNIO1lBQ0UsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsR0FBRyxJQUFJLENBQUMsR0FBRzthQUNaO1lBQ0QsR0FBRyxJQUFJLENBQUMsT0FBTztTQUNoQixFQUNELENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN4QixJQUFJLEtBQUssRUFBRSxDQUFDO2dC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
|