UNPKG

@versatiles/google-cloud

Version:
73 lines (72 loc) 2.14 kB
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)); } }