// =============================================
// Cloudflare Worker - خروجی مستقیم تصویر
// =============================================
export default {
async fetch(request, env) {
if (request.method === 'OPTIONS') {
return new Response(null, {
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, OPTIONS',
}
});
}
try {
const url = new URL(request.url);
const image = url.searchParams.get('image');
// تست
if (url.searchParams.has('test')) {
return new Response('✅ Worker فعال است!', {
headers: {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*'
}
});
}
if (!image) {
return new Response('❌ از ?image=توضیحات استفاده کنید', {
headers: {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*'
},
status: 400
});
}
if (!env.CF_API_TOKEN || !env.CF_ACCOUNT_ID) {
return new Response('❌ متغیرهای محیطی تنظیم نشدهاند', {
headers: {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*'
},
status: 500
});
}
// ===== تولید تصویر =====
const apiUrl = `https://api.cloudflare.com/client/v4/accounts/${env.CF_ACCOUNT_ID}/ai/run/@cf/stabilityai/stable-diffusion-xl-base-1.0`;
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Authorization': `Bearer ${env.CF_API_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
prompt: image,
width: 512,
height: 512,
num_steps: 20,
guidance: 7.5,
}),
});
if (!response.ok) {
return new Response(`❌ خطا: ${response.status}`, {
headers: {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*'
},
status: response.status
});
}
// ===== خروجی مستقیم تصویر =====
const arrayBuffer = await response.arrayBuffer();
return new Response(arrayBuffer, {
headers: {
'Content-Type': 'image/png',
'Access-Control-Allow-Origin': '*',
'Cache-Control': 'public, max-age=86400',
'Content-Disposition': `inline; filename="kadad-${Date.now()}.png"`
}
});
} catch (error) {
return new Response(`❌ خطا: ${error.message}`, {
headers: {
'Content-Type': 'text/plain',
'Access-Control-Allow-Origin': '*'
},
status: 500
});
}
}
};