@serveryyswys/node.operit 0.0.0-stage → 0.1.3
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/BUILTINS.json +383 -0
- package/DESIGN.md +513 -0
- package/LICENSE +201 -0
- package/NOTICE +17 -0
- package/README.md +311 -2
- package/dist/assert/strict.d.ts +2 -0
- package/dist/assert/strict.js +7 -0
- package/dist/assert.d.ts +3 -0
- package/dist/assert.js +483 -0
- package/dist/buffer.d.ts +60 -0
- package/dist/buffer.js +524 -0
- package/dist/child_process.d.ts +56 -0
- package/dist/child_process.js +371 -0
- package/dist/console.d.ts +60 -0
- package/dist/console.js +193 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +19 -0
- package/dist/crypto.d.ts +76 -0
- package/dist/crypto.js +312 -0
- package/dist/diagnostics_channel.d.ts +36 -0
- package/dist/diagnostics_channel.js +76 -0
- package/dist/dns/promises.d.ts +34 -0
- package/dist/dns/promises.js +190 -0
- package/dist/dns.d.ts +88 -0
- package/dist/dns.js +259 -0
- package/dist/events.d.ts +40 -0
- package/dist/events.js +237 -0
- package/dist/fs/promises.d.ts +160 -0
- package/dist/fs/promises.js +130 -0
- package/dist/fs.d.ts +221 -0
- package/dist/fs.js +944 -0
- package/dist/http.d.ts +92 -0
- package/dist/http.js +319 -0
- package/dist/https.d.ts +296 -0
- package/dist/https.js +50 -0
- package/dist/index.d.ts +2821 -0
- package/dist/index.js +93 -0
- package/dist/lib/bridge.d.ts +60 -0
- package/dist/lib/bridge.js +207 -0
- package/dist/lib/bytes.d.ts +20 -0
- package/dist/lib/bytes.js +239 -0
- package/dist/lib/child-process-types.d.ts +45 -0
- package/dist/lib/child-process-types.js +2 -0
- package/dist/lib/console-types.d.ts +12 -0
- package/dist/lib/console-types.js +2 -0
- package/dist/lib/cwd.d.ts +2 -0
- package/dist/lib/cwd.js +32 -0
- package/dist/lib/deep-equal.d.ts +3 -0
- package/dist/lib/deep-equal.js +223 -0
- package/dist/lib/deflate.d.ts +2 -0
- package/dist/lib/deflate.js +234 -0
- package/dist/lib/diagnostics-channel-types.d.ts +7 -0
- package/dist/lib/diagnostics-channel-types.js +2 -0
- package/dist/lib/dns-driver.d.ts +14 -0
- package/dist/lib/dns-driver.js +85 -0
- package/dist/lib/dns-types.d.ts +22 -0
- package/dist/lib/dns-types.js +2 -0
- package/dist/lib/errors.d.ts +48 -0
- package/dist/lib/errors.js +424 -0
- package/dist/lib/fs-driver.d.ts +70 -0
- package/dist/lib/fs-driver.js +364 -0
- package/dist/lib/fs-env.d.ts +30 -0
- package/dist/lib/fs-env.js +157 -0
- package/dist/lib/fs-types.d.ts +19 -0
- package/dist/lib/fs-types.js +2 -0
- package/dist/lib/hashes.d.ts +27 -0
- package/dist/lib/hashes.js +432 -0
- package/dist/lib/http-driver.d.ts +30 -0
- package/dist/lib/http-driver.js +72 -0
- package/dist/lib/http-types.d.ts +18 -0
- package/dist/lib/http-types.js +2 -0
- package/dist/lib/inflate.d.ts +6 -0
- package/dist/lib/inflate.js +284 -0
- package/dist/lib/path-types.d.ts +37 -0
- package/dist/lib/path-types.js +2 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.js +106 -0
- package/dist/lib/perf-hooks-types.d.ts +18 -0
- package/dist/lib/perf-hooks-types.js +2 -0
- package/dist/lib/process-driver.d.ts +31 -0
- package/dist/lib/process-driver.js +102 -0
- package/dist/lib/punycode.d.ts +8 -0
- package/dist/lib/punycode.js +179 -0
- package/dist/lib/stream-consumers-types.d.ts +4 -0
- package/dist/lib/stream-consumers-types.js +2 -0
- package/dist/lib/stream-types.d.ts +29 -0
- package/dist/lib/stream-types.js +2 -0
- package/dist/lib/timers-types.d.ts +18 -0
- package/dist/lib/timers-types.js +2 -0
- package/dist/lib/url-search-params.d.ts +26 -0
- package/dist/lib/url-search-params.js +281 -0
- package/dist/lib/url-types.d.ts +44 -0
- package/dist/lib/url-types.js +2 -0
- package/dist/lib/url-whatwg.d.ts +78 -0
- package/dist/lib/url-whatwg.js +857 -0
- package/dist/lib/util-types.d.ts +13 -0
- package/dist/lib/util-types.js +2 -0
- package/dist/lib/v8-types.d.ts +30 -0
- package/dist/lib/v8-types.js +2 -0
- package/dist/lib/zlib-types.d.ts +12 -0
- package/dist/lib/zlib-types.js +2 -0
- package/dist/module.d.ts +8 -0
- package/dist/module.js +102 -0
- package/dist/os.d.ts +80 -0
- package/dist/os.js +247 -0
- package/dist/path/posix.d.ts +2 -0
- package/dist/path/posix.js +7 -0
- package/dist/path/win32.d.ts +2 -0
- package/dist/path/win32.js +10 -0
- package/dist/path.d.ts +3 -0
- package/dist/path.js +1222 -0
- package/dist/perf_hooks.d.ts +36 -0
- package/dist/perf_hooks.js +144 -0
- package/dist/process.d.ts +69 -0
- package/dist/process.js +230 -0
- package/dist/punycode.d.ts +22 -0
- package/dist/punycode.js +53 -0
- package/dist/querystring.d.ts +15 -0
- package/dist/querystring.js +209 -0
- package/dist/stream/consumers.d.ts +24 -0
- package/dist/stream/consumers.js +75 -0
- package/dist/stream/promises.d.ts +5 -0
- package/dist/stream/promises.js +10 -0
- package/dist/stream.d.ts +84 -0
- package/dist/stream.js +875 -0
- package/dist/string_decoder.d.ts +15 -0
- package/dist/string_decoder.js +237 -0
- package/dist/sys.d.ts +8 -0
- package/dist/sys.js +9 -0
- package/dist/timers/promises.d.ts +19 -0
- package/dist/timers/promises.js +74 -0
- package/dist/timers.d.ts +21 -0
- package/dist/timers.js +41 -0
- package/dist/tty.d.ts +9 -0
- package/dist/tty.js +25 -0
- package/dist/unsupported.d.ts +12 -0
- package/dist/unsupported.js +17 -0
- package/dist/url.d.ts +28 -0
- package/dist/url.js +486 -0
- package/dist/util/types.d.ts +16 -0
- package/dist/util/types.js +9 -0
- package/dist/util.d.ts +63 -0
- package/dist/util.js +527 -0
- package/dist/v8.d.ts +25 -0
- package/dist/v8.js +127 -0
- package/dist/zlib.d.ts +88 -0
- package/dist/zlib.js +371 -0
- package/package.json +31 -4
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,160 @@
|
|
|
1
|
+
import { Buffer } from '../buffer';
|
|
2
|
+
declare class FileHandle {
|
|
3
|
+
readonly fd: number;
|
|
4
|
+
closed: boolean;
|
|
5
|
+
constructor(fd: number);
|
|
6
|
+
/** 公开而非 private:FileHandle 会随 fs/promises 一起被聚合导出,TS 不允许导出型别含私有成员(TS4094)。 */
|
|
7
|
+
ensureOpen(): void;
|
|
8
|
+
/** Node 的 FileHandle.read 返回 { bytesRead, buffer },不是裸数字。 */
|
|
9
|
+
read(buffer: Uint8Array, offset?: number, length?: number, position?: number | null): Promise<{
|
|
10
|
+
bytesRead: number;
|
|
11
|
+
buffer: Uint8Array;
|
|
12
|
+
}>;
|
|
13
|
+
/** 同理,write 返回 { bytesWritten, buffer },buffer 是调用方传入的原始数据。 */
|
|
14
|
+
write(data: unknown, ...rest: unknown[]): Promise<{
|
|
15
|
+
bytesWritten: number;
|
|
16
|
+
buffer: unknown;
|
|
17
|
+
}>;
|
|
18
|
+
readFile(options?: unknown): Promise<string | Uint8Array>;
|
|
19
|
+
writeFile(data: unknown, options?: unknown): Promise<void>;
|
|
20
|
+
appendFile(data: unknown, options?: unknown): Promise<void>;
|
|
21
|
+
stat(): Promise<unknown>;
|
|
22
|
+
truncate(length?: number): Promise<void>;
|
|
23
|
+
sync(): Promise<void>;
|
|
24
|
+
datasync(): Promise<void>;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
declare function open(path: unknown, flags?: unknown, mode?: unknown): Promise<FileHandle>;
|
|
28
|
+
declare const api: {
|
|
29
|
+
open: typeof open;
|
|
30
|
+
readFile: (target: unknown, options?: unknown) => Promise<string | Buffer>;
|
|
31
|
+
writeFile: (target: unknown, data: unknown, options?: unknown) => Promise<void>;
|
|
32
|
+
appendFile: (target: unknown, data: unknown, options?: unknown) => Promise<void>;
|
|
33
|
+
stat: (target: unknown, options?: unknown) => Promise<{
|
|
34
|
+
readonly sizeValue: number;
|
|
35
|
+
readonly modeValue: number;
|
|
36
|
+
readonly atimeMsValue: number;
|
|
37
|
+
readonly mtimeMsValue: number;
|
|
38
|
+
readonly ctimeMsValue: number;
|
|
39
|
+
readonly birthtimeMsValue: number;
|
|
40
|
+
readonly fileLike: boolean;
|
|
41
|
+
readonly directoryLike: boolean;
|
|
42
|
+
readonly linkLike: boolean;
|
|
43
|
+
get size(): number;
|
|
44
|
+
get mode(): number;
|
|
45
|
+
get atimeMs(): number;
|
|
46
|
+
get mtimeMs(): number;
|
|
47
|
+
get ctimeMs(): number;
|
|
48
|
+
get birthtimeMs(): number;
|
|
49
|
+
get atime(): Date;
|
|
50
|
+
get mtime(): Date;
|
|
51
|
+
get ctime(): Date;
|
|
52
|
+
get birthtime(): Date;
|
|
53
|
+
isFile(): boolean;
|
|
54
|
+
isDirectory(): boolean;
|
|
55
|
+
isSymbolicLink(): boolean;
|
|
56
|
+
isBlockDevice(): boolean;
|
|
57
|
+
isCharacterDevice(): boolean;
|
|
58
|
+
isFIFO(): boolean;
|
|
59
|
+
isSocket(): boolean;
|
|
60
|
+
} | undefined>;
|
|
61
|
+
lstat: (target: unknown, options?: unknown) => Promise<{
|
|
62
|
+
readonly sizeValue: number;
|
|
63
|
+
readonly modeValue: number;
|
|
64
|
+
readonly atimeMsValue: number;
|
|
65
|
+
readonly mtimeMsValue: number;
|
|
66
|
+
readonly ctimeMsValue: number;
|
|
67
|
+
readonly birthtimeMsValue: number;
|
|
68
|
+
readonly fileLike: boolean;
|
|
69
|
+
readonly directoryLike: boolean;
|
|
70
|
+
readonly linkLike: boolean;
|
|
71
|
+
get size(): number;
|
|
72
|
+
get mode(): number;
|
|
73
|
+
get atimeMs(): number;
|
|
74
|
+
get mtimeMs(): number;
|
|
75
|
+
get ctimeMs(): number;
|
|
76
|
+
get birthtimeMs(): number;
|
|
77
|
+
get atime(): Date;
|
|
78
|
+
get mtime(): Date;
|
|
79
|
+
get ctime(): Date;
|
|
80
|
+
get birthtime(): Date;
|
|
81
|
+
isFile(): boolean;
|
|
82
|
+
isDirectory(): boolean;
|
|
83
|
+
isSymbolicLink(): boolean;
|
|
84
|
+
isBlockDevice(): boolean;
|
|
85
|
+
isCharacterDevice(): boolean;
|
|
86
|
+
isFIFO(): boolean;
|
|
87
|
+
isSocket(): boolean;
|
|
88
|
+
} | undefined>;
|
|
89
|
+
readdir: (target: unknown, options?: unknown) => Promise<string[] | {
|
|
90
|
+
readonly name: string;
|
|
91
|
+
readonly kind: number;
|
|
92
|
+
isFile(): boolean;
|
|
93
|
+
isDirectory(): boolean;
|
|
94
|
+
isSymbolicLink(): boolean;
|
|
95
|
+
isBlockDevice(): boolean;
|
|
96
|
+
isCharacterDevice(): boolean;
|
|
97
|
+
isFIFO(): boolean;
|
|
98
|
+
isSocket(): boolean;
|
|
99
|
+
}[]>;
|
|
100
|
+
mkdir: (target: unknown, options?: unknown) => Promise<string | undefined>;
|
|
101
|
+
rm: (target: unknown, options?: unknown) => Promise<void>;
|
|
102
|
+
unlink: (target: unknown) => Promise<void>;
|
|
103
|
+
rmdir: (target: unknown, options?: unknown) => Promise<void>;
|
|
104
|
+
rename: (from: unknown, to: unknown) => Promise<void>;
|
|
105
|
+
copyFile: (from: unknown, to: unknown) => Promise<void>;
|
|
106
|
+
realpath: (target: unknown) => Promise<string>;
|
|
107
|
+
readlink: (target: unknown) => Promise<string>;
|
|
108
|
+
symlink: (target: unknown, linkPath: unknown) => Promise<void>;
|
|
109
|
+
chmod: (target: unknown, mode: unknown) => Promise<void>;
|
|
110
|
+
truncate: (target: unknown, length?: unknown) => Promise<void>;
|
|
111
|
+
utimes: (target: unknown, atime: unknown, mtime: unknown) => Promise<void>;
|
|
112
|
+
access: (target: unknown) => Promise<void>;
|
|
113
|
+
mkdtemp: (prefix: unknown) => Promise<string>;
|
|
114
|
+
constants: {
|
|
115
|
+
F_OK: number;
|
|
116
|
+
R_OK: number;
|
|
117
|
+
W_OK: number;
|
|
118
|
+
X_OK: number;
|
|
119
|
+
COPYFILE_EXCL: number;
|
|
120
|
+
COPYFILE_FICLONE: number;
|
|
121
|
+
COPYFILE_FICLONE_FORCE: number;
|
|
122
|
+
UV_FS_COPYFILE_EXCL: number;
|
|
123
|
+
UV_FS_COPYFILE_FICLONE: number;
|
|
124
|
+
UV_FS_COPYFILE_FICLONE_FORCE: number;
|
|
125
|
+
O_RDONLY: number;
|
|
126
|
+
O_WRONLY: number;
|
|
127
|
+
O_RDWR: number;
|
|
128
|
+
O_CREAT: number;
|
|
129
|
+
O_EXCL: number;
|
|
130
|
+
O_TRUNC: number;
|
|
131
|
+
O_APPEND: number;
|
|
132
|
+
UV_FS_O_FILEMAP: number;
|
|
133
|
+
UV_FS_SYMLINK_DIR: number;
|
|
134
|
+
UV_FS_SYMLINK_JUNCTION: number;
|
|
135
|
+
UV_DIRENT_UNKNOWN: number;
|
|
136
|
+
UV_DIRENT_FILE: number;
|
|
137
|
+
UV_DIRENT_DIR: number;
|
|
138
|
+
UV_DIRENT_LINK: number;
|
|
139
|
+
UV_DIRENT_FIFO: number;
|
|
140
|
+
UV_DIRENT_SOCKET: number;
|
|
141
|
+
UV_DIRENT_CHAR: number;
|
|
142
|
+
UV_DIRENT_BLOCK: number;
|
|
143
|
+
S_IFMT: number;
|
|
144
|
+
S_IFREG: number;
|
|
145
|
+
S_IFDIR: number;
|
|
146
|
+
S_IFCHR: number;
|
|
147
|
+
S_IFIFO: number;
|
|
148
|
+
S_IFLNK: number;
|
|
149
|
+
S_IRUSR: number;
|
|
150
|
+
S_IWUSR: number;
|
|
151
|
+
S_IXUSR: number;
|
|
152
|
+
S_IRGRP: number;
|
|
153
|
+
S_IWGRP: number;
|
|
154
|
+
S_IXGRP: number;
|
|
155
|
+
S_IROTH: number;
|
|
156
|
+
S_IWOTH: number;
|
|
157
|
+
S_IXOTH: number;
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
export = api;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* fs/promises 子路径入口。
|
|
4
|
+
*
|
|
5
|
+
* 实现方式:把同步面逐个包进 Promise。
|
|
6
|
+
* 原因很直接 —— 宿主只有 Java bridge 这一条同步通道(DESIGN.md §6.3),
|
|
7
|
+
* 没有真异步可用;所以这里给的是"接口是异步、执行是同步"。
|
|
8
|
+
* 调用方若在 UI 线程上使用,需要自己评估阻塞成本。
|
|
9
|
+
*
|
|
10
|
+
* `open()` 按 Node 语义返回 **FileHandle**(不是裸 fd)。
|
|
11
|
+
* Node 的 fs.promises 并没有 fd 形式的 read/write/close/fstat/ftruncate/fsync,
|
|
12
|
+
* 所以这里也不提供 —— 那些能力在 FileHandle 上。
|
|
13
|
+
*/
|
|
14
|
+
const fs = require("../fs");
|
|
15
|
+
const buffer_1 = require("../buffer");
|
|
16
|
+
function promisify(fn) {
|
|
17
|
+
return function (...args) {
|
|
18
|
+
try {
|
|
19
|
+
return Promise.resolve(fn.apply(null, args));
|
|
20
|
+
}
|
|
21
|
+
catch (failure) {
|
|
22
|
+
return Promise.reject(failure);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function toBytes(data, encoding) {
|
|
27
|
+
if (typeof data === 'string') {
|
|
28
|
+
const resolved = typeof encoding === 'string'
|
|
29
|
+
? encoding
|
|
30
|
+
: (encoding !== undefined && encoding !== null && typeof encoding.encoding === 'string' ? encoding.encoding : 'utf8');
|
|
31
|
+
return buffer_1.Buffer.from(data, resolved);
|
|
32
|
+
}
|
|
33
|
+
if (data instanceof Uint8Array) {
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
throw new TypeError('The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView.');
|
|
37
|
+
}
|
|
38
|
+
class FileHandle {
|
|
39
|
+
constructor(fd) {
|
|
40
|
+
this.closed = false;
|
|
41
|
+
this.fd = fd;
|
|
42
|
+
}
|
|
43
|
+
/** 公开而非 private:FileHandle 会随 fs/promises 一起被聚合导出,TS 不允许导出型别含私有成员(TS4094)。 */
|
|
44
|
+
ensureOpen() {
|
|
45
|
+
if (this.closed) {
|
|
46
|
+
const error = new Error('file descriptor was closed');
|
|
47
|
+
error.code = 'EBADF';
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Node 的 FileHandle.read 返回 { bytesRead, buffer },不是裸数字。 */
|
|
52
|
+
async read(buffer, offset, length, position) {
|
|
53
|
+
this.ensureOpen();
|
|
54
|
+
const bytesRead = fs.readSync(this.fd, buffer, offset, length, position);
|
|
55
|
+
return { bytesRead: bytesRead, buffer: buffer };
|
|
56
|
+
}
|
|
57
|
+
/** 同理,write 返回 { bytesWritten, buffer },buffer 是调用方传入的原始数据。 */
|
|
58
|
+
async write(data, ...rest) {
|
|
59
|
+
this.ensureOpen();
|
|
60
|
+
const bytesWritten = fs.writeSync(this.fd, data, rest[0], rest[1], rest[2]);
|
|
61
|
+
return { bytesWritten: bytesWritten, buffer: data };
|
|
62
|
+
}
|
|
63
|
+
async readFile(options) {
|
|
64
|
+
this.ensureOpen();
|
|
65
|
+
return fs.readFileSync(this.fd, options);
|
|
66
|
+
}
|
|
67
|
+
async writeFile(data, options) {
|
|
68
|
+
this.ensureOpen();
|
|
69
|
+
fs.writeFileSync(this.fd, data, options);
|
|
70
|
+
}
|
|
71
|
+
async appendFile(data, options) {
|
|
72
|
+
this.ensureOpen();
|
|
73
|
+
const bytes = toBytes(data, options);
|
|
74
|
+
const size = fs.fstatSync(this.fd).size;
|
|
75
|
+
fs.writeSync(this.fd, bytes, 0, bytes.length, size);
|
|
76
|
+
}
|
|
77
|
+
async stat() {
|
|
78
|
+
this.ensureOpen();
|
|
79
|
+
return fs.fstatSync(this.fd);
|
|
80
|
+
}
|
|
81
|
+
async truncate(length) {
|
|
82
|
+
this.ensureOpen();
|
|
83
|
+
fs.ftruncateSync(this.fd, length);
|
|
84
|
+
}
|
|
85
|
+
async sync() {
|
|
86
|
+
this.ensureOpen();
|
|
87
|
+
fs.fsyncSync(this.fd);
|
|
88
|
+
}
|
|
89
|
+
async datasync() {
|
|
90
|
+
this.ensureOpen();
|
|
91
|
+
fs.fdatasyncSync(this.fd);
|
|
92
|
+
}
|
|
93
|
+
async close() {
|
|
94
|
+
if (this.closed) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.closed = true;
|
|
98
|
+
fs.closeSync(this.fd);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function open(path, flags, mode) {
|
|
102
|
+
return Promise.resolve().then(function () {
|
|
103
|
+
return new FileHandle(fs.openSync(path, flags, mode));
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const api = {
|
|
107
|
+
open: open,
|
|
108
|
+
readFile: promisify(fs.readFileSync),
|
|
109
|
+
writeFile: promisify(fs.writeFileSync),
|
|
110
|
+
appendFile: promisify(fs.appendFileSync),
|
|
111
|
+
stat: promisify(fs.statSync),
|
|
112
|
+
lstat: promisify(fs.lstatSync),
|
|
113
|
+
readdir: promisify(fs.readdirSync),
|
|
114
|
+
mkdir: promisify(fs.mkdirSync),
|
|
115
|
+
rm: promisify(fs.rmSync),
|
|
116
|
+
unlink: promisify(fs.unlinkSync),
|
|
117
|
+
rmdir: promisify(fs.rmdirSync),
|
|
118
|
+
rename: promisify(fs.renameSync),
|
|
119
|
+
copyFile: promisify(fs.copyFileSync),
|
|
120
|
+
realpath: promisify(fs.realpathSync),
|
|
121
|
+
readlink: promisify(fs.readlinkSync),
|
|
122
|
+
symlink: promisify(fs.symlinkSync),
|
|
123
|
+
chmod: promisify(fs.chmodSync),
|
|
124
|
+
truncate: promisify(fs.truncateSync),
|
|
125
|
+
utimes: promisify(fs.utimesSync),
|
|
126
|
+
access: promisify(fs.accessSync),
|
|
127
|
+
mkdtemp: promisify(fs.mkdtempSync),
|
|
128
|
+
constants: fs.constants
|
|
129
|
+
};
|
|
130
|
+
module.exports = api;
|