@secured-ai/react 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,22 +19,22 @@ npm install @secured-ai/react @secured-ai/core
19
19
  ## Basic usage
20
20
 
21
21
  ```tsx
22
- import { PrivacyClient } from '@secured-ai/core'
23
- import { SecuredProvider, useObfuscate } from '@secured-ai/react'
22
+ import { PrivacyClient } from "@secured-ai/core";
23
+ import { SecuredProvider, useObfuscate } from "@secured-ai/react";
24
24
 
25
- const client = new PrivacyClient()
25
+ const client = new PrivacyClient();
26
26
 
27
27
  function Composer() {
28
- const { obfuscate, restore, lastResult, isPending } = useObfuscate()
28
+ const { obfuscate, restore, lastResult, isPending } = useObfuscate();
29
29
 
30
30
  async function sendMessage(text: string) {
31
- const result = await obfuscate(text)
31
+ const result = await obfuscate(text);
32
32
  // Send result.processed to your AI provider.
33
33
  // Use restore(aiResponse, result.sessionId) before displaying the response.
34
- return result
34
+ return result;
35
35
  }
36
36
 
37
- return null
37
+ return null;
38
38
  }
39
39
 
40
40
  export function App() {
@@ -42,14 +42,31 @@ export function App() {
42
42
  <SecuredProvider client={client}>
43
43
  <Composer />
44
44
  </SecuredProvider>
45
- )
45
+ );
46
46
  }
47
47
  ```
48
48
 
49
+ ## Vite setup
50
+
51
+ If you use Vite, exclude the Secured packages from dependency optimization so the browser can load the core package worker file from the package `dist` directory during local development:
52
+
53
+ ```ts
54
+ import { defineConfig } from "vite";
55
+
56
+ export default defineConfig({
57
+ optimizeDeps: {
58
+ exclude: ["@secured-ai/core", "@secured-ai/react"],
59
+ },
60
+ build: {
61
+ target: "es2020",
62
+ },
63
+ });
64
+ ```
65
+
49
66
  ## Publishing contents
50
67
 
51
68
  The npm package is built from `dist` only. Source files, tests, coverage output, and source maps are not included in the published package.
52
69
 
53
70
  ## Docs
54
71
 
