diff --git a/.github/workflows/build-revive-wasm.yml b/.github/workflows/build-revive-wasm.yml index 0cd7c91..e848516 100644 --- a/.github/workflows/build-revive-wasm.yml +++ b/.github/workflows/build-revive-wasm.yml @@ -75,6 +75,5 @@ jobs: name: revive-wasm path: | ${{ env.REVIVE_WASM_INSTALL_DIR }}/resolc.js - ${{ env.REVIVE_WASM_INSTALL_DIR }}/worker.js ${{ env.REVIVE_WASM_INSTALL_DIR }}/resolc.wasm retention-days: 1 diff --git a/Makefile b/Makefile index 96749a9..c99c885 100644 --- a/Makefile +++ b/Makefile @@ -9,8 +9,8 @@ RUSTFLAGS_EMSCRIPTEN := \ -Clink-arg=-sALLOW_MEMORY_GROWTH \ -Clink-arg=-sEXPORTED_RUNTIME_METHODS=FS,callMain,stringToNewUTF8,cwrap \ -Clink-arg=-sMODULARIZE \ - -Clink-arg=-sEXPORT_ES6 \ -Clink-arg=-sEXPORT_NAME=createRevive \ + -Clink-arg=-sWASM_ASYNC_COMPILATION=0 \ -Clink-arg=--js-library=js/embed/soljson_interface.js \ -Clink-arg=--pre-js=js/embed/pre.js diff --git a/js/embed/soljson_interface.js b/js/embed/soljson_interface.js index 44f1a64..40cabcb 100644 --- a/js/embed/soljson_interface.js +++ b/js/embed/soljson_interface.js @@ -1,60 +1,43 @@ mergeInto(LibraryManager.library, { soljson_compile: function(inputPtr, inputLen) { const inputJson = UTF8ToString(inputPtr, inputLen); - const output = Module.solc.compile(inputJson) - return stringToNewUTF8(output) + const output = Module.soljson.cwrap('solidity_compile', 'string', ['string'])(inputJson); + return stringToNewUTF8(output); }, soljson_version: function() { - var version = Module.solc.version(); - return stringToNewUTF8(version) + const version = Module.soljson.cwrap("solidity_version", "string", [])(); + return stringToNewUTF8(version); }, resolc_compile: function(inputPtr, inputLen) { - const { Worker } = require('worker_threads'); - const deasync = require('deasync'); + const inputJson = UTF8ToString(inputPtr, inputLen); + const path = require('path'); + const createRevive = require(path.resolve(__dirname, './resolc.js')); + const revive = createRevive(); - var inputJson = UTF8ToString(inputPtr, inputLen); + revive.setStdinData(inputJson); - function compileWithWorker(inputJson, callback) { - return new Promise((resolve, reject) => { - const worker = new Worker(new URL('./worker.js', import.meta.url), { - type: 'module', - }); - - // Listen for messages from the worker - worker.on('message', (message) => { - resolve(message.output); // Resolve the promise with the output - callback(null, message.output); - worker.terminate(); // Terminate the worker after processing - }); - - // Listen for errors from the worker - worker.on('error', (error) => { - reject(error); - callback(error); - worker.terminate(); - }); - - // Send the input JSON to the worker - worker.postMessage(inputJson); - }); - } - let result = null; - let error = null; - - // Use deasync to block until promise resolves - compileWithWorker(inputJson, function (err, res) { - error = err; - result = res; + let stdoutString = ""; + revive.setStdoutCallback(function(char) { + if (char.charCodeAt(0) === '\n') { + exit; + } + stdoutString += char; }); - // TODO: deasync is not present in browsers, another solution needs to be implemented - deasync.loopWhile(() => result === null && error === null); - if (error) { - const errorJson = JSON.stringify({ type: 'error', message: error.message || "Unknown error" }); - return stringToNewUTF8(errorJson) + let stderrString = ""; + revive.setStderrCallback(function(char) { + stderrString += char; + }); + + // Call main on the new instance + const result = revive.callMain(['--recursive-process']); + + if (result) { + const error = JSON.stringify({ type: 'error', message: stderrString || "Unknown error" }); + return stringToNewUTF8(error); + } else { + const json = JSON.stringify({ type: 'success', data: stdoutString }); + return stringToNewUTF8(json); } - - const resultJson = JSON.stringify({ type: 'success', data: result }); - return stringToNewUTF8(resultJson); }, }); diff --git a/js/package.json b/js/package.json index 125e236..b38dade 100644 --- a/js/package.json +++ b/js/package.json @@ -3,20 +3,17 @@ "version": "1.0.0", "description": "Revive compiler", "main": "run_revive.js", - "type": "module", "dependencies": { - "deasync": "^0.1.15", "solc": "^0.8.28" }, "scripts": { - "build": "cp ../target/wasm32-unknown-emscripten/release/resolc.js ../target/wasm32-unknown-emscripten/release/resolc.wasm ./src && npx rollup -c", + "build": "mkdir -p src && cp ../target/wasm32-unknown-emscripten/release/resolc.js ../target/wasm32-unknown-emscripten/release/resolc.wasm ./src && npx rollup -c", "test": "npm run build && node run_revive.js" }, "devDependencies": { "@babel/core": "^7.26.0", "@babel/preset-env": "^7.26.0", "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-node-resolve": "^15.3.0", "rollup": "^4.27.3", "rollup-plugin-copy": "^3.5.0" } diff --git a/js/rollup.config.js b/js/rollup.config.js index b46d773..399d2f1 100644 --- a/js/rollup.config.js +++ b/js/rollup.config.js @@ -1,12 +1,11 @@ -import babel from '@rollup/plugin-babel'; -import copy from 'rollup-plugin-copy'; -import resolve from '@rollup/plugin-node-resolve'; +const babel = require('@rollup/plugin-babel'); +const copy = require('rollup-plugin-copy'); const outputDirCJS = 'dist/revive-cjs'; const outputDirESM = 'dist/revive-esm'; -export default { - input: ['src/resolc.js', 'src/worker.js'], // Adjust this to your main entry file +module.exports = { + input: ['src/resolc.js'], output: [ { dir: outputDirCJS, @@ -24,12 +23,11 @@ export default { presets: ['@babel/preset-env'], babelHelpers: 'inline', }), - resolve(), copy({ - targets: [ - { src: 'src/resolc.wasm', dest: outputDirCJS }, - { src: 'src/resolc.wasm', dest: outputDirESM }, - ], - }) + targets: [ + { src: 'src/resolc.wasm', dest: outputDirCJS }, + { src: 'src/resolc.wasm', dest: outputDirESM }, + ], + }), ], }; diff --git a/js/run_revive.js b/js/run_revive.js index 3c16085..9c1c32d 100644 --- a/js/run_revive.js +++ b/js/run_revive.js @@ -1,6 +1,5 @@ -import solc from 'solc'; -// Import the Emscripten module -import createRevive from './dist/revive-esm/resolc.js'; +const soljson = require('solc/soljson'); +const createRevive = require('./dist/revive-cjs/resolc.js'); const compilerStandardJsonInput = { language: 'Solidity', @@ -31,8 +30,8 @@ const compilerStandardJsonInput = { }; async function runCompiler() { - const m = await createRevive(); - m.solc = solc; + const m = createRevive(); + m.soljson = soljson; // Set input data for stdin m.setStdinData(JSON.stringify(compilerStandardJsonInput)); diff --git a/js/src/worker.js b/js/src/worker.js deleted file mode 100644 index 24a7b00..0000000 --- a/js/src/worker.js +++ /dev/null @@ -1,32 +0,0 @@ -import { parentPort } from 'worker_threads'; - -parentPort.on('message', async (inputJson) => { - const { default: createRevive } = await import(new URL('./resolc.js', import.meta.url)); - const revive = await createRevive(); - - revive.setStdinData(inputJson); - - let stdoutString = ""; - revive.setStdoutCallback(function(char) { - if (char.charCodeAt(0) === '\n') { - console.log("new line") - exit - } - stdoutString += char; - }); - - let stderrString = ""; - revive.setStderrCallback(function(char) { - stderrString += char; - }); - - // Call main on the new instance - const output = revive.callMain(['--recursive-process']); - - if (stderrString.length > 0) { - // If /err is not empty, throw an error with its content - throw new Error(stderrString); - } else { - parentPort.postMessage({ output: stdoutString }); - } -});