From cec4740679d589d70819bedbb4b03a1641a2f8c0 Mon Sep 17 00:00:00 2001 From: David-Klemenc <44705886+David-Klemenc@users.noreply.github.com> Date: Tue, 17 Nov 2020 21:11:16 +0100 Subject: [PATCH 1/3] chore: added a check for write finish See this issue: https://github.com/lukejacksonn/servor/issues/62 --- utils/common.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/utils/common.js b/utils/common.js index 201abbe..b04aa6d 100644 --- a/utils/common.js +++ b/utils/common.js @@ -1,10 +1,35 @@ const fs = require('fs'); const os = require('os'); const net = require('net'); +const path = require('path'); + +// recursive function that checks if a file is still changing +const awaitWriteFinish = (path, prev, cb) => { + fs.stat(path, { bigint: true }, (err, stat) => { + if (err) { + throw err; + } + if (stat.mtimeNs === prev.mtimeNs) { + cb(); + } else { + setTimeout(awaitWriteFinish, 150, path, stat, cb); + } + }); +}; const fileWatch = process.platform !== 'linux' - ? (x, cb) => fs.watch(x, { recursive: true }, cb) + ? (x, cb) => + fs.watch(x, { recursive: true }, (_, filename) => { + const fileChanged = path.join(x, filename); + fs.stat(fileChanged, { bigint: true }, (err, stat) => { + if (err) { + throw err; + } else { + setTimeout(awaitWriteFinish, 150, fileChanged, stat, cb); + } + }); + }) : (x, cb) => { if (fs.statSync(x).isDirectory()) { fs.watch(x, cb); From 047bb7c5b3e57a5722529bc1995b83d7db38ccef Mon Sep 17 00:00:00 2001 From: David-Klemenc <44705886+David-Klemenc@users.noreply.github.com> Date: Thu, 19 Nov 2020 12:46:20 +0100 Subject: [PATCH 2/3] fix: remove duplicate code --- utils/common.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/utils/common.js b/utils/common.js index b04aa6d..4968e41 100644 --- a/utils/common.js +++ b/utils/common.js @@ -22,13 +22,7 @@ const fileWatch = ? (x, cb) => fs.watch(x, { recursive: true }, (_, filename) => { const fileChanged = path.join(x, filename); - fs.stat(fileChanged, { bigint: true }, (err, stat) => { - if (err) { - throw err; - } else { - setTimeout(awaitWriteFinish, 150, fileChanged, stat, cb); - } - }); + awaitWriteFinish(fileChanged, {}, cb); }) : (x, cb) => { if (fs.statSync(x).isDirectory()) { From 2af603f1d34457fd49cf6554a339591ad0e7907d Mon Sep 17 00:00:00 2001 From: David-Klemenc <44705886+David-Klemenc@users.noreply.github.com> Date: Tue, 24 Nov 2020 15:41:42 +0100 Subject: [PATCH 3/3] chore: after testing 50ms delay also works tested smaller delay of 10ms that also worked - but the delay might be too small for different hardware setups !? --- utils/common.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/common.js b/utils/common.js index 4968e41..2d725f7 100644 --- a/utils/common.js +++ b/utils/common.js @@ -12,7 +12,7 @@ const awaitWriteFinish = (path, prev, cb) => { if (stat.mtimeNs === prev.mtimeNs) { cb(); } else { - setTimeout(awaitWriteFinish, 150, path, stat, cb); + setTimeout(awaitWriteFinish, 50, path, stat, cb); } }); };