1- import { exec } from 'child_process '
1+ import { createWriteStream } from 'fs '
22import { rename , rm } from 'fs/promises'
33import { dirname , join } from 'path'
4- import { promisify } from 'util'
4+ import { Readable } from 'stream'
5+ import { pipeline } from 'stream/promises'
6+ import { Extract } from 'unzipper'
57import { GIT_COMMIT_HASH } from '../config.ts'
6- import { Logger } from '../types.ts'
7-
8- const execPromise = promisify ( exec )
8+ import type { Logger } from '../types.ts'
99
1010const logger : Logger = console
1111
12- const CLONE_DIR = './zk-symmetric-crypto'
13- const CLONE_CMD = [
14- `git clone https://github.com/reclaimprotocol/zk-symmetric-crypto ${ CLONE_DIR } ` ,
15- `cd ${ CLONE_DIR } ` ,
16- `git reset ${ GIT_COMMIT_HASH } --hard`
17- ] . join ( ' && ' )
12+ const ZIP_URL = `https://github.com/reclaimprotocol/zk-symmetric-crypto/archive/${ GIT_COMMIT_HASH } .zip`
13+ const DOWNLOAD_DIR = './zk-symmetric-crypto-download'
14+ const EXTRACTED_DIR = `./zk-symmetric-crypto-${ GIT_COMMIT_HASH } `
1815
1916const __dirname = dirname ( import . meta. url . replace ( 'file://' , '' ) )
2017const BASE_DIR = join ( __dirname , '../../' )
@@ -23,28 +20,60 @@ const DIRS_TO_COPY = [
2320 'bin'
2421]
2522
23+ async function downloadAndExtractZip ( ) {
24+ logger . info ( `downloading archive from ${ ZIP_URL } ` )
25+
26+ const response = await fetch ( ZIP_URL )
27+ if ( ! response . ok ) {
28+ throw new Error ( `Failed to download: ${ response . status } ${ response . statusText } ` )
29+ }
30+
31+ const zipPath = join ( DOWNLOAD_DIR , 'repo.zip' )
32+ await rm ( DOWNLOAD_DIR , { recursive : true , force : true } )
33+ await rm ( EXTRACTED_DIR , { recursive : true , force : true } )
34+
35+ // Create download directory and download ZIP
36+ const { mkdir } = await import ( 'fs/promises' )
37+ await mkdir ( DOWNLOAD_DIR , { recursive : true } )
38+
39+ if ( ! response . body ) {
40+ throw new Error ( 'Response body is null' )
41+ }
42+
43+ await pipeline (
44+ Readable . fromWeb ( response . body as any ) ,
45+ createWriteStream ( zipPath )
46+ )
47+
48+ logger . info ( 'downloaded ZIP, extracting...' )
49+
50+ // Extract ZIP
51+ const fs = await import ( 'fs' )
52+ await pipeline (
53+ fs . createReadStream ( zipPath ) ,
54+ Extract ( { path : './' } )
55+ )
56+
57+ logger . info ( `extracted to ${ EXTRACTED_DIR } ` )
58+ }
59+
2660async function main ( ) {
2761 for ( const dir of DIRS_TO_COPY ) {
2862 await rm ( join ( BASE_DIR , dir ) , { recursive : true , force : true } )
2963 logger . info ( `removing old "${ dir } " directory` )
3064 }
3165
32- // remove in case it already exists -- we want to clone fresh
33- await rm ( CLONE_DIR , { recursive : true , force : true } )
34- logger . info ( `removed old cloned "${ CLONE_DIR } " directory` )
35-
36- logger . info ( `cloning repo, #${ GIT_COMMIT_HASH } . This may take a while...` )
37-
38- await execPromise ( CLONE_CMD )
39- logger . info ( `cloned repo to "${ CLONE_DIR } "` )
66+ await downloadAndExtractZip ( )
4067
4168 for ( const dir of DIRS_TO_COPY ) {
42- await rename ( join ( CLONE_DIR , dir ) , join ( BASE_DIR , dir ) )
69+ await rename ( join ( EXTRACTED_DIR , dir ) , join ( BASE_DIR , dir ) )
4370 logger . info ( `moved "${ dir } " directory` )
4471 }
4572
46- await rm ( CLONE_DIR , { recursive : true , force : true } )
47- logger . info ( `removed "${ CLONE_DIR } " directory` )
73+ // Clean up
74+ await rm ( DOWNLOAD_DIR , { recursive : true , force : true } )
75+ await rm ( EXTRACTED_DIR , { recursive : true , force : true } )
76+ logger . info ( 'cleaned up temporary files' )
4877
4978 logger . info ( 'done' )
5079}
0 commit comments