core-3nweb-client-lib 0.27.4 → 0.27.6
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/files.d.ts +40 -10
- package/build/core/asmail/delivery/per-recipient-wip.js +2 -2
- package/build/core/asmail/inbox/inbox-events.js +10 -5
- package/build/core/asmail/inbox/index.d.ts +3 -2
- package/build/core/asmail/inbox/index.js +14 -10
- package/build/core/asmail/inbox/msg-indexing.d.ts +17 -64
- package/build/core/asmail/inbox/msg-indexing.js +440 -311
- package/build/core/asmail/inbox/msg-on-disk.js +2 -1
- package/build/core/asmail/index.js +3 -2
- package/build/core/asmail/keyring/correspondent-keys.js +3 -1
- package/build/core/asmail/keyring/index.d.ts +1 -4
- package/build/core/asmail/keyring/index.js +6 -6
- package/build/core/asmail/msg/opener.js +4 -3
- package/build/core/asmail/msg/packer.d.ts +1 -0
- package/build/core/asmail/msg/packer.js +8 -4
- package/build/core/index.js +2 -3
- package/build/core/storage/local/obj-files.js +2 -1
- package/build/core/storage/synced/storage.js +3 -2
- package/build/core/storage/synced/upload-header-file.js +4 -2
- package/build/core/storage/synced/upsyncer.js +3 -5
- package/build/ipc-via-protobuf/asmail-cap.js +14 -15
- package/build/ipc-via-protobuf/bytes.js +42 -18
- package/build/ipc-via-protobuf/file.js +43 -39
- package/build/ipc-via-protobuf/fs.js +72 -67
- package/build/ipc-via-protobuf/mailerid.js +2 -2
- package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
- package/build/ipc-via-protobuf/protobuf-msg.js +5 -1
- package/build/ipc-via-protobuf/startup-cap.js +8 -8
- package/build/ipc-via-protobuf/storage-cap.js +4 -4
- package/build/ipc.d.ts +1 -0
- package/build/ipc.js +3 -1
- package/build/lib-client/3nstorage/xsp-fs/common.js +2 -0
- package/build/lib-client/3nstorage/xsp-fs/file-node.js +0 -17
- package/build/lib-client/3nstorage/xsp-fs/file.d.ts +1 -1
- package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +1 -1
- package/build/lib-client/3nstorage/xsp-fs/folder-node.js +13 -7
- package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +1 -1
- package/build/lib-client/3nstorage/xsp-fs/fs.js +1 -1
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +2 -2
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +7 -3
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -0
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +7 -5
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +3 -4
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +20 -15
- package/build/lib-client/cryptor/cryptor-in-worker.js +37 -47
- package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
- package/build/lib-client/cryptor/cryptor.wasm +0 -0
- package/build/lib-client/cryptor/in-proc-js.js +15 -12
- package/build/lib-client/cryptor/in-proc-wasm.js +11 -8
- package/build/lib-client/cryptor/serialization-for-wasm.d.ts +36 -0
- package/build/lib-client/cryptor/serialization-for-wasm.js +58 -0
- package/build/lib-client/cryptor-work-labels.d.ts +26 -0
- package/build/lib-client/cryptor-work-labels.js +152 -0
- package/build/lib-client/fs-sync-utils.d.ts +7 -1
- package/build/lib-client/fs-sync-utils.js +18 -7
- package/build/lib-client/local-files/dev-file-src.d.ts +2 -1
- package/build/lib-client/local-files/dev-file-src.js +5 -1
- package/build/lib-client/local-files/device-fs.js +2 -1
- package/build/lib-client/objs-on-disk/obj-on-disk.js +5 -1
- package/build/lib-client/request-utils.js +14 -14
- package/build/lib-common/async-cryptor-wrap.d.ts +9 -9
- package/build/lib-common/async-cryptor-wrap.js +13 -13
- package/build/lib-common/byte-streaming/pipe.d.ts +1 -1
- package/build/lib-common/byte-streaming/pipe.js +3 -3
- package/build/lib-common/byte-streaming/wrapping.js +4 -2
- package/build/lib-common/json-utils.js +0 -3
- package/build/lib-common/processes/synced.js +0 -184
- package/build/lib-sqlite-on-3nstorage/index.d.ts +32 -0
- package/build/lib-sqlite-on-3nstorage/index.js +117 -0
- package/build/lib-sqlite-on-3nstorage/sqljs.d.ts +279 -0
- package/build/lib-sqlite-on-3nstorage/sqljs.js +223 -0
- package/build/protos/asmail.proto.js +3748 -1121
- package/build/protos/bytes.proto.js +731 -204
- package/build/protos/common.proto.js +192 -44
- package/build/protos/cryptor.proto.js +184 -61
- package/build/protos/file.proto.js +1336 -324
- package/build/protos/fs.proto.js +3099 -846
- package/build/protos/ipc.proto.js +244 -61
- package/build/protos/logger.proto.js +219 -53
- package/build/protos/mailerid.proto.js +230 -50
- package/build/protos/startup.proto.js +341 -77
- package/build/protos/storage.proto.js +276 -62
- package/package.json +8 -7
- package/protos/bytes.proto +13 -4
- package/protos/file.proto +4 -1
- package/protos/fs.proto +4 -1
|
@@ -72,7 +72,7 @@ var getAvailableAddresses;
|
|
|
72
72
|
}
|
|
73
73
|
getAvailableAddresses.wrapService = wrapService;
|
|
74
74
|
function makeCaller(caller, objPath) {
|
|
75
|
-
const path =
|
|
75
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAvailableAddresses');
|
|
76
76
|
return (name, token) => caller
|
|
77
77
|
.startPromiseCall(path, requestType.pack({ name, token: (0, protobuf_msg_1.toOptVal)(token) }))
|
|
78
78
|
.then(buf => (0, protobuf_msg_1.fixArray)(protobuf_msg_1.strArrValType.unpack(buf).values));
|
|
@@ -93,7 +93,7 @@ var addUser;
|
|
|
93
93
|
}
|
|
94
94
|
addUser.wrapService = wrapService;
|
|
95
95
|
function makeCaller(caller, objPath) {
|
|
96
|
-
const path =
|
|
96
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'addUser');
|
|
97
97
|
return (userId, token) => caller
|
|
98
98
|
.startPromiseCall(path, requestType.pack({ userId, token: (0, protobuf_msg_1.toOptVal)(token) }))
|
|
99
99
|
.then(buf => protobuf_msg_1.boolValType.unpack(buf).value);
|
|
@@ -114,7 +114,7 @@ var isActivated;
|
|
|
114
114
|
}
|
|
115
115
|
isActivated_1.wrapService = wrapService;
|
|
116
116
|
function makeCaller(caller, objPath) {
|
|
117
|
-
const path =
|
|
117
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'isActivated');
|
|
118
118
|
return userId => caller
|
|
119
119
|
.startPromiseCall(path, requestType.pack({ userId }))
|
|
120
120
|
.then(buf => protobuf_msg_1.boolValType.unpack(buf).value);
|
|
@@ -137,7 +137,7 @@ var createUserParams;
|
|
|
137
137
|
}
|
|
138
138
|
createUserParams.wrapService = wrapService;
|
|
139
139
|
function makeCaller(caller, objPath) {
|
|
140
|
-
const path =
|
|
140
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'createUserParams');
|
|
141
141
|
return (pass, progressCB) => {
|
|
142
142
|
const s = new rxjs_1.Subject();
|
|
143
143
|
const completion = (0, deferred_1.defer)();
|
|
@@ -167,7 +167,7 @@ var getUsersOnDisk;
|
|
|
167
167
|
}
|
|
168
168
|
getUsersOnDisk.wrapService = wrapService;
|
|
169
169
|
function makeCaller(caller, objPath) {
|
|
170
|
-
const path =
|
|
170
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getUsersOnDisk');
|
|
171
171
|
return () => caller
|
|
172
172
|
.startPromiseCall(path, undefined)
|
|
173
173
|
.then(buf => (0, protobuf_msg_1.fixArray)(protobuf_msg_1.strArrValType.unpack(buf).values));
|
|
@@ -188,7 +188,7 @@ var startLoginToRemoteStorage;
|
|
|
188
188
|
}
|
|
189
189
|
startLoginToRemoteStorage.wrapService = wrapService;
|
|
190
190
|
function makeCaller(caller, objPath) {
|
|
191
|
-
const path =
|
|
191
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'startLoginToRemoteStorage');
|
|
192
192
|
return address => caller
|
|
193
193
|
.startPromiseCall(path, requestType.pack({ address }))
|
|
194
194
|
.then(buf => protobuf_msg_1.boolValType.unpack(buf).value);
|
|
@@ -214,7 +214,7 @@ var completeLoginAndLocalSetup;
|
|
|
214
214
|
}
|
|
215
215
|
completeLoginAndLocalSetup.wrapService = wrapService;
|
|
216
216
|
function makeCaller(caller, objPath) {
|
|
217
|
-
const path =
|
|
217
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'completeLoginAndLocalSetup');
|
|
218
218
|
return (pass, progressCB) => {
|
|
219
219
|
const s = new rxjs_1.Subject();
|
|
220
220
|
const completion = (0, deferred_1.defer)();
|
|
@@ -256,7 +256,7 @@ var useExistingStorage;
|
|
|
256
256
|
}
|
|
257
257
|
useExistingStorage.wrapService = wrapService;
|
|
258
258
|
function makeCaller(caller, objPath) {
|
|
259
|
-
const path =
|
|
259
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'useExistingStorage');
|
|
260
260
|
return (address, pass, progressCB) => {
|
|
261
261
|
const s = new rxjs_1.Subject();
|
|
262
262
|
const completion = (0, deferred_1.defer)();
|
|
@@ -76,7 +76,7 @@ var getAppLocalFS;
|
|
|
76
76
|
}
|
|
77
77
|
getAppLocalFS.wrapService = wrapService;
|
|
78
78
|
function makeCaller(caller, objPath) {
|
|
79
|
-
const path =
|
|
79
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAppLocalFS');
|
|
80
80
|
return appName => caller
|
|
81
81
|
.startPromiseCall(path, requestType.pack({ appName: (0, protobuf_msg_1.toOptVal)(appName) }))
|
|
82
82
|
.then(buf => {
|
|
@@ -103,7 +103,7 @@ var getAppSyncedFS;
|
|
|
103
103
|
}
|
|
104
104
|
getAppSyncedFS.wrapService = wrapService;
|
|
105
105
|
function makeCaller(caller, objPath) {
|
|
106
|
-
const path =
|
|
106
|
+
const path = (0, protobuf_msg_1.methodPathFor)(objPath, 'getAppSyncedFS');
|
|
107
107
|
return appName => caller
|
|
108
108
|
.startPromiseCall(path, requestType.pack({ appName: (0, protobuf_msg_1.toOptVal)(appName) }))
|
|
109
109
|
.then(buf => {
|
|
@@ -130,7 +130,7 @@ var getSysFS;
|
|
|
130
130
|
}
|
|
131
131
|
getSysFS.wrapService = wrapService;
|
|
132
132
|
function makeCaller(caller, objPath) {
|
|
133
|
-
const ipcPath =
|
|
133
|
+
const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getSysFS');
|
|
134
134
|
return (type, path) => caller
|
|
135
135
|
.startPromiseCall(ipcPath, requestType.pack({
|
|
136
136
|
type, path: (0, protobuf_msg_1.toOptVal)(path)
|
|
@@ -159,7 +159,7 @@ var getUserFS;
|
|
|
159
159
|
}
|
|
160
160
|
getUserFS.wrapService = wrapService;
|
|
161
161
|
function makeCaller(caller, objPath) {
|
|
162
|
-
const ipcPath =
|
|
162
|
+
const ipcPath = (0, protobuf_msg_1.methodPathFor)(objPath, 'getUserFS');
|
|
163
163
|
return (type, path) => caller
|
|
164
164
|
.startPromiseCall(ipcPath, requestType.pack({
|
|
165
165
|
type, path: (0, protobuf_msg_1.toOptVal)(path)
|
package/build/ipc.d.ts
CHANGED
|
@@ -4,3 +4,4 @@ export * from "./ipc-via-protobuf/connector";
|
|
|
4
4
|
export { FileMsg, makeFileCaller, exposeFileService } from "./ipc-via-protobuf/file";
|
|
5
5
|
export { FSMsg, makeFSCaller, exposeFSService } from "./ipc-via-protobuf/fs";
|
|
6
6
|
export { makeLogCaller, exposeLogger } from "./ipc-via-protobuf/log-cap";
|
|
7
|
+
export * as rxjs from 'rxjs';
|
package/build/ipc.js
CHANGED
|
@@ -30,7 +30,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
30
30
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
31
31
|
};
|
|
32
32
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
-
exports.exposeLogger = exports.makeLogCaller = exports.exposeFSService = exports.makeFSCaller = exports.exposeFileService = exports.makeFileCaller = void 0;
|
|
33
|
+
exports.rxjs = exports.exposeLogger = exports.makeLogCaller = exports.exposeFSService = exports.makeFSCaller = exports.exposeFileService = exports.makeFileCaller = void 0;
|
|
34
34
|
__exportStar(require("./core-ipc/common-caps"), exports);
|
|
35
35
|
__exportStar(require("./core-ipc/startup-caps"), exports);
|
|
36
36
|
__exportStar(require("./ipc-via-protobuf/connector"), exports);
|
|
@@ -43,4 +43,6 @@ Object.defineProperty(exports, "exposeFSService", { enumerable: true, get: funct
|
|
|
43
43
|
var log_cap_1 = require("./ipc-via-protobuf/log-cap");
|
|
44
44
|
Object.defineProperty(exports, "makeLogCaller", { enumerable: true, get: function () { return log_cap_1.makeLogCaller; } });
|
|
45
45
|
Object.defineProperty(exports, "exposeLogger", { enumerable: true, get: function () { return log_cap_1.exposeLogger; } });
|
|
46
|
+
// Reexport of rxjs to use with ipc implementation.
|
|
47
|
+
exports.rxjs = require("rxjs");
|
|
46
48
|
Object.freeze(exports);
|
|
@@ -71,6 +71,7 @@ class NodesContainer {
|
|
|
71
71
|
}
|
|
72
72
|
})();
|
|
73
73
|
this.promises.set(objId, envelopedPromise);
|
|
74
|
+
envelopedPromise.catch(noop);
|
|
74
75
|
}
|
|
75
76
|
delete(node) {
|
|
76
77
|
const existing = this.get(node.objId);
|
|
@@ -93,6 +94,7 @@ class NodesContainer {
|
|
|
93
94
|
}
|
|
94
95
|
}
|
|
95
96
|
exports.NodesContainer = NodesContainer;
|
|
97
|
+
function noop() { }
|
|
96
98
|
function wrapStorageImplementation(impl) {
|
|
97
99
|
const wrap = {
|
|
98
100
|
type: impl.type,
|
|
@@ -159,23 +159,6 @@ class FileNode extends node_in_fs_1.NodeInFS {
|
|
|
159
159
|
}
|
|
160
160
|
const bytes = await this.crypto.readBytes(objSrc, start, end);
|
|
161
161
|
return { bytes, version };
|
|
162
|
-
// if ((this.storage.type === 'synced') || (this.storage.type === 'local')) {
|
|
163
|
-
// const version = objSrc.version;
|
|
164
|
-
// if (this.version < version) {
|
|
165
|
-
// const {
|
|
166
|
-
// bytes, fileAttrs
|
|
167
|
-
// } = await this.crypto.readBytes(objSrc, start, end, true);
|
|
168
|
-
// // this.setUpdatedState(version, fileAttrs!);
|
|
169
|
-
// return { bytes, version };
|
|
170
|
-
// } else {
|
|
171
|
-
// const { bytes } = await this.crypto.readBytes(objSrc, start, end);
|
|
172
|
-
// return { bytes, version };
|
|
173
|
-
// }
|
|
174
|
-
// } else {
|
|
175
|
-
// const { bytes } = await this.crypto.readBytes(objSrc, start, end);
|
|
176
|
-
// // unversioned storage passes undefined version
|
|
177
|
-
// return { bytes, version: (undefined as any) };
|
|
178
|
-
// }
|
|
179
162
|
}
|
|
180
163
|
async writeSink(truncate, currentVersion, changes) {
|
|
181
164
|
const deferredSink = (0, deferred_1.defer)();
|
|
@@ -97,7 +97,7 @@ declare class V implements WritableFileVersionedAPI, N {
|
|
|
97
97
|
declare class S implements WritableFileSyncAPI {
|
|
98
98
|
private readonly n;
|
|
99
99
|
constructor(n: N);
|
|
100
|
-
upload(opts?: OptionsToUploadLocal): Promise<
|
|
100
|
+
upload(opts?: OptionsToUploadLocal): Promise<number | undefined>;
|
|
101
101
|
status(): Promise<SyncStatus>;
|
|
102
102
|
updateStatusInfo(): Promise<SyncStatus>;
|
|
103
103
|
isRemoteVersionOnDisk(version: number): Promise<'complete' | 'partial' | 'none'>;
|
|
@@ -142,7 +142,7 @@ export declare class FolderNode extends NodeInFS<FolderPersistance> {
|
|
|
142
142
|
private removeChildrenObjsInSyncedStorage;
|
|
143
143
|
private uploadRemovalOfObjs;
|
|
144
144
|
getParamsForLink(): LinkParameters<FolderLinkParams>;
|
|
145
|
-
upload(opts: OptionsToUploadLocal | undefined): Promise<
|
|
145
|
+
upload(opts: OptionsToUploadLocal | undefined): Promise<number | undefined>;
|
|
146
146
|
private uploadRemovalOf;
|
|
147
147
|
private listRemovedInTreeToUploadRm;
|
|
148
148
|
protected needUpload(localVersion: number | undefined): Promise<{
|
|
@@ -311,14 +311,14 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
311
311
|
throw new Error(`Unknown type of fs node`);
|
|
312
312
|
}
|
|
313
313
|
deferred.resolve(node);
|
|
314
|
-
return
|
|
314
|
+
return deferred.promise;
|
|
315
315
|
}
|
|
316
316
|
catch (exc) {
|
|
317
|
-
deferred.reject(exc);
|
|
318
317
|
if (exc.objNotFound) {
|
|
319
318
|
await this.fixMissingChildAndThrow(exc, info);
|
|
320
319
|
}
|
|
321
|
-
|
|
320
|
+
deferred.reject((0, error_1.errWithCause)(exc, `Failed to instantiate fs node '${this.name}/${info.name}'`));
|
|
321
|
+
return deferred.promise;
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
324
|
getFolder(name, undefOnMissing = false) {
|
|
@@ -665,11 +665,14 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
665
665
|
}
|
|
666
666
|
async removeFolderObj(src, passIdsForRmUpload = false) {
|
|
667
667
|
const childrenNodes = await this.doChange(true, async () => {
|
|
668
|
+
if (this.version < 0) {
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
668
671
|
const childrenNodes = await this.getAllNodes();
|
|
669
|
-
await this.
|
|
672
|
+
await this.removeThisFromStorageNodes(src);
|
|
670
673
|
return childrenNodes;
|
|
671
674
|
});
|
|
672
|
-
if (childrenNodes.length === 0) {
|
|
675
|
+
if (!childrenNodes || (childrenNodes.length === 0)) {
|
|
673
676
|
return;
|
|
674
677
|
}
|
|
675
678
|
if (this.isInSyncedStorage) {
|
|
@@ -690,6 +693,9 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
690
693
|
}
|
|
691
694
|
}
|
|
692
695
|
async removeChildrenObjsInSyncedStorage(childrenNodes, src, passIdsForRmUpload) {
|
|
696
|
+
if (this.version < 0) {
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
693
699
|
let uploadRmsHere;
|
|
694
700
|
let collectedIds;
|
|
695
701
|
if (passIdsForRmUpload) {
|
|
@@ -771,8 +777,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
771
777
|
return;
|
|
772
778
|
}
|
|
773
779
|
if (toUpload.createOnRemote) {
|
|
774
|
-
await super.upload(opts);
|
|
775
|
-
return;
|
|
780
|
+
return await super.upload(opts);
|
|
776
781
|
}
|
|
777
782
|
const storage = this.syncedStorage();
|
|
778
783
|
const { localVersion, uploadVersion } = toUpload;
|
|
@@ -784,6 +789,7 @@ class FolderNode extends node_in_fs_1.NodeInFS {
|
|
|
784
789
|
// we also don't await for chidren removal
|
|
785
790
|
this.uploadRemovalOf(removedNodes);
|
|
786
791
|
}
|
|
792
|
+
return uploadVersion;
|
|
787
793
|
}
|
|
788
794
|
catch (exc) {
|
|
789
795
|
throw (0, common_1.setPathInExc)(exc, this.name);
|
|
@@ -161,7 +161,7 @@ declare class V implements WritableFSVersionedAPI, N {
|
|
|
161
161
|
declare class S implements WritableFSSyncAPI {
|
|
162
162
|
private readonly n;
|
|
163
163
|
constructor(n: N);
|
|
164
|
-
upload(path: string, opts?: OptionsToUploadLocal): Promise<
|
|
164
|
+
upload(path: string, opts?: OptionsToUploadLocal): Promise<number | undefined>;
|
|
165
165
|
status(path: string): Promise<SyncStatus>;
|
|
166
166
|
updateStatusInfo(path: string): Promise<SyncStatus>;
|
|
167
167
|
isRemoteVersionOnDisk(path: string, version: number): Promise<'complete' | 'partial' | 'none'>;
|
|
@@ -49,7 +49,7 @@ export declare abstract class NodeInFS<P extends NodePersistance> implements Nod
|
|
|
49
49
|
}>;
|
|
50
50
|
archiveCurrent(version?: number): Promise<number>;
|
|
51
51
|
removeNonFolderObj(src: FSChangeSrc): Promise<void>;
|
|
52
|
-
protected
|
|
52
|
+
protected removeThisFromStorageNodes(src: FSChangeSrc): Promise<void>;
|
|
53
53
|
/**
|
|
54
54
|
* This method runs node changing function in an exclusive manner.
|
|
55
55
|
* Returned promise resolves to whatever change function returns.
|
|
@@ -82,7 +82,7 @@ export declare abstract class NodeInFS<P extends NodePersistance> implements Nod
|
|
|
82
82
|
uploadVersion: number;
|
|
83
83
|
createOnRemote: boolean;
|
|
84
84
|
} | undefined>;
|
|
85
|
-
upload(opts: OptionsToUploadLocal | undefined): Promise<
|
|
85
|
+
upload(opts: OptionsToUploadLocal | undefined): Promise<number | undefined>;
|
|
86
86
|
protected uploadHeaderChange(localVersion: number, uploadVersion: number): Promise<UploadHeaderChange | undefined>;
|
|
87
87
|
}
|
|
88
88
|
export declare function shouldReadCurrentVersion(flags: VersionedReadFlags | undefined): boolean;
|
|
@@ -179,9 +179,12 @@ class NodeInFS {
|
|
|
179
179
|
}
|
|
180
180
|
removeNonFolderObj(src) {
|
|
181
181
|
(0, assert_1.assert)(this.type !== 'folder');
|
|
182
|
-
return this.doChange(true, () => this.
|
|
182
|
+
return this.doChange(true, () => this.removeThisFromStorageNodes(src));
|
|
183
183
|
}
|
|
184
|
-
async
|
|
184
|
+
async removeThisFromStorageNodes(src) {
|
|
185
|
+
if (this.currentVersion < 0) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
185
188
|
await this.storage.removeObj(this.objId);
|
|
186
189
|
this.storage.nodes.delete(this);
|
|
187
190
|
this.currentVersion = -1;
|
|
@@ -391,11 +394,12 @@ class NodeInFS {
|
|
|
391
394
|
const uploadHeader = await this.uploadHeaderChange(localVersion, uploadVersion);
|
|
392
395
|
const storage = this.syncedStorage();
|
|
393
396
|
await storage.upload(this.objId, localVersion, uploadVersion, uploadHeader, createOnRemote);
|
|
394
|
-
await this.doChange(true, async () => {
|
|
397
|
+
return await this.doChange(true, async () => {
|
|
395
398
|
storage.dropCachedLocalObjVersionsLessOrEqual(this.objId, localVersion);
|
|
396
399
|
if (this.currentVersion === localVersion) {
|
|
397
400
|
this.currentVersion = uploadVersion;
|
|
398
401
|
}
|
|
402
|
+
return uploadVersion;
|
|
399
403
|
});
|
|
400
404
|
}
|
|
401
405
|
catch (exc) {
|
|
@@ -12,6 +12,7 @@ export declare abstract class NodePersistance {
|
|
|
12
12
|
private zerothHeaderNonce;
|
|
13
13
|
private key;
|
|
14
14
|
private cryptor;
|
|
15
|
+
private workLabel;
|
|
15
16
|
protected constructor(zerothHeaderNonce: Uint8Array, key: Uint8Array, cryptor: AsyncSBoxCryptor);
|
|
16
17
|
wipe(): void;
|
|
17
18
|
compareKey(keyB64: string): boolean;
|
|
@@ -25,6 +25,7 @@ const xsp_files_1 = require("xsp-files");
|
|
|
25
25
|
const buffer_utils_1 = require("../../../lib-common/buffer-utils");
|
|
26
26
|
const deferred_1 = require("../../../lib-common/processes/deferred");
|
|
27
27
|
const random = require("../../../lib-common/random-node");
|
|
28
|
+
const cryptor_work_labels_1 = require("../../cryptor-work-labels");
|
|
28
29
|
const pv1 = require("./xsp-payload-v1");
|
|
29
30
|
const pv2 = require("./xsp-payload-v2");
|
|
30
31
|
const SEG_SIZE = 16; // in 256-byte blocks = 4K in bytes
|
|
@@ -37,6 +38,7 @@ class NodePersistance {
|
|
|
37
38
|
this.zerothHeaderNonce = zerothHeaderNonce;
|
|
38
39
|
this.key = key;
|
|
39
40
|
this.cryptor = cryptor;
|
|
41
|
+
this.workLabel = cryptor_work_labels_1.cryptoWorkLabels.makeForNonce('storage', this.zerothHeaderNonce);
|
|
40
42
|
}
|
|
41
43
|
wipe() {
|
|
42
44
|
if (this.key) {
|
|
@@ -60,13 +62,13 @@ class NodePersistance {
|
|
|
60
62
|
if (!this.key) {
|
|
61
63
|
throw new Error("Cannot use wiped object.");
|
|
62
64
|
}
|
|
63
|
-
return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, version, { type: 'new', segSize: SEG_SIZE, payloadFormat: 2 }, random.bytes, this.cryptor);
|
|
65
|
+
return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, version, { type: 'new', segSize: SEG_SIZE, payloadFormat: 2 }, random.bytes, this.cryptor, this.workLabel);
|
|
64
66
|
}
|
|
65
67
|
async segWriterWithBase(newVersion, base) {
|
|
66
68
|
if (!this.key) {
|
|
67
69
|
throw new Error("Cannot use wiped object.");
|
|
68
70
|
}
|
|
69
|
-
return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, newVersion, { type: 'update', base, payloadFormat: 2 }, random.bytes, this.cryptor);
|
|
71
|
+
return (0, xsp_files_1.makeSegmentsWriter)(this.key, this.zerothHeaderNonce, newVersion, { type: 'update', base, payloadFormat: 2 }, random.bytes, this.cryptor, this.workLabel);
|
|
70
72
|
}
|
|
71
73
|
async decryptedByteSrc(src) {
|
|
72
74
|
if (!this.key) {
|
|
@@ -74,7 +76,7 @@ class NodePersistance {
|
|
|
74
76
|
}
|
|
75
77
|
const version = src.version;
|
|
76
78
|
const header = await src.readHeader();
|
|
77
|
-
const segReader = await (0, xsp_files_1.makeSegmentsReader)(this.key, this.zerothHeaderNonce, version, header, this.cryptor);
|
|
79
|
+
const segReader = await (0, xsp_files_1.makeSegmentsReader)(this.key, this.zerothHeaderNonce, version, header, this.cryptor, this.workLabel);
|
|
78
80
|
return {
|
|
79
81
|
version,
|
|
80
82
|
byteSrc: (0, xsp_files_1.makeDecryptedByteSource)(src.segSrc, segReader),
|
|
@@ -169,9 +171,9 @@ class NodePersistance {
|
|
|
169
171
|
if (!this.key) {
|
|
170
172
|
throw new Error("Cannot use wiped object.");
|
|
171
173
|
}
|
|
172
|
-
const headerContent = await this.cryptor.formatWN.open(initHeader, this.key);
|
|
174
|
+
const headerContent = await this.cryptor.formatWN.open(initHeader, this.key, this.workLabel);
|
|
173
175
|
const n = (0, xsp_files_1.calculateNonce)(this.zerothHeaderNonce, newVersion);
|
|
174
|
-
return this.cryptor.formatWN.pack(headerContent, n, this.key);
|
|
176
|
+
return this.cryptor.formatWN.pack(headerContent, n, this.key, this.workLabel);
|
|
175
177
|
}
|
|
176
178
|
}
|
|
177
179
|
exports.NodePersistance = NodePersistance;
|
|
@@ -67,14 +67,13 @@ class ReadonlyPayloadV1 {
|
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
return await this.syncProc.startOrChain(async () => {
|
|
70
|
-
await this.src.
|
|
71
|
-
return await this.src.read(end - start);
|
|
70
|
+
return await this.src.readAt(start, end - start);
|
|
72
71
|
});
|
|
73
72
|
}
|
|
74
73
|
makeFileByteSource() {
|
|
75
|
-
const { getPosition, seek,
|
|
74
|
+
const { getPosition, seek, readNext, readAt } = this.src;
|
|
76
75
|
return {
|
|
77
|
-
seek, getPosition,
|
|
76
|
+
seek, getPosition, readNext, readAt,
|
|
78
77
|
getSize: async () => this.size,
|
|
79
78
|
};
|
|
80
79
|
}
|
|
@@ -140,22 +140,28 @@ class ReadonlyPayloadV2 {
|
|
|
140
140
|
}
|
|
141
141
|
makeFileByteSource() {
|
|
142
142
|
let pos = 0;
|
|
143
|
+
const seek = async (ofs) => {
|
|
144
|
+
(0, assert_1.assert)(Number.isInteger(ofs) && (ofs >= 0) && (ofs <= this.size), `Offset must be an integer from 0 to size value, inclusive`);
|
|
145
|
+
pos = ofs;
|
|
146
|
+
};
|
|
147
|
+
const readNext = async (len) => {
|
|
148
|
+
if (len === undefined) {
|
|
149
|
+
len = this.size - pos;
|
|
150
|
+
}
|
|
151
|
+
const bytes = await this.readSomeContentBytes(pos, pos + len);
|
|
152
|
+
if (bytes) {
|
|
153
|
+
pos += bytes.length;
|
|
154
|
+
}
|
|
155
|
+
return bytes;
|
|
156
|
+
};
|
|
143
157
|
return (0, wrapping_1.wrapAndSyncFileSource)({
|
|
144
|
-
seek
|
|
145
|
-
(0, assert_1.assert)(Number.isInteger(ofs) && (ofs >= 0) && (ofs <= this.size), `Offset must be an integer from 0 to size value, inclusive`);
|
|
146
|
-
pos = ofs;
|
|
147
|
-
},
|
|
158
|
+
seek,
|
|
148
159
|
getSize: async () => this.size,
|
|
149
160
|
getPosition: async () => pos,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const bytes = await this.readSomeContentBytes(pos, pos + len);
|
|
155
|
-
if (bytes) {
|
|
156
|
-
pos += bytes.length;
|
|
157
|
-
}
|
|
158
|
-
return bytes;
|
|
161
|
+
readNext,
|
|
162
|
+
readAt: async (pos, len) => {
|
|
163
|
+
await seek(pos);
|
|
164
|
+
return await readNext(len);
|
|
159
165
|
}
|
|
160
166
|
});
|
|
161
167
|
}
|
|
@@ -784,8 +790,7 @@ function payloadLayoutException(msg, cause) {
|
|
|
784
790
|
};
|
|
785
791
|
}
|
|
786
792
|
async function sureReadOfBytesFrom(src, ofs, len) {
|
|
787
|
-
await src.
|
|
788
|
-
const bytes = await src.read(len);
|
|
793
|
+
const bytes = await src.readAt(ofs, len);
|
|
789
794
|
(0, assert_1.assert)(!!bytes && (bytes.length === len));
|
|
790
795
|
return bytes;
|
|
791
796
|
}
|
|
@@ -22,9 +22,9 @@ const os_1 = require("os");
|
|
|
22
22
|
const deferred_1 = require("../../lib-common/processes/deferred");
|
|
23
23
|
const error_1 = require("../../lib-common/exceptions/error");
|
|
24
24
|
const path_1 = require("path");
|
|
25
|
-
const protobuf_type_1 = require("../protobuf-type");
|
|
26
|
-
const cryptor_proto_1 = require("../../protos/cryptor.proto");
|
|
27
25
|
const assert_1 = require("../../lib-common/assert");
|
|
26
|
+
const serialization_for_wasm_1 = require("./serialization-for-wasm");
|
|
27
|
+
const cryptor_work_labels_1 = require("../cryptor-work-labels");
|
|
28
28
|
const MAX_IDLE_MILLIS = 60 * 1000;
|
|
29
29
|
const jsWorkerFName = 'worker-js.js';
|
|
30
30
|
const wasmWorkerFName = 'worker-wasm.js';
|
|
@@ -73,6 +73,10 @@ class Workers {
|
|
|
73
73
|
this.maxThreads = Math.max(1, ((typeof maxThreads === 'number') ?
|
|
74
74
|
maxThreads : (0, os_1.cpus)().length - 1));
|
|
75
75
|
}
|
|
76
|
+
numOfIdle() {
|
|
77
|
+
return this.idleWorkers.length +
|
|
78
|
+
Math.max(this.maxThreads - this.allWorkers.size, 0);
|
|
79
|
+
}
|
|
76
80
|
async getIdleWorker() {
|
|
77
81
|
const idle = this.idleWorkers.pop();
|
|
78
82
|
if (idle) {
|
|
@@ -90,7 +94,7 @@ class Workers {
|
|
|
90
94
|
}
|
|
91
95
|
async doRequest(request, trans, d) {
|
|
92
96
|
if (this.isClosed) {
|
|
93
|
-
new Error(`Async cryptor is already closed`);
|
|
97
|
+
throw new Error(`Async cryptor is already closed`);
|
|
94
98
|
}
|
|
95
99
|
const worker = await this.getIdleWorker();
|
|
96
100
|
this.replySinks.set(worker, d);
|
|
@@ -240,6 +244,7 @@ const makeInWorkerCryptor = (logErr, logWarning, maxThreads) => {
|
|
|
240
244
|
(0, assert_1.assert)(typeof logWarning === 'function');
|
|
241
245
|
const workers = new JsWorkers(logErr, logWarning, maxThreads);
|
|
242
246
|
const close = workers.close.bind(workers);
|
|
247
|
+
const execCounter = new cryptor_work_labels_1.ExecCounter(() => workers.numOfIdle());
|
|
243
248
|
const cryptor = {
|
|
244
249
|
scrypt: (passwd, salt, logN, r, p, dkLen, progressCB) => workers.call('scrypt', [passwd, salt, logN, r, p, dkLen], undefined, progressCB),
|
|
245
250
|
box: {
|
|
@@ -247,11 +252,12 @@ const makeInWorkerCryptor = (logErr, logWarning, maxThreads) => {
|
|
|
247
252
|
generate_pubkey: (sk) => workers.call('box.generate_pubkey', [sk])
|
|
248
253
|
},
|
|
249
254
|
sbox: {
|
|
250
|
-
|
|
251
|
-
|
|
255
|
+
canStartUnderWorkLabel: l => execCounter.canStartUnderWorkLabel(l),
|
|
256
|
+
open: (c, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call('sbox.open', [c, n, k])),
|
|
257
|
+
pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call('sbox.pack', [m, n, k])),
|
|
252
258
|
formatWN: {
|
|
253
|
-
open: (cn, k) => workers.call('sbox.formatWN.open', [cn, k]),
|
|
254
|
-
pack: (m, n, k) => workers.call('sbox.formatWN.pack', [m, n, k])
|
|
259
|
+
open: (cn, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call('sbox.formatWN.open', [cn, k])),
|
|
260
|
+
pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call('sbox.formatWN.pack', [m, n, k]))
|
|
255
261
|
}
|
|
256
262
|
},
|
|
257
263
|
signing: {
|
|
@@ -266,45 +272,28 @@ exports.makeInWorkerCryptor = makeInWorkerCryptor;
|
|
|
266
272
|
class WasmWorkers extends Workers {
|
|
267
273
|
constructor(logErr, logWarning, maxThreads) {
|
|
268
274
|
super(workerScriptFor('wasm'), logErr, logWarning, maxThreads);
|
|
269
|
-
this.reqType = protobuf_type_1.ProtoType.for(cryptor_proto_1.cryptor.Request);
|
|
270
|
-
this.replyType = protobuf_type_1.ProtoType.for(cryptor_proto_1.cryptor.Reply);
|
|
271
275
|
}
|
|
272
276
|
call(req, interim) {
|
|
273
|
-
const msg =
|
|
277
|
+
const msg = (0, serialization_for_wasm_1.packRequestToWASM)(req);
|
|
274
278
|
return this.doRequest(msg, undefined, { res: (0, deferred_1.defer)(), interim });
|
|
275
279
|
}
|
|
276
280
|
processReply(replyBytes) {
|
|
277
|
-
const { res, interim, err } =
|
|
281
|
+
const { res, interim, err } = (0, serialization_for_wasm_1.unpackReplyFromWASM)(replyBytes);
|
|
278
282
|
return {
|
|
279
283
|
res: res ? res.val : undefined,
|
|
280
284
|
interim: interim ? interim.val : undefined,
|
|
281
|
-
err: err ? toLocalErr(err) : undefined,
|
|
285
|
+
err: err ? (0, serialization_for_wasm_1.toLocalErr)(err) : undefined,
|
|
282
286
|
};
|
|
283
287
|
}
|
|
284
288
|
}
|
|
285
289
|
Object.freeze(WasmWorkers.prototype);
|
|
286
290
|
Object.freeze(WasmWorkers);
|
|
287
|
-
function toArgs(...args) {
|
|
288
|
-
return args.map(val => ({ val }));
|
|
289
|
-
}
|
|
290
|
-
function toLocalErr(replyErr) {
|
|
291
|
-
if (replyErr.condition === 'cipher-verification') {
|
|
292
|
-
return { failedCipherVerification: true };
|
|
293
|
-
}
|
|
294
|
-
else if (replyErr.condition === 'signature-verification') {
|
|
295
|
-
return { failedSignatureVerification: true };
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
return new Error(`WASM cryptor ${replyErr.condition}: ${replyErr.message}`);
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
291
|
const makeInWorkerWasmCryptor = (logErr, logWarning, maxThreads) => {
|
|
302
292
|
(0, assert_1.assert)(typeof logErr === 'function');
|
|
303
293
|
(0, assert_1.assert)(typeof logWarning === 'function');
|
|
304
294
|
const workers = new WasmWorkers(logErr, logWarning, maxThreads);
|
|
305
295
|
const close = workers.close.bind(workers);
|
|
306
|
-
const
|
|
307
|
-
const kpairType = protobuf_type_1.ProtoType.for(cryptor_proto_1.cryptor.Keypair);
|
|
296
|
+
const execCounter = new cryptor_work_labels_1.ExecCounter(() => workers.numOfIdle());
|
|
308
297
|
const cryptor = {
|
|
309
298
|
scrypt: (passwd, salt, logN, r, p, dkLen, progressCB) => workers.call({
|
|
310
299
|
func: 1,
|
|
@@ -313,51 +302,52 @@ const makeInWorkerWasmCryptor = (logErr, logWarning, maxThreads) => {
|
|
|
313
302
|
box: {
|
|
314
303
|
calc_dhshared_key: (pk, sk) => workers.call({
|
|
315
304
|
func: 2,
|
|
316
|
-
byteArgs: toArgs(pk, sk)
|
|
305
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(pk, sk)
|
|
317
306
|
}),
|
|
318
307
|
generate_pubkey: (sk) => workers.call({
|
|
319
308
|
func: 3,
|
|
320
|
-
byteArgs: toArgs(sk)
|
|
309
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(sk)
|
|
321
310
|
})
|
|
322
311
|
},
|
|
323
312
|
sbox: {
|
|
324
|
-
|
|
313
|
+
canStartUnderWorkLabel: l => execCounter.canStartUnderWorkLabel(l),
|
|
314
|
+
open: (c, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
|
|
325
315
|
func: 4,
|
|
326
|
-
byteArgs: toArgs(c, n, k)
|
|
327
|
-
}),
|
|
328
|
-
pack: (m, n, k) => workers.call({
|
|
316
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(c, n, k)
|
|
317
|
+
})),
|
|
318
|
+
pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
|
|
329
319
|
func: 5,
|
|
330
|
-
byteArgs: toArgs(m, n, k)
|
|
331
|
-
}),
|
|
320
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(m, n, k)
|
|
321
|
+
})),
|
|
332
322
|
formatWN: {
|
|
333
|
-
open: (cn, k) => workers.call({
|
|
323
|
+
open: (cn, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
|
|
334
324
|
func: 6,
|
|
335
|
-
byteArgs: toArgs(cn, k)
|
|
336
|
-
}),
|
|
337
|
-
pack: (m, n, k) => workers.call({
|
|
325
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(cn, k)
|
|
326
|
+
})),
|
|
327
|
+
pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
|
|
338
328
|
func: 7,
|
|
339
|
-
byteArgs: toArgs(m, n, k)
|
|
340
|
-
})
|
|
329
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(m, n, k)
|
|
330
|
+
}))
|
|
341
331
|
}
|
|
342
332
|
},
|
|
343
333
|
signing: {
|
|
344
334
|
generate_keypair: async (seed) => {
|
|
345
335
|
const rep = await workers.call({
|
|
346
336
|
func: 8,
|
|
347
|
-
byteArgs: toArgs(seed)
|
|
337
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(seed)
|
|
348
338
|
});
|
|
349
|
-
return
|
|
339
|
+
return (0, serialization_for_wasm_1.unpackSigningKeyPair)(rep);
|
|
350
340
|
},
|
|
351
341
|
signature: (m, sk) => workers.call({
|
|
352
342
|
func: 9,
|
|
353
|
-
byteArgs: toArgs(m, sk)
|
|
343
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(m, sk)
|
|
354
344
|
}),
|
|
355
345
|
verify: async (sig, m, pk) => {
|
|
356
346
|
const rep = await workers.call({
|
|
357
347
|
func: 10,
|
|
358
|
-
byteArgs: toArgs(sig, m, pk)
|
|
348
|
+
byteArgs: (0, serialization_for_wasm_1.toArgs)(sig, m, pk)
|
|
359
349
|
});
|
|
360
|
-
return
|
|
350
|
+
return (0, serialization_for_wasm_1.unpackBoolVal)(rep);
|
|
361
351
|
}
|
|
362
352
|
}
|
|
363
353
|
};
|