|
|
|
@ -61,6 +61,7 @@ class RemoteStorageService {
|
|
|
|
|
public client: S3Client;
|
|
|
|
|
public error = '';
|
|
|
|
|
public bucket = 'hydro';
|
|
|
|
|
private replaceWithAlternativeUrlFor: Partial<Record<'user' | 'judge', (originalUrl: string) => string>>;
|
|
|
|
|
private alternatives: Record<'user' | 'judge', S3Client> = {
|
|
|
|
|
user: null,
|
|
|
|
|
judge: null,
|
|
|
|
@ -92,17 +93,22 @@ class RemoteStorageService {
|
|
|
|
|
endpoint: endPoint,
|
|
|
|
|
...base,
|
|
|
|
|
});
|
|
|
|
|
this.replaceWithAlternativeUrlFor = {};
|
|
|
|
|
if (/^https?:\/\//.test(endPointForUser)) {
|
|
|
|
|
this.alternatives.user = new S3Client({
|
|
|
|
|
endpoint: endPointForUser,
|
|
|
|
|
...base,
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
this.replaceWithAlternativeUrlFor.user = parseAlternativeEndpointUrl(endPointForUser);
|
|
|
|
|
}
|
|
|
|
|
if (/^https?:\/\//.test(endPointForJudge)) {
|
|
|
|
|
this.alternatives.judge = new S3Client({
|
|
|
|
|
endpoint: endPointForJudge,
|
|
|
|
|
...base,
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
this.replaceWithAlternativeUrlFor.judge = parseAlternativeEndpointUrl(endPointForJudge);
|
|
|
|
|
}
|
|
|
|
|
logger.success('Storage connected.');
|
|
|
|
|
this.error = null;
|
|
|
|
@ -205,6 +211,10 @@ class RemoteStorageService {
|
|
|
|
|
}), {
|
|
|
|
|
expiresIn: noExpire ? 24 * 60 * 60 * 7 : 10 * 60,
|
|
|
|
|
});
|
|
|
|
|
// using something like /fs/
|
|
|
|
|
if (useAlternativeEndpointFor && this.replaceWithAlternativeUrlFor[useAlternativeEndpointFor]) {
|
|
|
|
|
return this.replaceWithAlternativeUrlFor[useAlternativeEndpointFor](url);
|
|
|
|
|
}
|
|
|
|
|
return url;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -224,6 +234,12 @@ class RemoteStorageService {
|
|
|
|
|
},
|
|
|
|
|
Expires: 600,
|
|
|
|
|
});
|
|
|
|
|
if (this.replaceWithAlternativeUrlFor.user) {
|
|
|
|
|
return {
|
|
|
|
|
url: this.replaceWithAlternativeUrlFor.user(url),
|
|
|
|
|
fields,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return { url, fields };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|