return 0, errors.New("syscall.Open: O_SYNC is not supported by js/wasm")
}
- jsFD, err := fsCall("openSync", path, flags, perm)
+ jsFD, err := fsCall("open", path, flags, perm)
if err != nil {
return 0, err
}
fd := jsFD.Int()
var entries []string
- if stat, err := fsCall("fstatSync", fd); err == nil && stat.Call("isDirectory").Bool() {
- dir, err := fsCall("readdirSync", path)
+ if stat, err := fsCall("fstat", fd); err == nil && stat.Call("isDirectory").Bool() {
+ dir, err := fsCall("readdir", path)
if err != nil {
return 0, err
}
filesMu.Lock()
delete(files, fd)
filesMu.Unlock()
- _, err := fsCall("closeSync", fd)
+ _, err := fsCall("close", fd)
return err
}
if err := checkPath(path); err != nil {
return err
}
- _, err := fsCall("mkdirSync", path, perm)
+ _, err := fsCall("mkdir", path, perm)
return err
}
if err := checkPath(path); err != nil {
return err
}
- jsSt, err := fsCall("statSync", path)
+ jsSt, err := fsCall("stat", path)
if err != nil {
return err
}
if err := checkPath(path); err != nil {
return err
}
- jsSt, err := fsCall("lstatSync", path)
+ jsSt, err := fsCall("lstat", path)
if err != nil {
return err
}
}
func Fstat(fd int, st *Stat_t) error {
- jsSt, err := fsCall("fstatSync", fd)
+ jsSt, err := fsCall("fstat", fd)
if err != nil {
return err
}
if err := checkPath(path); err != nil {
return err
}
- _, err := fsCall("unlinkSync", path)
+ _, err := fsCall("unlink", path)
return err
}
if err := checkPath(path); err != nil {
return err
}
- _, err := fsCall("rmdirSync", path)
+ _, err := fsCall("rmdir", path)
return err
}
if err := checkPath(path); err != nil {
return err
}
- _, err := fsCall("chmodSync", path, mode)
+ _, err := fsCall("chmod", path, mode)
return err
}
func Fchmod(fd int, mode uint32) error {
- _, err := fsCall("fchmodSync", fd, mode)
+ _, err := fsCall("fchmod", fd, mode)
return err
}
}
atime := ts[0].Sec
mtime := ts[1].Sec
- _, err := fsCall("utimesSync", path, atime, mtime)
+ _, err := fsCall("utimes", path, atime, mtime)
return err
}
if err := checkPath(to); err != nil {
return err
}
- _, err := fsCall("renameSync", from, to)
+ _, err := fsCall("rename", from, to)
return err
}
if err := checkPath(path); err != nil {
return err
}
- _, err := fsCall("truncateSync", path, length)
+ _, err := fsCall("truncate", path, length)
return err
}
func Ftruncate(fd int, length int64) error {
- _, err := fsCall("ftruncateSync", fd, length)
+ _, err := fsCall("ftruncate", fd, length)
return err
}
defer recoverErr(&err)
cwd := jsProcess.Call("cwd").String()
n = copy(buf, cwd)
- return n, nil
+ return
}
func Chdir(path string) (err error) {
if err := checkPath(path); err != nil {
return 0, err
}
- dst, err := fsCall("readlinkSync", path)
+ dst, err := fsCall("readlink", path)
if err != nil {
return 0, err
}
if err := checkPath(link); err != nil {
return err
}
- _, err := fsCall("linkSync", path, link)
+ _, err := fsCall("link", path, link)
return err
}
if err := checkPath(link); err != nil {
return err
}
- _, err := fsCall("symlinkSync", path, link)
+ _, err := fsCall("symlink", path, link)
return err
}
func Fsync(fd int) error {
- _, err := fsCall("fsyncSync", fd)
+ _, err := fsCall("fsync", fd)
return err
}
}
a := js.TypedArrayOf(b)
- n, err := fsCall("readSync", fd, a, 0, len(b))
+ n, err := fsCall("read", fd, a, 0, len(b), nil)
a.Release()
if err != nil {
return 0, err
}
a := js.TypedArrayOf(b)
- n, err := fsCall("writeSync", fd, a, 0, len(b))
+ n, err := fsCall("write", fd, a, 0, len(b), nil)
a.Release()
if err != nil {
return 0, err
func Pread(fd int, b []byte, offset int64) (int, error) {
a := js.TypedArrayOf(b)
- n, err := fsCall("readSync", fd, a, 0, len(b), offset)
+ n, err := fsCall("read", fd, a, 0, len(b), offset)
a.Release()
if err != nil {
return 0, err
func Pwrite(fd int, b []byte, offset int64) (int, error) {
a := js.TypedArrayOf(b)
- n, err := fsCall("writeSync", fd, a, 0, len(b), offset)
+ n, err := fsCall("write", fd, a, 0, len(b), offset)
a.Release()
if err != nil {
return 0, err
return ENOSYS
}
-func fsCall(name string, args ...interface{}) (res js.Value, err error) {
- defer recoverErr(&err)
- res = jsFS.Call(name, args...)
- return
+func fsCall(name string, args ...interface{}) (js.Value, error) {
+ type callResult struct {
+ val js.Value
+ err error
+ }
+
+ c := make(chan callResult)
+ jsFS.Call(name, append(args, js.NewCallback(func(args []js.Value) {
+ var res callResult
+
+ if len(args) >= 1 { // on Node.js 8, fs.utimes calls the callback without any arguments
+ if jsErr := args[0]; jsErr != js.Null() {
+ res.err = mapJSError(jsErr)
+ }
+ }
+
+ res.val = js.Undefined()
+ if len(args) >= 2 {
+ res.val = args[1]
+ }
+
+ c <- res
+ }))...)
+ res := <-c
+ return res.val, res.err
}
// checkPath checks that the path is not empty and that it contains no null characters.
if !ok {
panic(err)
}
- errno, ok := errnoByCode[jsErr.Get("code").String()]
- if !ok {
- panic(err)
- }
- *errPtr = errnoErr(Errno(errno))
+ *errPtr = mapJSError(jsErr.Value)
+ }
+}
+
+// mapJSError maps an error given by Node.js to the appropriate Go error
+func mapJSError(jsErr js.Value) error {
+ errno, ok := errnoByCode[jsErr.Get("code").String()]
+ if !ok {
+ panic(jsErr)
}
+ return errnoErr(Errno(errno))
}