core-3nweb-client-lib 0.25.6 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +2 -2
  2. package/build/api-defs/asmail.d.ts +1 -1
  3. package/build/api-defs/files.d.ts +282 -70
  4. package/build/core/app-files.js +7 -7
  5. package/build/core/asmail/config/common.js +4 -4
  6. package/build/core/asmail/config/index.js +2 -2
  7. package/build/core/asmail/config/published-intro-key.js +1 -1
  8. package/build/core/asmail/delivery/common.js +7 -7
  9. package/build/core/asmail/delivery/index.js +7 -6
  10. package/build/core/asmail/delivery/msg.js +8 -7
  11. package/build/core/asmail/delivery/per-recipient-wip.js +3 -3
  12. package/build/core/asmail/inbox/attachments/fs.js +11 -1
  13. package/build/core/asmail/inbox/cached-msgs.js +3 -3
  14. package/build/core/asmail/inbox/inbox-events.js +5 -4
  15. package/build/core/asmail/inbox/index.js +12 -12
  16. package/build/core/asmail/inbox/msg-downloader.js +3 -3
  17. package/build/core/asmail/inbox/msg-indexing.js +4 -4
  18. package/build/core/asmail/inbox/msg-on-disk.js +7 -7
  19. package/build/core/asmail/index.d.ts +3 -3
  20. package/build/core/asmail/index.js +13 -8
  21. package/build/core/asmail/key-verification.js +5 -5
  22. package/build/core/asmail/keyring/common.js +7 -6
  23. package/build/core/asmail/keyring/correspondent-keys.js +8 -7
  24. package/build/core/asmail/keyring/id-to-email-map.js +2 -1
  25. package/build/core/asmail/keyring/index.d.ts +7 -8
  26. package/build/core/asmail/keyring/index.js +15 -14
  27. package/build/core/asmail/keyring/keyring-storage.js +4 -3
  28. package/build/core/asmail/msg/opener.js +3 -3
  29. package/build/core/asmail/msg/packer.js +13 -13
  30. package/build/core/asmail/sending-params/own-params.js +4 -4
  31. package/build/core/asmail/sending-params/params-from-others.js +3 -3
  32. package/build/core/id-manager.js +8 -5
  33. package/build/core/index.d.ts +2 -1
  34. package/build/core/index.js +14 -14
  35. package/build/core/sign-in.d.ts +5 -4
  36. package/build/core/sign-in.js +12 -14
  37. package/build/core/sign-up.d.ts +1 -0
  38. package/build/core/sign-up.js +15 -11
  39. package/build/core/storage/common/json-saving.d.ts +21 -0
  40. package/build/core/storage/common/json-saving.js +82 -0
  41. package/build/core/storage/common/obj-info-file.d.ts +51 -0
  42. package/build/core/storage/common/obj-info-file.js +153 -5
  43. package/build/core/storage/common/utils.d.ts +2 -0
  44. package/build/core/storage/common/utils.js +32 -0
  45. package/build/core/storage/index.d.ts +3 -17
  46. package/build/core/storage/index.js +57 -77
  47. package/build/core/storage/local/obj-files-gc.d.ts +2 -0
  48. package/build/core/storage/local/obj-files-gc.js +53 -39
  49. package/build/core/storage/local/obj-files.d.ts +6 -9
  50. package/build/core/storage/local/obj-files.js +16 -19
  51. package/build/core/storage/local/obj-status.d.ts +20 -30
  52. package/build/core/storage/local/obj-status.js +46 -113
  53. package/build/core/storage/local/storage.d.ts +15 -5
  54. package/build/core/storage/local/storage.js +37 -18
  55. package/build/core/storage/synced/downloader.js +7 -6
  56. package/build/core/storage/synced/obj-files-gc.d.ts +6 -1
  57. package/build/core/storage/synced/obj-files-gc.js +106 -13
  58. package/build/core/storage/synced/obj-files.d.ts +46 -47
  59. package/build/core/storage/synced/obj-files.js +207 -154
  60. package/build/core/storage/synced/obj-status.d.ts +103 -42
  61. package/build/core/storage/synced/obj-status.js +525 -137
  62. package/build/core/storage/synced/remote-events.d.ts +11 -12
  63. package/build/core/storage/synced/remote-events.js +80 -57
  64. package/build/core/storage/synced/storage.d.ts +24 -5
  65. package/build/core/storage/synced/storage.js +123 -38
  66. package/build/core/storage/synced/upload-header-file.d.ts +4 -0
  67. package/build/core/storage/synced/upload-header-file.js +64 -0
  68. package/build/core/storage/synced/upsyncer.d.ts +15 -9
  69. package/build/core/storage/synced/upsyncer.js +219 -246
  70. package/build/core/storage/system-folders/apps-data.d.ts +16 -0
  71. package/build/core/storage/system-folders/apps-data.js +110 -0
  72. package/build/core/storage/system-folders/index.d.ts +18 -0
  73. package/build/core/storage/system-folders/index.js +77 -0
  74. package/build/core-ipc/common-caps.js +3 -3
  75. package/build/core-ipc/generic.js +8 -8
  76. package/build/core-ipc/startup-caps.js +2 -2
  77. package/build/cryptors.js +6 -2
  78. package/build/ipc-via-protobuf/asmail-cap.js +67 -83
  79. package/build/ipc-via-protobuf/bytes.js +16 -17
  80. package/build/ipc-via-protobuf/connector-clients-side.d.ts +3 -0
  81. package/build/ipc-via-protobuf/connector-clients-side.js +62 -25
  82. package/build/ipc-via-protobuf/connector-services-side.js +10 -10
  83. package/build/ipc-via-protobuf/connector.js +4 -4
  84. package/build/ipc-via-protobuf/file.d.ts +48 -12
  85. package/build/ipc-via-protobuf/file.js +476 -120
  86. package/build/ipc-via-protobuf/fs.d.ts +8 -0
  87. package/build/ipc-via-protobuf/fs.js +592 -159
  88. package/build/ipc-via-protobuf/log-cap.js +2 -2
  89. package/build/ipc-via-protobuf/mailerid.js +3 -3
  90. package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
  91. package/build/ipc-via-protobuf/protobuf-msg.js +11 -7
  92. package/build/ipc-via-protobuf/startup-cap.js +23 -23
  93. package/build/ipc-via-protobuf/storage-cap.js +12 -12
  94. package/build/ipc.js +7 -2
  95. package/build/lib-client/3nstorage/exceptions.d.ts +12 -8
  96. package/build/lib-client/3nstorage/exceptions.js +31 -10
  97. package/build/lib-client/3nstorage/service.d.ts +16 -2
  98. package/build/lib-client/3nstorage/service.js +109 -39
  99. package/build/lib-client/3nstorage/util/file-based-json.d.ts +2 -1
  100. package/build/lib-client/3nstorage/util/file-based-json.js +1 -1
  101. package/build/lib-client/3nstorage/xsp-fs/attrs.js +17 -17
  102. package/build/lib-client/3nstorage/xsp-fs/common.d.ts +52 -14
  103. package/build/lib-client/3nstorage/xsp-fs/common.js +31 -16
  104. package/build/lib-client/3nstorage/xsp-fs/file-node.d.ts +1 -0
  105. package/build/lib-client/3nstorage/xsp-fs/file-node.js +18 -14
  106. package/build/lib-client/3nstorage/xsp-fs/file.d.ts +31 -6
  107. package/build/lib-client/3nstorage/xsp-fs/file.js +74 -23
  108. package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.js +4 -4
  109. package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +24 -11
  110. package/build/lib-client/3nstorage/xsp-fs/folder-node.js +599 -189
  111. package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +45 -9
  112. package/build/lib-client/3nstorage/xsp-fs/fs.js +326 -74
  113. package/build/lib-client/3nstorage/xsp-fs/link-node.d.ts +1 -0
  114. package/build/lib-client/3nstorage/xsp-fs/link-node.js +7 -2
  115. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +30 -20
  116. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +239 -106
  117. package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -1
  118. package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +18 -19
  119. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +5 -5
  120. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +56 -56
  121. package/build/lib-client/3nweb-signup.js +4 -4
  122. package/build/lib-client/asmail/recipient.js +15 -15
  123. package/build/lib-client/asmail/sender.js +22 -22
  124. package/build/lib-client/asmail/service-config.js +3 -3
  125. package/build/lib-client/cryptor/cryptor-in-worker.js +19 -17
  126. package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
  127. package/build/lib-client/cryptor/cryptor.js +4 -2
  128. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  129. package/build/lib-client/cryptor/in-proc-js.js +1 -1
  130. package/build/lib-client/cryptor/in-proc-wasm.js +7 -7
  131. package/build/lib-client/cryptor/worker-js.js +2 -2
  132. package/build/lib-client/cryptor/worker-wasm.js +2 -2
  133. package/build/lib-client/files-select.js +1 -1
  134. package/build/lib-client/files.d.ts +1 -1
  135. package/build/lib-client/files.js +71 -4
  136. package/build/lib-client/fs-collection.js +3 -2
  137. package/build/lib-client/fs-sync-utils.d.ts +5 -0
  138. package/build/lib-client/fs-sync-utils.js +61 -0
  139. package/build/lib-client/fs-view.d.ts +14 -0
  140. package/build/lib-client/fs-view.js +33 -0
  141. package/build/lib-client/key-derivation.js +1 -1
  142. package/build/lib-client/local-files/dev-file-sink.js +9 -9
  143. package/build/lib-client/local-files/dev-file-src.js +2 -2
  144. package/build/lib-client/local-files/device-fs.d.ts +1 -1
  145. package/build/lib-client/local-files/device-fs.js +56 -54
  146. package/build/lib-client/logging/log-to-file.d.ts +1 -1
  147. package/build/lib-client/logging/log-to-file.js +11 -11
  148. package/build/lib-client/mailer-id/login.js +7 -7
  149. package/build/lib-client/mailer-id/provisioner.js +12 -12
  150. package/build/lib-client/objs-on-disk/file-writing-proc.js +5 -5
  151. package/build/lib-client/objs-on-disk/obj-folders.js +33 -33
  152. package/build/lib-client/objs-on-disk/obj-on-disk.d.ts +13 -2
  153. package/build/lib-client/objs-on-disk/obj-on-disk.js +24 -9
  154. package/build/lib-client/request-utils.d.ts +1 -0
  155. package/build/lib-client/request-utils.js +14 -14
  156. package/build/lib-client/server-events.d.ts +3 -3
  157. package/build/lib-client/server-events.js +12 -10
  158. package/build/lib-client/service-locator.js +10 -10
  159. package/build/lib-client/user-with-mid-session.js +7 -7
  160. package/build/lib-client/user-with-pkl-session.js +25 -25
  161. package/build/lib-client/ws-utils.js +3 -3
  162. package/build/lib-common/async-cryptor-wrap.js +4 -4
  163. package/build/lib-common/async-fs-node.d.ts +5 -3
  164. package/build/lib-common/async-fs-node.js +19 -18
  165. package/build/lib-common/byte-streaming/pipe.js +1 -1
  166. package/build/lib-common/byte-streaming/wrapping.js +17 -17
  167. package/build/lib-common/canonical-address.js +1 -1
  168. package/build/lib-common/exceptions/error.d.ts +1 -0
  169. package/build/lib-common/exceptions/error.js +7 -6
  170. package/build/lib-common/exceptions/file.js +10 -1
  171. package/build/lib-common/ipc/generic-ipc.js +2 -2
  172. package/build/lib-common/ipc/ws-ipc.js +2 -2
  173. package/build/lib-common/json-utils.js +2 -1
  174. package/build/lib-common/mid-sigs-NaCl-Ed.js +14 -14
  175. package/build/lib-common/objs-on-disk/file-layout.d.ts +19 -0
  176. package/build/lib-common/objs-on-disk/file-layout.js +130 -12
  177. package/build/lib-common/objs-on-disk/obj-file.d.ts +13 -2
  178. package/build/lib-common/objs-on-disk/obj-file.js +99 -37
  179. package/build/lib-common/objs-on-disk/utils.d.ts +1 -0
  180. package/build/lib-common/objs-on-disk/utils.js +4 -4
  181. package/build/lib-common/objs-on-disk/v1-obj-file-format.js +14 -14
  182. package/build/lib-common/processes/deferred.d.ts +6 -0
  183. package/build/lib-common/processes/deferred.js +30 -0
  184. package/build/lib-common/processes/labelled-exec-pools.d.ts +33 -0
  185. package/build/lib-common/processes/labelled-exec-pools.js +141 -0
  186. package/build/lib-common/processes/pressure.d.ts +7 -0
  187. package/build/lib-common/processes/pressure.js +56 -0
  188. package/build/lib-common/processes/sleep.d.ts +1 -0
  189. package/build/lib-common/processes/sleep.js +26 -0
  190. package/build/lib-common/{processes.d.ts → processes/synced.d.ts} +0 -40
  191. package/build/lib-common/{processes.js → processes/synced.js} +187 -204
  192. package/build/lib-common/processes/timeout.d.ts +1 -0
  193. package/build/lib-common/processes/timeout.js +51 -0
  194. package/build/lib-common/random-node.js +7 -7
  195. package/build/lib-common/service-api/3nstorage/owner.d.ts +100 -39
  196. package/build/lib-common/service-api/3nstorage/owner.js +85 -42
  197. package/build/lib-common/service-api/asmail/delivery.js +2 -2
  198. package/build/lib-common/service-api/asmail/retrieval.js +1 -1
  199. package/build/lib-common/timed-cache.d.ts +1 -0
  200. package/build/lib-common/timed-non-weak-cache.d.ts +1 -0
  201. package/build/lib-common/timed-non-weak-cache.js +11 -0
  202. package/build/lib-common/utils-for-observables.d.ts +15 -1
  203. package/build/lib-common/utils-for-observables.js +70 -19
  204. package/build/lib-common/weak-cache.d.ts +1 -0
  205. package/build/lib-common/weak-cache.js +12 -1
  206. package/build/lib-index.d.ts +2 -1
  207. package/build/lib-index.js +10 -7
  208. package/build/protos/asmail.proto.js +12912 -7127
  209. package/build/protos/file.proto.js +4848 -2399
  210. package/build/protos/fs.proto.js +9230 -3445
  211. package/package.json +8 -7
  212. package/protos/file.proto +91 -11
  213. package/protos/fs.proto +107 -8
  214. package/build/core/storage/synced/upsync-status.d.ts +0 -41
  215. package/build/core/storage/synced/upsync-status.js +0 -158
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2015 - 2017, 2019 - 2021 3NSoft Inc.
3
+ Copyright (C) 2015 - 2017, 2019 - 2022 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -16,17 +16,18 @@
16
16
  this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.PerAppStorage = exports.reverseDomain = exports.sysFilesOnDevice = exports.userFilesOnDevice = exports.Storages = exports.initSysFolders = exports.sysFolders = void 0;
