@serveryyswys/node.operit 0.0.0-stage → 0.1.2

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 (123) hide show
  1. package/BUILTINS.json +233 -0
  2. package/DESIGN.md +513 -0
  3. package/LICENSE +674 -0
  4. package/README.md +301 -2
  5. package/dist/assert/strict.d.ts +2 -0
  6. package/dist/assert/strict.js +7 -0
  7. package/dist/assert.d.ts +3 -0
  8. package/dist/assert.js +483 -0
  9. package/dist/buffer.d.ts +60 -0
  10. package/dist/buffer.js +524 -0
  11. package/dist/child_process.d.ts +56 -0
  12. package/dist/child_process.js +371 -0
  13. package/dist/constants.d.ts +2 -0
  14. package/dist/constants.js +19 -0
  15. package/dist/crypto.d.ts +76 -0
  16. package/dist/crypto.js +312 -0
  17. package/dist/dns/promises.d.ts +34 -0
  18. package/dist/dns/promises.js +190 -0
  19. package/dist/dns.d.ts +88 -0
  20. package/dist/dns.js +259 -0
  21. package/dist/events.d.ts +40 -0
  22. package/dist/events.js +237 -0
  23. package/dist/fs/promises.d.ts +159 -0
  24. package/dist/fs/promises.js +129 -0
  25. package/dist/fs.d.ts +221 -0
  26. package/dist/fs.js +944 -0
  27. package/dist/http.d.ts +92 -0
  28. package/dist/http.js +319 -0
  29. package/dist/https.d.ts +296 -0
  30. package/dist/https.js +50 -0
  31. package/dist/index.d.ts +2422 -0
  32. package/dist/index.js +57 -0
  33. package/dist/lib/bridge.d.ts +60 -0
  34. package/dist/lib/bridge.js +205 -0
  35. package/dist/lib/bytes.d.ts +20 -0
  36. package/dist/lib/bytes.js +239 -0
  37. package/dist/lib/child-process-types.d.ts +45 -0
  38. package/dist/lib/child-process-types.js +2 -0
  39. package/dist/lib/cwd.d.ts +2 -0
  40. package/dist/lib/cwd.js +32 -0
  41. package/dist/lib/deep-equal.d.ts +3 -0
  42. package/dist/lib/deep-equal.js +223 -0
  43. package/dist/lib/deflate.d.ts +2 -0
  44. package/dist/lib/deflate.js +234 -0
  45. package/dist/lib/dns-driver.d.ts +14 -0
  46. package/dist/lib/dns-driver.js +85 -0
  47. package/dist/lib/dns-types.d.ts +22 -0
  48. package/dist/lib/dns-types.js +2 -0
  49. package/dist/lib/errors.d.ts +48 -0
  50. package/dist/lib/errors.js +424 -0
  51. package/dist/lib/fs-driver.d.ts +70 -0
  52. package/dist/lib/fs-driver.js +364 -0
  53. package/dist/lib/fs-env.d.ts +30 -0
  54. package/dist/lib/fs-env.js +157 -0
  55. package/dist/lib/fs-types.d.ts +19 -0
  56. package/dist/lib/fs-types.js +2 -0
  57. package/dist/lib/hashes.d.ts +27 -0
  58. package/dist/lib/hashes.js +432 -0
  59. package/dist/lib/http-driver.d.ts +30 -0
  60. package/dist/lib/http-driver.js +72 -0
  61. package/dist/lib/http-types.d.ts +18 -0
  62. package/dist/lib/http-types.js +2 -0
  63. package/dist/lib/inflate.d.ts +6 -0
  64. package/dist/lib/inflate.js +284 -0
  65. package/dist/lib/path-types.d.ts +37 -0
  66. package/dist/lib/path-types.js +2 -0
  67. package/dist/lib/paths.d.ts +8 -0
  68. package/dist/lib/paths.js +106 -0
  69. package/dist/lib/perf-hooks-types.d.ts +18 -0
  70. package/dist/lib/perf-hooks-types.js +2 -0
  71. package/dist/lib/process-driver.d.ts +31 -0
  72. package/dist/lib/process-driver.js +102 -0
  73. package/dist/lib/punycode.d.ts +8 -0
  74. package/dist/lib/punycode.js +179 -0
  75. package/dist/lib/stream-types.d.ts +29 -0
  76. package/dist/lib/stream-types.js +2 -0
  77. package/dist/lib/timers-types.d.ts +18 -0
  78. package/dist/lib/timers-types.js +2 -0
  79. package/dist/lib/url-search-params.d.ts +26 -0
  80. package/dist/lib/url-search-params.js +281 -0
  81. package/dist/lib/url-types.d.ts +44 -0
  82. package/dist/lib/url-types.js +2 -0
  83. package/dist/lib/url-whatwg.d.ts +78 -0
  84. package/dist/lib/url-whatwg.js +857 -0
  85. package/dist/lib/zlib-types.d.ts +12 -0
  86. package/dist/lib/zlib-types.js +2 -0
  87. package/dist/module.d.ts +8 -0
  88. package/dist/module.js +72 -0
  89. package/dist/os.d.ts +80 -0
  90. package/dist/os.js +247 -0
  91. package/dist/path/posix.d.ts +2 -0
  92. package/dist/path/posix.js +7 -0
  93. package/dist/path/win32.d.ts +2 -0
  94. package/dist/path/win32.js +10 -0
  95. package/dist/path.d.ts +3 -0
  96. package/dist/path.js +1222 -0
  97. package/dist/perf_hooks.d.ts +36 -0
  98. package/dist/perf_hooks.js +144 -0
  99. package/dist/process.d.ts +69 -0
  100. package/dist/process.js +230 -0
  101. package/dist/querystring.d.ts +15 -0
  102. package/dist/querystring.js +209 -0
  103. package/dist/stream/promises.d.ts +5 -0
  104. package/dist/stream/promises.js +10 -0
  105. package/dist/stream.d.ts +84 -0
  106. package/dist/stream.js +875 -0
  107. package/dist/string_decoder.d.ts +15 -0
  108. package/dist/string_decoder.js +237 -0
  109. package/dist/timers/promises.d.ts +19 -0
  110. package/dist/timers/promises.js +74 -0
  111. package/dist/timers.d.ts +21 -0
  112. package/dist/timers.js +41 -0
  113. package/dist/tty.d.ts +9 -0
  114. package/dist/tty.js +25 -0
  115. package/dist/unsupported.d.ts +12 -0
  116. package/dist/unsupported.js +17 -0
  117. package/dist/url.d.ts +28 -0
  118. package/dist/url.js +486 -0
  119. package/dist/util.d.ts +74 -0
  120. package/dist/util.js +515 -0
  121. package/dist/zlib.d.ts +88 -0
  122. package/dist/zlib.js +371 -0
  123. package/package.json +29 -4
