@aztec/native 0.0.1-commit.f1df4d2 → 0.0.1-commit.f224bb98b

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.
@@ -76,9 +76,19 @@ export declare function createCancellationToken(): CancellationToken;
76
76
  * @param token - The cancellation token previously passed to avmSimulate
77
77
  */
78
78
  export declare function cancelSimulation(token: CancellationToken): void;
79
+ /**
80
+ * Maximum number of concurrent AVM simulations. Each simulation spawns a dedicated OS thread,
81
+ * so this controls resource usage. Defaults to 4. Set to 0 for unlimited.
82
+ */
83
+ export declare const AVM_MAX_CONCURRENT_SIMULATIONS: number;
79
84
  /**
80
85
  * AVM simulation function that takes serialized inputs and a contract provider.
81
86
  * The contract provider enables C++ to callback to TypeScript for contract data during simulation.
87
+ *
88
+ * Simulations run on dedicated std::threads (not the libuv thread pool), so there is no risk
89
+ * of libuv thread pool exhaustion or deadlock from C++ BlockingCall callbacks.
90
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
91
+ *
82
92
  * @param inputs - Msgpack-serialized AvmFastSimulationInputs buffer
83
93
  * @param contractProvider - Object with callbacks for fetching contract instances and classes
84
94
  * @param worldStateHandle - Native handle to WorldState instance
@@ -92,10 +102,14 @@ export declare function avmSimulate(inputs: Buffer, contractProvider: ContractPr
92
102
  * AVM simulation function that uses pre-collected hints from TypeScript simulation.
93
103
  * All contract data and merkle tree hints are included in the AvmCircuitInputs, so no runtime
94
104
  * callbacks to TS or WS pointer are needed.
105
+ *
106
+ * Simulations run on dedicated std::threads (not the libuv thread pool).
107
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
108
+ *
95
109
  * @param inputs - Msgpack-serialized AvmCircuitInputs (AvmProvingInputs in C++) buffer
96
110
  * @param logLevel - Log level to control C++ verbosity
97
111
  * @returns Promise resolving to msgpack-serialized simulation results buffer
98
112
  */
99
113
  export declare function avmSimulateWithHintedDbs(inputs: Buffer, logLevel?: LogLevel): Promise<Buffer>;
