Skip to content

Commit 0e604a1

Browse files
authored
refactor: bb.js non-inlined web workers (#13736)
Inlined web workers are completely unsupported in browser extensions, which created problems for external teams. This PR moves to a more modern approach, leveraging the integrated support in latest versions of `webpack` for web workers. Unfortunately, I've run into quite a few problems implementing this approach: * Webpack didn't support proper module workers up until recently, forcing me to update it (so it wouldn't transpile the imports to the unsupported `importScripts`). Took the opportunity to equalize versions accross the board. * There's a bug in webpack that forbids loading them asynchronously and threw me for a while: webpack/webpack#17014. Solution is to carefully handle our dynamic imports so they're only applied to the wasm files. * We were using `worker-loader` in `webpack` 5, which is explicitly deprecated, but we needed it for the inlining. This gets rid of it. * Unfortunately again, new webpack handles `.d.ts` and `.d.ts.map` files differently now, which was causing trouble for downstream apps that also used webpack. Test apps and boxes have been updated to ignore them at build time (since they're only needed during development). Vite has no issues. * Took the opportunity to clean up our API, since we were never initializing the `SyncApi`with a worker and conversely, the `Async` API with a plain wasm module.
1 parent b17e18d commit 0e604a1

33 files changed

Lines changed: 763 additions & 745 deletions

File tree

barretenberg/acir_tests/browser-test-app/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@
1515
"@types/pako": "^2.0.3",
1616
"debug": "^4.3.4",
1717
"html-webpack-plugin": "^5.6.0",
18+
"ignore-loader": "^0.1.2",
1819
"pako": "^2.1.0",
1920
"serve": "^14.2.1",
2021
"ts-loader": "^9.5.1",
2122
"typescript": "^5.4.2",
22-
"webpack": "^5.90.3",
23-
"webpack-cli": "^5.1.4",
24-
"webpack-dev-server": "^5.2.0"
23+
"webpack": "^5.99.6",
24+
"webpack-cli": "^6.0.1",
25+
"webpack-dev-server": "^5.2.1"
2526
},
2627
"packageManager": "yarn@4.5.2"
2728
}

barretenberg/acir_tests/browser-test-app/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"inlineSourceMap": true,
1212
"declarationMap": true,
1313
"importHelpers": true,
14+
"isolatedModules": true,
1415
"resolveJsonModule": true,
1516
"composite": true,
1617
"outDir": "dest",

barretenberg/acir_tests/browser-test-app/webpack.config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ export default {
1313
rules: [
1414
{
1515
test: /\.tsx?$/,
16-
use: [{ loader: "ts-loader" }],
16+
loader: 'ts-loader',
17+
exclude: /node_modules|\.d\.ts(.map)?$/
18+
},
19+
{
20+
test: /\.d\.ts(.map)?$/,
21+
loader: 'ignore-loader'
1722
},
1823
],
1924
},

barretenberg/acir_tests/yarn.lock

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,10 @@ __metadata:
7575
languageName: node
7676
linkType: hard
7777

78-
"@discoveryjs/json-ext@npm:^0.5.0":
79-
version: 0.5.7
80-
resolution: "@discoveryjs/json-ext@npm:0.5.7"
81-
checksum: 10c0/e10f1b02b78e4812646ddf289b7d9f2cb567d336c363b266bd50cd223cf3de7c2c74018d91cd2613041568397ef3a4a2b500aba588c6e5bd78c38374ba68f38c
78+
"@discoveryjs/json-ext@npm:^0.6.1":
79+
version: 0.6.3
80+
resolution: "@discoveryjs/json-ext@npm:0.6.3"
81+
checksum: 10c0/778a9f9d5c3696da3c1f9fa4186613db95a1090abbfb6c2601430645c0d0158cd5e4ba4f32c05904e2dd2747d57710f6aab22bd2f8aa3c4e8feab9b247c65d85
8282
languageName: node
8383
linkType: hard
8484

@@ -390,7 +390,7 @@ __metadata:
390390
languageName: node
391391
linkType: hard
392392

393-
"@types/express-serve-static-core@npm:^4.17.33":
393+
"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33":
394394
version: 4.19.6
395395
resolution: "@types/express-serve-static-core@npm:4.19.6"
396396
dependencies:
@@ -733,36 +733,36 @@ __metadata:
733733
languageName: node
734734
linkType: hard
735735

