Skip to content

Commit

Permalink
Move key derivation to JS lib
Browse files Browse the repository at this point in the history
That way these classes can be tree-shaken and do not blow up WASM size when not used.

Move CryptoUtils.otpKdf function into an auto-spawning worker, so it doesn't block the main thread, as it usually takes a few seconds to run, other than the other methods on the class.
  • Loading branch information
sisou committed Jul 11, 2024
1 parent 5b6a747 commit 182d489
Show file tree
Hide file tree
Showing 32 changed files with 985 additions and 519 deletions.
3 changes: 1 addition & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion web-client/.gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
dist/*/crypto-wasm
dist/*/main-wasm
dist/*/worker-wasm
dist/types
dist/types/wasm
dist/launcher
dist/lib

Expand Down
3 changes: 1 addition & 2 deletions web-client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ gloo-timers = { version = "0.3", features = ["futures"] }
hex = "0.4"
js-sys = "0.3"
log = { workspace = true }
rand_core = "0.6.4"
serde = "1.0"
serde-wasm-bindgen = "0.6"
tokio = { version = "1.38", features = ["sync"] }
Expand All @@ -43,9 +44,7 @@ nimiq-blockchain-proxy = { workspace = true, default-features = false }
nimiq-bls = { workspace = true }
nimiq-consensus = { workspace = true, default-features = false }
nimiq-hash = { workspace = true }
nimiq-key-derivation = { workspace = true }
nimiq-keys = { workspace = true }
nimiq-mnemonic = { workspace = true, features = ["key-derivation"] }
nimiq-network-interface = { workspace = true }
nimiq-primitives = { workspace = true, features = ["coin", "networks", "ts-types"] }
nimiq-serde = { workspace = true }
Expand Down
16 changes: 11 additions & 5 deletions web-client/dist/bundler/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as Comlink from 'comlink';
import { Address, Transaction } from './main-wasm/index.js';
import { Address, CryptoUtils, Transaction } from './main-wasm/index.js';
import { clientFactory } from '../launcher/browser/client-proxy.mjs';
import { cryptoUtilsFactory } from '../launcher/browser/cryptoutils-proxy.mjs';
import { cryptoUtilsWorkerFactory } from '../launcher/browser/cryptoutils-worker-proxy.mjs';
import { setupMainThreadTransferHandlers } from '../launcher/browser/transfer-handlers.mjs';

setupMainThreadTransferHandlers(Comlink, {
Expand All @@ -14,11 +14,17 @@ const Client = clientFactory(
worker => Comlink.wrap(worker),
);

const CryptoUtils = cryptoUtilsFactory(
const CryptoUtilsWorker = cryptoUtilsWorkerFactory(
() => new Worker(new URL('./crypto.js', import.meta.url), { type : 'module' }),
worker => Comlink.wrap(worker),
);
for (const propName in CryptoUtilsWorker) {
const prop = CryptoUtilsWorker[propName];
if (typeof prop === 'function') {
CryptoUtils[propName] = prop;
}
}

export * from './main-wasm/index.js';
export { Client, CryptoUtils };
export * from '../lib/browser/index.mjs';
export { Client };
export * from '../lib/bundler/index.mjs';
Empty file.
Empty file removed web-client/dist/lib/node/.gitkeep
Empty file.
4 changes: 2 additions & 2 deletions web-client/dist/nodejs/crypto.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import { parentPort } from 'node:worker_threads';
import Comlink from 'comlink';
import nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs';
import wasm from './crypto-wasm/index.js';
import { CryptoUtils } from './crypto-wasm/index.js';

(async function init() {
console.log('Initializing crypto WASM worker');

Comlink.expose(wasm.CryptoUtils, nodeEndpoint(parentPort));
Comlink.expose(CryptoUtils, nodeEndpoint(parentPort));

parentPort.postMessage('NIMIQ_ONLOAD');
})();
13 changes: 9 additions & 4 deletions web-client/dist/nodejs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ const { join } = require('node:path');
const { Worker } = require('node:worker_threads');
const Comlink = require('comlink');
const nodeEndpoint = require('comlink/dist/umd/node-adapter.js');
const { Address, Transaction } = require('./main-wasm/index.js');
const { Address, CryptoUtils, Transaction } = require('./main-wasm/index.js');
const { clientFactory } = require('../launcher/node/client-proxy.js');
const { cryptoUtilsFactory } = require('../launcher/node/cryptoutils-proxy.js');
const { cryptoUtilsWorkerFactory } = require('../launcher/node/cryptoutils-worker-proxy.js');
const { setupMainThreadTransferHandlers } = require('../launcher/node/transfer-handlers.js');

setupMainThreadTransferHandlers(Comlink, {
Expand All @@ -17,17 +17,22 @@ const Client = clientFactory(
worker => Comlink.wrap(nodeEndpoint(worker)),
);

const CryptoUtils = cryptoUtilsFactory(
const CryptoUtilsWorker = cryptoUtilsWorkerFactory(
() => new Worker(join(__dirname, './crypto.js')),
worker => Comlink.wrap(nodeEndpoint(worker)),
);
for (const propName in CryptoUtilsWorker) {
const prop = CryptoUtilsWorker[propName];
if (typeof prop === 'function') {
CryptoUtils[propName] = prop;
}
}

const wasmexports = require('./main-wasm/index.js');
Object.keys(wasmexports).forEach(key => {
exports[key] = wasmexports[key]
});
exports.Client = Client;
exports.CryptoUtils = CryptoUtils;
const libexports = require('../lib/node/index.js');
Object.keys(libexports).forEach(key => {
exports[key] = libexports[key]
Expand Down
18 changes: 12 additions & 6 deletions web-client/dist/nodejs/index.mjs
Original file line number Diff line number Diff line change
@@ -1,26 +1,32 @@
import { Worker } from 'node:worker_threads';
import Comlink from 'comlink';
import nodeEndpoint from 'comlink/dist/esm/node-adapter.min.mjs';
import wasm from './main-wasm/index.js';
import { Address, CryptoUtils, Transaction } from './main-wasm/index.js';
import { clientFactory } from '../launcher/node/client-proxy.mjs';
import { cryptoUtilsFactory } from '../launcher/node/cryptoutils-proxy.mjs';
import { cryptoUtilsWorkerFactory } from '../launcher/node/cryptoutils-worker-proxy.mjs';
import { setupMainThreadTransferHandlers } from '../launcher/node/transfer-handlers.mjs';

setupMainThreadTransferHandlers(Comlink, {
Address: wasm.Address,
Transaction: wasm.Transaction,
Address,
Transaction,
});

const Client = clientFactory(
() => new Worker(new URL('./worker.mjs', import.meta.url)),
worker => Comlink.wrap(nodeEndpoint(worker)),
);

const CryptoUtils = cryptoUtilsFactory(
const CryptoUtilsWorker = cryptoUtilsWorkerFactory(
() => new Worker(new URL('./crypto.mjs', import.meta.url)),
worker => Comlink.wrap(nodeEndpoint(worker)),
);
for (const propName in CryptoUtilsWorker) {
const prop = CryptoUtilsWorker[propName];
if (typeof prop === 'function') {
CryptoUtils[propName] = prop;
}
}

export * from './main-wasm/index.js';
export { Client, CryptoUtils };
export { Client };
export * from '../lib/node/index.mjs';
4 changes: 2 additions & 2 deletions web-client/dist/nodejs/worker.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { parentPort } from 'node:worker_threads';
import Comlink from 'comlink';
import nodeEndpoint from 'comlink/dist/esm/node-adapter.mjs';
import websocket from 'websocket';
import wasm from './worker-wasm/index.js';
import { Client } from './worker-wasm/index.js';

// Provide a global WebSocket implementation, which is expected by the WASM code built for browsers.
global.WebSocket = websocket.w3cwebsocket;
Expand Down Expand Up @@ -43,7 +43,7 @@ async function init(config) {

console.log('Initializing client WASM worker');

const client = await wasm.Client.create(config);
const client = await Client.create(config);
Comlink.expose(client, nodeEndpoint(parentPort));
};

Expand Down
16 changes: 11 additions & 5 deletions web-client/dist/web/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as Comlink from './comlink.min.mjs';
import init, { Address, Transaction } from './main-wasm/index.js';
import init, { Address, CryptoUtils, Transaction } from './main-wasm/index.js';
import { clientFactory } from '../launcher/browser/client-proxy.mjs';
import { cryptoUtilsFactory } from '../launcher/browser/cryptoutils-proxy.mjs';
import { cryptoUtilsWorkerFactory } from '../launcher/browser/cryptoutils-worker-proxy.mjs';
import { setupMainThreadTransferHandlers } from '../launcher/browser/transfer-handlers.mjs';

setupMainThreadTransferHandlers(Comlink, {
Expand All @@ -14,12 +14,18 @@ const Client = clientFactory(
worker => Comlink.wrap(worker),
);

const CryptoUtils = cryptoUtilsFactory(
const CryptoUtilsWorker = cryptoUtilsWorkerFactory(
() => new Worker(new URL('./crypto.js', import.meta.url)),
worker => Comlink.wrap(worker),
);
for (const propName in CryptoUtilsWorker) {
const prop = CryptoUtilsWorker[propName];
if (typeof prop === 'function') {
CryptoUtils[propName] = prop;
}
}

export * from './main-wasm/index.js';
export { Client, CryptoUtils };
export * from '../lib/browser/index.mjs';
export { Client };
export * from '../lib/web/index.mjs';
export default init;
80 changes: 47 additions & 33 deletions web-client/dist/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@


bufferutil@^4.0.1:
version "4.0.7"
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad"
integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==
version "4.0.8"
resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea"
integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==
dependencies:
node-gyp-build "^4.3.0"

Expand All @@ -14,13 +14,13 @@ comlink@^4.4.1:
resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.1.tgz#e568b8e86410b809e8600eb2cf40c189371ef981"
integrity sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==

d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
d@1, d@^1.0.1, d@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de"
integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
es5-ext "^0.10.64"
type "^2.7.2"

debug@^2.2.0:
version "2.6.9"
Expand All @@ -29,13 +29,14 @@ debug@^2.2.0:
dependencies:
ms "2.0.0"

es5-ext@^0.10.35, es5-ext@^0.10.50:
version "0.10.62"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.63, es5-ext@^0.10.64, es5-ext@~0.10.14:
version "0.10.64"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
esniff "^2.0.1"
next-tick "^1.1.0"

es6-iterator@^2.0.3:
Expand All @@ -48,14 +49,32 @@ es6-iterator@^2.0.3:
es6-symbol "^3.1.1"

es6-symbol@^3.1.1, es6-symbol@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
version "3.1.4"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c"
integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==
dependencies:
d "^1.0.2"
ext "^1.7.0"

esniff@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
dependencies:
d "^1.0.1"
ext "^1.1.2"
es5-ext "^0.10.62"
event-emitter "^0.3.5"
type "^2.7.2"

ext@^1.1.2:
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
dependencies:
d "1"
es5-ext "~0.10.14"

ext@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
Expand All @@ -78,19 +97,14 @@ next-tick@^1.1.0:
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==

node-gyp-build@^4.3.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055"
integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==

type@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
version "4.8.1"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5"
integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==

type@^2.7.2:
version "2.7.2"
resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
version "2.7.3"
resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486"
integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==

typedarray-to-buffer@^3.1.5:
version "3.1.5"
Expand All @@ -107,13 +121,13 @@ utf-8-validate@^5.0.2:
node-gyp-build "^4.3.0"

websocket@^1.0.34:
version "1.0.34"
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111"
integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==
version "1.0.35"
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.35.tgz#374197207d7d4cc4c36cbf8a1bb886ee52a07885"
integrity sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==
dependencies:
bufferutil "^4.0.1"
debug "^2.2.0"
es5-ext "^0.10.50"
es5-ext "^0.10.63"
typedarray-to-buffer "^3.1.5"
utf-8-validate "^5.0.2"
yaeti "^0.0.6"
Expand Down
2 changes: 1 addition & 1 deletion web-client/example/node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
"main": "index.js",
"module": "index.mjs",
"dependencies": {
"@nimiq/core": "../../dist"
"@nimiq/core": "link:../../dist"
}
}
8 changes: 3 additions & 5 deletions web-client/example/node/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@
# yarn lockfile v1


"@nimiq/core@../../dist":
version "2"
dependencies:
comlink "^4.4.1"
websocket "^1.0.34"
"@nimiq/core@link:../../dist":
version "0.0.0"
uid ""

bufferutil@^4.0.1:
version "4.0.7"
Expand Down
Loading

0 comments on commit 182d489

Please sign in to comment.