From 1b26f4c1b37cfe29f0dcc6d42f9ccbbcd1e7f110 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Tue, 30 Mar 2021 12:33:44 +0100 Subject: [PATCH] feat: store metadata in IPLD CBOR format --- client/package.json | 11 ++++++----- client/src/lib.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/client/package.json b/client/package.json index c350806dc8..42ff362254 100644 --- a/client/package.json +++ b/client/package.json @@ -33,6 +33,7 @@ "prepare": "npm run build" }, "dependencies": { + "@ipld/dag-cbor": "^4.0.0", "@web-std/blob": "2.0.1", "@web-std/fetch": "1.0.0", "@web-std/file": "1.0.1", @@ -40,20 +41,20 @@ }, "devDependencies": { "@ssttevee/multipart-parser": "0.1.8", - "uvu": "0.5.1", - "mocha": "8.3.2", "@types/mocha": "8.2.1", "ipfs-unixfs-importer": "6.0.1", "ipld": "0.29.0", "ipld-dag-pb": "0.22.0", "ipld-in-memory": "8.0.0", + "mocha": "8.3.2", "multicodec": "3.0.1", - "multiformats": "4.5.3", + "multiformats": "^4.5.3", "multihashing-async": "2.1.2", "playwright-test": "2.1.0", - "typedoc": "0.20.32", "rollup": "2.22.1", - "rollup-plugin-multi-input": "1.1.1" + "rollup-plugin-multi-input": "1.1.1", + "typedoc": "0.20.32", + "uvu": "0.5.1" }, "homepage": "https://github.com/ipfs-shipyard/nft.storage/tree/main/client", "bugs": "https://github.com/ipfs-shipyard/nft.storage/issues" diff --git a/client/src/lib.js b/client/src/lib.js index 031d2800b5..e802db4997 100644 --- a/client/src/lib.js +++ b/client/src/lib.js @@ -14,6 +14,8 @@ * @module */ +import cbor from '@ipld/dag-cbor' +import { CID } from 'multiformats' import * as API from './lib/interface.js' import { fetch, File, Blob, FormData } from './platform.js' @@ -112,6 +114,39 @@ class NFTStorage { } } + /** + * @param {API.Service} service + * @param {any} metadata + * @returns {Promise} + */ + static async storeMetadata(service, metadata) { + /** + * @param {any} obj + * @returns {Promise} + */ + async function transform (obj) { + if (Array.isArray(obj)) { + return Promise.all(obj.map(transform)) + } + if (obj instanceof File) { + return NFTStorage.storeDirectory(service, [obj]) + } + if (obj instanceof Blob) { + return NFTStorage.storeBlob(service, obj) + } + if (typeof obj === 'object') { + const ents = await Promise.all(Object.entries(obj).map(async ([k, v]) => ([k, await transform(v)]))) + return Object.fromEntries(ents) + } + return obj + } + metadata = await transform(metadata) + const cid = await NFTStorage.storeBlob(service, new Blob([cbor.encode(metadata)])) + console.log(cid) + const mh = CID.parse(cid).multihash + return CID.createV1(cbor.code, mh).toString() + } + /** * @param {API.Service} service * @param {string} cid @@ -175,6 +210,13 @@ class NFTStorage { storeBlob(blob) { return NFTStorage.storeBlob(this, blob) } + /** + * Stores a metadata object as an IPLD CBOR encoded DAG. + * @param {any} metadata + */ + storeMetadata(metadata) { + return NFTStorage.storeMetadata(this, metadata) + } /** * Stores a directory of files and returns a CID for the directory. *