core-3nweb-client-lib 0.44.11 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/build/core/asmail/msg/opener.js +1 -1
  2. package/build/core/asmail/msg/packer.js +1 -1
  3. package/build/core/index.d.ts +2 -2
  4. package/build/core/keyring/correspondent-keys.js +1 -1
  5. package/build/core/keyring/index.js +1 -1
  6. package/build/core/startup/sign-in.d.ts +1 -1
  7. package/build/core/startup/sign-up.d.ts +1 -1
  8. package/build/core/storage/index.d.ts +1 -1
  9. package/build/lib-client/key-derivation.d.ts +1 -1
  10. package/build/lib-client/xsp-fs/attrs.d.ts +3 -2
  11. package/build/lib-client/xsp-fs/attrs.js +7 -6
  12. package/build/lib-client/xsp-fs/folder-node.js +1 -1
  13. package/build/lib-client/xsp-fs/node-in-fs.js +1 -0
  14. package/build/lib-client/xsp-fs/node-persistence.js +1 -1
  15. package/build/lib-client/xsp-fs/xsp-payload-v2.js +1 -1
  16. package/build/tests/caps-api/asmail/specs/events.d.ts +2 -0
  17. package/build/tests/caps-api/asmail/specs/events.js +63 -0
  18. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.d.ts +2 -0
  19. package/build/tests/caps-api/asmail/specs/send-to-wrong-address.js +68 -0
  20. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.d.ts +2 -0
  21. package/build/tests/caps-api/asmail/specs/send-with-attacment-from-storage.js +259 -0
  22. package/build/tests/caps-api/asmail/specs/send-without-attachments.d.ts +2 -0
  23. package/build/tests/caps-api/asmail/specs/send-without-attachments.js +90 -0
  24. package/build/tests/caps-api/asmail/test-utils.d.ts +12 -0
  25. package/build/tests/caps-api/asmail/test-utils.js +60 -0
  26. package/build/tests/caps-api/asmail.js +86 -0
  27. package/build/tests/caps-api/file-sink-checks/different-cases.d.ts +2 -0
  28. package/build/tests/caps-api/file-sink-checks/different-cases.js +47 -0
  29. package/build/tests/caps-api/file-sink-checks/splice.d.ts +2 -0
  30. package/build/tests/caps-api/file-sink-checks/splice.js +122 -0
  31. package/build/tests/caps-api/file-sink-checks/truncate.d.ts +2 -0
  32. package/build/tests/caps-api/file-sink-checks/truncate.js +122 -0
  33. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.d.ts +2 -0
  34. package/build/tests/caps-api/fs-checks/local-to-synced-linking/link.js +82 -0
  35. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.d.ts +2 -0
  36. package/build/tests/caps-api/fs-checks/local-to-synced-linking/reversed-linking.js +50 -0
  37. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.d.ts +2 -0
  38. package/build/tests/caps-api/fs-checks/not-versioned/deleteFile.js +73 -0
  39. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.d.ts +2 -0
  40. package/build/tests/caps-api/fs-checks/not-versioned/deleteFolder.js +75 -0
  41. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.d.ts +2 -0
  42. package/build/tests/caps-api/fs-checks/not-versioned/getByteSink.js +96 -0
  43. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.d.ts +2 -0
  44. package/build/tests/caps-api/fs-checks/not-versioned/getByteSource.js +67 -0
  45. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.d.ts +2 -0
  46. package/build/tests/caps-api/fs-checks/not-versioned/getXAttr.js +77 -0
  47. package/build/tests/caps-api/fs-checks/not-versioned/link.d.ts +2 -0
  48. package/build/tests/caps-api/fs-checks/not-versioned/link.js +115 -0
  49. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.d.ts +2 -0
  50. package/build/tests/caps-api/fs-checks/not-versioned/listFolder.js +129 -0
  51. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.d.ts +2 -0
  52. package/build/tests/caps-api/fs-checks/not-versioned/listXAttrs.js +73 -0
  53. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.d.ts +2 -0
  54. package/build/tests/caps-api/fs-checks/not-versioned/makeFolder.js +95 -0
  55. package/build/tests/caps-api/fs-checks/not-versioned/move.d.ts +2 -0
  56. package/build/tests/caps-api/fs-checks/not-versioned/move.js +127 -0
  57. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.d.ts +2 -0
  58. package/build/tests/caps-api/fs-checks/not-versioned/readBytes.js +80 -0
  59. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.d.ts +2 -0
  60. package/build/tests/caps-api/fs-checks/not-versioned/readJSONFile.js +59 -0
  61. package/build/tests/caps-api/fs-checks/not-versioned/readLink.d.ts +2 -0
  62. package/build/tests/caps-api/fs-checks/not-versioned/readLink.js +39 -0
  63. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.d.ts +2 -0
  64. package/build/tests/caps-api/fs-checks/not-versioned/readTxtFile.js +54 -0
  65. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.d.ts +2 -0
  66. package/build/tests/caps-api/fs-checks/not-versioned/readonlyFile.js +55 -0
  67. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.d.ts +2 -0
  68. package/build/tests/caps-api/fs-checks/not-versioned/readonlySubRoot.js +55 -0
  69. package/build/tests/caps-api/fs-checks/not-versioned/select.d.ts +2 -0
  70. package/build/tests/caps-api/fs-checks/not-versioned/select.js +119 -0
  71. package/build/tests/caps-api/fs-checks/not-versioned/stat.d.ts +2 -0
  72. package/build/tests/caps-api/fs-checks/not-versioned/stat.js +96 -0
  73. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.d.ts +2 -0
  74. package/build/tests/caps-api/fs-checks/not-versioned/updateXAttrs.js +126 -0
  75. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.d.ts +2 -0
  76. package/build/tests/caps-api/fs-checks/not-versioned/writableFile.js +79 -0
  77. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.d.ts +2 -0
  78. package/build/tests/caps-api/fs-checks/not-versioned/writableSubRoot.js +90 -0
  79. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.d.ts +2 -0
  80. package/build/tests/caps-api/fs-checks/not-versioned/writeBytes.js +137 -0
  81. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.d.ts +2 -0
  82. package/build/tests/caps-api/fs-checks/not-versioned/writeJSONFile.js +101 -0
  83. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.d.ts +2 -0
  84. package/build/tests/caps-api/fs-checks/not-versioned/writeTxtFile.js +100 -0
  85. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.d.ts +2 -0
  86. package/build/tests/caps-api/fs-checks/sync-on-one-dev/startUpload.js +187 -0
  87. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.d.ts +2 -0
  88. package/build/tests/caps-api/fs-checks/sync-on-one-dev/stat.js +70 -0
  89. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.d.ts +2 -0
  90. package/build/tests/caps-api/fs-checks/sync-on-one-dev/status.js +53 -0
  91. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.d.ts +2 -0
  92. package/build/tests/caps-api/fs-checks/sync-on-one-dev/upload.js +194 -0
  93. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.d.ts +2 -0
  94. package/build/tests/caps-api/fs-checks/sync-with-two-devs/conflicts.js +396 -0
  95. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.d.ts +2 -0
  96. package/build/tests/caps-api/fs-checks/sync-with-two-devs/update-propagation.js +229 -0
  97. package/build/tests/caps-api/fs-checks/test-utils.d.ts +34 -0
  98. package/build/tests/caps-api/fs-checks/test-utils.js +95 -0
  99. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.d.ts +2 -0
  100. package/build/tests/caps-api/fs-checks/versioned/archiveCurrent.js +73 -0
  101. package/build/tests/caps-api/fs-checks/versioned/getByteSink.d.ts +2 -0
  102. package/build/tests/caps-api/fs-checks/versioned/getByteSink.js +122 -0
  103. package/build/tests/caps-api/fs-checks/versioned/getByteSource.d.ts +2 -0
  104. package/build/tests/caps-api/fs-checks/versioned/getByteSource.js +71 -0
  105. package/build/tests/caps-api/fs-checks/versioned/listFolder.d.ts +2 -0
  106. package/build/tests/caps-api/fs-checks/versioned/listFolder.js +109 -0
  107. package/build/tests/caps-api/fs-checks/versioned/listVersions.d.ts +2 -0
  108. package/build/tests/caps-api/fs-checks/versioned/listVersions.js +48 -0
  109. package/build/tests/caps-api/fs-checks/versioned/readBytes.d.ts +2 -0
  110. package/build/tests/caps-api/fs-checks/versioned/readBytes.js +90 -0
  111. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.d.ts +2 -0
  112. package/build/tests/caps-api/fs-checks/versioned/readJSONFile.js +60 -0
  113. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.d.ts +2 -0
  114. package/build/tests/caps-api/fs-checks/versioned/readTxtFile.js +56 -0
  115. package/build/tests/caps-api/fs-checks/versioned/stat.d.ts +2 -0
  116. package/build/tests/caps-api/fs-checks/versioned/stat.js +80 -0
  117. package/build/tests/caps-api/fs-checks/versioned/watchFile.d.ts +2 -0
  118. package/build/tests/caps-api/fs-checks/versioned/watchFile.js +64 -0
  119. package/build/tests/caps-api/fs-checks/versioned/writeBytes.d.ts +2 -0
  120. package/build/tests/caps-api/fs-checks/versioned/writeBytes.js +128 -0
  121. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.d.ts +2 -0
  122. package/build/tests/caps-api/fs-checks/versioned/writeJSONFile.js +111 -0
  123. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.d.ts +2 -0
  124. package/build/tests/caps-api/fs-checks/versioned/writeTxtFile.js +107 -0
  125. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.d.ts +2 -0
  126. package/build/tests/caps-api/fs-checks/with-core-restarts/xattrs.js +50 -0
  127. package/build/tests/caps-api/keyrings.js +69 -0
  128. package/build/tests/caps-api/mailerid.d.ts +1 -0
  129. package/build/tests/caps-api/mailerid.js +59 -0
  130. package/build/tests/caps-api/startup/signin-empty-cache.d.ts +1 -0
  131. package/build/tests/caps-api/startup/signin-empty-cache.js +108 -0
  132. package/build/tests/caps-api/startup/signin-with-cache.d.ts +1 -0
  133. package/build/tests/caps-api/startup/signin-with-cache.js +83 -0
  134. package/build/tests/caps-api/startup/signup-with-token.d.ts +1 -0
  135. package/build/tests/caps-api/startup/signup-with-token.js +53 -0
  136. package/build/tests/caps-api/startup/signup.d.ts +1 -0
  137. package/build/tests/caps-api/startup/signup.js +86 -0
  138. package/build/tests/caps-api/storage.d.ts +1 -0
  139. package/build/tests/caps-api/storage.js +225 -0
  140. package/build/tests/computer.3nweb.core/id-manager.d.ts +1 -0
  141. package/build/tests/computer.3nweb.core/id-manager.js +78 -0
  142. package/build/tests/computer.3nweb.core/inbox/msg-indexing.d.ts +1 -0
  143. package/build/tests/computer.3nweb.core/inbox/msg-indexing.js +145 -0
  144. package/build/tests/computer.3nweb.core/keyrings.d.ts +1 -0
  145. package/build/tests/computer.3nweb.core/keyrings.js +64 -0
  146. package/build/tests/computer.3nweb.core/test-utils.d.ts +21 -0
  147. package/build/tests/computer.3nweb.core/test-utils.js +92 -0
  148. package/build/tests/jasmine.d.ts +1 -0
  149. package/build/tests/jasmine.js +45 -0
  150. package/build/tests/libs-for-tests/bytes-equal.d.ts +1 -0
  151. package/build/tests/libs-for-tests/bytes-equal.js +32 -0
  152. package/build/tests/libs-for-tests/caps-ipc-wrap.d.ts +11 -0
  153. package/build/tests/libs-for-tests/caps-ipc-wrap.js +55 -0
  154. package/build/tests/libs-for-tests/core-runner.d.ts +39 -0
  155. package/build/tests/libs-for-tests/core-runner.js +231 -0
  156. package/build/tests/libs-for-tests/jasmine-utils.d.ts +13 -0
  157. package/build/tests/libs-for-tests/jasmine-utils.js +110 -0
  158. package/build/tests/libs-for-tests/json-equal.d.ts +1 -0
  159. package/build/tests/libs-for-tests/json-equal.js +78 -0
  160. package/build/tests/libs-for-tests/services-runner.d.ts +18 -0
  161. package/build/tests/libs-for-tests/services-runner.js +64 -0
  162. package/build/tests/libs-for-tests/setups.d.ts +51 -0
  163. package/build/tests/libs-for-tests/setups.js +305 -0
  164. package/build/tests/libs-for-tests/spec-module.d.ts +16 -0
  165. package/build/tests/libs-for-tests/spec-module.js +92 -0
  166. package/build/tests/libs-for-tests/startup.d.ts +1 -0
  167. package/build/tests/libs-for-tests/startup.js +29 -0
  168. package/build/tests/libs-for-tests/watching.d.ts +7 -0
  169. package/build/tests/libs-for-tests/watching.js +33 -0
  170. package/build/tests/units/canonical-address.d.ts +1 -0
  171. package/build/tests/units/canonical-address.js +41 -0
  172. package/build/tests/units/device-fs.d.ts +1 -0
  173. package/build/tests/units/device-fs.js +70 -0
  174. package/build/tests/units/folder-node-serialization.d.ts +1 -0
  175. package/build/tests/units/folder-node-serialization.js +74 -0
  176. package/build/tests/units/mid-sigs-NaCl-Ed.d.ts +1 -0
  177. package/build/tests/units/mid-sigs-NaCl-Ed.js +123 -0
  178. package/build/tests/units/number-line.d.ts +1 -0
  179. package/build/tests/units/number-line.js +63 -0
  180. package/build/tests/units/obj-folders.d.ts +1 -0
  181. package/build/tests/units/obj-folders.js +152 -0
  182. package/package.json +11 -3
  183. package/postinstall.js +1 -1
  184. package/build/cryptors.d.ts +0 -1
  185. package/build/cryptors.js +0 -34
  186. package/build/lib-client/cryptor/cryptor-in-worker.d.ts +0 -20
  187. package/build/lib-client/cryptor/cryptor-in-worker.js +0 -357
  188. package/build/lib-client/cryptor/cryptor-wasm.js +0 -1
  189. package/build/lib-client/cryptor/cryptor.d.ts +0 -30
  190. package/build/lib-client/cryptor/cryptor.js +0 -44
  191. package/build/lib-client/cryptor/cryptor.wasm +0 -0
  192. package/build/lib-client/cryptor/in-proc-js.d.ts +0 -2
  193. package/build/lib-client/cryptor/in-proc-js.js +0 -57
  194. package/build/lib-client/cryptor/in-proc-wasm.d.ts +0 -2
  195. package/build/lib-client/cryptor/in-proc-wasm.js +0 -176
  196. package/build/lib-client/cryptor/serialization-for-wasm.d.ts +0 -35
  197. package/build/lib-client/cryptor/serialization-for-wasm.js +0 -57
  198. package/build/lib-client/cryptor/wasm-mp1-modules.d.ts +0 -5
  199. package/build/lib-client/cryptor/wasm-mp1-modules.js +0 -78
  200. package/build/lib-client/cryptor/worker-js.js +0 -131
  201. package/build/lib-client/cryptor/worker-wasm.js +0 -37
  202. package/build/protos/cryptor.proto.js +0 -1804
  203. /package/build/lib-client/{cryptor/cryptor-work-labels.d.ts → cryptor-work-labels.d.ts} +0 -0
  204. /package/build/lib-client/{cryptor/cryptor-work-labels.js → cryptor-work-labels.js} +0 -0
  205. /package/build/{lib-client/cryptor/worker-js.d.ts → tests/caps-api/asmail.d.ts} +0 -0
  206. /package/build/{lib-client/cryptor/worker-wasm.d.ts → tests/caps-api/keyrings.d.ts} +0 -0
