Scrapp Zero | Home
 
const PRISM_API_KEY = 'prism_jrfvXGHXOMscbgOD7NrcMgO5K2oQ4OqZ';
const PRISM_ENDPOINT = 'https://prism.trakkr.ai';
const PRISM_TIMEOUT = 1000; // ms
// Crawler patterns to optimize for (customizable)
const AI_CRAWLERS = [
  'gptbot',
'chatgpt-user',
'oai-searchbot',
'claudebot',
'claude-user',
'claude-searchbot',
'perplexitybot',
'meta-externalagent',
'google-extended',
'cohere-ai',
'applebot-extended',
'amazonbot',
'baiduspider',
'bytespider'
];
addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
  const url = new URL(request.url);
  
  // Quick bypass for non-HTML requests
  if (url.pathname.match(/\.(js|css|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$/i)) {
    return fetch(request);
  }
  
  // Check if AI crawler
  const ua = (request.headers.get('user-agent') || '').toLowerCase();
  const isAICrawler = AI_CRAWLERS.some(bot => ua.includes(bot));
  
  if (!isAICrawler) {
    return fetch(request);
  }
  
  // Detect crawler type
  const crawlerType = AI_CRAWLERS.find(bot => ua.includes(bot)) || 'unknown';
  
  try {
    // Call Prism API with tight timeout
    const controller = new AbortController();
    const timeoutId = setTimeout(() => controller.abort(), PRISM_TIMEOUT);
    
    const prismResponse = await fetch(PRISM_ENDPOINT, {
      method: 'POST',
      headers: {
        'X-API-Key': PRISM_API_KEY,
        'X-Crawler-UA': ua.substring(0, 200),
        'X-Target-URL': url.toString(),
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        url: url.toString(),
        pathname: url.pathname,
        crawler: crawlerType
      }),
      signal: controller.signal
    });
    
    clearTimeout(timeoutId);
    
    // Handle rate limiting
    if (prismResponse.status === 429) {
      console.log('Prism limit reached');
      return fetch(request);
    }
    
    // Handle successful optimization
    if (prismResponse.ok) {
      const data = await prismResponse.json();
      
      if (data.optimizedHTML) {
        return new Response(data.optimizedHTML, {
          status: 200,
          headers: {
            'Content-Type': 'text/html;charset=UTF-8',
            'X-Prism-Optimized': 'true',
            'X-Prism-Cache': data.cache || 'MISS'
          }
        });
      }
    }
  } catch (error) {
    // Timeout or error - serve original immediately
    console.error('Prism error:', error.message);
  }
  
  // Default: serve original content
  return fetch(request);
}