1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00
squid-js/src/ocean/Ocean.ts
Sebastian Gerske 6df097ea8f added brizo
2018-11-09 10:43:29 +01:00

163 lines
5.7 KiB
TypeScript

import Aquarius from "../aquarius/Aquarius"
import AquariusProvider from "../aquarius/AquariusProvider"
import SearchQuery from "../aquarius/query/SearchQuery"
import Brizo from "../brizo/Brizo"
import BrizoProvider from "../brizo/BrizoProvider"
import ConfigProvider from "../ConfigProvider"
import Authentication from "../ddo/Authentication"
import DDOCondition from "../ddo/Condition"
import DDO from "../ddo/DDO"
import MetaData from "../ddo/MetaData"
import Parameter from "../ddo/Parameter"
import Service from "../ddo/Service"
import Keeper from "../keeper/Keeper"
import Web3Provider from "../keeper/Web3Provider"
import Config from "../models/Config"
import ValuePair from "../models/ValuePair"
import ValueType from "../models/ValueType"
import SecretStoreProvider from "../secretstore/SecretStoreProvider"
import Account from "./Account"
import IdGenerator from "./IdGenerator"
import Condition from "./ServiceAgreements/Condition"
import ServiceAgreement from "./ServiceAgreements/ServiceAgreement"
import ServiceAgreementTemplate from "./ServiceAgreements/ServiceAgreementTemplate"
import Access from "./ServiceAgreements/Templates/Access"
export default class Ocean {
public static async getInstance(config: Config) {
if (!Ocean.instance) {
ConfigProvider.setConfig(config)
Ocean.instance = new Ocean()
Ocean.instance.keeper = await Keeper.getInstance()
Ocean.instance.aquarius = await AquariusProvider.getAquarius()
Ocean.instance.brizo = await BrizoProvider.getBrizo()
}
return Ocean.instance
}
private static instance = null
private keeper: Keeper
private aquarius: Aquarius
private brizo: Brizo
private constructor() {
}
public async getAccounts(): Promise<Account[]> {
// retrieve eth accounts
const ethAccounts = await Web3Provider.getWeb3().eth.getAccounts()
return ethAccounts.map((address: string) => new Account(address))
}
public async registerAsset(metadata: MetaData, publisher: Account): Promise<DDO> {
const {didRegistry} = this.keeper
const id: string = IdGenerator.generateId()
const did: string = `did:op:${id}`
const serviceDefinitionId: string = IdGenerator.generatePrefixedId()
metadata.base.contentUrls = await Promise.all(metadata.base.contentUrls.map(async (contentUrl) => {
const encryptedUrl: string = await SecretStoreProvider.getSecretStore().encryptDocument(id, contentUrl)
return encryptedUrl
}))
const template = new Access()
const serviceAgreementTemplate = new ServiceAgreementTemplate(template)
// get condition keys from template
const conditions: Condition[] = await serviceAgreementTemplate.getConditions()
// create ddo conditions out of the keys
const ddoConditions: DDOCondition[] = conditions.map((condition: Condition): DDOCondition => {
return {
name: condition.methodReflection.methodName,
timeout: condition.timeout,
conditionKey: condition.condtionKey,
parameters: condition.methodReflection.inputs.map((input: ValuePair) => {
return {
...input,
value: "xxx",
} as Parameter
}),
} as DDOCondition
})
const serviceEndpoint = this.aquarius.getServiceEndpoint(did)
// create ddo itself
const ddo: DDO = new DDO({
id: did,
authentication: [{
publicKey: publisher.getId(),
} as Authentication],
service: [
{
type: template.templateName,
// tslint:disable-next-line
serviceEndpoint: this.brizo.getServiceEndpoint(publisher.getId(),
serviceDefinitionId, metadata.base.contentUrls[0]),
purchaseEndpoint: this.brizo.getPurchaseEndpoint(),
// the id of the service agreement?
serviceDefinitionId,
// the id of the service agreement template
templateId: serviceAgreementTemplate.getId(),
conditions: ddoConditions,
} as Service,
{
serviceEndpoint,
metadata,
} as Service,
],
})
// Logger.log(JSON.stringify(ddo, null, 2))
const storedDdo = await this.aquarius.storeDDO(ddo)
await didRegistry.registerAttribute(id, ValueType.DID, "Metadata", serviceEndpoint,
publisher.getId())
return storedDdo
}
public async purchase(did: string, consumer: Account): Promise<ServiceAgreement> {
const ddo = await AquariusProvider.getAquarius().retrieveDDO(did)
const id = did.replace("did:op:", "")
const serviceAgreementId: string = IdGenerator.generateId()
const serviceAgreement: ServiceAgreement = await ServiceAgreement.signServiceAgreement(id,
// todo get publisher from ddo
ddo, serviceAgreementId, consumer, new Account())
return serviceAgreement
}
public async searchAssets(query: SearchQuery): Promise<any[]> {
return this.aquarius.queryMetadata(query)
}
public async searchAssetsByText(text: string): Promise<any[]> {
return this.aquarius.queryMetadataByText({
text,
page: 1,
offset: 100,
query: {
value: 1,
},
sort: {
value: 1,
},
} as SearchQuery)
}
}