core-3nweb-client-lib 0.26.1 → 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.
- package/build/api-defs/asmail.d.ts +1 -1
- package/build/api-defs/files.d.ts +278 -69
- package/build/core/app-files.js +7 -7
- package/build/core/asmail/config/common.js +2 -2
- package/build/core/asmail/config/index.js +2 -2
- package/build/core/asmail/config/published-intro-key.js +1 -1
- package/build/core/asmail/delivery/common.js +7 -7
- package/build/core/asmail/delivery/index.js +5 -5
- package/build/core/asmail/delivery/msg.js +4 -4
- package/build/core/asmail/delivery/per-recipient-wip.js +1 -1
- package/build/core/asmail/inbox/attachments/fs.js +5 -1
- package/build/core/asmail/inbox/cached-msgs.js +1 -1
- package/build/core/asmail/inbox/inbox-events.js +4 -4
- package/build/core/asmail/inbox/index.js +10 -10
- package/build/core/asmail/inbox/msg-downloader.js +1 -1
- package/build/core/asmail/inbox/msg-indexing.js +1 -1
- package/build/core/asmail/inbox/msg-on-disk.js +5 -5
- package/build/core/asmail/index.d.ts +3 -3
- package/build/core/asmail/index.js +13 -8
- package/build/core/asmail/key-verification.js +5 -5
- package/build/core/asmail/keyring/common.js +7 -6
- package/build/core/asmail/keyring/correspondent-keys.js +8 -7
- package/build/core/asmail/keyring/id-to-email-map.js +2 -1
- package/build/core/asmail/keyring/index.d.ts +7 -8
- package/build/core/asmail/keyring/index.js +15 -14
- package/build/core/asmail/keyring/keyring-storage.js +2 -1
- package/build/core/asmail/msg/opener.js +3 -3
- package/build/core/asmail/msg/packer.js +13 -13
- package/build/core/asmail/sending-params/own-params.js +2 -2
- package/build/core/asmail/sending-params/params-from-others.js +1 -1
- package/build/core/id-manager.js +6 -3
- package/build/core/index.d.ts +2 -1
- package/build/core/index.js +14 -14
- package/build/core/sign-in.js +5 -5
- package/build/core/sign-up.js +9 -9
- package/build/core/storage/common/json-saving.js +2 -2
- package/build/core/storage/common/obj-info-file.d.ts +12 -4
- package/build/core/storage/common/obj-info-file.js +66 -34
- package/build/core/storage/common/utils.d.ts +2 -0
- package/build/core/storage/common/utils.js +32 -0
- package/build/core/storage/index.d.ts +3 -17
- package/build/core/storage/index.js +56 -76
- package/build/core/storage/local/obj-files-gc.d.ts +2 -0
- package/build/core/storage/local/obj-files-gc.js +49 -37
- package/build/core/storage/local/obj-files.d.ts +4 -7
- package/build/core/storage/local/obj-files.js +7 -10
- package/build/core/storage/local/obj-status.d.ts +12 -6
- package/build/core/storage/local/obj-status.js +24 -9
- package/build/core/storage/local/storage.d.ts +9 -6
- package/build/core/storage/local/storage.js +29 -18
- package/build/core/storage/synced/downloader.js +1 -1
- package/build/core/storage/synced/obj-files-gc.d.ts +5 -1
- package/build/core/storage/synced/obj-files-gc.js +91 -37
- package/build/core/storage/synced/obj-files.d.ts +42 -36
- package/build/core/storage/synced/obj-files.js +178 -147
- package/build/core/storage/synced/obj-status.d.ts +87 -85
- package/build/core/storage/synced/obj-status.js +463 -259
- package/build/core/storage/synced/remote-events.d.ts +11 -12
- package/build/core/storage/synced/remote-events.js +73 -56
- package/build/core/storage/synced/storage.d.ts +18 -9
- package/build/core/storage/synced/storage.js +108 -48
- package/build/core/storage/synced/upload-header-file.d.ts +4 -0
- package/build/core/storage/synced/upload-header-file.js +64 -0
- package/build/core/storage/synced/upsyncer.d.ts +12 -7
- package/build/core/storage/synced/upsyncer.js +205 -280
- package/build/core/storage/system-folders/apps-data.d.ts +16 -0
- package/build/core/storage/system-folders/apps-data.js +110 -0
- package/build/core/storage/system-folders/index.d.ts +18 -0
- package/build/core/storage/system-folders/index.js +77 -0
- package/build/core-ipc/common-caps.js +3 -3
- package/build/core-ipc/generic.js +8 -8
- package/build/core-ipc/startup-caps.js +2 -2
- package/build/cryptors.js +6 -2
- package/build/ipc-via-protobuf/asmail-cap.js +58 -57
- package/build/ipc-via-protobuf/bytes.js +16 -17
- package/build/ipc-via-protobuf/connector-clients-side.d.ts +1 -0
- package/build/ipc-via-protobuf/connector-clients-side.js +14 -15
- package/build/ipc-via-protobuf/connector-services-side.js +10 -10
- package/build/ipc-via-protobuf/connector.js +4 -4
- package/build/ipc-via-protobuf/file.d.ts +48 -12
- package/build/ipc-via-protobuf/file.js +474 -126
- package/build/ipc-via-protobuf/fs.d.ts +8 -0
- package/build/ipc-via-protobuf/fs.js +577 -142
- package/build/ipc-via-protobuf/log-cap.js +2 -2
- package/build/ipc-via-protobuf/mailerid.js +3 -3
- package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
- package/build/ipc-via-protobuf/protobuf-msg.js +11 -7
- package/build/ipc-via-protobuf/startup-cap.js +21 -21
- package/build/ipc-via-protobuf/storage-cap.js +12 -12
- package/build/ipc.js +7 -2
- package/build/lib-client/3nstorage/exceptions.d.ts +3 -0
- package/build/lib-client/3nstorage/exceptions.js +13 -1
- package/build/lib-client/3nstorage/service.d.ts +16 -2
- package/build/lib-client/3nstorage/service.js +104 -38
- package/build/lib-client/3nstorage/util/file-based-json.d.ts +2 -1
- package/build/lib-client/3nstorage/util/file-based-json.js +1 -1
- package/build/lib-client/3nstorage/xsp-fs/attrs.js +17 -17
- package/build/lib-client/3nstorage/xsp-fs/common.d.ts +42 -18
- package/build/lib-client/3nstorage/xsp-fs/common.js +29 -19
- package/build/lib-client/3nstorage/xsp-fs/file-node.d.ts +1 -0
- package/build/lib-client/3nstorage/xsp-fs/file-node.js +17 -13
- package/build/lib-client/3nstorage/xsp-fs/file.d.ts +31 -6
- package/build/lib-client/3nstorage/xsp-fs/file.js +73 -25
- package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.js +4 -4
- package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +24 -11
- package/build/lib-client/3nstorage/xsp-fs/folder-node.js +575 -179
- package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +35 -4
- package/build/lib-client/3nstorage/xsp-fs/fs.js +231 -110
- package/build/lib-client/3nstorage/xsp-fs/link-node.d.ts +1 -0
- package/build/lib-client/3nstorage/xsp-fs/link-node.js +7 -2
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +30 -24
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +229 -123
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -1
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +17 -18
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +3 -3
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +53 -53
- package/build/lib-client/3nweb-signup.js +4 -4
- package/build/lib-client/asmail/recipient.js +15 -15
- package/build/lib-client/asmail/sender.js +22 -22
- package/build/lib-client/asmail/service-config.js +3 -3
- package/build/lib-client/cryptor/cryptor-in-worker.js +18 -16
- package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
- package/build/lib-client/cryptor/cryptor.js +4 -2
- package/build/lib-client/cryptor/cryptor.wasm +0 -0
- package/build/lib-client/cryptor/in-proc-js.js +1 -1
- package/build/lib-client/cryptor/in-proc-wasm.js +6 -6
- package/build/lib-client/cryptor/worker-js.js +2 -2
- package/build/lib-client/cryptor/worker-wasm.js +2 -2
- package/build/lib-client/files-select.js +1 -1
- package/build/lib-client/files.d.ts +1 -1
- package/build/lib-client/files.js +71 -6
- package/build/lib-client/fs-collection.js +1 -1
- package/build/lib-client/fs-sync-utils.d.ts +5 -0
- package/build/lib-client/fs-sync-utils.js +61 -0
- package/build/lib-client/fs-view.d.ts +14 -0
- package/build/lib-client/fs-view.js +33 -0
- package/build/lib-client/key-derivation.js +1 -1
- package/build/lib-client/local-files/dev-file-sink.js +9 -9
- package/build/lib-client/local-files/dev-file-src.js +2 -2
- package/build/lib-client/local-files/device-fs.d.ts +1 -1
- package/build/lib-client/local-files/device-fs.js +56 -54
- package/build/lib-client/logging/log-to-file.d.ts +1 -1
- package/build/lib-client/logging/log-to-file.js +7 -7
- package/build/lib-client/mailer-id/login.js +7 -7
- package/build/lib-client/mailer-id/provisioner.js +12 -12
- package/build/lib-client/objs-on-disk/file-writing-proc.js +3 -3
- package/build/lib-client/objs-on-disk/obj-folders.js +31 -31
- package/build/lib-client/objs-on-disk/obj-on-disk.d.ts +13 -2
- package/build/lib-client/objs-on-disk/obj-on-disk.js +24 -9
- package/build/lib-client/request-utils.d.ts +1 -0
- package/build/lib-client/request-utils.js +13 -13
- package/build/lib-client/server-events.d.ts +3 -3
- package/build/lib-client/server-events.js +9 -8
- package/build/lib-client/service-locator.js +10 -10
- package/build/lib-client/user-with-mid-session.js +7 -7
- package/build/lib-client/user-with-pkl-session.js +25 -25
- package/build/lib-client/ws-utils.js +2 -2
- package/build/lib-common/async-cryptor-wrap.js +4 -4
- package/build/lib-common/async-fs-node.d.ts +5 -3
- package/build/lib-common/async-fs-node.js +16 -16
- package/build/lib-common/byte-streaming/pipe.js +1 -1
- package/build/lib-common/byte-streaming/wrapping.js +13 -13
- package/build/lib-common/canonical-address.js +1 -1
- package/build/lib-common/exceptions/error.d.ts +1 -0
- package/build/lib-common/exceptions/error.js +7 -6
- package/build/lib-common/exceptions/file.js +4 -0
- package/build/lib-common/ipc/ws-ipc.js +2 -2
- package/build/lib-common/mid-sigs-NaCl-Ed.js +14 -14
- package/build/lib-common/objs-on-disk/file-layout.d.ts +19 -0
- package/build/lib-common/objs-on-disk/file-layout.js +130 -12
- package/build/lib-common/objs-on-disk/obj-file.d.ts +13 -2
- package/build/lib-common/objs-on-disk/obj-file.js +96 -35
- package/build/lib-common/objs-on-disk/utils.d.ts +1 -0
- package/build/lib-common/objs-on-disk/utils.js +3 -3
- package/build/lib-common/objs-on-disk/v1-obj-file-format.js +14 -14
- package/build/lib-common/processes/labelled-exec-pools.d.ts +1 -1
- package/build/lib-common/processes/labelled-exec-pools.js +1 -1
- package/build/lib-common/processes/pressure.js +2 -2
- package/build/lib-common/processes/synced.js +1 -1
- package/build/lib-common/processes/timeout.js +2 -2
- package/build/lib-common/random-node.js +7 -7
- package/build/lib-common/service-api/3nstorage/owner.d.ts +95 -35
- package/build/lib-common/service-api/3nstorage/owner.js +82 -40
- package/build/lib-common/service-api/asmail/delivery.js +2 -2
- package/build/lib-common/service-api/asmail/retrieval.js +1 -1
- package/build/lib-common/timed-cache.d.ts +1 -0
- package/build/lib-common/timed-non-weak-cache.d.ts +1 -0
- package/build/lib-common/timed-non-weak-cache.js +11 -0
- package/build/lib-common/utils-for-observables.js +4 -4
- package/build/lib-common/weak-cache.d.ts +1 -0
- package/build/lib-common/weak-cache.js +12 -1
- package/build/lib-index.d.ts +2 -1
- package/build/lib-index.js +10 -7
- package/build/protos/asmail.proto.js +12955 -7496
- package/build/protos/file.proto.js +4867 -2744
- package/build/protos/fs.proto.js +9227 -3768
- package/package.json +6 -5
- package/protos/file.proto +91 -19
- 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.
|
|
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
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
|
|
63
|
+
if (vers.archived && vers.archived.includes(version)) {
|
|
64
|
+
return true;
|
|
64
65
|
}
|
|
66
|
+
return false;
|
|
65
67
|
}
|
|
66
|
-
exports.
|
|
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 (
|
|
77
|
-
|
|
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 (
|
|
85
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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,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:
|
|
46
|
-
initFromRemote(user: string, getSigner: GetSigner, keyOrGen: GenerateKey | Uint8Array, makeNet:
|
|
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 -
|
|
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.
|
|
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
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
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(
|
|
175
|
+
return this.rootFS.writableSubRoot(system_folders_1.sysFolders.userFiles);
|
|
173
176
|
}
|
|
174
177
|
async sysFSs() {
|
|
175
178
|
const folders = [
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
}
|