Fixes #357 Use a read stream for artifacts.
Some checks failed
Test / check_pr (push) Has been cancelled

This seems to be safe since octokit mentions ReadableStreams in their fetcher wrapper & tests: https://github.com/octokit/request.js/blob/main/src/fetch-wrapper.ts#L44
(and also it seems to work when I test it).
This commit is contained in:
Nick Cipollo
2023-08-24 08:37:01 -04:00
parent 2d19fb459b
commit 6c75be85e5
5 changed files with 31 additions and 29 deletions

View File

@@ -1,12 +1,14 @@
import {Artifact} from "../src/Artifact"; import {Artifact} from "../src/Artifact";
const fileContents = Buffer.from('artful facts', 'utf-8')
const contentLength = 42 const contentLength = 42
const fakeReadStream = {}
jest.mock('fs', () => { jest.mock('fs', () => {
return { return {
readFileSync: () => fileContents, createReadStream: () => fakeReadStream,
statSync: () => { return { size: contentLength } } statSync: () => {
return {size: contentLength}
}
}; };
}) })
@@ -33,6 +35,6 @@ describe("Artifact", () => {
it('reads artifact', () => { it('reads artifact', () => {
const artifact = new Artifact('some/artifact') const artifact = new Artifact('some/artifact')
expect(artifact.readFile()).toBe(fileContents) expect(artifact.readFile()).toBe(fakeReadStream)
}) })
}) })

View File

@@ -7,7 +7,7 @@ const artifacts = [
new Artifact('a/art1'), new Artifact('a/art1'),
new Artifact('b/art2') new Artifact('b/art2')
] ]
const fileContents = Buffer.from('artful facts', 'utf-8') const fakeReadStream = {}
const contentLength = 42 const contentLength = 42
const releaseId = 100 const releaseId = 100
const url = 'http://api.example.com' const url = 'http://api.example.com'
@@ -19,7 +19,7 @@ const uploadMock = jest.fn()
jest.mock('fs', () => { jest.mock('fs', () => {
return { return {
promises: {}, promises: {},
readFileSync: () => fileContents, createReadStream: () => fakeReadStream,
statSync: () => { statSync: () => {
return {size: contentLength} return {size: contentLength}
} }
@@ -42,9 +42,9 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(2) expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(0) expect(deleteMock).toBeCalledTimes(0)
}) })
@@ -58,15 +58,15 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(5) expect(uploadMock).toBeCalledTimes(5)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(0) expect(deleteMock).toBeCalledTimes(0)
}) })
@@ -81,9 +81,9 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(2) expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(2) expect(deleteMock).toBeCalledTimes(2)
expect(deleteMock).toBeCalledWith(1) expect(deleteMock).toBeCalledWith(1)
@@ -100,9 +100,9 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(2) expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(0) expect(deleteMock).toBeCalledTimes(0)
}) })
@@ -116,13 +116,13 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(4) expect(uploadMock).toBeCalledTimes(4)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(0) expect(deleteMock).toBeCalledTimes(0)
}) })
@@ -164,9 +164,9 @@ describe('ArtifactUploader', () => {
expect(uploadMock).toBeCalledTimes(2) expect(uploadMock).toBeCalledTimes(2)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art1', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art1', releaseId)
expect(uploadMock) expect(uploadMock)
.toBeCalledWith(url, contentLength, 'raw', fileContents, 'art2', releaseId) .toBeCalledWith(url, contentLength, 'raw', fakeReadStream, 'art2', releaseId)
expect(deleteMock).toBeCalledTimes(0) expect(deleteMock).toBeCalledTimes(0)
}) })

2
dist/index.js vendored
View File

@@ -205,7 +205,7 @@ class Artifact {
return (0, fs_1.statSync)(this.path).size; return (0, fs_1.statSync)(this.path).size;
} }
readFile() { readFile() {
return (0, fs_1.readFileSync)(this.path); return (0, fs_1.createReadStream)(this.path);
} }
} }
exports.Artifact = Artifact; exports.Artifact = Artifact;

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
import { basename } from "path"; import { basename } from "path";
import { readFileSync, statSync } from "fs"; import {createReadStream, readFileSync, ReadStream, statSync} from "fs";
export class Artifact { export class Artifact {
readonly contentType: string readonly contentType: string
@@ -16,7 +16,7 @@ export class Artifact {
return statSync(this.path).size return statSync(this.path).size
} }
readFile(): Buffer { readFile(): ReadStream {
return readFileSync(this.path) return createReadStream(this.path)
} }
} }