From d631a03e866cdb12d7ca8b8cd5ff1a54981d03ad Mon Sep 17 00:00:00 2001 From: Thomas Weber Date: Fri, 15 Apr 2022 19:05:56 -0500 Subject: [PATCH] Use natiave SHA-256 when available Improves performance in most cases --- src/packager/packager.js | 9 +-------- src/packager/sha256.js | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/packager/packager.js b/src/packager/packager.js index f195b8d..317e710 100644 --- a/src/packager/packager.js +++ b/src/packager/packager.js @@ -1,5 +1,5 @@ import {EventTarget, CustomEvent} from '../common/event-target'; -import createChecksumWorker from '../build/p4-worker-loader!./sha256' +import sha256 from './sha256'; import escapeXML from '../common/escape-xml'; import largeAssets from './large-assets'; import request from '../common/request'; @@ -29,13 +29,6 @@ const removeUnnecessaryEmptyLines = (string) => string.split('\n') }) .join('\n'); -const sha256 = async (buffer) => { - const {worker, terminate} = createChecksumWorker(); - const hash = await worker.sha256(buffer); - terminate(); - return hash; -}; - const getJSZip = async () => (await import(/* webpackChunkName: "jszip" */ 'jszip')).default; const setFileFast = (zip, path, data) => { diff --git a/src/packager/sha256.js b/src/packager/sha256.js index caaa0ce..0a89e23 100644 --- a/src/packager/sha256.js +++ b/src/packager/sha256.js @@ -1,5 +1,15 @@ -import shajs from 'sha.js'; +const sha256 = async (arrayBuffer) => { + // Use the browser's builtin SHA-256 if possible. + // This API might not exist if we're not a secure context or in versions of Node that aren't even that old, + // so we also have a pure JS fallback. + if (typeof crypto === 'object' && crypto.subtle && crypto.subtle.digest) { + const rawData = await crypto.subtle.digest('SHA-256', arrayBuffer); + return Array.from(new Uint8Array(rawData)).map(b => b.toString(16).padStart(2, '0')).join(''); + } -export const sha256 = (buffer) => { - return shajs('sha256').update(new Uint8Array(buffer)).digest('hex'); + const shajs = await import(/* webpackChunkName: "shajs" */ 'sha.js'); + // Note: this will block the main thread for a while. + return shajs.default('sha256').update(new Uint8Array(arrayBuffer)).digest('hex'); }; + +export default sha256;