js-tcp-tunnel 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/lib.js +58 -54
package/package.json
CHANGED
package/src/lib.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
2
|
import net from 'node:net'
|
|
3
3
|
import { Readable, Writable } from 'node:stream'
|
|
4
|
+
import http from 'node:http'
|
|
5
|
+
import https from 'node:https'
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* @import {WebSocketServer} from 'ws'
|
|
@@ -1406,7 +1408,7 @@ export function createTunnelTcpServerKoaRouter(param) {
|
|
|
1406
1408
|
helper.writer = helper.writable.getWriter()
|
|
1407
1409
|
helper.reader = helper.readable.getReader()
|
|
1408
1410
|
ctx.req.on('error', (e) => { console.error('createTunnelTcpServerKoaRouter in req error', e.message) })
|
|
1409
|
-
|
|
1411
|
+
Readable.toWeb(ctx.req).pipeTo(new WritableStream({
|
|
1410
1412
|
async write(chunk) {
|
|
1411
1413
|
await helper.writer.write(chunk)
|
|
1412
1414
|
}
|
|
@@ -1429,6 +1431,19 @@ export function createTunnelTcpServerKoaRouter(param) {
|
|
|
1429
1431
|
})
|
|
1430
1432
|
}
|
|
1431
1433
|
|
|
1434
|
+
/**
|
|
1435
|
+
* @param {string} url
|
|
1436
|
+
* @returns {http}
|
|
1437
|
+
*/
|
|
1438
|
+
export function getHttpx(url) {
|
|
1439
|
+
/** @type{*} */
|
|
1440
|
+
let httpx = http
|
|
1441
|
+
if (url.startsWith('https:')) {
|
|
1442
|
+
httpx = https
|
|
1443
|
+
}
|
|
1444
|
+
return httpx
|
|
1445
|
+
}
|
|
1446
|
+
|
|
1432
1447
|
/**
|
|
1433
1448
|
* @param {{
|
|
1434
1449
|
* signal:AbortSignal;
|
|
@@ -1467,72 +1482,61 @@ export function createTunnelTcpClientHttp(param) {
|
|
|
1467
1482
|
param.signal.addEventListener('abort', () => {
|
|
1468
1483
|
abortListenerSet.forEach(o => o())
|
|
1469
1484
|
})
|
|
1470
|
-
async function
|
|
1471
|
-
console.info('
|
|
1472
|
-
let addHeaders = {}
|
|
1473
|
-
if (param.headersFn) {
|
|
1474
|
-
addHeaders = await param.headersFn()
|
|
1475
|
-
}
|
|
1476
|
-
const ac = new AbortController()
|
|
1477
|
-
const listenerAC = () => { ac.abort() }
|
|
1478
|
-
try {
|
|
1479
|
-
let transform = new TransformStream()
|
|
1480
|
-
socketWriter = transform.writable.getWriter()
|
|
1481
|
-
signal.resolve()
|
|
1482
|
-
abortListenerSet.add(listenerAC)
|
|
1483
|
-
await fetch(param.url, {
|
|
1484
|
-
method: 'POST',
|
|
1485
|
-
// @ts-ignore
|
|
1486
|
-
duplex: 'half',
|
|
1487
|
-
signal: ac.signal,
|
|
1488
|
-
headers: {
|
|
1489
|
-
'Content-Type': 'application/octet-stream',
|
|
1490
|
-
...addHeaders,
|
|
1491
|
-
},
|
|
1492
|
-
body: transform.readable,
|
|
1493
|
-
})
|
|
1494
|
-
} finally {
|
|
1495
|
-
abortListenerSet.delete(listenerAC)
|
|
1496
|
-
socketWriter = null
|
|
1497
|
-
signal.resolve()
|
|
1498
|
-
signal = Promise_withResolvers()
|
|
1499
|
-
}
|
|
1500
|
-
}
|
|
1501
|
-
|
|
1502
|
-
async function createConnectionOut() {
|
|
1503
|
-
console.info('createTunnelTcpClientHttp createConnectionOut')
|
|
1485
|
+
async function createConnectionHttpx() {
|
|
1486
|
+
console.info('createTunnelTcpClientHttpV2 createConnectionHttpx')
|
|
1504
1487
|
let addHeaders = {}
|
|
1505
1488
|
if (param.headersFn) {
|
|
1506
1489
|
addHeaders = await param.headersFn()
|
|
1507
1490
|
}
|
|
1508
1491
|
const ac = new AbortController()
|
|
1509
1492
|
const listenerAC = () => { ac.abort() }
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1493
|
+
let promise = Promise_withResolvers()
|
|
1494
|
+
let transform = new TransformStream()
|
|
1495
|
+
socketWriter = transform.writable.getWriter()
|
|
1496
|
+
signal.resolve()
|
|
1497
|
+
abortListenerSet.add(listenerAC)
|
|
1498
|
+
let httpx = getHttpx(param.url)
|
|
1499
|
+
let req = httpx.request(param.url, {
|
|
1500
|
+
method: 'POST',
|
|
1501
|
+
signal: ac.signal,
|
|
1502
|
+
timeout: param.timeout ?? 24 * 3600 * 1000,
|
|
1503
|
+
}, (res) => {
|
|
1520
1504
|
param.oncreateoutconnect && param.oncreateoutconnect()
|
|
1521
|
-
|
|
1505
|
+
Readable.toWeb(res).pipeTo(new WritableStream({
|
|
1522
1506
|
async write(chunk) {
|
|
1523
1507
|
await helper.writer.write(chunk)
|
|
1524
1508
|
}
|
|
1525
|
-
}))
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1509
|
+
})).catch((err) => {
|
|
1510
|
+
console.error('web stream error', err.message)
|
|
1511
|
+
})
|
|
1512
|
+
res.on('error', (e) => {
|
|
1513
|
+
console.error('createConnectionHttpx res error ', e.message)
|
|
1514
|
+
promise.resolve()
|
|
1515
|
+
})
|
|
1516
|
+
res.on('close', () => {
|
|
1517
|
+
console.error('createConnectionHttpx res close ')
|
|
1518
|
+
promise.resolve()
|
|
1519
|
+
})
|
|
1520
|
+
})
|
|
1521
|
+
Readable.fromWeb(transform.readable).pipe(req)
|
|
1522
|
+
req.flushHeaders()
|
|
1523
|
+
req.on('error', (e) => {
|
|
1524
|
+
console.error('createConnectionHttpx', e.message)
|
|
1525
|
+
promise.resolve()
|
|
1526
|
+
})
|
|
1527
|
+
req.on('close', () => {
|
|
1528
|
+
console.error('createConnectionHttpx req close')
|
|
1529
|
+
promise.resolve()
|
|
1530
|
+
})
|
|
1531
|
+
await promise.promise
|
|
1532
|
+
abortListenerSet.delete(listenerAC)
|
|
1533
|
+
socketWriter = null
|
|
1534
|
+
signal.resolve()
|
|
1535
|
+
signal = Promise_withResolvers()
|
|
1529
1536
|
}
|
|
1530
1537
|
|
|
1531
1538
|
timeWaitRetryLoop(param.signal, async () => {
|
|
1532
|
-
await
|
|
1533
|
-
})
|
|
1534
|
-
timeWaitRetryLoop(param.signal, async () => {
|
|
1535
|
-
await createConnectionOut()
|
|
1539
|
+
await createConnectionHttpx()
|
|
1536
1540
|
})
|
|
1537
1541
|
|
|
1538
1542
|
return helper
|