New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@lo-fi/local-data-lock

Package Overview
Dependencies
Maintainers
0
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@lo-fi/local-data-lock - npm Package Compare versions

Comparing version 0.15.0 to 0.15.1

4

dist/auto/ldl.js
/*! mylofi/Local-Data-Lock: ldl.js
v0.15.0 (c) 2024 Kyle Simpson
v0.15.1 (c) 2024 Kyle Simpson
MIT License: http://getify.mit-license.org
*/
import{supportsWebAuthn as e,regDefaults as t,register as r,authDefaults as a,auth as n,verifyAuthResponse as i,packPublicKeyJSON as o,unpackPublicKeyJSON as s,toBase64String as l,fromBase64String as c,toUTF8String as u,fromUTF8String as y,resetAbortReason as f}from"@lo-fi/webauthn-local-client";const p=1,d=sodium.crypto_sign_SEEDBYTES,g="undefined"!=typeof PublicKeyCredential&&void 0!==PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable&&await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();var k=null,b=null,h={},m=null,w=new WeakMap,K=null,L=setLockKeyCacheLifetime(18e5),v="idb";export{e as supportsWebAuthn,o as packPublicKeyJSON,s as unpackPublicKeyJSON,l as toBase64String,c as fromBase64String,u as toUTF8String,y as fromUTF8String,f as resetAbortReason,g as supportsWAUserVerification,listLocalIdentities,clearLockKeyCache,removeLocalAccount,getLockKey,generateEntropy,deriveLockKey,lockData,unlockData,signData,verifySignature,configure};var E={supportsWebAuthn:e,packPublicKeyJSON:o,unpackPublicKeyJSON:s,toBase64String:l,fromBase64String:c,toUTF8String:u,fromUTF8String:y,resetAbortReason:f,listLocalIdentities:listLocalIdentities,clearLockKeyCache:clearLockKeyCache,removeLocalAccount:removeLocalAccount,getLockKey:getLockKey,generateEntropy:generateEntropy,deriveLockKey:deriveLockKey,lockData:lockData,unlockData:unlockData,signData:signData,verifySignature:verifySignature,configure:configure};export default E;async function listLocalIdentities(){return await checkStorage(),Object.keys(b)}function cacheLockKey(e,t,r=!1){e in h&&!r||(h[e]={...t,timestamp:Date.now()},resetCachePurgeTimer())}function clearLockKeyCache(e){null!=e?delete h[e]:h={},resetCachePurgeTimer()}function resetCachePurgeTimer(){null!=K&&(clearTimeout(K),K=null),function setCachePurgeTimer(){if(null==K){let e=function nextCacheTimestamp(){return(Object.values(h).map((e=>e.timestamp))||[])[0]}();if(null!=e){let t=Math.max(6e4,Math.max(e+L-Date.now(),0)+Math.round(1e4*Math.random()));K=setTimeout(purgeExpiredCacheEntries,t)}}}()}function purgeExpiredCacheEntries(){K=null;var e=Date.now(),t=e-Math.min(L,e);Object.entries(h).filter((([e,r])=>r.timestamp<t)).forEach((([e])=>{delete h[e]})),resetCachePurgeTimer()}async function removeLocalAccount(e){return await checkStorage(),delete h[e],delete b[e],storeLocalIdentities()}async function getLockKey({localIdentity:e=l(generateEntropy(15)),username:o="local-user",displayName:s="Local User",relyingPartyID:c=document.location.hostname,relyingPartyName:u="Local Data Lock",addNewPasskey:y=!1,resetLockKey:f=!1,useLockKey:p=null,verify:g=!0,signal:k}={}){await checkStorage();var w=null!=e?b[e]:null;if(null!=w){let t=function getCachedLockKey(e){var t=Date.now();if(e in h&&h[e].timestamp>=t-Math.min(L,t)){let{timestamp:t,...r}=h[e];return r}}(e);if(null!=t&&!f){if(y){resetAbortToken(k);let{record:e}=await registerLocalIdentity(t)||{};cleanupExternalSignalHandler(m),m=null,null!=e&&(w.lastSeq=e.lastSeq,w.passkeys=[...w.passkeys,...e.passkeys],await storeLocalIdentities())}return Object.freeze({...t,localIdentity:e})}if(delete h[e],f){if(resetAbortToken(k),({record:b[e],lockKey:t}=await registerLocalIdentity(p&&"object"==typeof p?checkLockKey(p):void 0)),cleanupExternalSignalHandler(m),m=null,null==b[e])delete b[e];else if(null!=t)return await storeLocalIdentities(),cacheLockKey(e,t),Object.freeze({...t,localIdentity:e})}else{if(y)throw new Error("Encryption/Decryption key not currently cached, unavailable for new passkey");{resetAbortToken(k);let t=a({relyingPartyID:c,mediation:"optional",allowCredentials:w.passkeys.map((({credentialID:e})=>({type:"public-key",id:e}))),signal:m.signal}),r=await n(t);if(cleanupExternalSignalHandler(m),m=null,null!=r){if(g){let e=w.passkeys.find((e=>e.credentialID==r.response.credentialID)),t=e?.publicKey;if(!(null!=t&&await i(r.response,t)))throw new Error("Auth verification failed")}return{...extractLockKey(r),localIdentity:e}}}}}else if(y){resetAbortToken(k);let{record:t,lockKey:r}=await registerLocalIdentity(p&&"object"==typeof p?checkLockKey(p):void 0)||{};if(cleanupExternalSignalHandler(m),m=null,null!=t&&null!=r)return b[e]=t,cacheLockKey(e,r),await storeLocalIdentities(),Object.freeze({...r,localIdentity:e})}else{resetAbortToken(k);let t=a({relyingPartyID:c,mediation:"optional",signal:m.signal}),r=await n(t);if(cleanupExternalSignalHandler(m),m=null,null!=r){let t=extractLockKey(r),[a]=Object.entries(b).find((([,e])=>null!=e.passkeys.find((e=>e.credentialID==r.response.credentialID))))||[];if(null!=a){if(delete h[e],w=b[e=a],g){let e=w.passkeys.find((e=>e.credentialID==r.response.credentialID)),t=e?.publicKey;if(!(null!=t&&await i(r.response,t)))throw new Error("Auth verification failed")}cacheLockKey(e,t)}else if(g)throw new Error("Auth verification requested but skipped, against unrecognized passkey (no matching local-identity)");return Object.freeze({...t,localIdentity:e})}}async function registerLocalIdentity(a=deriveLockKey()){try{let i=((b[e]||{}).lastSeq||0)+1,l=new Uint8Array(a.iv.byteLength+2),y=new DataView(new ArrayBuffer(2));y.setInt16(0,i,!1),l.set(a.iv,0),l.set(new Uint8Array(y.buffer),a.iv.byteLength);let f=t({relyingPartyID:c,relyingPartyName:u,user:{id:l,name:o,displayName:s},signal:m.signal}),p=await r(f);if(null!=p)return{record:{lastSeq:i,passkeys:[(n={seq:i,credentialID:p.response.credentialID,publicKey:p.response.publicKey},{...n,hash:computePasskeyEntryHash(n)})]},lockKey:a}}catch(e){throw new Error("Identity/Passkey registration failed",{cause:e})}var n}function extractLockKey(t){try{if(t&&t.response&&isByteArray(t.response.userID)&&t.response.userID.byteLength==d+2){let r=deriveLockKey(t.response.userID.subarray(0,d));return cacheLockKey(e,r),r}throw new Error("Passkey info missing")}catch(e){throw new Error("Chosen passkey did not provide a valid encryption/decryption key",{cause:e})}}}function resetAbortToken(e){if(m&&(cleanupExternalSignalHandler(m),m.aborted||m.abort("Passkey operation abandoned.")),m=new AbortController,null!=e)if(e.aborted)m.abort(e.reason);else{let handlerFn=()=>{cleanupExternalSignalHandler(m),m.abort(e.reason),m=e=handlerFn=null};e.addEventListener("abort",handlerFn),w.set(m,[e,handlerFn])}}function cleanupExternalSignalHandler(e){if(null!=e&&w.has(e)){let[t,r]=w.get(e);t.removeEventListener("abort",r),w.delete(e)}}function generateEntropy(e=16){return sodium.randombytes_buf(e)}function deriveLockKey(e=generateEntropy(d)){try{let t=sodium.crypto_sign_seed_keypair(e);return{keyFormatVersion:p,iv:e,publicKey:t.publicKey,privateKey:t.privateKey,encPK:sodium.crypto_sign_ed25519_pk_to_curve25519(t.publicKey),encSK:sodium.crypto_sign_ed25519_sk_to_curve25519(t.privateKey)}}catch(e){throw new Error("Encryption/decryption key derivation failed.",{cause:e})}}function checkLockKey(e){if(e&&"object"==typeof e){if(e.keyFormatVersion===p)return e;if(isByteArray(e.iv)&&e.iv.byteLength==d)return deriveLockKey(e.iv)}throw new Error("Unrecongnized lock-key")}function lockData(e,t,{outputFormat:r="base64"}={}){try{let a=dataToBuffer(e),n=sodium.crypto_box_seal(a,t.encPK);return["base64","base-64"].includes(r.toLowerCase())?l(n):n}catch(e){throw new Error("Data encryption failed.",{cause:e})}}function unlockData(e,t,{outputFormat:r="utf8",parseJSON:a=!0}={}){try{let n=sodium.crypto_box_seal_open("string"==typeof e?c(e):e,t.encPK,t.encSK);if(["utf8","utf-8"].includes(r.toLowerCase())){let e=u(n);return a?JSON.parse(e):e}return n}catch(e){throw new Error("Data decryption failed.",{cause:e})}}function signData(e,{privateKey:t}={},{outputFormat:r="base64"}={}){try{let a=sodium.crypto_sign_detached(dataToBuffer(e),t);return["base64","base-64"].includes(r.toLowerCase())?l(a):a}catch(e){throw new Error("Data signature failed.",{cause:e})}}function verifySignature(e,{publicKey:t}={},r){try{return sodium.crypto_sign_verify_detached("string"==typeof r?c(r):r,dataToBuffer(e),t)}catch(e){throw new Error("Data signature failed.",{cause:e})}}async function storeLocalIdentities(){await checkStorage();var e=Object.fromEntries(Object.entries(b).map((([e,t])=>[e,{...t,passkeys:t.passkeys.map((e=>({...e,publicKey:o(e.publicKey)})))}])));Object.keys(e).length>0?await k.set("local-identities",e):await k.remove("local-identities")}function setLockKeyCacheLifetime(e){try{return L=Math.max(0,Number(e)||0)}finally{resetCachePurgeTimer()}}function configure({accountStorage:e,cacheLifetime:t}={}){null!=e&&function configureStorage(e){if(["idb","local-storage","session-storage","cookie","opfs","opfs-worker"].includes(e))v=e,b=k=null;else{if("object"!=typeof e||"string"!=typeof e.storageType||!["has","get","set","remove","keys","entries"].every((t=>"function"==typeof e[t])))throw new Error(`Unrecognized storage type ('${storageType}')`);k=e,v=e.storageType,b=null}}(e),null!=t&&setLockKeyCacheLifetime(t)}function dataToBuffer(e){var t=null==e?null:e instanceof ArrayBuffer?new Uint8Array(e):isByteArray(e)?e:y("object"==typeof e?JSON.stringify(e):"string"==typeof e?e:String(e));if(null==t)throw new Error("Non-empty data required.");return t}function isByteArray(e){return e instanceof Uint8Array&&e.buffer instanceof ArrayBuffer}function computePasskeyEntryHash(e){let{hash:t,...r}=e;return l(sodium.crypto_hash(JSON.stringify({...r,publicKey:o(r.publicKey)})))}async function checkStorage(){if(null==k){if(!["idb","local-storage","session-storage","cookie","opfs","opfs-worker"].includes(v))throw new Error(`Unrecognized storage type ('${v}')`);k="idb"==v?await import("@byojs/storage/idb"):"local-storage"==v?await import("@byojs/storage/local-storage"):"session-storage"==v?await import("@byojs/storage/session-storage"):"cookie"==v?await import("@byojs/storage/cookie"):"opfs"==v?await import("@byojs/storage/opfs"):"opfs-worker"==v?await import("@byojs/storage/opfs-worker"):null}null!=k&&null==b&&(b=await async function loadLocalIdentities(){return Object.fromEntries(Object.entries(await k.get("local-identities")||{}).filter((([e,t])=>"number"==typeof t.lastSeq&&Array.isArray(t.passkeys)&&t.passkeys.length>0&&t.passkeys.every((e=>"string"==typeof e.credentialID&&""!=e.credentialID&&"number"==typeof e.seq&&null!=e.publicKey&&"object"==typeof e.publicKey&&"number"==typeof e.publicKey.algoCOSE&&"string"==typeof e.publicKey.raw&&""!=e.publicKey.raw&&"string"==typeof e.publicKey.spki&&""!=e.publicKey.spki&&"string"==typeof e.hash&&""!=e.hash&&e.hash==computePasskeyEntryHash(e))))).map((([e,t])=>[e,{...t,passkeys:t.passkeys.map((e=>({...e,publicKey:s(e.publicKey)})))}])))}())}
import{supportsWebAuthn as e,regDefaults as t,register as r,authDefaults as a,auth as n,verifyAuthResponse as i,packPublicKeyJSON as o,unpackPublicKeyJSON as s,toBase64String as l,fromBase64String as c,toUTF8String as u,fromUTF8String as y,resetAbortReason as p}from"@lo-fi/webauthn-local-client";const f=1,d=sodium.crypto_sign_SEEDBYTES,g="undefined"!=typeof PublicKeyCredential&&void 0!==PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable&&await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();var k=null,b=null,h={},m=null,w=new WeakMap,K=null,L=setLockKeyCacheLifetime(18e5),v="idb";export{e as supportsWebAuthn,o as packPublicKeyJSON,s as unpackPublicKeyJSON,l as toBase64String,c as fromBase64String,u as toUTF8String,y as fromUTF8String,p as resetAbortReason,g as supportsWAUserVerification,listLocalIdentities,clearLockKeyCache,removeLocalAccount,getLockKey,generateEntropy,deriveLockKey,lockData,unlockData,signData,verifySignature,configure};var E={supportsWebAuthn:e,packPublicKeyJSON:o,unpackPublicKeyJSON:s,toBase64String:l,fromBase64String:c,toUTF8String:u,fromUTF8String:y,resetAbortReason:p,supportsWAUserVerification:g,listLocalIdentities:listLocalIdentities,clearLockKeyCache:clearLockKeyCache,removeLocalAccount:removeLocalAccount,getLockKey:getLockKey,generateEntropy:generateEntropy,deriveLockKey:deriveLockKey,lockData:lockData,unlockData:unlockData,signData:signData,verifySignature:verifySignature,configure:configure};export default E;async function listLocalIdentities(){return await checkStorage(),Object.keys(b)}function cacheLockKey(e,t,r=!1){e in h&&!r||(h[e]={...t,timestamp:Date.now()},resetCachePurgeTimer())}function clearLockKeyCache(e){null!=e?delete h[e]:h={},resetCachePurgeTimer()}function resetCachePurgeTimer(){null!=K&&(clearTimeout(K),K=null),function setCachePurgeTimer(){if(null==K){let e=function nextCacheTimestamp(){return(Object.values(h).map((e=>e.timestamp))||[])[0]}();if(null!=e){let t=Math.max(6e4,Math.max(e+L-Date.now(),0)+Math.round(1e4*Math.random()));K=setTimeout(purgeExpiredCacheEntries,t)}}}()}function purgeExpiredCacheEntries(){K=null;var e=Date.now(),t=e-Math.min(L,e);Object.entries(h).filter((([e,r])=>r.timestamp<t)).forEach((([e])=>{delete h[e]})),resetCachePurgeTimer()}async function removeLocalAccount(e){return await checkStorage(),delete h[e],delete b[e],storeLocalIdentities()}async function getLockKey({localIdentity:e=l(generateEntropy(15)),username:o="local-user",displayName:s="Local User",relyingPartyID:c=document.location.hostname,relyingPartyName:u="Local Data Lock",addNewPasskey:y=!1,resetLockKey:p=!1,useLockKey:f=null,verify:g=!0,signal:k}={}){await checkStorage();var w=null!=e?b[e]:null;if(null!=w){let t=function getCachedLockKey(e){var t=Date.now();if(e in h&&h[e].timestamp>=t-Math.min(L,t)){let{timestamp:t,...r}=h[e];return r}}(e);if(null!=t&&!p){if(y){resetAbortToken(k);let{record:e}=await registerLocalIdentity(t)||{};cleanupExternalSignalHandler(m),m=null,null!=e&&(w.lastSeq=e.lastSeq,w.passkeys=[...w.passkeys,...e.passkeys],await storeLocalIdentities())}return Object.freeze({...t,localIdentity:e})}if(delete h[e],p){if(resetAbortToken(k),({record:b[e],lockKey:t}=await registerLocalIdentity(f&&"object"==typeof f?checkLockKey(f):void 0)),cleanupExternalSignalHandler(m),m=null,null==b[e])delete b[e];else if(null!=t)return await storeLocalIdentities(),cacheLockKey(e,t),Object.freeze({...t,localIdentity:e})}else{if(y)throw new Error("Encryption/Decryption key not currently cached, unavailable for new passkey");{resetAbortToken(k);let t=a({relyingPartyID:c,mediation:"optional",allowCredentials:w.passkeys.map((({credentialID:e})=>({type:"public-key",id:e}))),signal:m.signal}),r=await n(t);if(cleanupExternalSignalHandler(m),m=null,null!=r){if(g){let e=w.passkeys.find((e=>e.credentialID==r.response.credentialID)),t=e?.publicKey;if(!(null!=t&&await i(r.response,t)))throw new Error("Auth verification failed")}return{...extractLockKey(r),localIdentity:e}}}}}else if(y){resetAbortToken(k);let{record:t,lockKey:r}=await registerLocalIdentity(f&&"object"==typeof f?checkLockKey(f):void 0)||{};if(cleanupExternalSignalHandler(m),m=null,null!=t&&null!=r)return b[e]=t,cacheLockKey(e,r),await storeLocalIdentities(),Object.freeze({...r,localIdentity:e})}else{resetAbortToken(k);let t=a({relyingPartyID:c,mediation:"optional",signal:m.signal}),r=await n(t);if(cleanupExternalSignalHandler(m),m=null,null!=r){let t=extractLockKey(r),[a]=Object.entries(b).find((([,e])=>null!=e.passkeys.find((e=>e.credentialID==r.response.credentialID))))||[];if(null!=a){if(delete h[e],w=b[e=a],g){let e=w.passkeys.find((e=>e.credentialID==r.response.credentialID)),t=e?.publicKey;if(!(null!=t&&await i(r.response,t)))throw new Error("Auth verification failed")}cacheLockKey(e,t)}else if(g)throw new Error("Auth verification requested but skipped, against unrecognized passkey (no matching local-identity)");return Object.freeze({...t,localIdentity:e})}}async function registerLocalIdentity(a=deriveLockKey()){try{let i=((b[e]||{}).lastSeq||0)+1,l=new Uint8Array(a.iv.byteLength+2),y=new DataView(new ArrayBuffer(2));y.setInt16(0,i,!1),l.set(a.iv,0),l.set(new Uint8Array(y.buffer),a.iv.byteLength);let p=t({relyingPartyID:c,relyingPartyName:u,user:{id:l,name:o,displayName:s},signal:m.signal}),f=await r(p);if(null!=f)return{record:{lastSeq:i,passkeys:[(n={seq:i,credentialID:f.response.credentialID,publicKey:f.response.publicKey},{...n,hash:computePasskeyEntryHash(n)})]},lockKey:a}}catch(e){throw new Error("Identity/Passkey registration failed",{cause:e})}var n}function extractLockKey(t){try{if(t&&t.response&&isByteArray(t.response.userID)&&t.response.userID.byteLength==d+2){let r=deriveLockKey(t.response.userID.subarray(0,d));return cacheLockKey(e,r),r}throw new Error("Passkey info missing")}catch(e){throw new Error("Chosen passkey did not provide a valid encryption/decryption key",{cause:e})}}}function resetAbortToken(e){if(m&&(cleanupExternalSignalHandler(m),m.aborted||m.abort("Passkey operation abandoned.")),m=new AbortController,null!=e)if(e.aborted)m.abort(e.reason);else{let handlerFn=()=>{cleanupExternalSignalHandler(m),m.abort(e.reason),m=e=handlerFn=null};e.addEventListener("abort",handlerFn),w.set(m,[e,handlerFn])}}function cleanupExternalSignalHandler(e){if(null!=e&&w.has(e)){let[t,r]=w.get(e);t.removeEventListener("abort",r),w.delete(e)}}function generateEntropy(e=16){return sodium.randombytes_buf(e)}function deriveLockKey(e=generateEntropy(d)){try{let t=sodium.crypto_sign_seed_keypair(e);return{keyFormatVersion:f,iv:e,publicKey:t.publicKey,privateKey:t.privateKey,encPK:sodium.crypto_sign_ed25519_pk_to_curve25519(t.publicKey),encSK:sodium.crypto_sign_ed25519_sk_to_curve25519(t.privateKey)}}catch(e){throw new Error("Encryption/decryption key derivation failed.",{cause:e})}}function checkLockKey(e){if(e&&"object"==typeof e){if(e.keyFormatVersion===f)return e;if(isByteArray(e.iv)&&e.iv.byteLength==d)return deriveLockKey(e.iv)}throw new Error("Unrecongnized lock-key")}function lockData(e,t,{outputFormat:r="base64"}={}){try{let a=dataToBuffer(e),n=sodium.crypto_box_seal(a,t.encPK);return["base64","base-64"].includes(r.toLowerCase())?l(n):n}catch(e){throw new Error("Data encryption failed.",{cause:e})}}function unlockData(e,t,{outputFormat:r="utf8",parseJSON:a=!0}={}){try{let n=sodium.crypto_box_seal_open("string"==typeof e?c(e):e,t.encPK,t.encSK);if(["utf8","utf-8"].includes(r.toLowerCase())){let e=u(n);return a?JSON.parse(e):e}return n}catch(e){throw new Error("Data decryption failed.",{cause:e})}}function signData(e,{privateKey:t}={},{outputFormat:r="base64"}={}){try{let a=sodium.crypto_sign_detached(dataToBuffer(e),t);return["base64","base-64"].includes(r.toLowerCase())?l(a):a}catch(e){throw new Error("Data signature failed.",{cause:e})}}function verifySignature(e,{publicKey:t}={},r){try{return sodium.crypto_sign_verify_detached("string"==typeof r?c(r):r,dataToBuffer(e),t)}catch(e){throw new Error("Data signature failed.",{cause:e})}}async function storeLocalIdentities(){await checkStorage();var e=Object.fromEntries(Object.entries(b).map((([e,t])=>[e,{...t,passkeys:t.passkeys.map((e=>({...e,publicKey:o(e.publicKey)})))}])));Object.keys(e).length>0?await k.set("local-identities",e):await k.remove("local-identities")}function setLockKeyCacheLifetime(e){try{return L=Math.max(0,Number(e)||0)}finally{resetCachePurgeTimer()}}function configure({accountStorage:e,cacheLifetime:t}={}){null!=e&&function configureStorage(e){if(["idb","local-storage","session-storage","cookie","opfs","opfs-worker"].includes(e))v=e,b=k=null;else{if("object"!=typeof e||"string"!=typeof e.storageType||!["has","get","set","remove","keys","entries"].every((t=>"function"==typeof e[t])))throw new Error(`Unrecognized storage type ('${storageType}')`);k=e,v=e.storageType,b=null}}(e),null!=t&&setLockKeyCacheLifetime(t)}function dataToBuffer(e){var t=null==e?null:e instanceof ArrayBuffer?new Uint8Array(e):isByteArray(e)?e:y("object"==typeof e?JSON.stringify(e):"string"==typeof e?e:String(e));if(null==t)throw new Error("Non-empty data required.");return t}function isByteArray(e){return e instanceof Uint8Array&&e.buffer instanceof ArrayBuffer}function computePasskeyEntryHash(e){let{hash:t,...r}=e;return l(sodium.crypto_hash(JSON.stringify({...r,publicKey:o(r.publicKey)})))}async function checkStorage(){if(null==k){if(!["idb","local-storage","session-storage","cookie","opfs","opfs-worker"].includes(v))throw new Error(`Unrecognized storage type ('${v}')`);k="idb"==v?await import("@byojs/storage/idb"):"local-storage"==v?await import("@byojs/storage/local-storage"):"session-storage"==v?await import("@byojs/storage/session-storage"):"cookie"==v?await import("@byojs/storage/cookie"):"opfs"==v?await import("@byojs/storage/opfs"):"opfs-worker"==v?await import("@byojs/storage/opfs-worker"):null}null!=k&&null==b&&(b=await async function loadLocalIdentities(){return Object.fromEntries(Object.entries(await k.get("local-identities")||{}).filter((([e,t])=>"number"==typeof t.lastSeq&&Array.isArray(t.passkeys)&&t.passkeys.length>0&&t.passkeys.every((e=>"string"==typeof e.credentialID&&""!=e.credentialID&&"number"==typeof e.seq&&null!=e.publicKey&&"object"==typeof e.publicKey&&"number"==typeof e.publicKey.algoCOSE&&"string"==typeof e.publicKey.raw&&""!=e.publicKey.raw&&"string"==typeof e.publicKey.spki&&""!=e.publicKey.spki&&"string"==typeof e.hash&&""!=e.hash&&e.hash==computePasskeyEntryHash(e))))).map((([e,t])=>[e,{...t,passkeys:t.passkeys.map((e=>({...e,publicKey:s(e.publicKey)})))}])))}())}
{
"name": "@lo-fi/local-data-lock",
"description": "Protect local-first app data with encryption/decryption key secured in WebAuthn (biometric) passkeys",
"version": "0.15.0",
"version": "0.15.1",
"exports": {

@@ -6,0 +6,0 @@ ".": "./dist/bundlers/ldl.mjs",

@@ -78,2 +78,3 @@ import {

// main library API:
supportsWAUserVerification,
listLocalIdentities,

@@ -80,0 +81,0 @@ clearLockKeyCache,

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc