index.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. const fs = require('fs');
  2. const assert = require('assert');
  3. const fsread = require('util').promisify(fs.read);
  4. const fileBufferObject = function(path, bufferSize) {
  5. var fd = fs.openSync(path,'r');
  6. var b = Buffer.alloc(bufferSize);
  7. return {fd:fd,b:b,pos:0,size:fs.statSync(path).size};
  8. }
  9. exports.fileBufferObject = fileBufferObject;
  10. // beautiful construct from https://lowrey.me/while-loop-with-es6-promises/
  11. const promiseWhile = (data, condition, action) => {
  12. var whilst = (data) => {
  13. return condition(data) ?
  14. action(data).then(whilst) :
  15. Promise.resolve(data);
  16. }
  17. return whilst(data);
  18. };
  19. var doCompare = function(f1, f2, cb, step, bufferSize) {
  20. assert(step <= bufferSize);
  21. if (f1.size !== f2.size) {
  22. fs.closeSync(f1.fd);
  23. fs.closeSync(f2.fd);
  24. return cb(false);
  25. }
  26. var isDone = false;
  27. const condition = function(data) {
  28. let f1 = data.f1; let f2 = data.f2;
  29. let isEqual = f1.b.equals(f2.b);
  30. let isEnd = (f1.pos === f1.size) || (f2.pos === f2.size);
  31. if (isEqual && isEnd) {
  32. isDone = true;
  33. return false
  34. }
  35. return ((f1.b).equals(f2.b))
  36. };
  37. const action = function(data) {
  38. let f1 = data.f1; let f2 = data.f2;
  39. let p1 = fsread(f1.fd, f1.b, 0, step, f1.pos);
  40. let p2 = fsread(f2.fd, f2.b, 0, step, f2.pos);
  41. let p3 = Promise.all([p1,p2]).then((obj) => {
  42. f1.pos += obj[0].bytesRead;
  43. f2.pos += obj[1].bytesRead;
  44. return { f1 : data.f1, f2 : data.f2 }
  45. });
  46. return p3;
  47. }
  48. let p1 = fsread(f1.fd, f1.b, 0, step, f1.pos);
  49. let p2 = fsread(f2.fd, f2.b, 0, step, f2.pos);
  50. let p3 = Promise.all([p1,p2])
  51. p3.then((obj) => {
  52. f1.pos += obj[0].bytesRead;
  53. f2.pos += obj[1].bytesRead;
  54. if ((f1.pos == f1.size) || (f2.pos == f2.size)) {
  55. if (f1.b.equals(f2.b)) {
  56. return Promise.resolve({ f1, f2 });
  57. } else {
  58. return Promise.reject("Not equal");
  59. }
  60. }
  61. return Promise.resolve({ f1, f2 })
  62. }).then((data) => {
  63. return promiseWhile(data, condition, action).then((obj) => {
  64. fs.closeSync(f1.fd);
  65. fs.closeSync(f2.fd);
  66. return cb(isDone);
  67. })
  68. }, (reason) => {
  69. fs.closeSync(f1.fd);
  70. fs.closeSync(f2.fd);
  71. return cb(false);
  72. });
  73. };
  74. exports.compare = doCompare;