@nocobase/plugin-workflow-mailer 2.2.20 → 2.2.21
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/dist/externalVersion.js +6 -6
- package/dist/node_modules/joi/package.json +1 -1
- package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.d.ts +59 -0
- package/dist/node_modules/nodemailer/dist/cjs/addressparser/index.js +790 -0
- package/dist/node_modules/nodemailer/dist/cjs/base64/index.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/cjs/base64/index.js +119 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/index.d.ts +52 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/index.js +228 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.d.ts +48 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/message-parser.js +180 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/relaxed-body.js +148 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.d.ts +52 -0
- package/dist/node_modules/nodemailer/dist/cjs/dkim/sign.js +165 -0
- package/dist/node_modules/nodemailer/dist/cjs/errors.d.ts +96 -0
- package/dist/node_modules/nodemailer/dist/cjs/errors.js +70 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.d.ts +107 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/cookies.js +282 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/dist/cjs/fetch/index.js +384 -0
- package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.d.ts +64 -0
- package/dist/node_modules/nodemailer/dist/cjs/json-transport/index.js +99 -0
- package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.d.ts +174 -0
- package/dist/node_modules/nodemailer/dist/cjs/mail-composer/index.js +613 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/index.d.ts +237 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/index.js +415 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.d.ts +97 -0
- package/dist/node_modules/nodemailer/dist/cjs/mailer/mail-message.js +342 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.d.ts +161 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/index.js +787 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-funcs/mime-types.js +2103 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.d.ts +333 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/index.js +1493 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.d.ts +5 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/last-newline.js +32 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.d.ts +9 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-unix.js +40 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.d.ts +10 -0
- package/dist/node_modules/nodemailer/dist/cjs/mime-node/le-windows.js +47 -0
- package/dist/node_modules/nodemailer/dist/cjs/nodemailer.d.ts +124 -0
- package/dist/node_modules/nodemailer/dist/cjs/nodemailer.js +1 -0
- package/dist/node_modules/nodemailer/dist/cjs/package-info.d.ts +3 -0
- package/dist/node_modules/nodemailer/dist/cjs/package-info.js +7 -0
- package/dist/node_modules/nodemailer/dist/cjs/package.json +3 -0
- package/dist/node_modules/nodemailer/dist/cjs/punycode/index.d.ts +73 -0
- package/dist/node_modules/nodemailer/{lib → dist/cjs}/punycode/index.js +62 -111
- package/dist/node_modules/nodemailer/dist/cjs/qp/index.d.ts +32 -0
- package/dist/node_modules/nodemailer/dist/cjs/qp/index.js +207 -0
- package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.d.ts +69 -0
- package/dist/node_modules/nodemailer/dist/cjs/sendmail-transport/index.js +210 -0
- package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.d.ts +112 -0
- package/dist/node_modules/nodemailer/dist/cjs/ses-transport/index.js +252 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/index.d.ts +260 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/index.js +680 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/objects.d.ts +23 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/objects.js +43 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/url.d.ts +21 -0
- package/dist/node_modules/nodemailer/dist/cjs/shared/url.js +255 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.d.ts +15 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/data-stream.js +108 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.d.ts +47 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/http-proxy-client.js +189 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.d.ts +416 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-connection/index.js +1837 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.d.ts +133 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/index.js +569 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.d.ts +62 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-pool/pool-resource.js +257 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.d.ts +156 -0
- package/dist/node_modules/nodemailer/dist/cjs/smtp-transport/index.js +371 -0
- package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/dist/cjs/stream-transport/index.js +146 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/index.d.ts +35 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/index.js +41 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/services.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/cjs/well-known/services.js +674 -0
- package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.d.ts +201 -0
- package/dist/node_modules/nodemailer/dist/cjs/xoauth2/index.js +426 -0
- package/dist/node_modules/nodemailer/dist/esm/addressparser/index.d.ts +59 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/addressparser/index.js +361 -131
- package/dist/node_modules/nodemailer/dist/esm/base64/index.d.ts +36 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/base64/index.js +31 -56
- package/dist/node_modules/nodemailer/dist/esm/dkim/index.d.ts +52 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/index.js +49 -78
- package/dist/node_modules/nodemailer/dist/esm/dkim/message-parser.d.ts +48 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/message-parser.js +64 -42
- package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.d.ts +36 -0
- package/dist/node_modules/nodemailer/dist/esm/dkim/relaxed-body.js +141 -0
- package/dist/node_modules/nodemailer/dist/esm/dkim/sign.d.ts +52 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/dkim/sign.js +50 -46
- package/dist/node_modules/nodemailer/dist/esm/errors.d.ts +96 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/errors.js +26 -18
- package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.d.ts +107 -0
- package/dist/node_modules/nodemailer/dist/esm/fetch/cookies.js +242 -0
- package/dist/node_modules/nodemailer/dist/esm/fetch/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/fetch/index.js +80 -147
- package/dist/node_modules/nodemailer/dist/esm/json-transport/index.d.ts +64 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/json-transport/index.js +19 -39
- package/dist/node_modules/nodemailer/dist/esm/mail-composer/index.d.ts +174 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mail-composer/index.js +199 -265
- package/dist/node_modules/nodemailer/dist/esm/mailer/index.d.ts +237 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/index.js +128 -234
- package/dist/node_modules/nodemailer/dist/esm/mailer/mail-message.d.ts +97 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mailer/mail-message.js +62 -114
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.d.ts +161 -0
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/index.js +738 -0
- package/dist/node_modules/nodemailer/dist/esm/mime-funcs/mime-types.d.ts +2 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-funcs/mime-types.js +29 -42
- package/dist/node_modules/nodemailer/dist/esm/mime-node/index.d.ts +333 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/index.js +259 -372
- package/dist/node_modules/nodemailer/dist/esm/mime-node/last-newline.d.ts +5 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/last-newline.js +4 -10
- package/dist/node_modules/nodemailer/dist/esm/mime-node/le-unix.d.ts +9 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-unix.js +6 -11
- package/dist/node_modules/nodemailer/dist/esm/mime-node/le-windows.d.ts +10 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/mime-node/le-windows.js +6 -13
- package/dist/node_modules/nodemailer/dist/esm/nodemailer.d.ts +124 -0
- package/dist/node_modules/nodemailer/dist/esm/nodemailer.js +166 -0
- package/dist/node_modules/nodemailer/dist/esm/package-info.d.ts +3 -0
- package/dist/node_modules/nodemailer/dist/esm/package-info.js +4 -0
- package/dist/node_modules/nodemailer/dist/esm/package.json +3 -0
- package/dist/node_modules/nodemailer/dist/esm/punycode/index.d.ts +73 -0
- package/dist/node_modules/nodemailer/dist/esm/punycode/index.js +405 -0
- package/dist/node_modules/nodemailer/dist/esm/qp/index.d.ts +32 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/qp/index.js +38 -67
- package/dist/node_modules/nodemailer/dist/esm/sendmail-transport/index.d.ts +69 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/sendmail-transport/index.js +51 -101
- package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.d.ts +112 -0
- package/dist/node_modules/nodemailer/dist/esm/ses-transport/index.js +212 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/index.d.ts +260 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/index.js +156 -272
- package/dist/node_modules/nodemailer/dist/esm/shared/objects.d.ts +23 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/shared/objects.js +13 -17
- package/dist/node_modules/nodemailer/dist/esm/shared/url.d.ts +21 -0
- package/dist/node_modules/nodemailer/dist/esm/shared/url.js +214 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.d.ts +15 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/data-stream.js +103 -0
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/http-proxy-client.d.ts +47 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/http-proxy-client.js +49 -74
- package/dist/node_modules/nodemailer/dist/esm/smtp-connection/index.d.ts +416 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-connection/index.js +574 -794
- package/dist/node_modules/nodemailer/dist/esm/smtp-pool/index.d.ts +133 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/index.js +172 -284
- package/dist/node_modules/nodemailer/dist/esm/smtp-pool/pool-resource.d.ts +62 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-pool/pool-resource.js +57 -97
- package/dist/node_modules/nodemailer/dist/esm/smtp-transport/index.d.ts +156 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/smtp-transport/index.js +81 -179
- package/dist/node_modules/nodemailer/dist/esm/stream-transport/index.d.ts +65 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/stream-transport/index.js +36 -74
- package/dist/node_modules/nodemailer/dist/esm/well-known/index.d.ts +35 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/well-known/index.js +5 -16
- package/dist/node_modules/nodemailer/dist/esm/well-known/services.d.ts +2 -0
- package/dist/node_modules/nodemailer/dist/esm/well-known/services.js +671 -0
- package/dist/node_modules/nodemailer/dist/esm/xoauth2/index.d.ts +201 -0
- package/dist/node_modules/nodemailer/{lib → dist/esm}/xoauth2/index.js +125 -187
- package/dist/node_modules/nodemailer/{lib → dist}/well-known/services.json +9 -2
- package/dist/node_modules/nodemailer/package.json +1 -1
- package/package.json +3 -3
- package/dist/node_modules/nodemailer/.gitattributes +0 -6
- package/dist/node_modules/nodemailer/.ncurc.js +0 -9
- package/dist/node_modules/nodemailer/.prettierignore +0 -8
- package/dist/node_modules/nodemailer/.prettierrc +0 -12
- package/dist/node_modules/nodemailer/.prettierrc.js +0 -10
- package/dist/node_modules/nodemailer/.release-please-config.json +0 -9
- package/dist/node_modules/nodemailer/eslint.config.js +0 -88
- package/dist/node_modules/nodemailer/lib/dkim/relaxed-body.js +0 -154
- package/dist/node_modules/nodemailer/lib/fetch/cookies.js +0 -276
- package/dist/node_modules/nodemailer/lib/mime-funcs/index.js +0 -671
- package/dist/node_modules/nodemailer/lib/nodemailer.js +0 -1
- package/dist/node_modules/nodemailer/lib/ses-transport/index.js +0 -266
- package/dist/node_modules/nodemailer/lib/shared/url.js +0 -151
- package/dist/node_modules/nodemailer/lib/smtp-connection/data-stream.js +0 -105
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint no-console: 0 */
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.encodeXText = exports.assign = exports.parseDataURI = exports.callbackPromise = exports.getLogger = exports._logFunc = exports.parseConnectionUrl = exports.resolveHostname = exports.dnsCache = exports.networkInterfaces = exports._resetCacheCleanup = exports._lastCacheCleanup = exports.copyOwnKeys = exports.isProtoKey = void 0;
|
|
41
|
+
exports.resolveContent = resolveContent;
|
|
42
|
+
const urllib = __importStar(require("./url.js"));
|
|
43
|
+
const node_util_1 = __importDefault(require("node:util"));
|
|
44
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
45
|
+
const index_js_1 = __importDefault(require("../fetch/index.js"));
|
|
46
|
+
const errors = __importStar(require("../errors.js"));
|
|
47
|
+
const objects_js_1 = require("./objects.js");
|
|
48
|
+
Object.defineProperty(exports, "isProtoKey", { enumerable: true, get: function () { return objects_js_1.isProtoKey; } });
|
|
49
|
+
Object.defineProperty(exports, "copyOwnKeys", { enumerable: true, get: function () { return objects_js_1.copyOwnKeys; } });
|
|
50
|
+
const node_dns_1 = __importDefault(require("node:dns"));
|
|
51
|
+
const node_net_1 = __importDefault(require("node:net"));
|
|
52
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
53
|
+
const DNS_TTL = 5 * 60 * 1000;
|
|
54
|
+
const CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups
|
|
55
|
+
const MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache
|
|
56
|
+
let lastCacheCleanup = 0;
|
|
57
|
+
/** @internal */
|
|
58
|
+
const _lastCacheCleanup = () => lastCacheCleanup;
|
|
59
|
+
exports._lastCacheCleanup = _lastCacheCleanup;
|
|
60
|
+
/** @internal */
|
|
61
|
+
const _resetCacheCleanup = () => {
|
|
62
|
+
lastCacheCleanup = 0;
|
|
63
|
+
};
|
|
64
|
+
exports._resetCacheCleanup = _resetCacheCleanup;
|
|
65
|
+
try {
|
|
66
|
+
exports.networkInterfaces = node_os_1.default.networkInterfaces();
|
|
67
|
+
}
|
|
68
|
+
catch (_err) {
|
|
69
|
+
// fails on some systems
|
|
70
|
+
}
|
|
71
|
+
const isFamilySupported = (family, allowInternal) => {
|
|
72
|
+
const addresses = Object.values(exports.networkInterfaces || {}).flat();
|
|
73
|
+
if (!addresses.length) {
|
|
74
|
+
// hope for the best. Runtimes without an interface table (Cloudflare
|
|
75
|
+
// Workers) report an empty object rather than throwing
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return addresses.filter(i => !i.internal || allowInternal).some(i => i.family === 'IPv' + family || i.family === family);
|
|
79
|
+
};
|
|
80
|
+
const resolve = (family, hostname, options, callback) => {
|
|
81
|
+
options = options || {};
|
|
82
|
+
if (!isFamilySupported(family, options.allowInternalNetworkInterfaces)) {
|
|
83
|
+
return callback(null, []);
|
|
84
|
+
}
|
|
85
|
+
const dnsResolver = node_dns_1.default.Resolver ? new node_dns_1.default.Resolver(options) : node_dns_1.default;
|
|
86
|
+
dnsResolver['resolve' + family](hostname, (err, addresses) => {
|
|
87
|
+
if (err) {
|
|
88
|
+
switch (err.code) {
|
|
89
|
+
case node_dns_1.default.NODATA:
|
|
90
|
+
case node_dns_1.default.NOTFOUND:
|
|
91
|
+
case node_dns_1.default.NOTIMP:
|
|
92
|
+
case node_dns_1.default.SERVFAIL:
|
|
93
|
+
case node_dns_1.default.CONNREFUSED:
|
|
94
|
+
case node_dns_1.default.REFUSED:
|
|
95
|
+
case 'EAI_AGAIN':
|
|
96
|
+
return callback(null, []);
|
|
97
|
+
}
|
|
98
|
+
return callback(err);
|
|
99
|
+
}
|
|
100
|
+
return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
exports.dnsCache = new Map();
|
|
104
|
+
const formatDNSValue = (value, extra) => {
|
|
105
|
+
if (!value) {
|
|
106
|
+
return Object.assign({}, extra || {});
|
|
107
|
+
}
|
|
108
|
+
const addresses = value.addresses || [];
|
|
109
|
+
// Select a random address from available addresses, or null if none
|
|
110
|
+
const host = addresses.length > 0 ? addresses[Math.floor(Math.random() * addresses.length)] : null;
|
|
111
|
+
return Object.assign({
|
|
112
|
+
host,
|
|
113
|
+
// Include all addresses for connection fallback support
|
|
114
|
+
_addresses: addresses
|
|
115
|
+
}, extra || {});
|
|
116
|
+
};
|
|
117
|
+
const resolveHostname = (options, callback) => {
|
|
118
|
+
options = options || {};
|
|
119
|
+
if (!options.host && options.servername) {
|
|
120
|
+
options.host = options.servername;
|
|
121
|
+
}
|
|
122
|
+
if (!options.host || node_net_1.default.isIP(options.host)) {
|
|
123
|
+
// nothing to do here
|
|
124
|
+
const value = {
|
|
125
|
+
addresses: [options.host]
|
|
126
|
+
};
|
|
127
|
+
return callback(null, formatDNSValue(value, {
|
|
128
|
+
servername: options.servername || false,
|
|
129
|
+
cached: false
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
const host = options.host;
|
|
133
|
+
// The TLS server name belongs to the connection asking, not to the host it resolves. The
|
|
134
|
+
// cache is shared by every transport of the process and keyed by host alone, so a server
|
|
135
|
+
// name stored in it would be the one of whichever transport resolved the host first, and a
|
|
136
|
+
// later transport with its own tls.servername would present and verify that name instead
|
|
137
|
+
const servername = options.servername || host;
|
|
138
|
+
let cached;
|
|
139
|
+
if (exports.dnsCache.has(options.host)) {
|
|
140
|
+
cached = exports.dnsCache.get(options.host);
|
|
141
|
+
// Lazy cleanup with time throttling
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {
|
|
144
|
+
lastCacheCleanup = now;
|
|
145
|
+
// Clean up expired entries
|
|
146
|
+
for (const [host, entry] of exports.dnsCache.entries()) {
|
|
147
|
+
if (entry.expires && entry.expires < now) {
|
|
148
|
+
exports.dnsCache.delete(host);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// If cache is still too large, remove oldest entries
|
|
152
|
+
if (exports.dnsCache.size > MAX_CACHE_SIZE) {
|
|
153
|
+
const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries
|
|
154
|
+
const keys = Array.from(exports.dnsCache.keys()).slice(0, toDelete);
|
|
155
|
+
keys.forEach(key => exports.dnsCache.delete(key));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (!cached.expires || cached.expires >= now) {
|
|
159
|
+
return callback(null, formatDNSValue(cached.value, {
|
|
160
|
+
servername,
|
|
161
|
+
cached: true
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Resolve both IPv4 and IPv6 addresses for fallback support
|
|
166
|
+
let ipv4Addresses = [];
|
|
167
|
+
let ipv6Addresses = [];
|
|
168
|
+
let ipv4Error = null;
|
|
169
|
+
let ipv6Error = null;
|
|
170
|
+
resolve(4, options.host, options, (err, addresses) => {
|
|
171
|
+
if (err) {
|
|
172
|
+
ipv4Error = err;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
ipv4Addresses = addresses || [];
|
|
176
|
+
}
|
|
177
|
+
resolve(6, host, options, (err, addresses) => {
|
|
178
|
+
if (err) {
|
|
179
|
+
ipv6Error = err;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
ipv6Addresses = addresses || [];
|
|
183
|
+
}
|
|
184
|
+
// Combine addresses: IPv4 first, then IPv6
|
|
185
|
+
const allAddresses = ipv4Addresses.concat(ipv6Addresses);
|
|
186
|
+
if (allAddresses.length) {
|
|
187
|
+
const value = {
|
|
188
|
+
addresses: allAddresses
|
|
189
|
+
};
|
|
190
|
+
exports.dnsCache.set(host, {
|
|
191
|
+
value,
|
|
192
|
+
expires: Date.now() + (options.dnsTtl || DNS_TTL)
|
|
193
|
+
});
|
|
194
|
+
return callback(null, formatDNSValue(value, {
|
|
195
|
+
servername,
|
|
196
|
+
cached: false
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
// No addresses from resolve4/resolve6, try dns.lookup as fallback
|
|
200
|
+
if (ipv4Error && ipv6Error) {
|
|
201
|
+
// Both resolvers had errors
|
|
202
|
+
if (cached) {
|
|
203
|
+
exports.dnsCache.set(host, {
|
|
204
|
+
value: cached.value,
|
|
205
|
+
expires: Date.now() + (options.dnsTtl || DNS_TTL)
|
|
206
|
+
});
|
|
207
|
+
return callback(null, formatDNSValue(cached.value, {
|
|
208
|
+
servername,
|
|
209
|
+
cached: true,
|
|
210
|
+
error: ipv4Error
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
node_dns_1.default.lookup(host, { all: true }, (err, addresses) => {
|
|
216
|
+
if (err) {
|
|
217
|
+
if (cached) {
|
|
218
|
+
exports.dnsCache.set(host, {
|
|
219
|
+
value: cached.value,
|
|
220
|
+
expires: Date.now() + (options.dnsTtl || DNS_TTL)
|
|
221
|
+
});
|
|
222
|
+
return callback(null, formatDNSValue(cached.value, {
|
|
223
|
+
servername,
|
|
224
|
+
cached: true,
|
|
225
|
+
error: err
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
return callback(err);
|
|
229
|
+
}
|
|
230
|
+
// Get all supported addresses from dns.lookup
|
|
231
|
+
const supportedAddresses = addresses
|
|
232
|
+
? addresses.filter(addr => isFamilySupported(addr.family)).map(addr => addr.address)
|
|
233
|
+
: [];
|
|
234
|
+
if (addresses && addresses.length && !supportedAddresses.length) {
|
|
235
|
+
// there are addresses but none can be used
|
|
236
|
+
console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);
|
|
237
|
+
}
|
|
238
|
+
if (!supportedAddresses.length && cached) {
|
|
239
|
+
// nothing was found, fallback to cached value
|
|
240
|
+
return callback(null, formatDNSValue(cached.value, {
|
|
241
|
+
servername,
|
|
242
|
+
cached: true
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
const value = {
|
|
246
|
+
addresses: supportedAddresses.length ? supportedAddresses : [host]
|
|
247
|
+
};
|
|
248
|
+
exports.dnsCache.set(host, {
|
|
249
|
+
value,
|
|
250
|
+
expires: Date.now() + (options.dnsTtl || DNS_TTL)
|
|
251
|
+
});
|
|
252
|
+
return callback(null, formatDNSValue(value, {
|
|
253
|
+
servername,
|
|
254
|
+
cached: false
|
|
255
|
+
}));
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
catch (lookupErr) {
|
|
259
|
+
if (cached) {
|
|
260
|
+
exports.dnsCache.set(host, {
|
|
261
|
+
value: cached.value,
|
|
262
|
+
expires: Date.now() + (options.dnsTtl || DNS_TTL)
|
|
263
|
+
});
|
|
264
|
+
return callback(null, formatDNSValue(cached.value, {
|
|
265
|
+
servername,
|
|
266
|
+
cached: true,
|
|
267
|
+
error: lookupErr
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
return callback(ipv4Error || ipv6Error || lookupErr);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
};
|
|
275
|
+
exports.resolveHostname = resolveHostname;
|
|
276
|
+
/**
|
|
277
|
+
* Parses connection url to a structured configuration object
|
|
278
|
+
*
|
|
279
|
+
* @param str Connection url
|
|
280
|
+
* @return Configuration object
|
|
281
|
+
*/
|
|
282
|
+
const parseConnectionUrl = (str) => {
|
|
283
|
+
str = str || '';
|
|
284
|
+
const options = {};
|
|
285
|
+
const url = urllib.parse(str, true);
|
|
286
|
+
switch (url.protocol) {
|
|
287
|
+
case 'smtp:':
|
|
288
|
+
options.secure = false;
|
|
289
|
+
break;
|
|
290
|
+
case 'smtps:':
|
|
291
|
+
options.secure = true;
|
|
292
|
+
break;
|
|
293
|
+
case 'direct:':
|
|
294
|
+
options.direct = true;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
if (!isNaN(url.port) && Number(url.port)) {
|
|
298
|
+
options.port = Number(url.port);
|
|
299
|
+
}
|
|
300
|
+
if (url.hostname) {
|
|
301
|
+
options.host = url.hostname;
|
|
302
|
+
}
|
|
303
|
+
if (url.username || url.password) {
|
|
304
|
+
options.auth = {
|
|
305
|
+
user: url.username || '',
|
|
306
|
+
pass: url.password || ''
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
Object.keys(url.query || {}).forEach(key => {
|
|
310
|
+
let obj = options;
|
|
311
|
+
let lKey = key;
|
|
312
|
+
let value = url.query[key];
|
|
313
|
+
if (!isNaN(value)) {
|
|
314
|
+
value = Number(value);
|
|
315
|
+
}
|
|
316
|
+
switch (value) {
|
|
317
|
+
case 'true':
|
|
318
|
+
value = true;
|
|
319
|
+
break;
|
|
320
|
+
case 'false':
|
|
321
|
+
value = false;
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
// tls is nested object
|
|
325
|
+
if (key.indexOf('tls.') === 0) {
|
|
326
|
+
lKey = key.substr(4);
|
|
327
|
+
if (!options.tls) {
|
|
328
|
+
options.tls = {};
|
|
329
|
+
}
|
|
330
|
+
obj = options.tls;
|
|
331
|
+
}
|
|
332
|
+
else if (key.indexOf('.') >= 0) {
|
|
333
|
+
// ignore nested properties besides tls
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
// `in` already keeps "__proto__" out, but only as a side effect of it being an
|
|
337
|
+
// Object.prototype member. Say it, so the protection survives a change to the check
|
|
338
|
+
if (!(0, objects_js_1.isProtoKey)(lKey) && !(lKey in obj)) {
|
|
339
|
+
obj[lKey] = value;
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
return options;
|
|
343
|
+
};
|
|
344
|
+
exports.parseConnectionUrl = parseConnectionUrl;
|
|
345
|
+
/** @internal */
|
|
346
|
+
const _logFunc = (logger, level, defaults, data, message, ...args) => {
|
|
347
|
+
const entry = Object.assign({}, defaults || {}, data || {});
|
|
348
|
+
delete entry.level;
|
|
349
|
+
let logLevel = level;
|
|
350
|
+
if (typeof logger[logLevel] !== 'function') {
|
|
351
|
+
// Provided logger does not implement this level. Fall back to a
|
|
352
|
+
// lower-severity handler instead of throwing.
|
|
353
|
+
logLevel = ['info', 'debug', 'log', 'trace', 'warn', 'error'].find(name => typeof logger[name] === 'function');
|
|
354
|
+
}
|
|
355
|
+
if (logLevel) {
|
|
356
|
+
logger[logLevel](entry, message, ...args);
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
exports._logFunc = _logFunc;
|
|
360
|
+
/**
|
|
361
|
+
* Returns a bunyan-compatible logger interface. Uses either provided logger or
|
|
362
|
+
* creates a default console logger
|
|
363
|
+
*
|
|
364
|
+
* @param [options] Options object that might include 'logger' value
|
|
365
|
+
* @param [defaults] Fields merged into every log entry, overridden by the fields of the entry itself
|
|
366
|
+
* @return bunyan compatible logger
|
|
367
|
+
*/
|
|
368
|
+
const getLogger = (options, defaults) => {
|
|
369
|
+
options = options || {};
|
|
370
|
+
const response = {};
|
|
371
|
+
const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];
|
|
372
|
+
if (!options.logger) {
|
|
373
|
+
// use vanity logger
|
|
374
|
+
levels.forEach(level => {
|
|
375
|
+
response[level] = () => false;
|
|
376
|
+
});
|
|
377
|
+
return response;
|
|
378
|
+
}
|
|
379
|
+
const logger = options.logger === true ? createDefaultLogger(levels) : options.logger;
|
|
380
|
+
levels.forEach(level => {
|
|
381
|
+
response[level] = (...args) => {
|
|
382
|
+
// the bunyan forms: a data object first, or the message alone
|
|
383
|
+
const data = typeof args[0] === 'string' ? undefined : args.shift();
|
|
384
|
+
(0, exports._logFunc)(logger, level, defaults, data, ...args);
|
|
385
|
+
};
|
|
386
|
+
});
|
|
387
|
+
return response;
|
|
388
|
+
};
|
|
389
|
+
exports.getLogger = getLogger;
|
|
390
|
+
/**
|
|
391
|
+
* Wrapper for creating a callback that either resolves or rejects a promise
|
|
392
|
+
* based on input
|
|
393
|
+
*
|
|
394
|
+
* @param resolve Function to run if callback is called
|
|
395
|
+
* @param reject Function to run if callback ends with an error
|
|
396
|
+
*/
|
|
397
|
+
const callbackPromise = (resolve, reject) => function (...args) {
|
|
398
|
+
const err = args.shift();
|
|
399
|
+
if (err) {
|
|
400
|
+
reject(err);
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
resolve(...args);
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
exports.callbackPromise = callbackPromise;
|
|
407
|
+
const parseDataURI = (uri) => {
|
|
408
|
+
if (typeof uri !== 'string') {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
// Early return for non-data URIs to avoid unnecessary processing
|
|
412
|
+
if (!uri.startsWith('data:')) {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
// Find the first comma safely - this prevents ReDoS
|
|
416
|
+
const commaPos = uri.indexOf(',');
|
|
417
|
+
if (commaPos === -1) {
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
const data = uri.substring(commaPos + 1);
|
|
421
|
+
const metaStr = uri.substring('data:'.length, commaPos);
|
|
422
|
+
let encoding;
|
|
423
|
+
const metaEntries = metaStr.split(';');
|
|
424
|
+
if (metaEntries.length > 0) {
|
|
425
|
+
const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();
|
|
426
|
+
// Only recognize valid encoding types to prevent manipulation
|
|
427
|
+
if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {
|
|
428
|
+
encoding = lastEntry;
|
|
429
|
+
metaEntries.pop();
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';
|
|
433
|
+
const params = {};
|
|
434
|
+
for (let i = 0; i < metaEntries.length; i++) {
|
|
435
|
+
const entry = metaEntries[i];
|
|
436
|
+
const sepPos = entry.indexOf('=');
|
|
437
|
+
if (sepPos > 0) {
|
|
438
|
+
// Ensure there's a key before the '='
|
|
439
|
+
const key = entry.substring(0, sepPos).trim();
|
|
440
|
+
const value = entry.substring(sepPos + 1).trim();
|
|
441
|
+
if (key && !(0, objects_js_1.isProtoKey)(key)) {
|
|
442
|
+
params[key] = value;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Decode data based on encoding with proper error handling
|
|
447
|
+
let bufferData;
|
|
448
|
+
try {
|
|
449
|
+
if (encoding === 'base64') {
|
|
450
|
+
bufferData = Buffer.from(data, 'base64');
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
try {
|
|
454
|
+
bufferData = Buffer.from(decodeURIComponent(data));
|
|
455
|
+
}
|
|
456
|
+
catch (_decodeError) {
|
|
457
|
+
bufferData = Buffer.from(data);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
catch (_bufferError) {
|
|
462
|
+
bufferData = Buffer.alloc(0);
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
data: bufferData,
|
|
466
|
+
encoding: encoding || null,
|
|
467
|
+
contentType: contentType || 'application/octet-stream',
|
|
468
|
+
params
|
|
469
|
+
};
|
|
470
|
+
};
|
|
471
|
+
exports.parseDataURI = parseDataURI;
|
|
472
|
+
function resolveContent(data, key, options, callback) {
|
|
473
|
+
// options is optional; support the legacy resolveContent(data, key, callback) signature
|
|
474
|
+
if (!callback && typeof options === 'function') {
|
|
475
|
+
callback = options;
|
|
476
|
+
options = false;
|
|
477
|
+
}
|
|
478
|
+
options = options || {};
|
|
479
|
+
let promise;
|
|
480
|
+
if (!callback) {
|
|
481
|
+
promise = new Promise((resolve, reject) => {
|
|
482
|
+
callback = (0, exports.callbackPromise)(resolve, reject);
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
resolveContentValue(data, key, options, callback);
|
|
486
|
+
return promise;
|
|
487
|
+
}
|
|
488
|
+
function resolveContentValue(data, key, options, callback) {
|
|
489
|
+
let content = (data && data[key] && data[key].content) || data[key];
|
|
490
|
+
const encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')
|
|
491
|
+
.toString()
|
|
492
|
+
.toLowerCase()
|
|
493
|
+
.replace(/[-_\s]/g, '');
|
|
494
|
+
if (!content) {
|
|
495
|
+
return callback(null, content);
|
|
496
|
+
}
|
|
497
|
+
if (typeof content === 'object') {
|
|
498
|
+
if (typeof content.pipe === 'function') {
|
|
499
|
+
return resolveStream(content, (err, value) => {
|
|
500
|
+
if (err) {
|
|
501
|
+
return callback(err);
|
|
502
|
+
}
|
|
503
|
+
// we can't stream twice the same content, so we need
|
|
504
|
+
// to replace the stream object with the streaming result
|
|
505
|
+
if (data[key].content) {
|
|
506
|
+
data[key].content = value;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
data[key] = value;
|
|
510
|
+
}
|
|
511
|
+
callback(null, value);
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
else if (/^data:/i.test(content.path || content.href)) {
|
|
515
|
+
const parsedDataUri = (0, exports.parseDataURI)(content.path || content.href);
|
|
516
|
+
return callback(null, parsedDataUri && parsedDataUri.data ? parsedDataUri.data : Buffer.alloc(0));
|
|
517
|
+
}
|
|
518
|
+
else if (content.href || /^https?:\/\//i.test(content.path)) {
|
|
519
|
+
// An href is always a URL, and so is a path that looks like one. Let nmfetch
|
|
520
|
+
// decide whether it is fetchable, it validates the parsed URL. Testing the raw
|
|
521
|
+
// string here instead would let a file: href fall through to the "return as is"
|
|
522
|
+
// default below and travel on inside the resolved message.
|
|
523
|
+
const url = content.href || content.path;
|
|
524
|
+
if (options.disableUrlAccess) {
|
|
525
|
+
setImmediate(() => {
|
|
526
|
+
const err = new Error('Url access rejected for ' + url);
|
|
527
|
+
err.code = errors.EURLACCESS;
|
|
528
|
+
callback(err);
|
|
529
|
+
});
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
return resolveStream((0, index_js_1.default)(url, { headers: content.httpHeaders, tls: content.tls }), callback);
|
|
533
|
+
}
|
|
534
|
+
else if (content.path) {
|
|
535
|
+
if (options.disableFileAccess) {
|
|
536
|
+
setImmediate(() => {
|
|
537
|
+
const err = new Error('File access rejected for ' + content.path);
|
|
538
|
+
err.code = errors.EFILEACCESS;
|
|
539
|
+
callback(err);
|
|
540
|
+
});
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
return resolveStream(node_fs_1.default.createReadStream(content.path), callback);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {
|
|
547
|
+
content = Buffer.from(data[key].content, encoding);
|
|
548
|
+
}
|
|
549
|
+
// default action, return as is
|
|
550
|
+
setImmediate(() => callback(null, content));
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Copies properties from source objects to target objects
|
|
554
|
+
*/
|
|
555
|
+
const assign = function (...args) {
|
|
556
|
+
const target = args.shift() || {};
|
|
557
|
+
args.forEach(source => {
|
|
558
|
+
Object.keys(source || {}).forEach(key => {
|
|
559
|
+
if ((0, objects_js_1.isProtoKey)(key)) {
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
if (['tls', 'auth'].includes(key) &&
|
|
563
|
+
source[key] &&
|
|
564
|
+
typeof source[key] === 'object') {
|
|
565
|
+
// tls and auth are special keys that need to be enumerated separately
|
|
566
|
+
// other objects are passed as is. Enumerating is a copy of user supplied
|
|
567
|
+
// keys just like the loop above, so it gets the same treatment
|
|
568
|
+
target[key] = (0, objects_js_1.copyOwnKeys)(target[key] || {}, source[key]);
|
|
569
|
+
}
|
|
570
|
+
else {
|
|
571
|
+
target[key] = source[key];
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
});
|
|
575
|
+
return target;
|
|
576
|
+
};
|
|
577
|
+
exports.assign = assign;
|
|
578
|
+
const encodeXText = (str) => {
|
|
579
|
+
// ! 0x21
|
|
580
|
+
// + 0x2B
|
|
581
|
+
// = 0x3D
|
|
582
|
+
// ~ 0x7E
|
|
583
|
+
if (!/[^\x21-\x2A\x2C-\x3C\x3E-\x7E]/.test(str)) {
|
|
584
|
+
return str;
|
|
585
|
+
}
|
|
586
|
+
const buf = Buffer.from(str);
|
|
587
|
+
let result = '';
|
|
588
|
+
for (let i = 0, len = buf.length; i < len; i++) {
|
|
589
|
+
const c = buf[i];
|
|
590
|
+
if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {
|
|
591
|
+
result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
result += String.fromCharCode(c);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
return result;
|
|
598
|
+
};
|
|
599
|
+
exports.encodeXText = encodeXText;
|
|
600
|
+
/**
|
|
601
|
+
* Streams a stream value into a Buffer
|
|
602
|
+
*
|
|
603
|
+
* @param stream Readable stream
|
|
604
|
+
* @param callback Callback function with (err, value)
|
|
605
|
+
*/
|
|
606
|
+
function resolveStream(stream, callback) {
|
|
607
|
+
let responded = false;
|
|
608
|
+
const chunks = [];
|
|
609
|
+
let chunklen = 0;
|
|
610
|
+
stream.on('error', err => {
|
|
611
|
+
if (responded) {
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
responded = true;
|
|
615
|
+
callback(err);
|
|
616
|
+
});
|
|
617
|
+
stream.on('readable', () => {
|
|
618
|
+
let chunk;
|
|
619
|
+
while ((chunk = stream.read()) !== null) {
|
|
620
|
+
chunks.push(chunk);
|
|
621
|
+
chunklen += chunk.length;
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
stream.on('end', () => {
|
|
625
|
+
if (responded) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
responded = true;
|
|
629
|
+
let value;
|
|
630
|
+
try {
|
|
631
|
+
value = Buffer.concat(chunks, chunklen);
|
|
632
|
+
}
|
|
633
|
+
catch (E) {
|
|
634
|
+
return callback(E);
|
|
635
|
+
}
|
|
636
|
+
callback(null, value);
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Generates a bunyan-like logger that prints to console
|
|
641
|
+
*
|
|
642
|
+
* @returns Bunyan logger instance
|
|
643
|
+
*/
|
|
644
|
+
function createDefaultLogger(levels) {
|
|
645
|
+
const levelMaxLen = levels.reduce((max, level) => Math.max(max, level.length), 0);
|
|
646
|
+
const levelNames = new Map();
|
|
647
|
+
levels.forEach(level => {
|
|
648
|
+
let levelName = level.toUpperCase();
|
|
649
|
+
if (levelName.length < levelMaxLen) {
|
|
650
|
+
levelName += ' '.repeat(levelMaxLen - levelName.length);
|
|
651
|
+
}
|
|
652
|
+
levelNames.set(level, levelName);
|
|
653
|
+
});
|
|
654
|
+
const print = (level, entry, message, ...args) => {
|
|
655
|
+
let prefix = '';
|
|
656
|
+
if (entry) {
|
|
657
|
+
if (entry.tnx === 'server') {
|
|
658
|
+
prefix = 'S: ';
|
|
659
|
+
}
|
|
660
|
+
else if (entry.tnx === 'client') {
|
|
661
|
+
prefix = 'C: ';
|
|
662
|
+
}
|
|
663
|
+
if (entry.sid) {
|
|
664
|
+
prefix = '[' + entry.sid + '] ' + prefix;
|
|
665
|
+
}
|
|
666
|
+
if (entry.cid) {
|
|
667
|
+
prefix = '[#' + entry.cid + '] ' + prefix;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
message = node_util_1.default.format(message, ...args);
|
|
671
|
+
message.split(/\r?\n/).forEach((line) => {
|
|
672
|
+
console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);
|
|
673
|
+
});
|
|
674
|
+
};
|
|
675
|
+
const logger = {};
|
|
676
|
+
levels.forEach(level => {
|
|
677
|
+
logger[level] = print.bind(null, level);
|
|
678
|
+
});
|
|
679
|
+
return logger;
|
|
680
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects a key that can not be copied onto a plain object with `target[key] = value`.
|
|
3
|
+
*
|
|
4
|
+
* "__proto__" is the only one: assigning it runs the inherited setter and replaces the
|
|
5
|
+
* prototype of the target instead of adding a property to it, so a caller can smuggle
|
|
6
|
+
* values past validation that only inspects own keys. JSON.parse produces such a key
|
|
7
|
+
* where an object literal can not. "constructor" and "prototype" have no such setter and
|
|
8
|
+
* become ordinary own properties, so dropping them would only discard legitimate values.
|
|
9
|
+
*
|
|
10
|
+
* @param key Key to check
|
|
11
|
+
* @returns true if the key must not be copied
|
|
12
|
+
*/
|
|
13
|
+
export declare const isProtoKey: (key: string) => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Copies own enumerable keys from a source object to a target object. Every copy that
|
|
16
|
+
* walks the keys of user supplied data goes through here, see isProtoKey.
|
|
17
|
+
*
|
|
18
|
+
* @param target Object to copy the keys to
|
|
19
|
+
* @param source Object to copy the keys from
|
|
20
|
+
* @param [skip] Optional predicate, return true to leave a key out
|
|
21
|
+
* @returns The target object
|
|
22
|
+
*/
|
|
23
|
+
export declare const copyOwnKeys: <T extends object>(target: T, source: object | null | undefined, skip?: (key: string) => boolean) => T;
|