Skip to main content

Asynchronous IPFS client library

Project description

info:

Asynchronous IPFS client library

aioipfs is a python3 library providing an asynchronous API for IPFS. Supported python versions: 3.6, 3.7, 3.8, 3.9, 3.10, 3.11.

This library supports the RPC API specifications for kubo version 0.24.0. Unit tests are run against most major go-ipfs releases and all kubo releases, see the CI section below.

See the documentation here.

https://github.com/pinnaculum/aioipfs/workflows/aioipfs-build/badge.svg https://gitlab.com/cipres/aioipfs/badges/master/pipeline.svg

Installation

pip install aioipfs

By default the json module from the standard Python library is used to decode JSON messages, but orjson will be used if it is installed:

pip install 'aioipfs[orjson]'

Usage

Client instantiation

The recommended way to specify the kubo node’s RPC API address is to pass a multiaddr.

client = aioipfs.AsyncIPFS(maddr='/ip4/127.0.0.1/tcp/5001')

client = aioipfs.AsyncIPFS(maddr='/dns4/localhost/tcp/5001')

You can also pass a multiaddr.Multiaddr instance.

from multiaddr import Multiaddr

client = aioipfs.AsyncIPFS(maddr=Multiaddr('/ip4/127.0.0.1/tcp/5001'))

Otherwise just pass host and port separately:

client = aioipfs.AsyncIPFS(host='localhost', port=5001)

client = aioipfs.AsyncIPFS(host='::1', port=5201)

Get an IPFS resource

import sys
import asyncio

import aioipfs

async def get(cid: str):
    client = aioipfs.AsyncIPFS()

    await client.get(cid, dstdir='.')
    await client.close()

loop = asyncio.get_event_loop()
loop.run_until_complete(get(sys.argv[1]))

Add some files

This example will import all files and directories specified on the command line. Note that the add API function is an asynchronous generator and therefore should be used with the async for syntax.

import sys
import asyncio

import aioipfs

async def add_files(files: list):
    client = aioipfs.AsyncIPFS()

    async for added_file in client.add(*files, recursive=True):
        print('Imported file {0}, CID: {1}'.format(
            added_file['Name'], added_file['Hash']))

    await client.close()

loop = asyncio.get_event_loop()
loop.run_until_complete(add_files(sys.argv[1:]))

You can also use the async list generator syntax:

cids = [entry['Hash'] async for entry in client.add(dir_path)]

Pubsub service

async def pubsub_serve(topic: str):
    async with aioipfs.AsyncIPFS() as cli:
        async for message in cli.pubsub.sub(topic):
            print('Received message from', message['from'])

            await cli.pubsub.pub(topic, message['data'])

Dialing a P2P service

async with aioipfs.AsyncIPFS() as client:
    async with client.p2p.dial_service(peer_id, '/x/echo') as dial:
        print(f'Dial host: {dial.maddr_host}, port: {dial.maddr_port}')

        # Connect to the service now
        ....

CI

The Gitlab CI workflow runs unit tests against the following go-ipfs/kubo releases (go here for the CI jobs overview).

  • go-ipfs >=0.11.0,<=0.13.0

  • kubo >=0.14.0,<=0.24.0

Features

Async file writing on get operations

The aiofiles library is used to asynchronously write data retrieved from the IPFS daemon when using the /api/v0/get API call, to avoid blocking the event loop. TAR extraction is done in asyncio’s threadpool.

Requirements

License

aioipfs is offered under the GNU Lesser GPL3 (LGPL3) license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aioipfs-0.6.4.tar.gz (39.0 kB view hashes)

Uploaded Source

Built Distribution

aioipfs-0.6.4-py3-none-any.whl (42.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page