@reclaimprotocol/zk-symmetric-crypto
Version:
JS Wrappers for Various ZK Snark Circuits
114 lines (113 loc) • 4.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.initWorker = initWorker;
const worker_threads_1 = require("worker_threads");
const wasm_binding_js_1 = __importStar(require("./wasm-binding.js"));
const BYTES_PER_PAGE = 65536;
const logger = console;
async function main() {
const { module, initialisationMemory } = worker_threads_1.workerData;
const wasm = await (0, wasm_binding_js_1.default)({ 'module_or_path': module });
const growthRequired = (initialisationMemory.byteLength - wasm.memory.buffer.byteLength) / BYTES_PER_PAGE;
if (growthRequired > 0) {
wasm.memory.grow(growthRequired);
logger.debug({ growthRequired }, 'memory grown');
}
// copy initialisation memory
const memory = new Uint8Array(wasm.memory.buffer);
memory.set(initialisationMemory);
logger.debug('worker initialised w memory');
worker_threads_1.parentPort.on('message', async (msg) => {
const [type, input] = msg;
if (type === 'prove') {
try {
const result = await (0, wasm_binding_js_1.prove)(...input.args);
sendOutputRpcBack({ id: input.id, result });
logger.debug({ id: input.id }, 'prove done');
}
catch (err) {
logger.error({ err }, 'prove error');
sendOutputRpcBack({
id: input.id,
type: 'error',
message: err.message,
stack: err.stack
});
}
return;
}
throw new Error(`Unknown message type: ${type}`);
});
worker_threads_1.parentPort.postMessage({ type: 'online' });
function sendOutputRpcBack(output) {
worker_threads_1.parentPort.postMessage(['reply', output]);
}
}
async function initWorker(workerData) {
const worker = new worker_threads_1.Worker(__filename, { workerData });
await new Promise((resolve, reject) => {
worker.once('message', resolve);
worker.once('error', reject);
});
const channel = {
rpc(type, input) {
input.id ||= createRpcId();
const wait = waitForRpcReply(input.id);
worker.postMessage([type, input]);
return wait;
},
close() {
return worker.terminate();
}
};
return channel;
async function waitForRpcReply(id) {
return new Promise((resolve, reject) => {
worker.on('message', listener);
worker.once('error', reject);
async function listener([type, output]) {
if (type !== 'reply' || output.id !== id) {
return;
}
worker.off('message', listener);
worker.off('error', reject);
if ('type' in output && output.type === 'error') {
const err = new Error(output.message);
err.stack = output.stack;
reject(err);
return;
}
resolve(output);
}
});
}
}
function createRpcId() {
return Math.random().toString(36).slice(2);
}
if (!worker_threads_1.isMainThread) {
main();
}