blob: 291004ae9a0fb0ee105e90c4817c405c9bc0fecd [file] [log] [blame]
/**
* @license
* Copyright 2022 The Emscripten Authors
* SPDX-License-Identifier: MIT
*/
addToLibrary({
$wasmfsNodeIsWindows: !!process.platform.match(/^win/),
$wasmfsNodeConvertNodeCode__deps: ['$ERRNO_CODES'],
$wasmfsNodeConvertNodeCode: (e) => {
var code = e.code;
#if ASSERTIONS
assert(code in ERRNO_CODES, 'unexpected node error code: ' + code + ' (' + e + ')');
#endif
return ERRNO_CODES[code];
},
$wasmfsTry__deps: ['$wasmfsNodeConvertNodeCode'],
$wasmfsTry: (f) => {
try {
return f();
} catch (e) {
if (!e.code) throw e;
return wasmfsNodeConvertNodeCode(e);
}
},
$wasmfsNodeFixStat__deps: ['$wasmfsNodeIsWindows'],
$wasmfsNodeFixStat: (stat) => {
if (wasmfsNodeIsWindows) {
// Node.js on Windows never represents permission bit 'x', so
// propagate read bits to execute bits
stat.mode |= (stat.mode & {{{ cDefs.S_IRUSR | cDefs.S_IRGRP | cDefs.S_IROTH }}}) >> 2;
}
return stat;
},
$wasmfsNodeLstat__deps: ['$wasmfsNodeFixStat'],
$wasmfsNodeLstat: (path) => {
let stat;
try {
stat = fs.lstatSync(path);
} catch (e) {
if (!e.code) throw e;
return undefined;
}
return wasmfsNodeFixStat(stat);
},
$wasmfsNodeFstat__deps: ['$wasmfsNodeFixStat'],
$wasmfsNodeFstat: (fd) => {
let stat;
try {
stat = fs.fstatSync(fd);
} catch (e) {
if (!e.code) throw e;
return undefined;
}
return wasmfsNodeFixStat(stat);
},
// Ignore closure type errors due to outdated readdirSync annotations, see
// https://github.com/google/closure-compiler/pull/4093
_wasmfs_node_readdir__docs: '/** @suppress {checkTypes} */',
_wasmfs_node_readdir__deps: [
'$wasmfsTry',
'$stackSave',
'$stackRestore',
'$stringToUTF8OnStack',
'_wasmfs_node_record_dirent',
],
_wasmfs_node_readdir: (path_p, vec) => {
let path = UTF8ToString(path_p);
return wasmfsTry(() => {
let entries = fs.readdirSync(path, { withFileTypes: true });
entries.forEach((entry) => {
let sp = stackSave();
let name = stringToUTF8OnStack(entry.name);
let type;
if (entry.isFile()) {
type = {{{ cDefine('File::DataFileKind') }}};
} else if (entry.isDirectory()) {
type = {{{ cDefine('File::DirectoryKind') }}};
} else if (entry.isSymbolicLink()) {
type = {{{ cDefine('File::SymlinkKind') }}};
} else {
type = {{{ cDefine('File::UnknownKind') }}};
}
__wasmfs_node_record_dirent(vec, name, type);
stackRestore(sp);
// implicitly return 0
});
});
},
_wasmfs_node_get_mode__deps: ['$wasmfsNodeLstat'],
_wasmfs_node_get_mode: (path_p, mode_p) => {
let stat = wasmfsNodeLstat(UTF8ToString(path_p));
if (stat === undefined) {
return 1;
}
{{{ makeSetValue('mode_p', 0, 'stat.mode', 'i32') }}};
// implicitly return 0
},
_wasmfs_node_stat_size__deps: ['$wasmfsNodeLstat'],
_wasmfs_node_stat_size: (path_p, size_p) => {
let stat = wasmfsNodeLstat(UTF8ToString(path_p));
if (stat === undefined) {
return 1;
}
{{{ makeSetValue('size_p', 0, 'stat.size', 'i32') }}};
// implicitly return 0
},
_wasmfs_node_fstat_size__deps: ['$wasmfsNodeFstat'],
_wasmfs_node_fstat_size: (fd, size_p) => {
let stat = wasmfsNodeFstat(fd);
if (stat === undefined) {
return 1;
}
{{{ makeSetValue('size_p', 0, 'stat.size', 'i32') }}};
// implicitly return 0
},
_wasmfs_node_insert_file__deps: ['$wasmfsTry'],
_wasmfs_node_insert_file: (path_p, mode) => {
return wasmfsTry(() => {
fs.closeSync(fs.openSync(UTF8ToString(path_p), 'ax', mode));
// implicitly return 0
});
},
_wasmfs_node_insert_directory__deps: ['$wasmfsTry'],
_wasmfs_node_insert_directory: (path_p, mode) => {
return wasmfsTry(() => {
fs.mkdirSync(UTF8ToString(path_p), mode)
// implicitly return 0
});
},
_wasmfs_node_unlink__deps: ['$wasmfsTry'],
_wasmfs_node_unlink: (path_p) => {
return wasmfsTry(() => {
fs.unlinkSync(UTF8ToString(path_p))
// implicitly return 0
});
},
_wasmfs_node_rmdir__deps: ['$wasmfsTry'],
_wasmfs_node_rmdir: (path_p) => {
return wasmfsTry(() => {
fs.rmdirSync(UTF8ToString(path_p))
// implicitly return 0
});
},
_wasmfs_node_truncate__i53abi: true,
_wasmfs_node_truncate__deps : ['$wasmfsTry'],
_wasmfs_node_truncate : (path_p, len) => {
if (isNaN(len)) return -{{{ cDefs.EOVERFLOW }}};
return wasmfsTry(() => fs.truncateSync(UTF8ToString(path_p), len));
},
_wasmfs_node_ftruncate__i53abi: true,
_wasmfs_node_ftruncate__deps : ['$wasmfsTry'],
_wasmfs_node_ftruncate : (fd, len) => {
if (isNaN(len)) return -{{{ cDefs.EOVERFLOW }}};
return wasmfsTry(() => fs.ftruncateSync(fd, len));
},
_wasmfs_node_open__deps: ['$wasmfsTry'],
_wasmfs_node_open: (path_p, mode_p) => {
return wasmfsTry(() => fs.openSync(UTF8ToString(path_p), UTF8ToString(mode_p)));
},
_wasmfs_node_rename__deps: ['$wasmfsTry'],
_wasmfs_node_rename: (from_path_p, to_path_p) => {
return wasmfsTry(() => fs.renameSync(UTF8ToString(from_path_p), UTF8ToString(to_path_p)));
},
_wasmfs_node_symlink__deps: ['$wasmfsTry'],
_wasmfs_node_symlink: (target_path_p, linkpath_path_p) => {
return wasmfsTry(() => fs.symlinkSync(UTF8ToString(target_path_p), UTF8ToString(linkpath_path_p)));
},
_wasmfs_node_readlink__deps: ['$wasmfsTry'],
_wasmfs_node_readlink: (path_p, target_p, bufsize) => {
return wasmfsTry(() => {
var target = fs.readlinkSync(UTF8ToString(path_p));
return stringToUTF8(target, target_p, bufsize);
});
},
_wasmfs_node_close__deps: [],
_wasmfs_node_close: (fd) => {
return wasmfsTry(() => {
fs.closeSync(fd);
// implicitly return 0
});
},
_wasmfs_node_read__deps: ['$wasmfsTry'],
_wasmfs_node_read: (fd, buf_p, len, pos, nread_p) => {
return wasmfsTry(() => {
// TODO: Cache open file descriptors to guarantee that opened files will
// still exist when we try to access them.
let nread = fs.readSync(fd, new Int8Array(HEAPU8.buffer, buf_p, len), 0, len, pos);
{{{ makeSetValue('nread_p', 0, 'nread', 'i32') }}};
// implicitly return 0
});
},
_wasmfs_node_write__deps : ['$wasmfsTry'],
_wasmfs_node_write : (fd, buf_p, len, pos, nwritten_p) => {
return wasmfsTry(() => {
// TODO: Cache open file descriptors to guarantee that opened files will
// still exist when we try to access them.
let nwritten = fs.writeSync(fd, new Int8Array(HEAPU8.buffer, buf_p, len), 0, len, pos);
{{{ makeSetValue('nwritten_p', 0, 'nwritten', 'i32') }}};
// implicitly return 0
});
},
});