feat: read the release assets asynchronously (#552)

Previously all assets were being read synchronously into memory, making
the action unsuitable for releasing very large assets. Because the
client library allows stream body inputs (it just forwards it to the
underlying `fetch` implementation), just do it.

The idea is also suggested by @enumag in
https://github.com/softprops/action-gh-release/issues/353#issuecomment-1793865790.

Fixes: #353

Signed-off-by: WANG Xuerui <git@xen0n.name>
This commit is contained in:
WÁNG Xuěruì 2024-12-11 10:19:13 +08:00 committed by GitHub
parent 9e35a64dfd
commit 64f1fa19ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 5 additions and 6 deletions

View File

@ -1,6 +1,5 @@
//import * as assert from "assert";
//const assert = require('assert');
import * as assert from "assert";
import { text } from "stream/consumers";
import { mimeOrDefault, asset } from "../src/github";
describe("github", () => {
@ -19,7 +18,7 @@ describe("github", () => {
assert.equal(name, "bar.txt");
assert.equal(mime, "text/plain");
assert.equal(size, 10);
assert.equal(data.toString(), "release me");
assert.equal(await text(data), "release me");
});
});
});

View File

@ -1,6 +1,6 @@
import { GitHub } from "@actions/github/lib/utils";
import { Config, isTag, releaseBody, alignAssetName } from "./util";
import { statSync, readFileSync } from "fs";
import { createReadStream, statSync, type ReadStream } from "fs";
import { getType } from "mime";
import { basename } from "path";
@ -10,7 +10,7 @@ export interface ReleaseAsset {
name: string;
mime: string;
size: number;
data: Buffer;
data: ReadStream;
}
export interface Release {
@ -145,7 +145,7 @@ export const asset = (path: string): ReleaseAsset => {
name: basename(path),
mime: mimeOrDefault(path),
size: statSync(path).size,
data: readFileSync(path),
data: createReadStream(path, "binary"),
};
};