diff --git a/package-lock.json b/package-lock.json index 84dd27a..9c2fa3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2350,6 +2350,11 @@ "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, + "file-saver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0.tgz", + "integrity": "sha512-cYM1ic5DAkg25pHKgi5f10ziAM7RJU37gaH1XQlyNDrtUnzhC/dfoV9zf2OmF0RMKi42jG5B0JWBnPQqyj/G6g==" + }, "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", diff --git a/package.json b/package.json index 3674063..d518620 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "eth-crypto": "^1.2.7", "eth-ecies": "^1.0.3", "ethereumjs-util": "^6.0.0", + "file-saver": "^2.0.0", "jsonwebtoken": "^8.4.0", "node-fetch": "^2.3.0", "uuid": "^3.3.2", diff --git a/src/brizo/Brizo.ts b/src/brizo/Brizo.ts index 2e455f8..fe7a465 100644 --- a/src/brizo/Brizo.ts +++ b/src/brizo/Brizo.ts @@ -15,8 +15,8 @@ export default class Brizo { return `${this.url}${apiPath}/access/purchase?` } - public getConsumeEndpoint(pubKey: string, serviceId: string, url: string) { - return `${this.url}${apiPath}/consume?pubKey=${pubKey}&serviceId=${serviceId}&url=${url}` + public getConsumeEndpoint() { + return `${this.url}${apiPath}/consume` } public getComputeEndpoint(pubKey: string, serviceId: string, algo: string, container: string) { diff --git a/src/examples/InitializeAgreement.ts b/src/examples/InitializeAgreement.ts index c7207a4..775bdb6 100644 --- a/src/examples/InitializeAgreement.ts +++ b/src/examples/InitializeAgreement.ts @@ -23,12 +23,11 @@ import * as config from "./config.json" copyrightHolder: "Met Office", encoding: "UTF-8", compression: "zip", - contentType: "text/csv", + contentType: "Application/pdf", // tslint:disable-next-line workExample: "stationId,latitude,longitude,datetime,temperature,humidity423432fsd,51.509865,-0.118092,2011-01-01T10:55:11+00:00,7.2,68", contentUrls: [ - "https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip", - "https://testocnfiles.blob.core.windows.net/testfiles/testzkp.zip", + "https://testocnfiles.blob.core.windows.net/testfiles/testzkp.pdf" ], links: [ {sample1: "http://data.ceda.ac.uk/badc/ukcp09/data/gridded-land-obs/gridded-land-obs-daily/"}, @@ -42,7 +41,7 @@ import * as config from "./config.json" } as MetaData) const ddo: DDO = await ocean.registerAsset(metaData, publisher) - Logger.log("did", ddo.id) + Logger.log("Registered asset with did:", ddo.id) const accessService = ddo.findServiceByType("Access") diff --git a/src/ocean/Ocean.ts b/src/ocean/Ocean.ts index 7ef242e..5f2fdae 100644 --- a/src/ocean/Ocean.ts +++ b/src/ocean/Ocean.ts @@ -24,7 +24,10 @@ import ServiceAgreement from "./ServiceAgreements/ServiceAgreement" import ServiceAgreementTemplate from "./ServiceAgreements/ServiceAgreementTemplate" import Access from "./ServiceAgreements/Templates/Access" +import { saveAs } from "file-saver" + import EventListener from "../keeper/EventListener" +import WebServiceConnectorProvider from "../utils/WebServiceConnectorProvider" export default class Ocean { @@ -100,8 +103,7 @@ export default class Ocean { { type: template.templateName, purchaseEndpoint: brizo.getPurchaseEndpoint(), - serviceEndpoint: brizo.getConsumeEndpoint(publisher.getId(), - accessServiceDefinitionId, metadata.base.contentUrls[0]), + serviceEndpoint: brizo.getConsumeEndpoint(), // the id of the service agreement? serviceDefinitionId: accessServiceDefinitionId, // the id of the service agreement template @@ -186,7 +188,34 @@ export default class Ocean { metadataService.metadata.base.price, consumer, ) - Logger.log("Paid asset") + Logger.log("Completed asset payment, now access should be granted.") + }) + const accessEvent: ContractEvent = EventListener.subscribe( + accessService.conditions[1].contractName, + accessService.conditions[1].events[1].name, {}) + accessEvent.listenOnce(async (data) => { + Logger.log("Awesome; got a AccessGranted Event. Let's download the asset files.") + const webConnector = WebServiceConnectorProvider.getConnector() + const contentUrls = await SecretStoreProvider.getSecretStore() + .decryptDocument(id, metadataService.metadata.base.contentUrls[0]) + const serviceUrl: string = accessService.serviceEndpoint + Logger.log("Consuming asset files using service url: ", serviceUrl) + for (const cUrl of contentUrls) { + let url: string = serviceUrl + `?url=${cUrl}` + url = url + `&serviceAgreementId=${serviceAgreementId}` + url = url + `&consumerAddress=${consumer.getId()}` + Logger.log("Fetching asset from: ", url) + const response: any = await webConnector.get(url) + const blob: object = await response.blob() + // Logger.log("response: ", response.headers, response) + const parts: string[] = cUrl.split("/") + const filename: string = parts[parts.length - 1] + Logger.log("got blob: ", filename, blob) + // :FIXME: this does not save the file, debug and fix + saveAs(blob, "./downloads/" + filename) + Logger.log("saved file to:", "./downloads/" + filename) + } + Logger.log("Done downloading asset files.") }) return {