@trymellon/js 2.2.1 → 2.3.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/dist/react.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- "use strict";var c=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var x=Object.prototype.hasOwnProperty;var h=(e,t)=>{for(var r in t)c(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of d(t))!x.call(e,o)&&o!==r&&c(e,o,{get:()=>t[o],enumerable:!(n=A(t,o))||n.enumerable});return e};var S=e=>E(c({},"__esModule",{value:!0}),e);var O={};h(O,{TryMellonProvider:()=>y,useAuthenticate:()=>f,useRegister:()=>R,useTryMellon:()=>l});module.exports=S(O);var i=require("react"),m=require("react/jsx-runtime"),a=(0,i.createContext)(null);function y(e){return(0,m.jsx)(a.Provider,{value:e.client,children:e.children})}function l(){let e=(0,i.useContext)(a);if(e==null)throw new Error("useTryMellon must be used within TryMellonProvider");return e}var T=require("react");var u=require("react");function p(e){let[t,r]=(0,u.useState)({result:null,loading:!1,error:null}),n=(0,u.useCallback)(async o=>{r(g=>({...g,loading:!0,error:null,result:null}));let s=await e(o);return r({result:s,loading:!1,error:s.ok?null:s.error}),s},[e]);return{result:t.result,loading:t.loading,error:t.error,execute:n}}function R(){let e=l(),t=(0,T.useCallback)(r=>e.register(r),[e]);return p(t)}var M=require("react");function f(){let e=l(),t=(0,M.useCallback)(r=>e.authenticate(r),[e]);return p(t)}
2
+ "use strict";var y=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var U=(e,t)=>{for(var r in t)y(e,r,{get:t[r],enumerable:!0})},C=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!O.call(e,o)&&o!==r&&y(e,o,{get:()=>t[o],enumerable:!(n=h(t,o))||n.enumerable});return e};var b=e=>C(y({},"__esModule",{value:!0}),e);var P={};U(P,{TryMellonProvider:()=>T,useAuthenticate:()=>x,useEnroll:()=>g,useRegister:()=>M,useTryMellon:()=>l});module.exports=b(P);var p=require("react"),R=require("react/jsx-runtime"),m=(0,p.createContext)(null);function T(e){return(0,R.jsx)(m.Provider,{value:e.client,children:e.children})}function l(){let e=(0,p.useContext)(m);if(e==null)throw new Error("useTryMellon must be used within TryMellonProvider");return e}var f=require("react");var c=require("react");function u(e){let[t,r]=(0,c.useState)({result:null,loading:!1,error:null}),n=(0,c.useCallback)(async o=>{r(a=>({...a,loading:!0,error:null,result:null}));let s=await e(o);return r({result:s,loading:!1,error:s.ok?null:s.error}),s},[e]);return{result:t.result,loading:t.loading,error:t.error,execute:n}}function M(){let e=l(),t=(0,f.useCallback)(r=>e.register(r),[e]);return u(t)}var E=require("react");function x(){let e=l(),t=(0,E.useCallback)(r=>e.authenticate(r),[e]);return u(t)}var i=require("react");function g(){let e=l(),[t,r]=(0,i.useState)("");(0,i.useEffect)(()=>{r(e.getContextHash())},[e]);let n=(0,i.useCallback)(d=>e.enroll(d),[e]),{result:o,loading:s,error:a,execute:A}=u(n);return{result:o,loading:s,error:a,execute:A,contextHash:t}}
3
3
  //# sourceMappingURL=react.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/index.ts","../src/react/context.tsx","../src/react/use-register.tsx","../src/react/use-action.ts","../src/react/use-authenticate.tsx"],"sourcesContent":["export { TryMellonProvider, useTryMellon } from './context';\nexport { useRegister } from './use-register';\nexport { useAuthenticate } from './use-authenticate';\n","import { createContext, useContext, type ReactNode } from 'react';\nimport type { TryMellon } from '../core/trymellon';\n\nconst TryMellonContext = createContext<TryMellon | null>(null);\n\nexport function TryMellonProvider(props: { client: TryMellon; children: ReactNode }) {\n return (\n <TryMellonContext.Provider value={props.client}>{props.children}</TryMellonContext.Provider>\n );\n}\n\nexport function useTryMellon(): TryMellon {\n const client = useContext(TryMellonContext);\n if (client == null) {\n throw new Error('useTryMellon must be used within TryMellonProvider');\n }\n return client;\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseRegisterState = UseActionState<RegisterResult>;\n\nexport function useRegister(): {\n result: Result<RegisterResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback((options: RegisterOptions) => client.register(options), [client]);\n return useTryMellonAction(action);\n}\n","import { useState, useCallback } from 'react';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseActionState<TResult> = {\n result: Result<TResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n};\n\nexport function useTryMellonAction<TOptions, TResult>(\n action: (options: TOptions) => Promise<Result<TResult, TryMellonError>>\n) {\n const [state, setState] = useState<UseActionState<TResult>>({\n result: null,\n loading: false,\n error: null,\n });\n\n const execute = useCallback(\n async (options: TOptions) => {\n setState((s) => ({ ...s, loading: true, error: null, result: null }));\n const result = await action(options);\n setState({\n result,\n loading: false,\n error: result.ok ? null : result.error,\n });\n return result;\n },\n [action]\n );\n\n return {\n result: state.result,\n loading: state.loading,\n error: state.error,\n execute,\n };\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseAuthenticateState = UseActionState<AuthenticateResult>;\n\nexport function useAuthenticate(): {\n result: Result<AuthenticateResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback(\n (options: AuthenticateOptions) => client.authenticate(options),\n [client]\n );\n return useTryMellonAction(action);\n}\n"],"mappings":";yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,oBAAAC,EAAA,gBAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAN,GCAA,IAAAO,EAA0D,iBAOtDC,EAAA,6BAJEC,KAAmB,iBAAgC,IAAI,EAEtD,SAASC,EAAkBC,EAAmD,CACnF,SACE,OAACF,EAAiB,SAAjB,CAA0B,MAAOE,EAAM,OAAS,SAAAA,EAAM,SAAS,CAEpE,CAEO,SAASC,GAA0B,CACxC,IAAMC,KAAS,cAAWJ,CAAgB,EAC1C,GAAII,GAAU,KACZ,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAOA,CACT,CCjBA,IAAAC,EAA4B,iBCA5B,IAAAC,EAAsC,iBAU/B,SAASC,EACdC,EACA,CACA,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAkC,CAC1D,OAAQ,KACR,QAAS,GACT,MAAO,IACT,CAAC,EAEKC,KAAU,eACd,MAAOC,GAAsB,CAC3BF,EAAUG,IAAO,CAAE,GAAGA,EAAG,QAAS,GAAM,MAAO,KAAM,OAAQ,IAAK,EAAE,EACpE,IAAMC,EAAS,MAAMN,EAAOI,CAAO,EACnC,OAAAF,EAAS,CACP,OAAAI,EACA,QAAS,GACT,MAAOA,EAAO,GAAK,KAAOA,EAAO,KACnC,CAAC,EACMA,CACT,EACA,CAACN,CAAM,CACT,EAEA,MAAO,CACL,OAAQC,EAAM,OACd,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,QAAAE,CACF,CACF,CD9BO,SAASI,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,eAAaC,GAA6BH,EAAO,SAASG,CAAO,EAAG,CAACH,CAAM,CAAC,EAC3F,OAAOI,EAAmBF,CAAM,CAClC,CElBA,IAAAG,EAA4B,iBASrB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,eACZC,GAAiCH,EAAO,aAAaG,CAAO,EAC7D,CAACH,CAAM,CACT,EACA,OAAOI,EAAmBF,CAAM,CAClC","names":["react_exports","__export","TryMellonProvider","useAuthenticate","useRegister","useTryMellon","__toCommonJS","import_react","import_jsx_runtime","TryMellonContext","TryMellonProvider","props","useTryMellon","client","import_react","import_react","useTryMellonAction","action","state","setState","execute","options","s","result","useRegister","client","useTryMellon","action","options","useTryMellonAction","import_react","useAuthenticate","client","useTryMellon","action","options","useTryMellonAction"]}
