diff --git a/src/utils/DIDResolver.ts b/src/utils/DIDResolver.ts index 9d66c50..957ce7d 100644 --- a/src/utils/DIDResolver.ts +++ b/src/utils/DIDResolver.ts @@ -13,15 +13,6 @@ import ValueType from "../models/ValueType" import * as Web3 from "web3" import * as DIDTools from "../utils/DIDTools" -/* - * - * Resolve a DID to an URL/DDO or later an internal/extrenal DID - * :param did: 32 byte value or DID string to resolver, this is part of the ocean DID did:op:<32 byte value> - * :param max_hop_count: max number of hops allowed to find the destination URL/DDO - * :return DIDResolved object: URL or DDO of the resolved DID - * :return null: if the DID cannot be resolved - * - */ export default class DIDResolver { public didRegistry @@ -29,6 +20,17 @@ export default class DIDResolver { this.didRegistry = didRegistry } + /* + * + * Resolve a DID to an URL/DDO or later an internal/extrenal DID + * + * :param did: 32 byte value or DID string to resolver, this is part of the ocean DID did:op:<32 byte value> + * :param max_hop_count: max number of hops allowed to find the destination URL/DDO + * + * :return DIDResolved object: URL or DDO of the resolved DID + * :return null: if the DID cannot be resolved + * + */ public async resolve(did: string, maxHopCount?: number): Promise { maxHopCount = maxHopCount ? maxHopCount : 0 @@ -72,7 +74,14 @@ export default class DIDResolver { return resolved } - public async getDID(didId): Promise { + /* + * Internal method to get the actual DID record + * + * :param didId: 32 byte id to find + * + * :return DIDRecord of the found DID, if not then return null + */ + private async getDID(didId): Promise { let record: DIDRecord = null @@ -80,7 +89,7 @@ export default class DIDResolver { const filterOwner: string = await this.didRegistry.getOwner(didId) assert(blockNumber > 0 ) - // filter on the blockNumber only + // filter on the blockNumber, owner and didId const filterOptions = { fromBlock: blockNumber, toBlock: blockNumber, @@ -91,6 +100,7 @@ export default class DIDResolver { } const events = await this.didRegistry.getEventData("DIDAttributeRegistered", filterOptions) if ( events && events.length > 0 ) { + // only get the last event, since this should be the latest const event = events[events.length - 1] record = { didId: event.returnValues.did, @@ -99,7 +109,6 @@ export default class DIDResolver { valueType: ValueType[event.returnValues.valueType], key: event.returnValues.key, value: event.returnValues.value, - } as DIDRecord } return record diff --git a/src/utils/DIDTools.ts b/src/utils/DIDTools.ts index d14638a..72e364d 100644 --- a/src/utils/DIDTools.ts +++ b/src/utils/DIDTools.ts @@ -13,18 +13,18 @@ const OCEAN_DID_METHOD = "op" * This function generates all types of DID's including ocean DID's * * :param didId: string to of the 'id' part of the DID - * :param path: option path part of the DID - * :param fragment: option fragment of the DID - * :param method: option method of the DID, defaults to 'op' + * :param path: optional path part of the DID + * :param fragment: optional fragment of the DID + * :param method: optional method of the DID, defaults to 'op' * * :return string generated DID, in the format did::[/][#] */ export function didGenerate(didId: string, path?: string, fragment?: string, method?: string) { - method = method === undefined ? OCEAN_DID_METHOD : method + method = method ? method : OCEAN_DID_METHOD method = method.toLowerCase().replace(/[^a-z0-9]/g, "") didId = didId.replace(/[^a-zA-Z0-9-.]/g, "") const did = ["did:", method, ":", didId] - if (path) { + if ( path ) { did.push("/") did.push(path) } @@ -47,7 +47,9 @@ interface IDIDParse { * The function didParse will parse all types of DID's including Ocean DID * If this is a Ocean DID the function will return record with the value * `idHex` set to a hex string ( without the leading 0x ). + * * :param did: did string to parse + * * :return ParseRecord * method - method of DID * id - id of the DID @@ -58,9 +60,6 @@ interface IDIDParse { export function didParse(did: string): IDIDParse { let result: IDIDParse = null - if ( typeof did !== "string" ) { - throw TypeError("DID must be a string") - } const match = did.match(/^did:([a-z0-9]+):([a-zA-Z0-9-.]+)(.*)/) if ( match ) { @@ -84,6 +83,7 @@ export function didParse(did: string): IDIDParse { * Validate a Ocean DID, return true if valid, else false * * :param did: string to validate as an Ocean DID + * * :return true if the DID is valid */ export function isDIDValid(did: string): boolean { @@ -96,11 +96,12 @@ export function isDIDValid(did: string): boolean { * * :param id: can be a hex string with or without the leading '0x' * :param method: if empty, default to 'op' + * * :return a valid DID * :return '0' for a 0 DID */ export function idToDID(id: string, method?: string): string { - method = method === undefined ? OCEAN_DID_METHOD : method + method = method ? method : OCEAN_DID_METHOD method = method.toLowerCase().replace(/[^a-z0-9]/g, "") // remove any leading 0x @@ -123,15 +124,23 @@ export function idToDID(id: string, method?: string): string { */ export function didToId(did: string): string { const result = didParse(did) - if (result && result.idHex ) { + if ( result && result.idHex ) { return result.idHex } return null } +/* + * Convert an Ocean DID string to 32 bytes + * + * :param did: string starting with "did:op:" + * + * :return 32 byte array of the Id in the DID + * :return null if the DID is a invalid Ocean DID + */ export function didToIdBytes(did: string): Uint8Array { const result = didParse(did) - if (result && result.idHex) { + if ( result && result.idHex ) { return Web3.utils.hexToBytes("0x" + result.idHex) } return null