103 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/**
 | 
						|
 * We extend node:crypto APIs during builds and revalidates to ensure that prerenders don't observe random bytes
 | 
						|
 * When cacheComponents is enabled. Random bytes are a form of IO even if they resolve synchronously. When cacheComponents is
 | 
						|
 * enabled we need to ensure that random bytes are excluded from prerenders unless they are cached.
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * The extensions here never error nor alter the underlying return values and thus should be transparent to callers.
 | 
						|
 */ "use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
    value: true
 | 
						|
});
 | 
						|
const _utils = require("./utils");
 | 
						|
if (process.env.NEXT_RUNTIME === 'edge') {
 | 
						|
// nothing to patch
 | 
						|
} else {
 | 
						|
    const nodeCrypto = require('node:crypto');
 | 
						|
    // require('node:crypto').getRandomValues is an alias for
 | 
						|
    // crypto.getRandomValues which is extended in web-crypto.tsx
 | 
						|
    // require('node:crypto').randomUUID is not an alias for crypto.randomUUID
 | 
						|
    const randomUUIDExpression = "`require('node:crypto').randomUUID()`";
 | 
						|
    try {
 | 
						|
        const _randomUUID = nodeCrypto.randomUUID;
 | 
						|
        nodeCrypto.randomUUID = function randomUUID() {
 | 
						|
            (0, _utils.io)(randomUUIDExpression, 'random');
 | 
						|
            return _randomUUID.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${randomUUIDExpression} extension. When using \`experimental.cacheComponents\` calling this function will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const randomBytesExpression = "`require('node:crypto').randomBytes(size)`";
 | 
						|
    try {
 | 
						|
        const _randomBytes = nodeCrypto.randomBytes;
 | 
						|
        // @ts-expect-error -- TODO: tell TS the overloads are preserved
 | 
						|
        nodeCrypto.randomBytes = function randomBytes() {
 | 
						|
            if (typeof arguments[1] !== 'function') {
 | 
						|
                // randomBytes is sync if the second arg is undefined
 | 
						|
                (0, _utils.io)(randomBytesExpression, 'random');
 | 
						|
            }
 | 
						|
            return _randomBytes.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${randomBytesExpression} extension. When using \`experimental.cacheComponents\` calling this function without a callback argument will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const randomFillSyncExpression = "`require('node:crypto').randomFillSync(...)`";
 | 
						|
    try {
 | 
						|
        const _randomFillSync = nodeCrypto.randomFillSync;
 | 
						|
        // @ts-expect-error -- TODO: tell TS the overloads are preserved
 | 
						|
        nodeCrypto.randomFillSync = function randomFillSync() {
 | 
						|
            (0, _utils.io)(randomFillSyncExpression, 'random');
 | 
						|
            return _randomFillSync.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${randomFillSyncExpression} extension. When using \`experimental.cacheComponents\` calling this function will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const randomIntExpression = "`require('node:crypto').randomInt(min, max)`";
 | 
						|
    try {
 | 
						|
        const _randomInt = nodeCrypto.randomInt;
 | 
						|
        // @ts-expect-error -- TODO: tell TS the overloads are preserved
 | 
						|
        nodeCrypto.randomInt = function randomInt() {
 | 
						|
            if (typeof arguments[2] !== 'function') {
 | 
						|
                // randomInt is sync if the third arg is undefined
 | 
						|
                (0, _utils.io)(randomIntExpression, 'random');
 | 
						|
            }
 | 
						|
            return _randomInt.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${randomBytesExpression} extension. When using \`experimental.cacheComponents\` calling this function without a callback argument will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const generatePrimeSyncExpression = "`require('node:crypto').generatePrimeSync(...)`";
 | 
						|
    try {
 | 
						|
        const _generatePrimeSync = nodeCrypto.generatePrimeSync;
 | 
						|
        // @ts-expect-error -- TODO: tell TS the overloads are preserved
 | 
						|
        nodeCrypto.generatePrimeSync = function generatePrimeSync() {
 | 
						|
            (0, _utils.io)(generatePrimeSyncExpression, 'random');
 | 
						|
            return _generatePrimeSync.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${generatePrimeSyncExpression} extension. When using \`experimental.cacheComponents\` calling this function will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const generateKeyPairSyncExpression = "`require('node:crypto').generateKeyPairSync(...)`";
 | 
						|
    try {
 | 
						|
        const _generateKeyPairSync = nodeCrypto.generateKeyPairSync;
 | 
						|
        // @ts-expect-error -- TODO: tell TS the overloads are preserved
 | 
						|
        nodeCrypto.generateKeyPairSync = function generateKeyPairSync() {
 | 
						|
            (0, _utils.io)(generateKeyPairSyncExpression, 'random');
 | 
						|
            return _generateKeyPairSync.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${generateKeyPairSyncExpression} extension. When using \`experimental.cacheComponents\` calling this function will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
    const generateKeySyncExpression = "`require('node:crypto').generateKeySync(...)`";
 | 
						|
    try {
 | 
						|
        const _generateKeySync = nodeCrypto.generateKeySync;
 | 
						|
        nodeCrypto.generateKeySync = function generateKeySync() {
 | 
						|
            (0, _utils.io)(generateKeySyncExpression, 'random');
 | 
						|
            return _generateKeySync.apply(this, arguments);
 | 
						|
        };
 | 
						|
    } catch  {
 | 
						|
        console.error(`Failed to install ${generateKeySyncExpression} extension. When using \`experimental.cacheComponents\` calling this function will not correctly trigger dynamic behavior.`);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
//# sourceMappingURL=node-crypto.js.map
 |