Cloud Storage Client Library for Node.js that provides comprehensive API for managing buckets, files, and metadata with authentication, streaming, and access control.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
The Storage class is the main entry point for Google Cloud Storage operations, providing bucket management, service account operations, and HMAC key administration.
class Storage {
constructor(options?: StorageOptions);
// Static references to other classes
static Bucket: typeof Bucket;
static Channel: typeof Channel;
static File: typeof File;
static HmacKey: typeof HmacKey;
// ACL constants
static acl: {
OWNER_ROLE: 'OWNER';
READER_ROLE: 'READER';
WRITER_ROLE: 'WRITER';
};
}
interface StorageOptions {
projectId?: string;
keyFilename?: string;
credentials?: object;
apiEndpoint?: string;
crc32cGenerator?: CRC32CValidatorGenerator;
retryOptions?: RetryOptions;
userAgent?: string;
authClient?: AuthClient;
}// Default configuration (uses Application Default Credentials)
const storage = new Storage();
// With explicit project ID
const storage = new Storage({
projectId: 'my-project-id'
});
// With service account key file
const storage = new Storage({
projectId: 'my-project-id',
keyFilename: '/path/to/service-account-key.json'
});
// With explicit credentials object
const storage = new Storage({
projectId: 'my-project-id',
credentials: {
client_email: 'service-account@project.iam.gserviceaccount.com',
private_key: '-----BEGIN PRIVATE KEY-----\n...'
}
});
// With custom endpoint (for testing/emulator)
const storage = new Storage({
apiEndpoint: 'http://localhost:8080',
projectId: 'test-project'
});
// With retry configuration
const storage = new Storage({
retryOptions: {
autoRetry: true,
maxRetries: 3,
retryDelayMultiplier: 2,
totalTimeout: 600000,
idempotencyStrategy: IdempotencyStrategy.RetryConditional
}
});bucket(name: string, options?: BucketOptions): Bucket
// Get bucket reference
const bucket = storage.bucket('my-bucket');
// With options
const bucket = storage.bucket('my-bucket', {
userProject: 'billing-project-id',
generation: 123456789
});createBucket(name: string, metadata?: CreateBucketRequest): Promise<CreateBucketResponse>
interface CreateBucketRequest {
cors?: Cors[];
defaultEventBasedHold?: boolean;
defaultObjectAcl?: AclMetadata[];
encryption?: {
defaultKmsKeyName?: string;
};
iamConfiguration?: {
bucketPolicyOnly?: {
enabled?: boolean;
};
publicAccessPrevention?: 'inherited' | 'enforced';
};
labels?: { [key: string]: string };
lifecycle?: {
rule?: LifecycleRule[];
};
location?: string;
logging?: {
logBucket?: string;
logObjectPrefix?: string;
};
retentionPolicy?: {
retentionPeriod?: number;
};
storageClass?: string;
versioning?: {
enabled?: boolean;
};
website?: {
mainPageSuffix?: string;
notFoundPage?: string;
};
requesterPays?: boolean;
uniformBucketLevelAccess?: {
enabled?: boolean;
};
}
type CreateBucketResponse = [Bucket, unknown]; // [bucket, apiResponse]
// Create basic bucket
const [bucket] = await storage.createBucket('new-bucket');
// Create with location and storage class
const [bucket] = await storage.createBucket('new-bucket', {
location: 'us-central1',
storageClass: 'STANDARD'
});
// Create with lifecycle rules
const [bucket] = await storage.createBucket('new-bucket', {
lifecycle: {
rule: [
{
action: { type: 'Delete' },
condition: { age: 365 }
},
{
action: {
type: 'SetStorageClass',
storageClass: 'COLDLINE'
},
condition: { age: 30 }
}
]
}
});
// Create with encryption
const [bucket] = await storage.createBucket('encrypted-bucket', {
encryption: {
defaultKmsKeyName: 'projects/PROJECT_ID/locations/LOCATION/keyRings/RING_ID/cryptoKeys/KEY_ID'
}
});getBuckets(options?: GetBucketsRequest): Promise<GetBucketsResponse>
getBucketsStream(): Readable
interface GetBucketsRequest {
maxResults?: number;
pageToken?: string;
prefix?: string;
project?: string;
userProject?: string;
}
type GetBucketsResponse = [Bucket[], {}, unknown]; // [buckets, nextQuery, apiResponse]
// List all buckets
const [buckets] = await storage.getBuckets();
buckets.forEach(bucket => {
console.log(`Bucket: ${bucket.name}`);
});
// List with prefix filter
const [buckets] = await storage.getBuckets({
prefix: 'prod-'
});
// List with pagination
const [buckets, nextQuery] = await storage.getBuckets({
maxResults: 10
});
if (nextQuery) {
const [moreBuckets] = await storage.getBuckets(nextQuery);
}
// Stream buckets for large lists
storage.getBucketsStream()
.on('data', bucket => {
console.log(`Bucket: ${bucket.name}`);
})
.on('end', () => {
console.log('Finished listing buckets');
});getServiceAccount(options?: GetServiceAccountOptions): Promise<GetServiceAccountResponse>
interface GetServiceAccountOptions {
userProject?: string;
}
interface ServiceAccount {
emailAddress?: string;
}
type GetServiceAccountResponse = [ServiceAccount, unknown]; // [serviceAccount, apiResponse]
// Get service account information
const [serviceAccount] = await storage.getServiceAccount();
console.log('Service Account Email:', serviceAccount.emailAddress);
// With user project for billing
const [serviceAccount] = await storage.getServiceAccount({
userProject: 'billing-project-id'
});createHmacKey(serviceAccountEmail: string, options?: CreateHmacKeyOptions): Promise<CreateHmacKeyResponse>
interface CreateHmacKeyOptions {
projectId?: string;
userProject?: string;
}
interface HmacKeyResourceResponse {
metadata?: HmacKeyMetadata;
secret?: string;
}
type CreateHmacKeyResponse = [HmacKey, string, unknown]; // [hmacKey, secret, apiResponse]
// Create HMAC key for service account
const serviceAccountEmail = 'service-account@project.iam.gserviceaccount.com';
const [hmacKey, secret] = await storage.createHmacKey(serviceAccountEmail);
console.log('Access ID:', hmacKey.accessId);
console.log('Secret (store securely):', secret);
// With explicit project
const [hmacKey, secret] = await storage.createHmacKey(serviceAccountEmail, {
projectId: 'my-project-id'
});getHmacKeys(options?: GetHmacKeysOptions): Promise<GetHmacKeysResponse>
getHmacKeysStream(): Readable
interface GetHmacKeysOptions {
serviceAccountEmail?: string;
showDeletedKeys?: boolean;
maxResults?: number;
pageToken?: string;
projectId?: string;
userProject?: string;
}
type GetHmacKeysResponse = [HmacKey[], {}, unknown]; // [hmacKeys, nextQuery, apiResponse]
// List all HMAC keys
const [hmacKeys] = await storage.getHmacKeys();
hmacKeys.forEach(key => {
console.log(`HMAC Key: ${key.accessId}`);
});
// List keys for specific service account
const [hmacKeys] = await storage.getHmacKeys({
serviceAccountEmail: 'service-account@project.iam.gserviceaccount.com'
});
// Include deleted keys
const [hmacKeys] = await storage.getHmacKeys({
showDeletedKeys: true
});
// Stream HMAC keys
storage.getHmacKeysStream()
.on('data', hmacKey => {
console.log(`HMAC Key: ${hmacKey.accessId}`);
})
.on('end', () => {
console.log('Finished listing HMAC keys');
});hmacKey(accessId: string, options?: HmacKeyOptions): HmacKey
interface HmacKeyOptions {
projectId?: string;
userProject?: string;
}
// Get HMAC key reference
const hmacKey = storage.hmacKey('GOOG1EXAMPLE');
// With project specification
const hmacKey = storage.hmacKey('GOOG1EXAMPLE', {
projectId: 'my-project-id'
});channel(id: string, resourceId: string): Channel
// Create channel reference for notifications
const channel = storage.channel('channel-id', 'resource-id');
// Use with bucket watch operations
const bucket = storage.bucket('my-bucket');
const [channel] = await bucket.createChannel('my-channel', {
address: 'https://example.com/webhook'
});All async methods support both Promise and callback patterns:
// Promise pattern (recommended)
const [buckets] = await storage.getBuckets();
// Callback pattern
storage.getBuckets((err, buckets, nextQuery, apiResponse) => {
if (err) {
console.error('Error:', err);
return;
}
console.log('Buckets:', buckets);
});
// Callback types
interface BucketCallback {
(err: Error | null, bucket?: Bucket, apiResponse?: unknown): void;
}
interface GetBucketsCallback {
(err: Error | null, buckets?: Bucket[], nextQuery?: {}, apiResponse?: unknown): void;
}
interface CreateHmacKeyCallback {
(err: Error | null, hmacKey?: HmacKey, secret?: string, apiResponse?: unknown): void;
}
interface GetServiceAccountCallback {
(err: Error | null, serviceAccount?: ServiceAccount, apiResponse?: unknown): void;
}import { ApiError } from '@google-cloud/storage';
try {
const [bucket] = await storage.createBucket('existing-bucket');
} catch (error) {
if (error instanceof ApiError) {
if (error.code === 409) {
console.log('Bucket already exists');
} else {
console.error(`API Error ${error.code}: ${error.message}`);
}
}
}
// Configure custom retry function
const storage = new Storage({
retryOptions: {
retryableErrorFn: (err) => {
return err.code >= 500 || err.code === 429;
}
}
});// Custom CRC32C generator
import { CRC32C } from '@google-cloud/storage';
const storage = new Storage({
crc32cGenerator: () => new CRC32C()
});
// Custom user agent
const storage = new Storage({
userAgent: 'my-app/1.0.0'
});
// Using with custom auth client
import { GoogleAuth } from 'google-auth-library';
const auth = new GoogleAuth({
scopes: ['https://www.googleapis.com/auth/cloud-platform']
});
const storage = new Storage({
authClient: await auth.getClient()
});