@forge/cli-shared

9.3.1-next.19.3.1-next.1-experimental-0b00ed8
out/http-client/file-uploader.js
~out/http-client/file-uploader.jsModified
+36−9
Index: package/out/http-client/file-uploader.js
===================================================================
--- package/out/http-client/file-uploader.js
+++ package/out/http-client/file-uploader.js
@@ -1,9 +1,11 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.HttpFileUploader = exports.UploadFileEmptyError = exports.UploadFileNotFoundError = exports.CannotUploadFileError = void 0;
 const tslib_1 = require("tslib");
-const node_fetch_1 = tslib_1.__importDefault(require("node-fetch"));
+const http_1 = tslib_1.__importDefault(require("http"));
+const https_1 = tslib_1.__importDefault(require("https"));
+const url_1 = require("url");
 const ui_1 = require("../ui");
 class CannotUploadFileError extends Error {
 }
 exports.CannotUploadFileError = CannotUploadFileError;
@@ -12,8 +14,9 @@
 exports.UploadFileNotFoundError = UploadFileNotFoundError;
 class UploadFileEmptyError extends Error {
 }
 exports.UploadFileEmptyError = UploadFileEmptyError;
+const NODE_REQUEST_TIMEOUT_MS = 30_000;
 const validateFileContents = (filePath, fileContents) => {
     if (!fileContents) {
         throw new UploadFileNotFoundError(ui_1.Text.upload.error.notFound(filePath));
     }
@@ -26,24 +29,48 @@
     if (!response.ok) {
         throw new CannotUploadFileError(ui_1.Text.upload.error.status(response.status, await response.text()));
     }
 };
+const uploadWithNodeRequest = (url, headers, fileContents) => {
+    return new Promise((resolve, reject) => {
+        const parsedUrl = new url_1.URL(url);
+        const transport = parsedUrl.protocol === 'https:' ? https_1.default : http_1.default;
+        const request = transport.request(parsedUrl, {
+            method: 'PUT',
+            headers
+        }, (response) => {
+            const chunks = [];
+            response.on('data', (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
+            response.on('end', () => {
+                const body = Buffer.concat(chunks).toString('utf-8');
+                resolve(new Response(body, {
+                    status: response.statusCode ?? 500,
+                    statusText: response.statusMessage,
+                    headers: response.headers
+                }));
+            });
+        });
+        request.setTimeout(NODE_REQUEST_TIMEOUT_MS, () => {
+            request.destroy(new Error(`Request timed out after ${NODE_REQUEST_TIMEOUT_MS}ms`));
+        });
+        request.on('error', reject);
+        request.write(fileContents);
+        request.end();
+    });
+};
 class HttpFileUploader {
     fileSystem;
     constructor(fileSystem) {
         this.fileSystem = fileSystem;
     }
     async uploadFromPath(url, filePath) {
         const fileContents = this.fileSystem.readBinaryFile(filePath);
         const validFileContents = validateFileContents(filePath, fileContents);
-        const response = await (0, node_fetch_1.default)(url, {
-            method: 'PUT',
-            headers: {
-                'Content-Type': 'application/zip',
-                'Content-Length': validFileContents.length.toString()
-            },
-            body: validFileContents
-        });
+        const headers = {
+            'Content-Type': 'application/zip',
+            'Content-Length': validFileContents.length.toString()
+        };
+        const response = await uploadWithNodeRequest(url, headers, validFileContents);
         await checkResponse(response);
     }
 }
 exports.HttpFileUploader = HttpFileUploader;