@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/dns.js ADDED
@@ -0,0 +1,259 @@
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 模块。
37
+ *
38
+ * 实现的是 **lookup 一族**(getaddrinfo),也就是 99% 的代码真正用到的那部分:
39
+ * lookup / lookupService / promises.lookup / promises.lookupService /
40
+ * getServers / setServers / getDefaultResultOrder / setDefaultResultOrder / 常量。
41
+ *
42
+ * **resolve 一族(resolveMx / resolveTxt / resolve4 …)与 reverse 显式抛 ONJ_UNSUPPORTED**:
43
+ * 它们要做 DNS 记录级查询,需要 JNDI 的 DNS provider,而 com.sun.jndi.dns 不在 Android 里。
44
+ * 这不是"还没做",是平台不成立 —— 所以给明确拒绝,不给半个实现。
45
+ *
46
+ * 与 Node 的差异(都在 BUILTINS.json 里):
47
+ * - 调用的**接口**是异步的(走 queueMicrotask),但底层 getaddrinfo 是同步的;
48
+ * - getServers() 返回空数组:Android 的 DNS 由 netd 按网络管理,JVM 侧读不到;
49
+ * - setServers() 抛 ONJ_UNSUPPORTED:无法重配 JVM 的解析器;
50
+ * - hints 选项接受但不生效(Java 的 getAllByName 没有对应开关);
51
+ * - lookupService 的 service 用内置的常见端口表,未命中时给端口号字符串。
52
+ */
53
+ const errors_1 = require("./lib/errors");
54
+ const dnsDriver = __importStar(require("./lib/dns-driver"));
55
+ const dnsPromises = require("./dns/promises");
56
+ /** getaddrinfo 的错误码数值,与 libuv 对齐(Node 用同一套)。 */
57
+ const GETADDRINFO_ERRNO = {
58
+ ENOTFOUND: -3008,
59
+ EAI_AGAIN: -3001,
60
+ EAI_FAIL: -3003,
61
+ EAI_NODATA: -3006,
62
+ EAI_NONAME: -3007,
63
+ ENODATA: -3006
64
+ };
65
+ /** 常见端口 -> 服务名。Node 的 lookupService 走 getnameinfo,这里用表代替。 */
66
+ const SERVICE_NAMES = {
67
+ 20: 'ftp-data', 21: 'ftp', 22: 'ssh', 23: 'telnet', 25: 'smtp', 53: 'domain',
68
+ 80: 'http', 110: 'pop3', 143: 'imap', 443: 'https', 465: 'smtps', 587: 'submission',
69
+ 993: 'imaps', 995: 'pop3s', 3306: 'mysql', 5432: 'postgresql', 6379: 'redis',
70
+ 8080: 'http-alt', 8443: 'https-alt'
71
+ };
72
+ let resultOrder = 'verbatim';
73
+ function dnsFailure(code, hostname) {
74
+ const error = new Error('getaddrinfo ' + code + ' ' + hostname);
75
+ error.code = code;
76
+ error.errno = GETADDRINFO_ERRNO[code] === undefined ? -3008 : GETADDRINFO_ERRNO[code];
77
+ error.syscall = 'getaddrinfo';
78
+ error.hostname = hostname;
79
+ return error;
80
+ }
81
+ function codeForFailure(failure) {
82
+ const mapped = failure;
83
+ if (mapped.code === 'ENOTFOUND' || mapped.code === 'EAI_AGAIN') {
84
+ return mapped.code;
85
+ }
86
+ const message = mapped.message === undefined ? '' : mapped.message;
87
+ if (/temporary failure in name resolution|unable to resolve host/i.test(message)) {
88
+ return 'EAI_AGAIN';
89
+ }
90
+ return 'ENOTFOUND';
91
+ }
92
+ function serviceNameOf(port) {
93
+ const known = SERVICE_NAMES[port];
94
+ return known === undefined ? String(port) : known;
95
+ }
96
+ function normalizeOptions(options) {
97
+ let family = 0;
98
+ let all = false;
99
+ let verbatim = resultOrder === 'verbatim';
100
+ if (typeof options === 'number') {
101
+ family = options;
102
+ }
103
+ else if (options !== undefined && options !== null) {
104
+ if (typeof options.family === 'number') {
105
+ family = options.family;
106
+ }
107
+ all = options.all === true;
108
+ if (typeof options.verbatim === 'boolean') {
109
+ verbatim = options.verbatim;
110
+ }
111
+ }
112
+ return { family: family, all: all, verbatim: verbatim };
113
+ }
114
+ function lookup(hostname, options, callback) {
115
+ let opts = options;
116
+ let done = callback;
117
+ if (typeof options === 'function') {
118
+ done = options;
119
+ opts = undefined;
120
+ }
121
+ if (typeof done !== 'function') {
122
+ throw new TypeError('The "callback" argument must be of type function');
123
+ }
124
+ const host = String(hostname);
125
+ const settings = normalizeOptions(opts);
126
+ queueMicrotask(function () {
127
+ let records;
128
+ try {
129
+ records = dnsDriver.getDriver().lookup(host);
130
+ }
131
+ catch (failure) {
132
+ done(dnsFailure(codeForFailure(failure), host));
133
+ return;
134
+ }
135
+ let filtered = records;
136
+ if (settings.family === 4 || settings.family === 6) {
137
+ filtered = records.filter(function (record) { return record.family === settings.family; });
138
+ }
139
+ if (!settings.verbatim) {
140
+ filtered = filtered.slice().sort(function (left, right) { return left.family - right.family; });
141
+ }
142
+ if (filtered.length === 0) {
143
+ done(dnsFailure('ENOTFOUND', host));
144
+ return;
145
+ }
146
+ if (settings.all) {
147
+ done(null, filtered);
148
+ return;
149
+ }
150
+ done(null, filtered[0].address, filtered[0].family);
151
+ });
152
+ }
153
+ function lookupService(address, port, callback) {
154
+ if (typeof callback !== 'function') {
155
+ throw new TypeError('The "callback" argument must be of type function');
156
+ }
157
+ const target = String(address);
158
+ const numericPort = Number(port);
159
+ queueMicrotask(function () {
160
+ let hostname;
161
+ try {
162
+ hostname = dnsDriver.getDriver().canonicalNameOf(target);
163
+ }
164
+ catch (failure) {
165
+ callback(dnsFailure(codeForFailure(failure), target));
166
+ return;
167
+ }
168
+ callback(null, hostname, serviceNameOf(numericPort));
169
+ });
170
+ }
171
+ /** Node 在 Android 这样的平台上读不到解析器配置,这里如实返回空数组。 */
172
+ function getServers() {
173
+ return [];
174
+ }
175
+ function setServers() {
176
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'dns.setServers() 无法实现:JVM 的解析器配置改不了(Android 由 netd 按网络管理)。');
177
+ }
178
+ function getDefaultResultOrder() {
179
+ return resultOrder;
180
+ }
181
+ function setDefaultResultOrder(order) {
182
+ const value = String(order);
183
+ if (value !== 'verbatim' && value !== 'ipv4first' && value !== 'ipv6first') {
184
+ throw new TypeError('Invalid result order: ' + value);
185
+ }
186
+ resultOrder = value;
187
+ }
188
+ function unsupportedResolve(name) {
189
+ return function () {
190
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'dns.' + name + '() 需要 DNS 记录级查询,而这要 JNDI 的 DNS provider —— ' +
191
+ 'com.sun.jndi.dns 不在 Android 里,所以这个能力在本平台不成立。' +
192
+ '需要解析主机名请用 dns.lookup()(getaddrinfo)。');
193
+ };
194
+ }
195
+ function Resolver() {
196
+ throw (0, errors_1.onjError)('ONJ_UNSUPPORTED', 'dns.Resolver 需要可配置的 DNS 记录级查询,Android 上不成立(同 dns.resolve*)。');
197
+ }
198
+ /**
199
+ * getaddrinfo 的 hints 与错误码字符串。
200
+ *
201
+ * hints 的数值取 Node 自己的(ADDRCONFIG 1024 / V4MAPPED 2048 / ALL 256),
202
+ * 不是 libuv 的原始值 —— Node 在 lib/dns.js 里重映射过,对齐它才有意义。
203
+ * Java 的 getAllByName 没有对应开关,所以这几个只作为取值存在,传了不生效。
204
+ */
205
+ const constants = {
206
+ ADDRCONFIG: 1024,
207
+ V4MAPPED: 2048,
208
+ ALL: 256,
209
+ NODATA: 'ENODATA',
210
+ FORMERR: 'EFORMERR',
211
+ SERVFAIL: 'ESERVFAIL',
212
+ NOTFOUND: 'ENOTFOUND',
213
+ NOTIMP: 'ENOTIMP',
214
+ REFUSED: 'EREFUSED',
215
+ BADQUERY: 'EBADQUERY',
216
+ BADNAME: 'EBADNAME',
217
+ BADFAMILY: 'EBADFAMILY',
218
+ BADRESP: 'EBADRESP',
219
+ CONNREFUSED: 'ECONNREFUSED',
220
+ TIMEOUT: 'ETIMEOUT',
221
+ EOF: 'EOF',
222
+ FILE: 'EFILE',
223
+ NOMEM: 'ENOMEM',
224
+ DESTRUCTION: 'EDESTRUCTION',
225
+ BADSTR: 'EBADSTR',
226
+ BADFLAGS: 'EBADFLAGS',
227
+ NONAME: 'ENONAME',
228
+ BADHINTS: 'EBADHINTS',
229
+ NOTINITIALIZED: 'ENOTINITIALIZED',
230
+ LOADIPHLPAPI: 'ELOADIPHLPAPI',
231
+ ADDRGETNETWORKPARAMS: 'EADDRGETNETWORKPARAMS',
232
+ CANCELLED: 'ECANCELLED'
233
+ };
234
+ const api = Object.assign({
235
+ lookup: lookup,
236
+ lookupService: lookupService,
237
+ resolve: unsupportedResolve('resolve'),
238
+ resolve4: unsupportedResolve('resolve4'),
239
+ resolve6: unsupportedResolve('resolve6'),
240
+ resolveAny: unsupportedResolve('resolveAny'),
241
+ resolveCaa: unsupportedResolve('resolveCaa'),
242
+ resolveCname: unsupportedResolve('resolveCname'),
243
+ resolveMx: unsupportedResolve('resolveMx'),
244
+ resolveNaptr: unsupportedResolve('resolveNaptr'),
245
+ resolveNs: unsupportedResolve('resolveNs'),
246
+ resolvePtr: unsupportedResolve('resolvePtr'),
247
+ resolveSoa: unsupportedResolve('resolveSoa'),
248
+ resolveSrv: unsupportedResolve('resolveSrv'),
249
+ resolveTlsa: unsupportedResolve('resolveTlsa'),
250
+ resolveTxt: unsupportedResolve('resolveTxt'),
251
+ reverse: unsupportedResolve('reverse'),
252
+ getServers: getServers,
253
+ setServers: setServers,
254
+ getDefaultResultOrder: getDefaultResultOrder,
255
+ setDefaultResultOrder: setDefaultResultOrder,
256
+ Resolver: Resolver,
257
+ promises: dnsPromises
258
+ }, constants);
259
+ module.exports = api;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Node events 模块的移植(EventEmitter)。
3
+ *
4
+ * 与 Node 的差异(有意为之):
5
+ * - 本实现是 ES class,不能用 `EventEmitter.call(this)` 这种函数式继承;
6
+ * 现代代码一律走 `class X extends EventEmitter`,不受影响。
7
+ * - `captureRejections` 与 `events.on()`(异步迭代器)未实现。
8
+ */
9
+ type EventListener = (...args: unknown[]) => void;
10
+ type EventName = string | symbol;
11
+ declare class EventEmitter {
12
+ static defaultMaxListeners: number;
13
+ static errorMonitor: symbol;
14
+ static EventEmitter: typeof EventEmitter;
15
+ static listenerCount(emitter: EventEmitter, name: EventName): number;
16
+ static getEventListeners(emitter: EventEmitter, name: EventName): EventListener[];
17
+ static once(emitter: EventEmitter, name: EventName): Promise<unknown[]>;
18
+ static on(emitter: EventEmitter, name: EventName): void;
19
+ constructor();
20
+ get maxListeners(): number;
21
+ set maxListeners(value: number);
22
+ setMaxListeners(count: number): this;
23
+ getMaxListeners(): number;
24
+ on(name: EventName, listener: EventListener): this;
25
+ addListener(name: EventName, listener: EventListener): this;
26
+ prependListener(name: EventName, listener: EventListener): this;
27
+ once(name: EventName, listener: EventListener): this;
28
+ prependOnceListener(name: EventName, listener: EventListener): this;
29
+ /** 内部注册入口。Node 的 EventEmitter 没有它,但 Process 只以实例导出,成员必须是 public。 */
30
+ addEntry(name: EventName, listener: EventListener, once: boolean, prepend?: boolean): this;
31
+ emit(name: EventName, ...args: unknown[]): boolean;
32
+ removeListener(name: EventName, listener: EventListener): this;
33
+ off(name: EventName, listener: EventListener): this;
34
+ removeAllListeners(name?: EventName): this;
35
+ listeners(name: EventName): EventListener[];
36
+ rawListeners(name: EventName): EventListener[];
37
+ listenerCount(name: EventName): number;
38
+ eventNames(): EventName[];
39
+ }
40
+ export = EventEmitter;
package/dist/events.js ADDED
@@ -0,0 +1,237 @@
1
+ 'use strict';
2
+ const registry = new WeakMap();
3
+ /** Node 用它旁听 error 事件而不消费它。 */
4
+ const errorMonitor = Symbol.for('nodejs.errorMonitor');
5
+ function stateOf(emitter) {
6
+ let current = registry.get(emitter);
7
+ if (current === undefined) {
8
+ current = { events: new Map(), maxListeners: 0 };
9
+ registry.set(emitter, current);
10
+ }
11
+ return current;
12
+ }
13
+ function listenersOf(emitter, name, create) {
14
+ const state = stateOf(emitter);
15
+ let list = state.events.get(name);
16
+ if (list === undefined && create) {
17
+ list = [];
18
+ state.events.set(name, list);
19
+ }
20
+ return list;
21
+ }
22
+ function unwrap(entry) {
23
+ const fn = entry.fn;
24
+ return entry.once && typeof fn.listener === 'function' ? fn.listener : entry.fn;
25
+ }
26
+ function indexFromEnd(list, fn) {
27
+ for (let i = list.length - 1; i >= 0; i -= 1) {
28
+ if (unwrap(list[i]) === fn || list[i].fn === fn) {
29
+ return i;
30
+ }
31
+ }
32
+ return -1;
33
+ }
34
+ class EventEmitter {
35
+ static listenerCount(emitter, name) {
36
+ return emitter.listenerCount(name);
37
+ }
38
+ static getEventListeners(emitter, name) {
39
+ return emitter.listeners(name);
40
+ }
41
+ static once(emitter, name) {
42
+ return new Promise(function (resolve, reject) {
43
+ function onEvent(...args) {
44
+ emitter.removeListener(name, onError);
45
+ resolve(args);
46
+ }
47
+ function onError(error) {
48
+ emitter.removeListener(name, onEvent);
49
+ reject(error);
50
+ }
51
+ emitter.once(name, onEvent);
52
+ if (name !== 'error') {
53
+ emitter.once('error', onError);
54
+ }
55
+ });
56
+ }
57
+ static on(emitter, name) {
58
+ void emitter;
59
+ void name;
60
+ throw new Error('node.operit 尚未实现 events.on()(异步迭代器)。');
61
+ }
62
+ constructor() {
63
+ stateOf(this);
64
+ }
65
+ get maxListeners() {
66
+ const current = stateOf(this).maxListeners;
67
+ return current === 0 ? EventEmitter.defaultMaxListeners : current;
68
+ }
69
+ set maxListeners(value) {
70
+ this.setMaxListeners(value);
71
+ }
72
+ setMaxListeners(count) {
73
+ const normalized = Number(count);
74
+ if (normalized < 0 || !isFinite(normalized)) {
75
+ throw new RangeError('The value of "n" is out of range. It must be a non-negative number.');
76
+ }
77
+ stateOf(this).maxListeners = Math.floor(normalized);
78
+ return this;
79
+ }
80
+ getMaxListeners() {
81
+ return this.maxListeners;
82
+ }
83
+ on(name, listener) {
84
+ return this.addEntry(name, listener, false);
85
+ }
86
+ addListener(name, listener) {
87
+ return this.addEntry(name, listener, false);
88
+ }
89
+ prependListener(name, listener) {
90
+ return this.addEntry(name, listener, false, true);
91
+ }
92
+ once(name, listener) {
93
+ return this.addEntry(name, listener, true);
94
+ }
95
+ prependOnceListener(name, listener) {
96
+ return this.addEntry(name, listener, true, true);
97
+ }
98
+ /** 内部注册入口。Node 的 EventEmitter 没有它,但 Process 只以实例导出,成员必须是 public。 */
99
+ addEntry(name, listener, once, prepend = false) {
100
+ if (typeof listener !== 'function') {
101
+ throw new TypeError('The "listener" argument must be of type function.');
102
+ }
103
+ const list = listenersOf(this, name, true);
104
+ if (list === undefined) {
105
+ return this;
106
+ }
107
+ const emitter = this;
108
+ let stored;
109
+ if (once) {
110
+ // once 的包装器自己摘除自己(与 Node 一致:emit 不做预先移除),
111
+ // 并在 .listener 上保留原函数,供 listeners() / rawListeners() 区分。
112
+ const wrapped = function (...args) {
113
+ removeEntry(emitter, name, wrapped);
114
+ listener.apply(emitter, args);
115
+ };
116
+ wrapped.listener = listener;
117
+ stored = { fn: wrapped, once: true };
118
+ }
119
+ else {
120
+ stored = { fn: listener, once: false };
121
+ }
122
+ if (prepend) {
123
+ list.unshift(stored);
124
+ }
125
+ else {
126
+ list.push(stored);
127
+ }
128
+ return this;
129
+ }
130
+ emit(name, ...args) {
131
+ const list = listenersOf(this, name, false);
132
+ const monitor = name === 'error' ? listenersOf(this, errorMonitor, false) : undefined;
133
+ if ((list === undefined || list.length === 0) && (monitor === undefined || monitor.length === 0)) {
134
+ if (name === 'error') {
135
+ const first = args[0];
136
+ if (first instanceof Error) {
137
+ throw first;
138
+ }
139
+ const error = new Error('Unhandled error.' + (first === undefined ? '' : ' (' + String(first) + ')'));
140
+ error.context = first;
141
+ throw error;
142
+ }
143
+ return false;
144
+ }
145
+ if (monitor !== undefined) {
146
+ for (let i = 0; i < monitor.length; i += 1) {
147
+ monitor[i].fn.apply(this, args);
148
+ }
149
+ }
150
+ if (list === undefined || list.length === 0) {
151
+ return false;
152
+ }
153
+ const snapshot = list.slice();
154
+ for (let i = 0; i < snapshot.length; i += 1) {
155
+ const entry = snapshot[i];
156
+ if (entry.once && indexOfEntry(list, entry.fn) < 0) {
157
+ continue;
158
+ }
159
+ entry.fn.apply(this, args);
160
+ }
161
+ return true;
162
+ }
163
+ removeListener(name, listener) {
164
+ return this.off(name, listener);
165
+ }
166
+ off(name, listener) {
167
+ const list = listenersOf(this, name, false);
168
+ if (list === undefined) {
169
+ return this;
170
+ }
171
+ const index = indexFromEnd(list, listener);
172
+ if (index >= 0) {
173
+ list.splice(index, 1);
174
+ if (list.length === 0) {
175
+ stateOf(this).events.delete(name);
176
+ }
177
+ }
178
+ return this;
179
+ }
180
+ removeAllListeners(name) {
181
+ const state = stateOf(this);
182
+ if (name === undefined) {
183
+ state.events.clear();
184
+ return this;
185
+ }
186
+ state.events.delete(name);
187
+ return this;
188
+ }
189
+ listeners(name) {
190
+ const list = listenersOf(this, name, false);
191
+ if (list === undefined) {
192
+ return [];
193
+ }
194
+ return list.map(unwrap);
195
+ }
196
+ rawListeners(name) {
197
+ const list = listenersOf(this, name, false);
198
+ if (list === undefined) {
199
+ return [];
200
+ }
201
+ return list.map(function (entry) {
202
+ return entry.fn;
203
+ });
204
+ }
205
+ listenerCount(name) {
206
+ const list = listenersOf(this, name, false);
207
+ return list === undefined ? 0 : list.length;
208
+ }
209
+ eventNames() {
210
+ return Array.from(stateOf(this).events.keys());
211
+ }
212
+ }
213
+ EventEmitter.defaultMaxListeners = 10;
214
+ EventEmitter.errorMonitor = errorMonitor;
215
+ EventEmitter.EventEmitter = EventEmitter;
216
+ function indexOfEntry(list, fn) {
217
+ for (let i = 0; i < list.length; i += 1) {
218
+ if (list[i].fn === fn) {
219
+ return i;
220
+ }
221
+ }
222
+ return -1;
223
+ }
224
+ function removeEntry(emitter, name, fn) {
225
+ const list = listenersOf(emitter, name, false);
226
+ if (list === undefined) {
227
+ return;
228
+ }
229
+ const index = indexOfEntry(list, fn);
230
+ if (index >= 0) {
231
+ list.splice(index, 1);
232
+ if (list.length === 0) {
233
+ stateOf(emitter).events.delete(name);
234
+ }
235
+ }
236
+ }
237
+ module.exports = EventEmitter;
@@ -0,0 +1,159 @@
1
+ import { Buffer } from '../buffer';
2
+ declare class FileHandle {
3
+ readonly fd: number;
4
+ closed: boolean;
5
+ constructor(fd: number);
6
+ private ensureOpen;
7
+ /** Node 的 FileHandle.read 返回 { bytesRead, buffer },不是裸数字。 */
8
+ read(buffer: Uint8Array, offset?: number, length?: number, position?: number | null): Promise<{
9
+ bytesRead: number;
10
+ buffer: Uint8Array;
11
+ }>;
12
+ /** 同理,write 返回 { bytesWritten, buffer },buffer 是调用方传入的原始数据。 */
13
+ write(data: unknown, ...rest: unknown[]): Promise<{
14
+ bytesWritten: number;
15
+ buffer: unknown;
16
+ }>;
17
+ readFile(options?: unknown): Promise<string | Uint8Array>;
18
+ writeFile(data: unknown, options?: unknown): Promise<void>;
19
+ appendFile(data: unknown, options?: unknown): Promise<void>;
20
+ stat(): Promise<unknown>;
21
+ truncate(length?: number): Promise<void>;
22
+ sync(): Promise<void>;
23
+ datasync(): Promise<void>;
24
+ close(): Promise<void>;
25
+ }
26
+ declare function open(path: unknown, flags?: unknown, mode?: unknown): Promise<FileHandle>;
27
+ declare const api: {
28
+ open: typeof open;
29
+ readFile: (target: unknown, options?: unknown) => Promise<string | Buffer>;
30
+ writeFile: (target: unknown, data: unknown, options?: unknown) => Promise<void>;
31
+ appendFile: (target: unknown, data: unknown, options?: unknown) => Promise<void>;
32
+ stat: (target: unknown, options?: unknown) => Promise<{
33
+ readonly sizeValue: number;
34
+ readonly modeValue: number;
35
+ readonly atimeMsValue: number;
36
+ readonly mtimeMsValue: number;
37
+ readonly ctimeMsValue: number;
38
+ readonly birthtimeMsValue: number;
39
+ readonly fileLike: boolean;
40
+ readonly directoryLike: boolean;
41
+ readonly linkLike: boolean;
42
+ get size(): number;
43
+ get mode(): number;
44
+ get atimeMs(): number;
45
+ get mtimeMs(): number;
46
+ get ctimeMs(): number;
47
+ get birthtimeMs(): number;
48
+ get atime(): Date;
49
+ get mtime(): Date;
50
+ get ctime(): Date;
51
+ get birthtime(): Date;
52
+ isFile(): boolean;
53
+ isDirectory(): boolean;
54
+ isSymbolicLink(): boolean;
55
+ isBlockDevice(): boolean;
56
+ isCharacterDevice(): boolean;
57
+ isFIFO(): boolean;
58
+ isSocket(): boolean;
59
+ } | undefined>;
60
+ lstat: (target: unknown, options?: unknown) => Promise<{
61
+ readonly sizeValue: number;
62
+ readonly modeValue: number;
63
+ readonly atimeMsValue: number;
64
+ readonly mtimeMsValue: number;
65
+ readonly ctimeMsValue: number;
66
+ readonly birthtimeMsValue: number;
67
+ readonly fileLike: boolean;
68
+ readonly directoryLike: boolean;
69
+ readonly linkLike: boolean;
70
+ get size(): number;
71
+ get mode(): number;
72
+ get atimeMs(): number;
73
+ get mtimeMs(): number;
74
+ get ctimeMs(): number;
75
+ get birthtimeMs(): number;
76
+ get atime(): Date;
77
+ get mtime(): Date;
78
+ get ctime(): Date;
79
+ get birthtime(): Date;
80
+ isFile(): boolean;
81
+ isDirectory(): boolean;
82
+ isSymbolicLink(): boolean;
83
+ isBlockDevice(): boolean;
84
+ isCharacterDevice(): boolean;
85
+ isFIFO(): boolean;
86
+ isSocket(): boolean;
87
+ } | undefined>;
88
+ readdir: (target: unknown, options?: unknown) => Promise<string[] | {
89
+ readonly name: string;
90
+ readonly kind: number;
91
+ isFile(): boolean;
92
+ isDirectory(): boolean;
93
+ isSymbolicLink(): boolean;
94
+ isBlockDevice(): boolean;
95
+ isCharacterDevice(): boolean;
96
+ isFIFO(): boolean;
97
+ isSocket(): boolean;
98
+ }[]>;
99
+ mkdir: (target: unknown, options?: unknown) => Promise<string | undefined>;
100
+ rm: (target: unknown, options?: unknown) => Promise<void>;
101
+ unlink: (target: unknown) => Promise<void>;
102
+ rmdir: (target: unknown, options?: unknown) => Promise<void>;
103
+ rename: (from: unknown, to: unknown) => Promise<void>;
104
+ copyFile: (from: unknown, to: unknown) => Promise<void>;
105
+ realpath: (target: unknown) => Promise<string>;
106
+ readlink: (target: unknown) => Promise<string>;
107
+ symlink: (target: unknown, linkPath: unknown) => Promise<void>;
108
+ chmod: (target: unknown, mode: unknown) => Promise<void>;
109
+ truncate: (target: unknown, length?: unknown) => Promise<void>;
110
+ utimes: (target: unknown, atime: unknown, mtime: unknown) => Promise<void>;
111
+ access: (target: unknown) => Promise<void>;
112
+ mkdtemp: (prefix: unknown) => Promise<string>;
113
+ constants: {
114
+ F_OK: number;
115
+ R_OK: number;
116
+ W_OK: number;
117
+ X_OK: number;
118
+ COPYFILE_EXCL: number;
119
+ COPYFILE_FICLONE: number;
120
+ COPYFILE_FICLONE_FORCE: number;
121
+ UV_FS_COPYFILE_EXCL: number;
122
+ UV_FS_COPYFILE_FICLONE: number;
123
+ UV_FS_COPYFILE_FICLONE_FORCE: number;
124
+ O_RDONLY: number;
125
+ O_WRONLY: number;
126
+ O_RDWR: number;
127
+ O_CREAT: number;
128
+ O_EXCL: number;
129
+ O_TRUNC: number;
130
+ O_APPEND: number;
131
+ UV_FS_O_FILEMAP: number;
132
+ UV_FS_SYMLINK_DIR: number;
133
+ UV_FS_SYMLINK_JUNCTION: number;
134
+ UV_DIRENT_UNKNOWN: number;
135
+ UV_DIRENT_FILE: number;
136
+ UV_DIRENT_DIR: number;
137
+ UV_DIRENT_LINK: number;
138
+ UV_DIRENT_FIFO: number;
139
+ UV_DIRENT_SOCKET: number;
140
+ UV_DIRENT_CHAR: number;
141
+ UV_DIRENT_BLOCK: number;
142
+ S_IFMT: number;
143
+ S_IFREG: number;
144
+ S_IFDIR: number;
145
+ S_IFCHR: number;
146
+ S_IFIFO: number;
147
+ S_IFLNK: number;
148
+ S_IRUSR: number;
149
+ S_IWUSR: number;
150
+ S_IXUSR: number;
151
+ S_IRGRP: number;
152
+ S_IWGRP: number;
153
+ S_IXGRP: number;
154
+ S_IROTH: number;
155
+ S_IWOTH: number;
156
+ S_IXOTH: number;
157
+ };
158
+ };
159
+ export = api;