//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
//! SPDX-License-Identifier: GPL-3.0-or-later
+import { browserVaultWorker, nodeVaultWorker } from './vault.mjs'
+
/**
* @type {import('esbuild').BuildOptions}
*/
format: 'esm',
entryPoints: [
{ in: './src/main.ts', out: 'browser.min' }
- ]
+ ],
+ define: {
+ 'VAULT_WORKER': browserVaultWorker
+ }
}
/**
],
external: ['node:worker_threads'],
dropLabels: ['BROWSER'],
- inject: ['./esbuild/inject/fake-indexeddb.mjs']
+ inject: ['./esbuild/inject/fake-indexeddb.mjs'],
+ define: {
+ 'VAULT_WORKER': nodeVaultWorker
+ }
}
--- /dev/null
+//! SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+//! SPDX-License-Identifier: GPL-3.0-or-later
+
+import { build } from 'esbuild'
+
+/**
+ * @type {import('esbuild').BuildOptions}
+ */
+const vaultWorkerOptions = {
+ entryPoints: ['./src/lib/vault/vault-worker.ts'],
+ format: 'esm',
+ target: 'es2024',
+ legalComments: 'inline',
+ bundle: true,
+ write: false,
+}
+
+export const browserVaultWorker = JSON.stringify((await build({
+ ...vaultWorkerOptions,
+ platform: 'browser',
+ dropLabels: ['NODE'],
+})).outputFiles?.[0].text)
+
+export const nodeVaultWorker = JSON.stringify((await build({
+ ...vaultWorkerOptions,
+ platform: 'node',
+ dropLabels: ['BROWSER'],
+})).outputFiles?.[0].text)
//! SPDX-License-Identifier: GPL-3.0-or-later
import { Worker as NodeWorker } from 'node:worker_threads'
-import { default as CONSTANTS } from '../constants'
-import { Bip39, Bip44, Blake2b, NanoNaCl, Secp256k1, WalletAesGcm } from '../crypto'
import { Data } from '../database'
-import { Passkey } from './passkey'
-import { VaultTimer } from './vault-timer'
-import { VaultWorker } from './vault-worker'
type Task = {
id: number
this.#isLocked = true
this.#isTerminated = false
this.#queue = []
- this.#url = URL.createObjectURL(new Blob([blob], { type: 'text/javascript' }))
+ //@ts-expect-error
+ this.#url = URL.createObjectURL(new Blob([VAULT_WORKER], { type: 'text/javascript' }))
BROWSER: this.#worker = new Worker(this.#url, { type: 'module' })
BROWSER: this.#worker.addEventListener('message', message => {
this.#report(message.data)
})
- NODE: this.#worker = new NodeWorker(blob, {
+ //@ts-expect-error
+ NODE: this.#worker = new NodeWorker(VAULT_WORKER, {
eval: true,
stderr: false,
stdout: false
}
}
}
-
-const blob = `
- ${CONSTANTS}
- const ${Secp256k1.name} = ${Secp256k1}
- const ${Bip39.name} = ${Bip39}
- const ${Bip44.name} = ${Bip44}
- const ${Blake2b.name} = ${Blake2b}
- const ${NanoNaCl.name} = ${NanoNaCl}
- const ${WalletAesGcm.name} = ${WalletAesGcm}
- const ${Passkey.name} = ${Passkey}
- const ${VaultTimer.name} = ${VaultTimer}
- const ${VaultWorker.name} = ${VaultWorker}
- ${Secp256k1.name === 'Secp256k1' ? '' : `const Secp256k1 = ${Secp256k1.name}`}
- ${Bip39.name === 'Bip39' ? '' : `const Bip39 = ${Bip39.name}`}
- ${Bip44.name === 'Bip44' ? '' : `const Bip44 = ${Bip44.name}`}
- ${Blake2b.name === 'Blake2b' ? '' : `const Blake2b = ${Blake2b.name}`}
- ${NanoNaCl.name === 'NanoNaCl' ? '' : `const NanoNaCl = ${NanoNaCl.name}`}
- ${WalletAesGcm.name === 'WalletAesGcm' ? '' : `const WalletAesGcm = ${WalletAesGcm.name}`}
- ${Passkey.name === 'Passkey' ? '' : `const Passkey = ${Passkey.name}`}
- ${VaultTimer.name === 'VaultTimer' ? '' : `const VaultTimer = ${VaultTimer.name}`}
- ${VaultWorker.name === 'VaultWorker' ? '' : `const VaultWorker = ${VaultWorker.name}`}
- const v = new VaultWorker()
-`