nport 2.1.0 → 2.1.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/CHANGELOG.md +17 -0
- package/dist/analytics.d.ts +59 -0
- package/dist/analytics.js +193 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api.d.ts +20 -0
- package/dist/api.js +85 -0
- package/dist/api.js.map +1 -0
- package/dist/args.d.ts +44 -0
- package/dist/args.js +127 -0
- package/dist/args.js.map +1 -0
- package/dist/bin-manager.d.ts +1 -0
- package/dist/bin-manager.js +209 -0
- package/dist/bin-manager.js.map +1 -0
- package/dist/binary.d.ts +42 -0
- package/dist/binary.js +119 -0
- package/dist/binary.js.map +1 -0
- package/dist/config-manager.d.ts +54 -0
- package/dist/config-manager.js +129 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +61 -0
- package/dist/constants.js +86 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/lang.d.ts +38 -0
- package/dist/lang.js +217 -0
- package/dist/lang.js.map +1 -0
- package/dist/state.d.ts +82 -0
- package/dist/state.js +139 -0
- package/dist/state.js.map +1 -0
- package/dist/tunnel.d.ts +16 -0
- package/dist/tunnel.js +101 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/types/analytics.d.ts +91 -0
- package/dist/types/analytics.js +8 -0
- package/dist/types/analytics.js.map +1 -0
- package/dist/types/config.d.ts +89 -0
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/i18n.d.ts +75 -0
- package/dist/types/i18n.js +5 -0
- package/dist/types/i18n.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/tunnel.d.ts +74 -0
- package/dist/types/tunnel.js +8 -0
- package/dist/types/tunnel.js.map +1 -0
- package/dist/types/version.d.ts +25 -0
- package/dist/types/version.js +5 -0
- package/dist/types/version.js.map +1 -0
- package/dist/ui.d.ts +54 -0
- package/dist/ui.js +120 -0
- package/dist/ui.js.map +1 -0
- package/dist/version.d.ts +16 -0
- package/dist/version.js +49 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
package/dist/state.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application State Manager
|
|
3
|
+
*
|
|
4
|
+
* Singleton class that manages all runtime state for the tunnel.
|
|
5
|
+
*/
|
|
6
|
+
class TunnelState {
|
|
7
|
+
tunnelId = null;
|
|
8
|
+
subdomain = null;
|
|
9
|
+
port = null;
|
|
10
|
+
backendUrl = null;
|
|
11
|
+
tunnelProcess = null;
|
|
12
|
+
timeoutId = null;
|
|
13
|
+
connectionCount = 0;
|
|
14
|
+
startTime = null;
|
|
15
|
+
updateInfo = null;
|
|
16
|
+
// Network issue tracking
|
|
17
|
+
networkIssueCount = 0;
|
|
18
|
+
lastNetworkWarningTime = 0;
|
|
19
|
+
networkWarningShown = false;
|
|
20
|
+
/**
|
|
21
|
+
* Sets the tunnel connection information.
|
|
22
|
+
*/
|
|
23
|
+
setTunnel(tunnelId, subdomain, port, backendUrl = null) {
|
|
24
|
+
this.tunnelId = tunnelId;
|
|
25
|
+
this.subdomain = subdomain;
|
|
26
|
+
this.port = port;
|
|
27
|
+
this.backendUrl = backendUrl;
|
|
28
|
+
if (!this.startTime) {
|
|
29
|
+
this.startTime = Date.now();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Stores version update information.
|
|
34
|
+
*/
|
|
35
|
+
setUpdateInfo(updateInfo) {
|
|
36
|
+
this.updateInfo = updateInfo;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stores reference to the cloudflared child process.
|
|
40
|
+
*/
|
|
41
|
+
setProcess(process) {
|
|
42
|
+
this.tunnelProcess = process;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stores the auto-cleanup timeout ID.
|
|
46
|
+
*/
|
|
47
|
+
setTimeout(timeoutId) {
|
|
48
|
+
this.timeoutId = timeoutId;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Clears the auto-cleanup timeout if set.
|
|
52
|
+
*/
|
|
53
|
+
clearTimeout() {
|
|
54
|
+
if (this.timeoutId) {
|
|
55
|
+
clearTimeout(this.timeoutId);
|
|
56
|
+
this.timeoutId = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Increments the connection count and returns the new value.
|
|
61
|
+
*/
|
|
62
|
+
incrementConnection() {
|
|
63
|
+
this.connectionCount++;
|
|
64
|
+
return this.connectionCount;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Checks if a tunnel is currently active.
|
|
68
|
+
*/
|
|
69
|
+
hasTunnel() {
|
|
70
|
+
return this.tunnelId !== null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks if the cloudflared process is running.
|
|
74
|
+
*/
|
|
75
|
+
hasProcess() {
|
|
76
|
+
return this.tunnelProcess !== null && !this.tunnelProcess.killed;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Gets the tunnel duration in seconds.
|
|
80
|
+
*/
|
|
81
|
+
getDurationSeconds() {
|
|
82
|
+
if (!this.startTime)
|
|
83
|
+
return 0;
|
|
84
|
+
return (Date.now() - this.startTime) / 1000;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Increments the network issue counter.
|
|
88
|
+
*/
|
|
89
|
+
incrementNetworkIssue() {
|
|
90
|
+
this.networkIssueCount++;
|
|
91
|
+
return this.networkIssueCount;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Resets the network issue counter.
|
|
95
|
+
*/
|
|
96
|
+
resetNetworkIssues() {
|
|
97
|
+
this.networkIssueCount = 0;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Determines if a network warning should be shown.
|
|
101
|
+
*/
|
|
102
|
+
shouldShowNetworkWarning(threshold, cooldown) {
|
|
103
|
+
const now = Date.now();
|
|
104
|
+
if (this.networkIssueCount >= threshold &&
|
|
105
|
+
now - this.lastNetworkWarningTime > cooldown) {
|
|
106
|
+
this.lastNetworkWarningTime = now;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Sets whether a network warning has been shown.
|
|
113
|
+
*/
|
|
114
|
+
setNetworkWarningShown(value) {
|
|
115
|
+
this.networkWarningShown = value;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Resets all state to initial values.
|
|
119
|
+
*/
|
|
120
|
+
reset() {
|
|
121
|
+
this.clearTimeout();
|
|
122
|
+
this.tunnelId = null;
|
|
123
|
+
this.subdomain = null;
|
|
124
|
+
this.port = null;
|
|
125
|
+
this.backendUrl = null;
|
|
126
|
+
this.tunnelProcess = null;
|
|
127
|
+
this.connectionCount = 0;
|
|
128
|
+
this.startTime = null;
|
|
129
|
+
this.updateInfo = null;
|
|
130
|
+
this.networkIssueCount = 0;
|
|
131
|
+
this.lastNetworkWarningTime = 0;
|
|
132
|
+
this.networkWarningShown = false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Singleton instance
|
|
137
|
+
*/
|
|
138
|
+
export const state = new TunnelState();
|
|
139
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TunnelConfig, ShutdownReason } from './types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Tunnel Orchestrator
|
|
4
|
+
*
|
|
5
|
+
* Main controller for the entire tunnel lifecycle.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TunnelOrchestrator {
|
|
8
|
+
/**
|
|
9
|
+
* Starts the tunnel creation process.
|
|
10
|
+
*/
|
|
11
|
+
static start(config: TunnelConfig): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Gracefully shuts down the tunnel.
|
|
14
|
+
*/
|
|
15
|
+
static cleanup(reason?: ShutdownReason): Promise<void>;
|
|
16
|
+
}
|
package/dist/tunnel.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import { CONFIG, PATHS, TUNNEL_TIMEOUT_MS } from './config.js';
|
|
5
|
+
import { state } from './state.js';
|
|
6
|
+
import { BinaryManager } from './binary.js';
|
|
7
|
+
import { ensureCloudflared } from './bin-manager.js';
|
|
8
|
+
import { APIClient } from './api.js';
|
|
9
|
+
import { VersionManager } from './version.js';
|
|
10
|
+
import { UI } from './ui.js';
|
|
11
|
+
import { analytics } from './analytics.js';
|
|
12
|
+
import { lang } from './lang.js';
|
|
13
|
+
/**
|
|
14
|
+
* Tunnel Orchestrator
|
|
15
|
+
*
|
|
16
|
+
* Main controller for the entire tunnel lifecycle.
|
|
17
|
+
*/
|
|
18
|
+
export class TunnelOrchestrator {
|
|
19
|
+
/**
|
|
20
|
+
* Starts the tunnel creation process.
|
|
21
|
+
*/
|
|
22
|
+
static async start(config) {
|
|
23
|
+
state.setTunnel(null, config.subdomain, config.port, config.backendUrl);
|
|
24
|
+
await analytics.initialize();
|
|
25
|
+
analytics.trackCliStart(config.port, config.subdomain, CONFIG.CURRENT_VERSION);
|
|
26
|
+
UI.displayStartupBanner(config.port);
|
|
27
|
+
const updateInfo = await VersionManager.checkForUpdates();
|
|
28
|
+
state.setUpdateInfo(updateInfo);
|
|
29
|
+
// Check if binary exists, download if missing
|
|
30
|
+
if (!fs.existsSync(PATHS.BIN_PATH)) {
|
|
31
|
+
console.log(chalk.yellow('\n📦 Cloudflared binary not found. Downloading...\n'));
|
|
32
|
+
try {
|
|
33
|
+
await ensureCloudflared();
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
analytics.trackTunnelError('binary_download_failed', error.message);
|
|
37
|
+
console.error(chalk.red(`\n❌ Failed to download cloudflared: ${error.message}`));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (!BinaryManager.validate(PATHS.BIN_PATH)) {
|
|
42
|
+
analytics.trackTunnelError('binary_missing', 'Cloudflared binary not found');
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const spinner = ora(lang.t('creatingTunnel', { port: config.port })).start();
|
|
47
|
+
try {
|
|
48
|
+
const tunnel = await APIClient.createTunnel(config.subdomain, config.backendUrl);
|
|
49
|
+
state.setTunnel(tunnel.tunnelId, config.subdomain, config.port, config.backendUrl);
|
|
50
|
+
analytics.trackTunnelCreated(config.subdomain, config.port);
|
|
51
|
+
spinner.stop();
|
|
52
|
+
console.log(chalk.green(` ${lang.t('tunnelLive')}`));
|
|
53
|
+
UI.displayTunnelSuccess(tunnel.url, config.port, updateInfo);
|
|
54
|
+
const childProcess = BinaryManager.spawn(PATHS.BIN_PATH, tunnel.tunnelToken, config.port);
|
|
55
|
+
state.setProcess(childProcess);
|
|
56
|
+
BinaryManager.attachHandlers(childProcess, spinner);
|
|
57
|
+
const timeoutId = setTimeout(() => {
|
|
58
|
+
UI.displayTimeoutWarning();
|
|
59
|
+
this.cleanup('timeout');
|
|
60
|
+
}, TUNNEL_TIMEOUT_MS);
|
|
61
|
+
state.setTimeout(timeoutId);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const err = error;
|
|
65
|
+
const errorType = err.message.includes('already taken')
|
|
66
|
+
? 'subdomain_taken'
|
|
67
|
+
: 'tunnel_creation_failed';
|
|
68
|
+
analytics.trackTunnelError(errorType, err.message);
|
|
69
|
+
UI.displayError(err, spinner);
|
|
70
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Gracefully shuts down the tunnel.
|
|
76
|
+
*/
|
|
77
|
+
static async cleanup(reason = 'manual') {
|
|
78
|
+
state.clearTimeout();
|
|
79
|
+
if (!state.hasTunnel()) {
|
|
80
|
+
process.exit(0);
|
|
81
|
+
}
|
|
82
|
+
UI.displayCleanupStart();
|
|
83
|
+
const duration = state.getDurationSeconds();
|
|
84
|
+
analytics.trackTunnelShutdown(reason, duration);
|
|
85
|
+
try {
|
|
86
|
+
if (state.hasProcess() && state.tunnelProcess) {
|
|
87
|
+
state.tunnelProcess.kill();
|
|
88
|
+
}
|
|
89
|
+
if (state.subdomain && state.tunnelId) {
|
|
90
|
+
await APIClient.deleteTunnel(state.subdomain, state.tunnelId, state.backendUrl);
|
|
91
|
+
}
|
|
92
|
+
UI.displayCleanupSuccess();
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
UI.displayCleanupError();
|
|
96
|
+
}
|
|
97
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics type definitions
|
|
3
|
+
*
|
|
4
|
+
* These types define the structure of analytics events
|
|
5
|
+
* and tracking data.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Base analytics event
|
|
9
|
+
*/
|
|
10
|
+
export interface AnalyticsEvent {
|
|
11
|
+
/** Event name */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Event parameters */
|
|
14
|
+
params: Record<string, string | number | boolean>;
|
|
15
|
+
/** Timestamp when event occurred */
|
|
16
|
+
timestamp?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* CLI start event parameters
|
|
20
|
+
*/
|
|
21
|
+
export interface CliStartEventParams {
|
|
22
|
+
/** Port being tunneled */
|
|
23
|
+
port: string;
|
|
24
|
+
/** Whether a custom subdomain was provided */
|
|
25
|
+
has_custom_subdomain: boolean;
|
|
26
|
+
/** CLI version */
|
|
27
|
+
cli_version: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tunnel created event parameters
|
|
31
|
+
*/
|
|
32
|
+
export interface TunnelCreatedEventParams {
|
|
33
|
+
/** Type of subdomain (random or custom) */
|
|
34
|
+
subdomain_type: 'random' | 'custom';
|
|
35
|
+
/** Port being tunneled */
|
|
36
|
+
port: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Tunnel error event parameters
|
|
40
|
+
*/
|
|
41
|
+
export interface TunnelErrorEventParams {
|
|
42
|
+
/** Type of error */
|
|
43
|
+
error_type: string;
|
|
44
|
+
/** Error message (truncated) */
|
|
45
|
+
error_message: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Tunnel shutdown event parameters
|
|
49
|
+
*/
|
|
50
|
+
export interface TunnelShutdownEventParams {
|
|
51
|
+
/** Reason for shutdown */
|
|
52
|
+
shutdown_reason: 'manual' | 'timeout' | 'error';
|
|
53
|
+
/** Duration in seconds */
|
|
54
|
+
duration_seconds: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Update available event parameters
|
|
58
|
+
*/
|
|
59
|
+
export interface UpdateAvailableEventParams {
|
|
60
|
+
/** Current version */
|
|
61
|
+
current_version: string;
|
|
62
|
+
/** Latest version */
|
|
63
|
+
latest_version: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* System information for analytics context
|
|
67
|
+
*/
|
|
68
|
+
export interface SystemInfo {
|
|
69
|
+
/** Operating system platform */
|
|
70
|
+
os_platform: string;
|
|
71
|
+
/** OS version */
|
|
72
|
+
os_version: string;
|
|
73
|
+
/** CPU architecture */
|
|
74
|
+
os_arch: string;
|
|
75
|
+
/** Node.js version */
|
|
76
|
+
node_version: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* GA4 Measurement Protocol payload
|
|
80
|
+
*/
|
|
81
|
+
export interface GA4Payload {
|
|
82
|
+
/** Client ID (user identifier) */
|
|
83
|
+
client_id: string;
|
|
84
|
+
/** Array of events */
|
|
85
|
+
events: Array<{
|
|
86
|
+
/** Event name */
|
|
87
|
+
name: string;
|
|
88
|
+
/** Event parameters */
|
|
89
|
+
params: Record<string, string | number | boolean>;
|
|
90
|
+
}>;
|
|
91
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/types/analytics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration type definitions
|
|
3
|
+
*
|
|
4
|
+
* These types define the structure of application configuration,
|
|
5
|
+
* user preferences, and runtime settings.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Parsed command-line arguments
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedArguments {
|
|
11
|
+
/** Local port to tunnel (default: 8080) */
|
|
12
|
+
port: number;
|
|
13
|
+
/** Subdomain to use (generated if not provided) */
|
|
14
|
+
subdomain: string;
|
|
15
|
+
/** Language code, 'prompt', or null */
|
|
16
|
+
language: string | null;
|
|
17
|
+
/** Custom backend URL or null */
|
|
18
|
+
backendUrl: string | null;
|
|
19
|
+
/** Backend URL to save, 'clear', or null */
|
|
20
|
+
setBackend: string | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* User configuration stored in ~/.nport/config.json
|
|
24
|
+
*/
|
|
25
|
+
export interface UserConfig {
|
|
26
|
+
/** Preferred language code (e.g., "en", "vi") */
|
|
27
|
+
language?: string;
|
|
28
|
+
/** Custom backend URL */
|
|
29
|
+
backendUrl?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Application constants configuration
|
|
33
|
+
*/
|
|
34
|
+
export interface AppConfig {
|
|
35
|
+
/** npm package name */
|
|
36
|
+
PACKAGE_NAME: string;
|
|
37
|
+
/** Current package version */
|
|
38
|
+
CURRENT_VERSION: string;
|
|
39
|
+
/** Backend API URL */
|
|
40
|
+
BACKEND_URL: string;
|
|
41
|
+
/** Default port if not specified */
|
|
42
|
+
DEFAULT_PORT: number;
|
|
43
|
+
/** Prefix for random subdomains */
|
|
44
|
+
SUBDOMAIN_PREFIX: string;
|
|
45
|
+
/** Auto-cleanup timeout in hours */
|
|
46
|
+
TUNNEL_TIMEOUT_HOURS: number;
|
|
47
|
+
/** Timeout for npm version check in ms */
|
|
48
|
+
UPDATE_CHECK_TIMEOUT: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Platform-specific configuration
|
|
52
|
+
*/
|
|
53
|
+
export interface PlatformConfig {
|
|
54
|
+
/** True if running on Windows */
|
|
55
|
+
IS_WINDOWS: boolean;
|
|
56
|
+
/** Binary filename ("cloudflared" or "cloudflared.exe") */
|
|
57
|
+
BIN_NAME: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* File system paths configuration
|
|
61
|
+
*/
|
|
62
|
+
export interface PathsConfig {
|
|
63
|
+
/** Directory containing the cloudflared binary */
|
|
64
|
+
BIN_DIR: string;
|
|
65
|
+
/** Full path to the cloudflared binary */
|
|
66
|
+
BIN_PATH: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Log pattern categories for filtering cloudflared output
|
|
70
|
+
*/
|
|
71
|
+
export interface LogPatterns {
|
|
72
|
+
/** Patterns indicating successful connection */
|
|
73
|
+
readonly SUCCESS: readonly string[];
|
|
74
|
+
/** Patterns indicating critical errors */
|
|
75
|
+
readonly ERROR: readonly string[];
|
|
76
|
+
/** Patterns for network connectivity issues */
|
|
77
|
+
readonly NETWORK_WARNING: readonly string[];
|
|
78
|
+
/** Patterns for harmless messages to suppress */
|
|
79
|
+
readonly IGNORE: readonly string[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Network warning display configuration
|
|
83
|
+
*/
|
|
84
|
+
export interface NetworkConfig {
|
|
85
|
+
/** Number of errors before showing warning */
|
|
86
|
+
WARNING_THRESHOLD: number;
|
|
87
|
+
/** Minimum ms between warnings */
|
|
88
|
+
WARNING_COOLDOWN: number;
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization type definitions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Supported language codes
|
|
6
|
+
*/
|
|
7
|
+
export type LanguageCode = 'en' | 'vi';
|
|
8
|
+
/**
|
|
9
|
+
* Translation keys used in the application
|
|
10
|
+
*/
|
|
11
|
+
export interface TranslationKeys {
|
|
12
|
+
header: string;
|
|
13
|
+
creatingTunnel: string;
|
|
14
|
+
checkingUpdates: string;
|
|
15
|
+
tunnelLive: string;
|
|
16
|
+
connection1: string;
|
|
17
|
+
connection2: string;
|
|
18
|
+
timeRemaining: string;
|
|
19
|
+
footerTitle: string;
|
|
20
|
+
footerSubtitle: string;
|
|
21
|
+
dropStar: string;
|
|
22
|
+
sendCoffee: string;
|
|
23
|
+
newVersion: string;
|
|
24
|
+
updateCommand: string;
|
|
25
|
+
tunnelShutdown: string;
|
|
26
|
+
cleaningUp: string;
|
|
27
|
+
cleanupDone: string;
|
|
28
|
+
cleanupFailed: string;
|
|
29
|
+
subdomainReleased: string;
|
|
30
|
+
serverBusy: string;
|
|
31
|
+
goodbyeTitle: string;
|
|
32
|
+
goodbyeMessage: string;
|
|
33
|
+
website: string;
|
|
34
|
+
author: string;
|
|
35
|
+
changeLanguage: string;
|
|
36
|
+
changeLanguageHint: string;
|
|
37
|
+
versionTitle: string;
|
|
38
|
+
versionSubtitle: string;
|
|
39
|
+
versionLatest: string;
|
|
40
|
+
versionAvailable: string;
|
|
41
|
+
versionUpdate: string;
|
|
42
|
+
learnMore: string;
|
|
43
|
+
languagePrompt: string;
|
|
44
|
+
languageQuestion: string;
|
|
45
|
+
languageEnglish: string;
|
|
46
|
+
languageVietnamese: string;
|
|
47
|
+
languageInvalid: string;
|
|
48
|
+
languageSaved: string;
|
|
49
|
+
networkIssueTitle: string;
|
|
50
|
+
networkIssueDesc: string;
|
|
51
|
+
networkIssueTunnel: string;
|
|
52
|
+
networkIssueReasons: string;
|
|
53
|
+
networkIssueReason1: string;
|
|
54
|
+
networkIssueReason2: string;
|
|
55
|
+
networkIssueReason3: string;
|
|
56
|
+
networkIssueFix: string;
|
|
57
|
+
networkIssueFix1: string;
|
|
58
|
+
networkIssueFix2: string;
|
|
59
|
+
networkIssueFix3: string;
|
|
60
|
+
networkIssueFix4: string;
|
|
61
|
+
networkIssueIgnore: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Translation dictionary for all languages
|
|
65
|
+
*/
|
|
66
|
+
export type Translations = Record<LanguageCode, TranslationKeys>;
|
|
67
|
+
/**
|
|
68
|
+
* Variables that can be substituted in translation strings
|
|
69
|
+
*/
|
|
70
|
+
export interface TranslationVariables {
|
|
71
|
+
port?: number;
|
|
72
|
+
hours?: number;
|
|
73
|
+
version?: string;
|
|
74
|
+
[key: string]: string | number | undefined;
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/types/i18n.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPort - Shared Types
|
|
3
|
+
*
|
|
4
|
+
* Central export for all type definitions used across the application.
|
|
5
|
+
*/
|
|
6
|
+
export type { TunnelConfig, TunnelResponse, ApiResponse, CreateTunnelApiResponse, TunnelState, ShutdownReason, TunnelEvent, } from './tunnel.js';
|
|
7
|
+
export type { ParsedArguments, UserConfig, AppConfig, PlatformConfig, PathsConfig, LogPatterns, NetworkConfig, } from './config.js';
|
|
8
|
+
export type { AnalyticsEvent, CliStartEventParams, TunnelCreatedEventParams, TunnelErrorEventParams, TunnelShutdownEventParams, UpdateAvailableEventParams, SystemInfo, GA4Payload, } from './analytics.js';
|
|
9
|
+
export type { UpdateCheckResult, NpmPackageInfo, } from './version.js';
|
|
10
|
+
export type { LanguageCode, TranslationKeys, Translations, TranslationVariables, } from './i18n.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel-related type definitions
|
|
3
|
+
*
|
|
4
|
+
* These types define the data structures used for tunnel creation,
|
|
5
|
+
* management, and communication between CLI and backend.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Configuration for creating a new tunnel
|
|
9
|
+
*/
|
|
10
|
+
export interface TunnelConfig {
|
|
11
|
+
/** Local port to tunnel (e.g., 3000) */
|
|
12
|
+
port: number;
|
|
13
|
+
/** Subdomain to use (e.g., "myapp" for myapp.nport.link) */
|
|
14
|
+
subdomain: string;
|
|
15
|
+
/** Custom backend URL or null for default */
|
|
16
|
+
backendUrl: string | null;
|
|
17
|
+
/** Language code or null for default */
|
|
18
|
+
language: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Response from the backend after creating a tunnel
|
|
22
|
+
*/
|
|
23
|
+
export interface TunnelResponse {
|
|
24
|
+
/** UUID of the created tunnel */
|
|
25
|
+
tunnelId: string;
|
|
26
|
+
/** Base64-encoded token for cloudflared authentication */
|
|
27
|
+
tunnelToken: string;
|
|
28
|
+
/** Full HTTPS URL of the tunnel (e.g., "https://myapp.nport.link") */
|
|
29
|
+
url: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Backend API response wrapper
|
|
33
|
+
*/
|
|
34
|
+
export interface ApiResponse<T = unknown> {
|
|
35
|
+
/** Whether the request was successful */
|
|
36
|
+
success: boolean;
|
|
37
|
+
/** Error message if success is false */
|
|
38
|
+
error?: string;
|
|
39
|
+
/** Response data if success is true */
|
|
40
|
+
data?: T;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create tunnel API response
|
|
44
|
+
*/
|
|
45
|
+
export interface CreateTunnelApiResponse extends ApiResponse {
|
|
46
|
+
tunnelId?: string;
|
|
47
|
+
tunnelToken?: string;
|
|
48
|
+
url?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Tunnel state information
|
|
52
|
+
*/
|
|
53
|
+
export interface TunnelState {
|
|
54
|
+
/** UUID of the current tunnel */
|
|
55
|
+
tunnelId: string | null;
|
|
56
|
+
/** Current subdomain */
|
|
57
|
+
subdomain: string | null;
|
|
58
|
+
/** Local port being tunneled */
|
|
59
|
+
port: number | null;
|
|
60
|
+
/** Custom backend URL */
|
|
61
|
+
backendUrl: string | null;
|
|
62
|
+
/** Number of established connections */
|
|
63
|
+
connectionCount: number;
|
|
64
|
+
/** Timestamp when tunnel was created */
|
|
65
|
+
startTime: number | null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Shutdown reason types
|
|
69
|
+
*/
|
|
70
|
+
export type ShutdownReason = 'manual' | 'timeout' | 'error';
|
|
71
|
+
/**
|
|
72
|
+
* Tunnel lifecycle events
|
|
73
|
+
*/
|
|
74
|
+
export type TunnelEvent = 'created' | 'connected' | 'disconnected' | 'error' | 'shutdown';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/types/tunnel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|