100
114
  export {};
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX21vZHVsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hdGl2ZV9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFhLEtBQUssTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLOUUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFNUQsVUFBVSxlQUFlO0lBQ3ZCLEtBQUssR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDO0NBQzNDO0FBYUQsZUFBTyxNQUFNLGdCQUFnQixFQUFFLGVBQTRELENBQUM7QUFDNUYsZUFBTyxNQUFNLGVBQWUsRUFBRSxlQUEyRCxDQUFDO0FBRTFGOzs7R0FHRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0I7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNsRTs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRS9EOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1RDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXBFOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFckY7Ozs7T0FJRztJQUNILGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsQzs7O09BR0c7SUFDSCxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEM7OztPQUdHO0lBQ0gsZ0JBQWdCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ25DO0FBb0JEOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBRXBDOzs7O0dBSUc7QUFDSCx3QkFBZ0IsdUJBQXVCLElBQUksaUJBQWlCLENBRTNEO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFnQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEdBQUcsSUFBSSxDQUUvRDtBQWlCRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsd0JBQXNCLFdBQVcsQ0FDL0IsTUFBTSxFQUFFLE1BQU0sRUFDZCxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxFQUNyQixRQUFRLEdBQUUsUUFBaUIsRUFDM0IsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNmLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCLEdBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FlakI7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQXNCLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxHQUFFLFFBQWlCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQU8zRyJ9
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX21vZHVsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hdGl2ZV9tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFhLEtBQUssTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLOUUsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFNUQsVUFBVSxlQUFlO0lBQ3ZCLEtBQUssR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsZUFBZSxDQUFDO0NBQzNDO0FBYUQsZUFBTyxNQUFNLGdCQUFnQixFQUFFLGVBQTRELENBQUM7QUFDNUYsZUFBTyxNQUFNLGVBQWUsRUFBRSxlQUEyRCxDQUFDO0FBRTFGOzs7R0FHRztBQUNILE1BQU0sV0FBVyxnQkFBZ0I7SUFDL0I7Ozs7T0FJRztJQUNILG1CQUFtQixDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztJQUNsRTs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRS9EOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1RDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBRXBFOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFckY7Ozs7T0FJRztJQUNILGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsQzs7O09BR0c7SUFDSCxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFbEM7OztPQUdHO0lBQ0gsZ0JBQWdCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ25DO0FBb0JEOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBRXBDOzs7O0dBSUc7QUFDSCx3QkFBZ0IsdUJBQXVCLElBQUksaUJBQWlCLENBRTNEO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFnQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEdBQUcsSUFBSSxDQUUvRDtBQUVEOzs7R0FHRztBQUNILGVBQU8sTUFBTSw4QkFBOEIsUUFBa0UsQ0FBQztBQWdCOUc7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsd0JBQWdCLFdBQVcsQ0FDekIsTUFBTSxFQUFFLE1BQU0sRUFDZCxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxFQUNyQixRQUFRLEdBQUUsUUFBaUIsRUFDM0IsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNmLGlCQUFpQixDQUFDLEVBQUUsaUJBQWlCLEdBQ3BDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FXakI7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILHdCQUFnQix3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsR0FBRSxRQUFpQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFckcifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"native_module.d.ts","sourceRoot":"","sources":["../src/native_module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAa,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,UAAU,eAAe;IACvB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;CAC3C;AAaD,eAAO,MAAM,gBAAgB,EAAE,eAA4D,CAAC;AAC5F,eAAO,MAAM,eAAe,EAAE,eAA2D,CAAC;AAE1F;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE/D;;;;OAIG;IACH,YAAY,CAAC,sBAAsB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEpE;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAErF;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAoBD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAE/D;AAiBD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,GAAG,EACrB,QAAQ,GAAE,QAAiB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,MAAM,CAAC,CAejB;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO3G"}
1
+ {"version":3,"file":"native_module.d.ts","sourceRoot":"","sources":["../src/native_module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAa,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAK9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,UAAU,eAAe;IACvB,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC;CAC3C;AAaD,eAAO,MAAM,gBAAgB,EAAE,eAA4D,CAAC;AAC5F,eAAO,MAAM,eAAe,EAAE,eAA2D,CAAC;AAE1F;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClE;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE/D;;;;OAIG;IACH,YAAY,CAAC,sBAAsB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5D;;;;OAIG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAEpE;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAErF;;;;OAIG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAElC;;;OAGG;IACH,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAoBD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAE/D;AAED;;;GAGG;AACH,eAAO,MAAM,8BAA8B,QAAkE,CAAC;AAgB9G;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,GAAG,EACrB,QAAQ,GAAE,QAAiB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAErG"}
@@ -33,21 +33,29 @@ const nativeCancelSimulation = nativeModule.cancelSimulation;
33
33
  nativeCancelSimulation(token);
34
34
  }
