From 81d5fbf62eca37b73b06041242fdb88c95fc306d Mon Sep 17 00:00:00 2001 From: Jaco Date: Sat, 27 Aug 2022 11:32:52 +0200 Subject: [PATCH] Adjust light relay/para mappings (#8059) * Adjust light relay/para mappings * Adjust resolveJsonModule --- packages/react-api/src/Api.tsx | 57 ++++++++----------- packages/react-api/src/lightClient/index.ts | 28 +++++++++ .../kusama}/gm.json | 0 .../kusama}/index.ts | 12 ++-- .../kusama}/tinkernet.json | 0 tsconfig.base.json | 1 + tsconfig.build.json | 3 +- 7 files changed, 60 insertions(+), 41 deletions(-) create mode 100644 packages/react-api/src/lightClient/index.ts rename packages/react-api/src/{light-client-specs => lightClient/kusama}/gm.json (100%) rename packages/react-api/src/{light-client-specs => lightClient/kusama}/index.ts (53%) rename packages/react-api/src/{light-client-specs => lightClient/kusama}/tinkernet.json (100%) diff --git a/packages/react-api/src/Api.tsx b/packages/react-api/src/Api.tsx index c156ab9ac3..b350db38df 100644 --- a/packages/react-api/src/Api.tsx +++ b/packages/react-api/src/Api.tsx @@ -3,7 +3,7 @@ import type { LinkOption } from '@polkadot/apps-config/endpoints/types'; import type { InjectedExtension } from '@polkadot/extension-inject/types'; -import type { ProviderInterface, ProviderStats } from '@polkadot/rpc-provider/types'; +import type { ProviderStats } from '@polkadot/rpc-provider/types'; import type { ChainProperties, ChainType } from '@polkadot/types/interfaces'; import type { KeyringStore } from '@polkadot/ui-keyring/types'; import type { ApiProps, ApiState } from './types'; @@ -11,7 +11,7 @@ import type { ApiProps, ApiState } from './types'; import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import store from 'store'; -import { ApiPromise, WsProvider } from '@polkadot/api'; +import { ApiPromise, ScProvider, WsProvider } from '@polkadot/api'; import { deriveMapCache, setDeriveCache } from '@polkadot/api-derive/util'; import { ethereumChains, typesBundle } from '@polkadot/apps-config'; import { web3Accounts, web3Enable } from '@polkadot/extension-dapp'; @@ -19,14 +19,13 @@ import { TokenUnit } from '@polkadot/react-components/InputNumber'; import { StatusContext } from '@polkadot/react-components/Status'; import { useApiUrl, useEndpoint } from '@polkadot/react-hooks'; import ApiSigner from '@polkadot/react-signer/signers/ApiSigner'; -import { ScProvider, WellKnownChain } from '@polkadot/rpc-provider/substrate-connect'; import { keyring } from '@polkadot/ui-keyring'; import { settings } from '@polkadot/ui-settings'; import { formatBalance, isNumber, isTestChain, objectSpread, stringify } from '@polkadot/util'; import { defaults as addressDefaults } from '@polkadot/util-crypto/address/defaults'; import ApiContext from './ApiContext'; -import { lightSpecs } from './light-client-specs'; +import { lightSpecs, relaySpecs } from './lightClient'; import registry from './typeRegistry'; import { decodeUrlTypes } from './urlTypes'; @@ -235,44 +234,40 @@ async function loadOnReady (api: ApiPromise, endpoint: LinkOption | null, inject }; } -function getLightProvider (chain = 'polkadot') { - const [relayArg, paraArg] = chain.split('/'); +/** + * @internal + * Creates a ScProvider from a [/parachain] string + */ +function getLightProvider (chain: string): ScProvider { + const [sc, relayName, paraName] = chain.split('/'); - const wellKnown = () => { - switch (relayArg) { - case 'kusama': - return WellKnownChain.ksmcc3; - case 'polkadot': - return WellKnownChain.polkadot; - case 'rococo': - return WellKnownChain.rococo_v2_2; - case 'westend': - return WellKnownChain.westend2; - default: - throw new Error(`Unable to construct light chain ${chain}`); - } - }; + if (sc !== 'substrate-connect') { + throw new Error(`Cannot connect to non substrate-connect protocol ${chain}`); + } else if (!relaySpecs[relayName] || (paraName && (!lightSpecs[relayName] || !lightSpecs[relayName][paraName]))) { + throw new Error(`Unable to construct light chain ${chain}`); + } - const relay = new ScProvider(wellKnown()); + const relay = new ScProvider(relaySpecs[relayName]); - return paraArg && lightSpecs[paraArg] - ? new ScProvider(JSON.stringify(lightSpecs[paraArg]), relay) + return paraName + ? new ScProvider(lightSpecs[relayName][paraName], relay) : relay; } +/** + * @internal + */ async function createApi (apiUrl: string, signer: ApiSigner, onError: (error: unknown) => void): Promise>> { const types = getDevTypes(); const isLight = apiUrl.startsWith('light://'); try { - const providers = [0].map((): ProviderInterface => - isLight - ? getLightProvider(apiUrl.replace('light://substrate-connect/', '')) - : new WsProvider(apiUrl) - ); + const provider = isLight + ? getLightProvider(apiUrl.replace('light://', '')) + : new WsProvider(apiUrl); api = new ApiPromise({ - provider: providers[0], + provider, registry, signer, types, @@ -281,9 +276,7 @@ async function createApi (apiUrl: string, signer: ApiSigner, onError: (error: un // See https://github.com/polkadot-js/api/pull/4672#issuecomment-1078843960 if (isLight) { - for (let i = 0; i < providers.length; i++) { - await providers[i].connect(); - } + await provider.connect(); } } catch (error) { onError(error); diff --git a/packages/react-api/src/lightClient/index.ts b/packages/react-api/src/lightClient/index.ts new file mode 100644 index 0000000000..11985f1477 --- /dev/null +++ b/packages/react-api/src/lightClient/index.ts @@ -0,0 +1,28 @@ +// Copyright 2017-2022 @polkadot/react-api authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { ScProvider } from '@polkadot/api'; + +import { specs as kusama } from './kusama'; + +export const lightSpecs: Record> = + Object + .entries>({ kusama }) + .reduce((relays: Record>, [k, s]) => { + relays[k] = Object + .entries(s) + .reduce((paras: Record, [k, v]) => { + paras[k] = JSON.stringify(v); + + return paras; + }, {}); + + return relays; + }, {}); + +export const relaySpecs: Record = { + kusama: ScProvider.WellKnownChain.ksmcc3, + polkadot: ScProvider.WellKnownChain.polkadot, + rococo: ScProvider.WellKnownChain.rococo_v2_2, + westend: ScProvider.WellKnownChain.westend2 +}; diff --git a/packages/react-api/src/light-client-specs/gm.json b/packages/react-api/src/lightClient/kusama/gm.json similarity index 100% rename from packages/react-api/src/light-client-specs/gm.json rename to packages/react-api/src/lightClient/kusama/gm.json diff --git a/packages/react-api/src/light-client-specs/index.ts b/packages/react-api/src/lightClient/kusama/index.ts similarity index 53% rename from packages/react-api/src/light-client-specs/index.ts rename to packages/react-api/src/lightClient/kusama/index.ts index 3c13a44ed4..b8ec36e7e9 100644 --- a/packages/react-api/src/light-client-specs/index.ts +++ b/packages/react-api/src/lightClient/kusama/index.ts @@ -1,15 +1,13 @@ // Copyright 2017-2022 @polkadot/react-api authors & contributors // SPDX-License-Identifier: Apache-2.0 -/* eslint sort-keys: ["error", "asc", { caseSensitive: false }] */ - -import gmSpec from './gm.json'; -import tinkernetSpec from './tinkernet.json'; +import gm from './gm.json' assert { type: 'json' }; +import tinkernet from './tinkernet.json' assert { type: 'json' }; // Add your imported spec here in alphabetical order. // The key here reflects the URL of the light client endpoint. // e.g. light://substrate-connect/kusama/gm -export const lightSpecs: Record = { - gm: gmSpec, - tinkernet: tinkernetSpec +export const specs: Record = { + gm, + tinkernet }; diff --git a/packages/react-api/src/light-client-specs/tinkernet.json b/packages/react-api/src/lightClient/kusama/tinkernet.json similarity index 100% rename from packages/react-api/src/light-client-specs/tinkernet.json rename to packages/react-api/src/lightClient/kusama/tinkernet.json diff --git a/tsconfig.base.json b/tsconfig.base.json index ef5f35a171..8262dadc57 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,6 +3,7 @@ "compilerOptions": { "composite": false, "jsx": "react", + "resolveJsonModule": true, "paths": { "@polkadot/apps/*": ["apps/src/*"], "@polkadot/apps": ["apps/src"], diff --git a/tsconfig.build.json b/tsconfig.build.json index 8350d513e9..e04931c7fa 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -2,8 +2,7 @@ "extends": "./tsconfig.base.json", "compilerOptions": { "baseUrl": "./packages", - "outDir": "./build", - "resolveJsonModule": true, + "outDir": "./build" }, "exclude": [ "build/**/*",