npm package diff

Package: @forge/tunnel

Versions: 5.8.2-next.0-experimental-147ff14 - 5.9.0-next.1

Modified: package/out/services/create-tunnel-service.js

Index: package/out/services/create-tunnel-service.js
===================================================================
--- package/out/services/create-tunnel-service.js
+++ package/out/services/create-tunnel-service.js
@@ -1,9 +1,12 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.CloudflareCreateTunnelService = exports.CloudflareError = void 0;
-const cloudflared_1 = require("cloudflared");
+const tslib_1 = require("tslib");
 const url_1 = require("url");
+const child_process_1 = require("child_process");
+const which_1 = tslib_1.__importDefault(require("which"));
+const fs_1 = tslib_1.__importDefault(require("fs"));
 const cli_shared_1 = require("@forge/cli-shared");
 class CloudflareError extends cli_shared_1.BaseError {
 }
 exports.CloudflareError = CloudflareError;
@@ -12,52 +15,78 @@
     stopFunction;
     constructor(logger) {
         this.logger = logger;
     }
-    handleTunnleEstablishError(e) {
+    handleTunnelEstablishError(e, usingLocalCloudflareBinary) {
         const UNKNOWN_SYS_ERROR = 'Unknown system error -86';
         const userSysErrors = [UNKNOWN_SYS_ERROR, 'EPERM'];
-        if (userSysErrors.some((error) => e.message.includes(error))) {
+        if (userSysErrors.some((error) => e.message.includes(error)) || usingLocalCloudflareBinary) {
             let errorMessage = e.message;
             if (e.message.includes(UNKNOWN_SYS_ERROR)) {
                 errorMessage += ': Running `softwareupdate --install-rosetta` may help fix the problem';
             }
-            throw new cli_shared_1.UserError(undefined, errorMessage);
+            return new cli_shared_1.UserError(errorMessage);
         }
-        throw e;
+        return e;
     }
+    handleChildProcessData(child) {
+        child.stdout?.on('data', (chunk) => this.logger.debug(cli_shared_1.Text.tunnel.cloudflaredLog(chunk)));
+        child.stderr?.on('data', (chunk) => this.logger.debug(cli_shared_1.Text.tunnel.cloudflaredLog(chunk)));
+        child.on('error', (err) => {
+            this.logger.error(err);
+            throw new cli_shared_1.BaseError(undefined, cli_shared_1.Text.tunnel.error.cloudflaredError);
+        });
+        child.on('exit', (code) => {
+            if (code !== 0 && code !== null) {
+                throw new cli_shared_1.BaseError(undefined, cli_shared_1.Text.tunnel.error.cloudflaredExit(code));
+            }
+        });
+    }
     async establishTunnel({ port, id, token, tunnelUrl }) {
         if (!id || !token || !tunnelUrl) {
             throw new CloudflareError(undefined, 'Missing configuration to create tunnel');
         }
-        const options = {
-            run: null,
-            '--token': token,
-            '--url': `localhost:${port}`,
-            '--protocol': 'http2'
-        };
-        options[id] = null;
+        const options = [
+            'tunnel',
+            'run',
+            '--token',
+            token,
+            '--url',
+            `localhost:${port}`,
+            '--protocol',
+            'http2'
+        ];
         process.env['TUNNEL_LOGLEVEL'] = 'debug';
+        let cloudflaredBinary = null;
+        let usingLocalCloudflareBinary = false;
         try {
-            const { connections, stop, child } = (0, cloudflared_1.tunnel)(options);
-            child.stdout?.on('data', (chunk) => this.logger.debug(cli_shared_1.Text.tunnel.cloudflaredLog(chunk)));
-            child.stderr?.on('data', (chunk) => this.logger.debug(cli_shared_1.Text.tunnel.cloudflaredLog(chunk)));
-            child.on('error', (err) => {
-                this.logger.error(err);
-                throw new cli_shared_1.BaseError(undefined, cli_shared_1.Text.tunnel.error.cloudflaredError);
-            });
-            child.on('exit', (code) => {
-                if (code !== 0 && code !== null) {
-                    throw new cli_shared_1.BaseError(undefined, cli_shared_1.Text.tunnel.error.cloudflaredExit(code));
+            const cloudflaredBin = require('cloudflared').bin;
+            if (fs_1.default.existsSync(cloudflaredBin)) {
+                cloudflaredBinary = cloudflaredBin;
+            }
+        }
+        catch (error) { }
+        try {
+            if (!cloudflaredBinary) {
+                cloudflaredBinary = await (0, which_1.default)('cloudflared', { nothrow: true });
+                if (cloudflaredBinary) {
+                    usingLocalCloudflareBinary = true;
+                    this.logger.warn(cli_shared_1.Text.tunnel.tunnelWithLocalCloudflared);
                 }
-            });
-            await Promise.all(connections);
-            this.stopFunction = stop;
+            }
+            if (!cloudflaredBinary) {
+                throw new cli_shared_1.UserError(cli_shared_1.Text.tunnel.error.cloudflaredUnavailableError);
+            }
+            const cloudflareTunnelProcess = (0, child_process_1.spawn)(cloudflaredBinary, options, { stdio: ['ignore', 'pipe', 'pipe'] });
+            this.handleChildProcessData(cloudflareTunnelProcess);
+            this.stopFunction = (signal) => {
+                return cloudflareTunnelProcess.kill(signal);
+            };
             this.logger.debug(cli_shared_1.Text.tunnel.startedTunnel(tunnelUrl));
             return new url_1.URL(tunnelUrl);
         }
         catch (e) {
-            throw this.handleTunnleEstablishError(e);
+            throw this.handleTunnelEstablishError(e, usingLocalCloudflareBinary);
         }
     }
     async closeTunnel() {
         if (this.stopFunction) {

Modified: package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/tunnel",
-  "version": "5.8.2-next.0-experimental-147ff14",
+  "version": "5.9.0-next.1",
   "description": "Tunnel functionality for Forge CLI",
   "author": "Atlassian",
   "license": "UNLICENSED",
   "main": "out/index.js",
@@ -10,32 +10,36 @@
     "clean": "rm -rf ./out && rm -f tsconfig.tsbuildinfo",
     "compile": "tsc -b -v"
   },
   "dependencies": {
-    "@forge/bundler": "4.20.6-next.0-experimental-147ff14",
-    "@forge/cli-shared": "6.5.2-experimental-147ff14",
-    "@forge/csp": "3.6.0-experimental-147ff14",
+    "@forge/bundler": "4.20.6-next.1",
+    "@forge/cli-shared": "6.5.3-next.0",
+    "@forge/csp": "3.6.0",
     "@forge/runtime": "5.10.4",
     "chokidar": "^3.6.0",
-    "cloudflared": "^0.5.2",
     "express": "^4.18.3",
     "express-intercept": "^1.1.0",
     "http-proxy-middleware": "^2.0.6",
     "node-cache": "^5.1.2",
     "portfinder": "^1.0.32",
     "tmp": "^0.2.3",
     "tslib": "^2.6.2",
     "uuid": "^9.0.1",
-    "webpack-dev-server": "^4.15.1"
+    "webpack-dev-server": "^4.15.1",
+    "which": "^5.0.0"
   },
   "devDependencies": {
     "@atlassian/xen-test-util": "^4.2.0",
-    "@forge/manifest": "8.4.1-experimental-147ff14",
+    "@forge/manifest": "8.4.2-next.0",
     "@types/express": "^4.17.21",
     "@types/jest": "^29.5.12",
     "@types/node": "14.18.63",
     "@types/supertest": "^2.0.16",
     "@types/tmp": "^0.2.6",
     "@types/uuid": "^9.0.8",
+    "@types/which": "^3.0.4",
     "supertest": "^6.3.3"
+  },
+  "optionalDependencies": {
+    "cloudflared": "^0.5.2"
   }
 }

Modified: package/out/services/create-tunnel-service.d.ts.map

Index: package/out/services/create-tunnel-service.d.ts.map
===================================================================
--- package/out/services/create-tunnel-service.d.ts.map
+++ package/out/services/create-tunnel-service.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"create-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/create-tunnel-service.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAmB,MAAM,mBAAmB,CAAC;AAEvE,oBAAY,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,sBAAsB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,qBAAa,eAAgB,SAAQ,SAAS;CAAG;AAEjD,qBAAa,6BAA8B,YAAW,mBAAmB;IAG3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,YAAY,CAA0E;gBAEjE,MAAM,EAAE,MAAM;IAE3C,OAAO,CAAC,0BAA0B;IAgBrB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IA8C3E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ1C"}
\ No newline at end of file
+{"version":3,"file":"create-tunnel-service.d.ts","sourceRoot":"","sources":["../../src/services/create-tunnel-service.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI1B,OAAO,EAAE,SAAS,EAAE,MAAM,EAAmB,MAAM,mBAAmB,CAAC;AAEvE,oBAAY,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,sBAAsB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,qBAAa,eAAgB,SAAQ,SAAS;CAAG;AAEjD,qBAAa,6BAA8B,YAAW,mBAAmB;IAG3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,YAAY,CAA0E;gBAEjE,MAAM,EAAE,MAAM;IAE3C,OAAO,CAAC,0BAA0B;IAgBlC,OAAO,CAAC,sBAAsB;IAgBjB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;IA2D3E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ1C"}
\ No newline at end of file

Modified: package/CHANGELOG.md

Large diffs are not rendered by default.

Modified: package/out/services/create-tunnel-service.d.ts

Index: package/out/services/create-tunnel-service.d.ts
===================================================================
--- package/out/services/create-tunnel-service.d.ts
+++ package/out/services/create-tunnel-service.d.ts
@@ -18,9 +18,10 @@
 export declare class CloudflareCreateTunnelService implements CreateTunnelService {
     private readonly logger;
     private stopFunction;
     constructor(logger: Logger);
-    private handleTunnleEstablishError;
+    private handleTunnelEstablishError;
+    private handleChildProcessData;
     establishTunnel({ port, id, token, tunnelUrl }: TunnelConfig): Promise<URL>;
     closeTunnel(): Promise<void>;
 }
 //# sourceMappingURL=create-tunnel-service.d.ts.map
\ No newline at end of file