@itwin/object-storage-google
Version:
Object storage implementation using Google Cloud Storage
137 lines • 5.3 kB
JavaScript
;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.StorageControlClientWrapper = void 0;
exports.isGoogleError = isGoogleError;
const storage_control_1 = require("@google-cloud/storage-control");
const google_auth_library_1 = require("google-auth-library");
const common_1 = require("../../common");
const Helpers_1 = require("./Helpers");
function isGoogleError(error) {
return error instanceof Error && error.code !== undefined;
}
class StorageControlClientWrapper {
_config;
_client;
constructor(_config) {
this._config = _config;
this._client = new storage_control_1.StorageControlClient({
projectId: this._config.projectId,
});
}
async createManagedFolder(folderName) {
const parent = this.bucketPath;
await this._client.createManagedFolder({
parent,
managedFolderId: folderName,
});
}
async deleteManagedFolder(folderName) {
const managedFolder = this.managedFolderPath(folderName);
try {
await this._client.deleteManagedFolder({
name: managedFolder,
});
}
catch (error) {
if (isGoogleError(error) && error.code != 5) {
throw error;
}
}
}
async getManagedFoldersNextPage(options) {
const parent = this.bucketPath;
const [folders, _, response] = await this._client.listManagedFolders({
parent,
pageSize: options.maxPageSize,
pageToken: options.continuationToken,
}, { autoPaginate: false });
const directories = folders.map((entry) => {
return {
baseDirectory: entry.name?.split("/").slice(5, -1).join("/"),
};
}) ?? [];
const continuationToken = response?.nextPageToken;
const page = {
entities: directories,
next: !continuationToken
? undefined
: () => this.getManagedFoldersNextPage({
maxPageSize: options.maxPageSize,
continuationToken: continuationToken,
}),
};
return page;
}
async getManagedFolders() {
const parent = this._client.bucketPath("_", this._config.bucketName);
const [folders, _1, _2] = await this._client.listManagedFolders({
parent,
});
const directories = folders.map((entry) => ({ baseDirectory: entry.name })) ?? [];
return directories;
}
async managedFolderExists(folderName) {
const managedFolder = this.managedFolderPath(folderName);
try {
await this._client.getManagedFolder({
name: managedFolder,
});
return true;
}
catch (error) {
if (isGoogleError(error) && error.code == 5) {
return false;
}
throw error;
}
}
async createAccessToken(action, folderName) {
const cab = {
accessBoundary: {
accessBoundaryRules: [
{
availableResource: this.bucketUri,
availablePermissions: [(0, Helpers_1.roleFromConfigType)(action)],
availabilityCondition: {
expression: `resource.name.startsWith('${this.bucketPath}/objects/${folderName}') || ` +
`api.getAttribute('storage.googleapis.com/objectListPrefix', '')` +
`.startsWith('${folderName}/')`,
},
},
],
},
};
const googleAuth = new google_auth_library_1.GoogleAuth({
scopes: "https://www.googleapis.com/auth/cloud-platform",
projectId: this._config.projectId,
});
const client = await googleAuth.getClient();
const downscopedClient = new google_auth_library_1.DownscopedClient(client, cab);
const { token, expirationTime } = await downscopedClient.getAccessToken();
return {
baseUrl: this.bucketUri,
authentication: `Bearer ${token}`,
expiration: new Date(expirationTime),
bucketName: this._config.bucketName,
storageType: common_1.Constants.storageType,
};
}
managedFolderPath(folderName) {
return this._client.managedFolderPath("_", this._config.bucketName, folderName);
}
get bucketPath() {
return this._client.bucketPath("_", this._config.bucketName);
}
get bucketUri() {
return `//storage.googleapis.com/${this.bucketPath}`;
}
async releaseResources() {
await this._client.close();
}
}
exports.StorageControlClientWrapper = StorageControlClientWrapper;
//# sourceMappingURL=StorageControlClientWrapper.js.map