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.
Files changed (86) hide show
  1. package/build/api-defs/files.d.ts +40 -10
  2. package/build/core/asmail/delivery/per-recipient-wip.js +2 -2
  3. package/build/core/asmail/inbox/inbox-events.js +10 -5
  4. package/build/core/asmail/inbox/index.d.ts +3 -2
  5. package/build/core/asmail/inbox/index.js +14 -10
  6. package/build/core/asmail/inbox/msg-indexing.d.ts +17 -64
  7. package/build/core/asmail/inbox/msg-indexing.js +440 -311
  8. package/build/core/asmail/inbox/msg-on-disk.js +2 -1
  9. package/build/core/asmail/index.js +3 -2
  10. package/build/core/asmail/keyring/correspondent-keys.js +3 -1
  11. package/build/core/asmail/keyring/index.d.ts +1 -4
  12. package/build/core/asmail/keyring/index.js +6 -6
  13. package/build/core/asmail/msg/opener.js +4 -3
  14. package/build/core/asmail/msg/packer.d.ts +1 -0
  15. package/build/core/asmail/msg/packer.js +8 -4
  16. package/build/core/index.js +2 -3
  17. package/build/core/storage/local/obj-files.js +2 -1
  18. package/build/core/storage/synced/storage.js +3 -2
  19. package/build/core/storage/synced/upload-header-file.js +4 -2
  20. package/build/core/storage/synced/upsyncer.js +3 -5
  21. package/build/ipc-via-protobuf/asmail-cap.js +14 -15
  22. package/build/ipc-via-protobuf/bytes.js +42 -18
  23. package/build/ipc-via-protobuf/file.js +43 -39
  24. package/build/ipc-via-protobuf/fs.js +72 -67
  25. package/build/ipc-via-protobuf/mailerid.js +2 -2
  26. package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
  27. package/build/ipc-via-protobuf/protobuf-msg.js +5 -1
  28. package/build/ipc-via-protobuf/startup-cap.js +8 -8
  29. package/build/ipc-via-protobuf/storage-cap.js +4 -4
  30. package/build/ipc.d.ts +1 -0
  31. package/build/ipc.js +3 -1
  32. package/build/lib-client/3nstorage/xsp-fs/common.js +2 -0
  33. package/build/lib-client/3nstorage/xsp-fs/file-node.js +0 -17
  34. package/build/lib-client/3nstorage/xsp-fs/file.d.ts +1 -1
  35. package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +1 -1
  36. package/build/lib-client/3nstorage/xsp-fs/folder-node.js +13 -7
  37. package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +1 -1
  38. package/build/lib-client/3nstorage/xsp-fs/fs.js +1 -1
  39. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +2 -2
  40. package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +7 -3
  41. package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -0
  42. package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +7 -5
  43. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +3 -4
  44. package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +20 -15
  45. package/build/lib-client/cryptor/cryptor-in-worker.js +37 -47
  46. package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
  47. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  48. package/build/lib-client/cryptor/in-proc-js.js +15 -12
  49. package/build/lib-client/cryptor/in-proc-wasm.js +11 -8
  50. package/build/lib-client/cryptor/serialization-for-wasm.d.ts +36 -0
  51. package/build/lib-client/cryptor/serialization-for-wasm.js +58 -0
  52. package/build/lib-client/cryptor-work-labels.d.ts +26 -0
  53. package/build/lib-client/cryptor-work-labels.js +152 -0
  54. package/build/lib-client/fs-sync-utils.d.ts +7 -1
  55. package/build/lib-client/fs-sync-utils.js +18 -7
  56. package/build/lib-client/local-files/dev-file-src.d.ts +2 -1
  57. package/build/lib-client/local-files/dev-file-src.js +5 -1
  58. package/build/lib-client/local-files/device-fs.js +2 -1
  59. package/build/lib-client/objs-on-disk/obj-on-disk.js +5 -1
  60. package/build/lib-client/request-utils.js +14 -14
  61. package/build/lib-common/async-cryptor-wrap.d.ts +9 -9
  62. package/build/lib-common/async-cryptor-wrap.js +13 -13
  63. package/build/lib-common/byte-streaming/pipe.d.ts +1 -1
  64. package/build/lib-common/byte-streaming/pipe.js +3 -3
  65. package/build/lib-common/byte-streaming/wrapping.js +4 -2
  66. package/build/lib-common/json-utils.js +0 -3
  67. package/build/lib-common/processes/synced.js +0 -184
  68. package/build/lib-sqlite-on-3nstorage/index.d.ts +32 -0
  69. package/build/lib-sqlite-on-3nstorage/index.js +117 -0
  70. package/build/lib-sqlite-on-3nstorage/sqljs.d.ts +279 -0
  71. package/build/lib-sqlite-on-3nstorage/sqljs.js +223 -0
  72. package/build/protos/asmail.proto.js +3748 -1121
  73. package/build/protos/bytes.proto.js +731 -204
  74. package/build/protos/common.proto.js +192 -44
  75. package/build/protos/cryptor.proto.js +184 -61
  76. package/build/protos/file.proto.js +1336 -324
  77. package/build/protos/fs.proto.js +3099 -846
  78. package/build/protos/ipc.proto.js +244 -61
  79. package/build/protos/logger.proto.js +219 -53
  80. package/build/protos/mailerid.proto.js +230 -50
  81. package/build/protos/startup.proto.js +341 -77
  82. package/build/protos/storage.proto.js +276 -62
  83. package/package.json +8 -7
  84. package/protos/bytes.proto +13 -4
  85. package/protos/file.proto +4 -1
  86. 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 = objPath.concat('getAvailableAddresses');
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 = objPath.concat('addUser');
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 = objPath.concat('isActivated');
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 = objPath.concat('createUserParams');
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 = objPath.concat('getUsersOnDisk');
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 = objPath.concat('startLoginToRemoteStorage');
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 = objPath.concat('completeLoginAndLocalSetup');
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 = objPath.concat('useExistingStorage');
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 = objPath.concat('getAppLocalFS');
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 = objPath.concat('getAppSyncedFS');
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 = objPath.concat('getSysFS');
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 = objPath.concat('getUserFS');
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<void>;
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<void>;
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 node;
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
- throw (0, error_1.errWithCause)(exc, `Failed to instantiate fs node '${this.name}/${info.name}'`);
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.removeThisNodeAsLeaf(src);
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<void>;
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'>;
@@ -722,7 +722,7 @@ class S {
722
722
  this.n.ensureIsWritable();
723
723
  const node = await this.n.get(path);
724
724
  try {
725
- await node.upload(opts);
725
+ return await node.upload(opts);
726
726
  }
727
727
  catch (exc) {
728
728
  throw (0, common_1.setPathInExc)(exc, path);
@@ -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 removeThisNodeAsLeaf(src: FSChangeSrc): Promise<void>;
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<void>;
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.removeThisNodeAsLeaf(src));
182
+ return this.doChange(true, () => this.removeThisFromStorageNodes(src));
183
183
  }
184
- async removeThisNodeAsLeaf(src) {
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.seek(start);
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, read } = this.src;
74
+ const { getPosition, seek, readNext, readAt } = this.src;
76
75
  return {
77
- seek, getPosition, read,
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: async (ofs) => {
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
- read: async (len) => {
151
- if (len === undefined) {
152
- len = this.size - pos;
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.seek(ofs);
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
- open: (c, n, k) => workers.call('sbox.open', [c, n, k]),
251
- pack: (m, n, k) => workers.call('sbox.pack', [m, n, k]),
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 = this.reqType.pack(req);
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 } = this.replyType.unpack(replyBytes);
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 boolValType = protobuf_type_1.ProtoType.for(cryptor_proto_1.cryptor.BoolVal);
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
- open: (c, n, k) => workers.call({
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 kpairType.unpack(rep);
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 boolValType.unpack(rep).val;
350
+ return (0, serialization_for_wasm_1.unpackBoolVal)(rep);
361
351
  }
362
352
  }
363
353
  };