backend-common: implement readUrl in UrlReaderPredicateMux, and have it fall back to read

Co-authored-by: Johan Haals <johan.haals@gmail.com>
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2021-06-30 16:55:54 +02:00
parent 6b96dd2e5c
commit 7b1dd36f78
@@ -18,6 +18,8 @@ import { NotAllowedError } from '@backstage/errors';
import {
ReadTreeOptions,
ReadTreeResponse,
ReadUrlOptions,
ReadUrlResponse,
SearchOptions,
SearchResponse,
UrlReader,
@@ -35,7 +37,7 @@ export class UrlReaderPredicateMux implements UrlReader {
this.readers.push(tuple);
}
read(url: string): Promise<Buffer> {
async read(url: string): Promise<Buffer> {
const parsed = new URL(url);
for (const { predicate, reader } of this.readers) {
@@ -47,6 +49,27 @@ export class UrlReaderPredicateMux implements UrlReader {
throw new NotAllowedError(`Reading from '${url}' is not allowed`);
}
async readUrl(
url: string,
options?: ReadUrlOptions,
): Promise<ReadUrlResponse> {
const parsed = new URL(url);
for (const { predicate, reader } of this.readers) {
if (predicate(parsed)) {
if (reader.readUrl) {
return reader.readUrl(url, options);
}
const buffer = await reader.read(url);
return {
buffer: async () => buffer,
};
}
}
throw new NotAllowedError(`Reading from '${url}' is not allowed`);
}
async readTree(
url: string,
options?: ReadTreeOptions,