opencode-mobile 1.0.0
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/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/push-notifications.d.ts +4 -0
- package/dist/push-notifications.d.ts.map +1 -0
- package/dist/push-notifications.js +299 -0
- package/dist/push-notifications.js.map +1 -0
- package/dist/reverse-proxy.d.ts +9 -0
- package/dist/reverse-proxy.d.ts.map +1 -0
- package/dist/reverse-proxy.js +72 -0
- package/dist/reverse-proxy.js.map +1 -0
- package/dist/sdk-logger.d.ts +17 -0
- package/dist/sdk-logger.d.ts.map +1 -0
- package/dist/sdk-logger.js +94 -0
- package/dist/sdk-logger.js.map +1 -0
- package/dist/src/push/formatter.d.ts +25 -0
- package/dist/src/push/formatter.d.ts.map +1 -0
- package/dist/src/push/formatter.js +142 -0
- package/dist/src/push/formatter.js.map +1 -0
- package/dist/src/push/index.d.ts +8 -0
- package/dist/src/push/index.d.ts.map +1 -0
- package/dist/src/push/index.js +8 -0
- package/dist/src/push/index.js.map +1 -0
- package/dist/src/push/sender.d.ts +9 -0
- package/dist/src/push/sender.d.ts.map +1 -0
- package/dist/src/push/sender.js +75 -0
- package/dist/src/push/sender.js.map +1 -0
- package/dist/src/push/token-store.d.ts +17 -0
- package/dist/src/push/token-store.d.ts.map +1 -0
- package/dist/src/push/token-store.js +42 -0
- package/dist/src/push/token-store.js.map +1 -0
- package/dist/src/push/types.d.ts +51 -0
- package/dist/src/push/types.d.ts.map +1 -0
- package/dist/src/push/types.js +5 -0
- package/dist/src/push/types.js.map +1 -0
- package/dist/src/tunnel/cloudflare.d.ts +17 -0
- package/dist/src/tunnel/cloudflare.d.ts.map +1 -0
- package/dist/src/tunnel/cloudflare.js +74 -0
- package/dist/src/tunnel/cloudflare.js.map +1 -0
- package/dist/src/tunnel/index.d.ts +31 -0
- package/dist/src/tunnel/index.d.ts.map +1 -0
- package/dist/src/tunnel/index.js +83 -0
- package/dist/src/tunnel/index.js.map +1 -0
- package/dist/src/tunnel/localtunnel.d.ts +13 -0
- package/dist/src/tunnel/localtunnel.d.ts.map +1 -0
- package/dist/src/tunnel/localtunnel.js +31 -0
- package/dist/src/tunnel/localtunnel.js.map +1 -0
- package/dist/src/tunnel/ngrok.d.ts +21 -0
- package/dist/src/tunnel/ngrok.d.ts.map +1 -0
- package/dist/src/tunnel/ngrok.js +91 -0
- package/dist/src/tunnel/ngrok.js.map +1 -0
- package/dist/src/tunnel/qrcode.d.ts +12 -0
- package/dist/src/tunnel/qrcode.d.ts.map +1 -0
- package/dist/src/tunnel/qrcode.js +24 -0
- package/dist/src/tunnel/qrcode.js.map +1 -0
- package/dist/src/tunnel/types.d.ts +32 -0
- package/dist/src/tunnel/types.d.ts.map +1 -0
- package/dist/src/tunnel/types.js +5 -0
- package/dist/src/tunnel/types.js.map +1 -0
- package/dist/src/utils/port.d.ts +12 -0
- package/dist/src/utils/port.d.ts.map +1 -0
- package/dist/src/utils/port.js +41 -0
- package/dist/src/utils/port.js.map +1 -0
- package/dist/tunnel-manager.d.ts +30 -0
- package/dist/tunnel-manager.d.ts.map +1 -0
- package/dist/tunnel-manager.js +639 -0
- package/dist/tunnel-manager.js.map +1 -0
- package/package.json +60 -0
- package/push-notifications.ts +346 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Localtunnel tunnel provider implementation
|
|
3
|
+
*/
|
|
4
|
+
import localtunnel from "localtunnel";
|
|
5
|
+
let localtunnelInstance = null;
|
|
6
|
+
/**
|
|
7
|
+
* Start a localtunnel
|
|
8
|
+
*/
|
|
9
|
+
export async function startLocaltunnel(config) {
|
|
10
|
+
const tunnel = await localtunnel({
|
|
11
|
+
port: config.port,
|
|
12
|
+
subdomain: config.subdomain,
|
|
13
|
+
});
|
|
14
|
+
localtunnelInstance = tunnel;
|
|
15
|
+
return {
|
|
16
|
+
url: tunnel.url,
|
|
17
|
+
tunnelId: tunnel.name,
|
|
18
|
+
port: config.port,
|
|
19
|
+
provider: "localtunnel",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Stop the localtunnel
|
|
24
|
+
*/
|
|
25
|
+
export async function stopLocaltunnel() {
|
|
26
|
+
if (localtunnelInstance) {
|
|
27
|
+
await localtunnelInstance.close();
|
|
28
|
+
localtunnelInstance = null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=localtunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localtunnel.js","sourceRoot":"","sources":["../../../src/tunnel/localtunnel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,WAAW,MAAM,aAAa,CAAC;AAGtC,IAAI,mBAAmB,GAAQ,IAAI,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IACzD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,mBAAmB,GAAG,MAAM,CAAC;IAE7B,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAa;QACzB,QAAQ,EAAE,MAAM,CAAC,IAAc;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,aAAa;KACxB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAClC,mBAAmB,GAAG,IAAI,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ngrok tunnel provider implementation
|
|
3
|
+
*/
|
|
4
|
+
import type { TunnelConfig, TunnelInfo, NgrokDiagnostics } from "./types";
|
|
5
|
+
/**
|
|
6
|
+
* Diagnose ngrok installation and configuration
|
|
7
|
+
*/
|
|
8
|
+
export declare function diagnoseNgrok(): Promise<NgrokDiagnostics>;
|
|
9
|
+
/**
|
|
10
|
+
* Start an ngrok tunnel
|
|
11
|
+
*/
|
|
12
|
+
export declare function startNgrokTunnel(config: TunnelConfig): Promise<TunnelInfo>;
|
|
13
|
+
/**
|
|
14
|
+
* Stop the ngrok tunnel
|
|
15
|
+
*/
|
|
16
|
+
export declare function stopNgrokTunnel(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if ngrok is installed
|
|
19
|
+
*/
|
|
20
|
+
export declare function isNgrokInstalled(): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=ngrok.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrok.d.ts","sourceRoot":"","sources":["../../../src/tunnel/ngrok.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAI1E;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAyC/D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBhF;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CASzD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ngrok tunnel provider implementation
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import ngrok from "@ngrok/ngrok";
|
|
6
|
+
let ngrokInstance = null;
|
|
7
|
+
/**
|
|
8
|
+
* Diagnose ngrok installation and configuration
|
|
9
|
+
*/
|
|
10
|
+
export async function diagnoseNgrok() {
|
|
11
|
+
const diagnostics = {
|
|
12
|
+
installed: false,
|
|
13
|
+
authtokenConfigured: false,
|
|
14
|
+
authtokenValid: false,
|
|
15
|
+
existingTunnels: 0,
|
|
16
|
+
configPath: null,
|
|
17
|
+
error: null,
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
const { promisify } = await import("util");
|
|
21
|
+
const execAsync = promisify((await import("child_process")).exec);
|
|
22
|
+
await execAsync("which ngrok");
|
|
23
|
+
diagnostics.installed = true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
diagnostics.error = "ngrok not installed";
|
|
27
|
+
return diagnostics;
|
|
28
|
+
}
|
|
29
|
+
const configPaths = [
|
|
30
|
+
`${process.env.HOME}/Library/Application Support/ngrok/ngrok.yml`,
|
|
31
|
+
`${process.env.HOME}/.config/ngrok/ngrok.yml`,
|
|
32
|
+
"/etc/ngrok/ngrok.yml",
|
|
33
|
+
];
|
|
34
|
+
for (const configPath of configPaths) {
|
|
35
|
+
try {
|
|
36
|
+
const { existsSync } = await import("fs");
|
|
37
|
+
if (existsSync(configPath)) {
|
|
38
|
+
diagnostics.configPath = configPath;
|
|
39
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
40
|
+
diagnostics.authtokenConfigured = content.includes("authtoken:");
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Continue to next path
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return diagnostics;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start an ngrok tunnel
|
|
52
|
+
*/
|
|
53
|
+
export async function startNgrokTunnel(config) {
|
|
54
|
+
const tunnel = await ngrok.connect({
|
|
55
|
+
addr: config.port,
|
|
56
|
+
authtoken: config.authToken,
|
|
57
|
+
region: config.region,
|
|
58
|
+
subdomain: config.subdomain,
|
|
59
|
+
});
|
|
60
|
+
ngrokInstance = tunnel;
|
|
61
|
+
return {
|
|
62
|
+
url: tunnel.url(),
|
|
63
|
+
tunnelId: tunnel.id(),
|
|
64
|
+
port: config.port,
|
|
65
|
+
provider: "ngrok",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stop the ngrok tunnel
|
|
70
|
+
*/
|
|
71
|
+
export async function stopNgrokTunnel() {
|
|
72
|
+
if (ngrokInstance) {
|
|
73
|
+
await ngrokInstance.close();
|
|
74
|
+
ngrokInstance = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if ngrok is installed
|
|
79
|
+
*/
|
|
80
|
+
export async function isNgrokInstalled() {
|
|
81
|
+
try {
|
|
82
|
+
const { promisify } = await import("util");
|
|
83
|
+
const execAsync = promisify((await import("child_process")).exec);
|
|
84
|
+
await execAsync("which ngrok");
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=ngrok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrok.js","sourceRoot":"","sources":["../../../src/tunnel/ngrok.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,KAAK,MAAM,cAAc,CAAC;AAGjC,IAAI,aAAa,GAAQ,IAAI,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,WAAW,GAAqB;QACpC,SAAS,EAAE,KAAK;QAChB,mBAAmB,EAAE,KAAK;QAC1B,cAAc,EAAE,KAAK;QACrB,eAAe,EAAE,CAAC;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/B,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC,KAAK,GAAG,qBAAqB,CAAC;QAC1C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,8CAA8C;QACjE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,0BAA0B;QAC7C,sBAAsB;KACvB,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;gBACpC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACrD,WAAW,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;gBACjE,MAAM;YACR,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IACzD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAa;QAC5B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,aAAa,GAAG,MAAM,CAAC;IAEvB,OAAO;QACL,GAAG,EAAE,MAAM,CAAC,GAAG,EAAY;QAC3B,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAY;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;QAC5B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QR code display utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Display QR code in terminal
|
|
6
|
+
*/
|
|
7
|
+
export declare function displayQRCode(url: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Generate QR code as data URL
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateQRCodeDataUrl(url: string): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=qrcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../../src/tunnel/qrcode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAExE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QR code display utilities
|
|
3
|
+
*/
|
|
4
|
+
import qrcode from "qrcode";
|
|
5
|
+
import qrcodeTerminal from "qrcode-terminal";
|
|
6
|
+
/**
|
|
7
|
+
* Display QR code in terminal
|
|
8
|
+
*/
|
|
9
|
+
export function displayQRCode(url) {
|
|
10
|
+
console.log("\n=== OpenCode Push Plugin ===\n");
|
|
11
|
+
console.log("Scan to connect mobile device:\n");
|
|
12
|
+
qrcodeTerminal.generate(url, { small: true }, (qrcode) => {
|
|
13
|
+
console.log(qrcode);
|
|
14
|
+
});
|
|
15
|
+
console.log(`\n${url}\n`);
|
|
16
|
+
console.log("Or visit the URL above to register your device.\n");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate QR code as data URL
|
|
20
|
+
*/
|
|
21
|
+
export async function generateQRCodeDataUrl(url) {
|
|
22
|
+
return qrcode.toDataURL(url);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=qrcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../../src/tunnel/qrcode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,cAAc,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAc,EAAE,EAAE;QAC/D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tunnel configuration types
|
|
3
|
+
*/
|
|
4
|
+
export interface TunnelConfig {
|
|
5
|
+
port: number;
|
|
6
|
+
authToken?: string;
|
|
7
|
+
region?: string;
|
|
8
|
+
subdomain?: string;
|
|
9
|
+
provider?: "localtunnel" | "cloudflare" | "ngrok";
|
|
10
|
+
}
|
|
11
|
+
export interface TunnelInfo {
|
|
12
|
+
url: string;
|
|
13
|
+
tunnelId: string;
|
|
14
|
+
port: number;
|
|
15
|
+
provider: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TunnelDetails {
|
|
18
|
+
type: string;
|
|
19
|
+
url: string | null;
|
|
20
|
+
loginStatus: string;
|
|
21
|
+
loginId: string | null;
|
|
22
|
+
configPath: string | null;
|
|
23
|
+
}
|
|
24
|
+
export interface NgrokDiagnostics {
|
|
25
|
+
installed: boolean;
|
|
26
|
+
authtokenConfigured: boolean;
|
|
27
|
+
authtokenValid: boolean;
|
|
28
|
+
existingTunnels: number;
|
|
29
|
+
configPath: string | null;
|
|
30
|
+
error: string | null;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tunnel/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tunnel/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port detection utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Find the next available port starting from a given port
|
|
6
|
+
* @param startPort - Port to start searching from
|
|
7
|
+
* @param maxAttempts - Maximum number of ports to try
|
|
8
|
+
* @returns The first available port
|
|
9
|
+
* @throws Error if no port is found after maxAttempts
|
|
10
|
+
*/
|
|
11
|
+
export declare function getNextAvailablePort(startPort: number, maxAttempts?: number): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../src/utils/port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port detection utilities
|
|
3
|
+
*/
|
|
4
|
+
import * as net from "net";
|
|
5
|
+
/**
|
|
6
|
+
* Find the next available port starting from a given port
|
|
7
|
+
* @param startPort - Port to start searching from
|
|
8
|
+
* @param maxAttempts - Maximum number of ports to try
|
|
9
|
+
* @returns The first available port
|
|
10
|
+
* @throws Error if no port is found after maxAttempts
|
|
11
|
+
*/
|
|
12
|
+
export function getNextAvailablePort(startPort, maxAttempts = 50) {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
let attempts = 0;
|
|
15
|
+
const tryPort = (port) => {
|
|
16
|
+
if (attempts >= maxAttempts) {
|
|
17
|
+
reject(new Error(`Could not find available port after ${maxAttempts} attempts`));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
attempts++;
|
|
21
|
+
const server = net.createServer();
|
|
22
|
+
server.on("error", (e) => {
|
|
23
|
+
if (e.message?.includes("EADDRINUSE")) {
|
|
24
|
+
console.log(`[PushPlugin] Port ${port} in use, trying next...`);
|
|
25
|
+
tryPort(port + 1);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Don't retry on other errors - could mask serious issues
|
|
29
|
+
reject(new Error(`Port ${port} error: ${e.message}`));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
server.listen(port, "127.0.0.1", () => {
|
|
33
|
+
server.close(() => {
|
|
34
|
+
resolve(port);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
tryPort(startPort);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../../src/utils/port.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAE3B;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,cAAsB,EAAE;IAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;YAC/B,IAAI,QAAQ,IAAI,WAAW,EAAE,CAAC;gBAC5B,MAAM,CACJ,IAAI,KAAK,CACP,uCAAuC,WAAW,WAAW,CAC9D,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,QAAQ,EAAE,CAAC;YAEX,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAElC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAM,EAAE,EAAE;gBAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,yBAAyB,CAAC,CAAC;oBAChE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,0DAA0D;oBAC1D,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;gBACpC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;oBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,CAAC,SAAS,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface TunnelConfig {
|
|
2
|
+
port: number;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
region?: string;
|
|
5
|
+
subdomain?: string;
|
|
6
|
+
provider?: "localtunnel" | "cloudflare" | "ngrok";
|
|
7
|
+
}
|
|
8
|
+
export interface TunnelInfo {
|
|
9
|
+
url: string;
|
|
10
|
+
tunnelId: string;
|
|
11
|
+
port: number;
|
|
12
|
+
provider: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TunnelDetails {
|
|
15
|
+
type: string;
|
|
16
|
+
url: string | null;
|
|
17
|
+
loginStatus: string;
|
|
18
|
+
loginId: string | null;
|
|
19
|
+
configPath: string | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function stopNgrok(): Promise<void>;
|
|
22
|
+
export declare function stopTunnel(): Promise<void>;
|
|
23
|
+
export declare function startTunnel(config: TunnelConfig): Promise<TunnelInfo>;
|
|
24
|
+
export declare function getTunnelInfo(): TunnelInfo | null;
|
|
25
|
+
export declare function getTunnelDetails(): TunnelDetails;
|
|
26
|
+
export declare function getServerUrl(): string | null;
|
|
27
|
+
export declare function displayQRCode(url: string): Promise<void>;
|
|
28
|
+
export declare function displayQRCodeAndSave(url: string, filepath?: string): Promise<string>;
|
|
29
|
+
export declare function gracefulShutdown(): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=tunnel-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel-manager.d.ts","sourceRoot":"","sources":["../tunnel-manager.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA6jBD,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAU/C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAKhD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAa3E;AAED,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAoEhD;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB9D;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAItD"}
|