From da3f42fdedd451cc108eddc68c299b997b797487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Mon, 15 Jan 2024 14:12:19 +0000 Subject: [PATCH 1/2] fix: simplify streaming of server writes --- src/server.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/server.ts b/src/server.ts index 21d289c..e5a2c37 100644 --- a/src/server.ts +++ b/src/server.ts @@ -4,6 +4,7 @@ import http from 'node:http' import { tmpdir } from 'node:os' import { dirname, join, relative, resolve, sep } from 'node:path' import { platform } from 'node:process' +import { promises as stream } from 'node:stream' import { ListResponse } from './backend/list.ts' import { decodeMetadata, encodeMetadata, METADATA_HEADER_INTERNAL } from './metadata.ts' @@ -271,12 +272,7 @@ export class BlobsServer { const tempDataPath = join(tempDirectory, relativeDataPath) await fs.mkdir(dirname(tempDataPath), { recursive: true }) - - await new Promise((resolve, reject) => { - req.pipe(createWriteStream(tempDataPath)) - req.on('end', resolve) - req.on('error', reject) - }) + await stream.pipeline(req, createWriteStream(tempDataPath)) await fs.mkdir(dirname(dataPath), { recursive: true }) await fs.copyFile(tempDataPath, dataPath) From 3e4aedd4fb56f62fa9ca108279573a7128fd12b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Bou=C3=A7as?= Date: Mon, 15 Jan 2024 14:37:15 +0000 Subject: [PATCH 2/2] refactor: promisify manually --- src/server.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/server.ts b/src/server.ts index e5a2c37..a1041d3 100644 --- a/src/server.ts +++ b/src/server.ts @@ -4,7 +4,8 @@ import http from 'node:http' import { tmpdir } from 'node:os' import { dirname, join, relative, resolve, sep } from 'node:path' import { platform } from 'node:process' -import { promises as stream } from 'node:stream' +import stream from 'node:stream' +import { promisify } from 'node:util' import { ListResponse } from './backend/list.ts' import { decodeMetadata, encodeMetadata, METADATA_HEADER_INTERNAL } from './metadata.ts' @@ -22,6 +23,10 @@ export enum Operation { SET = 'set', } +// TODO: Replace with `promises` import of `node:stream` once we can drop +// support for Node 14. +const pipeline = promisify(stream.pipeline) + interface BlobsServerOptions { /** * Whether debug-level information should be logged, such as internal errors @@ -272,7 +277,7 @@ export class BlobsServer { const tempDataPath = join(tempDirectory, relativeDataPath) await fs.mkdir(dirname(tempDataPath), { recursive: true }) - await stream.pipeline(req, createWriteStream(tempDataPath)) + await pipeline(req, createWriteStream(tempDataPath)) await fs.mkdir(dirname(dataPath), { recursive: true }) await fs.copyFile(tempDataPath, dataPath)