cloudku-uploader
Version:
Blazing-fast, zero-dependency uploader for CloudKu. Supports auto-conversion, chunked uploads, and TypeScript. Easily upload images, videos, audio, and documents via Node.js.
91 lines (74 loc) • 2.64 kB
JavaScript
const cloudku = (() => {
const BASE = [
'https://cloudkuimages.guru',
'https://cloudkuimages-guru.us.itpanel.app'
]
const HEADERS = {
'User-Agent': 'cloudku-uploader/5.0',
'Accept': 'application/json'
}
const pickBase = () =>
BASE[Math.floor(Math.random() * BASE.length)]
const uploadSingle = async (buffer, name) => {
const fd = new FormData()
fd.append('file', new Blob([buffer]), name)
const res = await fetch(pickBase() + '/upload.php', {
method: 'POST',
headers: HEADERS,
body: fd
})
return res.json()
}
const uploadChunked = async (buffer, name, chunkSize = 8 * 1024 * 1024) => {
const totalChunks = Math.ceil(buffer.length / chunkSize)
const fileId = crypto.randomUUID()
for (let i = 0; i < totalChunks; i++) {
const start = i * chunkSize
const end = Math.min(start + chunkSize, buffer.length)
const chunk = buffer.slice(start, end)
const fd = new FormData()
fd.append('file', new Blob([chunk]), name)
fd.append('chunk', i)
fd.append('chunks', totalChunks)
fd.append('filename', name)
fd.append('fileId', fileId)
fd.append('size', buffer.length)
const res = await fetch(pickBase() + '/upload.php', {
method: 'POST',
headers: HEADERS,
body: fd
})
const json = await res.json()
if (json.status === 'error') throw json
}
const finalize = await fetch(
pickBase() + '/upload.php?chunked=1&finalize=1',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fileId,
filename: name,
chunks: totalChunks
})
}
)
return finalize.json()
}
const uploadFile = async (buffer, name = 'file.bin') => {
if (buffer.length > 100 * 1024 * 1024) {
return uploadChunked(buffer, name)
}
return uploadSingle(buffer, name)
}
const uploadBatch = async (files) =>
Promise.allSettled(
files.map(f => uploadFile(f.buffer, f.name))
)
return {
uploadFile,
uploadLarge: uploadChunked,
uploadBatch
}
})()
module.exports = cloudku