@flystorage/google-cloud-storage
Version:
<img src="https://raw.githubusercontent.com/duna-oss/flystorage/main/flystorage.svg" width="50px" height="50px" />
75 lines (74 loc) • 2.59 kB
JavaScript
import { Visibility } from '@flystorage/file-storage';
import { ApiError } from '@google-cloud/storage';
export class UniformBucketLevelAccessVisibilityHandling {
errorOnChange;
errorOnDetermine;
fakeVisibility;
constructor(errorOnChange = false, errorOnDetermine = false, fakeVisibility = 'unknown') {
this.errorOnChange = errorOnChange;
this.errorOnDetermine = errorOnDetermine;
this.fakeVisibility = fakeVisibility;
}
async changeVisibility(file, visibility) {
if (this.errorOnChange) {
throw new Error('Unable to set visibility when using uniform bucket level access control.');
}
// ignored, no-op
}
async determineVisibility(file) {
if (this.errorOnDetermine) {
throw new Error('Unable to determine visibility when using uniform bucket level access control.');
}
return 'unknown';
}
visibilityToPredefinedAcl(visibility) {
if (this.errorOnChange) {
throw new Error('Unable to set visibility when using uniform bucket level access control.');
}
return undefined;
}
}
export class LegacyVisibilityHandling {
entity;
publicAcl;
privateAcl;
constructor(entity = 'allUsers', publicAcl = 'publicRead', privateAcl = 'projectPrivate') {
this.entity = entity;
this.publicAcl = publicAcl;
this.privateAcl = privateAcl;
}
async changeVisibility(file, visibility) {
if (visibility === Visibility.PRIVATE) {
await file.acl.delete({
entity: this.entity,
});
}
else if (visibility === Visibility.PUBLIC) {
await file.acl.update({
entity: this.entity,
role: 'READER',
});
}
}
async determineVisibility(file) {
try {
const [, metadata] = await file.acl.get({ entity: 'allUsers' });
return metadata.role === 'READER' ? Visibility.PUBLIC : Visibility.PRIVATE;
}
catch (error) {
if (!(error instanceof ApiError) || error.response?.statusCode !== 404) {
throw error;
}
return Visibility.PRIVATE;
}
}
visibilityToPredefinedAcl(visibility) {
if (visibility === Visibility.PUBLIC) {
return this.publicAcl;
}
else if (visibility === Visibility.PRIVATE) {
return this.privateAcl;
}
throw new Error(`Not able to set visibility ${visibility}, no mapping known.`);
}
}