@iden3/js-iden3-core
Version:
Low level API to create and manipulate iden3 Claims.
174 lines (149 loc) • 4.24 kB
text/typescript
import {
Blockchain,
ChainIds,
DidMethod,
DidMethodByte,
DidMethodNetwork,
NetworkId
} from './constants';
import { DID } from './did';
export const registerBlockchain = (blockchain: string): void => {
Blockchain[blockchain] = blockchain;
};
export const registerNetwork = (network: string): void => {
NetworkId[network] = network;
};
export const registerDidMethod = (method: string, byte: number): void => {
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: string, network: string, chainId: number): void => {
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: string, network?: string): number => {
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: DID): number => {
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
}: {
method: string;
methodByte?: number;
blockchain: string;
network: string;
networkFlag: number;
chainId?: number;
}): void => {
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;
};