@abtnode/webapp 1.6.2 → 1.6.3

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["contexts/notification.js","../../constant/index.js","libs/ws.js","libs/get-ip.js","contexts/node.js","libs/ensure-blocklet-interface.js","../../util/lib/normalize-path-prefix.js","components/permission.js","libs/ensure-domain-aliases.js","contexts/routing.js","contexts/blocklets.js","hooks/query.js","components/node/eula-content.js","../../../blocklet/meta/lib/constants.js","libs/history.js","components/notifications/tag.js","../../src/browser.js","locales/index.js","contexts/session.js","libs/util.js","../../src/base.js","locales/en.js","locales/zh.js","components/node/agree-eula.js","components/node/setup.js","components/node/upgrade/progress.js","components/node/login.js","components/health.js","components/error-fallback.js","components/root.js","components/notifications/list.js","hooks/width.js","components/notifications/default-icon-variants.js","components/notifications/notification.js","components/notifications/toast.js","components/layout/addon.js","components/layout/index.js","components/layout/layout-route.js","components/global-subscriber.js","app.js","index.js","components/toast.js","libs/node.js"],"names":["NotificationContext","React","createContext","Provider","Consumer","NotificationProvider","children","client","getClient","useState","notifications","setNotifications","total","pageSize","pageCount","page","paging","setPaging","sleep","timeout","Promise","resolve","setTimeout","loading","setLoading","getData","a","all","getNotifications","input","res","list","Toast","error","message","useEffect","useSubscription","notification","id","_id","old","value","refresh","data","api","useNotificationContext","useContext","NODE_SERVICES","Object","freeze","AUTH_SERVICE","NODE_SERVICES_PREFIX","ROLES","OWNER","ADMIN","MEMBER","GUEST","RBAC_CONFIG","roles","name","title","description","passport","ci","permissions","grants","module","exports","NODE_MODES","PRODUCTION","DEBUG","MAINTENANCE","IMMUTABLE","DEFAULT_DESCRIPTION","NODE_UPGRADE_PROGRESS","SETUP","INSTALLING","RESTARTING","CLEANUP","COMPLETE","ROLLBACK","NFT_TYPE_NODE_OWNERSHIP","BLOCKLET_PURCHASE_NFT_TYPE","NFT_TYPE_SERVICE_OWNERSHIP","SERVICE_PURCHASE_NFT_TYPE","NODE_PACKAGE_NAME","NODE_COMMAND_NAME","PROCESS_NAME_DAEMON","PROCESS_NAME_PROXY","PROCESS_NAME_UPDATER","PROCESS_NAME_SERVICE","PROCESS_NAME_LOG_ROTATE","PROCESS_NAME_EVENT_HUB","NODE_REGISTER_URL","WEB_WALLET_URL","BLOCKLET_STORE_URL","BLOCKLET_STORE_URL_DEV","BLOCKLET_STORE_API_PREFIX","BLOCKLET_STORE_META_PATH","DEFAULT_IP_DNS_DOMAIN_SUFFIX","DEFAULT_DASHBOARD_DOMAIN","DEFAULT_DASHBOARD_CERT_DOWN_ADDR","CONFIG_FILENAME","CONFIG_FOLDER_NAME","EXPORTED_FOLDER_NAME","StatusCode","ok","blocklet_not_found","blocklet_not_purchased","forbidden","internal","ROUTER_PROVIDER_NONE","DOMAIN_FOR_IP_SITE","DOMAIN_FOR_IP_SITE_REGEXP","DOMAIN_FOR_DEFAULT_SITE","DOMAIN_FOR_INTERNAL_SITE","NAME_FOR_WELLKNOWN_SITE","WELLKNOWN_PATH_PREFIX","WELLKNOWN_AUTH_PATH_PREFIX","SLOT_FOR_IP_DNS_SITE","DEFAULT_ADMIN_PATH","DEFAULT_SERVICE_PATH","DEFAULT_HTTP_PORT","DEFAULT_HTTPS_PORT","MAX_UPLOAD_FILE_SIZE","DEFAULT_DAEMON_PORT","BLOCKLET_PROXY_PATH_PREFIX","BLOCKLET_SITE_GROUP_SUFFIX","DAY_IN_MS","DAEMON_MAX_MEM_LIMIT_IN_MB","PROXY_MAX_MEM_LIMIT_IN_MB","BLOCKLET_MAX_MEM_LIMIT_IN_MB","CERTIFICATE_EXPIRES_OFFSET","CERTIFICATE_EXPIRES_WARNING_OFFSET","ROUTING_RULE_TYPES","NONE","DAEMON","SERVICE","BLOCKLET","REDIRECT","GENERAL_PROXY","genPermissionName","resource","action","replace","NFT_TYPE_NODE_PASSPORT","NFT_TYPE_GENERAL_PASSPORT","NFT_TYPE_GENERAL_PASSPORT_OLD","PASSPORT_STATUS","VALID","REVOKED","DISK_ALERT_THRESHOLD_PERCENT","create","token","pathPrefix","window","env","apiPrefix","url","location","host","WsClient","heartbeatIntervalMs","params","localStorage","getItem","getWsClient","event","cb","deps","on","off","cache","fetch","prefix","joinURL","axios","get","address","getIp","NodeContext","NodeProvider","t","useLocaleContext","newInfo","setNewInfo","setError","getNodeInfo","silent","retries","info","Array","isArray","blockletRegistryList","blockletRegistry","find","x","selected","nodeInfo","node","type","variant","onClick","style","color","textDecoration","useNodeContext","ensureBlockletInterface","interfaces","length","map","URL","hostname","includes","href","filter","Boolean","Permission","permission","component","session","useSessionContext","can","user","withPermission","Component","permissionName","props","hasPermission","ensureDomainAliases","domainAliases","DASHBOARD","RoutingContext","specialSites","sortDomainHandler","siteA","siteB","isSiteASpecial","isSiteBSpecial","stringSortHandlerAsc","formatDomains","sites","domains","domain","domainsAliases","forEach","push","item","isProtected","getMessage","msg","slice","RoutingProvider","newSites","setNewSites","setDomains","allDomains","setAllDomains","state","useAsyncRetry","getRoutingSites","snapshotHash","dbSites","site","formattedDomains","updateSiteRules","siteId","s","takeSnapshot","takeRoutingSnapshot","dryRun","encodeURIComponent","restartEngine","addSite","addRoutingSite","result","concat","updateSite","settings","updateRoutingSite","index","findIndex","splice","deleteSite","deleteRoutingSite","delSite","addDomainAlias","domainAlias","deleteDomainAlias","addRule","rule","addRoutingRule","from","updateRule","updateRoutingRule","deleteRule","ruleId","deleteRoutingRule","retry","actions","defaultDomain","nodePort","rules","corsAllowedOrigins","unshift","protected","_site","items","to","Number","parseInt","port","did","normalizePathPrefix","sortBy","i","sort","generateSites","siteMap","reduce","acc","endsWith","split","routing","useRoutingContext","isSpecialDomain","specialDomains","BlockletContext","BlockletProvider","blocklets","setBlocklets","getBlocklets","updates","useCache","blocklet","d","cur","meta","key","getBlocklet","b","some","onInstallOrUpgrade","updateBlockletStatus","status","fromBlockletStatus","BlockletEvents","added","removed","statusChange","installed","deployed","upgraded","downgraded","updated","started","startFailed","reloaded","update","findInterfaceWithAuthService","endpoint","getEndPoint","invitedUserOnly","authInterface","authConfig","isInvitedUserOnly","useBlockletContext","useQuery","URLSearchParams","useLocation","search","BlockletStatus","downloading","downloaded","installing","starting","running","stopping","stopped","upgrading","restarting","corrupted","waiting","BlockletSource","registry","local","upload","downloadFailed","installFailed","purchaseChange","fromEntry","entries","v","match","toEntry","keys","toBlockletStatus","fromBlockletSource","toBlockletSource","BlockletGroup","static","dapp","starter","gateway","BLOCKLET_GROUPS","BLOCKLET_PLATFORMS","BLOCKLET_ARCHITECTURES","BLOCKLET_MODES","DEVELOPMENT","BLOCKLET_FACTORY_SHARES","developer","store","BLOCKLET_DYNAMIC_PATH_PREFIX","BLOCKLET_INTERFACE_PUBLIC","BLOCKLET_INTERFACE_ADMIN","BLOCKLET_INTERFACE_CONFIG","BLOCKLET_INTERFACE_DOC","BLOCKLET_INTERFACE_WELLKNOWN","BLOCKLET_UI_INTERFACES","BLOCKLET_STANDARD_INTERFACES","BLOCKLET_INTERFACE_TYPE_WEB","BLOCKLET_INTERFACE_TYPE_SERVICE","BLOCKLET_INTERFACE_TYPE_WELLKNOWN","BLOCKLET_INTERFACE_TYPES","BLOCKLET_INTERFACE_PROTOCOLS","BLOCKLET_RELEASE_FOLDER","BLOCKLET_RELEASE_FILE","BLOCKLET_BUNDLE_FOLDER","BLOCKLET_BUNDLE_FILE","BLOCKLET_ENTRY_FILE","BLOCKLET_META_FILE","BLOCKLET_META_FILE_ALT","BLOCKLET_META_FILE_OLD","BLOCKLET_DEFAULT_VERSION","BLOCKLET_DEFAULT_PORT_NAME","BLOCKLET_LATEST_SPEC_VERSION","BLOCKLET_LATEST_REQUIREMENT_SERVER","BLOCKLET_LATEST_REQUIREMENT_ABTNODE","BLOCKLET_CONFIGURABLE_KEY","BLOCKLET_CLUSTER_SIZE","BLOCKLET_APP_NAME","BLOCKLET_APP_DESCRIPTION","BLOCKLET_APP_SK","BLOCKLET_WALLET_TYPE","createBrowserHistory","NotificationTag","rest","warning","borderRadius","border","EventEmitter","require","_getSocketOptions","_getEventImplementation","en","zh","translations","createSessionContext","SessionProvider","SessionContext","SessionConsumer","withSession","formatToDate","date","moment","format","formatToDatetime","formatTimeFromNow","startDate","diff","fromNow","formatTime","formatError","errors","join","formatLocale","locale","parseQuery","str","memo","decodeURIComponent","appendParams","extraParams","pathname","query","oldParams","assign","qs","stringify","isInProgress","isInstalling","isDownloading","formatDiskSize","size","serverPlatform","base","filesize","round","checkInputByType","typesMap","isUrl","formatPerson","person","u","web","e","email","mail","getBlockletServices","services","protocol","external","upstreamPort","ports","shouldCheckDomainStatus","checkIsWildcardDomain","tempUrl","startsWith","urlObj","console","encodeWildcardDomain","placeholder","strA","strB","origin","adminPath","provider","getInviteLink","inviteId","searchParams","set","getIssuePassportLink","formatRegistryScreenshotPath","asset","formatRegistryLogoPath","parseRegistryUrl","gitInfo","fromUrl","browse","getWebWalletUrl","err","webWalletUrl","isValidClusterSize","cpuCores","isNaN","isInteger","createPassportSvg","issuer","issuerDid","svg","toUpperCase","fill","isProtectedRole","role","values","formatFactoryPrice","payment","price","symbol","getBlockletName","blockletMeta","getBlockletLogoUrl","baseUrl","logoPath","getPathPrefix","BaseClient","schema","constructor","httpEndpoint","config","dataSource","socketEndpoint","enableQuery","enableSubscription","enableMutation","maxQueryDepth","setAuthToken","this","_getSocketEndpoint","_getSchema","_getIgnoreFields","_getAuthHeaders","headers","val","flat","setup","connect","scan","confirm","success","verify","steps","eula","eulaFooter","basicSettings","complete","congratulation","redirectButton","form","submit","login","loginTo","dialog","lostPassport","sidebar","dashboard","system","used","free","cores","common","about","abtnode","accessKey","add","allow","alreadyExist","approve","approved","author","avatar","back","basic","basicInfo","bind","blockletsStorage","cacheStorage","cancel","certificate","click","close","collapseAll","community","componentBasicInfo","components","configuration","configSuccess","continueWith","copiedTip","copyTip","coreStorage","cpu","createSuccess","created","createdAt","dAddress","dataStorage","delConfirm","delConfirmDescription","delete","detail","disk","diskInfo","docker","documentation","downgradeTo","download","edit","empty","emptyData","enable","engine","expandAll","expires","externalIp","failed","fingerprint","finish","forbid","gitpod","goEULA","group","image","install","installedAt","internalIp","invite","inviting","ip","isPublic","issue","joined","lastPublishedAt","launcherInfo","leavePageTip","log","logStorage","logo","logout","manageTeam","marketplace","member","members","memory","monitor","more","next","no","noData","notice","noticeTitle","open","management","os","overview","page404","pre","published","purchase","redirect","redirectCode","redirectPermanently","redirectTemporary","redirectUrl","reject","reload","remark","remove","repository","requiredErrorText","restart","revoke","runtimeInfo","save","saveChanges","saveSuccess","scheduleFailed","scheduleSuccess","setting","start","stop","storage","support","team","the","unavailable","updateAvailable","updatedAt","upgrade","upgradeTo","uptime","valid","version","visit","webhook","yes","invalidParam","launch","redirecting","installFromMarket","installFromUrl","startedAt","stoppedAt","urlEmptyTip","goToAddRule","noService","appDid","reloadSuccess","statusTip","label","step0","step1","existTipPrefix","existTipSuffix","stopDescription","confirmStop","cancelDownloadDescription","removeDescription","deleteRoutingRuleDescription","removeKeepData","removeComplete","confirmRemove","tableTitle","noBlocklet","upgradeDescription","confirmUpgrade","confirmRestart","restartDescription","admin","iframeTitle","noContent","securityError","disabledText","configurationKey","configurationValue","keyValueRequired","invalidKey","deleteForbidden","missingRequired","gotoFix","hideValue","showValue","tip","sk","clusterSize","walletType","source","deployedFrom","appDir","dataDir","logDir","cacheDir","noRunning","memoryUsage","cpuUsage","processId","dist","downloadLink","purchasing","purchased","verifying","star","checkUpdateTitle","updateTitle","noUpdate","router","urlPath","securitySetting","nodeDid","ownerDid","nameSort","popularSort","headerDescription","changeFailed","addFailed","editFailed","switchRegistry","addRegistry","editRegistry","deleteRegistry","haveSameRegistry","registryName","registryUrl","registryNameEmpty","registryUrlEmpty","deleteDesc","confirmDesc","confirmed","declined","auth","unSavedTip","unSavedLeaveTip","nameRequired","namePlaceholder","descriptionHolder","descriptionRequired","domainPlaceholder","domainRequired","ipPlaceholder","ipRequired","registryPlaceholder","registryRequired","webWalletUrlPlaceholder","enableWelcomePage","welcome","desc","enabled","disabled","toggle","cleanup","progress","check","latest","diskThreshold","diskThresholdPlaceholder","accessKeyId","lastUsed","saveSecretTip","iKnow","showSecret","hideSecret","descriptionNoTime","confirm_desc","remarkInvalid","delTitle","requiredError","test","columns","viewAll","showRead","markAllAsRead","markAsRead","routerSetting","certSetting","defaultSite","urlHelperText","healthy","service","select","what","nonProvider","validation","urlRequired","redirectCodeRequired","didRequired","pathPrefixTooLong","pathPrefixCannotBeEmpty","invalidUrl","pathPrefixRequired","redirectUrlRequired","validate","emptyTip","suffixTip","portTip","notResolved","https","bad","domainDescription","domainSecurity","cors","domainInvalid","pathPrefixTip","cert","commonName","boundDomains","expired","leftDays","issuedOn","expiryOn","fingerprintAlg","validityPeriod","matchedSites","setPublic","setPublicCertHelperText","publicCertHelperText","nonPublicCertHelperText","protectedCertHelperText","unprotectedCertHelperText","table","nodata","nginx","titleAdd","pem","pemTip","keyTip","invalidFile","noMatch","health","connectionErrorTip","connectionRecoveryTip","connectionStoppedTip","wrongAccessUrlTip","debug","passports","lastLogin","forbidLogin","forbidLoginDescription","allowLogin","allowLoginDescription","updateRole","deleteUser","deleteUserDescription","revokePassport","revokePassportDescription","enablePassport","enablePassportDescription","passportPermissionTitle","inviteDialog","createInviteLink","createSuccessTip","passportEmpty","actionEmpty","resourceEmpty","permissionTooLong","descriptionTooLong","titleTip","roleTip","permissionTip","transferLeftTitle","transferRightTitle","titleEmpty","titleTooLong","descriptionEmpty","issuance","pending","disableIssuance","enableIssuance","disableIssuanceTip","enableIssuanceTip","trustedPassportIssuers","trustedIssuers","externalPassport","notTrustedIssuerTip","addNodeToTrustedIssuers","revoked","noPermission","shouldNotDeleteCurrent","mappingRule","defaultRule","searchIssuerDid","issueBy","link","inviter","disabledTip","cloudService","adminUrl","launchBlocklet","appInfo","appInfoDesc","alreadyExists","selectAbtNode","nextStep","agreement","agreeAll","launchSuccess","installSuccess","installWithAppName","openInRegistry","subTitle","access","viewApplication","newVersion","newVersionDesc","upgradeNow","later","abtnodeLicenseName","appLicenseName","purchaseApp","authDialog","freeDescription","nonFreeDescription","loadMetaFailed","appMetaNotFound","launchFailed","installedButStopped","installedButError","upgradeFailed","environment","AgreeEula","onGoToNext","checked","setChecked","LocaleContext","Div","Box","textAlign","showText","width","height","transform","Typography","className","FormControlLabel","control","Checkbox","onChange","checkedIcon","icon","rounded","display","alignItems","styled","div","theme","breakpoints","md","NodeSetup","setOpen","ownerNft","holder","goDashboard","popup","checkFn","checkTimeout","socketUrl","onSuccess","setItem","sessionToken","messages","dialogStyle","onClose","stages","NodeUpgradeProgress","stage","setStage","pooling","setPooling","getSession","upgradeSessionId","then","catch","useInterval","nextVersion","marginTop","List","currentIndex","indexOf","isDone","isProgress","ListItem","ListItemIcon","ListItemText","Paper","NodeLogin","fontSize","HealthStatus","Health","setHealth","enqueueSnackbar","useSnackbar","autoHideDuration","heartbeatTimer","tries","startHeartBeat","isConnected","clearInterval","timer","clearTimeout","Snackbar","anchorOrigin","vertical","horizontal","Alert","severity","ErrorFallback","resetErrorBoundary","minWidth","AlertTitle","GlobalStyle","createGlobalStyle","teal","A700","palette","primary","main","NotificationList","onHide","updateNotifications","setShowRead","isMarkingAll","setIsMarkingAll","filtered","read","hasUnRead","onUnreadNotifications","ids","readNotifications","Link","data-cy","Divider","maxHeight","overflow","ListItemAvatar","Avatar","entityType","substr","secondary","sm","defaultProps","useWidth","useTheme","reverse","output","matches","useMediaQuery","up","CheckIcon","SvgIcon","WarningIcon","ErrorIcon","InfoIcon","iconStyles","marginInlineEnd","defaultIconVariants","useStyles","makeStyles","breakpointsMap","xl","lg","backgroundColor","emphasize","background","default","lessPadding","paddingLeft","contentRoot","typography","body2","getContrastText","padding","boxShadow","green","breakpoint","dark","amber","flex","marginLeft","marginRight","forwardRef","ref","keyId","classes","combinedClassname","variants","closeSnackbar","history","useHistory","IconButton","aria-label","NotificationToast","disableAutoHide","sticky","content","HeaderAddon","notificationOpen","setNotificationOpen","notificationAnchorRef","useRef","docPaths","onCloseNotification","current","contains","target","unreadCount","aria-controls","aria-haspopup","prevOpen","Badge","badgeContent","max","Popper","anchorEl","disablePortal","placement","ClickAwayListener","onClickAway","pathName","path","showRole","Dashboard","links","mode","tagType","BrandAddon","TagBox","images","brand","brandAddon","headerAddon","span","DashboardLayoutRoute","scrollable","fullWidth","render","StyledDashboardLayout","DashboardLayout","GlobalSubscriber","refreshNode","teamDid","BlockletList","lazy","BlockletDetail","BlockletStore","StoreDetail","Debug","Settings","EULAPage","Console","Notifications","LogPage","TeamPage","IssuePassport","LostPassport","BlockletLauncher","NotFoundPage","ProtectedApp","userDid","wsClient","disconnect","document","visibilityState","addEventListener","removeEventListener","initialized","fallback","exact","App","changeLocale","queryStringLocale","WithRouter","withRouter","button","textTransform","overrides","MuiTableRow","root","head","serviceHost","autoLogin","FallbackComponent","onReset","CssBaseline","basename","ReactDOM","getElementById","noop","genFn","opts","ToastProvider","notistackRef","createRef","onClickDismiss","newClient","NodeClient","getLocale","trim","createClient"],"mappings":"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","file":"static/js/main.d1e0c404.chunk.js","sourcesContent":["import React, { useState, useContext, useEffect } from 'react';\n\nimport getClient from '../libs/node';\nimport { useSubscription } from '../libs/ws';\nimport Toast from '../components/toast';\n\nconst NotificationContext = React.createContext({});\nconst { Provider, Consumer } = NotificationContext;\n\n// eslint-disable-next-line react/prop-types\nfunction NotificationProvider({ children }) {\n const client = getClient();\n const [notifications, setNotifications] = useState([]);\n const [paging, setPaging] = useState({ total: 0, pageSize: 10, pageCount: 0, page: 1 });\n const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout));\n const [loading, setLoading] = useState(false);\n\n const getData = async ({ page = 1 } = {}) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n // eslint-disable-next-line no-shadow\n const [res] = await Promise.all([client.getNotifications({ input: { paging: { page } } }), sleep(800)]);\n setNotifications(res.list);\n setPaging(res.paging);\n setLoading(false);\n } catch (err) {\n Toast.error(err.message);\n setLoading(false);\n }\n };\n\n useEffect(() => {\n getData();\n }, []); // eslint-disable-line\n\n useSubscription('notification.create', notification => {\n if (!notification.id) {\n // eslint-disable-next-line no-underscore-dangle\n notification.id = notification._id;\n }\n setNotifications(list => {\n const old = list || [];\n return [notification, ...old];\n });\n });\n\n const value = {\n loading,\n refresh: getData,\n data: notifications,\n paging,\n api: client,\n };\n\n return <Provider value={{ notifications: value }}>{children}</Provider>;\n}\n\nfunction useNotificationContext() {\n const { notifications } = useContext(NotificationContext);\n return notifications;\n}\n\nexport { NotificationContext, NotificationProvider, Consumer as NotificationConsumer, useNotificationContext };\n","const NODE_SERVICES = Object.freeze({\n AUTH_SERVICE: '@abtnode/auth-service',\n});\n\nconst NODE_SERVICES_PREFIX = Object.freeze({\n AUTH_SERVICE: `/.service/${NODE_SERVICES.AUTH_SERVICE}`,\n});\n\nconst ROLES = Object.freeze({\n OWNER: 'owner',\n ADMIN: 'admin',\n MEMBER: 'member',\n GUEST: 'guest',\n});\n\nconst RBAC_CONFIG = {\n roles: Object.freeze([\n {\n name: ROLES.OWNER,\n title: 'Owner',\n description: 'Has full administrative access to the Blocklet Server',\n passport: true,\n },\n {\n name: ROLES.ADMIN,\n title: 'Admin',\n description:\n 'Has full permissions to manage blocklet and Blocklet Server such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates, manage blocklet team, manage node integrations and access keys, upgrade node to a new version',\n passport: true,\n },\n {\n name: ROLES.MEMBER,\n title: 'Member',\n description:\n 'Has permissions to manage blocklets, such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates',\n passport: true,\n },\n {\n name: ROLES.GUEST,\n title: 'Guest',\n description: 'Has all read permissions on Blocklet Server',\n passport: true,\n },\n {\n name: 'ci',\n title: 'CI',\n description: 'Deploy blocklet to Blocklet Server',\n passport: true,\n ci: true,\n },\n {\n name: 'certificate',\n title: 'Certificate',\n description: 'Manage https certificates for blocklets on the Blocklet Server',\n passport: true,\n ci: true,\n },\n {\n name: NODE_SERVICES.AUTH_SERVICE,\n title: 'Auth Service',\n },\n ]),\n permissions: Object.freeze([\n {\n name: 'query_node',\n description:\n 'View node data, include dashboard and node settings, log stream for both Blocklet Server and blocklets',\n },\n {\n name: 'mutate_node',\n description: 'Change node settings, upgrade node to a new version',\n },\n {\n name: 'query_session',\n description: 'Get data from a long running session',\n },\n {\n name: 'mutate_session',\n description: 'Start/update/end a long running session',\n },\n {\n name: 'query_accessKey',\n description: 'View access keys for Blocklet Server',\n },\n {\n name: 'mutate_accessKey',\n description: 'Manage access keys for Blocklet Server, such as create/update/delete',\n },\n {\n name: 'query_team',\n description: 'View team data(members/roles/permissions) for Blocklet Server and blocklets',\n },\n {\n name: 'mutate_team',\n description: 'Manage team data(members/roles/permissions) for Blocklet Server and blocklets',\n },\n {\n name: 'query_blocklet',\n description: 'View store and installed blocklets, including blocklet runtime configuration, domains and urls',\n },\n {\n name: 'mutate_blocklet',\n description: 'Perform state changing actions on blocklets, such as install/upgrade/config/start/stop/remove',\n },\n {\n name: 'query_router',\n description: 'View sites, URL mapping and certificates in service gateway',\n },\n {\n name: 'mutate_router',\n description: 'Manage sites, URL mapping and certificates in service gateway',\n },\n {\n name: 'query_certificate',\n description: 'View certificates in service gateway',\n },\n {\n name: 'mutate_certificate',\n description: 'Manage certificates in service gateway',\n },\n {\n name: 'query_notification',\n description: 'View notifications',\n },\n {\n name: 'mutate_notification',\n description: 'Manage notifications, such as mark notifications as read',\n },\n {\n name: 'query_webhook',\n description: 'View integrations',\n },\n {\n name: 'mutate_webhook',\n description: 'Manage integrations',\n },\n ]),\n grants: Object.freeze({\n [ROLES.GUEST]: [\n 'query_blocklet',\n 'query_router',\n 'query_webhook',\n 'query_notification',\n 'query_team',\n 'query_accessKey',\n 'query_node',\n 'query_session',\n ],\n [ROLES.MEMBER]: [ROLES.GUEST, 'mutate_blocklet', 'mutate_router', 'mutate_notification', 'mutate_session'],\n [ROLES.ADMIN]: [ROLES.MEMBER, 'mutate_team', 'mutate_webhook', 'mutate_accessKey', 'mutate_node'],\n [ROLES.OWNER]: [ROLES.ADMIN],\n '@abtnode/auth-service': ['query_team', 'mutate_team'],\n ci: ['query_blocklet', 'mutate_blocklet'],\n certificate: ['query_certificate', 'mutate_certificate'],\n }),\n};\n\nconst DAY_IN_MS = 24 * 60 * 60 * 1000;\n\nmodule.exports = Object.freeze({\n // Blocklet Server\n NODE_MODES: Object.freeze({\n PRODUCTION: 'production',\n DEBUG: 'debug',\n MAINTENANCE: 'maintenance',\n IMMUTABLE: 'immutable',\n }),\n\n DEFAULT_DESCRIPTION: 'Web Interface to manage your Blocklet Server',\n\n NODE_UPGRADE_PROGRESS: Object.freeze({\n SETUP: 'setup', // backup\n INSTALLING: 'installing',\n RESTARTING: 'restarting',\n CLEANUP: 'cleanup',\n COMPLETE: 'complete',\n ROLLBACK: 'rollback',\n }),\n\n NFT_TYPE_NODE_OWNERSHIP: 'NodeOwnershipCredential',\n BLOCKLET_PURCHASE_NFT_TYPE: 'BlockletPurchaseCredential',\n NFT_TYPE_SERVICE_OWNERSHIP: 'ServiceOwnershipCredential',\n SERVICE_PURCHASE_NFT_TYPE: 'ServicePurchaseCredential',\n\n NODE_PACKAGE_NAME: '@abtnode/cli', // deprecated in 1.6.0\n NODE_COMMAND_NAME: 'abtnode', // deprecated in 1.6.0\n\n PROCESS_NAME_DAEMON: 'abt-node-daemon',\n PROCESS_NAME_PROXY: 'abt-node-db-hub',\n PROCESS_NAME_UPDATER: 'abt-node-updater',\n PROCESS_NAME_SERVICE: 'abt-node-service',\n PROCESS_NAME_LOG_ROTATE: 'abt-node-log-rotate',\n PROCESS_NAME_EVENT_HUB: 'abt-node-event-hub',\n\n NODE_REGISTER_URL: 'https://install.arcblock.io/', // removed in 1.5.1\n WEB_WALLET_URL: 'https://web.abtwallet.io',\n BLOCKLET_STORE_URL: 'https://store.blocklet.dev',\n BLOCKLET_STORE_URL_DEV: 'https://dev.store.blocklet.dev',\n BLOCKLET_STORE_API_PREFIX: '/api',\n BLOCKLET_STORE_META_PATH: '/api/store.json',\n\n DEFAULT_IP_DNS_DOMAIN_SUFFIX: 'ip.abtnet.io',\n DEFAULT_DASHBOARD_DOMAIN: '*.ip.abtnet.io',\n DEFAULT_DASHBOARD_CERT_DOWN_ADDR: 'https://cert.abtnet.io/open/download/certificates/ip_abtnet_io',\n\n CONFIG_FILENAME: 'abtnode.yml',\n CONFIG_FOLDER_NAME: '.abtnode',\n EXPORTED_FOLDER_NAME: 'exported_abtnode',\n\n StatusCode: Object.freeze({\n ok: 0,\n\n blocklet_not_found: 1,\n blocklet_not_purchased: 2,\n\n forbidden: 403,\n internal: 500,\n timeout: 504,\n }),\n\n // Service Gateway\n ROUTER_PROVIDER_NONE: 'none',\n DOMAIN_FOR_IP_SITE: '',\n DOMAIN_FOR_IP_SITE_REGEXP: `~^\\\\d+.\\\\d+.\\\\d+.\\\\d+$`, // eslint-disable-line\n DOMAIN_FOR_DEFAULT_SITE: '*',\n DOMAIN_FOR_INTERNAL_SITE: '127.0.0.1',\n NAME_FOR_WELLKNOWN_SITE: 'wellknown',\n WELLKNOWN_PATH_PREFIX: '/.well-known',\n WELLKNOWN_AUTH_PATH_PREFIX: '/.well-known/auth',\n SLOT_FOR_IP_DNS_SITE: '888-888-888-888',\n\n DEFAULT_ADMIN_PATH: '/admin',\n DEFAULT_SERVICE_PATH: '/.abtnode/service',\n DEFAULT_HTTP_PORT: 80,\n DEFAULT_HTTPS_PORT: 443,\n MAX_UPLOAD_FILE_SIZE: 500, // unit: MB\n DEFAULT_DAEMON_PORT: 8089,\n\n BLOCKLET_PROXY_PATH_PREFIX: '/.blocklet/proxy',\n BLOCKLET_SITE_GROUP_SUFFIX: '.blocklet-domain-group',\n\n // Time and dates\n DAY_IN_MS,\n DAEMON_MAX_MEM_LIMIT_IN_MB: 600,\n PROXY_MAX_MEM_LIMIT_IN_MB: 300,\n BLOCKLET_MAX_MEM_LIMIT_IN_MB: 300,\n CERTIFICATE_EXPIRES_OFFSET: 8 * DAY_IN_MS,\n CERTIFICATE_EXPIRES_WARNING_OFFSET: 7 * DAY_IN_MS,\n ROUTING_RULE_TYPES: Object.freeze({\n NONE: 'none',\n DAEMON: 'daemon',\n SERVICE: 'service',\n BLOCKLET: 'blocklet',\n REDIRECT: 'redirect',\n GENERAL_PROXY: 'general_proxy',\n }),\n\n // Team\n ROLES,\n RBAC_CONFIG,\n genPermissionName: (resource, action = 'access') => `${action}_${resource.replace('_', '-')}`, // resource cannot include '_'\n NFT_TYPE_NODE_PASSPORT: 'ABTNodePassport',\n NFT_TYPE_GENERAL_PASSPORT: 'NFTPassport',\n NFT_TYPE_GENERAL_PASSPORT_OLD: 'PassportVerificationCredential', // backward compatible\n PASSPORT_STATUS: {\n VALID: 'valid',\n REVOKED: 'revoked',\n },\n\n // Service\n NODE_SERVICES,\n NODE_SERVICES_PREFIX,\n\n DISK_ALERT_THRESHOLD_PERCENT: 80,\n});\n","import { useEffect } from 'react';\nimport { WsClient } from '@arcblock/ws';\n\nlet client;\n\nexport function create(token) {\n const pathPrefix = (window.env && window.env.apiPrefix ? window.env.apiPrefix : '/').replace(/\\/$/, '');\n const url = `//${window.location.host}${pathPrefix}`;\n return new WsClient(url, {\n heartbeatIntervalMs: 10 * 1000,\n params: () => ({\n token: token || window.localStorage.getItem('abt_node_login_token'),\n }),\n });\n}\n\nexport default function getWsClient() {\n if (!client) {\n client = create();\n }\n\n return client;\n}\n\nexport const useSubscription = (event, cb = () => {}, deps = []) => {\n if (!client) {\n client = getWsClient();\n }\n useEffect(() => {\n client.on(event, cb);\n\n return () => {\n client.off(event, cb);\n };\n }, deps); // eslint-disable-line\n};\n","import axios from 'axios';\nimport joinURL from 'url-join';\n\nlet cache = null;\n\nconst fetch = async () => {\n const prefix = window.env.apiPrefix || '/';\n const url = joinURL(prefix, '/api/dns-resolve?accessible=1');\n\n try {\n const res = await axios.get(url);\n return res.data.address;\n } catch (error) {\n return null;\n }\n};\n\nconst getIp = () => {\n if (!cache) {\n cache = fetch();\n }\n\n return cache;\n};\n\nexport default getIp;\n","import React, { useContext, useState, useEffect } from 'react';\n\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Button from '@material-ui/core/Button';\n\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Center from '@arcblock/ux/lib/Center';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport getClient from '../libs/node';\n\nconst NodeContext = React.createContext({});\nconst { Provider, Consumer } = NodeContext;\n\nconst MAX_RETRY = 4;\n\n// eslint-disable-next-line react/prop-types\nfunction NodeProvider({ children }) {\n const prefix = window.env && window.env.apiPrefix ? `${window.env.apiPrefix}images` : '/images';\n const { t } = useLocaleContext();\n\n const client = getClient();\n const [newInfo, setNewInfo] = useState(null);\n const [error, setError] = useState(null);\n const [loading, setLoading] = useState(true);\n const sleep = timeout => new Promise(resolve => setTimeout(resolve, timeout));\n const getNodeInfo = async ({ silent = true, retries = MAX_RETRY } = {}) => {\n if (!silent) {\n setLoading(true);\n }\n try {\n const [{ info }] = await Promise.all([client.getNodeInfo(), sleep(800)]);\n if (info && Array.isArray(info.blockletRegistryList)) {\n info.blockletRegistry = info.blockletRegistryList.find(x => x.selected).url;\n }\n setNewInfo(info);\n } catch (err) {\n if (retries > 0) {\n setTimeout(() => getNodeInfo({ silent, retries: retries - 1 }), 1000);\n } else {\n setError(err);\n }\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n getNodeInfo({ silent: false });\n }, []); // eslint-disable-line\n\n const value = {\n loading,\n error,\n info: newInfo,\n nodeInfo: newInfo, // alias of info\n refresh: getNodeInfo,\n api: client,\n prefix,\n };\n\n if (value.loading) {\n return (\n <Provider value={{ node: value }}>\n <Center>\n <Spinner />\n </Center>\n </Provider>\n );\n }\n\n if (value.error) {\n return (\n <Center>\n <Alert type=\"error\" variant=\"icon\">\n <div>\n {/* message */}\n {value.error.message === 'Network Error' ? t('health.connectionErrorTip') : value.error.message}\n {/* retry */}\n <Button onClick={() => getNodeInfo({ silent: false })}>\n <span style={{ color: '#44cdc6', textDecoration: 'underline' }}>{t('common.retry')}</span>\n </Button>\n </div>\n </Alert>\n </Center>\n );\n }\n\n return <Provider value={{ node: value }}>{children}</Provider>;\n}\n\nfunction useNodeContext() {\n const { node } = useContext(NodeContext);\n return node;\n}\n\nexport { NodeContext, NodeProvider, Consumer as NodeConsumer, useNodeContext };\n","import { SLOT_FOR_IP_DNS_SITE } from '@abtnode/constant';\nimport getIp from './get-ip';\n\nconst ensureBlockletInterface = async interfaces => {\n if (!interfaces || !interfaces.length) {\n return [];\n }\n\n const address = await getIp();\n\n return interfaces\n .map(x => {\n try {\n const url = new URL(x.url);\n if (url.hostname.includes(SLOT_FOR_IP_DNS_SITE)) {\n if (!address) {\n return null;\n }\n url.hostname = url.hostname.replace(SLOT_FOR_IP_DNS_SITE, address.replace(/\\./g, '-'));\n x.url = url.href;\n }\n return x;\n } catch {\n return null;\n }\n })\n .filter(Boolean);\n};\n\nexport default ensureBlockletInterface;\n","const normalizePathPrefix = (prefix) => {\n if (typeof prefix === 'string') {\n if (!prefix || prefix === '/') {\n return '/';\n }\n\n return `/${prefix}/`.replace(/\\/+/g, '/');\n }\n\n return '/';\n};\n\nmodule.exports = normalizePathPrefix;\n","import React from 'react';\nimport { useSessionContext } from '../contexts/session';\n\nexport default function Permission({ permission, component, children }) {\n const { session } = useSessionContext();\n\n const permissions = (session.user && session.user.permissions) || [];\n\n const can = permissions.includes(permission);\n\n if (typeof component === 'function') {\n return component(can);\n }\n\n if (typeof children === 'function') {\n return children(can);\n }\n\n if (can) {\n return component || children || null;\n }\n\n return null;\n}\n\nexport function withPermission(Component, permissionName) {\n return props => (\n <Permission permission={permissionName}>\n {hasPermission => <Component {...props} hasPermission={hasPermission} />}\n </Permission>\n );\n}\n","import { SLOT_FOR_IP_DNS_SITE } from '@abtnode/constant';\nimport getIp from './get-ip';\n\nconst ensureDomainAliases = async domainAliases => {\n if (!domainAliases || !domainAliases.length) {\n return [];\n }\n\n const address = await getIp();\n\n if (!address) {\n return domainAliases;\n }\n\n return domainAliases\n .map(x => {\n try {\n const hostname = x.value || '';\n x.value = hostname.replace(SLOT_FOR_IP_DNS_SITE, address.replace(/\\./g, '-'));\n return x;\n } catch {\n return x;\n }\n })\n .filter(Boolean);\n};\n\nexport default ensureDomainAliases;\n","import React, { useState, useContext } from 'react';\nimport sortBy from 'lodash/sortBy';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\nimport normalizePathPrefix from '@abtnode/util/lib/normalize-path-prefix';\n\nimport {\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_DEFAULT_SITE,\n ROUTING_RULE_TYPES,\n BLOCKLET_SITE_GROUP_SUFFIX,\n} from '@abtnode/constant';\n\nimport { useNodeContext } from './node';\nimport ensureDomainAliases from '../libs/ensure-domain-aliases';\nimport getClient from '../libs/node';\nimport { stringSortHandlerAsc } from '../libs/util';\nimport Toast from '../components/toast';\n\nconst DASHBOARD = 'Dashboard';\n\nconst RoutingContext = React.createContext({});\nconst { Provider, Consumer } = RoutingContext;\n\nconst specialSites = [DASHBOARD, DOMAIN_FOR_IP_SITE, DOMAIN_FOR_IP_SITE_REGEXP];\n\nconst sortDomainHandler = (siteA, siteB) => {\n if (siteA.name === DOMAIN_FOR_DEFAULT_SITE) {\n return -1;\n }\n\n if (siteB.name === DOMAIN_FOR_DEFAULT_SITE) {\n return 1;\n }\n\n const isSiteASpecial = specialSites.includes(siteA.name);\n const isSiteBSpecial = specialSites.includes(siteB.name);\n\n if (isSiteASpecial && isSiteBSpecial) {\n return stringSortHandlerAsc(siteA.name, siteB.name);\n }\n\n if (isSiteASpecial) {\n return -1;\n }\n\n if (isSiteBSpecial) {\n return 1;\n }\n\n return stringSortHandlerAsc(siteA.name, siteB.name);\n};\n\nconst generateSites = ({ sites, defaultDomain, nodePort }) => {\n const list = (sites || []).map(site => {\n const { id: siteId, rules = [], corsAllowedOrigins = [] } = site;\n let { domain, domainAliases } = site;\n domainAliases = domainAliases || [];\n\n if (domain === DOMAIN_FOR_IP_SITE) {\n domain = DASHBOARD;\n if (!domainAliases.find(item => item.value === defaultDomain)) {\n domainAliases.unshift({ protected: false, value: defaultDomain });\n }\n }\n\n if (domain === DOMAIN_FOR_IP_SITE_REGEXP) {\n domain = DASHBOARD;\n if (!domainAliases.find(item => item.value === window.location.hostname)) {\n domainAliases.unshift({ protected: false, value: window.location.hostname });\n }\n }\n\n const _site = {\n id: siteId,\n name: domain,\n type: 'domain',\n items: [],\n domainAliases,\n isProtected: site.isProtected,\n corsAllowedOrigins,\n };\n\n (rules || []).forEach(rule => {\n const {\n id: ruleId,\n isProtected,\n from: { pathPrefix },\n to,\n interfaces,\n } = rule;\n\n if (to.type === ROUTING_RULE_TYPES.BLOCKLET) {\n let title = '';\n if (Number.parseInt(to.port, 10) === Number.parseInt(nodePort, 10)) {\n title = 'Blocklet Server Dashboard';\n to.type = ROUTING_RULE_TYPES.DAEMON;\n } else {\n title = to.did;\n }\n\n _site.items.push({\n id: ruleId,\n name: normalizePathPrefix(pathPrefix || '/'),\n title,\n type: 'rule',\n isProtected,\n pathPrefix,\n to,\n interfaces,\n });\n } else {\n _site.items.push({\n id: ruleId,\n pathPrefix,\n name: normalizePathPrefix(pathPrefix || '/'),\n title: 'Blocklet Server Dashboard',\n type: 'rule',\n isProtected,\n to,\n interfaces,\n });\n }\n });\n\n _site.items = sortBy(_site.items, i => i.name);\n\n return _site;\n });\n\n return list.sort(sortDomainHandler);\n};\n\nconst formatDomains = sites => {\n const domains = sites\n .map(x => x.domain)\n .filter(x => ![DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE].includes(x));\n\n let domainsAliases = [];\n sites.forEach(x => domainsAliases.push(...(x.domainAliases || [])));\n\n // backward compatible\n domainsAliases = domainsAliases.map(item => {\n if (typeof item === 'string') {\n return { value: item, isProtected: false };\n }\n\n return item;\n });\n\n return { domains, domainsAliases };\n};\n\nconst getMessage = msg => msg.slice(0, 150);\n\n// eslint-disable-next-line react/prop-types\nfunction RoutingProvider({ children }) {\n const client = getClient();\n const { info } = useNodeContext();\n const [newSites, setNewSites] = useState([]);\n const [domains, setDomains] = useState([]);\n const [allDomains, setAllDomains] = useState([]);\n\n const state = useAsyncRetry(async () => {\n const { sites: dbSites } = await client.getRoutingSites({ input: { snapshotHash: '' } });\n\n const sites = dbSites || [];\n\n await Promise.all(\n sites.map(async site => {\n site.domainAliases = await ensureDomainAliases(site.domainAliases);\n return site;\n })\n );\n\n const formattedDomains = formatDomains(sites);\n\n setNewSites(sites);\n setDomains(formattedDomains.domains);\n setAllDomains([...formattedDomains.domains, ...formattedDomains.domainsAliases.map(item => item.value)]);\n }, [info]);\n\n const updateSiteRules = (siteId, site) => {\n setNewSites(s =>\n s.map(x => {\n if (x.id === siteId) {\n if (site.domain) {\n return site;\n }\n\n return {\n ...site,\n domain: x.domain,\n };\n }\n\n return x;\n })\n );\n };\n\n // Snapshot ops\n const takeSnapshot = async message =>\n // eslint-disable-next-line implicit-arrow-linebreak\n client.takeRoutingSnapshot({ input: { dryRun: false, message: encodeURIComponent(message) } });\n\n const restartEngine = async message => {\n try {\n await takeSnapshot(message);\n } catch (err) {\n Toast.error(err.message);\n }\n };\n\n // Site ops\n const addSite = async site => {\n const result = await client.addRoutingSite({ input: site });\n setNewSites(newSites.concat(result.site));\n restartEngine(getMessage(`add site: ${result.site.domain}`));\n };\n const updateSite = async (siteId, settings) => {\n const result = await client.updateRoutingSite({ input: { id: siteId, ...settings } });\n if (result.site && result.site.id) {\n const index = newSites.findIndex(x => x.id === result.site.id);\n if (index !== -1) {\n newSites.splice(index, 1, result.site);\n setNewSites([].concat(newSites));\n }\n restartEngine(getMessage(`update security. site: ${result.site.domain}`));\n }\n };\n const deleteSite = async id => {\n await client.deleteRoutingSite({ input: { id } });\n const delSite = newSites.find(x => x.id !== id);\n setNewSites(newSites.filter(x => x.id !== id));\n restartEngine(getMessage(`delete site: ${delSite?.domain}`));\n };\n\n // Site alias ops\n const addDomainAlias = async (siteId, domainAlias) => {\n const result = await client.addDomainAlias({ input: { id: siteId, domainAlias } });\n updateSiteRules(siteId, result.site);\n restartEngine(getMessage(`add domain alias ${domainAlias} to ${result.site.domain}`));\n };\n const deleteDomainAlias = async (siteId, domainAlias) => {\n const result = await client.deleteDomainAlias({ input: { id: siteId, domainAlias } });\n updateSiteRules(siteId, result.site);\n restartEngine(getMessage(`delete domain alias ${domainAlias} to ${result.site.domain}`));\n };\n\n // Rule ops\n const addRule = async (id, rule) => {\n const { site } = await client.addRoutingRule({ input: { id, rule } });\n updateSiteRules(id, site);\n restartEngine(getMessage(`add rule. site: ${site.domain}. type: ${rule.from.pathPrefix}`));\n };\n const updateRule = async (siteId, rule) => {\n const { site } = await client.updateRoutingRule({\n input: {\n id: siteId,\n rule,\n },\n });\n\n updateSiteRules(siteId, site);\n restartEngine(getMessage(`update rule. site: ${site.domain}. type: ${rule.from.pathPrefix}`));\n };\n const deleteRule = async (siteId, ruleId) => {\n const { site } = await client.deleteRoutingRule({ input: { id: siteId, ruleId } });\n updateSiteRules(siteId, site);\n restartEngine(getMessage(`delete rule. site: ${site.domain}`));\n };\n\n const value = {\n loading: state.loading,\n error: state.error,\n refresh: state.retry,\n api: client,\n actions: {\n addSite,\n updateSite,\n deleteSite,\n\n addDomainAlias,\n deleteDomainAlias,\n\n takeSnapshot,\n\n addRule,\n updateRule,\n deleteRule,\n },\n };\n\n value.sites = generateSites({\n sites: newSites,\n defaultDomain: window.location.hostname,\n nodePort: info.port,\n });\n value.siteMap = value.sites.reduce((acc, x) => {\n let { name } = x;\n if (name.endsWith(BLOCKLET_SITE_GROUP_SUFFIX)) {\n [name] = name.split('.');\n }\n acc[name] = { ...x, rules: x.items };\n return acc;\n }, {});\n value.domains = domains; // not includes domain aliases\n value.allDomains = allDomains;\n\n return <Provider value={{ routing: value }}>{children}</Provider>;\n}\n\nfunction useRoutingContext() {\n const { routing } = useContext(RoutingContext);\n return routing;\n}\n\nfunction isSpecialDomain(name) {\n const specialDomains = [DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE, DOMAIN_FOR_IP_SITE];\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n specialDomains.push(window.location.hostname);\n }\n\n return specialDomains.includes(name);\n}\n\nexport {\n RoutingContext,\n RoutingProvider,\n Consumer as RoutingConsumer,\n useRoutingContext,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_DEFAULT_SITE,\n DASHBOARD,\n isSpecialDomain,\n};\n","import React, { useState, useContext, useEffect } from 'react';\nimport { fromBlockletStatus, BlockletEvents } from '@blocklet/meta/lib/constants';\n\nimport getClient from '../libs/node';\nimport { useNodeContext } from './node';\nimport { useSubscription } from '../libs/ws';\nimport { getEndPoint, isInvitedUserOnly } from '../libs/util';\nimport ensureBlockletInterface from '../libs/ensure-blocklet-interface';\n\nconst BlockletContext = React.createContext({});\nconst { Provider, Consumer } = BlockletContext;\n\n// eslint-disable-next-line react/prop-types\nfunction BlockletProvider({ children }) {\n const node = useNodeContext();\n const client = getClient();\n const [error, setError] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const [blocklets, setBlocklets] = useState([]);\n\n const MAX_RETRY = 4;\n\n const getBlocklets = async ({ silent = true, retries = MAX_RETRY, updates, useCache = true } = {}) => {\n if (!silent) {\n setLoading(true);\n }\n try {\n setError(null);\n const { blocklets: data } = await client.getBlocklets({ input: { useCache } });\n for (const blocklet of data) {\n // eslint-disable-next-line no-await-in-loop\n blocklet.interfaces = await ensureBlockletInterface(blocklet.interfaces);\n }\n setBlocklets(list => {\n if (!updates) {\n return data;\n }\n\n return list.map(old => {\n const d = { ...old };\n\n // update props in updates\n const cur = data.find(x => x.meta.did === old.meta.did);\n if (cur) {\n updates.forEach(key => {\n d[key] = cur[key];\n });\n }\n\n return d;\n });\n });\n setLoading(false);\n } catch (err) {\n if (retries > 0) {\n setTimeout(() => getBlocklets({ silent, retries: retries - 1, useCache }), 1000);\n } else {\n setLoading(false);\n setError(err);\n }\n }\n };\n\n const getBlocklet = async b => {\n try {\n const { blocklet } = await node.api.getBlocklet({ input: { did: b.meta.did } });\n blocklet.interfaces = await ensureBlockletInterface(blocklet.interfaces);\n setBlocklets(list => {\n // new blocklet\n if (!list.some(d => d.meta.did === blocklet.meta.did)) {\n return [...list, blocklet];\n }\n\n // existing blocklet\n return list.map(d => {\n if (d.meta.did === blocklet.meta.did) {\n return blocklet;\n }\n return d;\n });\n });\n } catch (err) {\n setError(err);\n }\n };\n\n const onInstallOrUpgrade = b => {\n node.refresh();\n getBlocklet(b);\n };\n\n useEffect(() => {\n getBlocklets({ silent: false });\n }, []); // eslint-disable-line\n\n const updateBlockletStatus = async blocklet => {\n setBlocklets(list =>\n list.map(d => {\n if (d.meta.did === blocklet.meta.did) {\n d.status = fromBlockletStatus(blocklet.status);\n }\n return d;\n })\n );\n };\n\n useSubscription(BlockletEvents.added, blocklet => {\n blocklet.status = fromBlockletStatus(blocklet.status);\n setBlocklets(list => [...list, blocklet]);\n });\n\n useSubscription(BlockletEvents.removed, blocklet => {\n node.refresh();\n setBlocklets(list => list.filter(item => item.meta.did !== blocklet.meta.did));\n });\n\n useSubscription(BlockletEvents.statusChange, updateBlockletStatus);\n\n useSubscription(BlockletEvents.installed, onInstallOrUpgrade);\n useSubscription(BlockletEvents.deployed, onInstallOrUpgrade);\n useSubscription(BlockletEvents.upgraded, onInstallOrUpgrade);\n useSubscription(BlockletEvents.downgraded, onInstallOrUpgrade);\n\n useSubscription(BlockletEvents.updated, getBlocklet);\n useSubscription(BlockletEvents.started, getBlocklet);\n useSubscription(BlockletEvents.startFailed, getBlocklet);\n useSubscription(BlockletEvents.reloaded, getBlocklet);\n\n useSubscription('routing.updated', () => {\n getBlocklets({ update: ['interfaces'], useCache: false });\n });\n\n const value = {\n loading,\n error,\n data: blocklets,\n refresh: getBlocklets,\n api: client,\n /**\n * @param {string} did blocklet did\n * @return {Array<Object>}\n * {string} endpoint: url\n * {string} name: interfaceName or 'abtnode'\n * {boolean} invitedUserOnly\n */\n findInterfaceWithAuthService: did => {\n // abtnode\n if (did === node.info.did) {\n return {\n endpoint: getEndPoint(node.info),\n name: 'abtnode',\n invitedUserOnly: true,\n };\n }\n\n // blocklet\n const blocklet = blocklets.find(x => x.meta.did === did);\n\n if (!blocklet) {\n return null;\n }\n\n const { interfaces } = blocklet;\n const authInterface = interfaces.find(x => x.authConfig);\n\n if (!authInterface) {\n return null;\n }\n\n return {\n endpoint: authInterface.url,\n name: authInterface.name,\n invitedUserOnly: isInvitedUserOnly(authInterface.authConfig.invitedUserOnly),\n };\n },\n };\n\n return <Provider value={{ blocklets: value }}>{children}</Provider>;\n}\n\nfunction useBlockletContext() {\n const { blocklets } = useContext(BlockletContext);\n return blocklets;\n}\n\nexport { BlockletContext, BlockletProvider, Consumer as BlockletConsumer, useBlockletContext };\n","import { useLocation } from 'react-router-dom';\n\nexport default function useQuery() {\n return new URLSearchParams(useLocation().search);\n}\n","/* eslint-disable */\nimport React from 'react';\nexport default ({...props}) => (<div {...props}><h3>End User License Agreement for Blocklet Server</h3>\n<p>Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28</p>\n<p>Blocklet Server LICENSE AGREEMENT</p>\n<p>PLEASE READ THIS END USER LICENCE AGREEMENT CAREFULLY. This Blocklet Server License Agreement ('Agreement') is a legal agreement between you (the 'End User') and ArcBlock, Inc. (ARCBLOCK) for the Blocklet Server software (the 'Software') licensed to End User hereunder and supplied to End User. The term Software includes any APIs, software modules, and any associated materials and 'online' or electronic documentation. This Agreement applies to End User's use of the Software but it shall be superseded by any signed agreement between End User and ARCBLOCK concerning the Software.</p>\n<p>By installing or using the Software, You agree to accept and to be bound by this Agreement at all times. If You do not agree with one of these, please do not install or use the Software.</p>\n<h4>1. Software license</h4>\n<p>Notwithstanding any reference to 'sale' or 'purchase', the Software is licensed, not sold. Subject to the terms and conditions of this Agreement, ARCBLOCK grants End User a non-exclusive, non-transferable right to access and use the Software as part of the services for End User's use ('Authorized Use') in object form in the products, versions, and number of installed instances as purchased from ARCBLOCK.</p>\n<h4>2. Limitations</h4>\n<p>2.1. Restrictions. End User shall not itself, or through any parent, subsidiary, affiliate, agent or other third party: (a) sell, lease, license, distribute, sublicense or otherwise transfer in whole or in part, the Software to a third party; (b) decompile, disassemble, translate, reverse engineer or otherwise attempt to derive source code from the Software except to the limited extent, if any, that applicable law permits such acts notwithstanding any contractual prohibitions, provided, however, before End User exercises any rights that End User believes to be entitled to based on mandatory law, End User shall provide ARCBLOCK with thirty (30) days prior written notice and provide all reasonably requested information to allow ARCBLOCK to assess End User's claim and, at ARCBLOCK sole discretion, to provide alternatives that reduce any adverse impact on ARCBLOCK's intellectual property or other rights; (c) allow access or permit use of the Software by any third party except authorized third party contractors solely to provide services to End User, provided that End User shall be liable for all acts and omissions of such authorized third party contractors; (d) modify or create derivative works based upon the Software; (e) disclose the\nresults of any benchmark test of the Software to any third party; (f) change any proprietary rights notices which appear in the Software; or (g) circumvent the license keys embedded within the Software.</p>\n<p>2.2. Software Transfer. Upon written consent from ARCBLOCK, which will not be unreasonably withheld, End User may permanently transfer all of its rights under this Agreement; provided that the recipient agrees to the terms of this Agreement.</p>\n<p>2.3. High Risk Activities. The Software is not intended for use in hazardous environments requiring fail safe performance (such as, without limitation, the planning, construction, maintenance, control, or direct operation of nuclear facilities, aircraft navigation or communication systems, air traffic control, medical device and life support machines, or weapon systems) in which the failure of the Software could lead to death, personal injury or physical and environmental damage ('High Risk Activities'). Accordingly, this Agreement excludes any High Risk Activities and End User agrees not to use the Software in connection with High Risk Activities.</p>\n<h4>3. Ownership</h4>\n<p>The Software is protected by copyright laws and international copyright treaties, as well as other\nintellectual property laws and treaties. ARCBLOCK owns all rights, title and interest in the copyrights, patents and all other intellectual property rights in and to the Software and any accompanying printed materials, and all derivative works thereof.</p>\n<h4>4. Open source programs</h4>\n<p>The Software may include individual open source software components, each of which has its own copyright and its own applicable license conditions. The open source software components are licensed to End User under the terms of the applicable open source license conditions and/or copyright notices that can be found in the licenses file, the related documentation or other materials accompanying the Software.</p>\n<h4>5. Trademarks</h4>\n<p>The marks 'ARCBLOCK', ‘BLOCKLETS’ and ‘Blocklet Server’ are trademarks of ARCBLOCK. ARCBLOCK's failure to list a trademark in this Section shall not constitute a waiver of any trademark rights. All other trademarks in the Software not owned by ARCBLOCK are the property of their respective owners.</p>\n<h4>6. Disclaimer and Warranty</h4>\n<p>6.1. DISCLAIMER OF WARRANTIES. THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT WARRANTY OF ANY KIND AND ARCBLOCK EXPRESSLY DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED OR ARISING OUT OF A COURSE OF CONDUCT OR COURSE OF DEALING, INCLUDING ALL WARRANTIES OF TITLE, PERFORMANCE, USE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON INFRINGEMENT AND THE ABSENCE OF LATENT OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. ARCBLOCK MAKES NO WARRANTY REGARDING NON INTERRUPTION OF USE. NO ORAL OR WRITTEN STATEMENT PROVIDED BY ARCBLOCK SHALL CREATE ANY WARRANTY.</p>\n<p>6.2. LIMITATION OF LIABILITY. THE ENTIRE RISK AS TO THE RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY END USER. ARCBLOCK SHALL NOT HAVE ANY LIABILITY TO END USER OR ANY OTHER PARTY FOR ANY INDIRECT, INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, BUT NOT LIMITED TO, LOSS OF REVENUE, PROFIT OR OPPORTUNITY, LOST OR DAMAGED DATA OR OTHER COMMERCIAL OR ECONOMIC LOSS, EVEN IF ARCBLOCK HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, OR THEY ARE FORESEEABLE. ARCBLOCK'S MAXIMUM AGGREGATE LIABILITY RELATING TO THIS AGREEMENT OR THE SOFTWARE SHALL NOT EXCEED THE AMOUNT PAID BY END USER FOR THE SOFTWARE.</p>\n<p>6.3. ALLOCATION. THE PROVISIONS OF THIS SECTION ALLOCATE RISKS UNDER THIS AGREEMENT BETWEEN ARCBLOCK AND END USER. ARCBLOCK'S LICENSING FEES FOR THE SOFTWARE REFLECT THIS ALLOCATION OF RISKS AND LIMITATION OF LIABILITY. THE FOREGOING LIMITATIONS, EXCLUSIONS AND DISCLAIMERS APPLY TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EVEN IF ANY REMEDY FAILS IN ITS ESSENTIAL PURPOSE.</p>\n<p>6.4. Limitation. Because some jurisdictions do not allow certain disclaimers, exclusions or limitations of warranties, damages or liability, the above disclaimers, exclusions or limitations may not apply to End User and, therefore, shall apply only to the maximum extent allowed under applicable law.</p>\n<h4>7. Term</h4>\n<p>This Agreement is effective until terminated. End Users may terminate the Agreement at any time by returning or destroying all copies of the Software and related documentation. End User's rights under this Agreement will terminate automatically if End User fails to comply with the Agreement.</p>\n<h4>8. Miscellaneous</h4>\n<p>8.1. Governing Law. This Agreement shall be governed by the laws of the State of Washington, without reference to the principles of conflicts of law. The provisions of the Uniform Computerized Information Transaction Act and United Nations Convention on Contracts for the International Sale of Goods shall not apply to this Agreement. Any litigation related to this Agreement shall be brought in the state or federal courts located in Washington, and only in those courts and each party irrevocably waives any objections to such venue. Notwithstanding anything to the contrary herein, ARCBLOCK shall be entitled to seek injunctive or other equitable relief, wherever ARCBLOCK deems appropriate in any jurisdiction, in order to preserve or enforce ARCBLOCK's rights for any breach or threatened breach of this Agreement.</p>\n<p>8.2. Severability. Every term, condition or provision of this Agreement is severable from the others. If a court or an arbitrator of competent jurisdiction holds any term, condition or provision of this Agreement to be invalid, unenforceable or illegal in whole or in part for any reason, the validity and enforceability of the remaining terms, conditions or provisions, or portions of them, will not be affected.</p>\n<p>8.3. Confidentiality. Except as expressly allowed by this Agreement, End User will not use or disclose any Software or related technology, idea, algorithm or information ('Confidential Information') except to the extent End User can document that it is generally available for use and disclosure by the public without charge or license. End User shall hold the Confidential Information in trust and confidence and avoid the disclosure or release thereof to any other person or entity by using the same degree of care as it uses to avoid unauthorized use, disclosure, or dissemination of its own Confidential Information of a similar nature, but not less than reasonable care. End User may disclose Confidential Information as required to comply with binding orders of governmental entities that have jurisdiction over it; provided that End User gives ARCBLOCK reasonable written notice to allow ARCBLOCK to seek a protective order or other appropriate remedy, discloses only such Confidential Information as is required by the governmental entity, and uses commercially reasonable efforts to obtain confidential treatment for any Confidential Information disclosed. End User recognizes and agrees that there is no adequate remedy at law for a breach of this Section, that such a breach would irreparably harm ARCBLOCK and that ARCBLOCK is entitled to equitable relief (without need to post a bond) with respect to any such breach or potential breach in addition to any other remedies.</p>\n<p>8.4. Indemnity. End User shall defend, indemnify and hold harmless ARCBLOCK, and its officers, directors, employees and agents (the ARCBLOCK indemnities’), from and against all suits, claims, demands, losses, liabilities, damages and expenses (including reasonable attorneys' fees and costs) that the ARCBLOCK Indemnities may suffer or incur in connection with: (i) any third party claim arising from End User's breach of this Agreement; and (ii) any infringement by End User of ARCBLOCK's intellectual property rights in the Software.</p>\n<p>8.5. Entire Agreement and Waiver. The Agreement is the sole, final and entire agreement between the parties with respect to the subject matter hereof, may only be amended in writing signed by both ARCBLOCK License parties. A failure or delay in enforcing any provisions, exercising any option or requiring performance, be construed to be a waiver by ARCBLOCK.</p>\n<p>8.6. Marketing. ARCBLOCK may use End User's name and company logo on its customer list and web site, and link to End User's web site.</p>\n<p>8.7. Independent Contractor. The relationship of the parties is that of independent contractors. Neither party will be deemed to be the legal representative of the other nor will it have any right to bind the other party to any contract or commitment. This Agreement does not, and will not, be construed to create an employer employee, agency, joint venture or partnership relationship between the parties. Each party agrees to assume complete responsibility for its own employees regarding federal or state laws, including employers' liability and tax withholding, worker's compensation, social security, unemployment insurance, and OSHA requirements.</p>\n<p>8.8. Notices. All notices must be in writing and will be effective three (3) days after the date sent to each party's corporate headquarters.</p>\n<p>8.9. Audit. During the term of this Agreement and for one (1) year following termination or expiration (but no more than once in a calendar year), ARCBLOCK and its auditors may inspect End User's records relating to its reproduction and use of the Software for the purposes of verifying End User's compliance with this Agreement. End User shall cooperate fully with ARCBLOCK and its auditors in conducting audits and provide reasonable assistance. If an underpayment is discovered, End User shall promptly pay such amount and End User shall reimburse ARCBLOCK for the cost of the audit.</p>\n<p>8.10. Government Regulation. End User acknowledges that the Software is subject to export restrictions by the U.S. government and import restrictions by certain foreign governments. End User may not export or re-export the Software except in compliance with the U.S. Export Administration Act and the related rules and regulations and similar non-U.S. government restrictions, if applicable. End User shall not and shall not allow any third party to remove or export from the United States or allow the export or re export of any part of the Software or any direct product thereof: (i) into (or to a national or resident of) any embargoed or terrorist supporting country; (ii) to anyone on the U.S. Commerce Department's Table of Denial Orders or U.S. Treasury Department's list of Specially Designated Nationals; (iii) to any country to which such export or re export is restricted or prohibited, or as to which the U.S. government or any agency thereof requires an export license or other governmental approval at the time of export or re export without first obtaining such license or approval; or (iv) otherwise in violation of any export or import restrictions, laws or regulations of any United States or foreign agency or authority. End User agrees to the foregoing and warrants that it is not located in, under the control of, or a national or resident of any such prohibited country or on any such prohibited party list. The Software is further restricted from being used for terrorist activity, or for the design or development of nuclear, chemical, or biological weapons or missile technology without the prior permission of the U.S. government. The Software and accompanying documentation are deemed to be \"commercial computer software\" and \"commercial computer software documentation\", respectively, pursuant to DFAR Section 227.7202 and FAR Section 12.212(b), as applicable. Any use, modification, reproduction, release, performing, displaying or disclosing of the Software and related documentation by the U.S. Government shall be governed solely by the terms of this Agreement.</p>\n</div>);\n","const BLOCKLET_INTERFACE_TYPE_WEB = 'web';\nconst BLOCKLET_INTERFACE_TYPE_SERVICE = 'service';\n\n// Wellknown interface declares an sub-interface under web interface\n// The path of the wellknown interface must starts with /.well-known, e.g. /.well-known/acme-challenge)\n// The wellknown interface can be mounted to every endpoint of the abtnode and all blocklets on the abtnode\nconst BLOCKLET_INTERFACE_TYPE_WELLKNOWN = 'wellknown';\n\nconst BlockletStatus = Object.freeze({\n added: 0,\n downloading: 1,\n downloaded: 2, // Deprecated\n installing: 3,\n installed: 4,\n starting: 5,\n running: 6,\n stopping: 7,\n stopped: 8,\n error: 9,\n upgrading: 10,\n restarting: 11, // Deprecated\n corrupted: 12,\n waiting: 13,\n});\n\nconst BlockletSource = Object.freeze({\n registry: 0,\n local: 1,\n upload: 2,\n url: 3,\n});\n\nconst BlockletEvents = Object.freeze({\n added: 'blocklet.added',\n downloadFailed: 'blocklet.downloadFailed',\n installed: 'blocklet.installed',\n installFailed: 'blocklet.installFailed',\n upgraded: 'blocklet.upgraded',\n downgraded: 'blocklet.downgraded',\n deployed: 'blocklet.deployed',\n updated: 'blocklet.updated',\n statusChange: 'blocklet.statusChange',\n removed: 'blocklet.removed',\n started: 'blocklet.started',\n startFailed: 'blocklet.startFailed',\n stopped: 'blocklet.stopped',\n reloaded: 'blocklet.reloaded', // Deprecated\n purchaseChange: 'blocklet.purchaseChange',\n});\n\nconst fromEntry = (entries) => (v) => {\n const match = Object.entries(entries).find((x) => x[1] === Number(v));\n return match ? match[0] : 'unknown';\n};\n\nconst toEntry = (entries) => (v) => Object.keys(entries).find((x) => entries[x] === Number(v));\n\nconst fromBlockletStatus = fromEntry(BlockletStatus);\nconst toBlockletStatus = toEntry(BlockletStatus);\n\nconst fromBlockletSource = fromEntry(BlockletSource);\nconst toBlockletSource = toEntry(BlockletSource);\n\nconst BLOCKLET_INTERFACE_PUBLIC = 'publicUrl';\nconst BLOCKLET_INTERFACE_ADMIN = 'adminUrl';\nconst BLOCKLET_INTERFACE_CONFIG = 'configUrl';\nconst BLOCKLET_INTERFACE_DOC = 'docUrl';\nconst BLOCKLET_INTERFACE_WELLKNOWN = 'wellknownUrl'; // Deprecated\n\nmodule.exports = Object.freeze({\n BlockletStatus,\n BlockletSource,\n fromBlockletStatus,\n toBlockletStatus,\n fromBlockletSource,\n toBlockletSource,\n\n BlockletGroup: Object.freeze({\n static: 'static',\n dapp: 'dapp',\n starter: false,\n gateway: 'gateway',\n }),\n BLOCKLET_GROUPS: ['dapp', 'static', 'gateway'],\n\n BlockletEvents,\n\n BLOCKLET_PLATFORMS: ['aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', 'win32'],\n BLOCKLET_ARCHITECTURES: ['arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', 'x64'],\n BLOCKLET_MODES: Object.freeze({\n PRODUCTION: 'production',\n DEVELOPMENT: 'development',\n }),\n\n BLOCKLET_FACTORY_SHARES: { developer: 0.7, store: 0.3 },\n\n BLOCKLET_DYNAMIC_PATH_PREFIX: '*',\n\n BLOCKLET_INTERFACE_PUBLIC,\n BLOCKLET_INTERFACE_ADMIN,\n BLOCKLET_INTERFACE_CONFIG,\n BLOCKLET_INTERFACE_DOC,\n BLOCKLET_INTERFACE_WELLKNOWN,\n\n BLOCKLET_UI_INTERFACES: [\n BLOCKLET_INTERFACE_PUBLIC,\n BLOCKLET_INTERFACE_ADMIN,\n BLOCKLET_INTERFACE_CONFIG,\n BLOCKLET_INTERFACE_DOC,\n ],\n\n BLOCKLET_STANDARD_INTERFACES: [\n BLOCKLET_INTERFACE_PUBLIC,\n BLOCKLET_INTERFACE_ADMIN,\n BLOCKLET_INTERFACE_CONFIG,\n BLOCKLET_INTERFACE_DOC,\n BLOCKLET_INTERFACE_WELLKNOWN,\n ],\n\n BLOCKLET_INTERFACE_TYPE_WEB,\n BLOCKLET_INTERFACE_TYPE_SERVICE,\n BLOCKLET_INTERFACE_TYPE_WELLKNOWN,\n BLOCKLET_INTERFACE_TYPES: [\n BLOCKLET_INTERFACE_TYPE_WEB,\n BLOCKLET_INTERFACE_TYPE_SERVICE,\n BLOCKLET_INTERFACE_TYPE_WELLKNOWN,\n ],\n\n BLOCKLET_INTERFACE_PROTOCOLS: ['tcp', 'udp', 'http'],\n\n BLOCKLET_RELEASE_FOLDER: '.blocklet/release',\n BLOCKLET_RELEASE_FILE: 'blocklet.json',\n BLOCKLET_BUNDLE_FOLDER: '.blocklet/bundle',\n BLOCKLET_BUNDLE_FILE: 'blocklet.zip',\n BLOCKLET_ENTRY_FILE: 'blocklet.js',\n BLOCKLET_META_FILE: 'blocklet.yml',\n BLOCKLET_META_FILE_ALT: 'blocklet.yaml',\n BLOCKLET_META_FILE_OLD: 'blocklet.json',\n\n BLOCKLET_DEFAULT_VERSION: '1.0.0',\n BLOCKLET_DEFAULT_PORT_NAME: 'BLOCKLET_PORT',\n\n BLOCKLET_LATEST_SPEC_VERSION: '1.2.1',\n BLOCKLET_LATEST_REQUIREMENT_SERVER: '>=1.6.2',\n BLOCKLET_LATEST_REQUIREMENT_ABTNODE: '>=1.5.15', // Deprecated\n\n BLOCKLET_CONFIGURABLE_KEY: {\n BLOCKLET_CLUSTER_SIZE: 'BLOCKLET_CLUSTER_SIZE',\n BLOCKLET_APP_NAME: 'BLOCKLET_APP_NAME',\n BLOCKLET_APP_DESCRIPTION: 'BLOCKLET_APP_DESCRIPTION',\n BLOCKLET_APP_SK: 'BLOCKLET_APP_SK',\n BLOCKLET_WALLET_TYPE: 'BLOCKLET_WALLET_TYPE',\n },\n});\n","import { createBrowserHistory } from 'history';\n\nexport default createBrowserHistory();\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport Tag from '@arcblock/ux/lib/Tag';\n\nexport default function NotificationTag({ status, ...rest }) {\n const map = {\n warning: 'warning',\n error: 'error',\n info: 'primary',\n };\n\n if (!status || status === 'info' || status === 'success') {\n return null;\n }\n\n return (\n <Tag type={map[status]} style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {status}\n </Tag>\n );\n}\n\nNotificationTag.propTypes = {\n status: PropTypes.string.isRequired,\n};\n","/* eslint-disable no-underscore-dangle */\nconst EventEmitter = require('eventemitter3');\nconst ABTNodeClient = require('./base');\n\nclass BrowserABTNodeClient extends ABTNodeClient {\n _getSocketOptions() {\n return {};\n }\n\n _getEventImplementation() {\n return EventEmitter;\n }\n}\n\nmodule.exports = BrowserABTNodeClient;\n","const en = require('./en');\nconst zh = require('./zh');\n\nmodule.exports = { translations: { zh, en } };\n","/* eslint-disable object-curly-newline */\nimport { useContext } from 'react';\nimport createSessionContext from '@arcblock/did-connect/lib/Session';\n\nconst { SessionProvider, SessionContext, SessionConsumer, withSession } = createSessionContext('abt_node_login_token');\n\nfunction useSessionContext() {\n const info = useContext(SessionContext);\n return info;\n}\n\nexport { SessionProvider, SessionContext, SessionConsumer, useSessionContext, withSession };\n","/* eslint-disable max-len */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable import/prefer-default-export */\nimport qs from 'querystring';\nimport isUrl from 'is-url';\nimport moment from 'moment';\nimport humanizeUrl from 'humanize-url';\nimport 'moment/locale/zh-cn';\nimport filesize from 'filesize';\nimport gitInfo from 'hosted-git-info';\nimport joinURL from 'url-join';\nimport { BLOCKLET_INTERFACE_TYPE_SERVICE } from '@blocklet/meta/lib/constants';\nimport {\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_DEFAULT_SITE,\n DOMAIN_FOR_INTERNAL_SITE,\n ROUTER_PROVIDER_NONE,\n ROLES,\n WELLKNOWN_AUTH_PATH_PREFIX,\n} from '@abtnode/constant';\n\nexport function sleep(t) {\n return new Promise(resolve => setTimeout(resolve, process.env.NODE_ENV === 'production' ? t / 5 : t));\n}\n\nexport function formatTimestamp(ts) {\n if (!ts) {\n return '-';\n }\n\n let date;\n if (Number(ts).toString() === ts) {\n date = new Date();\n date.setTime(ts);\n } else {\n date = new Date(ts);\n }\n\n return date.toLocaleString();\n}\n\nexport function formatToDate(date) {\n if (!date) {\n return '-';\n }\n\n return moment(date).format('ll');\n}\n\nexport function formatToDatetime(date) {\n if (!date) {\n return '-';\n }\n\n return moment(date).format('lll');\n}\n\nexport function formatTimeFromNow(date) {\n if (!date) {\n return '-';\n }\n const startDate = moment(date);\n const endDate = moment();\n\n const diffDay = endDate.diff(startDate, 'day');\n\n return diffDay > 3 ? formatToDate(date) : startDate.fromNow();\n}\n\nexport function formatTime(date, format = 'lll') {\n if (!date) {\n return '-';\n }\n\n return moment(date).format(format);\n}\n\nexport const formatError = error => {\n if (Array.isArray(error.errors)) {\n return error.errors.map(x => x.message).join('\\n');\n }\n\n return error.message;\n};\n\nexport const formatLocale = (locale = 'en') => {\n if (locale === 'zh') {\n return 'zh_CN';\n }\n\n return locale;\n};\n\nexport const parseQuery = str =>\n str\n .replace(/^\\?/, '')\n .split('&')\n .map(x => x.split('='))\n .filter(([key]) => !!key)\n .reduce((memo, x) => {\n const key = x[0];\n const value = decodeURIComponent(x[1]) || true;\n memo[key] = value;\n return memo;\n }, {});\n\n// Append any query string url to api requests\nexport const appendParams = (url, extraParams = {}) => {\n const [pathname, query = ''] = url.split('?');\n const oldParams = parseQuery(query);\n\n const params = Object.assign({}, oldParams, extraParams);\n return `${pathname}?${qs.stringify(params)}`;\n};\n\nexport const isInProgress = status =>\n ['waiting', 'downloading', 'starting', 'installing', 'stopping', 'upgrading', 'restarting'].includes(status);\n\nexport const isInstalling = status => ['waiting', 'downloading', 'installing', 'upgrading'].includes(status);\n\nexport const isDownloading = status => ['waiting', 'downloading'].includes(status);\n\nexport const formatDiskSize = (size, serverPlatform = '') => {\n const base = serverPlatform === 'linux' ? 2 : 10;\n return filesize(size, { base, round: 2 });\n};\n\nexport const checkInputByType = (type, value) => {\n const typesMap = {\n url: isUrl,\n };\n\n if (!type) {\n return true;\n }\n\n if (typesMap[type]) {\n return typesMap[type](value);\n }\n\n return false;\n};\n\nexport const formatUrl = url => humanizeUrl(url.split('?').shift());\n\nexport const formatPerson = person => {\n if (!person) {\n return '-';\n }\n if (typeof person === 'string') {\n return person;\n }\n\n const name = person.name || '';\n const u = person.url || person.web;\n const url = u ? ` (${u})` : '';\n const e = person.email || person.mail;\n const email = e ? ` <${e}>` : '';\n\n return name + email + url;\n};\n\nexport const getBlockletServices = blocklet => {\n const services = [];\n const interfaces = (blocklet.meta.interfaces || []).filter(x => x.type === BLOCKLET_INTERFACE_TYPE_SERVICE);\n interfaces.forEach(x => {\n services.push({\n name: x.name,\n protocol: x.protocol,\n port: Number(x.port.external),\n upstreamPort: Number(blocklet.ports[x.port.internal]),\n });\n });\n\n return services;\n};\n\nexport const shouldCheckDomainStatus = domain =>\n domain && // eslint-disable-line\n ![DOMAIN_FOR_IP_SITE, DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE, DOMAIN_FOR_INTERNAL_SITE].includes(domain);\n\nexport const checkIsWildcardDomain = url => {\n try {\n if (!url) {\n return false;\n }\n\n const tempUrl = url.startsWith('http') ? url : `http://${url}`;\n const urlObj = new window.URL(tempUrl);\n return decodeURIComponent(urlObj.host)\n .split('.')\n .some(x => x === '*');\n } catch (error) {\n console.error(url, error);\n return false;\n }\n};\n\nexport const encodeWildcardDomain = (url, locale = 'en') => {\n try {\n const tempUrl = url.startsWith('http') ? url : `http://${url}`; // window.URL 接受的参数必须是标准的 url\n const urlObj = new window.URL(tempUrl);\n const placeholder = locale === 'en' ? '<your subdomain>' : '<你的子域名>';\n const host = decodeURIComponent(urlObj.host)\n .split('.')\n .map(x => (x === '*' ? placeholder : x))\n .join('.');\n\n return host;\n } catch (error) {\n console.error(url, error);\n }\n\n return url;\n};\n\nexport const stringSortHandlerAsc = (strA = '', strB = '') => {\n if (strA > strB) {\n return 1;\n }\n\n if (strB > strA) {\n return -1;\n }\n\n return 0;\n};\n\nexport const getEndPoint = nodeInfo => {\n const { routing } = nodeInfo;\n const { protocol, hostname, origin, port } = window.location;\n\n let endpoint = `${origin}${routing.adminPath}`;\n if (process.env.NODE_ENV === 'development') {\n endpoint = `${protocol}//${hostname}:${port}`;\n } else if (routing.provider === ROUTER_PROVIDER_NONE) {\n endpoint = origin;\n }\n\n return endpoint;\n};\n\nexport const getInviteLink = ({ inviteId, endpoint }) => {\n const u = new URL(endpoint);\n u.searchParams.set('inviteId', inviteId);\n return u.href;\n};\n\nexport const getIssuePassportLink = ({ id, endpoint }) => {\n const u = new URL(endpoint);\n u.pathname = joinURL(u.pathname, WELLKNOWN_AUTH_PATH_PREFIX, 'issue-passport');\n u.searchParams.set('id', id);\n return u.href;\n};\n\nexport const isInvitedUserOnly = value => ['yes', 'not-first', true].includes(value);\n\nexport const formatRegistryScreenshotPath = (did, asset) => {\n if (asset.startsWith('/assets')) {\n return asset;\n }\n\n return `/assets/${did}/screenshots/${asset}`;\n};\n\nexport const formatRegistryLogoPath = (did, asset) => {\n if (asset.startsWith('/assets')) {\n return asset;\n }\n\n return `/assets/${did}/${asset}`;\n};\n\nexport function parseRegistryUrl(url) {\n try {\n const info = gitInfo.fromUrl(url);\n return info ? info.browse() : url;\n } catch {\n return url;\n }\n}\n\nexport function getWebWalletUrl(info) {\n try {\n const url = window.localStorage.getItem('wallet_url');\n if (url) {\n return url;\n }\n } catch (err) {\n // Do nothing\n }\n\n return info.webWalletUrl;\n}\n\nexport function isValidClusterSize(data) {\n const { value, cpuCores } = data;\n if (!value) {\n return '';\n }\n\n const v = Number(value);\n if (Number.isNaN(v)) {\n return 'Cluster size should be a number';\n }\n if (!Number.isInteger(v)) {\n return 'Cluster size should be integer';\n }\n if (v <= 0 || v > cpuCores) {\n return `Cluster size should between 1 to ${cpuCores}`;\n }\n\n return '';\n}\n\nexport function createPassportSvg({ issuer, title, issuerDid } = {}) {\n const svg =\n encodeURIComponent(`<svg width=\"317\" height=\"200\" viewBox=\"0 0 317 200\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"0.5\" y=\"0.5\" width=\"316\" height=\"199\" rx=\"7.5\" fill=\"url(#paint0_linear)\"/>\n <path d=\"M26.1973 155H25.0723V146.469H26.1973V155ZM31.7812 153.318C31.7812 153.025 31.6699 152.799 31.4473 152.639C31.2285 152.475 30.8438 152.334 30.293 152.217C29.7461 152.1 29.3105 151.959 28.9863 151.795C28.666 151.631 28.4277 151.436 28.2715 151.209C28.1191 150.982 28.043 150.713 28.043 150.4C28.043 149.881 28.2617 149.441 28.6992 149.082C29.1406 148.723 29.7031 148.543 30.3867 148.543C31.1055 148.543 31.6875 148.729 32.1328 149.1C32.582 149.471 32.8066 149.945 32.8066 150.523H31.7168C31.7168 150.227 31.5898 149.971 31.3359 149.756C31.0859 149.541 30.7695 149.434 30.3867 149.434C29.9922 149.434 29.6836 149.52 29.4609 149.691C29.2383 149.863 29.127 150.088 29.127 150.365C29.127 150.627 29.2305 150.824 29.4375 150.957C29.6445 151.09 30.0176 151.217 30.5566 151.338C31.0996 151.459 31.5391 151.604 31.875 151.771C32.2109 151.939 32.459 152.143 32.6191 152.381C32.7832 152.615 32.8652 152.902 32.8652 153.242C32.8652 153.809 32.6387 154.264 32.1855 154.607C31.7324 154.947 31.1445 155.117 30.4219 155.117C29.9141 155.117 29.4648 155.027 29.0742 154.848C28.6836 154.668 28.377 154.418 28.1543 154.098C27.9355 153.773 27.8262 153.424 27.8262 153.049H28.9102C28.9297 153.412 29.0742 153.701 29.3438 153.916C29.6172 154.127 29.9766 154.232 30.4219 154.232C30.832 154.232 31.1602 154.15 31.4062 153.986C31.6562 153.818 31.7812 153.596 31.7812 153.318ZM37.9688 153.318C37.9688 153.025 37.8574 152.799 37.6348 152.639C37.416 152.475 37.0312 152.334 36.4805 152.217C35.9336 152.1 35.498 151.959 35.1738 151.795C34.8535 151.631 34.6152 151.436 34.459 151.209C34.3066 150.982 34.2305 150.713 34.2305 150.4C34.2305 149.881 34.4492 149.441 34.8867 149.082C35.3281 148.723 35.8906 148.543 36.5742 148.543C37.293 148.543 37.875 148.729 38.3203 149.1C38.7695 149.471 38.9941 149.945 38.9941 150.523H37.9043C37.9043 150.227 37.7773 149.971 37.5234 149.756C37.2734 149.541 36.957 149.434 36.5742 149.434C36.1797 149.434 35.8711 149.52 35.6484 149.691C35.4258 149.863 35.3145 150.088 35.3145 150.365C35.3145 150.627 35.418 150.824 35.625 150.957C35.832 151.09 36.2051 151.217 36.7441 151.338C37.2871 151.459 37.7266 151.604 38.0625 151.771C38.3984 151.939 38.6465 152.143 38.8066 152.381C38.9707 152.615 39.0527 152.902 39.0527 153.242C39.0527 153.809 38.8262 154.264 38.373 154.607C37.9199 154.947 37.332 155.117 36.6094 155.117C36.1016 155.117 35.6523 155.027 35.2617 154.848C34.8711 154.668 34.5645 154.418 34.3418 154.098C34.123 153.773 34.0137 153.424 34.0137 153.049H35.0977C35.1172 153.412 35.2617 153.701 35.5312 153.916C35.8047 154.127 36.1641 154.232 36.6094 154.232C37.0195 154.232 37.3477 154.15 37.5938 153.986C37.8438 153.818 37.9688 153.596 37.9688 153.318ZM44.3789 154.373C43.957 154.869 43.3379 155.117 42.5215 155.117C41.8457 155.117 41.3301 154.922 40.9746 154.531C40.623 154.137 40.4453 153.555 40.4414 152.785V148.66H41.5254V152.756C41.5254 153.717 41.916 154.197 42.6973 154.197C43.5254 154.197 44.0762 153.889 44.3496 153.271V148.66H45.4336V155H44.4023L44.3789 154.373ZM49.7168 155.117C48.8574 155.117 48.1582 154.836 47.6191 154.273C47.0801 153.707 46.8105 152.951 46.8105 152.006V151.807C46.8105 151.178 46.9297 150.617 47.168 150.125C47.4102 149.629 47.7461 149.242 48.1758 148.965C48.6094 148.684 49.0781 148.543 49.582 148.543C50.4062 148.543 51.0469 148.814 51.5039 149.357C51.9609 149.9 52.1895 150.678 52.1895 151.689V152.141H47.8945C47.9102 152.766 48.0918 153.271 48.4395 153.658C48.791 154.041 49.2363 154.232 49.7754 154.232C50.1582 154.232 50.4824 154.154 50.748 153.998C51.0137 153.842 51.2461 153.635 51.4453 153.377L52.1074 153.893C51.5762 154.709 50.7793 155.117 49.7168 155.117ZM49.582 149.434C49.1445 149.434 48.7773 149.594 48.4805 149.914C48.1836 150.23 48 150.676 47.9297 151.25H51.1055V151.168C51.0742 150.617 50.9258 150.191 50.6602 149.891C50.3945 149.586 50.0352 149.434 49.582 149.434ZM56.5137 149.633C56.3496 149.605 56.1719 149.592 55.9805 149.592C55.2695 149.592 54.7871 149.895 54.5332 150.5V155H53.4492V148.66H54.5039L54.5215 149.393C54.877 148.826 55.3809 148.543 56.0332 148.543C56.2441 148.543 56.4043 148.57 56.5137 148.625V149.633Z\" fill=\"#999999\"/>\n <text x=\"262\" y=\"42\" font-size=\"${\n title.length > 5 ? 12 : 14\n }\" fill=\"#222222\" style='text-anchor:middle;font-weight:bold;font-family: Roboto;'>${title.toUpperCase()}</text>\n <text x=\"24\" y=\"44\" font-size=\"18\" fill=\"#222222\" style='width: 100'>${issuer}</text>\n <path d=\"M234 24.25H289V23.75H234V24.25ZM292.75 28V47H293.25V28H292.75ZM289 50.75H234V51.25H289V50.75ZM230.25 47V28H229.75V47H230.25ZM234 50.75C231.929 50.75 230.25 49.0711 230.25 47H229.75C229.75 49.3472 231.653 51.25 234 51.25V50.75ZM292.75 47C292.75 49.0711 291.071 50.75 289 50.75V51.25C291.347 51.25 293.25 49.3472 293.25 47H292.75ZM289 24.25C291.071 24.25 292.75 25.9289 292.75 28H293.25C293.25 25.6528 291.347 23.75 289 23.75V24.25ZM234 23.75C231.653 23.75 229.75 25.6528 229.75 28H230.25C230.25 25.9289 231.929 24.25 234 24.25V23.75Z\" fill=\"#999999\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M25.9318 163.527H41.0926C41.8394 163.527 42.4449 164.077 42.4449 164.756V173.244C42.4449 173.923 41.8394 174.473 41.0926 174.473H25.9318C25.185 174.473 24.5795 173.923 24.5795 173.244V173.172C24.5795 173.012 24.4498 172.882 24.2898 172.882C24.1297 172.882 24 173.012 24 173.172V173.244C24 174.214 24.8649 175 25.9318 175H41.0926C42.1595 175 43.0244 174.214 43.0244 173.244V164.756C43.0244 163.786 42.1595 163 41.0926 163H25.9318C24.8649 163 24 163.786 24 164.756V164.828C24 164.988 24.1297 165.118 24.2898 165.118C24.4498 165.118 24.5795 164.988 24.5795 164.828V164.756C24.5795 164.077 25.185 163.527 25.9318 163.527ZM24.0612 172.012C24.1079 172.053 24.1604 172.073 24.2187 172.073H26.5375C27.4008 172.073 28.057 171.877 28.5062 171.485C28.9612 171.087 29.2033 170.481 29.2325 169.667C29.2383 169.503 29.2412 169.281 29.2412 169C29.2412 168.719 29.2383 168.494 29.2325 168.324C29.2091 167.545 28.9612 166.951 28.4887 166.541C28.0162 166.132 27.3512 165.927 26.4937 165.927H24.2187C24.1604 165.927 24.1079 165.947 24.0612 165.988C24.0204 166.029 24 166.082 24 166.146V171.854C24 171.912 24.0204 171.965 24.0612 172.012ZM27.3425 170.537C27.1616 170.718 26.8787 170.809 26.4937 170.809H25.575V167.191H26.45C26.835 167.191 27.1237 167.285 27.3162 167.472C27.5146 167.66 27.6196 167.949 27.6312 168.341C27.6429 168.505 27.6487 168.722 27.6487 168.991C27.6487 169.26 27.6429 169.48 27.6312 169.65C27.6196 170.054 27.5233 170.349 27.3425 170.537ZM30.3246 172.012C30.3713 172.053 30.4238 172.073 30.4821 172.073H31.6546C31.7188 172.073 31.7713 172.053 31.8121 172.012C31.8588 171.971 31.8821 171.918 31.8821 171.854V166.146C31.8821 166.082 31.8588 166.029 31.8121 165.988C31.7713 165.947 31.7188 165.927 31.6546 165.927H30.4821C30.4238 165.927 30.3713 165.947 30.3246 165.988C30.2838 166.029 30.2634 166.082 30.2634 166.146V171.854C30.2634 171.912 30.2838 171.965 30.3246 172.012ZM33.319 172.073C33.2607 172.073 33.2082 172.053 33.1615 172.012C33.1207 171.965 33.1003 171.912 33.1003 171.854V166.146C33.1003 166.082 33.1207 166.029 33.1615 165.988C33.2082 165.947 33.2607 165.927 33.319 165.927H35.594C36.4515 165.927 37.1165 166.132 37.589 166.541C38.0615 166.951 38.3094 167.545 38.3327 168.324C38.3385 168.494 38.3415 168.719 38.3415 169C38.3415 169.281 38.3385 169.503 38.3327 169.667C38.3035 170.481 38.0615 171.087 37.6065 171.485C37.1573 171.877 36.5011 172.073 35.6377 172.073H33.319ZM35.594 170.809C35.979 170.809 36.2619 170.718 36.4427 170.537C36.6236 170.349 36.7198 170.054 36.7315 169.65C36.7431 169.48 36.749 169.26 36.749 168.991C36.749 168.722 36.7431 168.505 36.7315 168.341C36.7198 167.949 36.6148 167.66 36.4165 167.472C36.224 167.285 35.9352 167.191 35.5502 167.191H34.6752V170.809H35.594ZM40.1082 168.282C39.8193 168.282 39.5811 168.047 39.5811 167.759C39.5811 167.47 39.8193 167.235 40.1082 167.235C40.3972 167.235 40.6354 167.47 40.6354 167.759C40.6354 168.047 40.3972 168.282 40.1082 168.282ZM40.1082 171.017C39.8193 171.017 39.5811 170.782 39.5811 170.493C39.5811 170.205 39.8193 169.97 40.1082 169.97C40.3972 169.97 40.6354 170.205 40.6354 170.493C40.6354 170.782 40.3972 171.017 40.1082 171.017Z\" fill=\"#999999\"/>\n <text x=\"48\" y=\"173\" font-size=\"11\" fill=\"#777777\" font-family=\"Courier New\">${\n issuerDid || new Array(37).fill('x').join('')\n }</text>\n <rect x=\"0.5\" y=\"0.5\" width=\"316\" height=\"199\" rx=\"7.5\" stroke=\"#E7ECF6\"/>\n <defs>\n <linearGradient id=\"paint0_linear\" x1=\"158.5\" y1=\"0\" x2=\"158.5\" y2=\"200\" gradientUnits=\"userSpaceOnUse\">\n <stop stop-color=\"#F3F6FC\"/>\n <stop offset=\"1\" stop-color=\"#EEF1F7\"/>\n </linearGradient>\n </defs>\n </svg>`);\n return `data:image/svg+xml;utf8,${svg}`;\n}\n\nexport function isProtectedRole(role) {\n return Object.values(ROLES).includes(role);\n}\n\nexport function getBlockletUrl(registryUrl, did) {\n return joinURL(registryUrl, `/api/blocklets/${did}/blocklet.json`);\n}\n\nexport function formatFactoryPrice(blocklet) {\n if (!blocklet?.payment) {\n return [];\n }\n\n const list = (blocklet.payment?.price || []).map(item => ({ name: item.symbol, value: item.value }));\n return list;\n}\n\nexport const getBlockletName = blockletMeta => blockletMeta.title || blockletMeta.name;\n\nexport const getBlockletLogoUrl = ({ did, baseUrl, logoPath }) => {\n if (baseUrl.startsWith('http') && logoPath) {\n return joinURL(baseUrl, formatRegistryLogoPath(did, logoPath));\n }\n\n const prefix = window.env.apiPrefix || '/';\n let apiPrefix = prefix.replace(/^\\/+/, '').replace(/\\/+$/, '');\n if (apiPrefix) {\n apiPrefix = `/${apiPrefix}`;\n }\n\n return joinURL(apiPrefix, `/blocklet/logo/${did}`);\n};\n\nexport const getPathPrefix = () => (window.env && window.env.apiPrefix ? window.env.apiPrefix : '/');\n","/* eslint-disable no-underscore-dangle */\nconst BaseClient = require('@arcblock/sdk-util');\n\nconst schema = require('./schema/graphql.json');\n\n/**\n * Provides a readonly client to forge\n * Its recommended to use this version in browser to get smaller bundle size\n *\n * @class ABTNodeClient\n * @extends {BaseClient}\n */\nclass ABTNodeClient extends BaseClient {\n constructor(httpEndpoint = 'http://localhost:4000/api', axios) {\n const config = {\n dataSource: 'forge',\n httpEndpoint,\n socketEndpoint: () => this._getSocketEndpoint(httpEndpoint),\n enableQuery: true,\n enableSubscription: true,\n enableMutation: true,\n maxQueryDepth: 6,\n };\n\n if (axios) {\n config.axios = axios;\n }\n\n super(config);\n\n this._endpoint = httpEndpoint;\n this._authToken = null;\n }\n\n setAuthToken(token) {\n this._authToken = token;\n }\n\n _getSocketEndpoint(endpoint) {\n let socketEndpoint = endpoint.replace(/https?:\\/\\//, 'ws://');\n if (endpoint.indexOf('https://') === 0) {\n socketEndpoint = socketEndpoint.replace('ws://', 'wss://');\n }\n\n return `${socketEndpoint}/socket`;\n }\n\n _getSchema() {\n return schema;\n }\n\n // eslint-disable-next-line\n _getIgnoreFields({ name }) {\n return [];\n }\n\n _getAuthHeaders() {\n const headers = {};\n const token = this._authToken;\n if (token) {\n const val = typeof token === 'function' ? token() : token;\n headers.Authorization = `Bearer ${encodeURIComponent(val)}`;\n }\n\n // eslint-disable-next-line no-undef\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n const { hostname, port, protocol } = window.location; // eslint-disable-line no-undef\n headers['x-real-hostname'] = hostname;\n headers['x-real-port'] = port;\n headers['x-real-protocol'] = protocol.endsWith(':') ? protocol.substring(0, protocol.length - 1) : protocol;\n }\n\n return headers;\n }\n}\n\nmodule.exports = ABTNodeClient;\n","const flat = require('flat');\n\nmodule.exports = flat({\n setup: {\n connect: {\n title: 'Signature Required',\n scan: 'Connect your DID Wallet to become the owner of this Node',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your account is connected to this Node',\n },\n verify: {\n title: 'Ownership Credential Required',\n scan: 'Connect your DID Wallet to provide ownership credentials',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your account is connected to this Node',\n },\n title: 'Setup Blocklet Server',\n steps: {\n eula: 'End User License Agreement',\n eulaFooter: 'I have read and agreed to the terms of the EULA',\n connect: 'Connect Owner DID Wallet',\n verify: 'Verify Ownership',\n basicSettings: 'Basic Settings',\n complete: 'Complete',\n },\n congratulation: 'Congratulations! Your Blocklet Server is secure and ready to use',\n redirectButton: 'Take me to Node Dashboard!',\n form: {\n submit: 'Complete Setup',\n title: 'Setup Name and description of the Node',\n },\n },\n login: {\n loginTo: 'Login to',\n description: 'Only node owner and approved members can access the dashboard',\n dialog: {\n title: 'Login Required',\n scan: 'Connect your DID Wallet and provide profile',\n confirm: 'Confirm on your DID Wallet',\n success: 'You are logged in successfully',\n },\n },\n lostPassport: {\n title: 'Lost Passport?',\n },\n sidebar: {\n dashboard: 'Dashboard',\n blocklets: 'Blocklets',\n console: 'Console',\n settings: 'Settings',\n },\n system: {\n total: 'Total',\n used: 'Used',\n free: 'Free',\n cores: 'Number of cores',\n },\n common: {\n about: 'About',\n abtnode: 'Blocklet Server',\n accessKey: 'Access Keys',\n action: 'Action',\n actions: 'Actions',\n add: 'Add',\n address: 'Address',\n allow: 'Allow',\n alreadyExist: 'already exists',\n approve: 'Approve',\n approved: 'approved',\n author: 'Author',\n avatar: 'Avatar',\n back: 'Back',\n basic: 'Basic',\n basicInfo: 'Basic Information',\n bind: 'Bind',\n blocklet: 'Blocklet',\n blocklets: 'Blocklets',\n blockletsStorage: 'Blocklets Storage',\n cacheStorage: 'Cache Storage',\n cancel: 'Cancel',\n certificate: 'certificate',\n click: 'Click to copy',\n close: 'Close',\n collapseAll: 'Collapse All',\n community: 'Community',\n complete: 'Complete',\n componentBasicInfo: 'Component Basic Information',\n components: 'Components',\n config: 'Configure',\n configuration: 'Configuration',\n configSuccess: 'Config successfully',\n confirm: 'Confirm',\n console: 'Console',\n continueWith: 'Continue With',\n copiedTip: 'Copied',\n copyTip: 'Click To Copy',\n coreStorage: 'Core Storage',\n cpu: 'CPU',\n create: 'Create',\n createSuccess: 'Create Access Key',\n created: 'Created At',\n createdAt: 'Created At',\n dAddress: 'Decentralized Identifiers (DID)',\n dataStorage: 'Data Storage',\n delConfirm: 'Delete',\n delConfirmDescription: 'Confirm delete?',\n delete: 'Delete',\n description: 'Description',\n detail: 'Detail',\n did: 'DID',\n disk: 'Disk',\n diskInfo: 'Disk Info',\n docker: 'IS Docker',\n documentation: 'Documentation',\n domain: 'Domain',\n downgradeTo: 'Downgrade to',\n download: 'Download',\n downloading: 'Downloading',\n edit: 'Edit',\n email: 'Email',\n empty: 'Empty',\n emptyData: 'No results found',\n enable: 'Enable',\n engine: 'Engine',\n env: 'Environment',\n expandAll: 'Expand All',\n expires: 'Expires',\n externalIp: 'External IP',\n failed: 'failed',\n fingerprint: 'Fingerprint',\n finish: 'Finish',\n forbid: 'Forbid',\n free: 'Free',\n gitpod: 'IS Gitpod',\n goEULA: 'Click to view \"End User License Agreement\"',\n group: 'Group',\n image: 'IS Image',\n install: 'Install',\n installed: 'Installed',\n installedAt: 'Installed At',\n installing: 'Installing',\n internalIp: 'Internal IP',\n invite: 'Invite',\n inviting: 'Inviting',\n ip: 'IP',\n isPublic: 'Public',\n issue: 'Issue',\n issuer: 'Issuer',\n item: 'Item',\n joined: 'Joined',\n key: 'Key',\n lastPublishedAt: 'Published At',\n launcherInfo: 'ABT Launcher Information',\n leavePageTip: 'Are you sure to leave the page?',\n loading: 'loading',\n log: 'View Logs',\n logStorage: 'Log Storage',\n login: 'Login',\n logo: 'Logo',\n logout: 'Logout',\n manageTeam: 'Manage Team',\n marketplace: 'Marketplace',\n member: 'Member',\n members: 'Members',\n memory: 'Memory',\n meta: 'Meta Data',\n monitor: 'Monitor',\n more: 'More',\n name: 'Name',\n next: 'Next',\n no: 'No',\n noData: 'No records to display',\n notice: 'Unexpected bad things will happen if you don’t read this!',\n noticeTitle: 'Notice',\n open: 'Open',\n management: 'Management',\n os: 'Operating System',\n overview: 'Overview',\n page404: '404 Page',\n passport: 'Passport',\n permission: 'Permission',\n port: 'Port',\n pre: 'Previous',\n protected: 'Protected',\n protocol: 'Protocol',\n published: 'published',\n purchase: 'Purchase',\n redirect: 'Redirect',\n redirectCode: 'Redirect Code',\n redirectPermanently: 'Permanent Redirect',\n redirectTemporary: 'Temporary Redirect',\n redirectUrl: 'Redirect URL',\n reject: 'Reject',\n reload: 'Reload',\n remark: 'Remark',\n remove: 'Remove',\n repository: 'Repository',\n requiredErrorText: '{name} is required',\n resource: 'Resource',\n restart: 'Restart',\n retry: 'Retry',\n revoke: 'Revoke',\n role: 'Role',\n running: 'running',\n runtimeInfo: 'Runtime Info',\n save: 'Save',\n saveChanges: 'Save Changes',\n saveSuccess: 'Saved successfully',\n scheduleFailed: 'schedule failed',\n scheduleSuccess: 'successfully scheduled',\n search: 'Search',\n setting: 'Settings',\n start: 'Start',\n status: 'Status',\n stop: 'Stop',\n storage: 'Storage',\n store: 'Store',\n success: 'success',\n support: 'Support',\n team: 'Team',\n the: 'The',\n title: 'Title',\n type: 'Type',\n unavailable: 'Unavailable',\n update: 'Update',\n updateAvailable: 'New version {version} available',\n updatedAt: 'Updated At',\n upgrade: 'Upgrade',\n upgradeTo: 'Upgrade to',\n upgrading: 'Upgrading',\n uptime: 'Uptime',\n url: 'URL',\n valid: 'Valid',\n value: 'Value',\n version: 'Version',\n visit: 'Visit',\n waiting: 'Waiting',\n webhook: 'Integrations',\n yes: 'Yes',\n invalidParam: 'Invalid Params',\n launch: 'Launch',\n price: 'Price',\n redirecting: 'redirecting',\n },\n blocklet: {\n installFromMarket: 'Install New Blocklets',\n installFromUrl: 'Install From Url',\n installedAt: 'Installed At',\n startedAt: 'Started At',\n stoppedAt: 'Stopped At',\n urlEmptyTip: 'No Access URL, ',\n goToAddRule: 'Go To Add',\n services: 'Exposed Services',\n upstreamPort: 'Upstream Port',\n noService: 'No Services',\n appDid: 'App DID',\n reloadSuccess: 'Blocklet was reloaded successfully',\n statusTip: 'Blocklet is {status}',\n fromUrl: {\n title: 'Install Blocklet',\n label: 'Blocklet Meta URL',\n description: 'The URL should point to the meta file of the blocklet',\n confirm: 'Install',\n step0: 'Input URL',\n step1: 'Confirm Meta Info',\n existTipPrefix: 'Blocklet with the same DID already exists, the version is',\n existTipSuffix: ', Please install a higher version.',\n },\n index: {\n stopDescription:\n 'Stopping the blocklet will make its public interfaces unaccessible, which may cause end user failures',\n confirmStop: 'Yes, Stop It',\n cancelDownloadDescription: 'Cancel download {name} ?',\n removeDescription:\n 'Removing the blocklet will erase code and data generated by this blocklet, which is not recoverable if you do not have any backups',\n deleteRoutingRuleDescription:\n 'Regardless of whether the backup data is saved or not, after removing the cornerstone blocklet, the associated URL Mapping rules will be removed',\n removeKeepData: 'Keep data for this blocklet, only remove code',\n removeComplete: 'Remove both code and data for this blocklet',\n confirmRemove: 'Yes, Remove It',\n tableTitle: 'Manage Your Blocklets',\n noBlocklet: 'No blocklets found in this Blocklet Server, install a blocklet from market place to start.',\n upgradeDescription: 'Upgrading the blocklet will make it temporarily unavailable, are you sure to continue?',\n confirmUpgrade: 'Yes, Upgrade It',\n confirmRestart: 'Yes, Restart It',\n restartDescription:\n 'Restarting the blocklet will temporarily suspended and may not start because of a configuration change',\n },\n admin: {\n iframeTitle: 'Blocklet Admin Interface',\n title: 'Admin Interface',\n noContent: 'This blocklet does not have a admin interface',\n securityError: 'SecurityError: Can not open the admin url from accessing a cross-origin frame',\n },\n config: {\n iframeTitle: 'Blocklet Config Interface',\n noContent: 'This blocklet does not have a config interface',\n securityError: 'SecurityError: Can not open the config url from accessing a cross-origin frame',\n title: 'Config Interface',\n disabledText: 'Please edit environment variables in \".env\" file or \"blocklet.yml\" file',\n user: {\n title: 'User Configuration',\n configurationKey: 'Configuration key',\n configurationValue: 'Configuration value',\n keyValueRequired: 'Configuration key and value must be specified',\n invalidKey: 'Configuration key must not start with BLOCKLET_',\n deleteForbidden: 'This configuration is required and should not be deleted',\n missingRequired: 'Missing required configuration to start the blocklet',\n gotoFix: 'Go to fix',\n hideValue: 'Hide Value',\n showValue: 'Show Value',\n tip: 'Configurations prefixed with BWA_ should not contain sensitive information because they will be sent to the browser',\n },\n blocklet: {\n title: 'Blocklet Configuration',\n name: 'Application name that can be displayed in frontend and DID Wallet',\n description: 'Application description that can be displayed in frontend and DID Wallet',\n sk: 'Secret key for the application wallet',\n clusterSize: 'Instance count when run this blocklet in cluster mode',\n walletType: 'Blocklet instance wallet type, will change the derived DID',\n },\n component: {\n title: 'Component Configuration',\n description: 'The component configuration will be overwritten by the user configuration if duplicated.',\n },\n system: {\n title: 'System Configuration',\n },\n },\n overview: {\n source: 'Source',\n deployedFrom: 'Deployed From',\n },\n diskInfo: {\n empty: 'Disk info not available now!',\n appDir: 'App Directory',\n dataDir: 'Data Directory',\n logDir: 'Log Directory',\n cacheDir: 'Cache Directory',\n },\n runtimeInfo: {\n noRunning: 'Runtime information will be available when blocklet is running!',\n memoryUsage: 'Memory Usage',\n cpuUsage: 'CPU Usage',\n uptime: 'Uptime',\n port: 'Port',\n processId: 'Process ID',\n },\n dist: {\n downloadLink: 'Download Link',\n verify: 'Verify',\n },\n status: {\n added: 'Added',\n waiting: 'Waiting',\n downloading: 'Downloading',\n installing: 'Installing',\n upgrading: 'Upgrading',\n installed: 'Installed',\n starting: 'Starting',\n running: 'Running',\n stopping: 'Stopping',\n stopped: 'Stopped',\n error: 'Error',\n corrupted: 'Corrupted',\n purchasing: 'Waiting for purchase',\n purchased: 'Purchased',\n verifying: 'Verifying purchase',\n },\n list: {\n download: 'Download',\n star: 'Star',\n },\n component: {\n checkUpdateTitle: 'Check for Updates',\n updateTitle: 'Update Components',\n noUpdate: 'No components to update',\n },\n router: {\n urlPath: 'URL Path',\n noRunning: 'The blocklet is not currently started. Unable to access through the following address!',\n securitySetting: 'Security Setting',\n },\n },\n dashboard: {\n nodeDid: 'Node',\n ownerDid: 'Owner',\n },\n store: {\n nameSort: 'Name',\n popularSort: 'Popularity',\n headerDescription: 'Find and Install Your Blocklets',\n detail: {\n purchase: 'Purchase {name}',\n open: 'Open {name}',\n install: 'Install {name}',\n upgrade: 'Upgrade {name}',\n },\n blockletRegistry: {\n changeFailed: 'Change Blocklet Store Failed: ',\n addFailed: 'Add Blocklet Store Failed: ',\n editFailed: 'Edit Blocklet Store Failed: ',\n switchRegistry: 'Switch Blocklet Store',\n addRegistry: 'Add Blocklet Store',\n editRegistry: 'Edit Blocklet Store',\n deleteRegistry: 'Delete Blocklet Store',\n haveSameRegistry: 'The same blocklet store exists',\n registryName: 'Blocklet Store Name',\n registryUrl: 'Blocklet Store URL',\n registryNameEmpty: 'Blocklet Store name cannot be empty',\n registryUrlEmpty: 'Blocklet store url cannot be empty',\n deleteDesc: 'Confirm Delete blocklet store {name}?',\n confirmDesc: 'Please input {name} to delete',\n },\n purchase: {\n title: 'Purchase Blocklet',\n confirmed: 'Your blocklet purchase NFT is verified',\n declined: 'You do not provided valid the blocklet purchase NFT',\n waiting: 'Waiting for purchase complete...',\n purchase: {\n title: 'Purchase Now',\n description: 'Pay some token before installing this blocklet if you have not purchased this blocklet',\n },\n verify: {\n title: 'Verify Purchase',\n description:\n 'Your NFT will be verified before installing this blocklet if you have purchased and hold the purchase NFT in your DID Wallet',\n },\n auth: {\n title: 'Purchase Credential Required',\n scan: 'Connect DID Wallet to provide blocklet purchase NFT',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your purchase NFT is verified, and installing has started',\n },\n },\n },\n setting: {\n saveSuccess: 'Settings Saved Successfully',\n unSavedTip: 'There are unsaved changes, please click \"Save Changes\" to save them.',\n unSavedLeaveTip: 'There are unsaved changes, are you sure to leave the page?',\n form: {\n name: 'Name Your Node',\n nameRequired: 'Node description is required',\n namePlaceholder: 'Node Name',\n description: 'Describe Your Node',\n descriptionHolder: 'Node Description',\n descriptionRequired: 'Node description is required',\n domain: 'Your Node Domain Name',\n domainPlaceholder: 'Node Domain Name',\n domainRequired: 'Node domain is required',\n ipPlaceholder: 'IP',\n ipRequired: 'IP is required',\n registry: 'Blocklet Store',\n registryPlaceholder: 'Blocklet store to fetch blocklets',\n registryRequired: 'Blocklet store is required ',\n webWalletUrl: 'Where is your DID Wallet web version hosted',\n webWalletUrlPlaceholder:\n 'Please input the URL of your hosted \"DID Wallet Web\" blocklet, you can use the official one safely',\n enableWelcomePage: 'Enable welcome page',\n welcome: {\n desc: 'Enable welcome page',\n enabled: 'Enabled',\n disabled: 'Disabled',\n },\n upgrade: {\n title: 'Upgrade Blocklet Server to v{version}',\n description:\n 'During the upgrade, your Blocklet Server will enter maintenance mode for a few minutes while the update is completed.',\n dialog:\n 'Click on \"confirm\" to install the update. Blocklet Server will enter maintenance mode until the update is completed and return to production mode automatically.',\n confirm: 'Upgrade',\n toggle: 'Check for updates automatically',\n enabled: 'Auto Update Check Enabled',\n disabled: 'Auto Update Check Disabled',\n setup: 'Preparing the update',\n installing: 'Install Blocklet Server v{version}',\n restarting: 'Restarting Blocklet Server',\n cleanup: 'Doing some cleanup',\n complete: 'Upgrade complete!',\n progress: 'Upgrading Blocklet Server to v{version}',\n check: 'Check for Updates',\n latest: 'You are running the latest version.',\n },\n monitor: {\n diskThreshold: 'Send alert when disk usage exceeds (%)',\n diskThresholdPlaceholder: 'Please set the disk usage alert threshold',\n },\n },\n accessKey: {\n accessKeyId: 'ACCESS KEY',\n lastUsed: 'Last Used At',\n tip: 'Please enter a name for this access key for future reference:',\n saveSecretTip:\n 'This is the only time that your Access Secret key can be viewed and cannot be recovered. However, you can create new access keys at any time',\n iKnow: 'I have copied and saved the Access Secret',\n showSecret: 'Show Secret Access Key',\n hideSecret: 'Hide Secret',\n title: 'Delete Access Key',\n descriptionNoTime:\n 'This will permanently delete the access key {key} with name {name}, which is (never used before)',\n description:\n 'This will permanently delete access key {key} with name {name}, which is (last used on {time}, {timeAge})',\n confirm_desc: 'Please input {name} to delete',\n remark: 'Access Key Name',\n remarkInvalid: 'Access Key Name is required',\n },\n webhook: {\n add: 'Add Integration',\n delTitle: 'Delete Integration',\n requiredError: 'Please provide a valid {type}',\n confirm_desc: 'Please input {name} to delete',\n test: 'Test',\n description: 'This will permanently delete integration with ID {id}',\n columns: {\n description: 'ID',\n params: 'Params',\n createdAt: 'createdAt',\n },\n },\n },\n notification: {\n title: 'Activities',\n empty: 'No activities yet',\n viewAll: 'View All',\n showRead: 'Show Read',\n markAllAsRead: 'Mark All as Read',\n markAsRead: 'Mark As Read',\n },\n router: {\n routerSetting: 'Domains & URLs',\n certSetting: 'SSL Certificates',\n defaultSite: 'Default',\n urlHelperText: 'URL that do not start with HTTP/HTTPS are considered relative paths',\n\n empty: 'Click on Actions to setup URL Mapping',\n\n healthy: {\n ok: 'Blocklet or service is running',\n error: 'Blocklet or service is not running or not installed',\n },\n\n service: {\n select: 'Select Blocklet Services (Optional)',\n what: 'Blocklet Services are pipelines executed against the request before redirecting to upstream blocklet',\n },\n\n nonProvider: {\n title: 'Engine Change Warning',\n description:\n 'If you change engine to none, your current page may not work properly because the previous engine will be stopped, are you sure to continue?',\n confirm: 'I understand, continue',\n },\n\n validation: {\n urlRequired: 'URL is required',\n redirectCodeRequired: 'Redirect code is required',\n didRequired: 'Blocklet is required',\n pathPrefixTooLong: 'The URL Prefix cannot exceed {length} characters',\n pathPrefixCannotBeEmpty: 'The URL Prefix cannot be empty',\n domainRequired: 'Node domain is required',\n invalidUrl: 'Please provide a valid URL',\n pathPrefixRequired: 'URL prefix is required',\n redirectUrlRequired: 'Redirect URL is required',\n },\n\n domain: {\n validate: {\n emptyTip: 'Site domain cannot be empty',\n suffixTip: 'Site domain cannot include {suffix}',\n },\n add: {\n title: 'Add Site',\n description: 'Please provide a valid site name address',\n confirm: 'Add',\n cancel: 'Cancel',\n blocklet: 'Select the blocklet to handle the traffic',\n redirect: 'Where to redirect the traffic?',\n port: 'What port does your request handler need to listen to?',\n portTip: 'This defaults to the main port of request handler, you can customize this',\n type: 'Traffic Handler',\n },\n update: {\n title: 'Update Site Domain',\n label: 'Site Domain',\n description: 'Please provide a valid site domain',\n },\n verify: {\n ok: 'This site is resolved',\n notResolved: 'This site neither resolved nor accessible, please check your DNS configuration',\n },\n https: {\n ok: 'This domain has https enabled',\n bad: 'This domain has not enabled https',\n },\n delete: {\n title: 'Delete Site',\n description:\n 'By confirming, you will delete your existing \"{name}\" site. Type \"{name}\" below and select Delete to complete the change, or select Cancel if you want to leave your site',\n confirm_desc: 'Please input {name} to confirm',\n },\n },\n\n domainAlias: {\n add: {\n title: 'Add Additional Domain',\n domainDescription: 'Please provide a valid domain name',\n },\n delete: {\n title: 'Delete',\n description: 'After removing a domain alias, access to that alias may not be handled properly.',\n },\n },\n\n domainSecurity: {\n title: 'Update Domain Security',\n cors: {\n title: 'Allowed CORS Domains',\n description:\n 'Domain list that can send cross origin requests to {name}, comma separated, use \"*\" to allow anyone, which is not recommended',\n domainInvalid: 'Please input a valid list of domain names',\n },\n },\n\n rule: {\n add: {\n title: 'Add URL Mapping',\n confirm: 'Add',\n pathPrefix: \"What's the URL Prefix?\",\n pathPrefixTip:\n \"If you set prefix to '/my-prefix', then all requests that begins with that prefix will be routed to the configured blocklet\",\n blocklet: 'Which Blocklet will be handling those requests?',\n port: 'Which port of the blocklet will be handling requests?',\n portTip:\n 'This defaults to the main port of blocklet, if your blocklet listens on multiple ports, you can customize this',\n },\n delete: {\n title: 'Delete URL Mapping',\n description:\n 'By confirming, you will delete your existing \"{name}\" URL Mapping. Type \"{name}\" below and select Delete to complete the change, or select Cancel if you want to leave your URL Mapping.',\n confirm_desc: 'Please input {name} to delete',\n cancel: 'Cancel',\n },\n update: {\n title: 'Update URL Mapping',\n confirm: 'Yes, Update',\n cancel: 'Cancel',\n },\n },\n\n cert: {\n name: 'Certificate Name',\n domain: 'Domain Name',\n action: 'Action',\n commonName: 'Common Name',\n boundDomains: 'Bound Domain Names',\n expired: 'Expired',\n leftDays: ' days left',\n issuedOn: 'Issued On',\n expiryOn: 'Expiry On',\n fingerprintAlg: 'Fingerprint Algorithm',\n validityPeriod: 'Validity Period',\n matchedSites: 'Matched Sites',\n setPublic: 'Set Public',\n setPublicCertHelperText: 'If set to public the certificate can be downloaded publicly',\n publicCertHelperText: 'Public certificates can be downloaded',\n nonPublicCertHelperText: 'Non-public certificates cannot be downloaded',\n protectedCertHelperText: 'Protected certificates cannot be edited',\n unprotectedCertHelperText: 'Unprotected certificates can be edited',\n\n table: {\n nodata: 'No data',\n },\n delete: {\n title: 'Delete SSL Certificate',\n description: 'Confirm delete?',\n confirm: 'Confirm',\n },\n nginx: {\n title: 'Update SSL Certificate',\n titleAdd: 'Add SSL Certificate',\n pem: 'SSL Certificate File',\n pemTip: 'Please drop your server certificate file here, it should ends with \".pem\" or \".crt\"',\n key: 'Private Key File',\n keyTip: 'Please drop your server private key file here, it should ends with \".pem\" or \".key\"',\n confirm: 'Save',\n cancel: 'Cancel',\n invalidFile: 'You have selected an invalid file',\n empty: 'No file selected yet',\n },\n detail: {\n title: 'SSL Certificate Details',\n },\n },\n },\n noMatch: {\n desc: \"We can't find the page that you're looking for\",\n },\n health: {\n connectionErrorTip:\n \"Blocklet Server can't connect to the network, please check if Blocklet Server has been stopped or there is a network issue\",\n connectionRecoveryTip: 'Blocklet Server connectivity has been recovered',\n connectionStoppedTip: 'Blocklet Server has been stopped',\n wrongAccessUrlTip: 'Blocklet Server access address is wrong, please use the correct access address',\n },\n debug: {\n title: 'Your Blocklet Server is up and running!',\n },\n team: {\n invite: 'Invite New',\n add: 'Add New',\n member: {\n name: 'Name',\n passport: 'Passport',\n passports: 'Passports',\n lastLogin: 'Last Login',\n filter: 'Filter by',\n forbidLogin: 'Forbid Login',\n forbidLoginDescription: 'The user will not be able to connect to this application',\n allowLogin: 'Allow Login',\n allowLoginDescription: 'The user will be able to connect to this application',\n updateRole: 'Update Role',\n deleteUser: 'Delete User',\n deleteUserDescription: 'Confirm delete user \"{name}\"?',\n revokePassport: 'Revoke Passport',\n revokePassportDescription:\n 'Once the passport is revoked, the passport holder can not use it to login again, are you sure to continue?',\n enablePassport: 'Enable Passport',\n enablePassportDescription:\n 'Once the revoked passport is enabled again, the passport holder can use it to login again, are you sure to continue?',\n passportPermissionTitle: 'The passport has the following permissions:',\n search: 'Search Member',\n inviteDialog: {\n createInviteLink: 'Generate Invitation Link',\n createSuccessTip:\n 'The invitation link is successfully created, click to copy and send the link to the invited member, please note that this invitation link can not be reused and will expire on {expireDate}',\n },\n error: {\n passportEmpty: 'Passport should not be empty',\n },\n },\n permission: {\n create: {\n title: 'Create Permission',\n description: \"Format: <action>_<resource>\\n e.g. 'query_user', 'mutate_user'\",\n },\n delete: {\n title: 'Delete Permission',\n description: 'Confirm delete {name}?',\n },\n error: {\n actionEmpty: 'action cannot be empty',\n resourceEmpty: 'resource cannot be empty',\n permissionTooLong: 'permission cannot exceed {length} characters',\n descriptionTooLong: 'description cannot exceed {length} characters',\n },\n },\n passport: {\n create: {\n title: 'Create Passport',\n titleTip: 'Title cannot be modified after created',\n },\n bind: {\n title: 'Bind Permission',\n roleTip: 'You will get all the permissions of the selected passport after binding',\n permissionTip: 'You will get the selected permissions after binding',\n transferLeftTitle: 'All permissions',\n transferRightTitle: 'Granted permissions',\n },\n delete: {\n title: 'Delete Passport',\n description:\n 'The passports holds by user will lose all permissions after it is deleted. Are you sure to continue?',\n },\n error: {\n titleEmpty: 'title cannot be empty',\n titleTooLong: 'title cannot exceed {length} characters',\n descriptionEmpty: 'description cannot be empty',\n },\n issuance: {\n pending: 'Pending',\n create: {\n title: 'Generate Link',\n },\n delete: {\n title: 'Delete Receive Link',\n description: 'Confirm delete {link}?',\n },\n },\n issue: 'Issue Passport',\n disableIssuance: 'Disable Passport Issuance',\n enableIssuance: 'Enable Passport Issuance',\n disableIssuanceTip: '\"Issue Passport\", \"Invite Member\" and other operations will be disabled',\n enableIssuanceTip: '\"Issue Passport\", \"Invite Member\" and other operations will be enabled',\n trustedPassportIssuers: 'Trusted Passport Issuers',\n trustedIssuers: 'Trusted Issuers',\n externalPassport: 'External Passport',\n notTrustedIssuerTip: 'The passport cannot be used because the issuer is not on the list of trusted issuers',\n issuerDid: 'Issuer DID',\n addNodeToTrustedIssuers: 'Add current node as a trusted passport issuer',\n revoked: 'Revoked',\n noPermission: 'No permission to perform this operation',\n shouldNotDeleteCurrent: 'You can not revoke your passport currently in use',\n mappingRule: 'Mapping rule',\n defaultRule: 'Default rule',\n search: 'Search Passport',\n searchIssuerDid: 'Search Issuer DID',\n issueBy: 'Issue by {name}',\n },\n inviting: {\n link: 'Invite Link',\n inviter: 'Inviter',\n delete: {\n title: 'Delete Invite Link',\n description: 'Confirm delete {link}?',\n },\n disabledTip: 'Invitation is not enabled',\n },\n },\n launcherInfo: {\n cloudService: 'Cloud Service Provider',\n adminUrl: 'Launcher Admin',\n },\n session: {\n forbidLogin: 'You have been blocked from logging in',\n },\n launchBlocklet: {\n appInfo: 'Application Information',\n appInfoDesc: 'Confirm the application information',\n author: 'Application Author: {author}',\n complete: 'Complete',\n alreadyExists: 'This Blocklet already exists, please visit',\n selectAbtNode: 'Select Blocklet Server',\n purchased: 'Already Purchased',\n purchase: 'Purchase',\n nextStep: 'Next Step',\n agreement: 'License Agreement',\n agreeAll: 'Agree All',\n install: 'Install',\n installing: 'Installing',\n launchSuccess: '\"{appName}\" is successfully launched!',\n installSuccess: '\"{appName}\" is installed successfully! But requires some configuration to start.',\n title: 'Install',\n installWithAppName: 'Install {name}',\n openInRegistry: 'Open in Blocklet Store',\n subTitle: 'Prepare to install {appName} on Blocklet Server',\n access: 'Open the application',\n viewApplication: 'View Application',\n newVersion: 'New Version',\n newVersionDesc: 'The application already exists, but the current version can be upgraded',\n upgradeNow: 'Upgrade Now',\n later: 'Later',\n abtnodeLicenseName: 'Blocklet Server License',\n appLicenseName: 'Application License',\n purchaseApp: 'Purchase Application',\n authDialog: {\n title: 'Authorization Required',\n freeDescription:\n 'You need to present Blocklet Server Ownership NFT or Blocklet Server Passport to launch application',\n nonFreeDescription: 'You need to present application purchase NFT and Blocklet Server NFT to launch application',\n confirm: 'Confirm on your DID Wallet',\n success: 'Authorization Successfully',\n },\n error: {\n loadMetaFailed: 'Load application information failed',\n appMetaNotFound: 'No information found for this application',\n downloadFailed: 'Failed to download the application, please try again',\n installFailed: 'Failed to install the application, please try again',\n startFailed: 'Failed to start the application, please try again',\n launchFailed: 'Failed to launch the application, please try again',\n installedButStopped: 'The application already installed, but it is not running',\n installedButError: 'The application already installed, but it runs with an error',\n upgradeFailed: 'Upgrade Failed',\n },\n },\n});\n","const flat = require('flat');\n\nmodule.exports = flat({\n setup: {\n connect: {\n title: '扫码签名',\n scan: '用你的 DID 钱包扫描下面的二维码从而成为本节点的所有者',\n confirm: '请在 DID 钱包上确认',\n success: '你已经成功成为节点的所有者',\n },\n verify: {\n title: '需要节点所有权证书',\n scan: '用你的 DID 钱包扫描下面的二维码以提供所有权证书',\n confirm: '请在 DID 钱包上确认',\n success: '你已经成功成为节点的所有者',\n },\n title: '设置 Blocklet Server',\n steps: {\n eula: '最终用户许可协议',\n eulaFooter: '我已阅读并同意最终用户许可协议的条款',\n connect: '链接所有者的 DID 钱包',\n verify: '验证所有权',\n basicSettings: '基础设置',\n complete: '完成',\n },\n congratulation: '恭喜, 您的 Blocklet Server 安全可用!',\n redirectButton: '查看节点仪表盘',\n form: {\n submit: '完成设置',\n title: '设置节点的名称和描述信息',\n },\n },\n login: {\n loginTo: '登录',\n description: '只有节点的所有者和 approved 成员可以访问仪表盘',\n dialog: {\n title: '请登录',\n scan: '用您的 DID 钱包扫描下面的二维码',\n confirm: '在您的 DID 钱包上确认',\n success: '登录成功',\n },\n },\n lostPassport: {\n title: '找回通行证?',\n },\n sidebar: {\n dashboard: '仪表盘',\n blocklets: '基石程序',\n console: '试验台',\n settings: '设置',\n },\n system: {\n total: '总计',\n used: '已使用',\n free: '空闲',\n cores: '核数',\n },\n common: {\n about: '关于',\n abtnode: 'Blocklet Server',\n accessKey: '访问秘钥',\n action: '操作',\n actions: '操作',\n add: '添加',\n address: '地址',\n allow: '允许',\n alreadyExist: '已经存在',\n approve: '同意',\n approved: 'Approved',\n author: '作者',\n avatar: '头像',\n back: '返回',\n basic: '基础',\n basicInfo: '基础信息',\n bind: '绑定',\n blocklet: '基石程序',\n blocklets: '基石程序',\n blockletsStorage: '基石程序存储',\n cacheStorage: '缓存存储',\n cancel: '取消',\n certificate: '证书',\n click: '点击复制',\n close: '关闭',\n collapseAll: '收起全部',\n community: '社区地址',\n complete: '完成',\n componentBasicInfo: '组件基础信息',\n components: '组件',\n config: '配置',\n configuration: '配置',\n configSuccess: '设置成功',\n confirm: '确认',\n console: '控制台',\n continueWith: '确认继续',\n copiedTip: '已复制',\n copyTip: '点击复制',\n coreStorage: '核心存储',\n cpu: 'CPU',\n create: '创建',\n createSuccess: '创建成功',\n created: '创建于',\n createdAt: '创建时间',\n dAddress: '去中心化地址(DID)',\n dataStorage: '数据存储',\n delConfirm: '删除',\n delConfirmDescription: '确认删除?',\n delete: '删除',\n description: '描述',\n detail: '详情',\n did: 'DID',\n disabled: '已禁用',\n disk: '磁盘',\n diskInfo: '磁盘信息',\n docker: 'Docker?',\n documentation: '文档手册',\n domain: '域名',\n downgradeTo: '降级到',\n download: '下载',\n downloading: '下载中',\n edit: '编辑',\n email: '邮箱',\n empty: '暂无',\n emptyData: '未找到结果',\n enable: '启用',\n enabled: '已启用',\n engine: '引擎',\n env: '环境',\n environment: '环境变量',\n expandAll: '展开全部',\n expires: '过期时间',\n externalIp: '公网 IP',\n failed: '失败',\n fingerprint: '指纹',\n finish: '完成',\n forbid: '禁止',\n free: '免费',\n gitpod: 'Gitpod?',\n goEULA: '点击查看\"最终用户许可协议\"',\n group: '分组',\n image: '镜像内?',\n install: '安装',\n installed: '已安装',\n installedAt: '安装时间',\n installing: '安装中',\n internalIp: '内网 IP',\n invite: '邀请',\n inviting: '邀请中',\n ip: 'IP',\n isPublic: '公开',\n issue: '颁发',\n issuer: '颁发者',\n item: '项',\n joined: '已加入',\n key: '键',\n lastPublishedAt: '发布时间',\n launcherInfo: 'Blocklet Launcher 信息',\n leavePageTip: '是否确定离开当前页面?',\n loading: '加载中',\n log: '查看日志',\n logStorage: '日志存储',\n login: '登录',\n logo: '图标',\n logout: '退出',\n manageTeam: '管理团队',\n marketplace: '市场',\n member: '成员',\n members: '成员',\n memory: '内存',\n meta: '元数据',\n monitor: '监控',\n more: '更多',\n name: '名称',\n next: '下一步',\n no: '否',\n noData: '暂无数据',\n notice: '请确认下面的信息',\n noticeTitle: '提示',\n open: '打开',\n management: '管理',\n os: '操作系统',\n overview: '概览',\n page404: '404 页面',\n passport: '通行证',\n permission: '权限',\n port: '端口',\n pre: '上一步',\n protected: '受保护',\n protocol: '协议',\n published: '发布于',\n purchase: '购买',\n redirect: '重定向',\n redirectCode: '重定向状态码',\n redirectPermanently: '永久重定向',\n redirectTemporary: '临时重定向',\n redirectUrl: '重定向 URL',\n reject: '拒绝',\n reload: '优雅重启',\n remark: '备注',\n remove: '删除',\n repository: '仓库地址',\n requiredErrorText: '{name}是必填的',\n resource: '资源',\n restart: '重启',\n retry: '重试',\n revoke: '撤销',\n role: '角色',\n running: '运行中',\n runtimeInfo: '运行信息',\n save: '保存',\n saveChanges: '保存',\n saveSuccess: '保存成功',\n scheduleFailed: '加入任务队列失败',\n scheduleSuccess: '成功加入任务队列',\n search: '搜索',\n setting: '设置',\n start: '启动',\n status: '状态',\n stop: '停止',\n storage: '存储',\n store: '商店',\n success: '成功',\n support: '服务支持',\n team: '团队',\n the: '此',\n title: '名称',\n type: '类型',\n unavailable: '不可访问',\n update: '更新',\n updateAvailable: '可升级到新版本 v{version}',\n updatedAt: '更新时间',\n upgrade: '升级',\n upgradeTo: '升级到',\n upgrading: '升级中',\n uptime: '运行时长',\n url: 'URL',\n valid: '有效',\n value: '值',\n version: '版本号',\n visit: '访问',\n waiting: '等待中',\n webhook: '应用集成',\n yes: '是',\n invalidParam: '无效的参数',\n launch: '启动',\n price: '价格',\n redirecting: '跳转中',\n },\n blocklet: {\n installFromMarket: '从应用商店安装',\n installFromUrl: '通过 URL 安装',\n installedAt: '安装时间',\n startedAt: '启动时间',\n stoppedAt: '停止时间',\n urlEmptyTip: '无访问地址,',\n goToAddRule: '立即添加',\n services: '暴露的服务',\n upstreamPort: '上游端口',\n noService: '暂无服务',\n appDid: '应用 DID',\n reloadSuccess: 'Blocklet 重启成功',\n statusTip: 'Blocklet {status}',\n fromUrl: {\n title: '安装 Blocklet',\n label: 'Blocklet Meta URL',\n description: 'URL 应指向 blocklet 的 meta 文件',\n confirm: '安装',\n step0: '输入 URL',\n step1: '确认 Meta 信息',\n existTipPrefix: '已存在相同 DID 的 Blocklet, 版本为',\n existTipSuffix: ',请安装更高版本。',\n },\n index: {\n stopDescription: '停止该基石程序将会使页面不可以访问,可能会导致使用它的用户出现错误',\n confirmStop: '是的, 停止',\n cancelDownloadDescription: '取消下载 {name} ?',\n removeDescription: '如果没有备份数据, 删除该基石程序将会删除所有数据, 包括基石程序运行时产生的所有数据',\n deleteRoutingRuleDescription: '无论是否保存备份数据,删除基石程序后,相关联的 URL 映射都会被删除',\n removeKeepData: '保留该基石程序的数据, 只删除基石程序',\n removeComplete: '删除基石程序和数据',\n confirmRemove: '是的, 删除',\n tableTitle: '管理已安装基石程序',\n noBlocklet: 'Blocklet Server 中还没有基石程序, 您可以从基石程序市场中安装.',\n upgradeDescription: '升级基石程序可能会导致其短暂不可用,是否要继续?',\n confirmUpgrade: '是的,升级吧',\n confirmRestart: '是的,重启吧',\n restartDescription: '服务会短暂暂停,并且有可能因为变更了配置无法启动',\n },\n admin: {\n iframeTitle: '基石程序管理界面',\n title: '管理界面',\n noContent: '该基石程序没有管理界面',\n securityError: '安全错误:无法从访问跨源框架中打开管理界面',\n },\n config: {\n iframeTitle: '基石程序配置界面',\n noContent: '该基石程序没有配置界面',\n securityError: '安全错误:无法从访问跨源框架中打开配置界面',\n title: '配置界面',\n disabledText: '请在 \".env\" 文件或 \"blocklet.yml\" 文件中编辑环境变量',\n user: {\n title: '用户配置',\n configurationKey: '配置键',\n configurationValue: '配置值',\n keyValueRequired: '键和值不能为空',\n invalidKey: '键不能以 BLOCKLET_ 开头',\n deleteForbidden: '该配置项是必填项,不能删除',\n missingRequired: '缺少启动 Blocklet 的必填项',\n gotoFix: '去修复',\n hideValue: '隐藏配置值',\n showValue: '显示配置值',\n tip: '包含 BWA_ 前缀的配置项不应该包含敏感信息,因为他们会被发送到前端页面',\n },\n component: {\n title: '组件配置',\n description: '当组件配置和用户配置重复时,组件配置将被覆盖',\n },\n blocklet: {\n title: '应用配置',\n name: '可以展示在 DID Wallet 和应用前端的应用名称',\n description: '可以展示在 DID Wallet 和应用前端的应用描述',\n sk: '应用账户的私钥,修改后 BLOCKLET_APP_ID 会自动更新',\n clusterSize: '以 Cluster 模式启动时的实例数量,建议和宿主机 CPU 核数相同',\n walletType: '应用钱包类型,会影响派生出来的 DID',\n },\n system: {\n title: '节点配置',\n },\n },\n overview: {\n source: '来源',\n deployedFrom: '部署源',\n },\n diskInfo: {\n empty: '无法获得磁盘信息',\n appDir: '应用目录',\n dataDir: '数据目录',\n logDir: '日志目录',\n cacheDir: '缓存目录',\n },\n runtimeInfo: {\n noRunning: '当 Blocklet 运行时才可以获得运行信息!',\n memoryUsage: '内存',\n cpuUsage: 'CPU',\n uptime: '启动时长',\n port: '端口',\n processId: '进程 ID',\n },\n dist: {\n downloadLink: '下载地址',\n verify: '校验信息',\n },\n status: {\n added: '已添加',\n waiting: '等待中',\n downloading: '下载中',\n installing: '安装中',\n upgrading: '升级中',\n installed: '已安装',\n starting: '启动中',\n running: '运行中',\n stopping: '停止中',\n stopped: '已停止',\n error: '错误',\n corrupted: '已损坏',\n purchased: '已购买',\n purchasing: '购买中...',\n verifying: '验证中...',\n },\n list: {\n download: '下载数',\n star: '收藏数',\n },\n component: {\n checkUpdateTitle: '检查更新',\n updateTitle: '更新组件',\n noUpdate: '没有需要更新的组件',\n },\n router: {\n urlPath: 'URL 路径',\n securitySetting: '安全设置',\n noRunning: 'Blocklet 当前未启动。无法通过以下地址访问!',\n },\n },\n dashboard: {\n nodeDid: '节点地址',\n ownerDid: '所有者地址',\n },\n store: {\n nameSort: '名称',\n popularSort: '下载量',\n headerDescription: '查找、安装基石程序',\n detail: {\n purchase: '购买 {name}',\n open: '打开 {name}',\n install: '安装 {name}',\n upgrade: '升级 {name}',\n },\n blockletRegistry: {\n changeFailed: '更改应用商店地址失败:',\n addFailed: '添加应用商店地址失败:',\n editFailed: '编辑应用商店地址失败:',\n switchRegistry: '选择应用商店地址',\n addRegistry: '添加应用商店地址',\n editRegistry: '编辑应用商店地址',\n deleteRegistry: '删除应用商店地址',\n haveSameRegistry: '存在相同的应用商店地址',\n registryName: '应用商店名称',\n registryUrl: '应用商店地址',\n registryNameEmpty: '应用商店名称不能为空',\n registryUrlEmpty: '应用商店地址不能为空',\n deleteDesc: '确认删除应用商店地址 {name}?',\n confirmDesc: '请输入 {name} 以确认删除',\n },\n purchase: {\n title: '购买 Blocklet',\n confirmed: '你的购买已经验证,安装中',\n declined: '你没有提供有效的购买凭证',\n waiting: '等待购买完成...',\n purchase: {\n title: '立即购买',\n description: '安装此 Blocklet 之前你需要支付一定数量的通证以完成购买',\n },\n verify: {\n title: '已经购买?',\n description: '如果你已经购买过此 Blocklet,提供购买凭证 NFT 即可完成安装',\n },\n auth: {\n title: '需要验证购买凭证',\n scan: '用你的 DID 钱包扫描下面的二维码以提供购买凭证',\n confirm: '请在 DID 钱包上确认',\n success: '你的购买凭证已经验证通过,Blocklet 正在安装中',\n },\n },\n },\n setting: {\n saveSuccess: '保存设置成功',\n unSavedTip: '有尚未保存的更改,请单击“保存”使更改生效。',\n unSavedLeaveTip: '有尚未保存的更改,是否确定离开当前页面?',\n form: {\n name: '节点命名',\n nameRequired: '名称不能为空',\n namePlaceholder: '节点名称',\n description: '节点描述',\n descriptionHolder: '节点描述',\n descriptionRequired: '节点描述不能为空',\n domain: '节点域名',\n domainPlaceholder: '节点域名',\n registry: '应用商店地址',\n registryPlaceholder: '用来拉取基石程序列表',\n registryRequired: '应用商店地址是必填的',\n webWalletUrl: 'Web 版 DID Wallet 地址',\n webWalletUrlPlaceholder: '你可以使用自己运行的 \"DID Wallet Web\" 版本, 也可以使用官方提供的版本',\n upgrade: {\n title: '升级 Blocklet Server 到 v{version}',\n description: '在升级期间,Blocklet Server 将会进入维护模式几分钟。',\n dialog: '点击 “确认” 安装更新。Blocklet Server 将进入维护模式,直到更新完成并自动返回生产模式。',\n confirm: '升级',\n toggle: '自动检查更新',\n enabled: '已启用自动更新检查',\n disabled: '已禁用自动更新检查',\n setup: '准备升级中',\n installing: '安装 Blocklet Server 新版本(v{version})',\n restarting: '重新启动 Blocklet Server',\n cleanup: '清理临时状态',\n complete: '升级完成!',\n progress: '正在升级 Blocklet Server 到 v{version}',\n check: '检查更新',\n latest: '太棒了,你的 Blocklet Server 已经是最新版!',\n },\n welcome: {\n desc: '开启 Welcome 页面',\n enabled: '已开启',\n disabled: '已关闭',\n },\n monitor: {\n diskThreshold: '当磁盘使用率超过(%)时发送报警',\n diskThresholdPlaceholder: '请设置磁盘使用率报警阈值',\n },\n },\n accessKey: {\n accessKeyId: 'Access Key',\n lastUsed: '最后使用',\n tip: '请给 Access Key 起个名字',\n saveSecretTip:\n '你的 Access Secret 只会展示一次,关闭次窗口后将无法再次查看,不过你可以随时重新创建新的 Access Key',\n iKnow: '我已复制保存好该 Access Secret',\n showSecret: '展示 Secret',\n hideSecret: '隐藏 Secret',\n title: '删除 Access Key',\n descriptionNoTime:\n '此操作无法撤消。这将永久删除备注为 {name} 并且 Id 为 {key} 的 Access Key (此 Access Key 之前没有被使用过) ',\n description:\n '此操作无法撤消。这将永久删除备注为 {name} 并且 Id 为 {key} 的 Access Key (最后的使用时间为 {time}, {timeAge})',\n confirm_desc: '请输入 {name} 以确认删除',\n remark: 'Access Key 名称',\n remarkInvalid: 'Access Key 名称不能为空',\n },\n webhook: {\n add: '添加应用集成',\n delTitle: '删除应用集成',\n requiredError: '请输入正确的 {type}',\n confirm_desc: '请输入 {name} 以确认删除',\n test: '测试',\n description: '此操作无法撤消。这将永久删除 ID 为 {id} 的应用集成',\n columns: {\n description: 'ID',\n params: '参数',\n createdAt: '创建时间',\n },\n },\n },\n notification: {\n title: '动态',\n empty: '没有动态',\n viewAll: '查看所有动态',\n showRead: '显示已读',\n markAllAsRead: '全部标记为已读',\n markAsRead: '标记为已读',\n },\n router: {\n routerSetting: '域名和网址',\n certSetting: 'SSL 证书',\n defaultSite: '默认',\n urlHelperText: '不以 HTTP/HTTPS 开头的 URL 将被认为是相对路径',\n\n empty: '点击 “添加 URL” 来增加映射',\n\n healthy: {\n ok: '基石程序运行中,可访问',\n error: '基石程序未安装或未运行中,无法访问',\n },\n\n service: {\n select: '选择和配置服务(可选)',\n what: '服务是把请求转交给基石程序前执行的逻辑,比如要求用户登录,检查权限等',\n },\n\n nonProvider: {\n title: '变更引擎警告',\n description:\n '如果你将引擎切换为 none,你当前访问的页面可能不再可用,因为它可能是由引擎来提供服务的,是否要继续?',\n confirm: '我知道风险,继续吧',\n },\n\n validation: {\n urlRequired: 'URL 是必填的',\n redirectCodeRequired: '重定向码是必选的',\n didRequired: 'Blocklet 是必选的',\n pathPrefixTooLong: '请求的前缀不能超过30个字符',\n pathPrefixCannotBeEmpty: '请求的前缀不能为空',\n domainRequired: '节点域名不能为空',\n invalidUrl: '请填写正确的 URL',\n pathPrefixRequired: 'URL 前缀是必填的',\n redirectUrlRequired: '重定向 URL 是必填的',\n },\n\n domain: {\n validate: {\n emptyTip: '站点域名不能为空',\n suffixTip: '站点域名不能包含 {suffix}',\n },\n add: {\n title: '添加站点',\n description: '请填写你所拥有的合法的站点地址',\n confirm: '添加',\n cancel: '取消',\n blocklet: '选择基石程序',\n redirect: '重定向到哪里?',\n port: '负责处理请求的服务监听在哪个端口?',\n portTip: '保持默认值就好,如果你想把请求转发到非默认端口,可以根据需要修改',\n type: '服务类型',\n },\n update: {\n title: '更新站点域名',\n label: '站点域名',\n description: '请填写你所拥有的合法的站点域名',\n },\n verify: {\n ok: '该站点解析正常',\n notResolved: '改站点解析异常,请检查你域名服务商的 DNS 配置',\n },\n https: {\n ok: '该域名已启用 HTTPS',\n bad: '该域名尚未启用 HTTPS',\n },\n delete: {\n title: '删除站点',\n description:\n '确认之后,你会删除掉 “{name}” 站点, 在下面输入“{name}”,选择删除按钮完成修改,或者选择取消按钮关闭当前弹窗。',\n confirm_desc: '请输入 {name} 以确认删除',\n },\n },\n\n domainAlias: {\n add: {\n title: '添加额外域名',\n domainDescription: '请填写有效的域名',\n },\n delete: {\n title: '删除',\n description: '删除别名将会删除域名别用该站点下的所有流量转发规则,是否继续?',\n },\n },\n\n domainSecurity: {\n title: '更新站点安全设置',\n cors: {\n title: 'CORS 域名白名单',\n description:\n '此白名单显示的声明可以往 {name} 发送跨域请求的域名, 多个域名用逗号分隔, 可以用 \"*\" 来允许任何域名(我们不推荐这么做)',\n domainInvalid: '请输入有效的域名列表',\n },\n },\n\n rule: {\n add: {\n title: '添加 URL',\n confirm: '添加',\n pathPrefix: '请求的前缀是什么?',\n pathPrefixTip: \"如果你填写了 '/prefix',那么所有以其为前缀的请求都会被转发到配置的基石程序\",\n blocklet: '把请求代理到哪个服务?',\n port: '把请求代理到哪个端口?',\n portTip: '这里的默认值是 Blocklet 默认监听的端口,如果你的 Blocklet 会启用多个端口,你可以根据需要自定义',\n },\n delete: {\n title: '删除规则',\n description:\n '确认之后,你会删除掉 “{name}” URL映射, 在下面输入“{name}”,选择删除按钮完成修改,或者选择取消按钮关闭当前弹窗。',\n confirm_desc: '请输入 {name} 以确认删除',\n cancel: '取消',\n },\n update: {\n title: '更新规则',\n confirm: '确认,更新吧',\n cancel: '取消',\n },\n },\n\n cert: {\n name: '证书名称',\n domain: '域名',\n commonName: '通用名称',\n boundDomains: '绑定域名',\n action: '操作',\n expired: '已过期',\n leftDays: ' 天 剩余',\n issuedOn: '签发时间',\n expiryOn: '过期时间',\n fingerprintAlg: '指纹算法',\n validityPeriod: '有效期',\n matchedSites: '匹配站点',\n setPublic: '设置公开',\n setPublicCertHelperText: '如果设置为公开则该证书可以公开下载',\n publicCertHelperText: '公开证书可以下载',\n nonPublicCertHelperText: '非公开的证书不能被下载',\n protectedCertHelperText: '受保护的证书不可以编辑',\n unprotectedCertHelperText: '不受保护的证书可以编辑',\n\n table: {\n nodata: '暂无数据',\n },\n delete: {\n title: '删除 SSL 证书',\n description: '确认删除?',\n confirm: '确认',\n },\n nginx: {\n title: '更新 SSL 证书',\n titleAdd: '添加 SSL 证书',\n pem: '证书文件',\n pemTip: '请把证书文件拖拽到这里, 应该以 \".pem\" 或 \".crt\" 结尾',\n key: '证书私钥',\n keyTip: '请把证书私钥拖拽到这里,应该以 \".pem\" 或 \".key\" 结尾',\n confirm: '提交',\n cancel: '取消',\n invalidFile: '所选择的文件无效',\n empty: '尚未选择任何文件',\n },\n detail: {\n title: 'SSL 证书详情',\n },\n access: {},\n },\n },\n noMatch: {\n desc: '我们找不到您要找的页面',\n },\n health: {\n connectionErrorTip: 'Blocklet Server 服务节点的连接已经断开,可能是出现了网络异常或者 Blocklet Server 服务节点故障',\n connectionRecoveryTip: 'Blocklet Server 服务节点的连接刚刚恢复正常',\n connectionStoppedTip: 'Blocklet Server 服务节点已经被停止',\n wrongAccessUrlTip: 'Blocklet Server 访问地址错误,请使用正确的访问地址',\n },\n debug: {\n title: '您的 Blocklet Server 已启动并正在运行',\n },\n team: {\n invite: '邀请',\n add: '添加',\n member: {\n name: '姓名',\n passport: '通行证',\n passports: '通行证',\n lastLogin: '上次登录',\n filter: '条件筛选',\n forbidLogin: '禁止登录',\n forbidLoginDescription: '该成员将无法登录此应用',\n allowLogin: '允许登录',\n allowLoginDescription: '该成员将可以登录此应用',\n deleteUser: '删除成员',\n deleteUserDescription: '确认删除成员 “{name}”?',\n updateRole: '更新角色',\n revokePassport: '撤销通行证',\n revokePassportDescription: '通行证一旦被撤销,通行证的持有者将无法用其登录,是否继续?',\n enablePassport: '启用通行证',\n enablePassportDescription: '撤销的通行证一旦被重新启用,通行证持有者将可以继续登陆应用,是否继续?',\n passportPermissionTitle: '该通行证具有以下权限:',\n search: '搜索成员',\n inviteDialog: {\n createInviteLink: '生成邀请链接',\n createSuccessTip: '创建邀请链接成功,请复制并发送给被邀请人。该链接只能使用一次,并在 {expireDate} 过期',\n },\n error: {\n passportEmpty: '通行证不能为空',\n },\n },\n permission: {\n create: {\n title: '创建权限',\n description: \"格式:<操作>_<资源>\\n举例:'query_user', 'mutate_user'\",\n },\n update: {\n title: '更新权限',\n },\n delete: {\n title: '删除权限',\n description: '确认删除 {name}?(角色中关联的 {name} 将会同时被删除)',\n },\n error: {\n actionEmpty: '操作不能为空',\n resourceEmpty: '资源不能为空',\n permissionTooLong: '权限不能超过 {length} 个字符',\n descriptionTooLong: '描述不能超过 {length} 个字符',\n },\n },\n passport: {\n create: {\n title: '创建通行证',\n titleTip: '名称创建后不可修改',\n },\n bind: {\n title: '绑定',\n roleTip: '绑定后将会获得选定的通行证的所有权限',\n permissionTip: '绑定后将会获得选定的权限',\n transferLeftTitle: '所有权限',\n transferRightTitle: '已添加权限',\n },\n delete: {\n title: '删除通行证',\n description: '删除后,用户持有的此通行证的将失去所有权限,是否继续?',\n },\n error: {\n titleEmpty: '名称不能为空',\n titleTooLong: '名称不能超过 {length} 个字符',\n descriptionEmpty: '描述不能为空',\n },\n issuance: {\n pending: '待领取',\n create: {\n title: '生成链接',\n },\n delete: {\n title: '删除领取链接',\n description: '确认删除 {link}?',\n },\n },\n issue: '颁发通行证',\n disableIssuance: '禁止颁发通行证',\n enableIssuance: '允许颁发通行证',\n disableIssuanceTip: '“颁发通行证”,“邀请成员” 等操作将被禁止',\n enableIssuanceTip: '“颁发通行证”,“邀请成员” 等操作将被允许',\n trustedPassportIssuers: '信任的通行证颁发者',\n trustedIssuers: '信任的颁发者',\n externalPassport: '外部的通信证',\n notTrustedIssuerTip: '该通行证无法使用,因为颁发者未在信任的颁发者列表中',\n issuerDid: '颁发者 DID',\n addNodeToTrustedIssuers: '添加当前 node 为信任的通行证颁发者',\n revoked: '撤销',\n noPermission: '没有权限执行此操作',\n shouldNotDeleteCurrent: '无法删除当前正在使用的通行证',\n mappingRule: '映射规则',\n defaultRule: '默认规则',\n search: '搜索通行证',\n searchIssuerDid: '搜索颁发者 DID',\n issueBy: '由 {name} 颁发',\n },\n inviting: {\n link: '邀请链接',\n inviter: '邀请人',\n delete: {\n title: '删除邀请链接',\n description: '确认删除 {link}?',\n },\n disabledTip: '邀请功能未开启',\n },\n },\n launcherInfo: {\n cloudService: '云服务商',\n adminUrl: 'Launcher 管理页面',\n },\n session: {\n forbidLogin: '你已被禁止登录',\n },\n launchBlocklet: {\n complete: '完成',\n appInfo: '应用信息',\n appInfoDesc: '确认应用信息',\n author: '应用作者:{author}',\n alreadyExists: '该 Blocklet 已经存在,请访问',\n launchSuccess: '“{appName}” 已经启动成功!',\n selectAbtNode: '选择节点',\n nextStep: '下一步',\n purchased: '已购买',\n purchase: '购买',\n agreeAll: '同意所有',\n agreement: '许可协议',\n install: '安装',\n installing: '安装中',\n installSuccess: '“{appName}” 已经安装成功! 但需要一些配置才能启动。',\n title: '安装',\n installWithAppName: '安装{name}',\n openInRegistry: '在 Blocklet Store 中打开',\n subTitle: '准备在 Blocklet Server 上安装{appName}',\n access: '打开应用',\n viewApplication: '查看应用',\n newVersion: '新版本',\n newVersionDesc: '应用已经存在,但当前版本可更新',\n later: '稍后',\n upgradeNow: '现在更新',\n abtnodeLicenseName: 'Blocklet Server 许可',\n appLicenseName: '应用许可',\n purchaseApp: '购买应用',\n authDialog: {\n title: '需要您的授权',\n freeDescription: '你需要提供 Ownership NFT 或 Blocklet Server 凭据来启动应用',\n nonFreeDescription: 'You need to present application purchase NFT and Blocklet Server NFT to launch application',\n confirm: '在您的 DID 钱包上确认',\n success: '授权成功',\n },\n error: {\n loadMetaFailed: '获取应用信息出错',\n appMetaNotFound: '没有找到该应用的信息',\n downloadFailed: '下载应用失败,请重试',\n installFailed: '安装应用失败,请重试',\n startFailed: '启动应用失败,请重试',\n launchFailed: '启动应用失败,请重试',\n installedButStopped: '应用已经安装,但是没有运行',\n installedButError: '应用已经安装,但是运行出错了',\n upgradeFailed: '更新失败',\n },\n },\n});\n","/* eslint-disable react/jsx-wrap-multilines */\nimport React, { useContext } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport CheckCircleRoundedIcon from '@material-ui/icons/CheckCircleRounded';\nimport CheckCircleOutlineRoundedIcon from '@material-ui/icons/CheckCircleOutlineRounded';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Logo from '@arcblock/ux/lib/Logo';\nimport ConnectLogo from '@arcblock/icons/lib/ConnectLogo';\n\nimport EulaContent from './eula-content'; // eslint-disable-line\n\nexport default function AgreeEula({ onGoToNext }) {\n const [checked, setChecked] = React.useState(false);\n const { t } = useContext(LocaleContext);\n\n const handleChange = () => {\n setChecked(x => !x);\n };\n\n return (\n <Div>\n <Box>\n <Box textAlign=\"center\">\n <Logo showText={false} style={{ width: '60px', height: '60px', transform: 'scale(1)' }} />\n </Box>\n <Typography component=\"h2\" variant=\"h3\" className=\"title\">\n {t('setup.title')}\n </Typography>\n\n <Typography component=\"h2\" variant=\"h5\" className=\"sub-title\">\n {t('setup.steps.eula')}\n </Typography>\n </Box>\n\n <EulaContent className=\"eula-content\" />\n\n <div className=\"footer\">\n <FormControlLabel\n control={\n <Checkbox\n checked={checked}\n onChange={handleChange}\n color=\"primary\"\n checkedIcon={<CheckCircleRoundedIcon />}\n icon={<CheckCircleOutlineRoundedIcon />}\n />\n }\n label={t('setup.steps.eulaFooter')}\n />\n <Button disabled={!checked} variant=\"contained\" color=\"primary\" className=\"button\" rounded onClick={onGoToNext}>\n <Box display=\"flex\" alignItems=\"center\">\n {t('common.continueWith')} <ConnectLogo className=\"logo\" />\n </Box>\n </Button>\n </div>\n </Div>\n );\n}\n\nAgreeEula.propTypes = {\n onGoToNext: PropTypes.func.isRequired,\n};\n\nconst Div = styled.div`\n width: 58%;\n max-width: 1920px;\n height: 100%;\n box-sizing: border-box;\n padding-top: 5%;\n padding-bottom: 5%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n .title {\n margin-top: 24px;\n font-weight: 500;\n font-size: 24px;\n line-height: 28px;\n text-align: center;\n color: #222222;\n }\n .sub-title {\n margin-top: 16px;\n font-weight: 500;\n font-size: 18px;\n line-height: 21px;\n text-align: center;\n color: #666666;\n }\n\n .footer {\n margin-top: 4.5%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n .MuiFormControlLabel-root {\n .MuiSvgIcon-root {\n font-size: 1.2em;\n }\n .MuiFormControlLabel-label {\n position: relative;\n top: 2px;\n margin-left: 2px;\n font-weight: 500;\n font-size: 16px;\n line-height: 19px;\n color: #666666;\n }\n }\n .button {\n padding-left: 24px;\n padding-right: 24px;\n height: 56px;\n font-size: 18px;\n .logo {\n position: relative;\n margin-left: 8px;\n bottom: 1px;\n }\n color: #fff;\n fill: #fff;\n transition: opacity 0.4s;\n &.Mui-disabled {\n background: #4f6af6;\n opacity: 0.5;\n }\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n width: 100%;\n padding: 8vw 4vw;\n .footer {\n flex-direction: column;\n align-items: unset;\n justify-content: unset;\n .MuiButton-root {\n margin-top: 15px;\n font-size: 18px;\n }\n }\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\n\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport AgreeEula from './agree-eula';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\n\nexport default function NodeSetup() {\n const { info } = useNodeContext();\n const { api } = useSessionContext();\n const { t, locale } = useLocaleContext();\n const [open, setOpen] = useState(false);\n\n const { ownerNft } = info;\n\n const webWalletUrl = getWebWalletUrl(info);\n const hasOwnerNft = ownerNft && ownerNft.holder && ownerNft.issuer;\n const action = hasOwnerNft ? 'verify' : 'connect';\n\n const onConnect = () => {\n setOpen(true);\n };\n\n const onOwnerConnected = result => {\n localStorage.setItem('abt_node_login_token', result.sessionToken);\n setTimeout(() => {\n goDashboard();\n }, 1000);\n };\n\n const prefix = window.env ? window.env.apiPrefix || '/' : '/';\n\n const goDashboard = () => {\n window.location.href = prefix;\n };\n\n return (\n <Div>\n <AgreeEula onGoToNext={onConnect} />\n\n <DidConnect\n popup\n open={open}\n className=\"stepper-auth\"\n action={`${action}-owner`}\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n onSuccess={onOwnerConnected}\n locale={locale}\n messages={{\n title: t(`setup.${action}.title`),\n scan: t(`setup.${action}.scan`),\n confirm: t(`setup.${action}.confirm`),\n success: t(`setup.${action}.success`),\n }}\n dialogStyle={{ height: 800 }}\n onClose={() => setOpen(false)}\n />\n </Div>\n );\n}\n\nconst Div = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n background: #f8f8f8;\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n`;\n","/* eslint-disable max-len */\n/* eslint-disable no-nested-ternary */\nimport React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport useInterval from 'react-use/lib/useInterval';\n\nimport Typography from '@material-ui/core/Typography';\nimport Paper from '@material-ui/core/Paper';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport IconPending from '@material-ui/icons/Adjust';\nimport IconDone from '@material-ui/icons/Check';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useSubscription } from '../../../libs/ws';\n\nconst stages = ['setup', 'installing', 'restarting', 'cleanup', 'complete'];\n\nexport default function NodeUpgradeProgress() {\n const { t } = useLocaleContext();\n const { api, info } = useNodeContext();\n const [stage, setStage] = useState('setup');\n const [loading, setLoading] = useState(false);\n const [pooling, setPooling] = useState(false);\n\n useEffect(() => {\n api\n .getSession({ input: { id: info.upgradeSessionId } })\n .then(({ session }) => {\n if (session && stages.includes(session.stage)) {\n setStage(session.stage);\n }\n setLoading(false);\n })\n .catch(err => {\n console.error('Error loading upgrade session', info.upgradeSessionId, err.message);\n setLoading(false);\n });\n }, []); // eslint-disable-line\n\n useEffect(() => {\n if (stage === 'cleanup') {\n setPooling(true);\n } else if (stage === 'complete') {\n setTimeout(() => {\n window.location.reload(true);\n }, 5000);\n } else {\n setPooling(false);\n }\n }, [stage]);\n\n useInterval(\n () => {\n api\n .getSession({ input: { id: info.upgradeSessionId } })\n .then(({ session }) => {\n if (session && stages.includes(session.stage)) {\n setStage(session.stage);\n }\n })\n .catch(err => {\n console.error('Error loading upgrade session', info.upgradeSessionId, err.message);\n });\n },\n pooling ? 1000 : null\n );\n\n useSubscription('node.upgrade.progress', progress => {\n if (progress && stages.includes(progress.stage)) {\n if (stage === 'cleanup') {\n // delay 10s if next stage is cleanup, because restarting stage will immediately return before restarting complete\n setTimeout(() => {\n setStage(progress.stage);\n }, 10 * 1000);\n } else {\n setStage(progress.stage);\n }\n } else {\n console.error('unknown upgrade stage', progress);\n }\n });\n\n return (\n <Div>\n <div className=\"icons\">\n <span className=\"icon icon-gear icon-spin right slow one\" />\n <span className=\"icon icon-gear icon-spin left two\" />\n <span className=\"icon icon-gear icon-spin left three\" />\n </div>\n <Typography variant=\"h2\" color=\"textPrimary\">\n {t('setting.form.upgrade.progress', { version: info.nextVersion || info.version })}\n </Typography>\n <Typography component=\"p\" color=\"textSecondary\">\n {t('setting.form.upgrade.description')}\n </Typography>\n {loading && <Spinner size={[32, 20]} style={{ marginTop: 32 }} />}\n {!loading && (\n <List className=\"stages\">\n {stages.map((x, i) => {\n const currentIndex = stages.indexOf(stage);\n const isDone = currentIndex > i;\n const isProgress = currentIndex === i;\n const icon = isProgress ? <Spinner size={[20, 12]} /> : isDone ? <IconDone /> : <IconPending />;\n const className = isProgress ? 'stage-progress' : isDone ? 'stage-done' : 'stage-pending';\n return (\n <ListItem className={`stage ${className}`} key={x}>\n <ListItemIcon className=\"stage-icon\">{icon}</ListItemIcon>\n <ListItemText className=\"stage-text\">\n {t(`setting.form.upgrade.${x}`, { version: info.nextVersion || info.version })}\n </ListItemText>\n </ListItem>\n );\n })}\n </List>\n )}\n </Div>\n );\n}\n\nconst Div = styled(Paper)`\n padding: 24px 16px;\n border-radius: 8px;\n min-height: 480px;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n\n @font-face {\n font-family: 'icomoon';\n src: url('data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SC/QAAAC8AAAAYGNtYXAQQ+CtAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZtzYyQ0AAAF4AAABtGhlYWQOn7WzAAADLAAAADZoaGVhBzADxgAAA2QAAAAkaG10eAluAAAAAAOIAAAAFGxvY2EAKADuAAADnAAAAAxtYXhwAAgAhQAAA6gAAAAgbmFtZZlKCfsAAAPIAAABhnBvc3QAAwAAAAAFUAAAACAAAwK3AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADwEwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg8BP//f//AAAAAAAg8BP//f//AAH/4w/xAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACAAAAAANuA24ADwCCAAABNCcmIyIHBhUUFxYzMjc2JRUUBwYPAQYHFhcWFRQHBgcGIyIvAQYHBgcGKwEiJyY1JyYnBwYjIicmJyY1NDc2NzY3Ji8BJicmPQE0NzY/ATY3JicmNTQ3Njc2MzIfATY3Njc2OwEyFxYfARYXNzYzMhcWFxYVFAcGBwYHFh8BFhcWFQJJKys8PSsqKis9PCsrASUFBAdqCwsUKQYGDykpDQcITxkbCQcEEX8IBgYQHBhQBggIB0gWBAUIFRQLEAhoCAQFBQQGawgOFyYGBQ8qKQ0HB08ZGwkIBBB/CAYGARAcF1EGCAgGShUEBQgVFQoPCWgIBAUBtzwrKysrPD0rKiore38HBgYBEB8VHTIHBwgGFSgpBT4NCU0dEAUFB2kJDD0FBkIeBggGBwwaGg4dHA8BBgYIfgcHBgEQGhsgLgcHBgcVKSkGPQ0ITh0QBQUHagkMPQYGRB0FCAcGDBoaDh0bEAEGBggAAQAAAAEAANRjIH1fDzz1AAsEAAAAAADWCbikAAAAANYJuKQAAAAAA24DbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADbgABAAAAAAAAAAAAAAAAAAAABQQAAAAAAAAAAAAAAAIAAAADbgAAAAAAAAAKABQAHgDaAAEAAAAFAIMAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')\n format('truetype');\n font-weight: normal;\n font-style: normal;\n }\n\n .stages {\n .stage-done {\n .stage-icon,\n .stage-text {\n color: #44cdc6;\n }\n }\n\n .stage-progress {\n .stage-icon,\n .stage-text {\n color: #4e6af6;\n }\n }\n\n .stage-pending {\n .stage-icon,\n .stage-text {\n color: #dcdcdc;\n }\n }\n }\n\n h2 {\n font-size: 28px;\n margin-top: 16px;\n margin-bottom: 16px;\n color: #009bdb;\n }\n\n p {\n text-align: center;\n }\n\n [class^='icon-'],\n [class*=' icon-'] {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'icomoon' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .icon-cog:before {\n content: '\\f013';\n }\n .icon-gear:before {\n content: '\\f013';\n }\n\n .icon-spin {\n position: absolute;\n }\n\n .icons {\n position: relative;\n margin: 0 auto;\n width: 71px;\n height: 63px;\n }\n\n .one {\n top: 50%;\n margin-top: -27px;\n left: 0;\n font-size: 55px;\n }\n\n .two {\n font-size: 32px;\n right: 0;\n top: 0;\n }\n\n .three {\n font-size: 32px;\n right: 0;\n bottom: 0;\n }\n\n .icon {\n color: #009bdb;\n }\n\n .right {\n animation: spin 2s infinite linear;\n }\n\n .left {\n animation: spin-left 2s infinite linear;\n }\n\n .slow {\n animation-duration: 3s;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n }\n @keyframes spin-left {\n 0% {\n transform: rotate(359deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n }\n`;\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useContext } from 'react';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\n\nimport Box from '@material-ui/core/Box';\n\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { WELLKNOWN_AUTH_PATH_PREFIX } from '@abtnode/constant';\n\nimport { NodeContext } from '../../contexts/node';\nimport { SessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\n\nexport default function NodeLogin() {\n const { node } = useContext(NodeContext);\n const { api, session } = useContext(SessionContext);\n const { t, locale } = useContext(LocaleContext);\n\n const onLogin = result => {\n localStorage.setItem('abt_node_login_token', result.sessionToken);\n session.refresh();\n };\n\n const extraParams = {};\n const { searchParams } = new URL(window.location.href);\n const inviteId = searchParams.get('inviteId');\n if (inviteId) {\n extraParams.inviteId = inviteId;\n }\n\n const webWalletUrl = getWebWalletUrl(node.info);\n\n return (\n <Div>\n <div className=\"connect-wrapper\">\n <DidConnect\n className=\"connect\"\n action={inviteId ? 'invite' : 'login'}\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n onSuccess={onLogin}\n locale={locale}\n messages={{\n title: `${t('login.dialog.title')}`,\n scan: t('login.description'),\n confirm: t('login.dialog.confirm'),\n success: t('login.dialog.success'),\n }}\n extraParams={extraParams}\n />\n </div>\n <Box className=\"lost-passport\" textAlign=\"center\" fontSize={12}>\n <Link to={`${WELLKNOWN_AUTH_PATH_PREFIX}/lost-passport`} style={{ color: '#4598FA' }}>\n {t('lostPassport.title')}\n </Link>\n </Box>\n </Div>\n );\n}\n\nconst Div = styled.div`\n box-sizing: border-box;\n width: 100%;\n height: 100vh;\n display: flex;\n flex-direction: column;\n position: relative;\n .connect-wrapper {\n flex: 1;\n }\n .connect {\n background: #fafafa;\n }\n .lost-passport {\n flex: 0 0 auto;\n padding-bottom: 48px;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport { useSnackbar } from 'notistack';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport Alert from '@material-ui/lab/Alert';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { ROUTER_PROVIDER_NONE } from '@abtnode/constant';\n\nimport getWsClient, { useSubscription } from '../libs/ws';\nimport { useNodeContext } from '../contexts/node';\n\nconst HealthStatus = {\n normal: 'success',\n warning: 'warning',\n error: 'error',\n};\n\nexport default function Health() {\n /**\n * health: {\n * status: HealthStatus\n * message: String\n * }\n */\n const [health, setHealth] = useState({\n status: HealthStatus.normal,\n message: '',\n });\n const [open, setOpen] = useState(false);\n const { t } = useLocaleContext();\n const { enqueueSnackbar } = useSnackbar();\n const { info: nodeInfo = {} } = useNodeContext();\n\n // check access url\n useEffect(() => {\n if (Number(nodeInfo.port) === Number(window.location.port) && nodeInfo.routing.provider !== ROUTER_PROVIDER_NONE) {\n const host = window.location.origin.replace(`:${window.location.port}`, '');\n const endpoint = `${host}${nodeInfo.routing.adminPath}`;\n\n enqueueSnackbar(`${t('health.wrongAccessUrlTip')} ${endpoint}`, {\n autoHideDuration: 1000 * 86400,\n variant: 'error',\n });\n }\n }, [nodeInfo]); // eslint-disable-line\n\n // heartbeat\n useEffect(() => {\n const client = getWsClient();\n const maxTries = 4;\n const heartbeatIntervalMs = 2000;\n let tries = 0;\n let heartbeatTimer;\n const onConnectError = () => {\n setHealth({\n status: HealthStatus.error,\n message: t('health.connectionErrorTip'),\n });\n };\n const onConnectSuccess = () => {\n if (health.status !== HealthStatus.normal) {\n setHealth({\n status: HealthStatus.normal,\n message: t('health.connectionRecoveryTip'),\n });\n }\n };\n\n const startHeartBeat = () => {\n if (!client || !client.isConnected()) {\n if (tries === maxTries) {\n onConnectError();\n }\n tries = (tries + 1) % (maxTries + 1);\n } else {\n onConnectSuccess();\n tries = 0;\n }\n heartbeatTimer = setTimeout(startHeartBeat, heartbeatIntervalMs);\n };\n\n // 第一次轮训的时间是 heartbeatIntervalMs * 4, retry次数为0. 之后每次轮训的时间是 heartbeatIntervalMs, retry 次数是 maxTries\n // e.g\n // 收到 node.stopped 消息后(此时 node 并没有真正 stop), status 由 success 变为 error, 重新开始首次轮询\n // 较长的首次间隔时间确保第一次请求时 node 已经 stop 完成\n tries = maxTries;\n heartbeatTimer = setTimeout(startHeartBeat, heartbeatIntervalMs * 4);\n return () => {\n clearInterval(heartbeatTimer);\n };\n }, [health.status, t]); // eslint-disable-line\n\n // ui control(toast)\n useEffect(() => {\n let timer;\n const durning = 3000;\n if (health.status === HealthStatus.normal && open === true) {\n timer = setTimeout(() => {\n setOpen(false);\n }, durning);\n } else if (health.status !== HealthStatus.normal && open === false) {\n setOpen(true);\n }\n return () => {\n clearTimeout(timer);\n };\n }, [health.status, open]); // eslint-disable-line\n\n // receive server push health status\n useSubscription(\n 'node.stopped',\n () => {\n setHealth({\n status: 'error',\n message: t('health.connectionStoppedTip'),\n });\n },\n [t]\n );\n\n return (\n <Snackbar open={open} anchorOrigin={{ vertical: 'top', horizontal: 'center' }}>\n <Alert severity={health.status}>{health.message}</Alert>\n </Snackbar>\n );\n}\n","/* eslint-disable react/jsx-wrap-multilines */\n/* eslint-disable react/prop-types */\nimport React from 'react';\n\nimport Typography from '@material-ui/core/Typography';\nimport Alert from '@material-ui/lab/Alert';\nimport AlertTitle from '@material-ui/lab/AlertTitle';\nimport Button from '@arcblock/ux/lib/Button';\nimport Center from '@arcblock/ux/lib/Center';\n\nconst ErrorFallback = ({ error, resetErrorBoundary }) => (\n <Center>\n <Alert\n severity=\"error\"\n action={\n <Button onClick={resetErrorBoundary} rounded color=\"secondary\" variant=\"outlined\">\n Reload\n </Button>\n }\n style={{ minWidth: 480 }}>\n <AlertTitle>Oops, this application crashed</AlertTitle>\n <Typography>{error.message}</Typography>\n </Alert>\n </Center>\n);\n\nexport default ErrorFallback;\n","/* eslint-disable react/prop-types */\n/* eslint-disable object-curly-newline */\nimport React from 'react';\nimport { create } from '@arcblock/ux/lib/Theme';\nimport { MuiThemeProvider } from '@material-ui/core/styles';\nimport { createGlobalStyle, ThemeProvider } from 'styled-components';\n\nimport teal from '@material-ui/core/colors/teal';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport 'moment/locale/zh-cn';\nimport { LocaleProvider } from '@arcblock/ux/lib/Locale/context';\n\nimport ErrorFallback from './error-fallback';\n\nimport { translations } from '../locales';\nimport { SessionProvider } from '../contexts/session';\nimport { NodeProvider } from '../contexts/node';\nimport { ToastProvider } from './toast';\n\nconst GlobalStyle = createGlobalStyle`\n a {\n color: ${teal.A700};\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: none;\n }\n\n .page-breadcrumb {\n margin-bottom: 16px !important;\n }\n\n\n .page-header {\n margin-bottom: 32px !important;\n }\n\n ul, li {\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .toolbar>div{\n .header-link{\n flex:0;\n\n .header-image {\n margin-left: 14px;\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n width:100%;\n .header-link{\n overflow: hidden;\n }\n }\n }\n\n .MuiFormControlLabel-label {\n flex: 1;\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .form-item {\n margin-top: 20px;\n\n .form-item-label {\n margin-top: 10px;\n }\n\n .form-item-value {\n margin-top: 10px;\n }\n }\n\n .dropzone {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border-width: 2px;\n border-radius: 2px;\n border-color: #eeeeee;\n border-style: dashed;\n background-color: #fafafa;\n color: #bdbdbd;\n outline: none;\n transition: border 0.24s ease-in-out;\n }\n\n .dropzone:focus {\n border-color: #2196f3;\n }\n\n .MuiTableHead-root th {\n white-space: nowrap;\n }\n .MuiDialog-paper.MuiPaper-rounded {\n border-radius: 16px;\n @media (max-width: ${props => props.theme.breakpoints.values.md - 1}px) {\n border-radius: 0;\n }\n }\n .MuiButton-outlinedPrimary {\n fill: ${props => props.theme.palette.primary.main};\n }\n .MuiListItemIcon-root {\n svg {\n fill: currentColor;\n }\n }\n\n // outline button\n .MuiButton-outlinedPrimary {\n color: #4E6AF6;\n background: #F4F6FF;\n border: 0;\n &:hover {\n border: 0;\n }\n }\n`;\n\nexport default ({ children }) => {\n const theme = create({\n typography: {\n fontSize: 14,\n button: {\n textTransform: 'none',\n },\n },\n overrides: {\n MuiTableRow: {\n root: {\n '&:nth-child(even)': {\n backgroundColor: 'rgba(0, 0, 0, 0.02)',\n },\n },\n head: {\n backgroundColor: 'transparent',\n },\n },\n },\n });\n\n return (\n <MuiThemeProvider theme={theme}>\n <ThemeProvider theme={theme}>\n <LocaleProvider translations={translations}>\n <ToastProvider>\n <NodeProvider>\n <SessionProvider\n serviceHost={window.env && window.env.apiPrefix ? window.env.apiPrefix : ''}\n autoLogin={false}>\n <GlobalStyle />\n <div className=\"wrapper\">\n <ErrorBoundary\n FallbackComponent={ErrorFallback}\n onReset={() => {\n window.location.reload();\n }}>\n {children}\n </ErrorBoundary>\n </div>\n </SessionProvider>\n </NodeProvider>\n </ToastProvider>\n </LocaleProvider>\n </ThemeProvider>\n </MuiThemeProvider>\n );\n};\n","/* eslint-disable operator-linebreak */\nimport React, { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\n\nimport List from '@material-ui/core/MenuList';\nimport ListItem from '@material-ui/core/MenuItem';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Avatar from '@material-ui/core/Avatar';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNotificationContext } from '../../contexts/notification';\nimport NotificationTag from './tag';\nimport Permission from '../permission';\n\nexport default function NotificationList({ onHide }) {\n const { api, data: notifications, refresh: updateNotifications } = useNotificationContext();\n const { t } = useContext(LocaleContext);\n const [showRead, setShowRead] = useState(false);\n const [isMarkingAll, setIsMarkingAll] = useState(false);\n\n let filtered = showRead ? notifications : notifications.filter(x => x.read === false);\n filtered = filtered.slice(0, 5);\n const hasUnRead = notifications.filter(x => x.read === false).length > 0;\n\n const onUnreadNotifications = async () => {\n setIsMarkingAll(true);\n const ids = notifications\n .filter(x => x.read === false)\n .map(x => x.id)\n .join(',');\n await api.readNotifications({ input: { id: ids } });\n updateNotifications();\n setIsMarkingAll(false);\n };\n\n return (\n <Div>\n <Typography component=\"h3\" variant=\"h6\" className=\"notification-header\">\n {t('notification.title')}\n <Button component={Link} to=\"/notifications\" data-cy=\"view-all-notifications-btn\" onClick={onHide}>\n {t('notification.viewAll')}\n </Button>\n </Typography>\n <Divider />\n <List className=\"notification-list\" style={{ maxHeight: 'calc(100vh - 200px)', overflow: 'auto' }}>\n {filtered.length === 0 && (\n <Typography component=\"p\" variant=\"body1\" className=\"notification-tip\">\n {t('notification.empty')}\n </Typography>\n )}\n {filtered.length > 0 &&\n filtered.map(x => (\n <ListItem\n key={x.id}\n alignItems=\"flex-start\"\n component={Link}\n to={x.action || '/notifications'}\n disabled={x.read}>\n <ListItemAvatar className=\"list-item-avatar\">\n <>\n <Avatar>{x.entityType.substr(0, 1).toUpperCase()}</Avatar>\n <NotificationTag className=\"notification-tag\" status={x.severity} />\n </>\n </ListItemAvatar>\n <ListItemText className=\"list-item\" primary={x.title} secondary={x.description} />\n </ListItem>\n ))}\n </List>\n <Divider />\n <Typography component=\"div\" className=\"notification-footer\">\n <FormControlLabel\n control={\n <Checkbox checked={showRead} onChange={() => setShowRead(!showRead)} name=\"showRead\" color=\"primary\" />\n }\n label={t('notification.showRead')}\n />\n <Permission permission=\"mutate_notification\">\n {hasUnRead && (\n <Button disabled={isMarkingAll} onClick={onUnreadNotifications} className=\"\">\n {isMarkingAll && <Spinner size={[16, 10]} />}\n {t('notification.markAllAsRead')}\n </Button>\n )}\n </Permission>\n </Typography>\n </Div>\n );\n}\n\nconst Div = styled.div`\n width: 420px;\n\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n width: calc(100vw - 10px);\n }\n\n .notification-header {\n padding: 8px 16px;\n display: flex;\n justify-content: space-between;\n }\n\n .notification-tip {\n padding: 8px 16px;\n }\n\n .notification-footer {\n padding: 8px 16px;\n display: flex;\n justify-content: space-between;\n }\n\n .MuiMenuItem-root {\n white-space: pre-wrap;\n }\n\n .list-item-avatar {\n display: flex;\n flex-direction: column;\n align-items: center;\n .notification-tag {\n margin-top: 4px;\n }\n }\n\n .list-item {\n .MuiListItemText-secondary {\n overflow: hidden;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n text-overflow: ellipsis;\n }\n }\n`;\n\nNotificationList.propTypes = {\n onHide: PropTypes.func,\n};\n\nNotificationList.defaultProps = {\n onHide: () => {},\n};\n","import { useTheme } from '@material-ui/core/styles';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nfunction useWidth() {\n const theme = useTheme();\n const keys = [...theme.breakpoints.keys].reverse();\n return (\n keys.reduce((output, key) => {\n // eslint-disable-next-line\n const matches = useMediaQuery(theme.breakpoints.up(key));\n return !output && matches ? key : output;\n }, null) || 'xs'\n );\n}\n\nexport default useWidth;\n","import React from 'react';\nimport SvgIcon from '@material-ui/core/SvgIcon';\n\nconst CheckIcon = props => (\n <SvgIcon {...props}>\n <path\n d=\"M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41\n 10.59L10 14.17L17.59 6.58L19 8L10 17Z\"\n />\n </SvgIcon>\n);\n\nconst WarningIcon = props => (\n <SvgIcon {...props}>\n <path d=\"M13,14H11V10H13M13,18H11V16H13M1,21H23L12,2L1,21Z\" />\n </SvgIcon>\n);\n\nconst ErrorIcon = props => (\n <SvgIcon {...props}>\n <path\n d=\"M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,\n 6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,\n 13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z\"\n />\n </SvgIcon>\n);\n\nconst InfoIcon = props => (\n <SvgIcon {...props}>\n <path\n d=\"M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,\n 0 22,12A10,10 0 0,0 12,2Z\"\n />\n </SvgIcon>\n);\n\nconst iconStyles = {\n fontSize: 20,\n marginInlineEnd: 8,\n};\n\nconst defaultIconVariants = {\n success: <CheckIcon style={iconStyles} />,\n warning: <WarningIcon style={iconStyles} />,\n error: <ErrorIcon style={iconStyles} />,\n info: <InfoIcon style={iconStyles} />,\n};\n\nexport default defaultIconVariants;\n","/* eslint-disable no-unused-vars */\n/* eslint-disable operator-linebreak */\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles, emphasize } from '@material-ui/core/styles';\nimport styled from 'styled-components';\n\nimport { amber, green } from '@material-ui/core/colors';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n\nimport { useHistory } from 'react-router-dom';\nimport { useSnackbar, SnackbarContent } from 'notistack';\n\nimport useWidth from '../../hooks/width';\nimport variants from './default-icon-variants';\n\nconst useStyles = makeStyles(theme => {\n const breakpointsMap = {\n xl: '400px',\n lg: '400px',\n md: '400px',\n sm: '300px',\n };\n const backgroundColor = emphasize(theme.palette.background.default, theme.palette.type === 'light' ? 0.8 : 0.98);\n return {\n lessPadding: {\n paddingLeft: 8 * 2.5,\n },\n contentRoot: {\n ...theme.typography.body2,\n display: 'flex',\n backgroundColor,\n color: theme.palette.getContrastText(backgroundColor),\n alignItems: 'center',\n padding: '6px 16px',\n borderRadius: '4px',\n boxShadow: '0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)',\n },\n success: props => ({\n backgroundColor: `${green[600]} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n error: props => ({\n backgroundColor: `${theme.palette.error.dark} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n info: props => ({\n backgroundColor: `${theme.palette.primary.main} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n warning: props => ({\n backgroundColor: `${amber[700]} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n icon: {\n fontSize: 20,\n },\n message: {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 0',\n flex: 1,\n width: 0,\n },\n action: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n marginRight: -8,\n width: 44,\n },\n };\n});\n\nfunction NotificationComponent({ keyId: key, notification = {} }, ref) {\n const classes = useStyles({\n breakpoint: useWidth(),\n });\n\n const combinedClassname = [classes.contentRoot, classes.lessPadding, classes[notification.severity]].join(' ');\n\n const icon = variants[notification.severity];\n\n const { closeSnackbar } = useSnackbar();\n const onClickDismiss = () => closeSnackbar(key);\n\n const history = useHistory();\n const onGoNotification = () => {\n closeSnackbar(key);\n\n history.push('/notifications');\n };\n\n return (\n <SnackbarContent ref={ref} className={combinedClassname}>\n <div className={classes.message}>\n {icon}\n <Div onClick={onGoNotification}>\n <span className=\"title\">{notification.title}</span>\n <span className=\"desc\">{notification.description}</span>\n </Div>\n </div>\n <div className={classes.action}>\n <IconButton key=\"close\" aria-label=\"close\" color=\"inherit\" onClick={onClickDismiss}>\n <CloseIcon className={classes.icon} />\n </IconButton>\n </div>\n </SnackbarContent>\n );\n}\n\nexport default React.forwardRef(NotificationComponent);\n\nNotificationComponent.propTypes = {\n keyId: PropTypes.number.isRequired,\n notification: PropTypes.object.isRequired,\n};\n\nconst Div = styled.div`\n cursor: pointer;\n display: flex;\n flex-direction: column;\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n font-weight: bold;\n }\n .desc {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n word-break: break-word;\n }\n`;\n","/* eslint-disable no-unused-vars */\n/* eslint-disable operator-linebreak */\nimport React from 'react';\nimport { useSnackbar } from 'notistack';\nimport { useSubscription } from '../../libs/ws';\nimport NotificationComponent from './notification';\n\nexport default function NotificationToast() {\n const { enqueueSnackbar } = useSnackbar();\n\n useSubscription('notification.create', notification => {\n if (!notification.id) {\n // eslint-disable-next-line no-underscore-dangle\n notification.id = notification._id;\n }\n\n const disableAutoHide = ['error', 'warning'].includes(notification.severity) || notification.sticky;\n\n enqueueSnackbar(notification.description, {\n variant: notification.severity,\n autoHideDuration: disableAutoHide ? null : 3000,\n content: key => <NotificationComponent keyId={key} notification={notification} />,\n });\n });\n\n return null;\n}\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport React, { useState, useRef, useContext } from 'react';\nimport styled from 'styled-components';\n\nimport ClickAwayListener from '@material-ui/core/ClickAwayListener';\nimport Button from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Badge from '@material-ui/core/Badge';\nimport Popper from '@material-ui/core/Popper';\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline';\nimport IconActivities from '@material-ui/icons/Subject';\nimport { useLocation } from 'react-router-dom';\n\nimport SessionManager from '@arcblock/did-connect/lib/SessionManager';\nimport LocaleSelector from '@arcblock/ux/lib/Locale/selector';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNotificationContext } from '../../contexts/notification';\nimport NotificationList from '../notifications/list';\nimport NotificationToast from '../notifications/toast';\nimport { SessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\nimport { useNodeContext } from '../../contexts/node';\n\nexport default function HeaderAddon() {\n const { data: notifications } = useNotificationContext();\n const { session } = useContext(SessionContext);\n const location = useLocation();\n const { locale } = useContext(LocaleContext);\n const [notificationOpen, setNotificationOpen] = useState(false);\n const notificationAnchorRef = useRef(null);\n const { info } = useNodeContext();\n const webWalletUrl = getWebWalletUrl(info);\n\n const onToggleNotification = () => {\n setNotificationOpen(prevOpen => !prevOpen);\n };\n\n const docPaths = {\n '/dashboard': '/introduction/abtnode-overview',\n '/store': '/marketplace',\n '/blocklets': '/blocklet',\n '/router/rules': '/router',\n '/router/engine': '/router',\n '/settings/basic': '/misc',\n '/settings/team': '/misc/member-management',\n '/console': '/misc/graphql-console',\n };\n\n const onHelpClick = () => {\n const pathName = location.pathname;\n let path = '';\n if (pathName.indexOf('/blocklets') > -1) {\n path = docPaths['/blocklets'];\n } else if (pathName.indexOf('/store') > -1) {\n path = docPaths['/store'];\n } else if (docPaths[pathName]) {\n path = docPaths[pathName];\n }\n const w = window.open('about:blank');\n w.location.href = `https://docs.arcblock.io/abtnode/${locale}${path}`;\n };\n\n const onCloseNotification = e => {\n if (notificationAnchorRef.current && notificationAnchorRef.current.contains(e.target)) {\n return;\n }\n\n setNotificationOpen(false);\n };\n\n const unreadCount = notifications.filter(x => x.read === false).length;\n\n return (\n <Div>\n <LocaleSelector data-cy=\"locale-addon\" size={26} showText={false} className=\"locale-addon\" />\n\n <NotificationToast />\n <div className=\"notification-addon\">\n <Button\n ref={notificationAnchorRef}\n aria-controls=\"notify-list-grow\"\n aria-haspopup=\"true\"\n data-cy=\"toggle-notification-btn\"\n onClick={onToggleNotification}>\n {unreadCount > 0 ? (\n <Badge badgeContent={unreadCount} max={99} color=\"primary\">\n <IconActivities style={{ fontSize: 32 }} />\n </Badge>\n ) : (\n <IconActivities style={{ fontSize: 32 }} />\n )}\n </Button>\n {notificationOpen && (\n <Popper open anchorEl={notificationAnchorRef.current} disablePortal placement=\"bottom-end\">\n <Paper id=\"notify-list-grow\">\n <ClickAwayListener onClickAway={onCloseNotification}>\n <div>\n <NotificationList onHide={onCloseNotification} />\n </div>\n </ClickAwayListener>\n </Paper>\n </Popper>\n )}\n </div>\n <Button onClick={onHelpClick}>\n <HelpOutlineIcon style={{ fontSize: 32 }} />\n </Button>\n <SessionManager session={session} webWalletUrl={webWalletUrl} showRole />\n </Div>\n );\n}\n\nconst Div = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n\n .user-addon {\n .user-avatar {\n width: 28px;\n border-radius: 14px;\n height: auto;\n }\n }\n`;\n","/* eslint-disable react/prop-types */\nimport React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport BaseLayout from '@arcblock/ux/lib/Layout/dashboard';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport styled from 'styled-components';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\n\nimport HeaderAddon from './addon';\n\nimport { NodeContext } from '../../contexts/node';\n\nexport default function Dashboard({ children, title, ...rest }) {\n const { node } = useContext(NodeContext);\n const { t } = useContext(LocaleContext);\n\n const isBreakpointsUpSm = useMediaQuery(theme => theme.breakpoints.up('sm'));\n\n let links = [\n { url: '/dashboard', name: 'dashboard', title: t('sidebar.dashboard') },\n { url: '/store', name: 'store', title: t('common.store') },\n { url: '/blocklets', name: 'blocklets', title: t('sidebar.blocklets') },\n ];\n\n if (isBreakpointsUpSm && process.env.NODE_ENV === 'development') {\n links.push({ url: '/console', name: 'console', title: t('sidebar.console') });\n }\n\n links = links.concat([\n { url: '/logs/abtnode', name: 'log', title: t('common.log') },\n { url: '/team/members', name: 'team', title: t('common.team') },\n { url: '/settings/basic', name: 'settings', title: t('sidebar.settings') },\n ]);\n\n const images = {\n dashboard: 'dashboard',\n console: 'console',\n settings: 'settings',\n blocklets: 'blocklets',\n store: 'store',\n router: 'router',\n log: 'log',\n team: 'team',\n };\n\n const mode = node.info.mode || 'production';\n const tagType = mode === 'production' ? 'success' : 'error';\n const BrandAddon = (\n <div style={{ display: 'flex', alignItems: 'center' }}>\n <TagBox>\n <Tag type={tagType}>{`${mode} mode`}</Tag>\n </TagBox>\n </div>\n );\n\n return (\n <BaseLayout\n links={links}\n images={images}\n brand={node.info.name}\n brandAddon={BrandAddon}\n description={node.info.description}\n title={title}\n headerAddon={<HeaderAddon />}\n prefix={node.prefix}\n {...rest}>\n {children}\n </BaseLayout>\n );\n}\n\nDashboard.propTypes = {\n children: PropTypes.any.isRequired,\n title: PropTypes.string,\n};\n\nDashboard.defaultProps = {\n title: 'Blocklet Server',\n};\n\nconst TagBox = styled.span`\n margin-left: 10px;\n`;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Route } from 'react-router-dom';\nimport DashboardLayout from './index';\n\n/**\n * 包装 Route & DashboardLayout, 避免在每次路由切换时 unmount/mount DashboardLayout (导致 sidebar 图标也跟着 unmount/mount - 闪烁问题)\n */\nconst DashboardLayoutRoute = ({ component: Component, title, scrollable, fullWidth, ...rest }) => {\n return (\n <Route\n {...rest}\n render={props => (\n <StyledDashboardLayout scrollable={scrollable} fullWidth={fullWidth} title={title}>\n <Component {...props} />\n </StyledDashboardLayout>\n )}\n />\n );\n};\n\nDashboardLayoutRoute.propTypes = {\n title: PropTypes.string,\n component: PropTypes.any.isRequired,\n // layout 是否可滚动, ux/dashboard 默认行为是可滚动, 某些页面 (比如 console, logger) 的布局, 更像 app-styled layout,\n // 对此可以将 scrollable 设置为 false, content 自行控制滚动\n scrollable: PropTypes.bool,\n fullWidth: PropTypes.bool,\n};\n\nDashboardLayoutRoute.defaultProps = {\n title: 'Blocklet Server',\n scrollable: true,\n fullWidth: false,\n};\n\nconst StyledDashboardLayout = styled(DashboardLayout)`\n .dashboard__content {\n padding-top: 16px;\n ${props => (props.scrollable ? '' : 'overflow: hidden')};\n }\n`;\n\nexport default DashboardLayoutRoute;\n","import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../contexts/node';\nimport { useSessionContext } from '../contexts/session';\nimport { useSubscription } from '../libs/ws';\nimport Toast from './toast';\n\n// eslint-disable-next-line react/prop-types\nexport default function GlobalSubscriber() {\n const { t } = useLocaleContext();\n const { session } = useSessionContext();\n const { info: nodeInfo, refresh: refreshNode } = useNodeContext();\n\n // auto logout\n useSubscription('user.updated', ({ teamDid, user }) => {\n if (teamDid === nodeInfo.did) {\n if (user && !user.approved && session && session.user && session.user.did === user.did) {\n Toast.warning(t('session.forbidLogin'), { autoHideDuration: 10 * 1000 });\n session.logout();\n }\n }\n });\n\n // refresh node info\n useSubscription('notification.create', notification => {\n if (notification.entityType === 'node') {\n refreshNode({ silent: true });\n }\n });\n\n useSubscription('node.updated', () => {\n refreshNode({ silent: true });\n });\n\n return null;\n}\n","/* eslint-disable object-curly-newline */\nimport React, { Suspense, lazy, useEffect } from 'react';\nimport { BrowserRouter as Router, Route, Switch, Redirect, withRouter } from 'react-router-dom';\n\nimport moment from 'moment';\nimport 'moment/locale/zh-cn';\n\nimport CssBaseline from '@material-ui/core/CssBaseline';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Center from '@arcblock/ux/lib/Center';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { WELLKNOWN_AUTH_PATH_PREFIX, NODE_MODES } from '@abtnode/constant';\n\nimport history from './libs/history';\nimport NodeSetup from './components/node/setup';\nimport NodeUpgrade from './components/node/upgrade/progress';\nimport NodeLogin from './components/node/login';\nimport Health from './components/health';\nimport Root from './components/root';\nimport DashboardLayoutRoute from './components/layout/layout-route';\nimport GlobalSubscriber from './components/global-subscriber';\n\nimport { useSessionContext } from './contexts/session';\nimport { useNodeContext } from './contexts/node';\nimport { NotificationProvider } from './contexts/notification';\nimport { BlockletProvider } from './contexts/blocklets';\nimport { RoutingProvider } from './contexts/routing';\n\nimport getWsClient from './libs/ws';\nimport useQuery from './hooks/query';\n\nconst BlockletList = lazy(() => import(/* webpackPrefetch: true */ './pages/blocklets/index'));\nconst BlockletDetail = lazy(() => import(/* webpackPrefetch: true */ './pages/blocklets/detail'));\nconst BlockletStore = lazy(() => import(/* webpackPrefetch: true */ './pages/store/index'));\nconst StoreDetail = lazy(() => import(/* webpackPrefetch: true */ './pages/store/detail'));\nconst Dashboard = lazy(() => import(/* webpackPrefetch: true */ './pages/dashboard/index'));\nconst Debug = lazy(() => import(/* webpackPrefetch: true */ './pages/debug/index'));\nconst Settings = lazy(() => import(/* webpackPrefetch: true */ './pages/settings/index'));\nconst EULAPage = lazy(() => import(/* webpackPrefetch: true */ './pages/eula/index'));\nconst Console = lazy(() => import(/* webpackPrefetch: true */ './pages/console/index'));\nconst Notifications = lazy(() => import(/* webpackPrefetch: true */ './pages/notifications/index'));\nconst LogPage = lazy(() => import(/* webpackPrefetch: true */ './pages/logger/index'));\nconst TeamPage = lazy(() => import(/* webpackPrefetch: true */ './pages/team/index'));\nconst IssuePassport = lazy(() => import(/* webpackPrefetch: true */ './pages/issue-passport/index'));\nconst LostPassport = lazy(() => import(/* webpackPrefetch: true */ './pages/lost-passport/index'));\nconst BlockletLauncher = lazy(() => import(/* webpackPrefetch: true */ './pages/launch-blocklet/index'));\nconst NotFoundPage = lazy(() => import(/* webpackPrefetch: true */ './pages/notfound/index'));\n\nexport const ProtectedApp = () => {\n const node = useNodeContext();\n const { session } = useSessionContext();\n const { locale, t } = useLocaleContext();\n\n moment.locale(locale === 'zh' ? 'zh-cn' : locale);\n\n const userDid = session.user && session.user.did;\n // init ws client\n useEffect(() => {\n const wsClient = getWsClient();\n if (userDid) {\n wsClient.connect();\n } else if (wsClient.isConnected()) {\n wsClient.disconnect();\n }\n return () => {\n if (wsClient.isConnected()) {\n wsClient.disconnect();\n }\n };\n }, [userDid]);\n\n // auto check session when page visibility change\n useEffect(() => {\n const refresh = async () => {\n if (document.visibilityState === 'visible') {\n session.refresh();\n }\n };\n document.addEventListener('visibilitychange', refresh);\n return () => {\n document.removeEventListener('visibilitychange', refresh);\n };\n }, []); // eslint-disable-line\n\n if (node.loading || session.loading) {\n return (\n <Center>\n <Spinner />\n </Center>\n );\n }\n\n if (!node.info.initialized) {\n return (\n <Center>\n <NodeSetup />\n </Center>\n );\n }\n\n // Allow user to login\n if (session.user) {\n const fallback = (\n <Center>\n <Spinner />\n </Center>\n );\n\n if (node.info.upgradeSessionId) {\n return (\n <Center>\n <NodeUpgrade />\n </Center>\n );\n }\n\n return (\n <NotificationProvider>\n <BlockletProvider>\n <RoutingProvider>\n <Health />\n <GlobalSubscriber />\n <Suspense fallback={fallback}>\n <Switch>\n <DashboardLayoutRoute exact path=\"/dashboard\" component={Dashboard} title=\"Dashboard\" />\n <Redirect exact path=\"/\" to=\"/dashboard\" />\n <DashboardLayoutRoute exact path=\"/blocklets\" component={BlockletList} title={t('common.blocklets')} />\n <DashboardLayoutRoute exact path=\"/blocklets/:did/:tab\" component={BlockletDetail} title=\"Blocklets\" />\n <DashboardLayoutRoute exact path=\"/settings/:tab\" component={Settings} title={t('common.setting')} />\n <DashboardLayoutRoute exact path=\"/eula\" component={EULAPage} title={t('setup.steps.eula')} />\n <DashboardLayoutRoute exact path=\"/store\" component={BlockletStore} title={t('common.store')} />\n <DashboardLayoutRoute exact path=\"/store/:did\" component={StoreDetail} title={t('common.store')} />\n <DashboardLayoutRoute\n exact\n path=\"/console\"\n component={Console}\n scrollable={false}\n fullWidth\n title={`GraphQL ${t('common.console')}`}\n />\n <DashboardLayoutRoute exact path=\"/notifications\" component={Notifications} />\n <DashboardLayoutRoute exact path=\"/team/:tab\" component={TeamPage} title={t('common.team')} />\n <DashboardLayoutRoute\n exact\n path=\"/logs/:name\"\n component={LogPage}\n scrollable={false}\n fullWidth\n title={t('common.log')}\n />\n <Redirect exact path=\"/team\" to=\"/team/members\" title={t('common.team')} />\n <Redirect exact path=\"/logs\" to=\"/logs/abtnode\" />\n <Redirect exact path=\"/router\" to=\"/router/rules\" />\n <Redirect exact path=\"/settings\" to=\"/settings/basic\" />\n <Redirect exact path=\"/marketplace\" to=\"/store\" />\n <Redirect exact path=\"/marketplace/:did\" to=\"/store/:did\" />\n <DashboardLayoutRoute component={NotFoundPage} />\n </Switch>\n </Suspense>\n </RoutingProvider>\n </BlockletProvider>\n </NotificationProvider>\n );\n }\n\n return <NodeLogin />;\n};\n\nconst App = () => {\n const node = useNodeContext();\n const { changeLocale } = useLocaleContext();\n const query = useQuery();\n\n useEffect(() => {\n const queryStringLocale = query.get('locale');\n if (queryStringLocale && ['zh', 'en'].includes(queryStringLocale)) {\n changeLocale(queryStringLocale);\n }\n }, []); // eslint-disable-line\n\n const fallback = (\n <Center>\n <Spinner />\n </Center>\n );\n\n return (\n <Suspense fallback={fallback}>\n <Switch>\n {node.info.mode === NODE_MODES.DEBUG && <Route exact path=\"/debug\" component={Debug} />}\n <Route exact path={`${WELLKNOWN_AUTH_PATH_PREFIX}/issue-passport`} component={IssuePassport} />\n <Route exact path={`${WELLKNOWN_AUTH_PATH_PREFIX}/lost-passport`} component={LostPassport} />\n <Route path=\"/launch-blocklet\" component={BlockletLauncher} />\n <Route>\n <ProtectedApp />\n </Route>\n </Switch>\n </Suspense>\n );\n};\n\nconst WithRouter = withRouter(Root);\n\nexport default () => {\n const prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n return (\n <>\n <CssBaseline />\n <Router history={history} basename={prefix}>\n <WithRouter>\n <App />\n </WithRouter>\n </Router>\n </>\n );\n};\n","import React from 'react';\nimport ReactDOM from 'react-dom';\n// eslint-disable-next-line import/no-named-as-default\nimport App from './app';\n\nReactDOM.render(<App />, document.getElementById('root'));\n","import React from 'react';\nimport { SnackbarProvider, useSnackbar } from 'notistack';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n\nconst noop = () => {};\n\nlet success = noop;\nlet error = noop;\nlet warning = noop;\nlet info = noop;\n\nconst genFn = (enqueueSnackbar, variant) => (message, opts) => {\n enqueueSnackbar(message, {\n autoHideDuration: 3000,\n variant,\n ...opts,\n });\n};\n\n// eslint-disable-next-line react/prop-types\nfunction ToastProvider({ children }) {\n const notistackRef = React.createRef();\n const onClickDismiss = key => () => {\n notistackRef.current.closeSnackbar(key);\n };\n\n return (\n <SnackbarProvider\n anchorOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n ref={notistackRef}\n action={key => (\n <IconButton key=\"close\" aria-label=\"close\" color=\"inherit\" onClick={onClickDismiss(key)}>\n <CloseIcon style={{ fontSize: 16 }} />\n </IconButton>\n )}>\n <Toast />\n {children}\n </SnackbarProvider>\n );\n}\n\nfunction Toast() {\n const { enqueueSnackbar } = useSnackbar();\n\n success = genFn(enqueueSnackbar, 'success');\n error = genFn(enqueueSnackbar, 'error');\n warning = genFn(enqueueSnackbar, 'warning');\n info = genFn(enqueueSnackbar, 'info');\n\n return null;\n}\n\nexport { ToastProvider };\n\nexport default {\n success: (...args) => success(...args),\n error: (...args) => error(...args),\n warning: (...args) => warning(...args),\n info: (...args) => info(...args),\n};\n","import NodeClient from '@abtnode/client';\nimport { getLocale } from '@arcblock/ux/lib/Locale/context';\n\nlet client;\n\nexport function create(token) {\n const prefix = (window.env ? window.env.apiPrefix : '/') || '/';\n const newClient = new NodeClient(() => `${prefix}/api/gql?locale=${getLocale()}`.replace(/\\/+/g, '/').trim());\n newClient.setAuthToken(() => {\n if (token) {\n return token;\n }\n\n if (!window.localStorage) {\n return null;\n }\n\n return window.localStorage.getItem('abt_node_login_token');\n });\n\n return newClient;\n}\n\nexport default function createClient() {\n if (!client) {\n client = create();\n }\n\n return client;\n}\n"],"sourceRoot":""}