diff --git a/src/utils/crypto-adapter.ts b/src/utils/crypto-adapter.ts index a50ba91..47c0b96 100644 --- a/src/utils/crypto-adapter.ts +++ b/src/utils/crypto-adapter.ts @@ -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'); diff --git a/tests/crypto-adapter.test.ts b/tests/crypto-adapter.test.ts index 83d9e3f..55ee0a3 100644 --- a/tests/crypto-adapter.test.ts +++ b/tests/crypto-adapter.test.ts @@ -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();