Cloudizero Iconcloudizero
TypeScript SDK

Types & Error Handling

Safely catch SDK exceptions with CloudizeroError and leverage exported TypeScript types.

Handling `CloudizeroError`

All client network failures and API errors reject with an instance of CloudizeroError containing the HTTP status code:

examples/error-handling.ts
import { Cloudizero, CloudizeroError } from "@cloudizero/sdk";

const cz = new Cloudizero({
  apiKey: process.env.CLOUDIZERO_API_KEY!,
});

try {
  await cz.storage.upload({
    file: myFile,
    fileName: "document.pdf",
    projectId: "invalid-or-forbidden-id",
  });
} catch (error) {
  if (error instanceof CloudizeroError) {
    console.error("Cloudizero API Error:", error.message);
    console.error("HTTP Status Code:", error.status); // e.g. 403 or 401

    if (error.status === 401) {
      // Minta user input ulang atau refresh API key
    } else if (error.status === 403) {
      // Kunci tidak berwenang untuk proyek ini
    }
  } else {
    console.error("Unexpected Error:", error);
  }
}

Common Status Codes

StatusMeaningResolution
400 Bad RequestMissing required options or invalid file format.Verify fileName and projectId.
401 UnauthorizedMissing or invalid API key.Generate a new key at /api-keys.
403 ForbiddenAPI key restricted to another project ID.Ensure the key scope matches the target project.
404 Not FoundTarget file or folder not found.Verify file or folder ID.

TypeScript Interfaces

Every response and parameter is strongly typed out-of-the-box:

@cloudizero/sdk/types.ts
// Tipe Utama yang Diekspor dari @cloudizero/sdk

export interface CloudizeroConfig {
  apiKey: string;
  baseUrl?: string;
  cdnUrl?: string;
}

export type UploadPayload =
  | File
  | Blob
  | Uint8Array
  | ArrayBuffer
  | { [key: string]: unknown };

export interface UploadOptions {
  file: UploadPayload;
  fileName: string;
  projectId: string;
  folderId?: string | null;
  mimeType?: string;
  width?: number | null;
  height?: number | null;
  onProgress?: (progress: { loaded: number; total: number; percent: number }) => void;
}

export interface UpdateFileOptions {
  fileId: string;
  name?: string;
  folderId?: string | null;
  isTrash?: boolean;
  file?: UploadPayload;
  mimeType?: string;
  width?: number | null;
  height?: number | null;
  onProgress?: (progress: { loaded: number; total: number; percent: number }) => void;
}

export interface ReplaceFileOptions {
  fileId: string;
  file: UploadPayload;
  fileName?: string;
  folderId?: string | null;
  mimeType?: string;
  width?: number | null;
  height?: number | null;
  onProgress?: (progress: { loaded: number; total: number; percent: number }) => void;
}

export interface UploadedFile {
  id: string;
  projectId: string;
  folderId: string | null;
  name: string;
  mimeType: string;
  size: number;
  width: number | null;
  height: number | null;
  r2Key: string;
  etag: string | null;
  isTrash?: boolean;
  createdAt: string;
  updatedAt: string;
  url?: string;
}

export interface StorageFolder {
  id: string;
  projectId: string;
  parentId: string | null;
  name: string;
  path: string;
  createdAt: string;
  updatedAt: string;
}

export interface CreateFolderOptions {
  projectId: string;
  name: string;
  parentId?: string | null;
  path?: string;
}

export interface ListFoldersOptions {
  projectId: string;
  parentId?: string | null;
}

export interface UpdateFolderOptions {
  folderId: string;
  name?: string;
  parentId?: string | null;
}

export interface DeleteFolderResult {
  success: boolean;
  message: string;
  deletedFoldersCount: number;
  deletedFilesCount: number;
}

export interface StorageContents {
  project: { id: string; name: string };
  isRoot: boolean;
  breadcrumbs: { id: string; name: string }[];
  folders: StorageFolder[];
  files: UploadedFile[];
}