diff options
author | Matthew Miller <matthew@millerti.me> | 2023-08-16 21:49:06 -0700 |
---|---|---|
committer | Matthew Miller <matthew@millerti.me> | 2023-08-16 21:49:06 -0700 |
commit | c4c6e352686c3ee7a7bd84e0791b9a17ca21dd78 (patch) | |
tree | 29fd1b5c78ab6198eca03145aa7fcb8a45dbe695 /packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts | |
parent | 01637656a2c323fa72e9e6915321119a94e7feed (diff) |
Add getWebCrypto to isoCrypto
Diffstat (limited to 'packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts')
-rw-r--r-- | packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts new file mode 100644 index 0000000..b9c39ca --- /dev/null +++ b/packages/server/src/helpers/iso/isoCrypto/getWebCrypto.ts @@ -0,0 +1,47 @@ +import type { Crypto } from '../../../deps.ts'; + +let webCrypto: Crypto | undefined = undefined; + +/** + * Try to get an instance of the Crypto API from the current runtime. Should support Node, + * as well as others, like Deno, that implement Web APIs. + */ +export async function getWebCrypto(): Promise<Crypto> { + if (webCrypto) { + return webCrypto; + } + + try { + /** + * Naively attempt a Node import... + */ + // @ts-ignore: We'll handle any errors... + // dnt-shim-ignore + const _crypto = await require('node:crypto'); + webCrypto = _crypto as unknown as Crypto; + } catch (_err) { + /** + * Naively attempt to access Crypto as a global object, which popular alternative run-times + * support. + */ + // @ts-ignore: ...right here. + const _crypto: Crypto = globalThis.crypto; + + if (!_crypto) { + // We tried to access it both in Node and + throw new MissingWebCrypto(); + } + + webCrypto = _crypto; + } + + return webCrypto; +} + +class MissingWebCrypto extends Error { + constructor() { + const message = 'An instance of the Crypto API could not be located'; + super(message); + this.name = 'MissingWebCrypto'; + } +} |