@forge/tunnel

7.1.2-next.37.1.2-next.3-experimental-e9e08bb
~

Modified (11 files)

Index: package/out/servers/dev-server.js
===================================================================
--- package/out/servers/dev-server.js
+++ package/out/servers/dev-server.js
@@ -1,7 +1,7 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.LocalDevelopmentServer = exports.TunnelInvocationValidationError = void 0;
+exports.LocalDevelopmentServer = exports.getLocalStorageVariables = exports.TunnelInvocationValidationError = void 0;
 exports.stopServer = stopServer;
 const tslib_1 = require("tslib");
 const express_1 = tslib_1.__importDefault(require("express"));
 const bundler_1 = require("@forge/bundler");
@@ -12,8 +12,21 @@
 const ari_1 = require("@forge/util/packages/ari");
 class TunnelInvocationValidationError extends cli_shared_1.UserError {
 }
 exports.TunnelInvocationValidationError = TunnelInvocationValidationError;
+const LOCAL_STORAGE_ENVIRONMENT_KEYS = [
+    'FORGE_LOCAL_STORAGE',
+    'FORGE_LOCAL_KVS_URL',
+    'FORGE_LOCAL_SQL_URL',
+    'FORGE_LOCAL_STORAGE_APP_ID',
+    'FORGE_LOCAL_STORAGE_ENVIRONMENT_ID',
+    'FORGE_LOCAL_STORAGE_INSTALLATION_ID'
+];
+const getLocalStorageVariables = () => LOCAL_STORAGE_ENVIRONMENT_KEYS.flatMap((key) => {
+    const value = process.env[key];
+    return value === undefined ? [] : [{ key, value, secure: false }];
+});
+exports.getLocalStorageVariables = getLocalStorageVariables;
 async function stopServer(server) {
     if (!server) {
         return;
     }
@@ -89,9 +102,12 @@
         this.onFatalError = handler;
     }
     handleInvocation = async (req, res) => {
         const request = req.body;
-        const envVars = (0, runtime_1.getUserVars)();
+        const envVarsByKey = new Map((0, runtime_1.getUserVars)().map((variable) => [variable.key, variable]));
+        for (const variable of (0, exports.getLocalStorageVariables)())
+            envVarsByKey.set(variable.key, variable);
+        const envVars = [...envVarsByKey.values()];
         request.variables?.forEach((item) => {
             if (!envVars.find((i) => i.key === item.key)) {
                 envVars.push(item);
             }
Index: package/out/sandbox/node-sandbox.js
===================================================================
--- package/out/sandbox/node-sandbox.js
+++ package/out/sandbox/node-sandbox.js
@@ -8,8 +8,17 @@
 const crypto_1 = require("crypto");
 const bundler_1 = require("@forge/bundler");
 const runtime_1 = require("@forge/runtime");
 const RUNNER = path_1.default.join(__dirname, '..', '..', 'out', 'sandbox', 'sandbox-runner.js');
+const LOCAL_STORAGE_ENVIRONMENT_KEYS = [
+    'FORGE_LOCAL_STORAGE',
+    'FORGE_LOCAL_KVS_URL',
+    'FORGE_LOCAL_SQL_URL',
+    'FORGE_LOCAL_STORAGE_APP_ID',
+    'FORGE_LOCAL_STORAGE_ENVIRONMENT_ID',
+    'FORGE_LOCAL_STORAGE_INSTALLATION_ID'
+];
+const localStorageEnvironment = () => Object.fromEntries(LOCAL_STORAGE_ENVIRONMENT_KEYS.flatMap((key) => (process.env[key] === undefined ? [] : [[key, process.env[key]]])));
 class NodeSandbox {
     name;
     process;
     callbacks;
@@ -22,13 +31,14 @@
         const handlerEnv = '__forge__.main';
         this.process = (0, child_process_1.fork)(RUNNER, [fileName, handlerName], {
             stdio: ['ignore', 'pipe', 2, 'ipc'],
             env: {
+                ...localStorageEnvironment(),
                 _HANDLER: handlerEnv,
                 FORGE_EFS_RUNTIME_PATH: appPath,
                 FORGE_CUSTOM_WRAPPER_FILE_NAME: '__forge_wrapper__.cjs'
             },
-            execArgv: debugPort ? [`--inspect=${debugHost}:${debugPort}`] : undefined
+            execArgv: debugPort ? [`--inspect=${debugHost}:${debugPort}`] : []
         });
         readline_1.default.createInterface(this.process.stdout).on('line', (line) => {
             const message = JSON.parse(line);
             this.handleOutput(message);
Index: package/out/sandbox/sandbox-runner.js
===================================================================
--- package/out/sandbox/sandbox-runner.js
+++ package/out/sandbox/sandbox-runner.js
@@ -1,8 +1,21 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 const [_nodeBinary, _thisScript, fileName, handlerName] = process.argv;
 global.__forge_tunnel__ = true;
+if (process.env.FORGE_LOCAL_STORAGE === '1') {
+    const nativeFetch = globalThis.fetch.bind(globalThis);
+    const allowedOrigins = new Set([process.env.FORGE_LOCAL_KVS_URL, process.env.FORGE_LOCAL_SQL_URL]
+        .filter((url) => Boolean(url))
+        .map((url) => new URL(url).origin));
+    global.__forge_local_fetch__ = async (input, init) => {
+        const target = new URL(input instanceof Request ? input.url : input);
+        if (!allowedOrigins.has(target.origin)) {
+            throw new Error(`Local Forge storage fetch blocked for unconfigured origin: ${target.origin}`);
+        }
+        return nativeFetch(input, init);
+    };
+}
 const handler = require(fileName)[handlerName];
 process.on('message', async ({ lambdaEvent, tunnelContext: { requestId, deadline } }) => {
     const lambdaContext = {
         awsRequestId: requestId,
Index: package/out/command/start-tunnel-command.js
===================================================================
--- package/out/command/start-tunnel-command.js
+++ package/out/command/start-tunnel-command.js
@@ -52,17 +52,18 @@
         if (port < 1 || port > 65535) {
             throw new InvalidTunnelConfigError(cli_shared_1.Text.tunnel.error.invalidSelfManagedTunnelPort(port.toString()));
         }
     }
-    stopServices = async (appId, environmentKey, containersDockerComposeFiles) => {
+    stopServices = async (appId, environmentKey, containersDockerComposeFiles, additionalCleanup) => {
         await Promise.all([
             this.functionHost.stopWatching(),
             this.tunnelClient.unregisterTunnels(appId, environmentKey),
             this.tunnelFactory.closeTunnel(),
             this.devServer.stop(),
             ...Object.values(this.tunnelServers).map((server) => server.stop()),
             this.cspReporterServer?.stop(),
-            (0, cli_shared_1.stopDockerComposeStack)(this.configFile, this.logger, containersDockerComposeFiles)
+            (0, cli_shared_1.stopDockerComposeStack)(this.configFile, this.logger, containersDockerComposeFiles),
+            additionalCleanup?.()
         ]);
     };
     startFaaSTunnelServer = async ({ port, appId, environmentKey, tunnelUrl }) => {
         const { permissions = {}, remotes = [] } = await this.configFile.readConfig();
@@ -108,14 +109,16 @@
             });
             return this.tunnelServers[key].start();
         }));
     };
-    async execute(options, containersDockerComposeFiles) {
+    async execute(options, containersDockerComposeFiles, additionalCleanup) {
         const { id: appId } = await this.getAppConfig();
         const { port, environmentKey, url } = options;
         this.validateTunnelUrl(url);
         this.validateTunnelPort(port);
         const allResources = await this.configFile.getResources();
+        let cleanupPromise;
+        const additionalCleanupOnce = additionalCleanup ? () => (cleanupPromise ??= additionalCleanup()) : undefined;
         try {
             const faasTunnelServer = await this.startFaaSTunnelServer({
                 port,
                 appId,
@@ -130,11 +133,11 @@
                     resourceKey
                 }))
             };
             await this.tunnelClient.registerTunnels(appId, environmentKey, tunnelDefinitions);
-            const stopFunction = async () => this.stopServices(appId, environmentKey, containersDockerComposeFiles);
+            const stopFunction = async () => this.stopServices(appId, environmentKey, containersDockerComposeFiles, additionalCleanupOnce);
             this.devServer.setErrorHandler?.(async (error) => {
-                await this.stopServices(appId, environmentKey, containersDockerComposeFiles);
+                await this.stopServices(appId, environmentKey, containersDockerComposeFiles, additionalCleanupOnce);
                 await (0, cli_shared_1.exitOnError)(this.logger, error);
             });
             const reloadSandboxes = async (bundledCode, tunnelOptions) => {
                 await this.functionHost.stopWatching();
@@ -150,9 +153,9 @@
             };
         }
         catch (e) {
             try {
-                await this.stopServices(appId, environmentKey, containersDockerComposeFiles);
+                await this.stopServices(appId, environmentKey, containersDockerComposeFiles, additionalCleanupOnce);
             }
             catch { }
             throw e;
         }
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/tunnel",
-  "version": "7.1.2-next.3",
+  "version": "7.1.2-next.3-experimental-e9e08bb",
   "description": "Tunnel functionality for Forge CLI",
   "author": "Atlassian",
   "license": "SEE LICENSE IN LICENSE.txt",
   "main": "out/index.js",
@@ -10,11 +10,11 @@
     "clean": "rm -rf ./out && rm -f tsconfig.tsbuildinfo",
     "compile": "tsc -b -v"
   },
   "dependencies": {
-    "@forge/bundler": "7.2.1-next.3",
-    "@forge/cli-shared": "9.4.1-next.3",
-    "@forge/csp": "6.3.1",
+    "@forge/bundler": "7.2.1-next.3-experimental-e9e08bb",
+    "@forge/cli-shared": "9.4.1-next.3-experimental-e9e08bb",
+    "@forge/csp": "6.3.1-experimental-e9e08bb",
     "@forge/runtime": "7.0.0",
     "@forge/util": "^3.0.0",
     "cheerio": "^1.2.0",
     "chokidar": "^4.0.3",
@@ -32,9 +32,9 @@
     "which": "^3.0.1"
   },
   "devDependencies": {
     "@atlassian/xen-test-util": "^4.2.0",
-    "@forge/manifest": "13.4.0-next.3",
+    "@forge/manifest": "13.4.0-next.3-experimental-e9e08bb",
     "@types/express": "^4.17.21",
     "@types/jest": "^29.5.14",
     "@types/node": "20.19.1",
     "@types/supertest": "^2.0.16",
Index: package/out/servers/dev-server.d.ts.map
===================================================================
--- package/out/servers/dev-server.d.ts.map
+++ package/out/servers/dev-server.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/servers/dev-server.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../src/servers/dev-server.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
Index: package/out/sandbox/node-sandbox.d.ts.map
===================================================================
--- package/out/sandbox/node-sandbox.d.ts.map
+++ package/out/sandbox/node-sandbox.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"node-sandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/node-sandbox.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,aAAa,EAId,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,WAAY,YAAW,OAAO;IACzC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;gBAEhE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa;IAgC9E,OAAO,CAAC,YAAY;IAOd,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyBtE,IAAI,IAAI,IAAI;CAGb"}
\ No newline at end of file
+{"version":3,"file":"node-sandbox.d.ts","sourceRoot":"","sources":["../../src/sandbox/node-sandbox.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EACP,aAAa,EAId,MAAM,gBAAgB,CAAC;AAmBxB,qBAAa,WAAY,YAAW,OAAO;IACzC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkD;gBAEhE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa;IAqC9E,OAAO,CAAC,YAAY;IAOd,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyBtE,IAAI,IAAI,IAAI;CAGb"}
\ No newline at end of file
Index: package/out/command/start-tunnel-command.d.ts.map
===================================================================
--- package/out/command/start-tunnel-command.d.ts.map
+++ package/out/command/start-tunnel-command.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"start-tunnel-command.d.ts","sourceRoot":"","sources":["../../src/command/start-tunnel-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,MAAM,EAEN,aAAa,EAMd,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAQD,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAV7B,OAAO,CAAC,aAAa,CAAmE;IACxF,OAAO,CAAC,iBAAiB,CAAgC;gBAGtC,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,mBAAmB,EAClC,YAAY,EAAE,qBAAqB,EACnC,YAAY,EAAE,qBAAqB,EACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU;IAGzC,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY,CAclB;IAEF,OAAO,CAAC,qBAAqB,CA+B3B;IAEF,OAAO,CAAC,gCAAgC,CAiCtC;IAEW,OAAO,CAClB,OAAO,EAAE,kBAAkB,EAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpD,OAAO,CAAC,iBAAiB,CAAC;CA0D9B"}
\ No newline at end of file
+{"version":3,"file":"start-tunnel-command.d.ts","sourceRoot":"","sources":["../../src/command/start-tunnel-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,MAAM,EAEN,aAAa,EAMd,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EACL,iBAAiB,EAKlB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,eAAe,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1F;AAQD,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAV7B,OAAO,CAAC,aAAa,CAAmE;IACxF,OAAO,CAAC,iBAAiB,CAAgC;gBAGtC,YAAY,EAAE,iBAAiB,EAC/B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,mBAAmB,EAClC,YAAY,EAAE,qBAAqB,EACnC,YAAY,EAAE,qBAAqB,EACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU;IAGzC,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,YAAY,CAgBlB;IAEF,OAAO,CAAC,qBAAqB,CA+B3B;IAEF,OAAO,CAAC,gCAAgC,CAiCtC;IAEW,OAAO,CAClB,OAAO,EAAE,kBAAkB,EAC3B,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrD,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,iBAAiB,CAAC;CA4D9B"}
\ No newline at end of file
File too large for inline diff
Index: package/out/servers/dev-server.d.ts
===================================================================
--- package/out/servers/dev-server.d.ts
+++ package/out/servers/dev-server.d.ts
@@ -2,9 +2,9 @@
 import { URL } from 'url';
 import express from 'express';
 import { BundlerWatch, BundlerOutput } from '@forge/bundler';
 import { AppEnvironmentsGraphqlClient, ConfigFile, FileSystemReader, I18nResourceBundlingService, Logger, StatsigService, TunnelOptions, UserError } from '@forge/cli-shared';
-import { ExternalRequestBody } from '@forge/runtime';
+import { ExternalRequestBody, ExternalRequestVariable } from '@forge/runtime';
 import { Permissions, Remotes } from '@forge/manifest';
 export interface ProxyServerError extends Error {
     code?: string;
 }
@@ -24,8 +24,9 @@
 }
 export interface InvocationService {
     invoke(handler: string, request: ExternalRequestBody): Promise<any>;
 }
+export declare const getLocalStorageVariables: () => ExternalRequestVariable[];
 export declare function stopServer(server: http.Server | undefined): Promise<void>;
 export declare class LocalDevelopmentServer implements DevelopmentServer {
     private readonly invocationService;
     private readonly logger;
Index: package/out/command/start-tunnel-command.d.ts
===================================================================
--- package/out/command/start-tunnel-command.d.ts
+++ package/out/command/start-tunnel-command.d.ts
@@ -34,7 +34,7 @@
     private validateTunnelPort;
     private stopServices;
     private startFaaSTunnelServer;
     private startResourceBasedTunnelsServers;
-    execute(options: StartTunnelOptions, containersDockerComposeFiles?: Record<string, string>): Promise<StartTunnelResult>;
+    execute(options: StartTunnelOptions, containersDockerComposeFiles?: Record<string, string>, additionalCleanup?: () => Promise<void>): Promise<StartTunnelResult>;
 }
 //# sourceMappingURL=start-tunnel-command.d.ts.map
\ No newline at end of file