1
0
mirror of https://github.com/oceanprotocol/ocean.js.git synced 2024-11-26 20:39:05 +01:00

added AssetResolverHelper

This commit is contained in:
Bogdan Fazakas 2021-06-08 09:08:24 +03:00
parent c9c983aaed
commit c88680f100
5 changed files with 36 additions and 54 deletions

2
package-lock.json generated
View File

@ -20,7 +20,7 @@
"node-abort-controller": "^2.0.0", "node-abort-controller": "^2.0.0",
"save-file": "^2.3.1", "save-file": "^2.3.1",
"uuid": "^8.3.2", "uuid": "^8.3.2",
"web3": "^1.3.6", "web3": "^1.3.5",
"web3-eth-contract": "^1.3.6" "web3-eth-contract": "^1.3.6"
}, },
"devDependencies": { "devDependencies": {

View File

@ -5,7 +5,7 @@ import { Service, ServiceAccess } from '../ddo/interfaces/Service'
import { EditableMetadata } from '../ddo/interfaces/EditableMetadata' import { EditableMetadata } from '../ddo/interfaces/EditableMetadata'
import Account from './Account' import Account from './Account'
import DID from './DID' import DID from './DID'
import { SubscribablePromise, didNoZeroX, didPrefixed } from '../utils' import { SubscribablePromise, didNoZeroX, didPrefixed, assetResolve } from '../utils'
import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'
import { WebServiceConnector } from './utils/WebServiceConnector' import { WebServiceConnector } from './utils/WebServiceConnector'
import BigNumber from 'bignumber.js' import BigNumber from 'bignumber.js'
@ -46,10 +46,6 @@ export interface Order {
serviceType?: string serviceType?: string
} }
function isDdo(arg: any): arg is DDO {
return arg.id !== undefined
}
/** /**
* Assets submodule of Ocean Protocol. * Assets submodule of Ocean Protocol.
*/ */
@ -414,14 +410,14 @@ export class Assets extends Instantiable {
* @return {Promise<string>} Returns eth address * @return {Promise<string>} Returns eth address
*/ */
public async creator(asset: DDO | string): Promise<string> { public async creator(asset: DDO | string): Promise<string> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
const checksum = ddo.getChecksum() const checksum = ddo.getChecksum()
const { creator, signatureValue } = ddo.proof const { creator, signatureValue } = ddo.proof
const signer = await this.ocean.utils.signature.verifyText(checksum, signatureValue) const signer = await this.ocean.utils.signature.verifyText(checksum, signatureValue)
if (signer.toLowerCase() !== creator.toLowerCase()) { if (signer.toLowerCase() !== creator.toLowerCase()) {
this.logger.warn( 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, asset: DDO | string,
serviceType: string serviceType: string
): Promise<Service> { ): Promise<Service> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { ddo } = await assetResolve(asset)
let service: Service let service: Service
const services: Service[] = ddo.service const services: Service[] = ddo.service
@ -477,7 +473,7 @@ export class Assets extends Instantiable {
asset: DDO | string, asset: DDO | string,
serviceIndex: number serviceIndex: number
): Promise<Service> { ): Promise<Service> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { ddo } = await assetResolve(asset)
let service: Service let service: Service
const services: Service[] = ddo.service const services: Service[] = ddo.service
@ -570,18 +566,11 @@ export class Assets extends Instantiable {
searchPreviousOrders = true searchPreviousOrders = true
): Promise<string> { ): Promise<string> {
let service: Service let service: Service
<<<<<<< HEAD const { ddo } = await assetResolve(asset)
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 consumable = await this.isConsumable(ddo, consumerAddress) const consumable = await this.isConsumable(ddo, consumerAddress)
if (consumable.status > 0) { if (consumable.status > 0) {
throw new Error(`Order asset failed, ` + consumable.message) throw new Error(`Order asset failed, ` + consumable.message)
} }
>>>>>>> main
if (!consumerAddress) consumerAddress = payerAddress if (!consumerAddress) consumerAddress = payerAddress
if (serviceIndex === -1) { if (serviceIndex === -1) {
@ -654,7 +643,7 @@ export class Assets extends Instantiable {
consumerAccount: Account, consumerAccount: Account,
destination: string destination: string
): Promise<string | true> { ): Promise<string | true> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
const { attributes } = ddo.findServiceByType('metadata') const { attributes } = ddo.findServiceByType('metadata')
const service = ddo.findServiceByType('access') const service = ddo.findServiceByType('access')
const { files } = attributes.main const { files } = attributes.main
@ -674,7 +663,7 @@ export class Assets extends Instantiable {
const provider = await Provider.getInstance(this.instanceConfig) const provider = await Provider.getInstance(this.instanceConfig)
await provider.setBaseUrl(serviceEndpoint) await provider.setBaseUrl(serviceEndpoint)
await provider.download( await provider.download(
ddo.id, did,
txId, txId,
tokenAddress, tokenAddress,
service.type, service.type,

View File

@ -1,5 +1,4 @@
import { DDO } from '../ddo/DDO' import { DDO } from '../ddo/DDO'
import { MetadataAlgorithm } from '../ddo/interfaces/MetadataAlgorithm'
import { import {
Service, Service,
ServiceComputePrivacy, ServiceComputePrivacy,
@ -7,7 +6,7 @@ import {
publisherTrustedAlgorithm publisherTrustedAlgorithm
} from '../ddo/interfaces/Service' } from '../ddo/interfaces/Service'
import Account from './Account' import Account from './Account'
import { SubscribablePromise } from '../utils' import { SubscribablePromise, assetResolve, AssetResolver } from '../utils'
import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'
import { import {
ComputeOutput, ComputeOutput,
@ -59,10 +58,6 @@ export const ComputeJobStatus = Object.freeze({
Deleted: 90 Deleted: 90
}) })
function isDdo(arg: any): arg is DDO {
return arg.id !== undefined
}
/** /**
* Compute submodule of Ocean Protocol. * Compute submodule of Ocean Protocol.
*/ */
@ -123,14 +118,14 @@ export class Compute extends Instantiable {
additionalInputs?: ComputeInput[] additionalInputs?: ComputeInput[]
): Promise<ComputeJob> { ): Promise<ComputeJob> {
output = this.checkOutput(consumerAccount, output) 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 service = ddo.findServiceByType('compute')
const { serviceEndpoint } = service const { serviceEndpoint } = service
if (ddo.id && txId) { if (did && txId) {
const provider = await Provider.getInstance(this.instanceConfig) const provider = await Provider.getInstance(this.instanceConfig)
await provider.setBaseUrl(serviceEndpoint) await provider.setBaseUrl(serviceEndpoint)
const computeJobsList = await provider.computeStart( const computeJobsList = await provider.computeStart(
ddo.id, did,
consumerAccount, consumerAccount,
algorithm, algorithm,
output, output,
@ -158,12 +153,12 @@ export class Compute extends Instantiable {
asset: DDO | string, asset: DDO | string,
jobId: string jobId: string
): Promise<ComputeJob> { ): Promise<ComputeJob> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
const service = ddo.findServiceByType('compute') const service = ddo.findServiceByType('compute')
const { serviceEndpoint } = service const { serviceEndpoint } = service
const provider = await Provider.getInstance(this.instanceConfig) const provider = await Provider.getInstance(this.instanceConfig)
await provider.setBaseUrl(serviceEndpoint) 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 if (computeJobsList) return computeJobsList[0] as ComputeJob
return null return null
} }
@ -181,12 +176,12 @@ export class Compute extends Instantiable {
asset: DDO | string, asset: DDO | string,
jobId: string jobId: string
): Promise<ComputeJob> { ): Promise<ComputeJob> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
const service = ddo.findServiceByType('compute') const service = ddo.findServiceByType('compute')
const { serviceEndpoint } = service const { serviceEndpoint } = service
const provider = await Provider.getInstance(this.instanceConfig) const provider = await Provider.getInstance(this.instanceConfig)
await provider.setBaseUrl(serviceEndpoint) 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 if (computeJobsList) return computeJobsList[0] as ComputeJob
return null return null
} }
@ -255,13 +250,13 @@ export class Compute extends Instantiable {
asset: DDO | string, asset: DDO | string,
jobId: string jobId: string
): Promise<ComputeJob> { ): Promise<ComputeJob> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
const service = ddo.findServiceByType('compute') const service = ddo.findServiceByType('compute')
const { serviceEndpoint } = service const { serviceEndpoint } = service
const provider = await Provider.getInstance(this.instanceConfig) const provider = await Provider.getInstance(this.instanceConfig)
await provider.setBaseUrl(serviceEndpoint) await provider.setBaseUrl(serviceEndpoint)
const computeJobsList = await provider.computeStatus( const computeJobsList = await provider.computeStatus(
ddo.id, did,
consumerAccount, consumerAccount,
jobId, jobId,
undefined, undefined,
@ -418,8 +413,8 @@ export class Compute extends Instantiable {
algorithm: ComputeAlgorithm, algorithm: ComputeAlgorithm,
algorithmDDO?: DDO algorithmDDO?: DDO
): Promise<boolean> { ): Promise<boolean> {
const datasetDdo = isDdo(dataset) ? dataset : await this.ocean.assets.resolve(dataset) const datasetResolved: AssetResolver = await assetResolve(dataset)
const service: Service = datasetDdo.findServiceById(serviceIndex) const service: Service = datasetResolved.ddo.findServiceById(serviceIndex)
if (!service) return false if (!service) return false
if (service.type === 'compute') { if (service.type === 'compute') {
if (algorithm.meta) { if (algorithm.meta) {
@ -472,7 +467,7 @@ export class Compute extends Instantiable {
) { ) {
this.logger.error( this.logger.error(
'ERROR: Algorithm container section was altered since it was added as trusted by ' + 'ERROR: Algorithm container section was altered since it was added as trusted by ' +
datasetDdo.id datasetResolved.did
) )
return false return false
} }
@ -482,7 +477,7 @@ export class Compute extends Instantiable {
) { ) {
this.logger.error( this.logger.error(
'ERROR: Algorithm files section was altered since it was added as trusted by ' + 'ERROR: Algorithm files section was altered since it was added as trusted by ' +
datasetDdo.id datasetResolved.ddo
) )
return false return false
} }
@ -492,7 +487,10 @@ export class Compute extends Instantiable {
} }
// algorithmDid was not found // algorithmDid was not found
this.logger.error( 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 return false
} }
@ -526,22 +524,20 @@ export class Compute extends Instantiable {
searchPreviousOrders = true searchPreviousOrders = true
): SubscribablePromise<OrderProgressStep, string> { ): SubscribablePromise<OrderProgressStep, string> {
return new SubscribablePromise(async (observer) => { return new SubscribablePromise(async (observer) => {
const datasetDdo = isDdo(dataset) const { ddo } = await assetResolve(dataset)
? dataset
: await this.ocean.assets.resolve(dataset)
// first check if we can order this // 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) if (!allowed)
throw new Error( throw new Error(
`Dataset order failed, dataset is not orderable with the specified algorithm` `Dataset order failed, dataset is not orderable with the specified algorithm`
) )
// const service: Service = ddo.findServiceByType('compute') // const service: Service = ddo.findServiceByType('compute')
const service: Service = datasetDdo.findServiceById(serviceIndex) const service: Service = ddo.findServiceById(serviceIndex)
if (!service) if (!service)
throw new Error(`Dataset order failed, Could not find service for the DDO`) throw new Error(`Dataset order failed, Could not find service for the DDO`)
try { try {
const order = await this.ocean.assets.order( const order = await this.ocean.assets.order(
datasetDdo, ddo,
service.type, service.type,
consumerAccount, consumerAccount,
-1, -1,

View File

@ -1,5 +1,5 @@
import Account from '../ocean/Account' import Account from '../ocean/Account'
import { noZeroX } from '../utils' import { noZeroX, assetResolve, AssetResolver } from '../utils'
import { Instantiable, InstantiableConfig } from '../Instantiable.abstract' import { Instantiable, InstantiableConfig } from '../Instantiable.abstract'
import { File } from '../ddo/interfaces/File' import { File } from '../ddo/interfaces/File'
import { import {
@ -8,8 +8,6 @@ import {
ComputeOutput, ComputeOutput,
ComputeAlgorithm ComputeAlgorithm
} from '../ocean/interfaces/Compute' } from '../ocean/interfaces/Compute'
import { MetadataAlgorithm } from '../ddo/interfaces/MetadataAlgorithm'
import { Versions } from '../ocean/Versions'
import { DDO } from '../ddo/DDO' import { DDO } from '../ddo/DDO'
import DID from '../ocean/DID' import DID from '../ocean/DID'
import { Service } from '../ddo/interfaces' import { Service } from '../ddo/interfaces'
@ -19,9 +17,7 @@ export interface ServiceEndpoint {
method: string method: string
urlPath: string urlPath: string
} }
function isDdo(arg: any): arg is DDO {
return arg.id !== undefined
}
/** /**
* Provides an interface for provider service. * Provides an interface for provider service.
* Provider service is the technical component executed * Provider service is the technical component executed
@ -194,12 +190,12 @@ export class Provider extends Instantiable {
serviceType: string, serviceType: string,
consumerAddress: string consumerAddress: string
): Promise<string> { ): Promise<string> {
const ddo = isDdo(asset) ? asset : await this.ocean.assets.resolve(asset) const { did, ddo } = await assetResolve(asset)
let initializeUrl = this.getInitializeEndpoint() let initializeUrl = this.getInitializeEndpoint()
? this.getInitializeEndpoint().urlPath ? this.getInitializeEndpoint().urlPath
: null : null
if (!initializeUrl) return null if (!initializeUrl) return null
initializeUrl += `?documentId=${ddo.id}` initializeUrl += `?documentId=${did}`
initializeUrl += `&serviceId=${serviceIndex}` initializeUrl += `&serviceId=${serviceIndex}`
initializeUrl += `&serviceType=${serviceType}` initializeUrl += `&serviceType=${serviceType}`
initializeUrl += `&dataToken=${ddo.dataToken}` initializeUrl += `&dataToken=${ddo.dataToken}`

View File

@ -5,3 +5,4 @@ export * from './GeneratorHelpers'
export * from './SubscribablePromise' export * from './SubscribablePromise'
export * from './SubscribableObserver' export * from './SubscribableObserver'
export * from './GasUtils' export * from './GasUtils'
export * from './AssetResolverHelper'