Description
I often struggle using JS-IPFS in the browser because it predates all the nice web APIs that made working with binary data and files convenient. Often time this implies to using some node polyfills and / or needing to convert node constructs to browser ones so that other browser APIs can interact with it.
Here are few things that I have noticed.
-
addFile
depends on node read stream etc..
https://github.com/textileio/js-ipfs-lite/blob/0bb38fc91e10c480aef3109fde9ef98612a9c5a4/src/index.ts#L110-L124I would suggest to use web native
File
API instead which can have apath
and can be constructed in arbitrary ways.As of files bundles there is
FormData
and I think it would make more sense to us that instead. It also has advantage that web forms can directly be written to IPFS. And all this works well withfetch
andXMLHTTPRequest
stuff. -
getFile
returns nodeBuffer
. Which luckily in browser pollyfill implemented as a subclass ofUint8Array
so it is somewhat more usable. However that still implies allocating memory for the whole content etc... On the other hand web has aResponse
API available who's body can be read as string, bytes, json,FormData
or a stream. In fact it's also possible to use slices over the whole thing and also has notion ofError
. It also can be stored in browsercache
etc...
I would propose to draw inspiration from web native APIs and try to be as similar to fetch
API as possible so it can be used as a drop in replacement. Specifically I'd very much prefer following intterface:
interface Peer {
put(FormData|File|Blob):Promise<CID>
get(CID|Path):Response;
head(CID|Path):Response; // 404 if not found, 502 if network is spotty
delete(CID):Response; // Delete from local storage
}