// // IPFS - Interplanetary File System // // https://ipfs.tech/ // // https://github.com/exmgr/ipfs-client-esp32 // // https://developers.cloudflare.com/web3/ // // https://web3.storage/ // // https://docs.ipfs.tech/reference/kubo/rpc/#getting-started // // https://www.sciencedirect.com/science/article/pii/S1877042811023998 // // // // https://ipfs.io or https://cloudflare-ipfs.com. // // https://ipfs.github.io/public-gateway-checker/ // // // // List Directory // // https://ipfs.io/api/v0/ls?arg=QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi // // https://dweb.link/api/v0/ls?arg=QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi // // // // List Directory from root CID // // https://dweb.link/api/v0/ls?arg=QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9 // // // // Download File Directly // // https://ipfs.io/ipfs/QmYuvTLSEmreSvz13zoFEofD7zWNoDBSbESkEZkdovEDTG // // https://dweb.link/ipfs/QmYuvTLSEmreSvz13zoFEofD7zWNoDBSbESkEZkdovEDTG?filename=1000+miler.d64 // // https://dweb.link/api/v0/get?arg=QmYuvTLSEmreSvz13zoFEofD7zWNoDBSbESkEZkdovEDTG // // // // Download File from root CID with path // // https://dweb.link/ipfs/QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9/1000%20miler.d64 // // // // Download File with byte ranges // // read first 20 bytes of a file // // https://dweb.link/api/v0/cat?arg=QmTSGxVkFCshrgCsuZhrmk2ucuRXToEvsRXxM9vwvJWiMp&offset=0&length=20 // // // // File Stat // // https://dweb.link/api/v0/object/stat?arg=QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9/1000%20miler.d64 // // IPFS://localhost:8080/api/v0/object/stat?arg=QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9/1000%20miler.d64 // // NumLinks = 0, it is a file // // DataSize = {file_size} + 10 bytes // // // // https://github.com/ipfs/kubo/issues/8528 // // // // IPFS HEAD to determine DIR or FILE // // content-type: text/html // // etag: "DIRIndex-*" = Directory // // https://ipfs.io/ipfs/QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9 // // // // content-type: application/octet-stream = File // // content-length: >0 = File // // https://ipfs.io/ipfs/QmbpUikCNvAbtUCgqvjMiKRFZbbNRAeg8V2KVyVqmtp7Fi/0-9/1000 miler.d64 // // // // OTHER IMPLEMENTATIONS // // https://dat-ecosystem.org/ // // https://hypercore-protocol.org/ // // // // // #ifndef MEATLOAF_SCHEME_IPFS // #define MEATLOAF_SCHEME_IPFS // #include "network/http.h" // #include "../../../include/debug.h" // #include "peoples_url_parser.h" // /******************************************************** // * File // ********************************************************/ // class IPFSFile: public HttpFile { // public: // IPFSFile(std::string path): HttpFile(path) { // //this->url = "https://dweb.link/ipfs/" + this->host + "/" + this->path; // this->url = "https://ipfs.io/ipfs/" + this->host + "/" + this->path; // resetURL(this->url); // Debug_printv("url[%s]", this->url.c_str()); // }; // ~IPFSFile() {}; // MStream* getSourceStream(std::ios_base::openmode mode=std::ios_base::in) override; // file on IPFS server = standard HTTP file available via GET // }; // /******************************************************** // * Streams // ********************************************************/ // class IPFSIStream: public HttpIStream { // public: // IPFSIStream(std::string path) : HttpIStream(path) {}; // ~IPFSIStream() {}; // bool open() override; // bool seek(uint32_t pos) override; // }; // /******************************************************** // * FS // ********************************************************/ // class IPFSFileSystem: public MFileSystem // { // MFile* getFile(std::string path) override { // // Debug_printv("IPFSFileSystem::getFile(%s)", path.c_str()); // return new IPFSFile(path); // } // bool handles(std::string name) { // std::string pattern = "ipfs:"; // return mstr::startsWith(name, pattern.c_str(), false); // } // public: // IPFSFileSystem(): MFileSystem("ipfs") {}; // }; // #endif // MEATLOAF_SCHEME_IPFS