Add comprehensive developer tooling for Gitea integration: CLI Tool (cmd/gitea-cli/): - gitea-cli auth login/logout/status - Authentication management - gitea-cli upload release-asset - Chunked upload with progress - gitea-cli upload resume - Resume interrupted uploads - gitea-cli upload list - List pending upload sessions - Parallel chunk uploads with configurable workers - SHA256 checksum verification - Progress bar with speed and ETA display Go SDK (sdk/go/): - GiteaClient with token authentication - User, Repository, Release, Attachment types - ChunkedUpload with parallel workers - Progress callbacks for upload tracking - Functional options pattern (WithChunkSize, WithParallel, etc.) Python SDK (sdk/python/): - GiteaClient with requests-based HTTP - Full type hints and dataclasses - ThreadPoolExecutor for parallel uploads - Resume capability for interrupted uploads - Exception hierarchy (APIError, UploadError, etc.) TypeScript SDK (sdk/typescript/): - Full TypeScript types and interfaces - Async/await API design - Browser and Node.js compatible - Web Crypto API for checksums - ESM and CJS build outputs All SDKs support: - Chunked uploads for large files - Parallel upload workers - Progress tracking with callbacks - Checksum verification - Resume interrupted uploads 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Gitea TypeScript/JavaScript SDK
Official TypeScript/JavaScript SDK for the Gitea API with chunked upload support for large files.
Installation
npm install @gitea/sdk
# or
yarn add @gitea/sdk
# or
pnpm add @gitea/sdk
Quick Start
import { GiteaClient } from '@gitea/sdk';
// Create client
const client = new GiteaClient({
baseUrl: 'https://gitea.example.com',
token: 'your_token'
});
// Get current user
const user = await client.getCurrentUser();
console.log(`Logged in as ${user.login}`);
// Get a repository
const repo = await client.getRepository('owner', 'repo');
console.log(`Repository: ${repo.full_name}`);
Chunked Upload
Upload large files with progress tracking:
import { GiteaClient } from '@gitea/sdk';
const client = new GiteaClient({
baseUrl: 'https://gitea.example.com',
token: 'your_token'
});
// Upload a release asset with progress
const file = new File([...], 'large-file.tar.gz');
const result = await client.uploadReleaseAsset({
owner: 'myorg',
repo: 'myrepo',
releaseId: 123,
file,
chunkSize: 50 * 1024 * 1024, // 50MB chunks
parallel: 4,
verifyChecksum: true,
onProgress: (p) => {
console.log(`Progress: ${p.percent.toFixed(1)}%`);
console.log(`Speed: ${formatBytes(p.speed)}/s`);
console.log(`ETA: ${formatDuration(p.eta)}`);
}
});
console.log(`Uploaded: ${result.browser_download_url}`);
Using ChunkedUpload Directly
For more control over the upload process:
import { GiteaClient, ChunkedUpload } from '@gitea/sdk';
const client = new GiteaClient({
baseUrl: 'https://gitea.example.com',
token: 'your_token'
});
const upload = client.createChunkedUpload('owner', 'repo', 123, {
chunkSize: 50 * 1024 * 1024,
parallel: 4,
onProgress: (p) => console.log(`${p.percent.toFixed(1)}%`)
});
try {
const result = await upload.upload(file, 'filename.tar.gz');
console.log(`Success: ${result.browser_download_url}`);
} catch (error) {
// Upload failed, can retry later
const session = upload.getSession();
console.log(`Resume with session: ${session?.id}`);
}
API Reference
GiteaClient
Constructor
const client = new GiteaClient({
baseUrl: 'https://gitea.example.com',
token: 'your_api_token',
timeout: 30000, // Request timeout in milliseconds
});
User Methods
getCurrentUser()- Get authenticated usergetUser(username)- Get user by username
Repository Methods
getRepository(owner, repo)- Get repositorylistUserRepos(username)- List user's repositories
Release Methods
getRelease(owner, repo, releaseId)- Get release by IDgetReleaseByTag(owner, repo, tag)- Get release by taglistReleases(owner, repo)- List all releases
Upload Methods
uploadReleaseAsset(options)- Upload release asset with chunked uploadcreateChunkedUpload(owner, repo, releaseId, options)- Create upload handlergetUploadSession(sessionId)- Get upload session statuscancelUpload(sessionId)- Cancel upload session
Error Handling
import {
GiteaClient,
APIError,
AuthenticationError,
NotFoundError,
UploadError
} from '@gitea/sdk';
const client = new GiteaClient({
baseUrl: 'https://gitea.example.com',
token: 'your_token'
});
try {
const repo = await client.getRepository('owner', 'nonexistent');
} catch (error) {
if (error instanceof NotFoundError) {
console.log(`Repository not found: ${error.message}`);
} else if (error instanceof AuthenticationError) {
console.log(`Authentication failed: ${error.message}`);
} else if (error instanceof UploadError) {
console.log(`Upload failed: ${error.message}`);
console.log(`Session: ${error.sessionId}, Chunk: ${error.chunk}`);
} else if (error instanceof APIError) {
console.log(`API error [${error.code}]: ${error.message}`);
}
}
Browser Support
This SDK works in modern browsers that support:
fetchAPIcrypto.subtlefor SHA-256 checksumFileandBlobAPIs
For Node.js, you may need to polyfill fetch for versions < 18.
License
MIT License - See LICENSE file for details.