core-3nweb-client-lib 0.26.0 → 0.27.1

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 (199) hide show
  1. package/build/api-defs/asmail.d.ts +1 -1
  2. package/build/api-defs/files.d.ts +278 -69
  3. package/build/core/app-files.js +7 -7
  4. package/build/core/asmail/config/common.js +2 -2
  5. package/build/core/asmail/config/index.js +2 -2
  6. package/build/core/asmail/config/published-intro-key.js +1 -1
  7. package/build/core/asmail/delivery/common.js +7 -7
  8. package/build/core/asmail/delivery/index.js +5 -5
  9. package/build/core/asmail/delivery/msg.js +4 -4
  10. package/build/core/asmail/delivery/per-recipient-wip.js +1 -1
  11. package/build/core/asmail/inbox/attachments/fs.js +5 -1
  12. package/build/core/asmail/inbox/cached-msgs.js +1 -1
  13. package/build/core/asmail/inbox/inbox-events.js +4 -4
  14. package/build/core/asmail/inbox/index.js +10 -10
  15. package/build/core/asmail/inbox/msg-downloader.js +1 -1
  16. package/build/core/asmail/inbox/msg-indexing.js +1 -1
  17. package/build/core/asmail/inbox/msg-on-disk.js +5 -5
  18. package/build/core/asmail/index.d.ts +3 -3
  19. package/build/core/asmail/index.js +13 -8
  20. package/build/core/asmail/key-verification.js +5 -5
  21. package/build/core/asmail/keyring/common.js +7 -6
  22. package/build/core/asmail/keyring/correspondent-keys.js +8 -7
  23. package/build/core/asmail/keyring/id-to-email-map.js +2 -1
  24. package/build/core/asmail/keyring/index.d.ts +7 -8
  25. package/build/core/asmail/keyring/index.js +15 -14
  26. package/build/core/asmail/keyring/keyring-storage.js +2 -1
  27. package/build/core/asmail/msg/opener.js +3 -3
  28. package/build/core/asmail/msg/packer.js +13 -13
  29. package/build/core/asmail/sending-params/own-params.js +2 -2
  30. package/build/core/asmail/sending-params/params-from-others.js +1 -1
  31. package/build/core/id-manager.js +6 -3
  32. package/build/core/index.d.ts +2 -1
  33. package/build/core/index.js +14 -14
  34. package/build/core/sign-in.js +5 -5
  35. package/build/core/sign-up.js +9 -9
  36. package/build/core/storage/common/json-saving.js +2 -2
  37. package/build/core/storage/common/obj-info-file.d.ts +12 -4
  38. package/build/core/storage/common/obj-info-file.js +66 -34
  39. package/build/core/storage/common/utils.d.ts +2 -0
  40. package/build/core/storage/common/utils.js +32 -0
  41. package/build/core/storage/index.d.ts +3 -17
  42. package/build/core/storage/index.js +56 -76
  43. package/build/core/storage/local/obj-files-gc.d.ts +2 -0
  44. package/build/core/storage/local/obj-files-gc.js +49 -37
  45. package/build/core/storage/local/obj-files.d.ts +4 -7
  46. package/build/core/storage/local/obj-files.js +7 -10
  47. package/build/core/storage/local/obj-status.d.ts +12 -6
  48. package/build/core/storage/local/obj-status.js +24 -9
  49. package/build/core/storage/local/storage.d.ts +9 -6
  50. package/build/core/storage/local/storage.js +29 -18
  51. package/build/core/storage/synced/downloader.js +1 -1
  52. package/build/core/storage/synced/obj-files-gc.d.ts +5 -1
  53. package/build/core/storage/synced/obj-files-gc.js +91 -37
  54. package/build/core/storage/synced/obj-files.d.ts +42 -36
  55. package/build/core/storage/synced/obj-files.js +178 -147
  56. package/build/core/storage/synced/obj-status.d.ts +87 -85
  57. package/build/core/storage/synced/obj-status.js +463 -259
  58. package/build/core/storage/synced/remote-events.d.ts +11 -12
  59. package/build/core/storage/synced/remote-events.js +73 -56
  60. package/build/core/storage/synced/storage.d.ts +18 -9
  61. package/build/core/storage/synced/storage.js +108 -48
  62. package/build/core/storage/synced/upload-header-file.d.ts +4 -0
  63. package/build/core/storage/synced/upload-header-file.js +64 -0
  64. package/build/core/storage/synced/upsyncer.d.ts +12 -7
  65. package/build/core/storage/synced/upsyncer.js +204 -280
  66. package/build/core/storage/system-folders/apps-data.d.ts +16 -0
  67. package/build/core/storage/system-folders/apps-data.js +110 -0
  68. package/build/core/storage/system-folders/index.d.ts +18 -0
  69. package/build/core/storage/system-folders/index.js +77 -0
  70. package/build/core-ipc/common-caps.js +3 -3
  71. package/build/core-ipc/generic.js +8 -8
  72. package/build/core-ipc/startup-caps.js +2 -2
  73. package/build/cryptors.js +6 -2
  74. package/build/ipc-via-protobuf/asmail-cap.js +58 -57
  75. package/build/ipc-via-protobuf/bytes.js +16 -17
  76. package/build/ipc-via-protobuf/connector-clients-side.d.ts +3 -0
  77. package/build/ipc-via-protobuf/connector-clients-side.js +61 -24
  78. package/build/ipc-via-protobuf/connector-services-side.js +10 -10
  79. package/build/ipc-via-protobuf/connector.js +4 -4
  80. package/build/ipc-via-protobuf/file.d.ts +48 -12
  81. package/build/ipc-via-protobuf/file.js +474 -126
  82. package/build/ipc-via-protobuf/fs.d.ts +8 -0
  83. package/build/ipc-via-protobuf/fs.js +577 -142
  84. package/build/ipc-via-protobuf/log-cap.js +2 -2
  85. package/build/ipc-via-protobuf/mailerid.js +3 -3
  86. package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
  87. package/build/ipc-via-protobuf/protobuf-msg.js +11 -7
  88. package/build/ipc-via-protobuf/startup-cap.js +21 -21
  89. package/build/ipc-via-protobuf/storage-cap.js +12 -12
  90. package/build/ipc.js +7 -2
  91. package/build/lib-client/3nstorage/exceptions.d.ts +3 -0
  92. package/build/lib-client/3nstorage/exceptions.js +13 -1
  93. package/build/lib-client/3nstorage/service.d.ts +15 -2
  94. package/build/lib-client/3nstorage/service.js +104 -38
  95. package/build/lib-client/3nstorage/util/file-based-json.d.ts +2 -1
  96. package/build/lib-client/3nstorage/util/file-based-json.js +1 -1
  97. package/build/lib-client/3nstorage/xsp-fs/attrs.js +17 -17
  98. package/build/lib-client/3nstorage/xsp-fs/common.d.ts +42 -18
  99. package/build/lib-client/3nstorage/xsp-fs/common.js +29 -19
  100. package/build/lib-client/3nstorage/xsp-fs/file-node.d.ts +1 -0
  101. package/build/lib-client/3nstorage/xsp-fs/file-node.js +17 -13
  102. package/build/lib-client/3nstorage/xsp-fs/file.d.ts +31 -6
  103. package/build/lib-client/3nstorage/xsp-fs/file.js +73 -25
  104. package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.js +4 -4
  105. package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +24 -11
  106. package/build/lib-client/3nstorage/xsp-fs/folder-node.js +575 -179
  107. package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +35 -4
  108. package/build/lib-client/3nstorage/xsp-fs/fs.js +231 -110
  109. package/build/lib-client/3nstorage/xsp-fs/link-node.d.ts +1 -0
  110. package/build/lib-client/3nstorage/xsp-fs/link-node.js +7 -2
  111. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +30 -24
  112. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +229 -123
  113. package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -1
  114. package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +17 -18
  115. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +3 -3
  116. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +53 -53
  117. package/build/lib-client/3nweb-signup.js +4 -4
  118. package/build/lib-client/asmail/recipient.js +15 -15
  119. package/build/lib-client/asmail/sender.js +22 -22
  120. package/build/lib-client/asmail/service-config.js +3 -3
  121. package/build/lib-client/cryptor/cryptor-in-worker.js +18 -16
  122. package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
  123. package/build/lib-client/cryptor/cryptor.js +4 -2
  124. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  125. package/build/lib-client/cryptor/in-proc-js.js +1 -1
  126. package/build/lib-client/cryptor/in-proc-wasm.js +6 -6
  127. package/build/lib-client/cryptor/worker-js.js +2 -2
  128. package/build/lib-client/cryptor/worker-wasm.js +2 -2
  129. package/build/lib-client/files-select.js +1 -1
  130. package/build/lib-client/files.d.ts +1 -1
  131. package/build/lib-client/files.js +71 -6
  132. package/build/lib-client/fs-collection.js +1 -1
  133. package/build/lib-client/fs-sync-utils.d.ts +5 -0
  134. package/build/lib-client/fs-sync-utils.js +61 -0
  135. package/build/lib-client/fs-view.d.ts +14 -0
  136. package/build/lib-client/fs-view.js +33 -0
  137. package/build/lib-client/key-derivation.js +1 -1
  138. package/build/lib-client/local-files/dev-file-sink.js +9 -9
  139. package/build/lib-client/local-files/dev-file-src.js +2 -2
  140. package/build/lib-client/local-files/device-fs.d.ts +1 -1
  141. package/build/lib-client/local-files/device-fs.js +56 -54
  142. package/build/lib-client/logging/log-to-file.d.ts +1 -1
  143. package/build/lib-client/logging/log-to-file.js +7 -7
  144. package/build/lib-client/mailer-id/login.js +7 -7
  145. package/build/lib-client/mailer-id/provisioner.js +12 -12
  146. package/build/lib-client/objs-on-disk/file-writing-proc.js +3 -3
  147. package/build/lib-client/objs-on-disk/obj-folders.js +31 -31
  148. package/build/lib-client/objs-on-disk/obj-on-disk.d.ts +13 -2
  149. package/build/lib-client/objs-on-disk/obj-on-disk.js +24 -9
  150. package/build/lib-client/request-utils.d.ts +1 -0
  151. package/build/lib-client/request-utils.js +13 -13
  152. package/build/lib-client/server-events.d.ts +3 -3
  153. package/build/lib-client/server-events.js +9 -8
  154. package/build/lib-client/service-locator.js +10 -10
  155. package/build/lib-client/user-with-mid-session.js +7 -7
  156. package/build/lib-client/user-with-pkl-session.js +25 -25
  157. package/build/lib-client/ws-utils.js +2 -2
  158. package/build/lib-common/async-cryptor-wrap.js +4 -4
  159. package/build/lib-common/async-fs-node.d.ts +5 -3
  160. package/build/lib-common/async-fs-node.js +16 -16
  161. package/build/lib-common/byte-streaming/pipe.js +1 -1
  162. package/build/lib-common/byte-streaming/wrapping.js +13 -13
  163. package/build/lib-common/canonical-address.js +1 -1
  164. package/build/lib-common/exceptions/error.d.ts +1 -0
  165. package/build/lib-common/exceptions/error.js +7 -6
  166. package/build/lib-common/exceptions/file.js +4 -0
  167. package/build/lib-common/ipc/ws-ipc.js +2 -2
  168. package/build/lib-common/mid-sigs-NaCl-Ed.js +14 -14
  169. package/build/lib-common/objs-on-disk/file-layout.d.ts +19 -0
  170. package/build/lib-common/objs-on-disk/file-layout.js +130 -12
  171. package/build/lib-common/objs-on-disk/obj-file.d.ts +13 -2
  172. package/build/lib-common/objs-on-disk/obj-file.js +96 -35
  173. package/build/lib-common/objs-on-disk/utils.d.ts +1 -0
  174. package/build/lib-common/objs-on-disk/utils.js +3 -3
  175. package/build/lib-common/objs-on-disk/v1-obj-file-format.js +14 -14
  176. package/build/lib-common/processes/labelled-exec-pools.d.ts +1 -1
  177. package/build/lib-common/processes/labelled-exec-pools.js +1 -1
  178. package/build/lib-common/processes/pressure.js +2 -2
  179. package/build/lib-common/processes/synced.js +1 -1
  180. package/build/lib-common/processes/timeout.js +2 -2
  181. package/build/lib-common/random-node.js +7 -7
  182. package/build/lib-common/service-api/3nstorage/owner.d.ts +95 -39
  183. package/build/lib-common/service-api/3nstorage/owner.js +82 -40
  184. package/build/lib-common/service-api/asmail/delivery.js +2 -2
  185. package/build/lib-common/service-api/asmail/retrieval.js +1 -1
  186. package/build/lib-common/timed-cache.d.ts +1 -0
  187. package/build/lib-common/timed-non-weak-cache.d.ts +1 -0
  188. package/build/lib-common/timed-non-weak-cache.js +11 -0
  189. package/build/lib-common/utils-for-observables.js +4 -4
  190. package/build/lib-common/weak-cache.d.ts +1 -0
  191. package/build/lib-common/weak-cache.js +12 -1
  192. package/build/lib-index.d.ts +2 -1
  193. package/build/lib-index.js +10 -7
  194. package/build/protos/asmail.proto.js +12955 -7496
  195. package/build/protos/file.proto.js +4867 -2744
  196. package/build/protos/fs.proto.js +9227 -3768
  197. package/package.json +6 -5
  198. package/protos/file.proto +91 -19
  199. package/protos/fs.proto +107 -8