1
+ {"version":3,"sources":["../src/react/index.ts","../src/react/context.tsx","../src/react/use-register.tsx","../src/react/use-action.ts","../src/react/use-authenticate.tsx","../src/react/use-enroll.tsx"],"sourcesContent":["export { TryMellonProvider, useTryMellon } from './context';\nexport { useRegister } from './use-register';\nexport { useAuthenticate } from './use-authenticate';\nexport { useEnroll } from './use-enroll';\n","import { createContext, useContext, type ReactNode } from 'react';\nimport type { TryMellon } from '../core/trymellon';\n\nconst TryMellonContext = createContext<TryMellon | null>(null);\n\nexport function TryMellonProvider(props: { client: TryMellon; children: ReactNode }) {\n return (\n <TryMellonContext.Provider value={props.client}>{props.children}</TryMellonContext.Provider>\n );\n}\n\nexport function useTryMellon(): TryMellon {\n const client = useContext(TryMellonContext);\n if (client == null) {\n throw new Error('useTryMellon must be used within TryMellonProvider');\n }\n return client;\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseRegisterState = UseActionState<RegisterResult>;\n\nexport function useRegister(): {\n result: Result<RegisterResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback((options: RegisterOptions) => client.register(options), [client]);\n return useTryMellonAction(action);\n}\n","import { useState, useCallback } from 'react';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseActionState<TResult> = {\n result: Result<TResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n};\n\nexport function useTryMellonAction<TOptions, TResult>(\n action: (options: TOptions) => Promise<Result<TResult, TryMellonError>>\n) {\n const [state, setState] = useState<UseActionState<TResult>>({\n result: null,\n loading: false,\n error: null,\n });\n\n const execute = useCallback(\n async (options: TOptions) => {\n setState((s) => ({ ...s, loading: true, error: null, result: null }));\n const result = await action(options);\n setState({\n result,\n loading: false,\n error: result.ok ? null : result.error,\n });\n return result;\n },\n [action]\n );\n\n return {\n result: state.result,\n loading: state.loading,\n error: state.error,\n execute,\n };\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseAuthenticateState = UseActionState<AuthenticateResult>;\n\nexport function useAuthenticate(): {\n result: Result<AuthenticateResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback(\n (options: AuthenticateOptions) => client.authenticate(options),\n [client]\n );\n return useTryMellonAction(action);\n}\n","import { useCallback, useState, useEffect } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { EnrollOptions, EnrollmentResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseEnrollState = UseActionState<EnrollmentResult>;\n\nexport function useEnroll(): {\n result: Result<EnrollmentResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: EnrollOptions) => Promise<Result<EnrollmentResult, TryMellonError>>;\n contextHash: string;\n} {\n const client = useTryMellon();\n const [contextHash, setContextHash] = useState('');\n\n useEffect(() => {\n setContextHash(client.getContextHash());\n }, [client]);\n\n const action = useCallback((options: EnrollOptions) => client.enroll(options), [client]);\n const { result, loading, error, execute } = useTryMellonAction(action);\n\n return {\n result,\n loading,\n error,\n execute,\n contextHash,\n };\n}\n"],"mappings":";yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,oBAAAC,EAAA,cAAAC,EAAA,gBAAAC,EAAA,iBAAAC,IAAA,eAAAC,EAAAP,GCAA,IAAAQ,EAA0D,iBAOtDC,EAAA,6BAJEC,KAAmB,iBAAgC,IAAI,EAEtD,SAASC,EAAkBC,EAAmD,CACnF,SACE,OAACF,EAAiB,SAAjB,CAA0B,MAAOE,EAAM,OAAS,SAAAA,EAAM,SAAS,CAEpE,CAEO,SAASC,GAA0B,CACxC,IAAMC,KAAS,cAAWJ,CAAgB,EAC1C,GAAII,GAAU,KACZ,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAOA,CACT,CCjBA,IAAAC,EAA4B,iBCA5B,IAAAC,EAAsC,iBAU/B,SAASC,EACdC,EACA,CACA,GAAM,CAACC,EAAOC,CAAQ,KAAI,YAAkC,CAC1D,OAAQ,KACR,QAAS,GACT,MAAO,IACT,CAAC,EAEKC,KAAU,eACd,MAAOC,GAAsB,CAC3BF,EAAUG,IAAO,CAAE,GAAGA,EAAG,QAAS,GAAM,MAAO,KAAM,OAAQ,IAAK,EAAE,EACpE,IAAMC,EAAS,MAAMN,EAAOI,CAAO,EACnC,OAAAF,EAAS,CACP,OAAAI,EACA,QAAS,GACT,MAAOA,EAAO,GAAK,KAAOA,EAAO,KACnC,CAAC,EACMA,CACT,EACA,CAACN,CAAM,CACT,EAEA,MAAO,CACL,OAAQC,EAAM,OACd,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,QAAAE,CACF,CACF,CD9BO,SAASI,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,eAAaC,GAA6BH,EAAO,SAASG,CAAO,EAAG,CAACH,CAAM,CAAC,EAC3F,OAAOI,EAAmBF,CAAM,CAClC,CElBA,IAAAG,EAA4B,iBASrB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,KAAS,eACZC,GAAiCH,EAAO,aAAaG,CAAO,EAC7D,CAACH,CAAM,CACT,EACA,OAAOI,EAAmBF,CAAM,CAClC,CCrBA,IAAAG,EAAiD,iBAS1C,SAASC,GAMd,CACA,IAAMC,EAASC,EAAa,EACtB,CAACC,EAAaC,CAAc,KAAI,YAAS,EAAE,KAEjD,aAAU,IAAM,CACdA,EAAeH,EAAO,eAAe,CAAC,CACxC,EAAG,CAACA,CAAM,CAAC,EAEX,IAAMI,KAAS,eAAaC,GAA2BL,EAAO,OAAOK,CAAO,EAAG,CAACL,CAAM,CAAC,EACjF,CAAE,OAAAM,EAAQ,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAQ,EAAIC,EAAmBN,CAAM,EAErE,MAAO,CACL,OAAAE,EACA,QAAAC,EACA,MAAAC,EACA,QAAAC,EACA,YAAAP,CACF,CACF","names":["react_exports","__export","TryMellonProvider","useAuthenticate","useEnroll","useRegister","useTryMellon","__toCommonJS","import_react","import_jsx_runtime","TryMellonContext","TryMellonProvider","props","useTryMellon","client","import_react","import_react","useTryMellonAction","action","state","setState","execute","options","s","result","useRegister","client","useTryMellon","action","options","useTryMellonAction","import_react","useAuthenticate","client","useTryMellon","action","options","useTryMellonAction","import_react","useEnroll","client","useTryMellon","contextHash","setContextHash","action","options","result","loading","error","execute","useTryMellonAction"]}
package/dist/react.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions } from './trymellon-P7BPxIry.cjs';
3
+ import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions, E as EnrollmentResult, e as EnrollOptions } from './trymellon-CO_2wLZz.cjs';
4
4
 
