import { connect } from "cloudflare:sockets"; // ============================================================ // VARIABLES // ============================================================ const rootDomain = "lifetime07.workers.dev"; const serviceName = "v2"; const apiKey = "zK8XiUjjjjAFF3-ApeShhhhhjjjKTt_e5K0t-"; const apiEmail = "lifetime07@emsil.com"; const accountID = "eda3440eeeeeeeeeeeeeeb18b357234c"; const zoneID = "a1cacc717ııııııııııııııı3e7829a2"; let isApiReady = true; let proxyIP = "https://raw.githubusercontent.com/papapapapdelesia/Emilia/refs/heads/main/Data/Country-ALIVE.txt"; let cachedProxyList = []; // ============================================================ // CONSTANTS // ============================================================ const APP_DOMAIN = `${serviceName}.${rootDomain}`; const PORTS = [443, 80]; const PROTOCOLS = [reverse("najort"), reverse("sselv"), reverse("ss")]; const KV_PROXY_URL = "https://r2.code-hub.workers.dev/raw/t93bckle47mu6f16qd"; const PROXY_BANK_URL = "https://raw.githubusercontent.com/papapapapdelesia/Emilia/refs/heads/main/Data/Country-ALIVE.txt"; const DNS_SERVER_ADDRESS = "8.8.8.8"; const DNS_SERVER_PORT = 53; const PROXY_HEALTH_CHECK_API = "https://proxycheck-eta.vercel.app/api/v1"; const CONVERTER_URL = "https://api.foolvpn.me/convert"; const DONATE_LINK = "https://kuncung.eu.org"; const BAD_WORDS_LIST = "https://gist.githubusercontent.com/adierebel/a69396d79b787b84d89b45002cb37cd6/raw/6df5f8728b18699496ad588b3953931078ab9cf1/kata-kasar.txt"; const PROXY_PER_PAGE = 20; const WS_READY_STATE_OPEN = 1; const WS_READY_STATE_CLOSING = 2; const CORS_HEADER_OPTIONS = { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET,HEAD,POST,OPTIONS", "Access-Control-Max-Age": "86400", }; // ============================================================ // PROXY LIST — HARDENED // ============================================================ async function getKVProxyList(kvProxyUrl = KV_PROXY_URL) { if (!kvProxyUrl) throw new Error("No KV Proxy URL Provided!"); try { const kvProxy = await fetch(kvProxyUrl, { cf: { cacheTtl: 300, cacheEverything: true } }); if (kvProxy.status === 200) return await kvProxy.json(); } catch (e) { console.error("getKVProxyList failed:", e.message); } return {}; } async function getProxyList(proxyBankUrl = PROXY_BANK_URL) { const url = proxyBankUrl || PROXY_BANK_URL; if (!url) throw new Error("No Proxy Bank URL Provided!"); try { const proxyBank = await fetch(url, { cf: { cacheTtl: 120, cacheEverything: true } }); if (proxyBank.status === 200) { const text = (await proxyBank.text()) || ""; const proxyString = text.split("\n").filter(Boolean); cachedProxyList = proxyString .map((entry) => { const [proxyIPx, proxyPort, country, org] = entry.split(","); return { proxyIP: (proxyIPx || "").trim(), proxyPort: (proxyPort || "").trim(), country: (country || "XX").trim(), org: (org || "Unknown Org").trim(), }; }) .filter((p) => p.proxyIP && p.proxyPort && /^\d+$/.test(p.proxyPort)); } } catch (e) { console.error("getProxyList failed:", e.message); } return cachedProxyList; } // ============================================================ // REVERSE PROXY // ============================================================ async function reverseProxy(request, target, targetPath) { const targetUrl = new URL(request.url); const targetChunk = target.split(":"); targetUrl.hostname = targetChunk[0]; targetUrl.port = targetChunk[1]?.toString() || "443"; targetUrl.pathname = targetPath || targetUrl.pathname; const modifiedRequest = new Request(targetUrl, request); modifiedRequest.headers.set("X-Forwarded-Host", request.headers.get("Host")); const response = await fetch(modifiedRequest); const newResponse = new Response(response.body, response); for (const [key, value] of Object.entries(CORS_HEADER_OPTIONS)) { newResponse.headers.set(key, value); } newResponse.headers.set("X-Proxied-By", "Cloudflare Worker"); return newResponse; } // ============================================================ // CONFIG BUILDER // ============================================================ function getAllConfig(request, hostName, proxyList, page = 0) { const startIndex = PROXY_PER_PAGE * page; try { const uuid = crypto.randomUUID(); const uri = new URL(`${reverse("najort")}://${hostName}`); uri.searchParams.set("encryption", "none"); uri.searchParams.set("type", "ws"); uri.searchParams.set("host", hostName); const document = new Document(request); document.setTitle("Welcome to Kuncung Proxy "); document.addInfo(`Total: ${proxyList.length}`); document.addInfo(`Page: ${page}/${Math.floor(proxyList.length / PROXY_PER_PAGE)}`); for (let i = startIndex; i < startIndex + PROXY_PER_PAGE; i++) { const proxy = proxyList[i]; if (!proxy) break; const { proxyIP: pIP, proxyPort, country, org } = proxy; uri.searchParams.set("path", `/${pIP}-${proxyPort}`); const proxies = []; for (const port of PORTS) { uri.port = port.toString(); uri.hash = `${i + 1} ${getFlagEmoji(country)} ${org} WS ${port == 443 ? "TLS" : "NTLS"} [${serviceName}]`; for (const protocol of PROTOCOLS) { if (protocol === "ss") { uri.username = btoa(`none:${uuid}`); uri.searchParams.set( "plugin", `v2ray-plugin${port == 80 ? "" : ";tls"};mux=0;mode=websocket;path=/${pIP}-${proxyPort};host=${hostName}` ); } else { uri.username = uuid; uri.searchParams.delete("plugin"); } uri.protocol = protocol; uri.searchParams.set("security", port == 443 ? "tls" : "none"); uri.searchParams.set("sni", port == 80 && protocol == reverse("sselv") ? "" : hostName); proxies.push(uri.toString()); } } document.registerProxies({ proxyIP: pIP, proxyPort, country, org }, proxies); } document.addPageButton("Prev", `/sub/${page > 0 ? page - 1 : 0}`, page > 0 ? false : true); document.addPageButton("Next", `/sub/${page + 1}`, page < Math.floor(proxyList.length / 10) ? false : true); return document.build(); } catch (error) { return `An error occurred while generating the ${reverse("SSELV")} configurations. ${error}`; } } // ============================================================ // MAIN FETCH HANDLER // ============================================================ export default { async fetch(request, env, ctx) { try { env = env || {}; if (!env.PROXY_BANK_URL) env.PROXY_BANK_URL = PROXY_BANK_URL; const url = new URL(request.url); const upgradeHeader = request.headers.get("Upgrade"); if (apiKey && apiEmail && accountID && zoneID) isApiReady = true; // ---- PROXY CLIENT ROUTING ---- if (upgradeHeader === "websocket") { const path = url.pathname; // === /PROXYLIST/SG,US,... === const proxyListMatch = path.match(/^\/PROXYLIST\/([A-Z]{2}(,[A-Z]{2})*)$/i); if (proxyListMatch) { const countryCodes = proxyListMatch[1].toUpperCase().split(","); const proxies = await getProxyList(env.PROXY_BANK_URL); const grouped = proxies.reduce((acc, proxy) => { if (countryCodes.includes(proxy.country)) { if (!acc[proxy.country]) acc[proxy.country] = []; acc[proxy.country].push(proxy); } return acc; }, {}); const selectedProxies = countryCodes .map((code) => { const list = grouped[code]; if (list && list.length > 0) return list[Math.floor(Math.random() * list.length)]; return null; }) .filter(Boolean); if (selectedProxies.length === 0) { return new Response(`No proxies available for requested countries: ${countryCodes.join(",")}`, { status: 404 }); } const randomProxy = selectedProxies[Math.floor(Math.random() * selectedProxies.length)]; proxyIP = `${randomProxy.proxyIP}:${randomProxy.proxyPort}`; console.log(`Selected Proxy (/PROXYLIST): ${proxyIP}`); return await websocketHandler(request); } // === /ALL atau /ALLn === const allMatch = path.match(/^\/ALL(\d+)?$/i); if (allMatch) { const index = allMatch[1] ? parseInt(allMatch[1], 10) - 1 : null; const proxies = await getProxyList(env.PROXY_BANK_URL); let selectedProxies; if (index === null) { selectedProxies = proxies; } else { const grouped = proxies.reduce((acc, proxy) => { if (!acc[proxy.country]) acc[proxy.country] = []; acc[proxy.country].push(proxy); return acc; }, {}); selectedProxies = []; for (const country in grouped) { const list = grouped[country]; if (index < list.length) selectedProxies.push(list[index]); } } if (selectedProxies.length === 0) { return new Response(`No proxies available for /ALL${index !== null ? index + 1 : ""}`, { status: 404 }); } const randomProxy = selectedProxies[Math.floor(Math.random() * selectedProxies.length)]; proxyIP = `${randomProxy.proxyIP}:${randomProxy.proxyPort}`; console.log(`Selected Proxy (/ALL): ${proxyIP}`); return await websocketHandler(request); } // === /PUTAR atau /PUTARn === const putarMatch = path.match(/^\/PUTAR(\d+)?$/i); if (putarMatch) { const count = putarMatch[1] ? parseInt(putarMatch[1], 10) : 1; const proxies = await getProxyList(env.PROXY_BANK_URL); const grouped = proxies.reduce((acc, proxy) => { if (!acc[proxy.country]) acc[proxy.country] = []; acc[proxy.country].push(proxy); return acc; }, {}); const countries = Object.keys(grouped); if (countries.length === 0) { return new Response(`No proxies available for /PUTAR${count > 1 ? count : ""}`, { status: 404 }); } const shuffledCountries = countries.sort(() => Math.random() - 0.5); const selectedCountries = shuffledCountries.slice(0, count); const selectedProxies = selectedCountries.map((country) => { const list = grouped[country]; return list[Math.floor(Math.random() * list.length)]; }); const randomProxy = selectedProxies[Math.floor(Math.random() * selectedProxies.length)]; proxyIP = `${randomProxy.proxyIP}:${randomProxy.proxyPort}`; console.log(`Selected Proxy (/PUTAR${count}): ${proxyIP}`); return await websocketHandler(request); } // === /REGION atau /REGIONn === const regionMap = { ASIA: ["ID", "SG", "MY", "PH", "TH", "VN", "JP", "KR", "CN", "HK", "TW"], SOUTHASIA: ["IN", "BD", "PK", "LK", "NP", "AF", "BT", "MV"], CENTRALASIA: ["KZ", "UZ", "TM", "KG", "TJ"], NORTHASIA: ["RU"], MIDDLEEAST: ["AE", "SA", "IR", "IQ", "JO", "IL", "YE", "SY", "OM", "KW", "QA", "BH", "LB"], CIS: ["RU", "UA", "BY", "KZ", "UZ", "AM", "GE", "MD", "TJ", "KG", "TM", "AZ"], WESTEUROPE: ["FR", "DE", "NL", "BE", "AT", "CH", "IE", "LU", "MC"], EASTEUROPE: ["PL", "CZ", "SK", "HU", "RO", "BG", "MD", "UA", "BY"], NORTHEUROPE: ["SE", "FI", "NO", "DK", "EE", "LV", "LT", "IS"], SOUTHEUROPE: ["IT", "ES", "PT", "GR", "HR", "SI", "MT", "AL", "BA", "RS", "ME", "MK"], EUROPE: ["FR", "DE", "NL", "BE", "AT", "CH", "IE", "LU", "MC", "PL", "CZ", "SK", "HU", "RO", "BG", "MD", "UA", "BY", "SE", "FI", "NO", "DK", "EE", "LV", "LT", "IS", "IT", "ES", "PT", "GR", "HR", "SI", "MT", "AL", "BA", "RS", "ME", "MK"], AFRICA: ["ZA", "NG", "EG", "MA", "KE", "DZ", "TN", "GH", "CI", "SN", "ET"], NORTHAMERICA: ["US", "CA", "MX"], SOUTHAMERICA: ["BR", "AR", "CL", "CO", "PE", "VE", "EC", "UY", "PY", "BO"], LATAM: ["MX", "BR", "AR", "CL", "CO", "PE", "VE", "EC", "UY", "PY", "BO", "CR", "GT", "PA", "DO", "HN", "NI", "SV"], AMERICA: ["US", "CA", "MX", "BR", "AR", "CL", "CO", "PE", "VE", "EC"], OCEANIA: ["AU", "NZ", "PG", "FJ"], GLOBAL: [], }; const regionMatch = path.match(/^\/([A-Z]+)(\d+)?$/i); if (regionMatch && regionMap[regionMatch[1].toUpperCase()]) { const regionKey = regionMatch[1].toUpperCase(); const index = regionMatch[2] ? parseInt(regionMatch[2], 10) - 1 : null; const countries = regionMap[regionKey]; const proxies = await getProxyList(env.PROXY_BANK_URL); const filteredProxies = regionKey === "GLOBAL" ? proxies : proxies.filter((p) => countries.includes(p.country)); if (filteredProxies.length === 0) { return new Response(`No proxies available for region: ${regionKey}`, { status: 404 }); } let selectedProxy; if (index === null) { selectedProxy = filteredProxies[Math.floor(Math.random() * filteredProxies.length)]; } else if (index < 0 || index >= filteredProxies.length) { return new Response(`Index ${index + 1} out of bounds.`, { status: 400 }); } else { selectedProxy = filteredProxies[index]; } proxyIP = `${selectedProxy.proxyIP}:${selectedProxy.proxyPort}`; console.log(`Selected Proxy (/${regionKey}${index !== null ? index + 1 : ""}): ${proxyIP}`); return await websocketHandler(request); } // === /CC atau /CCn === const pathMatch = path.match(/^\/([A-Z]{2})(\d+)?$/); if (pathMatch) { const countryCode = pathMatch[1]; const index = pathMatch[2] ? parseInt(pathMatch[2], 10) - 1 : null; const proxies = await getProxyList(env.PROXY_BANK_URL); const filteredProxies = proxies.filter((proxy) => proxy.country === countryCode); if (filteredProxies.length === 0) { return new Response(`No proxies available for country: ${countryCode}`, { status: 404 }); } let selectedProxy; if (index === null) { selectedProxy = filteredProxies[0]; } else if (index < 0 || index >= filteredProxies.length) { return new Response(`Index ${index + 1} out of bounds.`, { status: 400 }); } else { selectedProxy = filteredProxies[index]; } proxyIP = `${selectedProxy.proxyIP}:${selectedProxy.proxyPort}`; console.log(`Selected Proxy (/CC): ${proxyIP}`); return await websocketHandler(request); } // === /ip:port === const ipPortMatch = path.match(/^\/(.+[:=-]\d+)$/); if (ipPortMatch) { proxyIP = ipPortMatch[1].replace(/[=:-]/, ":"); console.log(`Direct Proxy IP: ${proxyIP}`); return await websocketHandler(request); } } // ---- HTTP ROUTES ---- if (url.pathname.startsWith("/sub")) { const page = url.pathname.match(/^\/sub\/(\d+)$/); const pageIndex = parseInt(page ? page[1] : "0"); const hostname = request.headers.get("Host"); const countrySelect = url.searchParams.get("cc")?.split(","); const proxyBankUrl = url.searchParams.get("proxy-list") || env.PROXY_BANK_URL; let proxyList = (await getProxyList(proxyBankUrl)).filter((proxy) => { if (countrySelect) return countrySelect.includes(proxy.country); return true; }); const result = getAllConfig(request, hostname, proxyList, pageIndex); return new Response(result, { status: 200, headers: { "Content-Type": "text/html;charset=utf-8" }, }); } else if (url.pathname.startsWith("/check")) { const target = (url.searchParams.get("target") || "").split(":"); const result = await checkProxyHealth(target[0], target[1] || "443"); return new Response(JSON.stringify(result), { status: 200, headers: { ...CORS_HEADER_OPTIONS, "Content-Type": "application/json" }, }); } else if (url.pathname.startsWith("/api/v1")) { const apiPath = url.pathname.replace("/api/v1", ""); if (apiPath.startsWith("/domains")) { if (!isApiReady) return new Response("Api not ready", { status: 500 }); const wildcardApiPath = apiPath.replace("/domains", ""); const cloudflareApi = new CloudflareApi(); if (wildcardApiPath == "/get") { const domains = await cloudflareApi.getDomainList(); return new Response(JSON.stringify(domains), { headers: { ...CORS_HEADER_OPTIONS } }); } else if (wildcardApiPath == "/put") { const domain = url.searchParams.get("domain"); const register = await cloudflareApi.registerDomain(domain); return new Response(register.toString(), { status: register, headers: { ...CORS_HEADER_OPTIONS } }); } } else if (apiPath.startsWith("/sub")) { const filterCC = url.searchParams.get("cc")?.split(",") || []; const filterPort = url.searchParams.get("port")?.split(",") || PORTS; const filterVPN = url.searchParams.get("vpn")?.split(",") || PROTOCOLS; const filterLimit = parseInt(url.searchParams.get("limit")) || 10; const filterFormat = url.searchParams.get("format") || "raw"; const fillerDomain = url.searchParams.get("domain") || APP_DOMAIN; const proxyBankUrl = url.searchParams.get("proxy-list") || env.PROXY_BANK_URL; const proxyList = await getProxyList(proxyBankUrl) .then((proxies) => { if (filterCC.length) return proxies.filter((proxy) => filterCC.includes(proxy.country)); return proxies; }) .then((proxies) => { shuffleArray(proxies); return proxies; }); const uuid = crypto.randomUUID(); const result = []; for (const proxy of proxyList) { const uri = new URL(`${reverse("najort")}://${fillerDomain}`); uri.searchParams.set("encryption", "none"); uri.searchParams.set("type", "ws"); uri.searchParams.set("host", APP_DOMAIN); for (const port of filterPort) { for (const protocol of filterVPN) { if (result.length >= filterLimit) break; uri.protocol = protocol; uri.port = port.toString(); if (protocol == "ss") { uri.username = btoa(`none:${uuid}`); uri.searchParams.set( "plugin", `v2ray-plugin${port == 80 ? "" : ";tls"};mux=0;mode=websocket;path=/${proxy.proxyIP}-${proxy.proxyPort};host=${APP_DOMAIN}` ); } else { uri.username = uuid; } uri.searchParams.set("security", port == 443 ? "tls" : "none"); uri.searchParams.set("sni", port == 80 && protocol == reverse("sselv") ? "" : APP_DOMAIN); uri.searchParams.set("path", `/${proxy.proxyIP}-${proxy.proxyPort}`); uri.hash = `${result.length + 1} ${getFlagEmoji(proxy.country)} ${proxy.org} WS ${port == 443 ? "TLS" : "NTLS"} [${serviceName}]`; result.push(uri.toString()); } } } let finalResult = ""; switch (filterFormat) { case "raw": finalResult = result.join("\n"); break; case "v2ray": finalResult = btoa(result.join("\n")); break; case "clash": case "sfa": case "bfr": { const res = await fetch(CONVERTER_URL, { method: "POST", body: JSON.stringify({ url: result.join(","), format: filterFormat, template: "cf" }), }); if (res.status == 200) { finalResult = await res.text(); } else { return new Response(res.statusText, { status: res.status, headers: { ...CORS_HEADER_OPTIONS } }); } break; } } return new Response(finalResult, { status: 200, headers: { ...CORS_HEADER_OPTIONS } }); } else if (apiPath.startsWith("/myip")) { return new Response( JSON.stringify({ ip: request.headers.get("cf-connecting-ipv6") || request.headers.get("cf-connecting-ip") || request.headers.get("x-real-ip"), colo: request.headers.get("cf-ray")?.split("-")[1], ...request.cf, }), { headers: { ...CORS_HEADER_OPTIONS } } ); } } const targetReverseProxy = env.REVERSE_PROXY_TARGET || "example.com"; return await reverseProxy(request, targetReverseProxy); } catch (err) { return new Response(`An error occurred: ${err.toString()}`, { status: 500, headers: { ...CORS_HEADER_OPTIONS }, }); } }, }; // ============================================================ // WEBSOCKET HANDLER — HARDENED // ============================================================ async function websocketHandler(request) { const webSocketPair = new WebSocketPair(); const [client, webSocket] = Object.values(webSocketPair); webSocket.accept(); let addressLog = ""; let portLog = ""; const log = (info, event) => console.log(`[${addressLog}:${portLog}] ${info}`, event || ""); const earlyDataHeader = request.headers.get("sec-websocket-protocol") || ""; const readableWebSocketStream = makeReadableWebSocketStream(webSocket, earlyDataHeader, log); let remoteSocketWrapper = { value: null }; let isDNS = false; readableWebSocketStream .pipeTo( new WritableStream({ async write(chunk, controller) { try { if (isDNS) { return handleUDPOutbound(DNS_SERVER_ADDRESS, DNS_SERVER_PORT, chunk, webSocket, null, log); } if (remoteSocketWrapper.value) { const writer = remoteSocketWrapper.value.writable.getWriter(); await writer.write(chunk); writer.releaseLock(); return; } const protocol = await protocolSniffer(chunk); let protocolHeader; if (protocol === reverse("najorT")) protocolHeader = parseNajortHeader(chunk); else if (protocol === reverse("SSELV")) protocolHeader = parseSselvHeader(chunk); else if (protocol === reverse("skcoswodahS")) protocolHeader = parseSsHeader(chunk); else throw new Error("Unknown Protocol!"); addressLog = protocolHeader.addressRemote; portLog = `${protocolHeader.portRemote} -> ${protocolHeader.isUDP ? "UDP" : "TCP"}`; if (protocolHeader.hasError) throw new Error(protocolHeader.message); if (protocolHeader.isUDP) { if (protocolHeader.portRemote === 53) isDNS = true; else throw new Error("UDP only support for DNS port 53"); } if (isDNS) { return handleUDPOutbound( DNS_SERVER_ADDRESS, DNS_SERVER_PORT, chunk, webSocket, protocolHeader.version, log ); } await handleTCPOutBound( remoteSocketWrapper, protocolHeader.addressRemote, protocolHeader.portRemote, protocolHeader.rawClientData, webSocket, protocolHeader.version, log ); } catch (err) { log("write() error", err.message); try { webSocket.close(1011, String(err.message || "internal error").slice(0, 123)); } catch {} } }, close() { log(`readableWebSocketStream is close`); }, abort(reason) { log(`readableWebSocketStream is abort`, JSON.stringify(reason)); }, }) ) .catch((err) => { log("readableWebSocketStream pipeTo error", err.message); safeCloseWebSocket(webSocket); }); return new Response(null, { status: 101, webSocket: client, }); } // ============================================================ // PROTOCOL SNIFFER + PARSERS // ============================================================ async function protocolSniffer(buffer) { if (buffer.byteLength >= 62) { const najortDelimiter = new Uint8Array(buffer.slice(56, 60)); if (najortDelimiter[0] === 0x0d && najortDelimiter[1] === 0x0a) { if (najortDelimiter[2] === 0x01 || najortDelimiter[2] === 0x03 || najortDelimiter[2] === 0x7f) { if (najortDelimiter[3] === 0x01 || najortDelimiter[3] === 0x03 || najortDelimiter[3] === 0x04) { return reverse("najorT"); } } } } const sselvDelimiter = new Uint8Array(buffer.slice(1, 17)); if (arrayBufferToHex(sselvDelimiter).match(/^[0-9a-f]{8}[0-9a-f]{4}4[0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}$/i)) { return reverse("SSELV"); } return reverse("skcoswodahS"); } function parseSsHeader(ssBuffer) { const view = new DataView(ssBuffer); const addressType = view.getUint8(0); let addressLength = 0; let addressValueIndex = 1; let addressValue = ""; switch (addressType) { case 1: addressLength = 4; addressValue = new Uint8Array(ssBuffer.slice(addressValueIndex, addressValueIndex + addressLength)).join("."); break; case 3: addressLength = new Uint8Array(ssBuffer.slice(addressValueIndex, addressValueIndex + 1))[0]; addressValueIndex += 1; addressValue = new TextDecoder().decode(ssBuffer.slice(addressValueIndex, addressValueIndex + addressLength)); break; case 4: addressLength = 16; const dataView = new DataView(ssBuffer.slice(addressValueIndex, addressValueIndex + addressLength)); const ipv6 = []; for (let i = 0; i < 8; i++) ipv6.push(dataView.getUint16(i * 2).toString(16)); addressValue = ipv6.join(":"); break; default: return { hasError: true, message: `Invalid addressType for ${reverse("skcoswodahS")}: ${addressType}` }; } if (!addressValue) return { hasError: true, message: `Destination address empty, address type is: ${addressType}` }; const portIndex = addressValueIndex + addressLength; const portBuffer = ssBuffer.slice(portIndex, portIndex + 2); const portRemote = new DataView(portBuffer).getUint16(0); return { hasError: false, addressRemote: addressValue, addressType: addressType, portRemote: portRemote, rawDataIndex: portIndex + 2, rawClientData: ssBuffer.slice(portIndex + 2), version: null, isUDP: portRemote == 53, }; } function parseSselvHeader(buffer) { const version = new Uint8Array(buffer.slice(0, 1)); let isUDP = false; const optLength = new Uint8Array(buffer.slice(17, 18))[0]; const cmd = new Uint8Array(buffer.slice(18 + optLength, 18 + optLength + 1))[0]; if (cmd === 1) { } else if (cmd === 2) { isUDP = true; } else { return { hasError: true, message: `command ${cmd} is not support, command 01-tcp,02-udp,03-mux` }; } const portIndex = 18 + optLength + 1; const portBuffer = buffer.slice(portIndex, portIndex + 2); const portRemote = new DataView(portBuffer).getUint16(0); let addressIndex = portIndex + 2; const addressBuffer = new Uint8Array(buffer.slice(addressIndex, addressIndex + 1)); const addressType = addressBuffer[0]; let addressLength = 0; let addressValueIndex = addressIndex + 1; let addressValue = ""; switch (addressType) { case 1: addressLength = 4; addressValue = new Uint8Array(buffer.slice(addressValueIndex, addressValueIndex + addressLength)).join("."); break; case 2: addressLength = new Uint8Array(buffer.slice(addressValueIndex, addressValueIndex + 1))[0]; addressValueIndex += 1; addressValue = new TextDecoder().decode(buffer.slice(addressValueIndex, addressValueIndex + addressLength)); break; case 3: addressLength = 16; const dataView = new DataView(buffer.slice(addressValueIndex, addressValueIndex + addressLength)); const ipv6 = []; for (let i = 0; i < 8; i++) ipv6.push(dataView.getUint16(i * 2).toString(16)); addressValue = ipv6.join(":"); break; default: return { hasError: true, message: `invild addressType is ${addressType}` }; } if (!addressValue) return { hasError: true, message: `addressValue is empty, addressType is ${addressType}` }; return { hasError: false, addressRemote: addressValue, addressType: addressType, portRemote: portRemote, rawDataIndex: addressValueIndex + addressLength, rawClientData: buffer.slice(addressValueIndex + addressLength), version: new Uint8Array([version[0], 0]), isUDP: isUDP, }; } function parseNajortHeader(buffer) { const socks5DataBuffer = buffer.slice(58); if (socks5DataBuffer.byteLength < 6) return { hasError: true, message: "invalid SOCKS5 request data" }; let isUDP = false; const view = new DataView(socks5DataBuffer); const cmd = view.getUint8(0); if (cmd == 3) isUDP = true; else if (cmd != 1) return { hasError: true, message: "Unsupported command type!" }; let addressType = view.getUint8(1); let addressLength = 0; let addressValueIndex = 2; let addressValue = ""; switch (addressType) { case 1: addressLength = 4; addressValue = new Uint8Array(socks5DataBuffer.slice(addressValueIndex, addressValueIndex + addressLength)).join("."); break; case 3: addressLength = new Uint8Array(socks5DataBuffer.slice(addressValueIndex, addressValueIndex + 1))[0]; addressValueIndex += 1; addressValue = new TextDecoder().decode( socks5DataBuffer.slice(addressValueIndex, addressValueIndex + addressLength) ); break; case 4: addressLength = 16; const dataView = new DataView(socks5DataBuffer.slice(addressValueIndex, addressValueIndex + addressLength)); const ipv6 = []; for (let i = 0; i < 8; i++) ipv6.push(dataView.getUint16(i * 2).toString(16)); addressValue = ipv6.join(":"); break; default: return { hasError: true, message: `invalid addressType is ${addressType}` }; } if (!addressValue) return { hasError: true, message: `address is empty, addressType is ${addressType}` }; const portIndex = addressValueIndex + addressLength; const portBuffer = socks5DataBuffer.slice(portIndex, portIndex + 2); const portRemote = new DataView(portBuffer).getUint16(0); return { hasError: false, addressRemote: addressValue, addressType: addressType, portRemote: portRemote, rawDataIndex: portIndex + 4, rawClientData: socks5DataBuffer.slice(portIndex + 4), version: null, isUDP: isUDP, }; } // ============================================================ // TCP / UDP OUTBOUND — HARDENED // ============================================================ async function handleTCPOutBound(remoteSocket, addressRemote, portRemote, rawClientData, webSocket, responseHeader, log) { async function connectAndWrite(address, port) { if (!address || !port) throw new Error(`Invalid target ${address}:${port}`); const tcpSocket = connect({ hostname: address, port: Number(port) }); remoteSocket.value = tcpSocket; log(`connected to ${address}:${port}`); const writer = tcpSocket.writable.getWriter(); await writer.write(rawClientData); writer.releaseLock(); return tcpSocket; } async function retry() { try { const [rAddr, rPort] = proxyIP.split(/[:=-]/); const tcpSocket = await connectAndWrite(rAddr || addressRemote, rPort || portRemote); tcpSocket.closed .catch((error) => console.log("retry tcpSocket closed error", error)) .finally(() => safeCloseWebSocket(webSocket)); remoteSocketToWS(tcpSocket, webSocket, responseHeader, null, log); } catch (e) { log("retry() failed", e.message); safeCloseWebSocket(webSocket); } } try { const tcpSocket = await connectAndWrite(addressRemote, portRemote); remoteSocketToWS(tcpSocket, webSocket, responseHeader, retry, log); } catch (err) { log("initial connect failed", err.message); return retry(); } } async function handleUDPOutbound(targetAddress, targetPort, udpChunk, webSocket, responseHeader, log) { try { let protocolHeader = responseHeader; const tcpSocket = connect({ hostname: targetAddress, port: targetPort }); log(`Connected to ${targetAddress}:${targetPort}`); const writer = tcpSocket.writable.getWriter(); await writer.write(udpChunk); writer.releaseLock(); await tcpSocket.readable.pipeTo( new WritableStream({ async write(chunk) { if (webSocket.readyState === WS_READY_STATE_OPEN) { if (protocolHeader) { webSocket.send(await new Blob([protocolHeader, chunk]).arrayBuffer()); protocolHeader = null; } else { webSocket.send(chunk); } } }, close() { log(`UDP connection to ${targetAddress} closed`); }, abort(reason) { console.error(`UDP connection to ${targetPort} aborted due to ${reason}`); }, }) ); } catch (e) { console.error(`Error while handling UDP outbound, error ${e.message}`); } } // ============================================================ // WS STREAM // ============================================================ function makeReadableWebSocketStream(webSocketServer, earlyDataHeader, log) { let readableStreamCancel = false; const stream = new ReadableStream({ start(controller) { webSocketServer.addEventListener("message", (event) => { if (readableStreamCancel) return; controller.enqueue(event.data); }); webSocketServer.addEventListener("close", () => { safeCloseWebSocket(webSocketServer); if (readableStreamCancel) return; try { controller.close(); } catch {} }); webSocketServer.addEventListener("error", (err) => { log("webSocketServer has error"); try { controller.error(err); } catch {} }); const { earlyData, error } = base64ToArrayBuffer(earlyDataHeader); if (error) { try { controller.error(error); } catch {} } else if (earlyData) { controller.enqueue(earlyData); } }, pull(controller) {}, cancel(reason) { if (readableStreamCancel) return; log(`ReadableStream was canceled, due to ${reason}`); readableStreamCancel = true; safeCloseWebSocket(webSocketServer); }, }); return stream; } async function remoteSocketToWS(remoteSocket, webSocket, responseHeader, retry, log) { let header = responseHeader; let hasIncomingData = false; await remoteSocket.readable .pipeTo( new WritableStream({ start() {}, async write(chunk, controller) { hasIncomingData = true; if (webSocket.readyState !== WS_READY_STATE_OPEN) { controller.error("webSocket.readyState is not open, maybe close"); } if (header) { webSocket.send(await new Blob([header, chunk]).arrayBuffer()); header = null; } else { webSocket.send(chunk); } }, close() { log(`remoteConnection!.readable is close with hasIncomingData is ${hasIncomingData}`); }, abort(reason) { console.error(`remoteConnection!.readable abort`, reason); }, }) ) .catch((error) => { console.error(`remoteSocketToWS has exception `, error.stack || error); safeCloseWebSocket(webSocket); }); if (hasIncomingData === false && retry) { log(`retry`); retry(); } } // ============================================================ // HELPERS // ============================================================ function safeCloseWebSocket(socket) { try { if (socket.readyState === WS_READY_STATE_OPEN || socket.readyState === WS_READY_STATE_CLOSING) { socket.close(); } } catch (error) { console.error("safeCloseWebSocket error", error); } } async function checkProxyHealth(proxyIPx, proxyPort) { const req = await fetch(`${PROXY_HEALTH_CHECK_API}?ip=${proxyIPx}&port=${proxyPort}`); return await req.json(); } function base64ToArrayBuffer(base64Str) { if (!base64Str) return { error: null }; try { base64Str = base64Str.replace(/-/g, "+").replace(/_/g, "/"); const decode = atob(base64Str); const arryBuffer = Uint8Array.from(decode, (c) => c.charCodeAt(0)); return { earlyData: arryBuffer.buffer, error: null }; } catch (error) { return { error }; } } function arrayBufferToHex(buffer) { return [...new Uint8Array(buffer)].map((x) => x.toString(16).padStart(2, "0")).join(""); } function shuffleArray(array) { let currentIndex = array.length; while (currentIndex != 0) { let randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; } } async function generateHashFromText(text) { const msgUint8 = new TextEncoder().encode(text); const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8); return [...new Uint8Array(hashBuffer)].map((b) => b.toString(16).padStart(2, "0")).join(""); } function reverse(s) { return s.split("").reverse().join(""); } function getFlagEmoji(isoCode) { if (!isoCode || isoCode === "XX") return "🌐"; const codePoints = isoCode .toUpperCase() .split("") .map((char) => 127397 + char.charCodeAt(0)); return String.fromCodePoint(...codePoints); } // ============================================================ // CLOUDFLARE API // ============================================================ class CloudflareApi { constructor() { this.bearer = `Bearer ${apiKey}`; this.accountID = accountID; this.zoneID = zoneID; this.apiEmail = apiEmail; this.apiKey = apiKey; this.headers = { Authorization: this.bearer }; } async getDomainList() { const url = `https://api.cloudflare.com/client/v4/accounts/${this.accountID}/workers/domains`; const res = await fetch(url, { headers: { ...this.headers } }); if (res.status == 200) { const respJson = await res.json(); return respJson.result.filter((data) => data.service == serviceName).map((data) => data.hostname); } return []; } async registerDomain(domain) { domain = domain.toLowerCase(); const registeredDomains = await this.getDomainList(); if (!domain.endsWith(rootDomain)) return 400; if (registeredDomains.includes(domain)) return 409; try { const domainTest = await fetch(`https://${domain.replaceAll("." + APP_DOMAIN, "")}`); if (domainTest.status == 530) return domainTest.status; const badWordsListRes = await fetch(BAD_WORDS_LIST); if (badWordsListRes.status == 200) { const badWordsList = (await badWordsListRes.text()).split("\n"); for (const badWord of badWordsList) { if (domain.includes(badWord.toLowerCase())) return 403; } } else { return 403; } } catch (e) { return 400; } const url = `https://api.cloudflare.com/client/v4/accounts/${this.accountID}/workers/domains`; const res = await fetch(url, { method: "PUT", body: JSON.stringify({ environment: "production", hostname: domain, service: serviceName, zone_id: this.zoneID, }), headers: { ...this.headers }, }); return res.status; } } // ============================================================ // HTML PAGE // ============================================================ let baseHTML = `
Akun berhasil disalin
IP: 127.0.0.1
Country: Indonesia
ISP: Localhost
IP: ${proxyData.proxyIP}
`; proxyGroupElement += `Port: ${proxyData.proxyPort}
`; proxyGroupElement += `