mirror of
https://github.com/zizifn/edgetunnel
synced 2024-11-21 17:03:09 +00:00
init cf worker code
This commit is contained in:
parent
04e25f5130
commit
b7e037de56
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
.DS_Store
|
||||||
|
/node_modules
|
||||||
|
*-lock.*
|
||||||
|
*.lock
|
||||||
|
*.log
|
72
config/config-client-with-dns-lcoal.json
Normal file
72
config/config-client-with-dns-lcoal.json
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"loglevel": "debug"
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"port": "4080",
|
||||||
|
"protocol": "socks",
|
||||||
|
"settings": {
|
||||||
|
"auth": "noauth",
|
||||||
|
"udp": true,
|
||||||
|
"ip": "0.0.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"port": "4081",
|
||||||
|
"protocol": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dns": {
|
||||||
|
"servers": ["8.8.8.8"]
|
||||||
|
},
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"vnext": [
|
||||||
|
{
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 8788,
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"id": "1a403b79-039b-4dc2-9b45-1ad13197b99a",
|
||||||
|
"encryption": "none",
|
||||||
|
"level": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "ws",
|
||||||
|
"wsSettings": {
|
||||||
|
"path": "/vless"
|
||||||
|
}
|
||||||
|
// "security": "tls"
|
||||||
|
},
|
||||||
|
"tag": "zizi-ws"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": "freedom",
|
||||||
|
"tag": "direct"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"routing": {
|
||||||
|
"domainStrategy": "IPIfNonMatch",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"type": "field",
|
||||||
|
"ip": ["8.8.8.8"],
|
||||||
|
"outboundTag": "zizi-ws"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "field",
|
||||||
|
"ip": ["geoip:private"],
|
||||||
|
"outboundTag": "zizi-ws"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
72
config/config-client-without-dns-lcoal.json
Normal file
72
config/config-client-without-dns-lcoal.json
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"log": {
|
||||||
|
"loglevel": "debug"
|
||||||
|
},
|
||||||
|
"inbounds": [
|
||||||
|
{
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"port": "4080",
|
||||||
|
"protocol": "socks",
|
||||||
|
"settings": {
|
||||||
|
"auth": "noauth",
|
||||||
|
"udp": true,
|
||||||
|
"ip": "0.0.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"listen": "0.0.0.0",
|
||||||
|
"port": "4081",
|
||||||
|
"protocol": "http"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dns": {
|
||||||
|
"servers": ["8.8.8.8"]
|
||||||
|
},
|
||||||
|
"outbounds": [
|
||||||
|
{
|
||||||
|
"protocol": "vless",
|
||||||
|
"settings": {
|
||||||
|
"vnext": [
|
||||||
|
{
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 8787,
|
||||||
|
"users": [
|
||||||
|
{
|
||||||
|
"id": "1a403b79-039b-4dc2-9b45-1ad13197b99a",
|
||||||
|
"encryption": "none",
|
||||||
|
"level": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"streamSettings": {
|
||||||
|
"network": "ws"
|
||||||
|
// "wsSettings": {
|
||||||
|
// "path": "/node-vless"
|
||||||
|
// }
|
||||||
|
// "security": "tls"
|
||||||
|
},
|
||||||
|
"tag": "zizi-ws"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"protocol": "freedom",
|
||||||
|
"tag": "direct"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"routing": {
|
||||||
|
"domainStrategy": "IPIfNonMatch",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"type": "field",
|
||||||
|
"ip": ["8.8.8.8"],
|
||||||
|
"outboundTag": "zizi-ws"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "field",
|
||||||
|
"ip": ["geoip:private"],
|
||||||
|
"outboundTag": "zizi-ws"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
1
dist/README.md
vendored
Normal file
1
dist/README.md
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
This folder contains the built output assets for the worker "cf-worker-ws-dev" generated at 2023-05-26T18:01:56.750Z.
|
2971
dist/cidr.js
vendored
Normal file
2971
dist/cidr.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
8
dist/cidr.js.map
vendored
Normal file
8
dist/cidr.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
16
jsonconfig.json
Normal file
16
jsonconfig.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"noEmit": true,
|
||||||
|
"module": "esnext",
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": ["ES2022"],
|
||||||
|
"strict": true,
|
||||||
|
"alwaysStrict": true,
|
||||||
|
"preserveConstEnums": true,
|
||||||
|
"moduleResolution": "node",
|
||||||
|
"sourceMap": true,
|
||||||
|
"types": ["@cloudflare/workers-types"]
|
||||||
|
},
|
||||||
|
"include": ["src"],
|
||||||
|
"exclude": ["node_modules", "dist", "test"]
|
||||||
|
}
|
21
package.json
Normal file
21
package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "edgetunnel",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Delete code, but keep the project for the sake of memories. I'm only create this project for fun, for try new things and for learn by doing. **I'm even not write any outside marketing post for this project. Just for my own fun...** But I feel emotional damage by the community.",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"deploy": "wrangler deploy",
|
||||||
|
"dev-vless": "wrangler dev src/worker-vless.js"
|
||||||
|
},
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@cloudflare/workers-types": "^4.20230518.0",
|
||||||
|
"wrangler": "^3.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"ip-cidr": "^3.1.0",
|
||||||
|
"ip-range-check": "^0.2.0",
|
||||||
|
"ipaddr.js": "^2.0.1"
|
||||||
|
}
|
||||||
|
}
|
7188
src/worker-vless.js
Normal file
7188
src/worker-vless.js
Normal file
File diff suppressed because it is too large
Load Diff
6548
test/cidr.js
Normal file
6548
test/cidr.js
Normal file
File diff suppressed because it is too large
Load Diff
73
test/webstream.mjs
Normal file
73
test/webstream.mjs
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
let isCancel = false;
|
||||||
|
const readableStream = new ReadableStream({
|
||||||
|
start(controller) {
|
||||||
|
let count = 0;
|
||||||
|
controller.enqueue(`Chunk ${count}`);
|
||||||
|
count++;
|
||||||
|
controller.enqueue(`Chunk ${count}`);
|
||||||
|
|
||||||
|
// controller.error(new Error('uuid is not valid'));
|
||||||
|
// setTimeout(() => {
|
||||||
|
// console.log('ReadableStream was closed------valid22-------.');
|
||||||
|
// controller.error(new Error('uuid is not valid22'));
|
||||||
|
// }, 1000);
|
||||||
|
|
||||||
|
// const intervalId = setInterval(() => {
|
||||||
|
// if(!isCancel){
|
||||||
|
// controller.enqueue(`Chunk ${count}`);
|
||||||
|
// }
|
||||||
|
// // controller.enqueue(`Chunk ${count}`);
|
||||||
|
// count++;
|
||||||
|
// if (count > 5) {
|
||||||
|
// console.log('ReadableStream was closed-------------.');
|
||||||
|
// // controller.close()
|
||||||
|
// controller.error(new Error('uuid is not valid'));
|
||||||
|
// // clearInterval(intervalId);
|
||||||
|
// }
|
||||||
|
// }, 1000);
|
||||||
|
},
|
||||||
|
async pull(controller) {
|
||||||
|
console.log('ReadableStream Pulling data...');
|
||||||
|
// await new Promise((resolve) => setTimeout(resolve, 2000));
|
||||||
|
},
|
||||||
|
cancel() {
|
||||||
|
isCancel = true;
|
||||||
|
console.log('ReadableStream was canceled.');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const writableStream = new WritableStream({
|
||||||
|
write(chunk, controller) {
|
||||||
|
console.log(`Received data: ${chunk}`);
|
||||||
|
if(chunk === 'Chunk 1'){
|
||||||
|
controller.error('eroorooororo')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// throw new Error('uuid is not valid');
|
||||||
|
|
||||||
|
// setTimeout( ()=>{
|
||||||
|
// try {
|
||||||
|
// throw new Error('setTimeout hasve error valid');
|
||||||
|
// }catch(error){
|
||||||
|
// console.log('////setTimeout hasve error valid');
|
||||||
|
// }
|
||||||
|
|
||||||
|
// }, 2000)
|
||||||
|
|
||||||
|
// controller.error(new Error('Received error'));
|
||||||
|
if(chunk === 'Chunk 3'){
|
||||||
|
throw new Error('uuid is not valid');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
console.log('WritableStream was closed');
|
||||||
|
},
|
||||||
|
abort() {
|
||||||
|
console.log('WritableStream was aborted');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
readableStream.pipeTo(writableStream).catch((err) => {
|
||||||
|
console.log('-----------------------error-------------------');
|
||||||
|
console.log(err);
|
||||||
|
});
|
11
test/worker/cf-cdn-cgi-trace.js
Normal file
11
test/worker/cf-cdn-cgi-trace.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
const url = new URL(request.url);
|
||||||
|
const address = url.searchParams.get("address");
|
||||||
|
if(!address){
|
||||||
|
return new Response('not pass address', { status: 200 });
|
||||||
|
}
|
||||||
|
const resp = fetch(`http://${address}/cdn-cgi/trace`);
|
||||||
|
return new Response((await resp).body, { status: 200 });
|
||||||
|
}
|
||||||
|
};
|
22
test/worker/cf-worker-http-header.js
Normal file
22
test/worker/cf-worker-http-header.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
export default {
|
||||||
|
/**
|
||||||
|
* @param {import("@cloudflare/workers-types").Request} request
|
||||||
|
* @param {{uuid: string}} env
|
||||||
|
* @param {import("@cloudflare/workers-types").ExecutionContext} ctx
|
||||||
|
* @returns {Promise<Response>}
|
||||||
|
*/
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
const headers = {};
|
||||||
|
for (const [name, value] of request.headers.entries()) {
|
||||||
|
headers[name] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
"http-header": headers,
|
||||||
|
"cf": request.cf
|
||||||
|
}
|
||||||
|
const headersJson = JSON.stringify(result);
|
||||||
|
console.log(headersJson);
|
||||||
|
return new Response(headersJson, { status: 200 });
|
||||||
|
}
|
||||||
|
};
|
33
test/worker/cidr.js
Normal file
33
test/worker/cidr.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
|
||||||
|
import IPCIDR from 'ip-cidr';
|
||||||
|
|
||||||
|
const chunk = '0'.repeat(1024 * 5);
|
||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
const isin = checkIPInCIDR("192.168.1.1", "102.1.5.2/24");
|
||||||
|
|
||||||
|
return new Response(null, {
|
||||||
|
status: 101
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function checkIPInCIDR(ip, cidr) {
|
||||||
|
const cidrObject = new IPCIDR(cidr);
|
||||||
|
|
||||||
|
// Check if the IP address is valid
|
||||||
|
// if (!cidrObject.isValidAddress(ip)) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Check if the IP address is within the CIDR range
|
||||||
|
return cidrObject.contains(ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
function delay(ms) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, ms)
|
||||||
|
})
|
||||||
|
}
|
1029
test/worker/ipaddr-test.js
Normal file
1029
test/worker/ipaddr-test.js
Normal file
File diff suppressed because it is too large
Load Diff
55
test/worker/stream-ws-test.js
Normal file
55
test/worker/stream-ws-test.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
const upgradeHeader = request.headers.get('Upgrade');
|
||||||
|
if (!upgradeHeader || upgradeHeader !== 'websocket') {
|
||||||
|
return new Response('not websocket', { status: 200 });
|
||||||
|
}
|
||||||
|
const webSocketPair = new WebSocketPair();
|
||||||
|
const [client, webSocket] = Object.values(webSocketPair);
|
||||||
|
webSocket.accept();
|
||||||
|
let count = 0;
|
||||||
|
const readableStream = new ReadableStream({
|
||||||
|
start(controller) {
|
||||||
|
setInterval(() => {
|
||||||
|
controller.enqueue(count);
|
||||||
|
count++;
|
||||||
|
}, 500)
|
||||||
|
|
||||||
|
},
|
||||||
|
async pull(controller) {
|
||||||
|
},
|
||||||
|
cancel() {
|
||||||
|
console.log('ReadableStream was canceled.');
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const writableStream = new WritableStream({
|
||||||
|
write(chunk, controller) {
|
||||||
|
console.log(`Received data: ${chunk}`);
|
||||||
|
webSocket.send(`Received data: ${chunk}`);
|
||||||
|
if (chunk === 3) {
|
||||||
|
controller.error('eroorooororo')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
console.log('WritableStream was closed');
|
||||||
|
},
|
||||||
|
abort() {
|
||||||
|
console.log('WritableStream was aborted');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
readableStream.pipeTo(writableStream).catch((error) => {
|
||||||
|
console.log('pipeTo error', error);
|
||||||
|
webSocket.close();
|
||||||
|
});
|
||||||
|
webSocket.addEventListener('close', () => {
|
||||||
|
console.log('close');
|
||||||
|
});
|
||||||
|
return new Response(null, {
|
||||||
|
status: 101,
|
||||||
|
webSocket: client,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
46
test/worker/worker-connect-test.js
Normal file
46
test/worker/worker-connect-test.js
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import { connect } from 'cloudflare:sockets';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
console.log('start fetch');
|
||||||
|
const cloudflare = 'www.cloudflare.com';
|
||||||
|
const floodgap = 'gopher.floodgap.com';
|
||||||
|
let host = floodgap;
|
||||||
|
const isFloodgap = request.url.includes('floodgap');
|
||||||
|
const iscloudflare = request.url.includes('cloudflare');
|
||||||
|
if (isFloodgap) {
|
||||||
|
host = floodgap;
|
||||||
|
}
|
||||||
|
if (iscloudflare) {
|
||||||
|
host = cloudflare;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const socket = connect(
|
||||||
|
{
|
||||||
|
hostname: host,
|
||||||
|
port: 443,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
secureTransport: 'on',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
console.log('start conneted', host);
|
||||||
|
const writer = socket.writable.getWriter();
|
||||||
|
const encoder = new TextEncoder();
|
||||||
|
const encoded = encoder.encode(
|
||||||
|
`GET / HTTP/1.1\r\nHost: ${host}\r\nUser-Agent: curl/8.0.1\r\nAccept: */*\r\n\r\n`
|
||||||
|
);
|
||||||
|
await writer.write(encoded);
|
||||||
|
console.log('write end');
|
||||||
|
|
||||||
|
return new Response(socket.readable, {
|
||||||
|
headers: { 'Content-Type': 'text/plain' },
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return new Response('Socket connection failed: ' + error, {
|
||||||
|
status: 500,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
6
test/worker/wrangler.toml
Normal file
6
test/worker/wrangler.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
name = "cf-worker-http-header" # todo
|
||||||
|
main = "./cf-worker-http-header.js"
|
||||||
|
compatibility_date = "2023-05-26"
|
||||||
|
|
||||||
|
[vars]
|
||||||
|
UUID = "example_dev_token"
|
60
test/worker/ws-send-issue.js
Normal file
60
test/worker/ws-send-issue.js
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
|
||||||
|
const chunk = '0'.repeat(1024 * 5);
|
||||||
|
export default {
|
||||||
|
async fetch(request, env, ctx) {
|
||||||
|
try {
|
||||||
|
console.log('---------------');
|
||||||
|
const webSocketPair = new WebSocketPair();
|
||||||
|
/** @type {import("@cloudflare/workers-types").WebSocket[]} */
|
||||||
|
const [client, webSocket] = Object.values(webSocketPair);
|
||||||
|
webSocket.accept();
|
||||||
|
let btyes = 0;
|
||||||
|
// (async () => {
|
||||||
|
// const repose = await fetch('http://speed.cloudflare.com/__down?bytes=1145141919810')
|
||||||
|
// const body = repose.body;
|
||||||
|
// const reader = body?.getReader();
|
||||||
|
// let packets = [];
|
||||||
|
// while (true && reader) {
|
||||||
|
// const { done, value } = await reader.read();
|
||||||
|
// packets.push(value);
|
||||||
|
// console.log(btyes += value?.length || 0);
|
||||||
|
// if (packets.length > 100) {
|
||||||
|
// webSocket.send(value || '');
|
||||||
|
// await delay(2);
|
||||||
|
// packets = [];
|
||||||
|
// }
|
||||||
|
// if (done) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// })()
|
||||||
|
console.log('---------------');
|
||||||
|
(async () => {
|
||||||
|
let packets = [];
|
||||||
|
console.log('---------------');
|
||||||
|
while (true) {
|
||||||
|
console.log(btyes += chunk?.length || 0);
|
||||||
|
webSocket.send(chunk || '');
|
||||||
|
await delay(1)
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
// console.log(btyes += chunk?.length || 0);
|
||||||
|
// webSocket.send(chunk || '');
|
||||||
|
|
||||||
|
return new Response(null, {
|
||||||
|
status: 101,
|
||||||
|
webSocket: client,
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
/** @type {Error} */ let e = err;
|
||||||
|
return new Response(e.toString());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
function delay(ms) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, ms)
|
||||||
|
})
|
||||||
|
}
|
7
wrangler.toml
Normal file
7
wrangler.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
name = "cf-worker-ws-dev" # todo
|
||||||
|
#main = "test/worker/cf-cdn-cgi-trace2.js"
|
||||||
|
main = "src/worker-vless.js"
|
||||||
|
compatibility_date = "2023-05-26"
|
||||||
|
|
||||||
|
[vars]
|
||||||
|
UUID = "example_dev_token"
|
Loading…
Reference in New Issue
Block a user