55
- See the developer documentation at https://dev-docs.securedai.com/docs.
72
+ See the developer documentation at https://dev-docs.securedai.com/docs/react.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),core=require('@secured-ai/core');var f=react.createContext(null);var j={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function U(){let e={...j},t=new Set;function r(){for(let s of t)s();}return {subscribe(s){return t.add(s),()=>t.delete(s)},getSnapshot(){return e},onProgress(s){e={...e,initProgress:{overall:s.percent,engines:{...e.initProgress.engines,[s.engine]:s.percent}}},r();},onReady(s,o,p){e={...e,isReady:s,isFullyReady:o,readyEngines:p,error:null},r();},onError(s){e={...e,error:s},r();}}}function K({client:e,autoInitialize:t=true,children:r}){let s=react.useMemo(()=>U(),[e]),o=react.useRef(false),p=react.useRef(0),a=react.useRef(new Set),c=react.useCallback(()=>{p.current+=1;for(let l of a.current)l();},[]),S=react.useCallback(l=>(a.current.add(l),()=>a.current.delete(l)),[]),g=react.useCallback(()=>p.current,[]);react.useEffect(()=>{typeof window>"u"||t&&(o.current||(o.current=true,e.initialize().then(()=>{s.onReady(e.isReady,e.isFullyReady,e.readyEngines);}).catch(l=>{s.onError(l instanceof Error?l:new Error(String(l)));})));},[e,t,s]);let d=react.useMemo(()=>({client:e,store:s,notifySessionChange:c,subscribeToSessions:S,getSessionVersion:g}),[e,s,c,S,g]);return jsxRuntime.jsx(f.Provider,{value:d,children:r})}function Z(){let e=react.useContext(f);if(!e)throw new Error("[usePrivacyClient] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");return e.client}var te={isEnabled:false,isInitialized:false,activeThreadId:null,cacheNamespace:null,hasGlobalSnapshot:false,isGlobalSnapshotStale:false};function re(){let e=react.useContext(f);if(!e)throw new Error("[useVault] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");let{vault:t}=e.client,[r,s]=react.useState(t.getStatus?.()??te),o=react.useCallback(()=>{s(t.getStatus());},[t]),p=react.useCallback(async c=>{await t.setThreadContext(c),o();},[o,t]),a=react.useCallback(async()=>{await t.refreshContext(),o();},[o,t]);return {vault:t,status:r,getGlobalSnapshot:()=>t.getGlobalSnapshot(),getThreadSnapshot:c=>t.getThreadSnapshot(c),getRuntimeThreadEntries:c=>t.getRuntimeThreadEntries(c),getPendingEntries:()=>t.getPendingEntries(),setThreadContext:p,refreshContext:a}}var k={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function oe(){let e=react.useContext(f);return react.useSyncExternalStore(e?e.store.subscribe:()=>()=>{},e?e.store.getSnapshot:()=>k,()=>k)}function le(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async g=>{if(!e)return Promise.resolve({entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true});o(true),a(null);try{let d=await e.client.detect(g);return r(d),d}catch(d){let l=d instanceof Error?d:new Error(String(d));return a(l),r(null),{entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true}}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {detect:c,data:t,isPending:s,error:p,reset:S}}function fe(e={}){let{debounce:t=300,enabled:r=true}=e,s=react.useContext(f),[o,p]=react.useState([]),[a,c]=react.useState([]),[S,g]=react.useState(null),[d,l]=react.useState(false),[m,y]=react.useState(false),[n,i]=react.useState(null),u=react.useRef(null),R=react.useCallback(()=>{u.current!==null&&(clearTimeout(u.current),u.current=null);},[]);react.useEffect(()=>()=>R(),[R]);let L=react.useCallback(W=>{!r||!s||(R(),y(true),u.current=setTimeout(async()=>{u.current=null,y(false),l(true),i(null);try{let x=await s.client.detect(W);g(x),p(x.entities),c(x.sensitiveEntities);}catch(x){i(x instanceof Error?x:new Error(String(x))),g(null),p([]),c([]);}finally{l(false);}},t));},[s,r,t,R]),Y=react.useCallback(()=>{R(),g(null),p([]),c([]),l(false),y(false),i(null);},[R]);return {scan:L,data:S,entities:o,sensitiveEntities:a,isScanning:d,isPending:m,error:n,reset:Y}}var O={restored:"",mappingsApplied:0,success:false};function pe(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(null),[p,a]=react.useState(false),[c,S]=react.useState(null),g=react.useCallback(async(m,y)=>{if(!e)return {processed:m,sessionId:"",hasSensitiveData:false};a(true),S(null);try{let n=await e.client.obfuscate(m,y);return r(n),o(n.sessionId),e.notifySessionChange(),n}catch(n){let i=n instanceof Error?n:new Error(String(n));return S(i),r(null),{processed:m,sessionId:"",hasSensitiveData:false}}finally{a(false);}},[e]),d=react.useCallback(async(m,y)=>{if(!e)return O;let n=y??s;if(!n)return O;a(true),S(null);try{return await e.client.restore(m,n)}catch(i){let u=i instanceof Error?i:new Error(String(i));return S(u),O}finally{a(false);}},[e,s]),l=react.useCallback(()=>{r(null),o(null),S(null),a(false);},[]);return {obfuscate:g,restore:d,lastResult:t,sessionId:s,isPending:p,error:c,reset:l}}function ge(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(null),p=react.useCallback((n,i,u)=>{if(!e)return;let R=e.client.createTextReview(n,i,u);r(R),o(null);},[e]),a=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewItemMode(u,n,i));},[e]),c=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewReplacement(u,n,i));},[e]),S=react.useCallback(n=>{e&&r(i=>i&&e.client.removeTextReviewItem(i,n));},[e]),g=react.useCallback(n=>{e&&r(i=>i&&e.client.restoreTextReviewItem(i,n));},[e]),d=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.addTextReviewEntity(u,n,i));},[e]),l=react.useCallback(async()=>{if(!e||!t)return null;let n=await e.client.finalizeTextReview(t);return o(n),e.notifySessionChange(),n},[e,t]),m=react.useCallback(n=>{r(n),o(null);},[]),y=react.useCallback(()=>{r(null),o(null);},[]);return {review:t,items:t?.items??[],preview:e&&t?e.client.previewTextReview(t):null,lastFinalized:s,initialize:p,setReplacement:c,setMode:a,removeItem:S,restoreItem:g,addEntity:d,finalize:l,hydrate:m,reset:y}}function ye(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async(g,d)=>{if(!e)return {restored:g,mappingsApplied:0,success:false};o(true),a(null);try{let l=await e.client.restore(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),{restored:g,mappingsApplied:0,success:false}}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {restore:c,data:t,isPending:s,error:p,reset:S}}var xe=[];function Pe(){let e=react.useContext(f);react.useSyncExternalStore(e?e.subscribeToSessions:()=>()=>{},e?e.getSessionVersion:()=>0,()=>0);let t=e?e.client.getSessions():xe,r=react.useCallback(o=>{e&&(e.client.clearSession(o),e.notifySessionChange());},[e]),s=react.useCallback(()=>{e&&(e.client.clearAllSessions(),e.notifySessionChange());},[e]);return {sessions:t,clearSession:r,clearAll:s}}function he(e,t,r){t.current=t.current.filter(s=>s.token!==e);for(let[s,o]of r.current.entries())o.token===e&&r.current.delete(s);}function Ce(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),[c,S]=react.useState(null),g=react.useRef([]),d=react.useRef(new Map);react.useEffect(()=>{let y=e?.client;if(y?.subscribeToJobProgress)return y.subscribeToJobProgress(n=>{if(n.progress.operation!=="detectInFile")return;let i=d.current.get(n.requestId);!i&&n.progress.phase==="starting"&&(i=g.current.shift(),i&&(i.requestId=n.requestId,d.current.set(n.requestId,i))),i&&(S(n.progress),i.onProgress?.(n.progress),n.progress.phase==="done"&&d.current.delete(n.requestId));})},[e]);let l=react.useCallback(async(y,n)=>{if(!e)return {entities:[],text:"",processingTime:0,fileType:"txt"};let i=Symbol("detectInFile");g.current.push({token:i,onProgress:n?.onProgress}),o(true),a(null),S(null);try{let u=await e.client.detectInFile(y);return r(u),u}catch(u){let R=u instanceof Error?u:new Error(String(u));return a(R),r(null),{entities:[],text:"",processingTime:0,fileType:"txt"}}finally{he(i,g,d),o(false);}},[e]),m=react.useCallback(()=>{r(null),a(null),o(false),S(null);},[]);return {detectInFile:l,data:t,isPending:s,error:p,progress:c,reset:m}}function we(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async(g,d)=>{if(!e)return new Blob;o(true),a(null);try{let l=await e.client.obfuscateFile(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),new Blob}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {obfuscateFile:c,data:t,isPending:s,error:p,reset:S}}var mt="0.1.0";Object.defineProperty(exports,"DefaultVaultRepository",{enumerable:true,get:function(){return core.DefaultVaultRepository}});Object.defineProperty(exports,"ENTITY_TYPES",{enumerable:true,get:function(){return core.ENTITY_TYPES}});Object.defineProperty(exports,"IndexedDbVaultCache",{enumerable:true,get:function(){return core.IndexedDbVaultCache}});Object.defineProperty(exports,"LocalStorageVaultCache",{enumerable:true,get:function(){return core.LocalStorageVaultCache}});Object.defineProperty(exports,"MemoryVaultCache",{enumerable:true,get:function(){return core.MemoryVaultCache}});Object.defineProperty(exports,"PrivacyClient",{enumerable:true,get:function(){return core.PrivacyClient}});Object.defineProperty(exports,"SessionStorageVaultCache",{enumerable:true,get:function(){return core.SessionStorageVaultCache}});Object.defineProperty(exports,"StringMatcher",{enumerable:true,get:function(){return core.StringMatcher}});Object.defineProperty(exports,"VaultManager",{enumerable:true,get:function(){return core.VaultManager}});Object.defineProperty(exports,"WebCryptoVaultCrypto",{enumerable:true,get:function(){return core.WebCryptoVaultCrypto}});Object.defineProperty(exports,"canonicalizeVaultEntityType",{enumerable:true,get:function(){return core.canonicalizeVaultEntityType}});Object.defineProperty(exports,"defaultStringMatcher",{enumerable:true,get:function(){return core.defaultStringMatcher}});Object.defineProperty(exports,"deobfuscateWithVaultEntries",{enumerable:true,get:function(){return core.deobfuscateWithVaultEntries}});Object.defineProperty(exports,"lenientStringMatcher",{enumerable:true,get:function(){return core.lenientStringMatcher}});Object.defineProperty(exports,"normalizeVaultEntryKey",{enumerable:true,get:function(){return core.normalizeVaultEntryKey}});Object.defineProperty(exports,"strictStringMatcher",{enumerable:true,get:function(){return core.strictStringMatcher}});Object.defineProperty(exports,"vaultEntityTypesMatch",{enumerable:true,get:function(){return core.vaultEntityTypesMatch}});Object.defineProperty(exports,"vaultEntryMatchesEntity",{enumerable:true,get:function(){return core.vaultEntryMatchesEntity}});exports.SecuredProvider=K;exports.useDetect=le;exports.useFileDetect=Ce;exports.useFileObfuscate=we;exports.useObfuscate=pe;exports.usePrivacyClient=Z;exports.usePrivacyStatus=oe;exports.useRestore=ye;exports.useScan=fe;exports.useSessions=Pe;exports.useTextReview=ge;exports.useVault=re;exports.version=mt;
1
+ 'use strict';var react=require('react'),jsxRuntime=require('react/jsx-runtime'),core=require('@secured-ai/core');var f=react.createContext(null);var j={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function U(){let e={...j},t=new Set;function r(){for(let s of t)s();}return {subscribe(s){return t.add(s),()=>t.delete(s)},getSnapshot(){return e},onProgress(s){e={...e,initProgress:{overall:s.percent,engines:{...e.initProgress.engines,[s.engine]:s.percent}}},r();},onReady(s,o,p){e={...e,isReady:s,isFullyReady:o,readyEngines:p,error:null},r();},onError(s){e={...e,error:s},r();}}}function K({client:e,autoInitialize:t=true,children:r}){let s=react.useMemo(()=>U(),[e]),o=react.useRef(false),p=react.useRef(0),a=react.useRef(new Set),c=react.useCallback(()=>{p.current+=1;for(let l of a.current)l();},[]),S=react.useCallback(l=>(a.current.add(l),()=>a.current.delete(l)),[]),g=react.useCallback(()=>p.current,[]);react.useEffect(()=>{typeof window>"u"||t&&(o.current||(o.current=true,e.initialize().then(()=>{s.onReady(e.isReady,e.isFullyReady,e.readyEngines);}).catch(l=>{s.onError(l instanceof Error?l:new Error(String(l)));})));},[e,t,s]);let d=react.useMemo(()=>({client:e,store:s,notifySessionChange:c,subscribeToSessions:S,getSessionVersion:g}),[e,s,c,S,g]);return jsxRuntime.jsx(f.Provider,{value:d,children:r})}function Z(){let e=react.useContext(f);if(!e)throw new Error("[usePrivacyClient] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");return e.client}var te={isEnabled:false,isInitialized:false,activeThreadId:null,cacheNamespace:null,hasGlobalSnapshot:false,isGlobalSnapshotStale:false};function re(){let e=react.useContext(f);if(!e)throw new Error("[useVault] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");let{vault:t}=e.client,[r,s]=react.useState(t.getStatus?.()??te),o=react.useCallback(()=>{s(t.getStatus());},[t]),p=react.useCallback(async c=>{await t.setThreadContext(c),o();},[o,t]),a=react.useCallback(async()=>{await t.refreshContext(),o();},[o,t]);return {vault:t,status:r,getGlobalSnapshot:()=>t.getGlobalSnapshot(),getThreadSnapshot:c=>t.getThreadSnapshot(c),getRuntimeThreadEntries:c=>t.getRuntimeThreadEntries(c),getPendingEntries:()=>t.getPendingEntries(),setThreadContext:p,refreshContext:a}}var k={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function oe(){let e=react.useContext(f);return react.useSyncExternalStore(e?e.store.subscribe:()=>()=>{},e?e.store.getSnapshot:()=>k,()=>k)}function le(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async g=>{if(!e)return Promise.resolve({entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true});o(true),a(null);try{let d=await e.client.detect(g);return r(d),d}catch(d){let l=d instanceof Error?d:new Error(String(d));return a(l),r(null),{entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true}}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {detect:c,data:t,isPending:s,error:p,reset:S}}function fe(e={}){let{debounce:t=300,enabled:r=true}=e,s=react.useContext(f),[o,p]=react.useState([]),[a,c]=react.useState([]),[S,g]=react.useState(null),[d,l]=react.useState(false),[m,y]=react.useState(false),[n,i]=react.useState(null),u=react.useRef(null),R=react.useCallback(()=>{u.current!==null&&(clearTimeout(u.current),u.current=null);},[]);react.useEffect(()=>()=>R(),[R]);let L=react.useCallback(W=>{!r||!s||(R(),y(true),u.current=setTimeout(async()=>{u.current=null,y(false),l(true),i(null);try{let x=await s.client.detect(W);g(x),p(x.entities),c(x.sensitiveEntities);}catch(x){i(x instanceof Error?x:new Error(String(x))),g(null),p([]),c([]);}finally{l(false);}},t));},[s,r,t,R]),Y=react.useCallback(()=>{R(),g(null),p([]),c([]),l(false),y(false),i(null);},[R]);return {scan:L,data:S,entities:o,sensitiveEntities:a,isScanning:d,isPending:m,error:n,reset:Y}}var O={restored:"",mappingsApplied:0,success:false};function pe(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(null),[p,a]=react.useState(false),[c,S]=react.useState(null),g=react.useCallback(async(m,y)=>{if(!e)return {processed:m,sessionId:"",hasSensitiveData:false};a(true),S(null);try{let n=await e.client.obfuscate(m,y);return r(n),o(n.sessionId),e.notifySessionChange(),n}catch(n){let i=n instanceof Error?n:new Error(String(n));return S(i),r(null),{processed:m,sessionId:"",hasSensitiveData:false}}finally{a(false);}},[e]),d=react.useCallback(async(m,y)=>{if(!e)return O;let n=y??s;if(!n)return O;a(true),S(null);try{return await e.client.restore(m,n)}catch(i){let u=i instanceof Error?i:new Error(String(i));return S(u),O}finally{a(false);}},[e,s]),l=react.useCallback(()=>{r(null),o(null),S(null),a(false);},[]);return {obfuscate:g,restore:d,lastResult:t,sessionId:s,isPending:p,error:c,reset:l}}function ge(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(null),p=react.useCallback((n,i,u)=>{if(!e)return;let R=e.client.createTextReview(n,i,u);r(R),o(null);},[e]),a=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewItemMode(u,n,i));},[e]),c=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewReplacement(u,n,i));},[e]),S=react.useCallback(n=>{e&&r(i=>i&&e.client.removeTextReviewItem(i,n));},[e]),g=react.useCallback(n=>{e&&r(i=>i&&e.client.restoreTextReviewItem(i,n));},[e]),d=react.useCallback((n,i)=>{e&&r(u=>u&&e.client.addTextReviewEntity(u,n,i));},[e]),l=react.useCallback(async()=>{if(!e||!t)return null;let n=await e.client.finalizeTextReview(t);return o(n),e.notifySessionChange(),n},[e,t]),m=react.useCallback(n=>{r(n),o(null);},[]),y=react.useCallback(()=>{r(null),o(null);},[]);return {review:t,items:t?.items??[],preview:e&&t?e.client.previewTextReview(t):null,lastFinalized:s,initialize:p,setReplacement:c,setMode:a,removeItem:S,restoreItem:g,addEntity:d,finalize:l,hydrate:m,reset:y}}function ye(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async(g,d)=>{if(!e)return {restored:g,mappingsApplied:0,success:false};o(true),a(null);try{let l=await e.client.restore(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),{restored:g,mappingsApplied:0,success:false}}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {restore:c,data:t,isPending:s,error:p,reset:S}}var xe=[];function Pe(){let e=react.useContext(f);react.useSyncExternalStore(e?e.subscribeToSessions:()=>()=>{},e?e.getSessionVersion:()=>0,()=>0);let t=e?e.client.getSessions():xe,r=react.useCallback(o=>{e&&(e.client.clearSession(o),e.notifySessionChange());},[e]),s=react.useCallback(()=>{e&&(e.client.clearAllSessions(),e.notifySessionChange());},[e]);return {sessions:t,clearSession:r,clearAll:s}}function he(e,t,r){t.current=t.current.filter(s=>s.token!==e);for(let[s,o]of r.current.entries())o.token===e&&r.current.delete(s);}function Ce(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),[c,S]=react.useState(null),g=react.useRef([]),d=react.useRef(new Map);react.useEffect(()=>{let y=e?.client;if(y?.subscribeToJobProgress)return y.subscribeToJobProgress(n=>{if(n.progress.operation!=="detectInFile")return;let i=d.current.get(n.requestId);!i&&n.progress.phase==="starting"&&(i=g.current.shift(),i&&(i.requestId=n.requestId,d.current.set(n.requestId,i))),i&&(S(n.progress),i.onProgress?.(n.progress),n.progress.phase==="done"&&d.current.delete(n.requestId));})},[e]);let l=react.useCallback(async(y,n)=>{if(!e)return {entities:[],text:"",processingTime:0,fileType:"txt"};let i=Symbol("detectInFile");g.current.push({token:i,onProgress:n?.onProgress}),o(true),a(null),S(null);try{let u=await e.client.detectInFile(y);return r(u),u}catch(u){let R=u instanceof Error?u:new Error(String(u));return a(R),r(null),{entities:[],text:"",processingTime:0,fileType:"txt"}}finally{he(i,g,d),o(false);}},[e]),m=react.useCallback(()=>{r(null),a(null),o(false),S(null);},[]);return {detectInFile:l,data:t,isPending:s,error:p,progress:c,reset:m}}function we(){let e=react.useContext(f),[t,r]=react.useState(null),[s,o]=react.useState(false),[p,a]=react.useState(null),c=react.useCallback(async(g,d)=>{if(!e)return new Blob;o(true),a(null);try{let l=await e.client.obfuscateFile(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),new Blob}finally{o(false);}},[e]),S=react.useCallback(()=>{r(null),a(null),o(false);},[]);return {obfuscateFile:c,data:t,isPending:s,error:p,reset:S}}var mt="0.1.1";Object.defineProperty(exports,"DefaultVaultRepository",{enumerable:true,get:function(){return core.DefaultVaultRepository}});Object.defineProperty(exports,"ENTITY_TYPES",{enumerable:true,get:function(){return core.ENTITY_TYPES}});Object.defineProperty(exports,"IndexedDbVaultCache",{enumerable:true,get:function(){return core.IndexedDbVaultCache}});Object.defineProperty(exports,"LocalStorageVaultCache",{enumerable:true,get:function(){return core.LocalStorageVaultCache}});Object.defineProperty(exports,"MemoryVaultCache",{enumerable:true,get:function(){return core.MemoryVaultCache}});Object.defineProperty(exports,"PrivacyClient",{enumerable:true,get:function(){return core.PrivacyClient}});Object.defineProperty(exports,"SessionStorageVaultCache",{enumerable:true,get:function(){return core.SessionStorageVaultCache}});Object.defineProperty(exports,"StringMatcher",{enumerable:true,get:function(){return core.StringMatcher}});Object.defineProperty(exports,"VaultManager",{enumerable:true,get:function(){return core.VaultManager}});Object.defineProperty(exports,"WebCryptoVaultCrypto",{enumerable:true,get:function(){return core.WebCryptoVaultCrypto}});Object.defineProperty(exports,"canonicalizeVaultEntityType",{enumerable:true,get:function(){return core.canonicalizeVaultEntityType}});Object.defineProperty(exports,"defaultStringMatcher",{enumerable:true,get:function(){return core.defaultStringMatcher}});Object.defineProperty(exports,"deobfuscateWithVaultEntries",{enumerable:true,get:function(){return core.deobfuscateWithVaultEntries}});Object.defineProperty(exports,"lenientStringMatcher",{enumerable:true,get:function(){return core.lenientStringMatcher}});Object.defineProperty(exports,"normalizeVaultEntryKey",{enumerable:true,get:function(){return core.normalizeVaultEntryKey}});Object.defineProperty(exports,"strictStringMatcher",{enumerable:true,get:function(){return core.strictStringMatcher}});Object.defineProperty(exports,"vaultEntityTypesMatch",{enumerable:true,get:function(){return core.vaultEntityTypesMatch}});Object.defineProperty(exports,"vaultEntryMatchesEntity",{enumerable:true,get:function(){return core.vaultEntryMatchesEntity}});exports.SecuredProvider=K;exports.useDetect=le;exports.useFileDetect=Ce;exports.useFileObfuscate=we;exports.useObfuscate=pe;exports.usePrivacyClient=Z;exports.usePrivacyStatus=oe;exports.useRestore=ye;exports.useScan=fe;exports.useSessions=Pe;exports.useTextReview=ge;exports.useVault=re;exports.version=mt;
package/dist/index.d.cts CHANGED
@@ -174,6 +174,6 @@ interface UseFileObfuscateReturn {
174
174
  */
175
175
  declare function useFileObfuscate(): UseFileObfuscateReturn;
176
176
 
177
- declare const version = "0.1.0";
177
+ declare const version = "0.1.1";
178
178
 
179
179
  export { SecuredProvider, type SecuredProviderProps, type UseDetectReturn, type UseFileDetectReturn, type UseFileObfuscateReturn, type UseObfuscateReturn, type UseRestoreReturn, type UseScanOptions, type UseScanReturn, type UseSessionsReturn, type UseTextReviewReturn, type UseVaultReturn, useDetect, useFileDetect, useFileObfuscate, useObfuscate, usePrivacyClient, usePrivacyStatus, useRestore, useScan, useSessions, useTextReview, useVault, version };
package/dist/index.d.ts CHANGED
@@ -174,6 +174,6 @@ interface UseFileObfuscateReturn {
174
174
  */
175
175
  declare function useFileObfuscate(): UseFileObfuscateReturn;
176
176
 
177
- declare const version = "0.1.0";
177
+ declare const version = "0.1.1";
178
178
 
179
179
  export { SecuredProvider, type SecuredProviderProps, type UseDetectReturn, type UseFileDetectReturn, type UseFileObfuscateReturn, type UseObfuscateReturn, type UseRestoreReturn, type UseScanOptions, type UseScanReturn, type UseSessionsReturn, type UseTextReviewReturn, type UseVaultReturn, useDetect, useFileDetect, useFileObfuscate, useObfuscate, usePrivacyClient, usePrivacyStatus, useRestore, useScan, useSessions, useTextReview, useVault, version };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import {createContext,useMemo,useRef,useCallback,useEffect,useContext,useState,useSyncExternalStore}from'react';import {jsx}from'react/jsx-runtime';export{DefaultVaultRepository,ENTITY_TYPES,IndexedDbVaultCache,LocalStorageVaultCache,MemoryVaultCache,PrivacyClient,SessionStorageVaultCache,StringMatcher,VaultManager,WebCryptoVaultCrypto,canonicalizeVaultEntityType,defaultStringMatcher,deobfuscateWithVaultEntries,lenientStringMatcher,normalizeVaultEntryKey,strictStringMatcher,vaultEntityTypesMatch,vaultEntryMatchesEntity}from'@secured-ai/core';var f=createContext(null);var j={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function U(){let e={...j},t=new Set;function r(){for(let s of t)s();}return {subscribe(s){return t.add(s),()=>t.delete(s)},getSnapshot(){return e},onProgress(s){e={...e,initProgress:{overall:s.percent,engines:{...e.initProgress.engines,[s.engine]:s.percent}}},r();},onReady(s,o,p){e={...e,isReady:s,isFullyReady:o,readyEngines:p,error:null},r();},onError(s){e={...e,error:s},r();}}}function K({client:e,autoInitialize:t=true,children:r}){let s=useMemo(()=>U(),[e]),o=useRef(false),p=useRef(0),a=useRef(new Set),c=useCallback(()=>{p.current+=1;for(let l of a.current)l();},[]),S=useCallback(l=>(a.current.add(l),()=>a.current.delete(l)),[]),g=useCallback(()=>p.current,[]);useEffect(()=>{typeof window>"u"||t&&(o.current||(o.current=true,e.initialize().then(()=>{s.onReady(e.isReady,e.isFullyReady,e.readyEngines);}).catch(l=>{s.onError(l instanceof Error?l:new Error(String(l)));})));},[e,t,s]);let d=useMemo(()=>({client:e,store:s,notifySessionChange:c,subscribeToSessions:S,getSessionVersion:g}),[e,s,c,S,g]);return jsx(f.Provider,{value:d,children:r})}function Z(){let e=useContext(f);if(!e)throw new Error("[usePrivacyClient] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");return e.client}var te={isEnabled:false,isInitialized:false,activeThreadId:null,cacheNamespace:null,hasGlobalSnapshot:false,isGlobalSnapshotStale:false};function re(){let e=useContext(f);if(!e)throw new Error("[useVault] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");let{vault:t}=e.client,[r,s]=useState(t.getStatus?.()??te),o=useCallback(()=>{s(t.getStatus());},[t]),p=useCallback(async c=>{await t.setThreadContext(c),o();},[o,t]),a=useCallback(async()=>{await t.refreshContext(),o();},[o,t]);return {vault:t,status:r,getGlobalSnapshot:()=>t.getGlobalSnapshot(),getThreadSnapshot:c=>t.getThreadSnapshot(c),getRuntimeThreadEntries:c=>t.getRuntimeThreadEntries(c),getPendingEntries:()=>t.getPendingEntries(),setThreadContext:p,refreshContext:a}}var k={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function oe(){let e=useContext(f);return useSyncExternalStore(e?e.store.subscribe:()=>()=>{},e?e.store.getSnapshot:()=>k,()=>k)}function le(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async g=>{if(!e)return Promise.resolve({entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true});o(true),a(null);try{let d=await e.client.detect(g);return r(d),d}catch(d){let l=d instanceof Error?d:new Error(String(d));return a(l),r(null),{entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true}}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {detect:c,data:t,isPending:s,error:p,reset:S}}function fe(e={}){let{debounce:t=300,enabled:r=true}=e,s=useContext(f),[o,p]=useState([]),[a,c]=useState([]),[S,g]=useState(null),[d,l]=useState(false),[m,y]=useState(false),[n,i]=useState(null),u=useRef(null),R=useCallback(()=>{u.current!==null&&(clearTimeout(u.current),u.current=null);},[]);useEffect(()=>()=>R(),[R]);let L=useCallback(W=>{!r||!s||(R(),y(true),u.current=setTimeout(async()=>{u.current=null,y(false),l(true),i(null);try{let x=await s.client.detect(W);g(x),p(x.entities),c(x.sensitiveEntities);}catch(x){i(x instanceof Error?x:new Error(String(x))),g(null),p([]),c([]);}finally{l(false);}},t));},[s,r,t,R]),Y=useCallback(()=>{R(),g(null),p([]),c([]),l(false),y(false),i(null);},[R]);return {scan:L,data:S,entities:o,sensitiveEntities:a,isScanning:d,isPending:m,error:n,reset:Y}}var O={restored:"",mappingsApplied:0,success:false};function pe(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(null),[p,a]=useState(false),[c,S]=useState(null),g=useCallback(async(m,y)=>{if(!e)return {processed:m,sessionId:"",hasSensitiveData:false};a(true),S(null);try{let n=await e.client.obfuscate(m,y);return r(n),o(n.sessionId),e.notifySessionChange(),n}catch(n){let i=n instanceof Error?n:new Error(String(n));return S(i),r(null),{processed:m,sessionId:"",hasSensitiveData:false}}finally{a(false);}},[e]),d=useCallback(async(m,y)=>{if(!e)return O;let n=y??s;if(!n)return O;a(true),S(null);try{return await e.client.restore(m,n)}catch(i){let u=i instanceof Error?i:new Error(String(i));return S(u),O}finally{a(false);}},[e,s]),l=useCallback(()=>{r(null),o(null),S(null),a(false);},[]);return {obfuscate:g,restore:d,lastResult:t,sessionId:s,isPending:p,error:c,reset:l}}function ge(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(null),p=useCallback((n,i,u)=>{if(!e)return;let R=e.client.createTextReview(n,i,u);r(R),o(null);},[e]),a=useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewItemMode(u,n,i));},[e]),c=useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewReplacement(u,n,i));},[e]),S=useCallback(n=>{e&&r(i=>i&&e.client.removeTextReviewItem(i,n));},[e]),g=useCallback(n=>{e&&r(i=>i&&e.client.restoreTextReviewItem(i,n));},[e]),d=useCallback((n,i)=>{e&&r(u=>u&&e.client.addTextReviewEntity(u,n,i));},[e]),l=useCallback(async()=>{if(!e||!t)return null;let n=await e.client.finalizeTextReview(t);return o(n),e.notifySessionChange(),n},[e,t]),m=useCallback(n=>{r(n),o(null);},[]),y=useCallback(()=>{r(null),o(null);},[]);return {review:t,items:t?.items??[],preview:e&&t?e.client.previewTextReview(t):null,lastFinalized:s,initialize:p,setReplacement:c,setMode:a,removeItem:S,restoreItem:g,addEntity:d,finalize:l,hydrate:m,reset:y}}function ye(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async(g,d)=>{if(!e)return {restored:g,mappingsApplied:0,success:false};o(true),a(null);try{let l=await e.client.restore(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),{restored:g,mappingsApplied:0,success:false}}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {restore:c,data:t,isPending:s,error:p,reset:S}}var xe=[];function Pe(){let e=useContext(f);useSyncExternalStore(e?e.subscribeToSessions:()=>()=>{},e?e.getSessionVersion:()=>0,()=>0);let t=e?e.client.getSessions():xe,r=useCallback(o=>{e&&(e.client.clearSession(o),e.notifySessionChange());},[e]),s=useCallback(()=>{e&&(e.client.clearAllSessions(),e.notifySessionChange());},[e]);return {sessions:t,clearSession:r,clearAll:s}}function he(e,t,r){t.current=t.current.filter(s=>s.token!==e);for(let[s,o]of r.current.entries())o.token===e&&r.current.delete(s);}function Ce(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),[c,S]=useState(null),g=useRef([]),d=useRef(new Map);useEffect(()=>{let y=e?.client;if(y?.subscribeToJobProgress)return y.subscribeToJobProgress(n=>{if(n.progress.operation!=="detectInFile")return;let i=d.current.get(n.requestId);!i&&n.progress.phase==="starting"&&(i=g.current.shift(),i&&(i.requestId=n.requestId,d.current.set(n.requestId,i))),i&&(S(n.progress),i.onProgress?.(n.progress),n.progress.phase==="done"&&d.current.delete(n.requestId));})},[e]);let l=useCallback(async(y,n)=>{if(!e)return {entities:[],text:"",processingTime:0,fileType:"txt"};let i=Symbol("detectInFile");g.current.push({token:i,onProgress:n?.onProgress}),o(true),a(null),S(null);try{let u=await e.client.detectInFile(y);return r(u),u}catch(u){let R=u instanceof Error?u:new Error(String(u));return a(R),r(null),{entities:[],text:"",processingTime:0,fileType:"txt"}}finally{he(i,g,d),o(false);}},[e]),m=useCallback(()=>{r(null),a(null),o(false),S(null);},[]);return {detectInFile:l,data:t,isPending:s,error:p,progress:c,reset:m}}function we(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async(g,d)=>{if(!e)return new Blob;o(true),a(null);try{let l=await e.client.obfuscateFile(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),new Blob}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {obfuscateFile:c,data:t,isPending:s,error:p,reset:S}}var mt="0.1.0";export{K as SecuredProvider,le as useDetect,Ce as useFileDetect,we as useFileObfuscate,pe as useObfuscate,Z as usePrivacyClient,oe as usePrivacyStatus,ye as useRestore,fe as useScan,Pe as useSessions,ge as useTextReview,re as useVault,mt as version};
1
+ import {createContext,useMemo,useRef,useCallback,useEffect,useContext,useState,useSyncExternalStore}from'react';import {jsx}from'react/jsx-runtime';export{DefaultVaultRepository,ENTITY_TYPES,IndexedDbVaultCache,LocalStorageVaultCache,MemoryVaultCache,PrivacyClient,SessionStorageVaultCache,StringMatcher,VaultManager,WebCryptoVaultCrypto,canonicalizeVaultEntityType,defaultStringMatcher,deobfuscateWithVaultEntries,lenientStringMatcher,normalizeVaultEntryKey,strictStringMatcher,vaultEntityTypesMatch,vaultEntryMatchesEntity}from'@secured-ai/core';var f=createContext(null);var j={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function U(){let e={...j},t=new Set;function r(){for(let s of t)s();}return {subscribe(s){return t.add(s),()=>t.delete(s)},getSnapshot(){return e},onProgress(s){e={...e,initProgress:{overall:s.percent,engines:{...e.initProgress.engines,[s.engine]:s.percent}}},r();},onReady(s,o,p){e={...e,isReady:s,isFullyReady:o,readyEngines:p,error:null},r();},onError(s){e={...e,error:s},r();}}}function K({client:e,autoInitialize:t=true,children:r}){let s=useMemo(()=>U(),[e]),o=useRef(false),p=useRef(0),a=useRef(new Set),c=useCallback(()=>{p.current+=1;for(let l of a.current)l();},[]),S=useCallback(l=>(a.current.add(l),()=>a.current.delete(l)),[]),g=useCallback(()=>p.current,[]);useEffect(()=>{typeof window>"u"||t&&(o.current||(o.current=true,e.initialize().then(()=>{s.onReady(e.isReady,e.isFullyReady,e.readyEngines);}).catch(l=>{s.onError(l instanceof Error?l:new Error(String(l)));})));},[e,t,s]);let d=useMemo(()=>({client:e,store:s,notifySessionChange:c,subscribeToSessions:S,getSessionVersion:g}),[e,s,c,S,g]);return jsx(f.Provider,{value:d,children:r})}function Z(){let e=useContext(f);if(!e)throw new Error("[usePrivacyClient] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");return e.client}var te={isEnabled:false,isInitialized:false,activeThreadId:null,cacheNamespace:null,hasGlobalSnapshot:false,isGlobalSnapshotStale:false};function re(){let e=useContext(f);if(!e)throw new Error("[useVault] must be used inside a <SecuredProvider>. Wrap your component tree with <SecuredProvider client={client}>.");let{vault:t}=e.client,[r,s]=useState(t.getStatus?.()??te),o=useCallback(()=>{s(t.getStatus());},[t]),p=useCallback(async c=>{await t.setThreadContext(c),o();},[o,t]),a=useCallback(async()=>{await t.refreshContext(),o();},[o,t]);return {vault:t,status:r,getGlobalSnapshot:()=>t.getGlobalSnapshot(),getThreadSnapshot:c=>t.getThreadSnapshot(c),getRuntimeThreadEntries:c=>t.getRuntimeThreadEntries(c),getPendingEntries:()=>t.getPendingEntries(),setThreadContext:p,refreshContext:a}}var k={isReady:false,isFullyReady:false,initProgress:{overall:0,engines:{}},readyEngines:[],error:null};function oe(){let e=useContext(f);return useSyncExternalStore(e?e.store.subscribe:()=>()=>{},e?e.store.getSnapshot:()=>k,()=>k)}function le(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async g=>{if(!e)return Promise.resolve({entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true});o(true),a(null);try{let d=await e.client.detect(g);return r(d),d}catch(d){let l=d instanceof Error?d:new Error(String(d));return a(l),r(null),{entities:[],sensitiveEntities:[],processingTime:0,sourceStats:{"regex-patterns":0,"compromise-nlp":0,"compromise-regex":0,huggingface:0,gliner:0,custom:0},isClean:true}}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {detect:c,data:t,isPending:s,error:p,reset:S}}function fe(e={}){let{debounce:t=300,enabled:r=true}=e,s=useContext(f),[o,p]=useState([]),[a,c]=useState([]),[S,g]=useState(null),[d,l]=useState(false),[m,y]=useState(false),[n,i]=useState(null),u=useRef(null),R=useCallback(()=>{u.current!==null&&(clearTimeout(u.current),u.current=null);},[]);useEffect(()=>()=>R(),[R]);let L=useCallback(W=>{!r||!s||(R(),y(true),u.current=setTimeout(async()=>{u.current=null,y(false),l(true),i(null);try{let x=await s.client.detect(W);g(x),p(x.entities),c(x.sensitiveEntities);}catch(x){i(x instanceof Error?x:new Error(String(x))),g(null),p([]),c([]);}finally{l(false);}},t));},[s,r,t,R]),Y=useCallback(()=>{R(),g(null),p([]),c([]),l(false),y(false),i(null);},[R]);return {scan:L,data:S,entities:o,sensitiveEntities:a,isScanning:d,isPending:m,error:n,reset:Y}}var O={restored:"",mappingsApplied:0,success:false};function pe(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(null),[p,a]=useState(false),[c,S]=useState(null),g=useCallback(async(m,y)=>{if(!e)return {processed:m,sessionId:"",hasSensitiveData:false};a(true),S(null);try{let n=await e.client.obfuscate(m,y);return r(n),o(n.sessionId),e.notifySessionChange(),n}catch(n){let i=n instanceof Error?n:new Error(String(n));return S(i),r(null),{processed:m,sessionId:"",hasSensitiveData:false}}finally{a(false);}},[e]),d=useCallback(async(m,y)=>{if(!e)return O;let n=y??s;if(!n)return O;a(true),S(null);try{return await e.client.restore(m,n)}catch(i){let u=i instanceof Error?i:new Error(String(i));return S(u),O}finally{a(false);}},[e,s]),l=useCallback(()=>{r(null),o(null),S(null),a(false);},[]);return {obfuscate:g,restore:d,lastResult:t,sessionId:s,isPending:p,error:c,reset:l}}function ge(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(null),p=useCallback((n,i,u)=>{if(!e)return;let R=e.client.createTextReview(n,i,u);r(R),o(null);},[e]),a=useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewItemMode(u,n,i));},[e]),c=useCallback((n,i)=>{e&&r(u=>u&&e.client.setTextReviewReplacement(u,n,i));},[e]),S=useCallback(n=>{e&&r(i=>i&&e.client.removeTextReviewItem(i,n));},[e]),g=useCallback(n=>{e&&r(i=>i&&e.client.restoreTextReviewItem(i,n));},[e]),d=useCallback((n,i)=>{e&&r(u=>u&&e.client.addTextReviewEntity(u,n,i));},[e]),l=useCallback(async()=>{if(!e||!t)return null;let n=await e.client.finalizeTextReview(t);return o(n),e.notifySessionChange(),n},[e,t]),m=useCallback(n=>{r(n),o(null);},[]),y=useCallback(()=>{r(null),o(null);},[]);return {review:t,items:t?.items??[],preview:e&&t?e.client.previewTextReview(t):null,lastFinalized:s,initialize:p,setReplacement:c,setMode:a,removeItem:S,restoreItem:g,addEntity:d,finalize:l,hydrate:m,reset:y}}function ye(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async(g,d)=>{if(!e)return {restored:g,mappingsApplied:0,success:false};o(true),a(null);try{let l=await e.client.restore(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),{restored:g,mappingsApplied:0,success:false}}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {restore:c,data:t,isPending:s,error:p,reset:S}}var xe=[];function Pe(){let e=useContext(f);useSyncExternalStore(e?e.subscribeToSessions:()=>()=>{},e?e.getSessionVersion:()=>0,()=>0);let t=e?e.client.getSessions():xe,r=useCallback(o=>{e&&(e.client.clearSession(o),e.notifySessionChange());},[e]),s=useCallback(()=>{e&&(e.client.clearAllSessions(),e.notifySessionChange());},[e]);return {sessions:t,clearSession:r,clearAll:s}}function he(e,t,r){t.current=t.current.filter(s=>s.token!==e);for(let[s,o]of r.current.entries())o.token===e&&r.current.delete(s);}function Ce(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),[c,S]=useState(null),g=useRef([]),d=useRef(new Map);useEffect(()=>{let y=e?.client;if(y?.subscribeToJobProgress)return y.subscribeToJobProgress(n=>{if(n.progress.operation!=="detectInFile")return;let i=d.current.get(n.requestId);!i&&n.progress.phase==="starting"&&(i=g.current.shift(),i&&(i.requestId=n.requestId,d.current.set(n.requestId,i))),i&&(S(n.progress),i.onProgress?.(n.progress),n.progress.phase==="done"&&d.current.delete(n.requestId));})},[e]);let l=useCallback(async(y,n)=>{if(!e)return {entities:[],text:"",processingTime:0,fileType:"txt"};let i=Symbol("detectInFile");g.current.push({token:i,onProgress:n?.onProgress}),o(true),a(null),S(null);try{let u=await e.client.detectInFile(y);return r(u),u}catch(u){let R=u instanceof Error?u:new Error(String(u));return a(R),r(null),{entities:[],text:"",processingTime:0,fileType:"txt"}}finally{he(i,g,d),o(false);}},[e]),m=useCallback(()=>{r(null),a(null),o(false),S(null);},[]);return {detectInFile:l,data:t,isPending:s,error:p,progress:c,reset:m}}function we(){let e=useContext(f),[t,r]=useState(null),[s,o]=useState(false),[p,a]=useState(null),c=useCallback(async(g,d)=>{if(!e)return new Blob;o(true),a(null);try{let l=await e.client.obfuscateFile(g,d);return r(l),l}catch(l){let m=l instanceof Error?l:new Error(String(l));return a(m),r(null),new Blob}finally{o(false);}},[e]),S=useCallback(()=>{r(null),a(null),o(false);},[]);return {obfuscateFile:c,data:t,isPending:s,error:p,reset:S}}var mt="0.1.1";export{K as SecuredProvider,le as useDetect,Ce as useFileDetect,we as useFileObfuscate,pe as useObfuscate,Z as usePrivacyClient,oe as usePrivacyStatus,ye as useRestore,fe as useScan,Pe as useSessions,ge as useTextReview,re as useVault,mt as version};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secured-ai/react",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "React bindings for @secured-ai/core — hooks and provider for PII detection, obfuscation, and restoration",
5
5
  "homepage": "https://dev-docs.securedai.com/docs",
6
6
  "type": "module",