736-
"@webpack-cli/configtest@npm:^2.1.1":
737-
version: 2.1.1
738-
resolution: "@webpack-cli/configtest@npm:2.1.1"
736+
"@webpack-cli/configtest@npm:^3.0.1":
737+
version: 3.0.1
738+
resolution: "@webpack-cli/configtest@npm:3.0.1"
739739
peerDependencies:
740-
webpack: 5.x.x
741-
webpack-cli: 5.x.x
742-
checksum: 10c0/a8da1f15702cb289807da99235ed95326ed7dabeb1a36ca59bd3a5dbe6adcc946a9a2767936050fc4d5ed14efab0e5b5a641dfe8e3d862c36caa5791ac12759d
740+
webpack: ^5.82.0
741+
webpack-cli: 6.x.x
742+
checksum: 10c0/edd24ecfc429298fe86446f7d7daedfe82d72e7f6236c81420605484fdadade5d59c6bcef3d76bd724e11d9727f74e75de183223ae62d3a568b2d54199688cbe
743743
languageName: node
744744
linkType: hard
745745

746-
"@webpack-cli/info@npm:^2.0.2":
747-
version: 2.0.2
748-
resolution: "@webpack-cli/info@npm:2.0.2"
746+
"@webpack-cli/info@npm:^3.0.1":
747+
version: 3.0.1
748+
resolution: "@webpack-cli/info@npm:3.0.1"
749749
peerDependencies:
750-
webpack: 5.x.x
751-
webpack-cli: 5.x.x
752-
checksum: 10c0/ca88a35604dc9aedac7c26e8f6793c5039dc1eea2b12a85fbfd669a5f21ecf9cf169d7fd157ea366a62666e3fa05b776306a96742ac61a9868f44fdce6b40f7d
750+
webpack: ^5.82.0
751+
webpack-cli: 6.x.x
752+
checksum: 10c0/b23b94e7dc8c93e79248f20d5f1bd0fbb7b9ba4b012803e2fdc5440b8f2ee1f3eca7f4933bbca346c8168673bf572b1858169a3cb2c17d9b8bcd833d480c2170
753753
languageName: node
754754
linkType: hard
755755

756-
"@webpack-cli/serve@npm:^2.0.5":
757-
version: 2.0.5
758-
resolution: "@webpack-cli/serve@npm:2.0.5"
756+
"@webpack-cli/serve@npm:^3.0.1":
757+
version: 3.0.1
758+
resolution: "@webpack-cli/serve@npm:3.0.1"
759759
peerDependencies:
760-
webpack: 5.x.x
761-
webpack-cli: 5.x.x
760+
webpack: ^5.82.0
761+
webpack-cli: 6.x.x
762762
peerDependenciesMeta:
763763
webpack-dev-server:
764764
optional: true
765-
checksum: 10c0/36079d34971ff99a58b66b13f4184dcdd8617853c48cccdbc3f9ab7ea9e5d4fcf504e873c298ea7aa15e0b51ad2c4aee4d7a70bd7d9364e60f57b0eb93ca15fc
765+
checksum: 10c0/65245e45bfa35e11a5b30631b99cfed0c1b39b2cc8320fa2d2a4185264535618827d349ec032c58af4201d6236cbc43bec894fcb840fdd06314611537a80e210
766766
languageName: node
767767
linkType: hard
768768

@@ -1180,13 +1180,14 @@ __metadata:
11801180
"@types/pako": "npm:^2.0.3"
11811181
debug: "npm:^4.3.4"
11821182
html-webpack-plugin: "npm:^5.6.0"
1183+
ignore-loader: "npm:^0.1.2"
11831184
pako: "npm:^2.1.0"
11841185
serve: "npm:^14.2.1"
11851186
ts-loader: "npm:^9.5.1"
11861187
typescript: "npm:^5.4.2"
1187-
webpack: "npm:^5.90.3"
1188-
webpack-cli: "npm:^5.1.4"
1189-
webpack-dev-server: "npm:^5.2.0"
1188+
webpack: "npm:^5.99.6"
1189+
webpack-cli: "npm:^6.0.1"
1190+
webpack-dev-server: "npm:^5.2.1"
11901191
languageName: unknown
11911192
linkType: soft
11921193

@@ -1487,13 +1488,6 @@ __metadata:
14871488
languageName: node
14881489
linkType: hard
14891490

1490-
"commander@npm:^10.0.1":
1491-
version: 10.0.1
1492-
resolution: "commander@npm:10.0.1"
1493-
checksum: 10c0/53f33d8927758a911094adadda4b2cbac111a5b377d8706700587650fd8f45b0bbe336de4b5c3fe47fd61f420a3d9bd452b6e0e6e5600a7e74d7bf0174f6efe3
1494-
languageName: node
1495-
linkType: hard
1496-
14971491
"commander@npm:^12.1.0":
14981492
version: 12.1.0
14991493
resolution: "commander@npm:12.1.0"
@@ -1947,7 +1941,7 @@ __metadata:
19471941
languageName: node
19481942
linkType: hard
19491943

1950-
"envinfo@npm:^7.7.3":
1944+
"envinfo@npm:^7.14.0":
19511945
version: 7.14.0
19521946
resolution: "envinfo@npm:7.14.0"
19531947
bin:
@@ -2740,6 +2734,13 @@ __metadata:
27402734
languageName: node
27412735
linkType: hard
27422736

2737+
"ignore-loader@npm:^0.1.2":
2738+
version: 0.1.2
2739+
resolution: "ignore-loader@npm:0.1.2"
2740+
checksum: 10c0/0ba7f0fbcd4d796e68cc05723279b662dea32f229f5912c6ce4fbcc5a50f592d2b6f32baaf047b47b24dccdfdc9faf2db504b48cb6eb886a4969bfc293739cab
2741+
languageName: node
2742+
linkType: hard
2743+
27432744
"import-fresh@npm:^3.3.0":
27442745
version: 3.3.1
27452746
resolution: "import-fresh@npm:3.3.1"
@@ -5138,35 +5139,33 @@ __metadata:
51385139
languageName: node
51395140
linkType: hard
51405141

5141-
"webpack-cli@npm:^5.1.4":
5142-
version: 5.1.4
5143-
resolution: "webpack-cli@npm:5.1.4"
5142+
"webpack-cli@npm:^6.0.1":
5143+
version: 6.0.1
5144+
resolution: "webpack-cli@npm:6.0.1"
51445145
dependencies:
5145-
"@discoveryjs/json-ext": "npm:^0.5.0"
5146-
"@webpack-cli/configtest": "npm:^2.1.1"
5147-
"@webpack-cli/info": "npm:^2.0.2"
5148-
"@webpack-cli/serve": "npm:^2.0.5"
5146+
"@discoveryjs/json-ext": "npm:^0.6.1"
5147+
"@webpack-cli/configtest": "npm:^3.0.1"
5148+
"@webpack-cli/info": "npm:^3.0.1"
5149+
"@webpack-cli/serve": "npm:^3.0.1"
51495150
colorette: "npm:^2.0.14"
5150-
commander: "npm:^10.0.1"
5151+
commander: "npm:^12.1.0"
51515152
cross-spawn: "npm:^7.0.3"
5152-
envinfo: "npm:^7.7.3"
5153+
envinfo: "npm:^7.14.0"
51535154
fastest-levenshtein: "npm:^1.0.12"
51545155
import-local: "npm:^3.0.2"
51555156
interpret: "npm:^3.1.1"
51565157
rechoir: "npm:^0.8.0"
5157-
webpack-merge: "npm:^5.7.3"
5158+
webpack-merge: "npm:^6.0.1"
51585159
peerDependencies:
5159-
webpack: 5.x.x
5160+
webpack: ^5.82.0
51605161
peerDependenciesMeta:
5161-
"@webpack-cli/generators":
5162-
optional: true
51635162
webpack-bundle-analyzer:
51645163
optional: true
51655164
webpack-dev-server:
51665165
optional: true
51675166
bin:
5168-
webpack-cli: bin/cli.js
5169-
checksum: 10c0/4266909ae5e2e662c8790ac286e965b2c7fd5a4a2f07f48e28576234c9a5f631847ccddc18e1b3281c7b4be04a7ff4717d2636033a322dde13ac995fd0d9de10
5167+
webpack-cli: ./bin/cli.js
5168+
checksum: 10c0/2aaca78e277427f03f528602abd707d224696048fb46286ea636c7975592409c4381ca94d68bbbb3900f195ca97f256e619583e8feb34a80da531461323bf3e2
51705169
languageName: node
51715170
linkType: hard
51725171

@@ -5189,13 +5188,14 @@ __metadata:
51895188
languageName: node
51905189
linkType: hard
51915190

5192-
"webpack-dev-server@npm:^5.2.0":
5193-
version: 5.2.0
5194-
resolution: "webpack-dev-server@npm:5.2.0"
5191+
"webpack-dev-server@npm:^5.2.1":
5192+
version: 5.2.1
5193+
resolution: "webpack-dev-server@npm:5.2.1"
51955194
dependencies:
51965195
"@types/bonjour": "npm:^3.5.13"
51975196
"@types/connect-history-api-fallback": "npm:^1.5.4"
51985197
"@types/express": "npm:^4.17.21"
5198+
"@types/express-serve-static-core": "npm:^4.17.21"
51995199
"@types/serve-index": "npm:^1.9.4"
52005200
"@types/serve-static": "npm:^1.15.5"
52015201
"@types/sockjs": "npm:^0.3.36"
@@ -5229,18 +5229,18 @@ __metadata:
52295229
optional: true
52305230
bin:
52315231
webpack-dev-server: bin/webpack-dev-server.js
5232-
checksum: 10c0/afb2e51945ac54ef3039e11e377241e1cb97a8d3f526f39f13c3fa924c530fb6063200c2c3ae4e33e6bcc110d4abed777c09ce18e2d261012853d81f3c5820ab
5232+
checksum: 10c0/22bcf2bcc7c72cd2065883ed4368fbcdf20078bc746b07689d10a0546ee99ea00bc50f0474112278ffd8598a5bc237df2bf7bb7f6dcda940a16b1eb91137efea
52335233
languageName: node
52345234
linkType: hard
52355235

5236-
"webpack-merge@npm:^5.7.3":
5237-
version: 5.10.0
5238-
resolution: "webpack-merge@npm:5.10.0"
5236+
"webpack-merge@npm:^6.0.1":
5237+
version: 6.0.1
5238+
resolution: "webpack-merge@npm:6.0.1"
52395239
dependencies:
52405240
clone-deep: "npm:^4.0.1"
52415241
flat: "npm:^5.0.2"
5242-
wildcard: "npm:^2.0.0"
5243-
checksum: 10c0/b607c84cabaf74689f965420051a55a08722d897bdd6c29cb0b2263b451c090f962d41ecf8c9bf56b0ab3de56e65476ace0a8ecda4f4a4663684243d90e0512b
5242+
wildcard: "npm:^2.0.1"
5243+
checksum: 10c0/bf1429567858b353641801b8a2696ca0aac270fc8c55d4de8a7b586fe07d27fdcfc83099a98ab47e6162383db8dd63bb8cc25b1beb2ec82150422eec843b0dc0
52445244
languageName: node
52455245
linkType: hard
52465246

@@ -5251,9 +5251,9 @@ __metadata:
52515251
languageName: node
52525252
linkType: hard
52535253

5254-
"webpack@npm:^5.90.3":
5255-
version: 5.98.0
5256-
resolution: "webpack@npm:5.98.0"
5254+
"webpack@npm:^5.99.6":
5255+
version: 5.99.6
5256+
resolution: "webpack@npm:5.99.6"
52575257
dependencies:
52585258
"@types/eslint-scope": "npm:^3.7.7"
52595259
"@types/estree": "npm:^1.0.6"
@@ -5283,7 +5283,7 @@ __metadata:
52835283
optional: true
52845284
bin:
52855285
webpack: bin/webpack.js
5286-
checksum: 10c0/bee4fa77f444802f0beafb2ff30eb5454a606163ad7d3cc9a5dcc9d24033c62407bed04601b25dea49ea3969b352c1b530a86c753246f42560a4a084eefb094e
5286+
checksum: 10c0/b8b44b16933a0dd83e185ad42f292bbdfa9c47e245cbe786c48520d681556ece9af6ea7fff33059fafdf3d2cd62674715308d70a6f15eda6c6de7e03ef01842a
52875287
languageName: node
52885288
linkType: hard
52895289

@@ -5336,7 +5336,7 @@ __metadata:
53365336
languageName: node
53375337
linkType: hard
53385338

5339-
"wildcard@npm:^2.0.0":
5339+
"wildcard@npm:^2.0.1":
53405340
version: 2.0.1
53415341
resolution: "wildcard@npm:2.0.1"
53425342
checksum: 10c0/08f70cd97dd9a20aea280847a1fe8148e17cae7d231640e41eb26d2388697cbe65b67fd9e68715251c39b080c5ae4f76d71a9a69fa101d897273efdfb1b58bf7

barretenberg/ts/package.json

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,21 +85,18 @@
8585
"buffer": "^6.0.3",
8686
"eslint": "^8.35.0",
8787
"eslint-config-prettier": "^8.8.0",
88-
"html-webpack-plugin": "^5.5.1",
88+
"html-webpack-plugin": "^5.6.3",
8989
"idb-keyval": "^6.2.1",
9090
"jest": "^29.5.0",
9191
"msgpackr": "^1.11.2",
9292
"prettier": "^2.8.4",
93-
"resolve-typescript-plugin": "^2.0.1",
94-
"source-map-support": "^0.5.21",
95-
"terser-webpack-plugin": "^5.3.11",
93+
"terser-webpack-plugin": "^5.3.14",
9694
"ts-jest": "^29.1.0",
9795
"ts-loader": "^9.4.2",
9896
"ts-node": "^10.9.1",
9997
"typescript": "5.4.5",
100-
"webpack": "^5.82.1",
101-
"webpack-cli": "^5.1.1",
102-
"webpack-dev-server": "^5.2.0",
103-
"worker-loader": "^3.0.8"
98+
"webpack": "^5.99.6",
99+
"webpack-cli": "^6.0.1",
100+
"webpack-dev-server": "^5.2.1"
104101
}
105102
}

