npm package diff

Package: @forge/bridge

Versions: 5.6.1-next.5-experimental-44e92a2 - 5.7.0-next.9

File: package/out/object-store/upload.js

Index: package/out/object-store/upload.js
===================================================================
--- package/out/object-store/upload.js
+++ package/out/object-store/upload.js
@@ -0,0 +1,76 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.upload = void 0;
+const invoke_1 = require("../invoke");
+const errors_1 = require("../errors");
+const getObjectMetadata = async (blob) => {
+    const length = blob.size;
+    const arrayBuffer = await blob.arrayBuffer();
+    const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
+    const hashArray = Array.from(new Uint8Array(hashBuffer));
+    const checksum = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
+    const checksumType = 'SHA-256';
+    return {
+        length,
+        checksum,
+        checksumType
+    };
+};
+const upload = async ({ functionKey, objects }) => {
+    if (!functionKey || functionKey.length === 0) {
+        throw new errors_1.BridgeAPIError('functionKey is required to filter and generate presigned URLs');
+    }
+    if (!Array.isArray(objects) || objects.length === 0) {
+        throw new errors_1.BridgeAPIError('objects array is required and must not be empty');
+    }
+    const allObjectMetadata = await Promise.all(objects.map((obj) => getObjectMetadata(obj)));
+    const presignedURLsToObjectMetadata = (await (0, invoke_1.invoke)(functionKey, {
+        allObjectMetadata
+    }));
+    if (!presignedURLsToObjectMetadata || typeof presignedURLsToObjectMetadata !== 'object') {
+        throw new errors_1.BridgeAPIError('Invalid response from functionKey');
+    }
+    const checksumToBlobMap = new Map();
+    objects.forEach((blob, index) => {
+        const metadata = allObjectMetadata[index];
+        checksumToBlobMap.set(metadata.checksum, blob);
+    });
+    const uploadPromises = Object.entries(presignedURLsToObjectMetadata).map(async ([presignedUrl, metadata]) => {
+        const { key, length, checksum } = metadata;
+        const object = checksumToBlobMap.get(checksum);
+        if (!object) {
+            return {
+                success: false,
+                key: key,
+                error: `Blob not found for checksum ${checksum}`
+            };
+        }
+        try {
+            const response = await fetch(presignedUrl, {
+                method: 'PUT',
+                body: object,
+                headers: {
+                    'Content-Type': object.type || 'application/octet-stream',
+                    'Content-Length': length.toString()
+                }
+            });
+            return {
+                success: response.ok,
+                key: key,
+                status: response.status,
+                error: response.ok ? undefined : `Upload failed with status ${response.status}`
+            };
+        }
+        catch (error) {
+            return {
+                success: false,
+                key: key,
+                status: 503,
+                error: error instanceof Error ? error.message : 'Upload failed'
+            };
+        }
+    });
+    const results = await Promise.all(uploadPromises);
+    return results;
+};
+exports.upload = upload;