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

246 lines
8.9 KiB
TypeScript
Raw Normal View History

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-05 14:56:14 +01:00
import DDOCondition from "../ddo/Condition"
2018-11-05 10:01:58 +01:00
import DDO from "../ddo/DDO"
import Event from "../ddo/Event"
import EventHandlers from "../ddo/EventHandlers"
import MetaData from "../ddo/MetaData"
2018-11-05 14:56:14 +01:00
import Parameter from "../ddo/Parameter"
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-20 10:43:11 +01:00
import InputType from "../models/InputType"
import ValueType from "../models/ValueType"
2018-11-09 10:43:29 +01:00
import SecretStoreProvider from "../secretstore/SecretStoreProvider"
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-05 14:56:14 +01:00
import Condition from "./ServiceAgreements/Condition"
import ServiceAgreement from "./ServiceAgreements/ServiceAgreement"
2018-11-05 14:56:14 +01:00
import ServiceAgreementTemplate from "./ServiceAgreements/ServiceAgreementTemplate"
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)
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-10-17 10:12:40 +02:00
private keeper: Keeper
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)
}
public async registerAsset(metadata: MetaData, publisher: Account): Promise<DDO> {
const {didRegistry} = this.keeper
const aquarius = AquariusProvider.getAquarius()
const brizo = BrizoProvider.getBrizo()
const id: string = IdGenerator.generateId()
const did: string = `did:op:${id}`
const serviceDefinitionId: string = IdGenerator.generatePrefixedId()
2018-10-16 14:56:18 +02:00
metadata.base.contentUrls =
await SecretStoreProvider.getSecretStore().encryptDocument(id, metadata.base.contentUrls)
2018-11-07 15:05:16 +01:00
const template = new Access()
const serviceAgreementTemplate = new ServiceAgreementTemplate(template)
2018-11-05 10:01:58 +01:00
// get condition keys from template
const conditions: Condition[] = await serviceAgreementTemplate.getConditions()
2018-11-05 10:01:58 +01:00
// create ddo conditions out of the keys
const ddoConditions: DDOCondition[] = conditions.map((condition: Condition, index: number): DDOCondition => {
const events: Event[] = [
{
name: "PaymentReleased",
actorType: [
"consumer",
],
handlers: {
moduleName: "serviceAgreement",
functionName: "fulfillAgreement",
version: "0.1",
} as EventHandlers,
} as Event,
]
2018-11-20 10:43:11 +01:00
const mapParameterValueToName = (name) => {
switch (name) {
case "price":
return metadata.base.price
case "assetId":
return "0x" + id
case "documentKeyId":
return "0x1234"
}
return null
}
const parameters: Parameter[] = condition.methodReflection.inputs.map((input: InputType) => {
return {
2018-11-20 10:43:11 +01:00
name: input.name,
type: input.type,
value: mapParameterValueToName(input.name),
} as Parameter
})
2018-11-20 10:43:11 +01:00
// Logger.log(`${condition.methodReflection.contractName}.${condition.methodReflection.methodName}`,
// JSON.stringify(parameters, null, 2))
2018-11-05 10:01:58 +01:00
return {
contractName: condition.methodReflection.contractName,
methodName: condition.methodReflection.methodName,
timeout: condition.timeout,
index,
2018-11-05 14:56:14 +01:00
conditionKey: condition.condtionKey,
parameters,
events,
dependencies: condition.dependencies,
dependencyTimeoutFlags: condition.dependencyTimeoutFlags,
isTerminalCondition: condition.isTerminalCondition,
2018-11-05 14:56:14 +01:00
} as DDOCondition
2018-11-05 10:01:58 +01:00
})
const serviceEndpoint = aquarius.getServiceEndpoint(did)
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: [{
type: "RsaSignatureAuthentication2018",
publicKey: did + "#keys-1",
2018-11-09 10:43:29 +01:00
} as Authentication],
id: did,
publicKey: [
{
id: did + "#keys-1",
},
{
type: "Ed25519VerificationKey2018",
},
{
owner: did,
},
{
publicKeyBase58: await publisher.getPublicKey(),
},
],
2018-11-05 10:01:58 +01:00
service: [
{
type: template.templateName,
purchaseEndpoint: brizo.getPurchaseEndpoint(),
serviceEndpoint: brizo.getConsumeEndpoint(publisher.getId(),
2018-11-12 08:33:19 +01:00
serviceDefinitionId, metadata.base.contentUrls[0]),
2018-11-05 10:01:58 +01:00
// the id of the service agreement?
serviceDefinitionId,
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(),
conditions: ddoConditions,
2018-11-05 10:01:58 +01:00
} as Service,
{
type: "Compute",
serviceEndpoint: brizo.getComputeEndpoint(publisher.getId(),
serviceDefinitionId, "xxx", "xxx"),
} as Service,
{
type: "Metadata",
serviceEndpoint,
metadata,
} as Service,
2018-11-05 10:01:58 +01:00
],
})
const storedDdo = await aquarius.storeDDO(ddo)
2018-10-05 12:34:31 +02:00
2018-11-14 09:36:37 +01:00
await didRegistry.registerAttribute(id, ValueType.DID, "Metadata", serviceEndpoint, publisher.getId())
return storedDdo
}
2018-11-14 15:44:25 +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
try {
2018-11-14 15:44:25 +01:00
const serviceAgreementSignature: string = await ServiceAgreement.signServiceAgreement(id,
ddo, serviceDefinitionId, serviceAgreementId, consumer)
return {
serviceAgreementId,
serviceAgreementSignature,
}
} catch (err) {
2018-11-12 08:33:19 +01:00
Logger.error("Signing ServiceAgreement failed!", err)
}
2018-11-12 08:33:19 +01:00
}
2018-11-19 12:16:11 +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())
Logger.log(result)
}
2018-11-14 15:44:25 +01:00
public async executeServiceAgreement(did: string, serviceDefinitionId: string, serviceAgreementId: string,
serviceAgreementSignature: string, consumer: Account, publisher: Account)
: Promise<ServiceAgreement> {
const ddo = await AquariusProvider.getAquarius().retrieveDDO(did)
const id = did.replace("did:op:", "")
2018-11-12 08:33:19 +01:00
const serviceAgrement: ServiceAgreement = await ServiceAgreement.executeServiceAgreement(id,
2018-11-14 15:44:25 +01:00
ddo, serviceDefinitionId, serviceAgreementId, serviceAgreementSignature, consumer, publisher)
2018-11-12 08:33:19 +01:00
return serviceAgrement
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[]> {
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[]> {
return AquariusProvider.getAquarius().queryMetadataByText({
text,
2018-11-12 08:33:19 +01:00
page: 0,
offset: 100,
query: {
value: 1,
},
sort: {
value: 1,
},
} as SearchQuery)
2018-11-05 14:58:58 +01:00
}
2018-10-05 12:34:31 +02:00
}