2018-10-25 17:26:26 +02:00
|
|
|
import AquariusProvider from "../aquarius/AquariusProvider"
|
2018-11-05 10:01:58 +01:00
|
|
|
import SearchQuery from "../aquarius/query/SearchQuery"
|
2018-11-09 10:43:29 +01:00
|
|
|
import BrizoProvider from "../brizo/BrizoProvider"
|
2018-10-16 14:56:18 +02:00
|
|
|
import ConfigProvider from "../ConfigProvider"
|
2018-11-09 10:43:29 +01:00
|
|
|
import Authentication from "../ddo/Authentication"
|
2018-11-23 14:14:35 +01:00
|
|
|
import Condition from "../ddo/Condition"
|
2018-11-05 10:01:58 +01:00
|
|
|
import DDO from "../ddo/DDO"
|
2018-11-07 14:33:56 +01:00
|
|
|
import MetaData from "../ddo/MetaData"
|
2018-11-05 10:01:58 +01:00
|
|
|
import Service from "../ddo/Service"
|
2018-10-05 12:34:31 +02:00
|
|
|
import Keeper from "../keeper/Keeper"
|
2018-10-16 14:56:18 +02:00
|
|
|
import Web3Provider from "../keeper/Web3Provider"
|
2018-10-25 17:18:57 +02:00
|
|
|
import Config from "../models/Config"
|
2018-11-07 14:33:56 +01:00
|
|
|
import ValueType from "../models/ValueType"
|
2018-11-09 10:43:29 +01:00
|
|
|
import SecretStoreProvider from "../secretstore/SecretStoreProvider"
|
2018-11-12 12:09:42 +01:00
|
|
|
import Logger from "../utils/Logger"
|
2018-10-05 12:34:31 +02:00
|
|
|
import Account from "./Account"
|
2018-10-26 13:37:09 +02:00
|
|
|
import IdGenerator from "./IdGenerator"
|
2018-11-07 14:33:56 +01:00
|
|
|
import ServiceAgreement from "./ServiceAgreements/ServiceAgreement"
|
2018-11-05 14:56:14 +01:00
|
|
|
import ServiceAgreementTemplate from "./ServiceAgreements/ServiceAgreementTemplate"
|
2018-11-05 17:50:56 +01:00
|
|
|
import Access from "./ServiceAgreements/Templates/Access"
|
2018-10-05 12:34:31 +02:00
|
|
|
|
|
|
|
export default class Ocean {
|
|
|
|
|
2018-10-25 17:18:57 +02:00
|
|
|
public static async getInstance(config: Config) {
|
2018-10-16 14:56:18 +02:00
|
|
|
|
|
|
|
if (!Ocean.instance) {
|
2018-10-26 10:40:46 +02:00
|
|
|
ConfigProvider.setConfig(config)
|
2018-11-06 16:23:48 +01:00
|
|
|
Ocean.instance = new Ocean()
|
|
|
|
Ocean.instance.keeper = await Keeper.getInstance()
|
2018-10-16 14:56:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return Ocean.instance
|
2018-10-05 12:34:31 +02:00
|
|
|
}
|
|
|
|
|
2018-10-16 14:56:18 +02:00
|
|
|
private static instance = null
|
2018-11-06 16:23:48 +01:00
|
|
|
|
2018-10-17 10:12:40 +02:00
|
|
|
private keeper: Keeper
|
|
|
|
|
2018-11-06 16:23:48 +01:00
|
|
|
private constructor() {
|
2018-10-17 10:12:40 +02:00
|
|
|
}
|
2018-10-16 14:56:18 +02:00
|
|
|
|
|
|
|
public async getAccounts(): Promise<Account[]> {
|
|
|
|
|
|
|
|
// retrieve eth accounts
|
|
|
|
const ethAccounts = await Web3Provider.getWeb3().eth.getAccounts()
|
|
|
|
|
2018-10-17 10:12:40 +02:00
|
|
|
return ethAccounts.map((address: string) => new Account(address))
|
2018-10-16 14:56:18 +02:00
|
|
|
}
|
|
|
|
|
2018-11-19 12:16:11 +01:00
|
|
|
public async resolveDID(did): Promise<DDO> {
|
|
|
|
|
|
|
|
return AquariusProvider.getAquarius().retrieveDDO(did)
|
|
|
|
}
|
|
|
|
|
2018-11-07 14:33:56 +01:00
|
|
|
public async registerAsset(metadata: MetaData, publisher: Account): Promise<DDO> {
|
|
|
|
|
|
|
|
const {didRegistry} = this.keeper
|
2018-11-12 12:09:42 +01:00
|
|
|
const aquarius = AquariusProvider.getAquarius()
|
|
|
|
const brizo = BrizoProvider.getBrizo()
|
2018-11-07 14:33:56 +01:00
|
|
|
|
2018-11-23 09:17:30 +01:00
|
|
|
const assetId: string = IdGenerator.generateId()
|
|
|
|
const did: string = `did:op:${assetId}`
|
2018-11-23 12:40:18 +01:00
|
|
|
const accessServiceDefinitionId: string = "0"
|
|
|
|
const computeServiceDefintionId: string = "1"
|
|
|
|
const metadataServiceDefinitionId: string = "2"
|
2018-10-16 14:56:18 +02:00
|
|
|
|
2018-11-12 12:09:42 +01:00
|
|
|
metadata.base.contentUrls =
|
2018-11-23 12:40:18 +01:00
|
|
|
[await SecretStoreProvider.getSecretStore().encryptDocument(assetId, metadata.base.contentUrls)]
|
2018-11-07 15:05:16 +01:00
|
|
|
|
2018-11-06 16:13:12 +01:00
|
|
|
const template = new Access()
|
|
|
|
const serviceAgreementTemplate = new ServiceAgreementTemplate(template)
|
2018-11-05 10:01:58 +01:00
|
|
|
|
2018-11-23 14:14:35 +01:00
|
|
|
const conditions: Condition[] = await serviceAgreementTemplate.getConditions(metadata, assetId)
|
2018-11-20 09:13:03 +01:00
|
|
|
|
2018-11-12 12:09:42 +01:00
|
|
|
const serviceEndpoint = aquarius.getServiceEndpoint(did)
|
2018-11-07 14:33:56 +01:00
|
|
|
|
2018-11-05 10:01:58 +01:00
|
|
|
// create ddo itself
|
|
|
|
const ddo: DDO = new DDO({
|
2018-11-09 10:43:29 +01:00
|
|
|
authentication: [{
|
2018-11-09 11:16:22 +01:00
|
|
|
type: "RsaSignatureAuthentication2018",
|
|
|
|
publicKey: did + "#keys-1",
|
2018-11-09 10:43:29 +01:00
|
|
|
} as Authentication],
|
2018-11-09 11:16:22 +01:00
|
|
|
id: did,
|
|
|
|
publicKey: [
|
|
|
|
{
|
|
|
|
id: did + "#keys-1",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type: "Ed25519VerificationKey2018",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
owner: did,
|
|
|
|
},
|
|
|
|
{
|
2018-11-16 14:26:58 +01:00
|
|
|
publicKeyBase58: await publisher.getPublicKey(),
|
2018-11-09 11:16:22 +01:00
|
|
|
},
|
|
|
|
],
|
2018-11-05 10:01:58 +01:00
|
|
|
service: [
|
|
|
|
{
|
2018-11-06 16:13:12 +01:00
|
|
|
type: template.templateName,
|
2018-11-12 12:09:42 +01:00
|
|
|
purchaseEndpoint: brizo.getPurchaseEndpoint(),
|
|
|
|
serviceEndpoint: brizo.getConsumeEndpoint(publisher.getId(),
|
2018-11-23 12:40:18 +01:00
|
|
|
accessServiceDefinitionId, metadata.base.contentUrls[0]),
|
2018-11-05 10:01:58 +01:00
|
|
|
// the id of the service agreement?
|
2018-11-23 12:40:18 +01:00
|
|
|
serviceDefinitionId: accessServiceDefinitionId,
|
2018-11-05 10:01:58 +01:00
|
|
|
// the id of the service agreement template
|
2018-11-05 14:56:14 +01:00
|
|
|
templateId: serviceAgreementTemplate.getId(),
|
2018-11-23 14:14:35 +01:00
|
|
|
conditions,
|
2018-11-05 10:01:58 +01:00
|
|
|
} as Service,
|
2018-11-09 11:16:22 +01:00
|
|
|
{
|
2018-11-16 14:26:58 +01:00
|
|
|
type: "Compute",
|
2018-11-12 12:09:42 +01:00
|
|
|
serviceEndpoint: brizo.getComputeEndpoint(publisher.getId(),
|
2018-11-23 12:40:18 +01:00
|
|
|
computeServiceDefintionId, "xxx", "xxx"),
|
|
|
|
serviceDefinitionId: computeServiceDefintionId,
|
2018-11-09 11:16:22 +01:00
|
|
|
} as Service,
|
|
|
|
{
|
|
|
|
type: "Metadata",
|
|
|
|
serviceEndpoint,
|
2018-11-23 12:40:18 +01:00
|
|
|
serviceDefinitionId: metadataServiceDefinitionId,
|
2018-11-16 14:26:58 +01:00
|
|
|
metadata,
|
2018-11-07 14:33:56 +01:00
|
|
|
} as Service,
|
2018-11-05 10:01:58 +01:00
|
|
|
],
|
|
|
|
})
|
|
|
|
|
2018-11-12 12:09:42 +01:00
|
|
|
const storedDdo = await aquarius.storeDDO(ddo)
|
2018-10-05 12:34:31 +02:00
|
|
|
|
2018-11-23 14:28:41 +01:00
|
|
|
// Logger.log(JSON.stringify(storedDdo, null, 2))
|
2018-11-23 14:14:35 +01:00
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
await didRegistry.registerAttribute(
|
2018-11-23 09:17:30 +01:00
|
|
|
assetId,
|
2018-11-21 14:59:22 +01:00
|
|
|
ValueType.DID,
|
|
|
|
"Metadata",
|
|
|
|
serviceEndpoint,
|
|
|
|
publisher.getId())
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
return storedDdo
|
|
|
|
}
|
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
public async signServiceAgreement(did: string,
|
|
|
|
serviceDefinitionId: string,
|
|
|
|
consumer: Account): Promise<any> {
|
2018-11-12 08:33:19 +01:00
|
|
|
|
|
|
|
const ddo = await AquariusProvider.getAquarius().retrieveDDO(did)
|
|
|
|
const id = did.replace("did:op:", "")
|
2018-11-14 15:44:25 +01:00
|
|
|
const serviceAgreementId: string = IdGenerator.generateId()
|
2018-11-12 08:33:19 +01:00
|
|
|
|
2018-11-12 12:09:42 +01:00
|
|
|
try {
|
2018-11-14 15:44:25 +01:00
|
|
|
const serviceAgreementSignature: string = await ServiceAgreement.signServiceAgreement(id,
|
|
|
|
ddo, serviceDefinitionId, serviceAgreementId, consumer)
|
|
|
|
return {
|
|
|
|
serviceAgreementId,
|
|
|
|
serviceAgreementSignature,
|
|
|
|
}
|
2018-11-12 12:09:42 +01:00
|
|
|
} catch (err) {
|
2018-11-12 08:33:19 +01:00
|
|
|
|
2018-11-12 12:09:42 +01:00
|
|
|
Logger.error("Signing ServiceAgreement failed!", err)
|
|
|
|
}
|
2018-11-12 08:33:19 +01:00
|
|
|
}
|
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
public async initializeServiceAgreement(did: string,
|
|
|
|
serviceDefinitionId: string,
|
|
|
|
serviceAgreementId: string,
|
|
|
|
serviceAgreementSignature: string,
|
|
|
|
consumer: Account) {
|
|
|
|
const result = await BrizoProvider
|
|
|
|
.getBrizo()
|
|
|
|
.initializeServiceAgreement(
|
|
|
|
did,
|
|
|
|
serviceAgreementId,
|
|
|
|
serviceDefinitionId,
|
|
|
|
serviceAgreementSignature,
|
|
|
|
await consumer.getPublicKey())
|
2018-11-19 12:16:11 +01:00
|
|
|
|
|
|
|
Logger.log(result)
|
|
|
|
}
|
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
public async executeServiceAgreement(did: string,
|
|
|
|
serviceDefinitionId: string,
|
|
|
|
serviceAgreementId: string,
|
|
|
|
serviceAgreementSignature: string,
|
|
|
|
consumer: Account,
|
|
|
|
publisher: Account): Promise<ServiceAgreement> {
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
const ddo = await AquariusProvider.getAquarius().retrieveDDO(did)
|
|
|
|
const id = did.replace("did:op:", "")
|
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
const serviceAgreement: ServiceAgreement = await ServiceAgreement
|
|
|
|
.executeServiceAgreement(
|
|
|
|
id,
|
|
|
|
ddo,
|
|
|
|
serviceDefinitionId,
|
|
|
|
serviceAgreementId,
|
|
|
|
serviceAgreementSignature,
|
|
|
|
consumer,
|
|
|
|
publisher)
|
2018-11-07 14:33:56 +01:00
|
|
|
|
2018-11-21 14:59:22 +01:00
|
|
|
return serviceAgreement
|
2018-10-05 12:34:31 +02:00
|
|
|
}
|
2018-10-26 10:40:46 +02:00
|
|
|
|
2018-11-12 08:33:19 +01:00
|
|
|
public async searchAssets(query: SearchQuery): Promise<DDO[]> {
|
2018-11-12 12:09:42 +01:00
|
|
|
return AquariusProvider.getAquarius().queryMetadata(query)
|
2018-10-26 10:40:46 +02:00
|
|
|
}
|
2018-11-05 14:58:58 +01:00
|
|
|
|
2018-11-12 08:33:19 +01:00
|
|
|
public async searchAssetsByText(text: string): Promise<DDO[]> {
|
2018-11-12 12:09:42 +01:00
|
|
|
return AquariusProvider.getAquarius().queryMetadataByText({
|
2018-11-05 17:50:56 +01:00
|
|
|
text,
|
2018-11-12 08:33:19 +01:00
|
|
|
page: 0,
|
2018-11-05 17:50:56 +01:00
|
|
|
offset: 100,
|
|
|
|
query: {
|
2018-11-07 14:33:56 +01:00
|
|
|
value: 1,
|
2018-11-05 17:50:56 +01:00
|
|
|
},
|
|
|
|
sort: {
|
2018-11-07 14:33:56 +01:00
|
|
|
value: 1,
|
|
|
|
},
|
2018-11-05 17:50:56 +01:00
|
|
|
} as SearchQuery)
|
2018-11-05 14:58:58 +01:00
|
|
|
}
|
2018-10-05 12:34:31 +02:00
|
|
|
}
|