melperjs 2.0.0 → 2.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.
Files changed (3) hide show
  1. package/lib/index.js +162 -0
  2. package/lib/node.js +193 -0
  3. package/package.json +1 -1
package/lib/index.js ADDED
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Exception = Exception;
7
+ exports.cookieDict = cookieDict;
8
+ exports.cookieHeader = cookieHeader;
9
+ exports.findKeyNode = findKeyNode;
10
+ exports.foreignHttpError = foreignHttpError;
11
+ exports.hashBcrypt = hashBcrypt;
12
+ exports.isEmpty = isEmpty;
13
+ exports.limitString = limitString;
14
+ exports.promiseTimeout = promiseTimeout;
15
+ exports.randomHex = randomHex;
16
+ exports.randomString = randomString;
17
+ exports.randomUuid = randomUuid;
18
+ exports.randomWeighted = randomWeighted;
19
+ exports.safeString = safeString;
20
+ exports.sleep = sleep;
21
+ exports.sleepMs = sleepMs;
22
+ exports.time = time;
23
+ exports.verifyBcrypt = verifyBcrypt;
24
+ var _ = _interopRequireWildcard(require("lodash"));
25
+ var _xss = _interopRequireDefault(require("xss"));
26
+ var _bcrypt = _interopRequireDefault(require("bcrypt"));
27
+ var _setCookieParser = _interopRequireDefault(require("set-cookie-parser"));
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
30
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
31
+ function Exception(message, response = {}) {
32
+ response.status = response.status || 400;
33
+ return {
34
+ message: message,
35
+ response: response
36
+ };
37
+ }
38
+ function time() {
39
+ return Math.floor(Date.now() / 1000);
40
+ }
41
+ async function sleepMs(milliseconds) {
42
+ return new Promise(resolve => setTimeout(resolve, milliseconds));
43
+ }
44
+ async function sleep(seconds) {
45
+ return await sleepMs(seconds * 1000);
46
+ }
47
+ function promiseTimeout(milliseconds, promise) {
48
+ return new Promise((resolve, reject) => {
49
+ const timer = setTimeout(() => {
50
+ reject(new Error('Promise timed out after ' + milliseconds + 'ms'));
51
+ }, milliseconds);
52
+ promise.then(value => {
53
+ clearTimeout(timer);
54
+ resolve(value);
55
+ }).catch(reason => {
56
+ clearTimeout(timer);
57
+ reject(reason);
58
+ });
59
+ });
60
+ }
61
+ function findKeyNode(key, node, pair = null) {
62
+ if (node && node.hasOwnProperty(key) && (pair ? node[key] === pair : true)) {
63
+ return node;
64
+ } else if (typeof node === 'object') {
65
+ for (let index in node) {
66
+ const result = findKeyNode(key, node[index], pair);
67
+ if (result) {
68
+ return result;
69
+ }
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+ function isEmpty(value) {
75
+ if (typeof value === "number") {
76
+ return value === 0;
77
+ } else {
78
+ return _.isEmpty(value);
79
+ }
80
+ }
81
+ function limitString(str, limit = 35) {
82
+ str = str || "";
83
+ if (str.length <= limit) {
84
+ return str;
85
+ } else {
86
+ return str.substring(0, limit - 3) + "...";
87
+ }
88
+ }
89
+ function safeString(source) {
90
+ return (0, _xss.default)(source, {
91
+ whiteList: {},
92
+ stripIgnoreTag: true,
93
+ stripIgnoreTagBody: ["script"]
94
+ });
95
+ }
96
+ function randomString(length, useNumbers = true, useUppercase = false) {
97
+ const lowercaseChars = 'abcdefghijklmnopqrstuvwxyz';
98
+ const uppercaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
99
+ const numbers = '0123456789';
100
+ let characters = lowercaseChars;
101
+ if (useUppercase) characters += uppercaseChars;
102
+ if (useNumbers) characters += numbers;
103
+ let randomString = '';
104
+ for (let i = 0; i < length; i++) {
105
+ const randomIndex = Math.floor(Math.random() * characters.length);
106
+ randomString += characters[randomIndex];
107
+ }
108
+ return randomString;
109
+ }
110
+ function randomHex(length) {
111
+ let result = '';
112
+ const characters = '0123456789abcdef';
113
+ for (let i = 0; i < length; i++) {
114
+ const randomIndex = Math.floor(Math.random() * characters.length);
115
+ result += characters[randomIndex];
116
+ }
117
+ return result;
118
+ }
119
+ function randomUuid(useDashes = true) {
120
+ let d = Date.now();
121
+ const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
122
+ const r = (d + Math.random() * 16) % 16 | 0;
123
+ d = Math.floor(d / 16);
124
+ return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
125
+ });
126
+ return useDashes ? uuid : uuid.replaceAll("-", "");
127
+ }
128
+ function randomWeighted(dict, randomFunc = totalWeight => Math.random() * totalWeight) {
129
+ let elements = Object.keys(dict);
130
+ let weights = Object.values(dict);
131
+ let totalWeight = weights.reduce((sum, weight) => sum + weight, 0);
132
+ let randomNum = randomFunc(totalWeight);
133
+ let weightSum = 0;
134
+ for (let i = 0; i < elements.length; i++) {
135
+ weightSum += weights[i];
136
+ if (randomNum <= weightSum) {
137
+ return elements[i];
138
+ }
139
+ }
140
+ }
141
+ function hashBcrypt(plainText) {
142
+ return _bcrypt.default.hashSync(plainText, _bcrypt.default.genSaltSync(10));
143
+ }
144
+ function verifyBcrypt(plainText, hash) {
145
+ return _bcrypt.default.compareSync(plainText, hash);
146
+ }
147
+ function cookieDict(res, decodeValues = false) {
148
+ let dict = {};
149
+ const cookies = _setCookieParser.default.parse(res, {
150
+ decodeValues: decodeValues
151
+ });
152
+ for (let cookie of cookies) {
153
+ dict[cookie.name] = cookie.value;
154
+ }
155
+ return dict;
156
+ }
157
+ function cookieHeader(cookieDict) {
158
+ return Object.entries(cookieDict).map(([key, value]) => `${key}=${value}`).join(';');
159
+ }
160
+ function foreignHttpError(httpCode) {
161
+ return httpCode === undefined || httpCode === null || httpCode === 0 || httpCode === 402 || httpCode === 407 || httpCode === 466 || 500 <= httpCode;
162
+ }
package/lib/node.js ADDED
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createDir = createDir;
7
+ exports.createNumDir = createNumDir;
8
+ exports.formatProxy = formatProxy;
9
+ exports.getVersion = getVersion;
10
+ exports.md5 = md5;
11
+ exports.proxify = proxify;
12
+ exports.proxyObject = proxyObject;
13
+ exports.serverIp = serverIp;
14
+ exports.tokenHex = tokenHex;
15
+ exports.tokenString = tokenString;
16
+ exports.tokenUuid = tokenUuid;
17
+ exports.tokenWeighted = tokenWeighted;
18
+ var _fs = _interopRequireDefault(require("fs"));
19
+ var _path = _interopRequireDefault(require("path"));
20
+ var _crypto = _interopRequireDefault(require("crypto"));
21
+ var _os = require("os");
22
+ var _child_process = require("child_process");
23
+ var _axios = _interopRequireDefault(require("axios"));
24
+ var _hpagent = require("hpagent");
25
+ var _index = require("./index.js");
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+ function tokenString(length, useNumbers = true, useUppercase = false) {
28
+ const lowercaseChars = 'abcdefghijklmnopqrstuvwxyz';
29
+ const uppercaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
30
+ const numbers = '0123456789';
31
+ let characters = lowercaseChars;
32
+ if (useUppercase) characters += uppercaseChars;
33
+ if (useNumbers) characters += numbers;
34
+ let randomString = '';
35
+ while (randomString.length < length) {
36
+ const byte = _crypto.default.randomBytes(1)[0];
37
+ const index = byte % characters.length;
38
+ if (byte < 256 - 256 % characters.length) {
39
+ randomString += characters[index];
40
+ }
41
+ }
42
+ return randomString;
43
+ }
44
+ function tokenHex(length) {
45
+ return _crypto.default.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
46
+ }
47
+ function tokenUuid(useDashes = true) {
48
+ const uuid = _crypto.default.randomUUID().toString();
49
+ return useDashes ? uuid : uuid.replaceAll("-", "");
50
+ }
51
+ function tokenWeighted(dict) {
52
+ return (0, _index.randomWeighted)(dict, _crypto.default.randomInt);
53
+ }
54
+ function serverIp() {
55
+ const interfaces = (0, _os.networkInterfaces)();
56
+ for (const devName in interfaces) {
57
+ const interfaceValue = interfaces[devName];
58
+ for (let i = 0; i < interfaceValue.length; i++) {
59
+ const alias = interfaceValue[i];
60
+ if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.address.startsWith("192.168.") && !alias.internal) return alias.address;
61
+ }
62
+ }
63
+ return '127.0.0.1';
64
+ }
65
+ function getVersion() {
66
+ try {
67
+ const date = new Date((0, _child_process.execSync)('git show -s --format=%ci HEAD').toString().trim());
68
+ const formatDatePart = value => value.toString().padStart(2, '0');
69
+ const year = date.getFullYear().toString().slice(-2);
70
+ const month = formatDatePart(date.getMonth() + 1);
71
+ const day = formatDatePart(date.getDate());
72
+ const hour = formatDatePart(date.getHours());
73
+ const minute = formatDatePart(date.getMinutes());
74
+ return parseFloat(`${year}${month}.${day}${hour}${minute}`);
75
+ } catch {
76
+ return 1.0;
77
+ }
78
+ }
79
+ function createDir(directory) {
80
+ if (!_fs.default.existsSync(directory)) {
81
+ _fs.default.mkdirSync(directory, {
82
+ recursive: true
83
+ });
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ function createNumDir(mainDirectory) {
89
+ createDir(mainDirectory);
90
+ for (let i = 0; i <= 9; i++) {
91
+ try {
92
+ createDir(_path.default.join(mainDirectory, i.toString()));
93
+ } catch (e) {
94
+ console.error(`createNumDir:${i}`, e.message);
95
+ }
96
+ }
97
+ }
98
+ function md5(data) {
99
+ return _crypto.default.createHash('md5').update(data).digest("hex");
100
+ }
101
+ function formatProxy(proxy, protocol = "http") {
102
+ proxy = proxy.trim();
103
+ const splitByProtocol = proxy.split("://");
104
+ if (1 < splitByProtocol.length) protocol = splitByProtocol[0];
105
+ proxy = splitByProtocol[splitByProtocol.length - 1];
106
+ if (!proxy.includes("@")) {
107
+ const proxyParts = proxy.split(":");
108
+ if (4 <= proxyParts.length) {
109
+ proxy = `${proxyParts[proxyParts.length - 2]}:${proxyParts[proxyParts.length - 1]}@`;
110
+ proxyParts.pop();
111
+ proxyParts.pop();
112
+ proxy += proxyParts.join(":");
113
+ }
114
+ }
115
+ const proxyParts = proxy.split(':');
116
+ const proxyEnd = parseInt(proxyParts[proxyParts.length - 1]);
117
+ const proxyStart = proxyParts[proxyParts.length - 2];
118
+ if (!proxyStart.includes(".")) {
119
+ proxyParts.pop();
120
+ proxyParts[proxyParts.length - 1] = _crypto.default.randomInt(parseInt(proxyStart), proxyEnd + 1).toString();
121
+ }
122
+ return protocol + "://" + proxyParts.join(':');
123
+ }
124
+ function proxyObject(...args) {
125
+ let proxy = formatProxy(...args);
126
+ const splitByProtocol = proxy.split('://');
127
+ const splitById = splitByProtocol[splitByProtocol.length - 1].split('@');
128
+ const splitByConn = splitById[splitById.length - 1].split(':');
129
+ proxy = {
130
+ protocol: splitByProtocol[0],
131
+ host: splitByConn[0],
132
+ port: parseInt(splitByConn[1])
133
+ };
134
+ if (1 < splitById.length) {
135
+ const splitByAuth = splitById[0].split(':');
136
+ proxy.auth = {
137
+ username: splitByAuth[0],
138
+ password: splitByAuth[1]
139
+ };
140
+ }
141
+ return proxy;
142
+ }
143
+ async function proxify(proxyConfig, callback = formatProxy) {
144
+ proxyConfig = proxyConfig || {};
145
+ const timeout = 7000;
146
+ if (proxyConfig.mode === 1) {
147
+ return callback(proxyConfig.proxy);
148
+ } else if (proxyConfig.mode === 2) {
149
+ const proxy = callback(proxyConfig.proxy);
150
+ try {
151
+ await _axios.default.get(proxyConfig.resetApi, {
152
+ timeout
153
+ });
154
+ } catch {
155
+ return false;
156
+ }
157
+ await (0, _index.sleep)(5);
158
+ for (let i = 0; i < 5; i++) {
159
+ try {
160
+ const res = await _axios.default.get("https://api64.ipify.org", {
161
+ timeout,
162
+ httpsAgent: new _hpagent.HttpsProxyAgent({
163
+ proxy,
164
+ timeout: 7000
165
+ })
166
+ });
167
+ if (res.status === 200) return proxy;
168
+ } catch {
169
+ await (0, _index.sleep)(3);
170
+ }
171
+ }
172
+ } else if (proxyConfig.mode === 3) {
173
+ try {
174
+ const res = await _axios.default.get(proxyConfig.resetApi, {
175
+ timeout
176
+ });
177
+ if (res.status === 200) return callback(proxyConfig.proxy);
178
+ } catch {
179
+ return false;
180
+ }
181
+ } else if (proxyConfig.mode === 4) {
182
+ return callback(proxyConfig.proxy).replace("{SESSION}", tokenHex(8));
183
+ } else if (proxyConfig.mode === 5) {
184
+ try {
185
+ const lines = proxyConfig.proxy.split("\n");
186
+ const line = lines[_crypto.default.randomInt(0, lines.length)];
187
+ return callback(line);
188
+ } catch {
189
+ return false;
190
+ }
191
+ }
192
+ return null;
193
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "melperjs",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Nodejs module to use predefined common functions and utilities",
5
5
  "keywords": [
6
6
  "helper",