@polkadot-api/cli 0.4.1 → 0.5.1
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/dist/{chunk-HVD7FFD3.js → chunk-CAC7BHES.js} +102 -122
- package/dist/chunk-CAC7BHES.js.map +1 -0
- package/dist/index.d.ts +2 -8
- package/dist/index.js +1 -1
- package/dist/main.js +1 -1
- package/dist/metadataWorker.d.ts +389 -0
- package/dist/metadataWorker.js +39 -0
- package/dist/metadataWorker.js.map +1 -0
- package/package.json +14 -13
- package/dist/chunk-HVD7FFD3.js.map +0 -1
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
// src/cli.ts
|
|
2
2
|
import { Option, program } from "@commander-js/extra-typings";
|
|
3
|
-
|
|
4
|
-
// src/well-known-chains.ts
|
|
5
|
-
var WellKnownChain = /* @__PURE__ */ ((WellKnownChain2) => {
|
|
6
|
-
WellKnownChain2["polkadot"] = "polkadot";
|
|
7
|
-
WellKnownChain2["ksmcc3"] = "ksmcc3";
|
|
8
|
-
WellKnownChain2["rococo_v2_2"] = "rococo_v2_2";
|
|
9
|
-
WellKnownChain2["westend2"] = "westend2";
|
|
10
|
-
return WellKnownChain2;
|
|
11
|
-
})(WellKnownChain || {});
|
|
12
|
-
|
|
13
|
-
// src/cli.ts
|
|
3
|
+
import * as knownChains from "@polkadot-api/known-chains";
|
|
14
4
|
function getCli({ add: add2, generate: generate2, remove: remove2, update: update2 }) {
|
|
15
5
|
program.name("polkadot-api").description("Polkadot API CLI");
|
|
16
6
|
const config = new Option("--config <filename>", "Source for the config file");
|
|
@@ -22,9 +12,9 @@ function getCli({ add: add2, generate: generate2, remove: remove2, update: updat
|
|
|
22
12
|
).action(generate2);
|
|
23
13
|
program.command("add").description("Add a new chain spec to the list").argument("<key>", "Key identifier for the chain spec").addOption(config).option("-f, --file <filename>", "Source from metadata encoded file").option("-w, --wsUrl <URL>", "Source from websocket url").option("-c, --chainSpec <filename>", "Source from chain spec file").addOption(
|
|
24
14
|
new Option("-n, --name <name>", "Source from a well-known chain").choices(
|
|
25
|
-
Object.keys(
|
|
15
|
+
Object.keys(knownChains)
|
|
26
16
|
)
|
|
27
|
-
).option("--no-persist", "Do not persist the metadata as a file").action(add2);
|
|
17
|
+
).option("--wasm <filename>", "Source from runtime wasm file").option("--no-persist", "Do not persist the metadata as a file").action(add2);
|
|
28
18
|
program.command("update").description("Update the metadata files and generate descriptor files").argument(
|
|
29
19
|
"[keys]",
|
|
30
20
|
"Keys of the metadata files to update, separated by commas. Leave empty for all"
|
|
@@ -38,75 +28,28 @@ import { createClient } from "@polkadot-api/substrate-client";
|
|
|
38
28
|
import * as fs from "node:fs/promises";
|
|
39
29
|
import { metadata, v15 } from "@polkadot-api/substrate-bindings";
|
|
40
30
|
import { WebSocketProvider } from "@polkadot-api/ws-provider/node";
|
|
41
|
-
|
|
42
|
-
// src/smolldot-worker.ts
|
|
43
|
-
var PROVIDER_WORKER_CODE = `
|
|
44
|
-
const { start } = require("@polkadot-api/smoldot")
|
|
45
|
-
const { parentPort, workerData } = require("node:worker_threads")
|
|
46
|
-
const { getSmProvider } = require("@polkadot-api/sm-provider")
|
|
47
|
-
|
|
48
|
-
if (!parentPort) throw new Error("no parent port")
|
|
49
|
-
|
|
50
|
-
const WELL_KNOWN_CHAINS_LIB = "@polkadot-api/known-chains/"
|
|
51
|
-
const wellKnownChains = new Set([
|
|
52
|
-
"polkadot",
|
|
53
|
-
"ksmcc3",
|
|
54
|
-
"rococo_v2_2",
|
|
55
|
-
"westend2",
|
|
56
|
-
])
|
|
57
|
-
|
|
58
|
-
const smoldot = start()
|
|
59
|
-
|
|
60
|
-
const getProvider = (chainSpec) => {
|
|
61
|
-
const { relay_chain } = JSON.parse(chainSpec)
|
|
62
|
-
|
|
63
|
-
if (!relay_chain)
|
|
64
|
-
return getSmProvider(
|
|
65
|
-
smoldot.addChain({
|
|
66
|
-
chainSpec,
|
|
67
|
-
}),
|
|
68
|
-
)
|
|
69
|
-
|
|
70
|
-
if (!wellKnownChains.has(relay_chain))
|
|
71
|
-
throw new Error("Relay chain " + relay_chain + " is not well-known")
|
|
72
|
-
|
|
73
|
-
const relayP = smoldot.addChain({
|
|
74
|
-
chainSpec: require(WELL_KNOWN_CHAINS_LIB + relay_chain).chainSpec,
|
|
75
|
-
disableJsonRpc: true,
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
return getSmProvider(
|
|
79
|
-
relayP.then((relay) =>
|
|
80
|
-
smoldot.addChain({
|
|
81
|
-
potentialRelayChains: [relay],
|
|
82
|
-
chainSpec,
|
|
83
|
-
}),
|
|
84
|
-
),
|
|
85
|
-
)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const provider = getProvider(
|
|
89
|
-
wellKnownChains.has(workerData)
|
|
90
|
-
? require(WELL_KNOWN_CHAINS_LIB + workerData).chainSpec
|
|
91
|
-
: workerData,
|
|
92
|
-
)((msg) => parentPort.postMessage(msg))
|
|
93
|
-
|
|
94
|
-
parentPort.on("message", (msg) => {
|
|
95
|
-
switch (msg.type) {
|
|
96
|
-
case "send":
|
|
97
|
-
provider.send(msg.value)
|
|
98
|
-
break
|
|
99
|
-
case "disconnect":
|
|
100
|
-
provider.disconnect()
|
|
101
|
-
}
|
|
102
|
-
})
|
|
103
|
-
`;
|
|
104
|
-
|
|
105
|
-
// src/metadata.ts
|
|
106
31
|
import { Worker } from "node:worker_threads";
|
|
107
32
|
import { getObservableClient } from "@polkadot-api/observable-client";
|
|
108
33
|
import { filter, firstValueFrom } from "rxjs";
|
|
109
34
|
import { dirname } from "path";
|
|
35
|
+
import { fileURLToPath } from "url";
|
|
36
|
+
import * as knownChains2 from "@polkadot-api/known-chains";
|
|
37
|
+
var workerPath = fileURLToPath(import.meta.resolve("./metadataWorker.js"));
|
|
38
|
+
var metadataWorker;
|
|
39
|
+
var workerRefCount = 0;
|
|
40
|
+
async function getMetadataWorker() {
|
|
41
|
+
if (!metadataWorker) {
|
|
42
|
+
metadataWorker = new Worker(workerPath, {
|
|
43
|
+
stdout: true,
|
|
44
|
+
stderr: true
|
|
45
|
+
});
|
|
46
|
+
await new Promise((resolve) => {
|
|
47
|
+
metadataWorker?.once("message", resolve);
|
|
48
|
+
metadataWorker?.postMessage("ready");
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return metadataWorker;
|
|
52
|
+
}
|
|
110
53
|
var getMetadataCall = async (provider) => {
|
|
111
54
|
const client = getObservableClient(createClient(provider));
|
|
112
55
|
const { runtime$, unfollow } = client.chainHead$();
|
|
@@ -115,28 +58,50 @@ var getMetadataCall = async (provider) => {
|
|
|
115
58
|
client.destroy();
|
|
116
59
|
return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw };
|
|
117
60
|
};
|
|
118
|
-
var
|
|
119
|
-
|
|
120
|
-
let worker = new Worker(PROVIDER_WORKER_CODE, {
|
|
121
|
-
eval: true,
|
|
122
|
-
workerData: chain,
|
|
123
|
-
stderr: true,
|
|
124
|
-
stdout: true
|
|
125
|
-
});
|
|
126
|
-
worker.on("message", onMsg);
|
|
61
|
+
var getWorkerMessage = (chain) => {
|
|
62
|
+
if (!(chain in knownChains2)) {
|
|
127
63
|
return {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (!worker)
|
|
131
|
-
return;
|
|
132
|
-
worker.postMessage({ type: "disconnect" });
|
|
133
|
-
worker.removeAllListeners();
|
|
134
|
-
worker.terminate();
|
|
135
|
-
worker = null;
|
|
136
|
-
}
|
|
64
|
+
potentialRelayChainSpecs: [],
|
|
65
|
+
chainSpec: chain
|
|
137
66
|
};
|
|
67
|
+
}
|
|
68
|
+
const relayChainName = Object.keys(knownChains2).find(
|
|
69
|
+
(c) => c !== chain && chain.startsWith(c)
|
|
70
|
+
);
|
|
71
|
+
const potentialRelayChainSpecs = relayChainName ? [knownChains2[relayChainName]] : [];
|
|
72
|
+
const chainSpec = knownChains2[chain];
|
|
73
|
+
return {
|
|
74
|
+
potentialRelayChainSpecs,
|
|
75
|
+
chainSpec
|
|
138
76
|
};
|
|
139
|
-
|
|
77
|
+
};
|
|
78
|
+
var id = 0;
|
|
79
|
+
var getMetadataFromSmoldot = async (chain) => {
|
|
80
|
+
workerRefCount++;
|
|
81
|
+
try {
|
|
82
|
+
const reqId = id++;
|
|
83
|
+
const metadataWorker2 = await getMetadataWorker();
|
|
84
|
+
const message = {
|
|
85
|
+
...getWorkerMessage(chain),
|
|
86
|
+
id: reqId
|
|
87
|
+
};
|
|
88
|
+
const metadata2 = await new Promise((resolve) => {
|
|
89
|
+
const listener = (data) => {
|
|
90
|
+
if (data.id !== reqId) return;
|
|
91
|
+
metadataWorker2.off("message", listener);
|
|
92
|
+
resolve(data.metadata);
|
|
93
|
+
};
|
|
94
|
+
metadataWorker2.on("message", listener);
|
|
95
|
+
metadataWorker2.postMessage(message);
|
|
96
|
+
});
|
|
97
|
+
return metadata2;
|
|
98
|
+
} finally {
|
|
99
|
+
workerRefCount--;
|
|
100
|
+
if (workerRefCount === 0) {
|
|
101
|
+
metadataWorker?.terminate();
|
|
102
|
+
metadataWorker = null;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
140
105
|
};
|
|
141
106
|
var getMetadataFromWsURL = async (wsURL) => getMetadataCall(WebSocketProvider(wsURL));
|
|
142
107
|
async function getMetadata(entry) {
|
|
@@ -155,11 +120,11 @@ async function getMetadata(entry) {
|
|
|
155
120
|
};
|
|
156
121
|
}
|
|
157
122
|
if ("chain" in entry) {
|
|
158
|
-
return
|
|
123
|
+
return getMetadataFromSmoldot(entry.chain);
|
|
159
124
|
}
|
|
160
125
|
if ("chainSpec" in entry) {
|
|
161
126
|
const chainSpec = await fs.readFile(entry.chainSpec, "utf8");
|
|
162
|
-
return
|
|
127
|
+
return getMetadataFromSmoldot(chainSpec);
|
|
163
128
|
}
|
|
164
129
|
if ("wsUrl" in entry) {
|
|
165
130
|
return getMetadataFromWsURL(entry.wsUrl);
|
|
@@ -179,19 +144,15 @@ import { readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises
|
|
|
179
144
|
var papiCfgDefaultFile = "polkadot-api.json";
|
|
180
145
|
var packageJsonKey = "polkadot-api";
|
|
181
146
|
async function readPapiConfig(configFile) {
|
|
182
|
-
if (configFile)
|
|
183
|
-
return readFromFile(configFile);
|
|
147
|
+
if (configFile) return readFromFile(configFile);
|
|
184
148
|
const configFromDefaultFile = await readFromFile(papiCfgDefaultFile);
|
|
185
|
-
if (configFromDefaultFile)
|
|
186
|
-
return configFromDefaultFile;
|
|
149
|
+
if (configFromDefaultFile) return configFromDefaultFile;
|
|
187
150
|
return readFromFile("package.json");
|
|
188
151
|
}
|
|
189
152
|
async function writePapiConfig(configFile, config) {
|
|
190
|
-
if (configFile)
|
|
191
|
-
return writeToFile(configFile, config);
|
|
153
|
+
if (configFile) return writeToFile(configFile, config);
|
|
192
154
|
const defaultCfgExists = await fsExists(papiCfgDefaultFile);
|
|
193
|
-
if (defaultCfgExists)
|
|
194
|
-
return writeToFile(papiCfgDefaultFile, config);
|
|
155
|
+
if (defaultCfgExists) return writeToFile(papiCfgDefaultFile, config);
|
|
195
156
|
const packageCfg = await readFromFile("package.json");
|
|
196
157
|
if (packageCfg) {
|
|
197
158
|
return writeToFile("package.json", config);
|
|
@@ -200,8 +161,7 @@ async function writePapiConfig(configFile, config) {
|
|
|
200
161
|
}
|
|
201
162
|
async function readFromFile(file) {
|
|
202
163
|
const fileExists = await fsExists(file);
|
|
203
|
-
if (!fileExists)
|
|
204
|
-
return null;
|
|
164
|
+
if (!fileExists) return null;
|
|
205
165
|
if (file === "package.json") {
|
|
206
166
|
const packageJson = await readPackage();
|
|
207
167
|
return packageJson[packageJsonKey] ?? null;
|
|
@@ -221,6 +181,10 @@ async function writeToFile(file, config) {
|
|
|
221
181
|
}
|
|
222
182
|
|
|
223
183
|
// src/commands/add.ts
|
|
184
|
+
import { compactNumber } from "@polkadot-api/substrate-bindings";
|
|
185
|
+
import { fromHex } from "@polkadot-api/utils";
|
|
186
|
+
import { getMetadataFromRuntime } from "@polkadot-api/wasm-executor";
|
|
187
|
+
import * as fs2 from "node:fs/promises";
|
|
224
188
|
import ora from "ora";
|
|
225
189
|
async function add(key, options) {
|
|
226
190
|
const entries = await readPapiConfig(options.config) ?? {};
|
|
@@ -231,6 +195,22 @@ async function add(key, options) {
|
|
|
231
195
|
entries[key] = {
|
|
232
196
|
metadata: options.file
|
|
233
197
|
};
|
|
198
|
+
} else if (options.wasm) {
|
|
199
|
+
const spinner = ora(`Loading metadata from runtime`).start();
|
|
200
|
+
const metadataHex = (await fs2.readFile(options.wasm)).toString("hex");
|
|
201
|
+
const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`));
|
|
202
|
+
const metadataLen = compactNumber.dec(opaqueMeta);
|
|
203
|
+
const compactLen = compactNumber.enc(metadataLen).length;
|
|
204
|
+
if (opaqueMeta.length - compactLen !== metadataLen)
|
|
205
|
+
throw new Error("Not able to retrieve runtime metadata");
|
|
206
|
+
spinner.text = "Writing metadata";
|
|
207
|
+
const metadataRaw = opaqueMeta.slice(compactLen);
|
|
208
|
+
const filename = `${key}.scale`;
|
|
209
|
+
await writeMetadataToDisk(metadataRaw, filename);
|
|
210
|
+
spinner.succeed(`Metadata saved as ${filename}`);
|
|
211
|
+
entries[key] = {
|
|
212
|
+
metadata: filename
|
|
213
|
+
};
|
|
234
214
|
} else {
|
|
235
215
|
const entry = entryFromOptions(options);
|
|
236
216
|
entries[key] = entry;
|
|
@@ -270,7 +250,7 @@ var entryFromOptions = (options) => {
|
|
|
270
250
|
|
|
271
251
|
// src/commands/generate.ts
|
|
272
252
|
import { generateMultipleDescriptors } from "@polkadot-api/codegen";
|
|
273
|
-
import
|
|
253
|
+
import fs3, { mkdtemp, rm } from "fs/promises";
|
|
274
254
|
import path, { join } from "path";
|
|
275
255
|
import process from "process";
|
|
276
256
|
import tsc from "tsc-prog";
|
|
@@ -299,8 +279,8 @@ async function generate(opts) {
|
|
|
299
279
|
);
|
|
300
280
|
const clientPath = opts.clientLibrary ?? "polkadot-api";
|
|
301
281
|
if (existsSync(descriptorsDir))
|
|
302
|
-
await
|
|
303
|
-
await
|
|
282
|
+
await fs3.rm(descriptorsDir, { recursive: true });
|
|
283
|
+
await fs3.mkdir(descriptorsDir, { recursive: true });
|
|
304
284
|
await generatePackageJson(join(descriptorsDir, "package.json"));
|
|
305
285
|
const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null;
|
|
306
286
|
await outputCodegen(
|
|
@@ -310,7 +290,7 @@ async function generate(opts) {
|
|
|
310
290
|
whitelist
|
|
311
291
|
);
|
|
312
292
|
await compileCodegen(descriptorsDir);
|
|
313
|
-
await
|
|
293
|
+
await fs3.rm(join(descriptorsDir, "src"), { recursive: true });
|
|
314
294
|
}
|
|
315
295
|
async function getSources(opts) {
|
|
316
296
|
const config = await readPapiConfig(opts.config);
|
|
@@ -346,22 +326,22 @@ async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
|
|
|
346
326
|
whitelist: whitelist ?? void 0
|
|
347
327
|
}
|
|
348
328
|
);
|
|
349
|
-
await
|
|
350
|
-
await
|
|
329
|
+
await fs3.mkdir(outputFolder, { recursive: true });
|
|
330
|
+
await fs3.writeFile(
|
|
351
331
|
path.join(outputFolder, "checksums.json"),
|
|
352
332
|
JSON.stringify(checksums)
|
|
353
333
|
);
|
|
354
|
-
await
|
|
334
|
+
await fs3.writeFile(
|
|
355
335
|
path.join(outputFolder, "descriptors.ts"),
|
|
356
336
|
descriptorsFileContent
|
|
357
337
|
);
|
|
358
|
-
await
|
|
338
|
+
await fs3.writeFile(
|
|
359
339
|
path.join(outputFolder, "common-types.ts"),
|
|
360
340
|
typesFileContent
|
|
361
341
|
);
|
|
362
342
|
await Promise.all(
|
|
363
343
|
chains.map(
|
|
364
|
-
(chain, i) =>
|
|
344
|
+
(chain, i) => fs3.writeFile(
|
|
365
345
|
join(outputFolder, `${chain.key}.ts`),
|
|
366
346
|
descriptorTypesFileContent[i]
|
|
367
347
|
)
|
|
@@ -377,7 +357,7 @@ async function compileCodegen(packageDir) {
|
|
|
377
357
|
const srcDir = join(packageDir, "src");
|
|
378
358
|
const outDir = join(packageDir, "dist");
|
|
379
359
|
if (await fsExists2(outDir)) {
|
|
380
|
-
await
|
|
360
|
+
await fs3.rm(outDir, { recursive: true });
|
|
381
361
|
}
|
|
382
362
|
await tsup.build({
|
|
383
363
|
format: ["cjs", "esm"],
|
|
@@ -412,10 +392,10 @@ var generateIndex = async (path2, keys, publicTypes) => {
|
|
|
412
392
|
publicTypes.join(", "),
|
|
413
393
|
`} from './common-types';`
|
|
414
394
|
].join("\n");
|
|
415
|
-
await
|
|
395
|
+
await fs3.writeFile(join(path2, "index.ts"), indexTs);
|
|
416
396
|
};
|
|
417
397
|
var generatePackageJson = async (path2) => {
|
|
418
|
-
await
|
|
398
|
+
await fs3.writeFile(
|
|
419
399
|
path2,
|
|
420
400
|
`{
|
|
421
401
|
"name": "@polkadot-api/descriptors",
|
|
@@ -518,4 +498,4 @@ export {
|
|
|
518
498
|
remove,
|
|
519
499
|
update
|
|
520
500
|
};
|
|
521
|
-
//# sourceMappingURL=chunk-
|
|
501
|
+
//# sourceMappingURL=chunk-CAC7BHES.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/metadata.ts","../src/papiConfig.ts","../src/commands/add.ts","../src/commands/generate.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, remove, update } from \"./commands\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n}\n\nexport function getCli({ add, generate, remove, update }: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\")\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .option(\"-k, --key <key>\", \"Key of the descriptor to generate\")\n .option(\n \"--whitelist <filename>\",\n \"Use whitelist file to reduce descriptor size\",\n )\n .action(generate)\n\n program\n .command(\"add\")\n .description(\"Add a new chain spec to the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .option(\"-f, --file <filename>\", \"Source from metadata encoded file\")\n .option(\"-w, --wsUrl <URL>\", \"Source from websocket url\")\n .option(\"-c, --chainSpec <filename>\", \"Source from chain spec file\")\n .addOption(\n new Option(\"-n, --name <name>\", \"Source from a well-known chain\").choices(\n Object.keys(knownChains),\n ),\n )\n .option(\"--wasm <filename>\", \"Source from runtime wasm file\")\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .action(add)\n\n program\n .command(\"update\")\n .description(\"Update the metadata files and generate descriptor files\")\n .argument(\n \"[keys]\",\n \"Keys of the metadata files to update, separated by commas. Leave empty for all\",\n )\n .addOption(config)\n .action(update)\n\n program\n .command(\"remove\")\n .description(\"Remove a chain spec from the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .action(remove)\n\n return program\n}\n","import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport { V14, V15, metadata, v15 } from \"@polkadot-api/substrate-bindings\"\nimport { WebSocketProvider } from \"@polkadot-api/ws-provider/node\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport { filter, firstValueFrom } from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport type {\n MetadataWithRaw,\n WorkerRequestMessage,\n WorkerResponseMessage,\n} from \"./metadataWorker\"\n\nconst workerPath = fileURLToPath(import.meta.resolve(\"./metadataWorker.js\"))\n\nlet metadataWorker: Worker | null\nlet workerRefCount = 0\nasync function getMetadataWorker() {\n if (!metadataWorker) {\n metadataWorker = new Worker(workerPath, {\n stdout: true,\n stderr: true,\n })\n await new Promise((resolve) => {\n metadataWorker?.once(\"message\", resolve)\n metadataWorker?.postMessage(\"ready\")\n })\n }\n return metadataWorker\n}\n\nconst getMetadataCall = async (provider: JsonRpcProvider) => {\n const client = getObservableClient(createClient(provider))\n const { runtime$, unfollow } = client.chainHead$()\n const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw }\n}\n\nconst getWorkerMessage = (chain: string): Omit<WorkerRequestMessage, \"id\"> => {\n if (!(chain in knownChains)) {\n return {\n potentialRelayChainSpecs: [],\n chainSpec: chain,\n }\n }\n const relayChainName = Object.keys(knownChains).find(\n (c) => c !== chain && chain.startsWith(c),\n )\n const potentialRelayChainSpecs = relayChainName\n ? [knownChains[relayChainName as keyof typeof knownChains]]\n : []\n const chainSpec = knownChains[chain as keyof typeof knownChains]\n\n return {\n potentialRelayChainSpecs,\n chainSpec,\n }\n}\n\nlet id = 0\nconst getMetadataFromSmoldot = async (chain: string) => {\n workerRefCount++\n try {\n const reqId = id++\n const metadataWorker = await getMetadataWorker()\n const message: WorkerRequestMessage = {\n ...getWorkerMessage(chain),\n id: reqId,\n }\n const metadata = await new Promise<MetadataWithRaw>((resolve) => {\n const listener = (data: WorkerResponseMessage) => {\n if (data.id !== reqId) return\n metadataWorker.off(\"message\", listener)\n resolve(data.metadata)\n }\n metadataWorker.on(\"message\", listener)\n metadataWorker.postMessage(message)\n })\n return metadata\n } finally {\n workerRefCount--\n if (workerRefCount === 0) {\n metadataWorker?.terminate()\n metadataWorker = null\n }\n }\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(WebSocketProvider(wsURL))\n\nexport async function getMetadata(\n entry: EntryConfig,\n): Promise<{ metadata: V15 | V14; metadataRaw: Uint8Array } | null> {\n // metadata file always prevails over other entries.\n // cli's update will update the metadata file when the user requests it.\n if (entry.metadata) {\n const data = await fs.readFile(entry.metadata)\n const metadataRaw = new Uint8Array(data)\n\n let meta: V14 | V15\n try {\n meta = metadata.dec(metadataRaw).metadata.value as V14 | V15\n } catch (_) {\n meta = v15.dec(metadataRaw)\n }\n\n return {\n metadata: meta,\n metadataRaw,\n }\n }\n\n if (\"chain\" in entry) {\n return getMetadataFromSmoldot(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromSmoldot(chainSpec)\n }\n\n if (\"wsUrl\" in entry) {\n return getMetadataFromWsURL(entry.wsUrl)\n }\n\n return null\n}\n\nexport async function writeMetadataToDisk(\n metadataRaw: Uint8Array,\n outFile: string,\n) {\n await fs.mkdir(dirname(outFile), { recursive: true })\n await fs.writeFile(outFile, metadataRaw)\n}\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage } from \"write-package\"\nimport { readFile, writeFile } from \"node:fs/promises\"\n\nexport type EntryConfig =\n | {\n metadata: string\n }\n | {\n chainSpec: string\n metadata?: string\n }\n | {\n wsUrl: string\n metadata?: string\n }\n | {\n chain: string\n metadata?: string\n }\nexport type PapiConfig = Record<string, EntryConfig>\n\nconst papiCfgDefaultFile = \"polkadot-api.json\"\nconst packageJsonKey = \"polkadot-api\"\n\nexport async function readPapiConfig(\n configFile: string | undefined,\n): Promise<PapiConfig | null> {\n if (configFile) return readFromFile(configFile)\n\n const configFromDefaultFile = await readFromFile(papiCfgDefaultFile)\n if (configFromDefaultFile) return configFromDefaultFile\n\n return readFromFile(\"package.json\")\n}\n\n/**\n * Writes config to configFile. If configFile is not specified, it writes to the\n * default path, by this priority order:\n *\n * 1. Default config file (polkadot-api.json)\n * 2. Package.json If no pre-existing config exists, then it creates a\n * polkadot-api.json file.\n */\nexport async function writePapiConfig(\n configFile: string | undefined,\n config: PapiConfig,\n) {\n if (configFile) return writeToFile(configFile, config)\n\n const defaultCfgExists = await fsExists(papiCfgDefaultFile)\n if (defaultCfgExists) return writeToFile(papiCfgDefaultFile, config)\n\n const packageCfg = await readFromFile(\"package.json\")\n if (packageCfg) {\n return writeToFile(\"package.json\", config)\n }\n\n return writeToFile(papiCfgDefaultFile, config)\n}\n\nasync function readFromFile(file: string) {\n const fileExists = await fsExists(file)\n if (!fileExists) return null\n\n if (file === \"package.json\") {\n const packageJson = await readPackage()\n return packageJson[packageJsonKey] ?? null\n }\n return JSON.parse(await readFile(file, \"utf8\"))\n}\n\nasync function writeToFile(file: string, config: PapiConfig) {\n if (file === \"package.json\") {\n // updatePackage preserves existing values, we have to clear them to make removes work.\n await updatePackage({\n [packageJsonKey]: null,\n })\n return updatePackage({\n [packageJsonKey]: config,\n })\n }\n return writeFile(file, JSON.stringify(config, null, 2))\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\nimport { getMetadataFromRuntime } from \"@polkadot-api/wasm-executor\"\nimport * as fs from \"node:fs/promises\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n // well-known chains\n name?: string\n wasm?: string\n noPersist?: boolean\n}\n\nexport async function add(key: string, options: AddOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n if (key in entries) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n if (options.file) {\n entries[key] = {\n metadata: options.file,\n }\n } else if (options.wasm) {\n const spinner = ora(`Loading metadata from runtime`).start()\n const metadataHex = (await fs.readFile(options.wasm)).toString(\"hex\")\n const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`))\n\n // metadata comes with compact length prepended\n const metadataLen = compactNumber.dec(opaqueMeta)\n const compactLen = compactNumber.enc(metadataLen).length\n // verify we got all data\n if (opaqueMeta.length - compactLen !== metadataLen)\n throw new Error(\"Not able to retrieve runtime metadata\")\n\n spinner.text = \"Writing metadata\"\n const metadataRaw = opaqueMeta.slice(compactLen)\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadataRaw, filename)\n spinner.succeed(`Metadata saved as ${filename}`)\n\n entries[key] = {\n metadata: filename,\n }\n } else {\n const entry = entryFromOptions(options)\n entries[key] = entry\n\n if (!options.noPersist) {\n const spinner = ora(`Loading metadata`).start()\n const { metadataRaw } = (await getMetadata(entry))!\n\n spinner.text = \"Writing metadata\"\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadataRaw, filename)\n\n spinner.succeed(`Metadata saved as ${filename}`)\n entry.metadata = filename\n }\n }\n\n await writePapiConfig(options.config, entries)\n return console.log(`Saved new spec \"${key}\"`)\n}\n\nconst entryFromOptions = (options: AddOptions): EntryConfig => {\n if (options.wsUrl) {\n return {\n wsUrl: options.wsUrl,\n }\n }\n if (options.chainSpec) {\n return {\n chainSpec: options.chainSpec,\n }\n }\n if (options.name) {\n return {\n chain: options.name,\n }\n }\n\n throw new Error(\n \"add command needs one source, specified by options -f -w -c or -n\",\n )\n}\n","import { getMetadata } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport { generateMultipleDescriptors } from \"@polkadot-api/codegen\"\nimport { V14, V15 } from \"@polkadot-api/substrate-bindings\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport path, { join } from \"path\"\nimport process from \"process\"\nimport tsc from \"tsc-prog\"\nimport tsup, { build } from \"tsup\"\nimport { CommonOptions } from \"./commonOptions\"\nimport fsExists from \"fs.promises.exists\"\nimport { existsSync } from \"fs\"\nimport { tmpdir } from \"os\"\n\nexport interface GenerateOptions extends CommonOptions {\n key?: string\n clientLibrary?: string\n whitelist?: string\n}\n\nexport async function generate(opts: GenerateOptions) {\n const sources = await getSources(opts)\n\n if (Object.keys(sources).length == 0) {\n console.log(\"No chains defined in config file\")\n }\n\n console.log(`Reading metadata`)\n const chains = await Promise.all(\n Object.entries(sources).map(async ([key, source]) => ({\n key,\n metadata: (await getMetadata(source))!.metadata,\n knownTypes: {},\n })),\n )\n\n const descriptorsDir = join(\n process.cwd(),\n \"node_modules\",\n \"@polkadot-api\",\n \"descriptors\",\n )\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n if (existsSync(descriptorsDir))\n await fs.rm(descriptorsDir, { recursive: true })\n\n await fs.mkdir(descriptorsDir, { recursive: true })\n await generatePackageJson(join(descriptorsDir, \"package.json\"))\n\n const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null\n await outputCodegen(\n chains,\n join(descriptorsDir, \"src\"),\n clientPath,\n whitelist,\n )\n await compileCodegen(descriptorsDir)\n await fs.rm(join(descriptorsDir, \"src\"), { recursive: true })\n}\n\nasync function getSources(\n opts: GenerateOptions,\n): Promise<Record<string, EntryConfig>> {\n const config = await readPapiConfig(opts.config)\n if (!config) {\n throw new Error(\"Can't find the Polkadot-API configuration\")\n }\n\n if (opts.key) {\n if (!config[opts.key]) {\n throw new Error(`Key ${opts.key} not set in polkadot-api config`)\n }\n return {\n [opts.key]: config[opts.key],\n }\n }\n\n return config\n}\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: V14 | V15\n knownTypes: Record<string, string>\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | null,\n) {\n const {\n descriptorsFileContent,\n descriptorTypesFileContent,\n checksums,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n checksums: \"./checksums.json\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"checksums.json\"),\n JSON.stringify(checksums),\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n descriptorsFileContent,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains.map((chain, i) =>\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFileContent[i],\n ),\n ),\n )\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n )\n}\n\nasync function compileCodegen(packageDir: string) {\n const srcDir = join(packageDir, \"src\")\n const outDir = join(packageDir, \"dist\")\n\n if (await fsExists(outDir)) {\n await fs.rm(outDir, { recursive: true })\n }\n\n await tsup.build({\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\")],\n outDir,\n outExtension: (ctx) => ({\n js: ctx.format === \"esm\" ? \".mjs\" : \".js\",\n }),\n })\n\n tsc.build({\n basePath: srcDir,\n compilerOptions: {\n skipLibCheck: true,\n declaration: true,\n emitDeclarationOnly: true,\n target: \"esnext\",\n module: \"esnext\",\n moduleResolution: \"node\",\n resolveJsonModule: true,\n allowSyntheticDefaultImports: true,\n outDir,\n },\n })\n}\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `export { default as ${key} } from \"./${key}\";`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n ].join(\"\\n\")\n await fs.writeFile(join(path, \"index.ts\"), indexTs)\n}\n\nconst generatePackageJson = async (path: string) => {\n await fs.writeFile(\n path,\n `{\n \"name\": \"@polkadot-api/descriptors\",\n \"exports\": {\n \".\": {\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"browser\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"peerDependencies\": {\n \"polkadot-api\": \"*\"\n }\n }`,\n )\n}\n\nasync function readWhitelist(filename: string): Promise<string[] | null> {\n if (!(await fsExists(filename))) {\n throw new Error(\"Whitelist file not found: \" + filename)\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"papi-\"))\n try {\n await build({\n format: \"esm\",\n entry: {\n index: filename,\n },\n outDir: tmpDir,\n outExtension() {\n return { js: \".mjs\" }\n },\n silent: true,\n })\n const { whitelist } = await import(join(tmpDir, \"index.mjs\"))\n return whitelist\n } finally {\n await rm(tmpDir, { recursive: true }).catch(console.error)\n }\n}\n","import { readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport async function remove(key: string, options: CommonOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n const entry = entries[key]\n delete entries[key]\n\n await writePapiConfig(options.config, entries)\n console.log(`Removed chain \"${key}\" from config`)\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport async function update(\n keysInput: string | undefined,\n options: CommonOptions,\n) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n const keys =\n keysInput === undefined ? Object.keys(entries) : keysInput.split(\",\")\n\n const updateByKey = async (key: string) => {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n // Exclude metadata file from the entry, otherwise getMetadata would load from the file\n const { metadata: filename, ...entry } = entries[key]\n if (!filename) {\n if (keysInput !== undefined) {\n console.warn(`Key ${key} doesn't have a metadata file to update`)\n }\n\n return\n }\n\n const metadata = await getMetadata(entry as EntryConfig)\n // For those without other sources than metadata file, we get a null.\n if (!metadata) {\n if (keysInput !== undefined) {\n console.warn(\n `Key ${key} doesn't have any external source to update from`,\n )\n }\n return\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata.metadataRaw, filename)\n spinner.succeed(`${key} metadata updated`)\n }\n\n const spinner = ora(`Updating`).start()\n await Promise.all(keys.map(updateByKey))\n\n console.log(`Updating descriptors`)\n await generate({ config: options.config })\n\n spinner.stop()\n}\n"],"mappings":"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","names":["add","generate","remove","update","knownChains","metadataWorker","metadata","readFile","writeFile","fs","fs","fsExists","path","ora","metadata","ora"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,18 +4,12 @@ interface CommonOptions {
|
|
|
4
4
|
config?: string;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
declare enum WellKnownChain {
|
|
8
|
-
polkadot = "polkadot",
|
|
9
|
-
ksmcc3 = "ksmcc3",
|
|
10
|
-
rococo_v2_2 = "rococo_v2_2",
|
|
11
|
-
westend2 = "westend2"
|
|
12
|
-
}
|
|
13
|
-
|
|
14
7
|
interface AddOptions extends CommonOptions {
|
|
15
8
|
file?: string;
|
|
16
9
|
wsUrl?: string;
|
|
17
10
|
chainSpec?: string;
|
|
18
|
-
name?:
|
|
11
|
+
name?: string;
|
|
12
|
+
wasm?: string;
|
|
19
13
|
noPersist?: boolean;
|
|
20
14
|
}
|
|
21
15
|
declare function add(key: string, options: AddOptions): Promise<void>;
|
package/dist/index.js
CHANGED
package/dist/main.js
CHANGED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import * as _polkadot_api_substrate_bindings from '@polkadot-api/substrate-bindings';
|
|
2
|
+
import { JsonRpcProvider } from '@polkadot-api/json-rpc-provider';
|
|
3
|
+
|
|
4
|
+
type WorkerRequestMessage = {
|
|
5
|
+
id: number;
|
|
6
|
+
potentialRelayChainSpecs: string[];
|
|
7
|
+
chainSpec: string;
|
|
8
|
+
};
|
|
9
|
+
type WorkerResponseMessage = {
|
|
10
|
+
id: number;
|
|
11
|
+
metadata: MetadataWithRaw;
|
|
12
|
+
};
|
|
13
|
+
declare function getMetadataFromProvider(provider: JsonRpcProvider): Promise<{
|
|
14
|
+
metadata: {
|
|
15
|
+
lookup: {
|
|
16
|
+
id: number;
|
|
17
|
+
path: string[];
|
|
18
|
+
params: {
|
|
19
|
+
name: string;
|
|
20
|
+
type: number | undefined;
|
|
21
|
+
}[];
|
|
22
|
+
def: {
|
|
23
|
+
tag: "composite";
|
|
24
|
+
value: {
|
|
25
|
+
name: string | undefined;
|
|
26
|
+
type: number;
|
|
27
|
+
typeName: string | undefined;
|
|
28
|
+
docs: string[];
|
|
29
|
+
}[];
|
|
30
|
+
} | {
|
|
31
|
+
tag: "variant";
|
|
32
|
+
value: {
|
|
33
|
+
name: string;
|
|
34
|
+
fields: {
|
|
35
|
+
name: string | undefined;
|
|
36
|
+
type: number;
|
|
37
|
+
typeName: string | undefined;
|
|
38
|
+
docs: string[];
|
|
39
|
+
}[];
|
|
40
|
+
index: number;
|
|
41
|
+
docs: string[];
|
|
42
|
+
}[];
|
|
43
|
+
} | {
|
|
44
|
+
tag: "sequence";
|
|
45
|
+
value: number;
|
|
46
|
+
} | {
|
|
47
|
+
tag: "array";
|
|
48
|
+
value: {
|
|
49
|
+
len: number;
|
|
50
|
+
type: number;
|
|
51
|
+
};
|
|
52
|
+
} | {
|
|
53
|
+
tag: "tuple";
|
|
54
|
+
value: number[];
|
|
55
|
+
} | {
|
|
56
|
+
tag: "primitive";
|
|
57
|
+
value: {
|
|
58
|
+
tag: "bool";
|
|
59
|
+
value: undefined;
|
|
60
|
+
} | {
|
|
61
|
+
tag: "char";
|
|
62
|
+
value: undefined;
|
|
63
|
+
} | {
|
|
64
|
+
tag: "str";
|
|
65
|
+
value: undefined;
|
|
66
|
+
} | {
|
|
67
|
+
tag: "u8";
|
|
68
|
+
value: undefined;
|
|
69
|
+
} | {
|
|
70
|
+
tag: "u16";
|
|
71
|
+
value: undefined;
|
|
72
|
+
} | {
|
|
73
|
+
tag: "u32";
|
|
74
|
+
value: undefined;
|
|
75
|
+
} | {
|
|
76
|
+
tag: "u64";
|
|
77
|
+
value: undefined;
|
|
78
|
+
} | {
|
|
79
|
+
tag: "u128";
|
|
80
|
+
value: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
tag: "u256";
|
|
83
|
+
value: undefined;
|
|
84
|
+
} | {
|
|
85
|
+
tag: "i8";
|
|
86
|
+
value: undefined;
|
|
87
|
+
} | {
|
|
88
|
+
tag: "i16";
|
|
89
|
+
value: undefined;
|
|
90
|
+
} | {
|
|
91
|
+
tag: "i32";
|
|
92
|
+
value: undefined;
|
|
93
|
+
} | {
|
|
94
|
+
tag: "i64";
|
|
95
|
+
value: undefined;
|
|
96
|
+
} | {
|
|
97
|
+
tag: "i128";
|
|
98
|
+
value: undefined;
|
|
99
|
+
} | {
|
|
100
|
+
tag: "i256";
|
|
101
|
+
value: undefined;
|
|
102
|
+
};
|
|
103
|
+
} | {
|
|
104
|
+
tag: "compact";
|
|
105
|
+
value: number;
|
|
106
|
+
} | {
|
|
107
|
+
tag: "bitSequence";
|
|
108
|
+
value: {
|
|
109
|
+
bitStoreType: number;
|
|
110
|
+
bitOrderType: number;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
docs: string[];
|
|
114
|
+
}[];
|
|
115
|
+
pallets: {
|
|
116
|
+
docs: string[];
|
|
117
|
+
name: string;
|
|
118
|
+
storage: {
|
|
119
|
+
prefix: string;
|
|
120
|
+
items: {
|
|
121
|
+
name: string;
|
|
122
|
+
modifier: number;
|
|
123
|
+
type: {
|
|
124
|
+
tag: "map";
|
|
125
|
+
value: {
|
|
126
|
+
hashers: ({
|
|
127
|
+
tag: "Blake2128";
|
|
128
|
+
value: undefined;
|
|
129
|
+
} | {
|
|
130
|
+
tag: "Blake2256";
|
|
131
|
+
value: undefined;
|
|
132
|
+
} | {
|
|
133
|
+
tag: "Blake2128Concat";
|
|
134
|
+
value: undefined;
|
|
135
|
+
} | {
|
|
136
|
+
tag: "Twox128";
|
|
137
|
+
value: undefined;
|
|
138
|
+
} | {
|
|
139
|
+
tag: "Twox256";
|
|
140
|
+
value: undefined;
|
|
141
|
+
} | {
|
|
142
|
+
tag: "Twox64Concat";
|
|
143
|
+
value: undefined;
|
|
144
|
+
} | {
|
|
145
|
+
tag: "Identity";
|
|
146
|
+
value: undefined;
|
|
147
|
+
})[];
|
|
148
|
+
key: number;
|
|
149
|
+
value: number;
|
|
150
|
+
};
|
|
151
|
+
} | {
|
|
152
|
+
tag: "plain";
|
|
153
|
+
value: number;
|
|
154
|
+
};
|
|
155
|
+
fallback: _polkadot_api_substrate_bindings.HexString;
|
|
156
|
+
docs: string[];
|
|
157
|
+
}[];
|
|
158
|
+
} | undefined;
|
|
159
|
+
calls: number | undefined;
|
|
160
|
+
events: number | undefined;
|
|
161
|
+
constants: {
|
|
162
|
+
name: string;
|
|
163
|
+
type: number;
|
|
164
|
+
value: _polkadot_api_substrate_bindings.HexString;
|
|
165
|
+
docs: string[];
|
|
166
|
+
}[];
|
|
167
|
+
errors: number | undefined;
|
|
168
|
+
index: number;
|
|
169
|
+
}[];
|
|
170
|
+
extrinsic: {
|
|
171
|
+
version: number;
|
|
172
|
+
address: number;
|
|
173
|
+
call: number;
|
|
174
|
+
signature: number;
|
|
175
|
+
extra: number;
|
|
176
|
+
signedExtensions: {
|
|
177
|
+
identifier: string;
|
|
178
|
+
type: number;
|
|
179
|
+
additionalSigned: number;
|
|
180
|
+
}[];
|
|
181
|
+
};
|
|
182
|
+
type: number;
|
|
183
|
+
apis: {
|
|
184
|
+
name: string;
|
|
185
|
+
methods: {
|
|
186
|
+
name: string;
|
|
187
|
+
inputs: {
|
|
188
|
+
name: string;
|
|
189
|
+
type: number;
|
|
190
|
+
}[];
|
|
191
|
+
output: number;
|
|
192
|
+
docs: string[];
|
|
193
|
+
}[];
|
|
194
|
+
docs: string[];
|
|
195
|
+
}[];
|
|
196
|
+
outerEnums: {
|
|
197
|
+
call: number;
|
|
198
|
+
event: number;
|
|
199
|
+
error: number;
|
|
200
|
+
};
|
|
201
|
+
custom: [string, {
|
|
202
|
+
type: number;
|
|
203
|
+
value: _polkadot_api_substrate_bindings.HexString;
|
|
204
|
+
}][];
|
|
205
|
+
} | {
|
|
206
|
+
lookup: {
|
|
207
|
+
id: number;
|
|
208
|
+
path: string[];
|
|
209
|
+
params: {
|
|
210
|
+
name: string;
|
|
211
|
+
type: number | undefined;
|
|
212
|
+
}[];
|
|
213
|
+
def: {
|
|
214
|
+
tag: "composite";
|
|
215
|
+
value: {
|
|
216
|
+
name: string | undefined;
|
|
217
|
+
type: number;
|
|
218
|
+
typeName: string | undefined;
|
|
219
|
+
docs: string[];
|
|
220
|
+
}[];
|
|
221
|
+
} | {
|
|
222
|
+
tag: "variant";
|
|
223
|
+
value: {
|
|
224
|
+
name: string;
|
|
225
|
+
fields: {
|
|
226
|
+
name: string | undefined;
|
|
227
|
+
type: number;
|
|
228
|
+
typeName: string | undefined;
|
|
229
|
+
docs: string[];
|
|
230
|
+
}[];
|
|
231
|
+
index: number;
|
|
232
|
+
docs: string[];
|
|
233
|
+
}[];
|
|
234
|
+
} | {
|
|
235
|
+
tag: "sequence";
|
|
236
|
+
value: number;
|
|
237
|
+
} | {
|
|
238
|
+
tag: "array";
|
|
239
|
+
value: {
|
|
240
|
+
len: number;
|
|
241
|
+
type: number;
|
|
242
|
+
};
|
|
243
|
+
} | {
|
|
244
|
+
tag: "tuple";
|
|
245
|
+
value: number[];
|
|
246
|
+
} | {
|
|
247
|
+
tag: "primitive";
|
|
248
|
+
value: {
|
|
249
|
+
tag: "bool";
|
|
250
|
+
value: undefined;
|
|
251
|
+
} | {
|
|
252
|
+
tag: "char";
|
|
253
|
+
value: undefined;
|
|
254
|
+
} | {
|
|
255
|
+
tag: "str";
|
|
256
|
+
value: undefined;
|
|
257
|
+
} | {
|
|
258
|
+
tag: "u8";
|
|
259
|
+
value: undefined;
|
|
260
|
+
} | {
|
|
261
|
+
tag: "u16";
|
|
262
|
+
value: undefined;
|
|
263
|
+
} | {
|
|
264
|
+
tag: "u32";
|
|
265
|
+
value: undefined;
|
|
266
|
+
} | {
|
|
267
|
+
tag: "u64";
|
|
268
|
+
value: undefined;
|
|
269
|
+
} | {
|
|
270
|
+
tag: "u128";
|
|
271
|
+
value: undefined;
|
|
272
|
+
} | {
|
|
273
|
+
tag: "u256";
|
|
274
|
+
value: undefined;
|
|
275
|
+
} | {
|
|
276
|
+
tag: "i8";
|
|
277
|
+
value: undefined;
|
|
278
|
+
} | {
|
|
279
|
+
tag: "i16";
|
|
280
|
+
value: undefined;
|
|
281
|
+
} | {
|
|
282
|
+
tag: "i32";
|
|
283
|
+
value: undefined;
|
|
284
|
+
} | {
|
|
285
|
+
tag: "i64";
|
|
286
|
+
value: undefined;
|
|
287
|
+
} | {
|
|
288
|
+
tag: "i128";
|
|
289
|
+
value: undefined;
|
|
290
|
+
} | {
|
|
291
|
+
tag: "i256";
|
|
292
|
+
value: undefined;
|
|
293
|
+
};
|
|
294
|
+
} | {
|
|
295
|
+
tag: "compact";
|
|
296
|
+
value: number;
|
|
297
|
+
} | {
|
|
298
|
+
tag: "bitSequence";
|
|
299
|
+
value: {
|
|
300
|
+
bitStoreType: number;
|
|
301
|
+
bitOrderType: number;
|
|
302
|
+
};
|
|
303
|
+
};
|
|
304
|
+
docs: string[];
|
|
305
|
+
}[];
|
|
306
|
+
pallets: {
|
|
307
|
+
docs: string[];
|
|
308
|
+
name: string;
|
|
309
|
+
storage: {
|
|
310
|
+
prefix: string;
|
|
311
|
+
items: {
|
|
312
|
+
name: string;
|
|
313
|
+
modifier: number;
|
|
314
|
+
type: {
|
|
315
|
+
tag: "map";
|
|
316
|
+
value: {
|
|
317
|
+
hashers: ({
|
|
318
|
+
tag: "Blake2128";
|
|
319
|
+
value: undefined;
|
|
320
|
+
} | {
|
|
321
|
+
tag: "Blake2256";
|
|
322
|
+
value: undefined;
|
|
323
|
+
} | {
|
|
324
|
+
tag: "Blake2128Concat";
|
|
325
|
+
value: undefined;
|
|
326
|
+
} | {
|
|
327
|
+
tag: "Twox128";
|
|
328
|
+
value: undefined;
|
|
329
|
+
} | {
|
|
330
|
+
tag: "Twox256";
|
|
331
|
+
value: undefined;
|
|
332
|
+
} | {
|
|
333
|
+
tag: "Twox64Concat";
|
|
334
|
+
value: undefined;
|
|
335
|
+
} | {
|
|
336
|
+
tag: "Identity";
|
|
337
|
+
value: undefined;
|
|
338
|
+
})[];
|
|
339
|
+
key: number;
|
|
340
|
+
value: number;
|
|
341
|
+
};
|
|
342
|
+
} | {
|
|
343
|
+
tag: "plain";
|
|
344
|
+
value: number;
|
|
345
|
+
};
|
|
346
|
+
fallback: _polkadot_api_substrate_bindings.HexString;
|
|
347
|
+
docs: string[];
|
|
348
|
+
}[];
|
|
349
|
+
} | undefined;
|
|
350
|
+
calls: number | undefined;
|
|
351
|
+
events: number | undefined;
|
|
352
|
+
constants: {
|
|
353
|
+
name: string;
|
|
354
|
+
type: number;
|
|
355
|
+
value: _polkadot_api_substrate_bindings.HexString;
|
|
356
|
+
docs: string[];
|
|
357
|
+
}[];
|
|
358
|
+
errors: number | undefined;
|
|
359
|
+
index: number;
|
|
360
|
+
}[];
|
|
361
|
+
extrinsic: {
|
|
362
|
+
type: number;
|
|
363
|
+
version: number;
|
|
364
|
+
signedExtensions: {
|
|
365
|
+
identifier: string;
|
|
366
|
+
type: number;
|
|
367
|
+
additionalSigned: number;
|
|
368
|
+
}[];
|
|
369
|
+
};
|
|
370
|
+
type: number;
|
|
371
|
+
apis: {
|
|
372
|
+
name: string;
|
|
373
|
+
methods: {
|
|
374
|
+
name: string;
|
|
375
|
+
inputs: {
|
|
376
|
+
name: string;
|
|
377
|
+
type: number;
|
|
378
|
+
}[];
|
|
379
|
+
output: number;
|
|
380
|
+
docs: string[];
|
|
381
|
+
}[];
|
|
382
|
+
docs: string[];
|
|
383
|
+
}[];
|
|
384
|
+
};
|
|
385
|
+
metadataRaw: Uint8Array;
|
|
386
|
+
}>;
|
|
387
|
+
type MetadataWithRaw = Awaited<ReturnType<typeof getMetadataFromProvider>>;
|
|
388
|
+
|
|
389
|
+
export type { MetadataWithRaw, WorkerRequestMessage, WorkerResponseMessage };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// src/metadataWorker.ts
|
|
2
|
+
import { parentPort } from "node:worker_threads";
|
|
3
|
+
import { start } from "@polkadot-api/smoldot";
|
|
4
|
+
import { getSmProvider } from "@polkadot-api/sm-provider";
|
|
5
|
+
import { getObservableClient } from "@polkadot-api/observable-client";
|
|
6
|
+
import { createClient } from "@polkadot-api/substrate-client";
|
|
7
|
+
import { firstValueFrom, filter } from "rxjs";
|
|
8
|
+
var smoldot = start();
|
|
9
|
+
parentPort.on("message", async (data) => {
|
|
10
|
+
if (data === "ready") {
|
|
11
|
+
parentPort.postMessage("ready");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const potentialRelayChains = await Promise.all(
|
|
15
|
+
data.potentialRelayChainSpecs.map(
|
|
16
|
+
(chainSpec) => smoldot.addChain({ chainSpec })
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
const chain = await smoldot.addChain({
|
|
20
|
+
potentialRelayChains,
|
|
21
|
+
chainSpec: data.chainSpec
|
|
22
|
+
});
|
|
23
|
+
const metadata = await getMetadataFromProvider(getSmProvider(chain));
|
|
24
|
+
const response = {
|
|
25
|
+
metadata,
|
|
26
|
+
id: data.id
|
|
27
|
+
};
|
|
28
|
+
parentPort.postMessage(response);
|
|
29
|
+
});
|
|
30
|
+
parentPort.postMessage("ready");
|
|
31
|
+
async function getMetadataFromProvider(provider) {
|
|
32
|
+
const client = getObservableClient(createClient(provider));
|
|
33
|
+
const { runtime$, unfollow } = client.chainHead$();
|
|
34
|
+
const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)));
|
|
35
|
+
unfollow();
|
|
36
|
+
client.destroy();
|
|
37
|
+
return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=metadataWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/metadataWorker.ts"],"sourcesContent":["import { parentPort } from \"node:worker_threads\"\nimport { start } from \"@polkadot-api/smoldot\"\nimport { getSmProvider } from \"@polkadot-api/sm-provider\"\nimport { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport { createClient } from \"@polkadot-api/substrate-client\"\nimport { firstValueFrom, filter } from \"rxjs\"\n\nexport type WorkerRequestMessage = {\n id: number\n potentialRelayChainSpecs: string[]\n chainSpec: string\n}\nexport type WorkerResponseMessage = {\n id: number\n metadata: MetadataWithRaw\n}\n\nconst smoldot = start()\nparentPort!.on(\"message\", async (data: WorkerRequestMessage | \"ready\") => {\n if (data === \"ready\") {\n parentPort!.postMessage(\"ready\")\n return\n }\n\n const potentialRelayChains = await Promise.all(\n data.potentialRelayChainSpecs.map((chainSpec) =>\n smoldot.addChain({ chainSpec }),\n ),\n )\n const chain = await smoldot.addChain({\n potentialRelayChains,\n chainSpec: data.chainSpec,\n })\n const metadata = await getMetadataFromProvider(getSmProvider(chain))\n const response: WorkerResponseMessage = {\n metadata,\n id: data.id,\n }\n parentPort!.postMessage(response)\n})\nparentPort!.postMessage(\"ready\")\n\nasync function getMetadataFromProvider(provider: JsonRpcProvider) {\n const client = getObservableClient(createClient(provider))\n const { runtime$, unfollow } = client.chainHead$()\n const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw }\n}\nexport type MetadataWithRaw = Awaited<\n ReturnType<typeof getMetadataFromProvider>\n>\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAE9B,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB,cAAc;AAYvC,IAAM,UAAU,MAAM;AACtB,WAAY,GAAG,WAAW,OAAO,SAAyC;AACxE,MAAI,SAAS,SAAS;AACpB,eAAY,YAAY,OAAO;AAC/B;AAAA,EACF;AAEA,QAAM,uBAAuB,MAAM,QAAQ;AAAA,IACzC,KAAK,yBAAyB;AAAA,MAAI,CAAC,cACjC,QAAQ,SAAS,EAAE,UAAU,CAAC;AAAA,IAChC;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,QAAQ,SAAS;AAAA,IACnC;AAAA,IACA,WAAW,KAAK;AAAA,EAClB,CAAC;AACD,QAAM,WAAW,MAAM,wBAAwB,cAAc,KAAK,CAAC;AACnE,QAAM,WAAkC;AAAA,IACtC;AAAA,IACA,IAAI,KAAK;AAAA,EACX;AACA,aAAY,YAAY,QAAQ;AAClC,CAAC;AACD,WAAY,YAAY,OAAO;AAE/B,eAAe,wBAAwB,UAA2B;AAChE,QAAM,SAAS,oBAAoB,aAAa,QAAQ,CAAC;AACzD,QAAM,EAAE,UAAU,SAAS,IAAI,OAAO,WAAW;AACjD,QAAM,UAAU,MAAM,eAAe,SAAS,KAAK,OAAO,OAAO,CAAC,CAAC;AAEnE,WAAS;AACT,SAAO,QAAQ;AAEf,SAAO,EAAE,UAAU,QAAQ,UAAU,aAAa,QAAQ,YAAY;AACxE;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"author": "
|
|
3
|
+
"version": "0.5.1",
|
|
4
|
+
"author": "Victor Oliva (https://github.com/voliva)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": true,
|
|
7
7
|
"type": "module",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@commander-js/extra-typings": "^12.0.1",
|
|
27
|
+
"@polkadot-api/wasm-executor": "^0.1.0",
|
|
27
28
|
"@types/node": "^20.12.11",
|
|
28
29
|
"commander": "^12.0.0",
|
|
29
30
|
"fs.promises.exists": "^1.1.4",
|
|
@@ -36,18 +37,18 @@
|
|
|
36
37
|
"typescript": "^5.4.5",
|
|
37
38
|
"write-package": "^7.0.1",
|
|
38
39
|
"ws": "^8.17.0",
|
|
39
|
-
"@polkadot-api/codegen": "0.
|
|
40
|
+
"@polkadot-api/codegen": "0.6.1",
|
|
40
41
|
"@polkadot-api/json-rpc-provider": "0.0.1",
|
|
41
|
-
"@polkadot-api/
|
|
42
|
-
"@polkadot-api/
|
|
43
|
-
"@polkadot-api/
|
|
44
|
-
"@polkadot-api/observable-client": "0.3.0",
|
|
42
|
+
"@polkadot-api/known-chains": "0.1.6",
|
|
43
|
+
"@polkadot-api/metadata-builders": "0.3.1",
|
|
44
|
+
"@polkadot-api/observable-client": "0.3.1",
|
|
45
45
|
"@polkadot-api/sm-provider": "0.1.0",
|
|
46
|
-
"@polkadot-api/
|
|
47
|
-
"@polkadot-api/
|
|
48
|
-
"@polkadot-api/substrate-
|
|
49
|
-
"@polkadot-api/
|
|
50
|
-
"@polkadot-api/ws-provider": "0.1.0"
|
|
46
|
+
"@polkadot-api/json-rpc-provider-proxy": "0.1.0",
|
|
47
|
+
"@polkadot-api/smoldot": "0.2.5",
|
|
48
|
+
"@polkadot-api/substrate-bindings": "0.6.0",
|
|
49
|
+
"@polkadot-api/substrate-client": "0.1.4",
|
|
50
|
+
"@polkadot-api/ws-provider": "0.1.0",
|
|
51
|
+
"@polkadot-api/utils": "0.1.0"
|
|
51
52
|
},
|
|
52
53
|
"devDependencies": {
|
|
53
54
|
"@types/ws": "^8.5.10",
|
|
@@ -55,7 +56,7 @@
|
|
|
55
56
|
"@polkadot-api/json-rpc-provider": "0.0.1"
|
|
56
57
|
},
|
|
57
58
|
"scripts": {
|
|
58
|
-
"build": "tsc --noEmit && tsup-node src/main.ts src/index.ts --clean --out-dir dist --dts --sourcemap --platform node --format esm",
|
|
59
|
+
"build": "tsc --noEmit && tsup-node src/main.ts src/index.ts src/metadataWorker.ts --clean --out-dir dist --dts --sourcemap --platform node --format esm",
|
|
59
60
|
"start": "pnpm build && node --enable-source-maps dist/main.js",
|
|
60
61
|
"test": "echo 'no tests'",
|
|
61
62
|
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/well-known-chains.ts","../src/metadata.ts","../src/smolldot-worker.ts","../src/papiConfig.ts","../src/commands/add.ts","../src/commands/generate.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, remove, update } from \"./commands\"\nimport { WellKnownChain } from \"./well-known-chains\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n}\n\nexport function getCli({ add, generate, remove, update }: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\")\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .option(\"-k, --key <key>\", \"Key of the descriptor to generate\")\n .option(\n \"--whitelist <filename>\",\n \"Use whitelist file to reduce descriptor size\",\n )\n .action(generate)\n\n program\n .command(\"add\")\n .description(\"Add a new chain spec to the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .option(\"-f, --file <filename>\", \"Source from metadata encoded file\")\n .option(\"-w, --wsUrl <URL>\", \"Source from websocket url\")\n .option(\"-c, --chainSpec <filename>\", \"Source from chain spec file\")\n .addOption(\n new Option(\"-n, --name <name>\", \"Source from a well-known chain\").choices(\n Object.keys(WellKnownChain) as WellKnownChain[],\n ),\n )\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .action(add)\n\n program\n .command(\"update\")\n .description(\"Update the metadata files and generate descriptor files\")\n .argument(\n \"[keys]\",\n \"Keys of the metadata files to update, separated by commas. Leave empty for all\",\n )\n .addOption(config)\n .action(update)\n\n program\n .command(\"remove\")\n .description(\"Remove a chain spec from the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .action(remove)\n\n return program\n}\n","export enum WellKnownChain {\n polkadot = \"polkadot\",\n ksmcc3 = \"ksmcc3\",\n rococo_v2_2 = \"rococo_v2_2\",\n westend2 = \"westend2\",\n}\n","import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport { V14, V15, metadata, v15 } from \"@polkadot-api/substrate-bindings\"\nimport { WebSocketProvider } from \"@polkadot-api/ws-provider/node\"\nimport { PROVIDER_WORKER_CODE } from \"./smolldot-worker\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport { filter, firstValueFrom } from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { WellKnownChain } from \"./well-known-chains\"\n\nconst getMetadataCall = async (provider: JsonRpcProvider) => {\n const client = getObservableClient(createClient(provider))\n const { runtime$, unfollow } = client.chainHead$()\n const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw }\n}\n\nconst getMetadataFromProvider = async (chain: WellKnownChain | string) => {\n const provider: JsonRpcProvider = (onMsg) => {\n let worker: Worker | null = new Worker(PROVIDER_WORKER_CODE, {\n eval: true,\n workerData: chain,\n stderr: true,\n stdout: true,\n })\n worker.on(\"message\", onMsg)\n\n return {\n send: (msg) => worker?.postMessage({ type: \"send\", value: msg }),\n disconnect: () => {\n if (!worker) return\n\n worker.postMessage({ type: \"disconnect\" })\n worker.removeAllListeners()\n worker.terminate()\n worker = null\n },\n }\n }\n\n return getMetadataCall(provider)\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(WebSocketProvider(wsURL))\n\nexport async function getMetadata(\n entry: EntryConfig,\n): Promise<{ metadata: V15 | V14; metadataRaw: Uint8Array } | null> {\n // metadata file always prevails over other entries.\n // cli's update will update the metadata file when the user requests it.\n if (entry.metadata) {\n const data = await fs.readFile(entry.metadata)\n const metadataRaw = new Uint8Array(data)\n\n let meta: V14 | V15\n try {\n meta = metadata.dec(metadataRaw).metadata.value as V14 | V15\n } catch (_) {\n meta = v15.dec(metadataRaw)\n }\n\n return {\n metadata: meta,\n metadataRaw,\n }\n }\n\n if (\"chain\" in entry) {\n return getMetadataFromProvider(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromProvider(chainSpec)\n }\n\n if (\"wsUrl\" in entry) {\n return getMetadataFromWsURL(entry.wsUrl)\n }\n\n return null\n}\n\nexport async function writeMetadataToDisk(\n metadataRaw: Uint8Array,\n outFile: string,\n) {\n await fs.mkdir(dirname(outFile), { recursive: true })\n await fs.writeFile(outFile, metadataRaw)\n}\n","export const PROVIDER_WORKER_CODE = `\nconst { start } = require(\"@polkadot-api/smoldot\")\nconst { parentPort, workerData } = require(\"node:worker_threads\")\nconst { getSmProvider } = require(\"@polkadot-api/sm-provider\")\n\nif (!parentPort) throw new Error(\"no parent port\")\n\nconst WELL_KNOWN_CHAINS_LIB = \"@polkadot-api/known-chains/\"\nconst wellKnownChains = new Set([\n \"polkadot\",\n \"ksmcc3\",\n \"rococo_v2_2\",\n \"westend2\",\n])\n\nconst smoldot = start()\n\nconst getProvider = (chainSpec) => {\n const { relay_chain } = JSON.parse(chainSpec)\n\n if (!relay_chain)\n return getSmProvider(\n smoldot.addChain({\n chainSpec,\n }),\n )\n\n if (!wellKnownChains.has(relay_chain))\n throw new Error(\"Relay chain \" + relay_chain + \" is not well-known\")\n\n const relayP = smoldot.addChain({\n chainSpec: require(WELL_KNOWN_CHAINS_LIB + relay_chain).chainSpec,\n disableJsonRpc: true,\n })\n\n return getSmProvider(\n relayP.then((relay) =>\n smoldot.addChain({\n potentialRelayChains: [relay],\n chainSpec,\n }),\n ),\n )\n}\n\nconst provider = getProvider(\n wellKnownChains.has(workerData)\n ? require(WELL_KNOWN_CHAINS_LIB + workerData).chainSpec\n : workerData,\n)((msg) => parentPort.postMessage(msg))\n\nparentPort.on(\"message\", (msg) => {\n switch (msg.type) {\n case \"send\":\n provider.send(msg.value)\n break\n case \"disconnect\":\n provider.disconnect()\n }\n})\n`\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage } from \"write-package\"\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { WellKnownChain } from \"./well-known-chains\"\n\nexport type EntryConfig =\n | {\n metadata: string\n }\n | {\n chainSpec: string\n metadata?: string\n }\n | {\n wsUrl: string\n metadata?: string\n }\n | {\n chain: WellKnownChain\n metadata?: string\n }\nexport type PapiConfig = Record<string, EntryConfig>\n\nconst papiCfgDefaultFile = \"polkadot-api.json\"\nconst packageJsonKey = \"polkadot-api\"\n\nexport async function readPapiConfig(\n configFile: string | undefined,\n): Promise<PapiConfig | null> {\n if (configFile) return readFromFile(configFile)\n\n const configFromDefaultFile = await readFromFile(papiCfgDefaultFile)\n if (configFromDefaultFile) return configFromDefaultFile\n\n return readFromFile(\"package.json\")\n}\n\n/**\n * Writes config to configFile. If configFile is not specified, it writes to the\n * default path, by this priority order:\n *\n * 1. Default config file (polkadot-api.json)\n * 2. Package.json If no pre-existing config exists, then it creates a\n * polkadot-api.json file.\n */\nexport async function writePapiConfig(\n configFile: string | undefined,\n config: PapiConfig,\n) {\n if (configFile) return writeToFile(configFile, config)\n\n const defaultCfgExists = await fsExists(papiCfgDefaultFile)\n if (defaultCfgExists) return writeToFile(papiCfgDefaultFile, config)\n\n const packageCfg = await readFromFile(\"package.json\")\n if (packageCfg) {\n return writeToFile(\"package.json\", config)\n }\n\n return writeToFile(papiCfgDefaultFile, config)\n}\n\nasync function readFromFile(file: string) {\n const fileExists = await fsExists(file)\n if (!fileExists) return null\n\n if (file === \"package.json\") {\n const packageJson = await readPackage()\n return packageJson[packageJsonKey] ?? null\n }\n return JSON.parse(await readFile(file, \"utf8\"))\n}\n\nasync function writeToFile(file: string, config: PapiConfig) {\n if (file === \"package.json\") {\n // updatePackage preserves existing values, we have to clear them to make removes work.\n await updatePackage({\n [packageJsonKey]: null,\n })\n return updatePackage({\n [packageJsonKey]: config,\n })\n }\n return writeFile(file, JSON.stringify(config, null, 2))\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { WellKnownChain } from \"../well-known-chains\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n name?: WellKnownChain\n noPersist?: boolean\n}\n\nexport async function add(key: string, options: AddOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n if (key in entries) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n if (options.file) {\n entries[key] = {\n metadata: options.file,\n }\n } else {\n const entry = entryFromOptions(options)\n entries[key] = entry\n\n if (!options.noPersist) {\n const spinner = ora(`Loading metadata`).start()\n const { metadataRaw } = (await getMetadata(entry))!\n\n spinner.text = \"Writing metadata\"\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadataRaw, filename)\n\n spinner.succeed(`Metadata saved as ${filename}`)\n entry.metadata = filename\n }\n }\n\n await writePapiConfig(options.config, entries)\n return console.log(`Saved new spec \"${key}\"`)\n}\n\nconst entryFromOptions = (options: AddOptions): EntryConfig => {\n if (options.wsUrl) {\n return {\n wsUrl: options.wsUrl,\n }\n }\n if (options.chainSpec) {\n return {\n chainSpec: options.chainSpec,\n }\n }\n if (options.name) {\n return {\n chain: options.name as WellKnownChain,\n }\n }\n\n throw new Error(\n \"add command needs one source, specified by options -f -w -c or -n\",\n )\n}\n","import { getMetadata } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport { generateMultipleDescriptors } from \"@polkadot-api/codegen\"\nimport { V14, V15 } from \"@polkadot-api/substrate-bindings\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport path, { join } from \"path\"\nimport process from \"process\"\nimport tsc from \"tsc-prog\"\nimport tsup, { build } from \"tsup\"\nimport { CommonOptions } from \"./commonOptions\"\nimport fsExists from \"fs.promises.exists\"\nimport { existsSync } from \"fs\"\nimport { tmpdir } from \"os\"\n\nexport interface GenerateOptions extends CommonOptions {\n key?: string\n clientLibrary?: string\n whitelist?: string\n}\n\nexport async function generate(opts: GenerateOptions) {\n const sources = await getSources(opts)\n\n if (Object.keys(sources).length == 0) {\n console.log(\"No chains defined in config file\")\n }\n\n console.log(`Reading metadata`)\n const chains = await Promise.all(\n Object.entries(sources).map(async ([key, source]) => ({\n key,\n metadata: (await getMetadata(source))!.metadata,\n knownTypes: {},\n })),\n )\n\n const descriptorsDir = join(\n process.cwd(),\n \"node_modules\",\n \"@polkadot-api\",\n \"descriptors\",\n )\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n if (existsSync(descriptorsDir))\n await fs.rm(descriptorsDir, { recursive: true })\n\n await fs.mkdir(descriptorsDir, { recursive: true })\n await generatePackageJson(join(descriptorsDir, \"package.json\"))\n\n const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null\n await outputCodegen(\n chains,\n join(descriptorsDir, \"src\"),\n clientPath,\n whitelist,\n )\n await compileCodegen(descriptorsDir)\n await fs.rm(join(descriptorsDir, \"src\"), { recursive: true })\n}\n\nasync function getSources(\n opts: GenerateOptions,\n): Promise<Record<string, EntryConfig>> {\n const config = await readPapiConfig(opts.config)\n if (!config) {\n throw new Error(\"Can't find the Polkadot-API configuration\")\n }\n\n if (opts.key) {\n if (!config[opts.key]) {\n throw new Error(`Key ${opts.key} not set in polkadot-api config`)\n }\n return {\n [opts.key]: config[opts.key],\n }\n }\n\n return config\n}\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: V14 | V15\n knownTypes: Record<string, string>\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | null,\n) {\n const {\n descriptorsFileContent,\n descriptorTypesFileContent,\n checksums,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n checksums: \"./checksums.json\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"checksums.json\"),\n JSON.stringify(checksums),\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n descriptorsFileContent,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains.map((chain, i) =>\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFileContent[i],\n ),\n ),\n )\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n )\n}\n\nasync function compileCodegen(packageDir: string) {\n const srcDir = join(packageDir, \"src\")\n const outDir = join(packageDir, \"dist\")\n\n if (await fsExists(outDir)) {\n await fs.rm(outDir, { recursive: true })\n }\n\n await tsup.build({\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\")],\n outDir,\n outExtension: (ctx) => ({\n js: ctx.format === \"esm\" ? \".mjs\" : \".js\",\n }),\n })\n\n tsc.build({\n basePath: srcDir,\n compilerOptions: {\n skipLibCheck: true,\n declaration: true,\n emitDeclarationOnly: true,\n target: \"esnext\",\n module: \"esnext\",\n moduleResolution: \"node\",\n resolveJsonModule: true,\n allowSyntheticDefaultImports: true,\n outDir,\n },\n })\n}\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `export { default as ${key} } from \"./${key}\";`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n ].join(\"\\n\")\n await fs.writeFile(join(path, \"index.ts\"), indexTs)\n}\n\nconst generatePackageJson = async (path: string) => {\n await fs.writeFile(\n path,\n `{\n \"name\": \"@polkadot-api/descriptors\",\n \"exports\": {\n \".\": {\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"browser\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"peerDependencies\": {\n \"polkadot-api\": \"*\"\n }\n }`,\n )\n}\n\nasync function readWhitelist(filename: string): Promise<string[] | null> {\n if (!(await fsExists(filename))) {\n throw new Error(\"Whitelist file not found: \" + filename)\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"papi-\"))\n try {\n await build({\n format: \"esm\",\n entry: {\n index: filename,\n },\n outDir: tmpDir,\n outExtension() {\n return { js: \".mjs\" }\n },\n silent: true,\n })\n const { whitelist } = await import(join(tmpDir, \"index.mjs\"))\n return whitelist\n } finally {\n await rm(tmpDir, { recursive: true }).catch(console.error)\n }\n}\n","import { readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport async function remove(key: string, options: CommonOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n const entry = entries[key]\n delete entries[key]\n\n await writePapiConfig(options.config, entries)\n console.log(`Removed chain \"${key}\" from config`)\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport async function update(\n keysInput: string | undefined,\n options: CommonOptions,\n) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n const keys =\n keysInput === undefined ? Object.keys(entries) : keysInput.split(\",\")\n\n const updateByKey = async (key: string) => {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n // Exclude metadata file from the entry, otherwise getMetadata would load from the file\n const { metadata: filename, ...entry } = entries[key]\n if (!filename) {\n if (keysInput !== undefined) {\n console.warn(`Key ${key} doesn't have a metadata file to update`)\n }\n\n return\n }\n\n const metadata = await getMetadata(entry as EntryConfig)\n // For those without other sources than metadata file, we get a null.\n if (!metadata) {\n if (keysInput !== undefined) {\n console.warn(\n `Key ${key} doesn't have any external source to update from`,\n )\n }\n return\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata.metadataRaw, filename)\n spinner.succeed(`${key} metadata updated`)\n }\n\n const spinner = ora(`Updating`).start()\n await Promise.all(keys.map(updateByKey))\n\n console.log(`Updating descriptors`)\n await generate({ config: options.config })\n\n spinner.stop()\n}\n"],"mappings":"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","names":["WellKnownChain","add","generate","remove","update","readFile","writeFile","fs","fsExists","path","ora","metadata","ora"]}
|