diff --git a/app/modules/fs.lua b/app/modules/fs.lua index 81015a60b..9f9f292f3 100644 --- a/app/modules/fs.lua +++ b/app/modules/fs.lua @@ -412,7 +412,8 @@ function fs.WriteStream:open(callback) if err then self:destroy() self:emit('error', err) - if callback then return callback(err) end + if callback then callback(err) end + return end self.fd = fd self:emit('open', fd) @@ -441,3 +442,33 @@ function fs.WriteStream:destroy() self.fd = nil end end + +fs.WriteStreamSync = fs.WriteStream:extend() +function fs.WriteStreamSync:initialize(path, options) + fs.WriteStream.initialize(self, path, options) +end +function fs.WriteStreamSync:open(callback) + local err + if self.fd then self:destroy() end + self.fd, err = fs.openSync(self.path, "a") + if err then + self:destroy() + self:emit('error', err) + if callback then callback(err) end + return + end + self:emit('open', self.fd) + if callback then callback() end +end +function fs.WriteStreamSync:_write(data, encoding, callback) + if not self.fd then + return self:once('open', bind(self._write, self, data, encoding, callback)) + end + local written, err = fs.writeSync(self.fd, data, -1) + if err then + self:destroy() + return callback(err) + end + self.bytesWritten = self.bytesWritten + written + callback() +end diff --git a/tests/test-fs.lua b/tests/test-fs.lua index 759500c20..aa2146c08 100644 --- a/tests/test-fs.lua +++ b/tests/test-fs.lua @@ -208,4 +208,19 @@ require('tap')(function (test) end))() end) + test("writestream sync", function() + local stream, filename, writeStr, data + + writeStr = "hello world" + filename = "testfile.txt" + fs.unlinkSync(filename) + + stream = fs.WriteStreamSync:new("testfile.txt") + stream:write(writeStr) + stream:destroy() + + data = fs.readFileSync(filename) + fs.unlinkSync(filename) + assert(data:find(writeStr) > -1) + end) end)