19
+ exports.PerAppStorage = exports.reverseDomain = exports.Storages = void 0;
20
20
  const fs_1 = require("../../lib-client/3nstorage/xsp-fs/fs");
21
21
  const storage_1 = require("./synced/storage");
22
22
  const storage_2 = require("./local/storage");
23
23
  const file_1 = require("../../lib-common/exceptions/file");
24
24
  const fs_collection_1 = require("../../lib-client/fs-collection");
25
25
  const async_iter_1 = require("../../lib-common/async-iter");
26
- const device_fs_1 = require("../../lib-client/local-files/device-fs");
27
26
  const path_1 = require("path");
28
27
  const fs = require("../../lib-common/async-fs-node");
29
28
  const error_1 = require("../../lib-common/exceptions/error");
29
+ const system_folders_1 = require("./system-folders");
30
+ const apps_data_1 = require("./system-folders/apps-data");
30
31
  function makeBadAppNameExc(appName) {
31
32
  return {
32
33
  runtimeException: true,
@@ -74,58 +75,45 @@ const SYNCED_STORAGE_DIR = 'synced';
74
75
  */
75
76
  async function readRootKeyDerivParamsFromCache(folder) {
76
77
  try {
77
- const str = await fs.readFile(path_1.join(folder, KD_PARAMS_FILE_NAME), { encoding: 'utf8' });
78
+ const str = await fs.readFile((0, path_1.join)(folder, KD_PARAMS_FILE_NAME), { encoding: 'utf8' });
78
79
  return JSON.parse(str);
79
80
  }
80
81
  catch (err) {
81
82
  if (err.notFound) {
82
83
  return undefined;
83
84
  }
84
- throw error_1.errWithCause(err, `Can't read and parse content of obj status file ${KD_PARAMS_FILE_NAME} in folder ${folder}`);
85
+ throw (0, error_1.errWithCause)(err, `Can't read and parse content of obj status file ${KD_PARAMS_FILE_NAME} in folder ${folder}`);
85
86
  }
86
87
  }
87
88
  /**
88
89
  * This function tries to get key derivation parameters from cache on a disk.
89
90
  * If not found, it will ask storage server for it with a provided function.
90
- * @param fs
91
+ * @param folder
91
92
  * @param getFromServer
92
93
  */
93
94
  async function getRootKeyDerivParams(folder, getFromServer) {
94
95
  let params = await readRootKeyDerivParamsFromCache(folder);
95
96
  if (!params) {
96
97
  params = await getFromServer();
97
- await fs.writeFile(path_1.join(folder, KD_PARAMS_FILE_NAME), JSON.stringify(params), { encoding: 'utf8' });
98
+ await fs.writeFile((0, path_1.join)(folder, KD_PARAMS_FILE_NAME), JSON.stringify(params), { encoding: 'utf8' });
98
99
  }
99
100
  return params;
100
101
  }
101
- exports.sysFolders = {
102
- appData: 'Apps Data',
103
- apps: 'Apps Code',
104
- packages: 'App&Lib Packs',
105
- sharedLibs: 'Shared Libs',
106
- userFiles: 'User Files'
107
- };
108
- Object.freeze(exports.sysFolders);
109
- /**
110
- * This function creates initial folder structure in a given root.
111
- * @param root
112
- */
113
- async function initSysFolders(root) {
114
- for (const sysFolder of Object.values(exports.sysFolders)) {
115
- await root.makeFolder(sysFolder);
116
- }
117
- }
118
- exports.initSysFolders = initSysFolders;
119
102
  class StorageAndFS {
120
103
  constructor(storage) {
121
104
  this.storage = storage;
122
105
  this.rootFS = undefined;
106
+ this.syncedAppDataRoots = undefined;
123
107
  Object.seal(this);
124
108
  }
125
109
  static async existing(storage, key) {
110
+ var _a;
126
111
  const s = new StorageAndFS(storage);
127
112
  try {
128
113
  s.rootFS = await fs_1.XspFS.fromExistingRoot(s.storage, key);
114
+ if ((_a = s.rootFS.v) === null || _a === void 0 ? void 0 : _a.sync) {
115
+ s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
116
+ }
129
117
  return s;
130
118
  }
131
119
  catch (err) {
@@ -138,15 +126,22 @@ class StorageAndFS {
138
126
  }
139
127
  }
140
128
  static async newOrExisting(storage, key) {
129
+ var _a, _b;
141
130
  const s = new StorageAndFS(storage);
142
131
  try {
143
132
  s.rootFS = await fs_1.XspFS.fromExistingRoot(s.storage, key);
133
+ if ((_a = s.rootFS.v) === null || _a === void 0 ? void 0 : _a.sync) {
134
+ s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
135
+ }
144
136
  return s;
145
137
  }
146
138
  catch (err) {
147
139
  if (err.objNotFound) {
148
140
  s.rootFS = await fs_1.XspFS.makeNewRoot(s.storage, key);
149
- await initSysFolders(s.rootFS);
141
+ await (0, system_folders_1.initSysFolders)(s.rootFS);
142
+ if ((_b = s.rootFS.v) === null || _b === void 0 ? void 0 : _b.sync) {
143
+ s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
144
+ }
150
145
  return s;
151
146
  }
152
147
  else if (err.failedCipherVerification) {
@@ -157,27 +152,35 @@ class StorageAndFS {
157
152
  }
158
153
  }
159
154
  }
160
- makeAppFS(appFolder) {
161
- if (('string' !== typeof appFolder) ||
162
- (appFolder.length === 0) ||
163
- (appFolder.indexOf('/') >= 0)) {
155
+ /**
156
+ * This creates app data folder.
157
+ * Folder objects are uploaded, if this is a synced storage.
158
+ * @param appFolder
159
+ */
160
+ async makeAppFS(appFolder) {
161
+ if (('string' !== typeof appFolder) || (appFolder.length === 0)
162
+ || (appFolder.indexOf('/') >= 0)
163
+ || (appFolder === '.') || (appFolder === '..')) {
164
164
  throw makeBadAppNameExc(appFolder);
165
165
  }
166
166
  if (!this.rootFS) {
167
167
  throw new Error('Storage is not initialized.');
168
168
  }
169
- return this.rootFS.writableSubRoot(`${exports.sysFolders.appData}/${appFolder}`);
169
+ const appDataFS = await (this.syncedAppDataRoots ?
170
+ this.syncedAppDataRoots.getOrMake(appFolder) :
171
+ this.rootFS.writableSubRoot(`${system_folders_1.sysFolders.appData}/${appFolder}`));
172
+ return appDataFS;
170
173
  }
171
174
  userFS() {
172
- return this.rootFS.writableSubRoot(exports.sysFolders.userFiles);
175
+ return this.rootFS.writableSubRoot(system_folders_1.sysFolders.userFiles);
173
176
  }
174
177
  async sysFSs() {
175
178
  const folders = [
176
- exports.sysFolders.appData, exports.sysFolders.apps,
177
- exports.sysFolders.packages,
178
- exports.sysFolders.sharedLibs
179
+ system_folders_1.sysFolders.appData, system_folders_1.sysFolders.apps,
180
+ system_folders_1.sysFolders.packages,
181
+ system_folders_1.sysFolders.sharedLibs
179
182
  ];
180
- const c = fs_collection_1.makeFSCollection();
183
+ const c = (0, fs_collection_1.makeFSCollection)();
181
184
  for (let fsName of folders) {
182
185
  await c.set(fsName, {
183
186
  isFolder: true,
@@ -187,15 +190,20 @@ class StorageAndFS {
187
190
  return c;
188
191
  }
189
192
  async close() {
193
+ var _a;
190
194
  if (!this.rootFS) {
191
195
  return;
192
196
  }
197
+ (_a = this.syncedAppDataRoots) === null || _a === void 0 ? void 0 : _a.stopSync();
193
198
  await this.rootFS.close();
194
199
  await this.storage.close();
200
+ this.syncedAppDataRoots = undefined;
195
201
  this.rootFS = undefined;
196
202
  this.storage = undefined;
197
203
  }
198
204
  }
205
+ Object.freeze(StorageAndFS.prototype);
206
+ Object.freeze(StorageAndFS);
199
207
  class Storages {
200
208
  constructor(cryptor, storageDirForUser) {
201
209
  this.cryptor = cryptor;
@@ -266,7 +274,7 @@ class Storages {
266
274
  return;
267
275
  }
268
276
  const key = await keyGen(params);
269
- this.local = await StorageAndFS.existing(await storage_2.LocalStorage.makeAndStart(path_1.join(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
277
+ this.local = await StorageAndFS.existing(await storage_2.LocalStorage.makeAndStart((0, path_1.join)(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
270
278
  if (!this.local) {
271
279
  return;
272
280
  }
@@ -274,25 +282,25 @@ class Storages {
274
282
  if (this.synced) {
275
283
  return true;
276
284
  }
277
- const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart(path_1.join(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet, logError);
285
+ const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart((0, path_1.join)(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet(), logError);
278
286
  this.synced = await StorageAndFS.existing(syncedStore, key);
279
287
  key.fill(0);
280
288
  if (!this.synced) {
281
289
  return false;
282
290
  }
283
- await startObjProcs();
291
+ startObjProcs();
284
292
  return true;
285
293
  };
286
294
  }
287
295
  async initFromRemote(user, getSigner, keyOrGen, makeNet, resolver, logError) {
288
296
  const storageDir = this.storageDirForUser(user);
289
- const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart(path_1.join(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet, logError);
297
+ const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart((0, path_1.join)(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet(), logError);
290
298
  // getting parameters records them locally on a disk
291
299
  const params = await getRootKeyDerivParams(storageDir, syncedStore.getRootKeyDerivParamsFromServer);
292
300
  const key = ((typeof keyOrGen === 'function') ?
293
301
  await keyOrGen(params) : keyOrGen);
294
302
  this.synced = await StorageAndFS.newOrExisting(syncedStore, key);
295
- this.local = await StorageAndFS.newOrExisting(await storage_2.LocalStorage.makeAndStart(path_1.join(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
303
+ this.local = await StorageAndFS.newOrExisting(await storage_2.LocalStorage.makeAndStart((0, path_1.join)(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
296
304
  key.fill(0);
297
305
  startObjProcs();
298
306
  return (!!this.synced && !!this.local);
@@ -316,7 +324,7 @@ class Storages {
316
324
  fs = await this.local.userFS();
317
325
  }
318
326
  else if (type === 'device') {
319
- fs = await userFilesOnDevice();
327
+ fs = await (0, system_folders_1.userFilesOnDevice)();
320
328
  }
321
329
  else {
322
330
  throw new Error(`Unknown storage type ${type}`);
@@ -342,7 +350,7 @@ class Storages {
342
350
  };
343
351
  }
344
352
  else if (type === 'device') {
345
- return sysFilesOnDevice();
353
+ return (0, system_folders_1.sysFilesOnDevice)();
346
354
  }
347
355
  else {
348
356
  throw new Error(`Unknown storage type ${type}`);
@@ -372,33 +380,6 @@ class Storages {
372
380
  exports.Storages = Storages;
373
381
  Object.freeze(Storages.prototype);
374
382
  Object.freeze(Storages);
375
- async function userFilesOnDevice() {
376
- if (process.platform === 'win32') {
377
- return device_fs_1.DeviceFS.makeWritable(process.env.USERPROFILE);
378
- }
379
- else {
380
- return device_fs_1.DeviceFS.makeWritable(process.env.HOME);
381
- }
382
- }
383
- exports.userFilesOnDevice = userFilesOnDevice;
384
- async function sysFilesOnDevice() {
385
- const c = fs_collection_1.makeFSCollection();
386
- if (process.platform === 'win32') {
387
- const sysDrive = process.env.SystemDrive;
388
- await c.set(sysDrive, {
389
- isFolder: true,
390
- item: await device_fs_1.DeviceFS.makeWritable(sysDrive)
391
- });
392
- }
393
- else {
394
- await c.set('', {
395
- isFolder: true,
396
- item: await device_fs_1.DeviceFS.makeWritable('/')
397
- });
398
- }
399
- return { isCollection: true, item: c };
400
- }
401
- exports.sysFilesOnDevice = sysFilesOnDevice;
402
383
  function reverseDomain(domain) {
403
384
  return domain.split('.').reverse().join('.');
404
385
  }
@@ -456,8 +437,7 @@ class PerAppStorage {
456
437
  if (typeof appFolder !== 'string') {
457
438
  throw makeBadAppNameExc(appFolder);
458
439
  }
459
- if (CORE_APPS_PREFIX ===
460
- appFolder.substring(0, CORE_APPS_PREFIX.length)) {
440
+ if (appFolder.startsWith(CORE_APPS_PREFIX)) {
461
441
  throw makeNotAllowedToOpenAppFSExc(appFolder);
462
442
  }
463
443
  if (!this.policy.canOpenAppFS(appFolder, type)) {
@@ -523,10 +503,10 @@ async function applyPolicyToFS(fs, policy, path) {
523
503
  async function applyPolicyToFSCollection(c, policy, path) {
524
504
  if (path === undefined) {
525
505
  if (policy === 'w') {
526
- return fs_collection_1.readonlyWrapFSCollection(c);
506
+ return (0, fs_collection_1.readonlyWrapFSCollection)(c);
527
507
  }
528
508
  else {
529
- const roFSs = fs_collection_1.makeFSCollection();
509
+ const roFSs = (0, fs_collection_1.makeFSCollection)();
530
510
  for (const v of (await c.getAll())) {
531
511
  const fs = v[1].item;
532
512
  if (!v[1].isFolder || !fs || !fs.listFolder) {
@@ -535,15 +515,15 @@ async function applyPolicyToFSCollection(c, policy, path) {
535
515
  v[1].item = await v[1].item.readonlySubRoot('/');
536
516
  await roFSs.set(v[0], v[1]);
537
517
  }
538
- return fs_collection_1.readonlyWrapFSCollection(roFSs);
518
+ return (0, fs_collection_1.readonlyWrapFSCollection)(roFSs);
539
519
  }
540
520
  }
541
521
  if (path.startsWith('/')) {
542
522
  path = path.substring(1);
543
523
  }
544
- const nameAndItem = await async_iter_1.asyncFind(await c.entries(), async (v) => path.startsWith(v[0]));
524
+ const nameAndItem = await (0, async_iter_1.asyncFind)(await c.entries(), async (v) => path.startsWith(v[0]));
545
525
  if (!nameAndItem) {
546
- throw file_1.makeFileException(file_1.Code.notFound, path);
526
+ throw (0, file_1.makeFileException)(file_1.Code.notFound, path);
547
527
  }
548
528
  const [name, item] = nameAndItem;
549
529
  path = path.substring(name.length);
@@ -19,4 +19,6 @@ export declare class GC {
19
19
  constructor(rmObjFromCache: (obj: LocalObj) => void, rmObjFolder: (objId: string) => Promise<void>);
20
20
  scheduleCollection: (obj: LocalObj) => void;
21
21
  private objCollecting;
22
+ private collectIn;
23
+ private checkAndRemoveWholeObjFolder;
22
24
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2016 - 2020 3NSoft Inc.
3
+ Copyright (C) 2016 - 2020, 2022 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -13,12 +13,14 @@
13
13
  See the GNU General Public License for more details.
14
14
 
15
15
  You should have received a copy of the GNU General Public License along with
16
- this program. If not, see <http://www.gnu.org/licenses/>. */
16
+ this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
17
18
  Object.defineProperty(exports, "__esModule", { value: true });
18
19
  exports.GC = void 0;
19
20
  const fs = require("../../../lib-common/async-fs-node");
20
- const processes_1 = require("../../../lib-common/processes");
21
+ const synced_1 = require("../../../lib-common/processes/synced");
21
22
  const path_1 = require("path");
23
+ const utils_1 = require("../common/utils");
22
24
  class GC {
23
25
  constructor(rmObjFromCache, rmObjFolder) {
24
26
  this.rmObjFromCache = rmObjFromCache;
@@ -26,7 +28,7 @@ class GC {
26
28
  /**
27
29
  * All gc steps are done in this process.
28
30
  */
29
- this.gcProc = new processes_1.SingleProc();
31
+ this.gcProc = new synced_1.SingleProc();
30
32
  /**
31
33
  * wip are objects that are currently processed. When wip set is empty,
32
34
  * it gets swapped with non-empty scheduled set.
@@ -48,53 +50,65 @@ class GC {
48
50
  if (this.wip.size === 0) {
49
51
  [this.wip, this.scheduled] = [this.scheduled, this.wip];
50
52
  }
51
- const obj = getAndRemoveOneFrom(this.wip);
53
+ const obj = (0, utils_1.getAndRemoveOneFrom)(this.wip);
52
54
  if (!obj) {
53
55
  return;
54
56
  }
55
- // calculate versions that should not be removed
56
- const { gcMaxVer, nonGarbage } = obj.getNonGarbageVersions();
57
- // if object is set archived, and there is nothing in it worth keeping,
58
- // whole folder can be removed
59
- if (obj.isArchived()) {
60
- if (nonGarbage.size === 0) {
61
- this.rmObjFromCache(obj);
62
- if (obj.objId) {
63
- await this.rmObjFolder(obj.objId);
64
- }
65
- return;
66
- }
67
- }
68
- // for all other cases, we remove version files that are not worth
69
- // keeping.
70
- const lst = await fs.readdir(obj.objFolder);
71
- const rmProcs = [];
72
- for (const f of lst) {
73
- const ver = parseInt(f);
74
- if (isNaN(ver) || nonGarbage.has(ver)
75
- || (gcMaxVer && (ver >= gcMaxVer))) {
76
- continue;
77
- }
78
- rmProcs.push(fs.unlink(path_1.join(obj.objFolder, f)).catch(() => { }));
79
- }
80
- while (rmProcs.length > 0) {
81
- await rmProcs.pop();
57
+ try {
58
+ await this.collectIn(obj);
82
59
  }
60
+ catch (err) { }
83
61
  return this.objCollecting();
84
62
  };
85
63
  Object.seal(this);
86
64
  }
65
+ async collectIn(obj) {
66
+ const nonGarbage = obj.statusObj().getNonGarbageVersions();
67
+ if (!(await this.checkAndRemoveWholeObjFolder(obj, nonGarbage))) {
68
+ await removeGarbageFiles(obj, nonGarbage);
69
+ }
70
+ }
71
+ async checkAndRemoveWholeObjFolder(obj, { nonGarbage }) {
72
+ // if object is set archived, and there is nothing in it worth keeping,
73
+ // whole folder can be removed
74
+ if (obj.objId
75
+ && obj.statusObj().isArchived()
76
+ && (nonGarbage.size === 0)) {
77
+ this.rmObjFromCache(obj);
78
+ await this.rmObjFolder(obj.objId);
79
+ return true;
80
+ }
81
+ else {
82
+ return false;
83
+ }
84
+ }
87
85
  }
88
86
  exports.GC = GC;
89
87
  Object.freeze(GC.prototype);
90
88
  Object.freeze(GC);
91
- function getAndRemoveOneFrom(set) {
92
- const iter = set.values();
93
- const { value, done } = iter.next();
94
- if (done) {
95
- return;
89
+ async function removeGarbageFiles(obj, nonGarbage) {
90
+ const lst = await fs.readdir(obj.objFolder);
91
+ const rmProcs = [];
92
+ for (const f of lst) {
93
+ if (canGC(f, nonGarbage)) {
94
+ rmProcs.push(fs.unlink((0, path_1.join)(obj.objFolder, f)).catch(utils_1.noop));
95
+ }
96
+ }
97
+ if (rmProcs.length > 0) {
98
+ await Promise.all(rmProcs);
99
+ }
100
+ }
101
+ function canGC(f, { gcMaxVer, nonGarbage }) {
102
+ const ver = parseInt(f);
103
+ if (isNaN(ver)) {
104
+ return false;
105
+ }
106
+ else if (!nonGarbage.has(ver)
107
+ && (!gcMaxVer || (ver < gcMaxVer))) {
108
+ return true;
109
+ }
110
+ else {
111
+ return false;
96
112
  }
97
- set.delete(value);
98
- return value;
99
113
  }
100
114
  Object.freeze(exports);
@@ -1,6 +1,7 @@
1
- import { ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
1
+ import { LocalObjStatus, ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
2
2
  import { ObjSource, Subscribe } from 'xsp-files';
3
3
  import { GC } from './obj-files-gc';
4
+ import { ObjStatus } from './obj-status';
4
5
  import { LogError } from '../../../lib-client/logging/log-to-file';
5
6
  export declare class ObjFiles {
6
7
  private readonly folders;
@@ -23,18 +24,14 @@ export declare class LocalObj {
23
24
  private readonly scheduleGC;
24
25
  private readonly verObjs;
25
26
  private constructor();
26
- static forExistingObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection']): Promise<LocalObj>;
27
- static forNewObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection']): Promise<LocalObj>;
27
+ static forExistingObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection'], logError: LogError | undefined): Promise<LocalObj>;
28
+ static forNewObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection'], logError: LogError | undefined): Promise<LocalObj>;
28
29
  private path;
29
30
  getObjSrc(version: number): Promise<ObjSource>;
30
31
  private objSegsGetterFromDisk;
31
32
  saveNewVersion(version: number, encSub: Subscribe): Promise<void>;
32
- isArchived(): boolean;
33
- getCurrentVersionOrThrow(): number;
34
- getNonGarbageVersions(): {
35
- gcMaxVer: number | undefined;
36
- nonGarbage: Set<number>;
37
- };
33
+ localStatus(): LocalObjStatus;
34
+ statusObj(): ObjStatus;
38
35
  removeCurrentVersion(): Promise<void>;
39
36
  removeArchivedVersion(version: number): Promise<void>;
40
37
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /*
3
- Copyright (C) 2016 - 2020 3NSoft Inc.
3
+ Copyright (C) 2016 - 2020, 2022 3NSoft Inc.
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under
6
6
  the terms of the GNU General Public License as published by the Free Software
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.LocalObj = exports.ObjFiles = void 0;
20
20
  const obj_folders_1 = require("../../../lib-client/objs-on-disk/obj-folders");
21
21
  const obj_on_disk_1 = require("../../../lib-client/objs-on-disk/obj-on-disk");
22
- const processes_1 = require("../../../lib-common/processes");
22
+ const synced_1 = require("../../../lib-common/processes/synced");
23
23
  const path_1 = require("path");
24
24
  const obj_files_gc_1 = require("./obj-files-gc");
25
25
  const obj_status_1 = require("./obj-status");
@@ -28,8 +28,8 @@ class ObjFiles {
28
28
  constructor(folders, logError) {
29
29
  this.folders = folders;
30
30
  this.logError = logError;
31
- this.objs = timed_cache_1.makeTimedCache(60 * 1000);
32
- this.folderAccessSyncProc = new processes_1.NamedProcs();
31
+ this.objs = (0, timed_cache_1.makeTimedCache)(60 * 1000);
32
+ this.folderAccessSyncProc = new synced_1.NamedProcs();
33
33
  this.gc = new obj_files_gc_1.GC(obj => {
34
34
  if (this.objs.get(obj.objId) === obj) {
35
35
  this.objs.delete(obj.objId);
@@ -55,7 +55,7 @@ class ObjFiles {
55
55
  if (!folder) {
56
56
  return;
57
57
  }
58
- obj = await LocalObj.forExistingObj(objId, folder, this.gc.scheduleCollection);
58
+ obj = await LocalObj.forExistingObj(objId, folder, this.gc.scheduleCollection, this.logError);
59
59
  this.objs.set(objId, obj);
60
60
  return obj;
61
61
  });
@@ -63,7 +63,7 @@ class ObjFiles {
63
63
  async makeNewObj(objId) {
64
64
  return this.sync(objId, async () => {
65
65
  const folder = await this.folders.getFolderAccessFor(objId, true);
66
- const obj = await LocalObj.forNewObj(objId, folder, this.gc.scheduleCollection);
66
+ const obj = await LocalObj.forNewObj(objId, folder, this.gc.scheduleCollection, this.logError);
67
67
  this.objs.set(objId, obj);
68
68
  return obj;
69
69
  });
@@ -99,7 +99,7 @@ class LocalObj {
99
99
  this.objFolder = objFolder;
100
100
  this.status = status;
101
101
  this.scheduleGC = scheduleGC;
102
- this.verObjs = timed_cache_1.makeTimedCache(60 * 1000);
102
+ this.verObjs = (0, timed_cache_1.makeTimedCache)(60 * 1000);
103
103
  this.objSegsGetterFromDisk = async (ver, ofs, len) => {
104
104
  let obj = this.verObjs.get(ver);
105
105
  if (!obj) {
@@ -111,16 +111,16 @@ class LocalObj {
111
111
  };
112
112
  Object.freeze(this);
113
113
  }
114
- static async forExistingObj(objId, objFolder, scheduleGC) {
115
- const status = await obj_status_1.ObjStatus.readFrom(objFolder, objId);
114
+ static async forExistingObj(objId, objFolder, scheduleGC, logError) {
115
+ const status = await obj_status_1.ObjStatus.readFrom(objFolder, objId, logError);
116
116
  return new LocalObj(objId, objFolder, status, scheduleGC);
117
117
  }
118
- static async forNewObj(objId, objFolder, scheduleGC) {
119
- const status = await obj_status_1.ObjStatus.makeNew(objFolder, objId);
118
+ static async forNewObj(objId, objFolder, scheduleGC, logError) {
119
+ const status = await obj_status_1.ObjStatus.makeNew(objFolder, objId, logError);
120
120
  return new LocalObj(objId, objFolder, status, scheduleGC);
121
121
  }
122
122
  path(version) {
123
- return path_1.join(this.objFolder, `${version}.v`);
123
+ return (0, path_1.join)(this.objFolder, `${version}.v`);
124
124
  }
125
125
  async getObjSrc(version) {
126
126
  let obj = this.verObjs.get(version);
@@ -152,14 +152,11 @@ class LocalObj {
152
152
  await this.status.setNewCurrentVersion(version, obj.getBaseVersion());
153
153
  this.scheduleGC(this);
154
154
  }
155
- isArchived() {
156
- return this.status.isArchived();
155
+ localStatus() {
156
+ return this.status;
157
157
  }
158
- getCurrentVersionOrThrow() {
159
- return this.status.getCurrentVersionOrThrow();
160
- }
161
- getNonGarbageVersions() {
162
- return this.status.getNonGarbageVersions();
158
+ statusObj() {
159
+ return this.status;
163
160
  }
164
161
  async removeCurrentVersion() {
165
162
  await this.status.removeCurrentVersion(this.verObjs);
@@ -1,45 +1,35 @@
1
- import { ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
1
+ import { LocalObjStatus, ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
2
+ import { VersionsInfo } from '../common/obj-info-file';
3
+ import { LogError } from '../../../lib-client/logging/log-to-file';
2
4
  export interface ObjStatusInfo {
3
5
  objId: ObjId;
4
6
  isArchived?: boolean;
5
- /**
6
- * This field indicates current object version in cache.
7
- */
8
- currentVersion?: number;
9
- /**
10
- * This is a list of archived versions in the cache.
11
- */
12
- archivedVersions: number[];
13
- /**
14
- * This is a map from base version to diff-ed version(s), that use(s) base.
15
- */
16
- baseToDiff: {
17
- [baseVersion: number]: number[];
18
- };
19
- /**
20
- * This is a map from diff version to base version.
21
- */
22
- diffToBase: {
23
- [diffVersion: number]: number;
24
- };
7
+ versions: VersionsInfo;
25
8
  }
26
- export declare class ObjStatus {
9
+ export declare class ObjStatus implements LocalObjStatus {
27
10
  private readonly objFolder;
28
11
  private readonly status;
12
+ private readonly logError;
29
13
  private readonly saveProc;
30
- constructor(objFolder: string, status: ObjStatusInfo);
31
- static readFrom(objFolder: string, objId: ObjId): Promise<ObjStatus>;
32
- static makeNew(objFolder: string, objId: ObjId): Promise<ObjStatus>;
33
- private saveFile;
14
+ constructor(objFolder: string, status: ObjStatusInfo, logError: LogError | undefined);
15
+ static readFrom(objFolder: string, objId: ObjId, logError: LogError | undefined): Promise<ObjStatus>;
16
+ static makeNew(objFolder: string, objId: ObjId, logError: LogError | undefined): Promise<ObjStatus>;
17
+ private triggerSaveProc;
34
18
  isArchived(): boolean;
35
19
  getCurrentVersionOrThrow(): number;
36
- getNonGarbageVersions(): {
37
- gcMaxVer: number | undefined;
38
- nonGarbage: Set<number>;
39
- };
20
+ getNonGarbageVersions(): NonGarbage;
40
21
  setNewCurrentVersion(newVersion: number, baseVer: number | undefined): Promise<void>;
41
22
  removeCurrentVersion(verObjs: ContainerWithDelete<number>): Promise<void>;
42
23
  removeArchivedVersion(version: number, verObjs: ContainerWithDelete<number>): Promise<void>;
24
+ archiveCurrentVersion(): Promise<void>;
25
+ listVersions(): {
26
+ current?: number;
27
+ archived?: number[];
28
+ };
29
+ }
30
+ export interface NonGarbage {
31
+ gcMaxVer?: number;
32
+ nonGarbage: Set<number>;
43
33
  }
44
34
  interface ContainerWithDelete<T> {
45
35
  delete(key: T): void;