@trymellon/js 2.2.0 → 2.3.0
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/angular.cjs +1 -1
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +3 -1
- package/dist/angular.d.ts +3 -1
- package/dist/angular.js +1 -1
- package/dist/angular.js.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +160 -5
- package/dist/index.d.ts +160 -5
- package/dist/index.global.js +2 -2
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +10 -2
- package/dist/react.d.ts +10 -2
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/{trymellon-P7BPxIry.d.cts → trymellon-DItEFTiv.d.cts} +158 -5
- package/dist/{trymellon-P7BPxIry.d.ts → trymellon-DItEFTiv.d.ts} +158 -5
- package/dist/ui/index.d.ts +41 -4
- package/dist/ui/index.js +5 -5
- package/dist/ui/index.js.map +1 -1
- package/dist/vue.cjs +1 -1
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +10 -2
- package/dist/vue.d.ts +10 -2
- package/dist/vue.js +1 -1
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
package/dist/react.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
"use strict";var
|
|
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
|
package/dist/react.cjs.map
CHANGED
|
@@ -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,
|
|
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-
|
|
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-DItEFTiv.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
|
-
|
|
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-
|
|
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-DItEFTiv.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
|
-
|
|
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
|
|
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;
|
|
@@ -61,6 +61,14 @@ type TryMellonConfig = {
|
|
|
61
61
|
* Set this in Node or when the document origin is not the correct one (e.g. SSR).
|
|
62
62
|
*/
|
|
63
63
|
origin?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Optional storage for context hash (e.g. sessionStorage). If not set, browser sessionStorage or in-memory fallback is used.
|
|
66
|
+
* Injected for testability and SSR; must implement getItem/setItem.
|
|
67
|
+
*/
|
|
68
|
+
contextHashStorage?: {
|
|
69
|
+
getItem(key: string): string | null;
|
|
70
|
+
setItem(key: string, value: string): void;
|
|
71
|
+
};
|
|
64
72
|
};
|
|
65
73
|
interface RegisterOptions {
|
|
66
74
|
/**
|
|
@@ -108,19 +116,19 @@ type SuccessEventUserInfo = {
|
|
|
108
116
|
/** Success payload: token always present (03-eventos-seguridad). Nonce when flow generates it. */
|
|
109
117
|
type SuccessEventPayload = {
|
|
110
118
|
type: 'success';
|
|
111
|
-
operation: 'register' | 'authenticate';
|
|
119
|
+
operation: 'register' | 'authenticate' | 'enroll';
|
|
112
120
|
token: string;
|
|
113
121
|
user?: SuccessEventUserInfo;
|
|
114
122
|
nonce?: string;
|
|
115
123
|
};
|
|
116
124
|
type EventPayload = {
|
|
117
125
|
type: 'start';
|
|
118
|
-
operation: 'register' | 'authenticate';
|
|
126
|
+
operation: 'register' | 'authenticate' | 'enroll';
|
|
119
127
|
nonce?: string;
|
|
120
128
|
} | SuccessEventPayload | {
|
|
121
129
|
type: 'error';
|
|
122
130
|
error: TryMellonError;
|
|
123
|
-
operation?: 'register' | 'authenticate';
|
|
131
|
+
operation?: 'register' | 'authenticate' | 'enroll';
|
|
124
132
|
nonce?: string;
|
|
125
133
|
} | {
|
|
126
134
|
type: 'cancelled';
|
|
@@ -143,6 +151,31 @@ type EmailFallbackVerifyResult = {
|
|
|
143
151
|
/** Set when successUrl was passed and allowed by application allowlist */
|
|
144
152
|
redirectUrl?: string;
|
|
145
153
|
};
|
|
154
|
+
type EnrollOptions = {
|
|
155
|
+
ticketId: string;
|
|
156
|
+
signal?: AbortSignal;
|
|
157
|
+
};
|
|
158
|
+
/** Result of finish enrollment; aligns with backend envelope (session_token). */
|
|
159
|
+
type EnrollmentResult = {
|
|
160
|
+
sessionToken: string;
|
|
161
|
+
};
|
|
162
|
+
/** Backend response for POST /v1/enrollment/register/options. Validators use this shape. */
|
|
163
|
+
type EnrollmentStartResponse = {
|
|
164
|
+
session_id: string;
|
|
165
|
+
challenge: RegisterStartResponse['challenge'];
|
|
166
|
+
};
|
|
167
|
+
/** Backend response for POST /v1/enrollment/register. Validators use this shape. */
|
|
168
|
+
type EnrollmentFinishResponse = {
|
|
169
|
+
credential_id: string;
|
|
170
|
+
status: string;
|
|
171
|
+
session_token: string;
|
|
172
|
+
user: {
|
|
173
|
+
user_id: string;
|
|
174
|
+
external_user_id?: string;
|
|
175
|
+
email?: string;
|
|
176
|
+
metadata?: Record<string, unknown>;
|
|
177
|
+
};
|
|
178
|
+
};
|
|
146
179
|
type RecoveryVerifyResponse = {
|
|
147
180
|
challenge: Record<string, unknown>;
|
|
148
181
|
recovery_session_id: string;
|
|
@@ -240,6 +273,62 @@ type CrossDeviceVerifyRegistrationRequest = {
|
|
|
240
273
|
session_id: string;
|
|
241
274
|
credential: RegisterFinishRequest['credential'];
|
|
242
275
|
};
|
|
276
|
+
/** Response from GET context/:sessionId (auth or registration). Aligns with backend unwrapped result. */
|
|
277
|
+
type BridgeContextResponse = {
|
|
278
|
+
type: 'auth' | 'registration';
|
|
279
|
+
options: Record<string, unknown>;
|
|
280
|
+
application_name?: string;
|
|
281
|
+
};
|
|
282
|
+
/** Response from POST verify/:sessionId (challenge / options for WebAuthn). */
|
|
283
|
+
type BridgeChallengeResponse = {
|
|
284
|
+
session_id: string;
|
|
285
|
+
challenge?: string;
|
|
286
|
+
registration_options?: Record<string, unknown>;
|
|
287
|
+
authentication_options?: Record<string, unknown>;
|
|
288
|
+
};
|
|
289
|
+
/** Backend result of POST complete (enrollment). Validators use this shape. */
|
|
290
|
+
type BridgeCompleteEnrollmentResult = {
|
|
291
|
+
credential_id: string;
|
|
292
|
+
entity_id: string;
|
|
293
|
+
user_id: string;
|
|
294
|
+
session_token: string;
|
|
295
|
+
};
|
|
296
|
+
/** Backend result of POST complete (auth). */
|
|
297
|
+
type BridgeCompleteAuthResult = {
|
|
298
|
+
session_token: string;
|
|
299
|
+
};
|
|
300
|
+
/** Options for bridge flows: PIN callback, optional preset PIN, abort signal. */
|
|
301
|
+
type BridgeOptions = {
|
|
302
|
+
onPinRequired?: () => Promise<string>;
|
|
303
|
+
presencePin?: string;
|
|
304
|
+
signal?: AbortSignal;
|
|
305
|
+
};
|
|
306
|
+
/** Public result of bridge enrollment: sessionToken and optional credential/user/entity ids. */
|
|
307
|
+
type BridgeEnrollmentResult = {
|
|
308
|
+
sessionToken: string;
|
|
309
|
+
credentialId?: string;
|
|
310
|
+
userId?: string;
|
|
311
|
+
entityId?: string;
|
|
312
|
+
};
|
|
313
|
+
/** Public result of bridge auth: sessionToken only. */
|
|
314
|
+
type BridgeAuthResult = {
|
|
315
|
+
sessionToken: string;
|
|
316
|
+
};
|
|
317
|
+
/** Union: bridge completion returns enrollment or auth result. */
|
|
318
|
+
type BridgeResult = BridgeEnrollmentResult | BridgeAuthResult;
|
|
319
|
+
/** Status snapshot from GET .../status/:sessionId (polling or SSE event). Terminal: pin_verified | pin_locked | completed. */
|
|
320
|
+
type BridgeStatusSnapshot = {
|
|
321
|
+
status: 'pending' | 'pin_verified' | 'pin_locked' | 'completed';
|
|
322
|
+
ts?: string;
|
|
323
|
+
};
|
|
324
|
+
/** Options for complete(): BridgeOptions plus kind and enrollment-only fields. */
|
|
325
|
+
type BridgeCompleteOptions = BridgeOptions & {
|
|
326
|
+
kind: 'enrollment' | 'auth';
|
|
327
|
+
/** Required when completing enrollment bridge. */
|
|
328
|
+
ticketId?: string;
|
|
329
|
+
/** Required when completing enrollment bridge. */
|
|
330
|
+
entityId?: string;
|
|
331
|
+
};
|
|
243
332
|
type RegisterStartRequest = {
|
|
244
333
|
external_user_id: string;
|
|
245
334
|
};
|
|
@@ -458,6 +547,8 @@ type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {
|
|
|
458
547
|
challenge?: RegisterStartResponse['challenge'];
|
|
459
548
|
};
|
|
460
549
|
|
|
550
|
+
/** Bridge kind: enrollment-bridge (registration flow) or auth-bridge (auth flow). */
|
|
551
|
+
type BridgeKind = 'enrollment' | 'auth';
|
|
461
552
|
declare class ApiClient {
|
|
462
553
|
private readonly httpClient;
|
|
463
554
|
private readonly baseUrl;
|
|
@@ -504,6 +595,49 @@ declare class ApiClient {
|
|
|
504
595
|
verifyCrossDeviceRegistration(request: CrossDeviceVerifyRegistrationRequest): Promise<Result<void, TryMellonError>>;
|
|
505
596
|
verifyAccountRecoveryOtp(externalUserId: string, otp: string): Promise<Result<RecoveryVerifyResponse, TryMellonError>>;
|
|
506
597
|
completeAccountRecovery(recoverySessionId: string, credential: Record<string, unknown>): Promise<Result<RecoveryCompleteResponse, TryMellonError>>;
|
|
598
|
+
startEnrollment(ticketId: string, contextHash: string, headers?: Record<string, string>): Promise<Result<EnrollmentStartResponse, TryMellonError>>;
|
|
599
|
+
finishEnrollment(ticketId: string, body: {
|
|
600
|
+
credential: unknown;
|
|
601
|
+
context_hash: string;
|
|
602
|
+
}, headers?: Record<string, string>): Promise<Result<EnrollmentFinishResponse, TryMellonError>>;
|
|
603
|
+
private bridgePrefix;
|
|
604
|
+
getBridgeContext(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeContextResponse, TryMellonError>>;
|
|
605
|
+
verifyBridgePin(sessionId: string, pin: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
|
|
606
|
+
completeBridgeEnrollment(body: {
|
|
607
|
+
session_id: string;
|
|
608
|
+
ticket_id: string;
|
|
609
|
+
entity_id: string;
|
|
610
|
+
context_hash: string;
|
|
611
|
+
registration_response: {
|
|
612
|
+
id: string;
|
|
613
|
+
rawId: string;
|
|
614
|
+
response: {
|
|
615
|
+
clientDataJSON: string;
|
|
616
|
+
attestationObject: string;
|
|
617
|
+
};
|
|
618
|
+
type: string;
|
|
619
|
+
};
|
|
620
|
+
}, headers?: Record<string, string>): Promise<Result<BridgeCompleteEnrollmentResult, TryMellonError>>;
|
|
621
|
+
completeBridgeAuth(body: {
|
|
622
|
+
session_id: string;
|
|
623
|
+
credential: {
|
|
624
|
+
id: string;
|
|
625
|
+
rawId: string;
|
|
626
|
+
response: {
|
|
627
|
+
authenticatorData: string;
|
|
628
|
+
clientDataJSON: string;
|
|
629
|
+
signature: string;
|
|
630
|
+
userHandle?: string;
|
|
631
|
+
};
|
|
632
|
+
type: string;
|
|
633
|
+
};
|
|
634
|
+
}, headers?: Record<string, string>): Promise<Result<BridgeCompleteAuthResult, TryMellonError>>;
|
|
635
|
+
/**
|
|
636
|
+
* Full URL for GET bridge status (polling or EventSource). Same path as getBridgeStatus.
|
|
637
|
+
* Used by BridgeManager for SSE when EventSource is available (browser only; Node has no EventSource).
|
|
638
|
+
*/
|
|
639
|
+
getBridgeStatusUrl(sessionId: string, kind: BridgeKind): string;
|
|
640
|
+
getBridgeStatus(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
|
|
507
641
|
}
|
|
508
642
|
|
|
509
643
|
declare class OnboardingManager {
|
|
@@ -531,6 +665,9 @@ declare class TryMellon {
|
|
|
531
665
|
private authService;
|
|
532
666
|
private recoveryService;
|
|
533
667
|
onboarding: OnboardingManager;
|
|
668
|
+
private readonly enrollmentManager;
|
|
669
|
+
private readonly bridgeManager;
|
|
670
|
+
private readonly contextHashStorage;
|
|
534
671
|
/**
|
|
535
672
|
* Creates a new TryMellon instance.
|
|
536
673
|
* Validates config and returns a Result.
|
|
@@ -542,9 +679,25 @@ declare class TryMellon {
|
|
|
542
679
|
* This constructor will throw errors if configuration is invalid.
|
|
543
680
|
*/
|
|
544
681
|
constructor(config: TryMellonConfig);
|
|
682
|
+
/**
|
|
683
|
+
* Bridge (KP-BRIDGE-04): complete enrollment or auth from a second device (e.g. mobile scanning desktop QR).
|
|
684
|
+
* Use kind 'enrollment' for enrollment-bridge sessions, 'auth' for auth-bridge sessions.
|
|
685
|
+
*/
|
|
686
|
+
get bridge(): {
|
|
687
|
+
getContext(sessionId: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeContextResponse, TryMellonError>>;
|
|
688
|
+
verifyPin(sessionId: string, pin: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
|
|
689
|
+
complete(sessionId: string, options?: BridgeCompleteOptions): Promise<Result<BridgeResult, TryMellonError>>;
|
|
690
|
+
waitForResult(sessionId: string, options?: {
|
|
691
|
+
useSse?: boolean;
|
|
692
|
+
kind?: 'enrollment' | 'auth';
|
|
693
|
+
timeoutMs?: number;
|
|
694
|
+
}): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
|
|
695
|
+
};
|
|
545
696
|
static isSupported(): boolean;
|
|
546
697
|
register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>>;
|
|
547
698
|
authenticate(options: AuthenticateOptions): Promise<Result<AuthenticateResult, TryMellonError>>;
|
|
699
|
+
enroll(options: EnrollOptions): Promise<Result<EnrollmentResult, TryMellonError>>;
|
|
700
|
+
getContextHash(): string;
|
|
548
701
|
validateSession(sessionToken: string): Promise<Result<SessionValidateResponse, TryMellonError>>;
|
|
549
702
|
getStatus(): Promise<ClientStatus>;
|
|
550
703
|
on(event: TryMellonEvent, handler: EventHandler): () => void;
|
|
@@ -573,4 +726,4 @@ declare class TryMellon {
|
|
|
573
726
|
};
|
|
574
727
|
}
|
|
575
728
|
|
|
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
|
|
729
|
+
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, type TryMellonConfig as f };
|
|
@@ -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;
|
|
@@ -61,6 +61,14 @@ type TryMellonConfig = {
|
|
|
61
61
|
* Set this in Node or when the document origin is not the correct one (e.g. SSR).
|
|
62
62
|
*/
|
|
63
63
|
origin?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Optional storage for context hash (e.g. sessionStorage). If not set, browser sessionStorage or in-memory fallback is used.
|
|
66
|
+
* Injected for testability and SSR; must implement getItem/setItem.
|
|
67
|
+
*/
|
|
68
|
+
contextHashStorage?: {
|
|
69
|
+
getItem(key: string): string | null;
|
|
70
|
+
setItem(key: string, value: string): void;
|
|
71
|
+
};
|
|
64
72
|
};
|
|
65
73
|
interface RegisterOptions {
|
|
66
74
|
/**
|
|
@@ -108,19 +116,19 @@ type SuccessEventUserInfo = {
|
|
|
108
116
|
/** Success payload: token always present (03-eventos-seguridad). Nonce when flow generates it. */
|
|
109
117
|
type SuccessEventPayload = {
|
|
110
118
|
type: 'success';
|
|
111
|
-
operation: 'register' | 'authenticate';
|
|
119
|
+
operation: 'register' | 'authenticate' | 'enroll';
|
|
112
120
|
token: string;
|
|
113
121
|
user?: SuccessEventUserInfo;
|
|
114
122
|
nonce?: string;
|
|
115
123
|
};
|
|
116
124
|
type EventPayload = {
|
|
117
125
|
type: 'start';
|
|
118
|
-
operation: 'register' | 'authenticate';
|
|
126
|
+
operation: 'register' | 'authenticate' | 'enroll';
|
|
119
127
|
nonce?: string;
|
|
120
128
|
} | SuccessEventPayload | {
|
|
121
129
|
type: 'error';
|
|
122
130
|
error: TryMellonError;
|
|
123
|
-
operation?: 'register' | 'authenticate';
|
|
131
|
+
operation?: 'register' | 'authenticate' | 'enroll';
|
|
124
132
|
nonce?: string;
|
|
125
133
|
} | {
|
|
126
134
|
type: 'cancelled';
|
|
@@ -143,6 +151,31 @@ type EmailFallbackVerifyResult = {
|
|
|
143
151
|
/** Set when successUrl was passed and allowed by application allowlist */
|
|
144
152
|
redirectUrl?: string;
|
|
145
153
|
};
|
|
154
|
+
type EnrollOptions = {
|
|
155
|
+
ticketId: string;
|
|
156
|
+
signal?: AbortSignal;
|
|
157
|
+
};
|
|
158
|
+
/** Result of finish enrollment; aligns with backend envelope (session_token). */
|
|
159
|
+
type EnrollmentResult = {
|
|
160
|
+
sessionToken: string;
|
|
161
|
+
};
|
|
162
|
+
/** Backend response for POST /v1/enrollment/register/options. Validators use this shape. */
|
|
163
|
+
type EnrollmentStartResponse = {
|
|
164
|
+
session_id: string;
|
|
165
|
+
challenge: RegisterStartResponse['challenge'];
|
|
166
|
+
};
|
|
167
|
+
/** Backend response for POST /v1/enrollment/register. Validators use this shape. */
|
|
168
|
+
type EnrollmentFinishResponse = {
|
|
169
|
+
credential_id: string;
|
|
170
|
+
status: string;
|
|
171
|
+
session_token: string;
|
|
172
|
+
user: {
|
|
173
|
+
user_id: string;
|
|
174
|
+
external_user_id?: string;
|
|
175
|
+
email?: string;
|
|
176
|
+
metadata?: Record<string, unknown>;
|
|
177
|
+
};
|
|
178
|
+
};
|
|
146
179
|
type RecoveryVerifyResponse = {
|
|
147
180
|
challenge: Record<string, unknown>;
|
|
148
181
|
recovery_session_id: string;
|
|
@@ -240,6 +273,62 @@ type CrossDeviceVerifyRegistrationRequest = {
|
|
|
240
273
|
session_id: string;
|
|
241
274
|
credential: RegisterFinishRequest['credential'];
|
|
242
275
|
};
|
|
276
|
+
/** Response from GET context/:sessionId (auth or registration). Aligns with backend unwrapped result. */
|
|
277
|
+
type BridgeContextResponse = {
|
|
278
|
+
type: 'auth' | 'registration';
|
|
279
|
+
options: Record<string, unknown>;
|
|
280
|
+
application_name?: string;
|
|
281
|
+
};
|
|
282
|
+
/** Response from POST verify/:sessionId (challenge / options for WebAuthn). */
|
|
283
|
+
type BridgeChallengeResponse = {
|
|
284
|
+
session_id: string;
|
|
285
|
+
challenge?: string;
|
|
286
|
+
registration_options?: Record<string, unknown>;
|
|
287
|
+
authentication_options?: Record<string, unknown>;
|
|
288
|
+
};
|
|
289
|
+
/** Backend result of POST complete (enrollment). Validators use this shape. */
|
|
290
|
+
type BridgeCompleteEnrollmentResult = {
|
|
291
|
+
credential_id: string;
|
|
292
|
+
entity_id: string;
|
|
293
|
+
user_id: string;
|
|
294
|
+
session_token: string;
|
|
295
|
+
};
|
|
296
|
+
/** Backend result of POST complete (auth). */
|
|
297
|
+
type BridgeCompleteAuthResult = {
|
|
298
|
+
session_token: string;
|
|
299
|
+
};
|
|
300
|
+
/** Options for bridge flows: PIN callback, optional preset PIN, abort signal. */
|
|
301
|
+
type BridgeOptions = {
|
|
302
|
+
onPinRequired?: () => Promise<string>;
|
|
303
|
+
presencePin?: string;
|
|
304
|
+
signal?: AbortSignal;
|
|
305
|
+
};
|
|
306
|
+
/** Public result of bridge enrollment: sessionToken and optional credential/user/entity ids. */
|
|
307
|
+
type BridgeEnrollmentResult = {
|
|
308
|
+
sessionToken: string;
|
|
309
|
+
credentialId?: string;
|
|
310
|
+
userId?: string;
|
|
311
|
+
entityId?: string;
|
|
312
|
+
};
|
|
313
|
+
/** Public result of bridge auth: sessionToken only. */
|
|
314
|
+
type BridgeAuthResult = {
|
|
315
|
+
sessionToken: string;
|
|
316
|
+
};
|
|
317
|
+
/** Union: bridge completion returns enrollment or auth result. */
|
|
318
|
+
type BridgeResult = BridgeEnrollmentResult | BridgeAuthResult;
|
|
319
|
+
/** Status snapshot from GET .../status/:sessionId (polling or SSE event). Terminal: pin_verified | pin_locked | completed. */
|
|
320
|
+
type BridgeStatusSnapshot = {
|
|
321
|
+
status: 'pending' | 'pin_verified' | 'pin_locked' | 'completed';
|
|
322
|
+
ts?: string;
|
|
323
|
+
};
|
|
324
|
+
/** Options for complete(): BridgeOptions plus kind and enrollment-only fields. */
|
|
325
|
+
type BridgeCompleteOptions = BridgeOptions & {
|
|
326
|
+
kind: 'enrollment' | 'auth';
|
|
327
|
+
/** Required when completing enrollment bridge. */
|
|
328
|
+
ticketId?: string;
|
|
329
|
+
/** Required when completing enrollment bridge. */
|
|
330
|
+
entityId?: string;
|
|
331
|
+
};
|
|
243
332
|
type RegisterStartRequest = {
|
|
244
333
|
external_user_id: string;
|
|
245
334
|
};
|
|
@@ -458,6 +547,8 @@ type OnboardingRegisterResponseWithChallenge = OnboardingRegisterResponse & {
|
|
|
458
547
|
challenge?: RegisterStartResponse['challenge'];
|
|
459
548
|
};
|
|
460
549
|
|
|
550
|
+
/** Bridge kind: enrollment-bridge (registration flow) or auth-bridge (auth flow). */
|
|
551
|
+
type BridgeKind = 'enrollment' | 'auth';
|
|
461
552
|
declare class ApiClient {
|
|
462
553
|
private readonly httpClient;
|
|
463
554
|
private readonly baseUrl;
|
|
@@ -504,6 +595,49 @@ declare class ApiClient {
|
|
|
504
595
|
verifyCrossDeviceRegistration(request: CrossDeviceVerifyRegistrationRequest): Promise<Result<void, TryMellonError>>;
|
|
505
596
|
verifyAccountRecoveryOtp(externalUserId: string, otp: string): Promise<Result<RecoveryVerifyResponse, TryMellonError>>;
|
|
506
597
|
completeAccountRecovery(recoverySessionId: string, credential: Record<string, unknown>): Promise<Result<RecoveryCompleteResponse, TryMellonError>>;
|
|
598
|
+
startEnrollment(ticketId: string, contextHash: string, headers?: Record<string, string>): Promise<Result<EnrollmentStartResponse, TryMellonError>>;
|
|
599
|
+
finishEnrollment(ticketId: string, body: {
|
|
600
|
+
credential: unknown;
|
|
601
|
+
context_hash: string;
|
|
602
|
+
}, headers?: Record<string, string>): Promise<Result<EnrollmentFinishResponse, TryMellonError>>;
|
|
603
|
+
private bridgePrefix;
|
|
604
|
+
getBridgeContext(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeContextResponse, TryMellonError>>;
|
|
605
|
+
verifyBridgePin(sessionId: string, pin: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
|
|
606
|
+
completeBridgeEnrollment(body: {
|
|
607
|
+
session_id: string;
|
|
608
|
+
ticket_id: string;
|
|
609
|
+
entity_id: string;
|
|
610
|
+
context_hash: string;
|
|
611
|
+
registration_response: {
|
|
612
|
+
id: string;
|
|
613
|
+
rawId: string;
|
|
614
|
+
response: {
|
|
615
|
+
clientDataJSON: string;
|
|
616
|
+
attestationObject: string;
|
|
617
|
+
};
|
|
618
|
+
type: string;
|
|
619
|
+
};
|
|
620
|
+
}, headers?: Record<string, string>): Promise<Result<BridgeCompleteEnrollmentResult, TryMellonError>>;
|
|
621
|
+
completeBridgeAuth(body: {
|
|
622
|
+
session_id: string;
|
|
623
|
+
credential: {
|
|
624
|
+
id: string;
|
|
625
|
+
rawId: string;
|
|
626
|
+
response: {
|
|
627
|
+
authenticatorData: string;
|
|
628
|
+
clientDataJSON: string;
|
|
629
|
+
signature: string;
|
|
630
|
+
userHandle?: string;
|
|
631
|
+
};
|
|
632
|
+
type: string;
|
|
633
|
+
};
|
|
634
|
+
}, headers?: Record<string, string>): Promise<Result<BridgeCompleteAuthResult, TryMellonError>>;
|
|
635
|
+
/**
|
|
636
|
+
* Full URL for GET bridge status (polling or EventSource). Same path as getBridgeStatus.
|
|
637
|
+
* Used by BridgeManager for SSE when EventSource is available (browser only; Node has no EventSource).
|
|
638
|
+
*/
|
|
639
|
+
getBridgeStatusUrl(sessionId: string, kind: BridgeKind): string;
|
|
640
|
+
getBridgeStatus(sessionId: string, kind: BridgeKind, headers?: Record<string, string>): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
|
|
507
641
|
}
|
|
508
642
|
|
|
509
643
|
declare class OnboardingManager {
|
|
@@ -531,6 +665,9 @@ declare class TryMellon {
|
|
|
531
665
|
private authService;
|
|
532
666
|
private recoveryService;
|
|
533
667
|
onboarding: OnboardingManager;
|
|
668
|
+
private readonly enrollmentManager;
|
|
669
|
+
private readonly bridgeManager;
|
|
670
|
+
private readonly contextHashStorage;
|
|
534
671
|
/**
|
|
535
672
|
* Creates a new TryMellon instance.
|
|
536
673
|
* Validates config and returns a Result.
|
|
@@ -542,9 +679,25 @@ declare class TryMellon {
|
|
|
542
679
|
* This constructor will throw errors if configuration is invalid.
|
|
543
680
|
*/
|
|
544
681
|
constructor(config: TryMellonConfig);
|
|
682
|
+
/**
|
|
683
|
+
* Bridge (KP-BRIDGE-04): complete enrollment or auth from a second device (e.g. mobile scanning desktop QR).
|
|
684
|
+
* Use kind 'enrollment' for enrollment-bridge sessions, 'auth' for auth-bridge sessions.
|
|
685
|
+
*/
|
|
686
|
+
get bridge(): {
|
|
687
|
+
getContext(sessionId: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeContextResponse, TryMellonError>>;
|
|
688
|
+
verifyPin(sessionId: string, pin: string, kind: 'enrollment' | 'auth'): Promise<Result<BridgeChallengeResponse, TryMellonError>>;
|
|
689
|
+
complete(sessionId: string, options?: BridgeCompleteOptions): Promise<Result<BridgeResult, TryMellonError>>;
|
|
690
|
+
waitForResult(sessionId: string, options?: {
|
|
691
|
+
useSse?: boolean;
|
|
692
|
+
kind?: 'enrollment' | 'auth';
|
|
693
|
+
timeoutMs?: number;
|
|
694
|
+
}): Promise<Result<BridgeStatusSnapshot, TryMellonError>>;
|
|
695
|
+
};
|
|
545
696
|
static isSupported(): boolean;
|
|
546
697
|
register(options: RegisterOptions): Promise<Result<RegisterResult, TryMellonError>>;
|
|
547
698
|
authenticate(options: AuthenticateOptions): Promise<Result<AuthenticateResult, TryMellonError>>;
|
|
699
|
+
enroll(options: EnrollOptions): Promise<Result<EnrollmentResult, TryMellonError>>;
|
|
700
|
+
getContextHash(): string;
|
|
548
701
|
validateSession(sessionToken: string): Promise<Result<SessionValidateResponse, TryMellonError>>;
|
|
549
702
|
getStatus(): Promise<ClientStatus>;
|
|
550
703
|
on(event: TryMellonEvent, handler: EventHandler): () => void;
|
|
@@ -573,4 +726,4 @@ declare class TryMellon {
|
|
|
573
726
|
};
|
|
574
727
|
}
|
|
575
728
|
|
|
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
|
|
729
|
+
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, type TryMellonConfig as f };
|