Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ $ npm install -g @hyperplay/cli
$ hyperplay COMMAND
running command...
$ hyperplay (--version)
@hyperplay/cli/2.14.9 darwin-arm64 node-v22.11.0
@hyperplay/cli/2.14.10 darwin-arm64 node-v22.11.0
$ hyperplay --help [COMMAND]
USAGE
$ hyperplay COMMAND
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@hyperplay/cli",
"version": "2.14.9",
"version": "2.14.10",
"description": "Hyperplay CLI",
"author": "HyperPlay Labs, Inc.",
"bin": {
Expand Down
41 changes: 26 additions & 15 deletions src/releases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,25 +89,36 @@ export async function uploadRelease(client: AxiosInstance, config: ReleaseConfig
if (!fileData) throw new Error(`File data not found for ${url.fileName}`);

const fileType = mime.lookup(fileData) || 'application/octet-stream';
const progressIterator = uploadFileS3(
fs.createReadStream(fileData),
url.uploadId,
url.key,
url.partUrls,
fileType,
{ client }
);
const fileStream = fs.createReadStream(fileData);
fileStream.setMaxListeners(20);

let location = '';
for await (const progressUpdate of progressIterator) {
if (typeof progressUpdate === 'number') {
CliUx.ux.log(`Upload progress for ${platformKey} - ${url.fileName}: ${progressUpdate}%`);
} else {
location = progressUpdate;
try {
const progressIterator = uploadFileS3(
fileStream,
url.uploadId,
url.key,
url.partUrls,
fileType,
{ client }
);

for await (const progressUpdate of progressIterator) {
if (typeof progressUpdate === 'number') {
CliUx.ux.log(`Upload progress for ${platformKey} - ${url.fileName}: ${progressUpdate}%`);
} else {
location = progressUpdate;
}
}
}

if (!location) throw new Error('No location returned after upload');
if (!location) throw new Error('No location returned after upload');
} catch (error) {
// Ensure the stream is properly closed on error
if (!fileStream.destroyed) {
fileStream.destroy();
}
throw error;
}

const fileStat = await fs.promises.stat(fileData);
const downloadSize = fileStat.size.toString();
Expand Down
44 changes: 34 additions & 10 deletions src/zip.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,55 @@ export function zipDirectory(sourceDir: string, outPath: string): Promise<void>
zlib: { level: 9 }
});

archive.on('progress', (progress)=>{
// Use function references for easier cleanup
const onProgress = (progress: { entries: { processed: number; total: number }; fs: { processedBytes: number; totalBytes: number } }) => {
let progressString = `Zip Progress: Entries ${progress.entries.processed} out of ${progress.entries.total}.`;
progressString += ` Bytes ${progress.fs.processedBytes} out of ${progress.fs.totalBytes}`;
CliUx.ux.log(progressString);
});
};

output.on('close', function () {
const onClose = () => {
console.log(`Archive created successfully. Total bytes: ${archive.pointer()}`);
cleanup();
resolve();
});
};

// Catch warnings (like stat failures and other non-blocking errors)
archive.on('warning', function (err) {
const onWarning = (err: Error & { code?: string }) => {
if (err.code === 'ENOENT') {
console.warn(err);
} else {
cleanup();
reject(err);
}
});
};

// Catch errors explicitly.
archive.on('error', function (err) {
const onError = (err: Error) => {
CliUx.ux.error(err);
cleanup();
reject(err);
});
};

const onOutputError = (err: Error) => {
cleanup();
reject(err);
};

// Clean up all event listeners
const cleanup = () => {
archive.removeListener('progress', onProgress);
archive.removeListener('warning', onWarning);
archive.removeListener('error', onError);
output.removeListener('close', onClose);
output.removeListener('error', onOutputError);
};

// Add event listeners
archive.on('progress', onProgress);
archive.on('warning', onWarning);
archive.on('error', onError);
output.on('close', onClose);
output.on('error', onOutputError);

archive.pipe(output);

// Append files from the source directory, preserving directory structure.
Expand Down