Make file download unavailable while caching is in progress
This commit is contained in:
parent
9c185d3fd9
commit
00e21b27a5
@ -3,7 +3,7 @@ import {NextFunction, Request, Response} from "express";
|
|||||||
import * as https from "https";
|
import * as https from "https";
|
||||||
import config from "config";
|
import config from "config";
|
||||||
import {log} from "swaf/Logger";
|
import {log} from "swaf/Logger";
|
||||||
import {NotFoundHttpError} from "swaf/HttpError";
|
import {NotFoundHttpError, ServiceUnavailableHttpError} from "swaf/HttpError";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import {promisify} from "util";
|
import {promisify} from "util";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
@ -85,10 +85,15 @@ export default class GiteaRepoLatestReleaseController extends Controller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const assetPath = path.resolve(ASSETS_BASE_DIR, '' + downloadProperties.asset.id);
|
const assetPath = path.resolve(ASSETS_BASE_DIR, '' + downloadProperties.asset.id);
|
||||||
|
const tmpAssetPath = assetPath + '.tmp';
|
||||||
|
|
||||||
// Download asset if it doesn't exist
|
// Download asset if it doesn't exist
|
||||||
if (!await promisify(fs.exists)(assetPath)) {
|
if (!await promisify(fs.exists)(assetPath)) {
|
||||||
const file = fs.createWriteStream(assetPath);
|
if (await promisify(fs.exists)(tmpAssetPath)) {
|
||||||
|
throw new ServiceUnavailableHttpError('This file is currently being cached. Please try again later.');
|
||||||
|
}
|
||||||
|
|
||||||
|
const file = fs.createWriteStream(tmpAssetPath);
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
const httpRequest = https.get(downloadProperties.asset.url, res => {
|
const httpRequest = https.get(downloadProperties.asset.url, res => {
|
||||||
res.on('end', () => {
|
res.on('end', () => {
|
||||||
@ -102,6 +107,7 @@ export default class GiteaRepoLatestReleaseController extends Controller {
|
|||||||
httpRequest.end();
|
httpRequest.end();
|
||||||
});
|
});
|
||||||
file.close();
|
file.close();
|
||||||
|
await promisify(fs.rename)(tmpAssetPath, assetPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Respond
|
// Respond
|
||||||
|
Loading…
Reference in New Issue
Block a user