polkadot-api 1.7.8 → 1.8.0

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.
Files changed (43) hide show
  1. package/bin/cli.mjs +4 -1
  2. package/bin/cli.mjs.map +1 -1
  3. package/chains/paseo_people/package.json +9 -0
  4. package/dist/esm/client.mjs +7 -0
  5. package/dist/esm/client.mjs.map +1 -1
  6. package/dist/esm/compatibility.mjs +3 -4
  7. package/dist/esm/compatibility.mjs.map +1 -1
  8. package/dist/esm/constants.mjs +2 -2
  9. package/dist/esm/constants.mjs.map +1 -1
  10. package/dist/esm/event.mjs +2 -1
  11. package/dist/esm/event.mjs.map +1 -1
  12. package/dist/esm/reexports/chains_paseo_people.mjs +2 -0
  13. package/dist/esm/reexports/chains_paseo_people.mjs.map +1 -0
  14. package/dist/esm/runtime-call.mjs +2 -0
  15. package/dist/esm/runtime-call.mjs.map +1 -1
  16. package/dist/esm/storage.mjs +74 -70
  17. package/dist/esm/storage.mjs.map +1 -1
  18. package/dist/esm/tx/signed-extensions/utils.mjs +3 -1
  19. package/dist/esm/tx/signed-extensions/utils.mjs.map +1 -1
  20. package/dist/esm/tx/submit-fns.mjs +2 -0
  21. package/dist/esm/tx/submit-fns.mjs.map +1 -1
  22. package/dist/esm/utils/lossLessExhaustMap.mjs +48 -0
  23. package/dist/esm/utils/lossLessExhaustMap.mjs.map +1 -0
  24. package/dist/esm/utils/self-dependent.mjs +25 -0
  25. package/dist/esm/utils/self-dependent.mjs.map +1 -0
  26. package/dist/esm/watch-entries.mjs +245 -0
  27. package/dist/esm/watch-entries.mjs.map +1 -0
  28. package/dist/index.d.ts +55 -3
  29. package/dist/index.js +371 -187
  30. package/dist/index.js.map +1 -1
  31. package/dist/reexports/chains.d.ts +1 -0
  32. package/dist/reexports/chains_paseo_people.d.ts +1 -0
  33. package/dist/reexports/chains_paseo_people.js +13 -0
  34. package/dist/reexports/chains_paseo_people.js.map +1 -0
  35. package/dist/umd/index.min.js +2 -2
  36. package/dist/umd/ink.min.js +1 -1
  37. package/dist/umd/pjs-signer.min.js +1 -1
  38. package/dist/umd/signer.min.js +1 -1
  39. package/package.json +16 -15
  40. package/dist/esm/utils/concatMapEager.mjs +0 -84
  41. package/dist/esm/utils/concatMapEager.mjs.map +0 -1
  42. package/dist/esm/utils/raceMap.mjs +0 -51
  43. package/dist/esm/utils/raceMap.mjs.map +0 -1
package/bin/cli.mjs CHANGED
@@ -1,11 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { getCli, add, generate, remove, update, ink } from '@polkadot-api/cli';
3
3
 
4
+ var version = "1.8.0";
5
+
4
6
  getCli({
5
7
  add,
6
8
  generate,
7
9
  remove,
8
10
  update,
9
- ink
11
+ ink,
12
+ version
10
13
  }).parse();
11
14
  //# sourceMappingURL=cli.mjs.map
package/bin/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { add, generate, getCli, remove, update, ink } from \"@polkadot-api/cli\"\n\ngetCli({\n add,\n generate,\n remove,\n update,\n ink,\n}).parse()\n"],"names":[],"mappings":";;;AAIA,MAAO,CAAA;AAAA,EACL,GAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,EAAE,KAAM,EAAA"}
1
+ {"version":3,"file":"cli.mjs","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { add, generate, getCli, remove, update, ink } from \"@polkadot-api/cli\"\nimport { version } from \"../package.json\"\n\ngetCli({\n add,\n generate,\n remove,\n update,\n ink,\n version,\n}).parse()\n"],"names":[],"mappings":";;;;;AAKA,MAAO,CAAA;AAAA,EACL,GAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,EAAE,KAAM,EAAA"}
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "polkadot-api_chains_paseo_people",
3
+ "types": "../../dist/reexports/chains_paseo_people.d.ts",
4
+ "module": "../../dist/esm/reexports/chains_paseo_people.mjs",
5
+ "import": "../../dist/esm/reexports/chains_paseo_people.mjs",
6
+ "browser": "../../dist/esm/reexports/chains_paseo_people.mjs",
7
+ "require": "../../dist/reexports/chains_paseo_people.js",
8
+ "default": "../../dist/reexports/chains_paseo_people.js"
9
+ }
@@ -8,6 +8,7 @@ import { createEventEntry } from './event.mjs';
8
8
  import { createRuntimeCallEntry } from './runtime-call.mjs';
9
9
  import { createStorageEntry } from './storage.mjs';
10
10
  import { createTxEntry } from './tx/tx.mjs';
11
+ import { createWatchEntries } from './watch-entries.mjs';
11
12
  import { submit, submit$ } from './tx/submit-fns.mjs';
12
13
 
13
14
  const createApi = (compatibilityToken, chainHead, broadcast$) => {
@@ -28,11 +29,17 @@ const createApi = (compatibilityToken, chainHead, broadcast$) => {
28
29
  });
29
30
  };
30
31
  const getPallet = (ctx, name) => ctx.lookup.metadata.pallets.find((p) => p.name === name);
