@nimiq/hub-api
Advanced tools
Comparing version 0.4.2 to 0.5.0
import { PostMessageRpcClient, RedirectRpcClient } from '@nimiq/rpc'; | ||
class RequestBehavior { | ||
constructor(type) { | ||
this._type = type; | ||
} | ||
static getAllowedOrigin(endpoint) { | ||
@@ -8,11 +11,5 @@ const url = new URL(endpoint); | ||
} | ||
constructor(type) { | ||
this._type = type; | ||
} | ||
async request(endpoint, command, args) { | ||
throw new Error('Not implemented'); | ||
} | ||
get type() { | ||
return this._type; | ||
} | ||
} | ||
@@ -159,3 +156,7 @@ var BehaviorType; | ||
// State is always an object containing at least the __command property | ||
(result, rpcId, state) => resolve(result, state), (error, rpcId, state) => reject && reject(error, state)); | ||
(result, rpcId, state) => resolve(result, state), (error, rpcId, state) => { | ||
if (!reject) | ||
return; | ||
reject(error, state); | ||
}); | ||
} | ||
@@ -162,0 +163,0 @@ onboard(request, requestBehavior = this._defaultBehavior) { |
(function (global, factory) { | ||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@nimiq/rpc')) : | ||
typeof define === 'function' && define.amd ? define(['@nimiq/rpc'], factory) : | ||
(global.HubApi = factory(global.rpc)); | ||
}(this, (function (rpc) { 'use strict'; | ||
(global = global || self, global.HubApi = factory(global.rpc)); | ||
}(this, function (rpc) { 'use strict'; | ||
class RequestBehavior { | ||
constructor(type) { | ||
this._type = type; | ||
} | ||
static getAllowedOrigin(endpoint) { | ||
@@ -12,11 +15,5 @@ const url = new URL(endpoint); | ||
} | ||
constructor(type) { | ||
this._type = type; | ||
} | ||
async request(endpoint, command, args) { | ||
throw new Error('Not implemented'); | ||
} | ||
get type() { | ||
return this._type; | ||
} | ||
} | ||
@@ -163,3 +160,7 @@ var BehaviorType; | ||
// State is always an object containing at least the __command property | ||
(result, rpcId, state) => resolve(result, state), (error, rpcId, state) => reject && reject(error, state)); | ||
(result, rpcId, state) => resolve(result, state), (error, rpcId, state) => { | ||
if (!reject) | ||
return; | ||
reject(error, state); | ||
}); | ||
} | ||
@@ -223,2 +224,2 @@ onboard(request, requestBehavior = this._defaultBehavior) { | ||
}))); | ||
})); |
@@ -1,1 +0,1 @@ | ||
class Base64{static byteLength(e){const[t,s]=Base64._getLengths(e);return Base64._byteLength(t,s)}static decode(e){Base64._initRevLookup();const[t,s]=Base64._getLengths(e),r=new Uint8Array(Base64._byteLength(t,s));let i=0;const n=s>0?t-4:t;let o=0;for(;o<n;o+=4){const t=Base64._revLookup[e.charCodeAt(o)]<<18|Base64._revLookup[e.charCodeAt(o+1)]<<12|Base64._revLookup[e.charCodeAt(o+2)]<<6|Base64._revLookup[e.charCodeAt(o+3)];r[i++]=t>>16&255,r[i++]=t>>8&255,r[i++]=255&t}if(2===s){const t=Base64._revLookup[e.charCodeAt(o)]<<2|Base64._revLookup[e.charCodeAt(o+1)]>>4;r[i++]=255&t}if(1===s){const t=Base64._revLookup[e.charCodeAt(o)]<<10|Base64._revLookup[e.charCodeAt(o+1)]<<4|Base64._revLookup[e.charCodeAt(o+2)]>>2;r[i++]=t>>8&255,r[i]=255&t}return r}static encode(e){const t=e.length,s=t%3,r=[];for(let i=0,n=t-s;i<n;i+=16383)r.push(Base64._encodeChunk(e,i,i+16383>n?n:i+16383));if(1===s){const s=e[t-1];r.push(Base64._lookup[s>>2]+Base64._lookup[s<<4&63]+"==")}else if(2===s){const s=(e[t-2]<<8)+e[t-1];r.push(Base64._lookup[s>>10]+Base64._lookup[s>>4&63]+Base64._lookup[s<<2&63]+"=")}return r.join("")}static encodeUrl(e){return Base64.encode(e).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(e){return Base64.decode(e.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===Base64._revLookup.length){Base64._revLookup=[];for(let e=0,t=Base64._lookup.length;e<t;e++)Base64._revLookup[Base64._lookup.charCodeAt(e)]=e;Base64._revLookup["-".charCodeAt(0)]=62,Base64._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(e){return Base64._lookup[e>>18&63]+Base64._lookup[e>>12&63]+Base64._lookup[e>>6&63]+Base64._lookup[63&e]}static _encodeChunk(e,t,s){const r=[];for(let i=t;i<s;i+=3){const t=(e[i]<<16&16711680)+(e[i+1]<<8&65280)+(255&e[i+2]);r.push(Base64._tripletToBase64(t))}return r.join("")}}var ExtraJSONTypes,ResponseStatus;Base64._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Base64._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(ExtraJSONTypes||(ExtraJSONTypes={}));class JSONUtils{static stringify(e){return JSON.stringify(e,JSONUtils._jsonifyType)}static parse(e){return JSON.parse(e,JSONUtils._parseType)}static _parseType(e,t){if(t&&t.hasOwnProperty&&t.hasOwnProperty(JSONUtils.TYPE_SYMBOL)&&t.hasOwnProperty(JSONUtils.VALUE_SYMBOL))switch(t[JSONUtils.TYPE_SYMBOL]){case ExtraJSONTypes.UINT8_ARRAY:return Base64.decode(t[JSONUtils.VALUE_SYMBOL])}return t}static _jsonifyType(e,t){return t instanceof Uint8Array?JSONUtils._typedObject(ExtraJSONTypes.UINT8_ARRAY,Base64.encode(t)):t}static _typedObject(e,t){const s={};return s[JSONUtils.TYPE_SYMBOL]=e,s[JSONUtils.VALUE_SYMBOL]=t,s}}JSONUtils.TYPE_SYMBOL="__",JSONUtils.VALUE_SYMBOL="v";class RandomUtils{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}!function(e){e.OK="ok",e.ERROR="error"}(ResponseStatus||(ResponseStatus={}));const POSTMESSAGE_RETURN_URL="<postMessage>";class RequestIdStorage{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=JSONUtils.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(RequestIdStorage.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return JSONUtils.stringify(e)}_restoreIds(){const e=this._store.getItem(RequestIdStorage.KEY);e&&(this._validIds=RequestIdStorage._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(RequestIdStorage.KEY,this._encodeIds())}}RequestIdStorage.KEY="rpcRequests";class UrlRpcEncoder{static receiveRedirectCommand(e){const t=new URL(e.href);if(!document.referrer)return null;const s=new URL(document.referrer),r=new URLSearchParams(t.search),i=new URLSearchParams(t.hash.substring(1));if(!i.has("id"))return null;const n=parseInt(i.get("id"),10);if(i.delete("id"),r.set(UrlRpcEncoder.URL_SEARCHPARAM_NAME,n.toString()),!i.has("command"))return null;const o=i.get("command");if(i.delete("command"),!i.has("returnURL"))return null;const a=i.get("returnURL");i.delete("returnURL");const c=a===POSTMESSAGE_RETURN_URL&&(window.opener||window.parent);if(!c&&new URL(a).origin!==s.origin)return null;let l=[];if(i.has("args"))try{l=JSONUtils.parse(i.get("args"))}catch(e){}return l=Array.isArray(l)?l:[],i.delete("args"),t.search=r.toString(),this._setUrlFragment(t,i),history.replaceState(history.state,"",t.href),{origin:s.origin,data:{id:n,command:o,args:l},returnURL:a,source:c?window.opener||window.parent:null}}static receiveRedirectResponse(e){const t=new URL(e.href);if(!document.referrer)return null;const s=new URL(document.referrer),r=new URLSearchParams(t.search),i=new URLSearchParams(t.hash.substring(1));if(!i.has("id"))return null;const n=parseInt(i.get("id"),10);if(i.delete("id"),r.set(UrlRpcEncoder.URL_SEARCHPARAM_NAME,n.toString()),!i.has("status"))return null;const o=i.get("status")===ResponseStatus.OK?ResponseStatus.OK:ResponseStatus.ERROR;if(i.delete("status"),!i.has("result"))return null;const a=JSONUtils.parse(i.get("result"));return i.delete("result"),t.search=r.toString(),this._setUrlFragment(t,i),history.replaceState(history.state,"",t.href),{origin:s.origin,data:{id:n,status:o,result:a}}}static prepareRedirectReply(e,t,s){const r=new URL(e.returnURL),i=new URLSearchParams(r.hash.substring(1));return i.set("id",e.id.toString()),i.set("status",t),i.set("result",JSONUtils.stringify(s)),r.hash=i.toString(),r.href}static prepareRedirectInvocation(e,t,s,r,i){const n=new URL(e),o=new URLSearchParams(n.hash.substring(1));return o.set("id",t.toString()),o.set("returnURL",s),o.set("command",r),Array.isArray(i)&&o.set("args",JSONUtils.stringify(i)),n.hash=o.toString(),n.href}static _setUrlFragment(e,t){t.toString().endsWith("=")?e.hash=t.toString().slice(0,-1):e.hash=t.toString()}}UrlRpcEncoder.URL_SEARCHPARAM_NAME="rpcId";class RpcClient{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new RequestIdStorage(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return!1;const t=e.data,s=this._getCallback(t.id),r=this._waitingRequests.getState(t.id);if(s){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===ResponseStatus.OK)s.resolve(t.result,t.id,r);else if(t.status===ResponseStatus.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),s.reject(e,t.id,r)}return!0}return console.warn("Unknown RPC response:",t),!1}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class PostMessageRpcClient extends RpcClient{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:RandomUtils.generateRandomId()})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){return e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const s=t=>{const{source:r,origin:i,data:n}=t;if(r===this._target&&n.status===ResponseStatus.OK&&"pong"===n.result&&1===n.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(n.result.stack){const e=new Error(n.result.message);e.stack=n.result.stack,n.result.name&&(e.name=n.result.name),console.error(e)}window.removeEventListener("message",s),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",s);const r=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",s),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(r,100)}};window.setTimeout(r,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class RedirectRpcClient extends RpcClient{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=UrlRpcEncoder.receiveRedirectResponse(window.location);if(e)return void this._receive(e);if(this._rejectOnBack())return;const t=new URLSearchParams(window.location.search);if(t.has(UrlRpcEncoder.URL_SEARCHPARAM_NAME)){const e=window.sessionStorage.getItem(`response-${t.get(UrlRpcEncoder.URL_SEARCHPARAM_NAME)}`);if(e)return void this._receive(JSONUtils.parse(e),!1)}}close(){}call(e,t,s=!1,...r){this.callAndSaveLocalState(e,null,t,s,...r)}callAndSaveLocalState(e,t,s,r=!1,...i){const n=RandomUtils.generateRandomId(),o=UrlRpcEncoder.prepareRedirectInvocation(this._target,n,e,s,i);this._waitingRequests.add(n,s,t),r&&history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:n}),""),console.debug("RpcClient REQUEST",s,i),window.location.href=o}_receive(e,t=!0){const s=super._receive(e);return s&&t&&window.sessionStorage.setItem(`response-${e.data.id}`,JSONUtils.stringify(e)),s}_rejectOnBack(){if(!history.state||!history.state.rpcBackRejectionId)return!1;const e=history.state.rpcBackRejectionId;history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:null}),"");const t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");return t.reject(r,e,s),!0}return!1}}class RequestBehavior{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}var BehaviorType,RequestType;!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(BehaviorType||(BehaviorType={}));class RedirectRequestBehavior extends RequestBehavior{static withLocalState(e){return new RedirectRequestBehavior(void 0,e)}constructor(e,t){super(BehaviorType.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=new RedirectRpcClient(e,r);await i.init();const n=Object.assign({},this._localState,{__command:t});i.callAndSaveLocalState(this._returnUrl,n,t,!0,...s)}}class PopupRequestBehavior extends RequestBehavior{constructor(e=PopupRequestBehavior.DEFAULT_OPTIONS){super(BehaviorType.POPUP),this._options=e}async request(e,t,s){const r=RequestBehavior.getAllowedOrigin(e),i=this.createPopup(e),n=new PostMessageRpcClient(i,r);await n.init();try{return await n.call(t,...s)}catch(e){throw e}finally{n.close(),i.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}PopupRequestBehavior.DEFAULT_OPTIONS="";class IFrameRequestBehavior extends RequestBehavior{constructor(){super(BehaviorType.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`)throw new Error("Hub iframe is already opened with another endpoint");const r=RequestBehavior.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new PostMessageRpcClient(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${IFrameRequestBehavior.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}IFrameRequestBehavior.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(RequestType||(RequestType={}));class HubApi{constructor(e=HubApi.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new PopupRequestBehavior(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new IFrameRequestBehavior,this._redirectClient=new RedirectRpcClient("",RequestBehavior.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://hub.nimiq.com";case"nimiq-testnet.com":return"https://hub.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,RequestType.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,RequestType.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,RequestType.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,RequestType.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,RequestType.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,RequestType.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,RequestType.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,RequestType.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,RequestType.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,RequestType.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}HubApi.RequestType=RequestType,HubApi.RedirectRequestBehavior=RedirectRequestBehavior,HubApi.MSG_PREFIX="Nimiq Signed Message:\n";export default HubApi; | ||
class e{static byteLength(t){const[s,r]=e._getLengths(t);return e._byteLength(s,r)}static decode(t){e._initRevLookup();const[s,r]=e._getLengths(t),n=new Uint8Array(e._byteLength(s,r));let i=0;const o=r>0?s-4:s;let a=0;for(;a<o;a+=4){const s=e._revLookup[t.charCodeAt(a)]<<18|e._revLookup[t.charCodeAt(a+1)]<<12|e._revLookup[t.charCodeAt(a+2)]<<6|e._revLookup[t.charCodeAt(a+3)];n[i++]=s>>16&255,n[i++]=s>>8&255,n[i++]=255&s}if(2===r){const s=e._revLookup[t.charCodeAt(a)]<<2|e._revLookup[t.charCodeAt(a+1)]>>4;n[i++]=255&s}if(1===r){const s=e._revLookup[t.charCodeAt(a)]<<10|e._revLookup[t.charCodeAt(a+1)]<<4|e._revLookup[t.charCodeAt(a+2)]>>2;n[i++]=s>>8&255,n[i]=255&s}return n}static encode(t){const s=t.length,r=s%3,n=[];for(let i=0,o=s-r;i<o;i+=16383)n.push(e._encodeChunk(t,i,i+16383>o?o:i+16383));if(1===r){const r=t[s-1];n.push(e._lookup[r>>2]+e._lookup[r<<4&63]+"==")}else if(2===r){const r=(t[s-2]<<8)+t[s-1];n.push(e._lookup[r>>10]+e._lookup[r>>4&63]+e._lookup[r<<2&63]+"=")}return n.join("")}static encodeUrl(t){return e.encode(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(t){return e.decode(t.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===e._revLookup.length){e._revLookup=[];for(let t=0,s=e._lookup.length;t<s;t++)e._revLookup[e._lookup.charCodeAt(t)]=t;e._revLookup["-".charCodeAt(0)]=62,e._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(t){return e._lookup[t>>18&63]+e._lookup[t>>12&63]+e._lookup[t>>6&63]+e._lookup[63&t]}static _encodeChunk(t,s,r){const n=[];for(let i=s;i<r;i+=3){const s=(t[i]<<16&16711680)+(t[i+1]<<8&65280)+(255&t[i+2]);n.push(e._tripletToBase64(s))}return n.join("")}}var t,s;e._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(t||(t={}));class r{static stringify(e){return JSON.stringify(e,r._jsonifyType)}static parse(e){return JSON.parse(e,r._parseType)}static _parseType(s,n){if(n&&n.hasOwnProperty&&n.hasOwnProperty(r.TYPE_SYMBOL)&&n.hasOwnProperty(r.VALUE_SYMBOL))switch(n[r.TYPE_SYMBOL]){case t.UINT8_ARRAY:return e.decode(n[r.VALUE_SYMBOL])}return n}static _jsonifyType(s,n){return n instanceof Uint8Array?r._typedObject(t.UINT8_ARRAY,e.encode(n)):n}static _typedObject(e,t){const s={};return s[r.TYPE_SYMBOL]=e,s[r.VALUE_SYMBOL]=t,s}}r.TYPE_SYMBOL="__",r.VALUE_SYMBOL="v";class n{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}!function(e){e.OK="ok",e.ERROR="error"}(s||(s={}));const i="<postMessage>";class o{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=r.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(o.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return r.stringify(e)}_restoreIds(){const e=this._store.getItem(o.KEY);e&&(this._validIds=o._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(o.KEY,this._encodeIds())}}o.KEY="rpcRequests";class a{static receiveRedirectCommand(e){const t=new URL(e.href);if(!document.referrer)return null;const s=new URL(document.referrer),n=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),n.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("command"))return null;const l=o.get("command");if(o.delete("command"),!o.has("returnURL"))return null;const h=o.get("returnURL");o.delete("returnURL");const d=h===i&&(window.opener||window.parent);if(!d&&new URL(h).origin!==s.origin)return null;let u=[];if(o.has("args"))try{u=r.parse(o.get("args"))}catch(e){}return u=Array.isArray(u)?u:[],o.delete("args"),t.search=n.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:s.origin,data:{id:c,command:l,args:u},returnURL:h,source:d?window.opener||window.parent:null}}static receiveRedirectResponse(e){const t=new URL(e.href);if(!document.referrer)return null;const n=new URL(document.referrer),i=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),i.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("status"))return null;const l=o.get("status")===s.OK?s.OK:s.ERROR;if(o.delete("status"),!o.has("result"))return null;const h=r.parse(o.get("result"));return o.delete("result"),t.search=i.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:n.origin,data:{id:c,status:l,result:h}}}static prepareRedirectReply(e,t,s){const n=new URL(e.returnURL),i=new URLSearchParams(n.hash.substring(1));return i.set("id",e.id.toString()),i.set("status",t),i.set("result",r.stringify(s)),n.hash=i.toString(),n.href}static prepareRedirectInvocation(e,t,s,n,i){const o=new URL(e),a=new URLSearchParams(o.hash.substring(1));return a.set("id",t.toString()),a.set("returnURL",s),a.set("command",n),Array.isArray(i)&&a.set("args",r.stringify(i)),o.hash=a.toString(),o.href}static _setUrlFragment(e,t){t.toString().endsWith("=")?e.hash=t.toString().slice(0,-1):e.hash=t.toString()}}a.URL_SEARCHPARAM_NAME="rpcId";class c{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new o(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return!1;const t=e.data,r=this._getCallback(t.id),n=this._waitingRequests.getState(t.id);if(r){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===s.OK)r.resolve(t.result,t.id,n);else if(t.status===s.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),r.reject(e,t.id,n)}return!0}return console.warn("Unknown RPC response:",t),!1}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class l extends c{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:n.generateRandomId()})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){return e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const r=t=>{const{source:n,origin:i,data:o}=t;if(n===this._target&&o.status===s.OK&&"pong"===o.result&&1===o.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(o.result.stack){const e=new Error(o.result.message);e.stack=o.result.stack,o.result.name&&(e.name=o.result.name),console.error(e)}window.removeEventListener("message",r),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",r);const n=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",r),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(n,100)}};window.setTimeout(n,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class h extends c{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=a.receiveRedirectResponse(window.location);if(e)return void this._receive(e);if(this._rejectOnBack())return;const t=new URLSearchParams(window.location.search);if(t.has(a.URL_SEARCHPARAM_NAME)){const e=window.sessionStorage.getItem(`response-${t.get(a.URL_SEARCHPARAM_NAME)}`);if(e)return void this._receive(r.parse(e),!1)}}close(){}call(e,t,s=!1,...r){this.callAndSaveLocalState(e,null,t,s,...r)}callAndSaveLocalState(e,t,s,r=!1,...i){const o=n.generateRandomId(),c=a.prepareRedirectInvocation(this._target,o,e,s,i);this._waitingRequests.add(o,s,t),r&&history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:o}),""),console.debug("RpcClient REQUEST",s,i),window.location.href=c}_receive(e,t=!0){const s=super._receive(e);return s&&t&&window.sessionStorage.setItem(`response-${e.data.id}`,r.stringify(e)),s}_rejectOnBack(){if(!history.state||!history.state.rpcBackRejectionId)return!1;const e=history.state.rpcBackRejectionId;history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:null}),"");const t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");return t.reject(r,e,s),!0}return!1}}class d{constructor(e){this._type=e}static getAllowedOrigin(e){return new URL(e).origin}async request(e,t,s){throw new Error("Not implemented")}}var u,_;!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(u||(u={}));class g extends d{static withLocalState(e){return new g(void 0,e)}constructor(e,t){super(u.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=d.getAllowedOrigin(e),n=new h(e,r);await n.init();const i=Object.assign({},this._localState,{__command:t});n.callAndSaveLocalState(this._returnUrl,i,t,!0,...s)}}class p extends d{constructor(e=p.DEFAULT_OPTIONS){super(u.POPUP),this._options=e}async request(e,t,s){const r=d.getAllowedOrigin(e),n=this.createPopup(e),i=new l(n,r);await i.init();try{return await i.call(t,...s)}catch(e){throw e}finally{i.close(),n.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}p.DEFAULT_OPTIONS="";class w extends d{constructor(){super(u.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${w.IFRAME_PATH_SUFFIX}`)throw new Error("Hub iframe is already opened with another endpoint");const r=d.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new l(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${w.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}w.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(_||(_={}));class R{constructor(e=R.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new p(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new w,this._redirectClient=new h("",d.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://hub.nimiq.com";case"nimiq-testnet.com":return"https://hub.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>{s&&s(e,r)})}onboard(e,t=this._defaultBehavior){return this._request(t,_.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,_.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,_.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,_.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,_.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,_.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,_.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,_.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,_.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,_.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,_.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,_.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,_.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,_.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}R.RequestType=_,R.RedirectRequestBehavior=g,R.MSG_PREFIX="Nimiq Signed Message:\n";export default R; |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.HubApi=t()}(this,function(){"use strict";class e{static byteLength(t){const[s,r]=e._getLengths(t);return e._byteLength(s,r)}static decode(t){e._initRevLookup();const[s,r]=e._getLengths(t),n=new Uint8Array(e._byteLength(s,r));let i=0;const o=r>0?s-4:s;let a=0;for(;a<o;a+=4){const s=e._revLookup[t.charCodeAt(a)]<<18|e._revLookup[t.charCodeAt(a+1)]<<12|e._revLookup[t.charCodeAt(a+2)]<<6|e._revLookup[t.charCodeAt(a+3)];n[i++]=s>>16&255,n[i++]=s>>8&255,n[i++]=255&s}if(2===r){const s=e._revLookup[t.charCodeAt(a)]<<2|e._revLookup[t.charCodeAt(a+1)]>>4;n[i++]=255&s}if(1===r){const s=e._revLookup[t.charCodeAt(a)]<<10|e._revLookup[t.charCodeAt(a+1)]<<4|e._revLookup[t.charCodeAt(a+2)]>>2;n[i++]=s>>8&255,n[i]=255&s}return n}static encode(t){const s=t.length,r=s%3,n=[];for(let i=0,o=s-r;i<o;i+=16383)n.push(e._encodeChunk(t,i,i+16383>o?o:i+16383));if(1===r){const r=t[s-1];n.push(e._lookup[r>>2]+e._lookup[r<<4&63]+"==")}else if(2===r){const r=(t[s-2]<<8)+t[s-1];n.push(e._lookup[r>>10]+e._lookup[r>>4&63]+e._lookup[r<<2&63]+"=")}return n.join("")}static encodeUrl(t){return e.encode(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(t){return e.decode(t.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===e._revLookup.length){e._revLookup=[];for(let t=0,s=e._lookup.length;t<s;t++)e._revLookup[e._lookup.charCodeAt(t)]=t;e._revLookup["-".charCodeAt(0)]=62,e._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(t){return e._lookup[t>>18&63]+e._lookup[t>>12&63]+e._lookup[t>>6&63]+e._lookup[63&t]}static _encodeChunk(t,s,r){const n=[];for(let i=s;i<r;i+=3){const s=(t[i]<<16&16711680)+(t[i+1]<<8&65280)+(255&t[i+2]);n.push(e._tripletToBase64(s))}return n.join("")}}var t,s;e._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(t||(t={}));class r{static stringify(e){return JSON.stringify(e,r._jsonifyType)}static parse(e){return JSON.parse(e,r._parseType)}static _parseType(s,n){if(n&&n.hasOwnProperty&&n.hasOwnProperty(r.TYPE_SYMBOL)&&n.hasOwnProperty(r.VALUE_SYMBOL))switch(n[r.TYPE_SYMBOL]){case t.UINT8_ARRAY:return e.decode(n[r.VALUE_SYMBOL])}return n}static _jsonifyType(s,n){return n instanceof Uint8Array?r._typedObject(t.UINT8_ARRAY,e.encode(n)):n}static _typedObject(e,t){const s={};return s[r.TYPE_SYMBOL]=e,s[r.VALUE_SYMBOL]=t,s}}r.TYPE_SYMBOL="__",r.VALUE_SYMBOL="v";class n{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}!function(e){e.OK="ok",e.ERROR="error"}(s||(s={}));const i="<postMessage>";class o{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=r.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(o.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return r.stringify(e)}_restoreIds(){const e=this._store.getItem(o.KEY);e&&(this._validIds=o._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(o.KEY,this._encodeIds())}}o.KEY="rpcRequests";class a{static receiveRedirectCommand(e){const t=new URL(e.href);if(!document.referrer)return null;const s=new URL(document.referrer),n=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),n.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("command"))return null;const l=o.get("command");if(o.delete("command"),!o.has("returnURL"))return null;const h=o.get("returnURL");o.delete("returnURL");const d=h===i&&(window.opener||window.parent);if(!d&&new URL(h).origin!==s.origin)return null;let u=[];if(o.has("args"))try{u=r.parse(o.get("args"))}catch(e){}return u=Array.isArray(u)?u:[],o.delete("args"),t.search=n.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:s.origin,data:{id:c,command:l,args:u},returnURL:h,source:d?window.opener||window.parent:null}}static receiveRedirectResponse(e){const t=new URL(e.href);if(!document.referrer)return null;const n=new URL(document.referrer),i=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),i.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("status"))return null;const l=o.get("status")===s.OK?s.OK:s.ERROR;if(o.delete("status"),!o.has("result"))return null;const h=r.parse(o.get("result"));return o.delete("result"),t.search=i.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:n.origin,data:{id:c,status:l,result:h}}}static prepareRedirectReply(e,t,s){const n=new URL(e.returnURL),i=new URLSearchParams(n.hash.substring(1));return i.set("id",e.id.toString()),i.set("status",t),i.set("result",r.stringify(s)),n.hash=i.toString(),n.href}static prepareRedirectInvocation(e,t,s,n,i){const o=new URL(e),a=new URLSearchParams(o.hash.substring(1));return a.set("id",t.toString()),a.set("returnURL",s),a.set("command",n),Array.isArray(i)&&a.set("args",r.stringify(i)),o.hash=a.toString(),o.href}static _setUrlFragment(e,t){t.toString().endsWith("=")?e.hash=t.toString().slice(0,-1):e.hash=t.toString()}}a.URL_SEARCHPARAM_NAME="rpcId";class c{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new o(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return!1;const t=e.data,r=this._getCallback(t.id),n=this._waitingRequests.getState(t.id);if(r){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===s.OK)r.resolve(t.result,t.id,n);else if(t.status===s.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),r.reject(e,t.id,n)}return!0}return console.warn("Unknown RPC response:",t),!1}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class l extends c{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:n.generateRandomId()})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){return e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const r=t=>{const{source:n,origin:i,data:o}=t;if(n===this._target&&o.status===s.OK&&"pong"===o.result&&1===o.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(o.result.stack){const e=new Error(o.result.message);e.stack=o.result.stack,o.result.name&&(e.name=o.result.name),console.error(e)}window.removeEventListener("message",r),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",r);const n=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",r),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(n,100)}};window.setTimeout(n,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class h extends c{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=a.receiveRedirectResponse(window.location);if(e)return void this._receive(e);if(this._rejectOnBack())return;const t=new URLSearchParams(window.location.search);if(t.has(a.URL_SEARCHPARAM_NAME)){const e=window.sessionStorage.getItem(`response-${t.get(a.URL_SEARCHPARAM_NAME)}`);if(e)return void this._receive(r.parse(e),!1)}}close(){}call(e,t,s=!1,...r){this.callAndSaveLocalState(e,null,t,s,...r)}callAndSaveLocalState(e,t,s,r=!1,...i){const o=n.generateRandomId(),c=a.prepareRedirectInvocation(this._target,o,e,s,i);this._waitingRequests.add(o,s,t),r&&history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:o}),""),console.debug("RpcClient REQUEST",s,i),window.location.href=c}_receive(e,t=!0){const s=super._receive(e);return s&&t&&window.sessionStorage.setItem(`response-${e.data.id}`,r.stringify(e)),s}_rejectOnBack(){if(!history.state||!history.state.rpcBackRejectionId)return!1;const e=history.state.rpcBackRejectionId;history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:null}),"");const t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");return t.reject(r,e,s),!0}return!1}}class d{static getAllowedOrigin(e){return new URL(e).origin}constructor(e){this._type=e}async request(e,t,s){throw new Error("Not implemented")}get type(){return this._type}}var u,_;!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(u||(u={}));class g extends d{static withLocalState(e){return new g(void 0,e)}constructor(e,t){super(u.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=d.getAllowedOrigin(e),n=new h(e,r);await n.init();const i=Object.assign({},this._localState,{__command:t});n.callAndSaveLocalState(this._returnUrl,i,t,!0,...s)}}class p extends d{constructor(e=p.DEFAULT_OPTIONS){super(u.POPUP),this._options=e}async request(e,t,s){const r=d.getAllowedOrigin(e),n=this.createPopup(e),i=new l(n,r);await i.init();try{return await i.call(t,...s)}catch(e){throw e}finally{i.close(),n.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}p.DEFAULT_OPTIONS="";class w extends d{constructor(){super(u.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${w.IFRAME_PATH_SUFFIX}`)throw new Error("Hub iframe is already opened with another endpoint");const r=d.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new l(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${w.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}w.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(_||(_={}));class R{constructor(e=R.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new p(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new w,this._redirectClient=new h("",d.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://hub.nimiq.com";case"nimiq-testnet.com":return"https://hub.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>s&&s(e,r))}onboard(e,t=this._defaultBehavior){return this._request(t,_.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,_.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,_.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,_.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,_.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,_.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,_.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,_.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,_.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,_.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,_.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,_.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,_.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,_.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}return R.RequestType=_,R.RedirectRequestBehavior=g,R.MSG_PREFIX="Nimiq Signed Message:\n",R}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).HubApi=t()}(this,function(){"use strict";class e{static byteLength(t){const[s,r]=e._getLengths(t);return e._byteLength(s,r)}static decode(t){e._initRevLookup();const[s,r]=e._getLengths(t),n=new Uint8Array(e._byteLength(s,r));let i=0;const o=r>0?s-4:s;let a=0;for(;a<o;a+=4){const s=e._revLookup[t.charCodeAt(a)]<<18|e._revLookup[t.charCodeAt(a+1)]<<12|e._revLookup[t.charCodeAt(a+2)]<<6|e._revLookup[t.charCodeAt(a+3)];n[i++]=s>>16&255,n[i++]=s>>8&255,n[i++]=255&s}if(2===r){const s=e._revLookup[t.charCodeAt(a)]<<2|e._revLookup[t.charCodeAt(a+1)]>>4;n[i++]=255&s}if(1===r){const s=e._revLookup[t.charCodeAt(a)]<<10|e._revLookup[t.charCodeAt(a+1)]<<4|e._revLookup[t.charCodeAt(a+2)]>>2;n[i++]=s>>8&255,n[i]=255&s}return n}static encode(t){const s=t.length,r=s%3,n=[];for(let i=0,o=s-r;i<o;i+=16383)n.push(e._encodeChunk(t,i,i+16383>o?o:i+16383));if(1===r){const r=t[s-1];n.push(e._lookup[r>>2]+e._lookup[r<<4&63]+"==")}else if(2===r){const r=(t[s-2]<<8)+t[s-1];n.push(e._lookup[r>>10]+e._lookup[r>>4&63]+e._lookup[r<<2&63]+"=")}return n.join("")}static encodeUrl(t){return e.encode(t).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,".")}static decodeUrl(t){return e.decode(t.replace(/_/g,"/").replace(/-/g,"+").replace(/\./g,"="))}static _initRevLookup(){if(0===e._revLookup.length){e._revLookup=[];for(let t=0,s=e._lookup.length;t<s;t++)e._revLookup[e._lookup.charCodeAt(t)]=t;e._revLookup["-".charCodeAt(0)]=62,e._revLookup["_".charCodeAt(0)]=63}}static _getLengths(e){const t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");let s=e.indexOf("=");return-1===s&&(s=t),[s,s===t?0:4-s%4]}static _byteLength(e,t){return 3*(e+t)/4-t}static _tripletToBase64(t){return e._lookup[t>>18&63]+e._lookup[t>>12&63]+e._lookup[t>>6&63]+e._lookup[63&t]}static _encodeChunk(t,s,r){const n=[];for(let i=s;i<r;i+=3){const s=(t[i]<<16&16711680)+(t[i+1]<<8&65280)+(255&t[i+2]);n.push(e._tripletToBase64(s))}return n.join("")}}var t,s;e._lookup="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e._revLookup=[],function(e){e[e.UINT8_ARRAY=0]="UINT8_ARRAY"}(t||(t={}));class r{static stringify(e){return JSON.stringify(e,r._jsonifyType)}static parse(e){return JSON.parse(e,r._parseType)}static _parseType(s,n){if(n&&n.hasOwnProperty&&n.hasOwnProperty(r.TYPE_SYMBOL)&&n.hasOwnProperty(r.VALUE_SYMBOL))switch(n[r.TYPE_SYMBOL]){case t.UINT8_ARRAY:return e.decode(n[r.VALUE_SYMBOL])}return n}static _jsonifyType(s,n){return n instanceof Uint8Array?r._typedObject(t.UINT8_ARRAY,e.encode(n)):n}static _typedObject(e,t){const s={};return s[r.TYPE_SYMBOL]=e,s[r.VALUE_SYMBOL]=t,s}}r.TYPE_SYMBOL="__",r.VALUE_SYMBOL="v";class n{static generateRandomId(){const e=new Uint32Array(1);return crypto.getRandomValues(e),e[0]}}!function(e){e.OK="ok",e.ERROR="error"}(s||(s={}));const i="<postMessage>";class o{constructor(e=!0){this._store=e?window.sessionStorage:null,this._validIds=new Map,e&&this._restoreIds()}static _decodeIds(e){const t=r.parse(e),s=new Map;for(const e of Object.keys(t)){const r=parseInt(e,10);s.set(isNaN(r)?e:r,t[e])}return s}has(e){return this._validIds.has(e)}getCommand(e){const t=this._validIds.get(e);return t?t[0]:null}getState(e){const t=this._validIds.get(e);return t?t[1]:null}add(e,t,s=null){this._validIds.set(e,[t,s]),this._storeIds()}remove(e){this._validIds.delete(e),this._storeIds()}clear(){this._validIds.clear(),this._store&&this._store.removeItem(o.KEY)}_encodeIds(){const e=Object.create(null);for(const[t,s]of this._validIds)e[t]=s;return r.stringify(e)}_restoreIds(){const e=this._store.getItem(o.KEY);e&&(this._validIds=o._decodeIds(e))}_storeIds(){this._store&&this._store.setItem(o.KEY,this._encodeIds())}}o.KEY="rpcRequests";class a{static receiveRedirectCommand(e){const t=new URL(e.href);if(!document.referrer)return null;const s=new URL(document.referrer),n=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),n.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("command"))return null;const l=o.get("command");if(o.delete("command"),!o.has("returnURL"))return null;const h=o.get("returnURL");o.delete("returnURL");const d=h===i&&(window.opener||window.parent);if(!d&&new URL(h).origin!==s.origin)return null;let u=[];if(o.has("args"))try{u=r.parse(o.get("args"))}catch(e){}return u=Array.isArray(u)?u:[],o.delete("args"),t.search=n.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:s.origin,data:{id:c,command:l,args:u},returnURL:h,source:d?window.opener||window.parent:null}}static receiveRedirectResponse(e){const t=new URL(e.href);if(!document.referrer)return null;const n=new URL(document.referrer),i=new URLSearchParams(t.search),o=new URLSearchParams(t.hash.substring(1));if(!o.has("id"))return null;const c=parseInt(o.get("id"),10);if(o.delete("id"),i.set(a.URL_SEARCHPARAM_NAME,c.toString()),!o.has("status"))return null;const l=o.get("status")===s.OK?s.OK:s.ERROR;if(o.delete("status"),!o.has("result"))return null;const h=r.parse(o.get("result"));return o.delete("result"),t.search=i.toString(),this._setUrlFragment(t,o),history.replaceState(history.state,"",t.href),{origin:n.origin,data:{id:c,status:l,result:h}}}static prepareRedirectReply(e,t,s){const n=new URL(e.returnURL),i=new URLSearchParams(n.hash.substring(1));return i.set("id",e.id.toString()),i.set("status",t),i.set("result",r.stringify(s)),n.hash=i.toString(),n.href}static prepareRedirectInvocation(e,t,s,n,i){const o=new URL(e),a=new URLSearchParams(o.hash.substring(1));return a.set("id",t.toString()),a.set("returnURL",s),a.set("command",n),Array.isArray(i)&&a.set("args",r.stringify(i)),o.hash=a.toString(),o.href}static _setUrlFragment(e,t){t.toString().endsWith("=")?e.hash=t.toString().slice(0,-1):e.hash=t.toString()}}a.URL_SEARCHPARAM_NAME="rpcId";class c{constructor(e,t=!1){this._allowedOrigin=e,this._waitingRequests=new o(t),this._responseHandlers=new Map,this._preserveRequests=!1}onResponse(e,t,s){this._responseHandlers.set(e,{resolve:t,reject:s})}_receive(e){if(!e.data||!e.data.status||!e.data.id||"*"!==this._allowedOrigin&&e.origin!==this._allowedOrigin)return!1;const t=e.data,r=this._getCallback(t.id),n=this._waitingRequests.getState(t.id);if(r){if(this._preserveRequests||(this._waitingRequests.remove(t.id),this._responseHandlers.delete(t.id)),console.debug("RpcClient RECEIVE",t),t.status===s.OK)r.resolve(t.result,t.id,n);else if(t.status===s.ERROR){const e=new Error(t.result.message);t.result.stack&&(e.stack=t.result.stack),t.result.name&&(e.name=t.result.name),r.reject(e,t.id,n)}return!0}return console.warn("Unknown RPC response:",t),!1}_getCallback(e){if(this._responseHandlers.has(e))return this._responseHandlers.get(e);{const t=this._waitingRequests.getCommand(e);if(t)return this._responseHandlers.get(t)}}}class l extends c{constructor(e,t){super(t),this._serverCloseCheckInterval=-1,this._target=e,this._connectionState=0,this._receiveListener=this._receive.bind(this)}async init(){2!==this._connectionState&&(await this._connect(),window.addEventListener("message",this._receiveListener),-1===this._serverCloseCheckInterval&&(this._serverCloseCheckInterval=window.setInterval(()=>this._checkIfServerClosed(),300)))}async call(e,...t){return this._call({command:e,args:t,id:n.generateRandomId()})}close(){this._connectionState=0,window.removeEventListener("message",this._receiveListener),window.clearInterval(this._serverCloseCheckInterval),this._serverCloseCheckInterval=-1;for(const[e,{reject:t}]of this._responseHandlers){const s=this._waitingRequests.getState(e);t("Connection was closed","number"==typeof e?e:void 0,s)}this._waitingRequests.clear(),this._responseHandlers.clear(),this._target&&this._target.closed&&(this._target=null)}_receive(e){return e.source===this._target&&super._receive(e)}async _call(e){if(!this._target||this._target.closed)throw new Error("Connection was closed.");if(2!==this._connectionState)throw new Error("Client is not connected, call init first");return new Promise((t,s)=>{this._responseHandlers.set(e.id,{resolve:t,reject:s}),this._waitingRequests.add(e.id,e.command),console.debug("RpcClient REQUEST",e.command,e.args),this._target.postMessage(e,this._allowedOrigin)})}_connect(){if(2!==this._connectionState)return this._connectionState=1,new Promise((e,t)=>{const r=t=>{const{source:n,origin:i,data:o}=t;if(n===this._target&&o.status===s.OK&&"pong"===o.result&&1===o.id&&("*"===this._allowedOrigin||i===this._allowedOrigin)){if(o.result.stack){const e=new Error(o.result.message);e.stack=o.result.stack,o.result.name&&(e.name=o.result.name),console.error(e)}window.removeEventListener("message",r),this._connectionState=2,console.log("RpcClient: Connection established"),e(!0)}};window.addEventListener("message",r);const n=()=>{if(2!==this._connectionState){if(0===this._connectionState||this._checkIfServerClosed())return window.removeEventListener("message",r),void t(new Error("Connection was closed"));try{this._target.postMessage({command:"ping",id:1},this._allowedOrigin)}catch(e){console.error(`postMessage failed: ${e}`)}window.setTimeout(n,100)}};window.setTimeout(n,100)})}_checkIfServerClosed(){return!(this._target&&!this._target.closed)&&(this.close(),!0)}}class h extends c{constructor(e,t,s=!0){super(t,!0),this._target=e,this._preserveRequests=s}async init(){const e=a.receiveRedirectResponse(window.location);if(e)return void this._receive(e);if(this._rejectOnBack())return;const t=new URLSearchParams(window.location.search);if(t.has(a.URL_SEARCHPARAM_NAME)){const e=window.sessionStorage.getItem(`response-${t.get(a.URL_SEARCHPARAM_NAME)}`);if(e)return void this._receive(r.parse(e),!1)}}close(){}call(e,t,s=!1,...r){this.callAndSaveLocalState(e,null,t,s,...r)}callAndSaveLocalState(e,t,s,r=!1,...i){const o=n.generateRandomId(),c=a.prepareRedirectInvocation(this._target,o,e,s,i);this._waitingRequests.add(o,s,t),r&&history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:o}),""),console.debug("RpcClient REQUEST",s,i),window.location.href=c}_receive(e,t=!0){const s=super._receive(e);return s&&t&&window.sessionStorage.setItem(`response-${e.data.id}`,r.stringify(e)),s}_rejectOnBack(){if(!history.state||!history.state.rpcBackRejectionId)return!1;const e=history.state.rpcBackRejectionId;history.replaceState(Object.assign({},history.state,{rpcBackRejectionId:null}),"");const t=this._getCallback(e),s=this._waitingRequests.getState(e);if(t){this._preserveRequests||(this._waitingRequests.remove(e),this._responseHandlers.delete(e)),console.debug("RpcClient BACK");const r=new Error("Request aborted");return t.reject(r,e,s),!0}return!1}}class d{constructor(e){this._type=e}static getAllowedOrigin(e){return new URL(e).origin}async request(e,t,s){throw new Error("Not implemented")}}var u,_;!function(e){e[e.REDIRECT=0]="REDIRECT",e[e.POPUP=1]="POPUP",e[e.IFRAME=2]="IFRAME"}(u||(u={}));class g extends d{static withLocalState(e){return new g(void 0,e)}constructor(e,t){super(u.REDIRECT);const s=window.location;if(this._returnUrl=e||`${s.origin}${s.pathname}`,this._localState=t||{},void 0!==this._localState.__command)throw new Error("Invalid localState: Property '__command' is reserved")}async request(e,t,s){const r=d.getAllowedOrigin(e),n=new h(e,r);await n.init();const i=Object.assign({},this._localState,{__command:t});n.callAndSaveLocalState(this._returnUrl,i,t,!0,...s)}}class p extends d{constructor(e=p.DEFAULT_OPTIONS){super(u.POPUP),this._options=e}async request(e,t,s){const r=d.getAllowedOrigin(e),n=this.createPopup(e),i=new l(n,r);await i.init();try{return await i.call(t,...s)}catch(e){throw e}finally{i.close(),n.close()}}createPopup(e){const t=window.open(e,"NimiqAccounts",this._options);if(!t)throw new Error("Failed to open popup");return t}}p.DEFAULT_OPTIONS="";class w extends d{constructor(){super(u.IFRAME),this._iframe=null,this._client=null}async request(e,t,s){if(this._iframe&&this._iframe.src!==`${e}${w.IFRAME_PATH_SUFFIX}`)throw new Error("Hub iframe is already opened with another endpoint");const r=d.getAllowedOrigin(e);if(this._iframe||(this._iframe=await this.createIFrame(e)),!this._iframe.contentWindow)throw new Error(`IFrame contentWindow is ${typeof this._iframe.contentWindow}`);return this._client||(this._client=new l(this._iframe.contentWindow,r),await this._client.init()),await this._client.call(t,...s)}async createIFrame(e){return new Promise((t,s)=>{const r=document.createElement("iframe");r.name="NimiqAccountsIFrame",r.style.display="none",document.body.appendChild(r),r.src=`${e}${w.IFRAME_PATH_SUFFIX}`,r.onload=(()=>t(r)),r.onerror=s})}}w.IFRAME_PATH_SUFFIX="/iframe.html",function(e){e.LIST="list",e.MIGRATE="migrate",e.CHECKOUT="checkout",e.SIGN_MESSAGE="sign-message",e.SIGN_TRANSACTION="sign-transaction",e.ONBOARD="onboard",e.SIGNUP="signup",e.LOGIN="login",e.EXPORT="export",e.CHANGE_PASSWORD="change-password",e.LOGOUT="logout",e.ADD_ADDRESS="add-address",e.RENAME="rename",e.CHOOSE_ADDRESS="choose-address"}(_||(_={}));class R{constructor(e=R.DEFAULT_ENDPOINT,t){this._endpoint=e,this._defaultBehavior=t||new p(`left=${window.innerWidth/2-400},top=75,width=800,height=850,location=yes,dependent=yes`),this._iframeBehavior=new w,this._redirectClient=new h("",d.getAllowedOrigin(this._endpoint))}static get DEFAULT_ENDPOINT(){const e=location.origin.split(".");switch(e.shift(),e.join(".")){case"nimiq.com":return"https://hub.nimiq.com";case"nimiq-testnet.com":return"https://hub.nimiq-testnet.com";default:return"http://localhost:8080"}}checkRedirectResponse(){return this._redirectClient.init()}on(e,t,s){this._redirectClient.onResponse(e,(e,s,r)=>t(e,r),(e,t,r)=>{s&&s(e,r)})}onboard(e,t=this._defaultBehavior){return this._request(t,_.ONBOARD,[e])}signup(e,t=this._defaultBehavior){return this._request(t,_.SIGNUP,[e])}login(e,t=this._defaultBehavior){return this._request(t,_.LOGIN,[e])}chooseAddress(e,t=this._defaultBehavior){return this._request(t,_.CHOOSE_ADDRESS,[e])}signTransaction(e,t=this._defaultBehavior){return this._request(t,_.SIGN_TRANSACTION,[e])}checkout(e,t=this._defaultBehavior){return this._request(t,_.CHECKOUT,[e])}logout(e,t=this._defaultBehavior){return this._request(t,_.LOGOUT,[e])}export(e,t=this._defaultBehavior){return this._request(t,_.EXPORT,[e])}changePassword(e,t=this._defaultBehavior){return this._request(t,_.CHANGE_PASSWORD,[e])}addAddress(e,t=this._defaultBehavior){return this._request(t,_.ADD_ADDRESS,[e])}rename(e,t=this._defaultBehavior){return this._request(t,_.RENAME,[e])}signMessage(e,t=this._defaultBehavior){return this._request(t,_.SIGN_MESSAGE,[e])}migrate(e=this._defaultBehavior){return this._request(e,_.MIGRATE,[{appName:"Accounts Client"}])}list(e=this._iframeBehavior){return this._request(e,_.LIST,[])}_request(e,t,s){return e.request(this._endpoint,t,s)}}return R.RequestType=_,R.RedirectRequestBehavior=g,R.MSG_PREFIX="Nimiq Signed Message:\n",R}); |
{ | ||
"name": "@nimiq/hub-api", | ||
"version": "0.4.2", | ||
"version": "0.5.0", | ||
"main": "dist/HubApi.umd.js", | ||
@@ -14,7 +14,7 @@ "module": "dist/HubApi.es.js", | ||
"devDependencies": { | ||
"rollup": "^0.66.1", | ||
"rollup-plugin-node-resolve": "^3.4.0", | ||
"rollup-plugin-terser": "^3.0.0", | ||
"tslint": "^5.11.0", | ||
"typescript": "^3.4.2" | ||
"rollup": "^1.12.1", | ||
"rollup-plugin-node-resolve": "^5.0.0", | ||
"rollup-plugin-terser": "^4.0.4", | ||
"tslint": "^5.16.0", | ||
"typescript": "^3.4.5" | ||
}, | ||
@@ -21,0 +21,0 @@ "files": [ |
@@ -348,6 +348,6 @@ # Nimiq Hub <!-- omit in toc --> | ||
// All client requests are async and return a promise | ||
const account = await hubApi.signup(requestOptions); | ||
const accounts = await hubApi.signup(requestOptions); | ||
``` | ||
The `signup()` method returns a promise which resolves to an `Account`: | ||
The `signup()` method returns a promise which resolves to an array of `Account`s: | ||
@@ -388,7 +388,7 @@ ```javascript | ||
// All client requests are async and return a promise | ||
const account = await hubApi.login(requestOptions); | ||
const accounts = await hubApi.login(requestOptions); | ||
``` | ||
The `login()` method returns a promise which resolves to an `Account`. Please see | ||
the result type for [`signup()`](#signup) for details. | ||
The `login()` method returns a promise which resolves to an array of `Account`s. | ||
Please see the result type for [`signup()`](#signup) for details. | ||
@@ -408,7 +408,8 @@ #### Onboard | ||
// All client requests are async and return a promise | ||
const account = await hubApi.onboard(requestOptions); | ||
const accounts = await hubApi.onboard(requestOptions); | ||
``` | ||
Since `onboard()` is a wrapper around Signup, Login and Ledger, it also returns an | ||
`Account` result type. Please see the result type for [`signup()`](#signup) for details. | ||
`Account[]` result type. Please see the result type for [`signup()`](#signup) for | ||
details. | ||
@@ -704,3 +705,3 @@ #### Logout | ||
git clone https://github.com/nimiq/hub.git | ||
cd hub | ||
cd hub | ||
yarn | ||
@@ -707,0 +708,0 @@ ``` |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
758
73502
544
1