mirror of
https://github.com/oceanprotocol-archive/squid-js.git
synced 2024-02-02 15:31:51 +01:00
Emit the progress of ordering a asset. #202
This commit is contained in:
parent
2e8e3d9a8f
commit
5b5ad23d7a
|
@ -36,9 +36,12 @@ describe("Consume Asset (Brizo)", () => {
|
||||||
|
|
||||||
await consumer.requestTokens(metadata.base.price)
|
await consumer.requestTokens(metadata.base.price)
|
||||||
|
|
||||||
|
const steps = []
|
||||||
agreementId = await ocean.assets.order(ddo.id, accessService.serviceDefinitionId, consumer)
|
agreementId = await ocean.assets.order(ddo.id, accessService.serviceDefinitionId, consumer)
|
||||||
|
.next(step => steps.push(step))
|
||||||
|
|
||||||
assert.isDefined(agreementId)
|
assert.isDefined(agreementId)
|
||||||
|
assert.deepEqual(steps, [0, 1, 2, 3])
|
||||||
})
|
})
|
||||||
|
|
||||||
it("should consume and store the assets", async () => {
|
it("should consume and store the assets", async () => {
|
||||||
|
|
|
@ -4,9 +4,16 @@ import { MetaData } from "../ddo/MetaData"
|
||||||
import { Service } from "../ddo/Service"
|
import { Service } from "../ddo/Service"
|
||||||
import Account from "./Account"
|
import Account from "./Account"
|
||||||
import DID from "./DID"
|
import DID from "./DID"
|
||||||
import { fillConditionsWithDDO, noZeroX } from "../utils"
|
import { fillConditionsWithDDO, noZeroX, SubscribablePromise } from "../utils"
|
||||||
import { Instantiable, InstantiableConfig } from "../Instantiable.abstract"
|
import { Instantiable, InstantiableConfig } from "../Instantiable.abstract"
|
||||||
|
|
||||||
|
export enum OrderProgressStep {
|
||||||
|
Prepared,
|
||||||
|
AgreementSent,
|
||||||
|
AgreementInitialized,
|
||||||
|
LockedPayment,
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Assets submodule of Ocean Protocol.
|
* Assets submodule of Ocean Protocol.
|
||||||
*/
|
*/
|
||||||
|
@ -199,64 +206,70 @@ export class OceanAssets extends Instantiable {
|
||||||
* @param {Account} consumer Consumer account.
|
* @param {Account} consumer Consumer account.
|
||||||
* @return {Promise<string>} Returns Agreement ID
|
* @return {Promise<string>} Returns Agreement ID
|
||||||
*/
|
*/
|
||||||
public async order(
|
public order(
|
||||||
did: string,
|
did: string,
|
||||||
serviceDefinitionId: string,
|
serviceDefinitionId: string,
|
||||||
consumer: Account,
|
consumer: Account,
|
||||||
): Promise<string> {
|
): SubscribablePromise<OrderProgressStep, string> {
|
||||||
|
|
||||||
const oceanAgreements = this.ocean.agreements
|
return new SubscribablePromise(async observer => {
|
||||||
|
const oceanAgreements = this.ocean.agreements
|
||||||
|
|
||||||
this.logger.log("Asking for agreement signature")
|
this.logger.log("Asking for agreement signature")
|
||||||
const {agreementId, signature} = await oceanAgreements.prepare(did, serviceDefinitionId, consumer)
|
const {agreementId, signature} = await oceanAgreements.prepare(did, serviceDefinitionId, consumer)
|
||||||
this.logger.log(`Agreement ${agreementId} signed`)
|
this.logger.log(`Agreement ${agreementId} signed`)
|
||||||
|
observer.next(OrderProgressStep.Prepared)
|
||||||
|
|
||||||
const ddo = await this.resolve(did)
|
const ddo = await this.resolve(did)
|
||||||
|
|
||||||
const keeper = this.ocean.keeper
|
const keeper = this.ocean.keeper
|
||||||
const templateName = ddo.findServiceByType("Access").serviceAgreementTemplate.contractName
|
const templateName = ddo.findServiceByType("Access").serviceAgreementTemplate.contractName
|
||||||
const template = keeper.getTemplateByName(templateName)
|
const template = keeper.getTemplateByName(templateName)
|
||||||
const accessCondition = keeper.conditions.accessSecretStoreCondition
|
const accessCondition = keeper.conditions.accessSecretStoreCondition
|
||||||
|
|
||||||
const paymentFlow = new Promise(async (resolve, reject) => {
|
const paymentFlow = new Promise(async (resolve, reject) => {
|
||||||
await template.getAgreementCreatedEvent(agreementId).once()
|
await template.getAgreementCreatedEvent(agreementId).once()
|
||||||
|
|
||||||
this.logger.log("Agreement initialized")
|
this.logger.log("Agreement initialized")
|
||||||
|
observer.next(OrderProgressStep.AgreementInitialized)
|
||||||
|
|
||||||
const {metadata} = ddo.findServiceByType("Metadata")
|
const {metadata} = ddo.findServiceByType("Metadata")
|
||||||
|
|
||||||
this.logger.log("Locking payment")
|
this.logger.log("Locking payment")
|
||||||
|
|
||||||
const accessGranted = accessCondition.getConditionFulfilledEvent(agreementId).once()
|
const accessGranted = accessCondition.getConditionFulfilledEvent(agreementId).once()
|
||||||
|
|
||||||
const paid = await oceanAgreements.conditions.lockReward(agreementId, metadata.base.price, consumer)
|
const paid = await oceanAgreements.conditions.lockReward(agreementId, metadata.base.price, consumer)
|
||||||
|
observer.next(OrderProgressStep.LockedPayment)
|
||||||
|
|
||||||
if (paid) {
|
if (paid) {
|
||||||
this.logger.log("Payment was OK")
|
this.logger.log("Payment was OK")
|
||||||
} else {
|
} else {
|
||||||
this.logger.error("Payment was KO")
|
this.logger.error("Payment was KO")
|
||||||
this.logger.error("Agreement ID: ", agreementId)
|
this.logger.error("Agreement ID: ", agreementId)
|
||||||
this.logger.error("DID: ", ddo.id)
|
this.logger.error("DID: ", ddo.id)
|
||||||
reject("Error on payment")
|
reject("Error on payment")
|
||||||
|
}
|
||||||
|
|
||||||
|
await accessGranted
|
||||||
|
|
||||||
|
this.logger.log("Access granted")
|
||||||
|
resolve()
|
||||||
|
})
|
||||||
|
|
||||||
|
observer.next(OrderProgressStep.AgreementSent)
|
||||||
|
this.logger.log("Sending agreement request")
|
||||||
|
await oceanAgreements.send(did, agreementId, serviceDefinitionId, signature, consumer)
|
||||||
|
this.logger.log("Agreement request sent")
|
||||||
|
|
||||||
|
try {
|
||||||
|
await paymentFlow
|
||||||
|
} catch (e) {
|
||||||
|
throw new Error("Error paying the asset.")
|
||||||
}
|
}
|
||||||
|
|
||||||
await accessGranted
|
return agreementId
|
||||||
|
|
||||||
this.logger.log("Access granted")
|
|
||||||
resolve()
|
|
||||||
})
|
})
|
||||||
|
|
||||||
this.logger.log("Sending agreement request")
|
|
||||||
await oceanAgreements.send(did, agreementId, serviceDefinitionId, signature, consumer)
|
|
||||||
this.logger.log("Agreement request sent")
|
|
||||||
|
|
||||||
try {
|
|
||||||
await paymentFlow
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error("Error paying the asset.")
|
|
||||||
}
|
|
||||||
|
|
||||||
return agreementId
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue
Block a user