@@ -4,10 +4,12 @@ import { dirname, join, parse } from 'node:path';
44import { platform , arch } from "node:process" ;
55import { mkdir } from "node:fs/promises" ;
66import { existsSync } from "node:fs" ;
7+
78import decompress from 'decompress' ;
89import decompressUnzip from 'decompress-unzip' ;
910import decompressTar from 'decompress-tar' ;
1011import xz from '@napi-rs/lzma/xz' ;
12+
1113const __dirname = dirname ( fileURLToPath ( import . meta. url ) ) ;
1214
1315const TAG = "v0.3.2" ;
@@ -31,12 +33,18 @@ async function getWeval() {
3133 }
3234
3335 async function getJSON ( url ) {
34- let response = await fetch ( url ) ;
35- if ( ! response . ok ) {
36- console . error ( `Bad response from ${ url } ` ) ;
37- process . exit ( 1 ) ;
36+ let resp ;
37+ try {
38+ resp = await fetch ( url ) ;
39+ if ( ! resp . ok ) {
40+ throw new Error ( "non 2xx response code" ) ;
3841 }
39- return response . json ( ) ;
42+ return resp . json ( ) ;
43+ } catch ( err ) {
44+ const errMsg = err ?. toString ( ) ?? 'unknown error' ;
45+ console . error ( `failed to fetch JSON from URL [${ url } ] (status ${ resp ?. status } ): ${ errMsg } ` ) ;
46+ process . exit ( 1 ) ;
47+ }
4048 }
4149
4250 const platformName = getPlatformName ( ) ;
@@ -46,40 +54,42 @@ async function getWeval() {
4654 const exeDir = join ( __dirname , platformName ) ;
4755 const exe = join ( exeDir , `weval${ exeSuffix } ` ) ;
4856
49- if ( ! existsSync ( exe ) ) {
50- await mkdir ( exeDir , { recursive : true } ) ;
57+ // If we already have the executable installed, then return it
58+ if ( existsSync ( exe ) ) {
59+ return exe ;
60+ }
5161
52- let repoBaseURL = `https://api.github.com/repos/bytecodealliance/weval` ;
53- let response = await getJSON ( `${ repoBaseURL } /releases/tags/${ TAG } ` ) ;
54- let id = response . id ;
55- let assets = await getJSON ( `${ repoBaseURL } /releases/${ id } /assets` ) ;
56- let releaseAsset = `weval-${ TAG } -${ platformName } .${ assetSuffix } ` ;
57- let asset = assets . find ( asset => asset . name === releaseAsset ) ;
58- if ( ! asset ) {
59- console . error ( `Can't find an asset named ${ releaseAsset } ` ) ;
60- process . exit ( 1 ) ;
61- }
62- let data = await fetch ( asset . browser_download_url ) ;
63- if ( ! data . ok ) {
64- console . error ( `Error downloading ${ asset . browser_download_url } ` ) ;
65- process . exit ( 1 ) ;
66- }
67- let buf = await data . arrayBuffer ( ) ;
62+ await mkdir ( exeDir , { recursive : true } ) ;
63+ let repoBaseURL = `https://api.github.com/repos/bytecodealliance/weval` ;
64+ let response = await getJSON ( `${ repoBaseURL } /releases/tags/${ TAG } ` ) ;
65+ let id = response . id ;
66+ let assets = await getJSON ( `${ repoBaseURL } /releases/${ id } /assets` ) ;
67+ let releaseAsset = `weval-${ TAG } -${ platformName } .${ assetSuffix } ` ;
68+ let asset = assets . find ( asset => asset . name === releaseAsset ) ;
69+ if ( ! asset ) {
70+ console . error ( `Can't find an asset named ${ releaseAsset } ` ) ;
71+ process . exit ( 1 ) ;
72+ }
73+ let data = await fetch ( asset . browser_download_url ) ;
74+ if ( ! data . ok ) {
75+ console . error ( `Error downloading ${ asset . browser_download_url } ` ) ;
76+ process . exit ( 1 ) ;
77+ }
78+ let buf = await data . arrayBuffer ( ) ;
6879
69- if ( releaseAsset . endsWith ( '.xz' ) ) {
70- buf = await xz . decompress ( new Uint8Array ( buf ) ) ;
71- }
72- await decompress ( Buffer . from ( buf ) , exeDir , {
73- // Remove the leading directory from the extracted file.
74- strip : 1 ,
75- plugins : [
76- decompressUnzip ( ) ,
77- decompressTar ( )
78- ] ,
79- // Only extract the binary file and nothing else
80- filter : file => parse ( file . path ) . base === `weval${ exeSuffix } ` ,
81- } ) ;
82- }
80+ if ( releaseAsset . endsWith ( '.xz' ) ) {
81+ buf = await xz . decompress ( new Uint8Array ( buf ) ) ;
82+ }
83+ await decompress ( Buffer . from ( buf ) , exeDir , {
84+ // Remove the leading directory from the extracted file.
85+ strip : 1 ,
86+ plugins : [
87+ decompressUnzip ( ) ,
88+ decompressTar ( )
89+ ] ,
90+ // Only extract the binary file and nothing else
91+ filter : file => parse ( file . path ) . base === `weval${ exeSuffix } ` ,
92+ } ) ;
8393
8494 return exe ;
8595}
0 commit comments