UNPKG

@iden3/js-iden3-core

Version:

Low level API to create and manipulate iden3 Claims.

115 lines (114 loc) 3.98 kB
import { Blockchain, ChainIds, DidMethod, DidMethodByte, DidMethodNetwork, NetworkId } from './constants'; import { DID } from './did'; export const registerBlockchain = (blockchain) => { Blockchain[blockchain] = blockchain; }; export const registerNetwork = (network) => { NetworkId[network] = network; }; export const registerDidMethod = (method, byte) => { const max = DidMethodByte[DidMethod.Other]; if (byte >= max) { throw new Error(`Can't register DID method byte: current '${byte.toString(2)}', maximum byte allowed: '${(max - 1).toString(2)}'`); } if (typeof DidMethodByte[method] === 'number' && DidMethodByte[method] === byte) { return; } if (Object.values(DidMethodByte).includes(byte)) { throw new Error(`can't register method '${method}' because DID method byte '${byte.toString(2)}' already registered for another method`); } DidMethod[method] = method; DidMethodByte[method] = byte; }; /** * Register chain ID for a blockchain and network. * * @param {string} blockchain * @param {string} network * @param {number} [chainId] * @returns {void} */ export const registerChainId = (blockchain, network, chainId) => { const key = `${blockchain}:${network}`; if (typeof ChainIds[key] === 'number' && ChainIds[key] === chainId) { return; } if (Object.values(ChainIds).includes(chainId)) { throw new Error(`can't register chainId ${chainId} for '${blockchain}:${network}' because it's already registered for another chain id`); } ChainIds[key] = chainId; }; /** * Get chain ID by a blockchain and network. * * @param {string} blockchain * @param {string} [network] * @returns {number} */ export const getChainId = (blockchain, network) => { if (network) { blockchain += `:${network}`; } const chainId = ChainIds[blockchain]; if (!chainId) { throw new Error(`chainId not found for ${blockchain}`); } return chainId; }; /** * ChainIDfromDID returns chain name from w3c.DID * * @param {DID} did * @returns {number} */ export const chainIDfromDID = (did) => { const id = DID.idFromDID(did); const blockchain = DID.blockchainFromId(id); const networkId = DID.networkIdFromId(id); const chainId = ChainIds[`${blockchain}:${networkId}`]; if (typeof chainId !== 'number') { throw new Error(`chainId not found for ${blockchain}:${networkId}`); } return chainId; }; /** * Register a DID method with a byte value. * https://docs.iden3.io/getting-started/identity/identity-types/#regular-identity * @param {{ * method: DidMethodName; DID method name * methodByte?: number; put DID method byte value in case you want to register new DID method * blockchain: BlockchainName; blockchain name * network: NetworkName; network name * networkFlag: number; network flag * chainId?: number; put chain ID in case you need to use it * }} { * method, * methodByte, * blockchain, * network, * chainId, * networkFlag * } */ export const registerDidMethodNetwork = ({ method, methodByte, blockchain, network, chainId, networkFlag }) => { registerBlockchain(blockchain); registerNetwork(network); if (typeof methodByte === 'number') { registerDidMethod(method, methodByte); } if (!DidMethodNetwork[method]) { DidMethodNetwork[method] = {}; } if (typeof chainId === 'number') { registerChainId(blockchain, network, chainId); } const key = `${blockchain}:${network}`; const existedFlag = DidMethodNetwork[method][key]; if (typeof existedFlag === 'number' && existedFlag === networkFlag) { return; } if (Object.values(DidMethodNetwork[method]).includes(networkFlag)) { throw new Error(`DID network flag ${networkFlag.toString(2)} is already registered for the another network id for '${method}' method`); } DidMethodNetwork[method][key] = networkFlag; };