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

Fix get compute results (#1386)

* wip special chars

* clean ups

* update sha256 import from cryptojs lib

* update compute result and use alpha-26 contracts

* re-build with package-lock v1 and with dist

* ignore build files from dist

* delete build files

* removed console logs and updated ComputeResultType typing

* update compute integration test

* added more tests

* added some logs

* update file download method

* use fetch data

* remove download part

* delete console logs

* review fixes

* more fixes

Co-authored-by: Soon Huat <soon_huat.phan@daimler.com>
This commit is contained in:
Bogdan Fazakas 2022-04-15 01:58:25 +03:00 committed by GitHub
parent 80bf5cc33f
commit ec601a66d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 71 additions and 63 deletions

2
package-lock.json generated
View File

@ -29865,4 +29865,4 @@
"dev": true "dev": true
} }
} }
} }

View File

@ -40,6 +40,7 @@
"test:unit:cover": "nyc --report-dir coverage/unit npm run test:unit", "test:unit:cover": "nyc --report-dir coverage/unit npm run test:unit",
"test:integration": "npm run mocha -- 'test/integration/**/*.test.ts'", "test:integration": "npm run mocha -- 'test/integration/**/*.test.ts'",
"test:provider": "npm run mocha -- 'test/integration/Provider.test.ts'", "test:provider": "npm run mocha -- 'test/integration/Provider.test.ts'",
"test:compute": "npm run mocha -- 'test/integration/ComputeFlow.test.ts'",
"test:integration:cover": "nyc --report-dir coverage/integration --no-clean npm run test:integration" "test:integration:cover": "nyc --report-dir coverage/integration --no-clean npm run test:integration"
}, },
"repository": { "repository": {

View File

@ -1,6 +1,10 @@
import { Metadata, MetadataAlgorithm } from './DDO/Metadata' import { Metadata, MetadataAlgorithm } from './DDO/Metadata'
export type ComputeResultType = 'algorithmLog' | 'output' export type ComputeResultType =
| 'algorithmLog'
| 'output'
| 'configrationLog'
| 'publishLog'
export interface ComputeEnvironment { export interface ComputeEnvironment {
id: string id: string

View File

@ -1,5 +1,5 @@
import Web3 from 'web3' import Web3 from 'web3'
import { LoggerInstance, getData, downloadFile, downloadFileBrowser } from '../utils' import { LoggerInstance, getData } from '../utils'
import { import {
FileMetadata, FileMetadata,
ComputeJob, ComputeJob,
@ -11,7 +11,6 @@ import {
} from '../@types/' } from '../@types/'
import { noZeroX } from '../utils/ConversionTypeHelper' import { noZeroX } from '../utils/ConversionTypeHelper'
import fetch from 'cross-fetch' import fetch from 'cross-fetch'
import { DownloadResponse } from '../@types/DownloadResponse'
export interface HttpCallback { export interface HttpCallback {
(httpMethod: string, url: string, body: string, header: any): Promise<any> (httpMethod: string, url: string, body: string, header: any): Promise<any>
} }
@ -66,7 +65,7 @@ export class Provider {
return serviceEndpoints return serviceEndpoints
} }
/** Encrypt DDO using the Provider's own symmetric key /** Gets current nonce
* @param {string} providerUri provider uri address * @param {string} providerUri provider uri address
* @param {string} consumerAddress Publisher address * @param {string} consumerAddress Publisher address
* @param {AbortSignal} signal abort signal * @param {AbortSignal} signal abort signal
@ -142,12 +141,11 @@ export class Provider {
const path = this.getEndpointURL(serviceEndpoints, 'encrypt') const path = this.getEndpointURL(serviceEndpoints, 'encrypt')
? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath ? this.getEndpointURL(serviceEndpoints, 'encrypt').urlPath
: null : null
if (!path) return null if (!path) return null
try { try {
const response = await fetch(path, { const response = await fetch(path, {
method: 'POST', method: 'POST',
body: decodeURI(JSON.stringify(data)), body: JSON.stringify(data),
headers: { headers: {
'Content-Type': 'application/octet-stream' 'Content-Type': 'application/octet-stream'
}, },
@ -437,7 +435,7 @@ export class Provider {
const params = await response.json() const params = await response.json()
return params return params
} }
console.error('Compute start failed:', response.status, response.statusText) LoggerInstance.error('Compute start failed: ', response.status, response.statusText)
LoggerInstance.error('Payload was:', payload) LoggerInstance.error('Payload was:', payload)
return null return null
} catch (e) { } catch (e) {
@ -577,23 +575,21 @@ export class Provider {
} }
} }
/** Get status for a specific jobId/documentId/owner. /** Get compute result url
* @param {string} jobId * @param {string} providerUri The URI of the provider we want to query
* @param {number} index * @param {Web3} web3 Web3 instance
* @param {string} providerUri * @param {string} consumerAddress The consumer ethereum address
* @param {string} destination * @param {string} jobId The ID of a compute job.
* @param {Web3} web3 * @param {number} index Result index
* @param {AbortSignal} signal abort signal * @return {Promise<string>}
* @return {Promise<ComputeJob | ComputeJob[]>}
*/ */
public async computeResult( public async getComputeResultUrl(
jobId: string,
index: number,
accountId: string,
providerUri: string, providerUri: string,
web3: Web3, web3: Web3,
signal?: AbortSignal consumerAddress: string,
): Promise<DownloadResponse | void> { jobId: string,
index: number
): Promise<string> {
const providerEndpoints = await this.getEndpoints(providerUri) const providerEndpoints = await this.getEndpoints(providerUri)
const serviceEndpoints = await this.getServiceEndpoints( const serviceEndpoints = await this.getServiceEndpoints(
providerUri, providerUri,
@ -603,38 +599,24 @@ export class Provider {
? this.getEndpointURL(serviceEndpoints, 'computeResult').urlPath ? this.getEndpointURL(serviceEndpoints, 'computeResult').urlPath
: null : null
const nonce = await this.getNonce( const nonce = Date.now()
providerUri, let signatureMessage = consumerAddress
accountId,
signal,
providerEndpoints,
serviceEndpoints
)
let signatureMessage = accountId
signatureMessage += jobId signatureMessage += jobId
signatureMessage += index.toString() signatureMessage += index.toString()
signatureMessage += nonce signatureMessage += nonce
const signature = await this.signProviderRequest(web3, accountId, signatureMessage) const signature = await this.signProviderRequest(
web3,
let consumeUrl = computeResultUrl consumerAddress,
consumeUrl += `?consumerAddress=${accountId}` signatureMessage
consumeUrl += `&jobId=${jobId}` )
consumeUrl += `&index=${String(index)}`
consumeUrl += (signature && `&signature=${signature}`) || ''
if (!computeResultUrl) return null if (!computeResultUrl) return null
try { let resultUrl = computeResultUrl
if (document) { resultUrl += `?consumerAddress=${consumerAddress}`
await downloadFileBrowser(consumeUrl) resultUrl += `&jobId=${jobId}`
} else { resultUrl += `&index=${index.toString()}`
return await downloadFile(consumeUrl, index) resultUrl += `&nonce=${nonce}`
} resultUrl += (signature && `&signature=${signature}`) || ''
} catch (e) { return resultUrl
LoggerInstance.error('Error getting job result')
LoggerInstance.error(e)
throw e
}
} }
/** Deletes a compute job. /** Deletes a compute job.

View File

@ -1,5 +1,6 @@
import sha256 from 'crypto-js/sha256' import sha256 from 'crypto-js/sha256'
import Web3 from 'web3' import Web3 from 'web3'
import LoggerInstance from './Logger'
export function generateDid(erc721Address: string, chainId: number): string { export function generateDid(erc721Address: string, chainId: number): string {
erc721Address = Web3.utils.toChecksumAddress(erc721Address) erc721Address = Web3.utils.toChecksumAddress(erc721Address)
@ -8,5 +9,9 @@ export function generateDid(erc721Address: string, chainId: number): string {
} }
export function getHash(data: any): string { export function getHash(data: any): string {
return sha256(data).toString() try {
return sha256(data).toString()
} catch (e) {
LoggerInstance.error('getHash error: ', e.message)
}
} }

View File

@ -1,6 +1,5 @@
import { assert } from 'chai' import { assert } from 'chai'
import { SHA256 } from 'crypto-js' import { SHA256 } from 'crypto-js'
import console from 'console'
import { web3, getTestConfig, getAddresses } from '../config' import { web3, getTestConfig, getAddresses } from '../config'
import { import {
Config, Config,
@ -10,9 +9,10 @@ import {
NftCreateData, NftCreateData,
Datatoken, Datatoken,
getHash, getHash,
Nft Nft,
sleep
} from '../../src' } from '../../src'
import { ProviderFees, Erc20CreateParams } from '../../src/@types' import { ProviderFees, Erc20CreateParams, ComputeJob, Asset } from '../../src/@types'
const assetUrl = [ const assetUrl = [
{ {
@ -110,12 +110,15 @@ const algoDdo = {
} }
] ]
} }
let providerUrl: string
let consumerAccount: string
let computeJobId: string
let resolvedDDOAsset: Asset
describe('Simple compute tests', async () => { describe('Simple compute tests', async () => {
let config: Config let config: Config
let addresses: any let addresses: any
let aquarius: Aquarius let aquarius: Aquarius
let providerUrl: any
before(async () => { before(async () => {
config = await getTestConfig(web3) config = await getTestConfig(web3)
@ -130,7 +133,7 @@ describe('Simple compute tests', async () => {
const Factory = new NftFactory(addresses.ERC721Factory, web3) const Factory = new NftFactory(addresses.ERC721Factory, web3)
const accounts = await web3.eth.getAccounts() const accounts = await web3.eth.getAccounts()
const publisherAccount = accounts[0] const publisherAccount = accounts[0]
const consumerAccount = accounts[1] consumerAccount = accounts[1]
const chain = await web3.eth.getChainId() const chain = await web3.eth.getChainId()
const nftParamsAsset: NftCreateData = { const nftParamsAsset: NftCreateData = {
name: 'testNFT', name: 'testNFT',
@ -234,7 +237,7 @@ describe('Simple compute tests', async () => {
) )
// let's wait // let's wait
const resolvedDDOAsset = await aquarius.waitForAqua(ddo.id) resolvedDDOAsset = await aquarius.waitForAqua(ddo.id)
assert(resolvedDDOAsset, 'Cannot fetch DDO from Aquarius') assert(resolvedDDOAsset, 'Cannot fetch DDO from Aquarius')
const resolvedDDOAlgo = await aquarius.waitForAqua(algoDdo.id) const resolvedDDOAlgo = await aquarius.waitForAqua(algoDdo.id)
assert(resolvedDDOAlgo, 'Cannot fetch DDO from Aquarius') assert(resolvedDDOAlgo, 'Cannot fetch DDO from Aquarius')
@ -246,7 +249,6 @@ describe('Simple compute tests', async () => {
const computeEnvs = await ProviderInstance.getComputeEnvironments(providerUrl) const computeEnvs = await ProviderInstance.getComputeEnvironments(providerUrl)
assert(computeEnvs, 'No Compute environments found') assert(computeEnvs, 'No Compute environments found')
// we choose the first env // we choose the first env
console.log(computeEnvs)
const computeEnv = computeEnvs[0].id const computeEnv = computeEnvs[0].id
const computeConsumerAddress = computeEnvs[0].consumerAddress const computeConsumerAddress = computeEnvs[0].consumerAddress
// let's have 10 minutesof compute access // let's have 10 minutesof compute access
@ -265,7 +267,6 @@ describe('Simple compute tests', async () => {
computeEnv, computeEnv,
computeValidUntil computeValidUntil
) )
console.log(initializeDataAlgo)
const providerAlgoFees: ProviderFees = { const providerAlgoFees: ProviderFees = {
providerFeeAddress: initializeDataAlgo.providerFee.providerFeeAddress, providerFeeAddress: initializeDataAlgo.providerFee.providerFeeAddress,
providerFeeToken: initializeDataAlgo.providerFee.providerFeeToken, providerFeeToken: initializeDataAlgo.providerFee.providerFeeToken,
@ -302,7 +303,6 @@ describe('Simple compute tests', async () => {
computeEnv, computeEnv,
computeValidUntil computeValidUntil
) )
console.log(initializeData)
const providerDatasetFees: ProviderFees = { const providerDatasetFees: ProviderFees = {
providerFeeAddress: initializeData.providerFee.providerFeeAddress, providerFeeAddress: initializeData.providerFee.providerFeeAddress,
providerFeeToken: initializeData.providerFee.providerFeeToken, providerFeeToken: initializeData.providerFee.providerFeeToken,
@ -340,12 +340,28 @@ describe('Simple compute tests', async () => {
} }
) )
assert(computeJobs, 'Cannot start compute job') assert(computeJobs, 'Cannot start compute job')
const jobStatus = await ProviderInstance.computeStatus( computeJobId = computeJobs[0].jobId
})
it('Check compute status', async () => {
const jobStatus = (await ProviderInstance.computeStatus(
providerUrl, providerUrl,
consumerAccount, consumerAccount,
computeJobs[0].jobId, computeJobId,
resolvedDDOAsset.id resolvedDDOAsset.id
)) as ComputeJob
assert(jobStatus, 'Cannot retrieve compute status!')
})
it('Get download compute results url', async () => {
sleep(10000)
const downloadURL = await ProviderInstance.getComputeResultUrl(
providerUrl,
web3,
consumerAccount,
computeJobId,
0
) )
assert(jobStatus) assert(downloadURL, 'Provider getComputeResultUrl failed!')
}) })
}) })