barretenberg/ts/src/barretenberg/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { BarretenbergApi, BarretenbergApiSync } from '../barretenberg_api/index.
33
import { createMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/factory/node/index.js';
44
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
55
import { getRemoteBarretenbergWasm } from '../barretenberg_wasm/helpers/index.js';
6-
import { BarretenbergWasmWorker, fetchModuleAndThreads } from '../barretenberg_wasm/index.js';
76
import createDebug from 'debug';
87
import { Crs, GrumpkinCrs } from '../crs/index.js';
98
import { RawBuffer } from '../types/raw_buffer.js';
9+
import { fetchModuleAndThreads } from '../barretenberg_wasm/index.js';
1010

1111
export { BarretenbergVerifier } from './verifier.js';
1212
export { UltraPlonkBackend, UltraHonkBackend, AztecClientBackend } from './backend.js';
@@ -40,7 +40,7 @@ export type CircuitOptions = {
4040
export class Barretenberg extends BarretenbergApi {
4141
private options: BackendOptions;
4242

43-
private constructor(private worker: any, wasm: BarretenbergWasmWorker, options: BackendOptions) {
43+
private constructor(private worker: any, wasm: BarretenbergWasmMainWorker, options: BackendOptions) {
4444
super(wasm);
4545
this.options = options;
4646
}
@@ -52,7 +52,7 @@ export class Barretenberg extends BarretenbergApi {
5252
* It threads > 1 (defaults to hardware availability), child threads will be created on their own workers.
5353
*/
5454
static async new(options: BackendOptions = {}) {
55-
const worker = createMainWorker();
55+
const worker = await createMainWorker();
5656
const wasm = getRemoteBarretenbergWasm<BarretenbergWasmMainWorker>(worker);
5757
const { module, threads } = await fetchModuleAndThreads(options.threads, options.wasmPath, options.logger);
5858
await wasm.init(
@@ -97,6 +97,10 @@ export class Barretenberg extends BarretenbergApi {
9797
await this.wasm.destroy();
9898
await this.worker.terminate();
9999
}
100+
101+
getWasm() {
102+
return this.wasm;
103+
}
100104
}
101105

102106
let barrentenbergSyncSingletonPromise: Promise<BarretenbergSync>;

barretenberg/ts/src/barretenberg_api/index.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// WARNING: FILE CODE GENERATED BY BINDGEN UTILITY. DO NOT EDIT!
22
/* eslint-disable @typescript-eslint/no-unused-vars */
3-
import { BarretenbergWasmMain } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
4-
import { BarretenbergWasmWorker, BarretenbergWasm } from '../barretenberg_wasm/index.js';
3+
import { BarretenbergWasmMain, BarretenbergWasmMainWorker } from '../barretenberg_wasm/barretenberg_wasm_main/index.js';
54
import {
65
BufferDeserializer,
76
NumberDeserializer,
@@ -11,10 +10,10 @@ import {
1110
serializeBufferable,
1211
OutputType,
1312
} from '../serialize/index.js';
14-
import { Fr, Fq, Point, Buffer32, Buffer128, Ptr } from '../types/index.js';
13+
import { Fr, Point, Buffer32, Ptr } from '../types/index.js';
1514

1615
export class BarretenbergApi {
17-
constructor(protected wasm: BarretenbergWasmWorker | BarretenbergWasmMain) {}
16+
constructor(protected wasm: BarretenbergWasmMainWorker) {}
1817

1918
async pedersenCommit(inputsBuffer: Fr[], ctxIndex: number): Promise<Point> {
2019
const inArgs = [inputsBuffer, ctxIndex].map(serializeBufferable);
@@ -606,7 +605,7 @@ export class BarretenbergApi {
606605
}
607606
}
608607
export class BarretenbergApiSync {
609-
constructor(protected wasm: BarretenbergWasm) {}
608+
constructor(protected wasm: BarretenbergWasmMain) {}
610609

611610
pedersenCommit(inputsBuffer: Fr[], ctxIndex: number): Point {
612611
const inArgs = [inputsBuffer, ctxIndex].map(serializeBufferable);

0 commit comments

Comments
 (0)