diff --git a/.changeset/wet-comics-love.md b/.changeset/wet-comics-love.md new file mode 100644 index 0000000..b8477de --- /dev/null +++ b/.changeset/wet-comics-love.md @@ -0,0 +1,11 @@ +--- +"@openwallet-foundation/askar-react-native": patch +"@openwallet-foundation/askar-nodejs": patch +"@openwallet-foundation/askar-shared": patch +--- + +fix: wrap the askar registration with a `NativeAskar` class that exposes two static members: a `.instance` getter and `register` method. + +Previously when you did not import the native askar library on the first line (or above all logic that uses Askar) the reference to Askar would be undefined. (i.e. askar-shared is imported before askar-react-native or askar-nodejs) + +The `registerAskar` method and `askar` property are kept for backwards compatibility, but these are still prone to the same error. `registerAskar` integrated with the new `NativeAskar` class, and so all usages within the shared library, as well as the nodejs and react-native wrappers will be fixed. We recommend to update to the new `NativeAskar` class for all other usages. \ No newline at end of file diff --git a/packages/askar-nodejs/package.json b/packages/askar-nodejs/package.json index 92ab1df..d5c9de0 100644 --- a/packages/askar-nodejs/package.json +++ b/packages/askar-nodejs/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@openwallet-foundation/askar-shared": "workspace:*", - "koffi": "^2.9.0" + "koffi": "^2.14.1" }, "devDependencies": { "@types/node": "catalog:", diff --git a/packages/askar-nodejs/src/index.ts b/packages/askar-nodejs/src/index.ts index a4c66e4..a4af288 100644 --- a/packages/askar-nodejs/src/index.ts +++ b/packages/askar-nodejs/src/index.ts @@ -1,7 +1,7 @@ -import { registerAskar } from '@openwallet-foundation/askar-shared' +import { NativeAskar } from '@openwallet-foundation/askar-shared' import { NodeJSAskar } from './NodeJSAskar' export const askarNodeJS = new NodeJSAskar() -registerAskar({ askar: askarNodeJS }) +NativeAskar.register(askarNodeJS) export * from '@openwallet-foundation/askar-shared' diff --git a/packages/askar-nodejs/src/library/register.ts b/packages/askar-nodejs/src/library/register.ts index 1f2b656..9048157 100644 --- a/packages/askar-nodejs/src/library/register.ts +++ b/packages/askar-nodejs/src/library/register.ts @@ -54,7 +54,7 @@ const getLibrary = () => { path.join(p, `${extensions[platform].prefix ?? ''}${LIBNAME}${extensions[platform].extension}`) ) - // Gaurd so we quit if there is no valid path for the library + // Guard so we quit if there is no valid path for the library if (!libraries.some((libraryPath) => doesPathExist(libraryPath))) throw new Error(`Could not find ${LIBNAME} with these paths: ${libraries.join(' ')}`) diff --git a/packages/askar-react-native/src/index.ts b/packages/askar-react-native/src/index.ts index 14c42c7..3d86055 100644 --- a/packages/askar-react-native/src/index.ts +++ b/packages/askar-react-native/src/index.ts @@ -1,4 +1,4 @@ -import { registerAskar } from '@openwallet-foundation/askar-shared' +import { NativeAskar } from '@openwallet-foundation/askar-shared' import { NativeModules } from 'react-native' import type { NativeBindings } from './NativeBindings' @@ -17,4 +17,4 @@ if (!_askar) { declare let _askar: NativeBindings -registerAskar({ askar: new ReactNativeAskar(_askar) }) +NativeAskar.register(new ReactNativeAskar(_askar)) diff --git a/packages/askar-shared/src/askar/register.ts b/packages/askar-shared/src/askar/register.ts index 529a995..d949f16 100644 --- a/packages/askar-shared/src/askar/register.ts +++ b/packages/askar-shared/src/askar/register.ts @@ -1,7 +1,33 @@ +import { AskarError } from '../error' import type { Askar } from './Askar' +/** + * @deprecated use `NativeAskar.instance` instead + */ export let askar: Askar +export class NativeAskar { + static #nativeAskar: Askar | undefined + + public static get instance(): Askar { + if (!NativeAskar.#nativeAskar) + throw AskarError.customError({ + message: + "Native askar has not been registered yet. Make sure to import '@openwallet-foundation/askar-nodejs' or '@openwallet-foundation/askar-react-native', or call 'NativeAskar.register' with a custom implementation.", + }) + + return NativeAskar.#nativeAskar + } + + public static register(nativeAskar: Askar) { + askar = nativeAskar + NativeAskar.#nativeAskar = nativeAskar + } +} + +/** + * @deprecated use `NativeAskar.register` instead + */ export const registerAskar = (options: { askar: Askar }) => { - askar = options.askar + NativeAskar.register(options.askar) } diff --git a/packages/askar-shared/src/crypto/Argon2.ts b/packages/askar-shared/src/crypto/Argon2.ts index 6943233..e876861 100644 --- a/packages/askar-shared/src/crypto/Argon2.ts +++ b/packages/askar-shared/src/crypto/Argon2.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' export enum Argon2Parameters { Moderate = 0, @@ -7,6 +7,6 @@ export enum Argon2Parameters { export class Argon2 { public static derivePassword(parameters: Argon2Parameters, password: Uint8Array, salt: Uint8Array): Uint8Array { - return askar.argon2DerivePassword({ parameters, password, salt }) + return NativeAskar.instance.argon2DerivePassword({ parameters, password, salt }) } } diff --git a/packages/askar-shared/src/crypto/CryptoBox.ts b/packages/askar-shared/src/crypto/CryptoBox.ts index 7a2c595..36730a6 100644 --- a/packages/askar-shared/src/crypto/CryptoBox.ts +++ b/packages/askar-shared/src/crypto/CryptoBox.ts @@ -1,9 +1,9 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { Key } from './Key' export class CryptoBox { public static randomNonce() { - return askar.keyCryptoBoxRandomNonce() + return NativeAskar.instance.keyCryptoBoxRandomNonce() } public static cryptoBox({ @@ -17,7 +17,7 @@ export class CryptoBox { message: Uint8Array nonce: Uint8Array }) { - return askar.keyCryptoBox({ nonce, message, senderKey, recipientKey }) + return NativeAskar.instance.keyCryptoBox({ nonce, message, senderKey, recipientKey }) } public static open({ @@ -31,14 +31,14 @@ export class CryptoBox { message: Uint8Array nonce: Uint8Array }) { - return askar.keyCryptoBoxOpen({ nonce, message, senderKey, recipientKey }) + return NativeAskar.instance.keyCryptoBoxOpen({ nonce, message, senderKey, recipientKey }) } public static seal({ recipientKey, message }: { recipientKey: Key; message: Uint8Array }) { - return askar.keyCryptoBoxSeal({ message, localKeyHandle: recipientKey.handle }) + return NativeAskar.instance.keyCryptoBoxSeal({ message, localKeyHandle: recipientKey.handle }) } public static sealOpen({ recipientKey, ciphertext }: { recipientKey: Key; ciphertext: Uint8Array }) { - return askar.keyCryptoBoxSealOpen({ ciphertext, localKeyHandle: recipientKey.handle }) + return NativeAskar.instance.keyCryptoBoxSealOpen({ ciphertext, localKeyHandle: recipientKey.handle }) } } diff --git a/packages/askar-shared/src/crypto/Ecdh1PU.ts b/packages/askar-shared/src/crypto/Ecdh1PU.ts index 2f69d27..177f5be 100644 --- a/packages/askar-shared/src/crypto/Ecdh1PU.ts +++ b/packages/askar-shared/src/crypto/Ecdh1PU.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { KeyAlgorithm } from '../enums' import { Key } from './Key' @@ -29,7 +29,7 @@ export class Ecdh1PU { ccTag?: Uint8Array }): Key { return new Key( - askar.keyDeriveEcdh1pu({ + NativeAskar.instance.keyDeriveEcdh1pu({ algId: this.algId, receive, apv: this.apv, diff --git a/packages/askar-shared/src/crypto/EcdhEs.ts b/packages/askar-shared/src/crypto/EcdhEs.ts index 44b3a80..839e1bc 100644 --- a/packages/askar-shared/src/crypto/EcdhEs.ts +++ b/packages/askar-shared/src/crypto/EcdhEs.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { askar, NativeAskar } from '../askar' import type { KeyAlgorithm } from '../enums' import { Jwk } from './Jwk' @@ -27,7 +27,7 @@ export class EcdhEs { receive: boolean }): Key { return new Key( - askar.keyDeriveEcdhEs({ + NativeAskar.instance.keyDeriveEcdhEs({ algId: this.algId, receive, apv: this.apv, diff --git a/packages/askar-shared/src/crypto/Key.ts b/packages/askar-shared/src/crypto/Key.ts index 9c25c02..a20c374 100644 --- a/packages/askar-shared/src/crypto/Key.ts +++ b/packages/askar-shared/src/crypto/Key.ts @@ -1,5 +1,5 @@ import { Buffer } from 'buffer' -import { askar } from '../askar' +import { askar, NativeAskar } from '../askar' import type { KeyAlgorithm, KeyBackend, SignatureAlgorithm } from '../enums' import { KeyMethod, keyAlgorithmFromString } from '../enums' import type { LocalKeyHandle } from './handles' @@ -14,7 +14,7 @@ export class Key { } public static generate(algorithm: KeyAlgorithm, keyBackend?: KeyBackend, ephemeral = false) { - return new Key(askar.keyGenerate({ algorithm, keyBackend, ephemeral })) + return new Key(NativeAskar.instance.keyGenerate({ algorithm, keyBackend, ephemeral })) } public static fromSeed({ @@ -26,28 +26,28 @@ export class Key { seed: Uint8Array method?: KeyMethod }) { - return new Key(askar.keyFromSeed({ algorithm, method, seed })) + return new Key(NativeAskar.instance.keyFromSeed({ algorithm, method, seed })) } public static fromSecretBytes(options: { algorithm: KeyAlgorithm; secretKey: Uint8Array }) { - return new Key(askar.keyFromSecretBytes(options)) + return new Key(NativeAskar.instance.keyFromSecretBytes(options)) } public static fromPublicBytes(options: { algorithm: KeyAlgorithm; publicKey: Uint8Array }) { - return new Key(askar.keyFromPublicBytes(options)) + return new Key(NativeAskar.instance.keyFromPublicBytes(options)) } public static fromJwk(options: { jwk: Jwk }) { - return new Key(askar.keyFromJwk(options)) + return new Key(NativeAskar.instance.keyFromJwk(options)) } public convertkey(options: { algorithm: KeyAlgorithm }) { - return new Key(askar.keyConvert({ localKeyHandle: this.handle, ...options })) + return new Key(NativeAskar.instance.keyConvert({ localKeyHandle: this.handle, ...options })) } public keyFromKeyExchange({ algorithm, publicKey }: { algorithm: KeyAlgorithm; publicKey: Key }) { return new Key( - askar.keyFromKeyExchange({ + NativeAskar.instance.keyFromKeyExchange({ skHandle: this.handle, pkHandle: publicKey.handle, algorithm, @@ -60,25 +60,25 @@ export class Key { } public get algorithm() { - const alg = askar.keyGetAlgorithm({ localKeyHandle: this.handle }) + const alg = NativeAskar.instance.keyGetAlgorithm({ localKeyHandle: this.handle }) return keyAlgorithmFromString(alg) } public get ephemeral() { - return Boolean(askar.keyGetEphemeral({ localKeyHandle: this.handle })) + return Boolean(NativeAskar.instance.keyGetEphemeral({ localKeyHandle: this.handle })) } public get publicBytes() { - return askar.keyGetPublicBytes({ localKeyHandle: this.handle }) + return NativeAskar.instance.keyGetPublicBytes({ localKeyHandle: this.handle }) } public get secretBytes() { - return askar.keyGetSecretBytes({ localKeyHandle: this.handle }) + return NativeAskar.instance.keyGetSecretBytes({ localKeyHandle: this.handle }) } public get jwkPublic(): Jwk { return Jwk.fromString( - askar.keyGetJwkPublic({ + NativeAskar.instance.keyGetJwkPublic({ localKeyHandle: this.handle, algorithm: this.algorithm, }) @@ -86,57 +86,57 @@ export class Key { } public get jwkSecret() { - const secretBytes = askar.keyGetJwkSecret({ + const secretBytes = NativeAskar.instance.keyGetJwkSecret({ localKeyHandle: this.handle, }) return Jwk.fromString(Buffer.from(secretBytes).toString()) } public get jwkThumbprint() { - return askar.keyGetJwkThumbprint({ + return NativeAskar.instance.keyGetJwkThumbprint({ localKeyHandle: this.handle, algorithm: this.algorithm, }) } public get aeadParams() { - return askar.keyAeadGetParams({ localKeyHandle: this.handle }) + return NativeAskar.instance.keyAeadGetParams({ localKeyHandle: this.handle }) } public get aeadRandomNonce() { - return askar.keyAeadRandomNonce({ localKeyHandle: this.handle }) + return NativeAskar.instance.keyAeadRandomNonce({ localKeyHandle: this.handle }) } public aeadEncrypt(options: { message: Uint8Array; nonce?: Uint8Array; aad?: Uint8Array }) { - return askar.keyAeadEncrypt({ + return NativeAskar.instance.keyAeadEncrypt({ localKeyHandle: this.handle, ...options, }) } public aeadDecrypt(options: { ciphertext: Uint8Array; nonce: Uint8Array; tag?: Uint8Array; aad?: Uint8Array }) { - return askar.keyAeadDecrypt({ + return NativeAskar.instance.keyAeadDecrypt({ localKeyHandle: this.handle, ...options, }) } public signMessage(options: { message: Uint8Array; sigType?: SignatureAlgorithm }) { - return askar.keySignMessage({ + return NativeAskar.instance.keySignMessage({ localKeyHandle: this.handle, ...options, }) } public verifySignature(options: { message: Uint8Array; signature: Uint8Array; sigType?: SignatureAlgorithm }) { - return askar.keyVerifySignature({ + return NativeAskar.instance.keyVerifySignature({ localKeyHandle: this.handle, ...options, }) } public wrapKey({ other, nonce }: { other: Key; nonce?: Uint8Array }) { - return askar.keyWrapKey({ + return NativeAskar.instance.keyWrapKey({ localKeyHandle: this.handle, other: other.handle, nonce, @@ -144,6 +144,6 @@ export class Key { } public unwrapKey(options: { algorithm: KeyAlgorithm; tag?: Uint8Array; ciphertext: Uint8Array; nonce?: Uint8Array }) { - return new Key(askar.keyUnwrapKey({ localKeyHandle: this.handle, ...options })) + return new Key(NativeAskar.instance.keyUnwrapKey({ localKeyHandle: this.handle, ...options })) } } diff --git a/packages/askar-shared/src/crypto/handles.ts b/packages/askar-shared/src/crypto/handles.ts index 21143ff..13c3a4c 100644 --- a/packages/askar-shared/src/crypto/handles.ts +++ b/packages/askar-shared/src/crypto/handles.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import { AskarError } from '../error' type ArcHandleType = Uint8Array | string | null @@ -28,7 +28,7 @@ export class StoreHandle { } public async close() { - await askar.storeClose({ storeHandle: this }) + await NativeAskar.instance.storeClose({ storeHandle: this }) } public static fromHandle(handle: number | null) { @@ -44,7 +44,7 @@ export class ScanHandle { } public free() { - askar.scanFree({ scanHandle: this }) + NativeAskar.instance.scanFree({ scanHandle: this }) } public static fromHandle(handle: number | null) { @@ -60,7 +60,7 @@ export class SessionHandle { } public async close(commit: boolean) { - await askar.sessionClose({ commit, sessionHandle: this }) + await NativeAskar.instance.sessionClose({ commit, sessionHandle: this }) } public static fromHandle(handle: number | null) { @@ -70,23 +70,23 @@ export class SessionHandle { export class EntryListHandle extends ArcHandle { public getCategory(index: number) { - return askar.entryListGetCategory({ index, entryListHandle: this }) + return NativeAskar.instance.entryListGetCategory({ index, entryListHandle: this }) } public getName(index: number) { - return askar.entryListGetName({ index, entryListHandle: this }) + return NativeAskar.instance.entryListGetName({ index, entryListHandle: this }) } public getValue(index: number) { - return askar.entryListGetValue({ index, entryListHandle: this }) + return NativeAskar.instance.entryListGetValue({ index, entryListHandle: this }) } public getTags(index: number) { - return askar.entryListGetTags({ index, entryListHandle: this }) + return NativeAskar.instance.entryListGetTags({ index, entryListHandle: this }) } public free() { - askar.entryListFree({ entryListHandle: this }) + NativeAskar.instance.entryListFree({ entryListHandle: this }) } public static fromHandle(handle: ArcHandleType) { @@ -96,27 +96,27 @@ export class EntryListHandle extends ArcHandle { export class KeyEntryListHandle extends ArcHandle { public getAlgorithm(index: number) { - return askar.keyEntryListGetAlgorithm({ index, keyEntryListHandle: this }) + return NativeAskar.instance.keyEntryListGetAlgorithm({ index, keyEntryListHandle: this }) } public getName(index: number) { - return askar.keyEntryListGetName({ index, keyEntryListHandle: this }) + return NativeAskar.instance.keyEntryListGetName({ index, keyEntryListHandle: this }) } public getTags(index: number) { - return askar.keyEntryListGetTags({ index, keyEntryListHandle: this }) + return NativeAskar.instance.keyEntryListGetTags({ index, keyEntryListHandle: this }) } public getMetadata(index: number) { - return askar.keyEntryListGetMetadata({ index, keyEntryListHandle: this }) + return NativeAskar.instance.keyEntryListGetMetadata({ index, keyEntryListHandle: this }) } public loadKey(index: number) { - return askar.keyEntryListLoadLocal({ index, keyEntryListHandle: this }) + return NativeAskar.instance.keyEntryListLoadLocal({ index, keyEntryListHandle: this }) } public free() { - askar.keyEntryListFree({ keyEntryListHandle: this }) + NativeAskar.instance.keyEntryListFree({ keyEntryListHandle: this }) } public static fromHandle(handle: ArcHandleType) { @@ -126,7 +126,7 @@ export class KeyEntryListHandle extends ArcHandle { export class LocalKeyHandle extends ArcHandle { public free() { - askar.keyFree({ localKeyHandle: this }) + NativeAskar.instance.keyFree({ localKeyHandle: this }) } public static fromHandle(handle: ArcHandleType) { diff --git a/packages/askar-shared/src/migration.ts b/packages/askar-shared/src/migration.ts index a2f8d73..469f5cc 100644 --- a/packages/askar-shared/src/migration.ts +++ b/packages/askar-shared/src/migration.ts @@ -1,4 +1,4 @@ -import { askar } from './askar' +import { NativeAskar } from './askar' type MigrationOptions = { walletName: string @@ -9,6 +9,6 @@ type MigrationOptions = { export class Migration { public static async migrate(options: MigrationOptions): Promise { - await askar.migrateIndySdk(options) + await NativeAskar.instance.migrateIndySdk(options) } } diff --git a/packages/askar-shared/src/store/EntryList.ts b/packages/askar-shared/src/store/EntryList.ts index 7456a16..51ce60f 100644 --- a/packages/askar-shared/src/store/EntryList.ts +++ b/packages/askar-shared/src/store/EntryList.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { EntryListHandle } from '../crypto' import type { EntryObject } from '.' @@ -10,7 +10,7 @@ export class EntryList { public constructor({ handle, length }: { handle: EntryListHandle; length?: number }) { this._handle = handle - this._length = length || askar.entryListCount({ entryListHandle: handle }) + this._length = length || NativeAskar.instance.entryListCount({ entryListHandle: handle }) } public get handle() { diff --git a/packages/askar-shared/src/store/KeyEntryList.ts b/packages/askar-shared/src/store/KeyEntryList.ts index 6358909..38bebd4 100644 --- a/packages/askar-shared/src/store/KeyEntryList.ts +++ b/packages/askar-shared/src/store/KeyEntryList.ts @@ -1,7 +1,6 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { KeyEntryListHandle } from '../crypto' import type { KeyEntryObject } from '.' - import { KeyEntry } from './KeyEntry' export class KeyEntryList { @@ -10,7 +9,7 @@ export class KeyEntryList { public constructor({ handle }: { handle: KeyEntryListHandle }) { this._handle = handle - this._len = askar.keyEntryListCount({ keyEntryListHandle: handle }) + this._len = NativeAskar.instance.keyEntryListCount({ keyEntryListHandle: handle }) } public get handle() { diff --git a/packages/askar-shared/src/store/OpenSession.ts b/packages/askar-shared/src/store/OpenSession.ts index 6eb1b1c..97241f4 100644 --- a/packages/askar-shared/src/store/OpenSession.ts +++ b/packages/askar-shared/src/store/OpenSession.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { StoreHandle } from '../crypto' import { AskarError } from '../error' @@ -20,7 +20,7 @@ export class OpenSession { public async open() { if (!this.store) throw AskarError.customError({ message: 'Cannot start session from closed store' }) if (this.session) throw AskarError.customError({ message: 'Session already opened' }) - const sessionHandle = await askar.sessionStart({ + const sessionHandle = await NativeAskar.instance.sessionStart({ profile: this.profile, asTransaction: this.isTxn, storeHandle: this.store, diff --git a/packages/askar-shared/src/store/Scan.ts b/packages/askar-shared/src/store/Scan.ts index 912c391..0c71f0e 100644 --- a/packages/askar-shared/src/store/Scan.ts +++ b/packages/askar-shared/src/store/Scan.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { EntryListHandle, ScanHandle } from '../crypto' import { AskarError } from '../error' import type { Entry, EntryObject } from './Entry' @@ -53,7 +53,7 @@ export class Scan { private async forEachRow(cb: (row: Entry, index?: number) => void) { if (!this.handle) { if (!this.store?.handle) throw AskarError.customError({ message: 'Cannot scan from closed store' }) - this._handle = await askar.scanStart({ + this._handle = await NativeAskar.instance.scanStart({ storeHandle: this.store.handle, profile: this.profile, category: this.category, @@ -73,7 +73,7 @@ export class Scan { let recordCount = 0 // Loop while limit not reached (or no limit specified) while (!this.limit || recordCount < this.limit) { - const listHandle = await askar.scanNext({ scanHandle: this._handle }) + const listHandle = await NativeAskar.instance.scanNext({ scanHandle: this._handle }) if (!listHandle) break this._listHandle = listHandle @@ -86,7 +86,7 @@ export class Scan { } } } finally { - askar.scanFree({ scanHandle: this._handle }) + NativeAskar.instance.scanFree({ scanHandle: this._handle }) } } diff --git a/packages/askar-shared/src/store/Session.ts b/packages/askar-shared/src/store/Session.ts index d5a06d6..78602b2 100644 --- a/packages/askar-shared/src/store/Session.ts +++ b/packages/askar-shared/src/store/Session.ts @@ -1,5 +1,5 @@ import { Buffer } from 'buffer' -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { Key, SessionHandle } from '../crypto' import type { KeyAlgorithm } from '../enums' import { EntryOperation } from '../enums/EntryOperation' @@ -28,7 +28,7 @@ export class Session { public async count({ category, tagFilter }: { category?: string; tagFilter?: Record }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot count from closed session' }) - return await askar.sessionCount({ tagFilter, category, sessionHandle: this.handle }) + return await NativeAskar.instance.sessionCount({ tagFilter, category, sessionHandle: this.handle }) } public async fetch({ @@ -44,7 +44,7 @@ export class Session { }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot fetch from a closed session' }) - const handle = await askar.sessionFetch({ forUpdate, name, category, sessionHandle: this.handle }) + const handle = await NativeAskar.instance.sessionFetch({ forUpdate, name, category, sessionHandle: this.handle }) if (!handle) return null const entry = new Entry({ list: handle, position: 0 }) @@ -73,7 +73,7 @@ export class Session { isJson?: boolean }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot fetch all from a closed session' }) - const handle = await askar.sessionFetchAll({ + const handle = await NativeAskar.instance.sessionFetchAll({ forUpdate, limit, tagFilter, @@ -109,7 +109,7 @@ export class Session { if (!this.handle) throw AskarError.customError({ message: 'Cannot insert with a closed session' }) const serializedValue = typeof value === 'string' ? value : JSON.stringify(value) - await askar.sessionUpdate({ + await NativeAskar.instance.sessionUpdate({ value: Uint8Array.from(Buffer.from(serializedValue)), expiryMs, tags, @@ -136,7 +136,7 @@ export class Session { if (!this.handle) throw AskarError.customError({ message: 'Cannot replace with a closed session' }) const serializedValue = typeof value === 'string' ? value : JSON.stringify(value) - await askar.sessionUpdate({ + await NativeAskar.instance.sessionUpdate({ value: Uint8Array.from(Buffer.from(serializedValue)), expiryMs, tags, @@ -150,7 +150,7 @@ export class Session { public async remove({ category, name }: { category: string; name: string }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot remove with a closed session' }) - await askar.sessionUpdate({ + await NativeAskar.instance.sessionUpdate({ name, category, sessionHandle: this.handle, @@ -161,7 +161,7 @@ export class Session { public async removeAll({ category, tagFilter }: { category?: string; tagFilter?: Record }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot remove all with a closed session' }) - await askar.sessionRemoveAll({ + await NativeAskar.instance.sessionRemoveAll({ category, sessionHandle: this.handle, tagFilter, @@ -183,7 +183,7 @@ export class Session { }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot insert a key with a closed session' }) - await askar.sessionInsertKey({ + await NativeAskar.instance.sessionInsertKey({ expiryMs, tags, metadata, @@ -196,7 +196,7 @@ export class Session { public async fetchKey({ name, forUpdate = false }: { name: string; forUpdate?: boolean }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot fetch a key with a closed session' }) - const handle = await askar.sessionFetchKey({ forUpdate, name, sessionHandle: this.handle }) + const handle = await NativeAskar.instance.sessionFetchKey({ forUpdate, name, sessionHandle: this.handle }) if (!handle) return null const keyEntryList = new KeyEntryList({ handle }) @@ -220,7 +220,7 @@ export class Session { forUpdate?: boolean }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot fetch all keys with a closed session' }) - const handle = await askar.sessionFetchAllKeys({ + const handle = await NativeAskar.instance.sessionFetchAllKeys({ forUpdate, limit, tagFilter, @@ -249,12 +249,12 @@ export class Session { expiryMs?: number }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot update a key with a closed session' }) - await askar.sessionUpdateKey({ expiryMs, tags, metadata, name, sessionHandle: this.handle }) + await NativeAskar.instance.sessionUpdateKey({ expiryMs, tags, metadata, name, sessionHandle: this.handle }) } public async removeKey({ name }: { name: string }) { if (!this.handle) throw AskarError.customError({ message: 'Cannot remove a key with a closed session' }) - await askar.sessionRemoveKey({ name, sessionHandle: this.handle }) + await NativeAskar.instance.sessionRemoveKey({ name, sessionHandle: this.handle }) } /** diff --git a/packages/askar-shared/src/store/Store.ts b/packages/askar-shared/src/store/Store.ts index 0c42637..fa04ed9 100644 --- a/packages/askar-shared/src/store/Store.ts +++ b/packages/askar-shared/src/store/Store.ts @@ -1,4 +1,4 @@ -import { askar } from '../askar' +import { NativeAskar } from '../askar' import type { StoreHandle } from '../crypto' import { OpenSession } from './OpenSession' import { Scan } from './Scan' @@ -19,7 +19,7 @@ export class Store { } public static generateRawKey(seed?: Uint8Array) { - return askar.storeGenerateRawKey({ seed }) + return NativeAskar.instance.storeGenerateRawKey({ seed }) } public get uri() { @@ -27,23 +27,23 @@ export class Store { } public async createProfile(name?: string) { - return askar.storeCreateProfile({ storeHandle: this.handle, profile: name }) + return NativeAskar.instance.storeCreateProfile({ storeHandle: this.handle, profile: name }) } public async getDefaultProfile() { - return askar.storeGetDefaultProfile({ storeHandle: this.handle }) + return NativeAskar.instance.storeGetDefaultProfile({ storeHandle: this.handle }) } public async setDefaultProfile(name: string) { - return askar.storeSetDefaultProfile({ storeHandle: this.handle, profile: name }) + return NativeAskar.instance.storeSetDefaultProfile({ storeHandle: this.handle, profile: name }) } public async listProfiles() { - return askar.storeListProfiles({ storeHandle: this.handle }) + return NativeAskar.instance.storeListProfiles({ storeHandle: this.handle }) } public async renameProfile({ fromProfile, toProfile }: { fromProfile: string; toProfile: string }) { - return await askar.storeRenameProfile({ fromProfile, toProfile, storeHandle: this.handle }) + return await NativeAskar.instance.storeRenameProfile({ fromProfile, toProfile, storeHandle: this.handle }) } public async copyProfile({ @@ -55,15 +55,20 @@ export class Store { fromProfile: string toProfile: string }) { - return await askar.storeCopyProfile({ fromProfile, toProfile, fromHandle: this.handle, toHandle: toStore.handle }) + return await NativeAskar.instance.storeCopyProfile({ + fromProfile, + toProfile, + fromHandle: this.handle, + toHandle: toStore.handle, + }) } public async removeProfile(name: string) { - return await askar.storeRemoveProfile({ profile: name, storeHandle: this.handle }) + return await NativeAskar.instance.storeRemoveProfile({ profile: name, storeHandle: this.handle }) } public async rekey({ keyMethod, passKey }: { keyMethod?: StoreKeyMethod; passKey: string }) { - return await askar.storeRekey({ keyMethod: keyMethod?.toUri(), passKey, storeHandle: this.handle }) + return await NativeAskar.instance.storeRekey({ keyMethod: keyMethod?.toUri(), passKey, storeHandle: this.handle }) } public static async provision({ @@ -79,7 +84,7 @@ export class Store { profile?: string recreate: boolean }) { - const handle = await askar.storeProvision({ + const handle = await NativeAskar.instance.storeProvision({ specUri: uri, keyMethod: keyMethod?.toUri(), profile, @@ -100,7 +105,12 @@ export class Store { passKey?: string profile?: string }) { - const handle = await askar.storeOpen({ profile, passKey, keyMethod: keyMethod?.toUri(), specUri: uri }) + const handle = await NativeAskar.instance.storeOpen({ + profile, + passKey, + keyMethod: keyMethod?.toUri(), + specUri: uri, + }) return new Store({ uri, handle }) } @@ -113,7 +123,7 @@ export class Store { } public static async remove(uri: string) { - return await askar.storeRemove({ specUri: uri }) + return await NativeAskar.instance.storeRemove({ specUri: uri }) } public session(profile?: string) { @@ -152,7 +162,7 @@ export class Store { passKey?: string recreate: boolean }) { - await askar.storeCopyTo({ + await NativeAskar.instance.storeCopyTo({ storeHandle: this.handle, targetUri: uri, keyMethod: keyMethod?.toUri(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc467b9..1218bda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,7 +82,7 @@ importers: specifier: workspace:* version: link:../askar-shared koffi: - specifier: ^2.9.0 + specifier: ^2.14.1 version: 2.14.1 devDependencies: '@types/node':