@bytecodealliance/preview2-shim 0.18.1 → 0.20.0
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/README.md +15 -15
- package/dist/browser/cli.d.ts +16 -0
- package/dist/browser/cli.js +109 -0
- package/dist/browser/clocks.d.ts +3 -0
- package/dist/browser/clocks.js +36 -0
- package/dist/browser/config.d.ts +2 -0
- package/{lib → dist}/browser/config.js +2 -4
- package/dist/browser/environment.d.ts +5 -0
- package/dist/browser/environment.js +24 -0
- package/dist/browser/filesystem.d.ts +132 -0
- package/dist/browser/filesystem.js +488 -0
- package/dist/browser/http.d.ts +4 -0
- package/dist/browser/http.js +643 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.js +7 -0
- package/dist/browser/io.d.ts +58 -0
- package/dist/browser/io.js +205 -0
- package/dist/browser/random.d.ts +4 -0
- package/dist/browser/random.js +49 -0
- package/dist/browser/sockets.d.ts +8 -0
- package/dist/browser/sockets.js +66 -0
- package/dist/common/instantiation.d.ts +97 -0
- package/dist/common/instantiation.js +228 -0
- package/dist/io/calls.d.ts +91 -0
- package/{lib → dist}/io/calls.js +4 -19
- package/dist/io/worker-http.d.ts +17 -0
- package/dist/io/worker-http.js +192 -0
- package/dist/io/worker-io.d.ts +84 -0
- package/dist/io/worker-io.js +381 -0
- package/dist/io/worker-socket-tcp.d.ts +34 -0
- package/dist/io/worker-socket-tcp.js +251 -0
- package/dist/io/worker-socket-udp.d.ts +54 -0
- package/dist/io/worker-socket-udp.js +493 -0
- package/dist/io/worker-sockets.d.ts +32 -0
- package/dist/io/worker-sockets.js +265 -0
- package/dist/io/worker-thread.d.ts +73 -0
- package/dist/io/worker-thread.js +794 -0
- package/dist/nodejs/cli.d.ts +30 -0
- package/dist/nodejs/cli.js +86 -0
- package/dist/nodejs/clocks.d.ts +3 -0
- package/dist/nodejs/clocks.js +61 -0
- package/dist/nodejs/filesystem.d.ts +113 -0
- package/dist/nodejs/filesystem.js +761 -0
- package/dist/nodejs/http.d.ts +82 -0
- package/dist/nodejs/http.js +674 -0
- package/dist/nodejs/index.d.ts +7 -0
- package/dist/nodejs/index.js +7 -0
- package/dist/nodejs/io.d.ts +1 -0
- package/dist/nodejs/io.js +1 -0
- package/dist/nodejs/random.d.ts +4 -0
- package/dist/nodejs/random.js +42 -0
- package/dist/nodejs/sockets.d.ts +21 -0
- package/dist/nodejs/sockets.js +482 -0
- package/dist/synckit/index.d.ts +2 -0
- package/dist/synckit/index.js +117 -0
- package/package.json +28 -15
- package/types/instantiation.d.ts +7 -7
- package/lib/browser/cli.js +0 -135
- package/lib/browser/clocks.js +0 -39
- package/lib/browser/environment.js +0 -29
- package/lib/browser/filesystem.js +0 -503
- package/lib/browser/http.js +0 -707
- package/lib/browser/index.js +0 -9
- package/lib/browser/io.js +0 -262
- package/lib/browser/random.js +0 -56
- package/lib/browser/sockets.js +0 -88
- package/lib/common/instantiation.js +0 -253
- package/lib/io/worker-http.js +0 -206
- package/lib/io/worker-io.js +0 -468
- package/lib/io/worker-socket-tcp.js +0 -331
- package/lib/io/worker-socket-udp.js +0 -587
- package/lib/io/worker-sockets.js +0 -364
- package/lib/io/worker-thread.js +0 -1051
- package/lib/nodejs/cli.js +0 -109
- package/lib/nodejs/clocks.js +0 -67
- package/lib/nodejs/filesystem.js +0 -829
- package/lib/nodejs/http.js +0 -764
- package/lib/nodejs/index.js +0 -9
- package/lib/nodejs/io.js +0 -1
- package/lib/nodejs/random.js +0 -49
- package/lib/nodejs/sockets.js +0 -565
- package/lib/synckit/index.js +0 -127
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { inputStreamCreate, outputStreamCreate } from "./io.js";
|
|
2
|
+
import { environment } from "./environment.js";
|
|
3
|
+
import { _setCwd, _getCwd } from "./config.js";
|
|
4
|
+
export { _setCwd } from "./config.js";
|
|
5
|
+
export function _setFileData(fileData) {
|
|
6
|
+
_fileData = fileData;
|
|
7
|
+
_rootPreopen[0] = descriptorCreate(fileData);
|
|
8
|
+
const cwd = environment.initialCwd();
|
|
9
|
+
_setCwd(cwd || "/");
|
|
10
|
+
}
|
|
11
|
+
export function _getFileData() {
|
|
12
|
+
return JSON.stringify(_fileData);
|
|
13
|
+
}
|
|
14
|
+
let _fileData = { dir: {} };
|
|
15
|
+
const timeZero = {
|
|
16
|
+
seconds: 0n,
|
|
17
|
+
nanoseconds: 0,
|
|
18
|
+
};
|
|
19
|
+
/** Coerce the given object to a safe integer */
|
|
20
|
+
function coerceToSafeIntegerNumber(obj) {
|
|
21
|
+
let n;
|
|
22
|
+
if (typeof obj === "number") {
|
|
23
|
+
n = obj;
|
|
24
|
+
}
|
|
25
|
+
else if (typeof obj == "bigint") {
|
|
26
|
+
n = Number(obj);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
throw new TypeError(`unexpected non-numeric type: ${obj}`);
|
|
30
|
+
}
|
|
31
|
+
if (n > Number.MAX_SAFE_INTEGER) {
|
|
32
|
+
throw new TypeError(`excessively large number: ${n}`);
|
|
33
|
+
}
|
|
34
|
+
return n;
|
|
35
|
+
}
|
|
36
|
+
function getChildEntry(parentEntry, subpath, openFlags) {
|
|
37
|
+
if (subpath === "." && _rootPreopen && descriptorGetEntry(_rootPreopen[0]) === parentEntry) {
|
|
38
|
+
subpath = _getCwd();
|
|
39
|
+
if (subpath.startsWith("/") && subpath !== "/") {
|
|
40
|
+
subpath = subpath.slice(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let entry = parentEntry;
|
|
44
|
+
let segmentIdx;
|
|
45
|
+
do {
|
|
46
|
+
if (!entry?.dir) {
|
|
47
|
+
throw "not-directory";
|
|
48
|
+
}
|
|
49
|
+
segmentIdx = subpath.indexOf("/");
|
|
50
|
+
const segment = segmentIdx === -1 ? subpath : subpath.slice(0, segmentIdx);
|
|
51
|
+
if (segment === "..") {
|
|
52
|
+
throw "no-entry";
|
|
53
|
+
}
|
|
54
|
+
if (segment === "." || segment === "") {
|
|
55
|
+
}
|
|
56
|
+
else if (!entry.dir[segment] && openFlags.create) {
|
|
57
|
+
entry = entry.dir[segment] = openFlags.directory
|
|
58
|
+
? { dir: {} }
|
|
59
|
+
: { source: new Uint8Array([]) };
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
entry = entry.dir[segment];
|
|
63
|
+
}
|
|
64
|
+
subpath = subpath.slice(segmentIdx + 1);
|
|
65
|
+
} while (segmentIdx !== -1);
|
|
66
|
+
if (!entry) {
|
|
67
|
+
throw "no-entry";
|
|
68
|
+
}
|
|
69
|
+
return entry;
|
|
70
|
+
}
|
|
71
|
+
function getSource(fileEntry) {
|
|
72
|
+
if (typeof fileEntry.source === "string") {
|
|
73
|
+
fileEntry.source = new TextEncoder().encode(fileEntry.source);
|
|
74
|
+
}
|
|
75
|
+
return fileEntry.source;
|
|
76
|
+
}
|
|
77
|
+
// Keep spare capacity separate so FileDataEntry.source always reflects the logical file size.
|
|
78
|
+
const fileWriteBuffers = new WeakMap();
|
|
79
|
+
function getFileWriteBuffer(entry, source, requiredLength) {
|
|
80
|
+
let buffer = fileWriteBuffers.get(entry);
|
|
81
|
+
if (!buffer || buffer.buffer !== source.buffer || buffer.byteOffset !== source.byteOffset) {
|
|
82
|
+
buffer = source;
|
|
83
|
+
}
|
|
84
|
+
if (requiredLength <= buffer.byteLength) {
|
|
85
|
+
return buffer;
|
|
86
|
+
}
|
|
87
|
+
const newBuffer = new Uint8Array(Math.max(requiredLength, source.byteLength * 2));
|
|
88
|
+
newBuffer.set(source);
|
|
89
|
+
fileWriteBuffers.set(entry, newBuffer);
|
|
90
|
+
return newBuffer;
|
|
91
|
+
}
|
|
92
|
+
class DirectoryEntryStream {
|
|
93
|
+
idx = 0;
|
|
94
|
+
entries = [];
|
|
95
|
+
static _create(entries) {
|
|
96
|
+
const stream = new DirectoryEntryStream();
|
|
97
|
+
stream.entries = entries;
|
|
98
|
+
return stream;
|
|
99
|
+
}
|
|
100
|
+
readDirectoryEntry() {
|
|
101
|
+
if (this.idx === this.entries.length) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
const [name, entry] = this.entries[this.idx];
|
|
105
|
+
this.idx += 1;
|
|
106
|
+
return {
|
|
107
|
+
name,
|
|
108
|
+
type: entry.dir ? "directory" : "regular-file",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const descriptorEntryStreamCreate = DirectoryEntryStream._create;
|
|
113
|
+
// @ts-expect-error - Deleting static method
|
|
114
|
+
delete DirectoryEntryStream._create;
|
|
115
|
+
class Descriptor {
|
|
116
|
+
#stream;
|
|
117
|
+
#entry;
|
|
118
|
+
#mtime = 0;
|
|
119
|
+
_getEntry(descriptor) {
|
|
120
|
+
return descriptor.#entry;
|
|
121
|
+
}
|
|
122
|
+
static _create(entry, isStream) {
|
|
123
|
+
const descriptor = new Descriptor();
|
|
124
|
+
if (isStream) {
|
|
125
|
+
descriptor.#stream = entry;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
descriptor.#entry = entry;
|
|
129
|
+
}
|
|
130
|
+
return descriptor;
|
|
131
|
+
}
|
|
132
|
+
readViaStream(_offset) {
|
|
133
|
+
const source = getSource(this.#entry);
|
|
134
|
+
let offset = Number(_offset);
|
|
135
|
+
return inputStreamCreate({
|
|
136
|
+
blockingRead(len) {
|
|
137
|
+
if (offset === source.byteLength) {
|
|
138
|
+
throw { tag: "closed" };
|
|
139
|
+
}
|
|
140
|
+
const bytes = source.slice(offset, offset + Number(len));
|
|
141
|
+
offset += bytes.byteLength;
|
|
142
|
+
return bytes;
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
writeViaStream(_offset) {
|
|
147
|
+
const entry = this.#entry;
|
|
148
|
+
let offset = coerceToSafeIntegerNumber(_offset);
|
|
149
|
+
return outputStreamCreate({
|
|
150
|
+
write(buf) {
|
|
151
|
+
if (buf.byteLength === 0) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const source = getSource(entry);
|
|
155
|
+
const end = offset + buf.byteLength;
|
|
156
|
+
if (!Number.isSafeInteger(end)) {
|
|
157
|
+
throw new TypeError(`excessively large number: ${end}`);
|
|
158
|
+
}
|
|
159
|
+
const buffer = getFileWriteBuffer(entry, source, end);
|
|
160
|
+
if (offset > source.byteLength) {
|
|
161
|
+
buffer.fill(0, source.byteLength, offset);
|
|
162
|
+
}
|
|
163
|
+
buffer.set(buf, offset);
|
|
164
|
+
entry.source = buffer.subarray(0, Math.max(source.byteLength, end));
|
|
165
|
+
offset = end;
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
appendViaStream() {
|
|
170
|
+
console.log(`[filesystem] APPEND STREAM`);
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
advise(offset, length, advice) {
|
|
174
|
+
console.log(`[filesystem] ADVISE`, offset, length, advice);
|
|
175
|
+
}
|
|
176
|
+
syncData() {
|
|
177
|
+
console.log(`[filesystem] SYNC DATA`);
|
|
178
|
+
}
|
|
179
|
+
getFlags() {
|
|
180
|
+
console.log(`[filesystem] FLAGS FOR`);
|
|
181
|
+
return {};
|
|
182
|
+
}
|
|
183
|
+
getType() {
|
|
184
|
+
if (this.#stream) {
|
|
185
|
+
return "fifo";
|
|
186
|
+
}
|
|
187
|
+
if (this.#entry.dir) {
|
|
188
|
+
return "directory";
|
|
189
|
+
}
|
|
190
|
+
if (this.#entry.source) {
|
|
191
|
+
return "regular-file";
|
|
192
|
+
}
|
|
193
|
+
return "unknown";
|
|
194
|
+
}
|
|
195
|
+
setSize(size) {
|
|
196
|
+
console.log(`[filesystem] SET SIZE`, size);
|
|
197
|
+
}
|
|
198
|
+
setTimes(dataAccessTimestamp, dataModificationTimestamp) {
|
|
199
|
+
console.log(`[filesystem] SET TIMES`, dataAccessTimestamp, dataModificationTimestamp);
|
|
200
|
+
}
|
|
201
|
+
read(length, offset) {
|
|
202
|
+
const source = getSource(this.#entry);
|
|
203
|
+
const off = coerceToSafeIntegerNumber(offset);
|
|
204
|
+
const len = coerceToSafeIntegerNumber(length);
|
|
205
|
+
const result = [
|
|
206
|
+
source.slice(off, off + len),
|
|
207
|
+
off + len >= source.byteLength,
|
|
208
|
+
];
|
|
209
|
+
return result;
|
|
210
|
+
}
|
|
211
|
+
write(buffer, offset) {
|
|
212
|
+
if (offset !== 0n) {
|
|
213
|
+
throw "invalid-seek";
|
|
214
|
+
}
|
|
215
|
+
this.#entry.source = buffer;
|
|
216
|
+
return BigInt(buffer.byteLength);
|
|
217
|
+
}
|
|
218
|
+
readDirectory() {
|
|
219
|
+
if (!this.#entry?.dir) {
|
|
220
|
+
throw "bad-descriptor";
|
|
221
|
+
}
|
|
222
|
+
return descriptorEntryStreamCreate(Object.entries(this.#entry.dir).sort(([a], [b]) => (a > b ? 1 : -1)));
|
|
223
|
+
}
|
|
224
|
+
sync() {
|
|
225
|
+
console.log(`[filesystem] SYNC`);
|
|
226
|
+
}
|
|
227
|
+
createDirectoryAt(path) {
|
|
228
|
+
const entry = getChildEntry(this.#entry, path, {
|
|
229
|
+
create: true,
|
|
230
|
+
directory: true,
|
|
231
|
+
});
|
|
232
|
+
if (entry.source) {
|
|
233
|
+
throw "exist";
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
stat() {
|
|
237
|
+
let type = "unknown";
|
|
238
|
+
let size = 0n;
|
|
239
|
+
if (this.#entry.source) {
|
|
240
|
+
type = "regular-file";
|
|
241
|
+
const source = getSource(this.#entry);
|
|
242
|
+
size = BigInt(source.byteLength);
|
|
243
|
+
}
|
|
244
|
+
else if (this.#entry.dir) {
|
|
245
|
+
type = "directory";
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
type,
|
|
249
|
+
linkCount: 0n,
|
|
250
|
+
size,
|
|
251
|
+
dataAccessTimestamp: timeZero,
|
|
252
|
+
dataModificationTimestamp: timeZero,
|
|
253
|
+
statusChangeTimestamp: timeZero,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
statAt(_pathFlags, path) {
|
|
257
|
+
const entry = getChildEntry(this.#entry, path, {
|
|
258
|
+
create: false,
|
|
259
|
+
directory: false,
|
|
260
|
+
});
|
|
261
|
+
let type = "unknown";
|
|
262
|
+
let size = 0n;
|
|
263
|
+
if (entry.source) {
|
|
264
|
+
type = "regular-file";
|
|
265
|
+
const source = getSource(entry);
|
|
266
|
+
size = BigInt(source.byteLength);
|
|
267
|
+
}
|
|
268
|
+
else if (entry.dir) {
|
|
269
|
+
type = "directory";
|
|
270
|
+
}
|
|
271
|
+
return {
|
|
272
|
+
type,
|
|
273
|
+
linkCount: 0n,
|
|
274
|
+
size,
|
|
275
|
+
dataAccessTimestamp: timeZero,
|
|
276
|
+
dataModificationTimestamp: timeZero,
|
|
277
|
+
statusChangeTimestamp: timeZero,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
setTimesAt() {
|
|
281
|
+
console.log(`[filesystem] SET TIMES AT`);
|
|
282
|
+
}
|
|
283
|
+
linkAt() {
|
|
284
|
+
console.log(`[filesystem] LINK AT`);
|
|
285
|
+
}
|
|
286
|
+
openAt(_pathFlags, path, openFlags, _flags) {
|
|
287
|
+
const childEntry = getChildEntry(this.#entry, path, openFlags);
|
|
288
|
+
return descriptorCreate(childEntry);
|
|
289
|
+
}
|
|
290
|
+
readlinkAt(_path) {
|
|
291
|
+
console.log(`[filesystem] READLINK AT`);
|
|
292
|
+
return "";
|
|
293
|
+
}
|
|
294
|
+
removeDirectoryAt() {
|
|
295
|
+
console.log(`[filesystem] REMOVE DIR AT`);
|
|
296
|
+
}
|
|
297
|
+
renameAt() {
|
|
298
|
+
console.log(`[filesystem] RENAME AT`);
|
|
299
|
+
}
|
|
300
|
+
symlinkAt() {
|
|
301
|
+
console.log(`[filesystem] SYMLINK AT`);
|
|
302
|
+
}
|
|
303
|
+
unlinkFileAt() {
|
|
304
|
+
console.log(`[filesystem] UNLINK FILE AT`);
|
|
305
|
+
}
|
|
306
|
+
isSameObject(other) {
|
|
307
|
+
return other === this;
|
|
308
|
+
}
|
|
309
|
+
metadataHash() {
|
|
310
|
+
let upper = 0n;
|
|
311
|
+
upper += BigInt(this.#mtime);
|
|
312
|
+
return { upper, lower: 0n };
|
|
313
|
+
}
|
|
314
|
+
metadataHashAt(_pathFlags, _path) {
|
|
315
|
+
return this.metadataHash();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
const descriptorGetEntry = Descriptor.prototype._getEntry;
|
|
319
|
+
// @ts-expect-error - Deleting prototype method
|
|
320
|
+
delete Descriptor.prototype._getEntry;
|
|
321
|
+
const descriptorCreate = Descriptor._create;
|
|
322
|
+
// @ts-expect-error - Deleting static method
|
|
323
|
+
delete Descriptor._create;
|
|
324
|
+
let _preopens = [[descriptorCreate(_fileData), "/"]];
|
|
325
|
+
let _rootPreopen = _preopens[0];
|
|
326
|
+
export const preopens = {
|
|
327
|
+
getDirectories() {
|
|
328
|
+
return _preopens;
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
/**
|
|
332
|
+
* Replace all preopens with the given set.
|
|
333
|
+
* @param preopensConfig - Map of virtual paths to file data entries
|
|
334
|
+
*/
|
|
335
|
+
export function _setPreopens(preopensConfig) {
|
|
336
|
+
_preopens = [];
|
|
337
|
+
for (const [virtualPath, fileData] of Object.entries(preopensConfig)) {
|
|
338
|
+
_addPreopen(virtualPath, fileData);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Add a single preopen mapping.
|
|
343
|
+
* @param virtualPath - The virtual path visible to the guest
|
|
344
|
+
* @param fileData - The file data object representing the directory
|
|
345
|
+
*/
|
|
346
|
+
export function _addPreopen(virtualPath, fileData) {
|
|
347
|
+
const descriptor = descriptorCreate(fileData);
|
|
348
|
+
_preopens.push([descriptor, virtualPath]);
|
|
349
|
+
if (virtualPath === "/") {
|
|
350
|
+
_rootPreopen = [descriptor, virtualPath];
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Clear all preopens, giving the guest no filesystem access.
|
|
355
|
+
*
|
|
356
|
+
* This functionality exists mostly to maintain backwards compatibility. Prefer setting preopens
|
|
357
|
+
* via `WASIShim` rather than making top level changes to preopens using these functions.
|
|
358
|
+
*/
|
|
359
|
+
export function _clearPreopens() {
|
|
360
|
+
_preopens = [];
|
|
361
|
+
_rootPreopen = null;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Get current preopens configuration.
|
|
365
|
+
* @returns Array of [descriptor, virtualPath] pairs
|
|
366
|
+
*/
|
|
367
|
+
export function _getPreopens() {
|
|
368
|
+
return [..._preopens];
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Create a preopen descriptor for a host path.
|
|
372
|
+
* This is used internally to create isolated preopen instances.
|
|
373
|
+
* @param hostPreopen - The host filesystem path
|
|
374
|
+
* @returns A preopen descriptor
|
|
375
|
+
*/
|
|
376
|
+
export function _createPreopenDescriptor(hostPreopen) {
|
|
377
|
+
_fileData.dir = {
|
|
378
|
+
[hostPreopen]: {},
|
|
379
|
+
};
|
|
380
|
+
return descriptorCreate(_fileData);
|
|
381
|
+
}
|
|
382
|
+
export const types = {
|
|
383
|
+
Descriptor,
|
|
384
|
+
DirectoryEntryStream,
|
|
385
|
+
filesystemErrorCode: (err) => {
|
|
386
|
+
let message;
|
|
387
|
+
if ("payload" in err) {
|
|
388
|
+
message = err.payload;
|
|
389
|
+
}
|
|
390
|
+
else if ("message" in err) {
|
|
391
|
+
message = err.message;
|
|
392
|
+
}
|
|
393
|
+
return convertFsError(message);
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
function convertFsError(e) {
|
|
397
|
+
switch (e.code) {
|
|
398
|
+
case "EACCES":
|
|
399
|
+
return "access";
|
|
400
|
+
case "EAGAIN":
|
|
401
|
+
case "EWOULDBLOCK":
|
|
402
|
+
return "would-block";
|
|
403
|
+
case "EALREADY":
|
|
404
|
+
return "already";
|
|
405
|
+
case "EBADF":
|
|
406
|
+
return "bad-descriptor";
|
|
407
|
+
case "EBUSY":
|
|
408
|
+
return "busy";
|
|
409
|
+
case "EDEADLK":
|
|
410
|
+
return "deadlock";
|
|
411
|
+
case "EDQUOT":
|
|
412
|
+
return "quota";
|
|
413
|
+
case "EEXIST":
|
|
414
|
+
return "exist";
|
|
415
|
+
case "EFBIG":
|
|
416
|
+
return "file-too-large";
|
|
417
|
+
case "EILSEQ":
|
|
418
|
+
return "illegal-byte-sequence";
|
|
419
|
+
case "EINPROGRESS":
|
|
420
|
+
return "in-progress";
|
|
421
|
+
case "EINTR":
|
|
422
|
+
return "interrupted";
|
|
423
|
+
case "EINVAL":
|
|
424
|
+
return "invalid";
|
|
425
|
+
case "EIO":
|
|
426
|
+
return "io";
|
|
427
|
+
case "EISDIR":
|
|
428
|
+
return "is-directory";
|
|
429
|
+
case "ELOOP":
|
|
430
|
+
return "loop";
|
|
431
|
+
case "EMLINK":
|
|
432
|
+
return "too-many-links";
|
|
433
|
+
case "EMSGSIZE":
|
|
434
|
+
return "message-size";
|
|
435
|
+
case "ENAMETOOLONG":
|
|
436
|
+
return "name-too-long";
|
|
437
|
+
case "ENODEV":
|
|
438
|
+
return "no-device";
|
|
439
|
+
case "ENOENT":
|
|
440
|
+
return "no-entry";
|
|
441
|
+
case "ENOLCK":
|
|
442
|
+
return "no-lock";
|
|
443
|
+
case "ENOMEM":
|
|
444
|
+
return "insufficient-memory";
|
|
445
|
+
case "ENOSPC":
|
|
446
|
+
return "insufficient-space";
|
|
447
|
+
case "ENOTDIR":
|
|
448
|
+
case "ERR_FS_EISDIR":
|
|
449
|
+
return "not-directory";
|
|
450
|
+
case "ENOTEMPTY":
|
|
451
|
+
return "not-empty";
|
|
452
|
+
case "ENOTRECOVERABLE":
|
|
453
|
+
return "not-recoverable";
|
|
454
|
+
case "ENOTSUP":
|
|
455
|
+
return "unsupported";
|
|
456
|
+
case "ENOTTY":
|
|
457
|
+
return "no-tty";
|
|
458
|
+
// windows gives this error for badly structured `//` reads
|
|
459
|
+
// this seems like a slightly better error than unknown given
|
|
460
|
+
// that it's a common footgun
|
|
461
|
+
case -4094:
|
|
462
|
+
case "ENXIO":
|
|
463
|
+
return "no-such-device";
|
|
464
|
+
case "EOVERFLOW":
|
|
465
|
+
return "overflow";
|
|
466
|
+
case "EPERM":
|
|
467
|
+
return "not-permitted";
|
|
468
|
+
case "EPIPE":
|
|
469
|
+
return "pipe";
|
|
470
|
+
case "EROFS":
|
|
471
|
+
return "read-only";
|
|
472
|
+
case "ESPIPE":
|
|
473
|
+
return "invalid-seek";
|
|
474
|
+
case "ETXTBSY":
|
|
475
|
+
return "text-file-busy";
|
|
476
|
+
case "EXDEV":
|
|
477
|
+
return "cross-device";
|
|
478
|
+
case "UNKNOWN":
|
|
479
|
+
switch (e.errno) {
|
|
480
|
+
case -4094:
|
|
481
|
+
return "no-such-device";
|
|
482
|
+
default:
|
|
483
|
+
throw e;
|
|
484
|
+
}
|
|
485
|
+
default:
|
|
486
|
+
throw e;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { incomingHandler as IncomingHandlerNamespace, outgoingHandler as OutgoingHandlerNamespace, types as TypesNamespace } from "../../types/http.js";
|
|
2
|
+
export declare const outgoingHandler: typeof OutgoingHandlerNamespace;
|
|
3
|
+
export declare const incomingHandler: typeof IncomingHandlerNamespace;
|
|
4
|
+
export declare const types: typeof TypesNamespace;
|