Full Code of ipfs/kubo for AI

master ae989328a178 cached
921 files
5.7 MB
1.5M tokens
3560 symbols
1 requests
Download .txt
Showing preview only (6,152K chars total). Download the full file or copy to clipboard to get everything.
Repository: ipfs/kubo
Branch: master
Commit: ae989328a178
Files: 921
Total size: 5.7 MB

Directory structure:
gitextract__oi967oe/

├── .codeclimate.yml
├── .cspell.yml
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   ├── doc.yml
│   │   ├── enhancement.yml
│   │   └── feature.yml
│   ├── auto-comment.yml
│   ├── build-platforms.yml
│   ├── dependabot.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── changelog.yml
│       ├── codeql-analysis.yml
│       ├── dependabot-tidy.yml
│       ├── docker-check.yml
│       ├── docker-image.yml
│       ├── gateway-conformance.yml
│       ├── generated-pr.yml
│       ├── gobuild.yml
│       ├── golang-analysis.yml
│       ├── golint.yml
│       ├── gotest.yml
│       ├── interop.yml
│       ├── sharness.yml
│       ├── spellcheck.yml
│       ├── stale.yml
│       ├── sync-release-assets.yml
│       └── test-migrations.yml
├── .gitignore
├── .golangci.yml
├── .hadolint.yaml
├── .mailmap
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── FUNDING.json
├── GNUmakefile
├── LICENSE
├── LICENSE-APACHE
├── LICENSE-MIT
├── Makefile
├── README.md
├── Rules.mk
├── SECURITY.md
├── assets/
│   ├── README.md
│   ├── assets.go
│   └── init-doc/
│       ├── about
│       ├── contact
│       ├── docs/
│       │   └── index
│       ├── help
│       ├── ping
│       ├── quick-start
│       ├── readme
│       └── security-notes
├── bin/
│   ├── Rules.mk
│   ├── archive-branches.sh
│   ├── container_daemon
│   ├── container_init_run
│   ├── dist_get
│   ├── gencmdref
│   ├── get-docker-tags.sh
│   ├── graphmd
│   ├── ipns-republish
│   ├── maketarball.sh
│   ├── mkreleaselog
│   ├── push-docker-tags.sh
│   ├── test-go-build-platforms
│   └── test-go-fmt
├── blocks/
│   └── blockstoreutil/
│       └── remove.go
├── client/
│   └── rpc/
│       ├── README.md
│       ├── api.go
│       ├── api_test.go
│       ├── apifile.go
│       ├── auth/
│       │   └── auth.go
│       ├── block.go
│       ├── dag.go
│       ├── errors.go
│       ├── errors_test.go
│       ├── key.go
│       ├── name.go
│       ├── object.go
│       ├── path.go
│       ├── pin.go
│       ├── pubsub.go
│       ├── request.go
│       ├── requestbuilder.go
│       ├── response.go
│       ├── routing.go
│       ├── swarm.go
│       └── unixfs.go
├── codecov.yml
├── commands/
│   ├── context.go
│   └── reqlog.go
├── config/
│   ├── addresses.go
│   ├── api.go
│   ├── api_test.go
│   ├── autoconf.go
│   ├── autoconf_client.go
│   ├── autoconf_test.go
│   ├── autonat.go
│   ├── autotls.go
│   ├── bitswap.go
│   ├── bootstrap_peers.go
│   ├── bootstrap_peers_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── datastore.go
│   ├── discovery.go
│   ├── dns.go
│   ├── experiments.go
│   ├── gateway.go
│   ├── http_retrieval.go
│   ├── identity.go
│   ├── import.go
│   ├── import_test.go
│   ├── init.go
│   ├── init_test.go
│   ├── internal.go
│   ├── ipns.go
│   ├── migration.go
│   ├── migration_test.go
│   ├── mounts.go
│   ├── peering.go
│   ├── plugins.go
│   ├── profile.go
│   ├── provide.go
│   ├── provide_test.go
│   ├── provider.go
│   ├── pubsub.go
│   ├── remotepin.go
│   ├── reprovider.go
│   ├── routing.go
│   ├── routing_test.go
│   ├── serialize/
│   │   ├── serialize.go
│   │   └── serialize_test.go
│   ├── swarm.go
│   ├── types.go
│   ├── types_test.go
│   └── version.go
├── core/
│   ├── .gitignore
│   ├── builder.go
│   ├── commands/
│   │   ├── active.go
│   │   ├── add.go
│   │   ├── bitswap.go
│   │   ├── block.go
│   │   ├── bootstrap.go
│   │   ├── cat.go
│   │   ├── cid.go
│   │   ├── cid_test.go
│   │   ├── cmdenv/
│   │   │   ├── cidbase.go
│   │   │   ├── cidbase_test.go
│   │   │   ├── env.go
│   │   │   ├── env_test.go
│   │   │   └── file.go
│   │   ├── cmdutils/
│   │   │   ├── sanitize.go
│   │   │   ├── utils.go
│   │   │   └── utils_test.go
│   │   ├── commands.go
│   │   ├── commands_test.go
│   │   ├── completion.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── dag/
│   │   │   ├── dag.go
│   │   │   ├── export.go
│   │   │   ├── get.go
│   │   │   ├── import.go
│   │   │   ├── put.go
│   │   │   ├── resolve.go
│   │   │   └── stat.go
│   │   ├── dht.go
│   │   ├── dht_test.go
│   │   ├── diag.go
│   │   ├── e/
│   │   │   └── error.go
│   │   ├── external.go
│   │   ├── extra.go
│   │   ├── files.go
│   │   ├── files_test.go
│   │   ├── filestore.go
│   │   ├── get.go
│   │   ├── get_test.go
│   │   ├── helptext_test.go
│   │   ├── id.go
│   │   ├── keyencode/
│   │   │   └── keyencode.go
│   │   ├── keystore.go
│   │   ├── log.go
│   │   ├── ls.go
│   │   ├── ls_test.go
│   │   ├── mount_nofuse.go
│   │   ├── mount_unix.go
│   │   ├── mount_windows.go
│   │   ├── multibase.go
│   │   ├── name/
│   │   │   ├── ipns.go
│   │   │   ├── ipnsps.go
│   │   │   ├── name.go
│   │   │   └── publish.go
│   │   ├── object/
│   │   │   ├── diff.go
│   │   │   ├── object.go
│   │   │   └── patch.go
│   │   ├── p2p.go
│   │   ├── pin/
│   │   │   ├── pin.go
│   │   │   ├── remotepin.go
│   │   │   └── remotepin_test.go
│   │   ├── ping.go
│   │   ├── profile.go
│   │   ├── provide.go
│   │   ├── pubsub.go
│   │   ├── refs.go
│   │   ├── repo.go
│   │   ├── repo_verify_test.go
│   │   ├── resolve.go
│   │   ├── root.go
│   │   ├── root_test.go
│   │   ├── routing.go
│   │   ├── shutdown.go
│   │   ├── stat.go
│   │   ├── stat_dht.go
│   │   ├── stat_provide.go
│   │   ├── stat_reprovide.go
│   │   ├── swarm.go
│   │   ├── swarm_addrs_autonat.go
│   │   ├── sysdiag.go
│   │   └── version.go
│   ├── core.go
│   ├── core_test.go
│   ├── coreapi/
│   │   ├── block.go
│   │   ├── coreapi.go
│   │   ├── dag.go
│   │   ├── key.go
│   │   ├── name.go
│   │   ├── object.go
│   │   ├── path.go
│   │   ├── pin.go
│   │   ├── pubsub.go
│   │   ├── routing.go
│   │   ├── swarm.go
│   │   ├── test/
│   │   │   ├── api_test.go
│   │   │   └── path_test.go
│   │   └── unixfs.go
│   ├── corehttp/
│   │   ├── commands.go
│   │   ├── corehttp.go
│   │   ├── gateway.go
│   │   ├── gateway_test.go
│   │   ├── logs.go
│   │   ├── metrics.go
│   │   ├── metrics_test.go
│   │   ├── mutex_profile.go
│   │   ├── option_test.go
│   │   ├── p2p_proxy.go
│   │   ├── p2p_proxy_test.go
│   │   ├── redirect.go
│   │   ├── routing.go
│   │   └── webui.go
│   ├── coreiface/
│   │   ├── block.go
│   │   ├── coreapi.go
│   │   ├── dag.go
│   │   ├── errors.go
│   │   ├── idfmt.go
│   │   ├── key.go
│   │   ├── name.go
│   │   ├── object.go
│   │   ├── options/
│   │   │   ├── block.go
│   │   │   ├── dht.go
│   │   │   ├── global.go
│   │   │   ├── key.go
│   │   │   ├── name.go
│   │   │   ├── object.go
│   │   │   ├── pin.go
│   │   │   ├── pubsub.go
│   │   │   ├── routing.go
│   │   │   ├── unixfs.go
│   │   │   └── unixfs_test.go
│   │   ├── pin.go
│   │   ├── pubsub.go
│   │   ├── routing.go
│   │   ├── swarm.go
│   │   ├── tests/
│   │   │   ├── api.go
│   │   │   ├── block.go
│   │   │   ├── dag.go
│   │   │   ├── key.go
│   │   │   ├── name.go
│   │   │   ├── object.go
│   │   │   ├── path.go
│   │   │   ├── pin.go
│   │   │   ├── pubsub.go
│   │   │   ├── routing.go
│   │   │   └── unixfs.go
│   │   ├── unixfs.go
│   │   └── util.go
│   ├── corerepo/
│   │   ├── gc.go
│   │   └── stat.go
│   ├── coreunix/
│   │   ├── add.go
│   │   ├── add_test.go
│   │   ├── metadata.go
│   │   ├── metadata_test.go
│   │   └── test/
│   │       └── data/
│   │           ├── colors/
│   │           │   └── orange
│   │           ├── corps/
│   │           │   └── apple
│   │           └── fruits/
│   │               ├── apple
│   │               └── orange
│   ├── mock/
│   │   └── mock.go
│   └── node/
│       ├── bitswap.go
│       ├── builder.go
│       ├── core.go
│       ├── dns.go
│       ├── groups.go
│       ├── helpers/
│       │   └── helpers.go
│       ├── helpers.go
│       ├── identity.go
│       ├── ipns.go
│       ├── libp2p/
│       │   ├── addrs.go
│       │   ├── discovery.go
│       │   ├── dns.go
│       │   ├── fd/
│       │   │   ├── sys_not_unix.go
│       │   │   ├── sys_unix.go
│       │   │   └── sys_windows.go
│       │   ├── filters.go
│       │   ├── host.go
│       │   ├── hostopt.go
│       │   ├── libp2p.go
│       │   ├── libp2p_test.go
│       │   ├── nat.go
│       │   ├── peerstore.go
│       │   ├── pnet.go
│       │   ├── pubsub.go
│       │   ├── pubsub_test.go
│       │   ├── rcmgr.go
│       │   ├── rcmgr_defaults.go
│       │   ├── rcmgr_logging.go
│       │   ├── rcmgr_logging_test.go
│       │   ├── relay.go
│       │   ├── routing.go
│       │   ├── routingopt.go
│       │   ├── routingopt_test.go
│       │   ├── sec.go
│       │   ├── smux.go
│       │   ├── topicdiscovery.go
│       │   └── transport.go
│       ├── p2pforge_resolver.go
│       ├── p2pforge_resolver_test.go
│       ├── peering.go
│       ├── provider.go
│       └── storage.go
├── coverage/
│   ├── .gitignore
│   ├── Rules.mk
│   └── main/
│       └── main.go
├── doc.go
├── docker-compose.yaml
├── docs/
│   ├── EARLY_TESTERS.md
│   ├── README.md
│   ├── RELEASE_CHECKLIST.md
│   ├── RELEASE_ISSUE_TEMPLATE.md
│   ├── add-code-flow.md
│   ├── changelogs/
│   │   ├── v0.10.md
│   │   ├── v0.11.md
│   │   ├── v0.12.md
│   │   ├── v0.13.md
│   │   ├── v0.14.md
│   │   ├── v0.15.md
│   │   ├── v0.16.md
│   │   ├── v0.17.md
│   │   ├── v0.18.md
│   │   ├── v0.19.md
│   │   ├── v0.2.md
│   │   ├── v0.20.md
│   │   ├── v0.21.md
│   │   ├── v0.22.md
│   │   ├── v0.23.md
│   │   ├── v0.24.md
│   │   ├── v0.25.md
│   │   ├── v0.26.md
│   │   ├── v0.27.md
│   │   ├── v0.28.md
│   │   ├── v0.29.md
│   │   ├── v0.3.md
│   │   ├── v0.30.md
│   │   ├── v0.31.md
│   │   ├── v0.32.md
│   │   ├── v0.33.md
│   │   ├── v0.34.md
│   │   ├── v0.35.md
│   │   ├── v0.36.md
│   │   ├── v0.37.md
│   │   ├── v0.38.md
│   │   ├── v0.39.md
│   │   ├── v0.4.md
│   │   ├── v0.40.md
│   │   ├── v0.41.md
│   │   ├── v0.42.md
│   │   ├── v0.5.md
│   │   ├── v0.6.md
│   │   ├── v0.7.md
│   │   ├── v0.8.md
│   │   └── v0.9.md
│   ├── command-completion.md
│   ├── config.md
│   ├── content-blocking.md
│   ├── customizing.md
│   ├── datastores.md
│   ├── debug-guide.md
│   ├── delegated-routing.md
│   ├── developer-certificate-of-origin
│   ├── developer-guide.md
│   ├── environment-variables.md
│   ├── examples/
│   │   └── kubo-as-a-library/
│   │       ├── README.md
│   │       ├── go.mod
│   │       ├── go.sum
│   │       ├── main.go
│   │       └── main_test.go
│   ├── experimental-features.md
│   ├── file-transfer.md
│   ├── fuse.md
│   ├── gateway.md
│   ├── http-rpc-clients.md
│   ├── implement-api-bindings.md
│   ├── libp2p-resource-management.md
│   ├── metrics.md
│   ├── p2p-tunnels.md
│   ├── plugins.md
│   ├── production/
│   │   └── reverse-proxy.md
│   ├── provide-stats.md
│   ├── releases.md
│   ├── releases_thunderdome.md
│   ├── specifications/
│   │   ├── keystore.md
│   │   ├── repository.md
│   │   └── repository_fs.md
│   ├── telemetry.md
│   ├── transports.md
│   └── windows.md
├── fuse/
│   ├── ipns/
│   │   ├── common.go
│   │   ├── ipns_test.go
│   │   ├── ipns_unix.go
│   │   ├── link_unix.go
│   │   └── mount_unix.go
│   ├── mfs/
│   │   ├── mfs_test.go
│   │   ├── mfs_unix.go
│   │   └── mount_unix.go
│   ├── mount/
│   │   ├── fuse.go
│   │   └── mount.go
│   ├── node/
│   │   ├── mount_darwin.go
│   │   ├── mount_nofuse.go
│   │   ├── mount_notsupp.go
│   │   ├── mount_test.go
│   │   ├── mount_unix.go
│   │   └── mount_windows.go
│   └── readonly/
│       ├── doc.go
│       ├── ipfs_test.go
│       ├── mount_unix.go
│       └── readonly_unix.go
├── gc/
│   ├── gc.go
│   └── gc_test.go
├── go.mod
├── go.sum
├── misc/
│   ├── README.md
│   ├── fsutil/
│   │   ├── fsutil.go
│   │   └── fsutil_test.go
│   ├── launchd/
│   │   ├── README.md
│   │   ├── install.sh
│   │   └── io.ipfs.ipfs-daemon.plist
│   └── systemd/
│       ├── ipfs-api.socket
│       ├── ipfs-gateway.socket
│       ├── ipfs-hardened.service
│       ├── ipfs-sysusers.conf
│       └── ipfs.service
├── mk/
│   ├── footer.mk
│   ├── git.mk
│   ├── golang.mk
│   ├── header.mk
│   ├── tarball.mk
│   └── util.mk
├── p2p/
│   ├── listener.go
│   ├── local.go
│   ├── p2p.go
│   ├── remote.go
│   └── stream.go
├── plugin/
│   ├── Rules.mk
│   ├── daemon.go
│   ├── daemoninternal.go
│   ├── datastore.go
│   ├── fx.go
│   ├── ipld.go
│   ├── loader/
│   │   ├── Rules.mk
│   │   ├── load_nocgo.go
│   │   ├── load_noplugin.go
│   │   ├── load_unix.go
│   │   ├── loader.go
│   │   ├── preload.go
│   │   ├── preload.sh
│   │   └── preload_list
│   ├── plugin.go
│   ├── plugins/
│   │   ├── .gitignore
│   │   ├── Rules.mk
│   │   ├── badgerds/
│   │   │   └── badgerds.go
│   │   ├── dagjose/
│   │   │   └── dagjose.go
│   │   ├── flatfs/
│   │   │   └── flatfs.go
│   │   ├── fxtest/
│   │   │   └── fxtest.go
│   │   ├── gen_main.sh
│   │   ├── git/
│   │   │   └── git.go
│   │   ├── levelds/
│   │   │   └── levelds.go
│   │   ├── nopfs/
│   │   │   └── nopfs.go
│   │   ├── pebbleds/
│   │   │   └── pebbleds.go
│   │   ├── peerlog/
│   │   │   ├── peerlog.go
│   │   │   └── peerlog_test.go
│   │   └── telemetry/
│   │       ├── telemetry.go
│   │       ├── telemetry_test.go
│   │       └── telemetry_uuid
│   └── tracer.go
├── profile/
│   ├── goroutines.go
│   ├── profile.go
│   └── profile_test.go
├── repo/
│   ├── common/
│   │   ├── common.go
│   │   └── common_test.go
│   ├── fsrepo/
│   │   ├── config_test.go
│   │   ├── datastores.go
│   │   ├── doc.go
│   │   ├── fsrepo.go
│   │   ├── fsrepo_test.go
│   │   ├── migrations/
│   │   │   ├── README.md
│   │   │   ├── atomicfile/
│   │   │   │   ├── atomicfile.go
│   │   │   │   └── atomicfile_test.go
│   │   │   ├── common/
│   │   │   │   ├── base.go
│   │   │   │   ├── config_helpers.go
│   │   │   │   ├── migration.go
│   │   │   │   ├── testing_helpers.go
│   │   │   │   └── utils.go
│   │   │   ├── embedded.go
│   │   │   ├── embedded_test.go
│   │   │   ├── fetch.go
│   │   │   ├── fetch_test.go
│   │   │   ├── fetcher.go
│   │   │   ├── fs-repo-16-to-17/
│   │   │   │   ├── main.go
│   │   │   │   └── migration/
│   │   │   │       ├── migration.go
│   │   │   │       └── migration_test.go
│   │   │   ├── fs-repo-17-to-18/
│   │   │   │   ├── main.go
│   │   │   │   └── migration/
│   │   │   │       ├── migration.go
│   │   │   │       └── migration_test.go
│   │   │   ├── httpfetcher.go
│   │   │   ├── ipfsdir.go
│   │   │   ├── ipfsdir_test.go
│   │   │   ├── ipfsfetcher/
│   │   │   │   ├── ipfsfetcher.go
│   │   │   │   └── ipfsfetcher_test.go
│   │   │   ├── migrations.go
│   │   │   ├── migrations_test.go
│   │   │   ├── retryfetcher.go
│   │   │   ├── setup_test.go
│   │   │   ├── unpack.go
│   │   │   ├── unpack_test.go
│   │   │   ├── versions.go
│   │   │   └── versions_test.go
│   │   └── misc.go
│   ├── mock.go
│   ├── onlyone.go
│   └── repo.go
├── routing/
│   ├── composer.go
│   ├── delegated.go
│   ├── delegated_test.go
│   ├── error.go
│   └── wrapper.go
├── test/
│   ├── .gitignore
│   ├── 3nodetest/
│   │   ├── GNUmakefile
│   │   ├── README.md
│   │   ├── bin/
│   │   │   ├── .gitignore
│   │   │   ├── clean.sh
│   │   │   ├── save_logs.sh
│   │   │   └── save_profiling_data.sh
│   │   ├── bootstrap/
│   │   │   ├── Dockerfile
│   │   │   ├── README.md
│   │   │   └── config
│   │   ├── build/
│   │   │   ├── .gitignore
│   │   │   └── .gitkeep
│   │   ├── client/
│   │   │   ├── Dockerfile
│   │   │   ├── config
│   │   │   └── run.sh
│   │   ├── data/
│   │   │   ├── .gitignore
│   │   │   └── Dockerfile
│   │   ├── fig.yml
│   │   ├── run-test-on-img.sh
│   │   └── server/
│   │       ├── Dockerfile
│   │       ├── README.md
│   │       ├── config
│   │       └── run.sh
│   ├── README.md
│   ├── Rules.mk
│   ├── api-startup/
│   │   └── main.go
│   ├── bench/
│   │   ├── bench_cli_ipfs_add/
│   │   │   └── main.go
│   │   └── offline_add/
│   │       └── main.go
│   ├── bin/
│   │   ├── .gitignore
│   │   ├── Rules.mk
│   │   ├── checkflags
│   │   └── continueyn
│   ├── cli/
│   │   ├── add_test.go
│   │   ├── agent_version_unicode_test.go
│   │   ├── api_file_test.go
│   │   ├── autoconf/
│   │   │   ├── autoconf_test.go
│   │   │   ├── dns_test.go
│   │   │   ├── expand_comprehensive_test.go
│   │   │   ├── expand_fallback_test.go
│   │   │   ├── expand_test.go
│   │   │   ├── extensibility_test.go
│   │   │   ├── fuzz_test.go
│   │   │   ├── ipns_test.go
│   │   │   ├── routing_test.go
│   │   │   ├── swarm_connect_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── autoconf_amino_and_ipni.json
│   │   │   │   ├── autoconf_new_routing_system.json
│   │   │   │   ├── autoconf_new_routing_with_filtering.json
│   │   │   │   ├── autoconf_with_unsupported_paths.json
│   │   │   │   ├── updated_autoconf.json
│   │   │   │   └── valid_autoconf.json
│   │   │   └── validation_test.go
│   │   ├── backup_bootstrap_test.go
│   │   ├── basic_commands_test.go
│   │   ├── bitswap_config_test.go
│   │   ├── block_size_test.go
│   │   ├── bootstrap_auto_test.go
│   │   ├── cid_profiles_test.go
│   │   ├── cid_test.go
│   │   ├── cli_https_test.go
│   │   ├── commands_without_repo_test.go
│   │   ├── completion_test.go
│   │   ├── config_secrets_test.go
│   │   ├── content_blocking_test.go
│   │   ├── content_routing_http_test.go
│   │   ├── daemon_test.go
│   │   ├── dag_layout_test.go
│   │   ├── dag_test.go
│   │   ├── delegated_routing_v1_http_client_test.go
│   │   ├── delegated_routing_v1_http_proxy_test.go
│   │   ├── delegated_routing_v1_http_server_test.go
│   │   ├── dht_autoclient_test.go
│   │   ├── dht_opt_prov_test.go
│   │   ├── diag_datastore_test.go
│   │   ├── dns_resolvers_multiaddr_test.go
│   │   ├── files_test.go
│   │   ├── fixtures/
│   │   │   ├── README.md
│   │   │   ├── TestDagStat.car
│   │   │   ├── TestDagStatExpectedOutput.txt
│   │   │   ├── TestGatewayHAMTDirectory.car
│   │   │   ├── TestGatewayMultiRange.car
│   │   │   └── TestName.car
│   │   ├── fuse_test.go
│   │   ├── gateway_limits_test.go
│   │   ├── gateway_range_test.go
│   │   ├── gateway_test.go
│   │   ├── harness/
│   │   │   ├── buffer.go
│   │   │   ├── harness.go
│   │   │   ├── http_client.go
│   │   │   ├── ipfs.go
│   │   │   ├── log.go
│   │   │   ├── node.go
│   │   │   ├── nodes.go
│   │   │   ├── pbinspect.go
│   │   │   ├── peering.go
│   │   │   └── run.go
│   │   ├── http_gateway_over_libp2p_test.go
│   │   ├── http_retrieval_client_test.go
│   │   ├── identity_cid_test.go
│   │   ├── init_test.go
│   │   ├── ipfswatch_test.go
│   │   ├── log_level_test.go
│   │   ├── ls_test.go
│   │   ├── migrations/
│   │   │   ├── migration_16_to_latest_test.go
│   │   │   ├── migration_17_to_latest_test.go
│   │   │   ├── migration_concurrent_test.go
│   │   │   ├── migration_mixed_15_to_latest_test.go
│   │   │   └── testdata/
│   │   │       ├── v15-repo/
│   │   │       │   ├── blocks/
│   │   │       │   │   ├── SHARDING
│   │   │       │   │   ├── X3/
│   │   │       │   │   │   └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│   │   │       │   │   ├── _README
│   │   │       │   │   └── diskUsage.cache
│   │   │       │   ├── config
│   │   │       │   ├── datastore/
│   │   │       │   │   ├── 000001.log
│   │   │       │   │   ├── CURRENT
│   │   │       │   │   ├── LOCK
│   │   │       │   │   ├── LOG
│   │   │       │   │   └── MANIFEST-000000
│   │   │       │   ├── datastore_spec
│   │   │       │   └── version
│   │   │       └── v16-repo/
│   │   │           ├── blocks/
│   │   │           │   ├── SHARDING
│   │   │           │   ├── X3/
│   │   │           │   │   └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│   │   │           │   ├── _README
│   │   │           │   └── diskUsage.cache
│   │   │           ├── config
│   │   │           ├── datastore/
│   │   │           │   ├── 000001.log
│   │   │           │   ├── CURRENT
│   │   │           │   ├── LOCK
│   │   │           │   ├── LOG
│   │   │           │   └── MANIFEST-000000
│   │   │           ├── datastore_spec
│   │   │           └── version
│   │   ├── must.go
│   │   ├── name_test.go
│   │   ├── p2p_test.go
│   │   ├── peering_test.go
│   │   ├── pin_ls_names_test.go
│   │   ├── pin_name_validation_test.go
│   │   ├── ping_test.go
│   │   ├── pinning_remote_test.go
│   │   ├── pins_test.go
│   │   ├── provide_stats_test.go
│   │   ├── provider_test.go
│   │   ├── pubsub_test.go
│   │   ├── rcmgr_test.go
│   │   ├── repo_verify_test.go
│   │   ├── routing_dht_test.go
│   │   ├── rpc_auth_test.go
│   │   ├── rpc_content_type_test.go
│   │   ├── rpc_get_output_test.go
│   │   ├── rpc_unixsocket_test.go
│   │   ├── stats_test.go
│   │   ├── swarm_test.go
│   │   ├── telemetry_test.go
│   │   ├── testutils/
│   │   │   ├── asserts.go
│   │   │   ├── cids.go
│   │   │   ├── files.go
│   │   │   ├── floats.go
│   │   │   ├── httprouting/
│   │   │   │   └── mock_http_content_router.go
│   │   │   ├── json.go
│   │   │   ├── pinningservice/
│   │   │   │   └── pinning.go
│   │   │   ├── protobuf.go
│   │   │   ├── random_deterministic.go
│   │   │   ├── requires.go
│   │   │   └── strings.go
│   │   ├── tracing_test.go
│   │   ├── transports_test.go
│   │   └── webui_test.go
│   ├── dependencies/
│   │   ├── GNUmakefile
│   │   ├── dependencies.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── iptb/
│   │   │   └── iptb.go
│   │   ├── ma-pipe-unidir/
│   │   │   ├── LICENSE
│   │   │   └── main.go
│   │   └── pollEndpoint/
│   │       └── main.go
│   ├── integration/
│   │   ├── GNUmakefile
│   │   ├── addcat_test.go
│   │   ├── bench_cat_test.go
│   │   ├── bench_test.go
│   │   ├── bitswap_wo_routing_test.go
│   │   ├── three_legged_cat_test.go
│   │   └── wan_lan_dht_test.go
│   ├── ipfs-test-lib.sh
│   ├── sharness/
│   │   ├── .gitignore
│   │   ├── GNUmakefile
│   │   ├── README.md
│   │   ├── Rules.mk
│   │   ├── lib/
│   │   │   ├── install-sharness.sh
│   │   │   ├── iptb-lib.sh
│   │   │   ├── test-aggregate-junit-reports.sh
│   │   │   ├── test-aggregate-results.sh
│   │   │   ├── test-lib-hashes.sh
│   │   │   └── test-lib.sh
│   │   ├── t0001-tests-work.sh
│   │   ├── t0002-docker-image.sh
│   │   ├── t0003-docker-migrate.sh
│   │   ├── t0012-completion-fish.sh
│   │   ├── t0015-basic-sh-functions.sh
│   │   ├── t0018-indent.sh
│   │   ├── t0021-config.sh
│   │   ├── t0022-init-default.sh
│   │   ├── t0023-shutdown.sh
│   │   ├── t0024-datastore-config.sh
│   │   ├── t0024-files/
│   │   │   ├── spec-newshardfun
│   │   │   └── spec-nosync
│   │   ├── t0025-datastores.sh
│   │   ├── t0026-id.sh
│   │   ├── t0027-rotate.sh
│   │   ├── t0030-mount.sh
│   │   ├── t0031-mount-publish.sh
│   │   ├── t0032-mount-sharded.sh
│   │   ├── t0040-add-and-cat.sh
│   │   ├── t0042-add-skip.sh
│   │   ├── t0043-add-w.sh
│   │   ├── t0044-add-symlink.sh
│   │   ├── t0045-ls.sh
│   │   ├── t0046-id-hash.sh
│   │   ├── t0047-add-mode-mtime.sh
│   │   ├── t0050-block-data/
│   │   │   └── testPut.pb
│   │   ├── t0050-block.sh
│   │   ├── t0051-object.sh
│   │   ├── t0052-object-diff.sh
│   │   ├── t0053-dag-data/
│   │   │   └── non-canon.cbor
│   │   ├── t0053-dag.sh
│   │   ├── t0054-dag-car-import-export-data/
│   │   │   ├── README.md
│   │   │   └── test_dataset_car.tar.xz
│   │   ├── t0054-dag-car-import-export.sh
│   │   ├── t0055-dag-put-json-new-line.sh
│   │   ├── t0060-daemon.sh
│   │   ├── t0060-data/
│   │   │   ├── mss-noise
│   │   │   ├── mss-plaintext
│   │   │   └── mss-tls
│   │   ├── t0061-daemon-opts.sh
│   │   ├── t0062-daemon-api.sh
│   │   ├── t0063-daemon-init.sh
│   │   ├── t0063-external.sh
│   │   ├── t0064-api-file.sh
│   │   ├── t0065-active-requests.sh
│   │   ├── t0066-migration.sh
│   │   ├── t0067-unix-api.sh
│   │   ├── t0070-user-config.sh
│   │   ├── t0080-repo.sh
│   │   ├── t0081-repo-pinning.sh
│   │   ├── t0082-repo-gc-auto.sh
│   │   ├── t0084-repo-read-rehash.sh
│   │   ├── t0086-repo-verify.sh
│   │   ├── t0087-repo-robust-gc.sh
│   │   ├── t0088-repo-stat-symlink.sh
│   │   ├── t0090-get.sh
│   │   ├── t0095-refs.sh
│   │   ├── t0101-iptb-name.sh
│   │   ├── t0109-gateway-web-_redirects-data/
│   │   │   └── redirects.car
│   │   ├── t0109-gateway-web-_redirects.sh
│   │   ├── t0112-gateway-cors.sh
│   │   ├── t0114-gateway-subdomains/
│   │   │   ├── 12D3KooWLQzUv2FHWGVPXTXSZpdHs7oHbXub2G5WC8Tx4NQhyd2d.ipns-record
│   │   │   ├── QmVujd5Vb7moysJj8itnGufN7MEtPRCNHkKpNuA4onsRa3.ipns-record
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0114-gateway-subdomains.sh
│   │   ├── t0115-gateway-dir-listing/
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0115-gateway-dir-listing.sh
│   │   ├── t0116-gateway-cache/
│   │   │   ├── README.md
│   │   │   ├── fixtures.car
│   │   │   └── k51qzi5uqu5dlxdsdu5fpuu7h69wu4ohp32iwm9pdt9nq3y5rpn3ln9j12zfhe.ipns-record
│   │   ├── t0116-gateway-cache.sh
│   │   ├── t0119-prometheus-data/
│   │   │   ├── prometheus_metrics
│   │   │   ├── prometheus_metrics_added_by_enabling_rcmgr
│   │   │   └── prometheus_metrics_added_by_measure_profile
│   │   ├── t0119-prometheus.sh
│   │   ├── t0120-bootstrap.sh
│   │   ├── t0121-bootstrap-iptb.sh
│   │   ├── t0131-multinode-client-routing.sh
│   │   ├── t0140-swarm.sh
│   │   ├── t0141-addfilter.sh
│   │   ├── t0142-testfilter.sh
│   │   ├── t0150-clisuggest.sh
│   │   ├── t0151-sysdiag.sh
│   │   ├── t0152-profile.sh
│   │   ├── t0160-resolve.sh
│   │   ├── t0165-keystore-data/
│   │   │   ├── README.md
│   │   │   ├── openssl_ed25519.pem
│   │   │   ├── openssl_rsa.pem
│   │   │   └── openssl_secp384r1.pem
│   │   ├── t0165-keystore.sh
│   │   ├── t0180-p2p.sh
│   │   ├── t0181-private-network.sh
│   │   ├── t0182-circuit-relay.sh
│   │   ├── t0183-namesys-pubsub.sh
│   │   ├── t0184-http-proxy-over-p2p.sh
│   │   ├── t0185-autonat.sh
│   │   ├── t0190-quic-ping.sh
│   │   ├── t0191-webtransport-ping.sh
│   │   ├── t0195-noise.sh
│   │   ├── t0220-bitswap.sh
│   │   ├── t0230-channel-streaming-http-content-type.sh
│   │   ├── t0231-channel-streaming.sh
│   │   ├── t0235-cli-request.sh
│   │   ├── t0236-cli-api-dns-resolve.sh
│   │   ├── t0240-republisher.sh
│   │   ├── t0250-files-api.sh
│   │   ├── t0251-files-flushing.sh
│   │   ├── t0252-files-gc.sh
│   │   ├── t0260-sharding.sh
│   │   ├── t0270-filestore.sh
│   │   ├── t0271-filestore-utils.sh
│   │   ├── t0272-urlstore.sh
│   │   ├── t0275-cid-security-data/
│   │   │   ├── CIQG6PGTD2VV34S33BE4MNCQITBRFYUPYQLDXYARR3DQW37MOT7K5XI.data
│   │   │   └── EICEM7ITSI.data
│   │   ├── t0275-cid-security.sh
│   │   ├── t0276-cidv0v1.sh
│   │   ├── t0280-plugin-dag-jose-data/
│   │   │   ├── dag-cbor/
│   │   │   │   ├── bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki
│   │   │   │   ├── bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4
│   │   │   │   └── bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm
│   │   │   ├── dag-jose/
│   │   │   │   ├── bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga
│   │   │   │   ├── bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa
│   │   │   │   ├── bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq
│   │   │   │   ├── bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa
│   │   │   │   ├── bagcqceraqfknq7xaemcihmq2albau32ttrutxnco7xeoik6mlejismmvw5zq
│   │   │   │   ├── bagcqcerauben4l6ee2wjf2fnkj7vaels4p7lnytenk35j3gl2lzcbtbgyoea
│   │   │   │   ├── bagcqceravvw4bx7jgkxxjwfuqo2yoja6w4cmvmu3gkew3s7yu3vt2ce7riwa
│   │   │   │   ├── bagcqceraxazmu67crshzqdeg3kwnfschs25epy5sbtqtjre2qw3d62kzplva
│   │   │   │   └── bagcqceraxvt5izt4sz7kjfrm42dxrutp6ijywgsacllkznzekmfojypkvfea
│   │   │   └── dag-json/
│   │   │       ├── baguqeeraloya3qpa25kl5l4y3bzgl7rhyta2p7lwaocyxx4vpvdligb7mt2q
│   │   │       ├── baguqeeraovfm3rr3pvmxm27zgvxp5wycbfih35xih2uznminpnds5esm4jlq
│   │   │       └── baguqeeravexfd6qijjtnzxfqq6kgknnkncztgmvhjhxm6ih352qskolt2gxa
│   │   ├── t0280-plugin-dag-jose.sh
│   │   ├── t0280-plugin-data/
│   │   │   └── example.go
│   │   ├── t0280-plugin-fx.sh
│   │   ├── t0280-plugin-git.sh
│   │   ├── t0280-plugin-peerlog.sh
│   │   ├── t0280-plugin.sh
│   │   ├── t0290-cid.sh
│   │   ├── t0295-multibase.sh
│   │   ├── t0320-pubsub.sh
│   │   ├── t0321-pubsub-gossipsub.sh
│   │   ├── t0322-pubsub-http-rpc.sh
│   │   ├── t0400-api-no-gateway/
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0400-api-no-gateway.sh
│   │   ├── t0401-api-browser-security.sh
│   │   ├── t0410-api-add.sh
│   │   ├── t0500-issues-and-regressions-offline.sh
│   │   ├── t0600-issues-and-regressions-online.sh
│   │   ├── t0701-delegated-routing-reframe/
│   │   │   ├── FindProvidersRequest
│   │   │   └── FindProvidersResponse
│   │   ├── t0702-delegated-routing-http/
│   │   │   └── FindProvidersResponse
│   │   ├── t0800-blake3.sh
│   │   └── x0601-pin-fail-test.sh
│   ├── sharness_test_coverage_helper.sh
│   └── unit/
│       ├── .gitignore
│       └── Rules.mk
├── thirdparty/
│   ├── README.md
│   ├── unit/
│   │   ├── unit.go
│   │   └── unit_test.go
│   └── verifbs/
│       └── verifbs.go
├── tracing/
│   ├── doc.go
│   └── tracing.go
├── version.go
└── version_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .codeclimate.yml
================================================
ratings:
  paths: 
  - "**/*.go"

exclude_paths:
- test/
- Godeps/
- thirdparty/
- "**/*.pb.go"

engines:
  fixme:
    enabled: true
    config:
      strings:
      - FIXME
      - HACK
      - XXX
      - BUG
  golint:
    enabled: true
  govet:
    enabled: true
  gofmt:
    enabled: true

version: "2"
checks:
  argument-count:
    enabled: false
  complex-logic:
    enabled: false
  file-lines:
    enabled: false
  method-complexity:
    enabled: false
  method-count:
    enabled: false
  method-lines:
    enabled: false
  nested-control-flow:
    enabled: false
  return-statements:
    enabled: false
  similar-code:
    enabled: false


================================================
FILE: .cspell.yml
================================================
ignoreWords:
  - childs # This spelling is used in the files command
  - NodeCreater # This spelling is used in the fuse dependency
  - Boddy # One of the contributors to the project - Chris Boddy
  - Botto # One of the contributors to the project - Santiago Botto
  - cose # dag-cose

================================================
FILE: .dockerignore
================================================
Dockerfile
Dockerfile.fast
.git/
!.git/HEAD
!.git/refs/
!.git/packed-refs
test/sharness/lib/sharness/
test/sharness/trash*
rb-pinning-service-api/

# The Docker client might not be running on Linux
# so delete any compiled binaries
bin/gx
bin/gx*
bin/tmp


================================================
FILE: .gitattributes
================================================
# Default to text
* text eol=lf

# True text
*.md text eol=auto
LICENSE text eol=auto

# Known binary types
*.png binary
*.tar binary
*.gz binary
*.xz binary
*.car binary

# Binary assets
assets/init-doc/*          binary
core/coreunix/test_data/** binary
test/cli/migrations/testdata/** binary

# Generated test data
test/cli/migrations/testdata/** linguist-generated=true
test/cli/autoconf/testdata/** linguist-generated=true
test/cli/fixtures/** linguist-generated=true
test/sharness/t0054-dag-car-import-export-data/** linguist-generated=true
test/sharness/t0109-gateway-web-_redirects-data/** linguist-generated=true
test/sharness/t0114-gateway-subdomains/** linguist-generated=true
test/sharness/t0115-gateway-dir-listing/** linguist-generated=true
test/sharness/t0116-gateway-cache/** linguist-generated=true
test/sharness/t0119-prometheus-data/** linguist-generated=true
test/sharness/t0165-keystore-data/** linguist-generated=true
test/sharness/t0275-cid-security-data/** linguist-generated=true
test/sharness/t0280-plugin-dag-jose-data/** linguist-generated=true
test/sharness/t0280-plugin-data/** linguist-generated=true
test/sharness/t0280-plugin-git-data/** linguist-generated=true
test/sharness/t0400-api-no-gateway/** linguist-generated=true
test/sharness/t0701-delegated-routing-reframe/** linguist-generated=true
test/sharness/t0702-delegated-routing-http/** linguist-generated=true


================================================
FILE: .github/CODEOWNERS
================================================
# Code owners are automatically requested for review when someone opens a pull
# request that modifies code that they own. Code owners are not automatically
# requested to review draft pull requests.

# Default
* @ipfs/kubo-maintainers 

# HTTP Gateway
core/corehttp/  @lidel
test/sharness/*gateway*.sh  @lidel


================================================
FILE: .github/FUNDING.yml
================================================
custom: [ipshipyard.gitwallet.co]


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug Report
description: Report a bug in Kubo.
labels:
  - kind/bug
  - need/triage
body:
  - type: markdown
    attributes:
      value: |
        - Make sure you are running the [latest version of Kubo][releases] before reporting an issue.
        - If you have an enhancement or feature request for Kubo, please select [a different option][issues].
        - Please report possible security issues by email to security@ipfs.io

        [issues]: https://github.com/ipfs/kubo/issues/new/choose
        [releases]: https://github.com/ipfs/kubo/releases
  - type: checkboxes
    attributes:
      label: Checklist
      description: Please verify that you've followed these steps
      options:
        - label: This is a bug report, not a question. Ask questions on [discuss.ipfs.tech](https://discuss.ipfs.tech/c/help/13).
          required: true
        - label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my bug.
          required: true
        - label: I am running the latest [kubo version](https://dist.ipfs.tech/#kubo) or have an issue updating.
          required: true
  - type: dropdown
    id: install
    validations:
      required: true
    attributes:
      label: Installation method
      description: Please select your installation method
      options:
        - dist.ipfs.tech or ipfs-update
        - docker image
        - ipfs-desktop
        - third-party binary
        - built from source
  - type: textarea
    id: version
    attributes:
      label: Version
      render: Text
      description: |
        Enter the output of `ipfs version --all`. If you can't run that command, please include a copy of your [gateway's version page](http://localhost:8080/api/v0/version?enc=text&all=true).
  - type: textarea
    id: config
    attributes:
      label: Config
      render: json
      description: |
        Enter the output of `ipfs config show`.
  - type: textarea
    attributes:
      label: Description
      description: |
        This is where you get to tell us what went wrong. When doing so, please make sure to include *all* relevant information.

        Please try to include:
        * What you were doing when you experienced the bug.
        * Any error messages you saw, *where* you saw them, and what you believe may have caused them (if you have any ideas).
        * When possible, steps to reliably produce the bug.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
 - name: Getting Help on IPFS
   url: https://ipfs.tech/help
   about: All information about how and where to get help on IPFS.
 - name: Kubo configuration reference
   url: https://github.com/ipfs/kubo/blob/master/docs/config.md#readme
   about: Documentation on the different configuration settings
 - name: Kubo experimental features docs
   url: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#readme
   about: Documentation on Private Networks, Filestore and other experimental features.
 - name: Kubo RPC API Reference
   url: https://docs.ipfs.tech/reference/kubo/rpc/
   about: Documentation of all Kubo RPC API endpoints.
 - name: IPFS Official Discussion Forum
   url: https://discuss.ipfs.tech
   about: Please post general questions, support requests, and discussions here.


================================================
FILE: .github/ISSUE_TEMPLATE/doc.yml
================================================
name: Documentation Issue
description: Report missing, erroneous docs, broken links or propose new Kubo docs.
labels:
  - topic/docs-ipfs
  - need/triage
body:
  - type: markdown
    attributes:
      value: |
        Problems with documentation on https://docs.ipfs.tech should be reported to https://github.com/ipfs/ipfs-docs
  - type: checkboxes
    attributes:
      label: Checklist
      description: Please verify the following.
      options:
        - label: I am reporting a documentation issue in this repo, not https://docs.ipfs.tech.
          required: true
        - label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
          required: true
  - type: input
    attributes:
      label: Location
      description: |
        If possible, please provide a link to the documentation issue.
  - type: textarea
    attributes:
      label: Description
      description: |
        Please describe your issue.


================================================
FILE: .github/ISSUE_TEMPLATE/enhancement.yml
================================================
name: Enhancement
description: Suggest an improvement to an existing kubo feature.
labels:
  - kind/enhancement
  - need/triage
body:
  - type: markdown
    attributes:
      value: |
        Suggest an enhancement to Kubo (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.tech).

        Issues in this repo must be specific, actionable, and well motivated. They should be starting points for _building_ new features, not brainstorming ideas.

        If you have an idea you'd like to discuss, please open a new thread on [the forum](https://discuss.ipfs.tech).

        **Example:**

        > Reduce memory usage of `ipfs cat` (specific) by buffering less in ... (actionable). This would let me run Kubo on my Raspberry Pi (motivated).
  - type: checkboxes
    attributes:
      label: Checklist
      description: Please verify the following.
      options:
        - label: My issue is specific & actionable.
          required: true
        - label: I am not suggesting a protocol enhancement.
          required: true
        - label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
          required: true
  - type: textarea
    attributes:
      label: Description
      description: |
        Please describe your idea. When requesting an enhancement, please be sure to include your motivation and try to be as specific as possible.


================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: Feature
description: Suggest a new feature in Kubo.
labels:
  - kind/feature
  - need/triage
body:
  - type: markdown
    attributes:
      value: |
        Suggest a new feature in Kubo (the program). If you'd like to suggest an improvement to the IPFS protocol, please discuss it on [the forum](https://discuss.ipfs.tech).

        Issues in this repo must be specific, actionable, and well motivated. They should be starting points for _building_ new features, not brainstorming ideas.

        If you have an idea you'd like to discuss, please open a new thread on [the forum](https://discuss.ipfs.tech).

        **Example:**

        > Add deduplication-optimized chunking of tar files in `ipfs add` (specific) by examining tar headers ... (actionable). This would let me efficiently store and update many versions of code archives (motivated).

  - type: checkboxes
    attributes:
      label: Checklist
      description: Please verify the following.
      options:
        - label: My issue is specific & actionable.
          required: true
        - label: I am not suggesting a protocol enhancement.
          required: true
        - label: I have searched on the [issue tracker](https://github.com/ipfs/kubo/issues?q=is%3Aissue) for my issue.
          required: true
  - type: textarea
    attributes:
      label: Description
      description: |
        Please describe your idea. When requesting a feature, please be sure to include your motivation and and a concrete description of how the feature should work.


================================================
FILE: .github/auto-comment.yml
================================================
# Comment to a new issue.
# Disabled
# issueOpened: ""

# Disabled
# pullRequestOpened: ""


================================================
FILE: .github/build-platforms.yml
================================================
# Build platforms configuration for Kubo
# Matches https://github.com/ipfs/distributions/blob/master/dists/kubo/build_matrix
# plus linux-riscv64 for emerging architecture support
#
# The Go compiler handles FUSE support automatically via build tags.
# Platforms are simply listed - no need to specify FUSE capability.

platforms:
  - darwin-amd64
  - darwin-arm64
  - freebsd-amd64
  - linux-amd64
  - linux-arm64
  - linux-riscv64
  - openbsd-amd64
  - windows-amd64
  - windows-arm64

================================================
FILE: .github/dependabot.yml
================================================
# Dependabot PRs are auto-tidied by .github/workflows/dependabot-tidy.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "gomod"
    directory: "/"
    schedule:
      interval: "monthly"
    open-pull-requests-limit: 10
    labels:
      - "dependencies"
    ignore:
      # Updated via go-ds-* wrappers in ipfs-ecosystem group
      - dependency-name: "github.com/cockroachdb/pebble*"
      - dependency-name: "github.com/syndtr/goleveldb"
      - dependency-name: "github.com/dgraph-io/badger*"
    groups:
      ipfs-ecosystem:
        patterns:
          - "github.com/ipfs/*"
          - "github.com/ipfs-shipyard/*"
          - "github.com/ipshipyard/*"
          - "github.com/multiformats/*"
          - "github.com/ipld/*"
      libp2p-ecosystem:
        patterns:
          - "github.com/libp2p/*"
      golang-x:
        patterns:
          - "golang.org/x/*"
      opentelemetry:
        patterns:
          - "go.opentelemetry.io/*"
      prometheus:
        patterns:
          - "github.com/prometheus/*"
          - "contrib.go.opencensus.io/*"
          - "go.opencensus.io"
      uber:
        patterns:
          - "go.uber.org/*"


================================================
FILE: .github/pull_request_template.md
================================================
<!--
Please update docs/changelogs/ if you're modifying Go files. If your change does not require a changelog entry, please do one of the following:
- add `[skip changelog]` to the PR title
- label the PR with `skip/changelog`
-->


================================================
FILE: .github/workflows/changelog.yml
================================================
name: Changelog

on:
  pull_request:
    types:
      - opened
      - edited
      - synchronize
      - reopened
      - labeled
      - unlabeled
    paths:
      - '**.go'
      - '**/go.mod'
      - '**/go.sum'

jobs:
  changelog:
    if: contains(github.event.pull_request.title, '[skip changelog]') == false &&
        contains(github.event.pull_request.labels.*.name, 'skip/changelog') == false
    runs-on: ubuntu-latest
    name: Changelog
    steps:
      - id: changelog
        env:
          GITHUB_TOKEN: ${{ github.token }}
          ENDPOINT: repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files
          SELECTOR: 'map(select(.filename | startswith("docs/changelogs/"))) | length'
        run: gh api "$ENDPOINT" --jq "$SELECTOR" | xargs -I{} echo "modified={}" | tee -a $GITHUB_OUTPUT
      - if: steps.changelog.outputs.modified == '0'
        env:
          MESSAGE: |
            docs/changelogs/ was not modified in this PR. Please do one of the following:
            - add a changelog entry
            - add `[skip changelog]` to the PR title
            - label the PR with `skip/changelog`
        run: |
          echo "::error::${MESSAGE//$'\n'/%0A}"
          exit 1


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
name: CodeQL

on:
  workflow_dispatch:
  push:
    branches: [ master ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ master ]
    paths-ignore:
      - '**/*.md'
  schedule:
    - cron: '30 12 * * 2'

permissions:
  contents: read  #  to fetch code (actions/checkout)
  security-events: write  #   (github/codeql-action/autobuild)

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  codeql:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 20

    steps:
    - name: Checkout repository
      uses: actions/checkout@v6

    - name: Setup Go
      uses: actions/setup-go@v6
      with:
        go-version-file: 'go.mod'

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: go

    - name: Autobuild
      uses: github/codeql-action/autobuild@v4

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4


================================================
FILE: .github/workflows/dependabot-tidy.yml
================================================
# Dependabot only updates go.mod/go.sum in the root module, but this repo has
# multiple Go modules (see docs/examples/). This workflow runs `make mod_tidy`
# on Dependabot PRs to keep all go.sum files in sync, preventing go-check CI
# failures.
name: Dependabot Tidy

on:
  pull_request_target:
    types: [opened, synchronize]
  workflow_dispatch:
    inputs:
      pr_number:
        description: 'PR number to run mod_tidy on'
        required: true
        type: number

permissions:
  contents: write
  pull-requests: write

jobs:
  tidy:
    if: github.actor == 'dependabot[bot]' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    steps:
      - name: Get PR info
        id: pr
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
            pr_number="${{ inputs.pr_number }}"
          else
            pr_number="${{ github.event.pull_request.number }}"
          fi
          echo "number=$pr_number" >> $GITHUB_OUTPUT
          branch=$(gh pr view "$pr_number" --repo "${{ github.repository }}" --json headRefName -q '.headRefName')
          echo "branch=$branch" >> $GITHUB_OUTPUT
      - uses: actions/checkout@v6
        with:
          ref: ${{ steps.pr.outputs.branch }}
          token: ${{ secrets.GITHUB_TOKEN }}
      - uses: actions/setup-go@v6
        with:
          go-version-file: go.mod
      - name: Run make mod_tidy
        run: make mod_tidy
      - name: Check for changes
        id: git-check
        run: |
          if [[ -n $(git status --porcelain) ]]; then
            echo "modified=true" >> $GITHUB_OUTPUT
          fi
      - name: Commit changes
        if: steps.git-check.outputs.modified == 'true'
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git add -A
          git commit -m "chore: run make mod_tidy"
          git push


================================================
FILE: .github/workflows/docker-check.yml
================================================
# This workflow performs a quick Docker build check on PRs and pushes to master.
# It builds the Docker image and runs a basic smoke test to ensure the image works.
# This is a lightweight check - for full multi-platform builds and publishing, see docker-image.yml
name: Docker Check

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v6
      - uses: hadolint/hadolint-action@v3.3.0
        with:
          dockerfile: Dockerfile
          failure-threshold: warning
          verbose: true
          format: tty

  build:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 10
    env:
      IMAGE_NAME: ipfs/kubo
      WIP_IMAGE_TAG: wip
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v6
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4
      
      - name: Build Docker image with BuildKit
        uses: docker/build-push-action@v7
        with:
          context: .
          push: false
          load: true
          tags: ${{ env.IMAGE_NAME }}:${{ env.WIP_IMAGE_TAG }}
          cache-from: |
            type=gha
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
          cache-to: type=gha,mode=max
      
      - name: Test Docker image
        run: docker run --rm $IMAGE_NAME:$WIP_IMAGE_TAG --version


================================================
FILE: .github/workflows/docker-image.yml
================================================
# This workflow builds and publishes official Docker images to Docker Hub.
# It handles multi-platform builds (amd64, arm/v7, arm64/v8) and pushes tagged releases.
# This workflow is triggered on tags, specific branches, and can be manually dispatched.
# For quick build checks during development, see docker-check.yml
name: Docker Push

on:
  workflow_dispatch:
    inputs:
      push:
        description: 'Push to Docker Hub'
        required: true
        default: 'false'
      tags:
        description: 'Custom tags to use for the push'
        required: false
        default: ''
  # # If we decide to build all images on every PR, we should make sure that
  # # they are NOT pushed to Docker Hub.
  # pull_request:
  #   paths-ignore:
  #     - '**/*.md'
  push:
    branches:
      - 'master'
      - 'staging'
      - 'bifrost-*'
    tags:
      - 'v*'

permissions:
  contents: read  #  to fetch code (actions/checkout)

jobs:
  docker-hub:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    name: Push Docker image to Docker Hub
    runs-on: ubuntu-latest
    timeout-minutes: 15
    env:
      IMAGE_NAME: ipfs/kubo
    outputs:
      tags: ${{ steps.tags.outputs.value }}
    steps:
      - name: Check out the repo
        uses: actions/checkout@v6

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v4

      - name: Log in to Docker Hub
        uses: docker/login-action@v4
        with:
          username: ${{ vars.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Get tags
        id: tags
        if: github.event.inputs.tags == ''
        run: |
          echo "value<<EOF" >> $GITHUB_OUTPUT
          ./bin/get-docker-tags.sh "$(date -u +%F)" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT
        shell: bash

      # We have to build each platform separately because when using multi-arch
      # builds, only one platform is being loaded into the cache. This would
      # prevent us from testing the other platforms.
      - name: Build Docker image (linux/amd64)
        uses: docker/build-push-action@v7
        with:
          platforms: linux/amd64
          context: .
          push: false
          load: true
          file: ./Dockerfile
          tags: ${{ env.IMAGE_NAME }}:linux-amd64
          cache-from: |
            type=gha
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
          cache-to: type=gha,mode=max

      - name: Build Docker image (linux/arm/v7)
        uses: docker/build-push-action@v7
        with:
          platforms: linux/arm/v7
          context: .
          push: false
          load: true
          file: ./Dockerfile
          tags: ${{ env.IMAGE_NAME }}:linux-arm-v7
          cache-from: |
            type=gha
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
          cache-to: type=gha,mode=max

      - name: Build Docker image (linux/arm64/v8)
        uses: docker/build-push-action@v7
        with:
          platforms: linux/arm64/v8
          context: .
          push: false
          load: true
          file: ./Dockerfile
          tags: ${{ env.IMAGE_NAME }}:linux-arm64-v8
          cache-from: |
            type=gha
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
          cache-to: type=gha,mode=max

      # We test all the images on amd64 host here. This uses QEMU to emulate
      # the other platforms.
      # NOTE: --version should finish instantly, but sometimes
      # it hangs on github CI (could be qemu issue), so we retry to remove false negatives
      - name: Smoke-test linux-amd64
        run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-amd64 version --all && break || [ $i = 3 ] && exit 1; done
        timeout-minutes: 1
      - name: Smoke-test linux-arm-v7
        run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-arm-v7 version --all && break || [ $i = 3 ] && exit 1; done
        timeout-minutes: 1
      - name: Smoke-test linux-arm64-v8
        run: for i in {1..3}; do timeout 15s docker run --rm $IMAGE_NAME:linux-arm64-v8 version --all && break || [ $i = 3 ] && exit 1; done
        timeout-minutes: 1

      # This will only push the previously built images.
      - if: github.event_name != 'workflow_dispatch' || github.event.inputs.push == 'true'
        name: Publish to Docker Hub
        uses: docker/build-push-action@v7
        with:
          platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
          context: .
          push: true
          file: ./Dockerfile
          tags: "${{ github.event.inputs.tags || steps.tags.outputs.value }}"
          cache-from: |
            type=gha
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache
          cache-to: |
            type=gha,mode=max
            type=registry,ref=${{ env.IMAGE_NAME }}:buildcache,mode=max


================================================
FILE: .github/workflows/gateway-conformance.yml
================================================
name: Gateway Conformance

on:
  workflow_dispatch:
  push:
    branches:
      - master
  pull_request:
    paths-ignore:
      - '**/*.md'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

defaults:
  run:
    shell: bash

env:
  # hostnames expected by https://github.com/ipfs/gateway-conformance
  GATEWAY_PUBLIC_GATEWAYS: |
    {
      "example.com": {
        "UseSubdomains": true,
        "InlineDNSLink": true,
        "Paths": ["/ipfs", "/ipns"]
      },
      "localhost": {
        "UseSubdomains": true,
        "InlineDNSLink": true,
        "Paths": ["/ipfs", "/ipns"]
      }
    }

jobs:
  # Testing all gateway features via TCP port specified in Addresses.Gateway
  gateway-conformance:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      # 1. Download the gateway-conformance fixtures
      - name: Download gateway-conformance fixtures
        uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.12
        with:
          output: fixtures

      # 2. Build the kubo-gateway
      - name: Checkout kubo-gateway
        uses: actions/checkout@v6
        with:
          path: kubo-gateway
      - name: Setup Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'kubo-gateway/go.mod'
          cache: true
          cache-dependency-path: kubo-gateway/go.sum
      - name: Build kubo-gateway
        run: make build
        working-directory: kubo-gateway

      # 3. Init the kubo-gateway
      - name: Init kubo-gateway
        run: |
          ./ipfs init -e
          ./ipfs config --json Gateway.PublicGateways "$GATEWAY_PUBLIC_GATEWAYS"
        working-directory: kubo-gateway/cmd/ipfs

      # 4. Populate the Kubo gateway with the gateway-conformance fixtures
      - name: Import fixtures
        run: |
          # Import car files
          find ./fixtures -name '*.car' -exec kubo-gateway/cmd/ipfs/ipfs dag import --pin-roots=false {} \;

          # Import ipns records
          records=$(find ./fixtures -name '*.ipns-record')
          for record in $records
          do
              key=$(basename -s .ipns-record "$record" | cut -d'_' -f1)
              kubo-gateway/cmd/ipfs/ipfs routing put --allow-offline "/ipns/$key" "$record"
          done

          # Import dnslink records
          # the IPFS_NS_MAP env will be used by the daemon
          echo "IPFS_NS_MAP=$(cat ./fixtures/dnslinks.IPFS_NS_MAP)" >> $GITHUB_ENV

      # 5. Start the kubo-gateway
      - name: Start kubo-gateway
        run: |
          ./ipfs daemon --offline &
        working-directory: kubo-gateway/cmd/ipfs

      # 6. Run the gateway-conformance tests
      - name: Run gateway-conformance tests
        uses: ipfs/gateway-conformance/.github/actions/test@v0.12
        with:
          gateway-url: http://127.0.0.1:8080
          subdomain-url: http://localhost:8080
          args: -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length'
          json: output.json
          xml: output.xml
          html: output.html
          markdown: output.md

      # 7. Upload the results
      - name: Upload MD summary
        if: failure() || success()
        run: cat output.md >> $GITHUB_STEP_SUMMARY
      - name: Upload HTML report
        if: failure() || success()
        uses: actions/upload-artifact@v7
        with:
          name: gateway-conformance.html
          path: output.html
      - name: Upload JSON report
        if: failure() || success()
        uses: actions/upload-artifact@v7
        with:
          name: gateway-conformance.json
          path: output.json

  # Testing trustless gateway feature subset exposed as libp2p protocol
  gateway-conformance-libp2p-experiment:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      # 1. Download the gateway-conformance fixtures
      - name: Download gateway-conformance fixtures
        uses: ipfs/gateway-conformance/.github/actions/extract-fixtures@v0.12
        with:
          output: fixtures

      # 2. Build the kubo-gateway
      - name: Checkout kubo-gateway
        uses: actions/checkout@v6
        with:
          path: kubo-gateway
      - name: Setup Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'kubo-gateway/go.mod'
          cache: true
          cache-dependency-path: kubo-gateway/go.sum
      - name: Build kubo-gateway
        run: make build
        working-directory: kubo-gateway

      # 3. Init the kubo-gateway
      - name: Init kubo-gateway
        run: |
          ./ipfs init --profile=test
          ./ipfs config --json Gateway.PublicGateways "$GATEWAY_PUBLIC_GATEWAYS"
          ./ipfs config --json Experimental.GatewayOverLibp2p true
          ./ipfs config Addresses.Gateway "/ip4/127.0.0.1/tcp/8080"
          ./ipfs config Addresses.API "/ip4/127.0.0.1/tcp/5001"
        working-directory: kubo-gateway/cmd/ipfs

      # 4. Populate the Kubo gateway with the gateway-conformance fixtures
      - name: Import fixtures
        run: |
          # Import car files
          find ./fixtures -name '*.car' -exec kubo-gateway/cmd/ipfs/ipfs dag import --pin-roots=false {} \;

      # 5. Start the kubo-gateway
      - name: Start kubo-gateway
        run: |
          ( ./ipfs daemon & ) | sed '/Daemon is ready/q'
          while [[ "$(./ipfs id | jq '.Addresses | length')" == '0' ]]; do sleep 1; done
        working-directory: kubo-gateway/cmd/ipfs

      # 6. Setup a kubo http-p2p-proxy to expose libp2p protocol as a regular HTTP port for gateway conformance tests
      - name: Init p2p-proxy kubo node
        env:
          IPFS_PATH: "~/.kubo-p2p-proxy"
        run: |
          ./ipfs init --profile=test -e
          ./ipfs config --json Experimental.Libp2pStreamMounting true
          ./ipfs config Addresses.Gateway "/ip4/127.0.0.1/tcp/8081"
          ./ipfs config Addresses.API "/ip4/127.0.0.1/tcp/5002"
        working-directory: kubo-gateway/cmd/ipfs

      # 7. Start the kubo http-p2p-proxy
      - name: Start kubo http-p2p-proxy
        env:
          IPFS_PATH: "~/.kubo-p2p-proxy"
        run: |
          ( ./ipfs daemon & ) | sed '/Daemon is ready/q'
          while [[ "$(./ipfs id | jq '.Addresses | length')" == '0' ]]; do sleep 1; done
        working-directory: kubo-gateway/cmd/ipfs

      # 8. Start forwarding data from the http-p2p-proxy to the node serving the Gateway API over libp2p
      - name: Start http-over-libp2p forwarding proxy
        run: |
          gatewayNodeId=$(./ipfs --api=/ip4/127.0.0.1/tcp/5001 id -f="<id>")
          ./ipfs --api=/ip4/127.0.0.1/tcp/5002 swarm connect $(./ipfs --api=/ip4/127.0.0.1/tcp/5001 swarm addrs local --id | head -n 1)
          ./ipfs --api=/ip4/127.0.0.1/tcp/5002 p2p forward --allow-custom-protocol /http/1.1 /ip4/127.0.0.1/tcp/8092 /p2p/$gatewayNodeId
        working-directory: kubo-gateway/cmd/ipfs

      # 9. Run the gateway-conformance tests over libp2p
      - name: Run gateway-conformance tests over libp2p
        uses: ipfs/gateway-conformance/.github/actions/test@v0.12
        with:
          gateway-url: http://127.0.0.1:8092
          args: --specs "trustless-gateway,-trustless-ipns-gateway" -skip 'TestGatewayCar/GET_response_for_application/vnd.ipld.car/Header_Content-Length'
          json: output.json
          xml: output.xml
          html: output.html
          markdown: output.md

      # 10. Upload the results
      - name: Upload MD summary
        if: failure() || success()
        run: cat output.md >> $GITHUB_STEP_SUMMARY
      - name: Upload HTML report
        if: failure() || success()
        uses: actions/upload-artifact@v7
        with:
          name: gateway-conformance-libp2p.html
          path: output.html
      - name: Upload JSON report
        if: failure() || success()
        uses: actions/upload-artifact@v7
        with:
          name: gateway-conformance-libp2p.json
          path: output.json


================================================
FILE: .github/workflows/generated-pr.yml
================================================
name: Close Generated PRs

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:

permissions:
  issues: write
  pull-requests: write

jobs:
  stale:
    uses: ipdxco/unified-github-workflows/.github/workflows/reusable-generated-pr.yml@v1


================================================
FILE: .github/workflows/gobuild.yml
================================================
name: Go Build

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  go-build:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "4xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 20
    env:
      TEST_DOCKER: 0
      TEST_VERBOSE: 1
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
          cache: true
          cache-dependency-path: go.sum

      - name: Build all platforms
        run: |
          # Read platforms from build-platforms.yml and build each one
          echo "Building kubo for all platforms..."

          # Read and build each platform
          grep '^  - ' .github/build-platforms.yml | sed 's/^  - //' | while read -r platform; do
            if [ -z "$platform" ]; then
              continue
            fi

            echo "::group::Building $platform"
            GOOS=$(echo "$platform" | cut -d- -f1)
            GOARCH=$(echo "$platform" | cut -d- -f2)

            echo "Building $platform"
            echo "  GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs"
            GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs
            echo "::endgroup::"
          done

          echo "All platforms built successfully"

================================================
FILE: .github/workflows/golang-analysis.yml
================================================
name: Go Check

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

permissions:
  contents: read  #  to fetch code (actions/checkout)

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  go-check:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v6
        with:
          submodules: recursive
      - uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - name: Check that go.mod is tidy
        uses: protocol/multiple-go-modules@v1.4
        with:
          run: |
            go mod tidy
            if [[ -n $(git ls-files --other --exclude-standard --directory -- go.sum) ]]; then
              echo "go.sum was added by go mod tidy"
              exit 1
            fi
            git diff --exit-code -- go.sum go.mod
      - name: go fmt
        if: always() # run this step even if the previous one failed
        run: |
          out=$(go fmt ./...)
          if [[ -n "$out" ]]; then
            echo "Files are not go-fmt-ed:"
            echo "$out"
            exit 1
          fi
      - name: go fix
        if: always() # run this step even if the previous one failed
        run: |
          go fix ./...
          if [[ -n $(git diff --name-only) ]]; then
            echo "go fix produced changes. Run 'go fix ./...' locally and commit the result."
            git diff
            exit 1
          fi
      - name: go vet
        if: always() # run this step even if the previous one failed
        uses: protocol/multiple-go-modules@v1.4
        with:
          run: go vet ./...


================================================
FILE: .github/workflows/golint.yml
================================================
name: Go Lint

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  go-lint:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 10
    env:
      TEST_DOCKER: 0
      TEST_FUSE: 0
      TEST_VERBOSE: 1
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - run: make -O test_go_lint


================================================
FILE: .github/workflows/gotest.yml
================================================
name: Go Test

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  # Unit tests with coverage collection (uploaded to Codecov)
  unit-tests:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 15
    env:
      GOTRACEBACK: single  # reduce noise on test timeout panics
      TEST_DOCKER: 0
      TEST_FUSE: 0
      TEST_VERBOSE: 1
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - name: Check out Kubo
        uses: actions/checkout@v6
      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - name: Install missing tools
        run: sudo apt update && sudo apt install -y zsh
      - name: Run unit tests
        run: |
          make test_unit &&
            [[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]]
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
        if: failure() || success()
        with:
          name: unittests
          files: coverage/unit_tests.coverprofile
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: false
      - name: Create a proper JUnit XML report
        uses: ipdxco/gotest-json-to-junit-xml@v1
        with:
          input: test/unit/gotest.json
          output: test/unit/gotest.junit.xml
        if: failure() || success()
      - name: Archive the JUnit XML report
        uses: actions/upload-artifact@v7
        with:
          name: unit-tests-junit
          path: test/unit/gotest.junit.xml
        if: failure() || success()
      - name: Create a HTML report
        uses: ipdxco/junit-xml-to-html@v1
        with:
          mode: no-frames
          input: test/unit/gotest.junit.xml
          output: test/unit/gotest.html
        if: failure() || success()
      - name: Archive the HTML report
        uses: actions/upload-artifact@v7
        with:
          name: unit-tests-html
          path: test/unit/gotest.html
        if: failure() || success()
      - name: Create a Markdown report
        uses: ipdxco/junit-xml-to-html@v1
        with:
          mode: summary
          input: test/unit/gotest.junit.xml
          output: test/unit/gotest.md
        if: failure() || success()
      - name: Set the summary
        run: cat test/unit/gotest.md >> $GITHUB_STEP_SUMMARY
        if: failure() || success()

  # End-to-end integration/regression tests from test/cli
  # (Go-based replacement for legacy test/sharness shell scripts)
  cli-tests:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 15
    env:
      GOTRACEBACK: single  # reduce noise on test timeout panics
      TEST_VERBOSE: 1
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - name: Check out Kubo
        uses: actions/checkout@v6
      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - name: Install missing tools
        run: sudo apt update && sudo apt install -y zsh
      - name: Run CLI tests
        env:
          IPFS_PATH: ${{ runner.temp }}/ipfs-test
        run: make test_cli
      - name: Create JUnit XML report
        uses: ipdxco/gotest-json-to-junit-xml@v1
        with:
          input: test/cli/cli-tests.json
          output: test/cli/cli-tests.junit.xml
        if: failure() || success()
      - name: Archive JUnit XML report
        uses: actions/upload-artifact@v7
        with:
          name: cli-tests-junit
          path: test/cli/cli-tests.junit.xml
        if: failure() || success()
      - name: Create HTML report
        uses: ipdxco/junit-xml-to-html@v1
        with:
          mode: no-frames
          input: test/cli/cli-tests.junit.xml
          output: test/cli/cli-tests.html
        if: failure() || success()
      - name: Archive HTML report
        uses: actions/upload-artifact@v7
        with:
          name: cli-tests-html
          path: test/cli/cli-tests.html
        if: failure() || success()
      - name: Create Markdown report
        uses: ipdxco/junit-xml-to-html@v1
        with:
          mode: summary
          input: test/cli/cli-tests.junit.xml
          output: test/cli/cli-tests.md
        if: failure() || success()
      - name: Set summary
        run: cat test/cli/cli-tests.md >> $GITHUB_STEP_SUMMARY
        if: failure() || success()

  # Example tests (kubo-as-a-library)
  example-tests:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 5
    env:
      GOTRACEBACK: single
    defaults:
      run:
        shell: bash
    steps:
      - name: Check out Kubo
        uses: actions/checkout@v6
      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - name: Run example tests
        run: make test_examples


================================================
FILE: .github/workflows/interop.yml
================================================
# Interoperability Tests
#
# This workflow ensures Kubo remains compatible with the broader IPFS ecosystem.
# It builds Kubo from source, then runs:
#
# 1. helia-interop: Tests compatibility with Helia (JavaScript IPFS implementation)
#    using Playwright-based tests from @helia/interop package.
#
# 2. ipfs-webui: Runs E2E tests from ipfs/ipfs-webui repository to verify
#    the web interface works correctly with the locally built Kubo binary.
#
# Both jobs use caching to speed up repeated runs (npm dependencies, Playwright
# browsers, and webui build artifacts).

name: Interop

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - '**/*.md'
  push:
    branches:
      - 'master'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

defaults:
  run:
    shell: bash

jobs:
  interop-prep:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ubuntu-latest
    timeout-minutes: 5
    env:
      TEST_DOCKER: 0
      TEST_FUSE: 0
      TEST_VERBOSE: 1
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'
      - run: make build
      - uses: actions/upload-artifact@v7
        with:
          name: kubo
          path: cmd/ipfs/ipfs
  helia-interop:
    needs: [interop-prep]
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 20
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/setup-node@v6
        with:
          node-version: lts/*
      - uses: actions/download-artifact@v8
        with:
          name: kubo
          path: cmd/ipfs
      - run: chmod +x cmd/ipfs/ipfs
      - run: sudo apt update
      - run: sudo apt install -y libxkbcommon0 libxdamage1 libgbm1 libpango-1.0-0 libcairo2 # dependencies for playwright
      # Cache node_modules based on latest @helia/interop version from npm registry.
      # This ensures we always test against the latest release while still benefiting
      # from caching when the version hasn't changed.
      - name: Get latest @helia/interop version
        id: helia-version
        run: echo "version=$(npm view @helia/interop version)" >> $GITHUB_OUTPUT
      - name: Cache helia-interop node_modules
        uses: actions/cache@v5
        id: helia-cache
        with:
          path: node_modules
          key: ${{ runner.os }}-helia-interop-${{ steps.helia-version.outputs.version }}
      - name: Install @helia/interop
        if: steps.helia-cache.outputs.cache-hit != 'true'
        run: npm install @helia/interop
      # TODO(IPIP-499): Remove --grep --invert workaround once helia implements IPIP-499
      # Tracking issue: https://github.com/ipfs/helia/issues/941
      #
      # PROVISIONAL HACK: Skip '@helia/mfs - should have the same CID after
      # creating a file' test due to IPIP-499 changes in kubo.
      #
      # WHY IT FAILS: The test creates a 5-byte file in MFS on both kubo and helia,
      # then compares the root directory CID. With kubo PR #11148, `ipfs files write`
      # now produces raw CIDs for single-block files (matching `ipfs add --raw-leaves`),
      # while helia uses `reduceSingleLeafToSelf: false` which keeps the dag-pb wrapper.
      # Different file CIDs lead to different directory CIDs.
      #
      # We run aegir directly (instead of helia-interop binary) because only aegir
      # supports the --grep/--invert flags needed to exclude specific tests.
      - name: Run helia-interop tests (excluding IPIP-499 incompatible test)
        run: npx aegir test -t node --bail -- --grep 'should have the same CID after creating a file' --invert
        env:
          KUBO_BINARY: ${{ github.workspace }}/cmd/ipfs/ipfs
        working-directory: node_modules/@helia/interop
  ipfs-webui:
    needs: [interop-prep]
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "2xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: 20
    env:
      NO_SANDBOX: true
      LIBP2P_TCP_REUSEPORT: false
      LIBP2P_ALLOW_WEAK_RSA_KEYS: 1
      E2E_IPFSD_TYPE: go
      GIT_PAGER: cat
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/download-artifact@v8
        with:
          name: kubo
          path: cmd/ipfs
      - run: chmod +x cmd/ipfs/ipfs
      - uses: actions/checkout@v6
        with:
          repository: ipfs/ipfs-webui
          path: ipfs-webui
      - uses: actions/setup-node@v6
        with:
          node-version-file: 'ipfs-webui/.tool-versions'
      - id: webui-ref
        run: echo "ref=$(git rev-parse --short HEAD)" | tee -a $GITHUB_OUTPUT
        working-directory: ipfs-webui
      - id: webui-state
        env:
          GITHUB_TOKEN: ${{ github.token }}
          ENDPOINT: repos/ipfs/ipfs-webui/commits/${{ steps.webui-ref.outputs.ref }}/status
          SELECTOR: .state
          KEY: state
        run: gh api "$ENDPOINT" --jq "$SELECTOR" | xargs -I{} echo "$KEY={}" | tee -a $GITHUB_OUTPUT
      # Cache node_modules based on package-lock.json
      - name: Cache node_modules
        uses: actions/cache@v5
        id: node-modules-cache
        with:
          path: ipfs-webui/node_modules
          key: ${{ runner.os }}-webui-node-modules-${{ hashFiles('ipfs-webui/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-webui-node-modules-
      - name: Install dependencies
        if: steps.node-modules-cache.outputs.cache-hit != 'true'
        run: npm ci --prefer-offline --no-audit --progress=false
        working-directory: ipfs-webui
      # Cache Playwright browsers
      - name: Cache Playwright browsers
        uses: actions/cache@v5
        id: playwright-cache
        with:
          path: ~/.cache/ms-playwright
          key: ${{ runner.os }}-playwright-${{ hashFiles('ipfs-webui/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-playwright-
      # On cache miss: download browsers and install OS dependencies
      - name: Install Playwright with dependencies
        if: steps.playwright-cache.outputs.cache-hit != 'true'
        run: npx playwright install --with-deps
        working-directory: ipfs-webui
      # On cache hit: only ensure OS dependencies are present (fast, idempotent)
      - name: Install Playwright OS dependencies
        if: steps.playwright-cache.outputs.cache-hit == 'true'
        run: npx playwright install-deps
        working-directory: ipfs-webui
      # Cache test build output
      - name: Cache test build
        uses: actions/cache@v5
        id: test-build-cache
        with:
          path: ipfs-webui/build
          key: ${{ runner.os }}-webui-build-${{ hashFiles('ipfs-webui/package-lock.json', 'ipfs-webui/src/**', 'ipfs-webui/public/**') }}
          restore-keys: |
            ${{ runner.os }}-webui-build-
      - name: Build ipfs-webui@${{ steps.webui-ref.outputs.ref }} (state=${{ steps.webui-state.outputs.state }})
        if: steps.test-build-cache.outputs.cache-hit != 'true'
        run: npm run test:build
        working-directory: ipfs-webui
      - name: Test ipfs-webui@${{ steps.webui-ref.outputs.ref }} (state=${{ steps.webui-state.outputs.state }}) E2E against the locally built Kubo binary
        run: npm run test:e2e
        env:
          IPFS_GO_EXEC: ${{ github.workspace }}/cmd/ipfs/ipfs
        working-directory: ipfs-webui
      - name: Upload test artifacts on failure
        if: failure()
        uses: actions/upload-artifact@v7
        with:
          name: webui-test-results
          path: ipfs-webui/test-results/
          retention-days: 7


================================================
FILE: .github/workflows/sharness.yml
================================================
name: Sharness

on:
  workflow_dispatch:
  pull_request:
    paths-ignore:
      - "**/*.md"
  push:
    branches:
      - "master"

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  sharness-test:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: ${{ fromJSON(github.repository == 'ipfs/kubo' && '["self-hosted", "linux", "x64", "4xlarge"]' || '"ubuntu-latest"') }}
    timeout-minutes: ${{ github.repository == 'ipfs/kubo' && 15 || 60 }}
    defaults:
      run:
        shell: bash
    steps:
      - name: Checkout Kubo
        uses: actions/checkout@v6
        with:
          path: kubo
      - name: Setup Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'kubo/go.mod'
      - name: Install missing tools
        run: sudo apt update && sudo apt install -y socat net-tools fish libxml2-utils
      - uses: actions/cache@v5
        with:
          path: test/sharness/lib/dependencies
          key: ${{ runner.os }}-test-generate-junit-html-${{ hashFiles('test/sharness/lib/test-generate-junit-html.sh') }}
      - name: Run Sharness tests
        run: |
          make -O -j "$PARALLEL" \
            test_sharness \
            coverage/sharness_tests.coverprofile \
            test/sharness/test-results/sharness.xml
        working-directory: kubo
        env:
          TEST_DOCKER: 1
          TEST_PLUGIN: 0
          TEST_FUSE: 0
          TEST_VERBOSE: 1
          TEST_JUNIT: 1
          TEST_EXPENSIVE: 1
          IPFS_CHECK_RCMGR_DEFAULTS: 1
          CONTINUE_ON_S_FAILURE: 1
          # increasing parallelism beyond 10 doesn't speed up the tests much
          PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }}
      - name: Upload coverage report
        uses: codecov/codecov-action@671740ac38dd9b0130fbe1cec585b89eea48d3de # v5.5.2
        if: failure() || success()
        with:
          name: sharness
          files: kubo/coverage/sharness_tests.coverprofile
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: false
      - name: Aggregate results
        run: find kubo/test/sharness/test-results -name 't*-*.sh.*.counts' | kubo/test/sharness/lib/sharness/aggregate-results.sh > kubo/test/sharness/test-results/summary.txt
      - name: 👉️ If this step failed, go to «Summary» (top left) → «HTML Report» → inspect the «Failures» column
        run: |
          cat kubo/test/sharness/test-results/summary.txt &&
          grep 'failed\s*0' kubo/test/sharness/test-results/summary.txt
      - name: Add aggregate results to the summary
        if: failure() || success()
        run: |
          echo "# Summary" >> $GITHUB_STEP_SUMMARY
          echo >> $GITHUB_STEP_SUMMARY
          cat kubo/test/sharness/test-results/summary.txt >> $GITHUB_STEP_SUMMARY
      - name: Generate one-page HTML report
        uses: ipdxco/junit-xml-to-html@v1
        if: failure() || success()
        with:
          mode: no-frames
          input: kubo/test/sharness/test-results/sharness.xml
          output: kubo/test/sharness/test-results/sharness.html
      - name: Upload one-page HTML report to S3
        id: one-page
        uses: ipdxco/custom-github-runners/.github/actions/upload-artifact@main
        if: github.repository == 'ipfs/kubo' && (failure() || success())
        with:
          source: kubo/test/sharness/test-results/sharness.html
          destination: sharness.html
      - name: Upload one-page HTML report
        if: github.repository != 'ipfs/kubo' && (failure() || success())
        uses: actions/upload-artifact@v7
        with:
          name: sharness.html
          path: kubo/test/sharness/test-results/sharness.html
      - name: Generate full HTML report
        uses: ipdxco/junit-xml-to-html@v1
        if: failure() || success()
        with:
          mode: frames
          input: kubo/test/sharness/test-results/sharness.xml
          output: kubo/test/sharness/test-results/sharness-html
      - name: Upload full HTML report to S3
        id: full
        uses: ipdxco/custom-github-runners/.github/actions/upload-artifact@main
        if: github.repository == 'ipfs/kubo' && (failure() || success())
        with:
          source: kubo/test/sharness/test-results/sharness-html
          destination: sharness-html/
      - name: Upload full HTML report
        if: github.repository != 'ipfs/kubo' && (failure() || success())
        uses: actions/upload-artifact@v7
        with:
          name: sharness-html
          path: kubo/test/sharness/test-results/sharness-html
      - name: Add S3 links to the summary
        if: github.repository == 'ipfs/kubo' && (failure() || success())
        run: echo "$MD" >> $GITHUB_STEP_SUMMARY
        env:
          MD: |
            # HTML Reports

            - View the [one page HTML report](${{ steps.one-page.outputs.url }})
            - View the [full HTML report](${{ steps.full.outputs.url }}index.html)


================================================
FILE: .github/workflows/spellcheck.yml
================================================
name: Spell Check

on:
  pull_request:
  push:
    branches: ["master"]
  workflow_dispatch:

permissions:
  contents: read

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  spellcheck:
    uses: ipdxco/unified-github-workflows/.github/workflows/reusable-spellcheck.yml@v1


================================================
FILE: .github/workflows/stale.yml
================================================
name: Close Stale Issues

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:

permissions:
  issues: write
  pull-requests: write

jobs:
  stale:
    uses: ipdxco/unified-github-workflows/.github/workflows/reusable-stale-issue.yml@v1


================================================
FILE: .github/workflows/sync-release-assets.yml
================================================
name: Sync GitHub Release Assets

on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * *'

concurrency:
  group: release-assets-dist-sync
  cancel-in-progress: true

permissions:
  contents: write  #  to upload release asset

jobs:
  dist-ipfs-tech:
    if: github.repository == 'ipfs/kubo' || github.event_name == 'workflow_dispatch'
    runs-on: "ubuntu-latest"
    timeout-minutes: 15
    steps:
      - uses: ipfs/download-ipfs-distribution-action@v1
      - uses: ipfs/start-ipfs-daemon-action@v1
        with:
          args: --init --init-profile=flatfs,server --enable-gc=false
      - uses: actions/setup-node@v6
        with:
          node-version: 14
      - name: Sync the latest 5 github releases
        uses: actions/github-script@v8
        with:
          script: |
            const fs = require('fs').promises
            const max_synced = 5

            // fetch github releases
            resp = await github.rest.repos.listReleases({
              owner: context.repo.owner,
              repo: context.repo.repo,
              page: 1,
              per_page: max_synced
            })
            const release_assets = [];
            num_synced = 0;
            for (const release of resp.data) {
              console.log("checking release tagged", release.tag_name)
              if (num_synced > max_synced) {
                console.log("done: synced", max_synced, "latest releases")
                break;
              }
              num_synced += 1

              const github_assets = new Set()
              for (const asset of release.assets) {
                github_assets.add(asset.name)
              }

              // fetch asset info from dist.ipfs.tech
              p = '/ipns/dist.ipfs.tech/kubo/' + release.tag_name
              let stdout = ''
              const options = {}
              options.listeners = {
                stdout: (data) => {
                  stdout += data.toString();
                }
              }
              await exec.exec('ipfs', ['ls', p], options)

              const dist_assets = new Set()
              const missing_files = []
              for (const raw_line of stdout.split("\n")) {
                line = raw_line.trim();
                if (line.length != 0) {
                  file = line.split(/(\s+)/).filter( function(e) { return e.trim().length > 0; } )[2]
                  dist_assets.add(file)
                  if (!github_assets.has(file)) {
                    missing_files.push(file)
                  }
                }
              }

              // if dist.ipfs.tech has files not found in github, copy them over
              for (const file of missing_files) {
                file_sha = file + ".sha512"
                file_cid = file + ".cid"

                // skip files that don't have .cid and .sha512 checksum files
                if (!dist_assets.has(file_sha) || !dist_assets.has(file_cid)) {
                  if (!file.endsWith('.cid') && !file.endsWith('.sha512')) { // silent skip of .sha512.sha512 :)
                    console.log(`skipping "${file}" as dist.ipfs.tech does not provide .cid and .sha512 checksum files for it`)
                  }
                  continue
                }

                console.log("fetching", file, "from dist.ipfs.tech")
                await exec.exec('ipfs', ['get', p + '/' + file])
                await exec.exec('ipfs', ['get', p + '/' + file_sha])
                await exec.exec('ipfs', ['get', p + '/' + file_cid])
                console.log("verifying contents of", file)

                // compute sha512 output for file
                let sha_stdout = ''
                const sha_options = {}
                sha_options.listeners = {
                  stdout: (data) => {
                    sha_stdout += data.toString();
                  }
                }
                await exec.exec('sha512sum', [file], sha_options)
                // read expected sha512 output
                const sha_data = await fs.readFile(file_sha, "utf8")
                const digest = (s) => s.split(' ').shift()
                if (digest(sha_data) != digest(sha_stdout)) {
                  console.log(`${file}.sha512: ${sha_data}`)
                  console.log(`sha512sum ${file}: ${sha_stdout}`)
                  throw "checksum verification failed for " + file
                }

                console.log("uploading", file, "to github release", release.tag_name)
                const uploadReleaseAsset = async (file) => github.rest.repos.uploadReleaseAsset({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  release_id: release.id,
                  headers: {
                    "content-type": "application/octet-stream",
                    "content-length": `${(await fs.stat(file)).size}`
                  },
                  name: file,
                  data: await fs.readFile(file)
                })
                await uploadReleaseAsset(file)
                await uploadReleaseAsset(file_sha)
                await uploadReleaseAsset(file_cid)

              }
              // summary of assets on both sides
              release_assets.push({ tag: release.tag_name, github_assets, dist_assets })
            }
            console.log(release_assets)
            return release_assets


================================================
FILE: .github/workflows/test-migrations.yml
================================================
name: Migrations

on:
  workflow_dispatch:
  pull_request:
    paths:
      # Migration implementation files
      - 'repo/fsrepo/migrations/**'
      - 'test/cli/migrations/**'
      # Config and repo handling
      - 'repo/fsrepo/**'
      # This workflow file itself
      - '.github/workflows/test-migrations.yml'
  push:
    branches:
      - 'master'
      - 'release-*'
    paths:
      - 'repo/fsrepo/migrations/**'
      - 'test/cli/migrations/**'
      - 'repo/fsrepo/**'
      - '.github/workflows/test-migrations.yml'

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }}
  cancel-in-progress: true

jobs:
  test:
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    timeout-minutes: 20
    env:
      TEST_VERBOSE: 1
      IPFS_CHECK_RCMGR_DEFAULTS: 1
    defaults:
      run:
        shell: bash
    steps:
      - name: Check out Kubo
        uses: actions/checkout@v6

      - name: Set up Go
        uses: actions/setup-go@v6
        with:
          go-version-file: 'go.mod'

      - name: Build kubo binary
        run: |
          make build
          echo "Built ipfs binary at $(pwd)/cmd/ipfs/"

      - name: Add kubo to PATH
        run: |
          echo "$(pwd)/cmd/ipfs" >> $GITHUB_PATH

      - name: Verify ipfs in PATH
        run: |
          which ipfs || echo "ipfs not in PATH"
          ipfs version || echo "Failed to run ipfs version"

      - name: Run migration unit tests
        run: |
          go test ./repo/fsrepo/migrations/...

      - name: Run CLI migration tests
        env:
          IPFS_PATH: ${{ runner.temp }}/ipfs-test
        run: |
          export PATH="${{ github.workspace }}/cmd/ipfs:$PATH"
          which ipfs || echo "ipfs not found in PATH"
          ipfs version || echo "Failed to run ipfs version"
          go test ./test/cli/migrations/...

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v7
        with:
          name: ${{ matrix.os }}-test-results
          path: |
            test/**/*.log
            ${{ runner.temp }}/ipfs-test/


================================================
FILE: .gitignore
================================================
# ipfs can generate profiling dump files
*.cpuprof
*.memprof

*.swp
.ipfsconfig
*.out
*.coverprofile
*.test
*.orig
*~

coverage.txt
gx-workspace-update.json

.ipfs
bin/gx
bin/protoc-*
bin/gx*
bin/tmp
bin/gocovmerge
bin/cover


vendor
.tarball
go-ipfs-source.tar.gz
docs/examples/go-ipfs-as-a-library/example-folder/Qm*
/test/sharness/t0054-dag-car-import-export-data/*.car

# test artifacts from make test_unit / test_cli
/test/unit/gotest.json
/test/unit/gotest.junit.xml
/test/cli/cli-tests.json

# ignore build output from snapcraft
/ipfs_*.snap
/parts
/stage
/prime


================================================
FILE: .golangci.yml
================================================
linters:
  enable:
    - stylecheck

linters-settings:
  stylecheck:
    checks:
    - all
    - '-ST1003'
    dot-import-whitelist:
      - github.com/ipfs/kubo/test/cli/testutils


================================================
FILE: .hadolint.yaml
================================================
# Hadolint configuration for Kubo Docker image
# https://github.com/hadolint/hadolint

# Ignore specific rules
ignored:
  # DL3008: Pin versions in apt-get install
  # We use stable base images and prefer smaller layers over version pinning
  - DL3008

# Trust base images from these registries
trustedRegistries:
  - docker.io
  - gcr.io

================================================
FILE: .mailmap
================================================
# This file allows re-mapping author names/emails
# while maintaining the integrity of the repository
#
# Spec: https://www.kernel.org/pub/software/scm/git/docs/git-shortlog.html#_mapping_authors
#

@RubenKelevra <cyrond@gmail.com>
Aaron Hill <aa1ronham@gmail.com>
Adam Gashlin <agashlin@gmail.com>
Adam Uhlir <uhlir.a@gmail.com>
Adin Schmahmann <adin.schmahmann@gmail.com>
Adrian Lanzafame <adrianlanzafame92@gmail.com>
Adrian Ulrich <adrian@blinkenlights.ch>
Alan Shaw <alan.shaw@protocol.ai> <alan@tableflip.io>
Alec Brickner <alecjbrick@gmail.com>
Alex <alexgbahm@gmail.com>
Alfie John <alfie@alfie.wtf>
Alfonso Montero <amontero@tinet.org>
Ali Mirlou <alimirlou@gmail.com>
Andres Buritica <andres@thelinuxkid.com>
Andrew Chin <achin@eminence32.net>
Andrew Nesbitt <andrewnez@gmail.com>
Andy Leap <andyleap@gmail.com>
Antti Kaihola <antti+ipfs@kaihola.fi>
Artem Andreenko <mio@volmy.com>
Arthur Elliott <clownpriest@gmail.com>
Bamvor Zhang <jian.zhang@ipfsbit.com>
Baptiste Jonglez <baptiste--git@jonglez.org>
Bernhard M. Wiedemann <bwiedemann@suse.de>
Boris Mann <boris@bmannconsulting.com>
Brendan Mc <Bren2010@users.noreply.github.com>
Brendan McMillion <brendan@cloudflare.com>
Brendan O'Brien <sparkle_pony_2000@qri.io>
Brian Tiger Chow <brian.holderchow@gmail.com>
Brian Tiger Chow <perfmode@users.noreply.github.com>
Caian <caian@ggaunicamp.com>
Caio Alonso <caio@caioalonso.com>
Carlos Cobo <toqueteos@gmail.com>
Casey Chance <caseyjchance@gmail.com>
Cayman Nava <caymannava@gmail.com>
Chas Leichner <chas@chas.io>
Chris Boddy <chris@boddy.im>
Chris Chinchilla <chris.ward@consensys.net>
Chris Grimmett <xtoast@gmail.com>
Chris P <sahib@online.de>
Christopher Sasarak <chris.sasarak@gmail.com>
Christian Couder <chriscool@tuxfamily.org>
Christian Kniep <christian@qnib.org>
Christopher Buesser <christopher.buesser@gmail.com>
Cole Brown <bigswim@gmail.com>
Corbin Page <corbin.page@gmail.com>
Cornelius Toole <cornelius.toole@gmail.com>
Dan <35669742+NukeManDan@users.noreply.github.com>
Daniel Aleksandersen <code@daniel.priv.no>
Daniel Grossmann-Kavanagh <me@danielgk.com>
Daniel Mack <daniel@zonque.org>
David <github@kattfest.se>
David Braun <David.Braun@Toptal.com>
David Brennan <david.n.brennan@gmail.com>
David Dias <mail@daviddias.me> <daviddias.p@gmail.com>
David Wagner <wagdav@gmail.com>
Devin <studyzy@gmail.com>
Dimitris Apostolou <dimitris.apostolou@icloud.com>
Diogo Silva <fsdiogo@gmail.com>
Dirk McCormick <dirkmdev@gmail.com>
Djalil Dreamski <32184973+dreamski21@users.noreply.github.com>
Dominic Della Valle <ddvpublic@gmail.com> <DDVpublic@Gmail.com> <ddvpublic@Gmail.com> <not@yet.net>
Dominic Tarr <dominic.tarr@gmail.com>
Ian Preston <ianopolous@protonmail.com> <ianopolous@gmail.com>
Dylan Powers <dylan.kyle.powers@gmail.com>
Edison Lee <edisonlee@edisonlee55.com>
Elias Gabrielsson <elias@benefactory.se>
Emery Hemingway <emery@vfemail.net>
Enrique Erne <enrique.erne@gmail.com>
Eoghan Ó Carragáin <eoghan.ocarragain@gmail.com>
Erik Ingenito <erik@carbonfive.com>
Esteban <eginez@gmail.com>
Ethan Buchman <ethan@coinculture.info>
Etienne Laurin <etienne@atnnn.com>
Forrest Weston <forrest@protocol.ai> <fweston@eecs.wsu.edu> <Forrest.Weston@gmail.com>
Francesco Canessa <makevoid@gmail.com>
Frank Sachsenheim <funkyfuture@users.noreply.github.com>
Frederik Riedel <frederik.riedel@frogg.io>
Friedel Ziegelmayer <dignifiedquire@gmail.com>
George Antoniadis <george@noodles.gr>
George Masgras <gmasgras@gmail.com>
Giulitti Salvatore <sgiulitti@cloudbasesolutions.com>
Giuseppe Bertone <bertone.giuseppe@gmail.com>
Gowtham G <gowthamgts12@gmail.com>
Harald Nordgren <haraldnordgren@gmail.com>
Harlan T Wood <harlantwood@users.noreply.github.com>
Hector Sanjuan <hector@protocol.ai> <code@hector.link> <hsanjuan@users.noreply.github.com>
Henrique Dias <hacdias@gmail.com>
Henry <cryptix@riseup.net>
Herman Junge <chpdg42@gmail.com>
Hlib <Glebasya2000@mail.ru>
Ho-Sheng Hsiao <talktohosh@gmail.com>
Hucg <41573766+hcg1314@users.noreply.github.com>
Iaroslav Gridin <voker57@gmail.com>
Igor Velkov <mozdiav@iav.lv>
Ivan <ivan386@users.noreply.github.com>
JP Hastings-Spital <jphastings@gmail.com>
Jack Loughran <30052269+jackloughran@users.noreply.github.com>
Jakub Sztandera <kubuxu@protocol.ai> <kubuxu@gmail.com> <kubuxu@ipfs.io> <kubuxu@protonmail.ch>
Jakub Kaczmarzyk <jakubk@mit.edu>
James Stanley <james@incoherency.co.uk>
Jamie Wilkinson <jamie@jamiedubs.com>
Jan Winkelmann <keks@cryptoscope.co> <j-winkelmann@tuhh.de>
Jason Carver <jacarver@linkedin.com>
Jeff Thompson <jefft0@remap.ucla.edu>
Jeromy Johnson <why@ipfs.io> <jeromyj@gmail.com> <jeromy.johnson@isilon.com> <whyrusleeping@users.noreply.github.com>
Jesse Weinstein <jesse@wefu.org>
Jessica Schilling <jessica@protocol.ai>
Jim McDonald <Jim@mcdee.net>
John Reed <john@re2d.xyz> <john.reeed@gmail.com>
Johnny <9611008+johnnymatthews@users.noreply.github.com>
Jon Choi <choi.jonathanh@gmail.com>
Jonathan Dahan <jonathan@jonathan.is>
Jordan Danford <jordandanford@gmail.com>
Jorropo <jorropo.pgm@gmail.com>
Juan Batiz-Benet <juan@benet.ai>
Justin Drake <drakefjustin@gmail.com>
Kacper Łukawski <kacluk98@gmail.com>
Karthik Bala <drmelonhead@gmail.com>
Kejie Zhang <601172892@qq.com>
Kerem <keremgocen@gmail.com>
Kevin Atkinson <k@kevina.org>
Kevin Simper <kevin.simper@gmail.com>
Kevin Wallace <kevin@pentabarf.net>
Kirill Goncharov <kdgoncharov@gmail.com>
Kishan Mohanbhai Sagathiya <kishansagathiya@gmail.com>
Knut Ahlers <knut@ahlers.me>
Konstantin Koroviev <kkoroviev@gmail.com>
Koushik Roy <koushik@meff.me>
Kristoffer Ström <kristoffer@rymdkoloni.se>
Kuro1 <412681778@qq.com>
Lars Gierth <larsg@systemli.org> <lgierth@users.noreply.github.com>
Leo Arias <yo@elopio.net> <leo.arias@canonical.com>
Li Zheng <flyskywhy@gmail.com>
Lorenzo Manacorda <lorenzo@mailbox.org>
Lorenzo Setale <koalalorenzo@users.noreply.github.com>
Louis Thibault <l.thibault@sentimens.com>
Lucas Garron <code@garron.net>
Lucas Molas <schomatis@gmail.com>
Marcin Janczyk <marcinjanczyk@gmail.com>
Marcin Rataj <lidel@lidel.org>
Markus Amalthea Magnuson <markus.magnuson@gmail.com>
Marten Seemann <martenseemann@gmail.com>
Masashi Salvador Mitsuzawa <masashisalvador57f@gmail.com>
Massino Tinovan <massino@droppod,io>
Mat Kelly <mkelly@cs.odu.edu>
Mathijs de Bruin <mathijs@mathijsfietst.nl>
Matouš Skála <skala.matous@gmail.com>
Matt Bell <mappum@gmail.com>
Matt Joiner <anacrolix@gmail.com>
Max Chechel <hexdigest@gmail.com> <mc@gojuno.com>
Max Kerp <maxkerp@gmail.com>
Mib Kd743naq <mib.kd743naq@gmail.com>
Michael Avila <me@michaelavila.com> <davidmichaelavila@gmail.com>
Michael Lovci <michaeltlovci@gmail.com>
Michael Muré <mure.michael@gmail.com> <batolettre@gmail.com> <michael.mure@consensys.net>
Michael Pfister <pfista@gmail.com>
Michelle Lee <michelle@protocol.ai>
Miguel Torres <migueltorreslopez@gmail.com>
Mikaela Suomalainen <mikaela+git@mikaela.info>
Mildred Ki'Lya <mildred-pub.git@mildred.fr>
Molly <momack2@users.noreply.github.com>
Muneeb Ali <muneeb@ali.vc>
Mykola Nikishov <mn@mn.com.ua>
Nathan Musoke <nathan.musoke@gmail.com>
Nick Hamann <nick@wabbo.org>
Oli Evans <oli@tableflip.io>
Or Rikon <rikonor@gmail.com>
Overbool <overbool.xu@gmail.com>
Patrick Connolly <patrick.c.connolly@gmail.com>
Pavol Rusnak <stick@gk2.sk>
Peter Borzov <peter@sowingo.com> <tihoutrom@gmail.com>
Peter Rabbitson <ribasushi@protocol.ai> <peter@protocol.ai> <ribasushi@leporine.io> <mib.kd743naq@gmail.com>
Peter Wu <pwu@cloudflare.com>
Philip Nelson <me@pnelson.ca>
Pierre-Alain TORET <pierre-alain.toret@protonmail.com>
PoorPockets McNewHold <poorpocketsmcnewhold@protonmail.ch>
Pretty Please Mark Darkly <55382229+pleasemarkdarkly@users.noreply.github.com>
Péter Szilágyi <peterke@gmail.com>
Quantomic <minima38123@gmail.com>
Quinn Slack <sqs@sourcegraph.com>
Raúl Kripalani <raul@protocol.ai> <raul.kripalani@consensys.net>
ReadmeCritic <frankensteinbot@gmail.com>
Remco Bloemen <remco-git@xn--2-umb.com>
Richard Littauer <richard.littauer@gmail.com>
RideWindX <ridewindx@163.com>
Rob Brackett <rob@robbrackett.com>
Robert Carlsen <rwcarlsen@gmail.com>
Rod Vagg <rod@vagg.org>
Roerick Sweeney <sroerick@gmail.com>
Roman Khafizianov <requilence@gmail.com>
Roman Proskuryakov <humbug@deeptown.org>
Ronsor <ronsor@ronsor.pw>
RubenKelevra <cyrond@gmail.com>
Ryan Carver <ryan@ryancarver.com>
Ryan Morey <ryan.t.morey@gmail.com>
SH <github@hertenberger.bayern>
Sag0Sag0 <Sag0Sag0@users.noreply.github.com>
Sander Pick <sanderpick@gmail.com>
Scott Bigelow <epheph@gmail.com>
Sean Lang <slang800@gmail.com>
Shanti Bouchez-Mongardé <shanti-pub.git@mildred.fr>
Shaun Bruce <shaun.m.bruce@gmail.com>
Sherod Taylor <staylor@itbit.com>
Simon Kirkby <tigger@interthingy.com>
Simon Menke <simon.menke@gmail.com>
Siraj Ravel <sirajravel@gmail.com> <llSourcell@gmail.com> <jason.ravel@cbsinteractive.com>
Siva Chandran <siva.chandran@realimage.com>
Spartucus <spartucus@users.noreply.github.com>
Stephan Kulla <git.mail@kulla.me>
Stephan Seidt <evilhackerdude@gmail.com> <stephan.seidt@gmail.com>
Stephen Sugden <me@stephensugden.com>
Stephen Whitmore <stephen.whitmore@gmail.com> <noffle@users.noreply.github.com>
Steve Recio <stevenrecio@gmail.com>
Steven Allen <steven@stebalien.com>
Steven Vandevelde <icid.asset@gmail.com>
Sönke Hahn <soenkehahn@gmail.com>
TUSF <ragef33@gmail.com>
Tarnay Kálmán <kalmisoft@gmail.com>
Thomas Gardner <tmg@fastmail.com>
Tiger <rbalajis25@gmail.com>
Tim Groeneveld <tim@timg.ws>
Tim Stahel <git@swedneck.xyz>
Timothy Hobbs <timothyhobbs@seznam.cz>
Tom O'Donnell <todonnel91@gmail.com>
Tom Swindell <t.swindell@rubyx.co.uk>
Tommi Virtanen <tv@eagain.net>
Tonis Tiigi <tonistiigi@gmail.com>
Tor Arne Vestbø <torarnv@gmail.com>
Travis Person <travis.person@gmail.com> <travis@protocol.ai>
Tylar <murray.tylar@gmail.com>
John Reed <john@re2d.xyz>
Vasil Dimov <vd@FreeBSD.org>
Vijayee Kulkaa <vijayee.kulkaa@.husmail.com>
Vikram <vikram1791@gmail.com>
Vitor Baptista <vitor@vitorbaptista.com>
W. Trevor King <wking@tremily.us>
Wes Morgan <wesmorgan@icloud.com>
Will Scott <will@cypherpunk.email>
Willi Butz <wbutz@cyberfnord.de>
Xiaoyi Wang <wangxiaoyi@hyperchain.cn>
Yuval Langer <yuval.langer@gmail.com>
Zander Mackie <zmackie@gmail.com>
ZenGround0 <ZenGround0@users.noreply.github.com>
achingbrain <alex@achingbrain.net>
adamliesko <adamliesko@gmail.com>
anarcat <anarcat@users.noreply.github.com>
bbenshoof <brendan@glidr.net>
camelmasa <camelmasa@gmail.com>
chenminjian <727180553@qq.com>
devedge <devedge@outlook.com>
dgrisham <dgrisham@mines.edu>
drathir <drathir87@gmail.com>
epitron <chris@ill-logic.com>
eric wu <eric.wu@blockheaders.com>
flowed <yoginth@protonmail.com>
forstmeier <john.forstmeier@gmail.com>
fyrchik <kraunid@gmail.com>
gatesvp <gatesvp@gmail.com>
hannahhoward <hannah@hannahhoward.net>
hikerpig <hikerpigwinnie@gmail.com>
hoenirvili <hoenirvili@gmail.com>
hucg <hucg>
ivan386 <ivan386@yandex.ru>
klauspost <klauspost@gmail.com>
kpcyrd <git@rxv.cc>
kvm2116 <kvm2116@columbia.edu>
mateon1 <matin1111@wp.pl>
matrushka <barisgumustas@gmail.com>
michael <pfista@gmail.com>
myself659 <myself659@163.com>
nmalhotra <nitish.malhotra@cspi.com>
palkeo <contact@palkeo.com>
requilence <requilence@gmail.com>
rht <rhtbot@gmail.com> <rudyht@gmail.com>
rob-deutsch <robzyb+altgithub@gmail.com>
slothbag <slothbag>
sroerick <sroerick@gmail.com>
swedneck <40505480+swedneck@users.noreply.github.com>
tarekbadr <tarekbadrshalaan@gmail.com>
tcme <hi@this-connect.me>
tg <tolstov.georgij@gmail.com>
theswitch <theswitch@users.noreply.github.com>
verokarhu <andreas.metsala@gmail.com>
vitzli <vitzli@gmail.com>
vyzo <vyzo@hackzen.org>
wzhd <dev@wzhd.org>
zramsay <zach@monax.io> <zach@erisindustries.com>
Łukasz Magiera <magik6k@gmail.com> <magik6k@users.noreply.github.com>
ᴍᴀᴛᴛ ʙᴇʟʟ <mappum@gmail.com>
ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>


================================================
FILE: AGENTS.md
================================================
# AI Agent Instructions for Kubo

This file provides instructions for AI coding agents working on the [Kubo](https://github.com/ipfs/kubo) codebase (the Go implementation of IPFS). Follow the [Developer Guide](docs/developer-guide.md) for full details.

## Quick Reference

| Task              | Command                                                  |
|-------------------|----------------------------------------------------------|
| Tidy deps         | `make mod_tidy` (run first if `go.mod` changed)         |
| Build             | `make build`                                             |
| Unit tests        | `go test ./... -run TestName -v`                         |
| Integration tests | `make build && go test ./test/cli/... -run TestName -v`  |
| Lint              | `make -O test_go_lint`                                   |
| Format            | `go fmt ./...`                                           |

## Project Overview

Kubo is the reference implementation of IPFS in Go. Most IPFS protocol logic lives in [boxo](https://github.com/ipfs/boxo) (the IPFS SDK); kubo wires it together and exposes it via CLI and HTTP RPC API. If a change belongs in the protocol layer, it likely belongs in boxo, not here.

Key directories:

| Directory          | Purpose                                                  |
|--------------------|----------------------------------------------------------|
| `cmd/ipfs/`        | CLI entry point and binary                               |
| `core/`            | core IPFS node implementation                            |
| `core/commands/`   | CLI command definitions                                  |
| `core/coreapi/`    | Go API implementation                                    |
| `client/rpc/`      | HTTP RPC client                                          |
| `plugin/`          | plugin system                                            |
| `repo/`            | repository management                                    |
| `test/cli/`        | Go-based CLI integration tests (preferred for new tests) |
| `test/sharness/`   | legacy shell-based integration tests                     |
| `docs/`            | documentation                                            |

Other key external dependencies: [go-libp2p](https://github.com/libp2p/go-libp2p) (networking), [go-libp2p-kad-dht](https://github.com/libp2p/go-libp2p-kad-dht) (DHT).

## Go Style

Follow these Go style references:

- [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)
- [Google Go Style Decisions](https://google.github.io/styleguide/go/decisions)

Specific conventions for this project:

- check the Go version in `go.mod` and use idiomatic features available at that version
- readability over micro-optimization: clear code is more important than saving microseconds
- prefer standard library functions and utilities over writing your own
- use early returns and indent the error flow, not the happy path
- use `slices.Contains`, `slices.DeleteFunc`, and the `maps` package instead of manual loops
- preallocate slices and maps when the size is known: `make([]T, 0, n)`
- use `map[K]struct{}` for sets, not `map[K]bool`
- receiver names: single-letter abbreviations matching the type (e.g., `s *Server`, `c *Client`)
- run `go fmt` after modifying Go source files, never indent manually

### Error Handling

- wrap errors with `fmt.Errorf("context: %w", err)`, never discard errors silently
- use `errors.Is` / `errors.As` for error checking, not string comparison
- never use `panic` in library code; only in `main` or test helpers
- return `nil` explicitly for the error value on success paths

### Canonical Examples

When adding or modifying code, follow the patterns established in these files:

- CLI command structure: `core/commands/dag/dag.go`
- CLI integration test: `test/cli/dag_test.go`
- Test harness usage: `test/cli/harness/` package

## Building

Always run commands from the repository root.

```bash
make mod_tidy        # update go.mod/go.sum (use this instead of go mod tidy)
make build           # build the ipfs binary to cmd/ipfs/ipfs
make install         # install to $GOPATH/bin
make -O test_go_lint # run linter (use this instead of golangci-lint directly)
```

If you modify `go.mod` (add/remove/update dependencies), you must run `make mod_tidy` first, before building or testing. Use `make mod_tidy` instead of `go mod tidy` directly, as the project has multiple `go.mod` files.

If you modify any `.go` files outside of `test/`, you must run `make build` before running integration tests.

## Testing

The full test suite is composed of several targets:

| Make target          | What it runs                                                          |
|----------------------|-----------------------------------------------------------------------|
| `make test`          | all tests (`test_go_fmt` + `test_unit` + `test_cli` + `test_sharness`) |
| `make test_short`    | fast subset (`test_go_fmt` + `test_unit`)                             |
| `make test_unit`     | unit tests with coverage (excludes `test/cli`)                        |
| `make test_cli`      | CLI integration tests (requires `make build` first)                   |
| `make test_sharness` | legacy shell-based integration tests                                  |
| `make test_go_fmt`   | checks Go source formatting                                          |
| `make -O test_go_lint` | runs `golangci-lint`                                                |

During development, prefer running a specific test rather than the full suite:

```bash
# run a single unit test
go test ./core/... -run TestSpecificUnit -v

# run a single CLI integration test (requires make build first)
go test ./test/cli/... -run TestSpecificCLI -v
```

### Environment Setup for Integration Tests

Before running `test_cli` or `test_sharness`, set these environment variables from the repo root:

```bash
export PATH="$PWD/cmd/ipfs:$PATH"
export IPFS_PATH="$(mktemp -d)"
```

- `PATH`: integration tests use the `ipfs` binary from `PATH`, not Go source directly
- `IPFS_PATH`: isolates test data from `~/.ipfs` or other running nodes

If you see "version (N) is lower than repos (M)", the `ipfs` binary in `PATH` is outdated. Rebuild with `make build` and verify `PATH`.

### Running Sharness Tests

Sharness tests are legacy shell-based tests. Run individual tests with a timeout:

```bash
cd test/sharness && timeout 60s ./t0080-repo.sh
```

To investigate a failing test, pass `-v` for verbose output. In this mode, daemons spawned by the test are not shut down automatically and must be killed manually afterwards.

### Cleaning Up Stale Daemons

Before running `test/cli` or `test/sharness`, stop any stale `ipfs daemon` processes owned by the current user. Leftover daemons hold locks and bind ports, causing test failures:

```bash
pkill -f "ipfs daemon"
```

### Writing Tests

- all new integration tests go in `test/cli/`, not `test/sharness/`
- if a `test/sharness` test needs significant changes, remove it and add a replacement in `test/cli/`
- use [testify](https://github.com/stretchr/testify) for assertions (already a dependency)
- for Go 1.25+, use `testing/synctest` when testing concurrent code (goroutines, channels, timers)
- reuse existing `.car` fixtures in `test/cli/fixtures/` when possible; only add new fixtures when the test requires data not covered by existing ones
- always re-run modified tests locally before submitting to confirm they pass
- avoid emojis in test names and test log output

## Before Submitting

Run these steps in order before considering work complete:

1. `make mod_tidy` (if `go.mod` changed)
2. `go fmt ./...`
3. `make build` (if non-test `.go` files changed)
4. `make -O test_go_lint`
5. `go test ./...` (or the relevant subset)

## Documentation and Commit Messages

- after editing CLI help text in `core/commands/`, verify width: `go test ./test/cli/... -run TestCommandDocsWidth`
- config options are documented in `docs/config.md`
- changelogs in `docs/changelogs/`: only edit the Table of Contents and the Highlights section; the Changelog and Contributors sections are auto-generated and must not be modified
- follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
- keep commit titles short and messages terse

## Writing Style

When writing docs, comments, and commit messages:

- avoid emojis in code, comments, and log output
- keep an empty line before lists in markdown
- use backticks around CLI commands, paths, environment variables, and config options

## PR Guidelines

- explain what changed and why in the PR description
- include test coverage for new functionality and bug fixes
- run `make -O test_go_lint` and fix any lint issues before submitting
- verify that `go test ./...` passes locally
- when modifying `test/sharness` tests significantly, migrate them to `test/cli` instead
- end the PR description with a `## References` section listing related context, one link per line
- if the PR closes an issue in `ipfs/kubo`, each closing reference should be a bullet starting with `Closes`:

```markdown
## References

- Closes https://github.com/ipfs/kubo/issues/1234
- Closes https://github.com/ipfs/kubo/issues/5678
- https://discuss.ipfs.tech/t/related-topic/999
```

## Scope and Safety

Do not modify or touch:

- files under `test/sharness/lib/` (third-party sharness test framework)
- CI workflows in `.github/` unless explicitly asked
- auto-generated sections in `docs/changelogs/` (Changelog and Contributors are generated; only TOC and Highlights are human-edited)

Do not run without being asked:

- `make test` or `make test_sharness` (full suite is slow; prefer targeted tests)
- `ipfs daemon` without a timeout

## Running the Daemon

Always run the daemon with a timeout or shut it down promptly:

```bash
timeout 60s ipfs daemon   # auto-kill after 60s
ipfs shutdown              # graceful shutdown via API
```

Kill dangling daemons before re-running tests: `pkill -f "ipfs daemon"`


================================================
FILE: CHANGELOG.md
================================================
# Kubo Changelogs

- [v0.42](docs/changelogs/v0.42.md)
- [v0.41](docs/changelogs/v0.41.md)
- [v0.40](docs/changelogs/v0.40.md)
- [v0.39](docs/changelogs/v0.39.md)
- [v0.38](docs/changelogs/v0.38.md)
- [v0.37](docs/changelogs/v0.37.md)
- [v0.36](docs/changelogs/v0.36.md)
- [v0.35](docs/changelogs/v0.35.md)
- [v0.34](docs/changelogs/v0.34.md)
- [v0.33](docs/changelogs/v0.33.md)
- [v0.32](docs/changelogs/v0.32.md)
- [v0.31](docs/changelogs/v0.31.md)
- [v0.30](docs/changelogs/v0.30.md)
- [v0.29](docs/changelogs/v0.29.md)
- [v0.28](docs/changelogs/v0.28.md)
- [v0.27](docs/changelogs/v0.27.md)
- [v0.26](docs/changelogs/v0.26.md)
- [v0.25](docs/changelogs/v0.25.md)
- [v0.24](docs/changelogs/v0.24.md)
- [v0.23](docs/changelogs/v0.23.md)
- [v0.22](docs/changelogs/v0.22.md)
- [v0.21](docs/changelogs/v0.21.md)
- [v0.20](docs/changelogs/v0.20.md)
- [v0.19](docs/changelogs/v0.19.md)
- [v0.18](docs/changelogs/v0.18.md)
- [v0.17](docs/changelogs/v0.17.md)
- [v0.16](docs/changelogs/v0.16.md)
- [v0.15](docs/changelogs/v0.15.md)
- [v0.14](docs/changelogs/v0.14.md)
- [v0.13](docs/changelogs/v0.13.md)
- [v0.12](docs/changelogs/v0.12.md)
- [v0.11](docs/changelogs/v0.11.md)
- [v0.10](docs/changelogs/v0.10.md)
- [v0.9](docs/changelogs/v0.9.md)
- [v0.8](docs/changelogs/v0.8.md)
- [v0.7](docs/changelogs/v0.7.md)
- [v0.6](docs/changelogs/v0.6.md)
- [v0.5](docs/changelogs/v0.5.md)
- [v0.4](docs/changelogs/v0.4.md)
- [v0.3](docs/changelogs/v0.3.md)
- [v0.2](docs/changelogs/v0.2.md)


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Kubo

**For development setup, building, and testing, see the [Developer Guide](docs/developer-guide.md).**

IPFS as a project, including Kubo and all of its modules, follows the [standard IPFS Community contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md).

We also adhere to the [Go IPFS Community contributing guidelines](https://github.com/ipfs/community/blob/master/CONTRIBUTING_GO.md) which provide additional information on how to collaborate and contribute to the Go implementation of IPFS.

We appreciate your time and attention for going over these. Please open an issue on ipfs/community if you have any questions.

Thank you.


================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1
# Enables BuildKit with cache mounts for faster builds
FROM --platform=${BUILDPLATFORM:-linux/amd64} golang:1.25 AS builder

ARG TARGETOS TARGETARCH

ENV SRC_DIR=/kubo

# Cache go module downloads between builds for faster rebuilds
COPY go.mod go.sum $SRC_DIR/
WORKDIR $SRC_DIR
RUN --mount=type=cache,target=/go/pkg/mod \
  go mod download

COPY . $SRC_DIR

# Preload an in-tree but disabled-by-default plugin by adding it to the IPFS_PLUGINS variable
# e.g. docker build --build-arg IPFS_PLUGINS="foo bar baz"
ARG IPFS_PLUGINS

# Allow for other targets to be built, e.g.: docker build --build-arg MAKE_TARGET="nofuse"
ARG MAKE_TARGET=build

# Build ipfs binary with cached go modules and build cache.
# mkdir .git/objects allows git rev-parse to read commit hash for version info
RUN --mount=type=cache,target=/go/pkg/mod \
  --mount=type=cache,target=/root/.cache/go-build \
  mkdir -p .git/objects \
  && GOOS=$TARGETOS GOARCH=$TARGETARCH GOFLAGS=-buildvcs=false make ${MAKE_TARGET} IPFS_PLUGINS=$IPFS_PLUGINS

# Extract required runtime tools from Debian.
# We use Debian instead of Alpine because we need glibc compatibility
# for the busybox base image we're using.
FROM debian:bookworm-slim AS utilities
RUN set -eux; \
	apt-get update; \
	apt-get install -y --no-install-recommends \
		tini \
    # Using gosu (~2MB) instead of su-exec (~20KB) because it's easier to
    # install on Debian. Useful links:
    # - https://github.com/ncopa/su-exec#why-reinvent-gosu
    # - https://github.com/tianon/gosu/issues/52#issuecomment-441946745
		gosu \
    # fusermount enables IPFS mount commands
    fuse \
    ca-certificates \
	; \
	apt-get clean; \
	rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Final minimal image with shell for debugging (busybox provides sh)
FROM busybox:stable-glibc

# Copy ipfs binary, startup scripts, and runtime dependencies
ENV SRC_DIR=/kubo
COPY --from=utilities /usr/sbin/gosu /sbin/gosu
COPY --from=utilities /usr/bin/tini /sbin/tini
COPY --from=utilities /bin/fusermount /usr/local/bin/fusermount
COPY --from=utilities /etc/ssl/certs /etc/ssl/certs
COPY --from=builder $SRC_DIR/cmd/ipfs/ipfs /usr/local/bin/ipfs
COPY --from=builder --chmod=755 $SRC_DIR/bin/container_daemon /usr/local/bin/start_ipfs
COPY --from=builder $SRC_DIR/bin/container_init_run /usr/local/bin/container_init_run

# Set SUID for fusermount to enable FUSE mounting by non-root user
RUN chmod 4755 /usr/local/bin/fusermount

# Swarm P2P port (TCP/UDP) - expose publicly for peer connections
EXPOSE 4001 4001/udp
# API port - keep private, only for trusted clients
EXPOSE 5001
# Gateway port - can be exposed publicly via reverse proxy
EXPOSE 8080
# Swarm WebSockets - expose publicly for browser-based peers
EXPOSE 8081

# Create ipfs user (uid 1000) and required directories with proper ownership
ENV IPFS_PATH=/data/ipfs
RUN mkdir -p $IPFS_PATH /ipfs /ipns /mfs /container-init.d \
  && adduser -D -h $IPFS_PATH -u 1000 -G users ipfs \
  && chown ipfs:users $IPFS_PATH /ipfs /ipns /mfs /container-init.d

# Volume for IPFS repository data persistence
VOLUME $IPFS_PATH

# The default logging level
ENV GOLOG_LOG_LEVEL=""

# Entrypoint initializes IPFS repo if needed and configures networking.
# tini ensures proper signal handling and zombie process cleanup
ENTRYPOINT ["/sbin/tini", "--", "/usr/local/bin/start_ipfs"]

# Health check verifies IPFS daemon is responsive.
# Uses empty directory CID (QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn) as test
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD ipfs --api=/ip4/127.0.0.1/tcp/5001 dag stat /ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn || exit 1

# Default: run IPFS daemon with auto-migration enabled
CMD ["daemon", "--migrate=true", "--agent-version-suffix=docker"]


================================================
FILE: FUNDING.json
================================================
{
  "opRetro": {
    "projectId": "0x7f330267969cf845a983a9d4e7b7dbcca5c700a5191269af377836d109e0bb69"
  }
}


================================================
FILE: GNUmakefile
================================================
# General tools

SHELL=PATH='$(PATH)' /bin/sh

# enable second expansion
.SECONDEXPANSION:

include Rules.mk


================================================
FILE: LICENSE
================================================
This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. 
Unless otherwise noted, all code contributed prior to 2019-05-06 and not contributed by 
a user listed in [this signoff issue](https://github.com/ipfs/go-ipfs/issues/6302) is 
licensed under MIT-only. All new contributions (and past contributions since 2019-05-06) 
are licensed under a dual MIT/Apache-2.0 license.

MIT: https://www.opensource.org/licenses/mit
Apache-2.0: https://www.apache.org/licenses/LICENSE-2.0


================================================
FILE: LICENSE-APACHE
================================================
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


================================================
FILE: LICENSE-MIT
================================================
The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: Makefile
================================================
all:
	@gmake $@
.PHONY: all

.DEFAULT:
	@gmake $@


================================================
FILE: README.md
================================================
<h1 align="center">
  <br>
  <a href="https://github.com/ipfs/kubo/blob/master/docs/logo/"><img src="https://user-images.githubusercontent.com/157609/250148884-d6d12db8-fdcf-4be3-8546-2550b69845d8.png" alt="Kubo logo" title="Kubo logo" width="200"></a>
  <br>
  Kubo: IPFS Implementation in Go
  <br>
</h1>

<p align="center" style="font-size: 1.2rem;">The first implementation of IPFS.</p>

<p align="center">
  <a href="https://ipfs.tech"><img src="https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square" alt="Official Part of IPFS Project"></a>
  <a href="https://discuss.ipfs.tech"><img alt="Discourse Forum" src="https://img.shields.io/discourse/posts?server=https%3A%2F%2Fdiscuss.ipfs.tech"></a>
  <a href="https://docs.ipfs.tech/community/"><img alt="Matrix" src="https://img.shields.io/matrix/ipfs-space%3Aipfs.io?server_fqdn=matrix.org"></a>
  <a href="https://github.com/ipfs/kubo/actions"><img src="https://img.shields.io/github/actions/workflow/status/ipfs/kubo/gobuild.yml?branch=master"></a>
  <a href="https://github.com/ipfs/kubo/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/ipfs/kubo?filter=!*rc*"></a>
</p>

<hr />

<p align="center">
<b><a href="#what-is-kubo">What is Kubo?</a></b> | <b><a href="#quick-taste">Quick Taste</a></b> | <b><a href="#install">Install</a></b> | <b><a href="#documentation">Documentation</a></b> | <b><a href="#development">Development</a></b> | <b><a href="#getting-help">Getting Help</a></b>
</p>

## What is Kubo?

Kubo was the first [IPFS](https://docs.ipfs.tech/concepts/what-is-ipfs/) implementation and is the [most widely used one today](https://probelab.io/ipfs/topology/#chart-agent-types-avg). It takes an opinionated approach to content-addressing ([CIDs](https://docs.ipfs.tech/concepts/glossary/#cid), [DAGs](https://docs.ipfs.tech/concepts/glossary/#dag)) that maximizes interoperability: [UnixFS](https://docs.ipfs.tech/concepts/glossary/#unixfs) for files and directories, [HTTP Gateways](https://docs.ipfs.tech/concepts/glossary/#gateway) for web browsers, [Bitswap](https://docs.ipfs.tech/concepts/glossary/#bitswap) and [HTTP](https://specs.ipfs.tech/http-gateways/trustless-gateway/) for verifiable data transfer.

**Features:**

- Runs an IPFS node as a network service (LAN [mDNS](https://github.com/libp2p/specs/blob/master/discovery/mdns.md) and WAN [Amino DHT](https://docs.ipfs.tech/concepts/glossary/#dht))
- [Command-line interface](https://docs.ipfs.tech/reference/kubo/cli/) (`ipfs --help`)
- [WebUI](https://github.com/ipfs/ipfs-webui/#readme) for node management
- [HTTP Gateway](https://specs.ipfs.tech/http-gateways/) for trusted and [trustless](https://docs.ipfs.tech/reference/http/gateway/#trustless-verifiable-retrieval) content retrieval
- [HTTP RPC API](https://docs.ipfs.tech/reference/kubo/rpc/) to control the daemon
- [HTTP Routing V1](https://specs.ipfs.tech/routing/http-routing-v1/) client and server for [delegated routing](./docs/delegated-routing.md)
- [Content blocking](./docs/content-blocking.md) for public node operators

**Other IPFS implementations:** [Helia](https://github.com/ipfs/helia) (JavaScript), [more...](https://docs.ipfs.tech/concepts/ipfs-implementations/)

## Quick Taste

After [installing Kubo](#install), verify it works:

```console
$ ipfs init
generating ED25519 keypair...done
peer identity: 12D3KooWGcSLQdLDBi2BvoP8WnpdHvhWPbxpGcqkf93rL2XMZK7R

$ ipfs daemon &
Daemon is ready

$ echo "hello IPFS" | ipfs add -q --cid-version 1
bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa

$ ipfs cat bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa
hello IPFS
```

Verify this CID is provided by your node to the IPFS network: <https://check.ipfs.network/?cid=bafkreicouv3sksjuzxb3rbb6rziy6duakk2aikegsmtqtz5rsuppjorxsa>

See `ipfs add --help` for all import options. Ready for more? Follow the [command-line quick start](https://docs.ipfs.tech/how-to/command-line-quick-start/).

## Install

Follow the [official installation guide](https://docs.ipfs.tech/install/command-line/), or choose: [prebuilt binary](#official-prebuilt-binaries) | [Docker](#docker) | [package manager](#package-managers) | [from source](#build-from-source).

Prefer a GUI? Try [IPFS Desktop](https://docs.ipfs.tech/install/ipfs-desktop/) and/or [IPFS Companion](https://docs.ipfs.tech/install/ipfs-companion/).

### Minimal System Requirements

Kubo runs on most Linux, macOS, and Windows systems. For optimal performance, we recommend at least 6 GB of RAM and 2 CPU cores (more is ideal, as Kubo is highly parallel).

> [!IMPORTANT]
> Larger pinsets require additional memory, with an estimated ~1 GiB of RAM per 20 million items for reproviding to the Amino DHT.

> [!CAUTION]
> Systems with less than the recommended memory may experience instability, frequent OOM errors or restarts, and missing data announcement (reprovider window), which can make data fully or partially inaccessible to other peers. Running Kubo on underprovisioned hardware is at your own risk.

### Official Prebuilt Binaries

Download from https://dist.ipfs.tech#kubo or [GitHub Releases](https://github.com/ipfs/kubo/releases/latest).

### Docker

Official images are published at https://hub.docker.com/r/ipfs/kubo/: [![Docker Image Version (latest semver)](https://img.shields.io/docker/v/ipfs/kubo?color=blue&label=kubo%20docker%20image&logo=docker&sort=semver&style=flat-square&cacheSeconds=3600)](https://hub.docker.com/r/ipfs/kubo/)

#### 🟢 Release Images

Use these for production deployments.

- `latest` and [`release`](https://hub.docker.com/r/ipfs/kubo/tags?name=release) always point at [the latest stable release](https://github.com/ipfs/kubo/releases/latest)
- [`vN.N.N`](https://hub.docker.com/r/ipfs/kubo/tags?name=v) points at a specific [release tag](https://github.com/ipfs/kubo/releases)

```console
$ docker pull ipfs/kubo:latest
$ docker run --rm -it --net=host ipfs/kubo:latest
```

To [customize your node](https://docs.ipfs.tech/install/run-ipfs-inside-docker/#customizing-your-node), pass config via `-e` or mount scripts in `/container-init.d`.

#### 🟠 Developer Preview Images

For internal testing, not intended for production.

- [`master-latest`](https://hub.docker.com/r/ipfs/kubo/tags?name=master-latest) points at `HEAD` of [`master`](https://github.com/ipfs/kubo/commits/master/)
- [`master-YYYY-DD-MM-GITSHA`](https://hub.docker.com/r/ipfs/kubo/tags?name=master-2) points at a specific commit

#### 🔴 Internal Staging Images

For testing arbitrary commits and experimental patches (force push to `staging` branch).

- [`staging-latest`](https://hub.docker.com/r/ipfs/kubo/tags?name=staging-latest) points at `HEAD` of [`staging`](https://github.com/ipfs/kubo/commits/staging/)
- [`staging-YYYY-DD-MM-GITSHA`](https://hub.docker.com/r/ipfs/kubo/tags?name=staging-2) points at a specific commit

### Build from Source

![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/ipfs/kubo?label=Requires%20Go&logo=go&style=flat-square&cacheSeconds=3600)

```bash
git clone https://github.com/ipfs/kubo.git
cd kubo
make build    # creates cmd/ipfs/ipfs
make install  # installs to $GOPATH/bin/ipfs
```

See the [Developer Guide](docs/developer-guide.md) for details, Windows instructions, and troubleshooting.

### Package Managers

Kubo is available in community-maintained packages across many operating systems, Linux distributions, and package managers. See [Repology](https://repology.org/project/kubo/versions) for the full list: [![Packaging status](https://repology.org/badge/tiny-repos/kubo.svg)](https://repology.org/project/kubo/versions)

> [!WARNING]
> These packages are maintained by third-party volunteers. The IPFS Project and Kubo maintainers are not responsible for their contents or supply chain security. For increased security, [build from source](#build-from-source).

#### Linux

| Distribution | Install | Version |
|--------------|---------|---------|
| Ubuntu | [PPA](https://launchpad.net/~twdragon/+archive/ubuntu/ipfs): `sudo apt install ipfs-kubo` | [![PPA: twdragon](https://img.shields.io/badge/PPA-twdragon-E95420?logo=ubuntu)](https://launchpad.net/~twdragon/+archive/ubuntu/ipfs) |
| Arch | `pacman -S kubo` | [![Arch package](https://repology.org/badge/version-for-repo/arch/kubo.svg)](https://archlinux.org/packages/extra/x86_64/kubo/) |
| Fedora | [COPR](https://copr.fedorainfracloud.org/coprs/taw/ipfs/): `dnf install kubo` | [![COPR: taw](https://img.shields.io/badge/COPR-taw-51A2DA?logo=fedora)](https://copr.fedorainfracloud.org/coprs/taw/ipfs/) |
| Nix | `nix-env -i kubo` | [![nixpkgs unstable](https://repology.org/badge/version-for-repo/nix_unstable/kubo.svg)](https://search.nixos.org/packages?query=kubo) |
| Gentoo | `emerge -a net-p2p/kubo` | [![Gentoo package](https://repology.org/badge/version-for-repo/gentoo/kubo.svg)](https://packages.gentoo.org/packages/net-p2p/kubo) |
| openSUSE | `zypper install kubo` | [![openSUSE Tumbleweed](https://repology.org/badge/version-for-repo/opensuse_tumbleweed/kubo.svg)](https://software.opensuse.org/package/kubo) |
| Solus | `sudo eopkg install kubo` | [![Solus package](https://repology.org/badge/version-for-repo/solus/kubo.svg)](https://packages.getsol.us/shannon/k/kubo/) |
| Guix | `guix install kubo` | [![Guix package](https://repology.org/badge/version-for-repo/gnuguix/kubo.svg)](https://packages.guix.gnu.org/packages/kubo/) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |

~~Snap~~ no longer supported ([#8688](https://github.com/ipfs/kubo/issues/8688))

#### macOS

| Manager | Install | Version |
|---------|---------|---------|
| Homebrew | `brew install ipfs` | [![Homebrew](https://repology.org/badge/version-for-repo/homebrew/kubo.svg)](https://formulae.brew.sh/formula/ipfs) |
| MacPorts | `sudo port install ipfs` | [![MacPorts](https://repology.org/badge/version-for-repo/macports/kubo.svg)](https://ports.macports.org/port/ipfs/) |
| Nix | `nix-env -i kubo` | [![nixpkgs unstable](https://repology.org/badge/version-for-repo/nix_unstable/kubo.svg)](https://search.nixos.org/packages?query=kubo) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |

#### Windows

| Manager | Install | Version |
|---------|---------|---------|
| Scoop | `scoop install kubo` | [![Scoop](https://repology.org/badge/version-for-repo/scoop/kubo.svg)](https://scoop.sh/#/apps?q=kubo) |
| _other_ | [See Repology for the full list](https://repology.org/project/kubo/versions) | |

~~Chocolatey~~ no longer supported ([#9341](https://github.com/ipfs/kubo/issues/9341))

## Documentation

| Topic | Description |
|-------|-------------|
| [Configuration](docs/config.md) | All config options reference |
| [Environment variables](docs/environment-variables.md) | Runtime settings via env vars |
| [Experimental features](docs/experimental-features.md) | Opt-in features in development |
| [HTTP Gateway](docs/gateway.md) | Path, subdomain, and trustless gateway setup |
| [HTTP RPC clients](docs/http-rpc-clients.md) | Client libraries for Go, JS |
| [Delegated routing](docs/delegated-routing.md) | Multi-router and HTTP routing |
| [Metrics & monitoring](docs/metrics.md) | Prometheus metrics |
| [Content blocking](docs/content-blocking.md) | Denylist for public nodes |
| [Customizing](docs/customizing.md) | Unsure if use Plugins, Boxo, or fork? |
| [Debug guide](docs/debug-guide.md) | CPU profiles, memory analysis, tracing |
| [Changelogs](docs/changelogs/) | Release notes for each version |
| [All documentation](https://github.com/ipfs/kubo/tree/master/docs) | Full list of docs |

## Development

See the [Developer Guide](docs/developer-guide.md) for build instructions, testing, and contribution workflow. AI coding agents should follow [AGENTS.md](AGENTS.md).

## Getting Help

- [IPFS Forum](https://discuss.ipfs.tech) - community support, questions, and discussion
- [Community](https://docs.ipfs.tech/community/) - chat, events, and working groups
- [GitHub Issues](https://github.com/ipfs/kubo/issues) - bug reports for Kubo specifically
- [IPFS Docs Issues](https://github.com/ipfs/ipfs-docs/issues) - documentation issues

## Security Issues

See [`SECURITY.md`](SECURITY.md).

## Contributing

[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/CONTRIBUTING.md)

We welcome contributions. See [CONTRIBUTING.md](CONTRIBUTING.md) and the [Developer Guide](docs/developer-guide.md).

This repository follows the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).

## Maintainer Info

<a href="https://ipshipyard.com/"><img align="right" src="https://github.com/user-attachments/assets/39ed3504-bb71-47f6-9bf8-cb9a1698f272" /></a>

> [!NOTE]
> Kubo is maintained by the [Shipyard](https://ipshipyard.com/) team.
>
> [Release Process](https://ipshipyard.notion.site/Kubo-Release-Process-6dba4f5755c9458ab5685eeb28173778)

## License

Dual-licensed under Apache 2.0 and MIT:

- [LICENSE-APACHE](LICENSE-APACHE)
- [LICENSE-MIT](LICENSE-MIT)


================================================
FILE: Rules.mk
================================================
TGT_BIN :=
CLEAN :=
COVERAGE :=
DISTCLEAN :=
TEST :=
TEST_SHORT :=
GOCC ?= go
PROTOC ?= protoc

all: help    # all has to be first defined target
.PHONY: all

include mk/git.mk # has to be before tarball.mk
include mk/tarball.mk
include mk/util.mk
include mk/golang.mk

# -------------------- #
#   extra properties   #
# -------------------- #

ifeq ($(TEST_FUSE),0)
	GOTAGS += nofuse
endif
export LIBP2P_TCP_REUSEPORT=false

# -------------------- #
#       sub-files      #
# -------------------- #
dir := bin
include $(dir)/Rules.mk

# tests need access to rules from plugin
dir := plugin
include $(dir)/Rules.mk

dir := test
include $(dir)/Rules.mk

dir := cmd/ipfs
include $(dir)/Rules.mk

# include this file only if coverage target is executed
# it is quite expensive
ifneq ($(filter coverage% clean distclean test/unit/gotest.junit.xml,$(MAKECMDGOALS)),)
	# has to be after cmd/ipfs due to PATH
	dir := coverage
	include $(dir)/Rules.mk
endif

# -------------------- #
#   universal rules    #
# -------------------- #

%.pb.go: %.proto bin/protoc-gen-gogofaster
	$(PROTOC) --gogofaster_out=. --proto_path=.:$(GOPATH)/src:$(dir $@) $<

# -------------------- #
#     core targets     #
# -------------------- #

build: $(TGT_BIN)
.PHONY: build

clean:
	rm -rf $(CLEAN)
.PHONY: clean

mod_tidy:
	@find . -name go.mod -execdir $(GOCC) mod tidy \;
.PHONY: mod_tidy

coverage: $(COVERAGE)
.PHONY: coverage

distclean: clean
	rm -rf $(DISTCLEAN)
	git clean -ffxd
.PHONY: distclean

test: $(TEST)
.PHONY: test

test_short: $(TEST_SHORT)
.PHONY: test_short

deps:
.PHONY: deps

nofuse: GOTAGS += nofuse
nofuse: build
.PHONY: nofuse

install: cmd/ipfs-install
.PHONY: install

install_unsupported: install
	@echo "/=======================================================================\\"
	@echo '|                                                                       |'
	@echo '| `make install_unsupported` is deprecated, use `make install` instead. |'
	@echo '|                                                                       |'
	@echo "\\=======================================================================/"
.PHONY: install_unsupported

uninstall:
	$(GOCC) clean -i ./cmd/ipfs
.PHONY: uninstall

supported:
	@echo "Currently supported platforms (from .github/build-platforms.yml):"
	@grep '^  - ' .github/build-platforms.yml | sed 's/^  - //' || (echo "Error: .github/build-platforms.yml not found"; exit 1)
.PHONY: supported

help:
	@echo 'DEPENDENCY TARGETS:'
	@echo ''
	@echo '  deps                 - Download dependencies using bundled gx'
	@echo '  test_sharness_deps   - Download and build dependencies for sharness'
	@echo ''
	@echo 'BUILD TARGETS:'
	@echo ''
	@echo '  all          - print this help message'
	@echo '  build        - Build binary at ./cmd/ipfs/ipfs'
	@echo '  nofuse       - Build binary with no fuse support'
	@echo '  install      - Build binary and install into $$GOBIN'
	@echo '  mod_tidy     - Remove unused dependencies from go.mod files'
#	@echo '  dist_install - TODO: c.f. ./cmd/ipfs/dist/README.md'
	@echo ''
	@echo 'CLEANING TARGETS:'
	@echo ''
	@echo '  clean        - Remove files generated by build'
	@echo '  distclean    - Remove files that are no part of a repository'
	@echo '  uninstall    - Remove binary from $$GOPATH/bin'
	@echo ''
	@echo 'TESTING TARGETS:'
	@echo ''
	@echo '  test                    - Run all tests (test_go_fmt, test_unit, test_cli, test_sharness)'
	@echo '  test_short              - Run fast tests (test_go_fmt, test_unit)'
	@echo '  test_unit               - Run unit tests with coverage (excludes test/cli)'
	@echo '  test_cli                - Run CLI integration tests (requires built binary)'
	@echo '  test_go_fmt             - Check Go source formatting'
	@echo '  test_go_build           - Build kubo for all platforms from .github/build-platforms.yml'
	@echo '  test_go_lint            - Run golangci-lint'
	@echo '  test_sharness           - Run sharness tests'
	@echo '  coverage                - Collect coverage info from unit tests and sharness'
	@echo
.PHONY: help


================================================
FILE: SECURITY.md
================================================
# Security Policy

The IPFS protocol and its implementations are still in heavy development. This
means that there may be problems in our protocols, or there may be mistakes in
our implementations. We take security
vulnerabilities very seriously. If you discover a security issue, please bring
it to our attention right away!

## Reporting a Vulnerability

If you find a vulnerability that may affect live deployments -- for example, by
exposing a remote execution exploit -- please **send your report privately** to
security@ipfs.io. Please **DO NOT file a public issue**.

If the issue is a protocol weakness that cannot be immediately exploited or
something not yet deployed, just discuss it openly.

## Reporting a non security bug

For non-security bugs, please simply file a GitHub [issue](https://github.com/ipfs/go-ipfs/issues/new/choose).


================================================
FILE: assets/README.md
================================================
# Assets loaded in with IPFS

This directory contains the go-ipfs assets:

* Getting started documentation (`init-doc`).


================================================
FILE: assets/assets.go
================================================
package assets

import (
	"embed"
	"fmt"
	gopath "path"

	"github.com/ipfs/kubo/core"
	"github.com/ipfs/kubo/core/coreapi"

	"github.com/ipfs/boxo/files"
	cid "github.com/ipfs/go-cid"
)

//go:embed init-doc
var Asset embed.FS

// initDocPaths lists the paths for the docs we want to seed during --init.
var initDocPaths = []string{
	gopath.Join("init-doc", "about"),
	gopath.Join("init-doc", "readme"),
	gopath.Join("init-doc", "help"),
	gopath.Join("init-doc", "contact"),
	gopath.Join("init-doc", "security-notes"),
	gopath.Join("init-doc", "quick-start"),
	gopath.Join("init-doc", "ping"),
}

// SeedInitDocs adds the list of embedded init documentation to the passed node, pins it and returns the root key.
func SeedInitDocs(nd *core.IpfsNode) (cid.Cid, error) {
	return addAssetList(nd, initDocPaths)
}

func addAssetList(nd *core.IpfsNode, l []string) (cid.Cid, error) {
	api, err := coreapi.NewCoreAPI(nd)
	if err != nil {
		return cid.Cid{}, err
	}

	dirMap := map[string]files.Node{}

	for _, p := range l {
		d, err := Asset.ReadFile(p)
		if err != nil {
			return cid.Cid{}, fmt.Errorf("assets: could load Asset '%s': %s", p, err)
		}

		dirMap[gopath.Base(p)] = files.NewBytesFile(d)
	}

	basePath, err := api.Unixfs().Add(nd.Context(), files.NewMapDirectory(dirMap))
	if err != nil {
		return cid.Cid{}, err
	}

	if err := api.Pin().Add(nd.Context(), basePath); err != nil {
		return cid.Cid{}, err
	}

	return basePath.RootCid(), nil
}


================================================
FILE: assets/init-doc/about
================================================

                  IPFS -- Inter-Planetary File system

IPFS is a global, versioned, peer-to-peer filesystem. It combines good ideas
from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bit-
torrent swarm, exchanging git objects. IPFS provides an interface as simple
as the HTTP web, but with permanence built-in. You can also mount the world
at /ipfs.

IPFS is a protocol:
- defines a content-addressed file system
- coordinates content delivery
- combines Kademlia + BitTorrent + Git

IPFS is a filesystem:
- has directories and files
- mountable filesystem (via FUSE)

IPFS is a web:
- can be used to view documents like the web
- files accessible via HTTP at `http://ipfs.io/<path>`
- browsers or extensions can learn to use `ipfs://` directly
- hash-addressed content guarantees the authenticity

IPFS is modular:
- connection layer over any network protocol
- routing layer
- uses a routing layer DHT (kademlia/coral)
- uses a path-based naming service
- uses BitTorrent-inspired block exchange

IPFS uses crypto:
- cryptographic-hash content addressing
- block-level deduplication
- file integrity + versioning
- filesystem-level encryption + signing support

IPFS is p2p:
- worldwide peer-to-peer file transfers
- completely decentralized architecture
- **no** central point of failure

IPFS is a CDN:
- add a file to the filesystem locally, and it's now available to the world
- caching-friendly (content-hash naming)
- BitTorrent-based bandwidth distribution

IPFS has a name service:
- IPNS, an SFS inspired name system
- global namespace based on PKI
- serves to build trust chains
- compatible with other NSes
- can map DNS, .onion, .bit, etc to IPNS


================================================
FILE: assets/init-doc/contact
================================================
Come hang out in our IRC chat room if you have any questions.

Contact the ipfs dev team:
- Bugs: https://github.com/ipfs/go-ipfs/issues
- Help: irc.freenode.org/#ipfs
- Email: dev@ipfs.io


================================================
FILE: assets/init-doc/docs/index
================================================
Index


================================================
FILE: assets/init-doc/help
================================================
Some helpful resources for finding your way around ipfs:

- quick-start: a quick show of various ipfs features.
- ipfs commands: a list of all commands
- ipfs --help: every command describes itself
- https://github.com/ipfs/go-ipfs -- the src repository
- #ipfs on irc.freenode.org -- the community IRC channel


================================================
FILE: assets/init-doc/ping
================================================
ipfs

================================================
FILE: assets/init-doc/quick-start
================================================
# 0.1 - Quick Start

This is a set of short examples with minimal explanation. It is meant as
a "quick start".


Add a file to ipfs:

  echo "hello world" >hello
  ipfs add hello


View it:

  ipfs cat <the-hash-you-got-here>


Try a directory:

  mkdir foo
  mkdir foo/bar
  echo "baz" > foo/baz
  echo "baz" > foo/bar/baz
  ipfs add -r foo


View things:

  ipfs ls <the-hash-here>
  ipfs ls <the-hash-here>/bar
  ipfs cat <the-hash-here>/baz
  ipfs cat <the-hash-here>/bar/baz
  ipfs cat <the-hash-here>/bar
  ipfs ls <the-hash-here>/baz


References:

  ipfs refs <the-hash-here>
  ipfs refs -r <the-hash-here>
  ipfs refs --help


Get:

  ipfs get <the-hash-here> -o foo2
  diff foo foo2


Objects:

  ipfs object get <the-hash-here>
  ipfs object get <the-hash-here>/foo2
  ipfs object --help


Pin + GC:

  ipfs pin add <the-hash-here>
  ipfs repo gc
  ipfs ls <the-hash-here>
  ipfs pin rm <the-hash-here>
  ipfs repo gc


Daemon:

  ipfs daemon  (in another terminal)
  ipfs id


Network:

  (must be online)
  ipfs swarm peers
  ipfs id
  ipfs cat <hash-of-remote-object>


Mount:

  (warning: fuse is finicky!)
  ipfs mount
  cd /ipfs/<the-hash-here>
  ls


Tool:

  ipfs version
  ipfs update
  ipfs commands
  ipfs config --help
  open http://localhost:5001/webui


Browse:

  WebUI:

    http://localhost:5001/webui

  video:

    http://localhost:8080/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXse

  images:

    http://localhost:8080/ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs

  markdown renderer app:

    http://localhost:8080/ipfs/QmX7M9CiYXjVeFnkfVGf3y5ixTZ2ACeSGyL1vBJY1HvQPp/mdown


================================================
FILE: assets/init-doc/readme
================================================
Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. Use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes


================================================
FILE: assets/init-doc/security-notes
================================================
                    IPFS Alpha Security Notes

We try hard to ensure our system is safe and robust, but all software
has bugs, especially new software. This distribution is meant to be an
alpha preview, don't use it for anything mission critical.

Please note the following:

- This is alpha software and has not been audited. It is our goal
  to conduct a proper security audit once we close in on a 1.0 release.

- ipfs is a networked program, and may have serious undiscovered
  vulnerabilities. It is written in Go, and we do not execute any
  user provided data. But please point any problems out to us in a
  github issue, or email security@ipfs.io privately.

- security@ipfs.io GPG key:
  - 4B9665FB 92636D17 7C7A86D3 50AAE8A9 59B13AF3
  - https://pgp.mit.edu/pks/lookup?op=get&search=0x50AAE8A959B13AF3

- ipfs uses encryption for all communication, but it's NOT PROVEN SECURE
  YET!  It may be totally broken. For now, the code is included to make
  sure we benchmark our operations with encryption in mind. In the future,
  there will be an "unsafe" mode for high performance intranet apps.
  If this is a blocking feature for you, please contact us.


================================================
FILE: bin/Rules.mk
================================================
include mk/header.mk

dist_root_$(d)="/ipfs/QmPrXH9jRVwvd7r5MC5e6nV4uauQGzLk1i2647Ye9Vbbwe"

TGTS_$(d) := $(d)/protoc
DISTCLEAN += $(d)/protoc $(d)/tmp

PATH := $(realpath $(d)):$(PATH)

$(TGTS_$(d)):
	rm -f $@$(?exe)
ifeq ($(WINDOWS),1)
	cp $^$(?exe) $@$(?exe)
else
	ln -s $(notdir $^) $@
endif

bin/protoc-gen-gogofaster:
	$(call go-build,github.com/gogo/protobuf/protoc-gen-gogofaster)

CLEAN += $(TGTS_$(d))
include mk/footer.mk


================================================
FILE: bin/archive-branches.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

auth=""
#auth="-u kubuxu:$GH_TOKEN"
org=ipfs
repo=go-ipfs
arch_repo=go-ipfs-archived
api_repo="repos/$org/$repo"

exclusions=(
	'master'
	'release'
	'feat/zcash'
	'feat/ai-mirror'
)

gh_api_next() {
	links=$(grep '^Link:' | sed -e 's/Link: //' -e 's/, /\n/g')
	echo "$links" | grep '; rel="next"' >/dev/null || return
	link=$(echo "$links" | grep '; rel="next"' | sed -e 's/^<//' -e 's/>.*//')

	curl $auth -f -sD >(gh_api_next) "$link"
}

gh_api() {
	curl $auth -f -sD >(gh_api_next) "https://api.github.com/$1" | jq -s '[.[] | .[]]'
}

pr_branches() {
	gh_api "$api_repo/pulls" |  jq -r '.[].head.label | select(test("^ipfs:"))' \
		| sed 's/^ipfs://'
}

origin_refs() {
	format=${1-'%(refname:short)'}

	git for-each-ref --format "$format" refs/remotes/origin | sed 's|^origin/||'
}

active_branches() {
	origin_refs '%(refname:short) %(committerdate:unix)' |awk \
'	BEGIN { monthAgo = systime() - 31*24*60*60 }
	{ if ($2 > monthAgo) print $1 }
'
}

git remote add archived "git@github.com:$org/$arch_repo.git" || true

branches_to_move="$(cat <(active_branches) <(pr_branches) <((IFS=$'\n'; echo "${exclusions[*]}")) | sort -u | comm - <(origin_refs | sort) -13)"

echo "================"
printf "%s\n" "$branches_to_move"
echo "================"

echo "Please confirm move of above branches [y/N]:"

read line
case $line in
  [Yy]|[Yy][Ee][Ss]) ;;
  *) exit 1 ;;
esac


printf "%s\n" "$branches_to_move" | \
while read -r ref; do
		git push archived "origin/$ref:refs/heads/$ref/$(date --rfc-3339=date)"
		git push origin --delete "$ref"
	done



================================================
FILE: bin/container_daemon
================================================
#!/bin/sh
set -e

user=ipfs
repo="$IPFS_PATH"

if [ "$(id -u)" -eq 0 ]; then
  echo "Changing user to $user"
  # ensure folder is writable
  gosu "$user" test -w "$repo" || chown -R -- "$user" "$repo"
  # restart script with new privileges
  exec gosu "$user" "$0" "$@"
fi

# 2nd invocation with regular user
ipfs version


if [ -e "$repo/config" ]; then
  echo "Found IPFS fs-repo at $repo"
else
  ipfs init ${IPFS_PROFILE:+"--profile=$IPFS_PROFILE"}
  ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
  ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080

  # Set up the swarm key, if provided

  SWARM_KEY_FILE="$repo/swarm.key"
  SWARM_KEY_PERM=0400

  # Create a swarm key from a given environment variable
  if [ -n "$IPFS_SWARM_KEY" ] ; then
    echo "Copying swarm key from variable..."
    printf "%s\n" "$IPFS_SWARM_KEY" >"$SWARM_KEY_FILE" || exit 1
    chmod $SWARM_KEY_PERM "$SWARM_KEY_FILE"
  fi

  # Unset the swarm key variable
  unset IPFS_SWARM_KEY

  # Check during initialization if a swarm key was provided and
  # copy it to the ipfs directory with the right permissions
  # WARNING: This will replace the swarm key if it exists
  if [ -n "$IPFS_SWARM_KEY_FILE" ] ; then
    echo "Copying swarm key from file..."
    install -m $SWARM_KEY_PERM "$IPFS_SWARM_KEY_FILE" "$SWARM_KEY_FILE" || exit 1
  fi

  # Unset the swarm key file variable
  unset IPFS_SWARM_KEY_FILE
fi

find /container-init.d -maxdepth 1 \( -type f -o -type l \) -iname '*.sh' -print0 | sort -z | xargs -n 1 -0 -r container_init_run

exec ipfs "$@"


================================================
FILE: bin/container_init_run
================================================
#!/bin/sh

set -e

# used by the container startup script for running initialization scripts

script="$1"
if [ -x "$script" ] ; then
    printf "Executing '%s'...\n" "$script"
    "$script"
else
    printf "Sourcing '%s'...\n" "$script"
    . "$script"
fi


================================================
FILE: bin/dist_get
================================================
#!/bin/sh

GOCC=${GOCC=go}

die() {
	echo "$@" >&2
	exit 1
}

have_binary() {
	type "$1" > /dev/null 2> /dev/null
}

check_writable() {
	printf "" > "$1" && rm "$1"
}

try_download() {
	url="$1"
	output="$2"
	command="$3"
	util_name="$(set -- $command; echo "$1")"

	if ! have_binary "$util_name"; then
		return 1
	fi

	printf '==> Using %s to download "%s" to "%s"\n' "$util_name" "$url" "$output"
	if eval "$command"; then
		echo "==> Download complete!"
		return
	else
		echo "error: couldn't download with $util_name ($?)"
		return 1
	fi
}

download() {
	dl_url="$1"
	dl_output="$2"

	test "$#" -eq "2" || die "download requires exactly two arguments, was given $@"

	if ! check_writable "$dl_output"; then
		die "download error: cannot write to $dl_output"
	fi

	try_download "$dl_url" "$dl_output" "wget '$dl_url' -O '$dl_output'" && return
	try_download "$dl_url" "$dl_output" "curl --silent --fail --output '$dl_output' '$dl_url'" && return
	try_download "$dl_url" "$dl_output" "fetch '$dl_url' -o '$dl_output'" && return
	try_download "$dl_url" "$dl_output" "http '$dl_url' > '$dl_output'" && return
	try_download "$dl_url" "$dl_output" "ftp -o '$dl_output' '$dl_url'" && return

	die "Unable to download $dl_url. exiting."
}

unarchive() {
	ua_archivetype="$1"
	ua_infile="$2"
	ua_outfile="$3"
	ua_distname="$4"
	ua_binpostfix=""
	ua_os=$(uname -o)

	if [ "$ua_os" = "Msys" ] || [ "$ua_os" = "Cygwin" ] ; then
	    ua_binpostfix=".exe"
	fi
	ua_outfile="$ua_outfile$ua_binpostfix"

	if ! check_writable "$ua_outfile"; then
		die "unarchive error: cannot write to $ua_outfile"
	fi

	case "$ua_archivetype" in
		tar.gz)
			if have_binary tar; then
				echo "==> using 'tar' to extract binary from archive"
				< "$ua_infile" tar -Ozxf - "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
					|| die "tar has failed"
			else
				die "no binary on system for extracting tar files"
			fi
			;;
		zip)
			if have_binary unzip; then
				echo "==> using 'unzip' to extract binary from archive"
				unzip -p "$ua_infile" "$ua_distname/$ua_distname$ua_binpostfix" > "$ua_outfile" \
					|| die "unzip has failed"
			else
				die "no installed method for extracting .zip archives"
			fi
			;;
		*)
			die "unrecognized archive type '$ua_archivetype'"
	esac

	chmod +x "$ua_outfile" || die "chmod has failed"
}

get_go_vars() {
	if [ ! -z "$GOOS" ] && [ ! -z "$GOARCH" ]; then
		printf "%s-%s" "$GOOS" "$GOARCH"
	elif have_binary go; then
		printf "%s-%s" "$($GOCC env GOOS)" "$($GOCC env GOARCH)"
	else
		die "no way of determining system GOOS and GOARCH\nPlease manually set GOOS and GOARCH then retry."
	fi
}

mkurl() {
	m_root="$1"
	m_name="$2"
	m_vers="$3"
	m_archive="$4"
	m_govars=$(get_go_vars) || die "could not get go env vars"

	echo "https://ipfs.io$m_root/$m_name/$m_vers/${m_name}_${m_vers}_$m_govars.$m_archive"
}

distroot="$1"
distname="$2"
outpath="$3"
version="$4"

if [ -z "$distroot" ] || [ -z "$distname" ] || [ -z "$outpath" ] || [ -z "$version" ]; then
	die "usage: dist_get <distroot> <distname> <outpath> <version>"
fi

case $version in
	v*)
		# correct input
		;;
	*)
		echo "invalid version '$version'" >&2
		die "versions must begin with 'v', for example: v0.4.0"
		;;
esac

# TODO: don't depend on the go tool being installed to detect this
goenv=$(get_go_vars) || die "could not get go env vars"

case $goenv in
	linux-*)
		archive="tar.gz"
		;;
	darwin-*)
		archive="tar.gz"
		;;
	windows-*)
		archive="zip"
		;;
	freebsd-*)
		archive="tar.gz"
		;;
	openbsd-*)
		archive="tar.gz"
		;;
	*)
		echo "unrecognized system environment: $goenv" >&2
		die "currently only linux, darwin, windows and freebsd are supported by this script"
esac


mkdir -p bin/tmp

url=$(mkurl "$distroot" "$distname" "$version" "$archive")
tmpfi="bin/tmp/$distname.$archive"

download "$url" "$tmpfi"
if [ $? -ne 0 ]; then
	die "failed to download $url to $tmpfi"
fi

unarchive "$archive" "$tmpfi" "$outpath" "$distname"
if [ $? -ne 0 ]; then
	die "failed to extract archive $tmpfi"
fi


================================================
FILE: bin/gencmdref
================================================
#!/usr/bin/env python

import os
import sys
import datetime

from subprocess import check_output

def run(cmd):
  return check_output(cmd)

def main():
  lines = [l.strip() for l in sys.stdin]

  print '# ipfs command reference'
  print ''
  print 'generated on', datetime.datetime.now()
  print ''
  for line in lines:
    print '- [%s](#%s)' % (line, line.replace(' ', '-'))
  print ''

  for line in lines:
    print '## %s' % line
    print ''
    print '```'
    print run((line + ' --help').split(' ')).strip()
    print '```'
    print ''

if __name__ == '__main__':
  if '-h' in sys.argv or '--help' in sys.argv:
    print 'usage: ipfs commands | %s >cmdref.md' % sys.argv[0]
    print 'outputs all commands with --help to a markdown file'
    exit(0)

  main()


================================================
FILE: bin/get-docker-tags.sh
================================================
#!/usr/bin/env bash

# get-docker-tags.sh
#
# Usage:
#   ./get-docker-tags.sh <build number> <git commit sha1> <git branch name> [git tag name]
#
# Example:
#
#   # get tag for the master branch
#   ./get-docker-tags.sh $(date -u +%F) testingsha master
#
#   # get tag for a release tag
#   ./get-docker-tags.sh $(date -u +%F) testingsha release v0.5.0
#
set -euo pipefail

if [[ $# -lt 1 ]] ; then
  echo 'At least 1 arg required.'
  echo 'Usage:'
  echo './get-docker-tags.sh <build number> [git commit sha1] [git branch name] [git tag name]'
  exit 1
fi

BUILD_NUM=$1
GIT_SHA1=${2:-$(git rev-parse HEAD)}
GIT_SHA1_SHORT=$(echo "$GIT_SHA1" | cut -c 1-7)
GIT_BRANCH=${3:-$(git symbolic-ref -q --short HEAD || echo "unknown")}
GIT_TAG=${4:-$(git describe --tags --exact-match 2> /dev/null || echo "")}

IMAGE_NAME=${IMAGE_NAME:-ipfs/kubo}

echoImageName () {
  local IMAGE_TAG=$1
  echo "$IMAGE_NAME:$IMAGE_TAG"
}

if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
  echoImageName "$GIT_TAG"

elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echoImageName "$GIT_TAG"
  echoImageName "latest"
  echoImageName "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981

elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
  # sanitize the branch name since docker tags have stricter char limits than git branch names
  branch=$(echo "$GIT_BRANCH" | tr '/' '-' | tr --delete --complement '[:alnum:]-')
  echoImageName "${branch}-${BUILD_NUM}-${GIT_SHA1_SHORT}"

elif [ "$GIT_BRANCH" = "master" ] || [ "$GIT_BRANCH" = "staging" ]; then
  echoImageName "${GIT_BRANCH}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
  echoImageName "${GIT_BRANCH}-latest"

else
  echo "Nothing to do. No docker tag defined for branch: $GIT_BRANCH, tag: $GIT_TAG"

fi


================================================
FILE: bin/graphmd
================================================
#!/bin/sh

if [ "$#" -ne 1 ]; then
  echo "usage: $0 <ipfs-path>..."
  echo "output merkledag links in graphviz dot"
  echo ""
  echo "use it with dot:"
  echo "	$0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tsvg"
  echo "	$0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpng"
  echo "	$0 QmZPAMWUfLD95GsdorXt9hH7aVrarb2SuLDMVVe6gABYmx | dot -Tpdf"
  echo ""
  exit 1
fi

src='<src> [fontsize=8 shape=box];'
dst='<dst> [fontsize=8 shape=box];'
edge='<src> -> <dst> [label="<linkname>"];'
fmt="$src
$dst
$edge"

echo "digraph {"
echo "	graph [rankdir=LR];"
ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }'
# ipfs refs -r --format="$fmt" "$@" | awk '{ print "\t" $0 }' | unflatten -l3
echo "}"


================================================
FILE: bin/ipns-republish
================================================
#!/bin/bash

if [ "$#" -ne 1 ]; then
  echo "usage: $0 <ipfs-or-ipns-path>"
  echo "republishes an ipns name every 20 minutes"
  echo "(this is an icky stop-gap until ipfs nodes do it for you)"
  echo ""
  echo "example:"
  echo "  > $0 QmSYCpuKPbPQ2iFr2swJj2hvz7wQUXfPBXPiuVsQdL5FEs"
  echo ""
  exit 1
fi

# must be run online.
ipfs swarm peers >/dev/null
if [ $? -ne 0 ]; then
  echo "error: ipfs daemon must be online and connected to peers "
  exit 1
fi

# check the object is there
ipfs dag stat "$1" >/dev/null
if [ $? -ne 0 ]; then
  echo "error: ipfs cannot find $1"
  exit 1
fi

echo "republishing $1 every 20 minutes"
while :
do
  ipfs name publish $1
  sleep 1200
done


================================================
FILE: bin/maketarball.sh
================================================
#!/usr/bin/env bash
# vim: set expandtab sw=2 ts=2:

# bash safe mode
set -euo pipefail
IFS=$'\n\t'

# readlink doesn't work on macos
OUTPUT="${1:-go-ipfs-source.tar.gz}"
if ! [[ "$OUTPUT" = /* ]]; then
  OUTPUT="$PWD/$OUTPUT"
fi

GOCC=${GOCC=go}

TEMP="$(mktemp -d)"
cp -r . "$TEMP"
( cd "$TEMP" &&
  echo $PWD &&
  $GOCC mod vendor &&
  (git describe --always --match=NeVeRmAtCh --dirty 2>/dev/null || true) > .tarball &&
  chmod -R u=rwX,go=rX "$TEMP" # normalize permissions
  tar -czf "$OUTPUT" --exclude="./.git" .
  )

rm -rf "$TEMP"


================================================
FILE: bin/mkreleaselog
================================================
#!/bin/bash
#
# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]
#
# Generates release notes with contributor statistics, deduplicating by GitHub handle.
# GitHub handles are resolved from:
#   1. GitHub noreply emails (user@users.noreply.github.com)
#   2. Merge commit messages (Merge pull request #N from user/branch)
#   3. GitHub API via gh CLI (for squash merges)
#
# Results are cached in ~/.cache/mkreleaselog/github-handles.json

set -euo pipefail
export GO111MODULE=on
GOPATH="$(go env GOPATH)"
export GOPATH

# List of PCRE regular expressions to match "included" modules.
INCLUDE_MODULES=(
    # orgs
    "^github.com/ipfs/"
    "^github.com/ipld/"
    "^github.com/libp2p/"
    "^github.com/multiformats/"
    "^github.com/filecoin-project/"
    "^github.com/ipfs-shipyard/"
    "^github.com/ipshipyard/"
    "^github.com/probe-lab/"

    # Authors of personal modules used by go-ipfs that should be mentioned in the
    # release notes.
    "^github.com/whyrusleeping/"
    "^github.com/gammazero/"
    "^github.com/Jorropo/"
    "^github.com/guillaumemichel/"
    "^github.com/Kubuxu/"
    "^github.com/jbenet/"
    "^github.com/Stebalien/"
    "^github.com/marten-seemann/"
    "^github.com/hsanjuan/"
    "^github.com/lucas-clemente/"
    "^github.com/warpfork/"
)

# List of PCRE regular expressions to match "excluded" modules. Applied after includes.
EXCLUDE_MODULES=(
    "^github.com/marten-seemann/qtls"
)

# Ignored files as git pathspecs. These patters will match any full path component.
IGNORE_FILES=(
    ".gx"
    "package.json"
    ".travis.yml"
    "go.mod"
    "go.sum"
    ".github"
    "*.pb.go"
    "cbor_gen.go"
    "ipldsch_*.go"
    "*.gen.go"
)

##########################################################################################
# GitHub Handle Resolution Infrastructure
##########################################################################################

# Cache location following XDG spec
GITHUB_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/mkreleaselog"
GITHUB_CACHE_FILE="$GITHUB_CACHE_DIR/github-handles.json"

# Timeout for gh CLI commands (seconds)
GH_TIMEOUT=10

# Associative array for email -> github handle mapping (runtime cache)
declare -A EMAIL_TO_GITHUB

# Check if gh CLI is available and authenticated
gh_available() {
    command -v gh >/dev/null 2>&1 && gh auth status >/dev/null 2>&1
}

# Load cached email -> github handle mappings from disk
load_github_cache() {
    EMAIL_TO_GITHUB=()

    if [[ ! -f "$GITHUB_CACHE_FILE" ]]; then
        return 0
    fi

    # Validate JSON before loading
    if ! jq -e '.' "$GITHUB_CACHE_FILE" >/dev/null 2>&1; then
        msg "Warning: corrupted cache file, ignoring"
        return 0
    fi

    local email handle
    while IFS=$'\t' read -r email handle; do
        # Validate handle format (alphanumeric, hyphens, max 39 chars)
        if [[ -n "$email" && -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
            EMAIL_TO_GITHUB["$email"]="$handle"
        fi
    done < <(jq -r 'to_entries[] | "\(.key)\t\(.value)"' "$GITHUB_CACHE_FILE" 2>/dev/null)

    msg "Loaded ${#EMAIL_TO_GITHUB[@]} cached GitHub handle mappings"
}

# Save email -> github handle mappings to disk (atomic write)
save_github_cache() {
    if [[ ${#EMAIL_TO_GITHUB[@]} -eq 0 ]]; then
        return 0
    fi

    mkdir -p "$GITHUB_CACHE_DIR"

    local tmp_file
    tmp_file="$(mktemp "$GITHUB_CACHE_DIR/cache.XXXXXX")" || return 1

    # Build JSON from associative array
    {
        echo "{"
        local first=true
        local key
        for key in "${!EMAIL_TO_GITHUB[@]}"; do
            if [[ "$first" == "true" ]]; then
                first=false
            else
                echo ","
            fi
            # Escape special characters in email for JSON
            printf '  %s: %s' "$(jq -n --arg e "$key" '$e')" "$(jq -n --arg h "${EMAIL_TO_GITHUB[$key]}" '$h')"
        done
        echo
        echo "}"
    } > "$tmp_file"

    # Validate before replacing
    if jq -e '.' "$tmp_file" >/dev/null 2>&1; then
        mv "$tmp_file" "$GITHUB_CACHE_FILE"
        msg "Saved ${#EMAIL_TO_GITHUB[@]} GitHub handle mappings to cache"
    else
        rm -f "$tmp_file"
        msg "Warning: failed to save cache (invalid JSON)"
    fi
}

# Extract GitHub handle from email if it's a GitHub noreply address
# Handles: user@users.noreply.github.com and 12345678+user@users.noreply.github.com
extract_handle_from_noreply() {
    local email="$1"

    if [[ "$email" =~ ^([0-9]+\+)?([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)@users\.noreply\.github\.com$ ]]; then
        echo "${BASH_REMATCH[2]}"
        return 0
    fi
    return 1
}

# Extract GitHub handle from merge commit subject
# Handles: "Merge pull request #123 from username/branch"
extract_handle_from_merge_commit() {
    local subject="$1"

    if [[ "$subject" =~ ^Merge\ pull\ request\ \#[0-9]+\ from\ ([a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?)/.*$ ]]; then
        echo "${BASH_REMATCH[1]}"
        return 0
    fi
    return 1
}

# Extract PR number from commit subject
# Handles: "Subject (#123)" and "Merge pull request #123 from"
extract_pr_number() {
    local subject="$1"

    if [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
        echo "${BASH_REMATCH[1]}"
        return 0
    elif [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
        echo "${BASH_REMATCH[1]}"
        return 0
    fi
    return 1
}

# Query GitHub API for PR author (with timeout and error handling)
query_pr_author() {
    local gh_repo="$1"  # e.g., "ipfs/kubo"
    local pr_num="$2"

    if ! gh_available; then
        return 1
    fi

    local handle
    handle="$(timeout "$GH_TIMEOUT" gh pr view "$pr_num" --repo "$gh_repo" --json author -q '.author.login' 2>/dev/null)" || return 1

    # Validate handle format
    if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
        echo "$handle"
        return 0
    fi
    return 1
}

# Query GitHub API for commit author (fallback when no PR available)
query_commit_author() {
    local gh_repo="$1"  # e.g., "ipfs/kubo"
    local commit_sha="$2"

    if ! gh_available; then
        return 1
    fi

    local handle
    handle="$(timeout "$GH_TIMEOUT" gh api "/repos/$gh_repo/commits/$commit_sha" --jq '.author.login // empty' 2>/dev/null)" || return 1

    # Validate handle format
    if [[ -n "$handle" && "$handle" =~ ^[a-zA-Z0-9]([a-zA-Z0-9-]{0,37}[a-zA-Z0-9])?$ ]]; then
        echo "$handle"
        return 0
    fi
    return 1
}

# Resolve email to GitHub handle using all available methods
# Args: email, commit_hash (optional), repo_dir (optional), gh_repo (optional)
resolve_github_handle() {
    local email="$1"
    local commit="${2:-}"
    local repo_dir="${3:-}"
    local gh_repo="${4:-}"

    # Skip empty emails
    [[ -z "$email" ]] && return 1

    # Check runtime cache first
    if [[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]]; then
        echo "${EMAIL_TO_GITHUB[$email]}"
        return 0
    fi

    local handle=""

    # Method 1: Extract from noreply email
    if handle="$(extract_handle_from_noreply "$email")"; then
        EMAIL_TO_GITHUB["$email"]="$handle"
        echo "$handle"
        return 0
    fi

    # Method 2: Look at commit message for merge commit pattern
    if [[ -n "$commit" && -n "$repo_dir" ]]; then
        local subject
        subject="$(git -C "$repo_dir" log -1 --format='%s' "$commit" 2>/dev/null)" || true

        if [[ -n "$subject" ]]; then
            if handle="$(extract_handle_from_merge_commit "$subject")"; then
                EMAIL_TO_GITHUB["$email"]="$handle"
                echo "$handle"
                return 0
            fi

            # Method 3: Query GitHub API for PR author
            if [[ -n "$gh_repo" ]]; then
                local pr_num
                if pr_num="$(extract_pr_number "$subject")"; then
                    if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
                        EMAIL_TO_GITHUB["$email"]="$handle"
                        echo "$handle"
                        return 0
                    fi
                fi
            fi
        fi
    fi

    return 1
}

# Build GitHub handle mappings for all commits in a range
# This does a single pass to collect PR numbers, then batch queries them
build_github_mappings() {
    local module="$1"
    local start="$2"
    local end="${3:-HEAD}"
    local repo
    repo="$(strip_version "$module")"
    local dir
    local gh_repo=""

    if [[ "$module" == "github.com/ipfs/kubo" ]]; then
        dir="$ROOT_DIR"
    else
        dir="$GOPATH/src/$repo"
    fi

    # Extract gh_repo for API calls (e.g., "ipfs/kubo" from "github.com/ipfs/kubo")
    if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
        gh_repo="${BASH_REMATCH[1]}"
    fi

    msg "Building GitHub handle mappings for $module..."

    # Collect all unique emails and their commit context
    declare -A email_commits=()
    local hash email subject

    while IFS=$'\t' read -r hash email subject; do
        [[ -z "$email" ]] && continue

        # Skip if already resolved
        [[ -n "${EMAIL_TO_GITHUB[$email]:-}" ]] && continue

        # Try to resolve without API first
        local handle=""

        # Method 1: noreply email
        if handle="$(extract_handle_from_noreply "$email")"; then
            EMAIL_TO_GITHUB["$email"]="$handle"
            continue
        fi

        # Method 2: merge commit message
        if handle="$(extract_handle_from_merge_commit "$subject")"; then
            EMAIL_TO_GITHUB["$email"]="$handle"
            continue
        fi

        # Store for potential API lookup
        if [[ -z "${email_commits[$email]:-}" ]]; then
            email_commits["$email"]="$hash"
        fi
    done < <(git -C "$dir" log --format='tformat:%H%x09%aE%x09%s' --no-merges "$start..$end" 2>/dev/null)

    # API batch lookup for remaining emails (if gh is available)
    if gh_available && [[ -n "$gh_repo" && ${#email_commits[@]} -gt 0 ]]; then
        msg "Querying GitHub API for ${#email_commits[@]} unknown contributors..."
        local key
        for key in "${!email_commits[@]}"; do
            # Skip if already resolved
            [[ -n "${EMAIL_TO_GITHUB[$key]:-}" ]] && continue

            local commit_hash="${email_commits[$key]}"
            local subj handle
            subj="$(git -C "$dir" log -1 --format='%s' "$commit_hash" 2>/dev/null)" || true

            # Try PR author lookup first (cheaper API call)
            local pr_num
            if pr_num="$(extract_pr_number "$subj")"; then
                if handle="$(query_pr_author "$gh_repo" "$pr_num")"; then
                    EMAIL_TO_GITHUB["$key"]="$handle"
                    continue
                fi
            fi

            # Fallback: commit author API (works for any commit)
            if handle="$(query_commit_author "$gh_repo" "$commit_hash")"; then
                EMAIL_TO_GITHUB["$key"]="$handle"
            fi
        done
    fi
}

##########################################################################################
# Original infrastructure with modifications
##########################################################################################

build_include_regex() {
    local result=""
    local mod
    for mod in "${INCLUDE_MODULES[@]}"; do
        if [[ -n "$result" ]]; then
            result="$result|$mod"
        else
            result="$mod"
        fi
    done
    echo "($result)"
}

build_exclude_regex() {
    local result=""
    local mod
    for mod in "${EXCLUDE_MODULES[@]}"; do
        if [[ -n "$result" ]]; then
            result="$result|$mod"
        else
            result="$mod"
        fi
    done
    if [[ -n "$result" ]]; then
        echo "($result)"
    else
        echo '$^'  # match nothing
    fi
}

if [[ ${#INCLUDE_MODULES[@]} -gt 0 ]]; then
    INCLUDE_REGEX="$(build_include_regex)"
else
    INCLUDE_REGEX="" # "match anything"
fi

if [[ ${#EXCLUDE_MODULES[@]} -gt 0 ]]; then
    EXCLUDE_REGEX="$(build_exclude_regex)"
else
    EXCLUDE_REGEX='$^' # "match nothing"
fi

IGNORE_FILES_PATHSPEC=()
for f in "${IGNORE_FILES[@]}"; do
    IGNORE_FILES_PATHSPEC+=(":^:**/$f" ":^:$f") # Prepend the magic "ignore this" sequence.
done


NL=$'\n'

ROOT_DIR="$(git rev-parse --show-toplevel)"

msg() {
    echo "$*" >&2
}

statlog() {
    local module="$1"
    local rpath
    local gh_repo=""

    if [[ "$module" == "github.com/ipfs/kubo" ]]; then
        rpath="$ROOT_DIR"
    else
        rpath="$GOPATH/src/$(strip_version "$module")"
    fi

    # Extract gh_repo for API calls
    local repo
    repo="$(strip_version "$module")"
    if [[ "$repo" =~ ^github\.com/(.+)$ ]]; then
        gh_repo="${BASH_REMATCH[1]}"
    fi

    local start="${2:-}"
    local end="${3:-HEAD}"
    local mailmap_file="$rpath/.mailmap"
    if ! [[ -e "$mailmap_file" ]]; then
        mailmap_file="$ROOT_DIR/.mailmap"
    fi

    local stack=()
    local line
    while read -r line; do
        if [[ -n "$line" ]]; then
            stack+=("$line")
            continue
        fi

        local changes
        read -r changes

        local changed=0
        local insertions=0
        local deletions=0
        local count event
        while read -r count event; do
            if [[ "$event" =~ ^file ]]; then
                changed=$count
            elif [[ "$event" =~ ^insertion ]]; then
                insertions=$count
            elif [[ "$event" =~ ^deletion ]]; then
                deletions=$count
            else
                echo "unknown event $event" >&2
                exit 1
            fi
        done<<<"${changes//,/$NL}"

        local author
        for author in "${stack[@]}"; do
            local hash name email
            IFS=$'\t' read -r hash name email <<<"$author"

            # Resolve GitHub handle
            local github_handle=""
            github_handle="$(resolve_github_handle "$email" "$hash" "$rpath" "$gh_repo")" || true

            jq -n \
               --arg "hash" "$hash" \
               --arg "name" "$name" \
               --arg "email" "$email" \
               --arg "github" "$github_handle" \
               --argjson "changed" "$changed" \
               --argjson "insertions" "$insertions" \
               --argjson "deletions" "$deletions" \
               '{Commit: $hash, Author: $name, Email: $email, GitHub: $github, Files: $changed, Insertions: $insertions, Deletions: $deletions}'
        done
        stack=()
    done < <(git -C "$rpath" -c mailmap.file="$mailmap_file" log --use-mailmap --shortstat --no-merges --pretty="tformat:%H%x09%aN%x09%aE" "$start..$end" -- . "${IGNORE_FILES_PATHSPEC[@]}")
}

# Returns a stream of deps changed between $1 and $2.
dep_changes() {
    cat "$1" "$2" | jq -s 'JOIN(INDEX(.[0][]; .Path); .[1][]; .Path; {Path: .[0].Path, Old: (.[1] | del(.Path)), New: (.[0] | del(.Path))}) | select(.New.Version != .Old.Version)'
}

# resolve_commits resolves a git ref for each version.
resolve_commits() {
    jq '. + {Ref: (.Version|capture("^((?<ref1>.*)\\+incompatible|v.*-(0\\.)?[0-9]{14}-(?<ref2>[a-f0-9]{12})|(?<ref3>v.*))$") | .ref1 // .ref2 // .ref3)}'
}

pr_link() {
    local repo="$1"
    local prnum="$2"
    local ghname="${repo##github.com/}"
    printf -- "[%s#%s](https://%s/pull/%s)" "$ghname" "$prnum" "$repo" "$prnum"
}

ignored_commit() {
    local repo="$1"
    local commit="$2"
    local matches

    # Check to see if this commit includes any non-ignored files.
    matches=$(git -C "$repo" diff-tree --no-commit-id --name-only -r "$commit^" "$commit" \
                  -- "${IGNORE_FILES_PATHSPEC[@]}" | wc -l)
    [[ "$matches" -eq 0 ]]
}

# Generate a release log for a range of commits in a single repo.
release_log() {
    local module="$1"
    local start="$2"
    local end="${3:-HEAD}"
    local repo
    repo="$(strip_version "$1")"
    local dir
    if [[ "$module" == "github.com/ipfs/kubo" ]]; then
        dir="$ROOT_DIR"
    else
        dir="$GOPATH/src/$repo"
    fi

    local commit subject
    while read -r commit subject; do
        # Skip commits that only touch ignored files.
        if ignored_commit "$dir" "$commit"; then
            continue
        fi

        if [[ "$subject" =~ ^Merge\ pull\ request\ \#([0-9]+)\ from ]]; then
            local prnum="${BASH_REMATCH[1]}"
            local desc
            desc="$(git -C "$dir" show --summary --format='tformat:%b' "$commit" | head -1)"
            printf -- "- %s (%s)\n" "$desc" "$(pr_link "$repo" "$prnum")"
        elif [[ "$subject" =~ \(#([0-9]+)\)$ ]]; then
            local prnum="${BASH_REMATCH[1]}"
            printf -- "- %s (%s)\n" "$subject" "$(pr_link "$repo" "$prnum")"
        else
            printf -- "- %s\n" "$subject"
        fi
    done < <(git -C "$dir" log --format='tformat:%H %s' --first-parent "$start..$end")
}

indent() {
    sed -e 's/^/  /'
}

mod_deps() {
    go list -mod=mod -json -m all | jq 'select(.Version != null)'
}

ensure() {
    local repo
    repo="$(strip_version "$1")"
    local commit="$2"
    local rpath
    if [[ "$1" == "github.com/ipfs/kubo" ]]; then
        rpath="$ROOT_DIR"
    else
        rpath="$GOPATH/src/$repo"
    fi
    if [[ "$1" != "github.com/ipfs/kubo" ]] && [[ ! -d "$rpath" ]]; then
        msg "Cloning $repo..."
        git clone "http://$repo" "$rpath" >&2
    fi

    if ! git -C "$rpath" rev-parse --verify "$commit" >/dev/null; then
        msg "Fetching $repo..."
        git -C "$rpath" fetch --all >&2
    fi

    git -C "$rpath" rev-parse --verify "$commit" >/dev/null || return 1
}

# Summarize stats, grouping by GitHub handle (with fallback to email for dedup)
statsummary() {
    jq -s '
        # Group by GitHub handle if available, otherwise by email
        group_by(if .GitHub != "" then .GitHub else .Email end)[] |
        {
            # Use first non-empty GitHub handle, or fall back to Author name
            Author: .[0].Author,
            GitHub: (map(select(.GitHub != "")) | .[0].GitHub // ""),
            Email: .[0].Email,
            Commits: (. | length),
            Insertions: (map(.Insertions) | add),
            Deletions: (map(.Deletions) | add),
            Files: (map(.Files) | add)
        }
    ' | jq '. + {Lines: (.Deletions + .Insertions)}'
}

strip_version() {
    local repo="$1"
    if [[ "$repo" =~ .*/v[0-9]+$ ]]; then
        repo="$(dirname "$repo")"
    fi
    echo "$repo"
}

recursive_release_log() {
    local start="${1:-$(git tag -l | sort -V | grep -v -- '-rc' | grep 'v'| tail -n1)}"
    local end="${2:-$(git rev-parse HEAD)}"
    local repo_root
    repo_root="$(git rev-parse --show-toplevel)"
    local module
    module="$(go list -m)"
    local dir
    dir="$(go list -m -f '{{.Dir}}')"

    # Load cached GitHub handle mappings
    load_github_cache

    # Kubo can be run from any directory, dependencies still use GOPATH

    (
        local result=0
        local workspace
        workspace="$(mktemp -d)"
        # shellcheck disable=SC2064
        trap "rm -rf '$workspace'" INT TERM EXIT
        cd "$workspace"

        echo "Computing old deps..." >&2
        git -C "$repo_root" show "$start:go.mod" >go.mod
        mod_deps | resolve_commits | jq -s > old_deps.json

        echo "Computing new deps..." >&2
        git -C "$repo_root" show "$end:go.mod" >go.mod
        mod_deps | resolve_commits | jq -s > new_deps.json

        rm -f go.mod go.sum

        printf -- "Generating Changelog for %s %s..%s\n" "$module" "$start" "$end" >&2

        # Pre-build GitHub mappings for main module
        build_github_mappings "$module" "$start" "$end"

        echo "### 📝 Changelog"
        echo
        echo "<details><summary>Full Changelog</summary>"
        echo

        printf -- "- %s:\n" "$module"
        release_log "$module" "$start" "$end" | indent

        statlog "$module" "$start" "$end" > statlog.json

        local dep_module new new_ref old old_ref
        while read -r dep_module new new_ref old old_ref; do
            if ! ensure "$dep_module" "$new_ref"; then
                result=1
                local changelog="failed to fetch repo"
            else
                # Pre-build GitHub mappings for dependency
                build_github_mappings "$dep_module" "$old_ref" "$new_ref"
                statlog "$dep_module" "$old_ref" "$new_ref" >> statlog.json
                local changelog
                changelog="$(release_log "$dep_module" "$old_ref" "$new_ref")"
            fi
            if [[ -n "$changelog" ]]; then
                printf -- "- %s (%s -> %s):\n" "$dep_module" "$old" "$new"
                echo "$changelog" | indent
            fi
        done < <(dep_changes old_deps.json new_deps.json |
            jq --arg inc "$INCLUDE_REGEX" --arg exc "$EXCLUDE_REGEX" \
               'select(.Path | test($inc)) | select(.Path | test($exc) | not)' |
            jq -r '"\(.Path) \(.New.Version) \(.New.Ref) \(.Old.Version) \(.Old.Ref // "")"')

        echo
        echo "</details>"
        echo
        echo "### 👨‍👩‍👧‍👦 Contributors"
        echo

        echo "| Contributor | Commits | Lines ± | Files Changed |"
        echo "|-------------|---------|---------|---------------|"
        statsummary <statlog.json |
            jq -s 'sort_by(.Lines) | reverse | .[]' |
            jq -r '
                if .GitHub != "" then
                    "| [@\(.GitHub)](https://github.com/\(.GitHub)) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
                else
                    "| \(.Author) | \(.Commits) | +\(.Insertions)/-\(.Deletions) | \(.Files) |"
                end
            '

        # Save cache before exiting
        save_github_cache

        return "$result"
    )
}

recursive_release_log "$@"


================================================
FILE: bin/push-docker-tags.sh
================================================
#!/usr/bin/env bash
#
# TODO: this script is legacy, use get-docker-tags.sh instead.
#
# push-docker-tags.sh
#
# Run from ci to tag images based on the current branch or tag name.
# A bit like dockerhub autobuild config, but somewhere we can version control it.
#
# The `docker-build` job builds the current commit in docker and tags it as ipfs/kubo:wip
#
# Then the `docker-publish` job runs this script to decide what tag, if any,
# to publish to dockerhub.
#
# Usage:
#   ./push-docker-tags.sh <build number> <git commit sha1> <git branch name> [git tag name] [dry run]
#
# Example:
#   # dry run. pass a 5th arg to have it print what it would do rather than do it.
#   ./push-docker-tags.sh $(date -u +%F) testingsha master "" dryrun
#
#   # push tag for the master branch
#   ./push-docker-tags.sh $(date -u +%F) testingsha master
#
#   # push tag for a release tag
#   ./push-docker-tags.sh $(date -u +%F) testingsha release v0.5.0
#
set -euo pipefail

if [[ $# -lt 1 ]] ; then
  echo 'At least 1 arg required. Pass 5 args for a dry run.'
  echo 'Usage:'
  echo './push-docker-tags.sh <build number> [git commit sha1] [git branch name] [git tag name] [dry run]'
  exit 1
fi

BUILD_NUM=$1
GIT_SHA1=${2:-$(git rev-parse HEAD)}
GIT_SHA1_SHORT=$(echo "$GIT_SHA1" | cut -c 1-7)
GIT_BRANCH=${3:-$(git symbolic-ref -q --short HEAD || echo "unknown")}
GIT_TAG=${4:-$(git describe --tags --exact-match || echo "")}
DRY_RUN=${5:-false}

WIP_IMAGE_TAG=${WIP_IMAGE_TAG:-wip}
IMAGE_NAME=${IMAGE_NAME:-ipfs/kubo}

pushTag () {
  local IMAGE_TAG=$1
  if [ "$DRY_RUN" != false ]; then
    echo "DRY RUN! I would have tagged and pushed the following..."
    echo docker tag "$IMAGE_NAME:$WIP_IMAGE_TAG" "$IMAGE_NAME:$IMAGE_TAG"
    echo docker push "$IMAGE_NAME:$IMAGE_TAG"
  else
    echo "Tagging $IMAGE_NAME:$IMAGE_TAG and pushing to dockerhub"
    docker tag "$IMAGE_NAME:$WIP_IMAGE_TAG" "$IMAGE_NAME:$IMAGE_TAG"
    docker push "$IMAGE_NAME:$IMAGE_TAG"
  fi
}

if [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+-rc ]]; then
  pushTag "$GIT_TAG"

elif [[ $GIT_TAG =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  pushTag "$GIT_TAG"
  pushTag "latest"
  pushTag "release" # see: https://github.com/ipfs/kubo/issues/3999#issuecomment-742228981

elif [[ $GIT_BRANCH =~ ^bifrost-.* ]]; then
  # sanitize the branch name since docker tags have stricter char limits than git branch names
  branch=$(echo "$GIT_BRANCH" | tr '/' '-' | tr --delete --complement '[:alnum:]-')
  pushTag "${branch}-${BUILD_NUM}-${GIT_SHA1_SHORT}"

elif [ "$GIT_BRANCH" = "master" ] || [ "$GIT_BRANCH" = "staging" ]; then
  pushTag "${GIT_BRANCH}-${BUILD_NUM}-${GIT_SHA1_SHORT}"
  pushTag "${GIT_BRANCH}-latest"

else
  echo "Nothing to do. No docker tag defined for branch: $GIT_BRANCH, tag: $GIT_TAG"

fi


================================================
FILE: bin/test-go-build-platforms
================================================
#!/bin/bash
set -e

echo "Building kubo for all platforms in .github/build-platforms.yml..."

if [ ! -f .github/build-platforms.yml ]; then
    echo "Error: .github/build-platforms.yml not found"
    exit 1
fi

grep '^  - ' .github/build-platforms.yml | sed 's/^  - //' | while read -r platform; do
    if [ -z "$platform" ]; then
        continue
    fi

    GOOS=$(echo "$platform" | cut -d- -f1)
    GOARCH=$(echo "$platform" | cut -d- -f2)

    echo "Building $platform..."
    echo "  GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs"
    GOOS=$GOOS GOARCH=$GOARCH go build -o /dev/null ./cmd/ipfs
done

echo "All platforms built successfully"

================================================
FILE: bin/test-go-fmt
================================================
#!/usr/bin/env bash
set -euo pipefail
T="$(mktemp)"
find . \
    -path ./test/sharness -prune \
 -o -path ./plugin/loader/preload.go -prune \
 -o -name '*.go' -print0 | xargs -0 gofmt -s -l > "$T"

if [ -n "$(cat $T)" ]; then
	echo "Following Go code is not formatted."
	echo "-----------------------------------"
	cat "$T"
	echo "-----------------------------------"
	echo "Run 'go fmt ./...' in your source directory"
	rm -f "$T"
	exit 1
fi
rm -f "$T"


================================================
FILE: blocks/blockstoreutil/remove.go
================================================
// Package blockstoreutil provides utility functions for Blockstores.
package blockstoreutil

import (
	"context"
	"errors"
	"fmt"

	bs "github.com/ipfs/boxo/blockstore"
	pin "github.com/ipfs/boxo/pinning/pinner"
	cid "github.com/ipfs/go-cid"
	format "github.com/ipfs/go-ipld-format"
)

// RemovedBlock is used to represent the result of removing a block.
// If a block was removed successfully, then the Error will be empty.
// If a block could not be removed, then Error will contain the
// reason the block could not be removed.  If the removal was aborted
// due to a fatal error, Hash will be empty, Error will contain the
// reason, and no more results will be sent.
type RemovedBlock struct {
	Hash  string
	Error error
}

// RmBlocksOpts is used to wrap options for RmBlocks().
type RmBlocksOpts struct {
	Prefix string
	Quiet  bool
	Force  bool
}

// RmBlocks removes the blocks provided in the cids slice.
// It returns a channel where objects of type RemovedBlock are placed, when
// not using the Quiet option. Block removal is asynchronous and will
// skip any pinned blocks.
func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinner, cids []cid.Cid, opts RmBlocksOpts) (<-chan any, error) {
	// make the channel large enough to hold any result to avoid
	// blocking while holding the GCLock
	out := make(chan any, len(cids))
	go func() {
		defer close(out)

		unlocker := blocks.GCLock(ctx)
		defer unlocker.Unlock(ctx)

		stillOkay := FilterPinned(ctx, pins, out, cids)

		for _, c := range stillOkay {
			// Kept for backwards compatibility. We may want to
			// remove this sometime in the future.
			has, err := blocks.Has(ctx, c)
			if err != nil {
				out <- &RemovedBlock{Hash: c.String(), Error: err}
				continue
			}
			if !has && !opts.Force {
				out <- &RemovedBlock{Hash: c.String(), Error: format.ErrNotFound{Cid: c}}
				continue
			}

			err = blocks.DeleteBlock(ctx, c)
			if err != nil {
				out <- &RemovedBlock{Hash: c.String(), Error: err}
			} else if !opts.Quiet {
				out <- &RemovedBlock{Hash: c.String()}
			}
		}
	}()
	return out, nil
}

// FilterPinned takes a slice of Cids and returns it with the pinned Cids
// removed. If a Cid is pinned, it will place RemovedBlock objects in the given
// out channel, with an error which indicates that the Cid is pinned.
// This function is used in RmBlocks to filter out any blocks which are not
// to be removed (because they are pinned).
func FilterPinned(ctx context.Context, pins pin.Pinner, out chan<- any, cids []cid.Cid) []cid.Cid {
	stillOkay := make([]cid.Cid, 0, len(cids))
	res, err := pins.CheckIfPinned(ctx, cids...)
	if err != nil {
		out <- &RemovedBlock{Error: fmt.Errorf("pin check failed: %w", err)}
		return nil
	}
	for _, r := range res {
		if !r.Pinned() {
			stillOkay = append(stillOkay, r.Key)
		} else {
			out <- &RemovedBlock{
				Hash:  r.Key.String(),
				Error: errors.New(r.String()),
			}
		}
	}
	return stillOkay
}


================================================
FILE: client/rpc/README.md
================================================
# `coreiface.CoreAPI` over http `rpc`

> IPFS CoreAPI implementation using HTTP API

This package implements [`coreiface.CoreAPI`](https://pkg.go.dev/github.com/ipfs/kubo/core/coreiface#CoreAPI) over the HTTP API.

## Documentation

https://pkg.go.dev/github.com/ipfs/kubo/client/rpc

### Example

Pin file on your local IPFS node based on its CID:

```go
package main

import (
	"context"
	"fmt"

	"github.com/ipfs/boxo/path"
	"github.com/ipfs/go-cid"
	"github.com/ipfs/kubo/client/rpc"
)

func main() {
	// "Connect" to local node
	node, err := rpc.NewLocalApi()
	if err != nil {
		fmt.Println(err)
		return
	}
	// Pin a given file by its CID
	ctx := context.Background()
	c, err := cid.Decode("bafkreidtuosuw37f5xmn65b3ksdiikajy7pwjjslzj2lxxz2vc4wdy3zku")
	if err != nil {
		fmt.Println(err)
		return
	}
	p := path.FromCid(c)
	err = node.Pin().Add(ctx, p)
	if err != nil {
		fmt.Println(err)
		return
	}
}
```


================================================
FILE: client/rpc/api.go
================================================
package rpc

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"net"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"sync"
	"time"

	"github.com/blang/semver/v4"
	"github.com/ipfs/boxo/ipld/merkledag"
	"github.com/ipfs/go-cid"
	legacy "github.com/ipfs/go-ipld-legacy"
	ipfs "github.com/ipfs/kubo"
	iface "github.com/ipfs/kubo/core/coreiface"
	caopts "github.com/ipfs/kubo/core/coreiface/options"
	"github.com/ipfs/kubo/misc/fsutil"
	dagpb "github.com/ipld/go-codec-dagpb"
	_ "github.com/ipld/go-ipld-prime/codec/dagcbor"
	"github.com/ipld/go-ipld-prime/node/basicnode"
	ma "github.com/multiformats/go-multiaddr"
	manet "github.com/multiformats/go-multiaddr/net"
)

const (
	DefaultPathName = ".ipfs"
	DefaultPathRoot = "~/" + DefaultPathName
	DefaultApiFile  = "api"
	EnvDir          = "IPFS_PATH"
)

// ErrApiNotFound if we fail to find a running daemon.
var ErrApiNotFound = errors.New("ipfs api address could not be found")

// HttpApi implements github.com/ipfs/interface-go-ipfs-core/CoreAPI using
// IPFS HTTP API.
//
// For interface docs see
// https://godoc.org/github.com/ipfs/interface-go-ipfs-core#CoreAPI
type HttpApi struct {
	url         string
	httpcli     http.Client
	Headers     http.Header
	applyGlobal func(*requestBuilder)
	ipldDecoder *legacy.Decoder
	versionMu   sync.Mutex
	version     *semver.Version
}

// NewLocalApi tries to construct new HttpApi instance communicating with local
// IPFS daemon
//
// Daemon api address is pulled from the $IPFS_PATH/api file.
// If $IPFS_PATH env var is not present, it defaults to ~/.ipfs.
func NewLocalApi() (*HttpApi, error) {
	baseDir := os.Getenv(EnvDir)
	if baseDir == "" {
		baseDir = DefaultPathRoot
	}

	return NewPathApi(baseDir)
}

// NewPathApi constructs new HttpApi by pulling api address from specified
// ipfspath. Api file should be located at $ipfspath/api.
func NewPathApi(ipfspath string) (*HttpApi, error) {
	a, err := ApiAddr(ipfspath)
	if err != nil {
		if os.IsNotExist(err) {
			err = ErrApiNotFound
		}
		return nil, err
	}
	return NewApi(a)
}

// ApiAddr reads api file in specified ipfs path.
func ApiAddr(ipfspath string) (ma.Multiaddr, error) {
	baseDir, err := fsutil.ExpandHome(ipfspath)
	if err != nil {
		return nil, err
	}

	apiFile := filepath.Join(baseDir, DefaultApiFile)

	api, err := os.ReadFile(apiFile)
	if err != nil {
		return nil, err
	}

	return ma.NewMultiaddr(strings.TrimSpace(string(api)))
}

// NewApi constructs HttpApi with specified endpoint.
func NewApi(a ma.Multiaddr) (*HttpApi, error) {
	transport := &http.Transport{
		Proxy:             http.ProxyFromEnvironment,
		DisableKeepAlives: true,
	}

	network, address, err := manet.DialArgs(a)
	if err != nil {
		return nil, err
	}
	if network == "unix" {
		transport.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) {
			return net.Dial("unix", address)
		}
		c := &http.Client{
			Transport: transport,
		}
		// This will create an API client which
		// makes requests to `http://unix`.
		return NewURLApiWithClient(network, c)
	}

	c := &http.Client{
		Transport: transport,
	}

	return NewApiWithClient(a, c)
}

// NewApiWithClient constructs HttpApi with specified endpoint and custom http client.
func NewApiWithClient(a ma.Multiaddr, c *http.Client) (*HttpApi, error) {
	_, url, err := manet.DialArgs(a)
	if err != nil {
		return nil, err
	}

	if a, err := ma.NewMultiaddr(url); err == nil {
		_, host, err := manet.DialArgs(a)
		if err == nil {
			url = host
		}
	}

	proto := "http://"

	// By default, DialArgs is going to provide details suitable for connecting
	// a socket to, but not really suitable for making an informed choice of http
	// protocol.  For multiaddresses specifying tls and/or https we want to make
	// a https request instead of a http request.
	protocols := a.Protocols()
	for _, p := range protocols {
		if p.Code == ma.P_HTTPS || p.Code == ma.P_TLS {
			proto = "https://"
			break
		}
	}

	return NewURLApiWithClient(proto+url, c)
}

func NewURLApiWithClient(url string, c *http.Client) (*HttpApi, error) {
	decoder := legacy.NewDecoder()
	// Add support for these codecs to match what is done in the merkledag library
	// Note: to match prior behavior the go-ipld-prime CBOR decoder is manually included
	// TODO: allow the codec registry used to be configured by the caller not through a global variable
	decoder.RegisterCodec(cid.DagProtobuf, dagpb.Type.PBNode, merkledag.ProtoNodeConverter)
	decoder.RegisterCodec(cid.Raw, basicnode.Prototype.Bytes, merkledag.RawNodeConverter)

	api := &HttpApi{
		url:         url,
		httpcli:     *c,
		Headers:     make(map[string][]string),
		applyGlobal: func(*requestBuilder) {},
		ipldDecoder: decoder,
	}

	// We don't support redirects.
	api.httpcli.CheckRedirect = func(_ *http.Request, _ []*http.Request) error {
		return fmt.Errorf("unexpected redirect")
	}

	return api, nil
}

func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreAPI, error) {
	options, err := caopts.ApiOptions(opts...)
	if err != nil {
		return nil, err
	}

	subApi := &HttpApi{
		url:     api.url,
		httpcli: api.httpcli,
		Headers: api.Headers,
		applyGlobal: func(req *requestBuilder) {
			if options.Offline {
				req.Option("offline", options.Offline)
			}
		},
		ipldDecoder: api.ipldDecoder,
	}

	return subApi, nil
}

func (api *HttpApi) Request(command string, args ...string) RequestBuilder {
	headers := make(map[string]string)
	if api.Headers != nil {
		for k := range api.Headers {
			headers[k] = api.Headers.Get(k)
		}
	}
	return &requestBuilder{
		command: command,
		args:    args,
		shell:   api,
		headers: headers,
	}
}

func (api *HttpApi) Unixfs() iface.UnixfsAPI {
	return (*UnixfsAPI)(api)
}

func (api *HttpApi) Block() iface.BlockAPI {
	return (*BlockAPI)(api)
}

func (api *HttpApi) Dag() iface.APIDagService {
	return (*HttpDagServ)(api)
}

func (api *HttpApi) Name() iface.NameAPI {
	return (*NameAPI)(api)
}

func (api *HttpApi) Key() iface.KeyAPI {
	return (*KeyAPI)(api)
}

func (api *HttpApi) Pin() iface.PinAPI {
	return (*PinAPI)(api)
}

func (api *HttpApi) Object() iface.ObjectAPI {
	return (*ObjectAPI)(api)
}

func (api *HttpApi) Swarm() iface.SwarmAPI {
	return (*SwarmAPI)(api)
}

func (api *HttpApi) PubSub() iface.PubSubAPI {
	return (*PubsubAPI)(api)
}

func (api *HttpApi) Routing() iface.RoutingAPI {
	return (*RoutingAPI)(api)
}

func (api *HttpApi) loadRemoteVersion() (*semver.Version, error) {
	api.versionMu.Lock()
	defer api.versionMu.Unlock()

	if api.version == nil {
		ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30))
		defer cancel()

		resp, err := api.Request("version").Send(ctx)
		if err != nil {
			return nil, err
		}
		if resp.Error != nil {
			return nil, resp.Error
		}
		defer resp.Close()
		var out ipfs.VersionInfo
		dec := json.NewDecoder(resp.Output)
		if err := dec.Decode(&out); err != nil {
			return nil, err
		}

		remoteVersion, err := semver.New(out.Version)
		if err != nil {
			return nil, err
		}

		api.version = remoteVersion
	}

	return api.version, nil
}


================================================
FILE: client/rpc/api_test.go
================================================
package rpc

import (
	"context"
	"errors"
	"net/http"
	"net/http/httptest"
	"strconv"
	"strings"
	"sync"
	"testing"
	"time"

	"github.com/ipfs/boxo/path"
	"github.com/ipfs/kubo/config"
	iface "github.com/ipfs/kubo/core/coreiface"
	"github.com/ipfs/kubo/core/coreiface/tests"
	"github.com/ipfs/kubo/test/cli/harness"
	ma "github.com/multiformats/go-multiaddr"
)

type NodeProvider struct{}

func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fullIdentity, online bool, n int) ([]iface.CoreAPI, error) {
	h := harness.NewT(t)

	apis := make([]iface.CoreAPI, n)
	nodes := h.NewNodes(n)

	var wg, zero sync.WaitGroup
	zeroNode := nodes[0]
	wg.Add(len(apis))
	zero.Add(1)

	var errs []error
	var errsLk sync.Mutex

	for i, n := range nodes {
		go func(i int, n *harness.Node) {
			if err := func() error {
				defer wg.Done()
				var err error

				n.Init("--empty-repo")

				c := n.ReadConfig()
				c.Experimental.FilestoreEnabled = true
				// only provide things we pin. Allows to test
				// provide operations.
				c.Provide.Strategy = config.NewOptionalString("roots")
				n.WriteConfig(c)
				n.StartDaemon("--enable-pubsub-experiment", "--offline="+strconv.FormatBool(!online))

				if online {
					if i > 0 {
						zero.Wait()
						n.Connect(zeroNode)
					} else {
						zero.Done()
					}
				}

				apiMaddr, err := n.TryAPIAddr()
				if err != nil {
					return err
				}

				api, err := NewApi(apiMaddr)
				if err != nil {
					return err
				}
				apis[i] = api

				// empty node is pinned even with --empty-repo, we don't want that
				emptyNode, err := path.NewPath("/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn")
				if err != nil {
					return err
				}

				if err := api.Pin().Rm(ctx, emptyNode); err != nil {
					return err
				}
				return nil
			}(); err != nil {
				errsLk.Lock()
				errs = append(errs, err)
				errsLk.Unlock()
			}
		}(i, n)
	}

	wg.Wait()

	return apis, errors.Join(errs...)
}

func TestHttpApi(t *testing.T) {
	t.Parallel()

	tests.TestApi(NodeProvider{})(t)
}

func Test_NewURLApiWithClient_With_Headers(t *testing.T) {
	t.Parallel()

	var (
		headerToTest        = "Test-Header"
		expectedHeaderValue = "thisisaheadertest"
	)
	ts := httptest.NewServer(
		http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			val := r.Header.Get(headerToTest)
			if val != expectedHeaderValue {
				w.WriteHeader(400)
				return
			}
			http.ServeContent(w, r, "", time.Now(), strings.NewReader("test"))
		}),
	)
	defer ts.Close()
	api, err := NewURLApiWithClient(ts.URL, &http.Client{
		Transport: &http.Transport{
			Proxy:             http.ProxyFromEnvironment,
			DisableKeepAlives: true,
		},
	})
	if err != nil {
		t.Fatal(err)
	}
	api.Headers.Set(headerToTest, expectedHeaderValue)
	p, err := path.NewPath("/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv")
	if err != nil {
		t.Fatal(err)
	}
	if err := api.Pin().Rm(context.Background(), p); err != nil {
		t.Fatal(err)
	}
}

func Test_NewURLApiWithClient_HTTP_Variant(t *testing.T) {
	t.Parallel()

	testcases := []struct {
		address  string
		expected string
	}{
		{address: "/ip4/127.0.0.1/tcp/80", expected: "http://127.0.0.1:80"},
		{address: "/ip4/127.0.0.1/tcp/443/tls", expected: "https://127.0.0.1:443"},
		{address: "/ip4/127.0.0.1/tcp/443/https", expected: "https://127.0.0.1:443"},
		{address: "/ip4/127.0.0.1/tcp/443/tls/http", expected: "https://127.0.0.1:443"},
	}

	for _, tc := range testcases {
		address, err := ma.NewMultiaddr(tc.address)
		if err != nil {
			t.Fatal(err)
		}

		api, err := NewApiWithClient(address, &http.Client{})
		if err != nil {
			t.Fatal(err)
		}

		if api.url != tc.expected {
			t.Errorf("Expected = %s; got %s", tc.expected, api.url)
		}
	}
}


================================================
FILE: client/rpc/apifile.go
================================================
package rpc

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"strconv"
	"time"

	"github.com/ipfs/boxo/files"
	unixfs "github.com/ipfs/boxo/ipld/unixfs"
	"github.com/ipfs/boxo/path"
	"github.com/ipfs/go-cid"
)

const forwardSeekLimit = 1 << 14 // 16k

func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Node, error) {
	if p.Mutable() { // use resolved path in case we are dealing with IPNS / MFS
		var err error
		p, _, err = api.core().ResolvePath(ctx, p)
		if err != nil {
			return nil, err
		}
	}

	var stat struct {
		Hash       string
		Type       string
		Size       int64 // unixfs size
		Mode       string
		Mtime      int64
		MtimeNsecs int
	}
	err := api.core().Request("files/stat", p.String()).Exec(ctx, &stat)
	if err != nil {
		return nil, err
	}

	mode, err := stringToFileMode(stat.Mode)
	if err != nil {
		return nil, err
	}

	var modTime time.Time
	if stat.Mtime != 0 {
		modTime = time.Unix(stat.Mtime, int64(stat.MtimeNsecs)).UTC()
	}

	switch stat.Type {
	case "file":
		return api.getFile(ctx, p, stat.Size, mode, modTime)
	case "directory":
		return api.getDir(ctx, p, stat.Size, mode, modTime)
	case "symlink":
		return api.getSymlink(ctx, p, modTime)
	default:
		return nil, fmt.Errorf("unsupported file type '%s'", stat.Type)
	}
}

type apiFile struct {
	ctx  context.Context
	core *HttpApi
	size int64
	path path.Path

	mode  os.FileMode
	mtime time.Time

	r  *Response
	at int64
}

func (f *apiFile) reset() error {
	if f.r != nil {
		_ = f.r.Cancel()
		f.r = nil
	}
	req := f.core.Request("cat", f.path.String())
	if f.at != 0 {
		req.Option("offset", f.at)
	}
	resp, err := req.Send(f.ctx)
	if err != nil {
		return err
	}
	if resp.Error != nil {
		return resp.Error
	}
	f.r = resp
	return nil
}

func (f *apiFile) Read(p []byte) (int, error) {
	n, err := f.r.Output.Read(p)
	if n > 0 {
		f.at += int64(n)
	}
	return n, err
}

func (f *apiFile) ReadAt(p []byte, off int64) (int, error) {
	// Always make a new request. This method should be parallel-safe.
	resp, err := f.core.Request("cat", f.path.String()).
		Option("offset", off).Option("length", len(p)).Send(f.ctx)
	if err != nil {
		return 0, err
	}
	if resp.Error != nil {
		return 0, resp.Error
	}
	defer resp.Output.Close()

	n, err := io.ReadFull(resp.Output, p)
	if err == io.ErrUnexpectedEOF {
		err = io.EOF
	}
	return n, err
}

func (f *apiFile) Seek(offset int64, whence int) (int64, error) {
	switch whence {
	case io.SeekEnd:
		offset = f.size + offset
	case io.SeekCurrent:
		offset = f.at + offset
	}
	if f.at == offset { // noop
		return offset, nil
	}

	if f.at < offset && offset-f.at < forwardSeekLimit { // forward skip
		r, err := io.CopyN(io.Discard, f.r.Output, offset-f.at)

		f.at += r
		return f.at, err
	}
	f.at = offset
	return f.at, f.reset()
}

func (f *apiFile) Close() error {
	if f.r != nil {
		return f.r.Cancel()
	}
	return nil
}

func (f *apiFile) Mode() os.FileMode {
	return f.mode
}

func (f *apiFile) ModTime() time.Time {
	return f.mtime
}

func (f *apiFile) Size() (int64, error) {
	return f.size, nil
}

func stringToFileMode(mode string) (os.FileMode, error) {
	if mode == "" {
		return 0, nil
	}
	mode64, err := strconv.ParseUint(mode, 8, 32)
	if err != nil {
		return 0, fmt.Errorf("cannot parse mode %s: %s", mode, err)
	}
	return os.FileMode(uint32(mode64)), nil
}

func (api *UnixfsAPI) getFile(ctx context.Context, p path.Path, size int64, mode os.FileMode, mtime time.Time) (files.Node, error) {
	f := &apiFile{
		ctx:   ctx,
		core:  api.core(),
		size:  size,
		path:  p,
		mode:  mode,
		mtime: mtime,
	}

	return f, f.reset()
}

type apiIter struct {
	ctx  context.Context
	core *UnixfsAPI

	err error

	dec     *json.Decoder
	curFile files.Node
	cur     lsLink
}

func (it *apiIter) Err() error {
	return it.err
}

func (it *apiIter) Name() string {
	return it.cur.Name
}

func (it *apiIter) Next() bool {
	if it.ctx.Err() != nil {
		it.err = it.ctx.Err()
		return false
	}

	var out lsOutput
	if err := it.dec.Decode(&out); err != nil {
		if err != io.EOF {
			it.err = err
		}
		return false
	}

	if len(out.Objects) != 1 {
		it.err = fmt.Errorf("ls returned more objects than expected (%d)", len(out.Objects))
		return false
	}

	if len(out.Objects[0].Links) != 1 {
		it.err = fmt.Errorf("ls returned more links than expected (%d)", len(out.Objects[0].Links))
		return false
	}

	it.cur = out.Objects[0].Links[0]
	c, err := cid.Parse(it.cur.Hash)
	if err != nil {
		it.err = err
		return false
	}

	switch it.cur.Type {
	case unixfs.THAMTShard, unixfs.TMetadata, unixfs.TDirectory:
		it.curFile, err = it.core.getDir(it.ctx, path.FromCid(c), int64(it.cur.Size), it.cur.Mode, it.cur.ModTime)
		if err != nil {
			it.err = err
			return false
		}
	case unixfs.TFile:
		it.curFile, err = it.core.getFile(it.ctx, path.FromCid(c), int64(it.cur.Size), it.cur.Mode, it.cur.ModTime)
		if err != nil {
			it.err = err
			return false
		}
	case unixfs.TSymlink:
		it.curFile, err = it.core.getSymlink(it.ctx, path.FromCid(c), it.cur.ModTime)
		if err != nil {
			it.err = err
			return false
		}
	default:
		it.err = fmt.Errorf("file type %d not supported", it.cur.Type)
		return false
	}
	return true
}

func (it *apiIter) Node() files.Node {
	return it.curFile
}

type apiDir struct {
	ctx  context.Context
	core *UnixfsAPI
	size int64
	path path.Path

	mode  os.FileMode
	mtime time.Time

	dec *json.Decoder
}

func (d *apiDir) Close() error {
	return nil
}

func (d *apiDir) Mode() os.FileMode {
	return d.mode
}

func (d *apiDir) ModTime() time.Time {
	return d.mtime
}

func (d *apiDir) Size() (int64, error) {
	return d.size, nil
}

func (d *apiDir) Entries() files.DirIterator {
	return &apiIter{
		ctx:  d.ctx,
		core: d.core,
		dec:  d.dec,
	}
}

func (api *UnixfsAPI) getDir(ctx context.Context, p path.Path, size int64, mode os.FileMode, modTime time.Time) (files.Node, error) {
	resp, err := api.core().Request("ls", p.String()).
		Option("resolve-size", true).
		Option("stream", true).Send(ctx)
	if err != nil {
		return nil, err
	}
	if resp.Error != nil {
		return nil, resp.Error
	}

	data, _ := io.ReadAll(resp.Output)
	rdr := bytes.NewReader(data)

	d := &apiDir{
		ctx:   ctx,
		core:  api,
		size:  size,
		path:  p,
		mode:  mode,
		mtime: modTime,

		//dec: json.NewDecoder(resp.Output),
		dec: json.NewDecoder(rdr),
	}

	return d, nil
}

func (api *UnixfsAPI) getSymlink(ctx context.Context, p path.Path, modTime time.Time) (files.Node, error) {
	resp, err := api.core().Request("cat", p.String()).
		Option("resolve-size", true).
		Option("stream", true).Send(ctx)
	if err != nil {
		return nil, err
	}
	if resp.Error != nil {
		return nil, resp.Error
	}

	target, err := io.ReadAll(resp.Output)
	if err != nil {
		return nil, err
	}

	return files.NewSymlinkFile(string(target), modTime), nil
}

var (
	_ files.File      = &apiFile{}
	_ files.Directory = &apiDir{}
)


================================================
FILE: client/rpc/auth/auth.go
================================================
package auth

import "net/http"

var _ http.RoundTripper = &AuthorizedRoundTripper{}

type AuthorizedRoundTripper struct {
	authorization string
	roundTripper  http.RoundTripper
}

// NewAuthorizedRoundTripper creates a new [http.RoundTripper] that will set the
// Authorization HTTP header with the value of [authorization]. The given [roundTripper] is
// the base [http.RoundTripper]. If it is nil, [http.DefaultTransport] is used.
func NewAuthorizedRoundTripper(authorization string, roundTripper http.RoundTripper) http.RoundTripper {
	if roundTripper == nil {
		roundTripper = http.DefaultTransport
	}

	return &AuthorizedRoundTripper{
		authorization: authorization,
		roundTripper:  roundTripper,
	}
}

func (tp *AuthorizedRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
	r.Header.Set("Authorization", tp.authorization)
	return tp.roundTripper.RoundTrip(r)
}


================================================
FILE: client/rpc/block.go
================================================
package rpc

import (
	"bytes"
	"context"
	"fmt"
	"io"

	"github.com/ipfs/boxo/path"
	"github.com/ipfs/go-cid"
	iface "github.com/ipfs/kubo/core/coreiface"
	caopts "github.com/ipfs/kubo/core/coreiface/options"
	mc "github.com/multiformats/go-multicodec"
	mh "github.com/multiformats/go-multihash"
)

type BlockAPI HttpApi

type blockStat struct {
	Key   string
	BSize int `json:"Size"`

	cid cid.Cid
}

func (s *blockStat) Size() int {
	return s.BSize
}

func (s *blockStat) Path() path.ImmutablePath {
	return path.FromCid(s.cid)
}

func (api *BlockAPI) Put(ctx context.Context, r io.Reader, opts ...caopts.BlockPutOption) (iface.BlockStat, error) {
	options, err := caopts.BlockPutOptions(opts...)
	px := options.CidPrefix
	if err != nil {
		return nil, err
	}

	mht, ok := mh.Codes[px.MhType]
	if !ok {
		return nil, fmt.Errorf("unknowm mhType %d", px.MhType)
	}

	var cidOptKey, cidOptVal string
	switch {
	case px.Version == 0 && px.Codec == cid.DagProtobuf:
		// ensure legacy --format=v0 passes as BlockPutOption still works
		cidOptKey = "format"
		cidOptVal = "v0"
	default:
		// pass codec as string
		cidOptKey = "cid-codec"
		cidOptVal = mc.Code(px.Codec).String()
	}

	req := api.core().Request("block/put").
		Option("mhtype", mht).
		Option("mhlen", px.MhLength).
		Option(cidOptKey, cidOptVal).
		Option("pin", options.Pin).
		FileBody(r)

	var out blockStat
	if err := req.Exec(ctx, &out); err != nil {
		return nil, err
	}
	out.cid, err = cid.Parse(out.Key)
	if err != nil {
		return nil, err
	}

	return &out, nil
}

func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader, error) {
	resp, err := api.core().Request("block/get", p.String()).Send(ctx)
	if err != nil {
		return nil, err
	}
	if resp.Error != nil {
		return nil, parseErrNotFoundWithFallbackToError(resp.Error)
	}

	// TODO: make get return ReadCloser to avoid copying
	defer resp.Close()
	b := new(bytes.Buffer)
	if _, err := io.Copy(b, resp.Output); err != nil {
		return nil, err
	}

	return b, nil
}

func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caopts.BlockRmOption) error {
	options, err := caopts.BlockRmOptions(opts...)
	if err != nil {
		return err
	}

	removedBlock := struct {
		Hash  string `json:",omitempty"`
		Error string `json:",omitempty"`
	}{}

	req := api.core().Request("block/rm").
		Option("force", options.Force).
		Arguments(p.String())

	if err := req.Exec(ctx, &removedBlock); err != nil {
		return err
	}

	return parseErrNotFoundWithFallbackToMSG(removedBlock.Error)
}

func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (iface.BlockStat, error) {
	var out blockStat
	err := api.core().Request("block/stat", p.String()).Exec(ctx, &out)
	if err != nil {
		return nil, parseErrNotFoundWithFallbackToError(err)
	}
	out.cid, err = cid.Parse(out.Key)
	if err != nil {
		return nil, err
	}

	return &out, nil
}

func (api *BlockAPI) core() *HttpApi {
	return (*HttpApi)(api)
}


================================================
FILE: client/rpc/dag.go
================================================
package rpc

import (
	"bytes"
	"context"
	"fmt"
	"io"

	"github.com/ipfs/boxo/path"
	blocks "github.com/ipfs/go-block-format"
	"github.com/ipfs/go-cid"
	format "github.com/ipfs/go-ipld-format"
	"github.com/ipfs/kubo/core/coreiface/options"
	multicodec "github.com/multiformats/go-multicodec"
)

type (
	httpNodeAdder        HttpApi
	HttpDagServ          httpNodeAdder
	pinningHttpNodeAdder httpNodeAdder
)

func (api *HttpDagServ) Get(ctx context.Context, c cid.Cid) (format.Node, error) {
	r, err := api.core().Block().Get(ctx, path.FromCid(c))
	if err != nil {
		return nil, err
	}

	data, err := io.ReadAll(r)
	if err != nil {
		return nil, err
	}

	blk, err := blocks.NewBlockWithCid(data, c)
	if err != nil {
		return nil, err
	}

	return api.ipldDecoder.DecodeNode(ctx, blk)
}

func (api *HttpDagServ) GetMany(ctx context.Context, cids []cid.Cid) <-chan *format.NodeOption {
	out := make(chan *format.NodeOption)

	for _, c := range cids {
		// TODO: Consider limiting concurrency of this somehow
		go func(c cid.Cid) {
			n, err := api.Get(ctx, c)

			select {
			case out <- &format.NodeOption{Node: n, Err: err}:
			case <-ctx.Done():
			}
		}(c)
	}
	return out
}

func (api *httpNodeAdder) add(ctx context.Context, nd format.Node, pin bool) error {
	c := nd.Cid()
	prefix := c.Prefix()

	// preserve 'cid-codec' when sent over HTTP
	cidCodec := multicodec.Code(prefix.Codec).String()

	// 'format' got replaced by 'cid-codec' in https://github.com/ipfs/interface-go-ipfs-core/pull/80
	// but we still support it here for backward-compatibility with use of CIDv0
	format := ""
	if prefix.Version == 0 {
		cidCodec = ""
		format = "v0"
	}

	stat, err := api.core().Block().Put(ctx, bytes.NewReader(nd.RawData()),
		options.Block.Hash(prefix.MhType, prefix.MhLength),
		options.Block.CidCodec(cidCodec),
		options.Block.Format(format),
		options.Block.Pin(pin))
	if err != nil {
		return err
	}
	if !stat.Path().RootCid().Equals(c) {
		return fmt.Errorf("cids didn't match - local %s, remote %s", c.String(), stat.Path().RootCid().String())
	}
	return nil
}

func (api *httpNodeAdder) addMany(ctx context.Context, nds []format.Node, pin bool) error {
	for _, nd := range nds {
		// TODO: optimize
		if err := api.add(ctx, nd, pin); err != nil {
			return err
		}
	}
	return nil
}

func (api *HttpDagServ) AddMany(ctx context.Context, nds []format.Node) error {
	return (*httpNodeAdder)(api).addMany(ctx, nds, false)
}

func (api *HttpDagServ) Add(ctx context.Context, nd format.Node) error {
	return (*httpNodeAdder)(api).add(ctx, nd, false)
}

func (api *pinningHttpNodeAdder) Add(ctx context.Context, nd format.Node) error {
	return (*httpNodeAdder)(api).add(ctx, nd, true)
}

func (api *pinningHttpNodeAdder) AddMany(ctx context.Context, nds []format.Node) error {
	return (*httpNodeAdder)(api).addMany(ctx, nds, true)
}

func (api *HttpDagServ) Pinning() format.NodeAdder {
	return (*pinningHttpNodeAdder)(api)
}

func (api *HttpDagServ) Remove(ctx context.Context, c cid.Cid) error {
	return api.core().Block().Rm(ctx, path.FromCid(c)) // TODO: should we force rm?
}

func (api *HttpDagServ) RemoveMany(ctx context.Context, cids []cid.Cid) error {
	for _, c := range cids {
		// TODO: optimize
		if err := api.Remove(ctx, c); err != nil {
			return err
		}
	}
	return nil
}

func (api *httpNodeAdder) core() *HttpApi {
	return (*HttpApi)(api)
}

func (api *HttpDagServ) core() *HttpApi {
	return (*HttpApi)(api)
}


================================================
FILE: client/rpc/errors.go
================================================
package rpc

import (
	"errors"
	"strings"
	"unicode/utf8"

	"github.com/ipfs/go-cid"
	ipld "github.com/ipfs/go-ipld-format"
	mbase "github.com/multiformats/go-multibase"
)

// This file handle parsing and returning the correct ABI based errors from error messages

type prePostWrappedNotFoundError struct {
	pre  string
	post string

	wrapped ipld.ErrNotFound
}

func (e prePostWrappedNotFoundError) String() string {
	return e.Error()
}

func (e prePostWrappedNotFoundError) Error() string {
	return e.pre + e.wrapped.Error() + e.post
}

func (e prePostWrappedNotFoundError) Unwrap() error {
	return e.wrapped
}

func parseErrNotFoundWithFallbackToMSG(msg string) error {
	err, handled := parseErrNotFound(msg)
	if handled {
		return err
	}

	return errors.New(msg)
}

func parseErrNotFoundWithFallbackToError(msg error) error {
	err, handled := parseErrNotFound(msg.Error())
	if handled {
		return err
	}

	return msg
}

func parseErrNotFound(msg string) (error, bool) {
	if msg == "" {
		return nil, true // Fast path
	}

	if err, handled := parseIPLDErrNotFound(msg); handled {
		return err, true
	}

	if err, handled := parseBlockstoreNotFound(msg); handled {
		return err, true
	}

	return nil, false
}

// Assume CIDs break on:
// - Whitespaces: " \t\n\r\v\f"
// - Semicolon: ";" this is to parse ipld.ErrNotFound wrapped in multierr
// - Double Quotes: "\"" this is for parsing %q and %#v formatting.
const cidBreakSet = " \t\n\r\v\f;\""

func parseIPLDErrNotFound(msg string) (error, bool) {
	// The pattern we search for is:
	const ipldErrNotFoundKey = "ipld: could not find " /*CID*/
	// We try to parse the CID, if it's invalid we give up and return a simple text error.
	// We also accept "node" in place of the CID because that means it's an Undefined CID.

	keyIndex := strings.Index(msg, ipldErrNotFoundKey)

	if keyIndex < 0 { // Unknown error
		return nil, false
	}

	cidStart := keyIndex + len(ipldErrNotFoundKey)

	msgPostKey := msg[cidStart:]
	var c cid.Cid
	var postIndex int
	if strings.HasPrefix(msgPostKey, "node") {
		// Fallback case
		c = cid.Undef
		postIndex = len("node")
	} else {
		postIndex = strings.IndexFunc(msgPostKey, func(r rune) bool {
			return strings.ContainsAny(string(r), cidBreakSet)
		})
		if postIndex < 0 {
			// no breakage meaning the string look like this something + "ipld: could not find bafy"
			postIndex = len(msgPostKey)
		}

		cidStr := msgPostKey[:postIndex]

		var err error
		c, err = cid.Decode(cidStr)
		if err != nil {
			// failed to decode CID give up
			return nil, false
		}

		// check that the CID is either a CIDv0 or a base32 multibase
		// because that what ipld.ErrNotFound.Error() -> cid.Cid.String() do currently
		if c.Version() != 0 {
			baseRune, _ := utf8.DecodeRuneInString(cidStr)
			if baseRune == utf8.RuneError || baseRune != mbase.Base32 {
				// not a multibase we expect, give up
				return nil, fal
Download .txt
gitextract__oi967oe/

├── .codeclimate.yml
├── .cspell.yml
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   ├── doc.yml
│   │   ├── enhancement.yml
│   │   └── feature.yml
│   ├── auto-comment.yml
│   ├── build-platforms.yml
│   ├── dependabot.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── changelog.yml
│       ├── codeql-analysis.yml
│       ├── dependabot-tidy.yml
│       ├── docker-check.yml
│       ├── docker-image.yml
│       ├── gateway-conformance.yml
│       ├── generated-pr.yml
│       ├── gobuild.yml
│       ├── golang-analysis.yml
│       ├── golint.yml
│       ├── gotest.yml
│       ├── interop.yml
│       ├── sharness.yml
│       ├── spellcheck.yml
│       ├── stale.yml
│       ├── sync-release-assets.yml
│       └── test-migrations.yml
├── .gitignore
├── .golangci.yml
├── .hadolint.yaml
├── .mailmap
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Dockerfile
├── FUNDING.json
├── GNUmakefile
├── LICENSE
├── LICENSE-APACHE
├── LICENSE-MIT
├── Makefile
├── README.md
├── Rules.mk
├── SECURITY.md
├── assets/
│   ├── README.md
│   ├── assets.go
│   └── init-doc/
│       ├── about
│       ├── contact
│       ├── docs/
│       │   └── index
│       ├── help
│       ├── ping
│       ├── quick-start
│       ├── readme
│       └── security-notes
├── bin/
│   ├── Rules.mk
│   ├── archive-branches.sh
│   ├── container_daemon
│   ├── container_init_run
│   ├── dist_get
│   ├── gencmdref
│   ├── get-docker-tags.sh
│   ├── graphmd
│   ├── ipns-republish
│   ├── maketarball.sh
│   ├── mkreleaselog
│   ├── push-docker-tags.sh
│   ├── test-go-build-platforms
│   └── test-go-fmt
├── blocks/
│   └── blockstoreutil/
│       └── remove.go
├── client/
│   └── rpc/
│       ├── README.md
│       ├── api.go
│       ├── api_test.go
│       ├── apifile.go
│       ├── auth/
│       │   └── auth.go
│       ├── block.go
│       ├── dag.go
│       ├── errors.go
│       ├── errors_test.go
│       ├── key.go
│       ├── name.go
│       ├── object.go
│       ├── path.go
│       ├── pin.go
│       ├── pubsub.go
│       ├── request.go
│       ├── requestbuilder.go
│       ├── response.go
│       ├── routing.go
│       ├── swarm.go
│       └── unixfs.go
├── codecov.yml
├── commands/
│   ├── context.go
│   └── reqlog.go
├── config/
│   ├── addresses.go
│   ├── api.go
│   ├── api_test.go
│   ├── autoconf.go
│   ├── autoconf_client.go
│   ├── autoconf_test.go
│   ├── autonat.go
│   ├── autotls.go
│   ├── bitswap.go
│   ├── bootstrap_peers.go
│   ├── bootstrap_peers_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── datastore.go
│   ├── discovery.go
│   ├── dns.go
│   ├── experiments.go
│   ├── gateway.go
│   ├── http_retrieval.go
│   ├── identity.go
│   ├── import.go
│   ├── import_test.go
│   ├── init.go
│   ├── init_test.go
│   ├── internal.go
│   ├── ipns.go
│   ├── migration.go
│   ├── migration_test.go
│   ├── mounts.go
│   ├── peering.go
│   ├── plugins.go
│   ├── profile.go
│   ├── provide.go
│   ├── provide_test.go
│   ├── provider.go
│   ├── pubsub.go
│   ├── remotepin.go
│   ├── reprovider.go
│   ├── routing.go
│   ├── routing_test.go
│   ├── serialize/
│   │   ├── serialize.go
│   │   └── serialize_test.go
│   ├── swarm.go
│   ├── types.go
│   ├── types_test.go
│   └── version.go
├── core/
│   ├── .gitignore
│   ├── builder.go
│   ├── commands/
│   │   ├── active.go
│   │   ├── add.go
│   │   ├── bitswap.go
│   │   ├── block.go
│   │   ├── bootstrap.go
│   │   ├── cat.go
│   │   ├── cid.go
│   │   ├── cid_test.go
│   │   ├── cmdenv/
│   │   │   ├── cidbase.go
│   │   │   ├── cidbase_test.go
│   │   │   ├── env.go
│   │   │   ├── env_test.go
│   │   │   └── file.go
│   │   ├── cmdutils/
│   │   │   ├── sanitize.go
│   │   │   ├── utils.go
│   │   │   └── utils_test.go
│   │   ├── commands.go
│   │   ├── commands_test.go
│   │   ├── completion.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── dag/
│   │   │   ├── dag.go
│   │   │   ├── export.go
│   │   │   ├── get.go
│   │   │   ├── import.go
│   │   │   ├── put.go
│   │   │   ├── resolve.go
│   │   │   └── stat.go
│   │   ├── dht.go
│   │   ├── dht_test.go
│   │   ├── diag.go
│   │   ├── e/
│   │   │   └── error.go
│   │   ├── external.go
│   │   ├── extra.go
│   │   ├── files.go
│   │   ├── files_test.go
│   │   ├── filestore.go
│   │   ├── get.go
│   │   ├── get_test.go
│   │   ├── helptext_test.go
│   │   ├── id.go
│   │   ├── keyencode/
│   │   │   └── keyencode.go
│   │   ├── keystore.go
│   │   ├── log.go
│   │   ├── ls.go
│   │   ├── ls_test.go
│   │   ├── mount_nofuse.go
│   │   ├── mount_unix.go
│   │   ├── mount_windows.go
│   │   ├── multibase.go
│   │   ├── name/
│   │   │   ├── ipns.go
│   │   │   ├── ipnsps.go
│   │   │   ├── name.go
│   │   │   └── publish.go
│   │   ├── object/
│   │   │   ├── diff.go
│   │   │   ├── object.go
│   │   │   └── patch.go
│   │   ├── p2p.go
│   │   ├── pin/
│   │   │   ├── pin.go
│   │   │   ├── remotepin.go
│   │   │   └── remotepin_test.go
│   │   ├── ping.go
│   │   ├── profile.go
│   │   ├── provide.go
│   │   ├── pubsub.go
│   │   ├── refs.go
│   │   ├── repo.go
│   │   ├── repo_verify_test.go
│   │   ├── resolve.go
│   │   ├── root.go
│   │   ├── root_test.go
│   │   ├── routing.go
│   │   ├── shutdown.go
│   │   ├── stat.go
│   │   ├── stat_dht.go
│   │   ├── stat_provide.go
│   │   ├── stat_reprovide.go
│   │   ├── swarm.go
│   │   ├── swarm_addrs_autonat.go
│   │   ├── sysdiag.go
│   │   └── version.go
│   ├── core.go
│   ├── core_test.go
│   ├── coreapi/
│   │   ├── block.go
│   │   ├── coreapi.go
│   │   ├── dag.go
│   │   ├── key.go
│   │   ├── name.go
│   │   ├── object.go
│   │   ├── path.go
│   │   ├── pin.go
│   │   ├── pubsub.go
│   │   ├── routing.go
│   │   ├── swarm.go
│   │   ├── test/
│   │   │   ├── api_test.go
│   │   │   └── path_test.go
│   │   └── unixfs.go
│   ├── corehttp/
│   │   ├── commands.go
│   │   ├── corehttp.go
│   │   ├── gateway.go
│   │   ├── gateway_test.go
│   │   ├── logs.go
│   │   ├── metrics.go
│   │   ├── metrics_test.go
│   │   ├── mutex_profile.go
│   │   ├── option_test.go
│   │   ├── p2p_proxy.go
│   │   ├── p2p_proxy_test.go
│   │   ├── redirect.go
│   │   ├── routing.go
│   │   └── webui.go
│   ├── coreiface/
│   │   ├── block.go
│   │   ├── coreapi.go
│   │   ├── dag.go
│   │   ├── errors.go
│   │   ├── idfmt.go
│   │   ├── key.go
│   │   ├── name.go
│   │   ├── object.go
│   │   ├── options/
│   │   │   ├── block.go
│   │   │   ├── dht.go
│   │   │   ├── global.go
│   │   │   ├── key.go
│   │   │   ├── name.go
│   │   │   ├── object.go
│   │   │   ├── pin.go
│   │   │   ├── pubsub.go
│   │   │   ├── routing.go
│   │   │   ├── unixfs.go
│   │   │   └── unixfs_test.go
│   │   ├── pin.go
│   │   ├── pubsub.go
│   │   ├── routing.go
│   │   ├── swarm.go
│   │   ├── tests/
│   │   │   ├── api.go
│   │   │   ├── block.go
│   │   │   ├── dag.go
│   │   │   ├── key.go
│   │   │   ├── name.go
│   │   │   ├── object.go
│   │   │   ├── path.go
│   │   │   ├── pin.go
│   │   │   ├── pubsub.go
│   │   │   ├── routing.go
│   │   │   └── unixfs.go
│   │   ├── unixfs.go
│   │   └── util.go
│   ├── corerepo/
│   │   ├── gc.go
│   │   └── stat.go
│   ├── coreunix/
│   │   ├── add.go
│   │   ├── add_test.go
│   │   ├── metadata.go
│   │   ├── metadata_test.go
│   │   └── test/
│   │       └── data/
│   │           ├── colors/
│   │           │   └── orange
│   │           ├── corps/
│   │           │   └── apple
│   │           └── fruits/
│   │               ├── apple
│   │               └── orange
│   ├── mock/
│   │   └── mock.go
│   └── node/
│       ├── bitswap.go
│       ├── builder.go
│       ├── core.go
│       ├── dns.go
│       ├── groups.go
│       ├── helpers/
│       │   └── helpers.go
│       ├── helpers.go
│       ├── identity.go
│       ├── ipns.go
│       ├── libp2p/
│       │   ├── addrs.go
│       │   ├── discovery.go
│       │   ├── dns.go
│       │   ├── fd/
│       │   │   ├── sys_not_unix.go
│       │   │   ├── sys_unix.go
│       │   │   └── sys_windows.go
│       │   ├── filters.go
│       │   ├── host.go
│       │   ├── hostopt.go
│       │   ├── libp2p.go
│       │   ├── libp2p_test.go
│       │   ├── nat.go
│       │   ├── peerstore.go
│       │   ├── pnet.go
│       │   ├── pubsub.go
│       │   ├── pubsub_test.go
│       │   ├── rcmgr.go
│       │   ├── rcmgr_defaults.go
│       │   ├── rcmgr_logging.go
│       │   ├── rcmgr_logging_test.go
│       │   ├── relay.go
│       │   ├── routing.go
│       │   ├── routingopt.go
│       │   ├── routingopt_test.go
│       │   ├── sec.go
│       │   ├── smux.go
│       │   ├── topicdiscovery.go
│       │   └── transport.go
│       ├── p2pforge_resolver.go
│       ├── p2pforge_resolver_test.go
│       ├── peering.go
│       ├── provider.go
│       └── storage.go
├── coverage/
│   ├── .gitignore
│   ├── Rules.mk
│   └── main/
│       └── main.go
├── doc.go
├── docker-compose.yaml
├── docs/
│   ├── EARLY_TESTERS.md
│   ├── README.md
│   ├── RELEASE_CHECKLIST.md
│   ├── RELEASE_ISSUE_TEMPLATE.md
│   ├── add-code-flow.md
│   ├── changelogs/
│   │   ├── v0.10.md
│   │   ├── v0.11.md
│   │   ├── v0.12.md
│   │   ├── v0.13.md
│   │   ├── v0.14.md
│   │   ├── v0.15.md
│   │   ├── v0.16.md
│   │   ├── v0.17.md
│   │   ├── v0.18.md
│   │   ├── v0.19.md
│   │   ├── v0.2.md
│   │   ├── v0.20.md
│   │   ├── v0.21.md
│   │   ├── v0.22.md
│   │   ├── v0.23.md
│   │   ├── v0.24.md
│   │   ├── v0.25.md
│   │   ├── v0.26.md
│   │   ├── v0.27.md
│   │   ├── v0.28.md
│   │   ├── v0.29.md
│   │   ├── v0.3.md
│   │   ├── v0.30.md
│   │   ├── v0.31.md
│   │   ├── v0.32.md
│   │   ├── v0.33.md
│   │   ├── v0.34.md
│   │   ├── v0.35.md
│   │   ├── v0.36.md
│   │   ├── v0.37.md
│   │   ├── v0.38.md
│   │   ├── v0.39.md
│   │   ├── v0.4.md
│   │   ├── v0.40.md
│   │   ├── v0.41.md
│   │   ├── v0.42.md
│   │   ├── v0.5.md
│   │   ├── v0.6.md
│   │   ├── v0.7.md
│   │   ├── v0.8.md
│   │   └── v0.9.md
│   ├── command-completion.md
│   ├── config.md
│   ├── content-blocking.md
│   ├── customizing.md
│   ├── datastores.md
│   ├── debug-guide.md
│   ├── delegated-routing.md
│   ├── developer-certificate-of-origin
│   ├── developer-guide.md
│   ├── environment-variables.md
│   ├── examples/
│   │   └── kubo-as-a-library/
│   │       ├── README.md
│   │       ├── go.mod
│   │       ├── go.sum
│   │       ├── main.go
│   │       └── main_test.go
│   ├── experimental-features.md
│   ├── file-transfer.md
│   ├── fuse.md
│   ├── gateway.md
│   ├── http-rpc-clients.md
│   ├── implement-api-bindings.md
│   ├── libp2p-resource-management.md
│   ├── metrics.md
│   ├── p2p-tunnels.md
│   ├── plugins.md
│   ├── production/
│   │   └── reverse-proxy.md
│   ├── provide-stats.md
│   ├── releases.md
│   ├── releases_thunderdome.md
│   ├── specifications/
│   │   ├── keystore.md
│   │   ├── repository.md
│   │   └── repository_fs.md
│   ├── telemetry.md
│   ├── transports.md
│   └── windows.md
├── fuse/
│   ├── ipns/
│   │   ├── common.go
│   │   ├── ipns_test.go
│   │   ├── ipns_unix.go
│   │   ├── link_unix.go
│   │   └── mount_unix.go
│   ├── mfs/
│   │   ├── mfs_test.go
│   │   ├── mfs_unix.go
│   │   └── mount_unix.go
│   ├── mount/
│   │   ├── fuse.go
│   │   └── mount.go
│   ├── node/
│   │   ├── mount_darwin.go
│   │   ├── mount_nofuse.go
│   │   ├── mount_notsupp.go
│   │   ├── mount_test.go
│   │   ├── mount_unix.go
│   │   └── mount_windows.go
│   └── readonly/
│       ├── doc.go
│       ├── ipfs_test.go
│       ├── mount_unix.go
│       └── readonly_unix.go
├── gc/
│   ├── gc.go
│   └── gc_test.go
├── go.mod
├── go.sum
├── misc/
│   ├── README.md
│   ├── fsutil/
│   │   ├── fsutil.go
│   │   └── fsutil_test.go
│   ├── launchd/
│   │   ├── README.md
│   │   ├── install.sh
│   │   └── io.ipfs.ipfs-daemon.plist
│   └── systemd/
│       ├── ipfs-api.socket
│       ├── ipfs-gateway.socket
│       ├── ipfs-hardened.service
│       ├── ipfs-sysusers.conf
│       └── ipfs.service
├── mk/
│   ├── footer.mk
│   ├── git.mk
│   ├── golang.mk
│   ├── header.mk
│   ├── tarball.mk
│   └── util.mk
├── p2p/
│   ├── listener.go
│   ├── local.go
│   ├── p2p.go
│   ├── remote.go
│   └── stream.go
├── plugin/
│   ├── Rules.mk
│   ├── daemon.go
│   ├── daemoninternal.go
│   ├── datastore.go
│   ├── fx.go
│   ├── ipld.go
│   ├── loader/
│   │   ├── Rules.mk
│   │   ├── load_nocgo.go
│   │   ├── load_noplugin.go
│   │   ├── load_unix.go
│   │   ├── loader.go
│   │   ├── preload.go
│   │   ├── preload.sh
│   │   └── preload_list
│   ├── plugin.go
│   ├── plugins/
│   │   ├── .gitignore
│   │   ├── Rules.mk
│   │   ├── badgerds/
│   │   │   └── badgerds.go
│   │   ├── dagjose/
│   │   │   └── dagjose.go
│   │   ├── flatfs/
│   │   │   └── flatfs.go
│   │   ├── fxtest/
│   │   │   └── fxtest.go
│   │   ├── gen_main.sh
│   │   ├── git/
│   │   │   └── git.go
│   │   ├── levelds/
│   │   │   └── levelds.go
│   │   ├── nopfs/
│   │   │   └── nopfs.go
│   │   ├── pebbleds/
│   │   │   └── pebbleds.go
│   │   ├── peerlog/
│   │   │   ├── peerlog.go
│   │   │   └── peerlog_test.go
│   │   └── telemetry/
│   │       ├── telemetry.go
│   │       ├── telemetry_test.go
│   │       └── telemetry_uuid
│   └── tracer.go
├── profile/
│   ├── goroutines.go
│   ├── profile.go
│   └── profile_test.go
├── repo/
│   ├── common/
│   │   ├── common.go
│   │   └── common_test.go
│   ├── fsrepo/
│   │   ├── config_test.go
│   │   ├── datastores.go
│   │   ├── doc.go
│   │   ├── fsrepo.go
│   │   ├── fsrepo_test.go
│   │   ├── migrations/
│   │   │   ├── README.md
│   │   │   ├── atomicfile/
│   │   │   │   ├── atomicfile.go
│   │   │   │   └── atomicfile_test.go
│   │   │   ├── common/
│   │   │   │   ├── base.go
│   │   │   │   ├── config_helpers.go
│   │   │   │   ├── migration.go
│   │   │   │   ├── testing_helpers.go
│   │   │   │   └── utils.go
│   │   │   ├── embedded.go
│   │   │   ├── embedded_test.go
│   │   │   ├── fetch.go
│   │   │   ├── fetch_test.go
│   │   │   ├── fetcher.go
│   │   │   ├── fs-repo-16-to-17/
│   │   │   │   ├── main.go
│   │   │   │   └── migration/
│   │   │   │       ├── migration.go
│   │   │   │       └── migration_test.go
│   │   │   ├── fs-repo-17-to-18/
│   │   │   │   ├── main.go
│   │   │   │   └── migration/
│   │   │   │       ├── migration.go
│   │   │   │       └── migration_test.go
│   │   │   ├── httpfetcher.go
│   │   │   ├── ipfsdir.go
│   │   │   ├── ipfsdir_test.go
│   │   │   ├── ipfsfetcher/
│   │   │   │   ├── ipfsfetcher.go
│   │   │   │   └── ipfsfetcher_test.go
│   │   │   ├── migrations.go
│   │   │   ├── migrations_test.go
│   │   │   ├── retryfetcher.go
│   │   │   ├── setup_test.go
│   │   │   ├── unpack.go
│   │   │   ├── unpack_test.go
│   │   │   ├── versions.go
│   │   │   └── versions_test.go
│   │   └── misc.go
│   ├── mock.go
│   ├── onlyone.go
│   └── repo.go
├── routing/
│   ├── composer.go
│   ├── delegated.go
│   ├── delegated_test.go
│   ├── error.go
│   └── wrapper.go
├── test/
│   ├── .gitignore
│   ├── 3nodetest/
│   │   ├── GNUmakefile
│   │   ├── README.md
│   │   ├── bin/
│   │   │   ├── .gitignore
│   │   │   ├── clean.sh
│   │   │   ├── save_logs.sh
│   │   │   └── save_profiling_data.sh
│   │   ├── bootstrap/
│   │   │   ├── Dockerfile
│   │   │   ├── README.md
│   │   │   └── config
│   │   ├── build/
│   │   │   ├── .gitignore
│   │   │   └── .gitkeep
│   │   ├── client/
│   │   │   ├── Dockerfile
│   │   │   ├── config
│   │   │   └── run.sh
│   │   ├── data/
│   │   │   ├── .gitignore
│   │   │   └── Dockerfile
│   │   ├── fig.yml
│   │   ├── run-test-on-img.sh
│   │   └── server/
│   │       ├── Dockerfile
│   │       ├── README.md
│   │       ├── config
│   │       └── run.sh
│   ├── README.md
│   ├── Rules.mk
│   ├── api-startup/
│   │   └── main.go
│   ├── bench/
│   │   ├── bench_cli_ipfs_add/
│   │   │   └── main.go
│   │   └── offline_add/
│   │       └── main.go
│   ├── bin/
│   │   ├── .gitignore
│   │   ├── Rules.mk
│   │   ├── checkflags
│   │   └── continueyn
│   ├── cli/
│   │   ├── add_test.go
│   │   ├── agent_version_unicode_test.go
│   │   ├── api_file_test.go
│   │   ├── autoconf/
│   │   │   ├── autoconf_test.go
│   │   │   ├── dns_test.go
│   │   │   ├── expand_comprehensive_test.go
│   │   │   ├── expand_fallback_test.go
│   │   │   ├── expand_test.go
│   │   │   ├── extensibility_test.go
│   │   │   ├── fuzz_test.go
│   │   │   ├── ipns_test.go
│   │   │   ├── routing_test.go
│   │   │   ├── swarm_connect_test.go
│   │   │   ├── testdata/
│   │   │   │   ├── autoconf_amino_and_ipni.json
│   │   │   │   ├── autoconf_new_routing_system.json
│   │   │   │   ├── autoconf_new_routing_with_filtering.json
│   │   │   │   ├── autoconf_with_unsupported_paths.json
│   │   │   │   ├── updated_autoconf.json
│   │   │   │   └── valid_autoconf.json
│   │   │   └── validation_test.go
│   │   ├── backup_bootstrap_test.go
│   │   ├── basic_commands_test.go
│   │   ├── bitswap_config_test.go
│   │   ├── block_size_test.go
│   │   ├── bootstrap_auto_test.go
│   │   ├── cid_profiles_test.go
│   │   ├── cid_test.go
│   │   ├── cli_https_test.go
│   │   ├── commands_without_repo_test.go
│   │   ├── completion_test.go
│   │   ├── config_secrets_test.go
│   │   ├── content_blocking_test.go
│   │   ├── content_routing_http_test.go
│   │   ├── daemon_test.go
│   │   ├── dag_layout_test.go
│   │   ├── dag_test.go
│   │   ├── delegated_routing_v1_http_client_test.go
│   │   ├── delegated_routing_v1_http_proxy_test.go
│   │   ├── delegated_routing_v1_http_server_test.go
│   │   ├── dht_autoclient_test.go
│   │   ├── dht_opt_prov_test.go
│   │   ├── diag_datastore_test.go
│   │   ├── dns_resolvers_multiaddr_test.go
│   │   ├── files_test.go
│   │   ├── fixtures/
│   │   │   ├── README.md
│   │   │   ├── TestDagStat.car
│   │   │   ├── TestDagStatExpectedOutput.txt
│   │   │   ├── TestGatewayHAMTDirectory.car
│   │   │   ├── TestGatewayMultiRange.car
│   │   │   └── TestName.car
│   │   ├── fuse_test.go
│   │   ├── gateway_limits_test.go
│   │   ├── gateway_range_test.go
│   │   ├── gateway_test.go
│   │   ├── harness/
│   │   │   ├── buffer.go
│   │   │   ├── harness.go
│   │   │   ├── http_client.go
│   │   │   ├── ipfs.go
│   │   │   ├── log.go
│   │   │   ├── node.go
│   │   │   ├── nodes.go
│   │   │   ├── pbinspect.go
│   │   │   ├── peering.go
│   │   │   └── run.go
│   │   ├── http_gateway_over_libp2p_test.go
│   │   ├── http_retrieval_client_test.go
│   │   ├── identity_cid_test.go
│   │   ├── init_test.go
│   │   ├── ipfswatch_test.go
│   │   ├── log_level_test.go
│   │   ├── ls_test.go
│   │   ├── migrations/
│   │   │   ├── migration_16_to_latest_test.go
│   │   │   ├── migration_17_to_latest_test.go
│   │   │   ├── migration_concurrent_test.go
│   │   │   ├── migration_mixed_15_to_latest_test.go
│   │   │   └── testdata/
│   │   │       ├── v15-repo/
│   │   │       │   ├── blocks/
│   │   │       │   │   ├── SHARDING
│   │   │       │   │   ├── X3/
│   │   │       │   │   │   └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│   │   │       │   │   ├── _README
│   │   │       │   │   └── diskUsage.cache
│   │   │       │   ├── config
│   │   │       │   ├── datastore/
│   │   │       │   │   ├── 000001.log
│   │   │       │   │   ├── CURRENT
│   │   │       │   │   ├── LOCK
│   │   │       │   │   ├── LOG
│   │   │       │   │   └── MANIFEST-000000
│   │   │       │   ├── datastore_spec
│   │   │       │   └── version
│   │   │       └── v16-repo/
│   │   │           ├── blocks/
│   │   │           │   ├── SHARDING
│   │   │           │   ├── X3/
│   │   │           │   │   └── CIQFTFEEHEDF6KLBT32BFAGLXEZL4UWFNWM4LFTLMXQBCERZ6CMLX3Y.data
│   │   │           │   ├── _README
│   │   │           │   └── diskUsage.cache
│   │   │           ├── config
│   │   │           ├── datastore/
│   │   │           │   ├── 000001.log
│   │   │           │   ├── CURRENT
│   │   │           │   ├── LOCK
│   │   │           │   ├── LOG
│   │   │           │   └── MANIFEST-000000
│   │   │           ├── datastore_spec
│   │   │           └── version
│   │   ├── must.go
│   │   ├── name_test.go
│   │   ├── p2p_test.go
│   │   ├── peering_test.go
│   │   ├── pin_ls_names_test.go
│   │   ├── pin_name_validation_test.go
│   │   ├── ping_test.go
│   │   ├── pinning_remote_test.go
│   │   ├── pins_test.go
│   │   ├── provide_stats_test.go
│   │   ├── provider_test.go
│   │   ├── pubsub_test.go
│   │   ├── rcmgr_test.go
│   │   ├── repo_verify_test.go
│   │   ├── routing_dht_test.go
│   │   ├── rpc_auth_test.go
│   │   ├── rpc_content_type_test.go
│   │   ├── rpc_get_output_test.go
│   │   ├── rpc_unixsocket_test.go
│   │   ├── stats_test.go
│   │   ├── swarm_test.go
│   │   ├── telemetry_test.go
│   │   ├── testutils/
│   │   │   ├── asserts.go
│   │   │   ├── cids.go
│   │   │   ├── files.go
│   │   │   ├── floats.go
│   │   │   ├── httprouting/
│   │   │   │   └── mock_http_content_router.go
│   │   │   ├── json.go
│   │   │   ├── pinningservice/
│   │   │   │   └── pinning.go
│   │   │   ├── protobuf.go
│   │   │   ├── random_deterministic.go
│   │   │   ├── requires.go
│   │   │   └── strings.go
│   │   ├── tracing_test.go
│   │   ├── transports_test.go
│   │   └── webui_test.go
│   ├── dependencies/
│   │   ├── GNUmakefile
│   │   ├── dependencies.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── iptb/
│   │   │   └── iptb.go
│   │   ├── ma-pipe-unidir/
│   │   │   ├── LICENSE
│   │   │   └── main.go
│   │   └── pollEndpoint/
│   │       └── main.go
│   ├── integration/
│   │   ├── GNUmakefile
│   │   ├── addcat_test.go
│   │   ├── bench_cat_test.go
│   │   ├── bench_test.go
│   │   ├── bitswap_wo_routing_test.go
│   │   ├── three_legged_cat_test.go
│   │   └── wan_lan_dht_test.go
│   ├── ipfs-test-lib.sh
│   ├── sharness/
│   │   ├── .gitignore
│   │   ├── GNUmakefile
│   │   ├── README.md
│   │   ├── Rules.mk
│   │   ├── lib/
│   │   │   ├── install-sharness.sh
│   │   │   ├── iptb-lib.sh
│   │   │   ├── test-aggregate-junit-reports.sh
│   │   │   ├── test-aggregate-results.sh
│   │   │   ├── test-lib-hashes.sh
│   │   │   └── test-lib.sh
│   │   ├── t0001-tests-work.sh
│   │   ├── t0002-docker-image.sh
│   │   ├── t0003-docker-migrate.sh
│   │   ├── t0012-completion-fish.sh
│   │   ├── t0015-basic-sh-functions.sh
│   │   ├── t0018-indent.sh
│   │   ├── t0021-config.sh
│   │   ├── t0022-init-default.sh
│   │   ├── t0023-shutdown.sh
│   │   ├── t0024-datastore-config.sh
│   │   ├── t0024-files/
│   │   │   ├── spec-newshardfun
│   │   │   └── spec-nosync
│   │   ├── t0025-datastores.sh
│   │   ├── t0026-id.sh
│   │   ├── t0027-rotate.sh
│   │   ├── t0030-mount.sh
│   │   ├── t0031-mount-publish.sh
│   │   ├── t0032-mount-sharded.sh
│   │   ├── t0040-add-and-cat.sh
│   │   ├── t0042-add-skip.sh
│   │   ├── t0043-add-w.sh
│   │   ├── t0044-add-symlink.sh
│   │   ├── t0045-ls.sh
│   │   ├── t0046-id-hash.sh
│   │   ├── t0047-add-mode-mtime.sh
│   │   ├── t0050-block-data/
│   │   │   └── testPut.pb
│   │   ├── t0050-block.sh
│   │   ├── t0051-object.sh
│   │   ├── t0052-object-diff.sh
│   │   ├── t0053-dag-data/
│   │   │   └── non-canon.cbor
│   │   ├── t0053-dag.sh
│   │   ├── t0054-dag-car-import-export-data/
│   │   │   ├── README.md
│   │   │   └── test_dataset_car.tar.xz
│   │   ├── t0054-dag-car-import-export.sh
│   │   ├── t0055-dag-put-json-new-line.sh
│   │   ├── t0060-daemon.sh
│   │   ├── t0060-data/
│   │   │   ├── mss-noise
│   │   │   ├── mss-plaintext
│   │   │   └── mss-tls
│   │   ├── t0061-daemon-opts.sh
│   │   ├── t0062-daemon-api.sh
│   │   ├── t0063-daemon-init.sh
│   │   ├── t0063-external.sh
│   │   ├── t0064-api-file.sh
│   │   ├── t0065-active-requests.sh
│   │   ├── t0066-migration.sh
│   │   ├── t0067-unix-api.sh
│   │   ├── t0070-user-config.sh
│   │   ├── t0080-repo.sh
│   │   ├── t0081-repo-pinning.sh
│   │   ├── t0082-repo-gc-auto.sh
│   │   ├── t0084-repo-read-rehash.sh
│   │   ├── t0086-repo-verify.sh
│   │   ├── t0087-repo-robust-gc.sh
│   │   ├── t0088-repo-stat-symlink.sh
│   │   ├── t0090-get.sh
│   │   ├── t0095-refs.sh
│   │   ├── t0101-iptb-name.sh
│   │   ├── t0109-gateway-web-_redirects-data/
│   │   │   └── redirects.car
│   │   ├── t0109-gateway-web-_redirects.sh
│   │   ├── t0112-gateway-cors.sh
│   │   ├── t0114-gateway-subdomains/
│   │   │   ├── 12D3KooWLQzUv2FHWGVPXTXSZpdHs7oHbXub2G5WC8Tx4NQhyd2d.ipns-record
│   │   │   ├── QmVujd5Vb7moysJj8itnGufN7MEtPRCNHkKpNuA4onsRa3.ipns-record
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0114-gateway-subdomains.sh
│   │   ├── t0115-gateway-dir-listing/
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0115-gateway-dir-listing.sh
│   │   ├── t0116-gateway-cache/
│   │   │   ├── README.md
│   │   │   ├── fixtures.car
│   │   │   └── k51qzi5uqu5dlxdsdu5fpuu7h69wu4ohp32iwm9pdt9nq3y5rpn3ln9j12zfhe.ipns-record
│   │   ├── t0116-gateway-cache.sh
│   │   ├── t0119-prometheus-data/
│   │   │   ├── prometheus_metrics
│   │   │   ├── prometheus_metrics_added_by_enabling_rcmgr
│   │   │   └── prometheus_metrics_added_by_measure_profile
│   │   ├── t0119-prometheus.sh
│   │   ├── t0120-bootstrap.sh
│   │   ├── t0121-bootstrap-iptb.sh
│   │   ├── t0131-multinode-client-routing.sh
│   │   ├── t0140-swarm.sh
│   │   ├── t0141-addfilter.sh
│   │   ├── t0142-testfilter.sh
│   │   ├── t0150-clisuggest.sh
│   │   ├── t0151-sysdiag.sh
│   │   ├── t0152-profile.sh
│   │   ├── t0160-resolve.sh
│   │   ├── t0165-keystore-data/
│   │   │   ├── README.md
│   │   │   ├── openssl_ed25519.pem
│   │   │   ├── openssl_rsa.pem
│   │   │   └── openssl_secp384r1.pem
│   │   ├── t0165-keystore.sh
│   │   ├── t0180-p2p.sh
│   │   ├── t0181-private-network.sh
│   │   ├── t0182-circuit-relay.sh
│   │   ├── t0183-namesys-pubsub.sh
│   │   ├── t0184-http-proxy-over-p2p.sh
│   │   ├── t0185-autonat.sh
│   │   ├── t0190-quic-ping.sh
│   │   ├── t0191-webtransport-ping.sh
│   │   ├── t0195-noise.sh
│   │   ├── t0220-bitswap.sh
│   │   ├── t0230-channel-streaming-http-content-type.sh
│   │   ├── t0231-channel-streaming.sh
│   │   ├── t0235-cli-request.sh
│   │   ├── t0236-cli-api-dns-resolve.sh
│   │   ├── t0240-republisher.sh
│   │   ├── t0250-files-api.sh
│   │   ├── t0251-files-flushing.sh
│   │   ├── t0252-files-gc.sh
│   │   ├── t0260-sharding.sh
│   │   ├── t0270-filestore.sh
│   │   ├── t0271-filestore-utils.sh
│   │   ├── t0272-urlstore.sh
│   │   ├── t0275-cid-security-data/
│   │   │   ├── CIQG6PGTD2VV34S33BE4MNCQITBRFYUPYQLDXYARR3DQW37MOT7K5XI.data
│   │   │   └── EICEM7ITSI.data
│   │   ├── t0275-cid-security.sh
│   │   ├── t0276-cidv0v1.sh
│   │   ├── t0280-plugin-dag-jose-data/
│   │   │   ├── dag-cbor/
│   │   │   │   ├── bafyreicxyzuqbx5yb7ytkgkuofwksbal3ygtswxuri25crxdxms55m5fki
│   │   │   │   ├── bafyreihdfxoshbhowufyvjk7kq46dt6h7u6byejmlnifz34z7ocoq7ugk4
│   │   │   │   └── bafyreihkt4u6euddfhofkutfzxwet7w7zm5qrjpop655yhnb5dnzqw26lm
│   │   │   ├── dag-jose/
│   │   │   │   ├── bagcqcera542h3xc57nudkgjcceexyzyxrkwi4ikbn773ag6dqdcyjt6z6rga
│   │   │   │   ├── bagcqcera5uvz2qai6l4vmqjigwpowluilxngz3dyjnva2s3uwbfb5u4ao4fa
│   │   │   │   ├── bagcqcera7azagcqlpu4ivvh4xp4iv6psmb5d7eki6ln3fnfnsnbb2hzv4nxq
│   │   │   │   ├── bagcqcerakjv2mmdlbai3urym22bw5kaw7nqov73yaxf6xjnp7e56sclsrooa
│   │   │   │   ├── bagcqceraqfknq7xaemcihmq2albau32ttrutxnco7xeoik6mlejismmvw5zq
│   │   │   │   ├── bagcqcerauben4l6ee2wjf2fnkj7vaels4p7lnytenk35j3gl2lzcbtbgyoea
│   │   │   │   ├── bagcqceravvw4bx7jgkxxjwfuqo2yoja6w4cmvmu3gkew3s7yu3vt2ce7riwa
│   │   │   │   ├── bagcqceraxazmu67crshzqdeg3kwnfschs25epy5sbtqtjre2qw3d62kzplva
│   │   │   │   └── bagcqceraxvt5izt4sz7kjfrm42dxrutp6ijywgsacllkznzekmfojypkvfea
│   │   │   └── dag-json/
│   │   │       ├── baguqeeraloya3qpa25kl5l4y3bzgl7rhyta2p7lwaocyxx4vpvdligb7mt2q
│   │   │       ├── baguqeeraovfm3rr3pvmxm27zgvxp5wycbfih35xih2uznminpnds5esm4jlq
│   │   │       └── baguqeeravexfd6qijjtnzxfqq6kgknnkncztgmvhjhxm6ih352qskolt2gxa
│   │   ├── t0280-plugin-dag-jose.sh
│   │   ├── t0280-plugin-data/
│   │   │   └── example.go
│   │   ├── t0280-plugin-fx.sh
│   │   ├── t0280-plugin-git.sh
│   │   ├── t0280-plugin-peerlog.sh
│   │   ├── t0280-plugin.sh
│   │   ├── t0290-cid.sh
│   │   ├── t0295-multibase.sh
│   │   ├── t0320-pubsub.sh
│   │   ├── t0321-pubsub-gossipsub.sh
│   │   ├── t0322-pubsub-http-rpc.sh
│   │   ├── t0400-api-no-gateway/
│   │   │   ├── README.md
│   │   │   └── fixtures.car
│   │   ├── t0400-api-no-gateway.sh
│   │   ├── t0401-api-browser-security.sh
│   │   ├── t0410-api-add.sh
│   │   ├── t0500-issues-and-regressions-offline.sh
│   │   ├── t0600-issues-and-regressions-online.sh
│   │   ├── t0701-delegated-routing-reframe/
│   │   │   ├── FindProvidersRequest
│   │   │   └── FindProvidersResponse
│   │   ├── t0702-delegated-routing-http/
│   │   │   └── FindProvidersResponse
│   │   ├── t0800-blake3.sh
│   │   └── x0601-pin-fail-test.sh
│   ├── sharness_test_coverage_helper.sh
│   └── unit/
│       ├── .gitignore
│       └── Rules.mk
├── thirdparty/
│   ├── README.md
│   ├── unit/
│   │   ├── unit.go
│   │   └── unit_test.go
│   └── verifbs/
│       └── verifbs.go
├── tracing/
│   ├── doc.go
│   └── tracing.go
├── version.go
└── version_test.go
Download .txt
Showing preview only (325K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3560 symbols across 482 files)

FILE: assets/assets.go
  function SeedInitDocs (line 30) | func SeedInitDocs(nd *core.IpfsNode) (cid.Cid, error) {
  function addAssetList (line 34) | func addAssetList(nd *core.IpfsNode, l []string) (cid.Cid, error) {

FILE: blocks/blockstoreutil/remove.go
  type RemovedBlock (line 21) | type RemovedBlock struct
  type RmBlocksOpts (line 27) | type RmBlocksOpts struct
  function RmBlocks (line 37) | func RmBlocks(ctx context.Context, blocks bs.GCBlockstore, pins pin.Pinn...
  function FilterPinned (line 78) | func FilterPinned(ctx context.Context, pins pin.Pinner, out chan<- any, ...

FILE: client/rpc/api.go
  constant DefaultPathName (line 32) | DefaultPathName = ".ipfs"
  constant DefaultPathRoot (line 33) | DefaultPathRoot = "~/" + DefaultPathName
  constant DefaultApiFile (line 34) | DefaultApiFile  = "api"
  constant EnvDir (line 35) | EnvDir          = "IPFS_PATH"
  type HttpApi (line 46) | type HttpApi struct
    method WithOptions (line 185) | func (api *HttpApi) WithOptions(opts ...caopts.ApiOption) (iface.CoreA...
    method Request (line 206) | func (api *HttpApi) Request(command string, args ...string) RequestBui...
    method Unixfs (line 221) | func (api *HttpApi) Unixfs() iface.UnixfsAPI {
    method Block (line 225) | func (api *HttpApi) Block() iface.BlockAPI {
    method Dag (line 229) | func (api *HttpApi) Dag() iface.APIDagService {
    method Name (line 233) | func (api *HttpApi) Name() iface.NameAPI {
    method Key (line 237) | func (api *HttpApi) Key() iface.KeyAPI {
    method Pin (line 241) | func (api *HttpApi) Pin() iface.PinAPI {
    method Object (line 245) | func (api *HttpApi) Object() iface.ObjectAPI {
    method Swarm (line 249) | func (api *HttpApi) Swarm() iface.SwarmAPI {
    method PubSub (line 253) | func (api *HttpApi) PubSub() iface.PubSubAPI {
    method Routing (line 257) | func (api *HttpApi) Routing() iface.RoutingAPI {
    method loadRemoteVersion (line 261) | func (api *HttpApi) loadRemoteVersion() (*semver.Version, error) {
  function NewLocalApi (line 61) | func NewLocalApi() (*HttpApi, error) {
  function NewPathApi (line 72) | func NewPathApi(ipfspath string) (*HttpApi, error) {
  function ApiAddr (line 84) | func ApiAddr(ipfspath string) (ma.Multiaddr, error) {
  function NewApi (line 101) | func NewApi(a ma.Multiaddr) (*HttpApi, error) {
  function NewApiWithClient (line 131) | func NewApiWithClient(a ma.Multiaddr, c *http.Client) (*HttpApi, error) {
  function NewURLApiWithClient (line 161) | func NewURLApiWithClient(url string, c *http.Client) (*HttpApi, error) {

FILE: client/rpc/api_test.go
  type NodeProvider (line 22) | type NodeProvider struct
    method MakeAPISwarm (line 24) | func (np NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context,...
  function TestHttpApi (line 97) | func TestHttpApi(t *testing.T) {
  function Test_NewURLApiWithClient_With_Headers (line 103) | func Test_NewURLApiWithClient_With_Headers(t *testing.T) {
  function Test_NewURLApiWithClient_HTTP_Variant (line 140) | func Test_NewURLApiWithClient_HTTP_Variant(t *testing.T) {

FILE: client/rpc/apifile.go
  constant forwardSeekLimit (line 19) | forwardSeekLimit = 1 << 14
  method Get (line 21) | func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Node,...
  type apiFile (line 65) | type apiFile struct
    method reset (line 78) | func (f *apiFile) reset() error {
    method Read (line 98) | func (f *apiFile) Read(p []byte) (int, error) {
    method ReadAt (line 106) | func (f *apiFile) ReadAt(p []byte, off int64) (int, error) {
    method Seek (line 125) | func (f *apiFile) Seek(offset int64, whence int) (int64, error) {
    method Close (line 146) | func (f *apiFile) Close() error {
    method Mode (line 153) | func (f *apiFile) Mode() os.FileMode {
    method ModTime (line 157) | func (f *apiFile) ModTime() time.Time {
    method Size (line 161) | func (f *apiFile) Size() (int64, error) {
  function stringToFileMode (line 165) | func stringToFileMode(mode string) (os.FileMode, error) {
  method getFile (line 176) | func (api *UnixfsAPI) getFile(ctx context.Context, p path.Path, size int...
  type apiIter (line 189) | type apiIter struct
    method Err (line 200) | func (it *apiIter) Err() error {
    method Name (line 204) | func (it *apiIter) Name() string {
    method Next (line 208) | func (it *apiIter) Next() bool {
    method Node (line 265) | func (it *apiIter) Node() files.Node {
  type apiDir (line 269) | type apiDir struct
    method Close (line 281) | func (d *apiDir) Close() error {
    method Mode (line 285) | func (d *apiDir) Mode() os.FileMode {
    method ModTime (line 289) | func (d *apiDir) ModTime() time.Time {
    method Size (line 293) | func (d *apiDir) Size() (int64, error) {
    method Entries (line 297) | func (d *apiDir) Entries() files.DirIterator {
  method getDir (line 305) | func (api *UnixfsAPI) getDir(ctx context.Context, p path.Path, size int6...
  method getSymlink (line 334) | func (api *UnixfsAPI) getSymlink(ctx context.Context, p path.Path, modTi...

FILE: client/rpc/auth/auth.go
  type AuthorizedRoundTripper (line 7) | type AuthorizedRoundTripper struct
    method RoundTrip (line 26) | func (tp *AuthorizedRoundTripper) RoundTrip(r *http.Request) (*http.Re...
  function NewAuthorizedRoundTripper (line 15) | func NewAuthorizedRoundTripper(authorization string, roundTripper http.R...

FILE: client/rpc/block.go
  type BlockAPI (line 17) | type BlockAPI
    method Put (line 34) | func (api *BlockAPI) Put(ctx context.Context, r io.Reader, opts ...cao...
    method Get (line 77) | func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader,...
    method Rm (line 96) | func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caop...
    method Stat (line 118) | func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (iface.Blo...
    method core (line 132) | func (api *BlockAPI) core() *HttpApi {
  type blockStat (line 19) | type blockStat struct
    method Size (line 26) | func (s *blockStat) Size() int {
    method Path (line 30) | func (s *blockStat) Path() path.ImmutablePath {

FILE: client/rpc/dag.go
  type httpNodeAdder (line 18) | type httpNodeAdder
    method add (line 59) | func (api *httpNodeAdder) add(ctx context.Context, nd format.Node, pin...
    method addMany (line 88) | func (api *httpNodeAdder) addMany(ctx context.Context, nds []format.No...
    method core (line 132) | func (api *httpNodeAdder) core() *HttpApi {
  type HttpDagServ (line 19) | type HttpDagServ
    method Get (line 23) | func (api *HttpDagServ) Get(ctx context.Context, c cid.Cid) (format.No...
    method GetMany (line 42) | func (api *HttpDagServ) GetMany(ctx context.Context, cids []cid.Cid) <...
    method AddMany (line 98) | func (api *HttpDagServ) AddMany(ctx context.Context, nds []format.Node...
    method Add (line 102) | func (api *HttpDagServ) Add(ctx context.Context, nd format.Node) error {
    method Pinning (line 114) | func (api *HttpDagServ) Pinning() format.NodeAdder {
    method Remove (line 118) | func (api *HttpDagServ) Remove(ctx context.Context, c cid.Cid) error {
    method RemoveMany (line 122) | func (api *HttpDagServ) RemoveMany(ctx context.Context, cids []cid.Cid...
    method core (line 136) | func (api *HttpDagServ) core() *HttpApi {
  type pinningHttpNodeAdder (line 20) | type pinningHttpNodeAdder
    method Add (line 106) | func (api *pinningHttpNodeAdder) Add(ctx context.Context, nd format.No...
    method AddMany (line 110) | func (api *pinningHttpNodeAdder) AddMany(ctx context.Context, nds []fo...

FILE: client/rpc/errors.go
  type prePostWrappedNotFoundError (line 15) | type prePostWrappedNotFoundError struct
    method String (line 22) | func (e prePostWrappedNotFoundError) String() string {
    method Error (line 26) | func (e prePostWrappedNotFoundError) Error() string {
    method Unwrap (line 30) | func (e prePostWrappedNotFoundError) Unwrap() error {
  function parseErrNotFoundWithFallbackToMSG (line 34) | func parseErrNotFoundWithFallbackToMSG(msg string) error {
  function parseErrNotFoundWithFallbackToError (line 43) | func parseErrNotFoundWithFallbackToError(msg error) error {
  function parseErrNotFound (line 52) | func parseErrNotFound(msg string) (error, bool) {
  constant cidBreakSet (line 72) | cidBreakSet = " \t\n\r\v\f;\""
  function parseIPLDErrNotFound (line 74) | func parseIPLDErrNotFound(msg string) (error, bool) {
  type blockstoreNotFoundMatchingIPLDErrNotFound (line 143) | type blockstoreNotFoundMatchingIPLDErrNotFound struct
    method String (line 147) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) String() string {
    method Error (line 151) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) Error() string {
    method Is (line 155) | func (e blockstoreNotFoundMatchingIPLDErrNotFound) Is(err error) bool {
  function parseBlockstoreNotFound (line 160) | func parseBlockstoreNotFound(msg string) (error, bool) {

FILE: client/rpc/errors_test.go
  function doParseIpldNotFoundTest (line 16) | func doParseIpldNotFoundTest(t *testing.T, original error) {
  function TestParseIPLDNotFound (line 34) | func TestParseIPLDNotFound(t *testing.T) {
  function TestBlockstoreNotFoundMatchingIPLDErrNotFound (line 75) | func TestBlockstoreNotFoundMatchingIPLDErrNotFound(t *testing.T) {

FILE: client/rpc/key.go
  type KeyAPI (line 16) | type KeyAPI
    method Generate (line 55) | func (api *KeyAPI) Generate(ctx context.Context, name string, opts ......
    method Rename (line 73) | func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName...
    method List (line 100) | func (api *KeyAPI) List(ctx context.Context) ([]iface.Key, error) {
    method Self (line 120) | func (api *KeyAPI) Self(ctx context.Context) (iface.Key, error) {
    method Remove (line 129) | func (api *KeyAPI) Remove(ctx context.Context, name string) (iface.Key...
    method core (line 143) | func (api *KeyAPI) core() *HttpApi {
    method Sign (line 147) | func (api *KeyAPI) Sign(ctx context.Context, name string, data []byte)...
    method Verify (line 174) | func (api *KeyAPI) Verify(ctx context.Context, keyOrName string, signa...
  type key (line 18) | type key struct
    method Name (line 38) | func (k *key) Name() string {
    method Path (line 42) | func (k *key) Path() path.Path {
    method ID (line 46) | func (k *key) ID() peer.ID {
  function newKey (line 24) | func newKey(name, pidStr string) (*key, error) {
  type keyOutput (line 50) | type keyOutput struct

FILE: client/rpc/name.go
  type NameAPI (line 16) | type NameAPI
    method Publish (line 23) | func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ......
    method Search (line 46) | func (api *NameAPI) Search(ctx context.Context, name string, opts ...c...
    method Resolve (line 107) | func (api *NameAPI) Resolve(ctx context.Context, name string, opts ......
    method core (line 132) | func (api *NameAPI) core() *HttpApi {
  type ipnsEntry (line 18) | type ipnsEntry struct

FILE: client/rpc/object.go
  type ObjectAPI (line 12) | type ObjectAPI
    method AddLink (line 18) | func (api *ObjectAPI) AddLink(ctx context.Context, base path.Path, nam...
    method RmLink (line 40) | func (api *ObjectAPI) RmLink(ctx context.Context, base path.Path, link...
    method Diff (line 63) | func (api *ObjectAPI) Diff(ctx context.Context, a path.Path, b path.Pa...
    method core (line 86) | func (api *ObjectAPI) core() *HttpApi {
  type objectOut (line 14) | type objectOut struct
  type change (line 56) | type change struct

FILE: client/rpc/path.go
  method ResolvePath (line 11) | func (api *HttpApi) ResolvePath(ctx context.Context, p path.Path) (path....
  method ResolveNode (line 41) | func (api *HttpApi) ResolveNode(ctx context.Context, p path.Path) (ipld....

FILE: client/rpc/pin.go
  type PinAPI (line 16) | type PinAPI
    method Add (line 49) | func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopt...
    method Ls (line 69) | func (api *PinAPI) Ls(ctx context.Context, pins chan<- iface.Pin, opts...
    method IsPinned (line 113) | func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ......
    method Rm (line 138) | func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts...
    method Update (line 149) | func (api *PinAPI) Update(ctx context.Context, from path.Path, to path...
    method Verify (line 190) | func (api *PinAPI) Verify(ctx context.Context) (<-chan iface.PinStatus...
    method core (line 261) | func (api *PinAPI) core() *HttpApi {
  type pinRefKeyObject (line 18) | type pinRefKeyObject struct
  type pinRefKeyList (line 22) | type pinRefKeyList struct
  type pin (line 26) | type pin struct
    method Err (line 33) | func (p pin) Err() error {
    method Path (line 37) | func (p pin) Path() path.ImmutablePath {
    method Name (line 41) | func (p pin) Name() string {
    method Type (line 45) | func (p pin) Type() string {
  type pinLsObject (line 63) | type pinLsObject struct
  type pinVerifyRes (line 159) | type pinVerifyRes struct
    method Ok (line 165) | func (r pinVerifyRes) Ok() bool {
    method BadNodes (line 169) | func (r pinVerifyRes) BadNodes() []iface.BadPinNode {
    method Err (line 173) | func (r pinVerifyRes) Err() error {
  type badNode (line 177) | type badNode struct
    method Path (line 182) | func (n badNode) Path() path.ImmutablePath {
    method Err (line 186) | func (n badNode) Err() error {

FILE: client/rpc/pubsub.go
  type PubsubAPI (line 15) | type PubsubAPI
    method Ls (line 17) | func (api *PubsubAPI) Ls(ctx context.Context) ([]string, error) {
    method Peers (line 36) | func (api *PubsubAPI) Peers(ctx context.Context, opts ...caopts.PubSub...
    method Publish (line 65) | func (api *PubsubAPI) Publish(ctx context.Context, topic string, messa...
    method Subscribe (line 147) | func (api *PubsubAPI) Subscribe(ctx context.Context, topic string, opt...
    method core (line 205) | func (api *PubsubAPI) core() *HttpApi {
  type pubsubSub (line 71) | type pubsubSub struct
    method Next (line 111) | func (s *pubsubSub) Next(ctx context.Context) (iface.PubSubMessage, er...
    method Close (line 197) | func (s *pubsubSub) Close() error {
  type pubsubMessage (line 78) | type pubsubMessage struct
    method From (line 93) | func (msg *pubsubMessage) From() peer.ID {
    method Data (line 97) | func (msg *pubsubMessage) Data() []byte {
    method Seq (line 101) | func (msg *pubsubMessage) Seq() []byte {
    method Topics (line 107) | func (msg *pubsubMessage) Topics() []string {
  function toMultibase (line 210) | func toMultibase(data []byte) string {

FILE: client/rpc/request.go
  type Request (line 9) | type Request struct
  function NewRequest (line 19) | func NewRequest(ctx context.Context, url, command string, args ...string...

FILE: client/rpc/requestbuilder.go
  type RequestBuilder (line 15) | type RequestBuilder interface
  type requestBuilder (line 32) | type requestBuilder struct
    method Arguments (line 44) | func (r *requestBuilder) Arguments(args ...string) RequestBuilder {
    method BodyString (line 50) | func (r *requestBuilder) BodyString(body string) RequestBuilder {
    method BodyBytes (line 55) | func (r *requestBuilder) BodyBytes(body []byte) RequestBuilder {
    method Body (line 60) | func (r *requestBuilder) Body(body io.Reader) RequestBuilder {
    method FileBody (line 66) | func (r *requestBuilder) FileBody(body io.Reader) RequestBuilder {
    method Option (line 86) | func (r *requestBuilder) Option(key string, value any) RequestBuilder {
    method Header (line 107) | func (r *requestBuilder) Header(name, value string) RequestBuilder {
    method Send (line 116) | func (r *requestBuilder) Send(ctx context.Context) (*Response, error) {
    method Exec (line 131) | func (r *requestBuilder) Exec(ctx context.Context, res any) error {

FILE: client/rpc/response.go
  type trailerReader (line 20) | type trailerReader struct
    method Read (line 24) | func (r *trailerReader) Read(b []byte) (int, error) {
    method Close (line 34) | func (r *trailerReader) Close() error {
  type Response (line 38) | type Response struct
    method Close (line 43) | func (r *Response) Close() error {
    method Cancel (line 58) | func (r *Response) Cancel() error {
    method decode (line 67) | func (r *Response) decode(dec any) error {
  method Send (line 81) | func (r *Request) Send(c *http.Client) (*Response, error) {
  method getURL (line 159) | func (r *Request) getURL() string {

FILE: client/rpc/routing.go
  type RoutingAPI (line 15) | type RoutingAPI
    method Get (line 17) | func (api *RoutingAPI) Get(ctx context.Context, key string) ([]byte, e...
    method Put (line 42) | func (api *RoutingAPI) Put(ctx context.Context, key string, value []by...
    method FindPeer (line 63) | func (api *RoutingAPI) FindPeer(ctx context.Context, p peer.ID) (peer....
    method FindProviders (line 87) | func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path,...
    method Provide (line 143) | func (api *RoutingAPI) Provide(ctx context.Context, p path.Path, opts ...
    method core (line 159) | func (api *RoutingAPI) core() *HttpApi {

FILE: client/rpc/swarm.go
  type SwarmAPI (line 14) | type SwarmAPI
    method Connect (line 16) | func (api *SwarmAPI) Connect(ctx context.Context, pi peer.AddrInfo) er...
    method Disconnect (line 30) | func (api *SwarmAPI) Disconnect(ctx context.Context, addr multiaddr.Mu...
    method Peers (line 63) | func (api *SwarmAPI) Peers(ctx context.Context) ([]iface.ConnectionInf...
    method KnownAddrs (line 115) | func (api *SwarmAPI) KnownAddrs(ctx context.Context) (map[peer.ID][]mu...
    method LocalAddrs (line 145) | func (api *SwarmAPI) LocalAddrs(ctx context.Context) ([]multiaddr.Mult...
    method ListenAddrs (line 165) | func (api *SwarmAPI) ListenAddrs(ctx context.Context) ([]multiaddr.Mul...
    method core (line 185) | func (api *SwarmAPI) core() *HttpApi {
  type connInfo (line 34) | type connInfo struct
    method ID (line 43) | func (c *connInfo) ID() peer.ID {
    method Address (line 47) | func (c *connInfo) Address() multiaddr.Multiaddr {
    method Direction (line 51) | func (c *connInfo) Direction() network.Direction {
    method Latency (line 55) | func (c *connInfo) Latency() (time.Duration, error) {
    method Streams (line 59) | func (c *connInfo) Streams() ([]protocol.ID, error) {

FILE: client/rpc/unixfs.go
  type addEvent (line 22) | type addEvent struct
  type UnixfsAPI (line 29) | type UnixfsAPI
    method Add (line 31) | func (api *UnixfsAPI) Add(ctx context.Context, f files.Node, opts ...c...
    method Ls (line 147) | func (api *UnixfsAPI) Ls(ctx context.Context, p path.Path, out chan<- ...
    method core (line 221) | func (api *UnixfsAPI) core() *HttpApi {
  type lsLink (line 128) | type lsLink struct
  type lsObject (line 138) | type lsObject struct
  type lsOutput (line 143) | type lsOutput struct

FILE: commands/context.go
  type Context (line 23) | type Context struct
    method GetConfig (line 35) | func (c *Context) GetConfig() (*config.Config, error) {
    method GetNode (line 45) | func (c *Context) GetNode() (*core.IpfsNode, error) {
    method ClearCachedNode (line 69) | func (c *Context) ClearCachedNode() {
    method GetAPI (line 75) | func (c *Context) GetAPI() (coreiface.CoreAPI, error) {
    method Context (line 99) | func (c *Context) Context() context.Context {
    method LogRequest (line 112) | func (c *Context) LogRequest(req *cmds.Request) func() {
    method Close (line 129) | func (c *Context) Close() {

FILE: commands/reqlog.go
  type ReqLogEntry (line 9) | type ReqLogEntry struct
    method Copy (line 22) | func (r *ReqLogEntry) Copy() *ReqLogEntry {
  type ReqLog (line 29) | type ReqLog struct
    method AddEntry (line 37) | func (rl *ReqLog) AddEntry(rle *ReqLogEntry) {
    method ClearInactive (line 51) | func (rl *ReqLog) ClearInactive() {
    method maybeCleanup (line 61) | func (rl *ReqLog) maybeCleanup() {
    method cleanup (line 69) | func (rl *ReqLog) cleanup() {
    method SetKeepTime (line 83) | func (rl *ReqLog) SetKeepTime(t time.Duration) {
    method Report (line 90) | func (rl *ReqLog) Report() []*ReqLogEntry {
    method Finish (line 103) | func (rl *ReqLog) Finish(rle *ReqLogEntry) {

FILE: config/addresses.go
  type Addresses (line 4) | type Addresses struct

FILE: config/api.go
  constant APITag (line 9) | APITag           = "API"
  constant AuthorizationTag (line 10) | AuthorizationTag = "Authorizations"
  type RPCAuthScope (line 13) | type RPCAuthScope struct
  type API (line 24) | type API struct
  function ConvertAuthSecret (line 38) | func ConvertAuthSecret(secret string) string {

FILE: config/api_test.go
  function TestConvertAuthSecret (line 9) | func TestConvertAuthSecret(t *testing.T) {

FILE: config/autoconf.go
  type AutoConf (line 16) | type AutoConf struct
  constant AutoPlaceholder (line 36) | AutoPlaceholder = "auto"
  constant DefaultAutoConfEnabled (line 39) | DefaultAutoConfEnabled = true
  constant DefaultAutoConfURL (line 42) | DefaultAutoConfURL = autoconf.MainnetAutoConfURL
  constant DefaultAutoConfRefreshInterval (line 45) | DefaultAutoConfRefreshInterval = autoconf.DefaultRefreshInterval
  constant DefaultAutoConfCacheSize (line 48) | DefaultAutoConfCacheSize = autoconf.DefaultCacheSize
  constant DefaultAutoConfTimeout (line 49) | DefaultAutoConfTimeout   = autoconf.DefaultTimeout
  function getNativeSystems (line 53) | func getNativeSystems(routingType string) []string {
  function selectRandomResolver (line 69) | func selectRandomResolver(resolvers []string) string {
  method DNSResolversWithAutoConf (line 77) | func (c *Config) DNSResolversWithAutoConf() map[string]string {
  function expandAutoConfSlice (line 122) | func expandAutoConfSlice(sourceSlice []string, autoConfData []string) []...
  method BootstrapWithAutoConf (line 144) | func (c *Config) BootstrapWithAutoConf() []string {
  method getAutoConf (line 163) | func (c *Config) getAutoConf() *autoconf.Config {
  method BootstrapPeersWithAutoConf (line 186) | func (c *Config) BootstrapPeersWithAutoConf() ([]peer.AddrInfo, error) {
  method DelegatedRoutersWithAutoConf (line 192) | func (c *Config) DelegatedRoutersWithAutoConf() []string {
  method DelegatedPublishersWithAutoConf (line 210) | func (c *Config) DelegatedPublishersWithAutoConf() []string {
  method expandConfigField (line 226) | func (c *Config) expandConfigField(expandedCfg map[string]any, fieldPath...
  method ExpandAutoConfValues (line 259) | func (c *Config) ExpandAutoConfValues(cfg map[string]any) (map[string]an...
  method ExpandConfigField (line 294) | func (c *Config) ExpandConfigField(key string, value any) any {
  function stringSliceToInterfaceSlice (line 305) | func stringSliceToInterfaceSlice(slice []string) []any {
  function stringMapToInterfaceMap (line 313) | func stringMapToInterfaceMap(m map[string]string) map[string]any {

FILE: config/autoconf_client.go
  function GetAutoConfClient (line 25) | func GetAutoConfClient(cfg *Config) (*autoconf.Client, error) {
  function newAutoConfClient (line 33) | func newAutoConfClient(cfg *Config) (*autoconf.Client, error) {
  function ValidateAutoConfWithRepo (line 64) | func ValidateAutoConfWithRepo(cfg *Config, swarmKeyExists bool) error {
  function validateAutoConfDisabled (line 81) | func validateAutoConfDisabled(cfg *Config) error {

FILE: config/autoconf_test.go
  function TestAutoConfDefaults (line 10) | func TestAutoConfDefaults(t *testing.T) {
  function TestAutoConfProfile (line 30) | func TestAutoConfProfile(t *testing.T) {
  function TestInitWithAutoValues (line 69) | func TestInitWithAutoValues(t *testing.T) {

FILE: config/autonat.go
  type AutoNATServiceMode (line 8) | type AutoNATServiceMode
    method UnmarshalText (line 28) | func (m *AutoNATServiceMode) UnmarshalText(text []byte) error {
    method MarshalText (line 44) | func (m AutoNATServiceMode) MarshalText() ([]byte, error) {
  constant AutoNATServiceUnset (line 16) | AutoNATServiceUnset AutoNATServiceMode = iota
  constant AutoNATServiceEnabled (line 19) | AutoNATServiceEnabled
  constant AutoNATServiceDisabled (line 22) | AutoNATServiceDisabled
  constant AutoNATServiceEnabledV1Only (line 25) | AutoNATServiceEnabledV1Only
  type AutoNATConfig (line 60) | type AutoNATConfig struct
  type AutoNATThrottleConfig (line 75) | type AutoNATThrottleConfig struct

FILE: config/autotls.go
  type AutoTLS (line 12) | type AutoTLS struct
  constant DefaultAutoTLSEnabled (line 46) | DefaultAutoTLSEnabled           = true
  constant DefaultDomainSuffix (line 47) | DefaultDomainSuffix             = p2pforge.DefaultForgeDomain
  constant DefaultRegistrationEndpoint (line 48) | DefaultRegistrationEndpoint     = p2pforge.DefaultForgeEndpoint
  constant DefaultCAEndpoint (line 49) | DefaultCAEndpoint               = p2pforge.DefaultCAEndpoint
  constant DefaultAutoWSS (line 50) | DefaultAutoWSS                  = true
  constant DefaultAutoTLSShortAddrs (line 51) | DefaultAutoTLSShortAddrs        = true
  constant DefaultAutoTLSSkipDNSLookup (line 52) | DefaultAutoTLSSkipDNSLookup     = true
  constant DefaultAutoTLSRegistrationDelay (line 53) | DefaultAutoTLSRegistrationDelay = 1 * time.Hour

FILE: config/bitswap.go
  type Bitswap (line 4) | type Bitswap struct
  constant DefaultBitswapLibp2pEnabled (line 13) | DefaultBitswapLibp2pEnabled = true
  constant DefaultBitswapServerEnabled (line 14) | DefaultBitswapServerEnabled = true

FILE: config/bootstrap_peers.go
  method BootstrapPeers (line 13) | func (c *Config) BootstrapPeers() ([]peer.AddrInfo, error) {
  method SetBootstrapPeers (line 17) | func (c *Config) SetBootstrapPeers(bps []peer.AddrInfo) {
  function ParseBootstrapPeers (line 22) | func ParseBootstrapPeers(addrs []string) ([]peer.AddrInfo, error) {
  function BootstrapPeerStrings (line 36) | func BootstrapPeerStrings(bps []peer.AddrInfo) []string {

FILE: config/bootstrap_peers_test.go
  function TestBootstrapPeerStrings (line 11) | func TestBootstrapPeerStrings(t *testing.T) {

FILE: config/config.go
  type Config (line 17) | type Config struct
    method Clone (line 213) | func (c *Config) Clone() (*Config, error) {
  constant DefaultPathName (line 55) | DefaultPathName = ".ipfs"
  constant DefaultPathRoot (line 57) | DefaultPathRoot = "~/" + DefaultPathName
  constant DefaultConfigFile (line 59) | DefaultConfigFile = "config"
  constant EnvDir (line 61) | EnvDir = "IPFS_PATH"
  function PathRoot (line 65) | func PathRoot() (string, error) {
  function Path (line 76) | func Path(configroot, extension string) (string, error) {
  function Filename (line 96) | func Filename(configroot, userConfigFile string) (string, error) {
  function HumanOutput (line 109) | func HumanOutput(value any) ([]byte, error) {
  function Marshal (line 118) | func Marshal(value any) ([]byte, error) {
  function FromMap (line 123) | func FromMap(v map[string]any) (*Config, error) {
  function ToMap (line 135) | func ToMap(conf *Config) (map[string]any, error) {
  function ReflectToMap (line 150) | func ReflectToMap(conf any) any {
  function CheckKey (line 229) | func CheckKey(key string) error {

FILE: config/config_test.go
  function TestClone (line 7) | func TestClone(t *testing.T) {
  function TestReflectToMap (line 31) | func TestReflectToMap(t *testing.T) {
  function TestCheckKey (line 131) | func TestCheckKey(t *testing.T) {

FILE: config/datastore.go
  constant DefaultDataStoreDirectory (line 9) | DefaultDataStoreDirectory = "datastore"
  constant DefaultBlockKeyCacheSize (line 13) | DefaultBlockKeyCacheSize = 64 << 10
  constant DefaultWriteThrough (line 20) | DefaultWriteThrough bool = true
  type Datastore (line 24) | type Datastore struct
  function DataStorePath (line 45) | func DataStorePath(configroot string) (string, error) {

FILE: config/discovery.go
  type Discovery (line 3) | type Discovery struct
  type MDNS (line 7) | type MDNS struct

FILE: config/dns.go
  type DNS (line 4) | type DNS struct

FILE: config/experiments.go
  type Experiments (line 3) | type Experiments struct

FILE: config/gateway.go
  constant DefaultInlineDNSLink (line 8) | DefaultInlineDNSLink         = false
  constant DefaultDeserializedResponses (line 9) | DefaultDeserializedResponses = true
  constant DefaultDisableHTMLErrors (line 10) | DefaultDisableHTMLErrors     = false
  constant DefaultExposeRoutingAPI (line 11) | DefaultExposeRoutingAPI      = true
  constant DefaultDiagnosticServiceURL (line 12) | DefaultDiagnosticServiceURL  = "https://check.ipfs.network"
  constant DefaultAllowCodecConversion (line 13) | DefaultAllowCodecConversion  = false
  constant DefaultRetrievalTimeout (line 16) | DefaultRetrievalTimeout        = gateway.DefaultRetrievalTimeout
  constant DefaultMaxRequestDuration (line 17) | DefaultMaxRequestDuration      = gateway.DefaultMaxRequestDuration
  constant DefaultMaxConcurrentRequests (line 18) | DefaultMaxConcurrentRequests   = gateway.DefaultMaxConcurrentRequests
  constant DefaultMaxRangeRequestFileSize (line 19) | DefaultMaxRangeRequestFileSize = 0
  type GatewaySpec (line 22) | type GatewaySpec struct
  type Gateway (line 53) | type Gateway struct

FILE: config/http_retrieval.go
  type HTTPRetrieval (line 5) | type HTTPRetrieval struct
  constant DefaultHTTPRetrievalEnabled (line 15) | DefaultHTTPRetrievalEnabled               = true
  constant DefaultHTTPRetrievalNumWorkers (line 16) | DefaultHTTPRetrievalNumWorkers            = 16
  constant DefaultHTTPRetrievalTLSInsecureSkipVerify (line 17) | DefaultHTTPRetrievalTLSInsecureSkipVerify = false
  constant DefaultHTTPRetrievalMaxBlockSize (line 18) | DefaultHTTPRetrievalMaxBlockSize          = "2MiB"

FILE: config/identity.go
  constant IdentityTag (line 10) | IdentityTag     = "Identity"
  constant PrivKeyTag (line 11) | PrivKeyTag      = "PrivKey"
  constant PrivKeySelector (line 12) | PrivKeySelector = IdentityTag + "." + PrivKeyTag
  type Identity (line 16) | type Identity struct
    method DecodePrivateKey (line 22) | func (i *Identity) DecodePrivateKey(passphrase string) (ic.PrivKey, er...

FILE: config/import.go
  constant DefaultCidVersion (line 17) | DefaultCidVersion      = 0
  constant DefaultUnixFSRawLeaves (line 18) | DefaultUnixFSRawLeaves = false
  constant DefaultUnixFSChunker (line 19) | DefaultUnixFSChunker   = "size-262144"
  constant DefaultHashFunction (line 20) | DefaultHashFunction    = "sha2-256"
  constant DefaultFastProvideRoot (line 21) | DefaultFastProvideRoot = true
  constant DefaultFastProvideWait (line 22) | DefaultFastProvideWait = false
  constant DefaultUnixFSHAMTDirectorySizeThreshold (line 24) | DefaultUnixFSHAMTDirectorySizeThreshold = 262144
  constant DefaultBatchMaxNodes (line 29) | DefaultBatchMaxNodes = 128
  constant DefaultBatchMaxSize (line 33) | DefaultBatchMaxSize = 100 << 20
  constant HAMTSizeEstimationLinks (line 36) | HAMTSizeEstimationLinks    = "links"
  constant HAMTSizeEstimationBlock (line 37) | HAMTSizeEstimationBlock    = "block"
  constant HAMTSizeEstimationDisabled (line 38) | HAMTSizeEstimationDisabled = "disabled"
  constant DAGLayoutBalanced (line 41) | DAGLayoutBalanced = "balanced"
  constant DAGLayoutTrickle (line 42) | DAGLayoutTrickle  = "trickle"
  constant DefaultUnixFSHAMTDirectorySizeEstimation (line 44) | DefaultUnixFSHAMTDirectorySizeEstimation = HAMTSizeEstimationLinks
  constant DefaultUnixFSDAGLayout (line 45) | DefaultUnixFSDAGLayout                   = DAGLayoutBalanced
  constant DefaultUnixFSIncludeEmptyDirs (line 46) | DefaultUnixFSIncludeEmptyDirs            = true
  type Import (line 57) | type Import struct
    method HAMTSizeEstimationMode (line 226) | func (i *Import) HAMTSizeEstimationMode() uio.SizeEstimationMode {
    method UnixFSSplitterFunc (line 242) | func (i *Import) UnixFSSplitterFunc() chunk.SplitterGen {
  function ValidateImportConfig (line 76) | func ValidateImportConfig(cfg *Import) error {
  function isPowerOfTwo (line 176) | func isPowerOfTwo(n int64) bool {
  function isValidChunker (line 181) | func isValidChunker(chunker string) bool {

FILE: config/import_test.go
  function TestValidateImportConfig_HAMTFanout (line 11) | func TestValidateImportConfig_HAMTFanout(t *testing.T) {
  function TestValidateImportConfig_CidVersion (line 73) | func TestValidateImportConfig_CidVersion(t *testing.T) {
  function TestValidateImportConfig_UnixFSFileMaxLinks (line 110) | func TestValidateImportConfig_UnixFSFileMaxLinks(t *testing.T) {
  function TestValidateImportConfig_UnixFSDirectoryMaxLinks (line 147) | func TestValidateImportConfig_UnixFSDirectoryMaxLinks(t *testing.T) {
  function TestValidateImportConfig_BatchMax (line 184) | func TestValidateImportConfig_BatchMax(t *testing.T) {
  function TestValidateImportConfig_UnixFSChunker (line 229) | func TestValidateImportConfig_UnixFSChunker(t *testing.T) {
  function TestValidateImportConfig_HashFunction (line 275) | func TestValidateImportConfig_HashFunction(t *testing.T) {
  function TestValidateImportConfig_DefaultValue (line 326) | func TestValidateImportConfig_DefaultValue(t *testing.T) {
  function TestIsValidChunker (line 336) | func TestIsValidChunker(t *testing.T) {
  function TestIsPowerOfTwo (line 375) | func TestIsPowerOfTwo(t *testing.T) {
  function TestValidateImportConfig_HAMTSizeEstimation (line 411) | func TestValidateImportConfig_HAMTSizeEstimation(t *testing.T) {
  function TestValidateImportConfig_DAGLayout (line 449) | func TestValidateImportConfig_DAGLayout(t *testing.T) {
  function TestImport_HAMTSizeEstimationMode (line 486) | func TestImport_HAMTSizeEstimationMode(t *testing.T) {

FILE: config/init.go
  function Init (line 16) | func Init(out io.Writer, nBitsForKeypair int) (*Config, error) {
  function InitWithIdentity (line 25) | func InitWithIdentity(identity Identity) (*Config, error) {
  constant DefaultConnMgrHighWater (line 81) | DefaultConnMgrHighWater = 96
  constant DefaultConnMgrLowWater (line 85) | DefaultConnMgrLowWater = 32
  constant DefaultConnMgrGracePeriod (line 89) | DefaultConnMgrGracePeriod = time.Second * 20
  constant DefaultConnMgrSilencePeriod (line 92) | DefaultConnMgrSilencePeriod = time.Second * 10
  constant DefaultConnMgrType (line 96) | DefaultConnMgrType = "basic"
  constant DefaultResourceMgrMinInboundConns (line 100) | DefaultResourceMgrMinInboundConns = 800
  function addressesConfig (line 102) | func addressesConfig() Addresses {
  function DefaultDatastoreConfig (line 123) | func DefaultDatastoreConfig() Datastore {
  function pebbleSpec (line 133) | func pebbleSpec() map[string]any {
  function pebbleSpecMeasure (line 142) | func pebbleSpecMeasure() map[string]any {
  function badgerSpec (line 154) | func badgerSpec() map[string]any {
  function badgerSpecMeasure (line 164) | func badgerSpecMeasure() map[string]any {
  function flatfsSpec (line 177) | func flatfsSpec() map[string]any {
  function flatfsSpecMeasure (line 200) | func flatfsSpecMeasure() map[string]any {
  function CreateIdentity (line 230) | func CreateIdentity(out io.Writer, opts []options.KeyGenerateOption) (Id...

FILE: config/init_test.go
  function TestCreateIdentity (line 11) | func TestCreateIdentity(t *testing.T) {
  function TestCreateIdentityOptions (line 38) | func TestCreateIdentityOptions(t *testing.T) {

FILE: config/internal.go
  constant DefaultMFSNoFlushLimit (line 5) | DefaultMFSNoFlushLimit = 256
  type Internal (line 8) | type Internal struct
  type InternalBitswap (line 23) | type InternalBitswap struct
  type BitswapBroadcastControl (line 34) | type BitswapBroadcastControl struct
  constant DefaultBroadcastControlEnable (line 72) | DefaultBroadcastControlEnable             = true
  constant DefaultBroadcastControlMaxPeers (line 73) | DefaultBroadcastControlMaxPeers           = -1
  constant DefaultBroadcastControlLocalPeers (line 74) | DefaultBroadcastControlLocalPeers         = false
  constant DefaultBroadcastControlPeeredPeers (line 75) | DefaultBroadcastControlPeeredPeers        = false
  constant DefaultBroadcastControlMaxRandomPeers (line 76) | DefaultBroadcastControlMaxRandomPeers     = 0
  constant DefaultBroadcastControlSendToPendingPeers (line 77) | DefaultBroadcastControlSendToPendingPeers = false

FILE: config/ipns.go
  constant DefaultIpnsMaxCacheTTL (line 9) | DefaultIpnsMaxCacheTTL = time.Duration(math.MaxInt64)
  type Ipns (line 12) | type Ipns struct

FILE: config/migration.go
  constant DefaultMigrationKeep (line 3) | DefaultMigrationKeep = "cache"
  type Migration (line 14) | type Migration struct

FILE: config/migration_test.go
  function TestMigrationDecode (line 8) | func TestMigrationDecode(t *testing.T) {

FILE: config/mounts.go
  type Mounts (line 4) | type Mounts struct

FILE: config/peering.go
  type Peering (line 6) | type Peering struct

FILE: config/plugins.go
  type Plugins (line 3) | type Plugins struct
  type Plugin (line 8) | type Plugin struct

FILE: config/profile.go
  type Transformer (line 10) | type Transformer
  type Profile (line 13) | type Profile struct
  function getAvailablePort (line 391) | func getAvailablePort() (port int, err error) {
  function appendSingle (line 401) | func appendSingle(a []string, b []string) []string {
  function deleteEntries (line 419) | func deleteEntries(arr []string, del []string) []string {
  function mapKeys (line 430) | func mapKeys(m map[string]struct{}) []string {
  function applyUnixFSv02015 (line 439) | func applyUnixFSv02015(c *Config) error {

FILE: config/provide.go
  constant DefaultProvideEnabled (line 12) | DefaultProvideEnabled  = true
  constant DefaultProvideStrategy (line 13) | DefaultProvideStrategy = "all"
  constant DefaultProvideDHTInterval (line 16) | DefaultProvideDHTInterval                 = 22 * time.Hour
  constant DefaultProvideDHTMaxWorkers (line 17) | DefaultProvideDHTMaxWorkers               = 16
  constant DefaultProvideDHTSweepEnabled (line 18) | DefaultProvideDHTSweepEnabled             = true
  constant DefaultProvideDHTResumeEnabled (line 19) | DefaultProvideDHTResumeEnabled            = true
  constant DefaultProvideDHTDedicatedPeriodicWorkers (line 20) | DefaultProvideDHTDedicatedPeriodicWorkers = 2
  constant DefaultProvideDHTDedicatedBurstWorkers (line 21) | DefaultProvideDHTDedicatedBurstWorkers    = 1
  constant DefaultProvideDHTMaxProvideConnsPerWorker (line 22) | DefaultProvideDHTMaxProvideConnsPerWorker = 20
  constant DefaultProvideDHTKeystoreBatchSize (line 23) | DefaultProvideDHTKeystoreBatchSize        = 1 << 14
  constant DefaultProvideDHTOfflineDelay (line 24) | DefaultProvideDHTOfflineDelay             = 2 * time.Hour
  constant DefaultFastProvideTimeout (line 29) | DefaultFastProvideTimeout = 10 * time.Second
  type ProvideStrategy (line 32) | type ProvideStrategy
  constant ProvideStrategyAll (line 35) | ProvideStrategyAll ProvideStrategy = 1 << iota
  constant ProvideStrategyPinned (line 36) | ProvideStrategyPinned
  constant ProvideStrategyRoots (line 37) | ProvideStrategyRoots
  constant ProvideStrategyMFS (line 38) | ProvideStrategyMFS
  type Provide (line 44) | type Provide struct
  type ProvideDHT (line 59) | type ProvideDHT struct
  function ParseProvideStrategy (line 103) | func ParseProvideStrategy(s string) ProvideStrategy {
  function ValidateProvideConfig (line 121) | func ValidateProvideConfig(cfg *Provide) error {
  function ShouldProvideForStrategy (line 186) | func ShouldProvideForStrategy(strategy ProvideStrategy, isPinned bool, i...

FILE: config/provide_test.go
  function TestParseProvideStrategy (line 11) | func TestParseProvideStrategy(t *testing.T) {
  function TestValidateProvideConfig_Interval (line 35) | func TestValidateProvideConfig_Interval(t *testing.T) {
  function TestValidateProvideConfig_MaxWorkers (line 73) | func TestValidateProvideConfig_MaxWorkers(t *testing.T) {
  function TestShouldProvideForStrategy (line 109) | func TestShouldProvideForStrategy(t *testing.T) {

FILE: config/provider.go
  type Provider (line 7) | type Provider struct

FILE: config/pubsub.go
  constant LastSeenMessagesStrategy (line 9) | LastSeenMessagesStrategy = "last-seen"
  constant FirstSeenMessagesStrategy (line 15) | FirstSeenMessagesStrategy = "first-seen"
  constant DefaultSeenMessagesStrategy (line 19) | DefaultSeenMessagesStrategy = LastSeenMessagesStrategy
  type PubsubConfig (line 22) | type PubsubConfig struct

FILE: config/remotepin.go
  type Pinning (line 8) | type Pinning struct
  type RemotePinningService (line 12) | type RemotePinningService struct
  type RemotePinningServiceAPI (line 17) | type RemotePinningServiceAPI struct
  type RemotePinningServicePolicies (line 22) | type RemotePinningServicePolicies struct
  type RemotePinningServiceMFSPolicy (line 26) | type RemotePinningServiceMFSPolicy struct

FILE: config/reprovider.go
  type Reprovider (line 7) | type Reprovider struct

FILE: config/routing.go
  constant DefaultAcceleratedDHTClient (line 13) | DefaultAcceleratedDHTClient      = false
  constant DefaultLoopbackAddressesOnLanDHT (line 14) | DefaultLoopbackAddressesOnLanDHT = false
  constant DefaultRoutingType (line 15) | DefaultRoutingType               = "auto"
  constant CidContactRoutingURL (line 16) | CidContactRoutingURL             = "https://cid.contact"
  constant PublicGoodDelegatedRoutingURL (line 17) | PublicGoodDelegatedRoutingURL    = "https://delegated-ipfs.dev"
  constant EnvHTTPRouters (line 18) | EnvHTTPRouters                   = "IPFS_HTTP_ROUTERS"
  constant EnvHTTPRoutersFilterProtocols (line 19) | EnvHTTPRoutersFilterProtocols    = "IPFS_HTTP_ROUTERS_FILTER_PROTOCOLS"
  type Routing (line 34) | type Routing struct
  type Router (line 57) | type Router struct
  type Routers (line 67) | type Routers
  type Methods (line 68) | type Methods
    method Check (line 71) | func (m Methods) Check() error {
  type RouterParser (line 94) | type RouterParser struct
    method UnmarshalJSON (line 98) | func (r *RouterParser) UnmarshalJSON(b []byte) error {
  type RouterType (line 130) | type RouterType
  constant RouterTypeHTTP (line 133) | RouterTypeHTTP       RouterType = "http"
  constant RouterTypeDHT (line 134) | RouterTypeDHT        RouterType = "dht"
  constant RouterTypeSequential (line 135) | RouterTypeSequential RouterType = "sequential"
  constant RouterTypeParallel (line 136) | RouterTypeParallel   RouterType = "parallel"
  type DHTMode (line 139) | type DHTMode
  constant DHTModeServer (line 142) | DHTModeServer DHTMode = "server"
  constant DHTModeClient (line 143) | DHTModeClient DHTMode = "client"
  constant DHTModeAuto (line 144) | DHTModeAuto   DHTMode = "auto"
  type MethodName (line 147) | type MethodName
  constant MethodNameProvide (line 150) | MethodNameProvide       MethodName = "provide"
  constant MethodNameFindProviders (line 151) | MethodNameFindProviders MethodName = "find-providers"
  constant MethodNameFindPeers (line 152) | MethodNameFindPeers     MethodName = "find-peers"
  constant MethodNameGetIPNS (line 153) | MethodNameGetIPNS       MethodName = "get-ipns"
  constant MethodNamePutIPNS (line 154) | MethodNamePutIPNS       MethodName = "put-ipns"
  type HTTPRouterParams (line 159) | type HTTPRouterParams struct
    method FillDefaults (line 171) | func (hrp *HTTPRouterParams) FillDefaults() {
  type DHTRouterParams (line 181) | type DHTRouterParams struct
  type ComposableRouterParams (line 187) | type ComposableRouterParams struct
  type ConfigRouter (line 192) | type ConfigRouter struct
  type Method (line 199) | type Method struct
  function getEnvOrDefault (line 205) | func getEnvOrDefault(key string, defaultValue []string) []string {
  method HasHTTPProviderConfigured (line 229) | func (c *Config) HasHTTPProviderConfigured() bool {
  method routerSupportsHTTPProviding (line 244) | func (c *Config) routerSupportsHTTPProviding(routerName string) bool {

FILE: config/routing_test.go
  function TestRouterParameters (line 11) | func TestRouterParameters(t *testing.T) {
  function TestMethods (line 107) | func TestMethods(t *testing.T) {

FILE: config/serialize/serialize.go
  function ReadConfigFile (line 21) | func ReadConfigFile(filename string, cfg any) error {
  function WriteConfigFile (line 37) | func WriteConfigFile(filename string, cfg any) error {
  function encode (line 53) | func encode(w io.Writer, value any) error {
  function Load (line 64) | func Load(filename string) (*config.Config, error) {

FILE: config/serialize/serialize_test.go
  function TestConfig (line 11) | func TestConfig(t *testing.T) {

FILE: config/swarm.go
  type SwarmConfig (line 3) | type SwarmConfig struct
  type RelayClient (line 37) | type RelayClient struct
  type RelayService (line 49) | type RelayService struct
  type Transports (line 74) | type Transports struct
  type ConnMgr (line 106) | type ConnMgr struct
  type ResourceMgr (line 116) | type ResourceMgr struct
  constant ResourceMgrSystemScope (line 131) | ResourceMgrSystemScope         = "system"
  constant ResourceMgrTransientScope (line 132) | ResourceMgrTransientScope      = "transient"
  constant ResourceMgrServiceScopePrefix (line 133) | ResourceMgrServiceScopePrefix  = "svc:"
  constant ResourceMgrProtocolScopePrefix (line 134) | ResourceMgrProtocolScopePrefix = "proto:"
  constant ResourceMgrPeerScopePrefix (line 135) | ResourceMgrPeerScopePrefix     = "peer:"

FILE: config/types.go
  type Strings (line 16) | type Strings
    method UnmarshalJSON (line 19) | func (o *Strings) UnmarshalJSON(data []byte) error {
    method MarshalJSON (line 36) | func (o Strings) MarshalJSON() ([]byte, error) {
  type Flag (line 56) | type Flag
    method WithDefault (line 67) | func (f Flag) WithDefault(defaultValue bool) bool {
    method MarshalJSON (line 80) | func (f Flag) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 93) | func (f *Flag) UnmarshalJSON(input []byte) error {
    method String (line 107) | func (f Flag) String() string {
  constant False (line 59) | False   Flag = -1
  constant Default (line 60) | Default Flag = 0
  constant True (line 61) | True    Flag = 1
  function ResolveBoolFromConfig (line 123) | func ResolveBoolFromConfig(userValue bool, userSet bool, configFlag Flag...
  type Priority (line 140) | type Priority
    method WithDefault (line 153) | func (p Priority) WithDefault(defaultPriority Priority) (priority int6...
    method MarshalJSON (line 177) | func (p Priority) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 193) | func (p *Priority) UnmarshalJSON(input []byte) error {
    method String (line 215) | func (p Priority) String() string {
  constant DefaultPriority (line 143) | DefaultPriority Priority = 0
  constant Disabled (line 144) | Disabled        Priority = -1
  type OptionalDuration (line 237) | type OptionalDuration struct
    method UnmarshalJSON (line 246) | func (d *OptionalDuration) UnmarshalJSON(input []byte) error {
    method IsDefault (line 262) | func (d *OptionalDuration) IsDefault() bool {
    method WithDefault (line 266) | func (d *OptionalDuration) WithDefault(defaultValue time.Duration) tim...
    method MarshalJSON (line 273) | func (d OptionalDuration) MarshalJSON() ([]byte, error) {
    method String (line 280) | func (d OptionalDuration) String() string {
  function NewOptionalDuration (line 242) | func NewOptionalDuration(d time.Duration) *OptionalDuration {
  type Duration (line 292) | type Duration struct
    method MarshalJSON (line 296) | func (d Duration) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 300) | func (d *Duration) UnmarshalJSON(b []byte) error {
  type OptionalInteger (line 329) | type OptionalInteger struct
    method WithDefault (line 339) | func (p *OptionalInteger) WithDefault(defaultValue int64) (value int64) {
    method IsDefault (line 347) | func (p *OptionalInteger) IsDefault() bool {
    method MarshalJSON (line 351) | func (p OptionalInteger) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 358) | func (p *OptionalInteger) UnmarshalJSON(input []byte) error {
    method String (line 373) | func (p OptionalInteger) String() string {
  function NewOptionalInteger (line 334) | func NewOptionalInteger(v int64) *OptionalInteger {
  type OptionalString (line 388) | type OptionalString struct
    method WithDefault (line 398) | func (p *OptionalString) WithDefault(defaultValue string) (value strin...
    method IsDefault (line 406) | func (p *OptionalString) IsDefault() bool {
    method MarshalJSON (line 410) | func (p OptionalString) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 417) | func (p *OptionalString) UnmarshalJSON(input []byte) error {
    method String (line 432) | func (p OptionalString) String() string {
  function NewOptionalString (line 393) | func NewOptionalString(s string) *OptionalString {
  type OptionalBytes (line 449) | type OptionalBytes struct
    method IsDefault (line 459) | func (p *OptionalBytes) IsDefault() bool {
    method WithDefault (line 468) | func (p *OptionalBytes) WithDefault(defaultValue uint64) (value uint64) {
    method UnmarshalJSON (line 483) | func (p *OptionalBytes) UnmarshalJSON(input []byte) error {
  function NewOptionalBytes (line 454) | func NewOptionalBytes(s string) *OptionalBytes {
  type swarmLimits (line 515) | type swarmLimits
    method UnmarshalJSON (line 519) | func (swarmLimits) UnmarshalJSON(b []byte) error {
  type experimentalAcceleratedDHTClient (line 539) | type experimentalAcceleratedDHTClient
    method UnmarshalJSON (line 543) | func (experimentalAcceleratedDHTClient) UnmarshalJSON(b []byte) error {
  type doNotUse (line 566) | type doNotUse
  type graphsyncEnabled (line 568) | type graphsyncEnabled
    method UnmarshalJSON (line 572) | func (graphsyncEnabled) UnmarshalJSON(b []byte) error {

FILE: config/types_test.go
  function TestOptionalDuration (line 13) | func TestOptionalDuration(t *testing.T) {
  function TestOneStrings (line 131) | func TestOneStrings(t *testing.T) {
  function TestNoStrings (line 142) | func TestNoStrings(t *testing.T) {
  function TestManyStrings (line 153) | func TestManyStrings(t *testing.T) {
  function TestFunkyStrings (line 164) | func TestFunkyStrings(t *testing.T) {
  function TestFlag (line 175) | func TestFlag(t *testing.T) {
  function TestPriority (line 243) | func TestPriority(t *testing.T) {
  function TestOptionalInteger (line 310) | func TestOptionalInteger(t *testing.T) {
  function TestOptionalString (line 415) | func TestOptionalString(t *testing.T) {
  function TestOptionalBytes (line 516) | func TestOptionalBytes(t *testing.T) {

FILE: config/version.go
  constant DefaultSwarmCheckPercentThreshold (line 3) | DefaultSwarmCheckPercentThreshold = 5
  type Version (line 6) | type Version struct

FILE: core/builder.go
  type FXNodeInfo (line 21) | type FXNodeInfo struct
  type fxOptFunc (line 26) | type fxOptFunc
  function RegisterFXOptionFunc (line 45) | func RegisterFXOptionFunc(optFunc fxOptFunc) {
  type valueContext (line 50) | type valueContext struct
    method Deadline (line 54) | func (valueContext) Deadline() (deadline time.Time, ok bool) { return }
    method Done (line 55) | func (valueContext) Done() <-chan struct{}                   { return ...
    method Err (line 56) | func (valueContext) Err() error                              { return ...
  function NewNode (line 61) | func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
  function logAndUnwrapFxError (line 153) | func logAndUnwrapFxError(fxAppErr error) error {

FILE: core/commands/active.go
  constant verboseOptionName (line 16) | verboseOptionName = "verbose"

FILE: core/commands/add.go
  type AddEvent (line 32) | type AddEvent struct
  constant pinNameOptionName (line 43) | pinNameOptionName           = "pin-name"
  constant quietOptionName (line 44) | quietOptionName             = "quiet"
  constant quieterOptionName (line 45) | quieterOptionName           = "quieter"
  constant silentOptionName (line 46) | silentOptionName            = "silent"
  constant progressOptionName (line 47) | progressOptionName          = "progress"
  constant trickleOptionName (line 48) | trickleOptionName           = "trickle"
  constant wrapOptionName (line 49) | wrapOptionName              = "wrap-with-directory"
  constant onlyHashOptionName (line 50) | onlyHashOptionName          = "only-hash"
  constant chunkerOptionName (line 51) | chunkerOptionName           = "chunker"
  constant pinOptionName (line 52) | pinOptionName               = "pin"
  constant rawLeavesOptionName (line 53) | rawLeavesOptionName         = "raw-leaves"
  constant maxFileLinksOptionName (line 54) | maxFileLinksOptionName      = "max-file-links"
  constant maxDirectoryLinksOptionName (line 55) | maxDirectoryLinksOptionName = "max-directory-links"
  constant maxHAMTFanoutOptionName (line 56) | maxHAMTFanoutOptionName     = "max-hamt-fanout"
  constant noCopyOptionName (line 57) | noCopyOptionName            = "nocopy"
  constant fstoreCacheOptionName (line 58) | fstoreCacheOptionName       = "fscache"
  constant cidVersionOptionName (line 59) | cidVersionOptionName        = "cid-version"
  constant hashOptionName (line 60) | hashOptionName              = "hash"
  constant inlineOptionName (line 61) | inlineOptionName            = "inline"
  constant inlineLimitOptionName (line 62) | inlineLimitOptionName       = "inline-limit"
  constant toFilesOptionName (line 63) | toFilesOptionName           = "to-files"
  constant preserveModeOptionName (line 65) | preserveModeOptionName    = "preserve-mode"
  constant preserveMtimeOptionName (line 66) | preserveMtimeOptionName   = "preserve-mtime"
  constant modeOptionName (line 67) | modeOptionName            = "mode"
  constant mtimeOptionName (line 68) | mtimeOptionName           = "mtime"
  constant mtimeNsecsOptionName (line 69) | mtimeNsecsOptionName      = "mtime-nsecs"
  constant fastProvideRootOptionName (line 70) | fastProvideRootOptionName = "fast-provide-root"
  constant fastProvideWaitOptionName (line 71) | fastProvideWaitOptionName = "fast-provide-wait"
  constant emptyDirsOptionName (line 72) | emptyDirsOptionName       = "empty-dirs"
  constant adderOutChanSize (line 76) | adderOutChanSize = 8

FILE: core/commands/bitswap.go
  constant peerOptionName (line 32) | peerOptionName = "peer"
  constant bitswapVerboseOptionName (line 98) | bitswapVerboseOptionName = "verbose"
  constant bitswapHumanOptionName (line 99) | bitswapHumanOptionName   = "human"

FILE: core/commands/block.go
  type BlockStat (line 21) | type BlockStat struct
    method String (line 26) | func (bs BlockStat) String() string {
  constant blockFormatOptionName (line 132) | blockFormatOptionName   = "format"
  constant blockCidCodecOptionName (line 133) | blockCidCodecOptionName = "cid-codec"
  constant mhtypeOptionName (line 134) | mhtypeOptionName        = "mhtype"
  constant mhlenOptionName (line 135) | mhlenOptionName         = "mhlen"
  constant forceOptionName (line 253) | forceOptionName      = "force"
  constant blockQuietOptionName (line 254) | blockQuietOptionName = "quiet"
  type removedBlock (line 257) | type removedBlock struct

FILE: core/commands/bootstrap.go
  type BootstrapOutput (line 19) | type BootstrapOutput struct
  constant bootstrapAllOptionName (line 115) | bootstrapAllOptionName = "all"
  function bootstrapWritePeers (line 256) | func bootstrapWritePeers(w io.Writer, prefix string, peers []string) err...
  function bootstrapAdd (line 269) | func bootstrapAdd(r repo.Repo, cfg *config.Config, peers []string) ([]st...
  function bootstrapRemove (line 323) | func bootstrapRemove(r repo.Repo, cfg *config.Config, toRemove []string)...
  function bootstrapRemoveAll (line 392) | func bootstrapRemoveAll(r repo.Repo, cfg *config.Config) ([]string, erro...
  constant bootstrapSecurityWarning (line 417) | bootstrapSecurityWarning = `

FILE: core/commands/cat.go
  constant progressBarMinSize (line 19) | progressBarMinSize = 1024 * 1024 * 8
  constant offsetOptionName (line 20) | offsetOptionName   = "offset"
  constant lengthOptionName (line 21) | lengthOptionName   = "length"
  function cat (line 124) | func cat(ctx context.Context, api iface.CoreAPI, paths []string, offset ...

FILE: core/commands/cid.go
  constant cidFormatOptionName (line 40) | cidFormatOptionName    = "f"
  constant cidToVersionOptionName (line 41) | cidToVersionOptionName = "v"
  constant cidCodecOptionName (line 42) | cidCodecOptionName     = "mc"
  constant cidMultibaseOptionName (line 43) | cidMultibaseOptionName = "b"
  type CidFormatRes (line 133) | type CidFormatRes struct
  type cidFormatOpts (line 163) | type cidFormatOpts struct
  type argumentIterator (line 170) | type argumentIterator struct
    method next (line 175) | func (i *argumentIterator) next() (string, bool) {
    method err (line 187) | func (i *argumentIterator) err() error {
  function emitCids (line 194) | func emitCids(req *cmds.Request, resp cmds.ResponseEmitter, opts cidForm...
  function toCidV0 (line 254) | func toCidV0(c cid.Cid) (cid.Cid, error) {
  function toCidV1 (line 261) | func toCidV1(c cid.Cid) (cid.Cid, error) {
  type CodeAndName (line 265) | type CodeAndName struct
  constant prefixOptionName (line 271) | prefixOptionName  = "prefix"
  constant numericOptionName (line 272) | numericOptionName = "numeric"
  constant codecsNumericOptionName (line 324) | codecsNumericOptionName   = "numeric"
  constant codecsSupportedOptionName (line 325) | codecsSupportedOptionName = "supported"
  type CidInspectRes (line 409) | type CidInspectRes struct
  type CidInspectBase (line 420) | type CidInspectBase struct
  type CidInspectCodec (line 425) | type CidInspectCodec struct
  type CidInspectHash (line 430) | type CidInspectHash struct
  type multibaseSorter (line 581) | type multibaseSorter struct
    method Sort (line 585) | func (s multibaseSorter) Sort() {
  type codeAndNameSorter (line 595) | type codeAndNameSorter struct
    method Sort (line 599) | func (s codeAndNameSorter) Sort() {

FILE: core/commands/cid_test.go
  function TestCidFmtCmd (line 10) | func TestCidFmtCmd(t *testing.T) {

FILE: core/commands/cmdenv/cidbase.go
  function GetCidEncoder (line 20) | func GetCidEncoder(req *cmds.Request) (cidenc.Encoder, error) {
  function GetLowLevelCidEncoder (line 27) | func GetLowLevelCidEncoder(req *cmds.Request) (cidenc.Encoder, error) {
  function getCidBase (line 31) | func getCidBase(req *cmds.Request, autoUpgrade bool) (cidenc.Encoder, er...
  function CidBaseDefined (line 57) | func CidBaseDefined(req *cmds.Request) bool {
  function CidEncoderFromPath (line 77) | func CidEncoderFromPath(p string) (cidenc.Encoder, error) {

FILE: core/commands/cmdenv/cidbase_test.go
  function TestEncoderFromPath (line 10) | func TestEncoderFromPath(t *testing.T) {

FILE: core/commands/cmdenv/env.go
  function GetNode (line 24) | func GetNode(env any) (*core.IpfsNode, error) {
  function GetApi (line 34) | func GetApi(env cmds.Environment, req *cmds.Request) (coreiface.CoreAPI,...
  function GetConfigRoot (line 59) | func GetConfigRoot(env cmds.Environment) (string, error) {
  function EscNonPrint (line 72) | func EscNonPrint(s string) string {
  function needEscape (line 82) | func needEscape(s string) bool {
  function provideCIDSync (line 106) | func provideCIDSync(ctx context.Context, router routing.Routing, c cid.C...
  function ExecuteFastProvide (line 132) | func ExecuteFastProvide(

FILE: core/commands/cmdenv/env_test.go
  function TestEscNonPrint (line 8) | func TestEscNonPrint(t *testing.T) {
  function hasNonPrintable (line 41) | func hasNonPrintable(s string) bool {

FILE: core/commands/cmdenv/file.go
  function GetFileArg (line 10) | func GetFileArg(it files.DirIterator) (files.File, error) {

FILE: core/commands/cmdutils/sanitize.go
  constant maxRunes (line 8) | maxRunes = 128
  function CleanAndTrim (line 17) | func CleanAndTrim(str string) string {

FILE: core/commands/cmdutils/utils.go
  constant AllowBigBlockOptionName (line 16) | AllowBigBlockOptionName = "allow-big-block"
  constant SoftBlockLimit (line 19) | SoftBlockLimit  = 2 * 1024 * 1024
  constant MaxPinNameBytes (line 20) | MaxPinNameBytes = 255
  function init (line 25) | func init() {
  function CheckCIDSize (line 29) | func CheckCIDSize(req *cmds.Request, c cid.Cid, dagAPI coreiface.APIDagS...
  function CheckBlockSize (line 43) | func CheckBlockSize(req *cmds.Request, size uint64) error {
  function ValidatePinName (line 59) | func ValidatePinName(name string) error {
  function PathOrCidPath (line 74) | func PathOrCidPath(str string) (path.Path, error) {
  function CloneAddrInfo (line 94) | func CloneAddrInfo(ai peer.AddrInfo) peer.AddrInfo {

FILE: core/commands/cmdutils/utils_test.go
  function TestPathOrCidPath (line 11) | func TestPathOrCidPath(t *testing.T) {
  function TestValidatePinName (line 75) | func TestValidatePinName(t *testing.T) {

FILE: core/commands/commands.go
  type commandEncoder (line 19) | type commandEncoder struct
    method Encode (line 23) | func (e *commandEncoder) Encode(v any) error {
  type Command (line 43) | type Command struct
  type Option (line 51) | type Option struct
  constant flagsOptionName (line 56) | flagsOptionName = "flags"
  function CommandsCmd (line 61) | func CommandsCmd(root *cmds.Command) *cmds.Command {
  function cmd2outputCmd (line 88) | func cmd2outputCmd(name string, cmd *cmds.Command) Command {
  function cmdPathStrings (line 107) | func cmdPathStrings(cmd *Command, showOptions bool) []string {
  function CompletionCmd (line 138) | func CompletionCmd(root *cmds.Command) *cmds.Command {
  type nonFatalError (line 230) | type nonFatalError
  function streamResult (line 235) | func streamResult(procVal func(any, io.Writer) nonFatalError) func(cmds....

FILE: core/commands/commands_test.go
  function collectPaths (line 10) | func collectPaths(prefix string, cmd *cmds.Command, out map[string]struc...
  function TestCommands (line 18) | func TestCommands(t *testing.T) {

FILE: core/commands/completion.go
  type completionCommand (line 12) | type completionCommand struct
  type singleOption (line 26) | type singleOption struct
  function commandToCompletions (line 32) | func commandToCompletions(name string, fullName string, cmd *cmds.Comman...
  function init (line 81) | func init() {
  function writeBashCompletions (line 229) | func writeBashCompletions(cmd *cmds.Command, out io.Writer) error {
  function writeFishCompletions (line 235) | func writeFishCompletions(cmd *cmds.Command, out io.Writer) error {
  function writeZshCompletions (line 240) | func writeZshCompletions(cmd *cmds.Command, out io.Writer) error {

FILE: core/commands/config.go
  type ConfigUpdateOutput (line 24) | type ConfigUpdateOutput struct
  type ConfigField (line 29) | type ConfigField struct
  constant configBoolOptionName (line 35) | configBoolOptionName   = "bool"
  constant configJSONOptionName (line 36) | configJSONOptionName   = "json"
  constant configDryRunOptionName (line 37) | configDryRunOptionName = "dry-run"
  constant configExpandAutoName (line 38) | configExpandAutoName   = "expand-auto"
  function matchesGlobPrefix (line 179) | func matchesGlobPrefix(key string, glob []string) bool {
  function scrubValue (line 276) | func scrubValue(m map[string]any, key []string) (map[string]any, error) {
  function scrubOptionalValue (line 281) | func scrubOptionalValue(m map[string]any, key []string) (map[string]any,...
  function scrubEither (line 285) | func scrubEither(u any, key []string, okIfMissing bool) (any, error) {
  function scrubValueInternal (line 293) | func scrubValueInternal(v any, key []string, okIfMissing bool) (any, err...
  function scrubMapInternal (line 300) | func scrubMapInternal(m map[string]any, key []string, okIfMissing bool) ...
  function buildProfileHelp (line 449) | func buildProfileHelp() string {
  function scrubPrivKey (line 466) | func scrubPrivKey(cfg *config.Config) (map[string]any, error) {
  function transformConfig (line 485) | func transformConfig(configRoot string, configName string, transformer c...
  function getConfig (line 523) | func getConfig(r repo.Repo, key string) (*ConfigField, error) {
  function getConfigWithAutoExpand (line 534) | func getConfigWithAutoExpand(r repo.Repo, key string) (*ConfigField, err...
  function setConfig (line 556) | func setConfig(r repo.Repo, key string, value any) (*ConfigField, error) {
  function parseEditorCommand (line 565) | func parseEditorCommand(editor string) ([]string, error) {
  function editConfig (line 569) | func editConfig(filename string) error {
  function replaceConfig (line 587) | func replaceConfig(r repo.Repo, file io.Reader) error {
  function getRemotePinningServices (line 644) | func getRemotePinningServices(r repo.Repo) (map[string]config.RemotePinn...

FILE: core/commands/config_test.go
  function TestScrubMapInternalDelete (line 5) | func TestScrubMapInternalDelete(t *testing.T) {
  function TestEditorParsing (line 18) | func TestEditorParsing(t *testing.T) {

FILE: core/commands/dag/dag.go
  constant pinRootsOptionName (line 20) | pinRootsOptionName        = "pin-roots"
  constant progressOptionName (line 21) | progressOptionName        = "progress"
  constant silentOptionName (line 22) | silentOptionName          = "silent"
  constant statsOptionName (line 23) | statsOptionName           = "stats"
  constant fastProvideRootOptionName (line 24) | fastProvideRootOptionName = "fast-provide-root"
  constant fastProvideWaitOptionName (line 25) | fastProvideWaitOptionName = "fast-provide-wait"
  type OutputObject (line 50) | type OutputObject struct
  type ResolveOutput (line 55) | type ResolveOutput struct
  type CarImportStats (line 60) | type CarImportStats struct
  type CarImportOutput (line 66) | type CarImportOutput struct
  type RootMeta (line 72) | type RootMeta struct
  type DagStat (line 296) | type DagStat struct
    method String (line 302) | func (s *DagStat) String() string {
    method MarshalJSON (line 306) | func (s *DagStat) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 322) | func (s *DagStat) UnmarshalJSON(data []byte) error {
  type DagStatSummary (line 346) | type DagStatSummary struct
    method String (line 355) | func (s *DagStatSummary) String() string {
    method incrementTotalSize (line 363) | func (s *DagStatSummary) incrementTotalSize(size uint64) {
    method incrementRedundantSize (line 367) | func (s *DagStatSummary) incrementRedundantSize(size uint64) {
    method appendStats (line 371) | func (s *DagStatSummary) appendStats(stats *DagStat) {
    method calculateSummary (line 375) | func (s *DagStatSummary) calculateSummary() {

FILE: core/commands/dag/export.go
  function dagExport (line 23) | func dagExport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Env...
  function finishCLIExport (line 101) | func finishCLIExport(res cmds.Response, re cmds.ResponseEmitter) error {
  type dagStore (line 157) | type dagStore struct
    method Get (line 162) | func (ds *dagStore) Get(ctx context.Context, key string) ([]byte, erro...
    method Has (line 180) | func (ds *dagStore) Has(ctx context.Context, key string) (bool, error) {
  function cidFromBinString (line 191) | func cidFromBinString(key string) (cid.Cid, error) {

FILE: core/commands/dag/get.go
  function dagGet (line 20) | func dagGet(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Enviro...

FILE: core/commands/dag/import.go
  function dagImport (line 25) | func dagImport(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Env...

FILE: core/commands/dag/put.go
  function dagPut (line 30) | func dagPut(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Enviro...

FILE: core/commands/dag/resolve.go
  function dagResolve (line 11) | func dagResolve(req *cmds.Request, res cmds.ResponseEmitter, env cmds.En...

FILE: core/commands/dag/stat.go
  function dagStat (line 22) | func dagStat(req *cmds.Request, res cmds.ResponseEmitter, env cmds.Envir...
  function finishCLIStat (line 91) | func finishCLIStat(res cmds.Response, re cmds.ResponseEmitter) error {

FILE: core/commands/dht.go
  type kademlia (line 35) | type kademlia interface

FILE: core/commands/dht_test.go
  function TestKeyTranslation (line 12) | func TestKeyTranslation(t *testing.T) {

FILE: core/commands/diag.go
  constant diagDatastoreHexOptionName (line 78) | diagDatastoreHexOptionName = "hex"
  type diagDatastoreGetResult (line 80) | type diagDatastoreGetResult struct
  function openDiagDatastore (line 89) | func openDiagDatastore(env cmds.Environment) (datastore.Datastore, func(...
  type diagDatastoreCountResult (line 216) | type diagDatastoreCountResult struct

FILE: core/commands/e/error.go
  function TypeErr (line 9) | func TypeErr(expected, actual any) error {
  type HandlerError (line 17) | type HandlerError struct
    method Error (line 23) | func (err HandlerError) Error() string {
  function New (line 28) | func New(err error) HandlerError {

FILE: core/commands/external.go
  function ExternalBinary (line 14) | func ExternalBinary(instructions string) *cmds.Command {

FILE: core/commands/extra.go
  function CreateCmdExtras (line 7) | func CreateCmdExtras(opts ...func(e *cmds.Extra)) *cmds.Extra {
  type doesNotUseRepo (line 15) | type doesNotUseRepo struct
  function SetDoesNotUseRepo (line 17) | func SetDoesNotUseRepo(val bool) func(e *cmds.Extra) {
  function GetDoesNotUseRepo (line 23) | func GetDoesNotUseRepo(e *cmds.Extra) (val bool, found bool) {
  type doesNotUseConfigAsInput (line 33) | type doesNotUseConfigAsInput struct
  function SetDoesNotUseConfigAsInput (line 35) | func SetDoesNotUseConfigAsInput(val bool) func(e *cmds.Extra) {
  function GetDoesNotUseConfigAsInput (line 41) | func GetDoesNotUseConfigAsInput(e *cmds.Extra) (val bool, found bool) {
  type preemptsAutoUpdate (line 47) | type preemptsAutoUpdate struct
  function SetPreemptsAutoUpdate (line 49) | func SetPreemptsAutoUpdate(val bool) func(e *cmds.Extra) {
  function GetPreemptsAutoUpdate (line 55) | func GetPreemptsAutoUpdate(e *cmds.Extra) (val bool, found bool) {
  function getBoolFlag (line 59) | func getBoolFlag(e *cmds.Extra, key any) (val bool, found bool) {

FILE: core/commands/files.go
  function updateNoFlushCounter (line 56) | func updateNoFlushCounter(nd *core.IpfsNode, flush bool) error {
  constant filesCidVersionOptionName (line 146) | filesCidVersionOptionName = "cid-version"
  constant filesHashOptionName (line 147) | filesHashOptionName       = "hash"
  type statOutput (line 157) | type statOutput struct
    method MarshalJSON (line 171) | func (s *statOutput) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 184) | func (s *statOutput) UnmarshalJSON(data []byte) error {
  constant defaultStatFormat (line 206) | defaultStatFormat = `<hash>
  constant filesFormatOptionName (line 213) | filesFormatOptionName    = "format"
  constant filesSizeOptionName (line 214) | filesSizeOptionName      = "size"
  constant filesWithLocalOptionName (line 215) | filesWithLocalOptionName = "with-local"
  constant filesStatUnspecified (line 216) | filesStatUnspecified     = "not set"
  function moreThanOne (line 341) | func moreThanOne(a, b, c bool) bool {
  function statGetFormatOptions (line 345) | func statGetFormatOptions(req *cmds.Request) (string, error) {
  function statNode (line 363) | func statNode(nd ipld.Node, enc cidenc.Encoder) (*statOutput, error) {
  function statProtoNode (line 387) | func statProtoNode(n *dag.ProtoNode, enc cidenc.Encoder, cid cid.Cid, cu...
  function walkBlock (line 425) | func walkBlock(ctx context.Context, dagserv ipld.DAGService, nd ipld.Nod...
  function getNodeFromPath (line 599) | func getNodeFromPath(ctx context.Context, node *core.IpfsNode, api iface...
  function unlinkNodeIfExists (line 618) | func unlinkNodeIfExists(node *core.IpfsNode, path string) error {
  type filesLsOutput (line 647) | type filesLsOutput struct
  constant longOptionName (line 652) | longOptionName     = "long"
  constant dontSortOptionName (line 653) | dontSortOptionName = "U"
  constant filesOffsetOptionName (line 787) | filesOffsetOptionName = "offset"
  constant filesCountOptionName (line 788) | filesCountOptionName  = "count"
  type contextReader (line 871) | type contextReader interface
  type contextReaderWrapper (line 875) | type contextReaderWrapper struct
    method Read (line 880) | func (crw *contextReaderWrapper) Read(b []byte) (int, error) {
  constant filesCreateOptionName (line 951) | filesCreateOptionName    = "create"
  constant filesParentsOptionName (line 952) | filesParentsOptionName   = "parents"
  constant filesTruncateOptionName (line 953) | filesTruncateOptionName  = "truncate"
  constant filesRawLeavesOptionName (line 954) | filesRawLeavesOptionName = "raw-leaves"
  constant filesFlushOptionName (line 955) | filesFlushOptionName     = "flush"
  type flushRes (line 1218) | type flushRes struct
  function updatePath (line 1313) | func updatePath(rt *mfs.Root, pth string, builder cid.Builder) error {
  function removePath (line 1396) | func removePath(filesRoot *mfs.Root, path string, force bool, dashr bool...
  function getPrefixNew (line 1449) | func getPrefixNew(req *cmds.Request, importCfg *config.Import) (cid.Buil...
  function getPrefix (line 1488) | func getPrefix(req *cmds.Request, importCfg *config.Import) (cid.Builder...
  function ensureContainingDirectoryExists (line 1527) | func ensureContainingDirectoryExists(r *mfs.Root, path string, builder c...
  function getFileHandle (line 1542) | func getFileHandle(r *mfs.Root, path string, create bool, builder cid.Bu...
  function checkPath (line 1594) | func checkPath(p string) (string, error) {
  function getParentDir (line 1610) | func getParentDir(root *mfs.Root, dir string) (*mfs.Directory, error) {
  constant chrootConfirmOptionName (line 1706) | chrootConfirmOptionName = "confirm"

FILE: core/commands/files_test.go
  function TestFilesCp_DagCborNodeFails (line 13) | func TestFilesCp_DagCborNodeFails(t *testing.T) {

FILE: core/commands/filestore.go
  constant fileOrderOptionName (line 30) | fileOrderOptionName       = "file-order"
  constant removeBadBlocksOptionName (line 31) | removeBadBlocksOptionName = "remove-bad-blocks"
  function getFilestore (line 253) | func getFilestore(env cmds.Environment) (*core.IpfsNode, *filestore.File...
  function listByArgs (line 265) | func listByArgs(ctx context.Context, res cmds.ResponseEmitter, fs *files...

FILE: core/commands/get.go
  constant outputOptionName (line 28) | outputOptionName           = "output"
  constant archiveOptionName (line 29) | archiveOptionName          = "archive"
  constant compressOptionName (line 30) | compressOptionName         = "compress"
  constant compressionLevelOptionName (line 31) | compressionLevelOptionName = "compression-level"
  type clearlineReader (line 159) | type clearlineReader struct
    method Read (line 164) | func (r *clearlineReader) Read(p []byte) (n int, err error) {
  function progressBarForReader (line 173) | func progressBarForReader(out io.Writer, r io.Reader, l int64) (*pb.Prog...
  function makeProgressBar (line 179) | func makeProgressBar(out io.Writer, l int64) *pb.ProgressBar {
  function getOutPath (line 195) | func getOutPath(req *cmds.Request) string {
  type getWriter (line 205) | type getWriter struct
    method Write (line 215) | func (gw *getWriter) Write(r io.Reader, fpath string) error {
    method writeArchive (line 222) | func (gw *getWriter) writeArchive(r io.Reader, fpath string) error {
    method writeExtracted (line 256) | func (gw *getWriter) writeExtracted(r io.Reader, fpath string) error {
  function getCompressOptions (line 271) | func getCompressOptions(req *cmds.Request) (int, error) {
  type identityWriteCloser (line 289) | type identityWriteCloser struct
    method Write (line 293) | func (i *identityWriteCloser) Write(p []byte) (int, error) {
    method Close (line 297) | func (i *identityWriteCloser) Close() error {
  function fileArchive (line 301) | func fileArchive(f files.Node, name string, archive bool, compression in...
  function newMaybeGzWriter (line 375) | func newMaybeGzWriter(w io.Writer, compression int) (io.WriteCloser, err...

FILE: core/commands/get_test.go
  function TestGetOutputPath (line 10) | func TestGetOutputPath(t *testing.T) {

FILE: core/commands/helptext_test.go
  function checkHelptextRecursive (line 10) | func checkHelptextRecursive(t *testing.T, name []string, c *cmds.Command) {
  function TestHelptexts (line 51) | func TestHelptexts(t *testing.T) {

FILE: core/commands/id.go
  constant offlineIDErrorMessage (line 27) | offlineIDErrorMessage = "'ipfs id' cannot query information on remote pe...
  type IdOutput (line 29) | type IdOutput struct
  constant formatOptionName (line 38) | formatOptionName   = "format"
  constant idFormatOptionName (line 39) | idFormatOptionName = "peerid-base"
  function printPeer (line 149) | func printPeer(keyEnc ke.KeyEncoder, ps pstore.Peerstore, p peer.ID) (an...
  function printSelf (line 192) | func printSelf(keyEnc ke.KeyEncoder, node *core.IpfsNode) (any, error) {

FILE: core/commands/keyencode/keyencode.go
  constant ipnsKeyFormatOptionName (line 9) | ipnsKeyFormatOptionName = "ipns-base"
  type KeyEncoder (line 13) | type KeyEncoder struct
    method FormatID (line 30) | func (enc KeyEncoder) FormatID(id peer.ID) string {
  function KeyEncoderFromString (line 17) | func KeyEncoderFromString(formatLabel string) (KeyEncoder, error) {

FILE: core/commands/keystore.go
  type KeyOutput (line 62) | type KeyOutput struct
  type KeyOutputList (line 67) | type KeyOutputList struct
  type KeyRenameOutput (line 72) | type KeyRenameOutput struct
  constant keyStoreAlgorithmDefault (line 80) | keyStoreAlgorithmDefault = options.Ed25519Key
  constant keyStoreTypeOptionName (line 81) | keyStoreTypeOptionName   = "type"
  constant keyStoreSizeOptionName (line 82) | keyStoreSizeOptionName   = "size"
  constant oldKeyOptionName (line 83) | oldKeyOptionName         = "oldkey"
  constant keyFormatOptionName (line 146) | keyFormatOptionName            = "format"
  constant keyFormatPemCleartextOption (line 147) | keyFormatPemCleartextOption    = "pem-pkcs8-cleartext"
  constant keyFormatLibp2pCleartextOption (line 148) | keyFormatLibp2pCleartextOption = "libp2p-protobuf-cleartext"
  constant keyAllowAnyTypeOptionName (line 149) | keyAllowAnyTypeOptionName      = "allow-any-key-type"
  constant keyStoreForceOptionName (line 504) | keyStoreForceOptionName = "force"
  function doRotate (line 640) | func doRotate(out io.Writer, repoRoot string, oldKey string, algorithm s...
  function keyOutputListEncoders (line 690) | func keyOutputListEncoders() cmds.EncoderFunc {
  type KeySignOutput (line 707) | type KeySignOutput struct
  type KeyVerifyOutput (line 773) | type KeyVerifyOutput struct
  function DaemonNotRunning (line 842) | func DaemonNotRunning(req *cmds.Request, env cmds.Environment) error {

FILE: core/commands/log.go
  constant allLogSubsystems (line 15) | allLogSubsystems = "*"
  constant allLogSubsystemsAlias (line 18) | allLogSubsystemsAlias = "all"
  constant defaultLogLevel (line 21) | defaultLogLevel = "default"
  constant defaultSubsystemKey (line 25) | defaultSubsystemKey = "(default)"
  constant logLevelOption (line 28) | logLevelOption = "log-level"
  constant noSubsystemSpecified (line 30) | noSubsystemSpecified = ""
  type logLevelOutput (line 33) | type logLevelOutput struct

FILE: core/commands/ls.go
  type LsLink (line 24) | type LsLink struct
  type LsObject (line 35) | type LsObject struct
  type LsOutput (line 42) | type LsOutput struct
  constant lsHeadersOptionNameTime (line 47) | lsHeadersOptionNameTime = "headers"
  constant lsResolveTypeOptionName (line 48) | lsResolveTypeOptionName = "resolve-type"
  constant lsSizeOptionName (line 49) | lsSizeOptionName        = "size"
  constant lsStreamOptionName (line 50) | lsStreamOptionName      = "stream"
  constant lsLongOptionName (line 51) | lsLongOptionName        = "long"
  function formatMode (line 249) | func formatMode(mode os.FileMode) string {
  function permBit (line 318) | func permBit(mode os.FileMode, bit os.FileMode, char byte) byte {
  function formatModTime (line 332) | func formatModTime(t time.Time) string {
  function tabularOutput (line 348) | func tabularOutput(req *cmds.Request, w io.Writer, out *LsOutput, lastOb...

FILE: core/commands/ls_test.go
  function TestFormatMode (line 11) | func TestFormatMode(t *testing.T) {
  function TestFormatModTime (line 141) | func TestFormatModTime(t *testing.T) {

FILE: core/commands/mount_unix.go
  constant mountIPFSPathOptionName (line 18) | mountIPFSPathOptionName = "ipfs-path"
  constant mountIPNSPathOptionName (line 19) | mountIPNSPathOptionName = "ipns-path"
  constant mountMFSPathOptionName (line 20) | mountMFSPathOptionName  = "mfs-path"

FILE: core/commands/multibase.go
  constant mbaseOptionName (line 28) | mbaseOptionName = "b"

FILE: core/commands/name/ipns.go
  type ResolvedPath (line 20) | type ResolvedPath struct
  constant recursiveOptionName (line 25) | recursiveOptionName      = "recursive"
  constant nocacheOptionName (line 26) | nocacheOptionName        = "nocache"
  constant dhtRecordCountOptionName (line 27) | dhtRecordCountOptionName = "dht-record-count"
  constant dhtTimeoutOptionName (line 28) | dhtTimeoutOptionName     = "dht-timeout"
  constant streamOptionName (line 29) | streamOptionName         = "stream"

FILE: core/commands/name/ipnsps.go
  type ipnsPubsubState (line 15) | type ipnsPubsubState struct
  type ipnsPubsubCancel (line 19) | type ipnsPubsubCancel struct
  type stringList (line 23) | type stringList struct
  function stringListEncoder (line 166) | func stringListEncoder() cmds.EncoderFunc {

FILE: core/commands/name/name.go
  type IpnsEntry (line 21) | type IpnsEntry struct
  type IpnsInspectValidation (line 86) | type IpnsInspectValidation struct
  type IpnsInspectEntry (line 94) | type IpnsInspectEntry struct
  type IpnsInspectResult (line 102) | type IpnsInspectResult struct
  constant forceOptionName (line 333) | forceOptionName       = "force"
  constant putAllowOfflineOption (line 334) | putAllowOfflineOption = "allow-offline"
  constant allowDelegatedOption (line 335) | allowDelegatedOption  = "allow-delegated"
  constant putQuietOptionName (line 336) | putQuietOptionName    = "quiet"
  constant maxIPNSRecordSize (line 337) | maxIPNSRecordSize     = 10 << 10

FILE: core/commands/name/publish.go
  constant ipfsPathOptionName (line 22) | ipfsPathOptionName       = "ipfs-path"
  constant resolveOptionName (line 23) | resolveOptionName        = "resolve"
  constant allowOfflineOptionName (line 24) | allowOfflineOptionName   = "allow-offline"
  constant allowDelegatedOptionName (line 25) | allowDelegatedOptionName = "allow-delegated"
  constant lifeTimeOptionName (line 26) | lifeTimeOptionName       = "lifetime"
  constant ttlOptionName (line 27) | ttlOptionName            = "ttl"
  constant keyOptionName (line 28) | keyOptionName            = "key"
  constant quieterOptionName (line 29) | quieterOptionName        = "quieter"
  constant v1compatOptionName (line 30) | v1compatOptionName       = "v1compat"
  constant sequenceOptionName (line 31) | sequenceOptionName       = "sequence"

FILE: core/commands/object/diff.go
  constant verboseOptionName (line 16) | verboseOptionName = "verbose"
  type Changes (line 19) | type Changes struct

FILE: core/commands/object/object.go
  type Link (line 9) | type Link struct
  type Object (line 14) | type Object struct

FILE: core/commands/object/patch.go
  constant createOptionName (line 97) | createOptionName = "create"

FILE: core/commands/p2p.go
  constant P2PProtoPrefix (line 26) | P2PProtoPrefix = "/x/"
  type P2PListenerInfoOutput (line 29) | type P2PListenerInfoOutput struct
  type P2PStreamInfoOutput (line 36) | type P2PStreamInfoOutput struct
  type P2PLsOutput (line 44) | type P2PLsOutput struct
  type P2PStreamsOutput (line 49) | type P2PStreamsOutput struct
  type P2PForegroundOutput (line 54) | type P2PForegroundOutput struct
  constant allowCustomProtocolOptionName (line 61) | allowCustomProtocolOptionName = "allow-custom-protocol"
  constant reportPeerIDOptionName (line 62) | reportPeerIDOptionName        = "report-peer-id"
  constant foregroundOptionName (line 63) | foregroundOptionName          = "foreground"
  function parseIpfsAddr (line 213) | func parseIpfsAddr(addr string) (*peer.AddrInfo, error) {
  function checkPort (line 386) | func checkPort(target ma.Multiaddr) error {
  function forwardLocal (line 419) | func forwardLocal(ctx context.Context, p *p2p.P2P, ps pstore.Peerstore, ...
  constant p2pHeadersOptionName (line 425) | p2pHeadersOptionName = "headers"
  constant p2pAllOptionName (line 486) | p2pAllOptionName           = "all"
  constant p2pProtocolOptionName (line 487) | p2pProtocolOptionName      = "protocol"
  constant p2pListenAddressOptionName (line 488) | p2pListenAddressOptionName = "listen-address"
  constant p2pTargetAddressOptionName (line 489) | p2pTargetAddressOptionName = "target-address"
  function p2pGetNode (line 690) | func p2pGetNode(env cmds.Environment) (*core.IpfsNode, error) {

FILE: core/commands/pin/pin.go
  type PinOutput (line 44) | type PinOutput struct
  type AddPinOutput (line 48) | type AddPinOutput struct
  constant pinRecursiveOptionName (line 55) | pinRecursiveOptionName = "recursive"
  constant pinProgressOptionName (line 56) | pinProgressOptionName  = "progress"
  function pinAddMany (line 215) | func pinAddMany(ctx context.Context, api coreiface.CoreAPI, enc cidenc.E...
  constant pinTypeOptionName (line 312) | pinTypeOptionName   = "type"
  constant pinQuietOptionName (line 313) | pinQuietOptionName  = "quiet"
  constant pinStreamOptionName (line 314) | pinStreamOptionName = "stream"
  constant pinNamesOptionName (line 315) | pinNamesOptionName  = "names"
  type PinLsOutputWrapper (line 483) | type PinLsOutputWrapper struct
  type PinLsList (line 489) | type PinLsList struct
  type PinLsType (line 494) | type PinLsType struct
  type PinLsObject (line 500) | type PinLsObject struct
  function pinLsKeys (line 506) | func pinLsKeys(req *cmds.Request, mode pin.Mode, displayNames bool, pinn...
  function pinLsAll (line 560) | func pinLsAll(req *cmds.Request, typeStr string, detailed bool, name str...
  constant pinUnpinOptionName (line 601) | pinUnpinOptionName = "unpin"
  constant pinVerboseOptionName (line 676) | pinVerboseOptionName = "verbose"
  type PinVerifyRes (line 732) | type PinVerifyRes struct
    method Format (line 825) | func (r PinVerifyRes) Format(out io.Writer) {
  type PinStatus (line 739) | type PinStatus struct
  type BadNode (line 745) | type BadNode struct
  type pinVerifyOpts (line 750) | type pinVerifyOpts struct
  function pinVerify (line 756) | func pinVerify(ctx context.Context, n *core.IpfsNode, opts pinVerifyOpts...

FILE: core/commands/pin/remotepin.go
  constant pinNameOptionName (line 58) | pinNameOptionName         = "name"
  constant pinCIDsOptionName (line 59) | pinCIDsOptionName         = "cid"
  constant pinStatusOptionName (line 60) | pinStatusOptionName       = "status"
  constant pinServiceNameOptionName (line 61) | pinServiceNameOptionName  = "service"
  constant pinServiceNameArgName (line 62) | pinServiceNameArgName     = pinServiceNameOptionName
  constant pinServiceEndpointArgName (line 63) | pinServiceEndpointArgName = "endpoint"
  constant pinServiceKeyArgName (line 64) | pinServiceKeyArgName      = "key"
  constant pinServiceStatOptionName (line 65) | pinServiceStatOptionName  = "stat"
  constant pinBackgroundOptionName (line 66) | pinBackgroundOptionName   = "background"
  constant pinForceOptionName (line 67) | pinForceOptionName        = "force"
  type RemotePinOutput (line 70) | type RemotePinOutput struct
  function toRemotePinOutput (line 76) | func toRemotePinOutput(ps pinclient.PinStatusGetter) RemotePinOutput {
  function printRemotePinDetails (line 84) | func printRemotePinDetails(w io.Writer, out *RemotePinOutput) {
  function lsRemote (line 324) | func lsRemote(ctx context.Context, req *cmds.Request, c *pinclient.Clien...
  type ServiceDetails (line 690) | type ServiceDetails struct
  type Stat (line 696) | type Stat struct
  type PinCount (line 701) | type PinCount struct
  type PinServicesList (line 709) | type PinServicesList struct
    method Len (line 713) | func (l PinServicesList) Len() int {
    method Swap (line 717) | func (l PinServicesList) Swap(i, j int) {
    method Less (line 722) | func (l PinServicesList) Less(i, j int) bool {
  function getRemotePinServiceFromRequest (line 727) | func getRemotePinServiceFromRequest(req *cmds.Request, env cmds.Environm...
  function getRemotePinService (line 743) | func getRemotePinService(env cmds.Environment, name string) (*pinclient....
  function getRemotePinServiceInfo (line 754) | func getRemotePinServiceInfo(env cmds.Environment, name string) (endpoin...
  function normalizeEndpoint (line 782) | func normalizeEndpoint(endpoint string) (string, error) {

FILE: core/commands/pin/remotepin_test.go
  function TestNormalizeEndpoint (line 7) | func TestNormalizeEndpoint(t *testing.T) {

FILE: core/commands/ping.go
  constant kPingTimeout (line 20) | kPingTimeout = 10 * time.Second
  type PingResult (line 22) | type PingResult struct
  constant pingCountOptionName (line 29) | pingCountOptionName = "count"
  function ParsePeerParam (line 206) | func ParsePeerParam(text string) (ma.Multiaddr, peer.ID, error) {

FILE: core/commands/profile.go
  type profileResult (line 19) | type profileResult struct
  constant collectorsOptionName (line 24) | collectorsOptionName       = "collectors"
  constant profileTimeOption (line 25) | profileTimeOption          = "profile-time"
  constant mutexProfileFractionOption (line 26) | mutexProfileFractionOption = "mutex-profile-fraction"
  constant blockProfileRateOption (line 27) | blockProfileRateOption     = "block-profile-rate"

FILE: core/commands/provide.go
  constant provideQuietOptionName (line 29) | provideQuietOptionName = "quiet"
  constant provideLanOptionName (line 30) | provideLanOptionName   = "lan"
  constant provideStatAllOptionName (line 32) | provideStatAllOptionName          = "all"
  constant provideStatCompactOptionName (line 33) | provideStatCompactOptionName      = "compact"
  constant provideStatNetworkOptionName (line 34) | provideStatNetworkOptionName      = "network"
  constant provideStatConnectivityOptionName (line 35) | provideStatConnectivityOptionName = "connectivity"
  constant provideStatOperationsOptionName (line 36) | provideStatOperationsOptionName   = "operations"
  constant provideStatTimingsOptionName (line 37) | provideStatTimingsOptionName      = "timings"
  constant provideStatScheduleOptionName (line 38) | provideStatScheduleOptionName     = "schedule"
  constant provideStatQueuesOptionName (line 39) | provideStatQueuesOptionName       = "queues"
  constant provideStatWorkersOptionName (line 40) | provideStatWorkersOptionName      = "workers"
  constant lowWorkerThreshold (line 43) | lowWorkerThreshold = 2
  type provideStats (line 133) | type provideStats struct
  function extractSweepingProvider (line 142) | func extractSweepingProvider(prov any, useLAN bool) *provider.SweepingPr...
  function humanDuration (line 519) | func humanDuration(val time.Duration) string {
  function humanDurationOrNA (line 526) | func humanDurationOrNA(val time.Duration) string {
  function humanTime (line 533) | func humanTime(val time.Time) string {
  function humanNumber (line 540) | func humanNumber[T constraints.Float | constraints.Integer](n T) string {
  function humanNumberOrNA (line 551) | func humanNumberOrNA[T constraints.Float | constraints.Integer](n T) str...
  function humanFloatOrNA (line 561) | func humanFloatOrNA(val float64) string {
  function humanSI (line 568) | func humanSI[T constraints.Float | constraints.Integer](val T, decimals ...
  function humanInt (line 573) | func humanInt[T constraints.Integer](val T) string {
  function humanFull (line 577) | func humanFull(val float64, decimals int) string {
  function provideCIDSync (line 593) | func provideCIDSync(ctx context.Context, router routing.Routing, c cid.C...

FILE: core/commands/pubsub.go
  type pubsubMessage (line 51) | type pubsubMessage struct
  function multibaseDecodedStringListEncoder (line 264) | func multibaseDecodedStringListEncoder(req *cmds.Request, w io.Writer, l...
  function safeTextListEncoder (line 278) | func safeTextListEncoder(req *cmds.Request, w io.Writer, list *stringLis...
  function urlArgsEncoder (line 354) | func urlArgsEncoder(req *cmds.Request, env cmds.Environment) error {
  function urlArgsDecoder (line 364) | func urlArgsDecoder(req *cmds.Request, env cmds.Environment) error {
  type pubsubResetResult (line 385) | type pubsubResetResult struct

FILE: core/commands/refs.go
  type KeyList (line 33) | type KeyList struct
  constant refsFormatOptionName (line 38) | refsFormatOptionName    = "format"
  constant refsEdgesOptionName (line 39) | refsEdgesOptionName     = "edges"
  constant refsUniqueOptionName (line 40) | refsUniqueOptionName    = "unique"
  constant refsRecursiveOptionName (line 41) | refsRecursiveOptionName = "recursive"
  constant refsMaxDepthOptionName (line 42) | refsMaxDepthOptionName  = "max-depth"
  function objectsForPaths (line 171) | func objectsForPaths(ctx context.Context, n iface.CoreAPI, paths []strin...
  type RefWrapper (line 187) | type RefWrapper struct
  type RefWriter (line 192) | type RefWriter struct
    method WriteRefs (line 205) | func (rw *RefWriter) WriteRefs(c cid.Cid, enc cidenc.Encoder) (int, er...
    method writeRefsRecursive (line 213) | func (rw *RefWriter) writeRefsRecursive(n ipld.Node, depth int, enc ci...
    method visit (line 275) | func (rw *RefWriter) visit(c cid.Cid, depth int) (bool, bool) {
    method WriteEdge (line 324) | func (rw *RefWriter) WriteEdge(from, to cid.Cid, linkname string, enc ...

FILE: core/commands/repo.go
  type RepoVersion (line 28) | type RepoVersion struct
  type GcResult (line 51) | type GcResult struct
  constant repoStreamErrorsOptionName (line 57) | repoStreamErrorsOptionName   = "stream-errors"
  constant repoQuietOptionName (line 58) | repoQuietOptionName          = "quiet"
  constant repoSilentOptionName (line 59) | repoSilentOptionName         = "silent"
  constant repoAllowDowngradeOptionName (line 60) | repoAllowDowngradeOptionName = "allow-downgrade"
  constant repoToVersionOptionName (line 61) | repoToVersionOptionName      = "to"
  constant repoSizeOnlyOptionName (line 150) | repoSizeOnlyOptionName = "size-only"
  constant repoHumanOptionName (line 151) | repoHumanOptionName    = "human"
  type VerifyProgress (line 233) | type VerifyProgress struct
  type verifyState (line 240) | type verifyState
  constant verifyStateValid (line 243) | verifyStateValid               verifyState = iota
  constant verifyStateCorrupt (line 244) | verifyStateCorrupt
  constant verifyStateCorruptRemoved (line 245) | verifyStateCorruptRemoved
  constant verifyStateCorruptRemoveFailed (line 246) | verifyStateCorruptRemoveFailed
  constant verifyStateCorruptHealed (line 247) | verifyStateCorruptHealed
  constant verifyStateCorruptHealFailed (line 248) | verifyStateCorruptHealFailed
  constant verifyWorkerMultiplier (line 255) | verifyWorkerMultiplier = 2
  type verifyResult (line 261) | type verifyResult struct
  function verifyWorkerRun (line 272) | func verifyWorkerRun(ctx context.Context, wg *sync.WaitGroup, keys <-cha...
  function verifyResultChan (line 351) | func verifyResultChan(ctx context.Context, keys <-chan cid.Cid, bs bstor...

FILE: core/commands/repo_verify_test.go
  function TestVerifyWorkerHealTimeout (line 32) | func TestVerifyWorkerHealTimeout(t *testing.T) {
  type mockBlockstore (line 266) | type mockBlockstore struct
    method Get (line 271) | func (m *mockBlockstore) Get(ctx context.Context, c cid.Cid) (blocks.B...
    method DeleteBlock (line 278) | func (m *mockBlockstore) DeleteBlock(ctx context.Context, c cid.Cid) e...
    method Has (line 282) | func (m *mockBlockstore) Has(ctx context.Context, c cid.Cid) (bool, er...
    method GetSize (line 286) | func (m *mockBlockstore) GetSize(ctx context.Context, c cid.Cid) (int,...
    method Put (line 293) | func (m *mockBlockstore) Put(ctx context.Context, b blocks.Block) error {
    method PutMany (line 297) | func (m *mockBlockstore) PutMany(ctx context.Context, bs []blocks.Bloc...
    method AllKeysChan (line 301) | func (m *mockBlockstore) AllKeysChan(ctx context.Context) (<-chan cid....
    method HashOnRead (line 305) | func (m *mockBlockstore) HashOnRead(enabled bool) {
  type mockBlockAPI (line 309) | type mockBlockAPI struct
    method Get (line 315) | func (m *mockBlockAPI) Get(ctx context.Context, p path.Path) (io.Reade...
    method Put (line 330) | func (m *mockBlockAPI) Put(ctx context.Context, r io.Reader, opts ...o...
    method Rm (line 334) | func (m *mockBlockAPI) Rm(ctx context.Context, p path.Path, opts ...op...
    method Stat (line 338) | func (m *mockBlockAPI) Stat(ctx context.Context, p path.Path) (coreifa...
  type mockCoreAPI (line 343) | type mockCoreAPI struct
    method Block (line 347) | func (m *mockCoreAPI) Block() coreiface.BlockAPI {
    method Unixfs (line 351) | func (m *mockCoreAPI) Unixfs() coreiface.UnixfsAPI   { return nil }
    method Dag (line 352) | func (m *mockCoreAPI) Dag() coreiface.APIDagService  { return nil }
    method Name (line 353) | func (m *mockCoreAPI) Name() coreiface.NameAPI       { return nil }
    method Key (line 354) | func (m *mockCoreAPI) Key() coreiface.KeyAPI         { return nil }
    method Pin (line 355) | func (m *mockCoreAPI) Pin() coreiface.PinAPI         { return nil }
    method Object (line 356) | func (m *mockCoreAPI) Object() coreiface.ObjectAPI   { return nil }
    method Swarm (line 357) | func (m *mockCoreAPI) Swarm() coreiface.SwarmAPI     { return nil }
    method PubSub (line 358) | func (m *mockCoreAPI) PubSub() coreiface.PubSubAPI   { return nil }
    method Routing (line 359) | func (m *mockCoreAPI) Routing() coreiface.RoutingAPI { return nil }
    method ResolvePath (line 361) | func (m *mockCoreAPI) ResolvePath(ctx context.Context, p path.Path) (p...
    method ResolveNode (line 365) | func (m *mockCoreAPI) ResolveNode(ctx context.Context, p path.Path) (i...
    method WithOptions (line 369) | func (m *mockCoreAPI) WithOptions(...options.ApiOption) (coreiface.Cor...

FILE: core/commands/resolve.go
  constant resolveRecursiveOptionName (line 22) | resolveRecursiveOptionName      = "recursive"
  constant resolveDhtRecordCountOptionName (line 23) | resolveDhtRecordCountOptionName = "dht-record-count"
  constant resolveDhtTimeoutOptionName (line 24) | resolveDhtTimeoutOptionName     = "dht-timeout"

FILE: core/commands/root.go
  constant RepoDirOption (line 24) | RepoDirOption    = "repo-dir"
  constant ConfigFileOption (line 25) | ConfigFileOption = "config-file"
  constant ConfigOption (line 26) | ConfigOption     = "config"
  constant DebugOption (line 27) | DebugOption      = "debug"
  constant LocalOption (line 28) | LocalOption      = "local"
  constant OfflineOption (line 29) | OfflineOption    = "offline"
  constant ApiOption (line 30) | ApiOption        = "api"
  constant ApiAuthOption (line 31) | ApiAuthOption    = "api-auth"
  function init (line 167) | func init() {
  type MessageOutput (line 172) | type MessageOutput struct

FILE: core/commands/root_test.go
  function TestCommandTree (line 7) | func TestCommandTree(t *testing.T) {

FILE: core/commands/routing.go
  constant dhtVerboseOptionName (line 33) | dhtVerboseOptionName   = "verbose"
  constant numProvidersOptionName (line 34) | numProvidersOptionName = "num-providers"
  constant allowOfflineOptionName (line 35) | allowOfflineOptionName = "allow-offline"
  constant recursiveOptionName (line 141) | recursiveOptionName = "recursive"
  function provideCids (line 314) | func provideCids(prov node.DHTProvider, cids []cid.Cid) error {
  function provideCidsRec (line 323) | func provideCidsRec(ctx context.Context, prov node.DHTProvider, dserv ip...
  type printFunc (line 559) | type printFunc
  type pfuncMap (line 560) | type pfuncMap
  function printEvent (line 563) | func printEvent(obj *routing.QueryEvent, out io.Writer, verbose bool, ov...
  function escapeDhtKey (line 614) | func escapeDhtKey(s string) (string, error) {

FILE: core/commands/stat.go
  constant statPeerOptionName (line 40) | statPeerOptionName     = "peer"
  constant statProtoOptionName (line 41) | statProtoOptionName    = "proto"
  constant statPollOptionName (line 42) | statPollOptionName     = "poll"
  constant statIntervalOptionName (line 43) | statIntervalOptionName = "interval"
  function printStats (line 191) | func printStats(out io.Writer, bs *metrics.Stats) {

FILE: core/commands/stat_dht.go
  type dhtPeerInfo (line 20) | type dhtPeerInfo struct
  type dhtStat (line 28) | type dhtStat struct
  type dhtBucket (line 33) | type dhtBucket struct

FILE: core/commands/swarm.go
  constant dnsResolveTimeout (line 39) | dnsResolveTimeout = 10 * time.Second
  type stringList (line 42) | type stringList struct
  type addrMap (line 46) | type addrMap struct
  constant swarmVerboseOptionName (line 72) | swarmVerboseOptionName           = "verbose"
  constant swarmStreamsOptionName (line 73) | swarmStreamsOptionName           = "streams"
  constant swarmLatencyOptionName (line 74) | swarmLatencyOptionName           = "latency"
  constant swarmDirectionOptionName (line 75) | swarmDirectionOptionName         = "direction"
  constant swarmResetLimitsOptionName (line 76) | swarmResetLimitsOptionName       = "reset"
  constant swarmUsedResourcesPercentageName (line 77) | swarmUsedResourcesPercentageName = "min-used-limit-perc"
  constant swarmIdentifyOptionName (line 78) | swarmIdentifyOptionName          = "identify"
  type peeringResult (line 81) | type peeringResult struct
  type addrInfos (line 189) | type addrInfos struct
  type streamInfo (line 427) | type streamInfo struct
  type connInfo (line 431) | type connInfo struct
    method Sort (line 441) | func (ci *connInfo) Sort() {
    method identifyPeer (line 457) | func (ci *connInfo) identifyPeer(ps pstore.Peerstore, p peer.ID) (IdOu...
  type connInfos (line 447) | type connInfos struct
    method Sort (line 451) | func (ci *connInfos) Sort() {
  function directionString (line 497) | func directionString(d inet.Direction) string {
  function parseAddresses (line 761) | func parseAddresses(ctx context.Context, addrs []string, rslv *madns.Res...
  function resolveAddresses (line 772) | func resolveAddresses(ctx context.Context, addrs []string, rslv *madns.R...
  function filtersAdd (line 1003) | func filtersAdd(r repo.Repo, cfg *config.Config, filters []string) ([]st...
  function filtersRemoveAll (line 1039) | func filtersRemoveAll(r repo.Repo, cfg *config.Config) ([]string, error) {
  function filtersRemove (line 1050) | func filtersRemove(r repo.Repo, cfg *config.Config, toRemoveFilters []st...

FILE: core/commands/swarm_addrs_autonat.go
  type reachabilityHost (line 14) | type reachabilityHost interface
  type confirmedAddrsHost (line 19) | type confirmedAddrsHost interface
  type autoNATResult (line 24) | type autoNATResult struct
  function multiaddrsToStrings (line 31) | func multiaddrsToStrings(addrs []ma.Multiaddr) []string {
  function writeAddrSection (line 39) | func writeAddrSection(w io.Writer, label string, addrs []string) {

FILE: core/commands/sysdiag.go
  function getInfo (line 37) | func getInfo(nd *core.IpfsNode) (map[string]any, error) {
  function runtimeInfo (line 69) | func runtimeInfo(out map[string]any) error {
  function envVarInfo (line 83) | func envVarInfo(out map[string]any) error {
  function diskSpaceInfo (line 92) | func diskSpaceInfo(out map[string]any) error {
  function memInfo (line 111) | func memInfo(out map[string]any) error {
  function netInfo (line 125) | func netInfo(online bool, out map[string]any) error {

FILE: core/commands/version.go
  constant versionNumberOptionName (line 22) | versionNumberOptionName         = "number"
  constant versionCommitOptionName (line 23) | versionCommitOptionName         = "commit"
  constant versionRepoOptionName (line 24) | versionRepoOptionName           = "repo"
  constant versionAllOptionName (line 25) | versionAllOptionName            = "all"
  constant versionCheckThresholdOptionName (line 26) | versionCheckThresholdOptionName = "min-percent"
  type Dependency (line 90) | type Dependency struct
  constant pkgVersionFmt (line 97) | pkgVersionFmt = "%s@%s"
  constant DefaultMinimalVersionFraction (line 143) | DefaultMinimalVersionFraction = 0.05
  type VersionCheckOutput (line 145) | type VersionCheckOutput struct
  function DetectNewKuboVersion (line 200) | func DetectNewKuboVersion(nd *core.IpfsNode, minPercent int64) (VersionC...

FILE: core/core.go
  type IpfsNode (line 67) | type IpfsNode struct
    method Close (line 144) | func (n *IpfsNode) Close() error {
    method HasActiveDHTClient (line 161) | func (n *IpfsNode) HasActiveDHTClient() bool {
    method Context (line 185) | func (n *IpfsNode) Context() context.Context {
    method Bootstrap (line 193) | func (n *IpfsNode) Bootstrap(cfg bootstrap.BootstrapConfig) error {
    method loadBootstrapPeers (line 248) | func (n *IpfsNode) loadBootstrapPeers() ([]peer.AddrInfo, error) {
    method saveTempBootstrapPeers (line 258) | func (n *IpfsNode) saveTempBootstrapPeers(ctx context.Context, peerLis...
    method loadTempBootstrapPeers (line 271) | func (n *IpfsNode) loadTempBootstrapPeers(ctx context.Context) ([]peer...
  type Mounts (line 137) | type Mounts struct
  type ConstructPeerHostOpts (line 285) | type ConstructPeerHostOpts struct

FILE: core/core_test.go
  function TestInitialization (line 28) | func TestInitialization(t *testing.T) {
  function mockHostOption (line 84) | func mockHostOption(mn mocknet.Mocknet) libp2p.HostOption {
  function TestHasActiveDHTClient (line 99) | func TestHasActiveDHTClient(t *testing.T) {

FILE: core/coreapi/block.go
  type BlockAPI (line 22) | type BlockAPI
    method Put (line 29) | func (api *BlockAPI) Put(ctx context.Context, src io.Reader, opts ...c...
    method Get (line 74) | func (api *BlockAPI) Get(ctx context.Context, p path.Path) (io.Reader,...
    method Rm (line 90) | func (api *BlockAPI) Rm(ctx context.Context, p path.Path, opts ...caop...
    method Stat (line 131) | func (api *BlockAPI) Stat(ctx context.Context, p path.Path) (coreiface...
    method core (line 159) | func (api *BlockAPI) core() coreiface.CoreAPI {
  type BlockStat (line 24) | type BlockStat struct
    method Size (line 151) | func (bs *BlockStat) Size() int {
    method Path (line 155) | func (bs *BlockStat) Path() path.ImmutablePath {

FILE: core/coreapi/coreapi.go
  type CoreAPI (line 46) | type CoreAPI struct
    method Unixfs (line 96) | func (api *CoreAPI) Unixfs() coreiface.UnixfsAPI {
    method Block (line 101) | func (api *CoreAPI) Block() coreiface.BlockAPI {
    method Dag (line 106) | func (api *CoreAPI) Dag() coreiface.APIDagService {
    method Name (line 114) | func (api *CoreAPI) Name() coreiface.NameAPI {
    method Key (line 119) | func (api *CoreAPI) Key() coreiface.KeyAPI {
    method Object (line 124) | func (api *CoreAPI) Object() coreiface.ObjectAPI {
    method Pin (line 129) | func (api *CoreAPI) Pin() coreiface.PinAPI {
    method Swarm (line 134) | func (api *CoreAPI) Swarm() coreiface.SwarmAPI {
    method PubSub (line 139) | func (api *CoreAPI) PubSub() coreiface.PubSubAPI {
    method Routing (line 144) | func (api *CoreAPI) Routing() coreiface.RoutingAPI {
    method WithOptions (line 149) | func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface....
    method getSession (line 256) | func (api *CoreAPI) getSession(ctx context.Context) *CoreAPI {
  function NewCoreAPI (line 86) | func NewCoreAPI(n *core.IpfsNode, opts ...options.ApiOption) (coreiface....

FILE: core/coreapi/dag.go
  type dagAPI (line 16) | type dagAPI struct
    method Pinning (line 63) | func (api *dagAPI) Pinning() ipld.NodeAdder {
    method Session (line 67) | func (api *dagAPI) Session(ctx context.Context) ipld.NodeGetter {
  type pinningAdder (line 22) | type pinningAdder
    method Add (line 24) | func (adder *pinningAdder) Add(ctx context.Context, nd ipld.Node) error {
    method AddMany (line 40) | func (adder *pinningAdder) AddMany(ctx context.Context, nds []ipld.Nod...

FILE: core/coreapi/key.go
  type KeyAPI (line 21) | type KeyAPI
    method Generate (line 58) | func (api *KeyAPI) Generate(ctx context.Context, name string, opts ......
    method List (line 118) | func (api *KeyAPI) List(ctx context.Context) ([]coreiface.Key, error) {
    method Rename (line 161) | func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName...
    method Remove (line 231) | func (api *KeyAPI) Remove(ctx context.Context, name string) (coreiface...
    method Self (line 261) | func (api *KeyAPI) Self(ctx context.Context) (coreiface.Key, error) {
    method Sign (line 271) | func (api *KeyAPI) Sign(ctx context.Context, name string, data []byte)...
    method Verify (line 306) | func (api *KeyAPI) Verify(ctx context.Context, keyOrName string, signa...
  type key (line 23) | type key struct
    method Name (line 42) | func (k *key) Name() string {
    method Path (line 47) | func (k *key) Path() path.Path {
    method ID (line 52) | func (k *key) ID() peer.ID {
  function newKey (line 29) | func newKey(name string, pid peer.ID) (*key, error) {
  constant signedMessagePrefix (line 269) | signedMessagePrefix = "libp2p-key signed message:"

FILE: core/coreapi/name.go
  type NameAPI (line 24) | type NameAPI
    method Publish (line 27) | func (api *NameAPI) Publish(ctx context.Context, p path.Path, opts ......
    method Search (line 102) | func (api *NameAPI) Search(ctx context.Context, name string, opts ...c...
    method Resolve (line 154) | func (api *NameAPI) Resolve(ctx context.Context, name string, opts ......
  function keylookup (line 179) | func keylookup(self ci.PrivKey, kstore keystore.Keystore, k string) (ci....

FILE: core/coreapi/object.go
  type ObjectAPI (line 18) | type ObjectAPI
    method AddLink (line 30) | func (api *ObjectAPI) AddLink(ctx context.Context, base path.Path, nam...
    method RmLink (line 79) | func (api *ObjectAPI) RmLink(ctx context.Context, base path.Path, link...
    method Diff (line 111) | func (api *ObjectAPI) Diff(ctx context.Context, before path.Path, afte...
    method core (line 152) | func (api *ObjectAPI) core() coreiface.CoreAPI {
  type Link (line 20) | type Link struct
  type Node (line 25) | type Node struct

FILE: core/coreapi/path.go
  method ResolveNode (line 22) | func (api *CoreAPI) ResolveNode(ctx context.Context, p path.Path) (ipld....
  method ResolvePath (line 40) | func (api *CoreAPI) ResolvePath(ctx context.Context, p path.Path) (path....

FILE: core/coreapi/pin.go
  type PinAPI (line 22) | type PinAPI
    method Add (line 24) | func (api *PinAPI) Add(ctx context.Context, p path.Path, opts ...caopt...
    method Ls (line 50) | func (api *PinAPI) Ls(ctx context.Context, pins chan<- coreiface.Pin, ...
    method IsPinned (line 72) | func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ......
    method Rm (line 97) | func (api *PinAPI) Rm(ctx context.Context, p path.Path, opts ...caopts...
    method Update (line 124) | func (api *PinAPI) Update(ctx context.Context, from path.Path, to path...
    method Verify (line 191) | func (api *PinAPI) Verify(ctx context.Context) (<-chan coreiface.PinSt...
    method pinLsAll (line 274) | func (api *PinAPI) pinLsAll(ctx context.Context, typeStr string, detai...
    method core (line 368) | func (api *PinAPI) core() coreiface.CoreAPI {
  type pinStatus (line 158) | type pinStatus struct
    method Ok (line 171) | func (s *pinStatus) Ok() bool {
    method BadNodes (line 175) | func (s *pinStatus) BadNodes() []coreiface.BadPinNode {
    method Err (line 179) | func (s *pinStatus) Err() error {
  type badNode (line 166) | type badNode struct
    method Path (line 183) | func (n *badNode) Path() path.ImmutablePath {
    method Err (line 187) | func (n *badNode) Err() error {
  type pinInfo (line 252) | type pinInfo struct
    method Path (line 258) | func (p *pinInfo) Path() path.ImmutablePath {
    method Type (line 262) | func (p *pinInfo) Type() string {
    method Name (line 266) | func (p *pinInfo) Name() string {

FILE: core/coreapi/pubsub.go
  type PubSubAPI (line 17) | type PubSubAPI
    method Ls (line 27) | func (api *PubSubAPI) Ls(ctx context.Context) ([]string, error) {
    method Peers (line 39) | func (api *PubSubAPI) Peers(ctx context.Context, opts ...caopts.PubSub...
    method Publish (line 58) | func (api *PubSubAPI) Publish(ctx context.Context, topic string, data ...
    method Subscribe (line 71) | func (api *PubSubAPI) Subscribe(ctx context.Context, topic string, opt...
    method checkNode (line 98) | func (api *PubSubAPI) checkNode() (routing.Routing, error) {
  type pubSubSubscription (line 19) | type pubSubSubscription struct
    method Close (line 111) | func (sub *pubSubSubscription) Close() error {
    method Next (line 116) | func (sub *pubSubSubscription) Next(ctx context.Context) (coreiface.Pu...
  type pubSubMessage (line 23) | type pubSubMessage struct
    method From (line 128) | func (msg *pubSubMessage) From() peer.ID {
    method Data (line 132) | func (msg *pubSubMessage) Data() []byte {
    method Seq (line 136) | func (msg *pubSubMessage) Seq() []byte {
    method Topics (line 140) | func (msg *pubSubMessage) Topics() []string {

FILE: core/coreapi/routing.go
  type RoutingAPI (line 26) | type RoutingAPI
    method Get (line 28) | func (api *RoutingAPI) Get(ctx context.Context, key string) ([]byte, e...
    method Put (line 41) | func (api *RoutingAPI) Put(ctx context.Context, key string, value []by...
    method FindPeer (line 75) | func (api *RoutingAPI) FindPeer(ctx context.Context, p peer.ID) (peer....
    method FindProviders (line 91) | func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path,...
    method Provide (line 120) | func (api *RoutingAPI) Provide(ctx context.Context, path path.Path, op...
    method core (line 225) | func (api *RoutingAPI) core() coreiface.CoreAPI {
  function normalizeKey (line 60) | func normalizeKey(s string) (string, error) {
  function provideKeysRec (line 163) | func provideKeysRec(ctx context.Context, prov node.DHTProvider, bs block...

FILE: core/coreapi/swarm.go
  type SwarmAPI (line 20) | type SwarmAPI
    method Connect (line 37) | func (api *SwarmAPI) Connect(ctx context.Context, pi peer.AddrInfo) er...
    method Disconnect (line 57) | func (api *SwarmAPI) Disconnect(ctx context.Context, addr ma.Multiaddr...
    method KnownAddrs (line 92) | func (api *SwarmAPI) KnownAddrs(ctx context.Context) (map[peer.ID][]ma...
    method LocalAddrs (line 112) | func (api *SwarmAPI) LocalAddrs(ctx context.Context) ([]ma.Multiaddr, ...
    method ListenAddrs (line 123) | func (api *SwarmAPI) ListenAddrs(ctx context.Context) ([]ma.Multiaddr,...
    method Peers (line 134) | func (api *SwarmAPI) Peers(ctx context.Context) ([]coreiface.Connectio...
  type connInfo (line 22) | type connInfo struct
    method ID (line 170) | func (ci *connInfo) ID() peer.ID {
    method Address (line 174) | func (ci *connInfo) Address() ma.Multiaddr {
    method Direction (line 178) | func (ci *connInfo) Direction() inet.Direction {
    method Latency (line 182) | func (ci *connInfo) Latency() (time.Duration, error) {
    method Streams (line 186) | func (ci *connInfo) Streams() ([]protocol.ID, error) {
  constant connectionManagerTag (line 33) | connectionManagerTag    = "user-connect"
  constant connectionManagerWeight (line 34) | connectionManagerWeight = 100

FILE: core/coreapi/test/api_test.go
  constant testPeerID (line 30) | testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe"
  type NodeProvider (line 32) | type NodeProvider struct
    method MakeAPISwarm (line 34) | func (NodeProvider) MakeAPISwarm(t *testing.T, ctx context.Context, fu...
  function TestIface (line 126) | func TestIface(t *testing.T) {

FILE: core/coreapi/test/path_test.go
  function TestPathUnixFSHAMTPartial (line 17) | func TestPathUnixFSHAMTPartial(t *testing.T) {

FILE: core/coreapi/unixfs.go
  type UnixfsAPI (line 38) | type UnixfsAPI
    method Add (line 42) | func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...
    method Get (line 234) | func (api *UnixfsAPI) Get(ctx context.Context, p path.Path) (files.Nod...
    method Ls (line 250) | func (api *UnixfsAPI) Ls(ctx context.Context, p path.Path, out chan<- ...
    method processLink (line 282) | func (api *UnixfsAPI) processLink(ctx context.Context, linkres ft.Link...
    method lsFromDirLinks (line 340) | func (api *UnixfsAPI) lsFromDirLinks(ctx context.Context, dir uio.Dire...
    method lsFromLinks (line 355) | func (api *UnixfsAPI) lsFromLinks(ctx context.Context, ndlinks []*ipld...
    method core (line 383) | func (api *UnixfsAPI) core() *CoreAPI {
  type syncDagService (line 388) | type syncDagService struct
    method Sync (line 393) | func (s *syncDagService) Sync() error {
  type providingDagService (line 397) | type providingDagService struct
    method Add (line 402) | func (pds *providingDagService) Add(ctx context.Context, n ipld.Node) ...
    method AddMany (line 416) | func (pds *providingDagService) AddMany(ctx context.Context, nds []ipl...

FILE: core/corehttp/commands.go
  constant originEnvKey (line 25) | originEnvKey          = "API_ORIGIN"
  constant originEnvKeyDeprecate (line 26) | originEnvKeyDeprecate = `You are using the ` + originEnvKey + `ENV Varia...
  constant APIPath (line 37) | APIPath = "/api/v0"
  function addCORSFromEnv (line 53) | func addCORSFromEnv(c *cmdsHttp.ServerConfig) {
  function addHeadersFromConfig (line 61) | func addHeadersFromConfig(c *cmdsHttp.ServerConfig, nc *config.Config) {
  function addCORSDefaults (line 90) | func addCORSDefaults(c *cmdsHttp.ServerConfig) {
  function patchCORSVars (line 101) | func patchCORSVars(c *cmdsHttp.ServerConfig, addr net.Addr) {
  function commandsOption (line 124) | func commandsOption(cctx oldcmds.Context, command *cmds.Command) ServeOp...
  type rpcAuthScopeWithUser (line 157) | type rpcAuthScopeWithUser struct
  function convertAuthorizationsMap (line 162) | func convertAuthorizationsMap(authScopes map[string]*config.RPCAuthScope...
  function withAuthSecrets (line 178) | func withAuthSecrets(authorizations map[string]rpcAuthScopeWithUser, nex...
  function CommandsOption (line 204) | func CommandsOption(cctx oldcmds.Context) ServeOption {
  function CheckVersionOption (line 209) | func CheckVersionOption() ServeOption {

FILE: core/corehttp/corehttp.go
  constant shutdownTimeout (line 24) | shutdownTimeout = 30 * time.Second
  type ServeOption (line 30) | type ServeOption
  function MakeHandler (line 34) | func MakeHandler(n *core.IpfsNode, l net.Listener, options ...ServeOptio...
  function ListenAndServe (line 63) | func ListenAndServe(n *core.IpfsNode, listeningMultiAddr string, options...
  function Serve (line 83) | func Serve(node *core.IpfsNode, lis net.Listener, options ...ServeOption...
  function ServeWithReady (line 97) | func ServeWithReady(node *core.IpfsNode, lis net.Listener, ready chan<- ...

FILE: core/corehttp/gateway.go
  function GatewayOption (line 33) | func GatewayOption(paths ...string) ServeOption {
  function HostnameOption (line 61) | func HostnameOption() ServeOption {
  function VersionOption (line 89) | func VersionOption() ServeOption {
  function Libp2pGatewayOption (line 99) | func Libp2pGatewayOption() ServeOption {
  function newGatewayBackend (line 144) | func newGatewayBackend(n *core.IpfsNode) (gateway.IPFSBackend, error) {
  type offlineGatewayErrWrapper (line 195) | type offlineGatewayErrWrapper struct
    method Get (line 206) | func (o *offlineGatewayErrWrapper) Get(ctx context.Context, path path....
    method GetAll (line 212) | func (o *offlineGatewayErrWrapper) GetAll(ctx context.Context, path pa...
    method GetBlock (line 218) | func (o *offlineGatewayErrWrapper) GetBlock(ctx context.Context, path ...
    method Head (line 224) | func (o *offlineGatewayErrWrapper) Head(ctx context.Context, path path...
    method ResolvePath (line 230) | func (o *offlineGatewayErrWrapper) ResolvePath(ctx context.Context, pa...
    method GetCAR (line 236) | func (o *offlineGatewayErrWrapper) GetCAR(ctx context.Context, path pa...
    method IsCached (line 242) | func (o *offlineGatewayErrWrapper) IsCached(ctx context.Context, path ...
    method GetIPNSRecord (line 246) | func (o *offlineGatewayErrWrapper) GetIPNSRecord(ctx context.Context, ...
    method ResolveMutable (line 252) | func (o *offlineGatewayErrWrapper) ResolveMutable(ctx context.Context,...
    method GetDNSLinkRecord (line 258) | func (o *offlineGatewayErrWrapper) GetDNSLinkRecord(ctx context.Contex...
  function offlineErrWrap (line 199) | func offlineErrWrap(err error) error {
  function staticServerDomainAttrFn (line 279) | func staticServerDomainAttrFn(domain string) func(*http.Request) []attri...
  function newServerDomainAttrFn (line 291) | func newServerDomainAttrFn(n *core.IpfsNode) func(*http.Request) []attri...
  function getGatewayConfig (line 366) | func getGatewayConfig(n *core.IpfsNode) (gateway.Config, map[string][]st...

FILE: core/corehttp/gateway_test.go
  type mockNamesys (line 27) | type mockNamesys
    method Resolve (line 29) | func (m mockNamesys) Resolve(ctx context.Context, p path.Path, opts .....
    method ResolveAsync (line 61) | func (m mockNamesys) ResolveAsync(ctx context.Context, p path.Path, op...
    method Publish (line 69) | func (m mockNamesys) Publish(ctx context.Context, name ci.PrivKey, val...
    method GetResolver (line 73) | func (m mockNamesys) GetResolver(subs string) (namesys.Resolver, bool) {
  function newNodeWithMockNamesys (line 77) | func newNodeWithMockNamesys(ns mockNamesys) (*core.IpfsNode, error) {
  type delegatedHandler (line 95) | type delegatedHandler struct
    method ServeHTTP (line 99) | func (dh *delegatedHandler) ServeHTTP(w http.ResponseWriter, r *http.R...
  function doWithoutRedirect (line 103) | func doWithoutRedirect(req *http.Request) (*http.Response, error) {
  function newTestServerAndNode (line 117) | func newTestServerAndNode(t *testing.T, ns mockNamesys) (*httptest.Serve...
  function TestVersion (line 147) | func TestVersion(t *testing.T) {
  function TestDeserializedResponsesInheritance (line 178) | func TestDeserializedResponsesInheritance(t *testing.T) {

FILE: core/corehttp/logs.go
  function LogOption (line 13) | func LogOption() ServeOption {

FILE: core/corehttp/metrics.go
  function MetricsScrapingOption (line 18) | func MetricsScrapingOption(path string) ServeOption {
  function MetricsOpenCensusCollectionOption (line 26) | func MetricsOpenCensusCollectionOption() ServeOption {
  function MetricsOpenCensusDefaultPrometheusRegistry (line 57) | func MetricsOpenCensusDefaultPrometheusRegistry() ServeOption {
  function MetricsCollectionOption (line 79) | func MetricsCollectionOption(handlerName string) ServeOption {
  type IpfsNodeCollector (line 162) | type IpfsNodeCollector struct
    method Describe (line 166) | func (IpfsNodeCollector) Describe(ch chan<- *prometheus.Desc) {
    method Collect (line 170) | func (c IpfsNodeCollector) Collect(ch chan<- prometheus.Metric) {
    method PeersTotalValues (line 181) | func (c IpfsNodeCollector) PeersTotalValues() map[string]float64 {

FILE: core/corehttp/metrics_test.go
  function TestPeersTotal (line 18) | func TestPeersTotal(t *testing.T) {

FILE: core/corehttp/mutex_profile.go
  function MutexFractionOption (line 14) | func MutexFractionOption(path string) ServeOption {
  function BlockProfileRateOption (line 50) | func BlockProfileRateOption(path string) ServeOption {

FILE: core/corehttp/option_test.go
  type testcasecheckversion (line 13) | type testcasecheckversion struct
    method body (line 21) | func (tc testcasecheckversion) body() string {
  function TestCheckVersionOption (line 29) | func TestCheckVersionOption(t *testing.T) {

FILE: core/corehttp/p2p_proxy.go
  function P2PProxyOption (line 19) | func P2PProxyOption() ServeOption {
  type proxyRequest (line 51) | type proxyRequest struct
  function parseRequest (line 61) | func parseRequest(request *http.Request) (*proxyRequest, error) {
  function handleError (line 85) | func handleError(w http.ResponseWriter, msg string, err error, code int) {

FILE: core/corehttp/p2p_proxy_test.go
  type TestCase (line 12) | type TestCase struct
  function TestParseRequest (line 25) | func TestParseRequest(t *testing.T) {
  function TestParseRequestInvalidPath (line 43) | func TestParseRequestInvalidPath(t *testing.T) {

FILE: core/corehttp/redirect.go
  function RedirectOption (line 10) | func RedirectOption(path string, redirect string) ServeOption {
  type redirectHandler (line 28) | type redirectHandler struct
    method ServeHTTP (line 33) | func (i *redirectHandler) ServeHTTP(w http.ResponseWriter, r *http.Req...

FILE: core/corehttp/routing.go
  function RoutingOption (line 25) | func RoutingOption() ServeOption {
  type contentRouter (line 39) | type contentRouter struct
    method FindProviders (line 43) | func (r *contentRouter) FindProviders(ctx context.Context, key cid.Cid...
    method ProvideBitswap (line 53) | func (r *contentRouter) ProvideBitswap(ctx context.Context, req *serve...
    method FindPeers (line 57) | func (r *contentRouter) FindPeers(ctx context.Context, pid peer.ID, li...
    method GetIPNS (line 78) | func (r *contentRouter) GetIPNS(ctx context.Context, name ipns.Name) (...
    method PutIPNS (line 90) | func (r *contentRouter) PutIPNS(ctx context.Context, name ipns.Name, r...
    method GetClosestPeers (line 104) | func (r *contentRouter) GetClosestPeers(ctx context.Context, key cid.C...
  type peerChanIter (line 158) | type peerChanIter struct
    method Next (line 164) | func (it *peerChanIter) Next() bool {
    method Val (line 174) | func (it *peerChanIter) Val() types.Record {
    method Close (line 191) | func (it *peerChanIter) Close() error {

FILE: core/corehttp/webui.go
  constant WebUIPath (line 15) | WebUIPath = "/ipfs/bafybeihxglpcfyarpm7apn7xpezbuoqgk3l5chyk7w4gvrjwk45r...
  function WebUIOption (line 92) | func WebUIOption(n *core.IpfsNode, _ net.Listener, mux *http.ServeMux) (...
  type webUIHandler (line 109) | type webUIHandler struct
    method ServeHTTP (line 116) | func (h *webUIHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques...
    method writeIncompatibleError (line 149) | func (h *webUIHandler) writeIncompatibleError(w http.ResponseWriter) {
    method writeNotAvailableError (line 161) | func (h *webUIHandler) writeNotAvailableError(w http.ResponseWriter) {

FILE: core/coreiface/block.go
  type BlockStat (line 12) | type BlockStat interface
  type BlockAPI (line 21) | type BlockAPI interface

FILE: core/coreiface/coreapi.go
  type CoreAPI (line 15) | type CoreAPI interface

FILE: core/coreiface/dag.go
  type APIDagService (line 8) | type APIDagService interface

FILE: core/coreiface/idfmt.go
  function FormatKeyID (line 8) | func FormatKeyID(id peer.ID) string {
  function FormatKey (line 17) | func FormatKey(key Key) string {

FILE: core/coreiface/key.go
  type Key (line 14) | type Key interface
  type KeyAPI (line 26) | type KeyAPI interface

FILE: core/coreiface/name.go
  type IpnsResult (line 14) | type IpnsResult struct
  type NameAPI (line 27) | type NameAPI interface

FILE: core/coreiface/object.go
  type ChangeType (line 11) | type ChangeType
  constant DiffAdd (line 15) | DiffAdd ChangeType = iota
  constant DiffRemove (line 18) | DiffRemove
  constant DiffMod (line 21) | DiffMod
  type ObjectChange (line 25) | type ObjectChange struct
  type ObjectAPI (line 46) | type ObjectAPI interface

FILE: core/coreiface/options/block.go
  type BlockPutSettings (line 11) | type BlockPutSettings struct
  type BlockRmSettings (line 16) | type BlockRmSettings struct
  type BlockPutOption (line 21) | type BlockPutOption
  type BlockRmOption (line 22) | type BlockRmOption
  function BlockPutOptions (line 25) | func BlockPutOptions(opts ...BlockPutOption) (*BlockPutSettings, error) {
  function BlockRmOptions (line 50) | func BlockRmOptions(opts ...BlockRmOption) (*BlockRmSettings, error) {
  type blockOpts (line 64) | type blockOpts struct
    method CidCodec (line 71) | func (blockOpts) CidCodec(codecName string) BlockPutOption {
    method Format (line 95) | func (blockOpts) Format(format string) BlockPutOption {
    method Hash (line 141) | func (blockOpts) Hash(mhType uint64, mhLen int) BlockPutOption {
    method Pin (line 151) | func (blockOpts) Pin(pin bool) BlockPutOption {
    method Force (line 160) | func (blockOpts) Force(force bool) BlockRmOption {
  function codeFromName (line 86) | func codeFromName(codecName string) (mc.Code, error) {

FILE: core/coreiface/options/global.go
  type ApiSettings (line 3) | type ApiSettings struct
  type ApiOption (line 8) | type ApiOption
  function ApiOptions (line 10) | func ApiOptions(opts ...ApiOption) (*ApiSettings, error) {
  function ApiOptionsTo (line 19) | func ApiOptionsTo(options *ApiSettings, opts ...ApiOption) (*ApiSettings...
  type apiOpts (line 29) | type apiOpts struct
    method Offline (line 33) | func (apiOpts) Offline(offline bool) ApiOption {
    method FetchBlocks (line 42) | func (apiOpts) FetchBlocks(fetch bool) ApiOption {

FILE: core/coreiface/options/key.go
  constant RSAKey (line 4) | RSAKey     = "rsa"
  constant Ed25519Key (line 5) | Ed25519Key = "ed25519"
  constant DefaultRSALen (line 7) | DefaultRSALen = 2048
  type KeyGenerateSettings (line 10) | type KeyGenerateSettings struct
  type KeyRenameSettings (line 15) | type KeyRenameSettings struct
  type KeyGenerateOption (line 20) | type KeyGenerateOption
  type KeyRenameOption (line 21) | type KeyRenameOption
  function KeyGenerateOptions (line 24) | func KeyGenerateOptions(opts ...KeyGenerateOption) (*KeyGenerateSettings...
  function KeyRenameOptions (line 39) | func KeyRenameOptions(opts ...KeyRenameOption) (*KeyRenameSettings, erro...
  type keyOpts (line 53) | type keyOpts struct
    method Type (line 63) | func (keyOpts) Type(algorithm string) KeyGenerateOption {
    method Size (line 75) | func (keyOpts) Size(size int) KeyGenerateOption {
    method Force (line 84) | func (keyOpts) Force(force bool) KeyRenameOption {

FILE: core/coreiface/options/name.go
  constant DefaultNameValidTime (line 10) | DefaultNameValidTime = 24 * time.Hour
  type NamePublishSettings (line 13) | type NamePublishSettings struct
  type NameResolveSettings (line 23) | type NameResolveSettings struct
  type NamePublishOption (line 30) | type NamePublishOption
  type NameResolveOption (line 31) | type NameResolveOption
  function NamePublishOptions (line 34) | func NamePublishOptions(opts ...NamePublishOption) (*NamePublishSettings...
  function NameResolveOptions (line 53) | func NameResolveOptions(opts ...NameResolveOption) (*NameResolveSettings...
  type nameOpts (line 68) | type nameOpts struct
    method ValidTime (line 74) | func (nameOpts) ValidTime(validTime time.Duration) NamePublishOption {
    method Key (line 86) | func (nameOpts) Key(key string) NamePublishOption {
    method AllowOffline (line 95) | func (nameOpts) AllowOffline(allow bool) NamePublishOption {
    method AllowDelegated (line 105) | func (nameOpts) AllowDelegated(allowDelegated bool) NamePublishOption {
    method TTL (line 114) | func (nameOpts) TTL(ttl time.Duration) NamePublishOption {
    method Sequence (line 123) | func (nameOpts) Sequence(seq uint64) NamePublishOption {
    method CompatibleWithV1 (line 132) | func (nameOpts) CompatibleWithV1(compatible bool) NamePublishOption {
    method Cache (line 141) | func (nameOpts) Cache(cache bool) NameResolveOption {
    method ResolveOption (line 148) | func (nameOpts) ResolveOption(opt namesys.ResolveOption) NameResolveOp...

FILE: core/coreiface/options/object.go
  type ObjectAddLinkSettings (line 3) | type ObjectAddLinkSettings struct
  type ObjectAddLinkOption (line 8) | type ObjectAddLinkOption
  function ObjectAddLinkOptions (line 11) | func ObjectAddLinkOptions(opts ...ObjectAddLinkOption) (*ObjectAddLinkSe...
  type objectOpts (line 25) | type objectOpts struct
    method Create (line 31) | func (objectOpts) Create(create bool) ObjectAddLinkOption {

FILE: core/coreiface/options/pin.go
  type PinAddSettings (line 6) | type PinAddSettings struct
  type PinLsSettings (line 12) | type PinLsSettings struct
  type PinIsPinnedSettings (line 19) | type PinIsPinnedSettings struct
  type PinRmSettings (line 24) | type PinRmSettings struct
  type PinUpdateSettings (line 29) | type PinUpdateSettings struct
  type PinAddOption (line 34) | type PinAddOption
  type PinLsOption (line 37) | type PinLsOption
  type PinIsPinnedOption (line 40) | type PinIsPinnedOption
  type PinRmOption (line 43) | type PinRmOption
  type PinUpdateOption (line 46) | type PinUpdateOption
  function PinAddOptions (line 50) | func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) {
  function PinLsOptions (line 67) | func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) {
  function PinIsPinnedOptions (line 84) | func PinIsPinnedOptions(opts ...PinIsPinnedOption) (*PinIsPinnedSettings...
  function PinRmOptions (line 101) | func PinRmOptions(opts ...PinRmOption) (*PinRmSettings, error) {
  function PinUpdateOptions (line 117) | func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, erro...
  type pinOpts (line 132) | type pinOpts struct
    method Recursive (line 278) | func (pinOpts) Recursive(recursive bool) PinAddOption {
    method Name (line 286) | func (pinOpts) Name(name string) PinAddOption {
    method RmRecursive (line 296) | func (pinOpts) RmRecursive(recursive bool) PinRmOption {
    method Unpin (line 305) | func (pinOpts) Unpin(unpin bool) PinUpdateOption {
  type pinLsOpts (line 140) | type pinLsOpts struct
    method All (line 144) | func (pinLsOpts) All() PinLsOption {
    method Recursive (line 150) | func (pinLsOpts) Recursive() PinLsOption {
    method Direct (line 156) | func (pinLsOpts) Direct() PinLsOption {
    method Indirect (line 162) | func (pinLsOpts) Indirect() PinLsOption {
    method Type (line 175) | func (pinLsOpts) Type(typeStr string) (PinLsOption, error) {
    method pinType (line 193) | func (pinLsOpts) pinType(t string) PinLsOption {
    method Detailed (line 202) | func (pinLsOpts) Detailed(detailed bool) PinLsOption {
    method Name (line 209) | func (pinLsOpts) Name(name string) PinLsOption {
  type pinIsPinnedOpts (line 216) | type pinIsPinnedOpts struct
    method All (line 220) | func (pinIsPinnedOpts) All() PinIsPinnedOption {
    method Recursive (line 226) | func (pinIsPinnedOpts) Recursive() PinIsPinnedOption {
    method Direct (line 232) | func (pinIsPinnedOpts) Direct() PinIsPinnedOption {
    method Indirect (line 238) | func (pinIsPinnedOpts) Indirect() PinIsPinnedOption {
    method Type (line 251) | func (pinIsPinnedOpts) Type(typeStr string) (PinIsPinnedOption, error) {
    method pinType (line 269) | func (pinIsPinnedOpts) pinType(t string) PinIsPinnedOption {

FILE: core/coreiface/options/pubsub.go
  type PubSubPeersSettings (line 3) | type PubSubPeersSettings struct
  type PubSubSubscribeSettings (line 7) | type PubSubSubscribeSettings struct
  type PubSubPeersOption (line 12) | type PubSubPeersOption
  type PubSubSubscribeOption (line 13) | type PubSubSubscribeOption
  function PubSubPeersOptions (line 16) | func PubSubPeersOptions(opts ...PubSubPeersOption) (*PubSubPeersSettings...
  function PubSubSubscribeOptions (line 30) | func PubSubSubscribeOptions(opts ...PubSubSubscribeOption) (*PubSubSubsc...
  type pubsubOpts (line 44) | type pubsubOpts struct
    method Topic (line 48) | func (pubsubOpts) Topic(topic string) PubSubPeersOption {
    method Discover (line 55) | func (pubsubOpts) Discover(discover bool) PubSubSubscribeOption {

FILE: core/coreiface/options/routing.go
  type RoutingPutSettings (line 3) | type RoutingPutSettings struct
  type RoutingPutOption (line 7) | type RoutingPutOption
  function RoutingPutOptions (line 9) | func RoutingPutOptions(opts ...RoutingPutOption) (*RoutingPutSettings, e...
  type RoutingProvideSettings (line 28) | type RoutingProvideSettings struct
  type RoutingFindProvidersSettings (line 32) | type RoutingFindProvidersSettings struct
  type RoutingProvideOption (line 37) | type RoutingProvideOption
  type RoutingFindProvidersOption (line 38) | type RoutingFindProvidersOption
  function RoutingProvideOptions (line 41) | func RoutingProvideOptions(opts ...RoutingProvideOption) (*RoutingProvid...
  function RoutingFindProvidersOptions (line 55) | func RoutingFindProvidersOptions(opts ...RoutingFindProvidersOption) (*R...
  type routingOpts (line 69) | type routingOpts struct
    method Recursive (line 75) | func (routingOpts) Recursive(recursive bool) RoutingProvideOption {
    method NumProviders (line 84) | func (routingOpts) NumProviders(numProviders int) RoutingFindProviders...
    method AllowOffline (line 93) | func (routingOpts) AllowOffline(allow bool) RoutingPutOption {

FILE: core/coreiface/options/unixfs.go
  type Layout (line 16) | type Layout
  constant BalancedLayout (line 19) | BalancedLayout Layout = iota
  constant TrickleLayout (line 20) | TrickleLayout
  type UnixfsAddSettings (line 23) | type UnixfsAddSettings struct
  type UnixfsLsSettings (line 61) | type UnixfsLsSettings struct
  type UnixfsAddOption (line 67) | type UnixfsAddOption
  type UnixfsLsOption (line 68) | type UnixfsLsOption
  function UnixfsAddOptions (line 71) | func UnixfsAddOptions(opts ...UnixfsAddOption) (*UnixfsAddSettings, cid....
  function UnixfsLsOptions (line 167) | func UnixfsLsOptions(opts ...UnixfsLsOption) (*UnixfsLsSettings, error) {
  type unixfsOpts (line 182) | type unixfsOpts struct
    method CidVersion (line 188) | func (unixfsOpts) CidVersion(version int) UnixfsAddOption {
    method Hash (line 198) | func (unixfsOpts) Hash(mhtype uint64) UnixfsAddOption {
    method RawLeaves (line 207) | func (unixfsOpts) RawLeaves(enable bool) UnixfsAddOption {
    method MaxFileLinks (line 217) | func (unixfsOpts) MaxFileLinks(n int) UnixfsAddOption {
    method MaxDirectoryLinks (line 227) | func (unixfsOpts) MaxDirectoryLinks(n int) UnixfsAddOption {
    method MaxHAMTFanout (line 238) | func (unixfsOpts) MaxHAMTFanout(n int) UnixfsAddOption {
    method SizeEstimationMode (line 250) | func (unixfsOpts) SizeEstimationMode(mode io.SizeEstimationMode) Unixf...
    method Inline (line 259) | func (unixfsOpts) Inline(enable bool) UnixfsAddOption {
    method InlineLimit (line 274) | func (unixfsOpts) InlineLimit(limit int) UnixfsAddOption {
    method Chunker (line 286) | func (unixfsOpts) Chunker(chunker string) UnixfsAddOption {
    method Layout (line 297) | func (unixfsOpts) Layout(layout Layout) UnixfsAddOption {
    method Pin (line 305) | func (unixfsOpts) Pin(pin bool, pinName string) UnixfsAddOption {
    method HashOnly (line 317) | func (unixfsOpts) HashOnly(hashOnly bool) UnixfsAddOption {
    method Events (line 328) | func (unixfsOpts) Events(sink chan<- any) UnixfsAddOption {
    method Silent (line 336) | func (unixfsOpts) Silent(silent bool) UnixfsAddOption {
    method Progress (line 344) | func (unixfsOpts) Progress(enable bool) UnixfsAddOption {
    method FsCache (line 354) | func (unixfsOpts) FsCache(enable bool) UnixfsAddOption {
    method Nocopy (line 364) | func (unixfsOpts) Nocopy(enable bool) UnixfsAddOption {
    method ResolveChildren (line 371) | func (unixfsOpts) ResolveChildren(resolve bool) UnixfsLsOption {
    method UseCumulativeSize (line 378) | func (unixfsOpts) UseCumulativeSize(use bool) UnixfsLsOption {
    method PreserveMode (line 386) | func (unixfsOpts) PreserveMode(enable bool) UnixfsAddOption {
    method PreserveMtime (line 394) | func (unixfsOpts) PreserveMtime(enable bool) UnixfsAddOption {
    method Mode (line 402) | func (unixfsOpts) Mode(mode os.FileMode) UnixfsAddOption {
    method Mtime (line 410) | func (unixfsOpts) Mtime(seconds int64, nsecs uint32) UnixfsAddOption {
    method IncludeEmptyDirs (line 421) | func (unixfsOpts) IncludeEmptyDirs(include bool) UnixfsAddOption {

FILE: core/coreiface/options/unixfs_test.go
  function TestMaxHAMTFanoutValidation (line 9) | func TestMaxHAMTFanoutValidation(t *testing.T) {

FILE: core/coreiface/pin.go
  type Pin (line 12) | type Pin interface
  type PinStatus (line 24) | type PinStatus interface
  type BadPinNode (line 36) | type BadPinNode interface
  type PinAPI (line 45) | type PinAPI interface

FILE: core/coreiface/pubsub.go
  type PubSubSubscription (line 13) | type PubSubSubscription interface
  type PubSubMessage (line 21) | type PubSubMessage interface
  type PubSubAPI (line 36) | type PubSubAPI interface

FILE: core/coreiface/routing.go
  type RoutingAPI (line 12) | type RoutingAPI interface

FILE: core/coreiface/swarm.go
  type ConnectionInfo (line 21) | type ConnectionInfo interface
  type SwarmAPI (line 39) | type SwarmAPI interface

FILE: core/coreiface/tests/api.go
  type Provider (line 14) | type Provider interface
  type TestSuite (line 53) | type TestSuite struct
    method makeAPISwarm (line 19) | func (tp *TestSuite) makeAPISwarm(t *testing.T, ctx context.Context, f...
    method makeAPI (line 31) | func (tp *TestSuite) makeAPI(t *testing.T, ctx context.Context) (corei...
    method makeAPIWithIdentityAndOffline (line 40) | func (tp *TestSuite) makeAPIWithIdentityAndOffline(t *testing.T, ctx c...
    method MakeAPISwarm (line 49) | func (tp *TestSuite) MakeAPISwarm(t *testing.T, ctx context.Context, n...
    method hasApi (line 98) | func (tp *TestSuite) hasApi(t *testing.T, tf func(coreiface.CoreAPI) e...
  function TestApi (line 59) | func TestApi(p Provider) func(t *testing.T) {

FILE: core/coreiface/tests/block.go
  function pbBlock (line 25) | func pbBlock() io.Reader {
  function cborBlock (line 30) | func cborBlock() io.Reader {
  method TestBlock (line 34) | func (tp *TestSuite) TestBlock(t *testing.T) {
  method TestBlockPut (line 56) | func (tp *TestSuite) TestBlockPut(t *testing.T) {
  method TestBlockPutFormatDagCbor (line 75) | func (tp *TestSuite) TestBlockPutFormatDagCbor(t *testing.T) {
  method TestBlockPutFormatDagPb (line 94) | func (tp *TestSuite) TestBlockPutFormatDagPb(t *testing.T) {
  method TestBlockPutFormatV0 (line 113) | func (tp *TestSuite) TestBlockPutFormatV0(t *testing.T) {
  method TestBlockPutCidCodecDagCbor (line 130) | func (tp *TestSuite) TestBlockPutCidCodecDagCbor(t *testing.T) {
  method TestBlockPutCidCodecDagPb (line 147) | func (tp *TestSuite) TestBlockPutCidCodecDagPb(t *testing.T) {
  method TestBlockPutHash (line 164) | func (tp *TestSuite) TestBlockPutHash(t *testing.T) {
  method TestBlockGet (line 186) | func (tp *TestSuite) TestBlockGet(t *testing.T) {
  method TestBlockRm (line 223) | func (tp *TestSuite) TestBlockRm(t *testing.T) {
  method TestBlockStat (line 276) | func (tp *TestSuite) TestBlockStat(t *testing.T) {
  method TestBlockPin (line 302) | func (tp *TestSuite) TestBlockPin(t *testing.T) {

FILE: core/coreiface/tests/dag.go
  method TestDag (line 16) | func (tp *TestSuite) TestDag(t *testing.T) {
  method TestPut (line 39) | func (tp *TestSuite) TestPut(t *testing.T) {
  method TestPutWithHash (line 61) | func (tp *TestSuite) TestPutWithHash(t *testing.T) {
  method TestDagPath (line 83) | func (tp *TestSuite) TestDagPath(t *testing.T) {
  method TestTree (line 130) | func (tp *TestSuite) TestTree(t *testing.T) {
  method TestBatch (line 164) | func (tp *TestSuite) TestBatch(t *testing.T) {

FILE: core/coreiface/tests/key.go
  method TestKey (line 17) | func (tp *TestSuite) TestKey(t *testing.T) {
  method TestListSelf (line 44) | func (tp *TestSuite) TestListSelf(t *testing.T) {
  method TestRenameSelf (line 60) | func (tp *TestSuite) TestRenameSelf(t *testing.T) {
  method TestRemoveSelf (line 73) | func (tp *TestSuite) TestRemoveSelf(t *testing.T) {
  method TestGenerate (line 83) | func (tp *TestSuite) TestGenerate(t *testing.T) {
  function verifyIPNSPath (line 96) | func verifyIPNSPath(t *testing.T, p string) {
  method TestGenerateSize (line 110) | func (tp *TestSuite) TestGenerateSize(t *testing.T) {
  method TestGenerateType (line 123) | func (tp *TestSuite) TestGenerateType(t *testing.T) {
  method TestGenerateExisting (line 138) | func (tp *TestSuite) TestGenerateExisting(t *testing.T) {
  method TestList (line 154) | func (tp *TestSuite) TestList(t *testing.T) {
  method TestRename (line 173) | func (tp *TestSuite) TestRename(t *testing.T) {
  method TestRenameToSelf (line 188) | func (tp *TestSuite) TestRenameToSelf(t *testing.T) {
  method TestRenameToSelfForce (line 201) | func (tp *TestSuite) TestRenameToSelfForce(t *testing.T) {
  method TestRenameOverwriteNoForce (line 214) | func (tp *TestSuite) TestRenameOverwriteNoForce(t *testing.T) {
  method TestRenameOverwrite (line 230) | func (tp *TestSuite) TestRenameOverwrite(t *testing.T) {
  method TestRenameSameNameNoForce (line 249) | func (tp *TestSuite) TestRenameSameNameNoForce(t *testing.T) {
  method TestRenameSameName (line 264) | func (tp *TestSuite) TestRenameSameName(t *testing.T) {
  method TestRemove (line 279) | func (tp *TestSuite) TestRemove(t *testing.T) {
  method TestSign (line 302) | func (tp *TestSuite) TestSign(t *testing.T) {
  method TestVerify (line 327) | func (tp *TestSuite) TestVerify(t *testing.T) {

FILE: core/coreiface/tests/name.go
  method TestName (line 18) | func (tp *TestSuite) TestName(t *testing.T) {
  function addTestObject (line 33) | func addTestObject(ctx context.Context, api coreiface.CoreAPI) (path.Pat...
  method TestPublishResolve (line 37) | func (tp *TestSuite) TestPublishResolve(t *testing.T) {
  method TestBasicPublishResolveKey (line 121) | func (tp *TestSuite) TestBasicPublishResolveKey(t *testing.T) {
  method TestBasicPublishResolveTimeout (line 142) | func (tp *TestSuite) TestBasicPublishResolveTimeout(t *testing.T) {

FILE: core/coreiface/tests/object.go
  method TestObject (line 15) | func (tp *TestSuite) TestObject(t *testing.T) {
  function putDagPbNode (line 29) | func putDagPbNode(t *testing.T, ctx context.Context, api iface.CoreAPI, ...
  method TestObjectAddLink (line 47) | func (tp *TestSuite) TestObjectAddLink(t *testing.T) {
  method TestObjectAddLinkCreate (line 73) | func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) {
  method TestObjectRmLink (line 102) | func (tp *TestSuite) TestObjectRmLink(t *testing.T) {
  method TestDiffTest (line 126) | func (tp *TestSuite) TestDiffTest(t *testing.T) {

FILE: core/coreiface/tests/path.go
  function newIPLDPath (line 16) | func newIPLDPath(t *testing.T, cid cid.Cid) path.ImmutablePath {
  method TestPath (line 24) | func (tp *TestSuite) TestPath(t *testing.T) {
  method TestMutablePath (line 33) | func (tp *TestSuite) TestMutablePath(t *testing.T) {
  method TestPathRemainder (line 49) | func (tp *TestSuite) TestPathRemainder(t *testing.T) {
  method TestEmptyPathRemainder (line 70) | func (tp *TestSuite) TestEmptyPathRemainder(t *testing.T) {
  method TestInvalidPathRemainder (line 88) | func (tp *TestSuite) TestInvalidPathRemainder(t *testing.T) {
  method TestPathRoot (line 109) | func (tp *TestSuite) TestPathRoot(t *testing.T) {
  method TestPathJoin (line 134) | func (tp *TestSuite) TestPathJoin(t *testing.T) {

FILE: core/coreiface/tests/pin.go
  method TestPin (line 18) | func (tp *TestSuite) TestPin(t *testing.T) {
  method TestPinAdd (line 35) | func (tp *TestSuite) TestPinAdd(t *testing.T) {
  method TestPinSimple (line 53) | func (tp *TestSuite) TestPinSimple(t *testing.T) {
  method TestPinRecursive (line 104) | func (tp *TestSuite) TestPinRecursive(t *testing.T) {
  method TestPinLsIndirect (line 250) | func (tp *TestSuite) TestPinLsIndirect(t *testing.T) {
  method TestPinLsPrecedence (line 273) | func (tp *TestSuite) TestPinLsPrecedence(t *testing.T) {
  method TestPinLsPredenceRecursiveIndirect (line 282) | func (tp *TestSuite) TestPinLsPredenceRecursiveIndirect(t *testing.T) {
  method TestPinLsPrecedenceDirectIndirect (line 305) | func (tp *TestSuite) TestPinLsPrecedenceDirectIndirect(t *testing.T) {
  method TestPinLsPrecedenceRecursiveDirect (line 328) | func (tp *TestSuite) TestPinLsPrecedenceRecursiveDirect(t *testing.T) {
  method TestPinIsPinned (line 363) | func (tp *TestSuite) TestPinIsPinned(t *testing.T) {
  type cidContainer (line 395) | type cidContainer interface
  type immutablePathCidContainer (line 399) | type immutablePathCidContainer struct
    method Cid (line 403) | func (i immutablePathCidContainer) Cid() cid.Cid {
  function getThreeChainedNodes (line 407) | func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.C...
  function assertPinTypes (line 430) | func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI...
  function assertPinCids (line 456) | func assertPinCids(t *testing.T, pins []iface.Pin, cids ...cidContainer) {
  function assertPinLsAllConsistency (line 495) | func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api if...
  function assertIsPinned (line 549) | func assertIsPinned(t *testing.T, ctx context.Context, api iface.CoreAPI...
  method TestPinNames (line 577) | func (tp *TestSuite) TestPinNames(t *testing.T) {
  function assertNotPinned (line 715) | func assertNotPinned(t *testing.T, ctx context.Context, api iface.CoreAP...
  function accPins (line 728) | func accPins(ctx context.Context, api iface.CoreAPI, opts ...opt.PinLsOp...

FILE: core/coreiface/tests/pubsub.go
  method TestPubSub (line 12) | func (tp *TestSuite) TestPubSub(t *testing.T) {
  method TestBasicPubSub (line 23) | func (tp *TestSuite) TestBasicPubSub(t *testing.T) {

FILE: core/coreiface/tests/routing.go
  method TestRouting (line 16) | func (tp *TestSuite) TestRouting(t *testing.T) {
  method testRoutingPublishKey (line 32) | func (tp *TestSuite) testRoutingPublishKey(t *testing.T, ctx context.Con...
  method TestRoutingGet (line 43) | func (tp *TestSuite) TestRoutingGet(t *testing.T) {
  method TestRoutingPut (line 64) | func (tp *TestSuite) TestRoutingPut(t *testing.T) {
  method TestRoutingPutOffline (line 81) | func (tp *TestSuite) TestRoutingPutOffline(t *testing.T) {
  method TestRoutingFindPeer (line 103) | func (tp *TestSuite) TestRoutingFindPeer(t *testing.T) {
  method TestRoutingFindProviders (line 157) | func (tp *TestSuite) TestRoutingFindProviders(t *testing.T) {
  method TestRoutingProvide (line 195) | func (tp *TestSuite) TestRoutingProvide(t *testing.T) {

FILE: core/coreiface/tests/unixfs.go
  method TestUnixfs (line 31) | func (tp *TestSuite) TestUnixfs(t *testing.T) {
  function strFile (line 63) | func strFile(data string) func() files.Node {
  function twoLevelDir (line 69) | func twoLevelDir() func() files.Node {
  function flatDir (line 82) | func flatDir() files.Node {
  function wrapped (line 89) | func wrapped(names ...string) func(f files.Node) files.Node {
  method TestAdd (line 100) | func (tp *TestSuite) TestAdd(t *testing.T) {
  method TestAddPinned (line 531) | func (tp *TestSuite) TestAddPinned(t *testing.T) {
  method TestAddHashOnly (line 556) | func (tp *TestSuite) TestAddHashOnly(t *testing.T) {
  method TestGetEmptyFile (line 581) | func (tp *TestSuite) TestGetEmptyFile(t *testing.T) {
  method TestGetDir (line 613) | func (tp *TestSuite) TestGetDir(t *testing.T) {
  method TestGetNonUnixfs (line 640) | func (tp *TestSuite) TestGetNonUnixfs(t *testing.T) {
  method TestLs (line 659) | func (tp *TestSuite) TestLs(t *testing.T) {
  method TestEntriesExpired (line 720) | func (tp *TestSuite) TestEntriesExpired(t *testing.T) {
  method TestLsEmptyDir (line 762) | func (tp *TestSuite) TestLsEmptyDir(t *testing.T) {
  method TestLsNonUnixfs (line 794) | func (tp *TestSuite) TestLsNonUnixfs(t *testing.T) {
  type closeTestF (line 830) | type closeTestF struct
    method Close (line 853) | func (f *closeTestF) Close() error {
  type closeTestD (line 837) | type closeTestD struct
    method Close (line 844) | func (f *closeTestD) Close() error {
  method TestAddCloses (line 861) | func (tp *TestSuite) TestAddCloses(t *testing.T) {
  method TestGetSeek (line 898) | func (tp *TestSuite) TestGetSeek(t *testing.T) {
  method TestGetReadAt (line 1003) | func (tp *TestSuite) TestGetReadAt(t *testing.T) {

FILE: core/coreiface/unixfs.go
  type AddEvent (line 15) | type AddEvent struct
  type FileType (line 26) | type FileType
    method String (line 40) | func (t FileType) String() string {
  constant TUnknown (line 31) | TUnknown FileType = iota
  constant TFile (line 33) | TFile
  constant TDirectory (line 35) | TDirectory
  constant TSymlink (line 37) | TSymlink
  type DirEntry (line 56) | type DirEntry struct
  type UnixfsAPI (line 71) | type UnixfsAPI interface
  function LsIter (line 116) | func LsIter(ctx context.Context, api UnixfsAPI, p path.Path, opts ...opt...

FILE: core/coreiface/util.go
  type Reader (line 8) | type Reader interface
  type ReadSeekCloser (line 15) | type ReadSeekCloser interface

FILE: core/corerepo/gc.go
  type GC (line 23) | type GC struct
    method maybeGC (line 204) | func (gc *GC) maybeGC(ctx context.Context, offset uint64) error {
  function NewGC (line 32) | func NewGC(n *core.IpfsNode) (*GC, error) {
  function BestEffortRoots (line 74) | func BestEffortRoots(filesRoot *mfs.Root) ([]cid.Cid, error) {
  function GarbageCollect (line 83) | func GarbageCollect(n *core.IpfsNode, ctx context.Context) error {
  function CollectResult (line 96) | func CollectResult(ctx context.Context, gcOut <-chan gc.Result, cb func(...
  function NewMultiError (line 127) | func NewMultiError(errs ...error) *MultiError {
  type MultiError (line 132) | type MultiError struct
    method Error (line 137) | func (e *MultiError) Error() string {
  function GarbageCollectAsync (line 147) | func GarbageCollectAsync(n *core.IpfsNode, ctx context.Context) <-chan g...
  function PeriodicGC (line 159) | func PeriodicGC(ctx context.Context, node *core.IpfsNode) error {
  function ConditionalGC (line 196) | func ConditionalGC(ctx context.Context, node *core.IpfsNode, offset uint...

FILE: core/corerepo/stat.go
  type SizeStat (line 16) | type SizeStat struct
  type Stat (line 22) | type Stat struct
  constant NoLimit (line 30) | NoLimit uint64 = math.MaxUint64
  function RepoStat (line 33) | func RepoStat(ctx context.Context, n *core.IpfsNode) (Stat, error) {
  function RepoSize (line 66) | func RepoSize(ctx context.Context, n *core.IpfsNode) (SizeStat, error) {

FILE: core/coreunix/add.go
  constant progressReaderIncrement (line 38) | progressReaderIncrement = 1024 * 256
  type Link (line 42) | type Link struct
  type syncer (line 47) | type syncer interface
  function NewAdder (line 52) | func NewAdder(ctx context.Context, p pin.Pinner, bs bstore.GCLocker, ds ...
  type Adder (line 72) | type Adder struct
    method mfsRoot (line 104) | func (adder *Adder) mfsRoot() (*mfs.Root, error) {
    method SetMfsRoot (line 124) | func (adder *Adder) SetMfsRoot(r *mfs.Root) {
    method add (line 129) | func (adder *Adder) add(reader io.Reader) (ipld.Node, error) {
    method curRootNode (line 168) | func (adder *Adder) curRootNode() (ipld.Node, error) {
    method PinRoot (line 194) | func (adder *Adder) PinRoot(ctx context.Context, root ipld.Node, name ...
    method outputDirs (line 225) | func (adder *Adder) outputDirs(path string, fsn mfs.FSNode) error {
    method addNode (line 260) | func (adder *Adder) addNode(node ipld.Node, path string) error {
    method AddAllAndPin (line 301) | func (adder *Adder) AddAllAndPin(ctx context.Context, file files.Node)...
    method addFileNode (line 388) | func (adder *Adder) addFileNode(ctx context.Context, path string, file...
    method addSymlink (line 433) | func (adder *Adder) addSymlink(ctx context.Context, path string, l *fi...
    method addFile (line 464) | func (adder *Adder) addFile(path string, file files.File) error {
    method addDir (line 486) | func (adder *Adder) addDir(ctx context.Context, path string, dir files...
    method maybePauseForGC (line 557) | func (adder *Adder) maybePauseForGC(ctx context.Context) error {
  function outputDagnode (line 579) | func outputDagnode(out chan<- any, name string, dn ipld.Node) error {
  function getOutput (line 599) | func getOutput(dagnode ipld.Node) (*coreiface.AddEvent, error) {
  type progressReader (line 614) | type progressReader struct
    method Read (line 622) | func (i *progressReader) Read(p []byte) (int, error) {
  type progressReader2 (line 637) | type progressReader2 struct
    method Read (line 642) | func (i *progressReader2) Read(p []byte) (int, error) {

FILE: core/coreunix/add_test.go
  constant testPeerID (line 30) | testPeerID = "QmTFauExutTsy4XP6JbMFcw2Wa9645HJt2bTqL6qYDCKfe"
  function TestAddMultipleGCLive (line 32) | func TestAddMultipleGCLive(t *testing.T) {
  function TestAddGCLive (line 164) | func TestAddGCLive(t *testing.T) {
  function testAddWPosInfo (line 273) | func testAddWPosInfo(t *testing.T, rawLeaves bool) {
  function TestAddWPosInfo (line 331) | func TestAddWPosInfo(t *testing.T) {
  function TestAddWPosInfoAndRawLeafs (line 335) | func TestAddWPosInfoAndRawLeafs(t *testing.T) {
  type testBlockstore (line 339) | type testBlockstore struct
    method Put (line 347) | func (bs *testBlockstore) Put(ctx context.Context, block blocks.Block)...
    method PutMany (line 352) | func (bs *testBlockstore) PutMany(ctx context.Context, blocks []blocks...
    method CheckForPosInfo (line 359) | func (bs *testBlockstore) CheckForPosInfo(block blocks.Block) {
  type dummyFileInfo (line 374) | type dummyFileInfo struct
    method Name (line 380) | func (fi *dummyFileInfo) Name() string       { return fi.name }
    method Size (line 381) | func (fi *dummyFileInfo) Size() int64        { return fi.size }
    method Mode (line 382) | func (fi *dummyFileInfo) Mode() os.FileMode  { return 0 }
    method ModTime (line 383) | func (fi *dummyFileInfo) ModTime() time.Time { return fi.modTime }
    method IsDir (line 384) | func (fi *dummyFileInfo) IsDir() bool        { return false }
    method Sys (line 385) | func (fi *dummyFileInfo) Sys() any           { return nil }

FILE: core/coreunix/metadata.go
  function AddMetadataTo (line 10) | func AddMetadataTo(n *core.IpfsNode, skey string, m *ft.Metadata) (strin...
  function Metadata (line 40) | func Metadata(n *core.IpfsNode, skey string) (*ft.Metadata, error) {

FILE: core/coreunix/metadata_test.go
  function getDagserv (line 26) | func getDagserv(t *testing.T) ipld.DAGService {
  function TestMetadata (line 33) | func TestMetadata(t *testing.T) {

FILE: core/mock/mock.go
  function NewMockNode (line 28) | func NewMockNode() (*core.IpfsNode, error) {
  function MockHostOption (line 36) | func MockHostOption(mn mocknet.Mocknet) libp2p2.HostOption {
  function MockCmdsCtx (line 51) | func MockCmdsCtx() (commands.Context, error) {
  function MockPublicNode (line 85) | func MockPublicNode(ctx context.Context, mn mocknet.Mocknet) (*core.Ipfs...

FILE: core/node/bitswap.go
  constant DefaultEngineBlockstoreWorkerCount (line 33) | DefaultEngineBlockstoreWorkerCount = 128
  constant DefaultTaskWorkerCount (line 34) | DefaultTaskWorkerCount             = 8
  constant DefaultEngineTaskWorkerCount (line 35) | DefaultEngineTaskWorkerCount       = 8
  constant DefaultMaxOutstandingBytesPerPeer (line 36) | DefaultMaxOutstandingBytesPerPeer  = 1 << 20
  constant DefaultProviderSearchDelay (line 37) | DefaultProviderSearchDelay         = 1000 * time.Millisecond
  constant DefaultMaxProviders (line 38) | DefaultMaxProviders                = 10
  constant DefaultWantHaveReplaceSize (line 39) | DefaultWantHaveReplaceSize         = 1024
  type bitswapOptionsOut (line 42) | type bitswapOptionsOut struct
  function BitswapOptions (line 50) | func BitswapOptions(cfg *config.Config) any {
  type bitswapIn (line 70) | type bitswapIn struct
  function Bitswap (line 84) | func Bitswap(serverEnabled, libp2pEnabled, httpEnabled bool) any {
  function OnlineExchange (line 209) | func OnlineExchange(isBitswapActive bool) any {
  type noopExchange (line 223) | type noopExchange struct
    method GetBlock (line 227) | func (e *noopExchange) GetBlock(ctx context.Context, c cid.Cid) (block...
    method GetBlocks (line 231) | func (e *noopExchange) GetBlocks(ctx context.Context, cids []cid.Cid) ...
    method NotifyNewBlocks (line 237) | func (e *noopExchange) NotifyNewBlocks(ctx context.Context, blocks ......
    method Close (line 241) | func (e *noopExchange) Close() error {

FILE: core/node/builder.go
  type BuildCfg (line 22) | type BuildCfg struct
    method getOpt (line 42) | func (cfg *BuildCfg) getOpt(key string) bool {
    method fillDefaults (line 50) | func (cfg *BuildCfg) fillDefaults() error {
    method options (line 71) | func (cfg *BuildCfg) options(ctx context.Context) (fx.Option, *cfg.Con...
  function defaultRepo (line 112) | func defaultRepo(dstore repo.Datastore) (repo.Repo, error) {

FILE: core/node/core.go
  function BlockService (line 37) | func BlockService(cfg *config.Config) func(lc fx.Lifecycle, bs blockstor...
  function Pinning (line 54) | func Pinning(strategy string) func(bstore blockstore.Blockstore, ds form...
  type syncDagService (line 107) | type syncDagService struct
    method Sync (line 112) | func (s *syncDagService) Sync(ctx context.Context) error {
    method Session (line 116) | func (s *syncDagService) Session(ctx context.Context) format.NodeGetter {
  type FetchersOut (line 121) | type FetchersOut struct
  type FetchersIn (line 130) | type FetchersIn struct
  function FetcherConfig (line 139) | func FetcherConfig(bs blockservice.BlockService) FetchersOut {
  type PathResolversOut (line 161) | type PathResolversOut struct
  function PathResolverConfig (line 170) | func PathResolverConfig(fetchers FetchersIn) PathResolversOut {
  function Dag (line 180) | func Dag(bs blockservice.BlockService) format.DAGService {
  function Files (line 185) | func Files(strategy string) func(mctx helpers.MetricsCtx, lc fx.Lifecycl...

FILE: core/node/dns.go
  function DNSResolver (line 17) | func DNSResolver(cfg *config.Config) (*madns.Resolver, error) {

FILE: core/node/groups.go
  function LibP2P (line 39) | func LibP2P(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rc...
  function Storage (line 236) | func Storage(bcfg *BuildCfg, cfg *config.Config) fx.Option {
  function Identity (line 263) | func Identity(cfg *config.Config) fx.Option {
  function Online (line 308) | func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rc...
  function Offline (line 372) | func Offline(cfg *config.Config) fx.Option {
  function Networked (line 392) | func Networked(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides...
  function IPFS (line 400) | func IPFS(ctx context.Context, bcfg *BuildCfg) fx.Option {

FILE: core/node/helpers.go
  type lcStartStop (line 10) | type lcStartStop struct
    method Append (line 17) | func (lcss *lcStartStop) Append(f func() func()) {
  function maybeProvide (line 43) | func maybeProvide(opt any, enable bool) fx.Option {
  function maybeInvoke (line 51) | func maybeInvoke(opt any, enable bool) fx.Option {

FILE: core/node/helpers/helpers.go
  type MetricsCtx (line 9) | type MetricsCtx
  function LifecycleCtx (line 15) | func LifecycleCtx(mctx MetricsCtx, lc fx.Lifecycle) context.Context {

FILE: core/node/identity.go
  function PeerID (line 10) | func PeerID(id peer.ID) func() peer.ID {
  function PrivateKey (line 17) | func PrivateKey(sk crypto.PrivKey) func(id peer.ID) (crypto.PrivKey, err...

FILE: core/node/ipns.go
  constant DefaultIpnsCacheSize (line 20) | DefaultIpnsCacheSize = 128
  function RecordValidator (line 23) | func RecordValidator(ps peerstore.Peerstore) record.Validator {
  function Namesys (line 31) | func Namesys(cacheSize int, cacheMaxTTL time.Duration) func(rt irouting....
  function IpnsRepublisher (line 48) | func IpnsRepublisher(repubPeriod time.Duration, recordLifetime time.Dura...

FILE: core/node/libp2p/addrs.go
  function AddrFilters (line 24) | func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, erro...
  function makeAddrsFactory (line 39) | func makeAddrsFactory(announce []string, appendAnnounce []string, noAnno...
  function AddrsFactory (line 102) | func AddrsFactory(announce []string, appendAnnounce []string, noAnnounce...
  function ListenOn (line 127) | func ListenOn(addresses []string) any {
  function P2PForgeCertMgr (line 137) | func P2PForgeCertMgr(repoPath string, cfg config.AutoTLS, atlsLog *loggi...
  function StartP2PAutoTLS (line 176) | func StartP2PAutoTLS(lc fx.Lifecycle, certMgr *p2pforge.P2PForgeCertMgr,...

FILE: core/node/libp2p/discovery.go
  constant discoveryConnTimeout (line 16) | discoveryConnTimeout = time.Second * 30
  type discoveryHandler (line 18) | type discoveryHandler struct
    method HandlePeerFound (line 23) | func (dh *discoveryHandler) HandlePeerFound(p peer.AddrInfo) {
  function DiscoveryHandler (line 32) | func DiscoveryHandler(mctx helpers.MetricsCtx, lc fx.Lifecycle, host hos...
  function SetupDiscovery (line 39) | func SetupDiscovery(useMdns bool) func(helpers.MetricsCtx, fx.Lifecycle,...

FILE: core/node/libp2p/dns.go
  function MultiaddrResolver (line 9) | func MultiaddrResolver(rslv *madns.Resolver) (opts Libp2pOpts, err error) {

FILE: core/node/libp2p/fd/sys_not_unix.go
  function GetNumFDs (line 5) | func GetNumFDs() int {

FILE: core/node/libp2p/fd/sys_unix.go
  function GetNumFDs (line 9) | func GetNumFDs() int {

FILE: core/node/libp2p/fd/sys_windows.go
  function GetNumFDs (line 9) | func GetNumFDs() int {

FILE: core/node/libp2p/filters.go
  type filtersConnectionGater (line 14) | type filtersConnectionGater
    method InterceptAddrDial (line 18) | func (f *filtersConnectionGater) InterceptAddrDial(_ peer.ID, addr ma....
    method InterceptPeerDial (line 22) | func (f *filtersConnectionGater) InterceptPeerDial(p peer.ID) (allow b...
    method InterceptAccept (line 26) | func (f *filtersConnectionGater) InterceptAccept(connAddr network.Conn...
    method InterceptSecured (line 30) | func (f *filtersConnectionGater) InterceptSecured(_ network.Direction,...
    method InterceptUpgraded (line 34) | func (f *filtersConnectionGater) InterceptUpgraded(_ network.Conn) (al...

FILE: core/node/libp2p/host.go
  type P2PHostIn (line 21) | type P2PHostIn struct
  type P2PHostOut (line 34) | type P2PHostOut struct
  function Host (line 41) | func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (o...

FILE: core/node/libp2p/hostopt.go
  type HostOption (line 12) | type HostOption
  function constructPeerHost (line 17) | func constructPeerHost(id peer.ID, ps peerstore.Peerstore, options ...li...

FILE: core/node/libp2p/libp2p.go
  type Libp2pOpts (line 22) | type Libp2pOpts struct
  function ConnectionManager (line 28) | func ConnectionManager(low, high int, grace, silence time.Duration) func...
  function PstoreAddSelfKeys (line 42) | func PstoreAddSelfKeys(id peer.ID, sk crypto.PrivKey, ps peerstore.Peers...
  function UserAgent (line 50) | func UserAgent() func() (opts Libp2pOpts, err error) {
  function simpleOpt (line 54) | func simpleOpt(opt libp2p.Option) func() (opts Libp2pOpts, err error) {
  type priorityOption (line 61) | type priorityOption struct
  function prioritizeOptions (line 66) | func prioritizeOptions(opts []priorityOption) libp2p.Option {
  function ForceReachability (line 90) | func ForceReachability(val *config.OptionalString) func() (opts Libp2pOp...

FILE: core/node/libp2p/libp2p_test.go
  function TestPrioritize (line 14) | func TestPrioritize(t *testing.T) {

FILE: core/node/libp2p/nat.go
  function AutoNATService (line 12) | func AutoNATService(throttle *config.AutoNATThrottleConfig, v1only bool)...

FILE: core/node/libp2p/peerstore.go
  function Peerstore (line 11) | func Peerstore(lc fx.Lifecycle) (peerstore.Peerstore, error) {

FILE: core/node/libp2p/pnet.go
  type PNetFingerprint (line 19) | type PNetFingerprint
  function PNet (line 21) | func PNet(repo repo.Repo) (opts Libp2pOpts, fp PNetFingerprint, err erro...
  function PNetChecker (line 37) | func PNetChecker(repo repo.Repo, ph host.Host, lc fx.Lifecycle) error {
  function pnetFingerprint (line 74) | func pnetFingerprint(psk pnet.PSK) []byte {

FILE: core/node/libp2p/pubsub.go
  type pubsubParams (line 20) | type pubsubParams struct
  function FloodSub (line 28) | func FloodSub(pubsubOptions ...pubsub.Option) any {
  function GossipSub (line 40) | func GossipSub(pubsubOptions ...pubsub.Option) any {
  function newSeqnoValidator (line 53) | func newSeqnoValidator(ds datastore.Datastore) pubsub.ValidatorEx {
  constant SeqnoStorePrefix (line 58) | SeqnoStorePrefix = "/pubsub/seqno/"
  type seqnoStore (line 63) | type seqnoStore struct
    method Get (line 72) | func (s *seqnoStore) Get(ctx context.Context, p peer.ID) ([]byte, erro...
    method Put (line 82) | func (s *seqnoStore) Put(ctx context.Context, p peer.ID, val []byte) e...

FILE: core/node/libp2p/pubsub_test.go
  function TestSeqnoStore (line 17) | func TestSeqnoStore(t *testing.T) {

FILE: core/node/libp2p/rcmgr.go
  constant NetLimitTraceFilename (line 27) | NetLimitTraceFilename = "rcmgr.json.gz"
  function ResourceManager (line 31) | func ResourceManager(repoPath string, cfg config.SwarmConfig, userResour...
  function isPartialConfigEmpty (line 136) | func isPartialConfigEmpty(cfg rcmgr.PartialLimitConfig) bool {
  function LimitConfig (line 180) | func LimitConfig(cfg config.SwarmConfig, userResourceOverrides rcmgr.Par...
  type ResourceLimitsAndUsage (line 198) | type ResourceLimitsAndUsage struct
    method ToResourceLimits (line 218) | func (u ResourceLimitsAndUsage) ToResourceLimits() rcmgr.ResourceLimits {
  type LimitsConfigAndUsage (line 231) | type LimitsConfigAndUsage struct
    method MarshalJSON (line 241) | func (u LimitsConfigAndUsage) MarshalJSON() ([]byte, error) {
    method ToPartialLimitConfig (line 258) | func (u LimitsConfigAndUsage) ToPartialLimitConfig() (result rcmgr.Par...
  function MergeLimitsAndStatsIntoLimitsConfigAndUsage (line 278) | func MergeLimitsAndStatsIntoLimitsConfigAndUsage(l rcmgr.ConcreteLimitCo...
  function mergeLimitsAndStatsMapIntoLimitsConfigAndUsageMap (line 290) | func mergeLimitsAndStatsMapIntoLimitsConfigAndUsageMap[K comparable](lim...
  function maxInt (line 311) | func maxInt(x, y int) int {
  function mergeResourceLimitsAndScopeStatToResourceLimitsAndUsage (line 318) | func mergeResourceLimitsAndScopeStatToResourceLimitsAndUsage(rl rcmgr.Re...
  type ResourceInfos (line 339) | type ResourceInfos
  type ResourceInfo (line 341) | type ResourceInfo struct
  function LimitConfigsToInfo (line 349) | func LimitConfigsToInfo(stats LimitsConfigAndUsage) ResourceInfos {
  constant limitNameMemory (line 380) | limitNameMemory          = "Memory"
  constant limitNameFD (line 381) | limitNameFD              = "FD"
  constant limitNameConns (line 382) | limitNameConns           = "Conns"
  constant limitNameConnsInbound (line 383) | limitNameConnsInbound    = "ConnsInbound"
  constant limitNameConnsOutbound (line 384) | limitNameConnsOutbound   = "ConnsOutbound"
  constant limitNameStreams (line 385) | limitNameStreams         = "Streams"
  constant limitNameStreamsInbound (line 386) | limitNameStreamsInbound  = "StreamsInbound"
  constant limitNameStreamsOutbound (line 387) | limitNameStreamsOutbound = "StreamsOutbound"
  function resourceLimitsAndUsageToResourceInfo (line 401) | func resourceLimitsAndUsageToResourceInfo(scopeName string, stats Resour...
  function ensureConnMgrMakeSenseVsResourceMgr (line 453) | func ensureConnMgrMakeSenseVsResourceMgr(concreteLimits rcmgr.ConcreteLi...

FILE: core/node/libp2p/rcmgr_defaults.go
  function createDefaultLimitConfig (line 21) | func createDefaultLimitConfig(cfg config.SwarmConfig) (limitConfig rcmgr...

FILE: core/node/libp2p/rcmgr_logging.go
  type loggingResourceManager (line 18) | type loggingResourceManager struct
    method start (line 38) | func (n *loggingResourceManager) start(ctx context.Context) {
    method countErrs (line 69) | func (n *loggingResourceManager) countErrs(err error) {
    method ViewSystem (line 86) | func (n *loggingResourceManager) ViewSystem(f func(network.ResourceSco...
    method ViewTransient (line 90) | func (n *loggingResourceManager) ViewTransient(f func(network.Resource...
    method ViewService (line 96) | func (n *loggingResourceManager) ViewService(svc string, f func(networ...
    method ViewProtocol (line 102) | func (n *loggingResourceManager) ViewProtocol(p protocol.ID, f func(ne...
    method ViewPeer (line 108) | func (n *loggingResourceManager) ViewPeer(p peer.ID, f func(network.Pe...
    method OpenConnection (line 114) | func (n *loggingResourceManager) OpenConnection(dir network.Direction,...
    method OpenStream (line 120) | func (n *loggingResourceManager) OpenStream(p peer.ID, dir network.Dir...
    method Close (line 126) | func (n *loggingResourceManager) Close() error {
    method ListServices (line 130) | func (n *loggingResourceManager) ListServices() []string {
    method ListProtocols (line 139) | func (n *loggingResourceManager) ListProtocols() []protocol.ID {
    method ListPeers (line 148) | func (n *loggingResourceManager) ListPeers() []peer.ID {
    method Stat (line 157) | func (n *loggingResourceManager) Stat() rcmgr.ResourceManagerStat {
    method VerifySourceAddress (line 166) | func (n *loggingResourceManager) VerifySourceAddress(addr net.Addr) bo...
  type loggingScope (line 27) | type loggingScope struct
    method ReserveMemory (line 170) | func (s *loggingScope) ReserveMemory(size int, prio uint8) error {
    method ReleaseMemory (line 176) | func (s *loggingScope) ReleaseMemory(size int) {
    method Stat (line 180) | func (s *loggingScope) Stat() network.ScopeStat {
    method BeginSpan (line 184) | func (s *loggingScope) BeginSpan() (network.ResourceScopeSpan, error) {
    method Done (line 188) | func (s *loggingScope) Done() {
    method Name (line 192) | func (s *loggingScope) Name() string {
    method Protocol (line 196) | func (s *loggingScope) Protocol() protocol.ID {
    method Peer (line 200) | func (s *loggingScope) Peer() peer.ID {
    method PeerScope (line 204) | func (s *loggingScope) PeerScope() network.PeerScope {
    method SetPeer (line 208) | func (s *loggingScope) SetPeer(p peer.ID) error {
    method ProtocolScope (line 214) | func (s *loggingScope) ProtocolScope() network.ProtocolScope {
    method SetProtocol (line 218) | func (s *loggingScope) SetProtocol(proto protocol.ID) error {
    method ServiceScope (line 224) | func (s *loggingScope) ServiceScope() network.ServiceScope {
    method SetService (line 228) | func (s *loggingScope) SetService(srv string) error {
    method Limit (line 234) | func (s *loggingScope) Limit() rcmgr.Limit {
    method SetLimit (line 238) | func (s *loggingScope) SetLimit(limit rcmgr.Limit) {

FILE: core/node/libp2p/rcmgr_logging_test.go
  function TestLoggingResourceManager (line 16) | func TestLoggingResourceManager(t *testing.T) {

FILE: core/node/libp2p/relay.go
  function RelayTransport (line 14) | func RelayTransport(enableRelay bool) func() (opts Libp2pOpts, err error) {
  function RelayService (line 25) | func RelayService(enable bool, relayOpts config.RelayService) func() (op...
  function MaybeAutoRelay (line 48) | func MaybeAutoRelay(staticRelays []string, cfgPeering config.Peering, en...
  function HolePunching (line 108) | func HolePunching(flag config.Flag, hasRelayClient bool) func() (opts Li...

FILE: core/node/libp2p/routing.go
  type Router (line 31) | type Router struct
  type p2pRouterOut (line 37) | type p2pRouterOut struct
  type processInitialRoutingIn (line 43) | type processInitialRoutingIn struct
  type processInitialRoutingOut (line 54) | type processInitialRoutingOut struct
  type AddrInfoChan (line 64) | type AddrInfoChan
  function BaseRouting (line 66) | func BaseRouting(cfg *config.Config) any {
  type p2pOnlineContentRoutingIn (line 159) | type p2pOnlineContentRoutingIn struct
  function ContentRouting (line 167) | func ContentRouting(in p2pOnlineContentRoutingIn) routing.ContentRouting {
  function ContentDiscovery (line 184) | func ContentDiscovery(in irouting.ProvideManyRouter) routing.ContentDisc...
  type p2pOnlineRoutingIn (line 188) | type p2pOnlineRoutingIn struct
  function Routing (line 197) | func Routing(in p2pOnlineRoutingIn) irouting.ProvideManyRouter {
  function OfflineRouting (line 218) | func OfflineRouting(dstore ds.Datastore, validator record.Validator) p2p...
  type p2pPSRoutingIn (line 227) | type p2pPSRoutingIn struct
  function PubsubRouter (line 235) | func PubsubRouter(mctx helpers.MetricsCtx, lc fx.Lifecycle, in p2pPSRout...
  function autoRelayFeeder (line 260) | func autoRelayFeeder(cfgPeering config.Peering, peerChan chan<- peer.Add...

FILE: core/node/libp2p/routingopt.go
  type RoutingOptionArgs (line 26) | type RoutingOptionArgs struct
  type RoutingOption (line 37) | type RoutingOption
  type EndpointSource (line 42) | type EndpointSource struct
  function determineCapabilities (line 49) | func determineCapabilities(endpoint EndpointSource) (string, autoconf.En...
  function collectAllEndpoints (line 60) | func collectAllEndpoints(cfg *config.Config) []EndpointSource {
  function constructDefaultHTTPRouters (line 111) | func constructDefaultHTTPRouters(cfg *config.Config, addrFunc func() []m...
  function ConstructDelegatedOnlyRouting (line 191) | func ConstructDelegatedOnlyRouting(cfg *config.Config) RoutingOption {
  function ConstructDefaultRouting (line 215) | func ConstructDefaultRouting(cfg *config.Config, routingOpt RoutingOptio...
  function constructDHTRouting (line 246) | func constructDHTRouting(mode dht.ModeOpt) RoutingOption {
  function ConstructDelegatedRouting (line 277) | func ConstructDelegatedRouting(routers config.Routers, methods config.Me...
  function constructNilRouting (line 298) | func constructNilRouting(_ RoutingOptionArgs) (routing.Routing, error) {
  type confirmedAddrsHost (line 310) | type confirmedAddrsHost interface
  function httpRouterAddrFunc (line 331) | func httpRouterAddrFunc(h host.Host, cfgAddrs config.Addresses) func() [...
  function parseMultiaddrs (line 372) | func parseMultiaddrs(strs []string) []ma.Multiaddr {

FILE: core/node/libp2p/routingopt_test.go
  function TestDetermineCapabilities (line 20) | func TestDetermineCapabilities(t *testing.T) {
  function TestEndpointCapabilitiesReadWriteLogic (line 142) | func TestEndpointCapabilitiesReadWriteLogic(t *testing.T) {
  type stubHost (line 211) | type stubHost struct
    method ConfirmedAddrs (line 215) | func (h *stubHost) ConfirmedAddrs() (reachable, unreachable, unknown [...
    method ID (line 219) | func (h *stubHost) ID() peer.ID                                       ...
    method Addrs (line 220) | func (h *stubHost) Addrs() []ma.Multiaddr                             ...
    method Peerstore (line 221) | func (h *stubHost) Peerstore() peerstore.Peerstore                    ...
    method Network (line 222) | func (h *stubHost) Network() network.Network                          ...
    method Mux (line 223) | func (h *stubHost) Mux() protocol.Switch                              ...
    method Connect (line 224) | func (h *stubHost) Connect(context.Context, peer.AddrInfo) error      ...
    method SetStreamHandler (line 225) | func (h *stubHost) SetStreamHandler(protocol.ID, network.StreamHandler...
    method SetStreamHandlerMatch (line 226) | func (h *stubHost) SetStreamHandlerMatch(protocol.ID, func(protocol.ID...
    method RemoveStreamHandler (line 229) | func (h *stubHost) RemoveStreamHandler(protocol.ID) { panic("unused") }
    method NewStream (line 230) | func (h *stubHost) NewStream(context.Context, peer.ID, ...protocol.ID)...
    method Close (line 233) | func (h *stubHost) Close() error                     { panic("unused") }
    method ConnManager (line 234) | func (h *stubHost) ConnManager() connmgr.ConnManager { panic("unused") }
    method EventBus (line 235) | func (h *stubHost) EventBus() event.Bus              { panic("unused") }
  function TestHttpRouterAddrFunc (line 237) | func TestHttpRouterAddrFunc(t *testing.T) {

FILE: core/node/libp2p/sec.go
  function Security (line 11) | func Security(enabled bool, tptConfig config.Transports) any {

FILE: core/node/libp2p/smux.go
  function makeSmuxTransportOption (line 13) | func makeSmuxTransportOption(tptConfig config.Transports) (libp2p.Option...
  function SmuxTransport (line 24) | func SmuxTransport(tptConfig config.Transports) func() (opts Libp2pOpts,...

FILE: core/node/libp2p/topicdiscovery.go
  function TopicDiscovery (line 15) | func TopicDiscovery() any {

FILE: core/node/libp2p/transport.go
  function Transports (line 20) | func Transports(tptConfig config.Transports) any {
  function BandwidthCounter (line 83) | func BandwidthCounter() (opts Libp2pOpts, reporter *metrics.BandwidthCou...

FILE: core/node/p2pforge_resolver.go
  type p2pForgeResolver (line 29) | type p2pForgeResolver struct
    method LookupIPAddr (line 58) | func (r *p2pForgeResolver) LookupIPAddr(ctx context.Context, hostname ...
    method LookupTXT (line 118) | func (r *p2pForgeResolver) LookupTXT(ctx context.Context, hostname str...
  function NewP2PForgeResolver (line 41) | func NewP2PForgeResolver(suffixes []string, fallback madns.BasicResolver...

FILE: core/node/p2pforge_resolver_test.go
  constant testPeerID (line 19) | testPeerID = "k51qzi5uqu5dhnwe629wdlncpql6frppdpwnz4wtlcw816aysd5wwlk63g...
  constant domainSuffix (line 22) | domainSuffix = config.DefaultDomainSuffix
  type mockResolver (line 26) | type mockResolver struct
    method LookupIPAddr (line 32) | func (m *mockResolver) LookupIPAddr(_ context.Context, hostname string...
    method LookupTXT (line 42) | func (m *mockResolver) LookupTXT(_ context.Context, name string) ([]st...
  function newTestResolver (line 50) | func newTestResolver(t *testing.T) *p2pForgeResolver {
  function assertLookupIP (line 56) | func assertLookupIP(t *testing.T, r *p2pForgeResolver, hostname, wantIP ...
  function TestP2PForgeResolver_LookupIPAddr (line 64) | func TestP2PForgeResolver_LookupIPAddr(t *testing.T) {
  function TestP2PForgeResolver_LookupIPAddr_MultipleSuffixes (line 92) | func TestP2PForgeResolver_LookupIPAddr_MultipleSuffixes(t *testing.T) {
  function TestP2PForgeResolver_LookupIPAddr_FallbackToNetwork (line 110) | func TestP2PForgeResolver_LookupIPAddr_FallbackToNetwork(t *testing.T) {
  function TestP2PForgeResolver_LookupIPAddr_FallbackError (line 143) | func TestP2PForgeResolver_LookupIPAddr_FallbackError(t *testing.T) {
  function TestP2PForgeResolver_LookupTXT (line 152) | func TestP2PForgeResolver_LookupTXT(t *testing.T) {

FILE: core/node/peering.go
  function Peering (line 14) | func Peering(lc fx.Lifecycle, host host.Host) *peering.PeeringService {
  function PeerWith (line 29) | func PeerWith(peers ...peer.AddrInfo) fx.Option {

FILE: core/node/provider.go
  constant sampledBatchSize (line 50) | sampledBatchSize = 1000
  constant reprovideStrategyKey (line 53) | reprovideStrategyKey = "/reprovideStrategy"
  constant KeystoreDatastorePath (line 56) | KeystoreDatastorePath = "provider-keystore"
  function validateKeystoreSuffix (line 72) | func validateKeystoreSuffix(suffix string) error {
  constant reprovideAlertPollInterval (line 81) | reprovideAlertPollInterval = 15 * time.Minute
  constant consecutiveAlertsThreshold (line 86) | consecutiveAlertsThreshold = 3
  type DHTProvider (line 92) | type DHTProvider interface
  type NoopProvider (line 155) | type NoopProvider struct
    method StartProviding (line 157) | func (r *NoopProvider) StartProviding(bool, ...mh.Multihash) error { r...
    method ProvideOnce (line 158) | func (r *NoopProvider) ProvideOnce(...mh.Multihash) error          { r...
    method Clear (line 159) | func (r *NoopProvider) Clear() int                                 { r...
    method RefreshSchedule (line 160) | func (r *NoopProvider) RefreshSchedule() error                     { r...
    method Close (line 161) | func (r *NoopProvider) Close() error                               { r...
  type LegacyProvider (line 171) | type LegacyProvider struct
    method StartProviding (line 175) | func (r *LegacyProvider) StartProviding(force bool, keys ...mh.Multiha...
    method ProvideOnce (line 179) | func (r *LegacyProvider) ProvideOnce(keys ...mh.Multihash) error {
    method Clear (line 192) | func (r *LegacyProvider) Clear() int {
    method RefreshSchedule (line 196) | func (r *LegacyProvider) RefreshSchedule() error { return nil }
  function LegacyProviderOpt (line 200) | func LegacyProviderOpt(reprovideInterval time.Duration, strategy string,...
  type dhtImpl (line 342) | type dhtImpl interface
  type fullrtRouter (line 349) | type fullrtRouter struct
    method GetClosestPeers (line 365) | func (fr *fullrtRouter) GetClosestPeers(ctx context.Context, key strin...
  function newFullRTRouter (line 355) | func newFullRTRouter(fr *fullrt.FullRT, loggerName string) *fullrtRouter {
  type addrsFilter (line 388) | type addrsFilter interface
  function findRootDatastoreSpec (line 396) | func findRootDatastoreSpec(spec map[string]any) map[string]any {
  function MountKeystoreDatastores (line 437) | func MountKeystoreDatastores(repo repo.Repo) ([]mount.Mount, func(), err...
  function openDatastoreAt (line 479) | func openDatastoreAt(rootSpec map[string]any, path string) (datastore.Ba...
  function copySpec (line 491) | func copySpec(spec map[string]any) map[string]any {
  constant purgeBatchSize (line 519) | purgeBatchSize = 1 << 12
  function purgeOrphanedKeystoreData (line 528) | func purgeOrphanedKeystoreData(ctx context.Context, ds datastore.Batchin...
  function SweepingProviderOpt (line 586) | func SweepingProviderOpt(cfg *config.Config) fx.Option {
  function hasDHTRouting (line 1051) | func hasDHTRouting(cfg *config.Config) bool {
  function routerIncludesDHT (line 1071) | func routerIncludesDHT(rp config.RouterParser, cfg *config.Config) bool {
  function OnlineProviders (line 1090) | func OnlineProviders(provide bool, cfg *config.Config) fx.Option {
  function OfflineProviders (line 1127) | func OfflineProviders() fx.Option {
  function mfsProvider (line 1133) | func mfsProvider(mfsRoot *mfs.Root, fetcher fetcher.Factory) provider.Ke...
  type provStrategyIn (line 1149) | type provStrategyIn struct
  type provStrategyOut (line 1159) | type provStrategyOut struct
  function createKeyProvider (line 1171) | func createKeyProvider(strategyFlag config.ProvideStrategy, in provStrat...
  function detectStrategyChange (line 1191) | func detectStrategyChange(ctx context.Context, strategy string, ds datas...
  function persistStrategy (line 1208) | func persistStrategy(ctx context.Context, strategy string, ds datastore....
  function handleStrategyChange (line 1221) | func handleStrategyChange(strategy string, provider DHTProvider, ds data...
  function setReproviderKeyProvider (line 1242) | func setReproviderKeyProvider(strategy string) func(in provStrategyIn) p...

FILE: core/node/storage.go
  function RepoConfig (line 16) | func RepoConfig(repo repo.Repo) (*config.Config, error) {
  function Datastore (line 22) | func Datastore(repo repo.Repo) datastore.Datastore {
  type BaseBlocks (line 27) | type BaseBlocks
  function BaseBlockstoreCtor (line 30) | func BaseBlockstoreCtor(
  function GcBlockstoreCtor (line 71) | func GcBlockstoreCtor(bb BaseBlocks) (gclocker blockstore.GCLocker, gcbs...
  function FilestoreBlockstoreCtor (line 80) | func FilestoreBlockstoreCtor(repo repo.Repo, bb BaseBlocks, prov DHTProv...

FILE: coverage/main/main.go
  function main (line 15) | func main() {

FILE: docs/examples/kubo-as-a-library/main.go
  function setupPlugins (line 31) | func setupPlugins(externalPluginsPath string) error {
  function createTempRepo (line 50) | func createTempRepo() (string, error) {
  function createNode (line 112) | func createNode(ctx context.Context, repoPath string) (*core.IpfsNode, e...
  function spawnEphemeral (line 138) | func spawnEphemeral(ctx context.Context) (icore.CoreAPI, *core.IpfsNode,...
  function connectToPeers (line 163) | func connectToPeers(ctx context.Context, ipfs icore.CoreAPI, peers []str...
  function getUnixfsNode (line 197) | func getUnixfsNode(path string) (files.Node, error) {
  function main (line 215) | func main() {

FILE: docs/examples/kubo-as-a-library/main_test.go
  function TestExample (line 13) | func TestExample(t *testing.T) {

FILE: fuse/ipns/common.go
  function InitializeKeyspace (line 15) | func InitializeKeyspace(n *core.IpfsNode, key ci.PrivKey) error {

FILE: fuse/ipns/ipns_test.go
  function maybeSkipFuseTests (line 26) | func maybeSkipFuseTests(t *testing.T) {
  function randBytes (line 32) | func randBytes(size int) []byte {
  function mkdir (line 41) | func mkdir(t *testing.T, path string) {
  function writeFileOrFail (line 48) | func writeFileOrFail(t *testing.T, size int, path string) []byte {
  function writeFile (line 56) | func writeFile(size int, path string) ([]byte, error) {
  function verifyFile (line 62) | func verifyFile(t *testing.T, path string, wantData []byte) {
  function checkExists (line 75) | func checkExists(t *testing.T, path string) {
  function closeMount (line 82) | func closeMount(mnt *mountWrap) {
  type mountWrap (line 90) | type mountWrap struct
    method Close (line 95) | func (m *mountWrap) Close() error {
  function setupIpnsTest (line 101) | func setupIpnsTest(t *testing.T, node *core.IpfsNode) (*core.IpfsNode, *...
  function TestIpnsLocalLink (line 141) | func TestIpnsLocalLink(t *testing.T) {
  function TestIpnsBasicIO (line 159) | func TestIpnsBasicIO(t *testing.T) {
  function TestFilePersistence (line 190) | func TestFilePersistence(t *testing.T) {
  function TestMultipleDirs (line 215) | func TestMultipleDirs(t *testing.T) {
  function TestFileSizeReporting (line 253) | func TestFileSizeReporting(t *testing.T) {
  function TestDoubleEntryFailure (line 274) | func TestDoubleEntryFailure(t *testing.T) {
  function TestAppendFile (line 293) | func TestAppendFile(t *testing.T) {
  function TestConcurrentWrites (line 334) | func TestConcurrentWrites(t *testing.T) {
  function TestFSThrash (line 381) | func TestFSThrash(t *testing.T) {
  function TestMultiWrite (line 466) | func TestMultiWrite(t *testing.T) {

FILE: fuse/ipns/ipns_unix.go
  function init (line 30) | func init() {
  type FileSystem (line 41) | type FileSystem struct
    method Root (line 61) | func (f *FileSystem) Root() (fs.Node, error) {
    method Destroy (line 66) | func (f *FileSystem) Destroy() {
  function NewFileSystem (line 47) | func NewFileSystem(ctx context.Context, ipfs iface.CoreAPI, ipfspath, ip...
  type Root (line 74) | type Root struct
    method Attr (line 154) | func (r *Root) Attr(ctx context.Context, a *fuse.Attr) error {
    method Lookup (line 161) | func (r *Root) Lookup(ctx context.Context, name string) (fs.Node, erro...
    method Close (line 199) | func (r *Root) Close() error {
    method Forget (line 211) | func (r *Root) Forget() {
    method ReadDirAll (line 220) | func (r *Root) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
  function ipnsPubFunc (line 87) | func ipnsPubFunc(ipfs iface.CoreAPI, key iface.Key) mfs.PubFunc {
  function loadRoot (line 94) | func loadRoot(ctx context.Context, ipfs iface.CoreAPI, key iface.Key) (*...
  function CreateRoot (line 121) | func CreateRoot(ctx context.Context, ipfs iface.CoreAPI, keys map[string...
  type Directory (line 239) | type Directory struct
    method Attr (line 253) | func (d *Directory) Attr(ctx context.Context, a *fuse.Attr) error {
    method Lookup (line 277) | func (d *Directory) Lookup(ctx context.Context, name string) (fs.Node,...
    method ReadDirAll (line 297) | func (d *Directory) ReadDirAll(ctx context.Context) ([]fuse.Dirent, er...
    method Mkdir (line 408) | func (d *Directory) Mkdir(ctx context.Context, req *fuse.MkdirRequest)...
    method Create (line 458) | func (d *Directory) Create(ctx context.Context, req *fuse.CreateReques...
    method Remove (line 490) | func (d *Directory) Remove(ctx context.Context, req *fuse.RemoveReques...
    method Rename (line 499) | func (d *Directory) Rename(ctx context.Context, req *fuse.RenameReques...
  type FileNode (line 243) | type FileNode struct
    method Attr (line 262) | func (fi *FileNode) Attr(ctx context.Context, a *fuse.Attr) error {
    method Fsync (line 385) | func (fi *FileNode) Fsync(ctx context.Context, req *fuse.FsyncRequest)...
    method Open (line 417) | func (fi *FileNode) Open(ctx context.Context, req *fuse.OpenRequest, r...
  type File (line 248) | type File struct
    method Read (line 322) | func (fi *File) Read(ctx context.Context, req *fuse.ReadRequest, resp ...
    method Write (line 345) | func (fi *File) Write(ctx context.Context, req *fuse.WriteRequest, res...
    method Flush (line 355) | func (fi *File) Flush(ctx context.Context, req *fuse.FlushRequest) err...
    method Setattr (line 368) | func (fi *File) Setattr(ctx context.Context, req *fuse.SetattrRequest,...
    method Forget (line 400) | func (fi *File) Forget() {
    method Release (line 454) | func (fi *File) Release(ctx context.Context, req *fuse.ReleaseRequest)...
  type ipnsRoot (line 532) | type ipnsRoot interface
  type ipnsDirectory (line 540) | type ipnsDirectory interface
  type ipnsFile (line 552) | type ipnsFile interface
  type ipnsFileNode (line 559) | type ipnsFileNode interface

FILE: fuse/ipns/link_unix.go
  type Link (line 13) | type Link struct
    method Attr (line 17) | func (l *Link) Attr(ctx context.Context, a *fuse.Attr) error {
    method Readlink (line 23) | func (l *Link) Readlink(ctx context.Context, req *fuse.ReadlinkRequest...

FILE: fuse/ipns/mount_unix.go
  function Mount (line 12) | func Mount(ipfs *core.IpfsNode, ipnsmp, ipfsmp string) (mount.Mount, err...

FILE: fuse/mfs/mfs_test.go
  function setUp (line 26) | func setUp(t *testing.T, ipfs *core.IpfsNode) (fs.FS, *fstestutil.Mount) {
  function TestReadWrite (line 52) | func TestReadWrite(t *testing.T) {
  function TestMkdir (line 94) | func TestMkdir(t *testing.T) {
  function TestPersistence (line 118) | func TestPersistence(t *testing.T) {
  function TestAttr (line 169) | func TestAttr(t *testing.T) {
  function TestConcurrentRW (line 220) | func TestConcurrentRW(t *testing.T) {
  function TestMFSRootXattr (line 298) | func TestMFSRootXattr(t *testing.T) {

FILE: fuse/mfs/mfs_unix.go
  constant ipfsCIDXattr (line 23) | ipfsCIDXattr = "ipfs_cid"
  constant mfsDirMode (line 24) | mfsDirMode   = os.ModeDir | 0755
  constant mfsFileMode (line 25) | mfsFileMode  = 0644
  constant blockSize (line 26) | blockSize    = 512
  constant dirSize (line 27) | dirSize      = 8
  type FileSystem (line 31) | type FileSystem struct
    method Root (line 36) | func (fs *FileSystem) Root() (fs.Node, error) {
  type Dir (line 41) | type Dir struct
    method Attr (line 46) | func (dir *Dir) Attr(ctx context.Context, attr *fuse.Attr) error {
    method Lookup (line 54) | func (dir *Dir) Lookup(ctx context.Context, req *fuse.LookupRequest, r...
    method ReadDirAll (line 81) | func (dir *Dir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) {
    method Mkdir (line 102) | func (dir *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs...
    method Remove (line 113) | func (dir *Dir) Remove(ctx context.Context, req *fuse.RemoveRequest) e...
    method Rename (line 138) | func (dir *Dir) Rename(ctx context.Context, req *fuse.RenameRequest, n...
    method Create (line 169) | func (dir *Dir) Create(ctx context.Context, req *fuse.CreateRequest, r...
    method Listxattr (line 217) | func (dir *Dir) Listxattr(ctx context.Context, req *fuse.ListxattrRequ...
    method Getxattr (line 223) | func (dir *Dir) Getxattr(ctx context.Context, req *fuse.GetxattrReques...
  type File (line 238) | type File struct
    method Attr (line 243) | func (file *File) Attr(ctx context.Context, attr *fuse.Attr) error {
    method Open (line 261) | func (file *File) Open(ctx context.Context, req *fuse.OpenRequest, res...
    method Fsync (line 285) | func (file *File) Fsync(ctx context.Context, req *fuse.FsyncRequest) e...
    method Listxattr (line 290) | func (file *File) Listxattr(ctx context.Context, req *fuse.ListxattrRe...
    method Getxattr (line 296) | func (file *File) Getxattr(ctx context.Context, req *fuse.GetxattrRequ...
  type FileHandler (line 312) | type FileHandler struct
    method Read (line 318) | func (fh *FileHandler) Read(ctx context.Context, req *fuse.ReadRequest...
    method Write (line 341) | func (fh *FileHandler) Write(ctx context.Context, req *fuse.WriteReque...
    method Flush (line 355) | func (fh *FileHandler) Flush(ctx context.Context, req *fuse.FlushReque...
    method Release (line 363) | func (fh *FileHandler) Release(ctx context.Context, req *fuse.ReleaseR...
  function NewFileSystem (line 371) | func NewFileSystem(ipfs *core.IpfsNode) fs.FS {
  type mfsDir (line 380) | type mfsDir interface
  type mfsFile (line 394) | type mfsFile interface
  type mfsHandler (line 404) | type mfsHandler interface

FILE: fuse/mfs/mount_unix.go
  function Mount (line 11) | func Mount(ipfs *core.IpfsNode, mountpoint string) (mount.Mount, error) {

FILE: fuse/mount/fuse.go
  type mount (line 18) | type mount struct
    method mount (line 66) | func (m *mount) mount() error {
    method unmount (line 105) | func (m *mount) unmount() error {
    method MountPoint (line 134) | func (m *mount) MountPoint() string {
    method Unmount (line 138) | func (m *mount) Unmount() error {
    method IsActive (line 151) | func (m *mount) IsActive() bool {
    method setActive (line 158) | func (m *mount) setActive(a bool) {
  function NewMount (line 31) | func NewMount(fsys fs.FS, mountpoint string, allowOther bool) (Mount, er...

FILE: fuse/mount/mount.go
  type Mount (line 19) | type Mount interface
  function ForceUnmount (line 32) | func ForceUnmount(m Mount) error {
  function UnmountCmd (line 64) | func UnmountCmd(point string) (*exec.Cmd, error) {
  function ForceUnmountManyTimes (line 78) | func ForceUnmountManyTimes(m Mount, attempts int) error {
  type closer (line 91) | type closer struct
    method Close (line 95) | func (c *closer) Close() error {
  function Closer (line 100) | func Closer(m Mount) io.Closer {

FILE: fuse/node/mount_darwin.go
  function init (line 18) | func init() {
  constant dontCheckOSXFUSEConfigKey (line 25) | dontCheckOSXFUSEConfigKey = "DontCheckOSXFUSE"
  constant fuseVersionPkg (line 28) | fuseVersionPkg = "github.com/jbenet/go-fuse-version/fuse-version"
  constant errStrFuseRequired (line 31) | errStrFuseRequired = `OSXFUSE not found.
  type errNeedFuseVersion (line 61) | type errNeedFuseVersion struct
    method Error (line 65) | func (me errNeedFuseVersion) Error() string {
  function darwinFuseCheckVersion (line 128) | func darwinFuseCheckVersion(node *core.IpfsNode) error {
  function tryGFV (line 161) | func tryGFV() (string, error) {
  function trySysctl (line 172) | func trySysctl() (string, error) {
  function tryGFVFromFuseVersion (line 182) | func tryGFVFromFuseVersion() 
Condensed preview — 921 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,408K chars).
[
  {
    "path": ".codeclimate.yml",
    "chars": 648,
    "preview": "ratings:\n  paths: \n  - \"**/*.go\"\n\nexclude_paths:\n- test/\n- Godeps/\n- thirdparty/\n- \"**/*.pb.go\"\n\nengines:\n  fixme:\n    e"
  },
  {
    "path": ".cspell.yml",
    "chars": 284,
    "preview": "ignoreWords:\n  - childs # This spelling is used in the files command\n  - NodeCreater # This spelling is used in the fuse"
  },
  {
    "path": ".dockerignore",
    "chars": 255,
    "preview": "Dockerfile\nDockerfile.fast\n.git/\n!.git/HEAD\n!.git/refs/\n!.git/packed-refs\ntest/sharness/lib/sharness/\ntest/sharness/tras"
  },
  {
    "path": ".gitattributes",
    "chars": 1400,
    "preview": "# Default to text\n* text eol=lf\n\n# True text\n*.md text eol=auto\nLICENSE text eol=auto\n\n# Known binary types\n*.png binary"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 311,
    "preview": "# Code owners are automatically requested for review when someone opens a pull\n# request that modifies code that they ow"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 34,
    "preview": "custom: [ipshipyard.gitwallet.co]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yml",
    "chars": 2426,
    "preview": "name: Bug Report\ndescription: Report a bug in Kubo.\nlabels:\n  - kind/bug\n  - need/triage\nbody:\n  - type: markdown\n    at"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 852,
    "preview": "blank_issues_enabled: false\ncontact_links:\n - name: Getting Help on IPFS\n   url: https://ipfs.tech/help\n   about: All in"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/doc.yml",
    "chars": 980,
    "preview": "name: Documentation Issue\ndescription: Report missing, erroneous docs, broken links or propose new Kubo docs.\nlabels:\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/enhancement.yml",
    "chars": 1481,
    "preview": "name: Enhancement\ndescription: Suggest an improvement to an existing kubo feature.\nlabels:\n  - kind/enhancement\n  - need"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature.yml",
    "chars": 1537,
    "preview": "name: Feature\ndescription: Suggest a new feature in Kubo.\nlabels:\n  - kind/feature\n  - need/triage\nbody:\n  - type: markd"
  },
  {
    "path": ".github/auto-comment.yml",
    "chars": 91,
    "preview": "# Comment to a new issue.\n# Disabled\n# issueOpened: \"\"\n\n# Disabled\n# pullRequestOpened: \"\"\n"
  },
  {
    "path": ".github/build-platforms.yml",
    "chars": 486,
    "preview": "# Build platforms configuration for Kubo\n# Matches https://github.com/ipfs/distributions/blob/master/dists/kubo/build_ma"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 1246,
    "preview": "# Dependabot PRs are auto-tidied by .github/workflows/dependabot-tidy.yml\nversion: 2\nupdates:\n  - package-ecosystem: \"gi"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 231,
    "preview": "<!--\nPlease update docs/changelogs/ if you're modifying Go files. If your change does not require a changelog entry, ple"
  },
  {
    "path": ".github/workflows/changelog.yml",
    "chars": 1229,
    "preview": "name: Changelog\n\non:\n  pull_request:\n    types:\n      - opened\n      - edited\n      - synchronize\n      - reopened\n     "
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1358,
    "preview": "# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/config"
  },
  {
    "path": ".github/workflows/dependabot-tidy.yml",
    "chars": 2017,
    "preview": "# Dependabot only updates go.mod/go.sum in the root module, but this repo has\n# multiple Go modules (see docs/examples/)"
  },
  {
    "path": ".github/workflows/docker-check.yml",
    "chars": 1805,
    "preview": "# This workflow performs a quick Docker build check on PRs and pushes to master.\n# It builds the Docker image and runs a"
  },
  {
    "path": ".github/workflows/docker-image.yml",
    "chars": 4970,
    "preview": "# This workflow builds and publishes official Docker images to Docker Hub.\n# It handles multi-platform builds (amd64, ar"
  },
  {
    "path": ".github/workflows/gateway-conformance.yml",
    "chars": 8025,
    "preview": "name: Gateway Conformance\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - master\n  pull_request:\n    paths-ignor"
  },
  {
    "path": ".github/workflows/generated-pr.yml",
    "chars": 246,
    "preview": "name: Close Generated PRs\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n  workflow_dispatch:\n\npermissions:\n  issues: write\n  "
  },
  {
    "path": ".github/workflows/gobuild.yml",
    "chars": 1727,
    "preview": "name: Go Build\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths-ignore:\n      - '**/*.md'\n  push:\n    branches:\n     "
  },
  {
    "path": ".github/workflows/golang-analysis.yml",
    "chars": 1845,
    "preview": "name: Go Check\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths-ignore:\n      - '**/*.md'\n  push:\n    branches:\n     "
  },
  {
    "path": ".github/workflows/golint.yml",
    "chars": 781,
    "preview": "name: Go Lint\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths-ignore:\n      - '**/*.md'\n  push:\n    branches:\n      "
  },
  {
    "path": ".github/workflows/gotest.yml",
    "chars": 5674,
    "preview": "name: Go Test\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths-ignore:\n      - '**/*.md'\n  push:\n    branches:\n      "
  },
  {
    "path": ".github/workflows/interop.yml",
    "chars": 7934,
    "preview": "# Interoperability Tests\n#\n# This workflow ensures Kubo remains compatible with the broader IPFS ecosystem.\n# It builds "
  },
  {
    "path": ".github/workflows/sharness.yml",
    "chars": 5059,
    "preview": "name: Sharness\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths-ignore:\n      - \"**/*.md\"\n  push:\n    branches:\n     "
  },
  {
    "path": ".github/workflows/spellcheck.yml",
    "chars": 393,
    "preview": "name: Spell Check\n\non:\n  pull_request:\n  push:\n    branches: [\"master\"]\n  workflow_dispatch:\n\npermissions:\n  contents: r"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 244,
    "preview": "name: Close Stale Issues\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n  workflow_dispatch:\n\npermissions:\n  issues: write\n  p"
  },
  {
    "path": ".github/workflows/sync-release-assets.yml",
    "chars": 5371,
    "preview": "name: Sync GitHub Release Assets\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 * * *'\n\nconcurrency:\n  group: re"
  },
  {
    "path": ".github/workflows/test-migrations.yml",
    "chars": 2224,
    "preview": "name: Migrations\n\non:\n  workflow_dispatch:\n  pull_request:\n    paths:\n      # Migration implementation files\n      - 're"
  },
  {
    "path": ".gitignore",
    "chars": 570,
    "preview": "# ipfs can generate profiling dump files\n*.cpuprof\n*.memprof\n\n*.swp\n.ipfsconfig\n*.out\n*.coverprofile\n*.test\n*.orig\n*~\n\nc"
  },
  {
    "path": ".golangci.yml",
    "chars": 181,
    "preview": "linters:\n  enable:\n    - stylecheck\n\nlinters-settings:\n  stylecheck:\n    checks:\n    - all\n    - '-ST1003'\n    dot-impor"
  },
  {
    "path": ".hadolint.yaml",
    "chars": 338,
    "preview": "# Hadolint configuration for Kubo Docker image\n# https://github.com/hadolint/hadolint\n\n# Ignore specific rules\nignored:\n"
  },
  {
    "path": ".mailmap",
    "chars": 11761,
    "preview": "# This file allows re-mapping author names/emails\n# while maintaining the integrity of the repository\n#\n# Spec: https://"
  },
  {
    "path": "AGENTS.md",
    "chars": 10039,
    "preview": "# AI Agent Instructions for Kubo\n\nThis file provides instructions for AI coding agents working on the [Kubo](https://git"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 1479,
    "preview": "# Kubo Changelogs\n\n- [v0.42](docs/changelogs/v0.42.md)\n- [v0.41](docs/changelogs/v0.41.md)\n- [v0.40](docs/changelogs/v0."
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 691,
    "preview": "# Contributing to Kubo\n\n**For development setup, building, and testing, see the [Developer Guide](docs/developer-guide.m"
  },
  {
    "path": "Dockerfile",
    "chars": 3807,
    "preview": "# syntax=docker/dockerfile:1\n# Enables BuildKit with cache mounts for faster builds\nFROM --platform=${BUILDPLATFORM:-lin"
  },
  {
    "path": "FUNDING.json",
    "chars": 109,
    "preview": "{\n  \"opRetro\": {\n    \"projectId\": \"0x7f330267969cf845a983a9d4e7b7dbcca5c700a5191269af377836d109e0bb69\"\n  }\n}\n"
  },
  {
    "path": "GNUmakefile",
    "chars": 109,
    "preview": "# General tools\n\nSHELL=PATH='$(PATH)' /bin/sh\n\n# enable second expansion\n.SECONDEXPANSION:\n\ninclude Rules.mk\n"
  },
  {
    "path": "LICENSE",
    "chars": 508,
    "preview": "This project is transitioning from an MIT-only license to a dual MIT/Apache-2.0 license. \nUnless otherwise noted, all co"
  },
  {
    "path": "LICENSE-APACHE",
    "chars": 520,
    "preview": "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the "
  },
  {
    "path": "LICENSE-MIT",
    "chars": 1046,
    "preview": "The MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and"
  },
  {
    "path": "Makefile",
    "chars": 50,
    "preview": "all:\n\t@gmake $@\n.PHONY: all\n\n.DEFAULT:\n\t@gmake $@\n"
  },
  {
    "path": "README.md",
    "chars": 13146,
    "preview": "<h1 align=\"center\">\n  <br>\n  <a href=\"https://github.com/ipfs/kubo/blob/master/docs/logo/\"><img src=\"https://user-images"
  },
  {
    "path": "Rules.mk",
    "chars": 4065,
    "preview": "TGT_BIN :=\nCLEAN :=\nCOVERAGE :=\nDISTCLEAN :=\nTEST :=\nTEST_SHORT :=\nGOCC ?= go\nPROTOC ?= protoc\n\nall: help    # all has t"
  },
  {
    "path": "SECURITY.md",
    "chars": 848,
    "preview": "# Security Policy\n\nThe IPFS protocol and its implementations are still in heavy development. This\nmeans that there may b"
  },
  {
    "path": "assets/README.md",
    "chars": 121,
    "preview": "# Assets loaded in with IPFS\n\nThis directory contains the go-ipfs assets:\n\n* Getting started documentation (`init-doc`)."
  },
  {
    "path": "assets/assets.go",
    "chars": 1450,
    "preview": "package assets\n\nimport (\n\t\"embed\"\n\t\"fmt\"\n\tgopath \"path\"\n\n\t\"github.com/ipfs/kubo/core\"\n\t\"github.com/ipfs/kubo/core/coreap"
  },
  {
    "path": "assets/init-doc/about",
    "chars": 1681,
    "preview": "\n                  IPFS -- Inter-Planetary File system\n\nIPFS is a global, versioned, peer-to-peer filesystem. It combine"
  },
  {
    "path": "assets/init-doc/contact",
    "chars": 189,
    "preview": "Come hang out in our IRC chat room if you have any questions.\n\nContact the ipfs dev team:\n- Bugs: https://github.com/ipf"
  },
  {
    "path": "assets/init-doc/docs/index",
    "chars": 6,
    "preview": "Index\n"
  },
  {
    "path": "assets/init-doc/help",
    "chars": 311,
    "preview": "Some helpful resources for finding your way around ipfs:\n\n- quick-start: a quick show of various ipfs features.\n- ipfs c"
  },
  {
    "path": "assets/init-doc/ping",
    "chars": 4,
    "preview": "ipfs"
  },
  {
    "path": "assets/init-doc/quick-start",
    "chars": 1681,
    "preview": "# 0.1 - Quick Start\n\nThis is a set of short examples with minimal explanation. It is meant as\na \"quick start\".\n\n\nAdd a f"
  },
  {
    "path": "assets/init-doc/readme",
    "chars": 819,
    "preview": "Hello and Welcome to IPFS!\n\n██╗██████╗ ███████╗███████╗\n██║██╔══██╗██╔════╝██╔════╝\n██║██████╔╝█████╗  ███████╗\n██║██╔══"
  },
  {
    "path": "assets/init-doc/security-notes",
    "chars": 1162,
    "preview": "                    IPFS Alpha Security Notes\n\nWe try hard to ensure our system is safe and robust, but all software\nhas"
  },
  {
    "path": "bin/Rules.mk",
    "chars": 433,
    "preview": "include mk/header.mk\n\ndist_root_$(d)=\"/ipfs/QmPrXH9jRVwvd7r5MC5e6nV4uauQGzLk1i2647Ye9Vbbwe\"\n\nTGTS_$(d) := $(d)/protoc\nDI"
  },
  {
    "path": "bin/archive-branches.sh",
    "chars": 1601,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\nIFS=$'\\n\\t'\n\nauth=\"\"\n#auth=\"-u kubuxu:$GH_TOKEN\"\norg=ipfs\nrepo=go-ipfs\narch_repo=g"
  },
  {
    "path": "bin/container_daemon",
    "chars": 1537,
    "preview": "#!/bin/sh\nset -e\n\nuser=ipfs\nrepo=\"$IPFS_PATH\"\n\nif [ \"$(id -u)\" -eq 0 ]; then\n  echo \"Changing user to $user\"\n  # ensure "
  },
  {
    "path": "bin/container_init_run",
    "chars": 256,
    "preview": "#!/bin/sh\n\nset -e\n\n# used by the container startup script for running initialization scripts\n\nscript=\"$1\"\nif [ -x \"$scri"
  },
  {
    "path": "bin/dist_get",
    "chars": 3998,
    "preview": "#!/bin/sh\n\nGOCC=${GOCC=go}\n\ndie() {\n\techo \"$@\" >&2\n\texit 1\n}\n\nhave_binary() {\n\ttype \"$1\" > /dev/null 2> /dev/null\n}\n\nche"
  },
  {
    "path": "bin/gencmdref",
    "chars": 770,
    "preview": "#!/usr/bin/env python\n\nimport os\nimport sys\nimport datetime\n\nfrom subprocess import check_output\n\ndef run(cmd):\n  return"
  },
  {
    "path": "bin/get-docker-tags.sh",
    "chars": 1756,
    "preview": "#!/usr/bin/env bash\n\n# get-docker-tags.sh\n#\n# Usage:\n#   ./get-docker-tags.sh <build number> <git commit sha1> <git bran"
  },
  {
    "path": "bin/graphmd",
    "chars": 723,
    "preview": "#!/bin/sh\n\nif [ \"$#\" -ne 1 ]; then\n  echo \"usage: $0 <ipfs-path>...\"\n  echo \"output merkledag links in graphviz dot\"\n  e"
  },
  {
    "path": "bin/ipns-republish",
    "chars": 681,
    "preview": "#!/bin/bash\n\nif [ \"$#\" -ne 1 ]; then\n  echo \"usage: $0 <ipfs-or-ipns-path>\"\n  echo \"republishes an ipns name every 20 mi"
  },
  {
    "path": "bin/maketarball.sh",
    "chars": 541,
    "preview": "#!/usr/bin/env bash\n# vim: set expandtab sw=2 ts=2:\n\n# bash safe mode\nset -euo pipefail\nIFS=$'\\n\\t'\n\n# readlink doesn't "
  },
  {
    "path": "bin/mkreleaselog",
    "chars": 21804,
    "preview": "#!/bin/bash\n#\n# Invocation: mkreleaselog [FIRST_REF [LAST_REF]]\n#\n# Generates release notes with contributor statistics,"
  },
  {
    "path": "bin/push-docker-tags.sh",
    "chars": 2754,
    "preview": "#!/usr/bin/env bash\n#\n# TODO: this script is legacy, use get-docker-tags.sh instead.\n#\n# push-docker-tags.sh\n#\n# Run fro"
  },
  {
    "path": "bin/test-go-build-platforms",
    "chars": 658,
    "preview": "#!/bin/bash\nset -e\n\necho \"Building kubo for all platforms in .github/build-platforms.yml...\"\n\nif [ ! -f .github/build-pl"
  },
  {
    "path": "bin/test-go-fmt",
    "chars": 454,
    "preview": "#!/usr/bin/env bash\nset -euo pipefail\nT=\"$(mktemp)\"\nfind . \\\n    -path ./test/sharness -prune \\\n -o -path ./plugin/loade"
  },
  {
    "path": "blocks/blockstoreutil/remove.go",
    "chars": 2949,
    "preview": "// Package blockstoreutil provides utility functions for Blockstores.\npackage blockstoreutil\n\nimport (\n\t\"context\"\n\t\"erro"
  },
  {
    "path": "client/rpc/README.md",
    "chars": 913,
    "preview": "# `coreiface.CoreAPI` over http `rpc`\n\n> IPFS CoreAPI implementation using HTTP API\n\nThis package implements [`coreiface"
  },
  {
    "path": "client/rpc/api.go",
    "chars": 7046,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n"
  },
  {
    "path": "client/rpc/api_test.go",
    "chars": 3729,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\t\"testing\"\n\t\"t"
  },
  {
    "path": "client/rpc/apifile.go",
    "chars": 6862,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo"
  },
  {
    "path": "client/rpc/auth/auth.go",
    "chars": 885,
    "preview": "package auth\n\nimport \"net/http\"\n\nvar _ http.RoundTripper = &AuthorizedRoundTripper{}\n\ntype AuthorizedRoundTripper struct"
  },
  {
    "path": "client/rpc/block.go",
    "chars": 2927,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/go-cid\"\n\tiface \"g"
  },
  {
    "path": "client/rpc/dag.go",
    "chars": 3427,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tblocks \"github.com/ipfs/go-block-f"
  },
  {
    "path": "client/rpc/errors.go",
    "chars": 4015,
    "preview": "package rpc\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"unicode/utf8\"\n\n\t\"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-ipld-for"
  },
  {
    "path": "client/rpc/errors_test.go",
    "chars": 2800,
    "preview": "package rpc\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-ipld-format\"\n\tmba"
  },
  {
    "path": "client/rpc/key.go",
    "chars": 4002,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"errors\"\n\n\t\"github.com/ipfs/boxo/ipns\"\n\t\"github.com/ipfs/boxo/path\"\n\tiface \"g"
  },
  {
    "path": "client/rpc/name.go",
    "chars": 3181,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/ipns\"\n\t\"github.com/ipfs/boxo/name"
  },
  {
    "path": "client/rpc/object.go",
    "chars": 2019,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/go-cid\"\n\tiface \"github.com/ipfs/kubo/co"
  },
  {
    "path": "client/rpc/path.go",
    "chars": 1103,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tcid \"github.com/ipfs/go-cid\"\n\tipld \"github.com/ipfs/go-i"
  },
  {
    "path": "client/rpc/pin.go",
    "chars": 5199,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/"
  },
  {
    "path": "client/rpc/pubsub.go",
    "chars": 4472,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"io\"\n\n\tiface \"github.com/ipfs/kubo/core/coreiface\"\n\tcaopts \""
  },
  {
    "path": "client/rpc/request.go",
    "chars": 623,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"strings\"\n)\n\ntype Request struct {\n\tCtx     context.Context\n\tApiBase string\n\tCom"
  },
  {
    "path": "client/rpc/requestbuilder.go",
    "chars": 3743,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/blang/semver/v4\"\n\t\"github.com"
  },
  {
    "path": "client/rpc/response.go",
    "chars": 3804,
    "preview": "package rpc\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"mime\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/ipfs/bo"
  },
  {
    "path": "client/rpc/routing.go",
    "chars": 3518,
    "preview": "package rpc\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com"
  },
  {
    "path": "client/rpc/swarm.go",
    "chars": 3969,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"time\"\n\n\tiface \"github.com/ipfs/kubo/core/coreiface\"\n\t\"github.com/libp2p/go-libp2p/cor"
  },
  {
    "path": "client/rpc/unixfs.go",
    "chars": 4611,
    "preview": "package rpc\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/files\"\n\tu"
  },
  {
    "path": "codecov.yml",
    "chars": 322,
    "preview": "codecov:\n  ci:\n    - \"!travis-ci.org\"\n    - \"!ci.ipfs.team:8111\"\n    - \"!ci.ipfs.team\"\n    - \"github.com\"\n  notify:\n    "
  },
  {
    "path": "commands/context.go",
    "chars": 3789,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\tcore \"github.com/ipfs/kubo/core\"\n\tcoreapi \"github.c"
  },
  {
    "path": "commands/reqlog.go",
    "chars": 2042,
    "preview": "package commands\n\nimport (\n\t\"sync\"\n\t\"time\"\n)\n\n// ReqLogEntry is an entry in the request log.\ntype ReqLogEntry struct {\n\t"
  },
  {
    "path": "config/addresses.go",
    "chars": 621,
    "preview": "package config\n\n// Addresses stores the (string) multiaddr addresses for the node.\ntype Addresses struct {\n\tSwarm       "
  },
  {
    "path": "config/api.go",
    "chars": 1802,
    "preview": "package config\n\nimport (\n\t\"encoding/base64\"\n\t\"strings\"\n)\n\nconst (\n\tAPITag           = \"API\"\n\tAuthorizationTag = \"Authori"
  },
  {
    "path": "config/api_test.go",
    "chars": 460,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestConvertAuthSecret(t *testing.T) {"
  },
  {
    "path": "config/autoconf.go",
    "chars": 10357,
    "preview": "package config\n\nimport (\n\t\"maps\"\n\t\"math/rand/v2\"\n\t\"strings\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\tlogging \"github.com/ipfs/"
  },
  {
    "path": "config/autoconf_client.go",
    "chars": 4331,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"sync\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\tlogging \"github.co"
  },
  {
    "path": "config/autoconf_test.go",
    "chars": 2723,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfun"
  },
  {
    "path": "config/autonat.go",
    "chars": 2579,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n)\n\n// AutoNATServiceMode configures the ipfs node's AutoNAT service.\ntype AutoNATService"
  },
  {
    "path": "config/autotls.go",
    "chars": 2411,
    "preview": "package config\n\nimport (\n\t\"time\"\n\n\tp2pforge \"github.com/ipshipyard/p2p-forge/client\"\n)\n\n// AutoTLS includes optional con"
  },
  {
    "path": "config/bitswap.go",
    "chars": 513,
    "preview": "package config\n\n// Bitswap holds Bitswap configuration options\ntype Bitswap struct {\n\t// Libp2pEnabled controls if the n"
  },
  {
    "path": "config/bootstrap_peers.go",
    "chars": 1256,
    "preview": "package config\n\nimport (\n\t\"errors\"\n\n\tpeer \"github.com/libp2p/go-libp2p/core/peer\"\n\tma \"github.com/multiformats/go-multia"
  },
  {
    "path": "config/bootstrap_peers_test.go",
    "chars": 922,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/autoconf\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com"
  },
  {
    "path": "config/config.go",
    "chars": 7169,
    "preview": "// package config implements the ipfs config file datastructures and utilities.\npackage config\n\nimport (\n\t\"bytes\"\n\t\"enco"
  },
  {
    "path": "config/config_test.go",
    "chars": 4436,
    "preview": "package config\n\nimport (\n\t\"testing\"\n)\n\nfunc TestClone(t *testing.T) {\n\tc := new(Config)\n\tc.Identity.PeerID = \"faketest\"\n"
  },
  {
    "path": "config/datastore.go",
    "chars": 1541,
    "preview": "package config\n\nimport (\n\t\"encoding/json\"\n)\n\nconst (\n\t// DefaultDataStoreDirectory is the directory to store all the loc"
  },
  {
    "path": "config/discovery.go",
    "chars": 89,
    "preview": "package config\n\ntype Discovery struct {\n\tMDNS MDNS\n}\n\ntype MDNS struct {\n\tEnabled bool\n}\n"
  },
  {
    "path": "config/dns.go",
    "chars": 731,
    "preview": "package config\n\n// DNS specifies DNS resolution rules using custom resolvers.\ntype DNS struct {\n\t// Resolvers is a map o"
  },
  {
    "path": "config/experiments.go",
    "chars": 698,
    "preview": "package config\n\ntype Experiments struct {\n\tFilestoreEnabled              bool\n\tUrlstoreEnabled               bool\n\tShard"
  },
  {
    "path": "config/gateway.go",
    "chars": 5857,
    "preview": "package config\n\nimport (\n\t\"github.com/ipfs/boxo/gateway\"\n)\n\nconst (\n\tDefaultInlineDNSLink         = false\n\tDefaultDeseri"
  },
  {
    "path": "config/http_retrieval.go",
    "chars": 875,
    "preview": "package config\n\n// HTTPRetrieval is the configuration object for HTTP Retrieval settings.\n// Implicit defaults can be fo"
  },
  {
    "path": "config/identity.go",
    "chars": 728,
    "preview": "package config\n\nimport (\n\t\"encoding/base64\"\n\n\tic \"github.com/libp2p/go-libp2p/core/crypto\"\n)\n\nconst (\n\tIdentityTag     ="
  },
  {
    "path": "config/import.go",
    "chars": 9126,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strconv\"\n\t\"strings\"\n\n\tchunk \"github.com/ipfs/boxo/chunker\"\n\t\"github.com/ipfs/box"
  },
  {
    "path": "config/import_test.go",
    "chars": 16420,
    "preview": "package config\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/ipld/unixfs/io\"\n\tmh \"github.com/multiformats/go-m"
  },
  {
    "path": "config/init.go",
    "chars": 6921,
    "preview": "package config\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\t\"github.com/cockroachdb/pebble/v2\"\n\t\"g"
  },
  {
    "path": "config/init_test.go",
    "chars": 1130,
    "preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/ipfs/kubo/core/coreiface/options\"\n\tcrypto_pb \"github.com/libp"
  },
  {
    "path": "config/internal.go",
    "chars": 4086,
    "preview": "package config\n\nconst (\n\t// DefaultMFSNoFlushLimit is the default limit for consecutive unflushed MFS operations\n\tDefaul"
  },
  {
    "path": "config/ipns.go",
    "chars": 510,
    "preview": "package config\n\nimport (\n\t\"math\"\n\t\"time\"\n)\n\nconst (\n\tDefaultIpnsMaxCacheTTL = time.Duration(math.MaxInt64)\n)\n\ntype Ipns "
  },
  {
    "path": "config/migration.go",
    "chars": 967,
    "preview": "package config\n\nconst DefaultMigrationKeep = \"cache\"\n\n// DefaultMigrationDownloadSources defines the default download so"
  },
  {
    "path": "config/migration_test.go",
    "chars": 659,
    "preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n)\n\nfunc TestMigrationDecode(t *testing.T) {\n\tstr := `\n\t\t{\n\t\t\t\"Downl"
  },
  {
    "path": "config/mounts.go",
    "chars": 173,
    "preview": "package config\n\n// Mounts stores the (string) mount points.\ntype Mounts struct {\n\tIPFS           string\n\tIPNS           "
  },
  {
    "path": "config/peering.go",
    "chars": 215,
    "preview": "package config\n\nimport \"github.com/libp2p/go-libp2p/core/peer\"\n\n// Peering configures the peering service.\ntype Peering "
  },
  {
    "path": "config/plugins.go",
    "chars": 214,
    "preview": "package config\n\ntype Plugins struct {\n\tPlugins map[string]Plugin\n\t// TODO: Loader Path? Leaving that out for now due to "
  },
  {
    "path": "config/profile.go",
    "chars": 15352,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\n// Transformer is a function which takes configuration and applies som"
  },
  {
    "path": "config/provide.go",
    "chars": 7711,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/libp2p/go-libp2p-kad-dht/amino\"\n)\n\nconst (\n\tDefaultProv"
  },
  {
    "path": "config/provide_test.go",
    "chars": 6446,
    "preview": "package config\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require"
  },
  {
    "path": "config/provider.go",
    "chars": 703,
    "preview": "package config\n\n// Provider configuration describes how NEW CIDs are announced the moment they are created.\n// For perio"
  },
  {
    "path": "config/pubsub.go",
    "chars": 1595,
    "preview": "package config\n\nconst (\n\t// LastSeenMessagesStrategy is a strategy that calculates the TTL countdown\n\t// based on the la"
  },
  {
    "path": "config/remotepin.go",
    "chars": 835,
    "preview": "package config\n\nvar (\n\tRemoteServicesPath     = \"Pinning.RemoteServices\"\n\tPinningConcealSelector = []string{\"Pinning\", \""
  },
  {
    "path": "config/reprovider.go",
    "chars": 621,
    "preview": "package config\n\n// Reprovider configuration describes how CID from local datastore are periodically re-announced to rout"
  },
  {
    "path": "config/routing.go",
    "chars": 7953,
    "preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n)\n\nconst (\n\tDefaultAcceleratedDHT"
  },
  {
    "path": "config/routing_test.go",
    "chars": 3047,
    "preview": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestRouterP"
  },
  {
    "path": "config/serialize/serialize.go",
    "chars": 1541,
    "preview": "package fsrepo\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/ipfs/kubo/config\"\n"
  },
  {
    "path": "config/serialize/serialize_test.go",
    "chars": 772,
    "preview": "package fsrepo\n\nimport (\n\t\"os\"\n\t\"runtime\"\n\t\"testing\"\n\n\tconfig \"github.com/ipfs/kubo/config\"\n)\n\nfunc TestConfig(t *testin"
  },
  {
    "path": "config/swarm.go",
    "chars": 5147,
    "preview": "package config\n\ntype SwarmConfig struct {\n\t// AddrFilters specifies a set libp2p addresses that we should never\n\t// dial"
  },
  {
    "path": "config/types.go",
    "chars": 13889,
    "preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\thumanize \"github.com/dustin/go-huma"
  },
  {
    "path": "config/types_test.go",
    "chars": 16702,
    "preview": "package config\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.co"
  },
  {
    "path": "config/version.go",
    "chars": 529,
    "preview": "package config\n\nconst DefaultSwarmCheckPercentThreshold = 5\n\n// Version allows controlling things like custom user agent"
  },
  {
    "path": "core/.gitignore",
    "chars": 8,
    "preview": ".testdb\n"
  },
  {
    "path": "core/builder.go",
    "chars": 5471,
    "preview": "package core\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/bootstrap\"\n\t\"github.com/ipfs"
  },
  {
    "path": "core/commands/active.go",
    "chars": 2757,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\toldcmds \"github.com/ipfs/kubo/commands\"\n\n\t"
  },
  {
    "path": "core/commands/add.go",
    "chars": 29024,
    "preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/ipfs/kubo/con"
  },
  {
    "path": "core/commands/bitswap.go",
    "chars": 5806,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\tcmdenv \"github.com/ipfs/kubo/core/commands/cmdenv\"\n\n\thumanize \"github.com/dust"
  },
  {
    "path": "core/commands/block.go",
    "chars": 8748,
    "preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/ipfs/boxo/files\"\n\n\t\"github.com/ipfs/kubo/config\"\n\t"
  },
  {
    "path": "core/commands/bootstrap.go",
    "chars": 11446,
    "preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tconfig \"gi"
  },
  {
    "path": "core/commands/cat.go",
    "chars": 4379,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/i"
  },
  {
    "path": "core/commands/cid.go",
    "chars": 16919,
    "preview": "package commands\n\nimport (\n\t\"cmp\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\t\"unicode\"\n\n\tverifcid \"git"
  },
  {
    "path": "core/commands/cid_test.go",
    "chars": 2918,
    "preview": "package commands\n\nimport (\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/multiformats/go-multibase\"\n)\n\nf"
  },
  {
    "path": "core/commands/cmdenv/cidbase.go",
    "chars": 3293,
    "preview": "package cmdenv\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\tcid \"github.com/ipfs/go-cid\"\n\tcidenc \"github.com/ipfs/go-cidutil/cidenc\"\n\tc"
  },
  {
    "path": "core/commands/cmdenv/cidbase_test.go",
    "chars": 1574,
    "preview": "package cmdenv\n\nimport (\n\t\"testing\"\n\n\tcidenc \"github.com/ipfs/go-cidutil/cidenc\"\n\tmbase \"github.com/multiformats/go-mult"
  },
  {
    "path": "core/commands/cmdenv/env.go",
    "chars": 6529,
    "preview": "package cmdenv\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/ipfs/go-cid\"\n\tcmds \"github.com/ipfs/go-ip"
  },
  {
    "path": "core/commands/cmdenv/env_test.go",
    "chars": 897,
    "preview": "package cmdenv\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n)\n\nfunc TestEscNonPrint(t *testing.T) {\n\tb := []byte(\"hello\")\n\tb[2] = 0x7"
  },
  {
    "path": "core/commands/cmdenv/file.go",
    "chars": 443,
    "preview": "package cmdenv\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/ipfs/boxo/files\"\n)\n\n// GetFileArg returns the next file from the directory"
  },
  {
    "path": "core/commands/cmdutils/sanitize.go",
    "chars": 1482,
    "preview": "package cmdutils\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n)\n\nconst maxRunes = 128\n\n// CleanAndTrim sanitizes untrusted strings fr"
  },
  {
    "path": "core/commands/cmdutils/utils.go",
    "chars": 3025,
    "preview": "package cmdutils\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\n\t\"github.com/ipfs/boxo/path\"\n\t\"github"
  },
  {
    "path": "core/commands/cmdutils/utils_test.go",
    "chars": 3456,
    "preview": "package cmdutils\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/re"
  },
  {
    "path": "core/commands/commands.go",
    "chars": 6838,
    "preview": "// Package commands implements the ipfs command interface\n//\n// Using github.com/ipfs/kubo/commands to define the comman"
  },
  {
    "path": "core/commands/commands_test.go",
    "chars": 4610,
    "preview": "package commands\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc collectPaths(prefix strin"
  },
  {
    "path": "core/commands/completion.go",
    "chars": 6388,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\t\"text/template\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\ntype com"
  },
  {
    "path": "core/commands/config.go",
    "chars": 17783,
    "preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"maps\"\n\t\"os\"\n\t\"os/exec\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"gith"
  },
  {
    "path": "core/commands/config_test.go",
    "chars": 3129,
    "preview": "package commands\n\nimport \"testing\"\n\nfunc TestScrubMapInternalDelete(t *testing.T) {\n\tm, err := scrubMapInternal(nil, nil"
  },
  {
    "path": "core/commands/dag/dag.go",
    "chars": 13007,
    "preview": "package dagcmd\n\nimport (\n\t\"encoding/csv\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"path\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"githu"
  },
  {
    "path": "core/commands/dag/export.go",
    "chars": 4810,
    "preview": "package dagcmd\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/cheggaaa/pb\"\n\tcid \"github.com/ipf"
  },
  {
    "path": "core/commands/dag/get.go",
    "chars": 1616,
    "preview": "package dagcmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/path\"\n\tipldlegacy \"github.com/ipfs/go-ipld-legacy\"\n\t\"githu"
  },
  {
    "path": "core/commands/dag/import.go",
    "chars": 6832,
    "preview": "package dagcmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/boxo/files\"\n\tblocks \"github.com/ipfs/go-block-format\""
  },
  {
    "path": "core/commands/dag/put.go",
    "chars": 3089,
    "preview": "package dagcmd\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\n\tblocks \"github.com/ipfs/go-block-format\"\n\t\"github.com/ipfs/go-cid\"\n\tipldlegac"
  },
  {
    "path": "core/commands/dag/resolve.go",
    "chars": 646,
    "preview": "package dagcmd\n\nimport (\n\t\"github.com/ipfs/boxo/path\"\n\t\"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/ipfs/kub"
  },
  {
    "path": "core/commands/dag/stat.go",
    "chars": 3735,
    "preview": "package dagcmd\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/dustin/go-humanize\"\n\tmdag \"github.com/ipfs/boxo/ipld/merkledag"
  },
  {
    "path": "core/commands/dht.go",
    "chars": 3322,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kub"
  },
  {
    "path": "core/commands/dht_test.go",
    "chars": 608,
    "preview": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/ipfs/boxo/namesys\"\n\n\tipns \"github.com/ipfs/boxo/ipns\"\n\t\"github.com/l"
  },
  {
    "path": "core/commands/diag.go",
    "chars": 7436,
    "preview": "package commands\n\nimport (\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/ipfs/go-datastore\"\n\t\"github.com/ipfs/go-"
  },
  {
    "path": "core/commands/e/error.go",
    "chars": 720,
    "preview": "package e\n\nimport (\n\t\"fmt\"\n\t\"runtime/debug\"\n)\n\n// TypeErr returns an error with a string that explains what error was ex"
  },
  {
    "path": "core/commands/external.go",
    "chars": 1663,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfu"
  },
  {
    "path": "core/commands/extra.go",
    "chars": 1638,
    "preview": "package commands\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc CreateCmdExtras(opts ...func(e *cmds.Extra)) *cm"
  },
  {
    "path": "core/commands/files.go",
    "chars": 49524,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\"slices\"\n\t\"strconv\"\n"
  },
  {
    "path": "core/commands/files_test.go",
    "chars": 984,
    "preview": "package commands\n\nimport (\n\t\"io\"\n\t\"testing\"\n\n\tdag \"github.com/ipfs/boxo/ipld/merkledag\"\n\tcmds \"github.com/ipfs/go-ipfs-c"
  },
  {
    "path": "core/commands/filestore.go",
    "chars": 7247,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tfilestore \"github.com/ipfs/boxo/filestore\"\n\tcmds \"github.com/"
  },
  {
    "path": "core/commands/get.go",
    "chars": 9645,
    "preview": "package commands\n\nimport (\n\tgotar \"archive/tar\"\n\t\"bufio\"\n\t\"compress/gzip\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\tgopath \"path\"\n\t\""
  },
  {
    "path": "core/commands/get_test.go",
    "chars": 1460,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc TestGetOutputPath(t *testing."
  },
  {
    "path": "core/commands/helptext_test.go",
    "chars": 1104,
    "preview": "package commands\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nfunc checkHelptextRecursive(t "
  },
  {
    "path": "core/commands/id.go",
    "chars": 5970,
    "preview": "package commands\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\t\"strings\"\n\n\tversion \"gi"
  },
  {
    "path": "core/commands/keyencode/keyencode.go",
    "chars": 992,
    "preview": "package keyencode\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tpeer \"github.com/libp2p/go-libp2p/core/peer\"\n\tmbase \"g"
  },
  {
    "path": "core/commands/keystore.go",
    "chars": 23901,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"crypto/ed25519\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path"
  },
  {
    "path": "core/commands/log.go",
    "chars": 9310,
    "preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"slices\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\tlogging \"github.com/ipfs/go-log"
  },
  {
    "path": "core/commands/ls.go",
    "chars": 11869,
    "preview": "package commands\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"slices\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\tcmdenv \"github"
  },
  {
    "path": "core/commands/ls_test.go",
    "chars": 4770,
    "preview": "package commands\n\nimport (\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestFormatMode(t *tes"
  },
  {
    "path": "core/commands/mount_nofuse.go",
    "chars": 595,
    "preview": "//go:build !windows && nofuse\n\npackage commands\n\nimport (\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nvar MountCmd = &cmds.C"
  },
  {
    "path": "core/commands/mount_unix.go",
    "chars": 3836,
    "preview": "//go:build !windows && !nofuse\n\npackage commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\toldcmds \"github.com/ipfs/kubo/commands\"\n\tcmden"
  },
  {
    "path": "core/commands/mount_windows.go",
    "chars": 407,
    "preview": "package commands\n\nimport (\n\t\"errors\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n)\n\nvar MountCmd = &cmds.Command{\n\tHelptext: c"
  },
  {
    "path": "core/commands/multibase.go",
    "chars": 4564,
    "preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kubo"
  },
  {
    "path": "core/commands/name/ipns.go",
    "chars": 4655,
    "preview": "package name\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/ipfs/boxo/namesys\"\n\t\"github.com/ipfs/boxo"
  },
  {
    "path": "core/commands/name/ipnsps.go",
    "chars": 4180,
    "preview": "package name\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\tcmds \"github.com/ipfs/go-ipfs-cmds\"\n\t\"github.com/ipfs/kubo/core/command"
  },
  {
    "path": "core/commands/name/name.go",
    "chars": 17149,
    "preview": "package name\n\nimport (\n\t\"bytes\"\n\t\"encoding/hex\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\t\"time\"\n\n\t\"github.co"
  },
  {
    "path": "core/commands/name/publish.go",
    "chars": 7452,
    "preview": "package name\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"time\"\n\n\tcmdenv \"github.com/ipfs/kubo/core/commands/cmdenv\"\n\t\"github.com/"
  }
]

// ... and 721 more files (download for full content)

About this extraction

This page contains the full source code of the ipfs/kubo GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 921 files (5.7 MB), approximately 1.5M tokens, and a symbol index with 3560 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!