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",
"save-file": "^2.3.1",
"uuid": "^8.3.2",
"web3": "^1.3.6",
"web3": "^1.3.5",
"web3-eth-contract": "^1.3.6"
},
"devDependencies": {

View File

@ -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<string>} Returns eth address
*/
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 { 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<Service> {
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<Service> {
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<string> {
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<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 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,

View File

@ -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<ComputeJob> {
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<ComputeJob> {
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<ComputeJob> {
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<ComputeJob> {
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<boolean> {
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<OrderProgressStep, string> {
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,

View File

@ -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<string> {
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}`

View File

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