@versatiles/google-cloud
Version:
A server for VersaTiles in Google Cloud Run
59 lines (58 loc) • 1.91 kB
JavaScript
import { AbstractBucket, AbstractBucketFile } from './abstract.js';
import { Storage } from '@google-cloud/storage';
import { BucketFileMetadata } from './metadata.js';
export class BucketFileGoogle extends AbstractBucketFile {
#file;
constructor(file) {
super();
this.#file = file;
}
get name() {
return this.#file.name;
}
// Check if the file exists
async exists() {
const [exists] = await this.#file.exists();
return exists;
}
// Get metadata for the file
async getMetadata() {
const [metadata] = await this.#file.getMetadata();
return new BucketFileMetadata({
cacheControl: metadata.cacheControl,
contentType: metadata.contentType,
etag: metadata.etag,
filename: metadata.name,
mtime: metadata.timeCreated,
size: metadata.size,
});
}
// Create a readable stream for the file
createReadStream(opt) {
return this.#file.createReadStream(opt);
}
}
export class BucketGoogle extends AbstractBucket {
#bucket;
constructor(bucketName) {
super();
const storage = new Storage();
this.#bucket = storage.bucket(bucketName);
}
async check() {
try {
await this.#bucket.getMetadata();
}
catch (err) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (err?.response?.data?.error === 'invalid_grant') {
console.error(`You are not authorized to access bucket "${this.#bucket.name}"`);
console.error('Maybe you want to set Application Default Credentials (ADC) by running: "gcloud auth application-default login"');
}
throw err;
}
}
getFile(relativePath) {
return new BucketFileGoogle(this.#bucket.file(relativePath));
}
}