-
Notifications
You must be signed in to change notification settings - Fork 1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
edfae81
commit 9b87647
Showing
2 changed files
with
82 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,92 @@ | ||
import { app } from 'electron' | ||
import { promisify } from 'util' | ||
import { exec } from 'child_process' | ||
import { gitProxy } from './git' | ||
import path from 'path' | ||
import { existsSync } from 'fs' | ||
import fs, { existsSync } from 'fs' | ||
import axios from 'axios' | ||
|
||
const execAsync = promisify(exec) | ||
const CIRCOM_INSTALLATION_PATH = getInstallationPath() | ||
const CIRCOM_INSTALLATION_URL = getInstallationUrl() | ||
|
||
export const circomCli = { | ||
async installRustup () { | ||
try { | ||
if (process.platform !== 'win32') { | ||
console.log('installing rustup for unix') | ||
const { stdout } = await execAsync(`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y`) | ||
async function downloadFile(url: string, dest: string) { | ||
const writer = fs.createWriteStream(dest) | ||
const response = await axios({ | ||
url, | ||
method: 'GET', | ||
responseType: 'stream' | ||
}) | ||
|
||
console.log('stdout: ', stdout) | ||
} else { | ||
console.log('installing rustup for windows') | ||
response.data.pipe(writer) | ||
|
||
return new Promise((resolve, reject) => { | ||
writer.on('finish', () => { | ||
if (process.platform !== 'win32') { | ||
// Make the file executable | ||
fs.chmod(dest, 0o755, (err) => { | ||
if (err) { | ||
reject(`Error making file executable: ${err}`) | ||
} else { | ||
resolve(dest) | ||
} | ||
}) | ||
} | ||
} catch (e) { | ||
console.error(e) | ||
} | ||
}, | ||
resolve(true) | ||
}) | ||
writer.on('error', reject) | ||
}) | ||
} | ||
|
||
function getInstallationPath() { | ||
switch (process.platform) { | ||
case 'win32': | ||
return path.join(app.getPath('temp'), 'circom-windows-amd64.exe') | ||
|
||
case 'darwin': | ||
return path.join(app.getAppPath(), 'circom-macos-amd64') | ||
|
||
case 'linux': | ||
return path.join(app.getAppPath(), 'circom-linux-amd64') | ||
} | ||
} | ||
|
||
function getInstallationUrl() { | ||
switch (process.platform) { | ||
case 'win32': | ||
return "https://github.com/iden3/circom/releases/latest/download/circom-windows-amd64.exe" | ||
|
||
case 'darwin': | ||
return "https://github.com/iden3/circom/releases/latest/download/circom-macos-amd64" | ||
|
||
case 'linux': | ||
return "https://github.com/iden3/circom/releases/latest/download/circom-linux-amd64" | ||
} | ||
} | ||
|
||
export const circomCli = { | ||
async installCircom () { | ||
try { | ||
const appPath = app.getAppPath() | ||
const targetPath = path.join(appPath, 'bin') | ||
|
||
console.log('cloning circom repo to ' + targetPath) | ||
if (!existsSync(`${targetPath}/circom`)) await gitProxy.clone('https://github.com/iden3/circom.git', targetPath) | ||
console.log('builing circom with cargo') | ||
await execAsync(`cd ${targetPath}/circom && cargo build --release && cargo install --path circom`) | ||
console.log('downloading circom to ', CIRCOM_INSTALLATION_PATH) | ||
await downloadFile(CIRCOM_INSTALLATION_URL, CIRCOM_INSTALLATION_PATH) | ||
console.log('downloading done') | ||
} catch (e) { | ||
console.error(e) | ||
} | ||
}, | ||
|
||
async isCircomInstalled () { | ||
try { | ||
await execAsync(`circom --version`) | ||
|
||
return true | ||
return existsSync(CIRCOM_INSTALLATION_PATH) | ||
} catch (e) { | ||
return false | ||
} | ||
}, | ||
|
||
async isCargoInstalled () { | ||
try { | ||
await execAsync(`cargo version`) | ||
async run (filePath: string, options?: Record<string, string>) { | ||
const cmd = `${CIRCOM_INSTALLATION_PATH} ${filePath} ${Object.keys(options || {}).map((key) => `--${key} ${options[key]}`).join(' ')}` | ||
const { stdout, stderr } = await execAsync(cmd) | ||
|
||
return true | ||
} catch (e) { | ||
return false | ||
} | ||
if (stderr) return console.error(stderr) | ||
console.log(stdout) | ||
} | ||
} |