Skip to content

Lisp bindings for the IPFS HTTP API. (πŸͺž Mirror)

License

Notifications You must be signed in to change notification settings

JadedCtrl/cl-ipfs-api2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

45 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

===============================================================================
CL-IPFS-APIΒ²                                                                   
===============================================================================

:cl-ipfs-apiΒ² is a pretty simple set of IPFS bindings for Common Lisp, using
the HTTP API for (almost) everything, except for pubsub (which uses the locally
installed go-ipfs program).
It uses Drakma, YASON, and UIOP.


β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
USAGE
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
:cl-ipfs-apiΒ² is available on Quicklisp, so just run:
        > (ql:quickload :cl-ipfs-api2)

Then you can do things like:
	> (ipfs:add #p"~/.bashrc")
	"QmZweanA1JRNio6DKnPN6yECWCrxmWqqG7WWUNtyuji9hZ"

	> (ipfs:cat "/ipns/ipfs.io/index.html")
	"<!DOCTYPE html>
	……"

Most commands available are one-to-one with their API/cli counter-parts,
with a few notable exceptions:
	* #'dl	(counter-part to the /get call. the name is different, so
	         as to not conflict with #'common-lisp:get)

The calls implemented so far:
	* root (cat, add, id, ls, resolve, etc)
	* bitswap, block, bootstrap
	* cid, config (config, config/show)
	* dag, dht, diag
	* file, files, filestore
	* key, name, object
	* p2p, pin, pubsub
	* refs, repo, stats
	* swarm, urlstore
	* version (version, version/deps)

Some calls were skipped over, but wouldn't be hard to add:
	* object/put, object/set-data object/patch/append-data
	* tar calls were deliberately ignored (useless)

Functions return either strings, lists, or associative lists, depending on
context. All errors return two valuesβ€” nil and an error message (string).

Make sure to read docstrings for specific information, and keeping the API
reference handy is a good idea (/ipns/docs.ipfs.io/reference/api/http/).

β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
USEFUL VARIABLES
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
There are three exported variables:
	ipfs:*api-host*    β†’   "https://127.0.0.1:5001"
	ipfs:*api-root*    β†’   "/api/v0/"
	ipfs:*ipfs-root*   β†’   NIL

*api-host* is the protocol, host, and port of the API serverβ€” unless you're
using a custom port or remote server, this probably won't need to change.
*api-root* is the URL root of all API calls on the serverβ€” only changes under
very strange circumstances.
*ipfs-root* is the β€œroot” of the local IPFS daemon. This is only used with
the pubsub commands, since they actually invoke the local `ipfs` program.
You only need to change this variable if your $IPFS_PATH is irregular, like
"/var/ipfs/" or something weird like that.

β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
PUBSUB USAGE
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
Pubsub usage here is such an abberation that it warrants its own section.
Since there isn't a (functional) HTTP API for pubsub yet, we're using the
actual go-ipfs program from your computer.

If you don't have go-ipfs locally installed, it won't work.
If you are using Windows, or anything but *nix, it probably won't work.
If you haven't enabled pubsub (--enable-pubsub-experiment argument to daemon),
it won't work.

You can sub to a topic with, ofc, #'pubsub-sub, which will return a
UIOP-originated process-info streamβ€” while the `ipfs pubsub sub` command runs
in the background.

This stream can't be directly #'read-char or #'listen with, which is exactly
what you wanna doβ€” instead, running #'uiop/launch-program:process-info-output
on it is necessary to expose a usable stream.

To make all that easier, there's a little abstraction I added which obfuscates
UIOP use and is adequate shorthand:
	* #'pubsub-sub-read-char
	* #'pubsub-sub-listen
	* #'pubsub-sub-process
	* #'pubsub-sub-close

All of those operate on the original UIOP-originated process-info stream, and
work exactly like you'd expect.
The only weird, non-obvious one is probably #'pubsub-sub-process, which applies
#'uiop/launch-program:process-info-outputβ€” just in case you need the raw,
usable stream.

Anyway, with this, you can get a continuous read on what's going on with the
topic you're subbed to. To publish to a topic, run #'pubsub-pub with the topic
and data as arguments. Pretty simple.

Both #'pubsub-sub and #'pubsub-pub, being the only functions that run a shell
command, include an :env argument. If you supply a string as the :env argument,
that string will prefix the "ipfs" commandβ€” basically only useful for changing
something with the "env" command (like $IPFS_PATH).

Also, if you change the ipfs:*ipfs-root* variable (to the correct value of
$IPFS_PATH), the :env arguments (unless otherwise specified) will default to
"env IPFS_PATH=" + ipfs:*ipfs-root* + " > /dev/null;"


β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
BORING STUFF
β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”β€”
License is the GNU LGPLv3:
       check COPYING.txt (/ipfs/QmR8Rnk5QdXgrXRqmgMLmG5PuHZEjujfa3rfVhPV99TLY7)
Author is Jaidyn Ann <[email protected]>
Sauce is at https://hak.xwx.moe/jadedctrl/cl-ipfs-api2