@nevermined-io/ui-widgets 0.5.4 → 0.5.6
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/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +39 -40
- package/dist/messages.d.ts +2 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/types.d.ts +25 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/widgets/checkout.d.ts +23 -3
- package/dist/widgets/checkout.d.ts.map +1 -1
- package/dist/widgets/delegations.d.ts +7 -1
- package/dist/widgets/delegations.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { DelegationsWidget } from './widgets/delegations.js';
|
|
|
6
6
|
export { TypedEventEmitter } from './event-emitter.js';
|
|
7
7
|
export { WidgetMessageType, WIDGET_MESSAGE_VERSION, createMessage, parseMessage, } from './messages.js';
|
|
8
8
|
export { WidgetApiError, WidgetInitError, WidgetSessionExpiredError } from './utils/errors.js';
|
|
9
|
-
export type { WidgetConfig, WidgetSession, WidgetAccount, Environment, EmbedError, AuthMismatchDetail, } from './types.js';
|
|
9
|
+
export type { WidgetConfig, WidgetSession, WidgetAccount, Environment, EmbedError, AuthMismatchDetail, AuthSwitchRequestDetail, } from './types.js';
|
|
10
10
|
export type { IframeOptions } from './iframe-manager.js';
|
|
11
11
|
export type { CheckoutOptions, CheckoutResult } from './widgets/checkout.js';
|
|
12
12
|
export type { CardAction, CreateDelegationOptions, CreateDelegationResult, EnrollCardOptions, EnrollCardResult, ListCardsOptions, } from './widgets/delegations.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC9F,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC9F,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC5E,YAAY,EACV,UAAU,EACV,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.NeverminedWidgets={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=[`local`,`sandbox`,`live`,`staging_sandbox`,`staging_live`],n={local:`http://localhost:3001`,sandbox:`https://api.sandbox.nevermined.app`,live:`https://api.live.nevermined.app`,staging_sandbox:`https://api.sandbox.nevermined.dev`,staging_live:`https://api.live.nevermined.dev`},r={local:`http://localhost:4200`,sandbox:`https://nevermined.app`,live:`https://nevermined.app`,staging_sandbox:`https://nevermined.dev`,staging_live:`https://nevermined.dev`};function i(e){return n[e]}function a(e){return r[e]}var o={MISSING_INIT_TOKEN:{numericCode:`WDG.0001`,message:`initToken is required and must be a non-empty string`},INVALID_ENVIRONMENT:{numericCode:`WDG.0002`,message:`environment must be one of: sandbox, live, staging_sandbox, staging_live, local`},INVALID_INIT_TOKEN:{numericCode:`WDG.0003`,message:`Init token is invalid or expired`},INVALID_RESPONSE:{numericCode:`WDG.0004`,message:`Server response is missing required fields`},NETWORK_ERROR:{numericCode:`WDG.0005`,message:`Network request failed`},SESSION_EXPIRED:{numericCode:`WDG.0006`,message:`Widget session has expired`}},s=class extends Error{constructor(e,t,n){super(t??o[e].message,{cause:n}),this.code=e,this.name=`WidgetInitError`}},c=class extends Error{code=`SESSION_EXPIRED`;constructor(){super(o.SESSION_EXPIRED.message),this.name=`WidgetSessionExpiredError`}},l=class extends Error{constructor(e,t,n){super(e),this.status=t,this.apiCode=n,this.name=`WidgetApiError`}},u=.8,d=class{session;expiresMs;timer=null;constructor(e){this.session=e,this.expiresMs=new Date(e.expiresAt).getTime(),Number.isNaN(this.expiresMs)&&console.warn(`[SessionManager] malformed expiresAt, session will be treated as expired:`,e.expiresAt)}isValid(){return!Number.isNaN(this.expiresMs)&&this.expiresMs>Date.now()}getToken(){return this.session.sessionToken}getSession(){return this.session}startAutoRefresh(e,t){if(this.stopAutoRefresh(),!this.isValid()){t();return}let n=Math.max(0,Math.floor((this.expiresMs-Date.now())*u));this.timer=setTimeout(()=>{this.timer=null,e().then(n=>{if(this.session=n,this.expiresMs=new Date(n.expiresAt).getTime(),!this.isValid()){t();return}this.startAutoRefresh(e,t)},e=>{console.error(`[SessionManager] session refresh failed:`,e),t()})},n)}stopAutoRefresh(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}},f=class{listeners=new Map;on(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),this}off(e,t){let n=this.listeners.get(e);return n?(n.delete(t),n.size===0&&this.listeners.delete(e),this):this}once(e,t){let n=r=>{this.off(e,n),t(r)};return this.on(e,n)}removeAllListeners(e){return e===void 0?this.listeners.clear():this.listeners.delete(e),this}emit(e,t){let n=this.listeners.get(e);n&&[...n].forEach(e=>{try{e(t)}catch(e){console.error(`[TypedEventEmitter] Handler threw:`,e)}})}},p=function(e){return e.INIT=`nvm:init`,e.CLOSE=`nvm:close`,e.BOOTED=`nvm:booted`,e.READY=`nvm:ready`,e.RESIZE=`nvm:resize`,e.SUCCESS=`nvm:success`,e.ERROR=`nvm:error`,e.CARD_ACTION=`nvm:card-action`,e.AUTH_MISMATCH=`nvm:auth-mismatch`,e}({}),m=`1`,h=`1`;function g(e){return typeof e==`string`&&Object.values(p).includes(e)}function _(e,t){return{type:e,version:h,payload:t}}function v(e){if(typeof e!=`object`||!e)return{ok:!1,reason:`not an object`};let t=e;return g(t.type)?t.version===h?{ok:!0,message:{type:t.type,version:t.version,payload:t.payload}}:{ok:!1,reason:`version mismatch: received "${t.version}", expected "${h}"`}:{ok:!1,reason:typeof t.type==`string`&&t.type.startsWith(`nvm:`)?`unknown nvm: type "${t.type}"`:`missing or unknown type`}}var y=class{iframe=null;messageHandlers=new Set;protocolErrorHandlers=new Set;messageListener=null;destroyed=!1;constructor(e){if(this.expectedOrigin=e,e===`*`)throw Error(`[IframeManager] Wildcard origin "*" is not allowed — pass an explicit origin`)}create(e,t){this.iframe?.remove();let n=document.createElement(`iframe`);return n.src=e,n.style.width=`100%`,n.style.height=`100%`,n.style.border=`none`,n.style.display=`block`,n.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms`),t?.container||(n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.right=`0`,n.style.bottom=`0`,n.style.zIndex=`9999`),t?.style&&Object.assign(n.style,t.style),(t?.container??document.body).appendChild(n),this.iframe=n,n}destroy(){this.destroyed=!0,this.messageListener&&=(window.removeEventListener(`message`,this.messageListener),null),this.messageHandlers.clear(),this.protocolErrorHandlers.clear(),this.iframe?.remove(),this.iframe=null}postMessage(e){this.destroyed||this.iframe?.contentWindow?.postMessage(e,this.expectedOrigin)}onMessage(e){return this.destroyed?()=>void 0:(this.messageHandlers.add(e),this.ensureListener(),()=>this.messageHandlers.delete(e))}onProtocolError(e){return this.destroyed?()=>void 0:(this.protocolErrorHandlers.add(e),this.ensureListener(),()=>this.protocolErrorHandlers.delete(e))}ensureListener(){this.messageListener||(this.messageListener=e=>{if(e.origin!==this.expectedOrigin)return;let t=v(e.data);if(!t.ok){console.warn(`[IframeManager] Discarding message from ${this.expectedOrigin}: ${t.reason}`),this.protocolErrorHandlers.forEach(e=>{try{e(t.reason)}catch(e){console.error(`[IframeManager] Protocol error handler threw:`,e)}});return}this.messageHandlers.forEach(e=>{try{e(t.message)}catch(e){console.error(`[IframeManager] Message handler threw:`,e)}})},window.addEventListener(`message`,this.messageListener))}},b={code:`UNKNOWN`,message:`Unknown widget error`},x=class{manager=null;destroyed=!1;constructor(e,t){this.session=e,this.webappBase=t}start(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.did||typeof e.did!=`string`)throw Error(`[CheckoutWidget] did is required`);this.manager?.destroy();let t=new URL(this.webappBase).origin,n=window.location.origin,r=new URL(`/embed/checkout/${encodeURIComponent(e.did)}`,this.webappBase);r.searchParams.set(`parentOrigin`,n),e.planId&&r.searchParams.set(`planId`,e.planId);let i=new y(t);this.manager=i,i.create(r.toString(),{container:e.container}),i.onMessage(t=>this.handleMessage(t,e))}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}handleMessage(e,t){switch(e.type){case p.BOOTED:this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()})),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=e.payload??{};t.onSuccess?.({did:n.did??t.did,planId:n.planId??t.planId,txHash:n.txHash});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??b);return}case p.AUTH_MISMATCH:{let n=S(e.payload);n&&t.onAuthMismatch?.(n);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}};function S(e){if(typeof e!=`object`||!e)return null;let t=e.expectedEmail;return typeof t!=`string`||t.length===0?null:{expectedEmail:t}}var C={code:`UNKNOWN`,message:`Unknown widget error`},w={code:`UNKNOWN`,message:`Malformed nvm:success payload — paymentMethodId missing or invalid`},T={code:`UNKNOWN`,message:`Malformed nvm:success payload — delegationId missing or invalid`},E=class{manager=null;destroyed=!1;constructor(e,t,n){this.session=e,this.webappBase=t,this.apiBase=n}enrollCard(e){this.assertAlive(`enrollCard`),this.mountIframe(`/embed/cards/enroll`,e.container).onMessage(t=>this.handleEnrollMessage(t,e))}listCards(e){this.assertAlive(`listCards`),this.mountIframe(`/embed/cards/list`,e.container).onMessage(t=>this.handleListMessage(t,e))}createDelegation(e){if(this.assertAlive(`createDelegation`),typeof e.paymentMethodId!=`string`||e.paymentMethodId.length===0)throw Error(`[DelegationsWidget] createDelegation: paymentMethodId is required`);this.mountIframe(`/embed/cards/delegate`,e.container,{paymentMethodId:e.paymentMethodId}).onMessage(t=>this.handleCreateDelegationMessage(t,e))}async revokeCard(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeCard: paymentMethodId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/payment-methods/${encodeURIComponent(e)}`,`Failed to revoke payment method`)}async revokeDelegation(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeDelegation: delegationId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/delegation/${encodeURIComponent(e)}`,`Failed to revoke delegation`)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}assertAlive(e){if(this.destroyed)throw Error(`[DelegationsWidget] cannot ${e}: instance has been destroyed`)}mountIframe(e,t,n={}){this.manager?.destroy();let r=new URL(this.webappBase).origin,i=window.location.origin,a=new URL(e,this.webappBase);a.searchParams.set(`parentOrigin`,i);for(let[e,t]of Object.entries(n))a.searchParams.set(e,t);let o=new y(r);return this.manager=o,o.create(a.toString(),{container:t}),o}postInitOnBooted(){this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()}))}handleEnrollMessage(e,t){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=(e.payload??{}).paymentMethodId;if(typeof n!=`string`||n.length===0){t.onError?.(w);return}t.onSuccess?.({paymentMethodId:n});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.AUTH_MISMATCH:{let n=S(e.payload);n&&t.onAuthMismatch?.(n);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}handleListMessage(e,t){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.CARD_ACTION:{let n=e.payload??{};if(n.action!==`delegate`||typeof n.paymentMethodId!=`string`||n.paymentMethodId.length===0)return;t.onCardAction?.({action:n.action,paymentMethodId:n.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.AUTH_MISMATCH:{let n=S(e.payload);n&&t.onAuthMismatch?.(n);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}handleCreateDelegationMessage(e,t){switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=(e.payload??{}).delegationId;if(typeof n!=`string`||n.length===0){t.onError?.(T);return}t.onSuccess?.({delegationId:n,paymentMethodId:t.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??C);return}case p.AUTH_MISMATCH:{let n=S(e.payload);n&&t.onAuthMismatch?.(n);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}async deleteWithSession(e,t){let n;try{n=await fetch(e,{method:`DELETE`,headers:{Authorization:`Bearer ${this.session.getToken()}`,Accept:`application/json`}})}catch(e){throw new l(e instanceof Error&&e.message?e.message:t)}if(n.ok)return;let r,i=t;try{let e=await n.json();typeof e?.message==`string`&&e.message.length>0&&(i=e.message),typeof e?.code==`string`&&(r=e.code)}catch{}throw new l(i,n.status,r)}};function D(e){if(typeof e!=`object`||!e)return!1;let t=e;return[`sessionToken`,`userId`,`expiresAt`,`apiKeyHash`].every(e=>typeof t[e]==`string`)&&typeof t.userWallet==`string`&&t.userWallet.startsWith(`0x`)}var O=class e{_checkout=null;_delegations=null;events=new f;constructor(e,t,n){this.sessionManager=e,this._account=t,this.environment=n}static async initialize(n){let{initToken:r,environment:a}=n;if(!r||typeof r!=`string`)throw new s(`MISSING_INIT_TOKEN`);if(!a||!t.includes(a))throw new s(`INVALID_ENVIRONMENT`);let o=i(a),c;try{c=await fetch(`${o}/api/v1/widgets/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({initToken:r})})}catch(e){throw console.error(`[NeverminedWidgets] fetch failed:`,e),new s(`NETWORK_ERROR`,void 0,e)}if(!c.ok)throw c.status===401?new s(`INVALID_INIT_TOKEN`):new s(`NETWORK_ERROR`,`Request failed with status ${c.status}`);let l;try{l=await c.json()}catch(e){throw new s(`INVALID_RESPONSE`,void 0,e)}if(!D(l))throw new s(`INVALID_RESPONSE`);let u=new d(l),f=new e(u,{userId:l.userId,userWallet:l.userWallet},a);return u.startAutoRefresh(()=>f.refreshSession(),()=>f.events.emit(`session-expired`,void 0)),f}async refreshSession(){let e=await fetch(`${i(this.environment)}/api/v1/widgets/session/refresh`,{method:`POST`,headers:{Authorization:`Bearer ${this.sessionManager.getToken()}`}});if(!e.ok)throw Error(`Session refresh failed with status ${e.status}`);let t=await e.json();if(!D(t))throw Error(`Session refresh returned an invalid response`);return t}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}get account(){return this._account}get hasValidSession(){return this.sessionManager.isValid()}getSessionToken(){if(!this.sessionManager.isValid())throw new c;return this.sessionManager.getToken()}get checkout(){return this._checkout||=new x(this.sessionManager,a(this.environment)),this._checkout}get delegations(){return this._delegations||=new E(this.sessionManager,a(this.environment),i(this.environment)),this._delegations}destroy(){this.sessionManager.stopAutoRefresh(),this._checkout?.destroy(),this._checkout=null,this._delegations?.destroy(),this._delegations=null,this.events.removeAllListeners()}};e.CheckoutWidget=x,e.DelegationsWidget=E,e.IframeManager=y,e.NeverminedWidgets=O,e.SessionManager=d,e.TypedEventEmitter=f,e.WIDGET_MESSAGE_VERSION=m,e.WidgetApiError=l,e.WidgetInitError=s,e.WidgetMessageType=p,e.WidgetSessionExpiredError=c,e.createMessage=_,e.parseMessage=v});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports):typeof define==`function`&&define.amd?define([`exports`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.NeverminedWidgets={}))})(this,function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=[`local`,`sandbox`,`live`,`staging_sandbox`,`staging_live`],n={local:`http://localhost:3001`,sandbox:`https://api.sandbox.nevermined.app`,live:`https://api.live.nevermined.app`,staging_sandbox:`https://api.sandbox.nevermined.dev`,staging_live:`https://api.live.nevermined.dev`},r={local:`http://localhost:4200`,sandbox:`https://nevermined.app`,live:`https://nevermined.app`,staging_sandbox:`https://nevermined.dev`,staging_live:`https://nevermined.dev`};function i(e){return n[e]}function a(e){return r[e]}var o={MISSING_INIT_TOKEN:{numericCode:`WDG.0001`,message:`initToken is required and must be a non-empty string`},INVALID_ENVIRONMENT:{numericCode:`WDG.0002`,message:`environment must be one of: sandbox, live, staging_sandbox, staging_live, local`},INVALID_INIT_TOKEN:{numericCode:`WDG.0003`,message:`Init token is invalid or expired`},INVALID_RESPONSE:{numericCode:`WDG.0004`,message:`Server response is missing required fields`},NETWORK_ERROR:{numericCode:`WDG.0005`,message:`Network request failed`},SESSION_EXPIRED:{numericCode:`WDG.0006`,message:`Widget session has expired`}},s=class extends Error{constructor(e,t,n){super(t??o[e].message,{cause:n}),this.code=e,this.name=`WidgetInitError`}},c=class extends Error{code=`SESSION_EXPIRED`;constructor(){super(o.SESSION_EXPIRED.message),this.name=`WidgetSessionExpiredError`}},l=class extends Error{constructor(e,t,n){super(e),this.status=t,this.apiCode=n,this.name=`WidgetApiError`}},u=.8,d=class{session;expiresMs;timer=null;constructor(e){this.session=e,this.expiresMs=new Date(e.expiresAt).getTime(),Number.isNaN(this.expiresMs)&&console.warn(`[SessionManager] malformed expiresAt, session will be treated as expired:`,e.expiresAt)}isValid(){return!Number.isNaN(this.expiresMs)&&this.expiresMs>Date.now()}getToken(){return this.session.sessionToken}getSession(){return this.session}startAutoRefresh(e,t){if(this.stopAutoRefresh(),!this.isValid()){t();return}let n=Math.max(0,Math.floor((this.expiresMs-Date.now())*u));this.timer=setTimeout(()=>{this.timer=null,e().then(n=>{if(this.session=n,this.expiresMs=new Date(n.expiresAt).getTime(),!this.isValid()){t();return}this.startAutoRefresh(e,t)},e=>{console.error(`[SessionManager] session refresh failed:`,e),t()})},n)}stopAutoRefresh(){this.timer!==null&&(clearTimeout(this.timer),this.timer=null)}},f=class{listeners=new Map;on(e,t){let n=this.listeners.get(e)??new Set;return n.add(t),this.listeners.set(e,n),this}off(e,t){let n=this.listeners.get(e);return n?(n.delete(t),n.size===0&&this.listeners.delete(e),this):this}once(e,t){let n=r=>{this.off(e,n),t(r)};return this.on(e,n)}removeAllListeners(e){return e===void 0?this.listeners.clear():this.listeners.delete(e),this}emit(e,t){let n=this.listeners.get(e);n&&[...n].forEach(e=>{try{e(t)}catch(e){console.error(`[TypedEventEmitter] Handler threw:`,e)}})}},p=function(e){return e.INIT=`nvm:init`,e.CLOSE=`nvm:close`,e.BOOTED=`nvm:booted`,e.READY=`nvm:ready`,e.RESIZE=`nvm:resize`,e.SUCCESS=`nvm:success`,e.ERROR=`nvm:error`,e.CARD_ACTION=`nvm:card-action`,e.AUTH_MISMATCH=`nvm:auth-mismatch`,e.AUTH_SWITCH_REQUEST=`nvm:auth-switch-request`,e}({}),m=`1`,h=`1`;function g(e){return typeof e==`string`&&Object.values(p).includes(e)}function _(e,t){return{type:e,version:h,payload:t}}function v(e){if(typeof e!=`object`||!e)return{ok:!1,reason:`not an object`};let t=e;return g(t.type)?t.version===h?{ok:!0,message:{type:t.type,version:t.version,payload:t.payload}}:{ok:!1,reason:`version mismatch: received "${t.version}", expected "${h}"`}:{ok:!1,reason:typeof t.type==`string`&&t.type.startsWith(`nvm:`)?`unknown nvm: type "${t.type}"`:`missing or unknown type`}}var y=class{iframe=null;messageHandlers=new Set;protocolErrorHandlers=new Set;messageListener=null;destroyed=!1;constructor(e){if(this.expectedOrigin=e,e===`*`)throw Error(`[IframeManager] Wildcard origin "*" is not allowed — pass an explicit origin`)}create(e,t){this.iframe?.remove();let n=document.createElement(`iframe`);return n.src=e,n.style.width=`100%`,n.style.height=`100%`,n.style.border=`none`,n.style.display=`block`,n.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms`),t?.container||(n.style.position=`fixed`,n.style.top=`0`,n.style.left=`0`,n.style.right=`0`,n.style.bottom=`0`,n.style.zIndex=`9999`),t?.style&&Object.assign(n.style,t.style),(t?.container??document.body).appendChild(n),this.iframe=n,n}destroy(){this.destroyed=!0,this.messageListener&&=(window.removeEventListener(`message`,this.messageListener),null),this.messageHandlers.clear(),this.protocolErrorHandlers.clear(),this.iframe?.remove(),this.iframe=null}postMessage(e){this.destroyed||this.iframe?.contentWindow?.postMessage(e,this.expectedOrigin)}onMessage(e){return this.destroyed?()=>void 0:(this.messageHandlers.add(e),this.ensureListener(),()=>this.messageHandlers.delete(e))}onProtocolError(e){return this.destroyed?()=>void 0:(this.protocolErrorHandlers.add(e),this.ensureListener(),()=>this.protocolErrorHandlers.delete(e))}ensureListener(){this.messageListener||(this.messageListener=e=>{if(e.origin!==this.expectedOrigin)return;let t=v(e.data);if(!t.ok){console.warn(`[IframeManager] Discarding message from ${this.expectedOrigin}: ${t.reason}`),this.protocolErrorHandlers.forEach(e=>{try{e(t.reason)}catch(e){console.error(`[IframeManager] Protocol error handler threw:`,e)}});return}this.messageHandlers.forEach(e=>{try{e(t.message)}catch(e){console.error(`[IframeManager] Message handler threw:`,e)}})},window.addEventListener(`message`,this.messageListener))}},b={code:`UNKNOWN`,message:`Unknown widget error`},x=class{manager=null;destroyed=!1;constructor(e,t){this.session=e,this.webappBase=t}start(e){if(this.destroyed)throw Error(`[CheckoutWidget] cannot start: instance has been destroyed`);if(!e.did||typeof e.did!=`string`)throw Error(`[CheckoutWidget] did is required`);this.manager?.destroy();let t=new URL(this.webappBase).origin,n=window.location.origin,r=new URL(`/embed/checkout/${encodeURIComponent(e.did)}`,this.webappBase);r.searchParams.set(`parentOrigin`,n),e.planId&&r.searchParams.set(`planId`,e.planId);let i=new y(t);this.manager=i,i.create(r.toString(),{container:e.container}),i.onMessage(t=>this.handleMessage(t,e))}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}handleMessage(e,t){if(!w(e,t))switch(e.type){case p.BOOTED:this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()})),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=e.payload??{};t.onSuccess?.({did:n.did??t.did,planId:n.planId??t.planId,txHash:n.txHash});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??b);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}};function S(e){if(typeof e!=`object`||!e)return null;let t=e.expectedEmail;return typeof t!=`string`||t.length===0?null:{expectedEmail:t}}function C(e){if(typeof e!=`object`||!e)return null;let t=e.requestedEmail,n=e.expectedEmail;return typeof t!=`string`||t.length===0||typeof n!=`string`||n.length===0?null:{requestedEmail:t,expectedEmail:n}}function w(e,t){if(e.type===p.AUTH_MISMATCH){let n=S(e.payload);return n&&t.onAuthMismatch?.(n),!0}if(e.type===p.AUTH_SWITCH_REQUEST){let n=C(e.payload);return n&&t.onAuthSwitchRequest?.(n),!0}return!1}var T={code:`UNKNOWN`,message:`Unknown widget error`},E={code:`UNKNOWN`,message:`Malformed nvm:success payload — paymentMethodId missing or invalid`},D={code:`UNKNOWN`,message:`Malformed nvm:success payload — delegationId missing or invalid`},O=class{manager=null;destroyed=!1;constructor(e,t,n){this.session=e,this.webappBase=t,this.apiBase=n}enrollCard(e){this.assertAlive(`enrollCard`),this.mountIframe(`/embed/cards/enroll`,e.container).onMessage(t=>this.handleEnrollMessage(t,e))}listCards(e){this.assertAlive(`listCards`),this.mountIframe(`/embed/cards/list`,e.container).onMessage(t=>this.handleListMessage(t,e))}createDelegation(e){if(this.assertAlive(`createDelegation`),typeof e.paymentMethodId!=`string`||e.paymentMethodId.length===0)throw Error(`[DelegationsWidget] createDelegation: paymentMethodId is required`);this.mountIframe(`/embed/cards/delegate`,e.container,{paymentMethodId:e.paymentMethodId}).onMessage(t=>this.handleCreateDelegationMessage(t,e))}async revokeCard(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeCard: paymentMethodId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/payment-methods/${encodeURIComponent(e)}`,`Failed to revoke payment method`)}async revokeDelegation(e){if(typeof e!=`string`||e.length===0)throw Error(`[DelegationsWidget] revokeDelegation: delegationId is required`);await this.deleteWithSession(`${this.apiBase}/api/v1/widgets/delegation/${encodeURIComponent(e)}`,`Failed to revoke delegation`)}destroy(){this.destroyed=!0,this.manager?.destroy(),this.manager=null}assertAlive(e){if(this.destroyed)throw Error(`[DelegationsWidget] cannot ${e}: instance has been destroyed`)}mountIframe(e,t,n={}){this.manager?.destroy();let r=new URL(this.webappBase).origin,i=window.location.origin,a=new URL(e,this.webappBase);a.searchParams.set(`parentOrigin`,i);for(let[e,t]of Object.entries(n))a.searchParams.set(e,t);let o=new y(r);return this.manager=o,o.create(a.toString(),{container:t}),o}postInitOnBooted(){this.manager?.postMessage(_(p.INIT,{sessionToken:this.session.getToken()}))}handleEnrollMessage(e,t){if(!w(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=(e.payload??{}).paymentMethodId;if(typeof n!=`string`||n.length===0){t.onError?.(E);return}t.onSuccess?.({paymentMethodId:n});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??T);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}handleListMessage(e,t){if(!w(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.CARD_ACTION:{let n=e.payload??{};if(n.action!==`delegate`||typeof n.paymentMethodId!=`string`||n.paymentMethodId.length===0)return;t.onCardAction?.({action:n.action,paymentMethodId:n.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??T);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}handleCreateDelegationMessage(e,t){if(!w(e,t))switch(e.type){case p.BOOTED:this.postInitOnBooted(),t.onBooted?.();return;case p.READY:t.onReady?.();return;case p.SUCCESS:{let n=(e.payload??{}).delegationId;if(typeof n!=`string`||n.length===0){t.onError?.(D);return}t.onSuccess?.({delegationId:n,paymentMethodId:t.paymentMethodId});return}case p.ERROR:{let n=e.payload;t.onError?.(n?.error??T);return}case p.CLOSE:t.onClose?.(),this.destroy();return;default:return}}async deleteWithSession(e,t){let n;try{n=await fetch(e,{method:`DELETE`,headers:{Authorization:`Bearer ${this.session.getToken()}`,Accept:`application/json`}})}catch(e){throw new l(e instanceof Error&&e.message?e.message:t)}if(n.ok)return;let r,i=t;try{let e=await n.json();typeof e?.message==`string`&&e.message.length>0&&(i=e.message),typeof e?.code==`string`&&(r=e.code)}catch{}throw new l(i,n.status,r)}};function k(e){if(typeof e!=`object`||!e)return!1;let t=e;return[`sessionToken`,`userId`,`expiresAt`,`apiKeyHash`].every(e=>typeof t[e]==`string`)&&typeof t.userWallet==`string`&&t.userWallet.startsWith(`0x`)}var A=class e{_checkout=null;_delegations=null;events=new f;constructor(e,t,n){this.sessionManager=e,this._account=t,this.environment=n}static async initialize(n){let{initToken:r,environment:a}=n;if(!r||typeof r!=`string`)throw new s(`MISSING_INIT_TOKEN`);if(!a||!t.includes(a))throw new s(`INVALID_ENVIRONMENT`);let o=i(a),c;try{c=await fetch(`${o}/api/v1/widgets/session`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({initToken:r})})}catch(e){throw console.error(`[NeverminedWidgets] fetch failed:`,e),new s(`NETWORK_ERROR`,void 0,e)}if(!c.ok)throw c.status===401?new s(`INVALID_INIT_TOKEN`):new s(`NETWORK_ERROR`,`Request failed with status ${c.status}`);let l;try{l=await c.json()}catch(e){throw new s(`INVALID_RESPONSE`,void 0,e)}if(!k(l))throw new s(`INVALID_RESPONSE`);let u=new d(l),f=new e(u,{userId:l.userId,userWallet:l.userWallet},a);return u.startAutoRefresh(()=>f.refreshSession(),()=>f.events.emit(`session-expired`,void 0)),f}async refreshSession(){let e=await fetch(`${i(this.environment)}/api/v1/widgets/session/refresh`,{method:`POST`,headers:{Authorization:`Bearer ${this.sessionManager.getToken()}`}});if(!e.ok)throw Error(`Session refresh failed with status ${e.status}`);let t=await e.json();if(!k(t))throw Error(`Session refresh returned an invalid response`);return t}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}get account(){return this._account}get hasValidSession(){return this.sessionManager.isValid()}getSessionToken(){if(!this.sessionManager.isValid())throw new c;return this.sessionManager.getToken()}get checkout(){return this._checkout||=new x(this.sessionManager,a(this.environment)),this._checkout}get delegations(){return this._delegations||=new O(this.sessionManager,a(this.environment),i(this.environment)),this._delegations}destroy(){this.sessionManager.stopAutoRefresh(),this._checkout?.destroy(),this._checkout=null,this._delegations?.destroy(),this._delegations=null,this.events.removeAllListeners()}};e.CheckoutWidget=x,e.DelegationsWidget=O,e.IframeManager=y,e.NeverminedWidgets=A,e.SessionManager=d,e.TypedEventEmitter=f,e.WIDGET_MESSAGE_VERSION=m,e.WidgetApiError=l,e.WidgetInitError=s,e.WidgetMessageType=p,e.WidgetSessionExpiredError=c,e.createMessage=_,e.parseMessage=v});
|
package/dist/index.mjs
CHANGED
|
@@ -131,7 +131,7 @@ var a = {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
}, f = /* @__PURE__ */ function(e) {
|
|
134
|
-
return e.INIT = "nvm:init", e.CLOSE = "nvm:close", e.BOOTED = "nvm:booted", e.READY = "nvm:ready", e.RESIZE = "nvm:resize", e.SUCCESS = "nvm:success", e.ERROR = "nvm:error", e.CARD_ACTION = "nvm:card-action", e.AUTH_MISMATCH = "nvm:auth-mismatch", e;
|
|
134
|
+
return e.INIT = "nvm:init", e.CLOSE = "nvm:close", e.BOOTED = "nvm:booted", e.READY = "nvm:ready", e.RESIZE = "nvm:resize", e.SUCCESS = "nvm:success", e.ERROR = "nvm:error", e.CARD_ACTION = "nvm:card-action", e.AUTH_MISMATCH = "nvm:auth-mismatch", e.AUTH_SWITCH_REQUEST = "nvm:auth-switch-request", e;
|
|
135
135
|
}({}), p = "1", m = "1";
|
|
136
136
|
function h(e) {
|
|
137
137
|
return typeof e == "string" && Object.values(f).includes(e);
|
|
@@ -237,7 +237,7 @@ var v = class {
|
|
|
237
237
|
this.destroyed = !0, this.manager?.destroy(), this.manager = null;
|
|
238
238
|
}
|
|
239
239
|
handleMessage(e, t) {
|
|
240
|
-
switch (e.type) {
|
|
240
|
+
if (!C(e, t)) switch (e.type) {
|
|
241
241
|
case f.BOOTED:
|
|
242
242
|
this.manager?.postMessage(g(f.INIT, { sessionToken: this.session.getToken() })), t.onBooted?.();
|
|
243
243
|
return;
|
|
@@ -258,11 +258,6 @@ var v = class {
|
|
|
258
258
|
t.onError?.(n?.error ?? y);
|
|
259
259
|
return;
|
|
260
260
|
}
|
|
261
|
-
case f.AUTH_MISMATCH: {
|
|
262
|
-
let n = x(e.payload);
|
|
263
|
-
n && t.onAuthMismatch?.(n);
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
261
|
case f.CLOSE:
|
|
267
262
|
t.onClose?.(), this.destroy();
|
|
268
263
|
return;
|
|
@@ -275,18 +270,37 @@ function x(e) {
|
|
|
275
270
|
let t = e.expectedEmail;
|
|
276
271
|
return typeof t != "string" || t.length === 0 ? null : { expectedEmail: t };
|
|
277
272
|
}
|
|
273
|
+
function S(e) {
|
|
274
|
+
if (typeof e != "object" || !e) return null;
|
|
275
|
+
let t = e.requestedEmail, n = e.expectedEmail;
|
|
276
|
+
return typeof t != "string" || t.length === 0 || typeof n != "string" || n.length === 0 ? null : {
|
|
277
|
+
requestedEmail: t,
|
|
278
|
+
expectedEmail: n
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function C(e, t) {
|
|
282
|
+
if (e.type === f.AUTH_MISMATCH) {
|
|
283
|
+
let n = x(e.payload);
|
|
284
|
+
return n && t.onAuthMismatch?.(n), !0;
|
|
285
|
+
}
|
|
286
|
+
if (e.type === f.AUTH_SWITCH_REQUEST) {
|
|
287
|
+
let n = S(e.payload);
|
|
288
|
+
return n && t.onAuthSwitchRequest?.(n), !0;
|
|
289
|
+
}
|
|
290
|
+
return !1;
|
|
291
|
+
}
|
|
278
292
|
//#endregion
|
|
279
293
|
//#region src/widgets/delegations.ts
|
|
280
|
-
var
|
|
294
|
+
var w = {
|
|
281
295
|
code: "UNKNOWN",
|
|
282
296
|
message: "Unknown widget error"
|
|
283
|
-
},
|
|
297
|
+
}, T = {
|
|
284
298
|
code: "UNKNOWN",
|
|
285
299
|
message: "Malformed nvm:success payload — paymentMethodId missing or invalid"
|
|
286
|
-
},
|
|
300
|
+
}, E = {
|
|
287
301
|
code: "UNKNOWN",
|
|
288
302
|
message: "Malformed nvm:success payload — delegationId missing or invalid"
|
|
289
|
-
},
|
|
303
|
+
}, D = class {
|
|
290
304
|
manager = null;
|
|
291
305
|
destroyed = !1;
|
|
292
306
|
constructor(e, t, n) {
|
|
@@ -328,7 +342,7 @@ var S = {
|
|
|
328
342
|
this.manager?.postMessage(g(f.INIT, { sessionToken: this.session.getToken() }));
|
|
329
343
|
}
|
|
330
344
|
handleEnrollMessage(e, t) {
|
|
331
|
-
switch (e.type) {
|
|
345
|
+
if (!C(e, t)) switch (e.type) {
|
|
332
346
|
case f.BOOTED:
|
|
333
347
|
this.postInitOnBooted(), t.onBooted?.();
|
|
334
348
|
return;
|
|
@@ -338,7 +352,7 @@ var S = {
|
|
|
338
352
|
case f.SUCCESS: {
|
|
339
353
|
let n = (e.payload ?? {}).paymentMethodId;
|
|
340
354
|
if (typeof n != "string" || n.length === 0) {
|
|
341
|
-
t.onError?.(
|
|
355
|
+
t.onError?.(T);
|
|
342
356
|
return;
|
|
343
357
|
}
|
|
344
358
|
t.onSuccess?.({ paymentMethodId: n });
|
|
@@ -346,12 +360,7 @@ var S = {
|
|
|
346
360
|
}
|
|
347
361
|
case f.ERROR: {
|
|
348
362
|
let n = e.payload;
|
|
349
|
-
t.onError?.(n?.error ??
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
case f.AUTH_MISMATCH: {
|
|
353
|
-
let n = x(e.payload);
|
|
354
|
-
n && t.onAuthMismatch?.(n);
|
|
363
|
+
t.onError?.(n?.error ?? w);
|
|
355
364
|
return;
|
|
356
365
|
}
|
|
357
366
|
case f.CLOSE:
|
|
@@ -361,7 +370,7 @@ var S = {
|
|
|
361
370
|
}
|
|
362
371
|
}
|
|
363
372
|
handleListMessage(e, t) {
|
|
364
|
-
switch (e.type) {
|
|
373
|
+
if (!C(e, t)) switch (e.type) {
|
|
365
374
|
case f.BOOTED:
|
|
366
375
|
this.postInitOnBooted(), t.onBooted?.();
|
|
367
376
|
return;
|
|
@@ -379,12 +388,7 @@ var S = {
|
|
|
379
388
|
}
|
|
380
389
|
case f.ERROR: {
|
|
381
390
|
let n = e.payload;
|
|
382
|
-
t.onError?.(n?.error ??
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
case f.AUTH_MISMATCH: {
|
|
386
|
-
let n = x(e.payload);
|
|
387
|
-
n && t.onAuthMismatch?.(n);
|
|
391
|
+
t.onError?.(n?.error ?? w);
|
|
388
392
|
return;
|
|
389
393
|
}
|
|
390
394
|
case f.CLOSE:
|
|
@@ -394,7 +398,7 @@ var S = {
|
|
|
394
398
|
}
|
|
395
399
|
}
|
|
396
400
|
handleCreateDelegationMessage(e, t) {
|
|
397
|
-
switch (e.type) {
|
|
401
|
+
if (!C(e, t)) switch (e.type) {
|
|
398
402
|
case f.BOOTED:
|
|
399
403
|
this.postInitOnBooted(), t.onBooted?.();
|
|
400
404
|
return;
|
|
@@ -404,7 +408,7 @@ var S = {
|
|
|
404
408
|
case f.SUCCESS: {
|
|
405
409
|
let n = (e.payload ?? {}).delegationId;
|
|
406
410
|
if (typeof n != "string" || n.length === 0) {
|
|
407
|
-
t.onError?.(
|
|
411
|
+
t.onError?.(E);
|
|
408
412
|
return;
|
|
409
413
|
}
|
|
410
414
|
t.onSuccess?.({
|
|
@@ -415,12 +419,7 @@ var S = {
|
|
|
415
419
|
}
|
|
416
420
|
case f.ERROR: {
|
|
417
421
|
let n = e.payload;
|
|
418
|
-
t.onError?.(n?.error ??
|
|
419
|
-
return;
|
|
420
|
-
}
|
|
421
|
-
case f.AUTH_MISMATCH: {
|
|
422
|
-
let n = x(e.payload);
|
|
423
|
-
n && t.onAuthMismatch?.(n);
|
|
422
|
+
t.onError?.(n?.error ?? w);
|
|
424
423
|
return;
|
|
425
424
|
}
|
|
426
425
|
case f.CLOSE:
|
|
@@ -453,7 +452,7 @@ var S = {
|
|
|
453
452
|
};
|
|
454
453
|
//#endregion
|
|
455
454
|
//#region src/nevermined-widgets.ts
|
|
456
|
-
function
|
|
455
|
+
function O(e) {
|
|
457
456
|
if (typeof e != "object" || !e) return !1;
|
|
458
457
|
let t = e;
|
|
459
458
|
return [
|
|
@@ -463,7 +462,7 @@ function E(e) {
|
|
|
463
462
|
"apiKeyHash"
|
|
464
463
|
].every((e) => typeof t[e] == "string") && typeof t.userWallet == "string" && t.userWallet.startsWith("0x");
|
|
465
464
|
}
|
|
466
|
-
var
|
|
465
|
+
var k = class t {
|
|
467
466
|
_checkout = null;
|
|
468
467
|
_delegations = null;
|
|
469
468
|
events = new d();
|
|
@@ -491,7 +490,7 @@ var D = class t {
|
|
|
491
490
|
} catch (e) {
|
|
492
491
|
throw new o("INVALID_RESPONSE", void 0, e);
|
|
493
492
|
}
|
|
494
|
-
if (!
|
|
493
|
+
if (!O(l)) throw new o("INVALID_RESPONSE");
|
|
495
494
|
let d = new u(l), f = new t(d, {
|
|
496
495
|
userId: l.userId,
|
|
497
496
|
userWallet: l.userWallet
|
|
@@ -505,7 +504,7 @@ var D = class t {
|
|
|
505
504
|
});
|
|
506
505
|
if (!e.ok) throw Error(`Session refresh failed with status ${e.status}`);
|
|
507
506
|
let t = await e.json();
|
|
508
|
-
if (!
|
|
507
|
+
if (!O(t)) throw Error("Session refresh returned an invalid response");
|
|
509
508
|
return t;
|
|
510
509
|
}
|
|
511
510
|
on(e, t) {
|
|
@@ -528,11 +527,11 @@ var D = class t {
|
|
|
528
527
|
return this._checkout ||= new b(this.sessionManager, i(this.environment)), this._checkout;
|
|
529
528
|
}
|
|
530
529
|
get delegations() {
|
|
531
|
-
return this._delegations ||= new
|
|
530
|
+
return this._delegations ||= new D(this.sessionManager, i(this.environment), r(this.environment)), this._delegations;
|
|
532
531
|
}
|
|
533
532
|
destroy() {
|
|
534
533
|
this.sessionManager.stopAutoRefresh(), this._checkout?.destroy(), this._checkout = null, this._delegations?.destroy(), this._delegations = null, this.events.removeAllListeners();
|
|
535
534
|
}
|
|
536
535
|
};
|
|
537
536
|
//#endregion
|
|
538
|
-
export { b as CheckoutWidget,
|
|
537
|
+
export { b as CheckoutWidget, D as DelegationsWidget, v as IframeManager, k as NeverminedWidgets, u as SessionManager, d as TypedEventEmitter, p as WIDGET_MESSAGE_VERSION, c as WidgetApiError, o as WidgetInitError, f as WidgetMessageType, s as WidgetSessionExpiredError, g as createMessage, _ as parseMessage };
|
package/dist/messages.d.ts
CHANGED
|
@@ -7,7 +7,8 @@ export declare enum WidgetMessageType {
|
|
|
7
7
|
SUCCESS = "nvm:success",
|
|
8
8
|
ERROR = "nvm:error",
|
|
9
9
|
CARD_ACTION = "nvm:card-action",
|
|
10
|
-
AUTH_MISMATCH = "nvm:auth-mismatch"
|
|
10
|
+
AUTH_MISMATCH = "nvm:auth-mismatch",
|
|
11
|
+
AUTH_SWITCH_REQUEST = "nvm:auth-switch-request"
|
|
11
12
|
}
|
|
12
13
|
export interface WidgetMessage<T = unknown> {
|
|
13
14
|
type: WidgetMessageType;
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,oBAAY,iBAAiB;IAE3B,IAAI,aAAa;IACjB,KAAK,cAAc;IAEnB,MAAM,eAAe;IACrB,KAAK,cAAc;IACnB,MAAM,eAAe;IACrB,OAAO,gBAAgB;IACvB,KAAK,cAAc;IAInB,WAAW,oBAAoB;IAI/B,aAAa,sBAAsB;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,oBAAY,iBAAiB;IAE3B,IAAI,aAAa;IACjB,KAAK,cAAc;IAEnB,MAAM,eAAe;IACrB,KAAK,cAAc;IACnB,MAAM,eAAe;IACrB,OAAO,gBAAgB;IACvB,KAAK,cAAc;IAInB,WAAW,oBAAoB;IAI/B,aAAa,sBAAsB;IAInC,mBAAmB,4BAA4B;CAChD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,iBAAiB,CAAA;IACvB,OAAO,EAAE,GAAG,CAAA;IACZ,OAAO,CAAC,EAAE,CAAC,CAAA;CACZ;AAED,eAAO,MAAM,sBAAsB,EAAG,GAAY,CAAA;AAWlD,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAMvF;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAEjC,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,CA8BvD"}
|
package/dist/types.d.ts
CHANGED
|
@@ -31,14 +31,34 @@ export interface EmbedError {
|
|
|
31
31
|
/**
|
|
32
32
|
* Emitted (via the per-widget `onAuthMismatch` callback) when the iframe
|
|
33
33
|
* detects a live host Privy session whose email does not match the email
|
|
34
|
-
* baked into the widget init token. The iframe renders a
|
|
35
|
-
* the host
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
34
|
+
* baked into the widget init token. The iframe renders a two-button prompt
|
|
35
|
+
* (continue as the host identity, or switch to the init-token identity by
|
|
36
|
+
* signing out of Privy inside the iframe) and the host page is informed so
|
|
37
|
+
* it can mirror that affordance on its own UI. The widget is effectively
|
|
38
|
+
* halted until either button is clicked or the host re-issues an init
|
|
39
|
+
* token via the action below.
|
|
39
40
|
*/
|
|
40
41
|
export interface AuthMismatchDetail {
|
|
41
42
|
/** Email expected by the widget init token (normalized — trimmed, lower-cased). */
|
|
42
43
|
expectedEmail: string;
|
|
43
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Emitted (via the per-widget `onAuthSwitchRequest` callback) when the user
|
|
47
|
+
* picks "Continue as <hostEmail>" on the mismatch prompt. The host page is
|
|
48
|
+
* expected to re-issue an init token bound to `requestedEmail` and reopen
|
|
49
|
+
* the widget; the iframe stays on the prompt until that happens.
|
|
50
|
+
*
|
|
51
|
+
* **Security note for integrators:** the SDK posts this event to the host
|
|
52
|
+
* via `window.postMessage`, but the host's `window.addEventListener('message',
|
|
53
|
+
* ...)` listens to ALL frames on the page. Validate `event.origin === <your
|
|
54
|
+
* widget host>` (e.g. `https://app.nevermined.io`) before re-issuing tokens
|
|
55
|
+
* — otherwise a malicious sub-frame could spoof this event and trick your
|
|
56
|
+
* backend into minting a token for an attacker-supplied email.
|
|
57
|
+
*/
|
|
58
|
+
export interface AuthSwitchRequestDetail {
|
|
59
|
+
/** Email the user wants the widget to operate under (their live Privy identity). */
|
|
60
|
+
requestedEmail: string;
|
|
61
|
+
/** Email originally baked into the init token, for reference / telemetry. */
|
|
62
|
+
expectedEmail: string;
|
|
63
|
+
}
|
|
44
64
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0EAA2E,CAAA;AACpG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;IACzB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,uBAAuB,GAAG,SAAS,CAAA;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,0EAA2E,CAAA;AACpG,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,WAAW,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;IACzB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,uBAAuB,GAAG,SAAS,CAAA;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,uBAAuB;IACtC,oFAAoF;IACpF,cAAc,EAAE,MAAM,CAAA;IACtB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { SessionManager } from '../session.js';
|
|
2
|
-
import
|
|
2
|
+
import { type WidgetMessage } from '../messages.js';
|
|
3
|
+
import type { AuthMismatchDetail, AuthSwitchRequestDetail, EmbedError } from '../types.js';
|
|
3
4
|
export interface CheckoutResult {
|
|
4
5
|
did: string;
|
|
5
6
|
planId?: string;
|
|
@@ -16,10 +17,17 @@ export interface CheckoutOptions {
|
|
|
16
17
|
/**
|
|
17
18
|
* Fires when the iframe detects that the live host Privy session belongs
|
|
18
19
|
* to a different account than the email baked into the widget init token.
|
|
19
|
-
* The iframe stays mounted on a
|
|
20
|
-
*
|
|
20
|
+
* The iframe stays mounted on a two-button prompt; the host can mirror that
|
|
21
|
+
* affordance on its own UI. See `AuthMismatchDetail`.
|
|
21
22
|
*/
|
|
22
23
|
onAuthMismatch?: (detail: AuthMismatchDetail) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Fires when, on the mismatch prompt, the user picks "Continue as
|
|
26
|
+
* <hostEmail>". The host should re-issue an init token bound to
|
|
27
|
+
* `requestedEmail` and reopen the widget. The iframe stays on the prompt
|
|
28
|
+
* until then. See `AuthSwitchRequestDetail`.
|
|
29
|
+
*/
|
|
30
|
+
onAuthSwitchRequest?: (detail: AuthSwitchRequestDetail) => void;
|
|
23
31
|
onClose?: () => void;
|
|
24
32
|
}
|
|
25
33
|
/**
|
|
@@ -51,4 +59,16 @@ export declare class CheckoutWidget {
|
|
|
51
59
|
* protocol updates from crashing host pages.
|
|
52
60
|
*/
|
|
53
61
|
export declare function parseAuthMismatch(payload: unknown): AuthMismatchDetail | null;
|
|
62
|
+
export declare function parseAuthSwitchRequest(payload: unknown): AuthSwitchRequestDetail | null;
|
|
63
|
+
export interface AuthMessageHandlers {
|
|
64
|
+
onAuthMismatch?: (detail: AuthMismatchDetail) => void;
|
|
65
|
+
onAuthSwitchRequest?: (detail: AuthSwitchRequestDetail) => void;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Centralizes the auth-related iframe → host messages so every widget
|
|
69
|
+
* `handleMessage` switch can stay a one-liner. Returns true when the message
|
|
70
|
+
* was an auth event (the caller should `return` and skip the rest of its
|
|
71
|
+
* switch), false otherwise.
|
|
72
|
+
*/
|
|
73
|
+
export declare function handleAuthMessage(msg: WidgetMessage, options: AuthMessageHandlers): boolean;
|
|
54
74
|
//# sourceMappingURL=checkout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/widgets/checkout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/widgets/checkout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE1F,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,WAAW,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACrD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAA;IAC/D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAID;;;;;;;;GAQG;AACH,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAAQ;gBAGN,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM;IAGrC;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAwBrC,OAAO,IAAI,IAAI;IAMf,OAAO,CAAC,aAAa;CAwCtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,GAAG,IAAI,CAK7E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CAOvF;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAA;IACrD,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAA;CAChE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAY3F"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { SessionManager } from '../session.js';
|
|
2
|
-
import type { AuthMismatchDetail, EmbedError } from '../types.js';
|
|
2
|
+
import type { AuthMismatchDetail, AuthSwitchRequestDetail, EmbedError } from '../types.js';
|
|
3
3
|
export interface EnrollCardResult {
|
|
4
4
|
paymentMethodId: string;
|
|
5
5
|
}
|
|
@@ -11,6 +11,8 @@ export interface EnrollCardOptions {
|
|
|
11
11
|
onError?: (error: EmbedError) => void;
|
|
12
12
|
/** See `CheckoutOptions.onAuthMismatch`. */
|
|
13
13
|
onAuthMismatch?: (detail: AuthMismatchDetail) => void;
|
|
14
|
+
/** See `CheckoutOptions.onAuthSwitchRequest`. */
|
|
15
|
+
onAuthSwitchRequest?: (detail: AuthSwitchRequestDetail) => void;
|
|
14
16
|
onClose?: () => void;
|
|
15
17
|
}
|
|
16
18
|
export interface CardAction {
|
|
@@ -26,6 +28,8 @@ export interface ListCardsOptions {
|
|
|
26
28
|
onError?: (error: EmbedError) => void;
|
|
27
29
|
/** See `CheckoutOptions.onAuthMismatch`. */
|
|
28
30
|
onAuthMismatch?: (detail: AuthMismatchDetail) => void;
|
|
31
|
+
/** See `CheckoutOptions.onAuthSwitchRequest`. */
|
|
32
|
+
onAuthSwitchRequest?: (detail: AuthSwitchRequestDetail) => void;
|
|
29
33
|
onClose?: () => void;
|
|
30
34
|
}
|
|
31
35
|
export interface CreateDelegationResult {
|
|
@@ -41,6 +45,8 @@ export interface CreateDelegationOptions {
|
|
|
41
45
|
onError?: (error: EmbedError) => void;
|
|
42
46
|
/** See `CheckoutOptions.onAuthMismatch`. */
|
|
43
47
|
onAuthMismatch?: (detail: AuthMismatchDetail) => void;
|
|
48
|
+
/** See `CheckoutOptions.onAuthSwitchRequest`. */
|
|
49
|
+
onAuthSwitchRequest?: (detail: AuthSwitchRequestDetail) => void;
|
|
44
50
|
onClose?: () => void;
|
|
45
51
|
}
|
|
46
52
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegations.d.ts","sourceRoot":"","sources":["../../src/widgets/delegations.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"delegations.d.ts","sourceRoot":"","sources":["../../src/widgets/delegations.ts"],"names":[],"mappings":"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"}
|