RemoteStorage.js 2.7 KB

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