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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/lib.js +58 -54
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-tcp-tunnel",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "js tcp tunnel",
5
5
  "main": "index.js",
6
6
  "type": "module",
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
- await Readable.toWeb(ctx.req).pipeTo(new WritableStream({
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 createConnectionIn() {
1471
- console.info('createTunnelTcpClientHttp createConnectionIn')
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
- try {
1511
- abortListenerSet.add(listenerAC)
1512
- let res = await fetch(param.url, {
1513
- method: 'POST',
1514
- signal: ac.signal,
1515
- headers: {
1516
- 'Content-Type': 'application/octet-stream',
1517
- ...addHeaders,
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
- await res.body.pipeTo(new WritableStream({
1505
+ Readable.toWeb(res).pipeTo(new WritableStream({
1522
1506
  async write(chunk) {
1523
1507
  await helper.writer.write(chunk)
1524
1508
  }
1525
- }))
1526
- } finally {
1527
- abortListenerSet.delete(listenerAC)
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 createConnectionIn()
1533
- })
1534
- timeWaitRetryLoop(param.signal, async () => {
1535
- await createConnectionOut()
1539
+ await createConnectionHttpx()
1536
1540
  })
1537
1541
 
1538
1542
  return helper