RemoteStorage.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. const fs = require('fs-extra');
  2. const path = require('path');
  3. const WebSocketConnection = require('./WebSocketConnection');
  4. class RemoteStorage {
  5. constructor(config) {
  6. this.config = Object.assign({}, config);
  7. this.config.maxContentLength = this.config.maxContentLength || 10*1024*1024;
  8. this.accessToken = this.config.accessToken;
  9. this.wsc = new WebSocketConnection(config.url);
  10. }
  11. async wsQuery(query) {
  12. const response = await this.wsc.message(
  13. await this.wsc.send(Object.assign({accessToken: this.accessToken}, query))
  14. );
  15. if (response.error)
  16. throw new Error(response.error);
  17. return response;
  18. }
  19. async wsStat(fileName) {
  20. return await this.wsQuery({action: 'get-stat', fileName});
  21. }
  22. async wsGetFile(fileName) {
  23. return this.wsQuery({action: 'get-file', fileName});
  24. }
  25. async wsPutFile(fileName, data) {//data base64 encoded string
  26. return this.wsQuery({action: 'put-file', fileName, data});
  27. }
  28. async wsDelFile(fileName) {
  29. return this.wsQuery({action: 'del-file', fileName});
  30. }
  31. makeRemoteFileName(fileName, dir = '') {
  32. const base = path.basename(fileName);
  33. if (base.length > 3) {
  34. return `${dir}/${base.substr(0, 3)}/${base}`;
  35. } else {
  36. return `${dir}/${base}`;
  37. }
  38. }
  39. async putFile(fileName, dir = '') {
  40. if (!await fs.pathExists(fileName)) {
  41. throw new Error(`File not found: ${fileName}`);
  42. }
  43. const remoteFilename = this.makeRemoteFileName(fileName, dir);
  44. try {
  45. const localStat = await fs.stat(fileName);
  46. let remoteStat = await this.wsStat(remoteFilename);
  47. remoteStat = remoteStat.stat;
  48. if (remoteStat.isFile && localStat.size == remoteStat.size) {
  49. return;
  50. }
  51. await this.wsDelFile(remoteFilename);
  52. } catch (e) {
  53. //
  54. }
  55. const data = await fs.readFile(fileName, 'base64');
  56. await this.wsPutFile(remoteFilename, data);
  57. }
  58. async getFile(fileName, dir = '') {
  59. if (await fs.pathExists(fileName)) {
  60. return;
  61. }
  62. const remoteFilename = this.makeRemoteFileName(fileName, dir);
  63. const response = await this.wsGetFile(remoteFilename);
  64. await fs.writeFile(fileName, response.data, 'base64');
  65. }
  66. async getFileSuccess(filename, dir = '') {
  67. try {
  68. await this.getFile(filename, dir);
  69. return true;
  70. } catch (e) {
  71. //
  72. }
  73. return false;
  74. }
  75. }
  76. module.exports = RemoteStorage;