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.
Files changed (70) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +4 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/push-notifications.d.ts +4 -0
  6. package/dist/push-notifications.d.ts.map +1 -0
  7. package/dist/push-notifications.js +299 -0
  8. package/dist/push-notifications.js.map +1 -0
  9. package/dist/reverse-proxy.d.ts +9 -0
  10. package/dist/reverse-proxy.d.ts.map +1 -0
  11. package/dist/reverse-proxy.js +72 -0
  12. package/dist/reverse-proxy.js.map +1 -0
  13. package/dist/sdk-logger.d.ts +17 -0
  14. package/dist/sdk-logger.d.ts.map +1 -0
  15. package/dist/sdk-logger.js +94 -0
  16. package/dist/sdk-logger.js.map +1 -0
  17. package/dist/src/push/formatter.d.ts +25 -0
  18. package/dist/src/push/formatter.d.ts.map +1 -0
  19. package/dist/src/push/formatter.js +142 -0
  20. package/dist/src/push/formatter.js.map +1 -0
  21. package/dist/src/push/index.d.ts +8 -0
  22. package/dist/src/push/index.d.ts.map +1 -0
  23. package/dist/src/push/index.js +8 -0
  24. package/dist/src/push/index.js.map +1 -0
  25. package/dist/src/push/sender.d.ts +9 -0
  26. package/dist/src/push/sender.d.ts.map +1 -0
  27. package/dist/src/push/sender.js +75 -0
  28. package/dist/src/push/sender.js.map +1 -0
  29. package/dist/src/push/token-store.d.ts +17 -0
  30. package/dist/src/push/token-store.d.ts.map +1 -0
  31. package/dist/src/push/token-store.js +42 -0
  32. package/dist/src/push/token-store.js.map +1 -0
  33. package/dist/src/push/types.d.ts +51 -0
  34. package/dist/src/push/types.d.ts.map +1 -0
  35. package/dist/src/push/types.js +5 -0
  36. package/dist/src/push/types.js.map +1 -0
  37. package/dist/src/tunnel/cloudflare.d.ts +17 -0
  38. package/dist/src/tunnel/cloudflare.d.ts.map +1 -0
  39. package/dist/src/tunnel/cloudflare.js +74 -0
  40. package/dist/src/tunnel/cloudflare.js.map +1 -0
  41. package/dist/src/tunnel/index.d.ts +31 -0
  42. package/dist/src/tunnel/index.d.ts.map +1 -0
  43. package/dist/src/tunnel/index.js +83 -0
  44. package/dist/src/tunnel/index.js.map +1 -0
  45. package/dist/src/tunnel/localtunnel.d.ts +13 -0
  46. package/dist/src/tunnel/localtunnel.d.ts.map +1 -0
  47. package/dist/src/tunnel/localtunnel.js +31 -0
  48. package/dist/src/tunnel/localtunnel.js.map +1 -0
  49. package/dist/src/tunnel/ngrok.d.ts +21 -0
  50. package/dist/src/tunnel/ngrok.d.ts.map +1 -0
  51. package/dist/src/tunnel/ngrok.js +91 -0
  52. package/dist/src/tunnel/ngrok.js.map +1 -0
  53. package/dist/src/tunnel/qrcode.d.ts +12 -0
  54. package/dist/src/tunnel/qrcode.d.ts.map +1 -0
  55. package/dist/src/tunnel/qrcode.js +24 -0
  56. package/dist/src/tunnel/qrcode.js.map +1 -0
  57. package/dist/src/tunnel/types.d.ts +32 -0
  58. package/dist/src/tunnel/types.d.ts.map +1 -0
  59. package/dist/src/tunnel/types.js +5 -0
  60. package/dist/src/tunnel/types.js.map +1 -0
  61. package/dist/src/utils/port.d.ts +12 -0
  62. package/dist/src/utils/port.d.ts.map +1 -0
  63. package/dist/src/utils/port.js +41 -0
  64. package/dist/src/utils/port.js.map +1 -0
  65. package/dist/tunnel-manager.d.ts +30 -0
  66. package/dist/tunnel-manager.d.ts.map +1 -0
  67. package/dist/tunnel-manager.js +639 -0
  68. package/dist/tunnel-manager.js.map +1 -0
  69. package/package.json +60 -0
  70. 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":"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"}
@@ -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,5 @@
1
+ /**
2
+ * Tunnel configuration types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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"}