32
+ const getWatchEntries = createWatchEntries(
33
+ chainHead.pinnedBlocks$,
34
+ chainHead.storage$,
35
+ chainHead.withRuntime
36
+ );
31
37
  const query = createProxyPath(
32
38
  (pallet, name) => createStorageEntry(
33
39
  pallet,
34
40
  name,
35
41
  chainHead,
42
+ getWatchEntries,
36
43
  compatibilityHelper(
37
44
  compatibilityToken,
38
45
  (r) => r.getPalletEntryPoint(OpType.Storage, pallet, name),
@@ -1 +1 @@
1
- {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport {\n enumValueEntryPointNode,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n ChainHead$,\n RuntimeContext,\n getObservableClient,\n} from \"@polkadot-api/observable-client\"\nimport {\n SubstrateClient,\n createClient as createRawClient,\n} from \"@polkadot-api/substrate-client\"\nimport { Observable, firstValueFrom } from \"rxjs\"\nimport {\n CompatibilityToken,\n OpType,\n RuntimeToken,\n compatibilityHelper,\n createCompatibilityToken,\n createRuntimeToken,\n getCompatibilityApi,\n} from \"./compatibility\"\nimport { createConstantEntry } from \"./constants\"\nimport { ChainDefinition } from \"./descriptors\"\nimport { createEventEntry } from \"./event\"\nimport { createRuntimeCallEntry } from \"./runtime-call\"\nimport { createStorageEntry } from \"./storage\"\nimport { createTxEntry, submit, submit$ } from \"./tx\"\nimport type { AnyApi, PolkadotClient } from \"./types\"\nimport { Binary } from \"@polkadot-api/substrate-bindings\"\n\nconst createApi = <Unsafe extends true | false, D>(\n compatibilityToken: Promise<CompatibilityToken | RuntimeToken>,\n chainHead: ChainHead$,\n broadcast$: (tx: string) => Observable<never>,\n): AnyApi<Unsafe, D> => {\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const getPallet = (ctx: RuntimeContext, name: string) =>\n ctx.lookup.metadata.pallets.find((p) => p.name === name)!\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) =>\n storageEntryPoint(\n getPallet(ctx, pallet).storage!.items.find((s) => s.name === name)!,\n ),\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number,\n name: string,\n ) => {\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Tx, pallet, name),\n (ctx) => getEnumEntry(ctx, \"args\", getPallet(ctx, pallet).calls!, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"values\", getPallet(ctx, pallet).events!, name),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Const, pallet, name),\n (ctx) =>\n singleValueEntryPoint(\n getPallet(ctx, pallet).constants.find((c) => c.name === name)!.type,\n ),\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getApiEntryPoint(api, method),\n (ctx) =>\n runtimeCallEntryPoint(\n ctx.lookup.metadata.apis\n .find((a) => a.name === api)!\n .methods.find((m) => m.name === method)!,\n ),\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet).calls!, call),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n } as any\n}\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @example\n *\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain))\n *\n */\nexport function createClient(provider: JsonRpcProvider): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient)\n const chainHead = client.chainHead$()\n\n const { getChainSpecData } = rawClient\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let runtimeToken: Promise<RuntimeToken>\n const compatibilityToken = new WeakMap<\n ChainDefinition,\n Promise<CompatibilityToken<any>>\n >()\n const getChainToken = (chainDefinition: ChainDefinition) => {\n const result =\n compatibilityToken.get(chainDefinition) ||\n createCompatibilityToken(chainDefinition, chainHead)\n compatibilityToken.set(chainDefinition, result)\n return result\n }\n const getRuntimeToken = <D>(): Promise<RuntimeToken<D>> =>\n (runtimeToken ??= createRuntimeToken(chainHead))\n const { broadcastTx$ } = client\n return {\n getChainSpecData,\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (...args) => submit$(chainHead, broadcastTx$, ...args),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n const token = getChainToken(chainDefinition)\n return Object.assign(\n createApi<false, D>(token, chainHead, broadcastTx$),\n { compatibilityToken: token },\n )\n },\n\n getUnsafeApi: <D>() => {\n const token = getRuntimeToken()\n return Object.assign(createApi<true, D>(token, chainHead, broadcastTx$), {\n runtimeToken: token,\n })\n },\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n}\n"],"names":["createRawClient"],"mappings":"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"}
1
+ {"version":3,"file":"client.mjs","sources":["../../src/client.ts"],"sourcesContent":["import { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport {\n enumValueEntryPointNode,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n ChainHead$,\n RuntimeContext,\n getObservableClient,\n} from \"@polkadot-api/observable-client\"\nimport {\n SubstrateClient,\n createClient as createRawClient,\n} from \"@polkadot-api/substrate-client\"\nimport { Observable, firstValueFrom } from \"rxjs\"\nimport {\n CompatibilityToken,\n OpType,\n RuntimeToken,\n compatibilityHelper,\n createCompatibilityToken,\n createRuntimeToken,\n getCompatibilityApi,\n} from \"./compatibility\"\nimport { createConstantEntry } from \"./constants\"\nimport { ChainDefinition } from \"./descriptors\"\nimport { createEventEntry } from \"./event\"\nimport { createRuntimeCallEntry } from \"./runtime-call\"\nimport { createStorageEntry } from \"./storage\"\nimport { createTxEntry, submit, submit$ } from \"./tx\"\nimport type { AnyApi, PolkadotClient } from \"./types\"\nimport { Binary } from \"@polkadot-api/substrate-bindings\"\nimport { createWatchEntries } from \"./watch-entries\"\n\nconst createApi = <Unsafe extends true | false, D>(\n compatibilityToken: Promise<CompatibilityToken | RuntimeToken>,\n chainHead: ChainHead$,\n broadcast$: (tx: string) => Observable<never>,\n): AnyApi<Unsafe, D> => {\n const target = {}\n const createProxy = (propCall: (prop: string) => unknown) =>\n new Proxy(target, {\n get(_, prop) {\n return propCall(prop as string)\n },\n })\n const createProxyPath = <T>(pathCall: (a: string, b: string) => T) => {\n const cache: Record<string, Record<string, T>> = {}\n return createProxy((a) => {\n if (!cache[a]) cache[a] = {}\n return createProxy((b) => {\n if (!cache[a][b]) cache[a][b] = pathCall(a, b)\n return cache[a][b]\n })\n }) as Record<string, Record<string, T>>\n }\n\n const getPallet = (ctx: RuntimeContext, name: string) =>\n ctx.lookup.metadata.pallets.find((p) => p.name === name)!\n\n const getWatchEntries = createWatchEntries(\n chainHead.pinnedBlocks$,\n chainHead.storage$,\n chainHead.withRuntime,\n )\n const query = createProxyPath((pallet, name) =>\n createStorageEntry(\n pallet,\n name,\n chainHead,\n getWatchEntries,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Storage, pallet, name),\n // TODO this is way sub-optimal. Needs some rethought - maybe a builder for entry points?.\n (ctx) =>\n storageEntryPoint(\n getPallet(ctx, pallet).storage!.items.find((s) => s.name === name)!,\n ),\n ),\n ),\n )\n\n const getEnumEntry = (\n ctx: RuntimeContext,\n side: \"args\" | \"values\",\n id: number,\n name: string,\n ) => {\n const entry = ctx.lookup(id)\n if (entry.type !== \"enum\") throw new Error(\"Expected enum\")\n\n const node = enumValueEntryPointNode(entry.value[name])\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n }\n const tx = createProxyPath((pallet, name) =>\n createTxEntry(\n pallet,\n name,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Tx, pallet, name),\n (ctx) => getEnumEntry(ctx, \"args\", getPallet(ctx, pallet).calls!, name),\n ),\n true,\n ),\n )\n\n const event = createProxyPath((pallet, name) =>\n createEventEntry(\n pallet,\n name,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Event, pallet, name),\n (ctx) =>\n getEnumEntry(ctx, \"values\", getPallet(ctx, pallet).events!, name),\n ),\n ),\n )\n\n const constants = createProxyPath((pallet, name) =>\n createConstantEntry(\n pallet,\n name,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Const, pallet, name),\n (ctx) =>\n singleValueEntryPoint(\n getPallet(ctx, pallet).constants.find((c) => c.name === name)!.type,\n ),\n ),\n ),\n )\n\n const apis = createProxyPath((api, method) =>\n createRuntimeCallEntry(\n api,\n method,\n chainHead,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getApiEntryPoint(api, method),\n (ctx) =>\n runtimeCallEntryPoint(\n ctx.lookup.metadata.apis\n .find((a) => a.name === api)!\n .methods.find((m) => m.name === method)!,\n ),\n ),\n ),\n )\n\n const _callDataTx = (\n callData: Binary,\n token: CompatibilityToken | RuntimeToken,\n ) => {\n const { lookup, dynamicBuilder } = getCompatibilityApi(token).runtime()\n try {\n const decoded = dynamicBuilder\n .buildDefinition(lookup.call!)\n .dec(callData.asBytes())\n const pallet = decoded.type\n const call = decoded.value.type\n const args = decoded.value.value\n\n return createTxEntry(\n pallet,\n call,\n chainHead,\n broadcast$,\n compatibilityHelper(\n compatibilityToken,\n (r) => r.getPalletEntryPoint(OpType.Tx, pallet, call),\n (ctx) =>\n getEnumEntry(ctx, \"args\", getPallet(ctx, pallet).calls!, call),\n ),\n false,\n )(args)\n } catch {\n throw new Error(\"createTx: invalid call data\")\n }\n }\n\n return {\n query,\n txFromCallData: (\n callData: Binary,\n token?: CompatibilityToken | RuntimeToken,\n ) =>\n token\n ? _callDataTx(callData, token)\n : compatibilityToken.then((t) => _callDataTx(callData, t)),\n tx,\n event,\n apis,\n constants,\n } as any\n}\n\n/**\n * This is the top-level export for `polkadot-api`.\n *\n * @param provider A `JsonRpcProvider` compliant with the [JSON-RPC\n * spec](https://paritytech.github.io/json-rpc-interface-spec/),\n * which must support the `chainHead`, `transaction` and\n * `chainSpec` groups.\n * @example\n *\n * import { createClient } from \"polkadot-api\"\n * import { getSmProvider } from \"polkadot-api/sm-provider\"\n * import { chainSpec } from \"polkadot-api/chains/polkadot\"\n * import { start } from \"polkadot-api/smoldot\"\n *\n * const smoldot = start()\n * const chain = await smoldot.addChain({ chainSpec })\n *\n * // Connect to the polkadot relay chain.\n * const client = createClient(getSmProvider(chain))\n *\n */\nexport function createClient(provider: JsonRpcProvider): PolkadotClient {\n const rawClient: SubstrateClient = createRawClient(provider)\n const client = getObservableClient(rawClient)\n const chainHead = client.chainHead$()\n\n const { getChainSpecData } = rawClient\n\n const _request: <Reply = any, Params extends Array<any> = any[]>(\n method: string,\n params: Params,\n ) => Promise<Reply> = rawClient.request\n\n let runtimeToken: Promise<RuntimeToken>\n const compatibilityToken = new WeakMap<\n ChainDefinition,\n Promise<CompatibilityToken<any>>\n >()\n const getChainToken = (chainDefinition: ChainDefinition) => {\n const result =\n compatibilityToken.get(chainDefinition) ||\n createCompatibilityToken(chainDefinition, chainHead)\n compatibilityToken.set(chainDefinition, result)\n return result\n }\n const getRuntimeToken = <D>(): Promise<RuntimeToken<D>> =>\n (runtimeToken ??= createRuntimeToken(chainHead))\n const { broadcastTx$ } = client\n return {\n getChainSpecData,\n\n finalizedBlock$: chainHead.finalized$,\n getFinalizedBlock: () => firstValueFrom(chainHead.finalized$),\n\n bestBlocks$: chainHead.bestBlocks$,\n getBestBlocks: () => firstValueFrom(chainHead.bestBlocks$),\n\n watchBlockBody: chainHead.body$,\n getBlockBody: (hash: string) => firstValueFrom(chainHead.body$(hash)),\n\n getBlockHeader: (hash?: string) =>\n firstValueFrom(chainHead.header$(hash ?? null)),\n\n submit: (...args) => submit(chainHead, broadcastTx$, ...args),\n submitAndWatch: (...args) => submit$(chainHead, broadcastTx$, ...args),\n\n getTypedApi: <D extends ChainDefinition>(chainDefinition: D) => {\n const token = getChainToken(chainDefinition)\n return Object.assign(\n createApi<false, D>(token, chainHead, broadcastTx$),\n { compatibilityToken: token },\n )\n },\n\n getUnsafeApi: <D>() => {\n const token = getRuntimeToken()\n return Object.assign(createApi<true, D>(token, chainHead, broadcastTx$), {\n runtimeToken: token,\n })\n },\n\n destroy: () => {\n chainHead.unfollow()\n client.destroy()\n },\n\n _request,\n }\n}\n"],"names":["createRawClient"],"mappings":"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"}
@@ -118,11 +118,10 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
118
118
  descriptors,
119
119
  (threshold, runtime) => getCompatibilityLevel(runtime) >= threshold
120
120
  );
121
- const waitDescriptors = () => descriptors;
122
- const compatibleRuntime$ = (chainHead, hash) => combineLatest([waitDescriptors(), chainHead.getRuntimeContext$(hash)]);
121
+ const compatibleRuntime$ = (chainHead, hash) => combineLatest([descriptors, chainHead.getRuntimeContext$(hash)]);
123
122
  const withCompatibleRuntime = (chainHead, mapper) => (source$) => combineLatest([
124
123
  source$.pipe(chainHead.withRuntime(mapper)),
125
- waitDescriptors()
124
+ descriptors
126
125
  ]).pipe(map(([[x, ctx], descriptors2]) => [x, descriptors2, ctx]));
127
126
  const argsAreCompatible = (descriptors2, ctx, args) => {
128
127
  if (descriptors2 instanceof RuntimeToken) return true;
@@ -154,7 +153,7 @@ const compatibilityHelper = (descriptors, getDescriptorEntryPoint, getRuntimeEnt
154
153
  isCompatible,
155
154
  getCompatibilityLevel,
156
155
  getCompatibilityLevels,
157
- waitDescriptors,
156
+ descriptors,
158
157
  withCompatibleRuntime,
159
158
  compatibleRuntime$,
160
159
  argsAreCompatible,
@@ -1 +1 @@
1
- {"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getPalletEntryPoint: (\n opType: OpType,\n pallet: string,\n name: string,\n ) => EntryPoint\n getApiEntryPoint: (name: string, method: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getPalletEntryPoint(opType, pallet, name) {\n return entryPoints[descriptors[opType][pallet][name]]\n },\n getApiEntryPoint(name, method) {\n return entryPoints[descriptors.apis[name][method]]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n return entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const waitDescriptors = () => descriptors\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([waitDescriptors(), chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n waitDescriptors(),\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n waitDescriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
1
+ {"version":3,"file":"compatibility.mjs","sources":["../../src/compatibility.ts"],"sourcesContent":["import { MetadataLookup } from \"@polkadot-api/metadata-builders\"\nimport {\n CompatibilityCache,\n CompatibilityLevel,\n EntryPoint,\n EntryPointCodec,\n TypedefCodec,\n TypedefNode,\n entryPointsAreCompatible,\n mapLookupToTypedef,\n valueIsCompatibleWithDest,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { ChainHead$, RuntimeContext } from \"@polkadot-api/observable-client\"\nimport { Tuple, Vector } from \"@polkadot-api/substrate-bindings\"\nimport { Observable, combineLatest, filter, firstValueFrom, map } from \"rxjs\"\nimport { ChainDefinition } from \"./descriptors\"\n\nexport class RuntimeToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _runtime(value: D) {}\n}\n\nexport class CompatibilityToken<D = unknown> {\n private constructor() {}\n\n // @ts-ignore\n protected _compatibility(value: D) {}\n}\n\ninterface RuntimeTokenApi {\n runtime: () => RuntimeContext\n}\ninterface CompatibilityTokenApi extends RuntimeTokenApi {\n typedefNodes: TypedefNode[]\n getPalletEntryPoint: (\n opType: OpType,\n pallet: string,\n name: string,\n ) => EntryPoint\n getApiEntryPoint: (name: string, method: string) => EntryPoint\n}\nconst compatibilityTokenApi = new WeakMap<\n CompatibilityToken,\n CompatibilityTokenApi\n>()\nconst runtimeTokenApi = new WeakMap<RuntimeToken, RuntimeTokenApi>()\nexport const getCompatibilityApi = (\n token: RuntimeToken | CompatibilityToken,\n): RuntimeTokenApi | CompatibilityTokenApi =>\n token instanceof RuntimeToken\n ? runtimeTokenApi.get(token)!\n : compatibilityTokenApi.get(token)!\n\nexport const enum OpType {\n Storage = \"storage\",\n Tx = \"tx\",\n Event = \"events\",\n Const = \"constants\",\n}\n\nconst EntryPointsCodec = Vector(EntryPointCodec)\nconst TypedefsCodec = Vector(TypedefCodec)\nconst TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\nexport const createCompatibilityToken = <D extends ChainDefinition>(\n chainDefinition: D,\n chainHead: ChainHead$,\n): Promise<CompatibilityToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = Promise.all([\n chainDefinition.metadataTypes.then(TypesCodec.dec),\n chainDefinition.descriptors,\n awaitedRuntime,\n ]).then(([[entryPoints, typedefNodes], descriptors, runtime]) => {\n const token = new (CompatibilityToken as any)()\n compatibilityTokenApi.set(token, {\n runtime,\n getPalletEntryPoint(opType, pallet, name) {\n return entryPoints[descriptors[opType][pallet][name]]\n },\n getApiEntryPoint(name, method) {\n return entryPoints[descriptors.apis[name][method]]\n },\n typedefNodes,\n })\n\n return token\n })\n\n return promise\n}\n\nexport const createRuntimeToken = <D>(\n chainHead: ChainHead$,\n): Promise<RuntimeToken<D>> => {\n const awaitedRuntime = new Promise<() => RuntimeContext>(async (resolve) => {\n const loadedRuntime$ = chainHead.runtime$.pipe(filter((v) => v != null))\n\n let latest = await firstValueFrom(loadedRuntime$)\n loadedRuntime$.subscribe((v) => (latest = v))\n\n resolve(() => latest)\n })\n\n const promise = awaitedRuntime.then((runtime) => {\n const token = new (RuntimeToken as any)()\n runtimeTokenApi.set(token, {\n runtime,\n })\n return token\n })\n\n return promise\n}\n\n// metadataRaw -> cache\nconst metadataCache = new WeakMap<\n Uint8Array,\n {\n compat: CompatibilityCache\n lookup: MetadataLookup\n typeNodes: (TypedefNode | null)[]\n }\n>()\nconst getMetadataCache = (ctx: RuntimeContext) => {\n if (!metadataCache.has(ctx.metadataRaw)) {\n metadataCache.set(ctx.metadataRaw, {\n compat: new Map(),\n lookup: ctx.lookup,\n typeNodes: [],\n })\n }\n return metadataCache.get(ctx.metadataRaw)!\n}\nexport const compatibilityHelper = (\n descriptors: Promise<RuntimeToken | CompatibilityToken>,\n getDescriptorEntryPoint: (descriptorApi: CompatibilityTokenApi) => EntryPoint,\n getRuntimeEntryPoint: (ctx: RuntimeContext) => EntryPoint,\n) => {\n const getRuntimeTypedef = (ctx: RuntimeContext, id: number) => {\n const cache = getMetadataCache(ctx)\n return (cache.typeNodes[id] ||= mapLookupToTypedef(cache.lookup(id)))\n }\n\n function getCompatibilityLevels(\n descriptors: CompatibilityToken | RuntimeToken,\n /**\n * The `Runtime` of runtimeWithDescriptors already has a RuntimeContext,\n * which is the runtime of the finalized block.\n * But on some cases, the user wants to perform an action on a specific\n * block hash, which has a different RuntimeContext.\n */\n ctx?: RuntimeContext,\n ) {\n if (descriptors instanceof RuntimeToken) {\n return {\n args: CompatibilityLevel.Identical,\n values: CompatibilityLevel.Identical,\n }\n }\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n ctx ||= compatibilityApi.runtime()\n const descriptorEntryPoint = getDescriptorEntryPoint(compatibilityApi)\n const runtimeEntryPoint = getRuntimeEntryPoint(ctx)\n const descriptorNodes = compatibilityApi.typedefNodes\n\n const cache = getMetadataCache(ctx)\n\n return entryPointsAreCompatible(\n descriptorEntryPoint,\n (id) => descriptorNodes[id],\n runtimeEntryPoint,\n (id) => getRuntimeTypedef(ctx, id),\n cache.compat,\n )\n }\n\n const getCompatibilityLevel = withOptionalToken(descriptors, (runtime) =>\n minCompatLevel(getCompatibilityLevels(runtime)),\n )\n const isCompatible = withOptionalToken(\n descriptors,\n (threshold: CompatibilityLevel, runtime) =>\n getCompatibilityLevel(runtime) >= threshold,\n )\n\n const compatibleRuntime$ = (chainHead: ChainHead$, hash: string | null) =>\n combineLatest([descriptors, chainHead.getRuntimeContext$(hash)])\n\n const withCompatibleRuntime =\n <T>(chainHead: ChainHead$, mapper: (x: T) => string) =>\n (\n source$: Observable<T>,\n ): Observable<[T, CompatibilityToken | RuntimeToken, RuntimeContext]> =>\n combineLatest([\n source$.pipe(chainHead.withRuntime(mapper)),\n descriptors,\n ]).pipe(map(([[x, ctx], descriptors]) => [x, descriptors, ctx]))\n\n const argsAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n args: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const levels = getCompatibilityLevels(descriptors, ctx)\n if (levels.args === CompatibilityLevel.Incompatible) return false\n if (levels.args > CompatibilityLevel.Partial) return true\n // Although technically args could still be compatible, if the output will be incompatible we might as well just return false to skip sending the request.\n if (levels.values === CompatibilityLevel.Incompatible) return false\n\n const entryPoint = getRuntimeEntryPoint(ctx)\n\n return valueIsCompatibleWithDest(\n entryPoint.args,\n (id) => getRuntimeTypedef(ctx, id),\n args,\n )\n }\n const valuesAreCompatible = (\n descriptors: CompatibilityToken | RuntimeToken,\n ctx: RuntimeContext,\n values: unknown,\n ) => {\n if (descriptors instanceof RuntimeToken) return true\n const level = getCompatibilityLevels(descriptors, ctx).values\n if (level === CompatibilityLevel.Incompatible) return false\n if (level > CompatibilityLevel.Partial) return true\n\n const compatibilityApi = compatibilityTokenApi.get(descriptors)!\n\n const entryPoint = getDescriptorEntryPoint(compatibilityApi)\n\n return valueIsCompatibleWithDest(\n entryPoint.values,\n (id) => compatibilityApi.typedefNodes[id],\n values,\n )\n }\n\n return {\n isCompatible,\n getCompatibilityLevel,\n getCompatibilityLevels,\n descriptors,\n withCompatibleRuntime,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n getRuntimeTypedef,\n }\n}\nexport type CompatibilityHelper = ReturnType<typeof compatibilityHelper>\n\nexport const minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nconst withOptionalToken =\n <T, D, A extends [...any[], CompatibilityToken | RuntimeToken]>(\n compatibilityToken: Promise<CompatibilityToken<D> | RuntimeToken<D>>,\n fn: (...args: A) => T,\n ): WithOptionalRuntime<T, D, A extends [...infer R, any] ? R : []> =>\n (...args: any): any => {\n const lastElement = args.at(-1)\n if (\n lastElement instanceof CompatibilityToken ||\n lastElement instanceof RuntimeToken\n ) {\n return fn(...args)\n }\n return compatibilityToken.then((token) => (fn as any)(...args, token))\n }\n\nexport type WithOptionalRuntime<T, D, A extends any[]> = {\n /**\n * Returns the result after waiting for the runtime to load.\n */\n (...args: A): Promise<T>\n /**\n * Returns the result synchronously with the loaded runtime.\n */\n (...args: [...A, runtime: CompatibilityToken<D> | RuntimeToken<D>]): T\n}\n\nexport interface CompatibilityFunctions<D> {\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n */\n getCompatibilityLevel(): Promise<CompatibilityLevel>\n /**\n * Returns the `CompatibilityLevel` for this call comparing the descriptors\n * generated on dev time with the current live metadata.\n *\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n getCompatibilityLevel(\n compatibilityToken: CompatibilityToken<D>,\n ): CompatibilityLevel\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use, inclusive.\n */\n isCompatible(threshold: CompatibilityLevel): Promise<boolean>\n\n /**\n * Returns whether this call is compatible based on the CompatibilityLevel\n * threshold.\n *\n * @param threshold CompatibilityLevel threshold to use,\n * inclusive.\n * @param compatibilityToken CompatibilityToken awaited from\n * typedApi.compatibilityToken.\n */\n isCompatible(\n threshold: CompatibilityLevel,\n compatibilityToken: CompatibilityToken<D>,\n ): boolean\n}\n"],"names":["OpType","descriptors"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { getCompatibilityApi } from './compatibility.mjs';
2
2
 
3
3
  const createConstantEntry = (palletName, name, {
4
4
  valuesAreCompatible,
5
- waitDescriptors,
5
+ descriptors,
6
6
  isCompatible,
7
7
  getCompatibilityLevel
8
8
  }) => {
@@ -31,7 +31,7 @@ const createConstantEntry = (palletName, name, {
31
31
  );
32
32
  return value;
33
33
  }
34
- return waitDescriptors().then(fn);
34
+ return descriptors.then(fn);
35
35
  };
36
36
  return Object.assign(fn, { isCompatible, getCompatibilityLevel });
37
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { RuntimeContext } from \"@polkadot-api/observable-client\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"./compatibility\"\n\nexport type ConstantEntry<Unsafe, D, T> = Unsafe extends true\n ? {\n /**\n * Constants are simple key-value structures found in the runtime\n * metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param runtimeToken Token from got with `await\n * typedApi.runtimeToken`\n * @returns Synchronously returns value of the constant.\n */\n (runtimeToken: RuntimeToken): T\n }\n : {\n /**\n * Constants are simple key-value structures found in the runtime\n * metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns value of the constant.\n */\n (compatibilityToken: CompatibilityToken): T\n } & CompatibilityFunctions<D>\n\nexport const createConstantEntry = <D, T>(\n palletName: string,\n name: string,\n {\n valuesAreCompatible,\n waitDescriptors,\n isCompatible,\n getCompatibilityLevel,\n }: CompatibilityHelper,\n): ConstantEntry<any, D, T> => {\n const cachedResults = new WeakMap<RuntimeContext, T>()\n const getValueWithContext = (ctx: RuntimeContext) => {\n if (cachedResults.has(ctx)) {\n return cachedResults.get(ctx)!\n }\n\n const pallet = ctx.lookup.metadata.pallets.find(\n (p) => p.name === palletName,\n )\n const constant = pallet?.constants.find((c) => c.name === name)\n if (constant == null)\n throw new Error(`Runtime entry Constant(${palletName}.${name}) not found`)\n const result = ctx.dynamicBuilder\n .buildConstant(palletName, name)\n .dec(constant.value)\n cachedResults.set(ctx, result)\n return result\n }\n\n const fn = (token?: CompatibilityToken | RuntimeToken): any => {\n if (token) {\n const ctx = getCompatibilityApi(token).runtime()\n const value = getValueWithContext(ctx)\n if (!valuesAreCompatible(token, ctx, value))\n throw new Error(\n `Incompatible runtime entry Constant(${palletName}.${name})`,\n )\n return value\n }\n return waitDescriptors().then(fn)\n }\n\n return Object.assign(fn, { isCompatible, getCompatibilityLevel })\n}\n"],"names":[],"mappings":";;AAyCa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,IACA,EAAA;AAAA,EACE,mBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAC6B,KAAA;AAC7B,EAAM,MAAA,aAAA,uBAAoB,OAA2B,EAAA;AACrD,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAwB,KAAA;AACnD,IAAI,IAAA,aAAA,CAAc,GAAI,CAAA,GAAG,CAAG,EAAA;AAC1B,MAAO,OAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA;AAG9B,IAAA,MAAM,MAAS,GAAA,GAAA,CAAI,MAAO,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA;AAAA,MACzC,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA;AAAA,KACpB;AACA,IAAM,MAAA,QAAA,GAAW,QAAQ,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA;AAC9D,IAAA,IAAI,QAAY,IAAA,IAAA;AACd,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,EAAI,IAAI,CAAa,WAAA,CAAA,CAAA;AAC3E,IAAM,MAAA,MAAA,GAAS,IAAI,cAChB,CAAA,aAAA,CAAc,YAAY,IAAI,CAAA,CAC9B,GAAI,CAAA,QAAA,CAAS,KAAK,CAAA;AACrB,IAAc,aAAA,CAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAC7B,IAAO,OAAA,MAAA;AAAA,GACT;AAEA,EAAM,MAAA,EAAA,GAAK,CAAC,KAAmD,KAAA;AAC7D,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,MAAM,GAAM,GAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,OAAQ,EAAA;AAC/C,MAAM,MAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,MAAA,IAAI,CAAC,mBAAA,CAAoB,KAAO,EAAA,GAAA,EAAK,KAAK,CAAA;AACxC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,SAC3D;AACF,MAAO,OAAA,KAAA;AAAA;AAET,IAAO,OAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,GAClC;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,YAAA,EAAc,uBAAuB,CAAA;AAClE;;;;"}
1
+ {"version":3,"file":"constants.mjs","sources":["../../src/constants.ts"],"sourcesContent":["import { RuntimeContext } from \"@polkadot-api/observable-client\"\nimport {\n CompatibilityFunctions,\n CompatibilityHelper,\n CompatibilityToken,\n getCompatibilityApi,\n RuntimeToken,\n} from \"./compatibility\"\n\nexport type ConstantEntry<Unsafe, D, T> = Unsafe extends true\n ? {\n /**\n * Constants are simple key-value structures found in the runtime\n * metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param runtimeToken Token from got with `await\n * typedApi.runtimeToken`\n * @returns Synchronously returns value of the constant.\n */\n (runtimeToken: RuntimeToken): T\n }\n : {\n /**\n * Constants are simple key-value structures found in the runtime\n * metadata.\n *\n * @returns Promise that will resolve in the value of the constant.\n */\n (): Promise<T>\n /**\n * @param compatibilityToken Token from got with `await\n * typedApi.compatibilityToken`\n * @returns Synchronously returns value of the constant.\n */\n (compatibilityToken: CompatibilityToken): T\n } & CompatibilityFunctions<D>\n\nexport const createConstantEntry = <D, T>(\n palletName: string,\n name: string,\n {\n valuesAreCompatible,\n descriptors,\n isCompatible,\n getCompatibilityLevel,\n }: CompatibilityHelper,\n): ConstantEntry<any, D, T> => {\n const cachedResults = new WeakMap<RuntimeContext, T>()\n const getValueWithContext = (ctx: RuntimeContext) => {\n if (cachedResults.has(ctx)) {\n return cachedResults.get(ctx)!\n }\n\n const pallet = ctx.lookup.metadata.pallets.find(\n (p) => p.name === palletName,\n )\n const constant = pallet?.constants.find((c) => c.name === name)\n if (constant == null)\n throw new Error(`Runtime entry Constant(${palletName}.${name}) not found`)\n const result = ctx.dynamicBuilder\n .buildConstant(palletName, name)\n .dec(constant.value)\n cachedResults.set(ctx, result)\n return result\n }\n\n const fn = (token?: CompatibilityToken | RuntimeToken): any => {\n if (token) {\n const ctx = getCompatibilityApi(token).runtime()\n const value = getValueWithContext(ctx)\n if (!valuesAreCompatible(token, ctx, value))\n throw new Error(\n `Incompatible runtime entry Constant(${palletName}.${name})`,\n )\n return value\n }\n return descriptors.then(fn)\n }\n\n return Object.assign(fn, { isCompatible, getCompatibilityLevel })\n}\n"],"names":[],"mappings":";;AAyCa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,IACA,EAAA;AAAA,EACE,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAC6B,KAAA;AAC7B,EAAM,MAAA,aAAA,uBAAoB,OAA2B,EAAA;AACrD,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAwB,KAAA;AACnD,IAAI,IAAA,aAAA,CAAc,GAAI,CAAA,GAAG,CAAG,EAAA;AAC1B,MAAO,OAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA;AAG9B,IAAA,MAAM,MAAS,GAAA,GAAA,CAAI,MAAO,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA;AAAA,MACzC,CAAC,CAAM,KAAA,CAAA,CAAE,IAAS,KAAA;AAAA,KACpB;AACA,IAAM,MAAA,QAAA,GAAW,QAAQ,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,IAAI,CAAA;AAC9D,IAAA,IAAI,QAAY,IAAA,IAAA;AACd,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,EAAI,IAAI,CAAa,WAAA,CAAA,CAAA;AAC3E,IAAM,MAAA,MAAA,GAAS,IAAI,cAChB,CAAA,aAAA,CAAc,YAAY,IAAI,CAAA,CAC9B,GAAI,CAAA,QAAA,CAAS,KAAK,CAAA;AACrB,IAAc,aAAA,CAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AAC7B,IAAO,OAAA,MAAA;AAAA,GACT;AAEA,EAAM,MAAA,EAAA,GAAK,CAAC,KAAmD,KAAA;AAC7D,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,MAAM,GAAM,GAAA,mBAAA,CAAoB,KAAK,CAAA,CAAE,OAAQ,EAAA;AAC/C,MAAM,MAAA,KAAA,GAAQ,oBAAoB,GAAG,CAAA;AACrC,MAAA,IAAI,CAAC,mBAAA,CAAoB,KAAO,EAAA,GAAA,EAAK,KAAK,CAAA;AACxC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,SAC3D;AACF,MAAO,OAAA,KAAA;AAAA;AAET,IAAO,OAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,GAC5B;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,YAAA,EAAc,uBAAuB,CAAA;AAClE;;;;"}
@@ -1,7 +1,8 @@
1
1
  import { map, mergeMap, firstValueFrom } from 'rxjs';
2
+ import { concatMapEager } from '@polkadot-api/observable-client';
2
3
  import { shareLatest } from './utils/shareLatest.mjs';
3
4
  import '@polkadot-api/utils';
4
- import { concatMapEager } from './utils/concatMapEager.mjs';
5
+ import 'rxjs/operators';
5
6
 
6
7
  const createEventEntry = (pallet, name, chainHead, {
7
8
  isCompatible,
@@ -1 +1 @@
1
- {"version":3,"file":"event.mjs","sources":["../../src/event.ts"],"sourcesContent":["import { Observable, firstValueFrom, map, mergeMap } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\nimport { concatMapEager, shareLatest } from \"./utils\"\n\nexport type EventPhase =\n | { type: \"ApplyExtrinsic\"; value: number }\n | { type: \"Finalization\" }\n | { type: \"Initialization\" }\n\nexport type EvWatch<T> = (filter?: (value: T) => boolean) => Observable<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n}>\n\nexport type EvPull<T> = () => Promise<\n Array<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n }>\n>\n\nexport type EvFilter<T> = (collection: SystemEvent[\"event\"][]) => Array<T>\n\nexport type EvClient<Unsafe, D, T> = {\n /**\n * Multicast and stateful Observable watching for new events (matching the\n * event kind chosen) in the latest known `finalized` block.\n *\n * @param filter Optional filter function to only emit events complying\n * with the function.\n */\n watch: EvWatch<T>\n /**\n * Fetch (Promise-based) all events (matching the event kind chosen) available\n * in the latest known `finalized` block.\n */\n pull: EvPull<T>\n /**\n * Filter a bunch of `SystemEvent` and return the decoded `payload` of every\n * of them.\n *\n * @param collection Array of `SystemEvent` to filter.\n */\n filter: EvFilter<T>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\ntype SystemEvent = {\n phase: EventPhase\n event: {\n type: string\n value: {\n type: string\n value: any\n }\n }\n topics: Array<any>\n}\n\nexport const createEventEntry = <D, T>(\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): EvClient<any, D, T> => {\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry Event(${pallet}.${name})`)\n\n const shared$ = chainHead.finalized$.pipe(\n withCompatibleRuntime(chainHead, (x) => x.hash),\n map(([block, runtime, ctx]) => {\n const eventsIdx = ctx.lookup.metadata.pallets.find(\n (p) => p.name === pallet,\n )?.events\n if (\n eventsIdx == null ||\n ctx.lookup.metadata.lookup[eventsIdx].def.tag !== \"variant\" ||\n ctx.lookup.metadata.lookup[eventsIdx].def.value.find(\n (ev) => ev.name === name,\n ) == null\n )\n throw new Error(`Runtime entry Event(${pallet}.${name}) not found`)\n\n if (!argsAreCompatible(runtime, ctx, null)) throw compatibilityError()\n return [block, runtime, ctx] as const\n }),\n concatMapEager(([block, runtime, ctx]) =>\n chainHead.eventsAt$(block.hash).pipe(\n map((events) => {\n const winners = events.filter(\n (e) => e.event.type === pallet && e.event.value.type === name,\n )\n return winners.map((x) => {\n if (!valuesAreCompatible(runtime, ctx, x.event.value.value))\n throw compatibilityError()\n return {\n meta: {\n phase: x.phase,\n block,\n },\n payload: x.event.value.value,\n }\n })\n }),\n ),\n ),\n shareLatest,\n )\n\n const watch: EvWatch<T> = (f) =>\n shared$.pipe(mergeMap((x) => (f ? x.filter((d) => f(d.payload)) : x)))\n\n const pull: EvPull<T> = () => firstValueFrom(shared$)\n\n const filter: EvFilter<T> = (events) =>\n events\n .filter((e) => e.type === pallet && e.value.type === name)\n .map((x) => x.value.value)\n\n return { watch, pull, filter, getCompatibilityLevel, isCompatible }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event.mjs","sources":["../../src/event.ts"],"sourcesContent":["import { Observable, firstValueFrom, map, mergeMap } from \"rxjs\"\nimport { BlockInfo, ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\nimport { concatMapEager, shareLatest } from \"./utils\"\n\nexport type EventPhase =\n | { type: \"ApplyExtrinsic\"; value: number }\n | { type: \"Finalization\" }\n | { type: \"Initialization\" }\n\nexport type EvWatch<T> = (filter?: (value: T) => boolean) => Observable<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n}>\n\nexport type EvPull<T> = () => Promise<\n Array<{\n meta: {\n block: BlockInfo\n phase: EventPhase\n }\n payload: T\n }>\n>\n\nexport type EvFilter<T> = (collection: SystemEvent[\"event\"][]) => Array<T>\n\nexport type EvClient<Unsafe, D, T> = {\n /**\n * Multicast and stateful Observable watching for new events (matching the\n * event kind chosen) in the latest known `finalized` block.\n *\n * @param filter Optional filter function to only emit events complying\n * with the function.\n */\n watch: EvWatch<T>\n /**\n * Fetch (Promise-based) all events (matching the event kind chosen) available\n * in the latest known `finalized` block.\n */\n pull: EvPull<T>\n /**\n * Filter a bunch of `SystemEvent` and return the decoded `payload` of every\n * of them.\n *\n * @param collection Array of `SystemEvent` to filter.\n */\n filter: EvFilter<T>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\ntype SystemEvent = {\n phase: EventPhase\n event: {\n type: string\n value: {\n type: string\n value: any\n }\n }\n topics: Array<any>\n}\n\nexport const createEventEntry = <D, T>(\n pallet: string,\n name: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n withCompatibleRuntime,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): EvClient<any, D, T> => {\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry Event(${pallet}.${name})`)\n\n const shared$ = chainHead.finalized$.pipe(\n withCompatibleRuntime(chainHead, (x) => x.hash),\n map(([block, runtime, ctx]) => {\n const eventsIdx = ctx.lookup.metadata.pallets.find(\n (p) => p.name === pallet,\n )?.events\n if (\n eventsIdx == null ||\n ctx.lookup.metadata.lookup[eventsIdx].def.tag !== \"variant\" ||\n ctx.lookup.metadata.lookup[eventsIdx].def.value.find(\n (ev) => ev.name === name,\n ) == null\n )\n throw new Error(`Runtime entry Event(${pallet}.${name}) not found`)\n\n if (!argsAreCompatible(runtime, ctx, null)) throw compatibilityError()\n return [block, runtime, ctx] as const\n }),\n concatMapEager(([block, runtime, ctx]) =>\n chainHead.eventsAt$(block.hash).pipe(\n map((events) => {\n const winners = events.filter(\n (e) => e.event.type === pallet && e.event.value.type === name,\n )\n return winners.map((x) => {\n if (!valuesAreCompatible(runtime, ctx, x.event.value.value))\n throw compatibilityError()\n return {\n meta: {\n phase: x.phase,\n block,\n },\n payload: x.event.value.value,\n }\n })\n }),\n ),\n ),\n shareLatest,\n )\n\n const watch: EvWatch<T> = (f) =>\n shared$.pipe(mergeMap((x) => (f ? x.filter((d) => f(d.payload)) : x)))\n\n const pull: EvPull<T> = () => firstValueFrom(shared$)\n\n const filter: EvFilter<T> = (events) =>\n events\n .filter((e) => e.type === pallet && e.value.type === name)\n .map((x) => x.value.value)\n\n return { watch, pull, filter, getCompatibilityLevel, isCompatible }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from '@polkadot-api/known-chains/paseo_people';
2
+ //# sourceMappingURL=chains_paseo_people.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains_paseo_people.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,7 +1,9 @@
1
+ import '@polkadot-api/observable-client';
1
2
  import './utils/shareLatest.mjs';
2
3
  import { mergeMap, map } from 'rxjs';
3
4
  import { firstValueFromWithSignal } from './utils/firstValueFromWithSignal.mjs';
4
5
  import { isOptionalArg } from './utils/optional-arg.mjs';
6
+ import 'rxjs/operators';
5
7
  import { toHex } from '@polkadot-api/utils';
6
8
 
7
9
  const createRuntimeCallEntry = (api, method, chainHead, {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-call.mjs","sources":["../../src/runtime-call.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg } from \"@/utils\"\nimport { ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { map, mergeMap } from \"rxjs\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\n\ntype CallOptions = Partial<{\n at: string\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = Args[\"length\"] extends 0\n ? [options?: CallOptions]\n : [...args: Args, options?: CallOptions]\n\nexport type RuntimeCall<Unsafe, D, Args extends Array<any>, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the runtime call.\n *\n * @param args All keys needed for that runtime call.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n (...args: WithCallOptions<Args>): Promise<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport const createRuntimeCallEntry = (\n api: string,\n method: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): RuntimeCall<any, any, any, any> => {\n const callName = `${api}_${method}`\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry RuntimeCall(${callName})`)\n\n const fn = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = compatibleRuntime$(chainHead, at).pipe(\n mergeMap(([runtime, ctx]) => {\n let codecs\n try {\n codecs = ctx.dynamicBuilder.buildRuntimeCall(api, method)\n } catch {\n throw new Error(`Runtime entry RuntimeCall(${callName}) not found`)\n }\n if (!argsAreCompatible(runtime, ctx, args)) throw compatibilityError()\n return chainHead.call$(at, callName, toHex(codecs.args.enc(args))).pipe(\n map(codecs.value.dec),\n map((value) => {\n if (!valuesAreCompatible(runtime, ctx, value))\n throw compatibilityError()\n return value\n }),\n )\n }),\n )\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n return Object.assign(fn, { getCompatibilityLevel, isCompatible })\n}\n"],"names":[],"mappings":";;;;;;AA0BO,MAAM,sBAAyB,GAAA,CACpC,GACA,EAAA,MAAA,EACA,SACA,EAAA;AAAA,EACE,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CACoC,KAAA;AACpC,EAAA,MAAM,QAAW,GAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACjC,EAAA,MAAM,qBAAqB,MACzB,IAAI,KAAM,CAAA,CAAA,uCAAA,EAA0C,QAAQ,CAAG,CAAA,CAAA,CAAA;AAEjE,EAAM,MAAA,EAAA,GAAK,IAAI,IAAqB,KAAA;AAClC,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA;AAElB,IAAA,MAAM,OAAU,GAAA,kBAAA,CAAmB,SAAW,EAAA,EAAE,CAAE,CAAA,IAAA;AAAA,MAChD,QAAS,CAAA,CAAC,CAAC,OAAA,EAAS,GAAG,CAAM,KAAA;AAC3B,QAAI,IAAA,MAAA;AACJ,QAAI,IAAA;AACF,UAAA,MAAA,GAAS,GAAI,CAAA,cAAA,CAAe,gBAAiB,CAAA,GAAA,EAAK,MAAM,CAAA;AAAA,SAClD,CAAA,MAAA;AACN,UAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,QAAQ,CAAa,WAAA,CAAA,CAAA;AAAA;AAEpE,QAAA,IAAI,CAAC,iBAAkB,CAAA,OAAA,EAAS,KAAK,IAAI,CAAA,QAAS,kBAAmB,EAAA;AACrE,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,EAAA,EAAI,QAAU,EAAA,KAAA,CAAM,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAC,CAAE,CAAA,IAAA;AAAA,UACjE,GAAA,CAAI,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,UACpB,GAAA,CAAI,CAAC,KAAU,KAAA;AACb,YAAA,IAAI,CAAC,mBAAA,CAAoB,OAAS,EAAA,GAAA,EAAK,KAAK,CAAA;AAC1C,cAAA,MAAM,kBAAmB,EAAA;AAC3B,YAAO,OAAA,KAAA;AAAA,WACR;AAAA,SACH;AAAA,OACD;AAAA,KACH;AAEA,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA;AAAA,GACjD;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,qBAAA,EAAuB,cAAc,CAAA;AAClE;;;;"}
1
+ {"version":3,"file":"runtime-call.mjs","sources":["../../src/runtime-call.ts"],"sourcesContent":["import { firstValueFromWithSignal, isOptionalArg } from \"@/utils\"\nimport { ChainHead$ } from \"@polkadot-api/observable-client\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { map, mergeMap } from \"rxjs\"\nimport { CompatibilityFunctions, CompatibilityHelper } from \"./compatibility\"\n\ntype CallOptions = Partial<{\n at: string\n signal: AbortSignal\n}>\n\ntype WithCallOptions<Args extends Array<any>> = Args[\"length\"] extends 0\n ? [options?: CallOptions]\n : [...args: Args, options?: CallOptions]\n\nexport type RuntimeCall<Unsafe, D, Args extends Array<any>, Payload> = {\n /**\n * Get `Payload` (Promise-based) for the runtime call.\n *\n * @param args All keys needed for that runtime call.\n * At the end, optionally set which block to target (latest\n * known finalized is the default) and an AbortSignal.\n */\n (...args: WithCallOptions<Args>): Promise<Payload>\n} & (Unsafe extends true ? {} : CompatibilityFunctions<D>)\n\nexport const createRuntimeCallEntry = (\n api: string,\n method: string,\n chainHead: ChainHead$,\n {\n isCompatible,\n getCompatibilityLevel,\n compatibleRuntime$,\n argsAreCompatible,\n valuesAreCompatible,\n }: CompatibilityHelper,\n): RuntimeCall<any, any, any, any> => {\n const callName = `${api}_${method}`\n const compatibilityError = () =>\n new Error(`Incompatible runtime entry RuntimeCall(${callName})`)\n\n const fn = (...args: Array<any>) => {\n const lastArg = args[args.length - 1]\n const isLastArgOptional = isOptionalArg(lastArg)\n const { signal, at: _at }: CallOptions = isLastArgOptional ? lastArg : {}\n const at = _at ?? null\n\n const result$ = compatibleRuntime$(chainHead, at).pipe(\n mergeMap(([runtime, ctx]) => {\n let codecs\n try {\n codecs = ctx.dynamicBuilder.buildRuntimeCall(api, method)\n } catch {\n throw new Error(`Runtime entry RuntimeCall(${callName}) not found`)\n }\n if (!argsAreCompatible(runtime, ctx, args)) throw compatibilityError()\n return chainHead.call$(at, callName, toHex(codecs.args.enc(args))).pipe(\n map(codecs.value.dec),\n map((value) => {\n if (!valuesAreCompatible(runtime, ctx, value))\n throw compatibilityError()\n return value\n }),\n )\n }),\n )\n\n return firstValueFromWithSignal(result$, signal)\n }\n\n return Object.assign(fn, { getCompatibilityLevel, isCompatible })\n}\n"],"names":[],"mappings":";;;;;;;;AA0BO,MAAM,sBAAyB,GAAA,CACpC,GACA,EAAA,MAAA,EACA,SACA,EAAA;AAAA,EACE,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CACoC,KAAA;AACpC,EAAA,MAAM,QAAW,GAAA,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACjC,EAAA,MAAM,qBAAqB,MACzB,IAAI,KAAM,CAAA,CAAA,uCAAA,EAA0C,QAAQ,CAAG,CAAA,CAAA,CAAA;AAEjE,EAAM,MAAA,EAAA,GAAK,IAAI,IAAqB,KAAA;AAClC,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CAAC,CAAA;AACpC,IAAM,MAAA,iBAAA,GAAoB,cAAc,OAAO,CAAA;AAC/C,IAAA,MAAM,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAqB,GAAA,iBAAA,GAAoB,UAAU,EAAC;AACxE,IAAA,MAAM,KAAK,GAAO,IAAA,IAAA;AAElB,IAAA,MAAM,OAAU,GAAA,kBAAA,CAAmB,SAAW,EAAA,EAAE,CAAE,CAAA,IAAA;AAAA,MAChD,QAAS,CAAA,CAAC,CAAC,OAAA,EAAS,GAAG,CAAM,KAAA;AAC3B,QAAI,IAAA,MAAA;AACJ,QAAI,IAAA;AACF,UAAA,MAAA,GAAS,GAAI,CAAA,cAAA,CAAe,gBAAiB,CAAA,GAAA,EAAK,MAAM,CAAA;AAAA,SAClD,CAAA,MAAA;AACN,UAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,QAAQ,CAAa,WAAA,CAAA,CAAA;AAAA;AAEpE,QAAA,IAAI,CAAC,iBAAkB,CAAA,OAAA,EAAS,KAAK,IAAI,CAAA,QAAS,kBAAmB,EAAA;AACrE,QAAO,OAAA,SAAA,CAAU,KAAM,CAAA,EAAA,EAAI,QAAU,EAAA,KAAA,CAAM,MAAO,CAAA,IAAA,CAAK,GAAI,CAAA,IAAI,CAAC,CAAC,CAAE,CAAA,IAAA;AAAA,UACjE,GAAA,CAAI,MAAO,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,UACpB,GAAA,CAAI,CAAC,KAAU,KAAA;AACb,YAAA,IAAI,CAAC,mBAAA,CAAoB,OAAS,EAAA,GAAA,EAAK,KAAK,CAAA;AAC1C,cAAA,MAAM,kBAAmB,EAAA;AAC3B,YAAO,OAAA,KAAA;AAAA,WACR;AAAA,SACH;AAAA,OACD;AAAA,KACH;AAEA,IAAO,OAAA,wBAAA,CAAyB,SAAS,MAAM,CAAA;AAAA,GACjD;AAEA,EAAA,OAAO,OAAO,MAAO,CAAA,EAAA,EAAI,EAAE,qBAAA,EAAuB,cAAc,CAAA;AAClE;;;;"}
@@ -1,18 +1,19 @@
1
+ import { NotBestBlockError } from '@polkadot-api/observable-client';
1
2
  import './utils/shareLatest.mjs';
2
- import { filter, take, map, identity, shareReplay, pipe, withLatestFrom, distinctUntilChanged, debounceTime } from 'rxjs';
3
+ import { map, filter, take, identity, shareReplay, pipe, withLatestFrom, distinctUntilChanged, from, mergeMap } from 'rxjs';
3
4
  import { firstValueFromWithSignal } from './utils/firstValueFromWithSignal.mjs';
4
- import { raceMap } from './utils/raceMap.mjs';
5
+ import { lossLessExhaustMap } from './utils/lossLessExhaustMap.mjs';
5
6
  import { isOptionalArg } from './utils/optional-arg.mjs';
6
- import { NotBestBlockError } from '@polkadot-api/observable-client';
7
+ import 'rxjs/operators';
7
8
  import { minCompatLevel } from './compatibility.mjs';
8
9
  import { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
9
10
 
10
- const createStorageEntry = (pallet, name, chainHead, {
11
+ const toMapped = map((x) => x.mapped);
12
+ const createStorageEntry = (pallet, name, chainHead, getWatchEntries, {
11
13
  isCompatible,
12
14
  getCompatibilityLevel,
13
15
  getCompatibilityLevels,
14
- waitDescriptors,
15
- withCompatibleRuntime,
16
+ descriptors: descriptorsPromise,
16
17
  argsAreCompatible,
17
18
  valuesAreCompatible
18
19
  }) => {
@@ -21,7 +22,7 @@ const createStorageEntry = (pallet, name, chainHead, {
21
22
  filter(Boolean),
22
23
  take(1),
23
24
  map(
24
- ({ dynamicBuilder }) => typeof dynamicBuilder.buildStorage("System", "Number").dec(new Uint8Array(32)) === "bigint" ? BigInt : identity
25
+ ({ dynamicBuilder }) => typeof dynamicBuilder.buildStorage("System", "Number").value.dec(new Uint8Array(32)) === "bigint" ? BigInt : identity
25
26
  ),
26
27
  shareReplay()
27
28
  );
@@ -34,48 +35,29 @@ const createStorageEntry = (pallet, name, chainHead, {
34
35
  const getCodec = (ctx) => {
35
36
  try {
36
37
  return ctx.dynamicBuilder.buildStorage(pallet, name);
37
- } catch {
38
+ } catch (e) {
38
39
  throw new Error(`Runtime entry Storage(${pallet}.${name}) not found`);
39
40
  }
40
41
  };
41
42
  const watchValue = (...args) => {
42
43
  const target = args[args.length - 1];
43
- const actualArgs = target === "best" || target === "finalized" ? args.slice(0, -1) : args;
44
- if (isSystemNumber)
45
- return chainHead.bestBlocks$.pipe(
46
- map((blocks) => blocks.at(target === "best" ? 0 : -1).number),
47
- distinctUntilChanged(),
48
- bigIntOrNumber
49
- );
50
- return chainHead[target === "best" ? "best$" : "finalized$"].pipe(
51
- debounceTime(0),
52
- withCompatibleRuntime(chainHead, (x) => x.hash),
53
- raceMap(([block, runtime, ctx]) => {
54
- const codecs = getCodec(ctx);
55
- if (!argsAreCompatible(runtime, ctx, actualArgs))
56
- throw incompatibleError();
57
- return chainHead.storage$(block.hash, "value", () => codecs.enc(...actualArgs)).pipe(
58
- map((val) => {
59
- if (!valuesAreCompatible(runtime, ctx, val))
60
- throw incompatibleError();
61
- return { val, codecs };
62
- })
63
- );
64
- }, 4),
65
- distinctUntilChanged((a, b) => a.val === b.val),
66
- map(
67
- ({ val, codecs }) => val === null ? codecs.fallback : codecs.dec(val)
68
- )
44
+ const isBest = target === "best";
45
+ const actualArgs = isBest || target === "finalized" ? args.slice(0, -1) : args;
46
+ return chainHead[isBest ? "best$" : "finalized$"].pipe(
47
+ lossLessExhaustMap(
48
+ () => getRawValue$(...actualArgs, isBest ? { at: "best" } : {})
49
+ ),
50
+ distinctUntilChanged((a, b) => a.raw === b.raw),
51
+ toMapped
69
52
  );
70
53
  };
71
- const getValue = async (...args) => {
54
+ const getRawValue$ = (...args) => {
72
55
  const lastArg = args[args.length - 1];
73
56
  const isLastArgOptional = isOptionalArg(lastArg);
74
- const { signal, at: _at } = isLastArgOptional ? lastArg : {};
57
+ const { at: _at } = isLastArgOptional ? lastArg : {};
75
58
  const at = _at ?? null;
76
- let result$;
77
- if (isSystemNumber) {
78
- result$ = chainHead.bestBlocks$.pipe(
59
+ if (isSystemNumber)
60
+ return chainHead.bestBlocks$.pipe(
79
61
  map((blocks) => {
80
62
  if (at === "finalized" || !at) return blocks.at(-1);
81
63
  if (at === "best") return blocks.at(0);
@@ -86,39 +68,50 @@ const createStorageEntry = (pallet, name, chainHead, {
86
68
  return block.number;
87
69
  }),
88
70
  distinctUntilChanged(),
89
- bigIntOrNumber
90
- );
91
- } else {
92
- const descriptors = await waitDescriptors();
93
- result$ = chainHead.storage$(
94
- at,
95
- "value",
96
- (ctx) => {
97
- const codecs = getCodec(ctx);
98
- const actualArgs = args.length === codecs.len ? args : args.slice(0, -1);
99
- if (args !== actualArgs && !isLastArgOptional) throw invalidArgs(args);
100
- if (!argsAreCompatible(descriptors, ctx, actualArgs))
101
- throw incompatibleError();
102
- return codecs.enc(...actualArgs);
103
- },
104
- null,
105
- (data, ctx) => {
106
- const codecs = getCodec(ctx);
107
- const value = data === null ? codecs.fallback : codecs.dec(data);
108
- if (!valuesAreCompatible(descriptors, ctx, value))
109
- throw incompatibleError();
110
- return value;
111
- }
71
+ bigIntOrNumber,
72
+ map((mapped) => ({ raw: "", mapped }))
112
73
  );
113
- }
114
- return firstValueFromWithSignal(result$, signal);
74
+ return from(descriptorsPromise).pipe(
75
+ mergeMap(
76
+ (descriptors) => chainHead.storage$(
77
+ at,
78
+ "value",
79
+ (ctx) => {
80
+ const codecs = getCodec(ctx);
81
+ const actualArgs = args.length === codecs.len ? args : args.slice(0, -1);
82
+ if (args !== actualArgs && !isLastArgOptional)
83
+ throw invalidArgs(args);
84
+ if (!argsAreCompatible(descriptors, ctx, actualArgs))
85
+ throw incompatibleError();
86
+ return codecs.keys.enc(...actualArgs);
87
+ },
88
+ null,
89
+ (data, ctx) => {
90
+ const codecs = getCodec(ctx);
91
+ const value = data === null ? codecs.fallback : codecs.value.dec(data);
92
+ if (!valuesAreCompatible(descriptors, ctx, value))
93
+ throw incompatibleError();
94
+ return value;
95
+ }
96
+ )
97
+ )
98
+ );
99
+ };
100
+ const getValue = async (...args) => {
101
+ const lastArg = args[args.length - 1];
102
+ const isLastArgOptional = isOptionalArg(lastArg);
103
+ const { signal } = isLastArgOptional ? lastArg : {};
104
+ return firstValueFromWithSignal(
105
+ getRawValue$(...args).pipe(toMapped),
106
+ signal
107
+ );
115
108
  };
116
109
  const getEntries = async (...args) => {
117
110
  const lastArg = args[args.length - 1];
118
111
  const isLastArgOptional = isOptionalArg(lastArg);
119
112
  const { signal, at: _at } = isLastArgOptional ? lastArg : {};
120
113
  const at = _at ?? null;
121
- const descriptors = await waitDescriptors();
114
+ const descriptors = await descriptorsPromise;
122
115
  const result$ = chainHead.storage$(
123
116
  at,
124
117
  "descendantsValues",
@@ -130,14 +123,14 @@ const createStorageEntry = (pallet, name, chainHead, {
130
123
  const actualArgs = args.length > 0 && isLastArgOptional ? args.slice(0, -1) : args;
131
124
  if (args.length === codecs.len && actualArgs === args)
132
125
  throw invalidArgs(args);
133
- return codecs.enc(...actualArgs);
126
+ return codecs.keys.enc(...actualArgs);
134
127
  },
135
128
  null,
136
129
  (values, ctx) => {
137
130
  const codecs = getCodec(ctx);
138
131
  const decodedValues = values.map(({ key, value }) => ({
139
- keyArgs: codecs.keyDecoder(key),
140
- value: codecs.dec(value)
132
+ keyArgs: codecs.keys.dec(key),
133
+ value: codecs.value.dec(value)
141
134
  }));
142
135
  if (decodedValues.some(
143
136
  ({ value }) => !valuesAreCompatible(descriptors, ctx, value)
@@ -145,19 +138,30 @@ const createStorageEntry = (pallet, name, chainHead, {
145
138
  throw incompatibleError();
146
139
  return decodedValues;
147
140
  }
148
- );
141
+ ).pipe(toMapped);
149
142
  return firstValueFromWithSignal(result$, signal);
150
143
  };
151
144
  const getValues = (keyArgs, options) => Promise.all(
152
145
  keyArgs.map((args) => getValue(...options ? [...args, options] : args))
153
146
  );
147
+ const watchEntries = (...args) => {
148
+ const lastArg = args.at(-1);
149
+ const isLastArgOptional = isOptionalArg(lastArg);
150
+ return getWatchEntries(
151
+ pallet,
152
+ name,
153
+ isLastArgOptional ? args.slice(0, -1) : args,
154
+ isLastArgOptional && lastArg.at === "best"
155
+ );
156
+ };
154
157
  return {
155
158
  isCompatible,
156
159
  getCompatibilityLevel,
157
160
  getValue,
158
161
  getValues,
159
162
  getEntries,
160
- watchValue
163
+ watchValue,
164
+ watchEntries
161
165
  };
162
166
  };
163
167