@@ -1,357 +0,0 @@
1
- "use strict";
2
- /*
3
- Copyright (C) 2020 - 2022 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.makeInWorkerWasmCryptor = exports.makeInWorkerCryptor = void 0;
20
- const worker_threads_1 = require("worker_threads");
21
- const os_1 = require("os");
22
- const deferred_1 = require("../../lib-common/processes/deferred");
23
- const error_1 = require("../../lib-common/exceptions/error");
24
- const path_1 = require("path");
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
- const MAX_IDLE_MILLIS = 60 * 1000;
29
- const jsWorkerFName = 'worker-js.js';
30
- const wasmWorkerFName = 'worker-wasm.js';
31
- function workerScriptFor(impl) {
32
- // There is a bug with electrons 12, 13, that doesn't let
33
- // worker_thread read files from asar pack, even though main thread
34
- // makes call from here.
35
- // Therefore, in case this runs from asar pack, we should switch to
36
- // unpacked in path that is given to worker thread.
37
- // Of course, asarUnpack should be used in electron-builder.
38
- const asarInd = __dirname.indexOf('app.asar');
39
- const dirWithThis = ((asarInd < 0) ?
40
- __dirname : `${__dirname.substring(0, asarInd + 8)}.unpacked${__dirname.substring(asarInd + 8)}`);
41
- if (impl === 'js') {
42
- return (0, path_1.join)(dirWithThis, jsWorkerFName);
43
- }
44
- else if (impl === 'wasm') {
45
- return (0, path_1.join)(dirWithThis, wasmWorkerFName);
46
- }
47
- else {
48
- throw new Error(`Unknown worker implementation ${impl}`);
49
- }
50
- }
51
- class Workers {
52
- constructor(workerScript, logErr, logWarning, maxThreads) {
53
- this.workerScript = workerScript;
54
- this.logErr = logErr;
55
- this.logWarning = logWarning;
56
- this.idleWorkers = [];
57
- this.allWorkers = new Set();
58
- this.waitingForIdle = [];
59
- this.replySinks = new Map();
60
- this.isClosed = false;
61
- this.periodicIdleClean = setInterval(() => {
62
- if ((this.isClosed) || (this.idleWorkers.length <= 2)) {
63
- return;
64
- }
65
- const toClose = this.idleWorkers.splice(0, (this.idleWorkers.length - 2));
66
- const now = Date.now();
67
- for (const { worker, since } of toClose) {
68
- if ((now - since) > MAX_IDLE_MILLIS) {
69
- this.detachWorker(worker);
70
- }
71
- }
72
- }, MAX_IDLE_MILLIS).unref();
73
- this.maxThreads = Math.max(1, ((typeof maxThreads === 'number') ?
74
- maxThreads : (0, os_1.cpus)().length - 1));
75
- }
76
- numOfIdle() {
77
- return this.idleWorkers.length +
78
- Math.max(this.maxThreads - this.allWorkers.size, 0);
79
- }
80
- async getIdleWorker() {
81
- const idle = this.idleWorkers.pop();
82
- if (idle) {
83
- return idle.worker;
84
- }
85
- if (this.allWorkers.size < this.maxThreads) {
86
- return this.makeWorker();
87
- }
88
- else {
89
- const deferred = (0, deferred_1.defer)();
90
- this.waitingForIdle.push(deferred);
91
- const worker = await deferred.promise;
92
- return worker;
93
- }
94
- }
95
- async doRequest(request, trans, d) {
96
- if (this.isClosed) {
97
- throw new Error(`Async cryptor is already closed`);
98
- }
99
- const worker = await this.getIdleWorker();
100
- this.replySinks.set(worker, d);
101
- if (trans) {
102
- worker.postMessage(request, trans);
103
- }
104
- else {
105
- worker.postMessage(request);
106
- }
107
- return d.res.promise;
108
- }
109
- async makeWorker() {
110
- const workerData = {
111
- loadDir: (0, path_1.dirname)(this.workerScript)
112
- };
113
- const worker = new worker_threads_1.Worker(this.workerScript, { workerData });
114
- this.allWorkers.add(worker);
115
- worker.on('message', (reply) => {
116
- const sink = this.replySinks.get(worker);
117
- if (!sink) {
118
- if (this.allWorkers.has(worker)) {
119
- this.detachWorker(worker);
120
- worker.terminate();
121
- this.logWarning(`Got a message from cryptor worker with no related sink`);
122
- this.makeWorker();
123
- }
124
- return;
125
- }
126
- const { res, interim, err } = this.processReply(reply);
127
- if (res !== undefined) {
128
- this.replySinks.delete(worker);
129
- this.declareIdle(worker);
130
- sink.res.resolve(res);
131
- }
132
- else if (err !== undefined) {
133
- this.replySinks.delete(worker);
134
- this.declareIdle(worker);
135
- sink.res.reject(err);
136
- }
137
- else if (interim !== undefined) {
138
- if (sink.interim) {
139
- sink.interim(interim);
140
- }
141
- }
142
- else {
143
- this.logWarning(`Reply message from cryptor worker has no fields`);
144
- this.detachWorker(worker);
145
- worker.terminate();
146
- this.makeWorker();
147
- }
148
- });
149
- worker.on('error', err => {
150
- const sink = this.replySinks.get(worker);
151
- if (sink) {
152
- this.replySinks.delete(worker);
153
- const errWrapped = (0, error_1.errWithCause)(err, `Error in cryptor worker thread`);
154
- this.logErr(errWrapped);
155
- sink.res.reject(errWrapped);
156
- }
157
- this.detachWorker(worker);
158
- worker.terminate();
159
- this.makeWorker();
160
- });
161
- worker.on('exit', err => {
162
- if (err && !this.isClosed) {
163
- this.logErr((0, error_1.errWithCause)(err, `Worker exited with error ${err}`));
164
- }
165
- });
166
- const workerReady = new Promise((resolve, reject) => {
167
- const errOnStart = (err) => reject((0, error_1.errWithCause)(err, `Failed to start cryptor worker in thread`));
168
- const earlyExit = (exitCode) => reject(new Error(`Thread with worker cryptor exited early with code ${exitCode}`));
169
- worker.on('error', errOnStart);
170
- worker.on('exit', earlyExit);
171
- worker.once('online', () => {
172
- resolve();
173
- worker.removeListener('error', errOnStart);
174
- worker.removeListener('exit', earlyExit);
175
- });
176
- })
177
- .catch(err => {
178
- this.detachWorker(worker);
179
- throw err;
180
- });
181
- await workerReady;
182
- return worker;
183
- }
184
- detachWorker(worker) {
185
- this.allWorkers.delete(worker);
186
- this.replySinks.delete(worker);
187
- worker.unref();
188
- }
189
- declareIdle(worker) {
190
- const deferred = this.waitingForIdle.shift();
191
- if (deferred) {
192
- deferred.resolve(worker);
193
- }
194
- else {
195
- const since = Date.now();
196
- this.idleWorkers.push({ worker, since });
197
- }
198
- }
199
- async close() {
200
- if (this.isClosed) {
201
- return;
202
- }
203
- this.isClosed = true;
204
- clearInterval(this.periodicIdleClean);
205
- const exc = new Error(`Async cryptor is closing`);
206
- for (const defW of this.waitingForIdle) {
207
- defW.reject(exc);
208
- }
209
- for (const w of this.allWorkers.values()) {
210
- await w.terminate();
211
- w.unref();
212
- }
213
- this.allWorkers.clear();
214
- }
215
- }
216
- Object.freeze(Workers.prototype);
217
- Object.freeze(Workers);
218
- class JsWorkers extends Workers {
219
- constructor(logErr, logWarning, maxThreads) {
220
- super(workerScriptFor('js'), logErr, logWarning, maxThreads);
221
- }
222
- call(func, args, trans, interim) {
223
- return this.doRequest({ func, args }, trans, { res: (0, deferred_1.defer)(), interim });
224
- }
225
- processReply(reply) {
226
- return reply;
227
- }
228
- }
229
- Object.freeze(JsWorkers.prototype);
230
- Object.freeze(JsWorkers);
231
- // XXX can we have no-copy transfer to worker?
232
- // function transfer(...arrs: Uint8Array[]): ArrayBuffer[]|undefined {
233
- // const transferLst: ArrayBuffer[] = [];
234
- // for (const arr of arrs) {
235
- // const buffer = arr.buffer;
236
- // if (!transferLst.includes(buffer)) {
237
- // transferLst.push(buffer);
238
- // }
239
- // }
240
- // return transferLst;
241
- // }
242
- const makeInWorkerCryptor = (logErr, logWarning, maxThreads) => {
243
- (0, assert_1.assert)(typeof logErr === 'function');
244
- (0, assert_1.assert)(typeof logWarning === 'function');
245
- const workers = new JsWorkers(logErr, logWarning, maxThreads);
246
- const close = workers.close.bind(workers);
247
- const execCounter = new cryptor_work_labels_1.ExecCounter(() => workers.numOfIdle());
248
- const cryptor = {
249
- scrypt: (passwd, salt, logN, r, p, dkLen, progressCB) => workers.call('scrypt', [passwd, salt, logN, r, p, dkLen], undefined, progressCB),
250
- box: {
251
- calc_dhshared_key: (pk, sk) => workers.call('box.calc_dhshared_key', [pk, sk]),
252
- generate_pubkey: (sk) => workers.call('box.generate_pubkey', [sk])
253
- },
254
- sbox: {
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])),
258
- formatWN: {
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]))
261
- }
262
- },
263
- signing: {
264
- generate_keypair: (seed) => workers.call('sign.generate_keypair', [seed]),
265
- signature: (m, sk) => workers.call('sign.signature', [m, sk]),
266
- verify: (sig, m, pk) => workers.call('sign.verify', [sig, m, pk])
267
- }
268
- };
269
- return { cryptor, close };
270
- };
271
- exports.makeInWorkerCryptor = makeInWorkerCryptor;
272
- class WasmWorkers extends Workers {
273
- constructor(logErr, logWarning, maxThreads) {
274
- super(workerScriptFor('wasm'), logErr, logWarning, maxThreads);
275
- }
276
- call(req, interim) {
277
- const msg = (0, serialization_for_wasm_1.packRequestToWASM)(req);
278
- return this.doRequest(msg, undefined, { res: (0, deferred_1.defer)(), interim });
279
- }
280
- processReply(replyBytes) {
281
- const { res, interim, err } = (0, serialization_for_wasm_1.unpackReplyFromWASM)(replyBytes);
282
- return {
283
- res: res ? res.val : undefined,
284
- interim: interim ? interim.val : undefined,
285
- err: err ? (0, serialization_for_wasm_1.toLocalErr)(err) : undefined,
286
- };
287
- }
288
- }
289
- Object.freeze(WasmWorkers.prototype);
290
- Object.freeze(WasmWorkers);
291
- const makeInWorkerWasmCryptor = (logErr, logWarning, maxThreads) => {
292
- (0, assert_1.assert)(typeof logErr === 'function');
293
- (0, assert_1.assert)(typeof logWarning === 'function');
294
- const workers = new WasmWorkers(logErr, logWarning, maxThreads);
295
- const close = workers.close.bind(workers);
296
- const execCounter = new cryptor_work_labels_1.ExecCounter(() => workers.numOfIdle());
297
- const cryptor = {
298
- scrypt: (passwd, salt, logN, r, p, dkLen, progressCB) => workers.call({
299
- func: 1,
300
- scryptArgs: { passwd, salt, logN, r, p, dkLen }
301
- }, (bytes) => progressCB(bytes[0])),
302
- box: {
303
- calc_dhshared_key: (pk, sk) => workers.call({
304
- func: 2,
305
- byteArgs: (0, serialization_for_wasm_1.toArgs)(pk, sk)
306
- }),
307
- generate_pubkey: (sk) => workers.call({
308
- func: 3,
309
- byteArgs: (0, serialization_for_wasm_1.toArgs)(sk)
310
- })
311
- },
312
- sbox: {
313
- canStartUnderWorkLabel: l => execCounter.canStartUnderWorkLabel(l),
314
- open: (c, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
315
- func: 4,
316
- byteArgs: (0, serialization_for_wasm_1.toArgs)(c, n, k)
317
- })),
318
- pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
319
- func: 5,
320
- byteArgs: (0, serialization_for_wasm_1.toArgs)(m, n, k)
321
- })),
322
- formatWN: {
323
- open: (cn, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
324
- func: 6,
325
- byteArgs: (0, serialization_for_wasm_1.toArgs)(cn, k)
326
- })),
327
- pack: (m, n, k, workLabel) => execCounter.wrapOpPromise(workLabel, workers.call({
328
- func: 7,
329
- byteArgs: (0, serialization_for_wasm_1.toArgs)(m, n, k)
330
- }))
331
- }
332
- },
333
- signing: {
334
- generate_keypair: async (seed) => {
335
- const rep = await workers.call({
336
- func: 8,
337
- byteArgs: (0, serialization_for_wasm_1.toArgs)(seed)
338
- });
339
- return (0, serialization_for_wasm_1.unpackSigningKeyPair)(rep);
340
- },
341
- signature: (m, sk) => workers.call({
342
- func: 9,
343
- byteArgs: (0, serialization_for_wasm_1.toArgs)(m, sk)
344
- }),
345
- verify: async (sig, m, pk) => {
346
- const rep = await workers.call({
347
- func: 10,
348
- byteArgs: (0, serialization_for_wasm_1.toArgs)(sig, m, pk)
349
- });
350
- return (0, serialization_for_wasm_1.unpackBoolVal)(rep);
351
- }
352
- }
353
- };
354
- return { cryptor, close };
355
- };
356
- exports.makeInWorkerWasmCryptor = makeInWorkerWasmCryptor;
357
- Object.freeze(exports);