@@ -16,13 +16,13 @@
16
16
  this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.addWithBasesTo = exports.nonGarbageVersionsIn = exports.rmCurrentVersionIn = exports.setCurrentVersionIn = exports.rmArchVersionsIn = exports.rmNonArchVersionsIn = exports.addBaseToDiffLinkInStatus = exports.readJSONInfoFileIn = void 0;
19
+ exports.isEmptyVersions = exports.addArchived = exports.addWithBasesTo = exports.nonGarbageVersionsIn = exports.rmVersionIn = exports.rmCurrentVersionIn = exports.setCurrentVersionIn = exports.rmArchVersionFrom = exports.rmNonArchVersionsIn = exports.isVersionIn = exports.addBaseToDiffLinkInVersInfo = exports.readJSONInfoFileIn = void 0;
20
20
  const fs = require("../../../lib-common/async-fs-node");
21
21
  const path_1 = require("path");
22
22
  const exceptions_1 = require("../../../lib-client/3nstorage/exceptions");
23
23
  async function readJSONInfoFileIn(objFolder, fileName) {
24
24
  try {
25
- const infoJSONStr = await fs.readFile(path_1.join(objFolder, fileName), { encoding: 'utf8' }).catch((exc) => {
25
+ const infoJSONStr = await fs.readFile((0, path_1.join)(objFolder, fileName), { encoding: 'utf8' }).catch((exc) => {
26
26
  if (!exc.notFound) {
27
27
  throw exc;
28
28
  }
@@ -35,7 +35,7 @@ async function readJSONInfoFileIn(objFolder, fileName) {
35
35
  return status;
36
36
  }
37
37
  catch (err) {
38
- throw exceptions_1.makeStorageException({
38
+ throw (0, exceptions_1.makeStorageException)({
39
39
  message: `Can't read and parse content of obj info file ${fileName} in obj folder ${objFolder}`,
40
40
  cause: err
41
41
  });
@@ -48,22 +48,24 @@ exports.readJSONInfoFileIn = readJSONInfoFileIn;
48
48
  * @param diffVer
49
49
  * @param baseVer
50
50
  */
51
- function addBaseToDiffLinkInStatus(versions, diffVer, baseVer) {
51
+ function addBaseToDiffLinkInVersInfo(versions, diffVer, baseVer) {
52
52
  if (diffVer <= baseVer) {
53
53
  throw new Error(`Given diff version ${diffVer} is not greater than base version ${baseVer}`);
54
54
  }
55
55
  versions.diffToBase[diffVer] = baseVer;
56
- const diffs = versions.baseToDiff[baseVer];
57
- if (diffs) {
58
- if (diffs.indexOf(diffVer) < 0) {
59
- diffs.push(diffVer);
60
- }
56
+ versions.baseToDiff[baseVer] = diffVer;
57
+ }
58
+ exports.addBaseToDiffLinkInVersInfo = addBaseToDiffLinkInVersInfo;
59
+ function isVersionIn(version, vers) {
60
+ if (vers.current === version) {
61
+ return true;
61
62
  }
62
- else {
63
- versions.baseToDiff[baseVer] = [diffVer];
63
+ if (vers.archived && vers.archived.includes(version)) {
64
+ return true;
64
65
  }
66
+ return false;
65
67
  }
66
- exports.addBaseToDiffLinkInStatus = addBaseToDiffLinkInStatus;
68
+ exports.isVersionIn = isVersionIn;
67
69
  /**
68
70
  * This function removes given version from versions info, if it is neither
69
71
  * archived, nor is a base for another version. If given version is itself
@@ -73,49 +75,41 @@ exports.addBaseToDiffLinkInStatus = addBaseToDiffLinkInStatus;
73
75
  * @param ver
74
76
  */
75
77
  function rmNonArchVersionsIn(versions, ver) {
76
- if (!versions.archived
77
- || !versions.archived.includes(ver)) {
78
+ if (versions.archived
79
+ && versions.archived.includes(ver)) {
78
80
  return;
79
81
  }
80
82
  if (versions.baseToDiff[ver]) {
81
83
  return;
82
84
  }
83
85
  const base = versions.diffToBase[ver];
84
- if (typeof base !== 'number') {
85
- return;
86
- }
87
- delete versions.diffToBase[ver];
88
- const diffs = versions.baseToDiff[base];
89
- if (!diffs) {
90
- return;
91
- }
92
- const diffInd = diffs.indexOf(ver);
93
- if (diffInd < 0) {
94
- return;
95
- }
96
- diffs.splice(diffInd, 1);
97
- if (diffs.length === 0) {
86
+ if (base) {
87
+ delete versions.diffToBase[ver];
98
88
  delete versions.baseToDiff[base];
99
89
  rmNonArchVersionsIn(versions, base);
100
90
  }
101
91
  }
102
92
  exports.rmNonArchVersionsIn = rmNonArchVersionsIn;
103
- function rmArchVersionsIn(versions, ver) {
93
+ function rmArchVersionFrom(versions, ver) {
104
94
  if (!versions.archived) {
105
- return;
95
+ return false;
106
96
  }
107
97
  const vInd = versions.archived.indexOf(ver);
108
98
  if (vInd < 0) {
109
- return;
99
+ return false;
110
100
  }
111
101
  versions.archived.splice(vInd, 1);
102
+ if (versions.archived.length === 0) {
103
+ versions.archived = undefined;
104
+ }
112
105
  rmNonArchVersionsIn(versions, ver);
106
+ return true;
113
107
  }
114
- exports.rmArchVersionsIn = rmArchVersionsIn;
108
+ exports.rmArchVersionFrom = rmArchVersionFrom;
115
109
  function setCurrentVersionIn(versions, version, baseVer) {
116
110
  if (baseVer !== undefined) {
117
111
  // base->diff links should be added before removals
118
- addBaseToDiffLinkInStatus(versions, version, baseVer);
112
+ addBaseToDiffLinkInVersInfo(versions, version, baseVer);
119
113
  }
120
114
  const initCurrent = versions.current;
121
115
  if (typeof initCurrent === 'number') {
@@ -128,11 +122,21 @@ function rmCurrentVersionIn(versions) {
128
122
  const current = versions.current;
129
123
  if (typeof current === 'number') {
130
124
  rmNonArchVersionsIn(versions, current);
131
- delete versions.current;
125
+ versions.current = undefined;
132
126
  }
133
127
  return current;
134
128
  }
135
129
  exports.rmCurrentVersionIn = rmCurrentVersionIn;
130
+ function rmVersionIn(version, vers) {
131
+ if (vers.current === version) {
132
+ vers.current = undefined;
133
+ rmNonArchVersionsIn(vers, version);
134
+ }
135
+ if (isVersionIn(version, vers)) {
136
+ rmArchVersionFrom(vers, version);
137
+ }
138
+ }
139
+ exports.rmVersionIn = rmVersionIn;
136
140
  function nonGarbageVersionsIn(versions) {
137
141
  const nonGarbage = new Set();
138
142
  addWithBasesTo(nonGarbage, versions.current, versions);
@@ -157,4 +161,32 @@ function addWithBasesTo(nonGarbage, ver, versions) {
157
161
  }
158
162
  }
159
163
  exports.addWithBasesTo = addWithBasesTo;
164
+ function addArchived(versions, version) {
165
+ if (!versions.archived) {
166
+ versions.archived = [];
167
+ }
168
+ else if (versions.archived.includes(version)) {
169
+ return false;
170
+ }
171
+ versions.archived.push(version);
172
+ versions.archived.sort();
173
+ return true;
174
+ }
175
+ exports.addArchived = addArchived;
176
+ function isEmptyVersions(versions) {
177
+ if (versions.current) {
178
+ return false;
179
+ }
180
+ if (!versions.archived) {
181
+ return true;
182
+ }
183
+ else if (versions.archived.length > 0) {
184
+ return false;
185
+ }
186
+ else {
187
+ versions.archived = undefined;
188
+ return true;
189
+ }
190
+ }
191
+ exports.isEmptyVersions = isEmptyVersions;
160
192
  Object.freeze(exports);
@@ -0,0 +1,2 @@
1
+ export declare function getAndRemoveOneFrom<T>(set: Set<T>): T | undefined;
2
+ export declare function noop(): void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /*
3
+ Copyright (C) 2016 - 2020 3NSoft Inc.
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU General Public License as published by the Free Software
7
+ Foundation, either version 3 of the License, or (at your option) any later
8
+ version.
9
+
10
+ This program is distributed in the hope that it will be useful, but
11
+ WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
+ See the GNU General Public License for more details.
14
+
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/>.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.noop = exports.getAndRemoveOneFrom = void 0;
20
+ function getAndRemoveOneFrom(set) {
21
+ const iter = set.values();
22
+ const { value, done } = iter.next();
23
+ if (done) {
24
+ return;
25
+ }
26
+ set.delete(value);
27
+ return value;
28
+ }
29
+ exports.getAndRemoveOneFrom = getAndRemoveOneFrom;
30
+ function noop() { }
31
+ exports.noop = noop;
32
+ Object.freeze(exports);
@@ -3,24 +3,12 @@ import { GenerateKey } from '../sign-in';
3
3
  import { StorageGetter } from '../../lib-client/3nstorage/xsp-fs/common';
4
4
  import { ServiceLocator } from '../../lib-client/service-locator';
5
5
  import { AsyncSBoxCryptor } from 'xsp-files';
6
- import { NetClient } from '../../lib-client/request-utils';
7
6
  import { StoragePathForUser } from '../app-files';
8
7
  import { LogError } from '../../lib-client/logging/log-to-file';
8
+ import { MakeNet } from '..';
9
9
  declare type WritableFS = web3n.files.WritableFS;
10
10
  declare type StorageType = web3n.storage.StorageType;
11
11
  declare type FSItem = web3n.files.FSItem;
12
- export declare const sysFolders: {
13
- appData: string;
14
- apps: string;
15
- packages: string;
16
- sharedLibs: string;
17
- userFiles: string;
18
- };
19
- /**
20
- * This function creates initial folder structure in a given root.
21
- * @param root
22
- */
23
- export declare function initSysFolders(root: WritableFS): Promise<void>;
24
12
  export declare class Storages implements FactoryOfFSs {
25
13
  private cryptor;
26
14
  private storageDirForUser;
@@ -42,8 +30,8 @@ export declare class Storages implements FactoryOfFSs {
42
30
  * This is a storage getter for links and linking in synced storage.
43
31
  */
44
32
  private storageGetterForSyncedStorage;
45
- startInitFromCache(user: string, keyGen: GenerateKey, makeNet: () => NetClient, resolver: ServiceLocator, logError: LogError): Promise<((getSigner: GetSigner) => Promise<boolean>) | undefined>;
46
- initFromRemote(user: string, getSigner: GetSigner, keyOrGen: GenerateKey | Uint8Array, makeNet: () => NetClient, resolver: ServiceLocator, logError: LogError): Promise<boolean>;
33
+ startInitFromCache(user: string, keyGen: GenerateKey, makeNet: MakeNet, resolver: ServiceLocator, logError: LogError): Promise<((getSigner: GetSigner) => Promise<boolean>) | undefined>;
34
+ initFromRemote(user: string, getSigner: GetSigner, keyOrGen: GenerateKey | Uint8Array, makeNet: MakeNet, resolver: ServiceLocator, logError: LogError): Promise<boolean>;
47
35
  makeSyncedFSForApp(appFolder: string): Promise<WritableFS>;
48
36
  makeLocalFSForApp(appFolder: string): Promise<WritableFS>;
49
37
  getUserFS(type: StorageType): Promise<FSItem>;
@@ -51,8 +39,6 @@ export declare class Storages implements FactoryOfFSs {
51
39
  close(): Promise<void>;
52
40
  wrap(): FactoryOfFSs;
53
41
  }
54
- export declare function userFilesOnDevice(): Promise<WritableFS>;
55
- export declare function sysFilesOnDevice(): Promise<FSItem>;
56
42
  export interface FactoryOfFSs {
57
43
  makeSyncedFSForApp(appFolder: string): Promise<WritableFS>;
58
44
  makeLocalFSForApp(appFolder: string): Promise<WritableFS>;
@@ -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,7 +282,7 @@ 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) {
@@ -286,13 +294,13 @@ class Storages {
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
  }