pipenet 1.0.1 → 1.1.2
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/README.md +14 -18
- package/dist/Tunnel.d.ts +15 -15
- package/dist/Tunnel.d.ts.map +1 -1
- package/dist/Tunnel.js +72 -72
- package/dist/Tunnel.js.map +1 -1
- package/dist/TunnelCluster.d.ts +12 -12
- package/dist/TunnelCluster.d.ts.map +1 -1
- package/dist/TunnelCluster.js +14 -14
- package/dist/TunnelCluster.js.map +1 -1
- package/dist/cli.js +19 -18
- package/dist/cli.js.map +1 -1
- package/dist/pipenet.d.ts +5 -5
- package/dist/pipenet.d.ts.map +1 -1
- package/dist/pipenet.js +2 -2
- package/dist/pipenet.js.map +1 -1
- package/dist/pipenet.spec.js +70 -55
- package/dist/pipenet.spec.js.map +1 -1
- package/dist/server/Client.d.ts +4 -4
- package/dist/server/Client.d.ts.map +1 -1
- package/dist/server/Client.js +8 -8
- package/dist/server/Client.js.map +1 -1
- package/dist/server/Client.spec.js +17 -17
- package/dist/server/Client.spec.js.map +1 -1
- package/dist/server/ClientManager.d.ts +6 -6
- package/dist/server/ClientManager.d.ts.map +1 -1
- package/dist/server/ClientManager.js +12 -12
- package/dist/server/ClientManager.js.map +1 -1
- package/dist/server/ClientManager.spec.js +1 -1
- package/dist/server/ClientManager.spec.js.map +1 -1
- package/dist/server/TunnelAgent.d.ts +10 -10
- package/dist/server/TunnelAgent.d.ts.map +1 -1
- package/dist/server/TunnelAgent.js +29 -29
- package/dist/server/TunnelAgent.js.map +1 -1
- package/dist/server/TunnelAgent.spec.js +1 -1
- package/dist/server/TunnelAgent.spec.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/server.d.ts +2 -2
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +5 -5
- package/dist/server/server.js.map +1 -1
- package/dist/server/server.spec.js +6 -6
- package/dist/server/server.spec.js.map +1 -1
- package/eslint.config.ts +29 -18
- package/package.json +17 -10
- package/src/Tunnel.ts +105 -105
- package/src/TunnelCluster.ts +26 -26
- package/src/cli.ts +28 -26
- package/src/pipenet.spec.ts +45 -28
- package/src/pipenet.ts +6 -6
- package/src/server/Client.spec.ts +19 -19
- package/src/server/Client.ts +11 -10
- package/src/server/ClientManager.spec.ts +1 -1
- package/src/server/ClientManager.ts +16 -16
- package/src/server/TunnelAgent.spec.ts +1 -1
- package/src/server/TunnelAgent.ts +34 -34
- package/src/server/index.ts +2 -2
- package/src/server/server.spec.ts +6 -6
- package/src/server/server.ts +8 -8
- package/vitest.config.ts +2 -2
package/README.md
CHANGED
|
@@ -14,13 +14,13 @@ pnpm add pipenet
|
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
16
|
# Expose local port 3000 to the internet
|
|
17
|
-
npx pipenet --port 3000
|
|
17
|
+
npx pipenet client --port 3000
|
|
18
18
|
|
|
19
19
|
# Request a specific subdomain
|
|
20
|
-
npx pipenet --port 3000 --subdomain myapp
|
|
20
|
+
npx pipenet client --port 3000 --subdomain myapp
|
|
21
21
|
|
|
22
22
|
# Use a custom tunnel server
|
|
23
|
-
npx pipenet --port 3000 --host https://your-tunnel-server.com
|
|
23
|
+
npx pipenet client --port 3000 --host https://your-tunnel-server.com
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
## API
|
|
@@ -32,7 +32,7 @@ The pipenet client is also usable through an API (for test integration, automati
|
|
|
32
32
|
Creates a new pipenet tunnel to the specified local `port`. Will return a Promise that resolves once you have been assigned a public tunnel url. `options` can be used to request a specific `subdomain`. A `callback` function can be passed, in which case it won't return a Promise. This exists for backwards compatibility with the old Node-style callback API. You may also pass a single options object with `port` as a property.
|
|
33
33
|
|
|
34
34
|
```js
|
|
35
|
-
import pipenet from 'pipenet';
|
|
35
|
+
import { pipenet } from 'pipenet';
|
|
36
36
|
|
|
37
37
|
const tunnel = await pipenet({
|
|
38
38
|
port: 3000,
|
|
@@ -53,12 +53,12 @@ tunnel.on('close', () => {
|
|
|
53
53
|
- `port` (number) [required] The local port number to expose through pipenet.
|
|
54
54
|
- `host` (string) URL for the upstream proxy server. Defaults to `https://pipenet.dev`.
|
|
55
55
|
- `subdomain` (string) Request a specific subdomain on the proxy server. **Note** You may not actually receive this name depending on availability.
|
|
56
|
-
- `
|
|
57
|
-
- `
|
|
58
|
-
- `
|
|
59
|
-
- `
|
|
60
|
-
- `
|
|
61
|
-
- `
|
|
56
|
+
- `localHost` (string) Proxy to this hostname instead of `localhost`. This will also cause the `Host` header to be re-written to this value in proxied requests.
|
|
57
|
+
- `localHttps` (boolean) Enable tunneling to local HTTPS server.
|
|
58
|
+
- `localCert` (string) Path to certificate PEM file for local HTTPS server.
|
|
59
|
+
- `localKey` (string) Path to certificate key file for local HTTPS server.
|
|
60
|
+
- `localCa` (string) Path to certificate authority file for self-signed certificates.
|
|
61
|
+
- `allowInvalidCert` (boolean) Disable certificate checks for your local HTTPS server (ignore cert/key/ca options).
|
|
62
62
|
|
|
63
63
|
Refer to [tls.createSecureContext](https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options) for details on the certificate options.
|
|
64
64
|
|
|
@@ -97,8 +97,8 @@ import { createServer } from 'pipenet/server';
|
|
|
97
97
|
const server = createServer({
|
|
98
98
|
domain: 'tunnel.example.com', // Optional: custom domain
|
|
99
99
|
secure: false, // Optional: require HTTPS
|
|
100
|
-
landing: 'https://
|
|
101
|
-
|
|
100
|
+
landing: 'https://pipenet.dev', // Optional: landing page URL
|
|
101
|
+
maxTcpSockets: 10, // Optional: max sockets per client
|
|
102
102
|
});
|
|
103
103
|
|
|
104
104
|
server.listen(3000, () => {
|
|
@@ -111,7 +111,7 @@ server.listen(3000, () => {
|
|
|
111
111
|
- `domain` (string) Custom domain for the tunnel server
|
|
112
112
|
- `secure` (boolean) Require HTTPS connections
|
|
113
113
|
- `landing` (string) URL to redirect root requests to
|
|
114
|
-
- `
|
|
114
|
+
- `maxTcpSockets` (number) Maximum number of TCP sockets per client (default: 10)
|
|
115
115
|
|
|
116
116
|
### Server API Endpoints
|
|
117
117
|
|
|
@@ -121,10 +121,6 @@ server.listen(3000, () => {
|
|
|
121
121
|
|
|
122
122
|
## Acknowledgments
|
|
123
123
|
|
|
124
|
-
pipenet is based on [localtunnel](https://github.com/localtunnel/localtunnel)
|
|
124
|
+
pipenet is based on [localtunnel](https://github.com/localtunnel/localtunnel).
|
|
125
125
|
|
|
126
126
|
Development of pipenet is sponsored by [glama.ai](https://glama.ai).
|
|
127
|
-
|
|
128
|
-
## License
|
|
129
|
-
|
|
130
|
-
MIT
|
package/dist/Tunnel.d.ts
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
import { TunnelCluster } from './TunnelCluster.js';
|
|
3
3
|
export interface TunnelOptions {
|
|
4
|
-
|
|
4
|
+
allowInvalidCert?: boolean;
|
|
5
|
+
headers?: Record<string, string>;
|
|
5
6
|
host?: string;
|
|
7
|
+
localCa?: string;
|
|
8
|
+
localCert?: string;
|
|
9
|
+
localHost?: string;
|
|
10
|
+
localHttps?: boolean;
|
|
11
|
+
localKey?: string;
|
|
12
|
+
port?: number;
|
|
6
13
|
subdomain?: string;
|
|
7
|
-
local_host?: string;
|
|
8
|
-
local_https?: boolean;
|
|
9
|
-
local_cert?: string;
|
|
10
|
-
local_key?: string;
|
|
11
|
-
local_ca?: string;
|
|
12
|
-
allow_invalid_cert?: boolean;
|
|
13
|
-
headers?: Record<string, string>;
|
|
14
14
|
}
|
|
15
15
|
export declare class Tunnel extends EventEmitter {
|
|
16
|
-
opts: TunnelOptions;
|
|
17
|
-
closed: boolean;
|
|
18
|
-
clientId?: string;
|
|
19
|
-
url?: string;
|
|
20
16
|
cachedUrl?: string;
|
|
17
|
+
clientId?: string;
|
|
18
|
+
closed: boolean;
|
|
19
|
+
opts: TunnelOptions;
|
|
21
20
|
tunnelCluster?: TunnelCluster;
|
|
21
|
+
url?: string;
|
|
22
22
|
constructor(opts?: TunnelOptions);
|
|
23
|
+
close(): void;
|
|
24
|
+
open(cb: (err?: Error) => void): void;
|
|
25
|
+
private _establish;
|
|
23
26
|
private _getInfo;
|
|
24
27
|
private _init;
|
|
25
|
-
private _establish;
|
|
26
|
-
open(cb: (err?: Error) => void): void;
|
|
27
|
-
close(): void;
|
|
28
28
|
}
|
|
29
29
|
//# sourceMappingURL=Tunnel.d.ts.map
|
package/dist/Tunnel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tunnel.d.ts","sourceRoot":"","sources":["../src/Tunnel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Tunnel.d.ts","sourceRoot":"","sources":["../src/Tunnel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAIzE,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6BD,qBAAa,MAAO,SAAQ,YAAY;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;gBAER,IAAI,GAAE,aAAkB;IASpC,KAAK,IAAI,IAAI;IAKb,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAmBrC,OAAO,CAAC,UAAU;IAqDlB,OAAO,CAAC,QAAQ;IAuBhB,OAAO,CAAC,KAAK;CAmCd"}
|
package/dist/Tunnel.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
1
|
import axios from 'axios';
|
|
3
2
|
import debug from 'debug';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
4
|
import { TunnelCluster } from './TunnelCluster.js';
|
|
5
5
|
const log = debug('pipenet:client');
|
|
6
6
|
export class Tunnel extends EventEmitter {
|
|
7
|
-
opts;
|
|
8
|
-
closed;
|
|
9
|
-
clientId;
|
|
10
|
-
url;
|
|
11
7
|
cachedUrl;
|
|
8
|
+
clientId;
|
|
9
|
+
closed;
|
|
10
|
+
opts;
|
|
12
11
|
tunnelCluster;
|
|
12
|
+
url;
|
|
13
13
|
constructor(opts = {}) {
|
|
14
14
|
super();
|
|
15
15
|
this.opts = opts;
|
|
@@ -18,58 +18,27 @@ export class Tunnel extends EventEmitter {
|
|
|
18
18
|
this.opts.host = 'https://pipenet.dev';
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const { local_https, local_cert, local_key, local_ca, allow_invalid_cert } = this.opts;
|
|
25
|
-
return {
|
|
26
|
-
name: id,
|
|
27
|
-
url,
|
|
28
|
-
cached_url,
|
|
29
|
-
max_conn: max_conn_count || 1,
|
|
30
|
-
remote_host: new URL(host).hostname,
|
|
31
|
-
remote_ip: ip,
|
|
32
|
-
remote_port: port,
|
|
33
|
-
local_port,
|
|
34
|
-
local_host,
|
|
35
|
-
local_https,
|
|
36
|
-
local_cert,
|
|
37
|
-
local_key,
|
|
38
|
-
local_ca,
|
|
39
|
-
allow_invalid_cert,
|
|
40
|
-
};
|
|
21
|
+
close() {
|
|
22
|
+
this.closed = true;
|
|
23
|
+
this.emit('close');
|
|
41
24
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const body = res.data;
|
|
57
|
-
log('got tunnel information', res.data);
|
|
58
|
-
if (res.status !== 200) {
|
|
59
|
-
const err = new Error(body?.message || 'pipenet server returned an error, please try again');
|
|
60
|
-
return cb(err);
|
|
61
|
-
}
|
|
62
|
-
cb(null, getInfo(body));
|
|
63
|
-
})
|
|
64
|
-
.catch((err) => {
|
|
65
|
-
log(`tunnel server offline: ${err.message}, retry 1s`);
|
|
66
|
-
setTimeout(getUrl, 1000);
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
getUrl();
|
|
25
|
+
open(cb) {
|
|
26
|
+
this._init((err, info) => {
|
|
27
|
+
if (err) {
|
|
28
|
+
cb(err);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.clientId = info.name;
|
|
32
|
+
this.url = info.url;
|
|
33
|
+
if (info.cachedUrl) {
|
|
34
|
+
this.cachedUrl = info.cachedUrl;
|
|
35
|
+
}
|
|
36
|
+
this._establish(info);
|
|
37
|
+
cb();
|
|
38
|
+
});
|
|
70
39
|
}
|
|
71
40
|
_establish(info) {
|
|
72
|
-
this.setMaxListeners(info.
|
|
41
|
+
this.setMaxListeners(info.maxConn + (EventEmitter.defaultMaxListeners || 10));
|
|
73
42
|
this.tunnelCluster = new TunnelCluster(info);
|
|
74
43
|
this.tunnelCluster.once('open', () => {
|
|
75
44
|
this.emit('url', info.url);
|
|
@@ -105,28 +74,59 @@ export class Tunnel extends EventEmitter {
|
|
|
105
74
|
this.tunnelCluster.on('request', (req) => {
|
|
106
75
|
this.emit('request', req);
|
|
107
76
|
});
|
|
108
|
-
for (let count = 0; count < info.
|
|
77
|
+
for (let count = 0; count < info.maxConn; ++count) {
|
|
109
78
|
this.tunnelCluster.open();
|
|
110
79
|
}
|
|
111
80
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
81
|
+
_getInfo(body) {
|
|
82
|
+
const { cachedUrl, id, ip, maxConnCount, port, url } = body;
|
|
83
|
+
const { host, localHost, port: localPort } = this.opts;
|
|
84
|
+
const { allowInvalidCert, localCa, localCert, localHttps, localKey } = this.opts;
|
|
85
|
+
return {
|
|
86
|
+
allowInvalidCert,
|
|
87
|
+
cachedUrl,
|
|
88
|
+
localCa,
|
|
89
|
+
localCert,
|
|
90
|
+
localHost,
|
|
91
|
+
localHttps,
|
|
92
|
+
localKey,
|
|
93
|
+
localPort,
|
|
94
|
+
maxConn: maxConnCount || 1,
|
|
95
|
+
name: id,
|
|
96
|
+
remoteHost: new URL(host).hostname,
|
|
97
|
+
remoteIp: ip,
|
|
98
|
+
remotePort: port,
|
|
99
|
+
url,
|
|
100
|
+
};
|
|
126
101
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
this.
|
|
102
|
+
_init(cb) {
|
|
103
|
+
const opt = this.opts;
|
|
104
|
+
const getInfo = this._getInfo.bind(this);
|
|
105
|
+
const params = {
|
|
106
|
+
headers: opt.headers || {},
|
|
107
|
+
responseType: 'json',
|
|
108
|
+
};
|
|
109
|
+
const baseUri = `${opt.host}/`;
|
|
110
|
+
const assignedDomain = opt.subdomain;
|
|
111
|
+
const uri = baseUri + (assignedDomain || '?new');
|
|
112
|
+
const getUrl = () => {
|
|
113
|
+
axios
|
|
114
|
+
.get(uri, params)
|
|
115
|
+
.then((res) => {
|
|
116
|
+
const body = res.data;
|
|
117
|
+
log('got tunnel information', res.data);
|
|
118
|
+
if (res.status !== 200) {
|
|
119
|
+
const err = new Error(body?.message || 'pipenet server returned an error, please try again');
|
|
120
|
+
return cb(err);
|
|
121
|
+
}
|
|
122
|
+
cb(null, getInfo(body));
|
|
123
|
+
})
|
|
124
|
+
.catch((err) => {
|
|
125
|
+
log(`tunnel server offline: ${err.message}, retry 1s`);
|
|
126
|
+
setTimeout(getUrl, 1000);
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
getUrl();
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
//# sourceMappingURL=Tunnel.js.map
|
package/dist/Tunnel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tunnel.js","sourceRoot":"","sources":["../src/Tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Tunnel.js","sourceRoot":"","sources":["../src/Tunnel.ts"],"names":[],"mappings":"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"}
|
package/dist/TunnelCluster.d.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { EventEmitter } from 'events';
|
|
2
2
|
export interface TunnelClusterOptions {
|
|
3
|
+
allowInvalidCert?: boolean;
|
|
4
|
+
cachedUrl?: string;
|
|
5
|
+
localCa?: string;
|
|
6
|
+
localCert?: string;
|
|
7
|
+
localHost?: string;
|
|
8
|
+
localHttps?: boolean;
|
|
9
|
+
localKey?: string;
|
|
10
|
+
localPort?: number;
|
|
11
|
+
maxConn?: number;
|
|
3
12
|
name?: string;
|
|
13
|
+
remoteHost?: string;
|
|
14
|
+
remoteIp?: string;
|
|
15
|
+
remotePort?: number;
|
|
4
16
|
url?: string;
|
|
5
|
-
cached_url?: string;
|
|
6
|
-
max_conn?: number;
|
|
7
|
-
remote_host?: string;
|
|
8
|
-
remote_ip?: string;
|
|
9
|
-
remote_port?: number;
|
|
10
|
-
local_port?: number;
|
|
11
|
-
local_host?: string;
|
|
12
|
-
local_https?: boolean;
|
|
13
|
-
local_cert?: string;
|
|
14
|
-
local_key?: string;
|
|
15
|
-
local_ca?: string;
|
|
16
|
-
allow_invalid_cert?: boolean;
|
|
17
17
|
}
|
|
18
18
|
export interface TunnelRequest {
|
|
19
19
|
method: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TunnelCluster.d.ts","sourceRoot":"","sources":["../src/TunnelCluster.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TunnelCluster.d.ts","sourceRoot":"","sources":["../src/TunnelCluster.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAStC,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,IAAI,CAAuB;gBAEvB,IAAI,GAAE,oBAAyB;IAK3C,IAAI,IAAI,IAAI;CA4Hb"}
|
package/dist/TunnelCluster.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
1
|
import debug from 'debug';
|
|
2
|
+
import { EventEmitter } from 'events';
|
|
3
3
|
import fs from 'fs';
|
|
4
4
|
import net from 'net';
|
|
5
5
|
import tls from 'tls';
|
|
@@ -13,12 +13,12 @@ export class TunnelCluster extends EventEmitter {
|
|
|
13
13
|
}
|
|
14
14
|
open() {
|
|
15
15
|
const opt = this.opts;
|
|
16
|
-
const remoteHostOrIp = opt.
|
|
17
|
-
const remotePort = opt.
|
|
18
|
-
const localHost = opt.
|
|
19
|
-
const localPort = opt.
|
|
20
|
-
const localProtocol = opt.
|
|
21
|
-
const allowInvalidCert = opt.
|
|
16
|
+
const remoteHostOrIp = opt.remoteIp || opt.remoteHost;
|
|
17
|
+
const remotePort = opt.remotePort;
|
|
18
|
+
const localHost = opt.localHost || 'localhost';
|
|
19
|
+
const localPort = opt.localPort;
|
|
20
|
+
const localProtocol = opt.localHttps ? 'https' : 'http';
|
|
21
|
+
const allowInvalidCert = opt.allowInvalidCert;
|
|
22
22
|
log('establishing tunnel %s://%s:%s <> %s:%s', localProtocol, localHost, localPort, remoteHostOrIp, remotePort);
|
|
23
23
|
const remote = net.connect({
|
|
24
24
|
host: remoteHostOrIp,
|
|
@@ -46,11 +46,11 @@ export class TunnelCluster extends EventEmitter {
|
|
|
46
46
|
const getLocalCertOpts = () => allowInvalidCert
|
|
47
47
|
? { rejectUnauthorized: false }
|
|
48
48
|
: {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
ca: opt.localCa ? [fs.readFileSync(opt.localCa)] : undefined,
|
|
50
|
+
cert: fs.readFileSync(opt.localCert),
|
|
51
|
+
key: fs.readFileSync(opt.localKey),
|
|
52
52
|
};
|
|
53
|
-
const local = opt.
|
|
53
|
+
const local = opt.localHttps
|
|
54
54
|
? tls.connect({ host: localHost, port: localPort, ...getLocalCertOpts() })
|
|
55
55
|
: net.connect({ host: localHost, port: localPort });
|
|
56
56
|
const remoteClose = () => {
|
|
@@ -73,9 +73,9 @@ export class TunnelCluster extends EventEmitter {
|
|
|
73
73
|
log('connected locally');
|
|
74
74
|
remote.resume();
|
|
75
75
|
let stream = remote;
|
|
76
|
-
if (opt.
|
|
77
|
-
log('transform Host header to %s', opt.
|
|
78
|
-
stream = remote.pipe(new HeaderHostTransformer({ host: opt.
|
|
76
|
+
if (opt.localHost) {
|
|
77
|
+
log('transform Host header to %s', opt.localHost);
|
|
78
|
+
stream = remote.pipe(new HeaderHostTransformer({ host: opt.localHost }));
|
|
79
79
|
}
|
|
80
80
|
stream.pipe(local).pipe(remote);
|
|
81
81
|
local.once('close', (hadError) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TunnelCluster.js","sourceRoot":"","sources":["../src/TunnelCluster.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"TunnelCluster.js","sourceRoot":"","sources":["../src/TunnelCluster.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import yargs from 'yargs';
|
|
3
3
|
import { hideBin } from 'yargs/helpers';
|
|
4
|
-
import pipenet from './pipenet.js';
|
|
4
|
+
import { pipenet } from './pipenet.js';
|
|
5
5
|
import { createServer } from './server/index.js';
|
|
6
6
|
async function runClient(opts) {
|
|
7
7
|
let headers;
|
|
@@ -15,16 +15,16 @@ async function runClient(opts) {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
const tunnel = await pipenet({
|
|
18
|
-
|
|
18
|
+
allowInvalidCert: opts['allow-invalid-cert'],
|
|
19
|
+
headers,
|
|
19
20
|
host: opts.host,
|
|
21
|
+
localCa: opts['local-ca'],
|
|
22
|
+
localCert: opts['local-cert'],
|
|
23
|
+
localHost: opts['local-host'],
|
|
24
|
+
localHttps: opts['local-https'],
|
|
25
|
+
localKey: opts['local-key'],
|
|
26
|
+
port: opts.port,
|
|
20
27
|
subdomain: opts.subdomain,
|
|
21
|
-
local_host: opts['local-host'],
|
|
22
|
-
local_https: opts['local-https'],
|
|
23
|
-
local_cert: opts['local-cert'],
|
|
24
|
-
local_key: opts['local-key'],
|
|
25
|
-
local_ca: opts['local-ca'],
|
|
26
|
-
allow_invalid_cert: opts['allow-invalid-cert'],
|
|
27
|
-
headers,
|
|
28
28
|
});
|
|
29
29
|
console.log('your url is: %s', tunnel.url);
|
|
30
30
|
tunnel.on('error', (err) => {
|
|
@@ -46,9 +46,9 @@ async function runClient(opts) {
|
|
|
46
46
|
function runServer(opts) {
|
|
47
47
|
const server = createServer({
|
|
48
48
|
domain: opts.domain,
|
|
49
|
-
secure: opts.secure,
|
|
50
49
|
landing: opts.landing,
|
|
51
|
-
|
|
50
|
+
maxTcpSockets: opts['max-sockets'],
|
|
51
|
+
secure: opts.secure,
|
|
52
52
|
});
|
|
53
53
|
server.listen(opts.port, () => {
|
|
54
54
|
console.log('pipenet server listening on port %d', opts.port);
|
|
@@ -66,19 +66,20 @@ function runServer(opts) {
|
|
|
66
66
|
yargs(hideBin(process.argv))
|
|
67
67
|
.usage('Usage: pipenet <command> [options]')
|
|
68
68
|
.env(true)
|
|
69
|
-
.
|
|
69
|
+
.demandCommand(1, 'You must specify a command: client or server')
|
|
70
|
+
.command('client', 'Start a tunnel client', (yargs) => {
|
|
70
71
|
return yargs
|
|
71
72
|
.option('port', {
|
|
72
73
|
alias: 'p',
|
|
74
|
+
demandOption: true,
|
|
73
75
|
describe: 'Internal HTTP server port',
|
|
74
76
|
type: 'number',
|
|
75
|
-
demandOption: true,
|
|
76
77
|
})
|
|
77
78
|
.option('host', {
|
|
78
79
|
alias: 'h',
|
|
80
|
+
default: 'https://pipenet.dev',
|
|
79
81
|
describe: 'Upstream server providing forwarding',
|
|
80
82
|
type: 'string',
|
|
81
|
-
default: 'https://pipenet.dev',
|
|
82
83
|
})
|
|
83
84
|
.option('subdomain', {
|
|
84
85
|
alias: 's',
|
|
@@ -87,8 +88,8 @@ yargs(hideBin(process.argv))
|
|
|
87
88
|
})
|
|
88
89
|
.option('local-host', {
|
|
89
90
|
alias: 'l',
|
|
90
|
-
describe: 'Tunnel traffic to this host instead of localhost',
|
|
91
91
|
default: 'localhost',
|
|
92
|
+
describe: 'Tunnel traffic to this host instead of localhost',
|
|
92
93
|
type: 'string',
|
|
93
94
|
})
|
|
94
95
|
.option('local-https', {
|
|
@@ -129,9 +130,9 @@ yargs(hideBin(process.argv))
|
|
|
129
130
|
return yargs
|
|
130
131
|
.option('port', {
|
|
131
132
|
alias: 'p',
|
|
133
|
+
default: 3000,
|
|
132
134
|
describe: 'Port for the server to listen on',
|
|
133
135
|
type: 'number',
|
|
134
|
-
default: 3000,
|
|
135
136
|
})
|
|
136
137
|
.option('domain', {
|
|
137
138
|
alias: 'd',
|
|
@@ -139,18 +140,18 @@ yargs(hideBin(process.argv))
|
|
|
139
140
|
type: 'string',
|
|
140
141
|
})
|
|
141
142
|
.option('secure', {
|
|
143
|
+
default: false,
|
|
142
144
|
describe: 'Require HTTPS connections',
|
|
143
145
|
type: 'boolean',
|
|
144
|
-
default: false,
|
|
145
146
|
})
|
|
146
147
|
.option('landing', {
|
|
147
148
|
describe: 'URL to redirect root requests to',
|
|
148
149
|
type: 'string',
|
|
149
150
|
})
|
|
150
151
|
.option('max-sockets', {
|
|
152
|
+
default: 10,
|
|
151
153
|
describe: 'Maximum number of TCP sockets per client',
|
|
152
154
|
type: 'number',
|
|
153
|
-
default: 10,
|
|
154
155
|
});
|
|
155
156
|
}, (argv) => {
|
|
156
157
|
runServer(argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/pipenet.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Tunnel, TunnelOptions } from './Tunnel.js';
|
|
2
|
+
export { HeaderHostTransformer } from './HeaderHostTransformer.js';
|
|
2
3
|
export type { TunnelOptions } from './Tunnel.js';
|
|
3
|
-
export type { TunnelClusterOptions, TunnelRequest } from './TunnelCluster.js';
|
|
4
4
|
export { Tunnel } from './Tunnel.js';
|
|
5
|
+
export type { TunnelClusterOptions, TunnelRequest } from './TunnelCluster.js';
|
|
5
6
|
export { TunnelCluster } from './TunnelCluster.js';
|
|
6
|
-
export { HeaderHostTransformer } from './HeaderHostTransformer.js';
|
|
7
7
|
export type TunnelCallback = (err: Error | null, tunnel?: Tunnel) => void;
|
|
8
|
-
type OptionsWithPort =
|
|
8
|
+
type OptionsWithPort = {
|
|
9
9
|
port: number;
|
|
10
|
-
};
|
|
10
|
+
} & TunnelOptions;
|
|
11
11
|
declare function pipenet(port: number): Promise<Tunnel>;
|
|
12
12
|
declare function pipenet(opts: OptionsWithPort): Promise<Tunnel>;
|
|
13
13
|
declare function pipenet(port: number, opts: TunnelOptions): Promise<Tunnel>;
|
|
14
14
|
declare function pipenet(opts: OptionsWithPort, callback: TunnelCallback): Tunnel;
|
|
15
15
|
declare function pipenet(port: number, opts: TunnelOptions, callback: TunnelCallback): Tunnel;
|
|
16
|
-
export
|
|
16
|
+
export { pipenet };
|
|
17
17
|
//# sourceMappingURL=pipenet.d.ts.map
|
package/dist/pipenet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipenet.d.ts","sourceRoot":"","sources":["../src/pipenet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpD,
|
|
1
|
+
{"version":3,"file":"pipenet.d.ts","sourceRoot":"","sources":["../src/pipenet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1E,KAAK,eAAe,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAAC;AAExD,iBAAS,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAChD,iBAAS,OAAO,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACzD,iBAAS,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AACrE,iBAAS,OAAO,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC;AAC1E,iBAAS,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,CAAC;AAqBtF,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/pipenet.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Tunnel } from './Tunnel.js';
|
|
2
|
+
export { HeaderHostTransformer } from './HeaderHostTransformer.js';
|
|
2
3
|
export { Tunnel } from './Tunnel.js';
|
|
3
4
|
export { TunnelCluster } from './TunnelCluster.js';
|
|
4
|
-
export { HeaderHostTransformer } from './HeaderHostTransformer.js';
|
|
5
5
|
function pipenet(arg1, arg2, arg3) {
|
|
6
6
|
const options = typeof arg1 === 'object' ? arg1 : { ...arg2, port: arg1 };
|
|
7
7
|
const callback = typeof arg1 === 'object' ? arg2 : arg3;
|
|
@@ -12,5 +12,5 @@ function pipenet(arg1, arg2, arg3) {
|
|
|
12
12
|
}
|
|
13
13
|
return new Promise((resolve, reject) => client.open((err) => (err ? reject(err) : resolve(client))));
|
|
14
14
|
}
|
|
15
|
-
export
|
|
15
|
+
export { pipenet };
|
|
16
16
|
//# sourceMappingURL=pipenet.js.map
|