@versatiles/google-cloud
Version:
A server for VersaTiles in Google Cloud Run
73 lines (72 loc) • 2.14 kB
JavaScript
import { Readable } from 'stream';
import { AbstractBucket, AbstractBucketFile } from './abstract.js';
import { openSync, readFileSync, readSync, statSync } from 'fs';
import { BucketFileMetadata } from './metadata.js';
class FileNotFoundError extends Error {
code = 404;
constructor() {
super('file not found');
}
}
export class MockedBucketFile extends AbstractBucketFile {
#file;
constructor(file) {
super();
this.#file = file;
}
get name() {
if (!this.#file)
throw new FileNotFoundError();
return this.#file.name;
}
async exists() {
return Boolean(this.#file);
}
async getMetadata() {
if (!this.#file)
throw new FileNotFoundError();
return new BucketFileMetadata({
filename: this.#file.name,
size: ('filename' in this.#file) ? statSync(this.#file.filename).size : this.#file.content.length,
});
}
createReadStream(range) {
if (!this.#file)
throw new FileNotFoundError();
let buffer;
if ('filename' in this.#file) {
if (range) {
const { start, end } = range;
const length = end - start + 1;
buffer = Buffer.allocUnsafe(length);
const fd = openSync(this.#file.filename, 'r');
readSync(fd, buffer, { position: start, length });
}
else {
buffer = readFileSync(this.#file.filename);
}
}
else {
if (range) {
buffer = this.#file.content.subarray(range.start, range.end);
}
else {
buffer = this.#file.content.subarray();
}
}
return Readable.from(buffer);
}
}
export class MockedBucket extends AbstractBucket {
#files;
constructor(files) {
super();
this.#files = new Map(files.map(f => [f.name, f]));
}
async check() {
await Promise.resolve();
}
getFile(path) {
return new MockedBucketFile(this.#files.get(path));
}
}