@bytecodealliance/preview2-shim 0.17.2 → 0.17.4
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 +47 -0
- package/lib/browser/cli.js +76 -103
- package/lib/browser/clocks.js +30 -29
- package/lib/browser/config.js +6 -0
- package/lib/browser/environment.js +29 -0
- package/lib/browser/filesystem.js +299 -255
- package/lib/browser/http.js +129 -128
- package/lib/browser/index.js +8 -16
- package/lib/browser/io.js +143 -135
- package/lib/browser/random.js +44 -42
- package/lib/browser/sockets.js +68 -166
- package/lib/common/instantiation.js +134 -0
- package/lib/io/calls.js +8 -5
- package/lib/io/worker-http.js +179 -157
- package/lib/io/worker-io.js +402 -386
- package/lib/io/worker-socket-tcp.js +271 -219
- package/lib/io/worker-socket-udp.js +494 -429
- package/lib/io/worker-sockets.js +255 -241
- package/lib/io/worker-thread.js +837 -754
- package/lib/nodejs/cli.js +64 -63
- package/lib/nodejs/clocks.js +51 -45
- package/lib/nodejs/filesystem.js +785 -651
- package/lib/nodejs/http.js +697 -617
- package/lib/nodejs/index.js +8 -16
- package/lib/nodejs/random.js +32 -28
- package/lib/nodejs/sockets.js +538 -474
- package/lib/synckit/index.js +94 -85
- package/package.json +11 -5
- package/types/index.d.ts +0 -1
- package/types/instantiation.d.ts +136 -0
|
@@ -1,286 +1,330 @@
|
|
|
1
1
|
import { streams } from './io.js';
|
|
2
|
-
import { environment } from './
|
|
2
|
+
import { environment } from './environment.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
let _cwd = "/";
|
|
4
|
+
import { _setCwd } from './config.js';
|
|
5
|
+
export { _setCwd } from './config.js';
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
_cwd = cwd;
|
|
10
|
-
}
|
|
7
|
+
const { InputStream, OutputStream } = streams;
|
|
11
8
|
|
|
12
|
-
export function _setFileData
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
export function _setFileData(fileData) {
|
|
10
|
+
_fileData = fileData;
|
|
11
|
+
_rootPreopen[0] = new Descriptor(fileData);
|
|
12
|
+
const cwd = environment.initialCwd();
|
|
13
|
+
_setCwd(cwd || '/');
|
|
17
14
|
}
|
|
18
15
|
|
|
19
|
-
export function _getFileData
|
|
20
|
-
|
|
16
|
+
export function _getFileData() {
|
|
17
|
+
return JSON.stringify(_fileData);
|
|
21
18
|
}
|
|
22
19
|
|
|
23
20
|
let _fileData = { dir: {} };
|
|
24
21
|
|
|
25
22
|
const timeZero = {
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
seconds: BigInt(0),
|
|
24
|
+
nanoseconds: 0,
|
|
28
25
|
};
|
|
29
26
|
|
|
30
|
-
function getChildEntry
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
27
|
+
function getChildEntry(parentEntry, subpath, openFlags) {
|
|
28
|
+
if (
|
|
29
|
+
subpath === '.' &&
|
|
30
|
+
_rootPreopen &&
|
|
31
|
+
descriptorGetEntry(_rootPreopen[0]) === parentEntry
|
|
32
|
+
) {
|
|
33
|
+
subpath = _cwd;
|
|
34
|
+
if (subpath.startsWith('/') && subpath !== '/') {
|
|
35
|
+
subpath = subpath.slice(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
let entry = parentEntry;
|
|
39
|
+
let segmentIdx;
|
|
40
|
+
do {
|
|
41
|
+
if (!entry || !entry.dir) {
|
|
42
|
+
throw 'not-directory';
|
|
43
|
+
}
|
|
44
|
+
segmentIdx = subpath.indexOf('/');
|
|
45
|
+
const segment =
|
|
46
|
+
segmentIdx === -1 ? subpath : subpath.slice(0, segmentIdx);
|
|
47
|
+
if (segment === '..') {
|
|
48
|
+
throw 'no-entry';
|
|
49
|
+
}
|
|
50
|
+
if (segment === '.' || segment === '') {
|
|
51
|
+
} else if (!entry.dir[segment] && openFlags.create) {
|
|
52
|
+
entry = entry.dir[segment] = openFlags.directory
|
|
53
|
+
? { dir: {} }
|
|
54
|
+
: { source: new Uint8Array([]) };
|
|
55
|
+
} else {
|
|
56
|
+
entry = entry.dir[segment];
|
|
57
|
+
}
|
|
58
|
+
subpath = subpath.slice(segmentIdx + 1);
|
|
59
|
+
} while (segmentIdx !== -1);
|
|
60
|
+
if (!entry) {
|
|
61
|
+
throw 'no-entry';
|
|
62
|
+
}
|
|
63
|
+
return entry;
|
|
52
64
|
}
|
|
53
65
|
|
|
54
|
-
function getSource
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
function getSource(fileEntry) {
|
|
67
|
+
if (typeof fileEntry.source === 'string') {
|
|
68
|
+
fileEntry.source = new TextEncoder().encode(fileEntry.source);
|
|
69
|
+
}
|
|
70
|
+
return fileEntry.source;
|
|
59
71
|
}
|
|
60
72
|
|
|
61
73
|
class DirectoryEntryStream {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
constructor(entries) {
|
|
75
|
+
this.idx = 0;
|
|
76
|
+
this.entries = entries;
|
|
77
|
+
}
|
|
78
|
+
readDirectoryEntry() {
|
|
79
|
+
if (this.idx === this.entries.length) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const [name, entry] = this.entries[this.idx];
|
|
83
|
+
this.idx += 1;
|
|
84
|
+
return {
|
|
85
|
+
name,
|
|
86
|
+
type: entry.dir ? 'directory' : 'regular-file',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
class Descriptor {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
92
|
+
#stream;
|
|
93
|
+
#entry;
|
|
94
|
+
#mtime = 0;
|
|
95
|
+
|
|
96
|
+
_getEntry(descriptor) {
|
|
97
|
+
return descriptor.#entry;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
constructor(entry, isStream) {
|
|
101
|
+
if (isStream) {
|
|
102
|
+
this.#stream = entry;
|
|
103
|
+
} else {
|
|
104
|
+
this.#entry = entry;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
readViaStream(_offset) {
|
|
109
|
+
const source = getSource(this.#entry);
|
|
110
|
+
let offset = Number(_offset);
|
|
111
|
+
return new InputStream({
|
|
112
|
+
blockingRead(len) {
|
|
113
|
+
if (offset === source.byteLength) {
|
|
114
|
+
throw { tag: 'closed' };
|
|
115
|
+
}
|
|
116
|
+
const bytes = source.slice(offset, offset + Number(len));
|
|
117
|
+
offset += bytes.byteLength;
|
|
118
|
+
return bytes;
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
writeViaStream(_offset) {
|
|
124
|
+
const entry = this.#entry;
|
|
125
|
+
let offset = Number(_offset);
|
|
126
|
+
return new OutputStream({
|
|
127
|
+
write(buf) {
|
|
128
|
+
const newSource = new Uint8Array(
|
|
129
|
+
buf.byteLength + entry.source.byteLength
|
|
130
|
+
);
|
|
131
|
+
newSource.set(entry.source, 0);
|
|
132
|
+
newSource.set(buf, offset);
|
|
133
|
+
offset += buf.byteLength;
|
|
134
|
+
entry.source = newSource;
|
|
135
|
+
return buf.byteLength;
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
appendViaStream() {
|
|
141
|
+
console.log(`[filesystem] APPEND STREAM`);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
advise(descriptor, offset, length, advice) {
|
|
145
|
+
console.log(`[filesystem] ADVISE`, descriptor, offset, length, advice);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
syncData() {
|
|
149
|
+
console.log(`[filesystem] SYNC DATA`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
getFlags() {
|
|
153
|
+
console.log(`[filesystem] FLAGS FOR`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
getType() {
|
|
157
|
+
if (this.#stream) {
|
|
158
|
+
return 'fifo';
|
|
159
|
+
}
|
|
160
|
+
if (this.#entry.dir) {
|
|
161
|
+
return 'directory';
|
|
162
|
+
}
|
|
163
|
+
if (this.#entry.source) {
|
|
164
|
+
return 'regular-file';
|
|
165
|
+
}
|
|
166
|
+
return 'unknown';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
setSize(size) {
|
|
170
|
+
console.log(`[filesystem] SET SIZE`, size);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
setTimes(dataAccessTimestamp, dataModificationTimestamp) {
|
|
174
|
+
console.log(
|
|
175
|
+
`[filesystem] SET TIMES`,
|
|
176
|
+
dataAccessTimestamp,
|
|
177
|
+
dataModificationTimestamp
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
read(length, offset) {
|
|
182
|
+
const source = getSource(this.#entry);
|
|
183
|
+
return [
|
|
184
|
+
source.slice(offset, offset + length),
|
|
185
|
+
offset + length >= source.byteLength,
|
|
186
|
+
];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
write(buffer, offset) {
|
|
190
|
+
if (offset !== 0) {
|
|
191
|
+
throw 'invalid-seek';
|
|
192
|
+
}
|
|
193
|
+
this.#entry.source = buffer;
|
|
194
|
+
return buffer.byteLength;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
readDirectory() {
|
|
198
|
+
if (!this.#entry?.dir) {
|
|
199
|
+
throw 'bad-descriptor';
|
|
200
|
+
}
|
|
201
|
+
return new DirectoryEntryStream(
|
|
202
|
+
Object.entries(this.#entry.dir).sort(([a], [b]) => (a > b ? 1 : -1))
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
sync() {
|
|
207
|
+
console.log(`[filesystem] SYNC`);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
createDirectoryAt(path) {
|
|
211
|
+
const entry = getChildEntry(this.#entry, path, {
|
|
212
|
+
create: true,
|
|
213
|
+
directory: true,
|
|
214
|
+
});
|
|
215
|
+
if (entry.source) {
|
|
216
|
+
throw 'exist';
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
stat() {
|
|
221
|
+
let type = 'unknown',
|
|
222
|
+
size = BigInt(0);
|
|
223
|
+
if (this.#entry.source) {
|
|
224
|
+
type = 'regular-file';
|
|
225
|
+
const source = getSource(this.#entry);
|
|
226
|
+
size = BigInt(source.byteLength);
|
|
227
|
+
} else if (this.#entry.dir) {
|
|
228
|
+
type = 'directory';
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
type,
|
|
232
|
+
linkCount: BigInt(0),
|
|
233
|
+
size,
|
|
234
|
+
dataAccessTimestamp: timeZero,
|
|
235
|
+
dataModificationTimestamp: timeZero,
|
|
236
|
+
statusChangeTimestamp: timeZero,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
statAt(_pathFlags, path) {
|
|
241
|
+
const entry = getChildEntry(this.#entry, path, {
|
|
242
|
+
create: false,
|
|
243
|
+
directory: false,
|
|
244
|
+
});
|
|
245
|
+
let type = 'unknown',
|
|
246
|
+
size = BigInt(0);
|
|
247
|
+
if (entry.source) {
|
|
248
|
+
type = 'regular-file';
|
|
249
|
+
const source = getSource(entry);
|
|
250
|
+
size = BigInt(source.byteLength);
|
|
251
|
+
} else if (entry.dir) {
|
|
252
|
+
type = 'directory';
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
type,
|
|
256
|
+
linkCount: BigInt(0),
|
|
257
|
+
size,
|
|
258
|
+
dataAccessTimestamp: timeZero,
|
|
259
|
+
dataModificationTimestamp: timeZero,
|
|
260
|
+
statusChangeTimestamp: timeZero,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
setTimesAt() {
|
|
265
|
+
console.log(`[filesystem] SET TIMES AT`);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
linkAt() {
|
|
269
|
+
console.log(`[filesystem] LINK AT`);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
openAt(_pathFlags, path, openFlags, _descriptorFlags, _modes) {
|
|
273
|
+
const childEntry = getChildEntry(this.#entry, path, openFlags);
|
|
274
|
+
return new Descriptor(childEntry);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
readlinkAt() {
|
|
278
|
+
console.log(`[filesystem] READLINK AT`);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
removeDirectoryAt() {
|
|
282
|
+
console.log(`[filesystem] REMOVE DIR AT`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
renameAt() {
|
|
286
|
+
console.log(`[filesystem] RENAME AT`);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
symlinkAt() {
|
|
290
|
+
console.log(`[filesystem] SYMLINK AT`);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
unlinkFileAt() {
|
|
294
|
+
console.log(`[filesystem] UNLINK FILE AT`);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
isSameObject(other) {
|
|
298
|
+
return other === this;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
metadataHash() {
|
|
302
|
+
let upper = BigInt(0);
|
|
303
|
+
upper += BigInt(this.#mtime);
|
|
304
|
+
return { upper, lower: BigInt(0) };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
metadataHashAt(_pathFlags, _path) {
|
|
308
|
+
let upper = BigInt(0);
|
|
309
|
+
upper += BigInt(this.#mtime);
|
|
310
|
+
return { upper, lower: BigInt(0) };
|
|
311
|
+
}
|
|
269
312
|
}
|
|
270
313
|
const descriptorGetEntry = Descriptor.prototype._getEntry;
|
|
271
314
|
delete Descriptor.prototype._getEntry;
|
|
272
315
|
|
|
273
|
-
let _preopens = [[new Descriptor(_fileData), '/']],
|
|
316
|
+
let _preopens = [[new Descriptor(_fileData), '/']],
|
|
317
|
+
_rootPreopen = _preopens[0];
|
|
274
318
|
|
|
275
319
|
export const preopens = {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
320
|
+
getDirectories() {
|
|
321
|
+
return _preopens;
|
|
322
|
+
},
|
|
323
|
+
};
|
|
280
324
|
|
|
281
325
|
export const types = {
|
|
282
|
-
|
|
283
|
-
|
|
326
|
+
Descriptor,
|
|
327
|
+
DirectoryEntryStream,
|
|
284
328
|
};
|
|
285
329
|
|
|
286
|
-
export { types as filesystemTypes }
|
|
330
|
+
export { types as filesystemTypes };
|