package/dist/crypto.js ADDED
@@ -0,0 +1,312 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ /**
36
+ * Node crypto 模块的移植。
37
+ *
38
+ * 覆盖范围:
39
+ * createHash / createHmac / pbkdf2Sync / pbkdf2 / randomBytes / randomFillSync
40
+ * randomUUID / randomInt / timingSafeEqual / getHashes / constants
41
+ *
42
+ * 不覆盖(调用即显式抛错,不静默):createCipheriv / createDecipheriv / createSign /
43
+ * createVerify / generateKeyPair(一个) / createDiffieHellman —— 见 BUILTINS.json。
44
+ *
45
+ * 随机数来源用 java.util.UUID.randomUUID():它由 SecureRandom 支撑,
46
+ * 每次调用给 16 字节强熵,而且**不需要往 bridge 传 byte[]**(那是本库最不确定的一段)。
47
+ *
48
+ * 哈希是纯 JS 实现(lib/hashes),因为运行时注入的 CryptoJS 只是个 4KB shim,
49
+ * 只有 MD5(string) 与 AES.decrypt,撑不起 crypto 模块。
50
+ */
51
+ const bridge = __importStar(require("./lib/bridge"));
52
+ const hashes = __importStar(require("./lib/hashes"));
53
+ const buffer_1 = require("./buffer");
54
+ const errors_1 = require("./lib/errors");
55
+ function toBytes(data, encoding) {
56
+ if (typeof data === 'string') {
57
+ return buffer_1.Buffer.from(data, (encoding === undefined ? 'utf8' : encoding));
58
+ }
59
+ if (data instanceof Uint8Array) {
60
+ return data;
61
+ }
62
+ if (data instanceof ArrayBuffer) {
63
+ return new Uint8Array(data);
64
+ }
65
+ throw new TypeError('The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView.');
66
+ }
67
+ function concatChunks(chunks, totalLength) {
68
+ const out = new Uint8Array(totalLength);
69
+ let offset = 0;
70
+ for (let i = 0; i < chunks.length; i += 1) {
71
+ out.set(chunks[i], offset);
72
+ offset += chunks[i].length;
73
+ }
74
+ return out;
75
+ }
76
+ class Hash {
77
+ constructor(algorithm) {
78
+ this.chunks = [];
79
+ this.total = 0;
80
+ this.finalized = false;
81
+ this.spec = hashes.resolveAlgorithm(algorithm);
82
+ }
83
+ update(data, inputEncoding) {
84
+ if (this.finalized) {
85
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'Hash.digest() 之后不能再 update()。');
86
+ }
87
+ const bytes = toBytes(data, inputEncoding);
88
+ this.chunks.push(bytes);
89
+ this.total += bytes.length;
90
+ return this;
91
+ }
92
+ digest(encoding) {
93
+ if (this.finalized) {
94
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'Hash.digest() 只能调用一次。');
95
+ }
96
+ this.finalized = true;
97
+ const result = buffer_1.Buffer.from(this.spec.compute(concatChunks(this.chunks, this.total)));
98
+ this.chunks = [];
99
+ this.total = 0;
100
+ return encoding === undefined ? result : result.toString(encoding);
101
+ }
102
+ copy() {
103
+ const clone = new Hash(this.spec.name);
104
+ clone.chunks = this.chunks.slice();
105
+ clone.total = this.total;
106
+ return clone;
107
+ }
108
+ }
109
+ class Hmac {
110
+ constructor(algorithm, key, keyEncoding) {
111
+ this.chunks = [];
112
+ this.total = 0;
113
+ this.finalized = false;
114
+ this.spec = hashes.resolveAlgorithm(algorithm);
115
+ this.key = toBytes(key, keyEncoding);
116
+ }
117
+ update(data, inputEncoding) {
118
+ if (this.finalized) {
119
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'Hmac.digest() 之后不能再 update()。');
120
+ }
121
+ const bytes = toBytes(data, inputEncoding);
122
+ this.chunks.push(bytes);
123
+ this.total += bytes.length;
124
+ return this;
125
+ }
126
+ digest(encoding) {
127
+ if (this.finalized) {
128
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'Hmac.digest() 只能调用一次。');
129
+ }
130
+ this.finalized = true;
131
+ const message = concatChunks(this.chunks, this.total);
132
+ const result = buffer_1.Buffer.from(hashes.hmac(this.spec, this.key, message));
133
+ this.chunks = [];
134
+ this.total = 0;
135
+ return encoding === undefined ? result : result.toString(encoding);
136
+ }
137
+ }
138
+ function createHash(algorithm, options) {
139
+ void options;
140
+ return new Hash(algorithm);
141
+ }
142
+ function createHmac(algorithm, key, options) {
143
+ return new Hmac(algorithm, key, options === undefined ? undefined : options.encoding);
144
+ }
145
+ /**
146
+ * 用 UUID.randomUUID() 填满目标缓冲区:每次 16 字节强熵,且不需要传 byte[]。
147
+ */
148
+ function fillRandom(target) {
149
+ let offset = 0;
150
+ while (offset < target.length) {
151
+ const uuid = bridge.callStatic('java.util.UUID', 'randomUUID', []);
152
+ const text = String(bridge.callInstance(uuid, 'toString', []));
153
+ const hex = text.replace(/-/g, '');
154
+ for (let i = 0; i + 1 < hex.length && offset < target.length; i += 2) {
155
+ target[offset] = parseInt(hex.slice(i, i + 2), 16);
156
+ offset += 1;
157
+ }
158
+ }
159
+ return target;
160
+ }
161
+ function randomBytes(size, callback) {
162
+ if (typeof size !== 'number' || size < 0 || !isFinite(size)) {
163
+ throw new RangeError('The value of "size" is out of range.');
164
+ }
165
+ const buffer = buffer_1.Buffer.from(fillRandom(new Uint8Array(Math.floor(size))));
166
+ if (callback !== undefined) {
167
+ callback(null, buffer);
168
+ return undefined;
169
+ }
170
+ return buffer;
171
+ }
172
+ function randomFillSync(buffer) {
173
+ if (!(buffer instanceof Uint8Array)) {
174
+ throw new TypeError('The "buffer" argument must be an instance of Buffer or Uint8Array.');
175
+ }
176
+ return fillRandom(buffer);
177
+ }
178
+ function randomUUID() {
179
+ const uuid = bridge.callStatic('java.util.UUID', 'randomUUID', []);
180
+ return String(bridge.callInstance(uuid, 'toString', []));
181
+ }
182
+ function unbiasedBelow(limit) {
183
+ if (limit <= 0) {
184
+ throw new RangeError('The value of "max" is out of range.');
185
+ }
186
+ if (limit === 1) {
187
+ return 0;
188
+ }
189
+ // 48 位样本 + 拒绝采样,避免取模偏置
190
+ const ceiling = Math.floor(281474976710656 / limit) * limit;
191
+ const sample = new Uint8Array(6);
192
+ for (;;) {
193
+ fillRandom(sample);
194
+ let value = 0;
195
+ for (let i = 0; i < 6; i += 1) {
196
+ value = value * 256 + sample[i];
197
+ }
198
+ if (value < ceiling) {
199
+ return value % limit;
200
+ }
201
+ }
202
+ }
203
+ function randomInt(min, max, callback) {
204
+ // Node 有 randomInt(max) 与 randomInt(min, max) 两种形式
205
+ let low = 0;
206
+ let high;
207
+ let done = callback;
208
+ if (typeof max === 'function') {
209
+ done = max;
210
+ high = min;
211
+ }
212
+ else if (max === undefined) {
213
+ high = min;
214
+ }
215
+ else {
216
+ low = min;
217
+ high = max;
218
+ }
219
+ if (high <= low) {
220
+ throw new RangeError('The value of "max" is out of range. It must be greater than the value of "min".');
221
+ }
222
+ const value = low + unbiasedBelow(high - low);
223
+ if (done !== undefined) {
224
+ done(null, value);
225
+ return undefined;
226
+ }
227
+ return value;
228
+ }
229
+ function timingSafeEqual(left, right) {
230
+ if (!(left instanceof Uint8Array) || !(right instanceof Uint8Array)) {
231
+ throw new TypeError('The "buf1" and "buf2" arguments must be Buffer or Uint8Array.');
232
+ }
233
+ if (left.length !== right.length) {
234
+ const error = new RangeError('Input buffers must have the same byte length');
235
+ error.code = 'ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH';
236
+ throw error;
237
+ }
238
+ let difference = 0;
239
+ for (let i = 0; i < left.length; i += 1) {
240
+ difference |= left[i] ^ right[i];
241
+ }
242
+ return difference === 0;
243
+ }
244
+ function pbkdf2Sync(password, salt, iterations, keylen, digest) {
245
+ const spec = hashes.resolveAlgorithm(digest);
246
+ return buffer_1.Buffer.from(hashes.pbkdf2(spec, toBytes(password, 'utf8'), toBytes(salt, 'utf8'), iterations, keylen));
247
+ }
248
+ function pbkdf2(password, salt, iterations, keylen, digest, callback) {
249
+ callback(null, pbkdf2Sync(password, salt, iterations, keylen, digest));
250
+ }
251
+ function getHashes() {
252
+ return hashes.hashNames();
253
+ }
254
+ function getCiphers() {
255
+ // 未实现任何分组密码,因此这里如实为空
256
+ return [];
257
+ }
258
+ function unsupported(name) {
259
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'crypto.' + name + '() 尚未实现(见 BUILTINS.json)。');
260
+ }
261
+ function createCipheriv() {
262
+ return unsupported('createCipheriv');
263
+ }
264
+ function createDecipheriv() {
265
+ return unsupported('createDecipheriv');
266
+ }
267
+ function createSign() {
268
+ return unsupported('createSign');
269
+ }
270
+ function createVerify() {
271
+ return unsupported('createVerify');
272
+ }
273
+ function generateKeyPairSync() {
274
+ return unsupported('generateKeyPairSync');
275
+ }
276
+ function createDiffieHellman() {
277
+ return unsupported('createDiffieHellman');
278
+ }
279
+ const constants = {
280
+ RSA_PKCS1_PADDING: 1,
281
+ RSA_NO_PADDING: 3,
282
+ RSA_PKCS1_OAEP_PADDING: 4,
283
+ RSA_X931_PADDING: 5,
284
+ RSA_PKCS1_PSS_PADDING: 6,
285
+ SSL_OP_ALL: 0,
286
+ SSL_OP_NO_SSLv2: 0,
287
+ SSL_OP_NO_SSLv3: 0,
288
+ SSL_OP_NO_TLSv1: 0
289
+ };
290
+ const crypto = {
291
+ createHash: createHash,
292
+ createHmac: createHmac,
293
+ randomBytes: randomBytes,
294
+ randomFillSync: randomFillSync,
295
+ randomUUID: randomUUID,
296
+ randomInt: randomInt,
297
+ timingSafeEqual: timingSafeEqual,
298
+ pbkdf2Sync: pbkdf2Sync,
299
+ pbkdf2: pbkdf2,
300
+ getHashes: getHashes,
301
+ getCiphers: getCiphers,
302
+ createCipheriv: createCipheriv,
303
+ createDecipheriv: createDecipheriv,
304
+ createSign: createSign,
305
+ createVerify: createVerify,
306
+ generateKeyPairSync: generateKeyPairSync,
307
+ createDiffieHellman: createDiffieHellman,
308
+ constants: constants,
309
+ Hash: Hash,
310
+ Hmac: Hmac
311
+ };
312
+ module.exports = crypto;
@@ -0,0 +1,34 @@
1
+ import type { LookupOptions } from '../lib/dns-types';
2
+ declare function lookup(hostname: unknown, options?: number | LookupOptions): Promise<unknown>;
3
+ declare function lookupService(address: unknown, port: unknown): Promise<{
4
+ hostname: string;
5
+ service: string;
6
+ }>;
7
+ declare function getServers(): string[];
8
+ declare function setServers(): never;
9
+ declare function getDefaultResultOrder(): string;
10
+ declare function setDefaultResultOrder(order: unknown): void;
11
+ declare const api: {
12
+ lookup: typeof lookup;
13
+ lookupService: typeof lookupService;
14
+ resolve: () => never;
15
+ resolve4: () => never;
16
+ resolve6: () => never;
17
+ resolveAny: () => never;
18
+ resolveCaa: () => never;
19
+ resolveCname: () => never;
20
+ resolveMx: () => never;
21
+ resolveNaptr: () => never;
22
+ resolveNs: () => never;
23
+ resolvePtr: () => never;
24
+ resolveSoa: () => never;
25
+ resolveSrv: () => never;
26
+ resolveTlsa: () => never;
27
+ resolveTxt: () => never;
28
+ reverse: () => never;
29
+ getServers: typeof getServers;
30
+ setServers: typeof setServers;
31
+ getDefaultResultOrder: typeof getDefaultResultOrder;
32
+ setDefaultResultOrder: typeof setDefaultResultOrder;
33
+ };
34
+ export = api;
@@ -0,0 +1,190 @@
1
+ 'use strict';
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ /**
36
+ * dns/promises 子路径入口。
37
+ *
38
+ * 与 `require('dns').promises` 是同一份实现:lookup / lookupService / getServers /
39
+ * setDefaultResultOrder 等。resolve 一族同样显式抛 ONJ_UNSUPPORTED(原因见 dns.ts)。
40
+ */
41
+ const errors_1 = require("../lib/errors");
42
+ const dnsDriver = __importStar(require("../lib/dns-driver"));
43
+ const GETADDRINFO_ERRNO = {
44
+ ENOTFOUND: -3008,
45
+ EAI_AGAIN: -3001,
46
+ EAI_FAIL: -3003,
47
+ EAI_NODATA: -3006,
48
+ EAI_NONAME: -3007,
49
+ ENODATA: -3006
50
+ };
51
+ const SERVICE_NAMES = {
52
+ 20: 'ftp-data', 21: 'ftp', 22: 'ssh', 23: 'telnet', 25: 'smtp', 53: 'domain',
53
+ 80: 'http', 110: 'pop3', 143: 'imap', 443: 'https', 465: 'smtps', 587: 'submission',
54
+ 993: 'imaps', 995: 'pop3s', 3306: 'mysql', 5432: 'postgresql', 6379: 'redis',
55
+ 8080: 'http-alt', 8443: 'https-alt'
56
+ };
57
+ let resultOrder = 'verbatim';
58
+ function dnsFailure(code, hostname) {
59
+ const error = new Error('getaddrinfo ' + code + ' ' + hostname);
60
+ error.code = code;
61
+ error.errno = GETADDRINFO_ERRNO[code] === undefined ? -3008 : GETADDRINFO_ERRNO[code];
62
+ error.syscall = 'getaddrinfo';
63
+ error.hostname = hostname;
64
+ return error;
65
+ }
66
+ function codeForFailure(failure) {
67
+ const mapped = failure;
68
+ if (mapped.code === 'ENOTFOUND' || mapped.code === 'EAI_AGAIN') {
69
+ return mapped.code;
70
+ }
71
+ const message = mapped.message === undefined ? '' : mapped.message;
72
+ if (/temporary failure in name resolution|unable to resolve host/i.test(message)) {
73
+ return 'EAI_AGAIN';
74
+ }
75
+ return 'ENOTFOUND';
76
+ }
77
+ function serviceNameOf(port) {
78
+ const known = SERVICE_NAMES[port];
79
+ return known === undefined ? String(port) : known;
80
+ }
81
+ function normalizeOptions(options) {
82
+ let family = 0;
83
+ let all = false;
84
+ let verbatim = resultOrder === 'verbatim';
85
+ if (typeof options === 'number') {
86
+ family = options;
87
+ }
88
+ else if (options !== undefined && options !== null) {
89
+ if (typeof options.family === 'number') {
90
+ family = options.family;
91
+ }
92
+ all = options.all === true;
93
+ if (typeof options.verbatim === 'boolean') {
94
+ verbatim = options.verbatim;
95
+ }
96
+ }
97
+ return { family: family, all: all, verbatim: verbatim };
98
+ }
99
+ function lookup(hostname, options) {
100
+ const host = String(hostname);
101
+ const settings = normalizeOptions(options);
102
+ return new Promise(function (resolve, reject) {
103
+ let records;
104
+ try {
105
+ records = dnsDriver.getDriver().lookup(host);
106
+ }
107
+ catch (failure) {
108
+ reject(dnsFailure(codeForFailure(failure), host));
109
+ return;
110
+ }
111
+ let filtered = records;
112
+ if (settings.family === 4 || settings.family === 6) {
113
+ filtered = records.filter(function (record) { return record.family === settings.family; });
114
+ }
115
+ if (!settings.verbatim) {
116
+ filtered = filtered.slice().sort(function (left, right) { return left.family - right.family; });
117
+ }
118
+ if (filtered.length === 0) {
119
+ reject(dnsFailure('ENOTFOUND', host));
120
+ return;
121
+ }
122
+ if (settings.all) {
123
+ resolve(filtered);
124
+ return;
125
+ }
126
+ resolve({ address: filtered[0].address, family: filtered[0].family });
127
+ });
128
+ }
129
+ function lookupService(address, port) {
130
+ const target = String(address);
131
+ const numericPort = Number(port);
132
+ return new Promise(function (resolve, reject) {
133
+ try {
134
+ resolve({
135
+ hostname: dnsDriver.getDriver().canonicalNameOf(target),
136
+ service: serviceNameOf(numericPort)
137
+ });
138
+ }
139
+ catch (failure) {
140
+ reject(dnsFailure(codeForFailure(failure), target));
141
+ }
142
+ });
143
+ }
144
+ function getServers() {
145
+ return [];
146
+ }
147
+ function setServers() {
148
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'dns.setServers() 无法实现:JVM 的解析器配置改不了(Android 由 netd 按网络管理)。');
149
+ }
150
+ function getDefaultResultOrder() {
151
+ return resultOrder;
152
+ }
153
+ function setDefaultResultOrder(order) {
154
+ const value = String(order);
155
+ if (value !== 'verbatim' && value !== 'ipv4first' && value !== 'ipv6first') {
156
+ throw new TypeError('Invalid result order: ' + value);
157
+ }
158
+ resultOrder = value;
159
+ }
160
+ function unsupportedResolve(name) {
161
+ return function () {
162
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'dns.promises.' + name + '() 需要 DNS 记录级查询,而这要 JNDI 的 DNS provider —— ' +
163
+ 'com.sun.jndi.dns 不在 Android 里,所以这个能力在本平台不成立。' +
164
+ '需要解析主机名请用 dns.promises.lookup()(getaddrinfo)。');
165
+ };
166
+ }
167
+ const api = {
168
+ lookup: lookup,
169
+ lookupService: lookupService,
170
+ resolve: unsupportedResolve('resolve'),
171
+ resolve4: unsupportedResolve('resolve4'),
172
+ resolve6: unsupportedResolve('resolve6'),
173
+ resolveAny: unsupportedResolve('resolveAny'),
174
+ resolveCaa: unsupportedResolve('resolveCaa'),
175
+ resolveCname: unsupportedResolve('resolveCname'),
176
+ resolveMx: unsupportedResolve('resolveMx'),
177
+ resolveNaptr: unsupportedResolve('resolveNaptr'),
178
+ resolveNs: unsupportedResolve('resolveNs'),
179
+ resolvePtr: unsupportedResolve('resolvePtr'),
180
+ resolveSoa: unsupportedResolve('resolveSoa'),
181
+ resolveSrv: unsupportedResolve('resolveSrv'),
182
+ resolveTlsa: unsupportedResolve('resolveTlsa'),
183
+ resolveTxt: unsupportedResolve('resolveTxt'),
184
+ reverse: unsupportedResolve('reverse'),
185
+ getServers: getServers,
186
+ setServers: setServers,
187
+ getDefaultResultOrder: getDefaultResultOrder,
188
+ setDefaultResultOrder: setDefaultResultOrder
189
+ };
190
+ module.exports = api;
package/dist/dns.d.ts ADDED
@@ -0,0 +1,88 @@
1
+ import type { LookupOptions } from './lib/dns-types';
2
+ declare function lookup(hostname: unknown, options?: number | LookupOptions | ((...args: unknown[]) => void), callback?: (...args: unknown[]) => void): void;
3
+ declare function lookupService(address: unknown, port: unknown, callback: (...args: unknown[]) => void): void;
4
+ /** Node 在 Android 这样的平台上读不到解析器配置,这里如实返回空数组。 */
5
+ declare function getServers(): string[];
6
+ declare function setServers(): never;
7
+ declare function getDefaultResultOrder(): string;
8
+ declare function setDefaultResultOrder(order: unknown): void;
9
+ declare function Resolver(): never;
10
+ declare const api: {
11
+ lookup: typeof lookup;
12
+ lookupService: typeof lookupService;
13
+ resolve: () => never;
14
+ resolve4: () => never;
15
+ resolve6: () => never;
16
+ resolveAny: () => never;
17
+ resolveCaa: () => never;
18
+ resolveCname: () => never;
19
+ resolveMx: () => never;
20
+ resolveNaptr: () => never;
21
+ resolveNs: () => never;
22
+ resolvePtr: () => never;
23
+ resolveSoa: () => never;
24
+ resolveSrv: () => never;
25
+ resolveTlsa: () => never;
26
+ resolveTxt: () => never;
27
+ reverse: () => never;
28
+ getServers: typeof getServers;
29
+ setServers: typeof setServers;
30
+ getDefaultResultOrder: typeof getDefaultResultOrder;
31
+ setDefaultResultOrder: typeof setDefaultResultOrder;
32
+ Resolver: typeof Resolver;
33
+ promises: {
34
+ lookup: (hostname: unknown, options?: number | LookupOptions) => Promise<unknown>;
35
+ lookupService: (address: unknown, port: unknown) => Promise<{
36
+ hostname: string;
37
+ service: string;
38
+ }>;
39
+ resolve: () => never;
40
+ resolve4: () => never;
41
+ resolve6: () => never;
42
+ resolveAny: () => never;
43
+ resolveCaa: () => never;
44
+ resolveCname: () => never;
45
+ resolveMx: () => never;
46
+ resolveNaptr: () => never;
47
+ resolveNs: () => never;
48
+ resolvePtr: () => never;
49
+ resolveSoa: () => never;
50
+ resolveSrv: () => never;
51
+ resolveTlsa: () => never;
52
+ resolveTxt: () => never;
53
+ reverse: () => never;
54
+ getServers: () => string[];
55
+ setServers: () => never;
56
+ getDefaultResultOrder: () => string;
57
+ setDefaultResultOrder: (order: unknown) => void;
58
+ };
59
+ } & {
60
+ ADDRCONFIG: number;
61
+ V4MAPPED: number;
62
+ ALL: number;
63
+ NODATA: string;
64
+ FORMERR: string;
65
+ SERVFAIL: string;
66
+ NOTFOUND: string;
67
+ NOTIMP: string;
68
+ REFUSED: string;
69
+ BADQUERY: string;
70
+ BADNAME: string;
71
+ BADFAMILY: string;
72
+ BADRESP: string;
73
+ CONNREFUSED: string;
74
+ TIMEOUT: string;
75
+ EOF: string;
76
+ FILE: string;
77
+ NOMEM: string;
78
+ DESTRUCTION: string;
79
+ BADSTR: string;
80
+ BADFLAGS: string;
81
+ NONAME: string;
82
+ BADHINTS: string;
83
+ NOTINITIALIZED: string;
84
+ LOADIPHLPAPI: string;
85
+ ADDRGETNETWORKPARAMS: string;
86
+ CANCELLED: string;
87
+ };
88
+ export = api;