@abtnode/webapp 1.8.29 → 1.8.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blocklet.js +1 -1
- package/blocklet.yml +1 -1
- package/build/asset-manifest.json +15 -15
- package/build/index.html +1 -1
- package/build/static/js/4897.d9c2e84e.chunk.js +2 -0
- package/build/static/js/4897.d9c2e84e.chunk.js.map +1 -0
- package/build/static/js/{5306.7904606c.chunk.js → 5306.e57185ac.chunk.js} +2 -2
- package/build/static/js/5306.e57185ac.chunk.js.map +1 -0
- package/build/static/js/5720.cebd5eb8.chunk.js +2 -0
- package/build/static/js/{5720.6a664a49.chunk.js.map → 5720.cebd5eb8.chunk.js.map} +1 -1
- package/build/static/js/7595.2d41497d.chunk.js +2 -0
- package/build/static/js/7595.2d41497d.chunk.js.map +1 -0
- package/build/static/js/8440.0d3e6baf.chunk.js +2 -0
- package/build/static/js/{8440.ad893b9c.chunk.js.map → 8440.0d3e6baf.chunk.js.map} +1 -1
- package/build/static/js/976.d320954f.chunk.js +3 -0
- package/build/static/js/{976.5c646415.chunk.js.LICENSE.txt → 976.d320954f.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/976.d320954f.chunk.js.map +1 -0
- package/build/static/js/main.89f26b95.js +3 -0
- package/build/static/js/{main.b38edd14.js.LICENSE.txt → main.89f26b95.js.LICENSE.txt} +0 -0
- package/build/static/js/main.89f26b95.js.map +1 -0
- package/package.json +1 -1
- package/build/static/js/4897.2d04c339.chunk.js +0 -2
- package/build/static/js/4897.2d04c339.chunk.js.map +0 -1
- package/build/static/js/5306.7904606c.chunk.js.map +0 -1
- package/build/static/js/5720.6a664a49.chunk.js +0 -2
- package/build/static/js/7595.7fbdecd8.chunk.js +0 -2
- package/build/static/js/7595.7fbdecd8.chunk.js.map +0 -1
- package/build/static/js/8440.ad893b9c.chunk.js +0 -2
- package/build/static/js/976.5c646415.chunk.js +0 -3
- package/build/static/js/976.5c646415.chunk.js.map +0 -1
- package/build/static/js/main.b38edd14.js +0 -3
- package/build/static/js/main.b38edd14.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/8440.ad893b9c.chunk.js","mappings":"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","sources":["components/launch-blocklet/button.js","components/launch-blocklet/agreement-app.js","components/launch-blocklet/step-agreement.js","libs/api.js","components/launch-blocklet/center.js","components/launch-blocklet/step-complete.js","components/launch-blocklet/status/upgrade-available.js","contexts/runtime-blocklet-state.js","components/launch-blocklet/app-logo.js","components/launch-blocklet/step-install.js","pages/launch-blocklet/index.js","../../../blocklet/meta/lib/did.js","../../ux/lib/blocklet/util.js","../../ux/lib/launch-blocklet/content-layout.js","../../ux/lib/nav-logo.js"],"sourcesContent":["import { forwardRef } from 'react';\nimport Button from '@arcblock/ux/lib/Button';\nimport PropTypes from 'prop-types';\n\nfunction WrappedButton({ children, ...props }) {\n return (\n <Button variant=\"contained\" color=\"primary\" {...props}>\n {children}\n </Button>\n );\n}\n\nWrappedButton.propTypes = {\n children: PropTypes.any.isRequired,\n};\n\nexport default forwardRef((props, ref) => <WrappedButton {...props} forwardedRef={ref} />);\n","export default function AgreementApp({ ...props }) {\n return (\n <div {...props} style={{ width: '100%' }}>\n <h3>End User License Agreement for Application</h3>\n <p>Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28</p>\n <p>BLOCKLET SERVER LICENSE AGREEMENT</p>\n <p>暂无</p>\n </div>\n );\n}\n","import { useEffect, useState, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useNavigate, Link } from 'react-router-dom';\nimport styled from '@emotion/styled';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport ServerEula from '@blocklet/launcher-layout/lib/wizard/server-eula';\nimport WizardDesc from '@blocklet/launcher-layout/lib/wizard/wizard-desc';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport isEmpty from 'lodash/isEmpty';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport { useNodeContext } from '../../contexts/node';\nimport AgreementApp from './agreement-app';\nimport { getAccessibleUrl } from '../../libs/util';\nimport Button from './button';\n\n// TODO: 加载 Blocklet 定义的 Agreement\nexport default function Agreement({ blocklet, onClickNext, handleDescEle, showPageHeader }) {\n const navigate = useNavigate();\n const [accessUrl, setAccessUrl] = useState(null);\n const [error, setError] = useState(null);\n const [accessUrlLoading, setAccessUrlLoading] = useState(false);\n const { t, locale } = useLocaleContext();\n const { info, api } = useNodeContext();\n const { isRunning } = blocklet;\n const loading = useMemo(() => isEmpty(blocklet) || accessUrlLoading, [blocklet, accessUrlLoading]);\n\n const clickNext =\n onClickNext ||\n (() => {\n navigate(`/launch-blocklet/install${window.location.search}`);\n });\n\n useEffect(() => {\n const onMount = async () => {\n try {\n setAccessUrlLoading(true);\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n const urls = b.interfaces.map(x => x.url);\n const accessUrlTmp = await getAccessibleUrl(urls);\n if (!accessUrlTmp && isEmpty(accessUrlTmp)) {\n setAccessUrl(null);\n return;\n }\n setAccessUrl(new URL(accessUrlTmp).href);\n } catch (err) {\n setError(err.message);\n } finally {\n setAccessUrlLoading(false);\n }\n };\n if (isRunning) {\n onMount();\n }\n // eslint-disable-next-line\n }, [blocklet]);\n\n if (error) {\n return (\n <Center relative=\"parent\">\n <div>\n <Alert style={{ wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {error}\n </Alert>\n </div>\n </Center>\n );\n }\n\n if (loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const data = blocklet.meta;\n const blockletMeta = { data };\n\n if (!data) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (blocklet.isInstalled) {\n const already = accessUrl ? 'alreadyRunning' : 'alreadyInstalled';\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t(`launchBlocklet.${already}`, { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n <Button\n data-cy=\"view-blocklet\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n variant={accessUrl ? 'outlined' : 'contained'}\n color=\"primary\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n {accessUrl && (\n <Button className=\"last-button\" href={accessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if (!info) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n return (\n <Container>\n {showPageHeader && <PageHeader title={t('launchBlocklet.introduction')} subTitle={t('launchBlocklet.welcome')} />}\n <div className=\"app-content\">\n <div className=\"agreement\">\n <div className=\"agreement-content\">\n <WizardDesc blockletMeta={blockletMeta} locale={locale} handleDescEle={handleDescEle} />\n </div>\n </div>\n </div>\n <div className=\"button-container\" data-cy=\"agree-all\">\n <ServerEula\n onContinue={clickNext}\n description={<AgreementApp />}\n texts={{\n listenName: t('launchBlocklet.license'),\n buttonNext: t('launchBlocklet.next'),\n }}\n />\n </div>\n </Container>\n );\n}\n\nAgreement.propTypes = {\n blocklet: PropTypes.object.isRequired,\n onClickNext: PropTypes.func,\n handleDescEle: PropTypes.node,\n showPageHeader: PropTypes.bool,\n};\n\nAgreement.defaultProps = {\n onClickNext: null,\n handleDescEle: '',\n showPageHeader: true,\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 2px 24px 24px;\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n letter-spacing: normal;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ${props => props.theme.palette.grey['100']};\n border-radius: 12px;\n\n ${props => props.theme.breakpoints.up('md')} {\n margin-top: 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 0 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n ${props => props.theme.breakpoints.up('md')} {\n padding-right: 24px;\n margin-left: auto;\n }\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)};\n }\n`;\n","import axios from 'axios';\n\naxios.defaults.timeout = 10 * 1000; // 超时时间设为10s\n\nconst api = axios.create();\n\nexport { axios, api };\nexport default api;\n","import styled from '@emotion/styled';\n\nconst Center = styled.div`\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport default Center;\n","import styled from '@emotion/styled';\nimport PropTypes from 'prop-types';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nfunction Complete({ blocklet }) {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const query = useQuery();\n const accessUrl = decodeURIComponent(query.get('accessUrl') || '');\n\n if (isEmpty(blocklet)) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n return (\n <Container>\n <div className=\"body\">\n <ResultMessage\n variant=\"success\"\n title={getDisplayName(blocklet, true)}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n <Link href={accessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n {t('common.open')}\n </Link>\n }\n />\n </div>\n </Container>\n );\n}\n\nconst Link = styled.a`\n display: block;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst Container = styled(ContentLayout)`\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n ${props => {\n return props.theme.breakpoints.down('md');\n }} {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ${props => (props.variant === 'error' ? props.theme.palette.error.main : props.theme.palette.success.main)};\n }\n`;\n\nComplete.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nexport default Complete;\n","import PropTypes from 'prop-types';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Button from '../button';\n\nexport default function Upgrade({ onCancel, onUpgrade }) {\n const { t } = useLocaleContext();\n\n return (\n <ResultMessage\n variant=\"info\"\n title={t('launchBlocklet.newVersion')}\n subTitle={t('launchBlocklet.newVersionDesc')}\n footer={\n <>\n <Button onClick={onCancel} variant=\"outlined\">\n {t('launchBlocklet.later')}\n </Button>\n <Button onClick={onUpgrade} style={{ marginLeft: 24 }}>\n {t('launchBlocklet.upgradeNow')}\n </Button>\n </>\n }\n />\n );\n}\n\nUpgrade.propTypes = {\n onCancel: PropTypes.func,\n onUpgrade: PropTypes.func,\n};\n\nUpgrade.defaultProps = {\n onCancel: () => {},\n onUpgrade: () => {},\n};\n","// 获取blocklet在节点上的状态\nimport { useState, useEffect } from 'react';\nimport { BlockletStatus, BlockletEvents } from '@blocklet/constant';\nimport { useSubscription } from '../libs/ws';\nimport getClient from '../libs/node';\n\n/**\n *\n * @see: https://github.com/ArcBlock/blocklet-server/blob/cd80b9e1617a9b3ced64120e015912f63ffef805/blocklet/meta/lib/constants.js#L10-L26\n * @typedef {{\n * meta: {\n * did: string,\n * },\n * status: number,\n * error?: {\n * message: string\n * },\n * }} RuntimeBlocklet\n * @returns\n */\n\nconst BlockletStatusKeys = Object.keys(BlockletStatus);\nconst BlockletStatusValues = Object.values(BlockletStatus);\n\n/**\n *\n * 请确保在登录状态下传入 blockletDid\n * @param {String} blockletDid 应用的did\n * @return {{\n * status: string\n * eventName: string,\n * }}\n */\nexport default function useRuntimeBlockletState(blockletDid) {\n const client = getClient();\n\n const [blockletState, setBlockletState] = useState({\n status: null, // null代表没有查找到状态,空字符串代表未安装\n eventName: '',\n // runtimeBlocklet: undefined,\n // error: undefined, // 当触发 error 事件,才会有这个数据\n });\n\n // 首次更新加载blocklet状态\n useEffect(() => {\n // 没有初始状态就主动查询一次\n if (blockletDid && blockletState.status === null) {\n client.getBlocklet({ input: { did: blockletDid } }).then(e => {\n setBlockletState({\n status: e.blocklet ? e.blocklet.status : '',\n eventName: '',\n runtimeBlocklet: e.blocklet,\n isGetBlocklet: true, // 证明是通过 getBlocklet 接口获取的数据\n });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [blockletDid, blockletState.status]);\n\n const defaultBlockletEventHandler = blockletEventName => {\n return blocklet => {\n if (blocklet.meta.did === blockletDid) {\n const bState = {\n status: null,\n eventName: blockletEventName,\n runtimeBlocklet: blocklet,\n };\n\n if (blocklet.error) {\n bState.status = 'error';\n bState.error = blocklet.error;\n } else {\n bState.status = BlockletStatusKeys[BlockletStatusValues.indexOf(blocklet.status)];\n }\n setBlockletState(bState);\n }\n };\n };\n\n Object.values(BlockletEvents).forEach(blockletEventName => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSubscription(blockletEventName, defaultBlockletEventHandler(blockletEventName), [blockletDid]);\n });\n\n return blockletState;\n}\n","import PropTypes from 'prop-types';\nimport Img from '@arcblock/ux/lib/Img';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport defaultLogo from '../../assets/defaultLogo.png';\nimport { getBlockletLogoUrl } from '../../libs/util';\n\nexport default function AppLogo({ blocklet, blockletMetaUrl }) {\n const { did, logo: logoPath } = blocklet.meta;\n\n let content;\n\n if (logoPath) {\n content = (\n <Img\n src={getBlockletLogoUrl({\n did,\n logoPath,\n baseUrl: new URL(blockletMetaUrl).origin,\n })}\n fallback={defaultLogo}\n width={64}\n size=\"contain\"\n placeholder=\"application logo\"\n />\n );\n } else {\n content = <Avatar did={did} size={64} />;\n }\n\n return content;\n}\n\nAppLogo.propTypes = {\n blocklet: PropTypes.object.isRequired,\n blockletMetaUrl: PropTypes.string.isRequired,\n};\n","import { useEffect, useState, useMemo, useRef } from 'react';\nimport { useNavigate, Link } from 'react-router-dom';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport semver from 'semver';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\nimport ArrowForward from '@mui/icons-material/ArrowForward';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Center from '@arcblock/ux/lib/Center';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport { BlockletEvents } from '@blocklet/constant';\nimport LauncherResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Toast from '@abtnode/ux/lib/toast';\nimport AnimationWaiter from '@arcblock/ux/lib/AnimationWaiter';\nimport ProgressMessage from '@blocklet/launcher-ux/lib/progress-message';\nimport pWaitFor from 'p-wait-for';\nimport joinURL from 'url-join';\nimport { getServerAuthMethod } from '@abtnode/auth/lib/util/get-auth-method';\nimport { getLaunchURL } from '@abtnode/ux/lib/blocklet/util';\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport {\n getWebWalletUrl,\n getAccessibleUrl,\n extractStatusUrlFromNextWorkflow,\n isNewRegistryUrl,\n formatError,\n} from '../../libs/util';\nimport useQuery from '../../hooks/query';\nimport Button from './button';\nimport StatusUpgrade from './status/upgrade-available';\nimport useRuntimeBlockletState from '../../contexts/runtime-blocklet-state';\nimport AppLogo from './app-logo';\nimport serverLogo from '../../assets/logo.svg';\nimport { api as $api, axios } from '../../libs/api';\n\nexport default function Install({ blocklet }) {\n const query = useQuery();\n const { t, locale } = useLocaleContext();\n const blockletName = isEmpty(blocklet) ? null : getDisplayName(blocklet, true);\n const { api, info, loading: nodeLoading } = useNodeContext();\n const { session } = useSessionContext();\n const navigate = useNavigate();\n\n const [skipSetup] = useLocalStorage('skip-blocklet-setup', false);\n\n const [launching, setLaunching] = useState(false); // 进入安装状态的\n const [changeOfStatus, setChangeOfStatus] = useState(false);\n const [openAuth, setOpenAuth] = useState(false);\n const [nextAccessUrl, setNextAccessUrl] = useState('');\n\n const [upgradeAvailable, setUpgradeAvailable] = useState(null);\n const overUpgrade = useRef(''); // 点击过升级页面的操作(点击稍后或立即更新都算)\n\n const [connectData, setConnectData] = useState({\n action: '',\n baseUrl: '',\n checkFn: () => {},\n extraParams: {},\n });\n\n const [installError, setInstallError] = useState(null);\n\n const runtimeBlockletState = useRuntimeBlockletState(session.user ? blocklet?.meta?.did : '');\n const { status } = runtimeBlockletState;\n\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const blockletRegistryUrl = new URL(blockletMetaUrl).origin;\n // 当前安装过程中的状态\n const fromUrl = new URL(window.location.href).searchParams.get('from');\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => setLaunching(!!status), [!!status]);\n\n const addNewRegistryToRegistryList = async () => {\n const {\n meta: { registryUrl },\n } = blocklet;\n\n const { isNew: isNewStoreRegistry, decoded } = isNewRegistryUrl(registryUrl, info.blockletRegistryList);\n\n // 未添加到 store registryList,进行添加\n if (isNewStoreRegistry) {\n await api.addBlockletStore({ input: { url: decoded } });\n }\n };\n\n const handleLaunchStart = async () => {\n setInstallError(null);\n\n try {\n await addNewRegistryToRegistryList();\n } catch (error) {\n console.error('addNewRegistryToRegistryList error:', error);\n }\n\n // start launch\n const isAuthorized = session.user && (session.user.permissions || []).includes('mutate_blocklet');\n if (isAuthorized && blocklet.isFree) {\n setLaunching(true);\n setOpenAuth(false);\n await api\n .installBlocklet({\n input: { url: blockletMetaUrl },\n })\n .catch(err => {\n Toast.error(formatError(err));\n console.error('install blocklet failed', err);\n });\n return;\n }\n\n if (blocklet.isFree) {\n setConnectData({\n action: `launch-free-blocklet-by-${getServerAuthMethod(info)}`,\n baseUrl: undefined,\n checkFn: axios.create({ baseURL: window?.env?.apiPrefix ?? '/' }).get,\n extraParams: {\n blockletMetaUrl,\n },\n });\n } else if (session?.user) {\n // 用户登录了,就无须再次检验用户的passport\n setConnectData({\n action: 'verify-purchase-blocklet',\n baseUrl: new URL(blockletMetaUrl).origin,\n checkFn: axios.create({ baseURL: new URL(blockletMetaUrl).origin }).get,\n extraParams: {\n serverDid: info.did,\n blockletDid: blocklet?.meta?.did,\n blockletMetaUrl,\n },\n });\n } else {\n // 付费应用走nextWorkflow流程\n const nextWorkflowUrl = new URL(window.location.href);\n nextWorkflowUrl.pathname = joinURL(\n window?.env?.apiPrefix ?? '/',\n `/api/did/launch-paid-blocklet-by-${getServerAuthMethod(info)}/token`\n );\n nextWorkflowUrl.searchParams.set('autoConnect', false);\n nextWorkflowUrl.searchParams.set('blockletMetaUrl', blockletMetaUrl);\n const { data } = await $api.get(nextWorkflowUrl.href);\n\n setConnectData({\n action: 'verify-purchase-blocklet',\n baseUrl: new URL(blockletMetaUrl).origin,\n checkFn: axios.create({ baseURL: new URL(blockletMetaUrl).origin }).get,\n extraParams: {\n serverDid: info.did,\n blockletDid: blocklet?.meta?.did,\n nw: data.url,\n },\n });\n }\n setOpenAuth(true);\n };\n\n const handleConnectSuccess = async (result, decrypt) => {\n const success = async decryptedSessionToken => {\n Toast.success(t('launchBlocklet.dialog.success', locale));\n\n localStorage.setItem('__sst', decryptedSessionToken);\n await session.refresh();\n setLaunching(true);\n setOpenAuth(false);\n };\n\n const failure = async errorMessage => {\n Toast.error(errorMessage);\n setLaunching(false);\n setOpenAuth(false);\n };\n\n async function handleConnectSessionStatus(url) {\n return pWaitFor(\n () => {\n return $api.get(url).then(async ({ data }) => {\n if (data.status === 'succeed') {\n await success(data.sessionToken);\n return true;\n }\n if (data.status === 'error') {\n await failure(data?.error);\n return true;\n }\n return false;\n });\n },\n {\n interval: 1000,\n }\n );\n }\n\n const { extraParams } = connectData;\n\n if (extraParams?.nw) {\n const { statusUrl } = extractStatusUrlFromNextWorkflow(extraParams.nw);\n // 通过轮询获取状态\n await handleConnectSessionStatus(statusUrl);\n } else if (!blocklet.isFree && !extraParams?.nw) {\n // 付费应用不走nw流程,说明用户在已登录的情况下去安装一个付费应用,需要在前端触发应用的下载\n setLaunching(true);\n setOpenAuth(false);\n\n const input = {\n url: blockletMetaUrl,\n downloadTokenList: [],\n };\n\n if (result?.downloadTokenList) {\n input.downloadTokenList = decrypt(result.downloadTokenList);\n } else if (result?.downloadToken) {\n // backward compatibility for blocklet store\n input.downloadTokenList = [\n {\n did: blocklet.meta.did,\n token: decrypt(result.downloadToken),\n },\n ];\n }\n\n await api.installBlocklet({\n input,\n });\n } else {\n await success(decrypt(result.sessionToken));\n }\n };\n const redirectToBlockletOverview = b => {\n const accessUrl = `/blocklets/${b.meta.did}/configuration`;\n let nextUrl = `/launch-blocklet/complete?status=installed&name=${encodeURIComponent(\n blockletName\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`;\n\n const fromLauncher = query.get('from_launcher');\n if (fromLauncher) {\n nextUrl += `&from_launcher=${fromLauncher}`;\n }\n navigate(nextUrl);\n };\n\n // 跳转到下一步\n const visitBlocklet = async b => {\n const urls = b.interfaces.map(x => x.url);\n const accessUrl = await getAccessibleUrl(urls);\n\n if (isEmpty(accessUrl) || skipSetup) {\n setTimeout(() => {\n redirectToBlockletOverview(b);\n }, 1500);\n return;\n }\n\n const url = new URL(accessUrl);\n // install blocklet 并跳转到 blocklet setup 界面时携带 serverUrl 查询参数\n url.searchParams.set('serverUrl', getLaunchURL(blocklet, info)?.serverUrl);\n\n if (b.status !== 'running') {\n url.searchParams.set('__start__', '1');\n }\n\n const fromLauncher = query.get('from_launcher');\n if (fromLauncher) {\n url.searchParams.set('from_launcher', fromLauncher);\n }\n\n setNextAccessUrl(url.href);\n\n setTimeout(() => {\n window.location.href = url.href;\n }, 1500);\n };\n\n const checkBlockletCanNext = useMemo(() => {\n let timer;\n\n // wait Blocklet Services state updated\n const timeout = 1000;\n\n return _installedBlocklet => {\n clearTimeout(timer);\n timer = setTimeout(async () => {\n let installedBlocklet = _installedBlocklet;\n if (!installedBlocklet) {\n const meta = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n installedBlocklet = meta.blocklet;\n }\n\n if (installedBlocklet) {\n if (!overUpgrade.current && semver.gt(blocklet.meta.version, installedBlocklet.meta.version)) {\n // 安装的版本不是最新的\n if (!isEqual(upgradeAvailable, { installedBlocklet })) {\n setUpgradeAvailable({ installedBlocklet });\n }\n } else {\n visitBlocklet(installedBlocklet);\n }\n }\n }, timeout);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, blocklet?.meta?.did, upgradeAvailable]);\n\n const progressSteps = [\n t('launchBlocklet.waiting.verifying'),\n t('launchBlocklet.waiting.downloading'),\n t('launchBlocklet.waiting.extracting'),\n status === 'upgrading' ? t('common.upgrading') : t('launchBlocklet.waiting.installing'),\n t('launchBlocklet.waiting.done'),\n ];\n\n let installProgressIndex = 0;\n\n const changeStatus = () => !changeOfStatus && setChangeOfStatus(true);\n\n const handleInstalledProgress = () => {\n installProgressIndex = 4;\n checkBlockletCanNext(runtimeBlockletState.isGetBlocklet ? runtimeBlockletState.runtimeBlocklet : null);\n };\n\n switch (status) {\n case 'waiting':\n installProgressIndex = 1;\n changeStatus();\n break;\n case 'downloading':\n installProgressIndex = 2;\n changeStatus();\n break;\n case 'installing':\n case 'upgrading':\n installProgressIndex = 3;\n changeStatus();\n break;\n case 'installed':\n handleInstalledProgress();\n break;\n case 'starting':\n handleInstalledProgress();\n break;\n case 'running':\n handleInstalledProgress();\n break;\n case 'stopped':\n handleInstalledProgress();\n break;\n case 'corrupted':\n case 'error':\n // WARN: 暂时不要直接使用 runtimeBlockletState 的 error 数据;\n // 当下载中失败时,core/webapp/src/libs/ws.js 触发downloadFailed后,会更新一次 downloading,会让 error 被清理;所以error后,要通过 setState(setInstallError) 保存后使用;\n {\n const errorData = {\n message: runtimeBlockletState.error.message,\n name: runtimeBlockletState.eventName,\n };\n\n if ([BlockletEvents.downloadFailed, BlockletEvents.installFailed].includes(runtimeBlockletState.eventName)) {\n errorData.action = 'retry';\n } else if (status === 'error' || status === 'corrupted') {\n errorData.action = 'view';\n }\n if (!isEqual(errorData, installError)) {\n if (runtimeBlockletState?.error?.message) {\n Toast.error(formatError(runtimeBlockletState.error));\n }\n setInstallError(errorData);\n }\n }\n\n break;\n default:\n }\n\n if ((session.user && status === null) || isEmpty(blocklet) || nodeLoading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (installError) {\n const errorActions = {\n view: (\n <Button\n className=\"bottom-button\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n data-cy=\"view-blocklet\"\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n ),\n retry: (\n <ButtonContainer>\n <Button className=\"bottom-button\" data-cy=\"retry-install\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.retry')}\n </Button>\n {fromUrl && (\n <Button\n variant=\"text\"\n className=\"bottom-button\"\n data-cy=\"go-back\"\n disabled={openAuth}\n onClick={() => {\n window.location.href = fromUrl;\n }}>\n {t('common.back')}\n </Button>\n )}\n </ButtonContainer>\n ),\n };\n\n const errorEventName = installError.name ? installError.name.replace('blocklet.', '') : 'installFailed';\n\n return (\n <ResultMessage\n variant=\"error\"\n title={blockletName}\n subTitle={\n <ErrorMessageSub>\n <div>{t(`launchBlocklet.error.${errorEventName}`)}</div>\n {installError.message && (\n <div className=\"error-desc\">{t('common.errorMessage') + installError.message}</div>\n )}\n </ErrorMessageSub>\n }\n footer={errorActions[installError.action]}\n />\n );\n }\n\n const handleCancelUpgrade = () => {\n setChangeOfStatus(true);\n overUpgrade.current = 'cancel';\n setUpgradeAvailable(null);\n visitBlocklet(upgradeAvailable.installedBlocklet);\n };\n const handleUpgrade = async () => {\n const input = {\n did: blocklet.meta.did,\n version: blocklet.meta.version,\n registryUrl: blockletRegistryUrl,\n };\n\n overUpgrade.current = 'upgrade';\n setUpgradeAvailable(null);\n\n await api.upgradeBlocklet({ input });\n };\n\n if (upgradeAvailable) {\n return <StatusUpgrade onCancel={() => handleCancelUpgrade()} onUpgrade={() => handleUpgrade()} />;\n }\n\n if (!changeOfStatus && (status === 'installed' || status === 'running')) {\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t('launchBlocklet.alreadyExists', { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n {!nextAccessUrl && <Spinner size={[16, 10]} />}\n {nextAccessUrl && (\n <Button className=\"last-button\" href={nextAccessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if ((launching && nextAccessUrl) || overUpgrade.current === 'cancel') {\n return (\n <ResultMessage\n variant={nextAccessUrl ? 'success' : 'loading'}\n title={nextAccessUrl ? blockletName : ''}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n nextAccessUrl ? (\n <LinkEle href={nextAccessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n <Spinner size={[16, 10]} style={{ marginRight: 14 }} /> {t('common.redirecting')}\n </LinkEle>\n ) : (\n ''\n )\n }\n style={{ marginBottom: 34 }}\n />\n );\n }\n\n const showInstall = !launching && !status;\n\n return (\n <Container>\n <div className=\"header\">\n {!nextAccessUrl && (\n <PageHeader\n title={showInstall ? t('common.install') : t('common.installing')}\n subTitle={showInstall ? t('launchBlocklet.subTitle', { appName: blockletName, serverName: info.name }) : ''}\n />\n )}\n </div>\n <div className=\"body\">\n {showInstall && (\n <>\n <div className=\"illustrations\">\n <div className=\"ills-block ills-block-left\">\n <div className=\"ills-block-inner\">\n <AppLogo className=\"i-icon\" blocklet={blocklet} blockletMetaUrl={blockletMetaUrl} />\n <div className=\"i-name\">{blockletName}</div>\n </div>\n </div>\n <ArrowForward className=\"arrow-icon\" />\n <div className=\"ills-block ills-block-right\">\n <div className=\"ills-block-inner\">\n <img width=\"64\" height=\"64\" src={serverLogo} alt=\"\" />\n <div className=\"i-name\">{info.name}</div>\n <DidAddress\n size={12}\n prepend={<Avatar did={info.did} size={12} style={{ marginRight: 4 }} />}\n responsive={false}\n compact>\n {info.did}\n </DidAddress>\n </div>\n </div>\n </div>\n <Button className=\"bottom-button\" data-cy=\"start-launch\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('launchBlocklet.confirmInstall')}\n </Button>\n </>\n )}\n {launching && (\n <WaiterContainer>\n <AnimationWaiter\n increaseSpeed={0.3}\n messageLoop={false}\n message={\n <ProgressMessage\n steps={progressSteps}\n stepIndex={installProgressIndex}\n autoGrowth={installProgressIndex === 4 ? 1000 : 4000}\n />\n }\n />\n </WaiterContainer>\n )}\n </div>\n <Connect\n open={openAuth}\n popup\n saveConnect={false}\n className=\"connect\"\n baseUrl={connectData.baseUrl}\n action={connectData.action}\n checkFn={connectData.checkFn}\n extraParams={connectData.extraParams}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={getWebWalletUrl(info)}\n onSuccess={handleConnectSuccess}\n onClose={() => setOpenAuth(false)}\n locale={locale}\n messages={{\n title: `${t('launchBlocklet.dialog.title')}`,\n scan: blocklet.isFree\n ? t('launchBlocklet.dialog.freeDescription')\n : t('launchBlocklet.dialog.nonFreeDescription'),\n confirm: t('launchBlocklet.dialog.confirm'),\n success: t('launchBlocklet.dialog.success'),\n }}\n />\n </Container>\n );\n}\n\nInstall.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Container = styled(ContentLayout)`\n .body {\n align-items: center;\n animation: fadein ease 0.3s;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n ${props => props.theme.breakpoints.down('md')} {\n margin: 25px 24px 0;\n }\n }\n\n @keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n`;\n\nconst WaiterContainer = styled.div`\n color: #1dc1c7;\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)};\n }\n`;\n\nconst LinkEle = styled.a`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst ErrorMessageSub = styled.div`\n line-height: 1.4em;\n .error-desc {\n margin-top: 8px;\n word-wrap: break-word;\n color: ${props => props.theme.palette.grey[500]};\n }\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: space-around;\n flex-wrap: wrap;\n button {\n margin: 0 10px 18px;\n }\n`;\n\nconst ResultMessage = styled(LauncherResultMessage)`\n .result-footer {\n height: auto;\n }\n`;\n","import { useEffect, useState } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\nimport { useAsync } from 'react-use';\nimport joinUrl from 'url-join';\nimport { Global, css } from '@emotion/react';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport styled from '@emotion/styled';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Layout from '@blocklet/launcher-layout';\nimport { StepProvider } from '@blocklet/launcher-layout/lib/context/step';\nimport HeaderAddon from '@abtnode/ux/lib/layout/addon';\nimport LauncherLogoNotext from '@arcblock/icons/lib/LauncherLogoNotext';\nimport ServerLogoNotext from '@arcblock/icons/lib/ServerLogoNotext';\nimport ServerLogo from '@arcblock/icons/lib/ServerLogo';\nimport LauncherLogo from '@arcblock/icons/lib/LauncherLogo';\nimport NavLogo from '@abtnode/ux/lib/nav-logo';\nimport { getLaunchURL } from '@abtnode/ux/lib/blocklet/util';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nimport Center from '../../components/launch-blocklet/center';\nimport Complete from '../../components/launch-blocklet/step-complete';\nimport Install from '../../components/launch-blocklet/step-install';\nimport Agreement from '../../components/launch-blocklet/step-agreement';\nimport { getBlockletLogoUrl, getPathPrefix, getWebWalletUrl } from '../../libs/util';\nimport { SessionContext } from '../../contexts/session';\n\n// TODO: add skeleton here\nexport default function BlockletLauncher() {\n const isMobile = useMediaQuery(theme => theme.breakpoints.down('md'));\n const { t, locale } = useLocaleContext();\n const query = useQuery();\n const { api, info } = useNodeContext();\n const fromLauncher = !!query.get('from_launcher');\n const webWalletUrl = getWebWalletUrl(info);\n const [serverUrl, setServerUrl] = useState('');\n\n const path = '/launch-blocklet';\n\n let url = (query.get('blocklet_meta_url') || '').trim();\n url = decodeURIComponent(url);\n\n const state = useAsync(async () => {\n if (!url) {\n throw new Error(t('common.invalidParam'));\n }\n\n const { meta, isFree, isInstalled, isRunning } = await api.getBlockletMetaFromUrl({\n input: { url, checkPrice: true },\n });\n if (!meta) {\n throw new Error(t('launchBlocklet.error.loadMetaFailed'));\n }\n\n return { meta, isFree, isInstalled, isRunning };\n });\n\n useEffect(() => {\n if (state.value && info) {\n const urlInfo = getLaunchURL(state.value, info);\n setServerUrl(urlInfo.serverUrl);\n }\n }, [state.value, info]);\n\n if (state.error) {\n return (\n <Center>\n <div>\n <Alert style={{ width: '100%', wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {state.error.message}\n </Alert>\n </div>\n </Center>\n );\n }\n\n const { meta, isFree } = state.value || {};\n const basePath = joinUrl(getPathPrefix(), path);\n const steps = [\n {\n key: 'agreement',\n name: t('launchBlocklet.introduction'),\n path: joinUrl(basePath, 'agreement'),\n },\n {\n key: 'install',\n name: t('launchBlocklet.launch'),\n path: joinUrl(basePath, 'install'),\n },\n {\n key: 'setup',\n name: t('launchBlocklet.setup'),\n path: joinUrl(basePath, 'complete'),\n description: t('launchBlocklet.setupAppDesc'),\n },\n {\n key: 'complete',\n name: t('launchBlocklet.launched'),\n },\n ];\n\n const clickLogo = () => {\n if (serverUrl) {\n window.open(serverUrl);\n }\n };\n\n let navLogo = (\n <LogoContainer className={`${serverUrl ? 'logo-can-click' : ''}`}>\n <NavLogo\n onClick={clickLogo}\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n />\n </LogoContainer>\n );\n\n // 从launcher 代表已经同意了 blocklet agreement\n if (fromLauncher) {\n steps.splice(\n 0,\n 1,\n {\n key: 'wizard',\n name: t('launchBlocklet.introduction'),\n },\n {\n key: 'select-node',\n name: t('launchBlocklet.selectAbtNode'),\n }\n );\n\n navLogo = (\n <LogoContainer className={`${serverUrl ? 'logo-can-click' : ''}`}>\n <NavLogo\n logo={\n !isMobile ? (\n <ServerLogo onClick={clickLogo} width=\"128\" height=\"48\" />\n ) : (\n <ServerLogoNotext onClick={clickLogo} width=\"32\" height=\"32\" />\n )\n }\n previousData={{\n logo: !isMobile ? <LauncherLogo width=\"145\" height=\"48\" /> : <LauncherLogoNotext width=\"32\" height=\"32\" />,\n }}\n />\n </LogoContainer>\n );\n }\n\n if (meta) {\n meta.registryUrl = new URL(url).origin;\n }\n\n return (\n <StepProvider steps={steps}>\n <Layout\n locale={locale}\n blockletMeta={{ ...meta, isFree }}\n useOfSkeleton={false}\n navLogo={navLogo}\n headerEndAddons={<HeaderAddon webWalletUrl={webWalletUrl} SessionContext={SessionContext} />}\n pcWidth=\"80%\"\n style={{ height: '100%' }}\n logoUrl={\n meta && meta.logo\n ? getBlockletLogoUrl({\n did: meta.did,\n baseUrl: meta.registryUrl,\n logoPath: meta.logo,\n })\n : null\n }>\n <Content>\n <Global styles={launcherGlobalStyle} />\n <Routes>\n <Route path=\"agreement\" element={<Agreement blocklet={state.value || {}} />} />\n <Route path=\"install\" element={<Install blocklet={state.value || {}} />} />\n <Route path=\"complete\" element={<Complete blocklet={state.value || {}} />} />\n <Route path=\"*\" element={<Navigate to={`agreement${window.location.search}`} replace />} />\n </Routes>\n </Content>\n </Layout>\n </StepProvider>\n );\n}\n\nconst launcherGlobalStyle = css`\n html,\n body,\n #root,\n #root > .wrapper {\n height: 100%;\n }\n`;\n\nconst Content = styled.div`\n ${props => props.theme.breakpoints.up('md')} {\n padding-top: 34px;\n }\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n`;\n\nconst LogoContainer = styled.div`\n margin-top: -1px;\n &.logo-can-click {\n cursor: pointer;\n }\n`;\n","const { types } = require('@ocap/mcrypto');\nconst { toHex } = require('@ocap/util');\nconst { fromPublicKey } = require('@arcblock/did');\n\nconst toBlockletDid = (name) => {\n const pk = toHex(Buffer.from(typeof name === 'string' ? name.trim() : name));\n return fromPublicKey(pk, { role: types.RoleType.ROLE_ANY });\n};\n\nmodule.exports = toBlockletDid;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.downloadExportedSource = downloadExportedSource;\nexports.genExportedMeta = genExportedMeta;\nexports.getLaunchURL = exports.getLaunchAgreementUrl = void 0;\nexports.getNameByTitle = getNameByTitle;\nvar _cloneDeep = _interopRequireDefault(require(\"lodash/cloneDeep\"));\nvar _pickBy = _interopRequireDefault(require(\"lodash/pickBy\"));\nvar _jszip = _interopRequireDefault(require(\"jszip\"));\nvar _jsYaml = _interopRequireDefault(require(\"js-yaml\"));\nvar _fileSaver = _interopRequireDefault(require(\"file-saver\"));\nvar _urlJoin = _interopRequireDefault(require(\"url-join\"));\nvar _did = _interopRequireDefault(require(\"@blocklet/meta/lib/did\"));\nvar _didMotif = require(\"@arcblock/did-motif\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nconst base64ToArrayBuffer = base64 => {\n const bufStr = window.atob(base64);\n const bytes = new Uint8Array(bufStr.length);\n for (let i = 0; i < bufStr.length; i++) {\n bytes[i] = bufStr.charCodeAt(i);\n }\n return bytes;\n};\nconst getLogo = did => {\n const url = (0, _didMotif.toDataURL)(did, {\n size: 200\n });\n const base64 = url.replace(/^[^,]*,/, '');\n return base64ToArrayBuffer(base64);\n};\nfunction getNameByTitle(title) {\n return title.replace(/[\\s/@_]/g, '-').replace(/[^a-zA-Z0-9_-]/g, '').replace(/(^[-\\s]+)|([-\\s]+$)/g, '').toLowerCase();\n}\nfunction genExportedMeta(name, blocklet) {\n const meta = (0, _pickBy.default)((0, _cloneDeep.default)(blocklet.meta), x => x !== null);\n meta.name = name;\n meta.did = (0, _did.default)(name);\n meta.logo = 'logo.png';\n meta.interfaces.forEach(x => {\n // filter null or undefined\n if (!x.services) {\n delete x.services;\n }\n });\n blocklet.children.forEach(child => {\n if (child.dynamic && child.bundleSource) {\n meta.children.push({\n name: child.meta.name,\n source: child.bundleSource,\n title: child.meta.title,\n mountPoint: child.mountPoint\n });\n }\n });\n meta.environments = (blocklet.configs || []).map(x => ({\n name: x.key,\n description: 'Automatically generated when exporting',\n required: !!x.required,\n secure: !!x.secure,\n default: x.secure ? '' : x.value || ''\n }));\n meta.capabilities.component = false;\n return meta;\n}\nconst license = holder => \"Copyright \\xA9 2022 \".concat(holder || '', \"\\n\\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\u201CSoftware\\u201D), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\\n\\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\u201CAS IS\\u201D, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\");\nconst Gitignore = \".DS_Store\\n.blocklet\";\nconst GithubAction = \"name: Deploy\\n\\non:\\n push:\\n branches:\\n - main\\n\\njobs:\\n Deploy:\\n runs-on: ubuntu-latest\\n\\n steps:\\n - name: Checkout repo\\n uses: actions/checkout@v2\\n\\n - name: Blocklet workflow\\n uses: blocklet/action-workflow@v1\\n with:\\n skip-upload: true\\n skip-deploy: true\\n bundle-command: blocklet bundle --create-release\\n github-token: ${{ secrets.GITHUB_TOKEN }}\";\nasync function downloadExportedSource(meta) {\n let {\n holder\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const folderName = \"\".concat(meta.name.split('/').pop());\n const readme = \"# \".concat(meta.title, \"\\n\\n## Introduction\\n\\n\").concat(meta.description);\n const zip = new _jszip.default();\n const folder = zip.folder(folderName);\n folder.file('blocklet.yml', _jsYaml.default.dump(meta));\n folder.file('blocklet.md', readme);\n folder.file('README.md', readme);\n folder.file('logo.png', getLogo(meta.did));\n folder.file('LICENSE', license(holder));\n folder.file('.gitignore', Gitignore);\n folder.folder('screenshots').file('.gitkeep', '');\n folder.folder('.github').folder('workflows').file('main.yml', GithubAction);\n await new Promise((resolve, reject) => {\n zip.generateAsync({\n type: 'blob'\n }).then(content => {\n (0, _fileSaver.default)(content, \"\".concat(folderName, \".zip\"));\n resolve();\n }).catch(err => {\n reject(err);\n });\n });\n}\nconst getLaunchURL = function getLaunchURL(meta, info) {\n let encodeURI = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n const adminPath = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';\n const serverUrl = encodeURI ? encodeURIComponent((0, _urlJoin.default)(window.location.origin, adminPath)) : (0, _urlJoin.default)(window.location.origin, adminPath);\n const metaUrl = (0, _urlJoin.default)(info === null || info === void 0 ? void 0 : info.blockletRegistry, \"/api/blocklets/\".concat(meta.did, \"/blocklet.json\"));\n return {\n serverUrl,\n metaUrl\n };\n};\nexports.getLaunchURL = getLaunchURL;\nconst getLaunchAgreementUrl = (meta, info) => {\n const {\n metaUrl,\n serverUrl\n } = getLaunchURL(meta, info);\n const url = new URL((0, _urlJoin.default)(serverUrl, '/launch-blocklet/agreement'));\n url.searchParams.set('blocklet_meta_url', metaUrl);\n url.searchParams.set('from', window.location.href);\n return url.href;\n};\nexports.getLaunchAgreementUrl = getLaunchAgreementUrl;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ContentLayout;\nvar _styled = _interopRequireDefault(require(\"@emotion/styled\"));\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _templateObject;\nconst _excluded = [\"children\"];\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction ContentLayout(_ref) {\n let {\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(Container, _objectSpread(_objectSpread({}, props), {}, {\n children: children\n }));\n}\nContentLayout.propTypes = {\n children: _propTypes.default.any.isRequired\n};\nconst Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral([\"\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n width: 100%;\\n height: 100%;\\n\\n .header {\\n text-align: center;\\n }\\n\\n .body {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n margin-top: 30px;\\n width: 100%;\\n min-height: 200px;\\n flex: 1;\\n\\n \", \" {\\n padding: 24px;\\n }\\n\\n \", \" {\\n padding: 0 16px 16px;\\n }\\n }\\n\\n .footer {\\n display: flex;\\n justify-content: center;\\n\\n \", \" {\\n padding-bottom: 34px;\\n }\\n\\n \", \" {\\n margin-top: auto;\\n padding-bottom: 10px;\\n }\\n }\\n\"])), props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'));","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = LogoContainer;\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _styled = _interopRequireDefault(require(\"@emotion/styled\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _templateObject, _templateObject2;\nconst _excluded = [\"logo\", \"name\", \"subname\", \"previousData\"],\n _excluded2 = [\"logo\"];\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction LogoContainer(_ref) {\n let {\n logo,\n name,\n subname,\n previousData\n } = _ref,\n rest = _objectWithoutProperties(_ref, _excluded);\n let logoEle = /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: logo\n });\n let nameEle = name;\n let subnameEle = subname;\n if (previousData.logo) {\n logoEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: logo,\n className: \"left-fade-in-ele\"\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: previousData.logo,\n className: \"postion-abs left-fade-out-ele\"\n })]\n });\n }\n if (previousData.name && previousData.name !== name) {\n nameEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"right-fade-in-ele\",\n style: {\n display: 'inline-block'\n },\n children: name\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"postion-abs right-fade-out-ele\",\n children: previousData.name\n })]\n });\n }\n if (previousData.subname && previousData.subname !== subname) {\n subnameEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"right-fade-in-ele\",\n style: {\n display: 'inline-block'\n },\n children: subname\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"postion-abs right-fade-out-ele\",\n children: previousData.subname\n })]\n });\n }\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(Container, _objectSpread(_objectSpread({}, rest), {}, {\n children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(\"div\", {\n className: \"logo-inner\",\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-img-content\",\n children: logoEle\n }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(\"div\", {\n className: \"logo-info \".concat(!name && !subname ? 'zero-left' : ''),\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-name\",\n children: nameEle\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-subname\",\n children: subnameEle\n })]\n })]\n })\n }));\n}\nLogoContainer.propTypes = {\n logo: _propTypes.default.element.isRequired,\n name: _propTypes.default.string,\n subname: _propTypes.default.string,\n previousData: _propTypes.default.object\n};\nLogoContainer.defaultProps = {\n name: '',\n subname: '',\n previousData: {\n logo: '',\n name: '',\n subname: ''\n }\n};\n\n// eslint-disable-next-line react/prop-types\nfunction LogoImg(_ref2) {\n let {\n logo\n } = _ref2,\n rest = _objectWithoutProperties(_ref2, _excluded2);\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImgDiv, _objectSpread(_objectSpread({}, rest), {}, {\n children: logo\n }));\n}\nconst LogoImgDiv = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral([\"\\n display: block;\\n > * {\\n display: block;\\n }\\n\"])));\nconst Container = _styled.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral([\"\\n position: relative;\\n display: block;\\n\\n .logo-inner {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n .logo-img-content {\\n position: relative;\\n display: block;\\n }\\n .logo-info {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n margin-left: 10px;\\n letter-spacing: 0.1px;\\n &.zero-left {\\n margin-left: 0%;\\n }\\n .logo-name {\\n position: relative;\\n line-height: 16px;\\n font-size: 16px;\\n color: #121319;\\n }\\n .logo-subname {\\n position: relative;\\n line-height: 13px;\\n font-size: 13px;\\n color: #7d8085;\\n }\\n }\\n }\\n\\n .postion-abs {\\n position: absolute;\\n left: 0;\\n top: 0;\\n height: 100%;\\n }\\n\\n .right-fade-out-ele {\\n animation: right-fade-out ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: forwards;\\n }\\n\\n .right-fade-in-ele {\\n animation: right-fade-in ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: both;\\n }\\n\\n @keyframes right-fade-out {\\n 0% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(8px, 0);\\n }\\n }\\n\\n @keyframes right-fade-in {\\n 0% {\\n opacity: 0;\\n transform: translate(8px, 0);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n }\\n\\n .left-fade-out-ele {\\n animation: left-fade-out ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: forwards;\\n }\\n\\n .left-fade-in-ele {\\n animation: left-fade-in ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: both;\\n }\\n\\n @keyframes left-fade-out {\\n 0% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-8px, 0);\\n }\\n }\\n\\n @keyframes left-fade-in {\\n 0% {\\n opacity: 0;\\n transform: translate(-8px, 0);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n }\\n\"])));"],"names":["WrappedButton","children","props","variant","color","forwardRef","ref","forwardedRef","AgreementApp","style","width","Agreement","blocklet","onClickNext","handleDescEle","showPageHeader","navigate","useNavigate","useState","accessUrl","setAccessUrl","error","setError","accessUrlLoading","setAccessUrlLoading","useLocaleContext","t","locale","useNodeContext","info","api","isRunning","loading","useMemo","isEmpty","clickNext","window","location","search","useEffect","onMount","getBlocklet","input","did","meta","b","urls","interfaces","map","x","url","getAccessibleUrl","accessUrlTmp","URL","href","message","Center","relative","Alert","wordBreak","type","Spinner","data","blockletMeta","isInstalled","already","title","subTitle","name","getDisplayName","footer","ButtonWrap","component","Link","to","className","Container","onContinue","description","texts","listenName","buttonNext","defaultProps","styled","theme","breakpoints","down","palette","grey","up","spacing","axios","primary","main","ContentLayout","success","query","useQuery","decodeURIComponent","get","serverName","rel","Upgrade","onCancel","onUpgrade","onClick","marginLeft","BlockletStatusKeys","Object","keys","BlockletStatus","BlockletStatusValues","values","useRuntimeBlockletState","blockletDid","client","getClient","status","eventName","blockletState","setBlockletState","then","e","runtimeBlocklet","isGetBlocklet","BlockletEvents","forEach","blockletEventName","useSubscription","bState","indexOf","defaultBlockletEventHandler","AppLogo","blockletMetaUrl","logoPath","logo","Img","src","getBlockletLogoUrl","baseUrl","origin","fallback","size","placeholder","Avatar","propTypes","PropTypes","Install","blockletName","nodeLoading","session","useSessionContext","useLocalStorage","skipSetup","launching","setLaunching","changeOfStatus","setChangeOfStatus","openAuth","setOpenAuth","nextAccessUrl","setNextAccessUrl","upgradeAvailable","setUpgradeAvailable","overUpgrade","useRef","action","checkFn","extraParams","connectData","setConnectData","installError","setInstallError","runtimeBlockletState","user","blockletRegistryUrl","fromUrl","searchParams","addNewRegistryToRegistryList","registryUrl","isNewRegistryUrl","blockletRegistryList","isNewStoreRegistry","isNew","decoded","addBlockletStore","handleLaunchStart","console","permissions","includes","isFree","installBlocklet","catch","err","Toast","formatError","getServerAuthMethod","undefined","baseURL","env","apiPrefix","serverDid","nextWorkflowUrl","pathname","joinURL","set","$api","nw","handleConnectSuccess","result","decrypt","handleConnectSessionStatus","pWaitFor","sessionToken","failure","interval","decryptedSessionToken","localStorage","setItem","refresh","errorMessage","extractStatusUrlFromNextWorkflow","statusUrl","downloadTokenList","downloadToken","token","redirectToBlockletOverview","nextUrl","encodeURIComponent","fromLauncher","visitBlocklet","setTimeout","getLaunchURL","serverUrl","checkBlockletCanNext","timer","_installedBlocklet","clearTimeout","installedBlocklet","current","semver","version","isEqual","progressSteps","installProgressIndex","changeStatus","handleInstalledProgress","errorData","errorActions","view","retry","ButtonContainer","disabled","errorEventName","replace","ResultMessage","ErrorMessageSub","handleUpgrade","upgradeBlocklet","LinkEle","marginRight","marginBottom","showInstall","appName","ArrowForward","height","serverLogo","alt","prepend","responsive","compact","WaiterContainer","AnimationWaiter","increaseSpeed","messageLoop","steps","stepIndex","autoGrowth","Connect","open","popup","saveConnect","checkTimeout","socketUrl","webWalletUrl","getWebWalletUrl","onSuccess","onClose","messages","scan","confirm","LauncherResultMessage","BlockletLauncher","isMobile","useMediaQuery","setServerUrl","trim","state","useAsync","Error","getBlockletMetaFromUrl","checkPrice","value","urlInfo","basePath","joinUrl","getPathPrefix","key","path","clickLogo","navLogo","LogoContainer","ServerLogoNotext","ServerLogo","splice","previousData","LauncherLogoNotext","LauncherLogo","StepProvider","useOfSkeleton","headerEndAddons","SessionContext","pcWidth","logoUrl","Content","Global","styles","launcherGlobalStyle","element","css","types","require","toHex","fromPublicKey","module","exports","pk","Buffer","from","role","RoleType","ROLE_ANY","defineProperty","downloadExportedSource","genExportedMeta","_pickBy","default","_cloneDeep","_did","services","child","dynamic","bundleSource","push","source","mountPoint","environments","configs","required","secure","capabilities","getLaunchAgreementUrl","getNameByTitle","toLowerCase","_interopRequireDefault","_jszip","_jsYaml","_fileSaver","_urlJoin","_didMotif","obj","__esModule","getLogo","base64","bufStr","atob","bytes","Uint8Array","length","i","charCodeAt","base64ToArrayBuffer","toDataURL","license","holder","concat","Gitignore","GithubAction","folderName","split","pop","readme","zip","folder","file","dump","Promise","resolve","reject","generateAsync","content","encodeURI","arguments","adminPath","routing","metaUrl","blockletRegistry","_templateObject","_styled","_propTypes","_jsxRuntime","_excluded","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread","target","_defineProperty","getOwnPropertyDescriptors","defineProperties","configurable","writable","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","prototype","propertyIsEnumerable","call","_ref","jsx","any","isRequired","strings","raw","div","slice","freeze","_templateObject2","_excluded2","_taggedTemplateLiteral","subname","rest","logoEle","LogoImg","nameEle","subnameEle","jsxs","Fragment","display","_ref2","LogoImgDiv","string"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/js/8440.0d3e6baf.chunk.js","mappings":"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","sources":["components/launch-blocklet/button.js","components/launch-blocklet/agreement-app.js","components/launch-blocklet/step-agreement.js","libs/api.js","components/launch-blocklet/center.js","components/launch-blocklet/step-complete.js","components/launch-blocklet/status/upgrade-available.js","contexts/runtime-blocklet-state.js","components/launch-blocklet/app-logo.js","components/launch-blocklet/step-install.js","pages/launch-blocklet/index.js","../../../blocklet/meta/lib/did.js","../../ux/lib/blocklet/util.js","../../ux/lib/launch-blocklet/content-layout.js","../../ux/lib/nav-logo.js"],"sourcesContent":["import { forwardRef } from 'react';\nimport Button from '@arcblock/ux/lib/Button';\nimport PropTypes from 'prop-types';\n\nfunction WrappedButton({ children, ...props }) {\n return (\n <Button variant=\"contained\" color=\"primary\" {...props}>\n {children}\n </Button>\n );\n}\n\nWrappedButton.propTypes = {\n children: PropTypes.any.isRequired,\n};\n\nexport default forwardRef((props, ref) => <WrappedButton {...props} forwardedRef={ref} />);\n","export default function AgreementApp({ ...props }) {\n return (\n <div {...props} style={{ width: '100%' }}>\n <h3>End User License Agreement for Application</h3>\n <p>Blocklet Server License Agreement ArcBlock, Inc. version 2020-08-28</p>\n <p>BLOCKLET SERVER LICENSE AGREEMENT</p>\n <p>暂无</p>\n </div>\n );\n}\n","import { useEffect, useState, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { useNavigate, Link } from 'react-router-dom';\nimport styled from '@emotion/styled';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport ServerEula from '@blocklet/launcher-layout/lib/wizard/server-eula';\nimport WizardDesc from '@blocklet/launcher-layout/lib/wizard/wizard-desc';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport isEmpty from 'lodash/isEmpty';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport { useNodeContext } from '../../contexts/node';\nimport AgreementApp from './agreement-app';\nimport { getAccessibleUrl } from '../../libs/util';\nimport Button from './button';\n\n// TODO: 加载 Blocklet 定义的 Agreement\nexport default function Agreement({ blocklet, onClickNext, handleDescEle, showPageHeader }) {\n const navigate = useNavigate();\n const [accessUrl, setAccessUrl] = useState(null);\n const [error, setError] = useState(null);\n const [accessUrlLoading, setAccessUrlLoading] = useState(false);\n const { t, locale } = useLocaleContext();\n const { info, api } = useNodeContext();\n const { isRunning } = blocklet;\n const loading = useMemo(() => isEmpty(blocklet) || accessUrlLoading, [blocklet, accessUrlLoading]);\n\n const clickNext =\n onClickNext ||\n (() => {\n navigate(`/launch-blocklet/install${window.location.search}`);\n });\n\n useEffect(() => {\n const onMount = async () => {\n try {\n setAccessUrlLoading(true);\n const { blocklet: b } = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n const urls = b.interfaces.map(x => x.url);\n const accessUrlTmp = await getAccessibleUrl(urls);\n if (!accessUrlTmp && isEmpty(accessUrlTmp)) {\n setAccessUrl(null);\n return;\n }\n setAccessUrl(new URL(accessUrlTmp).href);\n } catch (err) {\n setError(err.message);\n } finally {\n setAccessUrlLoading(false);\n }\n };\n if (isRunning) {\n onMount();\n }\n // eslint-disable-next-line\n }, [blocklet]);\n\n if (error) {\n return (\n <Center relative=\"parent\">\n <div>\n <Alert style={{ wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {error}\n </Alert>\n </div>\n </Center>\n );\n }\n\n if (loading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n const data = blocklet.meta;\n const blockletMeta = { data };\n\n if (!data) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (blocklet.isInstalled) {\n const already = accessUrl ? 'alreadyRunning' : 'alreadyInstalled';\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t(`launchBlocklet.${already}`, { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n <Button\n data-cy=\"view-blocklet\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n variant={accessUrl ? 'outlined' : 'contained'}\n color=\"primary\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n {accessUrl && (\n <Button className=\"last-button\" href={accessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if (!info) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n return (\n <Container>\n {showPageHeader && <PageHeader title={t('launchBlocklet.introduction')} subTitle={t('launchBlocklet.welcome')} />}\n <div className=\"app-content\">\n <div className=\"agreement\">\n <div className=\"agreement-content\">\n <WizardDesc blockletMeta={blockletMeta} locale={locale} handleDescEle={handleDescEle} />\n </div>\n </div>\n </div>\n <div className=\"button-container\" data-cy=\"agree-all\">\n <ServerEula\n onContinue={clickNext}\n description={<AgreementApp />}\n texts={{\n listenName: t('launchBlocklet.license'),\n buttonNext: t('launchBlocklet.next'),\n }}\n />\n </div>\n </Container>\n );\n}\n\nAgreement.propTypes = {\n blocklet: PropTypes.object.isRequired,\n onClickNext: PropTypes.func,\n handleDescEle: PropTypes.node,\n showPageHeader: PropTypes.bool,\n};\n\nAgreement.defaultProps = {\n onClickNext: null,\n handleDescEle: '',\n showPageHeader: true,\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n height: 100%;\n\n .app-content {\n padding: 2px 24px 24px;\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 10px;\n }\n width: 100%;\n flex: 1;\n letter-spacing: normal;\n }\n .agreement {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n border: 1px solid ${props => props.theme.palette.grey['100']};\n border-radius: 12px;\n\n ${props => props.theme.breakpoints.up('md')} {\n margin-top: 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n margin-top: 16px;\n }\n\n .agreement-content {\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n font-size: 14px;\n overflow-y: auto;\n\n ${props => props.theme.breakpoints.up('md')} {\n padding: 0 24px;\n }\n\n ${props => props.theme.breakpoints.down('md')} {\n padding: 0 16px;\n }\n\n &:after {\n display: block;\n content: '';\n height: 24px;\n }\n }\n }\n .button-container {\n padding-top: 24px;\n padding-bottom: 34px;\n ${props => props.theme.breakpoints.up('md')} {\n padding-right: 24px;\n margin-left: auto;\n }\n ${props => props.theme.breakpoints.down('md')} {\n padding-top: 0;\n padding-bottom: 16px;\n }\n }\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)};\n }\n`;\n","import axios from 'axios';\n\naxios.defaults.timeout = 10 * 1000; // 超时时间设为10s\n\nconst api = axios.create();\n\nexport { axios, api };\nexport default api;\n","import styled from '@emotion/styled';\n\nconst Center = styled.div`\n width: 100%;\n min-height: 100vh;\n padding: 20px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nexport default Center;\n","import styled from '@emotion/styled';\nimport PropTypes from 'prop-types';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Center from '@arcblock/ux/lib/Center';\n\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nfunction Complete({ blocklet }) {\n const { t } = useLocaleContext();\n const { info } = useNodeContext();\n const query = useQuery();\n const accessUrl = decodeURIComponent(query.get('accessUrl') || '');\n\n if (isEmpty(blocklet)) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n return (\n <Container>\n <div className=\"body\">\n <ResultMessage\n variant=\"success\"\n title={getDisplayName(blocklet, true)}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n <Link href={accessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n {t('common.open')}\n </Link>\n }\n />\n </div>\n </Container>\n );\n}\n\nconst Link = styled.a`\n display: block;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst Container = styled(ContentLayout)`\n .app-info_desc {\n font-weight: 400;\n margin-top: 40px;\n font-size: 18px;\n line-height: 21px;\n color: #222222;\n }\n\n .body {\n text-align: center;\n }\n\n ${props => {\n return props.theme.breakpoints.down('md');\n }} {\n .app-info_desc {\n font-size: 16px;\n }\n }\n\n .circle_icon {\n font-size: 58px;\n color: ${props => (props.variant === 'error' ? props.theme.palette.error.main : props.theme.palette.success.main)};\n }\n`;\n\nComplete.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nexport default Complete;\n","import PropTypes from 'prop-types';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport ResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport Button from '../button';\n\nexport default function Upgrade({ onCancel, onUpgrade }) {\n const { t } = useLocaleContext();\n\n return (\n <ResultMessage\n variant=\"info\"\n title={t('launchBlocklet.newVersion')}\n subTitle={t('launchBlocklet.newVersionDesc')}\n footer={\n <>\n <Button onClick={onCancel} variant=\"outlined\">\n {t('launchBlocklet.later')}\n </Button>\n <Button onClick={onUpgrade} style={{ marginLeft: 24 }}>\n {t('launchBlocklet.upgradeNow')}\n </Button>\n </>\n }\n />\n );\n}\n\nUpgrade.propTypes = {\n onCancel: PropTypes.func,\n onUpgrade: PropTypes.func,\n};\n\nUpgrade.defaultProps = {\n onCancel: () => {},\n onUpgrade: () => {},\n};\n","// 获取blocklet在节点上的状态\nimport { useState, useEffect } from 'react';\nimport { BlockletStatus, BlockletEvents } from '@blocklet/constant';\nimport { useSubscription } from '../libs/ws';\nimport getClient from '../libs/node';\n\n/**\n *\n * @see: https://github.com/ArcBlock/blocklet-server/blob/cd80b9e1617a9b3ced64120e015912f63ffef805/blocklet/meta/lib/constants.js#L10-L26\n * @typedef {{\n * meta: {\n * did: string,\n * },\n * status: number,\n * error?: {\n * message: string\n * },\n * }} RuntimeBlocklet\n * @returns\n */\n\nconst BlockletStatusKeys = Object.keys(BlockletStatus);\nconst BlockletStatusValues = Object.values(BlockletStatus);\n\n/**\n *\n * 请确保在登录状态下传入 blockletDid\n * @param {String} blockletDid 应用的did\n * @return {{\n * status: string\n * eventName: string,\n * }}\n */\nexport default function useRuntimeBlockletState(blockletDid) {\n const client = getClient();\n\n const [blockletState, setBlockletState] = useState({\n status: null, // null代表没有查找到状态,空字符串代表未安装\n eventName: '',\n // runtimeBlocklet: undefined,\n // error: undefined, // 当触发 error 事件,才会有这个数据\n });\n\n // 首次更新加载blocklet状态\n useEffect(() => {\n // 没有初始状态就主动查询一次\n if (blockletDid && blockletState.status === null) {\n client.getBlocklet({ input: { did: blockletDid } }).then(e => {\n setBlockletState({\n status: e.blocklet ? e.blocklet.status : '',\n eventName: '',\n runtimeBlocklet: e.blocklet,\n isGetBlocklet: true, // 证明是通过 getBlocklet 接口获取的数据\n });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [blockletDid, blockletState.status]);\n\n const defaultBlockletEventHandler = blockletEventName => {\n return blocklet => {\n if (blocklet.meta.did === blockletDid) {\n const bState = {\n status: null,\n eventName: blockletEventName,\n runtimeBlocklet: blocklet,\n };\n\n if (blocklet.error) {\n bState.status = 'error';\n bState.error = blocklet.error;\n } else {\n bState.status = BlockletStatusKeys[BlockletStatusValues.indexOf(blocklet.status)];\n }\n setBlockletState(bState);\n }\n };\n };\n\n Object.values(BlockletEvents).forEach(blockletEventName => {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useSubscription(blockletEventName, defaultBlockletEventHandler(blockletEventName), [blockletDid]);\n });\n\n return blockletState;\n}\n","import PropTypes from 'prop-types';\nimport Img from '@arcblock/ux/lib/Img';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport defaultLogo from '../../assets/defaultLogo.png';\nimport { getBlockletLogoUrl } from '../../libs/util';\n\nexport default function AppLogo({ blocklet, blockletMetaUrl }) {\n const { did, logo: logoPath } = blocklet.meta;\n\n let content;\n\n if (logoPath) {\n content = (\n <Img\n src={getBlockletLogoUrl({\n did,\n logoPath,\n baseUrl: new URL(blockletMetaUrl).origin,\n })}\n fallback={defaultLogo}\n width={64}\n size=\"contain\"\n placeholder=\"application logo\"\n />\n );\n } else {\n content = <Avatar did={did} size={64} />;\n }\n\n return content;\n}\n\nAppLogo.propTypes = {\n blocklet: PropTypes.object.isRequired,\n blockletMetaUrl: PropTypes.string.isRequired,\n};\n","import { useEffect, useState, useMemo, useRef } from 'react';\nimport { useNavigate, Link } from 'react-router-dom';\nimport isEmpty from 'lodash/isEmpty';\nimport isEqual from 'lodash/isEqual';\nimport PropTypes from 'prop-types';\nimport styled from '@emotion/styled';\nimport semver from 'semver';\nimport useLocalStorage from 'react-use/lib/useLocalStorage';\nimport ArrowForward from '@mui/icons-material/ArrowForward';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Center from '@arcblock/ux/lib/Center';\nimport Connect from '@arcblock/did-connect/lib/Connect';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport Avatar from '@arcblock/did-connect/lib/Avatar';\nimport { getDisplayName } from '@blocklet/meta/lib/util';\nimport { BlockletEvents } from '@blocklet/constant';\nimport LauncherResultMessage from '@blocklet/launcher-layout/lib/launch-result-message';\nimport PageHeader from '@blocklet/launcher-layout/lib/page-header';\nimport ContentLayout from '@abtnode/ux/lib/launch-blocklet/content-layout';\nimport Toast from '@abtnode/ux/lib/toast';\nimport AnimationWaiter from '@arcblock/ux/lib/AnimationWaiter';\nimport ProgressMessage from '@blocklet/launcher-ux/lib/progress-message';\nimport pWaitFor from 'p-wait-for';\nimport joinURL from 'url-join';\nimport { getServerAuthMethod } from '@abtnode/auth/lib/util/get-auth-method';\nimport { getLaunchURL } from '@abtnode/ux/lib/blocklet/util';\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport {\n getWebWalletUrl,\n getAccessibleUrl,\n extractStatusUrlFromNextWorkflow,\n isNewRegistryUrl,\n formatError,\n} from '../../libs/util';\nimport useQuery from '../../hooks/query';\nimport Button from './button';\nimport StatusUpgrade from './status/upgrade-available';\nimport useRuntimeBlockletState from '../../contexts/runtime-blocklet-state';\nimport AppLogo from './app-logo';\nimport serverLogo from '../../assets/logo.svg';\nimport { api as $api, axios } from '../../libs/api';\n\nexport default function Install({ blocklet }) {\n const query = useQuery();\n const { t, locale } = useLocaleContext();\n const blockletName = isEmpty(blocklet) ? null : getDisplayName(blocklet, true);\n const { api, info, loading: nodeLoading } = useNodeContext();\n const { session } = useSessionContext();\n const navigate = useNavigate();\n\n const [skipSetup] = useLocalStorage('skip-blocklet-setup', false);\n\n const [launching, setLaunching] = useState(false); // 进入安装状态的\n const [changeOfStatus, setChangeOfStatus] = useState(false);\n const [openAuth, setOpenAuth] = useState(false);\n const [nextAccessUrl, setNextAccessUrl] = useState('');\n\n const [upgradeAvailable, setUpgradeAvailable] = useState(null);\n const overUpgrade = useRef(''); // 点击过升级页面的操作(点击稍后或立即更新都算)\n\n const [connectData, setConnectData] = useState({\n action: '',\n baseUrl: '',\n checkFn: () => {},\n extraParams: {},\n });\n\n const [installError, setInstallError] = useState(null);\n\n const runtimeBlockletState = useRuntimeBlockletState(session.user ? blocklet?.meta?.did : '');\n const { status } = runtimeBlockletState;\n\n const blockletMetaUrl = query.get('blocklet_meta_url');\n const blockletRegistryUrl = new URL(blockletMetaUrl).origin;\n // 当前安装过程中的状态\n const fromUrl = new URL(window.location.href).searchParams.get('from');\n\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => setLaunching(!!status), [!!status]);\n\n const addNewRegistryToRegistryList = async () => {\n const {\n meta: { registryUrl },\n } = blocklet;\n\n const { isNew: isNewStoreRegistry, decoded } = isNewRegistryUrl(registryUrl, info.blockletRegistryList);\n\n // 未添加到 store registryList,进行添加\n if (isNewStoreRegistry) {\n await api.addBlockletStore({ input: { url: decoded } });\n }\n };\n\n const handleLaunchStart = async () => {\n setInstallError(null);\n\n try {\n await addNewRegistryToRegistryList();\n } catch (error) {\n console.error('addNewRegistryToRegistryList error:', error);\n }\n\n // start launch\n const isAuthorized = session.user && (session.user.permissions || []).includes('mutate_blocklet');\n if (isAuthorized && blocklet.isFree) {\n setLaunching(true);\n setOpenAuth(false);\n await api\n .installBlocklet({\n input: { url: blockletMetaUrl },\n })\n .catch(err => {\n Toast.error(formatError(err));\n console.error('install blocklet failed', err);\n });\n return;\n }\n\n if (blocklet.isFree) {\n setConnectData({\n action: `launch-free-blocklet-by-${getServerAuthMethod(info)}`,\n baseUrl: undefined,\n checkFn: axios.create({ baseURL: window?.env?.apiPrefix ?? '/' }).get,\n extraParams: {\n blockletMetaUrl,\n },\n });\n } else if (session?.user) {\n // 用户登录了,就无须再次检验用户的passport\n setConnectData({\n action: 'verify-purchase-blocklet',\n baseUrl: new URL(blockletMetaUrl).origin,\n checkFn: axios.create({ baseURL: new URL(blockletMetaUrl).origin }).get,\n extraParams: {\n serverDid: info.did,\n blockletDid: blocklet?.meta?.did,\n blockletMetaUrl,\n },\n });\n } else {\n // 付费应用走nextWorkflow流程\n const nextWorkflowUrl = new URL(window.location.href);\n nextWorkflowUrl.pathname = joinURL(\n window?.env?.apiPrefix ?? '/',\n `/api/did/launch-paid-blocklet-by-${getServerAuthMethod(info)}/token`\n );\n nextWorkflowUrl.searchParams.set('autoConnect', false);\n nextWorkflowUrl.searchParams.set('blockletMetaUrl', blockletMetaUrl);\n const { data } = await $api.get(nextWorkflowUrl.href);\n\n setConnectData({\n action: 'verify-purchase-blocklet',\n baseUrl: new URL(blockletMetaUrl).origin,\n checkFn: axios.create({ baseURL: new URL(blockletMetaUrl).origin }).get,\n extraParams: {\n serverDid: info.did,\n blockletDid: blocklet?.meta?.did,\n nw: data.url,\n },\n });\n }\n setOpenAuth(true);\n };\n\n const handleConnectSuccess = async (result, decrypt) => {\n const success = async decryptedSessionToken => {\n Toast.success(t('launchBlocklet.dialog.success', locale));\n\n localStorage.setItem('__sst', decryptedSessionToken);\n await session.refresh();\n setLaunching(true);\n setOpenAuth(false);\n };\n\n const failure = async errorMessage => {\n Toast.error(errorMessage);\n setLaunching(false);\n setOpenAuth(false);\n };\n\n async function handleConnectSessionStatus(url) {\n return pWaitFor(\n () => {\n return $api.get(url).then(async ({ data }) => {\n if (data.status === 'succeed') {\n await success(data.sessionToken);\n return true;\n }\n if (data.status === 'error') {\n await failure(data?.error);\n return true;\n }\n return false;\n });\n },\n {\n interval: 1000,\n }\n );\n }\n\n const { extraParams } = connectData;\n\n if (extraParams?.nw) {\n const { statusUrl } = extractStatusUrlFromNextWorkflow(extraParams.nw);\n // 通过轮询获取状态\n await handleConnectSessionStatus(statusUrl);\n } else if (!blocklet.isFree && !extraParams?.nw) {\n // 付费应用不走nw流程,说明用户在已登录的情况下去安装一个付费应用,需要在前端触发应用的下载\n setLaunching(true);\n setOpenAuth(false);\n\n const input = {\n url: blockletMetaUrl,\n downloadTokenList: [],\n };\n\n if (result?.downloadTokenList) {\n input.downloadTokenList = decrypt(result.downloadTokenList);\n } else if (result?.downloadToken) {\n // backward compatibility for blocklet store\n input.downloadTokenList = [\n {\n did: blocklet.meta.did,\n token: decrypt(result.downloadToken),\n },\n ];\n }\n\n await api.installBlocklet({\n input,\n });\n } else {\n await success(decrypt(result.sessionToken));\n }\n };\n const redirectToBlockletOverview = b => {\n const accessUrl = `/blocklets/${b.meta.did}/configuration`;\n let nextUrl = `/launch-blocklet/complete?status=installed&name=${encodeURIComponent(\n blockletName\n )}&accessUrl=${encodeURIComponent(accessUrl)}&blocklet_meta_url=${blockletMetaUrl}`;\n\n const fromLauncher = query.get('from_launcher');\n if (fromLauncher) {\n nextUrl += `&from_launcher=${fromLauncher}`;\n }\n navigate(nextUrl);\n };\n\n // 跳转到下一步\n const visitBlocklet = async b => {\n const urls = b.interfaces.map(x => x.url);\n const accessUrl = await getAccessibleUrl(urls);\n\n if (isEmpty(accessUrl) || skipSetup) {\n setTimeout(() => {\n redirectToBlockletOverview(b);\n }, 1500);\n return;\n }\n\n const url = new URL(accessUrl);\n // install blocklet 并跳转到 blocklet setup 界面时携带 serverUrl 查询参数\n url.searchParams.set('serverUrl', getLaunchURL(blocklet, info)?.serverUrl);\n\n if (b.status !== 'running') {\n url.searchParams.set('__start__', '1');\n }\n\n const fromLauncher = query.get('from_launcher');\n if (fromLauncher) {\n url.searchParams.set('from_launcher', fromLauncher);\n }\n\n setNextAccessUrl(url.href);\n\n setTimeout(() => {\n window.location.href = url.href;\n }, 1500);\n };\n\n const checkBlockletCanNext = useMemo(() => {\n let timer;\n\n // wait Blocklet Services state updated\n const timeout = 1000;\n\n return _installedBlocklet => {\n clearTimeout(timer);\n timer = setTimeout(async () => {\n let installedBlocklet = _installedBlocklet;\n if (!installedBlocklet) {\n const meta = await api.getBlocklet({ input: { did: blocklet.meta.did } });\n installedBlocklet = meta.blocklet;\n }\n\n if (installedBlocklet) {\n if (!overUpgrade.current && semver.gt(blocklet.meta.version, installedBlocklet.meta.version)) {\n // 安装的版本不是最新的\n if (!isEqual(upgradeAvailable, { installedBlocklet })) {\n setUpgradeAvailable({ installedBlocklet });\n }\n } else {\n visitBlocklet(installedBlocklet);\n }\n }\n }, timeout);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [api, blocklet?.meta?.did, upgradeAvailable]);\n\n const progressSteps = [\n t('launchBlocklet.waiting.verifying'),\n t('launchBlocklet.waiting.downloading'),\n t('launchBlocklet.waiting.extracting'),\n status === 'upgrading' ? t('common.upgrading') : t('launchBlocklet.waiting.installing'),\n t('launchBlocklet.waiting.done'),\n ];\n\n let installProgressIndex = 0;\n\n const changeStatus = () => !changeOfStatus && setChangeOfStatus(true);\n\n const handleInstalledProgress = () => {\n installProgressIndex = 4;\n checkBlockletCanNext(runtimeBlockletState.isGetBlocklet ? runtimeBlockletState.runtimeBlocklet : null);\n };\n\n switch (status) {\n case 'waiting':\n installProgressIndex = 1;\n changeStatus();\n break;\n case 'downloading':\n installProgressIndex = 2;\n changeStatus();\n break;\n case 'installing':\n case 'upgrading':\n installProgressIndex = 3;\n changeStatus();\n break;\n case 'installed':\n handleInstalledProgress();\n break;\n case 'starting':\n handleInstalledProgress();\n break;\n case 'running':\n handleInstalledProgress();\n break;\n case 'stopped':\n handleInstalledProgress();\n break;\n case 'corrupted':\n case 'error':\n // WARN: 暂时不要直接使用 runtimeBlockletState 的 error 数据;\n // 当下载中失败时,core/webapp/src/libs/ws.js 触发downloadFailed后,会更新一次 downloading,会让 error 被清理;所以error后,要通过 setState(setInstallError) 保存后使用;\n {\n const errorData = {\n message: runtimeBlockletState.error.message,\n name: runtimeBlockletState.eventName,\n };\n\n if ([BlockletEvents.downloadFailed, BlockletEvents.installFailed].includes(runtimeBlockletState.eventName)) {\n errorData.action = 'retry';\n } else if (status === 'error' || status === 'corrupted') {\n errorData.action = 'view';\n }\n if (!isEqual(errorData, installError)) {\n if (runtimeBlockletState?.error?.message) {\n Toast.error(formatError(runtimeBlockletState.error));\n }\n setInstallError(errorData);\n }\n }\n\n break;\n default:\n }\n\n if ((session.user && status === null) || isEmpty(blocklet) || nodeLoading) {\n return (\n <Center relative=\"parent\">\n <Spinner />\n </Center>\n );\n }\n\n if (installError) {\n const errorActions = {\n view: (\n <Button\n className=\"bottom-button\"\n component={Link}\n to={`/blocklets/${blocklet.meta.did}/overview`}\n data-cy=\"view-blocklet\"\n color=\"primary\"\n variant=\"contained\">\n {t('launchBlocklet.viewApplication')}\n </Button>\n ),\n retry: (\n <ButtonContainer>\n <Button className=\"bottom-button\" data-cy=\"retry-install\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('common.retry')}\n </Button>\n {fromUrl && (\n <Button\n variant=\"text\"\n className=\"bottom-button\"\n data-cy=\"go-back\"\n disabled={openAuth}\n onClick={() => {\n window.location.href = fromUrl;\n }}>\n {t('common.back')}\n </Button>\n )}\n </ButtonContainer>\n ),\n };\n\n const errorEventName = installError.name ? installError.name.replace('blocklet.', '') : 'installFailed';\n\n return (\n <ResultMessage\n variant=\"error\"\n title={blockletName}\n subTitle={\n <ErrorMessageSub>\n <div>{t(`launchBlocklet.error.${errorEventName}`)}</div>\n {installError.message && (\n <div className=\"error-desc\">{t('common.errorMessage') + installError.message}</div>\n )}\n </ErrorMessageSub>\n }\n footer={errorActions[installError.action]}\n />\n );\n }\n\n const handleCancelUpgrade = () => {\n setChangeOfStatus(true);\n overUpgrade.current = 'cancel';\n setUpgradeAvailable(null);\n visitBlocklet(upgradeAvailable.installedBlocklet);\n };\n const handleUpgrade = async () => {\n const input = {\n did: blocklet.meta.did,\n version: blocklet.meta.version,\n registryUrl: blockletRegistryUrl,\n };\n\n overUpgrade.current = 'upgrade';\n setUpgradeAvailable(null);\n\n await api.upgradeBlocklet({ input });\n };\n\n if (upgradeAvailable) {\n return <StatusUpgrade onCancel={() => handleCancelUpgrade()} onUpgrade={() => handleUpgrade()} />;\n }\n\n if (!changeOfStatus && (status === 'installed' || status === 'running')) {\n return (\n <ResultMessage\n variant=\"info\"\n title={t('common.reminder')}\n subTitle={t('launchBlocklet.alreadyExists', { name: getDisplayName(blocklet, true) })}\n footer={\n <ButtonWrap>\n {!nextAccessUrl && <Spinner size={[16, 10]} />}\n {nextAccessUrl && (\n <Button className=\"last-button\" href={nextAccessUrl} data-cy=\"open-blocklet\">\n {t('common.open')}\n </Button>\n )}\n </ButtonWrap>\n }\n />\n );\n }\n\n if ((launching && nextAccessUrl) || overUpgrade.current === 'cancel') {\n return (\n <ResultMessage\n variant={nextAccessUrl ? 'success' : 'loading'}\n title={nextAccessUrl ? blockletName : ''}\n subTitle={t('launchBlocklet.installSuccess', { serverName: info.name })}\n footer={\n nextAccessUrl ? (\n <LinkEle href={nextAccessUrl} rel=\"noreferrer\" data-cy=\"open-blocklet\">\n <Spinner size={[16, 10]} style={{ marginRight: 14 }} /> {t('common.redirecting')}\n </LinkEle>\n ) : (\n ''\n )\n }\n style={{ marginBottom: 34 }}\n />\n );\n }\n\n const showInstall = !launching && !status;\n\n return (\n <Container>\n <div className=\"header\">\n {!nextAccessUrl && (\n <PageHeader\n title={showInstall ? t('common.install') : t('common.installing')}\n subTitle={showInstall ? t('launchBlocklet.subTitle', { appName: blockletName, serverName: info.name }) : ''}\n />\n )}\n </div>\n <div className=\"body\">\n {showInstall && (\n <>\n <div className=\"illustrations\">\n <div className=\"ills-block ills-block-left\">\n <div className=\"ills-block-inner\">\n <AppLogo className=\"i-icon\" blocklet={blocklet} blockletMetaUrl={blockletMetaUrl} />\n <div className=\"i-name\">{blockletName}</div>\n </div>\n </div>\n <ArrowForward className=\"arrow-icon\" />\n <div className=\"ills-block ills-block-right\">\n <div className=\"ills-block-inner\">\n <img width=\"64\" height=\"64\" src={serverLogo} alt=\"\" />\n <div className=\"i-name\">{info.name}</div>\n <DidAddress\n size={12}\n prepend={<Avatar did={info.did} size={12} style={{ marginRight: 4 }} />}\n responsive={false}\n compact>\n {info.did}\n </DidAddress>\n </div>\n </div>\n </div>\n <Button className=\"bottom-button\" data-cy=\"start-launch\" disabled={openAuth} onClick={handleLaunchStart}>\n {openAuth && <Spinner size={[16, 10]} />}\n {t('launchBlocklet.confirmInstall')}\n </Button>\n </>\n )}\n {launching && (\n <WaiterContainer>\n <AnimationWaiter\n increaseSpeed={0.3}\n messageLoop={false}\n message={\n <ProgressMessage\n steps={progressSteps}\n stepIndex={installProgressIndex}\n autoGrowth={installProgressIndex === 4 ? 1000 : 4000}\n />\n }\n />\n </WaiterContainer>\n )}\n </div>\n <Connect\n open={openAuth}\n popup\n saveConnect={false}\n className=\"connect\"\n baseUrl={connectData.baseUrl}\n action={connectData.action}\n checkFn={connectData.checkFn}\n extraParams={connectData.extraParams}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={getWebWalletUrl(info)}\n onSuccess={handleConnectSuccess}\n onClose={() => setOpenAuth(false)}\n locale={locale}\n messages={{\n title: `${t('launchBlocklet.dialog.title')}`,\n scan: blocklet.isFree\n ? t('launchBlocklet.dialog.freeDescription')\n : t('launchBlocklet.dialog.nonFreeDescription'),\n confirm: t('launchBlocklet.dialog.confirm'),\n success: t('launchBlocklet.dialog.success'),\n }}\n />\n </Container>\n );\n}\n\nInstall.propTypes = {\n blocklet: PropTypes.object.isRequired,\n};\n\nconst Container = styled(ContentLayout)`\n .body {\n align-items: center;\n animation: fadein ease 0.3s;\n }\n\n .illustrations {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: start;\n text-align: center;\n margin-top: 16px;\n margin-bottom: 40px;\n width: 100%;\n }\n\n .ills-block,\n .ills-block-inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n flex-shrink: 0;\n flex: 1;\n }\n .ills-block {\n max-width: 220px;\n .i-icon {\n width: 64px;\n height: 64px;\n }\n\n .i-name {\n margin-top: 16px;\n font-weight: 400;\n font-size: 16px;\n color: #222222;\n }\n\n .i-sub-name {\n color: #999999;\n }\n }\n\n .arrow-icon {\n align-self: start;\n color: #c4c5ca;\n font-size: 30px;\n margin: 16px 0 0;\n ${props => props.theme.breakpoints.down('md')} {\n margin: 25px 24px 0;\n }\n }\n\n @keyframes fadein {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n`;\n\nconst WaiterContainer = styled.div`\n color: #1dc1c7;\n`;\n\nconst ButtonWrap = styled.div`\n .MuiButton-root {\n ${props => props.theme.breakpoints.up('md')} {\n min-width: 200px;\n }\n }\n .last-button {\n margin-left: ${props => props.theme.spacing(2)};\n }\n`;\n\nconst LinkEle = styled.a`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 36px;\n color: ${props => props.theme.palette.primary.main};\n`;\n\nconst ErrorMessageSub = styled.div`\n line-height: 1.4em;\n .error-desc {\n margin-top: 8px;\n word-wrap: break-word;\n color: ${props => props.theme.palette.grey[500]};\n }\n`;\n\nconst ButtonContainer = styled.div`\n display: flex;\n justify-content: space-around;\n flex-wrap: wrap;\n button {\n margin: 0 10px 18px;\n }\n`;\n\nconst ResultMessage = styled(LauncherResultMessage)`\n .result-footer {\n height: auto;\n }\n`;\n","import { useEffect, useState } from 'react';\nimport { Routes, Route, Navigate } from 'react-router-dom';\nimport { useAsync } from 'react-use';\nimport joinUrl from 'url-join';\nimport { Global, css } from '@emotion/react';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport styled from '@emotion/styled';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Layout from '@blocklet/launcher-layout';\nimport { StepProvider } from '@blocklet/launcher-layout/lib/context/step';\nimport HeaderAddon from '@abtnode/ux/lib/layout/addon';\nimport LauncherLogoNotext from '@arcblock/icons/lib/LauncherLogoNotext';\nimport ServerLogoNotext from '@arcblock/icons/lib/ServerLogoNotext';\nimport ServerLogo from '@arcblock/icons/lib/ServerLogo';\nimport LauncherLogo from '@arcblock/icons/lib/LauncherLogo';\nimport NavLogo from '@abtnode/ux/lib/nav-logo';\nimport { getLaunchURL } from '@abtnode/ux/lib/blocklet/util';\nimport { useNodeContext } from '../../contexts/node';\nimport useQuery from '../../hooks/query';\n\nimport Center from '../../components/launch-blocklet/center';\nimport Complete from '../../components/launch-blocklet/step-complete';\nimport Install from '../../components/launch-blocklet/step-install';\nimport Agreement from '../../components/launch-blocklet/step-agreement';\nimport { getBlockletLogoUrl, getPathPrefix, getWebWalletUrl } from '../../libs/util';\nimport { SessionContext } from '../../contexts/session';\n\n// TODO: add skeleton here\nexport default function BlockletLauncher() {\n const isMobile = useMediaQuery(theme => theme.breakpoints.down('md'));\n const { t, locale } = useLocaleContext();\n const query = useQuery();\n const { api, info } = useNodeContext();\n const fromLauncher = !!query.get('from_launcher');\n const webWalletUrl = getWebWalletUrl(info);\n const [serverUrl, setServerUrl] = useState('');\n\n const path = '/launch-blocklet';\n\n let url = (query.get('blocklet_meta_url') || '').trim();\n url = decodeURIComponent(url);\n\n const state = useAsync(async () => {\n if (!url) {\n throw new Error(t('common.invalidParam'));\n }\n\n const { meta, isFree, isInstalled, isRunning } = await api.getBlockletMetaFromUrl({\n input: { url, checkPrice: true },\n });\n if (!meta) {\n throw new Error(t('launchBlocklet.error.loadMetaFailed'));\n }\n\n return { meta, isFree, isInstalled, isRunning };\n });\n\n useEffect(() => {\n if (state.value && info) {\n const urlInfo = getLaunchURL(state.value, info);\n setServerUrl(urlInfo.serverUrl);\n }\n }, [state.value, info]);\n\n if (state.error) {\n return (\n <Center>\n <div>\n <Alert style={{ width: '100%', wordBreak: 'break-all' }} variant=\"icon\" type=\"error\">\n {state.error.message}\n </Alert>\n </div>\n </Center>\n );\n }\n\n const { meta, isFree } = state.value || {};\n const basePath = joinUrl(getPathPrefix(), path);\n const steps = [\n {\n key: 'agreement',\n name: t('launchBlocklet.introduction'),\n path: joinUrl(basePath, 'agreement'),\n },\n {\n key: 'install',\n name: t('launchBlocklet.launch'),\n path: joinUrl(basePath, 'install'),\n },\n {\n key: 'setup',\n name: t('launchBlocklet.setup'),\n path: joinUrl(basePath, 'complete'),\n description: t('launchBlocklet.setupAppDesc'),\n },\n {\n key: 'complete',\n name: t('launchBlocklet.launched'),\n },\n ];\n\n const clickLogo = () => {\n if (serverUrl) {\n window.open(serverUrl);\n }\n };\n\n let navLogo = (\n <LogoContainer className={`${serverUrl ? 'logo-can-click' : ''}`}>\n <NavLogo\n onClick={clickLogo}\n logo={!isMobile ? <ServerLogo width=\"128\" height=\"48\" /> : <ServerLogoNotext width=\"32\" height=\"32\" />}\n />\n </LogoContainer>\n );\n\n // 从launcher 代表已经同意了 blocklet agreement\n if (fromLauncher) {\n steps.splice(\n 0,\n 1,\n {\n key: 'wizard',\n name: t('launchBlocklet.introduction'),\n },\n {\n key: 'select-node',\n name: t('launchBlocklet.selectAbtNode'),\n }\n );\n\n navLogo = (\n <LogoContainer className={`${serverUrl ? 'logo-can-click' : ''}`}>\n <NavLogo\n logo={\n !isMobile ? (\n <ServerLogo onClick={clickLogo} width=\"128\" height=\"48\" />\n ) : (\n <ServerLogoNotext onClick={clickLogo} width=\"32\" height=\"32\" />\n )\n }\n previousData={{\n logo: !isMobile ? <LauncherLogo width=\"145\" height=\"48\" /> : <LauncherLogoNotext width=\"32\" height=\"32\" />,\n }}\n />\n </LogoContainer>\n );\n }\n\n if (meta) {\n meta.registryUrl = new URL(url).origin;\n }\n\n return (\n <StepProvider steps={steps}>\n <Layout\n locale={locale}\n blockletMeta={{ ...meta, isFree }}\n useOfSkeleton={false}\n navLogo={navLogo}\n headerEndAddons={<HeaderAddon webWalletUrl={webWalletUrl} SessionContext={SessionContext} />}\n pcWidth=\"80%\"\n style={{ height: '100%' }}\n logoUrl={\n meta && meta.logo\n ? getBlockletLogoUrl({\n did: meta.did,\n baseUrl: meta.registryUrl,\n logoPath: meta.logo,\n })\n : null\n }>\n <Content>\n <Global styles={launcherGlobalStyle} />\n <Routes>\n <Route path=\"agreement\" element={<Agreement blocklet={state.value || {}} />} />\n <Route path=\"install\" element={<Install blocklet={state.value || {}} />} />\n <Route path=\"complete\" element={<Complete blocklet={state.value || {}} />} />\n <Route path=\"*\" element={<Navigate to={`agreement${window.location.search}`} replace />} />\n </Routes>\n </Content>\n </Layout>\n </StepProvider>\n );\n}\n\nconst launcherGlobalStyle = css`\n html,\n body,\n #root,\n #root > .wrapper {\n height: 100%;\n }\n`;\n\nconst Content = styled.div`\n ${props => props.theme.breakpoints.up('md')} {\n padding-top: 34px;\n }\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n .bottom-button {\n min-width: 200px;\n }\n`;\n\nconst LogoContainer = styled.div`\n margin-top: -1px;\n &.logo-can-click {\n cursor: pointer;\n }\n`;\n","const { types } = require('@ocap/mcrypto');\nconst { toHex } = require('@ocap/util');\nconst { fromPublicKey } = require('@arcblock/did');\n\nconst toBlockletDid = (name) => {\n const pk = toHex(Buffer.from(typeof name === 'string' ? name.trim() : name));\n return fromPublicKey(pk, { role: types.RoleType.ROLE_ANY });\n};\n\nmodule.exports = toBlockletDid;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.downloadExportedSource = downloadExportedSource;\nexports.genExportedMeta = genExportedMeta;\nexports.getLaunchURL = exports.getLaunchAgreementUrl = void 0;\nexports.getNameByTitle = getNameByTitle;\nvar _cloneDeep = _interopRequireDefault(require(\"lodash/cloneDeep\"));\nvar _pickBy = _interopRequireDefault(require(\"lodash/pickBy\"));\nvar _jszip = _interopRequireDefault(require(\"jszip\"));\nvar _jsYaml = _interopRequireDefault(require(\"js-yaml\"));\nvar _fileSaver = _interopRequireDefault(require(\"file-saver\"));\nvar _urlJoin = _interopRequireDefault(require(\"url-join\"));\nvar _did = _interopRequireDefault(require(\"@blocklet/meta/lib/did\"));\nvar _didMotif = require(\"@arcblock/did-motif\");\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nconst base64ToArrayBuffer = base64 => {\n const bufStr = window.atob(base64);\n const bytes = new Uint8Array(bufStr.length);\n for (let i = 0; i < bufStr.length; i++) {\n bytes[i] = bufStr.charCodeAt(i);\n }\n return bytes;\n};\nconst getLogo = did => {\n const url = (0, _didMotif.toDataURL)(did, {\n size: 200\n });\n const base64 = url.replace(/^[^,]*,/, '');\n return base64ToArrayBuffer(base64);\n};\nfunction getNameByTitle(title) {\n return title.replace(/[\\s/@_]/g, '-').replace(/[^a-zA-Z0-9_-]/g, '').replace(/(^[-\\s]+)|([-\\s]+$)/g, '').toLowerCase();\n}\nfunction genExportedMeta(name, blocklet) {\n const meta = (0, _pickBy.default)((0, _cloneDeep.default)(blocklet.meta), x => x !== null);\n meta.name = name;\n meta.did = (0, _did.default)(name);\n meta.logo = 'logo.png';\n meta.interfaces.forEach(x => {\n // filter null or undefined\n if (!x.services) {\n delete x.services;\n }\n });\n blocklet.children.forEach(child => {\n if (child.dynamic && child.bundleSource) {\n meta.children.push({\n name: child.meta.name,\n source: child.bundleSource,\n title: child.meta.title,\n mountPoint: child.mountPoint\n });\n }\n });\n meta.environments = (blocklet.configs || []).map(x => ({\n name: x.key,\n description: 'Automatically generated when exporting',\n required: !!x.required,\n secure: !!x.secure,\n default: x.secure ? '' : x.value || ''\n }));\n meta.capabilities.component = false;\n return meta;\n}\nconst license = holder => \"Copyright \\xA9 2022 \".concat(holder || '', \"\\n\\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \\u201CSoftware\\u201D), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\\n\\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\u201CAS IS\\u201D, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\");\nconst Gitignore = \".DS_Store\\n.blocklet\";\nconst GithubAction = \"name: Deploy\\n\\non:\\n push:\\n branches:\\n - main\\n\\njobs:\\n Deploy:\\n runs-on: ubuntu-latest\\n\\n steps:\\n - name: Checkout repo\\n uses: actions/checkout@v2\\n\\n - name: Blocklet workflow\\n uses: blocklet/action-workflow@v1\\n with:\\n skip-upload: true\\n skip-deploy: true\\n bundle-command: blocklet bundle --create-release\\n github-token: ${{ secrets.GITHUB_TOKEN }}\";\nasync function downloadExportedSource(meta) {\n let {\n holder\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n const folderName = \"\".concat(meta.name.split('/').pop());\n const readme = \"# \".concat(meta.title, \"\\n\\n## Introduction\\n\\n\").concat(meta.description);\n const zip = new _jszip.default();\n const folder = zip.folder(folderName);\n folder.file('blocklet.yml', _jsYaml.default.dump(meta));\n folder.file('blocklet.md', readme);\n folder.file('README.md', readme);\n folder.file('logo.png', getLogo(meta.did));\n folder.file('LICENSE', license(holder));\n folder.file('.gitignore', Gitignore);\n folder.folder('screenshots').file('.gitkeep', '');\n folder.folder('.github').folder('workflows').file('main.yml', GithubAction);\n await new Promise((resolve, reject) => {\n zip.generateAsync({\n type: 'blob'\n }).then(content => {\n (0, _fileSaver.default)(content, \"\".concat(folderName, \".zip\"));\n resolve();\n }).catch(err => {\n reject(err);\n });\n });\n}\nconst getLaunchURL = function getLaunchURL(meta, info) {\n let encodeURI = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n const adminPath = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';\n const serverUrl = encodeURI ? encodeURIComponent((0, _urlJoin.default)(window.location.origin, adminPath)) : (0, _urlJoin.default)(window.location.origin, adminPath);\n const metaUrl = (0, _urlJoin.default)(info === null || info === void 0 ? void 0 : info.blockletRegistry, \"/api/blocklets/\".concat(meta.did, \"/blocklet.json\"));\n return {\n serverUrl,\n metaUrl\n };\n};\nexports.getLaunchURL = getLaunchURL;\nconst getLaunchAgreementUrl = (meta, info) => {\n const {\n metaUrl,\n serverUrl\n } = getLaunchURL(meta, info);\n const url = new URL((0, _urlJoin.default)(serverUrl, '/launch-blocklet/agreement'));\n url.searchParams.set('blocklet_meta_url', metaUrl);\n url.searchParams.set('from', window.location.href);\n return url.href;\n};\nexports.getLaunchAgreementUrl = getLaunchAgreementUrl;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = ContentLayout;\nvar _styled = _interopRequireDefault(require(\"@emotion/styled\"));\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _templateObject;\nconst _excluded = [\"children\"];\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction ContentLayout(_ref) {\n let {\n children\n } = _ref,\n props = _objectWithoutProperties(_ref, _excluded);\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(Container, _objectSpread(_objectSpread({}, props), {}, {\n children: children\n }));\n}\nContentLayout.propTypes = {\n children: _propTypes.default.any.isRequired\n};\nconst Container = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral([\"\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n width: 100%;\\n height: 100%;\\n\\n .header {\\n text-align: center;\\n }\\n\\n .body {\\n display: flex;\\n flex-direction: column;\\n align-items: center;\\n margin-top: 30px;\\n width: 100%;\\n min-height: 200px;\\n flex: 1;\\n\\n \", \" {\\n padding: 24px;\\n }\\n\\n \", \" {\\n padding: 0 16px 16px;\\n }\\n }\\n\\n .footer {\\n display: flex;\\n justify-content: center;\\n\\n \", \" {\\n padding-bottom: 34px;\\n }\\n\\n \", \" {\\n margin-top: auto;\\n padding-bottom: 10px;\\n }\\n }\\n\"])), props => props.theme.breakpoints.up('md'), props => props.theme.breakpoints.down('md'), props => props.theme.breakpoints.up('sm'), props => props.theme.breakpoints.down('md'));","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = LogoContainer;\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _styled = _interopRequireDefault(require(\"@emotion/styled\"));\nvar _jsxRuntime = require(\"react/jsx-runtime\");\nvar _templateObject, _templateObject2;\nconst _excluded = [\"logo\", \"name\", \"subname\", \"previousData\"],\n _excluded2 = [\"logo\"];\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\nfunction _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\nfunction LogoContainer(_ref) {\n let {\n logo,\n name,\n subname,\n previousData\n } = _ref,\n rest = _objectWithoutProperties(_ref, _excluded);\n let logoEle = /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: logo\n });\n let nameEle = name;\n let subnameEle = subname;\n if (previousData.logo) {\n logoEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: logo,\n className: \"left-fade-in-ele\"\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImg, {\n logo: previousData.logo,\n className: \"postion-abs left-fade-out-ele\"\n })]\n });\n }\n if (previousData.name && previousData.name !== name) {\n nameEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"right-fade-in-ele\",\n style: {\n display: 'inline-block'\n },\n children: name\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"postion-abs right-fade-out-ele\",\n children: previousData.name\n })]\n });\n }\n if (previousData.subname && previousData.subname !== subname) {\n subnameEle = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"right-fade-in-ele\",\n style: {\n display: 'inline-block'\n },\n children: subname\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"span\", {\n className: \"postion-abs right-fade-out-ele\",\n children: previousData.subname\n })]\n });\n }\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(Container, _objectSpread(_objectSpread({}, rest), {}, {\n children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(\"div\", {\n className: \"logo-inner\",\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-img-content\",\n children: logoEle\n }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(\"div\", {\n className: \"logo-info \".concat(!name && !subname ? 'zero-left' : ''),\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-name\",\n children: nameEle\n }), /*#__PURE__*/(0, _jsxRuntime.jsx)(\"div\", {\n className: \"logo-subname\",\n children: subnameEle\n })]\n })]\n })\n }));\n}\nLogoContainer.propTypes = {\n logo: _propTypes.default.element.isRequired,\n name: _propTypes.default.string,\n subname: _propTypes.default.string,\n previousData: _propTypes.default.object\n};\nLogoContainer.defaultProps = {\n name: '',\n subname: '',\n previousData: {\n logo: '',\n name: '',\n subname: ''\n }\n};\n\n// eslint-disable-next-line react/prop-types\nfunction LogoImg(_ref2) {\n let {\n logo\n } = _ref2,\n rest = _objectWithoutProperties(_ref2, _excluded2);\n return /*#__PURE__*/(0, _jsxRuntime.jsx)(LogoImgDiv, _objectSpread(_objectSpread({}, rest), {}, {\n children: logo\n }));\n}\nconst LogoImgDiv = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral([\"\\n display: block;\\n > * {\\n display: block;\\n }\\n\"])));\nconst Container = _styled.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral([\"\\n position: relative;\\n display: block;\\n\\n .logo-inner {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n .logo-img-content {\\n position: relative;\\n display: block;\\n }\\n .logo-info {\\n display: flex;\\n flex-direction: column;\\n justify-content: center;\\n margin-left: 10px;\\n letter-spacing: 0.1px;\\n &.zero-left {\\n margin-left: 0%;\\n }\\n .logo-name {\\n position: relative;\\n line-height: 16px;\\n font-size: 16px;\\n color: #121319;\\n }\\n .logo-subname {\\n position: relative;\\n line-height: 13px;\\n font-size: 13px;\\n color: #7d8085;\\n }\\n }\\n }\\n\\n .postion-abs {\\n position: absolute;\\n left: 0;\\n top: 0;\\n height: 100%;\\n }\\n\\n .right-fade-out-ele {\\n animation: right-fade-out ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: forwards;\\n }\\n\\n .right-fade-in-ele {\\n animation: right-fade-in ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: both;\\n }\\n\\n @keyframes right-fade-out {\\n 0% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(8px, 0);\\n }\\n }\\n\\n @keyframes right-fade-in {\\n 0% {\\n opacity: 0;\\n transform: translate(8px, 0);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n }\\n\\n .left-fade-out-ele {\\n animation: left-fade-out ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: forwards;\\n }\\n\\n .left-fade-in-ele {\\n animation: left-fade-in ease 0.5s;\\n animation-delay: 2s;\\n animation-fill-mode: both;\\n }\\n\\n @keyframes left-fade-out {\\n 0% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-8px, 0);\\n }\\n }\\n\\n @keyframes left-fade-in {\\n 0% {\\n opacity: 0;\\n transform: translate(-8px, 0);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0);\\n }\\n }\\n\"])));"],"names":["WrappedButton","children","props","variant","color","forwardRef","ref","forwardedRef","AgreementApp","style","width","Agreement","blocklet","onClickNext","handleDescEle","showPageHeader","navigate","useNavigate","useState","accessUrl","setAccessUrl","error","setError","accessUrlLoading","setAccessUrlLoading","useLocaleContext","t","locale","useNodeContext","info","api","isRunning","loading","useMemo","isEmpty","clickNext","window","location","search","useEffect","onMount","getBlocklet","input","did","meta","b","urls","interfaces","map","x","url","getAccessibleUrl","accessUrlTmp","URL","href","message","Center","relative","Alert","wordBreak","type","Spinner","data","blockletMeta","isInstalled","already","title","subTitle","name","getDisplayName","footer","ButtonWrap","component","Link","to","className","Container","onContinue","description","texts","listenName","buttonNext","defaultProps","styled","theme","breakpoints","down","palette","grey","up","spacing","axios","primary","main","ContentLayout","success","query","useQuery","decodeURIComponent","get","serverName","rel","Upgrade","onCancel","onUpgrade","onClick","marginLeft","BlockletStatusKeys","Object","keys","BlockletStatus","BlockletStatusValues","values","useRuntimeBlockletState","blockletDid","client","getClient","status","eventName","blockletState","setBlockletState","then","e","runtimeBlocklet","isGetBlocklet","BlockletEvents","forEach","blockletEventName","useSubscription","bState","indexOf","defaultBlockletEventHandler","AppLogo","blockletMetaUrl","logoPath","logo","Img","src","getBlockletLogoUrl","baseUrl","origin","fallback","size","placeholder","Avatar","propTypes","PropTypes","Install","blockletName","nodeLoading","session","useSessionContext","useLocalStorage","skipSetup","launching","setLaunching","changeOfStatus","setChangeOfStatus","openAuth","setOpenAuth","nextAccessUrl","setNextAccessUrl","upgradeAvailable","setUpgradeAvailable","overUpgrade","useRef","action","checkFn","extraParams","connectData","setConnectData","installError","setInstallError","runtimeBlockletState","user","blockletRegistryUrl","fromUrl","searchParams","addNewRegistryToRegistryList","registryUrl","isNewRegistryUrl","blockletRegistryList","isNewStoreRegistry","isNew","decoded","addBlockletStore","handleLaunchStart","console","permissions","includes","isFree","installBlocklet","catch","err","Toast","formatError","getServerAuthMethod","undefined","baseURL","env","apiPrefix","serverDid","nextWorkflowUrl","pathname","joinURL","set","$api","nw","handleConnectSuccess","result","decrypt","handleConnectSessionStatus","pWaitFor","sessionToken","failure","interval","decryptedSessionToken","localStorage","setItem","refresh","errorMessage","extractStatusUrlFromNextWorkflow","statusUrl","downloadTokenList","downloadToken","token","redirectToBlockletOverview","nextUrl","encodeURIComponent","fromLauncher","visitBlocklet","setTimeout","getLaunchURL","serverUrl","checkBlockletCanNext","timer","_installedBlocklet","clearTimeout","installedBlocklet","current","semver","version","isEqual","progressSteps","installProgressIndex","changeStatus","handleInstalledProgress","errorData","errorActions","view","retry","ButtonContainer","disabled","errorEventName","replace","ResultMessage","ErrorMessageSub","handleUpgrade","upgradeBlocklet","LinkEle","marginRight","marginBottom","showInstall","appName","ArrowForward","height","serverLogo","alt","prepend","responsive","compact","WaiterContainer","AnimationWaiter","increaseSpeed","messageLoop","steps","stepIndex","autoGrowth","Connect","open","popup","saveConnect","checkTimeout","socketUrl","webWalletUrl","getWebWalletUrl","onSuccess","onClose","messages","scan","confirm","LauncherResultMessage","BlockletLauncher","isMobile","useMediaQuery","setServerUrl","trim","state","useAsync","Error","getBlockletMetaFromUrl","checkPrice","value","urlInfo","basePath","joinUrl","getPathPrefix","key","path","clickLogo","navLogo","LogoContainer","ServerLogoNotext","ServerLogo","splice","previousData","LauncherLogoNotext","LauncherLogo","StepProvider","useOfSkeleton","headerEndAddons","SessionContext","pcWidth","logoUrl","Content","Global","styles","launcherGlobalStyle","element","css","types","require","toHex","fromPublicKey","module","exports","pk","Buffer","from","role","RoleType","ROLE_ANY","defineProperty","downloadExportedSource","genExportedMeta","_pickBy","default","_cloneDeep","_did","services","child","dynamic","bundleSource","push","source","mountPoint","environments","configs","required","secure","capabilities","getLaunchAgreementUrl","getNameByTitle","toLowerCase","_interopRequireDefault","_jszip","_jsYaml","_fileSaver","_urlJoin","_didMotif","obj","__esModule","getLogo","base64","bufStr","atob","bytes","Uint8Array","length","i","charCodeAt","base64ToArrayBuffer","toDataURL","license","holder","concat","Gitignore","GithubAction","folderName","split","pop","readme","zip","folder","file","dump","Promise","resolve","reject","generateAsync","content","encodeURI","arguments","adminPath","routing","metaUrl","blockletRegistry","_templateObject","_styled","_propTypes","_jsxRuntime","_excluded","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","apply","_objectSpread","target","_defineProperty","getOwnPropertyDescriptors","defineProperties","configurable","writable","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","prototype","propertyIsEnumerable","call","_ref","jsx","any","isRequired","strings","raw","div","slice","freeze","_templateObject2","_excluded2","_taggedTemplateLiteral","subname","rest","logoEle","LogoImg","nameEle","subnameEle","jsxs","Fragment","display","_ref2","LogoImgDiv","string"],"sourceRoot":""}
|