@gear-js/api
Version:
A JavaScript library that provides functionality to connect GEAR Component APIs.
70 lines (67 loc) • 2.24 kB
JavaScript
import { isHex, hexToU8a, isU8a } from '@polkadot/util';
import { GearMetadata } from '../metadata/metadata.js';
import { CreateType } from '../metadata/create-type.js';
import '@polkadot/types';
import 'assert';
import '../metadata/programMetadata.js';
import { isProgramMeta } from '../metadata/is.js';
function getRegistry(metaOrHexRegistry) {
if (!metaOrHexRegistry) {
return undefined;
}
if (isHex(metaOrHexRegistry)) {
return metaOrHexRegistry;
}
}
function encodePayload(payload, hexRegistryOrMeta, type, typeIndexOrPayloadType) {
if (payload === undefined) {
return [];
}
if (isHex(payload)) {
return Array.from(hexToU8a(payload));
}
if (isU8a(payload)) {
return Array.from(payload);
}
const [reg, meta] = isProgramMeta(hexRegistryOrMeta)
? [undefined, hexRegistryOrMeta]
: [hexRegistryOrMeta, undefined];
const [typeIndex, payloadType] = typeof typeIndexOrPayloadType === 'number'
? [typeIndexOrPayloadType, undefined]
: [undefined, typeIndexOrPayloadType];
let result;
if (meta) {
if (typeIndex || typeIndex === 0) {
result = meta.createType(typeIndex, payload);
}
else if (payloadType) {
const index = meta.getTypeIndexByName(payloadType);
if (index === null) {
result = CreateType.create(payloadType, payload);
}
else {
result = meta.createType(meta.getTypeIndexByName(payloadType), payload);
}
}
else {
const withType = type === 'reply' ? meta.types[type] : meta.types[type].input;
result = meta.createType(withType, payload);
}
}
else if (reg) {
if (typeIndex || typeIndex === 0) {
result = new GearMetadata(reg).createType(typeIndex, payload);
}
else {
result = CreateType.create(payloadType, payload, reg);
}
}
else if (payloadType) {
result = CreateType.create(payloadType, payload);
}
else {
result = CreateType.create('Bytes', payload);
}
return Array.from(result.toU8a());
}
export { encodePayload, getRegistry };