RemoteWebDavStorage.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const fs = require('fs-extra');
  2. const path = require('path');
  3. const WebDavFS = require('webdav-fs');
  4. class RemoteWebDavStorage {
  5. constructor(config) {
  6. const opts = Object.assign({}, config);
  7. this.wfs = WebDavFS(config.url, opts);
  8. }
  9. stat(filename) {
  10. return new Promise((resolve, reject) => {
  11. this.wfs.stat(filename, function(err, fileStat) {
  12. if (err)
  13. reject(err);
  14. resolve(fileStat);
  15. });
  16. });
  17. }
  18. writeFile(filename, data) {
  19. return new Promise((resolve, reject) => {
  20. this.wfs.writeFile(filename, data, 'binary', function(err) {
  21. if (err)
  22. reject(err);
  23. resolve();
  24. });
  25. });
  26. }
  27. unlink(filename) {
  28. return new Promise((resolve, reject) => {
  29. this.wfs.unlink(filename, function(err) {
  30. if (err)
  31. reject(err);
  32. resolve();
  33. });
  34. });
  35. }
  36. readFile(filename) {
  37. return new Promise((resolve, reject) => {
  38. this.wfs.readFile(filename, 'binary', function(err, data) {
  39. if (err)
  40. reject(err);
  41. resolve(data);
  42. });
  43. });
  44. }
  45. mkdir(dirname) {
  46. return new Promise((resolve, reject) => {
  47. this.wfs.mkdir(dirname, function(err) {
  48. if (err)
  49. reject(err);
  50. resolve();
  51. });
  52. });
  53. }
  54. async putFile(filename) {
  55. if (!await fs.pathExists(filename)) {
  56. throw new Error(`File not found: ${filename}`);
  57. }
  58. const base = path.basename(filename);
  59. let remoteFilename = `/${base}`;
  60. if (base.length > 3) {
  61. const remoteDir = `/${base.substr(0, 3)}`;
  62. try {
  63. await this.mkdir(remoteDir);
  64. } catch (e) {
  65. //
  66. }
  67. remoteFilename = `${remoteDir}/${base}`;
  68. }
  69. try {
  70. const localStat = await fs.stat(filename);
  71. const remoteStat = await this.stat(remoteFilename);
  72. if (remoteStat.isFile && localStat.size == remoteStat.size) {
  73. return;
  74. }
  75. await this.unlink(remoteFilename);
  76. } catch (e) {
  77. //
  78. }
  79. const data = await fs.readFile(filename);
  80. await this.writeFile(remoteFilename, data);
  81. }
  82. async getFile(filename) {
  83. if (await fs.pathExists(filename)) {
  84. return;
  85. }
  86. const base = path.basename(filename);
  87. let remoteFilename = `/${base}`;
  88. if (base.length > 3) {
  89. remoteFilename = `/${base.substr(0, 3)}/${base}`;
  90. }
  91. const data = await this.readFile(remoteFilename);
  92. await fs.writeFile(filename, data);
  93. }
  94. async getFileSuccess(filename) {
  95. try {
  96. await this.getFile(filename);
  97. return true;
  98. } catch (e) {
  99. //
  100. }
  101. return false;
  102. }
  103. }
  104. module.exports = RemoteWebDavStorage;