fix: use globalThis.crypto instead of require('crypto')

This commit is contained in:
2025-12-16 13:51:43 -05:00
parent 8b7a90d2a8
commit f459cbac67
2 changed files with 17 additions and 14 deletions

View File

@@ -15,19 +15,9 @@ function getCrypto(): Crypto {
return window.crypto;
}
// Node.js environment (15+) - uses Web Crypto API standard
if (typeof global !== 'undefined') {
try {
// Using require() is necessary for synchronous crypto access in Obsidian desktop plugins
// ES6 dynamic imports would create race conditions as crypto must be available synchronously
// eslint-disable-next-line @typescript-eslint/no-var-requires -- Synchronous Node.js crypto API access required
const nodeCrypto = require('crypto') as typeof import('crypto');
if (nodeCrypto?.webcrypto) {
return nodeCrypto.webcrypto as unknown as Crypto;
}
} catch {
// Crypto module not available or failed to load
}
// Node.js/Electron environment - globalThis.crypto available in modern runtimes
if (typeof globalThis !== 'undefined' && globalThis.crypto) {
return globalThis.crypto;
}
throw new Error('No Web Crypto API available in this environment');

View File

@@ -138,11 +138,18 @@ describe('crypto-adapter', () => {
const globalRef = global as any;
const originalWindow = globalRef.window;
const originalGlobal = globalRef.global;
const originalGlobalThisCrypto = globalThis.crypto;
try {
// Remove window.crypto and global access
// Remove window.crypto, global access, and globalThis.crypto
delete globalRef.window;
delete globalRef.global;
// In modern Node.js, globalThis.crypto is always available, so we must mock it too
Object.defineProperty(globalThis, 'crypto', {
value: undefined,
writable: true,
configurable: true
});
// Clear module cache to force re-evaluation
jest.resetModules();
@@ -157,6 +164,12 @@ describe('crypto-adapter', () => {
// Restore original values
globalRef.window = originalWindow;
globalRef.global = originalGlobal;
// Restore globalThis.crypto
Object.defineProperty(globalThis, 'crypto', {
value: originalGlobalThisCrypto,
writable: true,
configurable: true
});
// Clear module cache again to restore normal state
jest.resetModules();