5
5
  declare function TryMellonProvider(props: {
6
6
  client: TryMellon;
@@ -22,4 +22,12 @@ declare function useAuthenticate(): {
22
22
  execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;
23
23
  };
24
24
 
25
- export { TryMellonProvider, useAuthenticate, useRegister, useTryMellon };
25
+ declare function useEnroll(): {
26
+ result: Result<EnrollmentResult, TryMellonError> | null;
27
+ loading: boolean;
28
+ error: TryMellonError | null;
29
+ execute: (options: EnrollOptions) => Promise<Result<EnrollmentResult, TryMellonError>>;
30
+ contextHash: string;
31
+ };
32
+
33
+ export { TryMellonProvider, useAuthenticate, useEnroll, useRegister, useTryMellon };
package/dist/react.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions } from './trymellon-P7BPxIry.js';
3
+ import { T as TryMellon, R as Result, a as RegisterResult, b as TryMellonError, c as RegisterOptions, A as AuthenticateResult, d as AuthenticateOptions, E as EnrollmentResult, e as EnrollOptions } from './trymellon-CO_2wLZz.js';
4
4
 
5
5
  declare function TryMellonProvider(props: {
6
6
  client: TryMellon;
@@ -22,4 +22,12 @@ declare function useAuthenticate(): {
22
22
  execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;
23
23
  };
24
24
 
25
- export { TryMellonProvider, useAuthenticate, useRegister, useTryMellon };
25
+ declare function useEnroll(): {
26
+ result: Result<EnrollmentResult, TryMellonError> | null;
27
+ loading: boolean;
28
+ error: TryMellonError | null;
29
+ execute: (options: EnrollOptions) => Promise<Result<EnrollmentResult, TryMellonError>>;
30
+ contextHash: string;
31
+ };
32
+
33
+ export { TryMellonProvider, useAuthenticate, useEnroll, useRegister, useTryMellon };
package/dist/react.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use client";
2
- import{createContext as c,useContext as a}from"react";import{jsx as m}from"react/jsx-runtime";var s=c(null);function y(e){return m(s.Provider,{value:e.client,children:e.children})}function o(){let e=a(s);if(e==null)throw new Error("useTryMellon must be used within TryMellonProvider");return e}import{useCallback as M}from"react";import{useState as T,useCallback as R}from"react";function n(e){let[t,r]=T({result:null,loading:!1,error:null}),i=R(async u=>{r(p=>({...p,loading:!0,error:null,result:null}));let l=await e(u);return r({result:l,loading:!1,error:l.ok?null:l.error}),l},[e]);return{result:t.result,loading:t.loading,error:t.error,execute:i}}function f(){let e=o(),t=M(r=>e.register(r),[e]);return n(t)}import{useCallback as g}from"react";function A(){let e=o(),t=g(r=>e.authenticate(r),[e]);return n(t)}export{y as TryMellonProvider,A as useAuthenticate,f as useRegister,o as useTryMellon};
2
+ import{createContext as y,useContext as m}from"react";import{jsx as R}from"react/jsx-runtime";var p=y(null);function T(e){return R(p.Provider,{value:e.client,children:e.children})}function o(){let e=m(p);if(e==null)throw new Error("useTryMellon must be used within TryMellonProvider");return e}import{useCallback as E}from"react";import{useState as f,useCallback as M}from"react";function n(e){let[t,r]=f({result:null,loading:!1,error:null}),s=M(async u=>{r(i=>({...i,loading:!0,error:null,result:null}));let l=await e(u);return r({result:l,loading:!1,error:l.ok?null:l.error}),l},[e]);return{result:t.result,loading:t.loading,error:t.error,execute:s}}function x(){let e=o(),t=E(r=>e.register(r),[e]);return n(t)}import{useCallback as g}from"react";function A(){let e=o(),t=g(r=>e.authenticate(r),[e]);return n(t)}import{useCallback as d,useState as h,useEffect as S}from"react";function O(){let e=o(),[t,r]=h("");S(()=>{r(e.getContextHash())},[e]);let s=d(a=>e.enroll(a),[e]),{result:u,loading:l,error:i,execute:c}=n(s);return{result:u,loading:l,error:i,execute:c,contextHash:t}}export{T as TryMellonProvider,A as useAuthenticate,O as useEnroll,x as useRegister,o as useTryMellon};
3
3
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/context.tsx","../src/react/use-register.tsx","../src/react/use-action.ts","../src/react/use-authenticate.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\nimport type { TryMellon } from '../core/trymellon';\n\nconst TryMellonContext = createContext<TryMellon | null>(null);\n\nexport function TryMellonProvider(props: { client: TryMellon; children: ReactNode }) {\n return (\n <TryMellonContext.Provider value={props.client}>{props.children}</TryMellonContext.Provider>\n );\n}\n\nexport function useTryMellon(): TryMellon {\n const client = useContext(TryMellonContext);\n if (client == null) {\n throw new Error('useTryMellon must be used within TryMellonProvider');\n }\n return client;\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseRegisterState = UseActionState<RegisterResult>;\n\nexport function useRegister(): {\n result: Result<RegisterResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback((options: RegisterOptions) => client.register(options), [client]);\n return useTryMellonAction(action);\n}\n","import { useState, useCallback } from 'react';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseActionState<TResult> = {\n result: Result<TResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n};\n\nexport function useTryMellonAction<TOptions, TResult>(\n action: (options: TOptions) => Promise<Result<TResult, TryMellonError>>\n) {\n const [state, setState] = useState<UseActionState<TResult>>({\n result: null,\n loading: false,\n error: null,\n });\n\n const execute = useCallback(\n async (options: TOptions) => {\n setState((s) => ({ ...s, loading: true, error: null, result: null }));\n const result = await action(options);\n setState({\n result,\n loading: false,\n error: result.ok ? null : result.error,\n });\n return result;\n },\n [action]\n );\n\n return {\n result: state.result,\n loading: state.loading,\n error: state.error,\n execute,\n };\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseAuthenticateState = UseActionState<AuthenticateResult>;\n\nexport function useAuthenticate(): {\n result: Result<AuthenticateResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback(\n (options: AuthenticateOptions) => client.authenticate(options),\n [client]\n );\n return useTryMellonAction(action);\n}\n"],"mappings":";AAAA,OAAS,iBAAAA,EAAe,cAAAC,MAAkC,QAOtD,cAAAC,MAAA,oBAJJ,IAAMC,EAAmBH,EAAgC,IAAI,EAEtD,SAASI,EAAkBC,EAAmD,CACnF,OACEH,EAACC,EAAiB,SAAjB,CAA0B,MAAOE,EAAM,OAAS,SAAAA,EAAM,SAAS,CAEpE,CAEO,SAASC,GAA0B,CACxC,IAAMC,EAASN,EAAWE,CAAgB,EAC1C,GAAII,GAAU,KACZ,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAOA,CACT,CCjBA,OAAS,eAAAC,MAAmB,QCA5B,OAAS,YAAAC,EAAU,eAAAC,MAAmB,QAU/B,SAASC,EACdC,EACA,CACA,GAAM,CAACC,EAAOC,CAAQ,EAAIL,EAAkC,CAC1D,OAAQ,KACR,QAAS,GACT,MAAO,IACT,CAAC,EAEKM,EAAUL,EACd,MAAOM,GAAsB,CAC3BF,EAAUG,IAAO,CAAE,GAAGA,EAAG,QAAS,GAAM,MAAO,KAAM,OAAQ,IAAK,EAAE,EACpE,IAAMC,EAAS,MAAMN,EAAOI,CAAO,EACnC,OAAAF,EAAS,CACP,OAAAI,EACA,QAAS,GACT,MAAOA,EAAO,GAAK,KAAOA,EAAO,KACnC,CAAC,EACMA,CACT,EACA,CAACN,CAAM,CACT,EAEA,MAAO,CACL,OAAQC,EAAM,OACd,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,QAAAE,CACF,CACF,CD9BO,SAASI,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EAAaC,GAA6BJ,EAAO,SAASI,CAAO,EAAG,CAACJ,CAAM,CAAC,EAC3F,OAAOK,EAAmBH,CAAM,CAClC,CElBA,OAAS,eAAAI,MAAmB,QASrB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EACZC,GAAiCJ,EAAO,aAAaI,CAAO,EAC7D,CAACJ,CAAM,CACT,EACA,OAAOK,EAAmBH,CAAM,CAClC","names":["createContext","useContext","jsx","TryMellonContext","TryMellonProvider","props","useTryMellon","client","useCallback","useState","useCallback","useTryMellonAction","action","state","setState","execute","options","s","result","useRegister","client","useTryMellon","action","useCallback","options","useTryMellonAction","useCallback","useAuthenticate","client","useTryMellon","action","useCallback","options","useTryMellonAction"]}
1
+ {"version":3,"sources":["../src/react/context.tsx","../src/react/use-register.tsx","../src/react/use-action.ts","../src/react/use-authenticate.tsx","../src/react/use-enroll.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\nimport type { TryMellon } from '../core/trymellon';\n\nconst TryMellonContext = createContext<TryMellon | null>(null);\n\nexport function TryMellonProvider(props: { client: TryMellon; children: ReactNode }) {\n return (\n <TryMellonContext.Provider value={props.client}>{props.children}</TryMellonContext.Provider>\n );\n}\n\nexport function useTryMellon(): TryMellon {\n const client = useContext(TryMellonContext);\n if (client == null) {\n throw new Error('useTryMellon must be used within TryMellonProvider');\n }\n return client;\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { RegisterOptions, RegisterResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseRegisterState = UseActionState<RegisterResult>;\n\nexport function useRegister(): {\n result: Result<RegisterResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: RegisterOptions) => Promise<Result<RegisterResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback((options: RegisterOptions) => client.register(options), [client]);\n return useTryMellonAction(action);\n}\n","import { useState, useCallback } from 'react';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseActionState<TResult> = {\n result: Result<TResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n};\n\nexport function useTryMellonAction<TOptions, TResult>(\n action: (options: TOptions) => Promise<Result<TResult, TryMellonError>>\n) {\n const [state, setState] = useState<UseActionState<TResult>>({\n result: null,\n loading: false,\n error: null,\n });\n\n const execute = useCallback(\n async (options: TOptions) => {\n setState((s) => ({ ...s, loading: true, error: null, result: null }));\n const result = await action(options);\n setState({\n result,\n loading: false,\n error: result.ok ? null : result.error,\n });\n return result;\n },\n [action]\n );\n\n return {\n result: state.result,\n loading: state.loading,\n error: state.error,\n execute,\n };\n}\n","import { useCallback } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { AuthenticateOptions, AuthenticateResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseAuthenticateState = UseActionState<AuthenticateResult>;\n\nexport function useAuthenticate(): {\n result: Result<AuthenticateResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: AuthenticateOptions) => Promise<Result<AuthenticateResult, TryMellonError>>;\n} {\n const client = useTryMellon();\n const action = useCallback(\n (options: AuthenticateOptions) => client.authenticate(options),\n [client]\n );\n return useTryMellonAction(action);\n}\n","import { useCallback, useState, useEffect } from 'react';\nimport { useTryMellon } from './context';\nimport { useTryMellonAction, type UseActionState } from './use-action';\nimport type { EnrollOptions, EnrollmentResult } from '../types';\nimport type { TryMellonError } from '../errors';\nimport type { Result } from '../utils/result';\n\nexport type UseEnrollState = UseActionState<EnrollmentResult>;\n\nexport function useEnroll(): {\n result: Result<EnrollmentResult, TryMellonError> | null;\n loading: boolean;\n error: TryMellonError | null;\n execute: (options: EnrollOptions) => Promise<Result<EnrollmentResult, TryMellonError>>;\n contextHash: string;\n} {\n const client = useTryMellon();\n const [contextHash, setContextHash] = useState('');\n\n useEffect(() => {\n setContextHash(client.getContextHash());\n }, [client]);\n\n const action = useCallback((options: EnrollOptions) => client.enroll(options), [client]);\n const { result, loading, error, execute } = useTryMellonAction(action);\n\n return {\n result,\n loading,\n error,\n execute,\n contextHash,\n };\n}\n"],"mappings":";AAAA,OAAS,iBAAAA,EAAe,cAAAC,MAAkC,QAOtD,cAAAC,MAAA,oBAJJ,IAAMC,EAAmBH,EAAgC,IAAI,EAEtD,SAASI,EAAkBC,EAAmD,CACnF,OACEH,EAACC,EAAiB,SAAjB,CAA0B,MAAOE,EAAM,OAAS,SAAAA,EAAM,SAAS,CAEpE,CAEO,SAASC,GAA0B,CACxC,IAAMC,EAASN,EAAWE,CAAgB,EAC1C,GAAII,GAAU,KACZ,MAAM,IAAI,MAAM,oDAAoD,EAEtE,OAAOA,CACT,CCjBA,OAAS,eAAAC,MAAmB,QCA5B,OAAS,YAAAC,EAAU,eAAAC,MAAmB,QAU/B,SAASC,EACdC,EACA,CACA,GAAM,CAACC,EAAOC,CAAQ,EAAIL,EAAkC,CAC1D,OAAQ,KACR,QAAS,GACT,MAAO,IACT,CAAC,EAEKM,EAAUL,EACd,MAAOM,GAAsB,CAC3BF,EAAUG,IAAO,CAAE,GAAGA,EAAG,QAAS,GAAM,MAAO,KAAM,OAAQ,IAAK,EAAE,EACpE,IAAMC,EAAS,MAAMN,EAAOI,CAAO,EACnC,OAAAF,EAAS,CACP,OAAAI,EACA,QAAS,GACT,MAAOA,EAAO,GAAK,KAAOA,EAAO,KACnC,CAAC,EACMA,CACT,EACA,CAACN,CAAM,CACT,EAEA,MAAO,CACL,OAAQC,EAAM,OACd,QAASA,EAAM,QACf,MAAOA,EAAM,MACb,QAAAE,CACF,CACF,CD9BO,SAASI,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EAAaC,GAA6BJ,EAAO,SAASI,CAAO,EAAG,CAACJ,CAAM,CAAC,EAC3F,OAAOK,EAAmBH,CAAM,CAClC,CElBA,OAAS,eAAAI,MAAmB,QASrB,SAASC,GAKd,CACA,IAAMC,EAASC,EAAa,EACtBC,EAASC,EACZC,GAAiCJ,EAAO,aAAaI,CAAO,EAC7D,CAACJ,CAAM,CACT,EACA,OAAOK,EAAmBH,CAAM,CAClC,CCrBA,OAAS,eAAAI,EAAa,YAAAC,EAAU,aAAAC,MAAiB,QAS1C,SAASC,GAMd,CACA,IAAMC,EAASC,EAAa,EACtB,CAACC,EAAaC,CAAc,EAAIC,EAAS,EAAE,EAEjDC,EAAU,IAAM,CACdF,EAAeH,EAAO,eAAe,CAAC,CACxC,EAAG,CAACA,CAAM,CAAC,EAEX,IAAMM,EAASC,EAAaC,GAA2BR,EAAO,OAAOQ,CAAO,EAAG,CAACR,CAAM,CAAC,EACjF,CAAE,OAAAS,EAAQ,QAAAC,EAAS,MAAAC,EAAO,QAAAC,CAAQ,EAAIC,EAAmBP,CAAM,EAErE,MAAO,CACL,OAAAG,EACA,QAAAC,EACA,MAAAC,EACA,QAAAC,EACA,YAAAV,CACF,CACF","names":["createContext","useContext","jsx","TryMellonContext","TryMellonProvider","props","useTryMellon","client","useCallback","useState","useCallback","useTryMellonAction","action","state","setState","execute","options","s","result","useRegister","client","useTryMellon","action","useCallback","options","useTryMellonAction","useCallback","useAuthenticate","client","useTryMellon","action","useCallback","options","useTryMellonAction","useCallback","useState","useEffect","useEnroll","client","useTryMellon","contextHash","setContextHash","useState","useEffect","action","useCallback","options","result","loading","error","execute","useTryMellonAction"]}
@@ -1,4 +1,4 @@
1
- type TryMellonErrorCode = 'NOT_SUPPORTED' | 'USER_CANCELLED' | 'PASSKEY_NOT_FOUND' | 'SESSION_EXPIRED' | 'NETWORK_FAILURE' | 'INVALID_ARGUMENT' | 'TIMEOUT' | 'ABORTED' | 'ABORT_ERROR' | 'CHALLENGE_MISMATCH' | 'UNKNOWN_ERROR';
1
+ type TryMellonErrorCode = 'NOT_SUPPORTED' | 'USER_CANCELLED' | 'PASSKEY_NOT_FOUND' | 'SESSION_EXPIRED' | 'NETWORK_FAILURE' | 'INVALID_ARGUMENT' | 'TIMEOUT' | 'ABORTED' | 'ABORT_ERROR' | 'CHALLENGE_MISMATCH' | 'TICKET_NOT_FOUND' | 'TICKET_EXPIRED' | 'TICKET_ALREADY_USED' | 'PIN_MISMATCH' | 'PIN_LOCKED' | 'BRIDGE_SESSION_EXPIRED' | 'UNKNOWN_ERROR';
2
2
  declare class TryMellonError extends Error {
3
3
  readonly code: TryMellonErrorCode;
4
4
  readonly details?: unknown;
@@ -26,11 +26,10 @@ interface TelemetrySender {
26
26
  type Branded<T, B> = T & {
27
27
  __brand: B;
28
28
  };
29
- type AppId = Branded<string, 'AppId'>;
30
29
  type ExternalUserId = Branded<string, 'ExternalUserId'>;
31
30
  type TryMellonConfig = {
32
31
  /** Application identifier (tenant). Required for API requests. */
33
- appId: string | AppId;
32
+ appId: string;
34
33
  /** API key for authentication. Required for API requests. */
35
34
  publishableKey: string;
36
35
  apiBaseUrl?: string;
@@ -61,6 +60,14 @@ type TryMellonConfig = {
61
60
  * Set this in Node or when the document origin is not the correct one (e.g. SSR).
62
61
  */
63
62
  origin?: string;
63
+ /**
64
+ * Optional storage for context hash (e.g. sessionStorage). If not set, browser sessionStorage or in-memory fallback is used.
65
+ * Injected for testability and SSR; must implement getItem/setItem.
66
+ */
67
+ contextHashStorage?: {
68
+ getItem(key: string): string | null;
69
+ setItem(key: string, value: string): void;
70
+ };
64
71
  };
65
72
  interface RegisterOptions {
66
73
  /**
@@ -108,19 +115,19 @@ type SuccessEventUserInfo = {
108
115
  /** Success payload: token always present (03-eventos-seguridad). Nonce when flow generates it. */
109
116
  type SuccessEventPayload = {
110
117
  type: 'success';
111
- operation: 'register' | 'authenticate';
118
+ operation: 'register' | 'authenticate' | 'enroll';
112
119
  token: string;
113
120
  user?: SuccessEventUserInfo;
114
121
  nonce?: string;
115
122
  };
116
123
  type EventPayload = {
117
124
  type: 'start';
118
- operation: 'register' | 'authenticate';
125
+ operation: 'register' | 'authenticate' | 'enroll';
119
126
  nonce?: string;
120
127
  } | SuccessEventPayload | {
121
128
  type: 'error';
122
129
  error: TryMellonError;
123
- operation?: 'register' | 'authenticate';
130
+ operation?: 'register' | 'authenticate' | 'enroll';
124
131
  nonce?: string;
125
132
  } | {
126
133
  type: 'cancelled';
@@ -143,6 +150,31 @@ type EmailFallbackVerifyResult = {
143
150
  /** Set when successUrl was passed and allowed by application allowlist */
144
151
  redirectUrl?: string;
145
152
  };
153
+ type EnrollOptions = {
154
+ ticketId: string;
155
+ signal?: AbortSignal;
156
+ };
157
+ /** Result of finish enrollment; aligns with backend envelope (session_token). */
158
+ type EnrollmentResult = {
159
+ sessionToken: string;
160
+ };
161
+ /** Backend response for POST /v1/enrollment/register/options. Validators use this shape. */
162
+ type EnrollmentStartResponse = {
163
+ session_id: string;
164
+ challenge: RegisterStartResponse['challenge'];
165
+ };
166
+ /** Backend response for POST /v1/enrollment/register. Validators use this shape. */
167
+ type EnrollmentFinishResponse = {
168
+ credential_id: string;
169
+ status: string;
170
+ session_token: string;
171
+ user: {
172
+ user_id: string;
173
+ external_user_id?: string;
174
+ email?: string;
175
+ metadata?: Record<string, unknown>;
176
+ };
177
+ };
146
178
  type RecoveryVerifyResponse = {
147
179
  challenge: Record<string, unknown>;
148
180
  recovery_session_id: string;
@@ -240,6 +272,62 @@ type CrossDeviceVerifyRegistrationRequest = {
240
272
  session_id: string;
241
273
  credential: RegisterFinishRequest['credential'];
242
274
  };
275
+ /** Response from GET context/:sessionId (auth or registration). Aligns with backend unwrapped result. */
276
+ type BridgeContextResponse = {
277
+ type: 'auth' | 'registration';
278
+ options: Record<string, unknown>;
279
+ application_name?: string;
280
+ };
281
+ /** Response from POST verify/:sessionId (challenge / options for WebAuthn). */
282
+ type BridgeChallengeResponse = {
283
+ session_id: string;
284
+ challenge?: string;
285
+ registration_options?: Record<string, unknown>;
286
+ authentication_options?: Record<string, unknown>;
287
+ };
288
+ /** Backend result of POST complete (enrollment). Validators use this shape. */
289
+ type BridgeCompleteEnrollmentResult = {
290
+ credential_id: string;
291
+ entity_id: string;
292
+ user_id: string;
293
+ session_token: string;
294
+ };
295
+ /** Backend result of POST complete (auth). */
296
+ type BridgeCompleteAuthResult = {
297
+ session_token: string;
298
+ };
299
+ /** Options for bridge flows: PIN callback, optional preset PIN, abort signal. */
300
+ type BridgeOptions = {
301
+ onPinRequired?: () => Promise<string>;
302
+ presencePin?: string;
303
+ signal?: AbortSignal;
304
+ };
305
+ /** Public result of bridge enrollment: sessionToken and optional credential/user/entity ids. */
306
+ type BridgeEnrollmentResult = {
307
+ sessionToken: string;
308
+ credentialId?: string;
309
+ userId?: string;
310
+ entityId?: string;
311
+ };
312
+ /** Public result of bridge auth: sessionToken only. */
313
+ type BridgeAuthResult = {
314
+ sessionToken: string;
315
+ };
316
+ /** Union: bridge completion returns enrollment or auth result. */
317
+ type BridgeResult = BridgeEnrollmentResult | BridgeAuthResult;
318
+ /** Status snapshot from GET .../status/:sessionId (polling or SSE event). Terminal: pin_verified | pin_locked | completed. */
319
+ type BridgeStatusSnapshot = {
320
+ status: 'pending' | 'pin_verified' | 'pin_locked' | 'completed';
321
+ ts?: string;
322
+ };
323
+ /** Options for complete(): BridgeOptions plus kind and enrollment-only fields. */
324
+ type BridgeCompleteOptions = BridgeOptions & {
325
+ kind: 'enrollment' | 'auth';
326
+ /** Required when completing enrollment bridge. */
327
+ ticketId?: string;
328
+ /** Required when completing enrollment bridge. */
329
+ entityId?: string;
330
+ };
243
331
  type RegisterStartRequest = {
244
332
  external_user_id: string;
245
333
  };
@@ -387,10 +475,10 @@ interface AuthenticateResult {
387
475
  }
388
476
  type SessionValidateResponse = {
389
477
  valid: boolean;
390
- user_id: string;
391
- external_user_id: string;
392
- tenant_id: string;
393
- app_id: string;
478
+ userId: string;
479
+ externalUserId: string;
480
+ tenantId: string;
481
+ appId: string;
394
482
  };
395
483
  type OnboardingStartRequest = {
396
484
  user_role: 'maintainer' | 'app_user';
@@ -458,6 +546,8 @@ type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {
458
546
  challenge?: RegisterStartResponse['challenge'];
459
547
  };
460
548
 
549
+ /** Bridge kind: enrollment-bridge (registration flow) or auth-bridge (auth flow). */
550
+ type BridgeKind = 'enrollment' | 'auth';
461
551
  declare class ApiClient {
462
552
  private readonly httpClient;
463
553
  private readonly baseUrl;
@@ -504,6 +594,49 @@ declare class ApiClient {
504
594
  verifyCrossDeviceRegistration(request: CrossDeviceVerifyRegistrationRequest): Promise<Result<void, TryMellonError>>;
505
595
  verifyAccountRecoveryOtp(externalUserId: string, otp: string): Promise<Result<RecoveryVerifyResponse, TryMellonError>>;
506
596
  completeAccountRecovery(recoverySessionId: string, credential: Record<string, unknown>): Promise<Result<RecoveryCompleteResponse, TryMellonError>>;
597
+ startEnrollment(ticketId: string, contextHash: string, headers?: Record<string, string>): Promise<Result<EnrollmentStartResponse, TryMellonError>>;
598
+ finishEnrollment(ticketId: string, body: {
599
+ credential: unknown;
600
+ context_hash: string;
601
+ }, headers?: Record<string, string>): Promise<Result<EnrollmentFinishResponse, TryMellonError>>;
602
+ private bridgePrefix;
603
+ getBridgeContext(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeContextResponse, TryMellonError>>;
604
+ verifyBridgePin(sessionId: string, pin: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
605
+ completeBridgeEnrollment(body: {
606
+ session_id: string;
607
+ ticket_id: string;
608
+ entity_id: string;
609
+ context_hash: string;
610
+ registration_response: {
611
+ id: string;
612
+ rawId: string;
613
+ response: {
614
+ clientDataJSON: string;
615
+ attestationObject: string;
616
+ };
617
+ type: string;
618
+ };
619
+ }, headers?: Record<string, string>): Promise<Result<BridgeCompleteEnrollmentResult, TryMellonError>>;
620
+ completeBridgeAuth(body: {
621
+ session_id: string;
622
+ credential: {
623
+ id: string;
624
+ rawId: string;
625
+ response: {
626
+ authenticatorData: string;
627
+ clientDataJSON: string;
628
+ signature: string;
629
+ userHandle?: string;
630
+ };
631
+ type: string;
632
+ };
633
+ }, headers?: Record<string, string>): Promise<Result<BridgeCompleteAuthResult, TryMellonError>>;
634
+ /**
635
+ * Full URL for GET bridge status (polling or EventSource). Same path as getBridgeStatus.
636
+ * Used by BridgeManager for SSE when EventSource is available (browser only; Node has no EventSource).
637
+ */
638
+ getBridgeStatusUrl(sessionId: string, kind: BridgeKind): string;
639
+ getBridgeStatus(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
507
640
  }
508
641
 
509
642
  declare class OnboardingManager {
@@ -531,20 +664,35 @@ declare class TryMellon {
531
664
  private authService;
532
665
  private recoveryService;
533
666
  onboarding: OnboardingManager;
534
- /**
535
- * Creates a new TryMellon instance.
536
- * Validates config and returns a Result.
537
- * @param config SDK configuration
538
- */
667
+ private readonly enrollmentManager;
668
+ private readonly bridgeManager;
669
+ private readonly contextHashStorage;
670
+ private static validateConfig;
539
671
  static create(config: TryMellonConfig): Result<TryMellon, TryMellonError>;
540
672
  /**
541
673
  * @deprecated Use `TryMellon.create(config)` instead to handle validation errors safely.
542
674
  * This constructor will throw errors if configuration is invalid.
543
675
  */
544
676
  constructor(config: TryMellonConfig);
677
+ /**
678
+ * Bridge (KP-BRIDGE-04): complete enrollment or auth from a second device (e.g. mobile scanning desktop QR).
679
+ * Use kind 'enrollment' for enrollment-bridge sessions, 'auth' for auth-bridge sessions.
680
+ */
681
+ get bridge(): {
682
+ getContext(sessionId: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeContextResponse, TryMellonError>>;
683
+ verifyPin(sessionId: string, pin: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
684
+ complete(sessionId: string, options?: BridgeCompleteOptions): Promise<Result<BridgeResult, TryMellonError>>;
685
+ waitForResult(sessionId: string, options?: {
686
+ useSse?: boolean;
687
+ kind?: 'enrollment' | 'auth';
688
+ timeoutMs?: number;
689
+ }): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
690
+ };
545
691
  static isSupported(): boolean;
546
692
  register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>>;
547
693
  authenticate(options: AuthenticateOptions): Promise<Result<AuthenticateResult, TryMellonError>>;
694
+ enroll(options: EnrollOptions): Promise<Result<EnrollmentResult, TryMellonError>>;
695
+ getContextHash(): string;
548
696
  validateSession(sessionToken: string): Promise<Result<SessionValidateResponse, TryMellonError>>;
549
697
  getStatus(): Promise<ClientStatus>;
550
698
  on(event: TryMellonEvent, handler: EventHandler): () => void;
@@ -573,4 +721,4 @@ declare class TryMellon {
573
721
  };
574
722
  }
575
723
 
576
- export { type AuthenticateResult as A, type Result as R, TryMellon as T, type RegisterResult as a, TryMellonError as b, type RegisterOptions as c, type AuthenticateOptions as d, type TryMellonConfig as e };
724
+ export { type AuthenticateResult as A, type EnrollmentResult as E, type Result as R, TryMellon as T, type RegisterResult as a, TryMellonError as b, type RegisterOptions as c, type AuthenticateOptions as d, type EnrollOptions as e };