35
35
  /**
36
- * Concurrency limiting for C++ AVM simulation to prevent libuv thread pool exhaustion.
37
- *
38
- * The C++ simulator uses NAPI BlockingCall to callback to TypeScript for contract data.
39
- * This blocks the libuv thread while waiting for the callback to complete. If all libuv
40
- * threads are blocked waiting for callbacks, no threads remain to service those callbacks,
41
- * causing deadlock.
42
- *
43
- * We limit concurrent simulations to UV_THREADPOOL_SIZE / 2 to ensure threads remain
44
- * available for callback processing.
45
- */ const UV_THREADPOOL_SIZE = parseInt(process.env.UV_THREADPOOL_SIZE ?? '4', 10);
46
- const MAX_CONCURRENT_AVM_SIMULATIONS = Math.max(1, Math.floor(UV_THREADPOOL_SIZE / 2));
47
- const avmSimulationSemaphore = new Semaphore(MAX_CONCURRENT_AVM_SIMULATIONS);
36
+ * Maximum number of concurrent AVM simulations. Each simulation spawns a dedicated OS thread,
37
+ * so this controls resource usage. Defaults to 4. Set to 0 for unlimited.
38
+ */ export const AVM_MAX_CONCURRENT_SIMULATIONS = parseInt(process.env.AVM_MAX_CONCURRENT_SIMULATIONS ?? '4', 10);
39
+ const avmSimulationSemaphore = AVM_MAX_CONCURRENT_SIMULATIONS > 0 ? new Semaphore(AVM_MAX_CONCURRENT_SIMULATIONS) : null;
40
+ async function withAvmConcurrencyLimit(fn) {
41
+ if (!avmSimulationSemaphore) {
42
+ return fn();
43
+ }
44
+ await avmSimulationSemaphore.acquire();
45
+ try {
46
+ return await fn();
47
+ } finally{
48
+ avmSimulationSemaphore.release();
49
+ }
50
+ }
48
51
  /**
49
52
  * AVM simulation function that takes serialized inputs and a contract provider.
50
53
  * The contract provider enables C++ to callback to TypeScript for contract data during simulation.
54
+ *
55
+ * Simulations run on dedicated std::threads (not the libuv thread pool), so there is no risk
56
+ * of libuv thread pool exhaustion or deadlock from C++ BlockingCall callbacks.
57
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
58
+ *
51
59
  * @param inputs - Msgpack-serialized AvmFastSimulationInputs buffer
52
60
  * @param contractProvider - Object with callbacks for fetching contract instances and classes
53
61
  * @param worldStateHandle - Native handle to WorldState instance
@@ -55,26 +63,20 @@ const avmSimulationSemaphore = new Semaphore(MAX_CONCURRENT_AVM_SIMULATIONS);
55
63
  * @param logger - Optional logger object for C++ logging callbacks
56
64
  * @param cancellationToken - Optional token to enable cancellation support
57
65
  * @returns Promise resolving to msgpack-serialized AvmCircuitPublicInputs buffer
58
- */ export async function avmSimulate(inputs, contractProvider, worldStateHandle, logLevel = 'info', logger, cancellationToken) {
59
- await avmSimulationSemaphore.acquire();
60
- try {
61
- return await nativeAvmSimulate(inputs, contractProvider, worldStateHandle, LogLevels.indexOf(logLevel), logger ? (level, msg)=>logger[level](msg) : null, cancellationToken);
62
- } finally{
63
- avmSimulationSemaphore.release();
64
- }
66
+ */ export function avmSimulate(inputs, contractProvider, worldStateHandle, logLevel = 'info', logger, cancellationToken) {
67
+ return withAvmConcurrencyLimit(()=>nativeAvmSimulate(inputs, contractProvider, worldStateHandle, LogLevels.indexOf(logLevel), logger ? (level, msg)=>logger[level](msg) : null, cancellationToken));
65
68
  }
66
69
  /**
67
70
  * AVM simulation function that uses pre-collected hints from TypeScript simulation.
68
71
  * All contract data and merkle tree hints are included in the AvmCircuitInputs, so no runtime
69
72
  * callbacks to TS or WS pointer are needed.
73
+ *
74
+ * Simulations run on dedicated std::threads (not the libuv thread pool).
75
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
76
+ *
70
77
  * @param inputs - Msgpack-serialized AvmCircuitInputs (AvmProvingInputs in C++) buffer
71
78
  * @param logLevel - Log level to control C++ verbosity
72
79
  * @returns Promise resolving to msgpack-serialized simulation results buffer
73
- */ export async function avmSimulateWithHintedDbs(inputs, logLevel = 'info') {
74
- await avmSimulationSemaphore.acquire();
75
- try {
76
- return await nativeAvmSimulateWithHintedDbs(inputs, LogLevels.indexOf(logLevel));
77
- } finally{
78
- avmSimulationSemaphore.release();
79
- }
80
+ */ export function avmSimulateWithHintedDbs(inputs, logLevel = 'info') {
81
+ return withAvmConcurrencyLimit(()=>nativeAvmSimulateWithHintedDbs(inputs, LogLevels.indexOf(logLevel)));
80
82
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/native",
3
- "version": "0.0.1-commit.f1df4d2",
3
+ "version": "0.0.1-commit.f224bb98b",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js"
@@ -15,8 +15,8 @@
15
15
  "../package.common.json"
16
16
  ],
17
17
  "dependencies": {
18
- "@aztec/bb.js": "0.0.1-commit.f1df4d2",
19
- "@aztec/foundation": "0.0.1-commit.f1df4d2",
18
+ "@aztec/bb.js": "0.0.1-commit.f224bb98b",
19
+ "@aztec/foundation": "0.0.1-commit.f224bb98b",
20
20
  "msgpackr": "^1.11.2"
21
21
  },
22
22
  "devDependencies": {
@@ -128,23 +128,33 @@ export function cancelSimulation(token: CancellationToken): void {
128
128
  }
129
129
 
130
130
  /**
131
- * Concurrency limiting for C++ AVM simulation to prevent libuv thread pool exhaustion.
132
- *
133
- * The C++ simulator uses NAPI BlockingCall to callback to TypeScript for contract data.
134
- * This blocks the libuv thread while waiting for the callback to complete. If all libuv
135
- * threads are blocked waiting for callbacks, no threads remain to service those callbacks,
136
- * causing deadlock.
137
- *
138
- * We limit concurrent simulations to UV_THREADPOOL_SIZE / 2 to ensure threads remain
139
- * available for callback processing.
131
+ * Maximum number of concurrent AVM simulations. Each simulation spawns a dedicated OS thread,
132
+ * so this controls resource usage. Defaults to 4. Set to 0 for unlimited.
140
133
  */
141
- const UV_THREADPOOL_SIZE = parseInt(process.env.UV_THREADPOOL_SIZE ?? '4', 10);
142
- const MAX_CONCURRENT_AVM_SIMULATIONS = Math.max(1, Math.floor(UV_THREADPOOL_SIZE / 2));
143
- const avmSimulationSemaphore = new Semaphore(MAX_CONCURRENT_AVM_SIMULATIONS);
134
+ export const AVM_MAX_CONCURRENT_SIMULATIONS = parseInt(process.env.AVM_MAX_CONCURRENT_SIMULATIONS ?? '4', 10);
135
+ const avmSimulationSemaphore =
136
+ AVM_MAX_CONCURRENT_SIMULATIONS > 0 ? new Semaphore(AVM_MAX_CONCURRENT_SIMULATIONS) : null;
137
+
138
+ async function withAvmConcurrencyLimit<T>(fn: () => Promise<T>): Promise<T> {
139
+ if (!avmSimulationSemaphore) {
140
+ return fn();
141
+ }
142
+ await avmSimulationSemaphore.acquire();
143
+ try {
144
+ return await fn();
145
+ } finally {
146
+ avmSimulationSemaphore.release();
147
+ }
148
+ }
144
149
 
145
150
  /**
146
151
  * AVM simulation function that takes serialized inputs and a contract provider.
147
152
  * The contract provider enables C++ to callback to TypeScript for contract data during simulation.
153
+ *
154
+ * Simulations run on dedicated std::threads (not the libuv thread pool), so there is no risk
155
+ * of libuv thread pool exhaustion or deadlock from C++ BlockingCall callbacks.
156
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
157
+ *
148
158
  * @param inputs - Msgpack-serialized AvmFastSimulationInputs buffer
149
159
  * @param contractProvider - Object with callbacks for fetching contract instances and classes
150
160
  * @param worldStateHandle - Native handle to WorldState instance
@@ -153,7 +163,7 @@ const avmSimulationSemaphore = new Semaphore(MAX_CONCURRENT_AVM_SIMULATIONS);
153
163
  * @param cancellationToken - Optional token to enable cancellation support
154
164
  * @returns Promise resolving to msgpack-serialized AvmCircuitPublicInputs buffer
155
165
  */
156
- export async function avmSimulate(
166
+ export function avmSimulate(
157
167
  inputs: Buffer,
158
168
  contractProvider: ContractProvider,
159
169
  worldStateHandle: any,
@@ -161,35 +171,30 @@ export async function avmSimulate(
161
171
  logger?: Logger,
162
172
  cancellationToken?: CancellationToken,
163
173
  ): Promise<Buffer> {
164
- await avmSimulationSemaphore.acquire();
165
-
166
- try {
167
- return await nativeAvmSimulate(
174
+ return withAvmConcurrencyLimit(() =>
175
+ nativeAvmSimulate(
168
176
  inputs,
169
177
  contractProvider,
170
178
  worldStateHandle,
171
179
  LogLevels.indexOf(logLevel),
172
180
  logger ? (level: LogLevel, msg: string) => logger[level](msg) : null,
173
181
  cancellationToken,
174
- );
175
- } finally {
176
- avmSimulationSemaphore.release();
177
- }
182
+ ),
183
+ );
178
184
  }
179
185
 
180
186
  /**
181
187
  * AVM simulation function that uses pre-collected hints from TypeScript simulation.
182
188
  * All contract data and merkle tree hints are included in the AvmCircuitInputs, so no runtime
183
189
  * callbacks to TS or WS pointer are needed.
190
+ *
191
+ * Simulations run on dedicated std::threads (not the libuv thread pool).
192
+ * Concurrency is limited by AVM_MAX_CONCURRENT_SIMULATIONS (default 4, 0 = unlimited).
193
+ *
184
194
  * @param inputs - Msgpack-serialized AvmCircuitInputs (AvmProvingInputs in C++) buffer
185
195
  * @param logLevel - Log level to control C++ verbosity
186
196
  * @returns Promise resolving to msgpack-serialized simulation results buffer
187
197
  */
188
- export async function avmSimulateWithHintedDbs(inputs: Buffer, logLevel: LogLevel = 'info'): Promise<Buffer> {
189
- await avmSimulationSemaphore.acquire();
190
- try {
191
- return await nativeAvmSimulateWithHintedDbs(inputs, LogLevels.indexOf(logLevel));
192
- } finally {
193
- avmSimulationSemaphore.release();
194
- }
198
+ export function avmSimulateWithHintedDbs(inputs: Buffer, logLevel: LogLevel = 'info'): Promise<Buffer> {
199
+ return withAvmConcurrencyLimit(() => nativeAvmSimulateWithHintedDbs(inputs, LogLevels.indexOf(logLevel)));
195
200
  }