From c88680f10061b47d1d72d1339975466df0ec5804 Mon Sep 17 00:00:00 2001 From: Bogdan Fazakas Date: Tue, 8 Jun 2021 09:08:24 +0300 Subject: [PATCH] added AssetResolverHelper --- package-lock.json | 2 +- src/ocean/Assets.ts | 27 +++++++--------------- src/ocean/Compute.ts | 48 ++++++++++++++++++---------------------- src/provider/Provider.ts | 12 ++++------ src/utils/index.ts | 1 + 5 files changed, 36 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ca2d258..d63d66ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "node-abort-controller": "^2.0.0", "save-file": "^2.3.1", "uuid": "^8.3.2", - "web3": "^1.3.6", + "web3": "^1.3.5", "web3-eth-contract": "^1.3.6" }, "devDependencies": { diff --git a/src/ocean/Assets.ts b/src/ocean/Assets.ts index 3e2a9466..6897e917 100644 --- a/src/ocean/Assets.ts +++ b/src/ocean/Assets.ts @@ -5,7 +5,7 @@ import { Service, ServiceAccess } from '../ddo/interfaces/Service' import { EditableMetadata } from '../ddo/interfaces/EditableMetadata' import Account from './Account' import DID from './DID' -import { SubscribablePromise, didNoZeroX, didPrefixed } from '../utils' +import { SubscribablePromise, didNoZeroX, didPrefixed, assetResolve } from '../utils' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { WebServiceConnector } from './utils/WebServiceConnector' import BigNumber from 'bignumber.js' @@ -46,10 +46,6 @@ export interface Order { serviceType?: string } -function isDdo(arg: any): arg is DDO { - return arg.id !== undefined -} - /** * Assets submodule of Ocean Protocol. */ @@ -414,14 +410,14 @@ export class Assets extends Instantiable { * @return {Promise} Returns eth address */ public async creator(asset: DDO | string): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const checksum = ddo.getChecksum() const { creator, signatureValue } = ddo.proof const signer = await this.ocean.utils.signature.verifyText(checksum, signatureValue) if (signer.toLowerCase() !== creator.toLowerCase()) { this.logger.warn( - `Owner of ${ddo.id} doesn't match. Expected ${creator} instead of ${signer}.` + `Owner of ${did} doesn't match. Expected ${creator} instead of ${signer}.` ) } @@ -461,7 +457,7 @@ export class Assets extends Instantiable { asset: DDO | string, serviceType: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { ddo } = await assetResolve(asset) let service: Service const services: Service[] = ddo.service @@ -477,7 +473,7 @@ export class Assets extends Instantiable { asset: DDO | string, serviceIndex: number ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { ddo } = await assetResolve(asset) let service: Service const services: Service[] = ddo.service @@ -570,18 +566,11 @@ export class Assets extends Instantiable { searchPreviousOrders = true ): Promise { let service: Service -<<<<<<< HEAD - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) - const consumable = await this.isConsumable(ddo) - if (consumable.status > 0) return null -======= - - const ddo = await this.resolve(did) + const { ddo } = await assetResolve(asset) const consumable = await this.isConsumable(ddo, consumerAddress) if (consumable.status > 0) { throw new Error(`Order asset failed, ` + consumable.message) } ->>>>>>> main if (!consumerAddress) consumerAddress = payerAddress if (serviceIndex === -1) { @@ -654,7 +643,7 @@ export class Assets extends Instantiable { consumerAccount: Account, destination: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const { attributes } = ddo.findServiceByType('metadata') const service = ddo.findServiceByType('access') const { files } = attributes.main @@ -674,7 +663,7 @@ export class Assets extends Instantiable { const provider = await Provider.getInstance(this.instanceConfig) await provider.setBaseUrl(serviceEndpoint) await provider.download( - ddo.id, + did, txId, tokenAddress, service.type, diff --git a/src/ocean/Compute.ts b/src/ocean/Compute.ts index 4b612c5e..d6158d3e 100644 --- a/src/ocean/Compute.ts +++ b/src/ocean/Compute.ts @@ -1,5 +1,4 @@ import { DDO } from '../ddo/DDO' -import { MetadataAlgorithm } from '../ddo/interfaces/MetadataAlgorithm' import { Service, ServiceComputePrivacy, @@ -7,7 +6,7 @@ import { publisherTrustedAlgorithm } from '../ddo/interfaces/Service' import Account from './Account' -import { SubscribablePromise } from '../utils' +import { SubscribablePromise, assetResolve, AssetResolver } from '../utils' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { ComputeOutput, @@ -59,10 +58,6 @@ export const ComputeJobStatus = Object.freeze({ Deleted: 90 }) -function isDdo(arg: any): arg is DDO { - return arg.id !== undefined -} - /** * Compute submodule of Ocean Protocol. */ @@ -123,14 +118,14 @@ export class Compute extends Instantiable { additionalInputs?: ComputeInput[] ): Promise { output = this.checkOutput(consumerAccount, output) - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const service = ddo.findServiceByType('compute') const { serviceEndpoint } = service - if (ddo.id && txId) { + if (did && txId) { const provider = await Provider.getInstance(this.instanceConfig) await provider.setBaseUrl(serviceEndpoint) const computeJobsList = await provider.computeStart( - ddo.id, + did, consumerAccount, algorithm, output, @@ -158,12 +153,12 @@ export class Compute extends Instantiable { asset: DDO | string, jobId: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const service = ddo.findServiceByType('compute') const { serviceEndpoint } = service const provider = await Provider.getInstance(this.instanceConfig) await provider.setBaseUrl(serviceEndpoint) - const computeJobsList = await provider.computeStop(ddo.id, consumerAccount, jobId) + const computeJobsList = await provider.computeStop(did, consumerAccount, jobId) if (computeJobsList) return computeJobsList[0] as ComputeJob return null } @@ -181,12 +176,12 @@ export class Compute extends Instantiable { asset: DDO | string, jobId: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const service = ddo.findServiceByType('compute') const { serviceEndpoint } = service const provider = await Provider.getInstance(this.instanceConfig) await provider.setBaseUrl(serviceEndpoint) - const computeJobsList = await provider.computeDelete(ddo.id, consumerAccount, jobId) + const computeJobsList = await provider.computeDelete(did, consumerAccount, jobId) if (computeJobsList) return computeJobsList[0] as ComputeJob return null } @@ -255,13 +250,13 @@ export class Compute extends Instantiable { asset: DDO | string, jobId: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) const service = ddo.findServiceByType('compute') const { serviceEndpoint } = service const provider = await Provider.getInstance(this.instanceConfig) await provider.setBaseUrl(serviceEndpoint) const computeJobsList = await provider.computeStatus( - ddo.id, + did, consumerAccount, jobId, undefined, @@ -418,8 +413,8 @@ export class Compute extends Instantiable { algorithm: ComputeAlgorithm, algorithmDDO?: DDO ): Promise { - const datasetDdo = isDdo(dataset) ? dataset : await this.ocean.assets.resolve(dataset) - const service: Service = datasetDdo.findServiceById(serviceIndex) + const datasetResolved: AssetResolver = await assetResolve(dataset) + const service: Service = datasetResolved.ddo.findServiceById(serviceIndex) if (!service) return false if (service.type === 'compute') { if (algorithm.meta) { @@ -472,7 +467,7 @@ export class Compute extends Instantiable { ) { this.logger.error( 'ERROR: Algorithm container section was altered since it was added as trusted by ' + - datasetDdo.id + datasetResolved.did ) return false } @@ -482,7 +477,7 @@ export class Compute extends Instantiable { ) { this.logger.error( 'ERROR: Algorithm files section was altered since it was added as trusted by ' + - datasetDdo.id + datasetResolved.ddo ) return false } @@ -492,7 +487,10 @@ export class Compute extends Instantiable { } // algorithmDid was not found this.logger.error( - 'ERROR: Algorithm ' + algorithm.did + ' is not allowed by ' + datasetDdo.id + 'ERROR: Algorithm ' + + algorithm.did + + ' is not allowed by ' + + datasetResolved.did ) return false } @@ -526,22 +524,20 @@ export class Compute extends Instantiable { searchPreviousOrders = true ): SubscribablePromise { return new SubscribablePromise(async (observer) => { - const datasetDdo = isDdo(dataset) - ? dataset - : await this.ocean.assets.resolve(dataset) + const { ddo } = await assetResolve(dataset) // first check if we can order this - const allowed = await this.isOrderable(datasetDdo, serviceIndex, algorithm) + const allowed = await this.isOrderable(ddo, serviceIndex, algorithm) if (!allowed) throw new Error( `Dataset order failed, dataset is not orderable with the specified algorithm` ) // const service: Service = ddo.findServiceByType('compute') - const service: Service = datasetDdo.findServiceById(serviceIndex) + const service: Service = ddo.findServiceById(serviceIndex) if (!service) throw new Error(`Dataset order failed, Could not find service for the DDO`) try { const order = await this.ocean.assets.order( - datasetDdo, + ddo, service.type, consumerAccount, -1, diff --git a/src/provider/Provider.ts b/src/provider/Provider.ts index 760d2a27..ceaed830 100644 --- a/src/provider/Provider.ts +++ b/src/provider/Provider.ts @@ -1,5 +1,5 @@ import Account from '../ocean/Account' -import { noZeroX } from '../utils' +import { noZeroX, assetResolve, AssetResolver } from '../utils' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { File } from '../ddo/interfaces/File' import { @@ -8,8 +8,6 @@ import { ComputeOutput, ComputeAlgorithm } from '../ocean/interfaces/Compute' -import { MetadataAlgorithm } from '../ddo/interfaces/MetadataAlgorithm' -import { Versions } from '../ocean/Versions' import { DDO } from '../ddo/DDO' import DID from '../ocean/DID' import { Service } from '../ddo/interfaces' @@ -19,9 +17,7 @@ export interface ServiceEndpoint { method: string urlPath: string } -function isDdo(arg: any): arg is DDO { - return arg.id !== undefined -} + /** * Provides an interface for provider service. * Provider service is the technical component executed @@ -194,12 +190,12 @@ export class Provider extends Instantiable { serviceType: string, consumerAddress: string ): Promise { - const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) + const { did, ddo } = await assetResolve(asset) let initializeUrl = this.getInitializeEndpoint() ? this.getInitializeEndpoint().urlPath : null if (!initializeUrl) return null - initializeUrl += `?documentId=${ddo.id}` + initializeUrl += `?documentId=${did}` initializeUrl += `&serviceId=${serviceIndex}` initializeUrl += `&serviceType=${serviceType}` initializeUrl += `&dataToken=${ddo.dataToken}` diff --git a/src/utils/index.ts b/src/utils/index.ts index ccf439a7..922ac466 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -5,3 +5,4 @@ export * from './GeneratorHelpers' export * from './SubscribablePromise' export * from './SubscribableObserver' export * from './GasUtils' +export * from './AssetResolverHelper'