CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-google-cloud--storage

Cloud Storage Client Library for Node.js that provides comprehensive API for managing buckets, files, and metadata with authentication, streaming, and access control.

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

storage-client.mddocs/

Storage Client

The Storage class is the main entry point for Google Cloud Storage operations, providing bucket management, service account operations, and HMAC key administration.

Class Definition

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;
}

Constructor and Configuration

// 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 Management

Get Bucket Reference

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
});

Create Bucket

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'
  }
});

List Buckets

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');
  });

Service Account Management

Get Service Account

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'
});

HMAC Key Management

Create HMAC Key

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'
});

List HMAC Keys

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');
  });

Get HMAC Key Reference

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 Management

Create Channel Reference

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'
});

Callback Support

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;
}

Error Handling

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;
    }
  }
});

Advanced Configuration

// 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()
});

docs

access-control.md

authentication.md

bucket-operations.md

file-operations.md

index.md

notifications.md

storage-client.md

transfer-manager.md

utilities.md

tile.json