From 7a6eddbd0db9e8e54d76931bc222f99e36a594a8 Mon Sep 17 00:00:00 2001 From: "@RubenKelevra" Date: Wed, 25 May 2022 01:34:10 +0200 Subject: [PATCH 01/20] host a git repo: change --bare to --mirror; rename (remove "style") - plus some minor language fixes --- .../{host-git-style-repo.md => host-git-repo.md} | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) rename docs/how-to/{host-git-style-repo.md => host-git-repo.md} (87%) diff --git a/docs/how-to/host-git-style-repo.md b/docs/how-to/host-git-repo.md similarity index 87% rename from docs/how-to/host-git-style-repo.md rename to docs/how-to/host-git-repo.md index ca6a32540..ba44da195 100644 --- a/docs/how-to/host-git-style-repo.md +++ b/docs/how-to/host-git-repo.md @@ -1,10 +1,10 @@ --- -title: Host a Git-style repo +title: Host a Git repo legacyUrl: https://docs.ipfs.io/guides/examples/git/ -description: Learn how to serve a static Git repository worldwide using IPFS, the InterPlanetary File System. +description: Learn how to serve a static Git repository worldwide using IPFS --- -# Host a Git-style repo +# Host a Git repo Have you ever said to yourself: "Man, my Git server isn't distributed enough" or "I wish I had an easy way to serve a static Git repository worldwide"? Well, wish no more. @@ -13,7 +13,7 @@ In this guide, we discuss how to serve a Git repository through the IPFS network To start, select a Git repository you want to host, and do a bare clone of it: ```bash -git clone --bare git@myhost.io/myrepo +git clone --mirror git@myhost.io/myrepo ``` For those who aren't super Git-savvy, a bare repository means that it doesn't have a working tree, and can be used as a server. They have a slightly different format than your normal Git repository. @@ -56,7 +56,7 @@ $ git clone http://QmX679gmfyaRkKMvPA4WGNWXj9PtpvKWGPgtXaF18etC95.ipfs.localhost Note: make sure to change out that hash for yours. -Now, you may be asking "Well, what good is a Git repository that I can't change anything on?" Here's one use case. Say you program in Go. For those who don't know, Go uses version control paths for its imports, i.e: +Now, you may be asking, "Well, what good is a Git repository that I can't change anything on?" Here's one use case. Say you program in Go. For those who don't know, Go uses version control paths for its imports, i.e: ```go import ( @@ -78,3 +78,4 @@ import ( And you will be guaranteed to have the same code every time! Note: Since Go doesn't allow the usage of localhost for import paths, we use the public HTTP gateways. This provides no security guarantees, as a man-in-the-middle attack could ship you bad code. You could use a domain name that redirects to the localhost instead to avoid the issue. + From 20cbdbf0586d3ce8a49e17216b12baf07203e540 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 12:07:29 -0400 Subject: [PATCH 02/20] modify + edit js content --- docs/reference/js/api.md | 52 +++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index b66bea124..f450a34b3 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -5,38 +5,58 @@ description: Developer resources for working in JavaScript with IPFS, the InterP # IPFS in JavaScript -::: callout -[Explore js-ipfs through interactive coding challenges at ProtoSchool](https://proto.school/course/ipfs) +## JavaScript libraries + +There are two main JavaScript libraries for working with IPFS. Both work in Node.js and modern web browsers. + +### JS-IPFS + +[JS-IPFS](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) is a full implementation of IPFS, similar to [Kubo (Go-IPFS)](https://github.com/ipfs/kubo). You can use it either as a command-line application or as a library to start an IPFS node directly in your program, as JS implementation is available as two node packages, `ipfs-core` and `ipfs`. + +- [ipfs-core](https://www.npmjs.com/package/ipfs-core) includes the core IPFS API and is intended to be used to run an IPFS node as part of your application without the need to start external processes or manage API ports and servers. + +::: tip IPFS Core API + +See the [JS core API reference →](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api) + ::: -## JavaScript libraries +- [ipfs](https://www.npmjs.com/package/ipfs) is built on `ipfs-core` but also includes the CLI, an HTTP RPC API server and, other tools to run ipfs as a background process, so it is a larger install with more dependencies. -There are two main JavaScript libraries for working with IPFS. Both work in Node.js and in modern web browsers: +::: tip ipfs-core vs. ipfs -- [JS-IPFS](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) is a full implementation of IPFS, similar to [Kubo (Go-IPFS)](https://github.com/ipfs/kubo). You can use it either as a command-line application or as a library to start an IPFS node directly in your program. -- The [JS-IPFS HTTP RPC API client library](https://www.npmjs.com/package/ipfs-http-client) is a smaller library that controls an IPFS node (Kubo or JS-IPFS) that is already running via its [RPC API](../kubo/rpc.md). - - JS-IPFS actually uses this library internally if it detects that another node is already running on your computer. You can also interact with the [RPC API](../kubo/rpc.md) directly using `fetch()` in a browser or a module like `request` in Node.js, but using this library can be much more convenient. - - When JS-IPFS is used as a backend, instead use the [ipfs-client](https://www.npmjs.com/package/ipfs-client) to leverage gRPC over websockets for some commands to achieve the bidirectional streaming necessary to have full duplex streams running in the browser. +If you are writing an application that needs to access the IPFS network, use `ipfs-core`. If you wish to use **js-ipfs** in a terminal window or run it as a server for use by multiple otherwise unrelated processes, use `ipfs`. +::: -All libraries have the same [interface for using all the major IPFS commands](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api). +### HTTP client -Whenever reasonable, we recommend the second method (interacting with a separate IPFS node via the RPC API). Keeping the IPFS node in a separate process (even if it’s one your program spawns) isolates you from any stability problems with the node. If a user already has IPFS installed, this also means you can take advantage of a single, common installation on their computer. It’s also less code to load in a browser. If you need to spawn a separate IPFS process, you might want to take a look at [`js-ipfsd-ctl`](https://github.com/ipfs/js-ipfsd-ctl), which uses the same interface to spawn a Kubo (Go-IPFS) node, a JS-IPFS node, or an in-process JS-IPFS node. +[JS-IPFS HTTP RPC API](https://www.npmjs.com/package/ipfs-http-client) is a client library that controls an active IPFS node (Kubo or JS-IPFS) running through its [RPC API](../kubo/rpc.md). + - JS-IPFS will internally use this library if it detects another node is running on your machine. You can also interact with the [RPC API](../kubo/rpc.md) directly using `fetch()` in a browser or a module like `request` in Node.js, but using this library can be much more convenient. + - When using JS-IPFS as a backend, use the [ipfs-client](https://www.npmjs.com/package/ipfs-client) instead to leverage gRPC connections over WebSockets to allow some commands to achieve the bidirectional streaming necessary to have full duplex streams running in the browser. -### Browsers +All the libraries have the [same interface](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api) for using all the major IPFS commands. This client library implements the interface-ipfs-core enabling applications to change between an embedded js-ipfs node and any remote IPFS node without changing the code. In addition, this client library implements a set of utility functions. -Both the `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has some special considerations noted in their READMEs. +::: tip Interacting with IPFS -## JS API reference +We recommend the second method (interacting with a separate IPFS node via RPC API) whenever reasonable. Keeping the IPFS node in a separate process (even if it’s one of your program spawns) isolates you from any stability problems with the node. If a user already has IPFS installed, this also means that you can take advantage of a single, standard installation on their machine. It’s also less code to load in a browser. If you need to spawn a separate IPFS process, you might want to take a look at [`js-ipfsd-ctl`](https://github.com/ipfs/js-ipfsd-ctl), which uses the same interface to spawn a Kubo (Go-IPFS) node, a JS-IPFS node, or an in-process JS-IPFS node. -See the [JS core API reference →](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api) +::: -## RPC client library +::: warning Browsers -A [client library](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) for the JS-IPFS RPC API, implemented in JavaScript. This client library implements the interface-ipfs-core enabling applications to change between an embedded js-ipfs node and any remote IPFS node without having to change the code. In addition, this client library implements a set of utility functions. +The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has special considerations noted in their READMEs. + +::: ## Hands-on examples +::: callout + +**Explore js-ipfs through interactive coding challenges at [ProtoSchool](https://proto.school/course/ipfs).** + +::: + There are lots of JS-IPFS use-case examples in the [`ipfs/js-ipfs` GitHub repository](https://github.com/ipfs-examples/js-ipfs-examples). They're all self-contained projects that let your spin up and test environments quickly. [Check them out →](https://github.com/ipfs-examples/js-ipfs-examples/tree/master/examples) A good starting place is the [IPFS 101, spawn a node and add a file to the IPFS network](https://github.com/ipfs-examples/js-ipfs-examples/tree/master/examples/ipfs-101). From 2bb14f2db9172d84c79505068fdbfa34422a5d69 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 12:07:59 -0400 Subject: [PATCH 03/20] add tabs + dependency update --- docs/.vuepress/config.js | 3 ++- docs/.vuepress/theme/styles/index.styl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index b4271c649..072ac05bd 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -434,7 +434,8 @@ module.exports = { } ], 'vuepress-plugin-chunkload-redirect', - 'vuepress-plugin-ipfs' + 'vuepress-plugin-ipfs', + 'tabs' ], extraWatchFiles: ['.vuepress/nav/en.js'] } diff --git a/docs/.vuepress/theme/styles/index.styl b/docs/.vuepress/theme/styles/index.styl index facdaa4f1..24225f244 100644 --- a/docs/.vuepress/theme/styles/index.styl +++ b/docs/.vuepress/theme/styles/index.styl @@ -6,6 +6,7 @@ @import 'video'; @import 'alert-panels'; @import 'ipfs'; +@require '~vuepress-plugin-tabs/dist/themes/default.styl' // apply scrolling by default excluding firefox due to trigger issues html.smooth-scroll { From 8cca2b4b621908857189da8e1683c30cccc03f65 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 12:09:30 -0400 Subject: [PATCH 04/20] add tabs + dependency update --- package-lock.json | 62 +++++++++++++++++++++++++++-------------------- package.json | 4 +++ 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 95851455e..ee51d380a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,10 @@ "name": "ipfs-docs", "version": "2.0.0", "license": "MIT", + "dependencies": { + "vue-tabs-component": "^1.5.0", + "vuepress-plugin-tabs": "^0.3.0" + }, "devDependencies": { "@centerforopenscience/markdown-it-video": "^1.0.0", "@vuepress/plugin-active-header-links": "^1.9.7", @@ -498,7 +502,6 @@ "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -2311,7 +2314,6 @@ "version": "2.7.7", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.7.tgz", "integrity": "sha512-Ah8dIuo6ZVPHTq9+s4rBU/YpJu3vGSNyeOTCrPrVPQnkUfnT5Ig+IKBhePuQWFXguYb2TuEWrEfiiX9DZ3aJlA==", - "dev": true, "dependencies": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", @@ -2321,14 +2323,12 @@ "node_modules/@vue/compiler-sfc/node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "funding": [ { "type": "opencollective", @@ -6020,8 +6020,7 @@ "node_modules/csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", - "dev": true + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/cuint": { "version": "0.2.2", @@ -11247,7 +11246,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14772,7 +14770,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14781,7 +14778,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16770,7 +16766,6 @@ "version": "2.7.7", "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.7.tgz", "integrity": "sha512-osfkncsGCWqtch+YWYxbqTNQ9hl/UQ6TFRkdmK/VqAjuMpxzr5QotFsYpmJ1AB1ez2LJeIKXDmtMkXUotMOTsA==", - "dev": true, "dependencies": { "@vue/compiler-sfc": "2.7.7", "csstype": "^3.1.0" @@ -16933,6 +16928,14 @@ "loader-utils": "^1.0.2" } }, + "node_modules/vue-tabs-component": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-tabs-component/-/vue-tabs-component-1.5.0.tgz", + "integrity": "sha512-ld4p+hv49Fimw+zv/7GQqMhbjAHjpbWF3UiJtmMaSnvLKbsB1ysfs9dQH0SZ8NvdYpqqKay/VLIqR9yXgse1Sg==", + "peerDependencies": { + "vue": "^2.3.0" + } + }, "node_modules/vue-template-compiler": { "version": "2.7.7", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.7.tgz", @@ -17119,6 +17122,11 @@ "smoothscroll-polyfill": "^0.4.3" } }, + "node_modules/vuepress-plugin-tabs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vuepress-plugin-tabs/-/vuepress-plugin-tabs-0.3.0.tgz", + "integrity": "sha512-jooDlcMdBqhXgIaF1awFSaOTM56mleP6bbCiGxyQxTZexfvCfDvZhNLGpyXqMQA50ZmNGmvLrK82YYb63k1jfA==" + }, "node_modules/watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -19544,8 +19552,7 @@ "@babel/parser": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", - "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", - "dev": true + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", @@ -20879,7 +20886,6 @@ "version": "2.7.7", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.7.tgz", "integrity": "sha512-Ah8dIuo6ZVPHTq9+s4rBU/YpJu3vGSNyeOTCrPrVPQnkUfnT5Ig+IKBhePuQWFXguYb2TuEWrEfiiX9DZ3aJlA==", - "dev": true, "requires": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", @@ -20889,14 +20895,12 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -23932,8 +23936,7 @@ "csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", - "dev": true + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "cuint": { "version": "0.2.2", @@ -27978,8 +27981,7 @@ "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "nanomatch": { "version": "1.2.13", @@ -30868,14 +30870,12 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -32468,7 +32468,6 @@ "version": "2.7.7", "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.7.tgz", "integrity": "sha512-osfkncsGCWqtch+YWYxbqTNQ9hl/UQ6TFRkdmK/VqAjuMpxzr5QotFsYpmJ1AB1ez2LJeIKXDmtMkXUotMOTsA==", - "dev": true, "requires": { "@vue/compiler-sfc": "2.7.7", "csstype": "^3.1.0" @@ -32597,6 +32596,12 @@ "loader-utils": "^1.0.2" } }, + "vue-tabs-component": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-tabs-component/-/vue-tabs-component-1.5.0.tgz", + "integrity": "sha512-ld4p+hv49Fimw+zv/7GQqMhbjAHjpbWF3UiJtmMaSnvLKbsB1ysfs9dQH0SZ8NvdYpqqKay/VLIqR9yXgse1Sg==", + "requires": {} + }, "vue-template-compiler": { "version": "2.7.7", "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.7.tgz", @@ -32755,6 +32760,11 @@ "smoothscroll-polyfill": "^0.4.3" } }, + "vuepress-plugin-tabs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vuepress-plugin-tabs/-/vuepress-plugin-tabs-0.3.0.tgz", + "integrity": "sha512-jooDlcMdBqhXgIaF1awFSaOTM56mleP6bbCiGxyQxTZexfvCfDvZhNLGpyXqMQA50ZmNGmvLrK82YYb63k1jfA==" + }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", diff --git a/package.json b/package.json index e7e4a520d..8c7932824 100644 --- a/package.json +++ b/package.json @@ -62,5 +62,9 @@ "format:styles": "stylus-supremacy format ./docs/.vuepress/**/*.styl --replace", "docs:dev": "vuepress dev docs", "docs:build": "vuepress build docs" + }, + "dependencies": { + "vue-tabs-component": "^1.5.0", + "vuepress-plugin-tabs": "^0.3.0" } } From 2ce92582c237cabc18233e2f5551c70d4fd816c2 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 12:10:36 -0400 Subject: [PATCH 05/20] add install and node steps --- docs/reference/js/api.md | 202 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index f450a34b3..76358c526 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -49,6 +49,208 @@ The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has ::: +## Install JS-IPFS + +:::: tabs + +::: tab ipfs-cli + +### JS-IPFS module + +To use the CLI on your machine, globally install the `ipfs` node package: + +```bash +npm i --location=global ipfs +``` + +### Build from source + +To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. + +::: + +::: tab ipfs-core + +### IPFS core API + +To use the IPFS core API, install the `ipfs-core` node package: + +```bash +npm i ipfs-core +``` + +### Build from source + +To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. + +::: + +::: tab js-ipfs-http-client + +### HTTP client module + +To use the client on your machine, install the `js-ipfs-http-client` node package: + +```bash +npm i ipfs-http-client +``` + +### Build from source + +To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. + +:::: + +## Spawn a node + +:::: tabs + +::: tab ipfs-cli + +To spawn a node using the CLI, simply start the daemon: + +```bash +jsipfs daemon +``` + +You should see an output similar to: + +```shell +Initializing IPFS daemon... +System version: arm64/darwin +Node.js version: 16.16.0 +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +js-ipfs version: 0.15.4 +HTTP API listening on /ip4/127.0.0.1/tcp/5002/http +gRPC listening on /ip4/127.0.0.1/tcp/5003/ws +Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http +Web UI available at http://127.0.0.1:5002/webui +Daemon is ready +``` + +::: + +::: tab ipfs-core + +Create a simple node application to host the logic that will allow you to use the RPC API. +Start by initiating a new node project: + +```bash +npm init -y +``` + +If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: + +```bash +npm i ipfs-core +``` + +Create an `index.js` file for the application logic: + +```bash +touch index.js +``` + +Now, populate the `index.js` file by initiating an `async` function: + +```js +const main = async () => { + // "await" logic to spawn a node +} + +main() +``` + +To create an IPFS node, add: + +```js{1,4} +import * as IPFS from 'ipfs-core'; + +async function main() { + const node = await IPFS.create(); +} + +main(); +``` + +This imports IPFS as a dependency and uses the `create()` method to create a node instance. + +To spawn the node, run the application: + +```bash +node index.js +``` + +You should see an output similar to: + +```shell +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +``` + +::: + +::: tab js-ipfs-http-client + +Create a simple node application to host the logic that will spawn an IPFS node. +Start by initiating a new node project: + +```bash +npm init -y +``` + +If you have not already installed the client library, add the `ipfs-http-client` module to your project: + +```bash +npm i ipfs-http-client +``` + +Create an `index.js` file for the application logic: + +```bash +touch index.js +``` + +Now, populate the `index.js` file with the following: + +```js{1,3} +import { create } from 'ipfs-http-client' + +const ipfs = create('http://localhost:5001') +``` + +This imports the client library and uses the `create()` method to connect to an IPFS daemon. + +To spawn the node, run the application: + +```bash +node index.js +``` + +You should see an output similar to: + +```shell +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +``` + +::: + +:::: + +## Add a file + +::: warning Section coming soon + +As the JS-IPFS implementation goes through changes, adding and removing a file are subject to change. For the time being, please reference the [source packages](https://github.com/ipfs/js-ipfs). + +::: + ## Hands-on examples ::: callout From 2b53c7a5e7b0819d4ff85b209fae7771b8ef1590 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 16:54:11 -0400 Subject: [PATCH 06/20] split node section, add ipfs client + edits --- docs/reference/js/api.md | 112 ++++++++++++++++++++++++++++++++------- 1 file changed, 94 insertions(+), 18 deletions(-) diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 76358c526..467aa7894 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -11,7 +11,7 @@ There are two main JavaScript libraries for working with IPFS. Both work in Node ### JS-IPFS -[JS-IPFS](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) is a full implementation of IPFS, similar to [Kubo (Go-IPFS)](https://github.com/ipfs/kubo). You can use it either as a command-line application or as a library to start an IPFS node directly in your program, as JS implementation is available as two node packages, `ipfs-core` and `ipfs`. +[JS-IPFS](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) is a full implementation of IPFS, similar to [Kubo (Go-IPFS)](https://github.com/ipfs/kubo). You can use it either as a command-line application or as a library to start an IPFS node directly in your program, as JS implementation is available as two Node.js packages, `ipfs-core` and `ipfs`. - [ipfs-core](https://www.npmjs.com/package/ipfs-core) includes the core IPFS API and is intended to be used to run an IPFS node as part of your application without the need to start external processes or manage API ports and servers. @@ -57,7 +57,7 @@ The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has ### JS-IPFS module -To use the CLI on your machine, globally install the `ipfs` node package: +To use the CLI on your machine, globally install the `ipfs` Node.js package: ```bash npm i --location=global ipfs @@ -73,7 +73,7 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf ### IPFS core API -To use the IPFS core API, install the `ipfs-core` node package: +To use the IPFS core API, install the `ipfs-core` Node.js package: ```bash npm i ipfs-core @@ -85,11 +85,11 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf ::: -::: tab js-ipfs-http-client +::: tab ipfs-http-client ### HTTP client module -To use the client on your machine, install the `js-ipfs-http-client` node package: +To use the client on your machine, install the `ipfs-http-client` Node.js package: ```bash npm i ipfs-http-client @@ -99,6 +99,24 @@ npm i ipfs-http-client To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. +::: + +::: tab ipfs-client + +### HTTP client module + +To use the client on your machine, install the `ipfs-client` Node.js package: + +```bash +npm i ipfs-client +``` + +### Build from source + +To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. + +::: + :::: ## Spawn a node @@ -135,8 +153,9 @@ Daemon is ready ::: tab ipfs-core -Create a simple node application to host the logic that will allow you to use the RPC API. -Start by initiating a new node project: +Create a simple Node.js application to host the logic that will allow you to use the RPC API. + +Start by initiating a new project: ```bash npm init -y @@ -176,7 +195,7 @@ async function main() { main(); ``` -This imports IPFS as a dependency and uses the `create()` method to create a node instance. +This imports IPFS as a dependency and uses the `create()` function to create a node instance. To spawn the node, run the application: @@ -194,10 +213,17 @@ Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM ::: -::: tab js-ipfs-http-client +:::: -Create a simple node application to host the logic that will spawn an IPFS node. -Start by initiating a new node project: +## Connect to a node + +:::: tabs + +::: tab ipfs-http-client + +Create a simple Node.js application to host the logic that will connect to the API client. + +Start by initiating a new project: ```bash npm init -y @@ -215,17 +241,17 @@ Create an `index.js` file for the application logic: touch index.js ``` -Now, populate the `index.js` file with the following: +Now, populate the `index.js` file with the following to create an instance of the HTTP API client: ```js{1,3} import { create } from 'ipfs-http-client' -const ipfs = create('http://localhost:5001') +const client = create() // the default API address http://localhost:5001 ``` -This imports the client library and uses the `create()` method to connect to an IPFS daemon. +This imports the client library and uses the `create()` function to connect to an IPFS API server. -To spawn the node, run the application: +To connect to the API, run the application: ```bash node index.js @@ -234,13 +260,63 @@ node index.js You should see an output similar to: ```shell -Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + ``` ::: +::: tab ipfs-client + +Create a simple Node.js application to use the IPFS client as a backend to connect to IPFS servers. + +Start by initiating a new project: + +```bash +npm init -y +``` + +If you have not already installed the client library, add the `ipfs-http-client` module to your project: + +```bash +npm i ipfs-client +``` + +Create an `index.js` file for the application logic: + +```bash +touch index.js +``` + +Now, populate the `index.js` file with the following to create an instance of the HTTP API client: + +```js{1,3-5} +import { create } from 'ipfs-client' + +const client = create({ + grpc: '/ipv4/127.0.0.1/tcp/5003/ws', + http: '/ipv4/127.0.0.1/tcp/5002/http' +}) + +const id = await client.id() +``` + +This imports the client library and uses the `create()` function to define the server endpoints. + +To connect to the endpoints, run the application: + +```bash +node index.js +``` + +You should see an output similar to: + +```shell + +``` + +::: + + :::: ## Add a file From e2b703b5b0bb31b87c7b99f7448e05bf3ff7ac13 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 31 Jul 2022 21:17:38 -0400 Subject: [PATCH 07/20] add to sections + edits --- docs/images/jsipfs-webui.png | Bin 0 -> 193433 bytes docs/reference/js/api.md | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 docs/images/jsipfs-webui.png diff --git a/docs/images/jsipfs-webui.png b/docs/images/jsipfs-webui.png new file mode 100644 index 0000000000000000000000000000000000000000..17ac5add0e293633394d5ef5d5dd216e6afb09ab GIT binary patch literal 193433 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

X(%u!6 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 literal 0 HcmV?d00001 diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 467aa7894..752dfbea1 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -149,11 +149,22 @@ Web UI available at http://127.0.0.1:5002/webui Daemon is ready ``` +You should be able to point to the [webpage](http://127.0.0.1:5002/webui): + + + +If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: + +```bash +jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' +jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]' +``` + ::: ::: tab ipfs-core -Create a simple Node.js application to host the logic that will allow you to use the RPC API. +Create a simple Node.js application to host the logic that will allow you to use the RPC API. You'll also use this Node.js application later on to add and remove files. Start by initiating a new project: @@ -221,7 +232,7 @@ Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM ::: tab ipfs-http-client -Create a simple Node.js application to host the logic that will connect to the API client. +Create a simple Node.js application to host the logic that will connect to the API client. You'll use this Node.js application later on to add and remove files. Start by initiating a new project: From 82ce0e698d312623bae06e0a0889f2bbe9e720f1 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Wed, 3 Aug 2022 13:23:26 -0400 Subject: [PATCH 08/20] migrate to basics section + tweaks --- docs/.vuepress/config.js | 3 +- docs/basics/{ => go}/command-line.md | 4 +- docs/basics/js/js-ipfs.md | 255 +++++++++++++++++++++++++++ 3 files changed, 259 insertions(+), 3 deletions(-) rename docs/basics/{ => go}/command-line.md (97%) create mode 100644 docs/basics/js/js-ipfs.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 072ac05bd..abf679c30 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -86,7 +86,8 @@ module.exports = { path: '/basics/', children: [ 'basics/desktop-app', - 'basics/command-line', + 'basics/go/command-line', + 'basics/js/js-ipfs', 'basics/ipfs-implementations' ] }, diff --git a/docs/basics/command-line.md b/docs/basics/go/command-line.md similarity index 97% rename from docs/basics/command-line.md rename to docs/basics/go/command-line.md index 85888ab9e..96cbeff5d 100644 --- a/docs/basics/command-line.md +++ b/docs/basics/go/command-line.md @@ -1,11 +1,11 @@ --- -title: "Command-line" +title: IPFS in Golang description: "A simple walkthrough of how to perform basic IPFS operations using the Kubo command-line." --- # Basic CLI Operations -This short guide aims to walk you through the basics of using IPFS with the Kubo CLI. Kubo is [one of multiple IPFS implementations](.ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). +This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](.ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). You will learn how to add, retrieve, read, and remove files within the CLI. If you are unsure about the meaning of some terms, you can check out the [glossary](../concepts/glossary.md). diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md new file mode 100644 index 000000000..d65b3fbae --- /dev/null +++ b/docs/basics/js/js-ipfs.md @@ -0,0 +1,255 @@ +--- +title: IPFS in JavaScript +description: "A simple walkthrough of how to perform basic IPFS operations using the JS implementation." +--- + +# JS-IPFS Basics + +This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). + +You will learn how install and spawn a node using the available libraries, as well as add, retrieve, +read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). + +::: tip Environment + +All instructions and examples shown here were performed and tested on an M1 Mac. However, the IPFS commands are the same on Linux, macOS, and Windows. You will need to know how to navigate your computer's directories from within the CLI. If you're unsure how to use the CLI, we recommend learning how before continuing with this guide. + +::: + +There are two main JavaScript libraries for working with IPFS, learn about each library in the [reference section](../reference/js/api). + +## Install JS-IPFS + +:::: tabs + +::: tab ipfs-cli + +### JS-IPFS module + +To use the CLI on your machine, globally install the `ipfs` Node.js package: + +```bash +npm i --location=global ipfs +``` + +### Build from source + +To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. + +::: + +::: tab ipfs-core + +### IPFS core API + +To use the IPFS core API, install the `ipfs-core` Node.js package: + +```bash +npm i ipfs-core +``` + +### Build from source + +To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. + +::: + +::: tab ipfs-http-client + +### HTTP client module + +To use the client on your machine, install the `ipfs-http-client` Node.js package: + +```bash +npm i ipfs-http-client +``` + +### Build from source + +To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. + +::: + +::: tab ipfs-client + +### HTTP client module + +To use the client on your machine, install the `ipfs-client` Node.js package: + +```bash +npm i ipfs-client +``` + +### Build from source + +To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. + +::: + +:::: + +## Spawn a node + +:::: tabs + +::: tab ipfs-cli + +To spawn a node using the CLI, simply start the daemon: + +```bash +jsipfs daemon +``` + +You should see an output similar to: + +```shell +Initializing IPFS daemon... +System version: arm64/darwin +Node.js version: 16.16.0 +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +js-ipfs version: 0.15.4 +HTTP API listening on /ip4/127.0.0.1/tcp/5002/http +gRPC listening on /ip4/127.0.0.1/tcp/5003/ws +Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http +Web UI available at http://127.0.0.1:5002/webui +Daemon is ready +``` + +You should be able to point to the [webpage](http://127.0.0.1:5002/webui): + + + +If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: + +```bash +jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' +jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]' +``` + +::: + +::: tab ipfs-core + +Create a simple Node.js application to host the logic that will allow you to use the RPC API. You'll also use this Node.js application later on to add and remove files. + +Start by initiating a new project: + +```bash +npm init -y +``` + +If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: + +```bash +npm i ipfs-core +``` + +Create an `index.js` file for the application logic: + +```bash +touch index.js +``` + +Now, populate the `index.js` file by initiating an `async` function: + +```js +const main = async () => { + // "await" logic to spawn a node +} + +main() +``` + +To create an IPFS node, add: + +```js{1,4} +import * as IPFS from 'ipfs-core'; + +async function main() { + const node = await IPFS.create(); +} + +main(); +``` + +This imports IPFS as a dependency and uses the `create()` function to create a node instance. + +To spawn the node, run the application: + +```bash +node index.js +``` + +You should see an output similar to: + +```shell +Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 +``` + +::: + +:::: + +## Connect to IPFS + +:::: tabs + +::: tab ipfs-http-client + +If you have not already installed the client library, add the `ipfs-http-client` module to your project: + +```bash +npm i ipfs-http-client +``` + +Populate your `index.js` file with the following to create an instance of the HTTP API client: + +```js{1,3} +import { create } from 'ipfs-http-client' + +const client = create() // the default API address http://localhost:5001 +``` + +This imports the client library and uses the `create()` function to connect to an IPFS API server. + +To connect to the API, run the application: + +::: + +::: tab ipfs-client + +If you have not already installed the client library, add the `ipfs-http-client` module to your project: + +Populate your `index.js` file with the following to create an instance of the HTTP API client: + +```js{1,3-5} +import { create } from 'ipfs-client' + +const client = create({ + grpc: '/ipv4/127.0.0.1/tcp/5003/ws', + http: '/ipv4/127.0.0.1/tcp/5002/http' +}) + +const id = await client.id() +``` + +This imports the client library and uses the `create()` function to define the server endpoints. + +To connect to the endpoints, run the application: + +::: + +:::: + +## Add, retrieve & remove files + +::: warning Section coming soon + +As the JS-IPFS implementation goes through changes, adding and removing a file are subject to change. For the time being, please reference the [source packages](https://github.com/ipfs/js-ipfs). + +::: From 8c931a64aa9e83e6d378de62ff592e8427a88518 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Wed, 3 Aug 2022 13:26:47 -0400 Subject: [PATCH 09/20] rmv from reference section --- docs/reference/js/api.md | 289 --------------------------------------- 1 file changed, 289 deletions(-) diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 752dfbea1..fe13b7365 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -49,295 +49,6 @@ The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has ::: -## Install JS-IPFS - -:::: tabs - -::: tab ipfs-cli - -### JS-IPFS module - -To use the CLI on your machine, globally install the `ipfs` Node.js package: - -```bash -npm i --location=global ipfs -``` - -### Build from source - -To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. - -::: - -::: tab ipfs-core - -### IPFS core API - -To use the IPFS core API, install the `ipfs-core` Node.js package: - -```bash -npm i ipfs-core -``` - -### Build from source - -To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. - -::: - -::: tab ipfs-http-client - -### HTTP client module - -To use the client on your machine, install the `ipfs-http-client` Node.js package: - -```bash -npm i ipfs-http-client -``` - -### Build from source - -To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. - -::: - -::: tab ipfs-client - -### HTTP client module - -To use the client on your machine, install the `ipfs-client` Node.js package: - -```bash -npm i ipfs-client -``` - -### Build from source - -To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. - -::: - -:::: - -## Spawn a node - -:::: tabs - -::: tab ipfs-cli - -To spawn a node using the CLI, simply start the daemon: - -```bash -jsipfs daemon -``` - -You should see an output similar to: - -```shell -Initializing IPFS daemon... -System version: arm64/darwin -Node.js version: 16.16.0 -Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -js-ipfs version: 0.15.4 -HTTP API listening on /ip4/127.0.0.1/tcp/5002/http -gRPC listening on /ip4/127.0.0.1/tcp/5003/ws -Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http -Web UI available at http://127.0.0.1:5002/webui -Daemon is ready -``` - -You should be able to point to the [webpage](http://127.0.0.1:5002/webui): - - - -If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: - -```bash -jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' -jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]' -``` - -::: - -::: tab ipfs-core - -Create a simple Node.js application to host the logic that will allow you to use the RPC API. You'll also use this Node.js application later on to add and remove files. - -Start by initiating a new project: - -```bash -npm init -y -``` - -If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: - -```bash -npm i ipfs-core -``` - -Create an `index.js` file for the application logic: - -```bash -touch index.js -``` - -Now, populate the `index.js` file by initiating an `async` function: - -```js -const main = async () => { - // "await" logic to spawn a node -} - -main() -``` - -To create an IPFS node, add: - -```js{1,4} -import * as IPFS from 'ipfs-core'; - -async function main() { - const node = await IPFS.create(); -} - -main(); -``` - -This imports IPFS as a dependency and uses the `create()` function to create a node instance. - -To spawn the node, run the application: - -```bash -node index.js -``` - -You should see an output similar to: - -```shell -Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -``` - -::: - -:::: - -## Connect to a node - -:::: tabs - -::: tab ipfs-http-client - -Create a simple Node.js application to host the logic that will connect to the API client. You'll use this Node.js application later on to add and remove files. - -Start by initiating a new project: - -```bash -npm init -y -``` - -If you have not already installed the client library, add the `ipfs-http-client` module to your project: - -```bash -npm i ipfs-http-client -``` - -Create an `index.js` file for the application logic: - -```bash -touch index.js -``` - -Now, populate the `index.js` file with the following to create an instance of the HTTP API client: - -```js{1,3} -import { create } from 'ipfs-http-client' - -const client = create() // the default API address http://localhost:5001 -``` - -This imports the client library and uses the `create()` function to connect to an IPFS API server. - -To connect to the API, run the application: - -```bash -node index.js -``` - -You should see an output similar to: - -```shell - -``` - -::: - -::: tab ipfs-client - -Create a simple Node.js application to use the IPFS client as a backend to connect to IPFS servers. - -Start by initiating a new project: - -```bash -npm init -y -``` - -If you have not already installed the client library, add the `ipfs-http-client` module to your project: - -```bash -npm i ipfs-client -``` - -Create an `index.js` file for the application logic: - -```bash -touch index.js -``` - -Now, populate the `index.js` file with the following to create an instance of the HTTP API client: - -```js{1,3-5} -import { create } from 'ipfs-client' - -const client = create({ - grpc: '/ipv4/127.0.0.1/tcp/5003/ws', - http: '/ipv4/127.0.0.1/tcp/5002/http' -}) - -const id = await client.id() -``` - -This imports the client library and uses the `create()` function to define the server endpoints. - -To connect to the endpoints, run the application: - -```bash -node index.js -``` - -You should see an output similar to: - -```shell - -``` - -::: - - -:::: - -## Add a file - -::: warning Section coming soon - -As the JS-IPFS implementation goes through changes, adding and removing a file are subject to change. For the time being, please reference the [source packages](https://github.com/ipfs/js-ipfs). - -::: - ## Hands-on examples ::: callout From 0e301e6895b548db5dbb8478701d371a4025a5bf Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Mon, 8 Aug 2022 02:27:09 -0400 Subject: [PATCH 10/20] Update docs/basics/go/command-line.md Co-authored-by: Marcin Rataj --- docs/basics/go/command-line.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/basics/go/command-line.md b/docs/basics/go/command-line.md index 96cbeff5d..40dd4d2ae 100644 --- a/docs/basics/go/command-line.md +++ b/docs/basics/go/command-line.md @@ -5,7 +5,7 @@ description: "A simple walkthrough of how to perform basic IPFS operations using # Basic CLI Operations -This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](.ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). +This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). You will learn how to add, retrieve, read, and remove files within the CLI. If you are unsure about the meaning of some terms, you can check out the [glossary](../concepts/glossary.md). From c4bb7e825783f57068047e9593ad95d98424a41f Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Tue, 9 Aug 2022 02:45:00 -0400 Subject: [PATCH 11/20] add, retrieve, pin, delete + various edits --- docs/basics/js/js-ipfs.md | 380 +++++++++++++++++++++++------ docs/images/jsipfs-add-gateway.png | Bin 0 -> 61519 bytes 2 files changed, 301 insertions(+), 79 deletions(-) create mode 100644 docs/images/jsipfs-add-gateway.png diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index d65b3fbae..bbac245f0 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -28,9 +28,9 @@ There are two main JavaScript libraries for working with IPFS, learn about each To use the CLI on your machine, globally install the `ipfs` Node.js package: -```bash -npm i --location=global ipfs -``` + ```bash + npm i --location=global ipfs + ``` ### Build from source @@ -44,9 +44,9 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf To use the IPFS core API, install the `ipfs-core` Node.js package: -```bash -npm i ipfs-core -``` + ```bash + npm i ipfs-core + ``` ### Build from source @@ -60,9 +60,9 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf To use the client on your machine, install the `ipfs-http-client` Node.js package: -```bash -npm i ipfs-http-client -``` + ```bash + npm i ipfs-http-client + ``` ### Build from source @@ -76,9 +76,9 @@ To build from source, clone the [source package](https://github.com/ipfs/js-ipfs To use the client on your machine, install the `ipfs-client` Node.js package: -```bash -npm i ipfs-client -``` + ```bash + npm i ipfs-client + ``` ### Build from source @@ -96,27 +96,27 @@ To build from source, clone the [source package](https://github.com/ipfs/js-ipfs To spawn a node using the CLI, simply start the daemon: -```bash -jsipfs daemon -``` + ```bash + jsipfs daemon + ``` You should see an output similar to: -```shell -Initializing IPFS daemon... -System version: arm64/darwin -Node.js version: 16.16.0 -Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -js-ipfs version: 0.15.4 -HTTP API listening on /ip4/127.0.0.1/tcp/5002/http -gRPC listening on /ip4/127.0.0.1/tcp/5003/ws -Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http -Web UI available at http://127.0.0.1:5002/webui -Daemon is ready -``` + ```shell + Initializing IPFS daemon... + System version: arm64/darwin + Node.js version: 16.16.0 + Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + js-ipfs version: 0.15.4 + HTTP API listening on /ip4/127.0.0.1/tcp/5002/http + gRPC listening on /ip4/127.0.0.1/tcp/5003/ws + Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http + Web UI available at http://127.0.0.1:5002/webui + Daemon is ready + ``` You should be able to point to the [webpage](http://127.0.0.1:5002/webui): @@ -137,65 +137,67 @@ Create a simple Node.js application to host the logic that will allow you to use Start by initiating a new project: -```bash -npm init -y -``` + ```bash + npm init -y + ``` If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: -```bash -npm i ipfs-core -``` + ```bash + npm i ipfs-core + ``` Create an `index.js` file for the application logic: -```bash -touch index.js -``` + ```bash + touch index.js + ``` Now, populate the `index.js` file by initiating an `async` function: -```js -const main = async () => { - // "await" logic to spawn a node -} + ```js + const main = async () => { + // "await" logic to spawn a node + } -main() -``` + main() + ``` To create an IPFS node, add: -```js{1,4} -import * as IPFS from 'ipfs-core'; + ```js{1,4} + import * as IPFS from 'ipfs-core'; -async function main() { - const node = await IPFS.create(); -} + async function main() { + const node = await IPFS.create(); + } -main(); -``` + main(); + ``` This imports IPFS as a dependency and uses the `create()` function to create a node instance. To spawn the node, run the application: -```bash -node index.js -``` + ```bash + node index.js + ``` You should see an output similar to: -```shell -Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 -``` + ```shell + Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + ``` ::: :::: -## Connect to IPFS +### Connect to IPFS + +The JS-IPFS implementation is split into several Node.js modules. The following section shows examples of how you can use the HTTP client to connect to IPFS. For more information on the different modules, examine the [API Packages table](../../reference/js/api.md##packages) :::: tabs @@ -203,17 +205,17 @@ Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM If you have not already installed the client library, add the `ipfs-http-client` module to your project: -```bash -npm i ipfs-http-client -``` + ```bash + npm i ipfs-http-client + ``` Populate your `index.js` file with the following to create an instance of the HTTP API client: -```js{1,3} -import { create } from 'ipfs-http-client' + ```js{1,3} + import { create } from 'ipfs-http-client' -const client = create() // the default API address http://localhost:5001 -``` + const client = create() // the default API address http://localhost:5001 + ``` This imports the client library and uses the `create()` function to connect to an IPFS API server. @@ -227,16 +229,16 @@ If you have not already installed the client library, add the `ipfs-http-client` Populate your `index.js` file with the following to create an instance of the HTTP API client: -```js{1,3-5} -import { create } from 'ipfs-client' + ```js{1,3-5} + import { create } from 'ipfs-client' -const client = create({ - grpc: '/ipv4/127.0.0.1/tcp/5003/ws', - http: '/ipv4/127.0.0.1/tcp/5002/http' -}) + const client = create({ + grpc: '/ipv4/127.0.0.1/tcp/5003/ws', + http: '/ipv4/127.0.0.1/tcp/5002/http' + }) -const id = await client.id() -``` + const id = await client.id() + ``` This imports the client library and uses the `create()` function to define the server endpoints. @@ -246,10 +248,230 @@ To connect to the endpoints, run the application: :::: -## Add, retrieve & remove files +## Add a file + +Now you can start to add files using JS-IPFS to the IPFS network. + +::: warning Section changes coming soon + +As the JS-IPFS implementation goes through changes, the steps to add a +file are likely to change. Please reference the +[source packages](https://github.com/ipfs/js-ipfs) for the latest updates. -::: warning Section coming soon +::: + +:::: tabs + +::: tab ipfs-cli + +Navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. + +The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. + + ```bash + jsipfs add ./test.txt + ``` + +You should obtain a result that verifies the file was added and returns the CID: + + ```shell + added QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi test.txt + ``` + +The file has been added to the IPFS network and has given the file a CID. +You can share this CID with anyone, and they can use it on their IPFS node to +obtain the content you uploaded. + +::: tab ipfs-core + +To add a file using `ipfs-core`, you can create a test `.txt` file in +your project directory or point to a local file on your machine that you would +like to upload to IPFS. + +Then, using `node.add`, add an `await` operator that includes a `path` +and `content` field and an output message in the project's `index.js` file: -As the JS-IPFS implementation goes through changes, adding and removing a file are subject to change. For the time being, please reference the [source packages](https://github.com/ipfs/js-ipfs). + ```js{6-9,11} + import * as IPFS from 'ipfs-core'; + + async function main() { + const node = await IPFS.create(); + + const fileAdded = await node.add({ + path: "test.txt", + content: "Hello IPFS!", + }); + + console.log("Added file:", fileAdded.path, fileAdded.cid); + } + + main(); + ``` + +You should obtain an output similar to: + + ```shell + Added file: test.txt CID(QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk) + ``` + +The file has been added to the IPFS network and has given the file a CID. +You can share this CID with anyone, and they can use it on their IPFS node to obtain +the content you uploaded. + +If you take the CID and load it on the gateway, you will see the content: +> e.g. https://ipfs.io/ipfs/QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk + + ::: + +:::: + +## Retrieve a file + +::::tabs + +::: tab ipfs-cli + +Navigate to the directory where you wish to save the folder. IPFS will save the folder to whichever directory you are in. Here, we're going to save the file in the ~/Desktop directory: + + ```bash + cd ~/Desktop + ``` + +We must specify the CID to the jsipfs daemon to retrieve our desired content. The daemon uses a `GET` method to request data from IPFS; `jsipfs get`. We will use the CID from the previous section when we added the `test.txt` file: + + ```bash + jsipfs get QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +You should see an output similar to: + + ```bash + Saving file(s) to QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +You will notice a new file in your project directory that is labelled as the CID of the retrieved content. + +::: + +::: tab ipfs-core + +Continuing with the same Node.js application, retrieving a file from IPFS can be done by using +a `cat` call. We will use the CID from the previous section when we added the `test.txt` file by passing `fileAdded.cid` as an argument to `node.cat`: +> However, you can use the same setup to retrieve any file by defining the CID. + + ```js{13-16,18} + import * as IPFS from 'ipfs-core'; + + async function main() { + const node = await IPFS.create(); + + const fileAdded = await node.add({ + path: "hello.txt", + content: "Hello World 101", + }); + + console.log("Added file:", fileAdded.path, fileAdded.cid); + + const chunks = []; + for await (const chunk of node.cat(fileAdded.cid)) { + chunks.push(chunk); + } + + console.log("Retrieved file contents:", chunks.toString()); + } + + main(); + ``` + +You should retrieve the file contents: + + ```shell + Retrieved file contents: Hello IPFS! + ``` + +:::: + +### Pin a file + +Pinning a file will save the file data save to the local IPFS node and ensure data is not lost. + +Using the `pin add` method on the daemon, you can pin a file by running: + + ```bash + jsipfs pin add QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +The result should be something like: + + ```shell + pinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +By default, objects that you retrieve over IPFS are not pinned to your node. If you wish to prevent the files from being garbage collected, you need to pin them. You will notice that the pin you just added is a recursive pin, meaning it is a directory containing other objects. Check out the [pinning content](../concepts/persistence/##pinning-in-context) to learn more about pinning. + +## Remove a file + +Simply removing the content pin will remove a file from IPFS. In this section, we will remove the pinned `test.txt` file we pinned earlier. + +:::: tabs + +::: tab ipfs-cli + +If you would like to remove a different piece of content, you can run `jsipfs pin ls` to view a list of pinned content on the local IPFS node: + + ```shell + QmRaaUwTNfwgFZpeUy8qrZwrp2dY4kCKmmB5xEqvH3vtD1 recursive + QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive + QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi recursive + QmXgZAUWd8yo4tvjBETqzUy3wLx5YRzuDwUQnBwRGrAmAo recursive + QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk recursive + QmSVcZ3G5SFZMMk9egqHBaMch4aKYpaaCnxBAJCQR25Am4 indirect + QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y indirect + QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC indirect + QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT indirect + QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 indirect + QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha indirect + QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB indirect + QmQ5vhrL7uv6tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm indirect + QmV4KrV1DBzTaA5xJWTYNx852YjRsrcTGGsaSR5a7gBzbr indirect + QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs indirect + ``` + +Using the daemon's `pin rm` method, unpin the file: + + ```bash + jsipfs pin rm QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +This will output something like: + + ```shell + unpinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +`test.txt` file is now unpinned, but it has not been removed from our node completely. To remove it completely, we need to run the [garbage collection](../../concepts/persistence##garbage-collection). The command will remove everything from your node that does not have a pin: + + ```shell + jsipfs repo gc + ``` + +This will output something like: + + ```shell + removed bafybeif2ewg3nqa33mjokpxii36jj2ywfqjpy3urdh7v6vqyfjoocvgy3a + removed bafkreieceevgg2auxo4u3rjgeiqfr4ccxh6ylkgxt2ss6k2leuad5xckxe + removed bafkreiblcvcr7letdbp2k2thkbjyunznrwq3y6pyoylzaq4epawqcca2my + [...] + ``` + +The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. + +::: + +::: tab ipfs-core + +::: + +:::: diff --git a/docs/images/jsipfs-add-gateway.png b/docs/images/jsipfs-add-gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..3b2b8945673426842e320a8dd3e79e590f765f47 GIT binary patch literal 61519 zcmbSy1ymeM^Dpl1!6gI>9^4&*2A2hbEbboM-Q731ySoPn!QCB#yW88``~CHM=bd}r zo}THR?yjn~sp(&JZJ3gR6e zl8l%bxsrpeiMbUJ0zx`0NdsO}Wf(78M_I-U5+*-z4JM9I_%i~d?=|HDf(&_1e=3IR zG4M-ILj=OYgc{~RBb4D_<;U<2W<1qI=P&p~^tPfLc3!-YtX)P z@Y$;AAr{cF%yhBTf$;27MFs3KijeOx{Fn%kj=y=fB$D9cqkczOd1E@Wfe`=Jby&Xh zxc}^ftLvvU1`qKL*}hPCY&_(i8^R4&pPm82w|GWJo++08!YcH}m_;~LgU-GY$yQ@a z4p(r+HX*Uw@1709m@tNB1Wx#hbcP-IVKG+fioL%Q%TE)^ca9|#`kpcy!Vq}ecX>ra zZ_m?zJE4cf8VO&`*0ufXmB?q0Tqq_*AXM$!4Kk1T$CSN`!dFni!+JcZh~V4+8D9Q< zgtXEgx}_U~t6?J6H2G<~@sECbOVkVa8euh82&GbK%((JeDfxQ`v~n^Q-vza9qP#QJbwkV1#GOq-nTi$;GV=GAXn_2FXNuHIV{}R47h6!p?<;Q023`LHInqwgdibkayofE` z2I5TU+h!I#JlT&7_z;KJ^&|ND^-osCVd|DR(4=YF(8>Kuh6t?w1d>kOQ5O&^=rO_b zoW4-`)9oFSwCkA0svpJFomKW%1c~)qz_VKy4ryNb*+>R`RF46{?(Znz<%6{xbLY z^jK^-N?gumYPTo#mU&jn?0Z*C##j@y;C=kj1&S|*#rjHR+13;-l-l zZ&To_n*&A6J=v?91?cDJpSqU1e7Ztqdq{yQNQv+<>|c1*K8)evvMipTkQ+Ntd!`u3 zacOXIK_s3L&aTfd-@m#d7*1TubDgksLM)1RR>)Eq#(y`Q?jS9rDl&$-DvYFH9Q>Q$voJ?{`uCld^dn_?0acZO_+G z2`Slc_B)gnL`IKGHS#eu>IMrp723s@QY47SZq@KUcIodTPf~e?k1ZY;#UzkMw zi1uQd(hykT;#7#zgzX>xuffdpaR%N2}-YO}byhxMOxiH|8-04&)iE-7w}AR*VlZ4wMMiiI^jOy zJYmdIXexl8oIZfProJY8lzD`HgqII4jQF6T@|{PvPPtC+DtwQDF+4d6Psg%dJx)Ds z&bvZZTXzY^TE{w?Q_-W)rQlZNBx6Z{7bOdmw}$tDH^SNFcjo-JO4+G~S=3qF-(&Nu z;rCK)FH^UCM8v-ffU3 zUoE>ihS)VNs>e5idx|Iu#TLW@#qdx|h#Y`J9(_5%BEh14SbeL(^Qc1aSffOv9HNqm zI0#m`engQ(ZAZ}%RdESguW+c^7OyM4PQ>Rt1+TG+$P>$B$rYwqahkIpuyU}YawVl# zatN3&0ZqQ*87CVx{yZ+$D&pzm?*>?P{(Me-KrR$a82x3G%&y4V#whoZ@*@sj#z$>N zcgB;C35@&Nr;Y8l5)Fo0K&^^ei^ju7&L&czz-sHIeOFp#QN%gAwVucIQ%y7UBU z8E$#sCD;YfM%kv_=5g!vB>W_EJ9|4%9E$ca1Q6nkmO}DHN>M7#s9>9#W@dOq=D2>W z#G1e$b)03m`p|$Y%Y4jgUvyu4KZFU6X_CoNmk^+b+C-Wy==pG7*VonR-n!RfW8c9i z>MFhy+Cr5s*>3OXwB4rGs_R(P7Sb~AVC&>_vbjTXt$AiYlCa71)6vhgZXci7mN`u$ zOQWc%!8O=5=}tbGlp(qy)p;yr1N)eLWWRb`N}qWhYTc{T=aJ`W_wnT1LvYF_-)<*4 zF6M>t<=bn<^D=ZQpz@-I36cA&Nn$8 zy8jiit9Iqi){>@{w(5!IgZfrLE?xb3g65<_t0a$Gy^hJRVe1L#sjtEBqj5X-S2 zcWa&plZVJ*ZU4uf&B)1!?C5fq;@J3*5bb2r&SwSrPZ``m!;Bdj?T^-=9X|7$d>gGq zt1{xam;^4o-#sypctIUoGy{FTzP&$t(GyfYoPl!LCD;mprQ0(SDj?h-+!r=f&=1fY z|El3*<^j5CwW(El*souii~J)NbI)2Nb$zC`AhE0jzWt__N=J=fFP3_T?S&78SEl1W z&nowd4Fl-|wObj;&v;gvq0BhUR=PW#W+%B-)c*0v1(gNB0ucTczW)8U{_$O*JH}z{ zsn!|GgGXRLFdoR249~RQDQYS)89vA$RZ*@#08pzvteVAE2QgpKE>{P)O4by1@VBzW8*fh#mlbE-=4Xys7HjJ9D%56NPKn#DE-PboqnyW_ zGhB#{nO321X>Z#XGHULAbQXJ!K50E2c{e;X971dh%Lph7HFUO#%uKAM&MmmGTz+*- z(4Y1bV+v^`Y2*fc6Mq|;%A3i%in%3W;GJ^>xVImP--Zp2VyB;F6MJ1QmE5aT6y+&^ z_^@5}cC>C6jrO0%Nd(V4UN>Opf`TLT@Q-x(bo1?rKH9gxp0!3DoAyKa`gobU2(EIs z3$B5-8W&`|KB^tHJ~u}o5uZko&g^^tE&?VTXvJs}QH1-WM^ z#~oZ%>?gm1MBOIl@9=J|@{=GuwdUsMbynx^fb1xEx6y;trKGBK;tT9nC@=A8AjH?G z;>YPThvy5lL`*kdva>g+8_w9FU%2y$VEhpd)RZximxrJSrx74vAPFI0!6``aB?w9M zpJ_=*S_tUB@}VFgLd+px{#8c-9RK;ng0DX`f5*`A!4UA^CoJ&g_8sa!Y9l&)hyIT= zlnb~FLPSMOMg|uL zWoG5!;bCTBV`gJx1lM46{AS~1;Kpdw{tSLwITn**TB%$*-3zs z@{geZ{Qccdpqu%BNwRVLSGT|&Wd2ja%*w>V{GYtRr2Kz!d6mrFfL2=K=GNdb1IrNP zWM|?3tNy>0{FlW4MydH)j`*-{&T?+r} zJ4Pu4gfN7RxQMD7D zy>=hDU5vn;>z`{VJ`jjG;2RF9ghKuYs*R;*AwI1bjVw=1mwKjhp{I1V)w|B@>V2Qz1*Nynhh zl-zKXB0Kq`LHV=L2ug7c!ars$EKN=$l~3N4^T}!gkj`PvfQp>aN{QnTlz*QEBklVq zKtV-#KT0N7X%l?h)xaW${HLK<&~HzENw!U0H&C?lu+A9uy)YCw=&<^=L=+9DH^??^ zvG0_`{o_%zGKY#HZ2TT;DXR~23i_*Y-%qi=V{5E-aPqVL(^f4kAxy+sTDIl#ll?{F zSB|0CW>D};>)c%Z(2)A?HvXe~Y&1j=-~hp1;IF~%9*>7uZT3!1$)b_})6IVpbRxkV zbWj9b<^HO!l!Evx{VmRlR$C_pJ#J9)AMyAjry3U%JS+^Ysrwe9%eDRlm$%OX2@b{dcJa2;8ZL@l22R ze=#YBhoRjmg~tyIk^ZOs(ZPg7YH7@k7*?V9i^UKr__=m4p5vdcmF{H9*c2*d0KJ1! z8*$6GE-1Pox+G%V;N8@{L%*cM`ug`$pYv5YlS6U#!aN(~jEC|mwQ5C1a^x5@|Fj(< zt?lnsUhMOy?LPC7Qh!g-KbTbvlM=iU2|xPka8A&R7MfV_AwQ`NeJ)w=IG%oK95vm#PmSL5t!fJi#wn5%Zv94YB zH!G6};Qt0(lWeh?lBC&Ewob8H$lq8}Ew@_!=%qZAL>*fm{Fm^rN0h=8^K;Gu-#Gut z+6LFriSAyYdEIsKo-5Iqy%))xqSJtL8cKj`DPS{|FS)kNpwdm>9WKqqqVo-vjS;S6 zXmtu7svtOM&Wx2^Z3XzT)yzwdwk*ia>R|8NCJr2ZF31Y+NiN6!cAkNi)>_}+;s~5h zix90Ov?X1E{OctY_IfW&q2bkT!Ef@<^nqWi^mooc0EY34`I#qAm27tTI&E!dv+AX4 zb5hZ*4v&(~ZV5L-lUyTgg?jd$;zwQm(h@wig@VgUsN!~{Pr%&pHqV{h$T>CbRH}i2 zbnP!AobwMr-nV@^qTS)Mh%Ag>=H1Vdv#E2I6dL1ey1oRU10Mz=yw97J0`G05UVOF*wO(e6;)S0077GbVnXUBc z%ZO~LEQxFxf+DZ%SvCRr8hav_l!~qc_bP%vvfw>ehY) z0F2g=k&ukHe?*<;H2iSs4gZ%C+b|XV{_U!;_A^K~e3i_@`vcAB^xw+r|MGG3`vhb0 zc_^ufo{3{E{>WuKg~(%9cGBH>Nz_JM7p-QFm)i#Qh0J`-!*{15m4;z&G?~mqA;ILt zHCEl@n0eW1{R^QD?=9{T=g(lCX<*ObnOPR~RL+y0@`Ah6;zWKyx##b@splyC{CWxp z_R@ajwh6DD((gz2DRU!5vgByfYUbSeI=W}zHTopnkBd+69D?w@a{v-xkWk~IUp3`DR$z=RRm_@h2p~1;) zT?d|amc1TsYhgP&R>$VacG0HIB_33D`7KHWAHWbJbPGT|wsuTv_!hlzL=keGBn-Lr1F`qZu`cEg zGT!VRptl34+BriE zn_lNW4kr521y|LE(SE7fiRpt!jWJ(To|^ZG{RL^B99+N6qR! zdF)}>3Iyb`-=$6`rkX{mSb&07T{h!tbMxPJiC%Rwb#d6{*l!5 zba6u?zul-vpE1ngi?A-ly!Fh6`?l;@Yju3)R+xEmGn}t)lfz7Z+`N7JxV)yicThLq z-hyoO!tqIQ1j4UeP!bJ{UA>y3-1*?ShsgLYiZo$FH!4u5%cct zbfX0kg&lGIbfUbkb51Wo?ywff)^X~Rk)GOQ{b~BqOJ{7)Ym;Z2fUU!a@vZqN;ozY^ zX}QHwisxa+Xr(ko&r`Saeru%J5b*EY8zp$enZ#IRDmH>Jo*bj>l}Y?>n6d*v#hI?7 zq;keMTpC@)9eX!{=gABk$p3mc@@*fb)&SWz5@?uIlSngf~TuVEhZ@w%;J}hZrH& z71VS|zUj0c{B_zG{^vy9#G8jDUMZiA0A>Lx2|C7=uegC|S#3`7(+YfJRmmZP{B(}{ zOrf2omW9@Ba}GVQMMp$XyJYH?hCUb$nJ(^&Jo1^`GKHSp4ZY@0M{^R7B+XUzHmkM0 zyj@=(>(ef8m(NCOfs5}j?rsXxMTKE8{bOp3K*?vO<5&7dMFi5F&*36d)tj6)FC+AT zr=0|5!;wOr&?Co{3#rd{r@(O`gNLfFZ0d2LJBy!w>vkEB_awx(Yo^T3(8t*JsN+VX z=?#~28E3;qAO&O%;O^7SJbD;Rj6JU5#5@059!ER`megbP|)UOKJ5AlV*)!Quq?y&rc*PZ|-}pE^439i@Ic)1?Ig#CBSU= z%OEpd?mC?q-JSbwc<~63*DWwD$64dUnBcxKE}fHI#`C(oYYKLZYGJk$kTrGrZ37zS zMH?WDa=u4&_A`+V^rND(y1XL12aVUQOMI_+&T;Qo%Kne8Ef^$R`h|LO-Haal(FgDB zU+El!sKTc7SmDd-QC;mTH~T`*=LsusXEpW`jSID^gUJ<*x+*mAn7z*Px`eAwF+!Yr zolmDviERPDw|GyOJ=>qgLQb1Te5%H9tQ{vLOeNL$OYZEZUQUrkAUqFZ9rM;bp7=l~ zf(8@c*|E>WeE7Y2jeg8u9c=}-b|vHaezq2O{tK^H z;CaDl{0CA4QE~Un(h*$SmP{9ZW2M|)-R$~<*GUC4&Gmc=PJ8hf^PS3dmZA^`#qH9< zt!94jgU9JNaw^QXT@Ao*JzwE<&#Sl9ZP(qxw$mjoa{9{8E7vh?rL|h>O^6^d_KKA| z)Wvq@G43mvMe`z(Rf=v7x1FJo>DNkh{yn=z$MI7eqRxtc#j8vOL zRr_d${i@=5`8F)Ali_n!IJc=>_-~c zJ3BmYM&CCfp|kNhEiAW44kT5K)!qrZDcmkxOTEpO&HqFmS4_P7p!fxIetHr@$N5mP z!P+{DD!K>l){y+IMhcW<-Dple576P14uLG;vmw*!(Iua~Fl{{z#EuE?7s2qA%X$p@ zsCS(g{$tPd_&n~Q6HVw@71X^c~B)yL(54 z``A(d=e$8TZY~-OaWzYI=(cpY82Sm#)9L(3MYN+D-%I3nRv8Y`^Hp?QSio1iYu>B! z1mh5rM%kq#olfr;IBUM~;^l#@#NETA&nN(p^IX_erPsr!9hrUTnn~nC<@k~WDP@7p zOQ&379nuq{V=BcW9D~zN4=z8m*>Jk97n8$V-}1)3 z(5rd1mBb#oG4HtR1_91Aa2!a!8T%Zpn#QQk7IS+9@Lx}GYhfYy*D>z=H1P>BO*V=V z=;fI#;OEgzyIwI|raHVoT|V2r7#u7rQ}Ar-v$dt&sWk-EhZ80TD8 zFdVI0@HM65<_$W3)a69CR6J6LLSp;5%0#-S{LXkFGRF8NULt5H^}@-HVGx_kzAc|9N_Us@Yzw>13@VMjbzu&GZMontD)_ z#Wu0Mrdt__Z4*_wBQ)G+mV3x~^k$Sf{QS-U-u(C%R=L+G{U+Liy%sk6HXd;@} zg&KTcV1cWV%Q*cgXY#K@JVX>phIJOFATt6ye(+^{si@anA*0HBkSD!iT zfUEDTeGu3;ri}Zpy4g^;e}wg(qr;-KQ$&4_8KyURmK@-c{sNQ29y+j5?+?*raL1oY zi*)5Y(?kas%uG_7CJ;@Qn-(*pHQZK6&Y?D*-G&TE^Xy0b{oGor&_N47f0Xrg1B>pO z1!7f#nQ;G43ycJ1N`gOJdA!S3Obv#I$+cNgFL z%R>g+VJR{%bsKz_Sbmuy+}0bvo3g4--O6mau9^DSk?@c9a=)2bi~04Zt+#lsi_9@M zB@I`9ZBVjV%;eRW&x_)-U29=rZWC52W13>)7F$*Ie&+7enj7bT$@P5L<-)DL=M2F8 z&1Ln~j?_k2y%;fvHX8NL4M>%wSz7B1Z1XHNsxwSGtUs|LtE)Q0adtZ_wI2F$(uAtW z;3f(3eTC=+GUzqls5+Crg?O$Xsio9-6r;-@l90pzSy5t!;dt)SluDM zYHw$n9@-a#KOBw)2r}!c?h$tHp4aB!i>pPydkHKg(k1X}V#kOTlZ)`JMnKc!Ov<*- zpbc1G+`Nl+q1!zdV46Z~LF1{fI&RXpZK8WDo}VeW=EJ?Ln%~bN;j>|ehP#dd&`gr8 zIM2WAx+KU`Xf!_YJ^4eRxi8gMW$LV;FX3&_2Yp(DFTE;N+>N^G+P=jMJDCJ=>+RhG zbeU8n=qd2CF`q{$N)EeQy>1V1dBT7r7avyzrz@nw6`PxYSaxDpUGldNR2g@$;=kR3 zFYH0B4g)-~TUzj^^{;NF+X_c_xC(STNMYxE|J(dKLk7h`y>qFcso^x9@OG#|J|IC! zq&lSLxhp?a@@B7GYoAxHU#G3^#jd6<=Ph|DH;WTd zkZyRfkP>11Sc_$>?UY-42uR{(+(8Nw23;eZPe?i zv=Sz^0a)u4xG)y;N$EaN@m#Yw+blKxYN5j}3i)|P@h#%*em2R5dZjtIq)$~|LPVq! z@D?!wxT!N8Pm&t6Q5Z0v?)VO&j3F|ChmRqUSye*bk%~k&WVa$A!O~Ol;H$FSvY&P6 z64*275hAby=iDa%^64?BCpF*4Q_SL(*K@zPsSY)!+^G#vDJEBF4u)J6!Oy}BYuO6q z!*$Uc$0N=?NV{F`vYH?Yc@5;17WoAh(~;$PIvf{k(au{VS7l7!-R%Ct#{AO{dd!-B zCls0ckRqxWf8$$`fPSM|8J>G&kvQ~?ne18Do&6{2jIdbC{`1LNC-Z^pTntxY*Oj<9 z7A!igO&DXUEHfi8xNf^WP%)&)I=H`JUZ$t#&`%I$B0d7c_lRhCQTlvyhPsYuyta4E zW5h+!<9f#Md$#QtHZ7tUgu)w#<6dBhI!4V}8RIu`nV%37-S39sw&LhI;Qc9qGoU`* zH2a(3j-jgBo}RD@NQFVY$U3DhRqN4Em)$yv*`n*UMc*tW)T$t%{3plnGA1v0Ylnk?C-i;|gD&57#b)A%Cz6s^^3Xa= zq?T$l^LPqrnQ&E6rqHKYyvaK;BT1nW$~xHHQj4YfFceZxh4(JKHOo#@i&zf8wk~Ad zyp3E~t_qe|2SQ5cd>pAjO2%cY3L3pTVDN=9xqw?cAHj4gTwNp!0oYW zWhpL$`bhn_Ns5j-s8cgePfZ-at-EFFSz6pxijIXr}%qMck!`B5gEb9Tjf15gM?dz8)yF6APVx#KbqE z!8`GqT=;Z(^z4$Ft1uIl`e2=w3cq{1`b5xFE}nFpQx~UGa{yh5E$sszH+WRl#lWEU zU3FI4Iocp=ff+!eU2k=|LbI0fY`-+a*NFz2f)7yT#6=<4GQb+C;Dc$rItq`FRqa>Z zDec|(dNjuf1MN%D-ji|Rowbf%Sd6_)<@qStY~ofEVltwtfdo2P#$~wk6WQdn)-Lrm zZ{Ur5PW*Dno1wldkE_sL1cgMVq3o2H~s{&ytKApFQi zE;QuW)_{=uS0p9^{yzrAW340I)zLA|skH`xXNb|?V9yH6RY7 zz-=%v>QORWQO0Z;8II#cn7iMpLZ``Lu*2zqO+KM+id6X%`WNip##yt1G(QMLYXV3; zvpaI9FScTK{i#{0z1F+(49kI zOp6COPNyd9Jybbaq8H z5+tAN|ISY=q+TJqUj5$UE(y~ihp{iGv^ifBkMWrms2|wJeNw-jU&l*Ifmd8NE`}cM zcqKzNCjn#q(b(wB7Lf7u3ANld!rpnSv*o;(9R|%Ll$%1n(7LdLcNSo`c~D7ue3hIL zGT<;M5VWoZpt@GOUnet)j~!VL!N|uwBE#<$&gkI~UwB$cUS3I2eU`u6Ep@P3m_xN8>$_xikE#(OevmWGv*Kfu<@<>)jyh|*DiqEWsJMFnB1MjoKaI&mao zA;Ey4NNx4bZiZs2Z2q+JF>L9y(6jkrAt4Z8rt({eqFB4pD##-`tZn^;)wHdv4y~?v zJyw#B?)dEb`2iVtEv6_gVeJu#cPQ8DQQ0cW#6RD?i)IZUC&R0nIB>x^z1~UuVmlC? zv_!)k)uCbC6|nEfk53(RMpnHhi2ot!ZbVUVmjD<4?6~tsi@3>AXE)k8k#W$t!6PsO z4R>6`4(i&gT1Zds#nFE14Ev|1%ciaB2T`V{$gp+UCqVS$yMI6B(Fy(o4bGW8p36M$ z{em1+X>c7X=#qD{T;kPzJS7{gV~c!b)#&hFUt)xol1eS{_8c96o4=TidxWZzvfi!} zU$fdiCXCji>&H{0zv;TP?{d(=d|=cMuR*@MgLeK+uU?bP>+r&I#jf=-=vZJMjnsDO zxTBE}u@iUZxp?TjTwS>nyB^E1em z(PPv(+hxN@lMDD+t&A@gQ@zBgSN134I22%86zJ%;uvY*McFQ^)(BSNCw93G4n4(F< zTDhXR*&d{H=us^yv64UF`pNBdc@F|3Mo{VBuJnE4WZ^*85$dVyMonTP1&)CPdjlyy zxb0DIEulp#ug2RX&x2inRI@yft=@M}`a=!#=+WZn-aLiUG)}i#8u@aFVIl`aHpGXV z$ne+C8$K&UH{R8x{_jyfk$9fJPD!bhEOZOQDwq1z;je%70ttHj#FQen0?P}j9x8MU z?1n1|aha{pCXlOvtm&IhS4Kf&kue}iA|<#<{iuB%z!08jYPTTTAC|omo{FA<$;(5X5(WCZnD=e^>%(^d);VTq|? z%w65MG7b!v%Vc@Zr!`WGzK`sO#n-!$wW_6dTcS@Qfp?+noHo2>6KRtiF+`CS78$p9 z)JvA}R4GEF9w-D8a8!Z#)L*}n`m5A)9Hp!1QsCci!q>Bs6`s}y?5Ga~-9{MQLiGi? zGY&?6qul+OL<)F} zwctQuIPBpa;r@8kwavAKB!4xdIZZ{mf#&ZL)XmEc@9vu2oLF4>_1sU@%oOAmuY+WQ zE_m>e%so!ihLJ^j^G|msyT=L1We6+5&n%Bhvco;JFsWoj#aJeY|B;Dhz`|R9WikV7yZ~V(aOz~NsNI+G6vI-Yu?MD4u;x3q-NU~>px&& zJTTNL&pprv2UzSnHrIB}beg9&o8S$e6hpP8EFRhGQ&?&jX*5L)r`~yB6;El`@ovG3Ef9(AJ+6Y?lKyfhc@HRPSKYP7FEozom=~rlIR0dq1&1kGq zqN-WJYB0Tsm0~-JL?-1i8;!Xi>J59ny<5DfdfdACK}j>A{pm%1!2h-8%)gmTU4j%T)sv!^$9hG{!LlN6p)N)`V2a}*Q%SzY%m7UwxgWp#c6 zpQT1Bhh?_MA_oLp&R0Yz{~DOR-UFNPS*5awDq4@SyITAb%|w35G2@1eW*uLdvfqM``OA`2YY zNOw--*$NGygj_V0~p+D83 zH@GJydpk3|T0Wj&6pc17YQ_F3lvcOUIRSB+nVJMXnaWv3jHF$xTs0?1K1w5t^WPT>ML>Ft7aPHUVt)WuoVr;E!@f(xo5;hf`Z&yf z-12Z1$aX(9I<6t}!u->;PSN-3kdA&${LiV1f-1t~ZsRhi;}#nKv>R&@L*iau>->hM zd=V0jAWSw1$o&$Q%crDPgpgPKH_joR&13aEMoFe3ule_S4NTtNJ5WZrWP++_WwBCv znwT1(^US*gP;%Zhz6O6!Vm>KKk~1SuPq#L)4~dXqH6!k03bMBYi2y8BM3-KQ(wj~& zw@CAA`7IMP@s=N4aOXD9N=gx0j&0v%SJa?CVTm_0x356Ztf^umB^*1;IAaPKx%oO*2@_26s?Tt^@@$E|W*V)E#L;x?5cgj@i_$hq$`I3N=ZGPm+Bjy1Q()X)XuR{Cv zNqLkNY7zyt&%xfcjk2}}o_#FCY8QAbZSA3!1Mwi^SN*X#b;o__uvV|#{p6ogLU(vj;}%)csUbNOS2C8I*$0^;@u=n!LtZxQ|lH2Lys(=Bv{8b-ipT$41!6shVT zV%;wWO!cGWdo#Y5>Q-#r^ankQk{IbT!?8x0Cp zw9JfTA5uJCJ=N}~j*$!@wUkpukZdS^mWBC(nHh?)>0B?$q#-O6+iSCguRn~=yU>!r zYe7DnkN=p%xXR@q_dc^0&2Hm5nHN52@(W4SGr2YQxp@`vL$s{Hs{MM|bm5Cvn!*t5 zCR9J`TFExZHBv5(luk#KDgOii&5Tij?i1(f%r>0k33&@XWv1s(VfjH-P7GuUEV!EK z0>@f^ykiu!k9L&eOKPFzx2ho=XA1jOVzfKFzrVla+je=aSfE&S-K|MgzR}I8y784c z%Io85iKYe$A2Q}|T>70<3qaj*ulST=H&%E|DmWirEt@QvD3Ol6|DA`auH>;3w}gI2 z=LjYGb{T{eXLoX$h*}vy#^OqJC`G%$w;2feC9Um@l)CJi@S)lZCOOCpB6;zNn^?T+ zv?j-!Az21&V47-NZm`T_iYbz?hVz=eHfIOM-InncZ+yEGaES^mSYW110^7#<+EvKC zrziAtbwyzi;79VS_tn70x8wCznp_`$>h?1qWyGXv>&8cznOT)-NK)q+id5&V)lRRw zu$8qH(HDp&*AHGBfUxJnC3 zJZUd{w(zI6K=gjlXbI{uC-SV*;pv9?sSaw5k9d~md@ zhlUVS2YPMmdt2_i86iJnh+ zUr5vb9@F|eyW5A5JOU_dLT2v#@WVCyMw@!6j7#G28g5dUCF;|R{FyZlu<=>~Z~&M% z=CKEZxBunO_T2>m>>V;f)^S+6Gu(#^j8SjN^|49ze9=Q;oo6+b9h7|~N4-8Pr>6fM z-wu@~aEoXD=}}MXVMM3E^3BK-*M|3QE=T!!E+hU;2z}&Mz`cY=IBw^Fd+O)z2=G*Y zEMcy$D=srQ<2L63|13lAqtCPENU?(4XiF)Hv*-|zB;8Ij3HR==omQnB5Uid~C$cQT z?rX-UcR;!b&$L$VhWVplhBKVdDgrQczDe=zD2n;*;gzKDp2%6%e2|W_)S6;`mJ6-2 zK6Hdku>X&#ZOW%&(wsg{1-!m*c6u(i0_R6a#yi0O**c~4-gG%}9}eH$oyM-vyNl9! znU0Yy*hT|FzjU^Pm~0aOc3AH1Iwp?^I(y zx%&oL0nN_o+sN$NJd7aiewMafWYa2dJAhuUya_5+DKhv5!{S@d!m@4G znKGgQk6|d-_IL1|bPmVVk*k24K_}yJ`V@bQ4Q1lKdJDu&<2xZkF(!|4%4Me@y5JPz zO{VS^03_h<+n}RVJ0$y~a+pT=f~X7N>!63o+N%Qms%%M7u5Z3BDZ>}UX^+4Y^TxtW zhB%YfY+-bfQeq$oV9bpoub+Hn?i?(T?G^Bwu_pK=wvZ^U={njFuzJ~?Xr;+|p4vCN znA^r+L^2%vdj6=7Vn1?$8Sa~lo0M6i00xynUW)lIQe^Z39=CQHK0)3HG>A-FpQj*_*`A4YXVlsONt zo`&m3$wwE`OtXG-LdWRXzT4ZgM&kb1-C@1D0yZyZ4BROV0naY>)tpc$QqdV8E=NQ+ zhrsR?G+_52hq4PkB~{g(y*hiV;-OpTS@UHKHaAF-%w}}!i{~rFh`{ItS6aIsHZr|L ztk+j9gO$`tMed87^&bi+-)8G$k?-D*trrDf4c3@#qL1m0`^03J&yUS?-hAgo{s{Uup$sv=*%szr-p$`grt>UY z-c?p<;GNVa>7XpvYYRWl%%af-|Npe;gK=GVGL;foRWs*49<9MT=r!>#HjCV7A0{W2 z*=Q4~{c1Suzbe>XPda3TEgY%MUHvDriSau4nsP$cZPvhz!+ z_Y5LM3Q2cWc_=c%@vRyzrYae5*0Q)X7TKfTu<~*1r`mdz#%$H6ruTjo3BsJG2jH`B z>(&OwomQ^}P?BLC>qlK@5q%&gR?aw zlDri7#J1|?OpYSmU!_8BJ2--t=yfC-_7cV}4lS9I-#SWuQJ`#1l(5BwZG&C$Z+5=DY!+ufp9kLoM4j{FNFrJVXgCmU)IDZ+%EXEl!fJaC?tdX2cTh5OlJWLj<9X*O_92K0Ets66hi6q`+dEj9Y6wuQ4}V zv!!lfM_GCMAQ4YyrT#}6jwF1*lX8&2Jh&|-hrPTA&E&5Ujy=@@JN7s2Z?A)wKaS3R zRD>sM;TNfjDlwRK|Hz4DC}lAytgaTWZ1WD)Au41L(3);K$u(cWNJ9g(^&*lrcII2c zeF?W6v7f~$Yv5ctw7TcSMxwJyi_U6HNl+A&B>Xg?(fH{YqRY9jmQtooV2{G>3N0)r zb_7XigA~TT2K|f)A@0K?@iS)!r+vKV{idq^dn`O=K(!|6%%>c|TCmO-2?u(v%1q}s zMtLkpAWx>Oc+J1y_Ky@}LqE^u(8&w|2MFeNF`P9g!LGYLbmKyA^mrNw9(rJ-NAH-m z&=xw}0mMaHB7N;7&HW=h+DxKj`qnf&@tWXNVy95acig9gTz_GZ1ujq-5maZ7`fPvi za@u7?Scuqg^xWPNtTz9!`yhqj7&@)GGj809g>V;}Sc zM&of!iWKIn_s18ebzOa|8?9OPKM;4bWshq%+Y1%ne%?4n;Hh~+PBuz0@ATes&eC>< zP(FbHoWd9Qk;+FDzjL&tQ`z1S=aKa1N z*Y4G;SNGFT_rlunIMTLEu2g>d7+@${KC= zP1Hyoc`Dv>%c8rTuL?iWY`317PyWzJJ6v`(%tNz)Bk{7o7<`|ytfNi=yCyH$vX~tg zg~c(v>^^{4F)6Z$bZUNB{#sZDM|zCjV%iBshv5M@_%MKjPuD+OiD3G84d^QwU-dG>_Q)pOm1K#>rV z(u{=6+PI>P^gx7T{&OB2j+K`;EuLA8NyI{k0VptdRYL+J?sl7rvFIKO6V@hgeBW&A zcwBfa;2H`YV}ol4>_U&;N#6+f*AK&4*g+v7!|ZAJf=*>aqa4abt3?=!CGoJf)Pnr^ zK32Cby=JW#pRW+7^yX}kl9VR-bV^1BrNny!2PtyLPu|Bew)#KbqZEM+m0ePk9%<)A zGZNK-7DH+43Bc#Oi$+$?Qx#AS@7ay)+bivt!@=Z6uUP=Nt20#o%Np4DE;y-+Fn+qs z#b;)j1%JRLiEONkF_9Q8KsU_FOHHHGRDV*uG{|{1QkH%L@nPc#VD-iC%=QdjGRQMh zrM8qP2rlwpA+vpFR?TNeARhq8Q`uJkm3;7|4mJG3k4r6F+C-_hL`O!|K4^Y2`Ypth*`>*r?te9JUYZgqNQ+>;QbZwKMYRP*HSLO%aI+ z3bW0L0xit*+?UfKt@M2)oT|YIin)GImGVOz#uzF- zcd{p|F&l-aJ526O-JUp6`_`xj_{{?}Ol@jFR)FrNp-!`gda&LP-vOf262e5_`+%w3 zaUX*MP0%U>S%X381W$2M} za;U}mMLEh&mmF2i0y?ggl7tpm_x9o9xpF~3D{@TSB zH6+Zua$r7cn@r`tJRxqO7W*Yzn`Ny97g;B{QF~L{W2gA_cmjLUO>%Rwp!+rMWpZ4_ zkM167PPz=0ml+t+%)7xjGFv&U9o0 zEbeEGiyVoQefCN_lAnIX#Il`c5Th`PxTn_PbHG`=&LA%0y$)yXQ3}1khb$c>L&3F^ z;70~(CxxSC0i@HH(;BO(*#Q2F#w<^{ebdmNy`ApjN9fh+m?HA^$0LDsYm_OwSb$*C zX}aEJ<9g9$cT+y@6JBoPCBp71!dWE(H~YN|e+NRuOZetklMO!M3z_}xtuE9YhPI{~ z>q(xD^MtR31=nQ!MLR-hFNm=Gl)e!q1qIvz_Nl7jinr^Vx*K5w!5BSHNI=>SD3JXd zrOj0=PA6N#8)ep$AZYarnRt%jjQs~kHyp{^58tS=io2oji)I^RX}0={_A@Db_d6?$ zW$oH;;x7tX!tji;M-M2+U|`=)XR})0HZoGNlr)^n);{RjB125!amc+}juseVBblo6-jl?Z z>6#|QVE&+hNR@I@3{)U>F6J@jeZ0L9B&dZs=a5@lLTHSY{5(!pJG?jT_^b`*I`e*R zJOFKV+0OLme<0Qrd~CwF_1xOBWbf|u_LI~qZ;*;^aZxPmY-ze-`>sDZcw*$MbaV2( z44awixQH(tpt`WlbHW`cv@T6~p~yG4+8lm&W2Pn{#pTSwmJ<7|%XDErJ}-=T{6YO5 z#C2B)y#=iec}24+VX_nH^Llf_+Sgzd(lBlSkOllhYoE)Gnt$;luL1_PP=u8udZdqy zo&6l#{^gx&m3#}-Jk4Fk?EA@7VkPZyy`@fPuqS2<1IG_|hrc;qMeZNVA6iwb?eb%w zFZ}I(@=eg;ssg`z`c|!#IRd_2^>q87j`j@LWeTl~SS6=-My*_{9&XT7t#aBGePsD@#o8hMeSZS?vkuuYLU}}z1KwbNsoA_mo}Vo#-s${Dz)d^prS{t3 z8x*2JQ0=%7d!1B-YNh0fgv9ppPw6<+Ip4xll{h;~Fp$6|?5IgQeHy(nC0<>4WsrE@ zVz-$ymO9AM`qXKua`SPT4ZWt8?+h1^NBkLdOXWXB3|cJqB%;-Mh-D3C{V1t?bt|2p z-FaPSDl@m@Y8u_5Y#Wl-t1_8b^iUnEXy(F8J0DcMdwFi%HI1a(aQQZ>qElh;@)^>k zsIg*8!jR?U<9V|Lb2a>K7sn&gFmmvUv=~~PuUEbDP6|ZX%d*3IppaCYJtd4Bv2Z>T z15HwHWvXUw%!#Odh$8J=zgXMN4+8d3Etel7I#`U9QtG4NiU?jK&q9E99Pp5s)3Obn zXB7)TYkNum&27)Vwi@y``94=rfY=NnEm;Cl#W$j*1iIIU4PEm&-5MM_kUiwR5}m;W zeF9f%r)kj3oC=%i+L`0a9z_xM#4ngBY+TuzRIlNtOW88(Z&bwzc`qJ;TOQeZK1#m0 zJbBnY&>mQ%Db`-Dtjy{WPI}LiQ}V!$pyFnk!u!r8Q@Q}6y9dYo{~ zf**-zEwU57p2GT3-!AyI3(6q4wCG`RLw2sR`fZ@g#2>u?>V+p#x_iJfA6s&BEruW1 zRyu!Z3Ya1TiB$(#g?HYQPhkB@3-DQtlN(`1WxI_H3<#n}tw#6tOkzO}=Y-oBXv<+S zBA0rP{cO?D)_fYMn;<*P4n=P?IurY{x@tp%12gPH0-sa0WNRL63+A%5@)5KMwAob6 zQ6{qxpaQ@YR?^#9#E%D9G}XnrWa|;?qukpu6kDxMU+cDN9q+yKM_DekiR&tS-8yL|Bd2gc#`2;W%zfxGXy#6R6DZ>y9w_g9W|Tl8q-)c_?-= zbWP=}4Xm_D!GU@9%KV4lNwXXhUbrMooR$y?0F@u0y=GG=Wi=7q!+eG7q96sqjW?Q- zywy9K!L3@P&V#tiH{}g67qwITnyNn7Q(jT`iOQ;->ycmV%F3)pbX>~MNa!dqI)AumxA<;Unfj)&$Q9u zOSa(zT2qHoO=%ua7gy<$F|CxLYS!rw)jK~fHwD}U0Db5ax4$he8ulSMnKWF@K;^UC z4@~nIE=uo!LXHIY9$tllSL5a?hC|Ovrl*`b`@fzLp374l-wgrscvg~yJ@B`^B&{9T zXYtF5w-@pt3i>kVEe$xF(G-N)o-}2Ef$&a~uQTTxSMvosMZ55+9Dd4UCTOryc_>=8 zJxEhtjMndC{~TTqICrMr-_n>r0ItLAec0T(s=`ux49~pVxMms%md3Gs)@uKpqr2r` z;2A;3e7!r@dN%Iohb;#A0~TZCVW*g7So)4u0AZB+7gT95cFbF*|f zKEPYvSO~7|s?2260HrM8ifssZCCQQxDZtm=(qPrQR8w~F?bXpPgkPb&YeN=p3_7-w zJeZ5Qk9tG99h#^4);*O3w7B=&oc)of(MnK7Mhaj&no7;@0*fV>U2j6l+hOTI(BpUq z)~0tt*i6%=2h=9|l(7-_eA_Q2yg8xsZ${yoEWM`SAOJ(W^rWZ2tWf0xrTTnxcmit{ zm?7K?Jq|pxae3C%A{VSzgo>Pym1F=LI`~s%Zg{xt%y8aSYVxQ~KAJl0Yd9S*6Iv7vEF8_Y-qvOj+4H*8^N7wd)aY_sFI6{)m*cXHwD=omb6;8_3^^Pc^-9@A1 zl|EF-eA=bZ6et1HhYL3_w5bsv(ic>JXPY=O#(181Co>2w+_lHuB!%$Io2y5IvR4x# ze}4YNmY9NSF>Hm};X&gWMDD|ZMMbe17vP#Uui}nVk{pu)*d!vKR^r9vK-N8(6t|N_ zEZh`V;^l7^cfZ-0)ty$yzGCZ{^27VHjnWFt!>mN(5?q1vF{HoJjx> zp;l(n$-l^+T-e&OQAsN{k3S683s)&@e&LZhqk3}bYW&*b-DRxygtn-OTd3u%MUP00 z+u`0Pv;I9~XNqYLM)7E^Jq$TM9hq>aJt2=)wf|HWS9ne52MRYbAp{QC=+0qIJ7L`9 z+JIS!h}u5Q{z!B#_^xtYot&Nm9VU$txi{YGjU!ypL-(m+fh^)_q_lVVUXMn>#6_}k ze&>rcqs^YzG)qKb+Qbe;#*?*}$69#|TBYNUy~admiJJ`gS1zROqvkvRRfM}DUe}=H zONl%j$&{h(6gczE1HhoLjveY_B@>5DLbKh&kFedFMEA6A+~7Wwzp!Pn)r`w?WvJNZ z1cKm$F=~=+&j}$S{v7tOfPEo#OG)eiI(+eqljWQ1Pv7VMn2IP@fp?6>vF^AxXNMha zkjE(PJJXUIGlt9_`YoJ_s85)G?Y=MzcGg&JEODN28nxdDwkJbCd?%NNbBAZ}uv{ob z(sE<*t~8pUcZfFt*91Y>b|L)9cSqg-oc-rmg9U&!sKV{iSc#4}lyGj{WXxj(UqXxS zX@aiip;@gorW}FKohm(MF|`HHI8;tXw7MoW$|c{Nwa0ro!)h-$hAv|hBnhfw4V7O$ zt6TyTUFhpX)84NkaD>~DWX0!jsP`GFvV;mk4aO+G7#(LQ0Pd-dM%1z*SL*wG0BX1> zHGk5p);apBUtv|RTFKR$)M4>`VJzN!`Tg3mZ8}}&rIYIvNG{HV=WbZzcn*6?2{)zl zJvIH+cEFeTBKwCgVeC^pOEi9C^yJ2+uHDtEr(sxFfty9A)ZF12fc<{+Jk=rtjSq@M za?GSdXsPN}uR^+Zea?w=AFX-~@dc3T8#_jSCz8OqhWQ|C&G&5x`0G{9}~H2mOnJz4d} zr2mAjZKITGK%y^JbA%@yceCh82mxirtdSp93%bYvkJ%CF6T3O_jojS0*fCrZrj&_~ z!FnWAT!A;9XYwBI+;Rx)eP}y;JK)(6)#*Fg#isYgbGS9}LrQ05jlJIpbTXn`l@B+_ zw*hQEI!>WtdGkP(6|>;GXco0~FxOaKV!n4GQ2ROMRO>iX*uf6;<}y`yWNLHP_{N^! zp`(^z8pt2^)ZI6xu}HNS#1@dgtgO`$%-y-gEzXp({>f7^+j~Eejp0~unX2E*IINP6 z=D;{uPrr6+C5T-s^!&OOla=?q7+I)QIKch*LE#0{D4=}?Q}&nU)EAu@%3UTbniy7u ze)aA~<%!w!MRJ5lAbV968`CZ78f7(8Wu-P!)0fb5H>TujskL$hL>6eP-jYMwacWB5 zQe-XANciFo-a^fNMv>3;pe6EXZyN1J5yi9{1&8LFVJW~ppry!@XIc^ePz|xc82S;o zQ){JGGf!$Aij8sa8neVxqG8@yD59YVr5WS6Y5R?jWAgCjO;Fa&RJzq4%*iT<2RJpj zczF8rQ|V%#1tgNQ`?5#isB_hafGzOza8RVl?nlS2U<%`p&v2xW-*lgHuyuYo*0uJm zrRF#D7M=3uQg6t;P+ zx+!cfS@mpie(^)OMS1ql_DI#d4^-TDC#FlWkSkYFHryE^6k^kA7rDUL3Z=&8e-TEcIJ-B?`pvCmG1V_G-)it(AndpN! z_}ZPXC#fOwX79A^yG6gaC)7H5Aakf*!{McWzCEu?$d_4sZaG`E1$8VL5)eGwz8C?W zT%Nl>IgZOg=7Cg`U-AiRZnE?EUW%_L;eO`x>G67f=C#n{`0{VPc9aCrfk17wKcke; zu)$pp&0@IZ5kbb8olM_1741P2T?@Bf=<8&{y3R824!DxzZBjjaGqc&4Nv3O#NoEd~ zmiYtDsdCoksWM|>ZsFCkTDC1L)svw~lN1nY7yrWj#M3j{XhOEPer0kuVindU=~Jbh zJO*%HM7WZD`Z;88t^=71OhbUg#4swvtlQrf$UR`g=S(=UJ$LAXu zx2Gx{Hm`G^?y#5t8=D6K0lvC=<%^fI=Zc=-P6Vr1o)Wo;B-KJ`7dbpGYp8rah?ZA4}`s9Ft z8QQ0?-E=p|TVQua`SE)~f1;H8OH|ASv3M7Y9;H4F9>iET5ERujbaYX7xX!xLgQ_b6 zu@D@x!J%T)hy5bG;V9<4AHQUDnzO#^K*jbis)a2{KRTIlBPW+<BEm60JE)|=AhtI3QTGncW z0H6cb>zaOkg3QbSH)8*%FA;CO?m>{E-|deELu)}NB>`y3@zyPPFb0IS9=QWJv}W69QxrY6@8l; zXTj@^z^qv^CM?@AL^dvX)gfR~ZYrvfE2Szx4=_SW&90dWlDO&;@v&C@4Ns8^O|5!& zst=Eb-xV6`&WWWS^i8h3!*ZqDJ)&TOd><>-E|mj3KpUv>G^7O+|Hl{FGUVMe(s%pJ zqbNYzvq|o~&$X-#*$P22gDSJ{FzrA$B1u0^9pVP-jgjMT57cU(A+^`jGp+1qu^Pgf z?T7}aOrLXv`EUR!HtN%bK*bB#8_N$Gm5O_b?wq(gtQB{5%T~tEa~rM-RmsN85AU8J zjdjSIBN{?v0IsG@+UDM@RD3L6e+lsu;|S^6#zq{EPXRskL&SD9^KZIhvGx+ihL|*)$!Al7O)R2eq z#I4;On!u|$*!1d!yF<$+d#|n5oX>7%Q8lq8LyONq zQqSu~76b;Y5=qP-&y(%Kh?_=T6oSzy2FFQVMUkV8jWS-4d(%9TH zxg;@vnNM02`vP{a_ztPQ(Y@D`Rfb*N9hXIDTB@1hc`Yx&#c|@#wpd2_7xpVl?@3+F z(H*4i-s);)S?eCnO1@g!%F7*-N+ky^78LMyq?x8j=Un?K`({t%@2^bVRbl?diLGC= zRAe>d;?UFLqLNy>1X~As#`%w+tH7HzDmJXb>!egi7pwBOnE`HWTY`kbLz`f|6QBL` zO}PBl0mIwU7=qynE>mXT$DLD+y#{43+ZDKh9H;Hcs?zD<)kU{WnFI!=z5pVhZq37b zrUA6&AXWXOYMx)u2Wfa#Qpt=-HEMW?poNa|>}z(CgRewBa5h}fX$|q2(4BN-4QKc( zR}bP-DLr_z=e#>r7%6w^Ccd(DliyVvjKBGAxvFD?=rV^C^x2x%Ex;6ux<2h_yN<|g zHhs*-I_C~i8FEeMvs-^n?x?Mu=qb5z{K<~w9-!T zjAz@`FQsercf-!;R&Hf@Qk;Lq3v>-?K6{*{;5_vdc8D;2=+n$k z>*7b=^F$`@9Z)_Sd8^mi50UwBbUc*y>+RLbUXyon5|qR!dY~@8I68uD+aQRD0JfEW zoc+8B%4o#ebWQ5_(vw}N6GbQN|u-u8v}*K(Hkvz{jo0FJqAj99k-cQ0>W?t#CJ3J z)T!%%qE%<8%#;Pd)~|#r?kZw?ST}hSkJFN554M+CBV5O}ad+hGjl~VgFjGK_YwN?b zq5U-wp={8KcmuUSZfnxz+$2g2FM!V`1x+)Y4Rwde%Y@r3s|bhoS2}R080l{MSfqs) zd?i?2YQaq|7}n97bn3|i87{ak#W$NvS@SPz}C?`uT6```Mz`A^+f0$?cGU*Q;??Iha@MIZhP--*`Bu^;ejMi!iShSHa6P2=eU#> z{F2n;-zBN}+o1{Ld9CBj01x);2{Ji92|0;fBl?JJ!$|uf>eonA6e{!VxO>-43V656 zC*fnktScl2(|ffctILh%U!to$YNCJwBu7*SZ~KR1QTe@dhYrqdHmb=zKn6A^70AGD zD0K#lyk}&iz&uU<;m4B#dYrzq485{1pE-iMo)!;2O^wB~8{;_JFPByd7K<$<5@EF8 zn*96YX%o)EWvBi3)FmwgLVIZ&R?dkLP#B$8Vmg zV&y~6ZKJ0-f?f;cl9| zkZ`Ja#w1yza0VB76YwW!7)mx+yxP+Dk3I0;U?l zV3OoD3IpAaJwHpIs^Xgiol3xwGznkd4Oj7k;e`;6L7(gKjE7dxM@_^8a)k!{|2j&7$6@$ z{W$n0B<*5Os!TNX?qK5-#AbCWl!CyB@?Fhl(RmNfa0yjuWOjMrLJt<~y)cq>eD`zj zm$zbqC5L^f-PDFE9}DHCqvj1~MsUqaX&8d8*}*j)v#!d`Y(Z$;@n^#C#P}tT{DnU$ z^U#)5Ih<{D^z@|)yoh{|zp%|l-qKF2%=#`M0nbZ0c5}Gdn0MCW7-^34^PU!Vdk^k5c{5hMz;2*t zATYeu+^of<9j88Hmy^W9PfjcKKs@K)7xf5~;f`@&wQ@!JRJI(fi~}ViI{2 z6nZy&{*qP(ejH)(2T~Vs%S6@~8V!Kx+Hb@Ey2ip<(OfMmcqA-;+J*_k{OSc{9`U$~ z%|BK)wf1N}x8|%W#aYMblB@Op?kUNT+w5KaDw%~WUGN+78h5^f(V?4sYgq&t9z_LG zsV*yJ=9IWDC4G@7*L9UNp0%fdeNu}cc9;~!l?$E}qG|ej*P4pK|lJWN#bU z6@Y?;Crrf0%?`+CJN>z|-fR?vG+IR_zWt%j?^r8>8v#Wj5>D*w!mD|_&;S~>WGV_P zmP991$VmlRY{39?VtrIMesXqmRX!wx-#&wm*u)@IY^WSk=GsC^#V zo54XQ=Nzr&yQ&_zlAY`uGuh@>lI>Y_S*D`u1aJi&YyvdU%zdC(0R*;+G-6s?GJj#$pfiu?S3i%3Sn_m5?#gtZ2 zwTY72y&`W(R_AXKWL_-Xb#r~ssYuuFn)L+jJgyF@PTD{XoVOpGcI=-WB6r?g{QmTE z68viThgzll7ZYE@B|SUU8#*dMwrVobR6gh3xHT6px!G^orVQ{a%Pj$$pg2H}vB4u_denW=1}ZCa<@)jZZG_n>Q_ zJc9xFIb$^M!<(F+Kk*_ck^@LgUx++akSvdUOi4K^1o$`MvtlKWb8XH|^lNwSh0?kh zt+XwHzcjS&lSC`c)%4@mZ0!;cy=?q)m4kJ?d&Jt&C>jk;#zJ~8y$(HUniFL4^^K!ueQ-Sn?j2Hfl7aM zk^-$h07aOPikWpyT#jaSO!*f}cDT;O`vJ-2oEH7K>%8}Fkggj<4!7F-GlzVH^|324 z*>h}5$x)f};5S&%;l)Tyh>#h>3a+a3H=G);yRDh8WGV&w;A7bYa#P&QSs84!jh#m4 zjJkb&(?`9_G`@Y|9@}T#eVWIOC0EhSjYC57S{f$}5)qQgFS(t*Mhf^;#Mz$3<7PY& zXMb0v;BfM3B_Prn|DT)`-xmZ&)M+?U~R7Bt-lM#h7v%1}^^1i6`g<*m#Hxs3vl7#(p(*(3{E?8ah3a=u-~~*3+El z)tY_gaxlU2EcJBsQO)66T;f!AUNE@uVu(*fOmGMSH#5f=F%Q<8brsSIA%MyZA5v3? zXDeX_K2j9o6T{TEPfhM9d+a4-AMc;6p|S<_wY$T0%x*DWBwyn#Dp>MnkO(x0F|H}C z9aOthccsC%xkWnbw`u2l2vyiJMa03Vy!pave2~dj7|gNOM)T6mppd;jJIp_z_?3EaT@2~3J4_&ZF&#Y~B!sM8Fo z!!M{PzwTD`iTKYD)k%wp&~prQbJ5yM*2 z$>$_^w7|Ay;<)JMgFt zXtp*Y#e1^5;to`PhAeP4G>_M!U#LzBLDc=3P231^y3WOo@II@<$!VxA@zzzL#p#gb z-K4W;v#o>ANvDu$nmfm^>DmYga#t`{ivr{qS}gIT ziIUH~vx7Dt*Efi#X`i<2BQ+sRr|=kyNvL{IRO=SxipRjWgL?daV84U2_F#hiY{+Kd zNKn3JvBPS-u(*Gm{OQMS;Ts(&=4^uJmDZCPE%b|%i>WfSxGH%eaobi#n^LtFnW--X zkt67*FH_})gKd(5y3?1#e#Ht^;Sr)S&P8$$v8yz~j=h5jC4JoUEKWQF&k3Mku#Xm{ z>Agyhz2{8(#)G#PGDAnIHW+k~)W?A?1papY4IXMI`ggJ0BgCxeJ)%5|J@UgwO4gGHBO2Gj!P##(+9Q1x8*cv7_KC9-JB{pD%0X5};4z z4{T#yDa=I*83;=ZfVjQMfdSDGuX(>gsqk+Px9J-NTll)#-@!3GAC zG&Kp$EH7M?+s^WjKiDH$=tiHyJbN6rZx7XU@q}{d^^e);yu>TS^Kae>{y1mT8uESU z&8f#0nfH*(bYlMRr-&2@?ni)pOAhgc9b&xQhr+E1ZkQ%5l$}LjD(GO~3-fUFW|84zaP~ zTW52oaeLt>ea9PZisURb)01wL)2tl&92&iTOOQhRYtYjlvLhH(EFFok_f;$WnPt{_ zwmI0mB*i)(47RH7$5a*V)@4BwTLMtWiOkLd#Pvm(XlVaR)QlAs^q;y35_1WLs@csy zl=?)i^sta}O?vP}oR_-o;_j4fRuRYG2R)=gnZ{MfXzmxX0zDS_B-s4M-8?cmNxg@W zPzxiSjNuHEI84|O{Gh<3#z`ekpsO1xIb#!l{ACWO=HgC!I0`I3-5g*IvQ*pK6av}{ zk4#?r$WYL#qsIruXNUvHSrQ5&K72VqwzN`~PA)E@!F-5z9R9C;w$gLd(##GBPd-kn zA`3qo3y=WNd=s`{FjNNO)tF9w(d0WUA0xOuO{1>nc8p=TP*bY;A=6okg;k{ z4{GQP{u_2rot1Mg^ni6ysC=@Bk7Zqb!K^{!dx66ALn015%D0$sdp(FO*^&HOO80K^ zUbp=Wyo;M|Cq_$(nL?~gsGK^#SYqJA^!E;}|Nc#9il_~+Y9$Q5JHI*CyW^td|MWWt z#~KKgjSYkTR)xMwrXxSP`bVtK;E1Z3+Fl0s`qmW9_l#+Ic;oGMx4MWnl^+ZRZRj0m z02xz16b3(_h?xJbs)&kme;CdrqiWAHcTS+Ys-yYUSG&*1`uVlPac;Rm%>7$MmGU)O zJ>ZBspv6HL{eq;nI*HblOaqf{%RnSSCPaIu^drmT8LzXi3*gJw31^*-t>L#Q`n$HzEE+NAq1 zodlLL`jr5Hi4>~)NfC)|PRP61^f~xn$oC}Oz~|=ze7hIJ8F@g?>FbW-;b_esmYB#y z)~14Tw*Z;Pc_HG}@VO+p{r^w9{`42vBiR6Cz7VY8S-BzU&nqGO?^+G-$TUmpB z2BL&Zt20C~_j-JFwmRZjV#WhJhs`u4rXmpq=J+hjZ{*}sZjS~lqV@eJ7PzM2$ldaU#e z?6}A06zNhv8#S5BR*SS>FB^Ik2E1=2gJ9JGp2S)aOCr=;i&d_?t;XplI& zlF|P}&7z`y;zcOZn1c!}|9s>pj25MDYX^fzL7QdzCmltpEb`SJ$IF0%qbgdsuwaGlIWF1SUzrnh~GNp7c zfyp=XO0nyWRc4nU&{C&p>s5>}BhaF|^NoNm0QCSc1#ACXUrDpxkFO%H`w;n|m%T8m z1A4@*lOy>6fH_ysWMXts4Fcp?O^6 zO3puYDqgJErQPbvKkQM{*Emv7HV0A}HbZNTf7}5^a4r1atR?@y*ADzS+yC{UNka_K z=E9{X2lxKCMVUPCvo)zHaMa2FEs8(BlZy>3{RqPGKhDp&u*Ug*;S>LE%&crVjm_c{ z?>|rFpL6;@AAtL`yZrmHoakn~SJK>Mg>SW6C4YS|_hP+)GptP0n63Ueb7KM*`_b73 zrFNs`qK5qgL5#n}%>UkE{%St_&#u?`nSG*L)E`f;R502ONql17oKx9oxD)%gDy_d1 zl>hnT0x;p?MQQ8K>)ODQ0Hps~)UQbIj;IOAuaBjG7&tkJ^|m(7zl7N|_R?r)$)e0` zd#Dh8iuA#UdGd6JP$8e z4}QvUF!6^#z{IAq@vQ{bgzr*gO~gb&d**q*q-54zI!6+BkXCG z*4Kb2V7=UNcJKet|8enCLs~<>``D%R3o z{O3hKsBVZA^|^yT1^x7H|M}JHC;D@f6R%hfQ%=3dcCZo_|HfC zm%E52<6?sIe?H{D z-iG=CAW&nDk>$Vs;V0t(re(kfH9&70(f9rRuL+cplz0VJLIHF5=PCWq2fYyi=Ihwg z+)VD*1R9Ei4RW5qgY*99P5w!D06twBFkj~lTwD+SLB0O_HtDT^Ecv&BJ*a+dzNQpK zWAl-7AMTL;^AP?+%mc=NEUAyhg$RFbsQ* zp{{1%{#ywDG!ahk0a=DND8)Sgr*HhntBU%Go&!@=IWNHV>epn+F9*o7)!=If{jW{c zZ?*qto%^l!|EzQV|F5h4lyE0JROEvG?QPDC$O`}rhzGiB?j23fUqWOX&VfEiTth%N z&{Rw!nwixhG$O&+2a2C&vesTN;6_pMunV32_+l|z>x||aZ}#F>7IHd;zc5D41No2d z2zeL$zV+Kpl+XjHAd9~HYNEx--r~lOFEI*sp3~EJ$H$8e)7XK-v5sPVFTN;mZZ?xD z3dTWZKs_`fT%N~U6-LbgH1M^SJLV~IW_>A>dU?^n`A3r#n?-fUUx_kXaF|kJU8XE@ z##4si^=ewu$Svk>E`C=uPzZzn}t=`iL9F3hL%*mi+G080$U}| zmoF*_H43!i0FG#0Qk8s~un@KDjDy8WXPm{4fzKNs%s7R-y|?)Op3|Z;mVVT3WU){l2V?`8G-D2s7uc#5SSR4&UDx-{4uY${OlT1a%&TUfH zZI#KMjYBU-PjrILfs+1sAmAVUTFGC1*e5VNlB=q#Z#gnnq@N6#^Vo!4n2Vfi^PjFH zP>xgmmzDmfo#M^EX1%C-DWc-)@|;JbEuwIn#^+?w(lir$!RzXLUeV6?e427R%>$O} z1k72(8jGxVbH3*J)H^y&gm9^jR)NN|fk3_15CYk%8IbIhS+dPgx>#Ud2lo1H4(J8Q zV=v4SGmxSbLd-b*_#CRingtLU*VBB3+b#8UtxF|6dUWShf~Q~{ zZO8A@&PH+)n;Fo&H{uzjHEK>4%q|a zWxHPM0?Yy8rIxDsiJuw|5{onW9M{yacilP!JlfsH>*f+4D5PlFSh-yx5joSgb=%H% zttVy}HA|BwI|4h^uWAuTiqXVw<%`X!kZ3>P7Z@t#NH+M6&0x z?=~Rjm^C!>JAhUV2EltUHr8dY{iSyJDvS$a6xB4U=zBKo1k25Fskz0(3FfaKr2^E* zu%P?a@|0DvdvbEE+eXv(tWGgI@TMEQfqf3g{)+eLX<0RDX#vMlhZLgxm`i zk&~ive+}2I14=9^&$Pj`K5zhN3f_o)PME9VN-5&wh3L`m19KP}*u1^dj*UOISi#Q2 z_e*ZW<0g!`BRb83?uvPz^Jni3y!PA4rnlQQ{FCh(-PPx-9bWMR-H3~jhE&&}?tlNg@zG5jYG`2QB8LMinRF16aPZdBA5Z#8m#hgAQq8A zD7A}LCByWvqR6aQZpZ$1)%+(HK$r7qSmW9wUSs};4*sLN=I=uKql!)wJ?YxwFQ2~J ztoJyt_rR+^%U-jgxHitwLdO%|ZuyYB<3}D14}br_l|OChv5|EIydkvbmLGigsqfh0 zm&tPT9H8v%si8;jawJD1uY59hq0W64jYybHTT(#UNgGq1u7TTPu+znUM^3VBZ7zQd z(8pGgT=(X;FdL><)9pMU)1pg4(01K!?Emjln$J;>+AXJ(7bw&7BAY zA84i1>3GsS$FYx($)>!QTRqka*qGqsLzyxOL&ZMue3)Q>-L>&Bt#sNL`X*GoZqyZj z-(qW`bX3!%uG6Ehc%5fP_E+|>h2C3$V8*irr4e-FKhXJk$OcrRUktSBe`RZGy zWaOlC;Gyw;mM4pULDTMVHb3Kc&3%s$SDeUf%{!2}5Zl{y`} z&liLC{GPY73Pm+*A6f2EtTL-+XPWjTIoGu^|I#e`a|{%V6=5$s(FS4?SibuRNYtkm zKBk**Rhqa|1x0Ru^X|pcwW(A;12k1V@!D)Z^|?4%>k*2UMXyodT?}#>(>7OcV0@!N zi+KM%KNySF>#+?Kc|4jFd2O5WbUFl2n+^Ko$ar9$m zHP3*dbCil^3P>OiAFTG2JJz1T@+ox{qVGOqK^~@EeV>~K<9XwNDq)oQ#z23c$Gxcn zJT?<0pF7x`V_6~Zfu5eK`J0-04w68J&cLA*KF1+R3jL8~fkIr8ACc)3Kux=Tp)~}k zPvf?Y^fP?lepNVAz1M4Yry$?H2`VF@2?~%Di~g!jjQU}J!7bT=CIU8CiIHD zWM?^b*UP*XppC0GcuY29(WYGcSUXkE`b5qKW3sVhk=u5@vYy+OnqPK)Wm)-&3gFaR zh!r_3f6Ho*q|np=8+cgouf9_~YcG_DwfYuy$KvwhbkvK-*{U6zZM&qE5P1+)=#vQy zUW;HeoaxgWc=@DGKAq!flas5HJ(~u0)GyT)~Ma~YYgqCODcpCTL9wnq* ztoTysQneo^lZbQu61Gs0-;{i7Wy-p|H&6W?Cc#}bo6sttisy9|brjpbb}pw@0-j9Z zV3{LJeTGi*e92irg+>KUvP!f}EdfI$v_`&Ifz8k!re5?w?)|{>r%RR!+1Snf4q8Q$ zdRXsv^>VcAdWxfhq~lg;N48Z_P4@laow{8EjFuPCRNBb7YacdR0bHLimKfFBQa@$*YYSI=)mc|KqJ&=mk zB;D-!i#49Nds+o5qu#6?*aHpcv%3nz+48c$*`>LSo)gBQ>bq>8xT17z+_h#;U}=R_ zbG16!ThRhL(j+aqfSb<0Sx}w_bmBldaYt$TUR`?@fM1!f@JgT;yQ&>w(pD}9IQ*%; zm#3rU^%n;{qqibCi#3+BlWkwpo-|?A>hUl5p$&N>X2-MEehC+B5~aBI>s#b|>GRws z0M&&|+p0@Hgmi8SGb}irZRGHD0|Y(SyU#4umIWK3z#dQmEGiyLxER6)pK*_r)!7CX zHqieiMp$Q-=JRLh#VQALi(c{*2D)3H%hpJYv)#r#+GZHh$^G*@B-mQ4ua_T8B~1hY zbRu=yt{k@=+HFe;FLgE%+NoLpQ~_AeksKjmMkNYX{mQ$vmwTbZ#lFZ*4RD^0;O39P zFP;RBLVHbU%q_0Hi~)`$71KcRNWQ(6H``@e+ZA}`4fzUS$~9`Y%6dSC%1plkuRNy1 zI3rt$AkSv-8Wz0vl31{x0<-lLh~n6rQ?#_N*Y#WS6xeS2ao}~hqZ^WEQkjoUBpJ2| zxTLDcL>N~i#WaO&ci0@sicX!2jk9Ng9Qo%WEn`d77X?o6$$lS5N8x@-PO6Izcu&K7 z_}cl47Ch*zupG^+9pOmZ_1^W&C$C<*V_}1o23jX^)3>=)}Cx`6eQS zi1rhMR>iE#bQTbqW^0}1Rk7io=iAjG6@oSxGM&5bgEJ}Z>N&kHmT8MM@FPWMfwM7_ zb^z}lpbjH#6KGjAG$L&nG>Z*Vfhe}LYu=IZ*S3^+SQ9{PI^{k@0&bQSy-%Wtv#rv!d)7XK-YKUc?ZvHTXx?>+R-vzEQE2+!h$p24m#c#3v7R&GS+20MwZ`b0d>*BXqev9R|$MxIe`n$pW$!~t6 z7XJ^R78kTAC@5D~lB-8OC@4JG*EG)UDKP?+$M|TaiQ=b@vzc+#F|u^=$>wIRyAD6K zem|M|Sez(&O*4*PE6BWoYSfmi|7zoJP5$5Y_S;zXocd zAbO#WUjha&GYQ!aIBxYOdve8lefW+GT>Mu5Hyv<+iz<;;#04&Jk#m>^bx}8PfeTzr zN~nt}k^SHT7r4kdOoO_p8@Rv)E+!?^MU}{YaDfY4 Date: Tue, 9 Aug 2022 03:25:56 -0400 Subject: [PATCH 12/20] migrate package table and modules to api doc --- docs/reference/js/api.md | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index fe13b7365..30428a713 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -8,6 +8,29 @@ description: Developer resources for working in JavaScript with IPFS, the InterP ## JavaScript libraries There are two main JavaScript libraries for working with IPFS. Both work in Node.js and modern web browsers. +The implementation is split into several modules. + +::: details Node modules + +* [`/packages/interface-ipfs-core`](./packages/interface-ipfs-core) Tests to ensure adherence of an implementation to the spec +* [`/packages/ipfs`](./packages/ipfs) An aggregator module that bundles the core implementation, the CLI, HTTP API server and daemon +* [`/packages/ipfs-cli`](./packages/ipfs-cli) A CLI to the core implementation +* [`/packages/ipfs-core`](./packages/ipfs-core) The core implementation +* [`/packages/ipfs-core-types`](./packages/ipfs-core-types) Typescript definitions for the core API +* [`/packages/ipfs-core-utils`](./packages/ipfs-core-utils) Helpers and utilities common to core and the HTTP RPC API client +* [`/packages/ipfs-daemon`](./packages/ipfs-daemon) Run js-IPFS as a background daemon +* [`/packages/ipfs-grpc-client`](./packages/ipfs-grpc-client) A gRPC client for js-IPFS +* [`/packages/ipfs-grpc-protocol`](./packages/ipfs-grpc-protocol) Shared module between the gRPC client and server +* [`/packages/ipfs-grpc-server`](./packages/ipfs-grpc-server) A gRPC-over-websockets server for js-IPFS +* [`/packages/ipfs-http-client`](./packages/ipfs-http-client) A client for the RPC-over-HTTP API presented by both js-ipfs and go-ipfs +* [`/packages/ipfs-http-server`](./packages/ipfs-http-server) JS implementation of the [Kubo RPC HTTP API](https://docs.ipfs.io/reference/kubo/rpc/) +* [`/packages/ipfs-http-gateway`](./packages/ipfs-http-gateway) JS implementation of the [IPFS HTTP Gateway](https://docs.ipfs.io/concepts/ipfs-gateway/) +* [`/packages/ipfs-http-response`](./packages/ipfs-http-response) Creates a HTTP response for a given IPFS Path +* [`/packages/ipfs-message-port-client`](./packages/ipfs-message-port-client) A client for the RPC-over-message-port API presented by js-ipfs running in a shared worker +* [`/packages/ipfs-message-port-protocol`](./packages/ipfs-message-port-protocol) Code shared by the message port client & server +* [`/packages/ipfs-message-port-server`](./packages/ipfs-message-port-server) The server that receives requests from ipfs-message-port-client + +::: ### JS-IPFS @@ -49,6 +72,54 @@ The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has ::: +## Packages + +> This table is generated using the module [`package-table`](https://www.npmjs.com/package/package-table) with `package-table --data=package-list.json`. + +Listing of the main JS packages in the IPFS ecosystem: + +| Package | Version | Deps | CI/Travis | Coverage | Lead Maintainer | +| ---------|---------|---------|---------|---------|--------- | +| **Files** | +| [`ipfs-unixfs`](//github.com/ipfs/js-ipfs-unixfs) | [![npm](https://img.shields.io/npm/v/ipfs-unixfs.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs-unixfs/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs-unixfs.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-unixfs) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-unixfs/master)](https://travis-ci.com/ipfs/js-ipfs-unixfs) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs-unixfs/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs-unixfs) | [Alex Potsides](mailto:alex.potsides@protocol.ai) | +| **Repo** | +| [`ipfs-repo`](//github.com/ipfs/js-ipfs-repo) | [![npm](https://img.shields.io/npm/v/ipfs-repo.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs-repo/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs-repo.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-repo) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-repo/master)](https://travis-ci.com/ipfs/js-ipfs-repo) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs-repo/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs-repo) | [Alex Potsides](mailto:alex@achingbrain.net) | +| [`ipfs-repo-migrations`](//github.com/ipfs/js-ipfs-repo-migrations) | [![npm](https://img.shields.io/npm/v/ipfs-repo-migrations.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs-repo-migrations/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs-repo-migrations.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-repo-migrations) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-repo-migrations/master)](https://travis-ci.com/ipfs/js-ipfs-repo-migrations) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs-repo-migrations/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs-repo-migrations) | N/A | +| **Exchange** | +| [`ipfs-bitswap`](//github.com/ipfs/js-ipfs-bitswap) | [![npm](https://img.shields.io/npm/v/ipfs-bitswap.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs-bitswap/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs-bitswap.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-bitswap) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-bitswap/master)](https://travis-ci.com/ipfs/js-ipfs-bitswap) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs-bitswap/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs-bitswap) | [Dirk McCormick](mailto:dirk@protocol.ai) | +| **IPNS** | +| [`ipns`](//github.com/ipfs/js-ipns) | [![npm](https://img.shields.io/npm/v/ipns.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipns/releases) | [![Deps](https://david-dm.org/ipfs/js-ipns.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipns) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipns/master)](https://travis-ci.com/ipfs/js-ipns) | [![codecov](https://codecov.io/gh/ipfs/js-ipns/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipns) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| **Generics/Utils** | +| [`ipfs-utils`](//github.com/ipfs/js-ipfs) | [![npm](https://img.shields.io/npm/v/ipfs-utils.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs/master)](https://travis-ci.com/ipfs/js-ipfs) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs) | [Hugo Dias](mailto:hugomrdias@gmail.com) | +| [`ipfs-http-client`](//github.com/ipfs/js-ipfs) | [![npm](https://img.shields.io/npm/v/ipfs-http-client.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs/master)](https://travis-ci.com/ipfs/js-ipfs) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs) | [Alex Potsides](mailto:alex@achingbrain.net) | +| [`ipfs-http-response`](//github.com/ipfs/js-ipfs-http-response) | [![npm](https://img.shields.io/npm/v/ipfs-http-response.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfs-http-response/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfs-http-response.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfs-http-response) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfs-http-response/master)](https://travis-ci.com/ipfs/js-ipfs-http-response) | [![codecov](https://codecov.io/gh/ipfs/js-ipfs-http-response/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfs-http-response) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`ipfsd-ctl`](//github.com/ipfs/js-ipfsd-ctl) | [![npm](https://img.shields.io/npm/v/ipfsd-ctl.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/js-ipfsd-ctl/releases) | [![Deps](https://david-dm.org/ipfs/js-ipfsd-ctl.svg?style=flat-square)](https://david-dm.org/ipfs/js-ipfsd-ctl) | [![Travis CI](https://flat.badgen.net/travis/ipfs/js-ipfsd-ctl/master)](https://travis-ci.com/ipfs/js-ipfsd-ctl) | [![codecov](https://codecov.io/gh/ipfs/js-ipfsd-ctl/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/js-ipfsd-ctl) | [Hugo Dias](mailto:mail@hugodias.me) | +| [`is-ipfs`](//github.com/ipfs/is-ipfs) | [![npm](https://img.shields.io/npm/v/is-ipfs.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/is-ipfs/releases) | [![Deps](https://david-dm.org/ipfs/is-ipfs.svg?style=flat-square)](https://david-dm.org/ipfs/is-ipfs) | [![Travis CI](https://flat.badgen.net/travis/ipfs/is-ipfs/master)](https://travis-ci.com/ipfs/is-ipfs) | [![codecov](https://codecov.io/gh/ipfs/is-ipfs/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/is-ipfs) | [Marcin Rataj](mailto:lidel@lidel.org) | +| [`aegir`](//github.com/ipfs/aegir) | [![npm](https://img.shields.io/npm/v/aegir.svg?maxAge=86400&style=flat-square)](//github.com/ipfs/aegir/releases) | [![Deps](https://david-dm.org/ipfs/aegir.svg?style=flat-square)](https://david-dm.org/ipfs/aegir) | [![Travis CI](https://flat.badgen.net/travis/ipfs/aegir/master)](https://travis-ci.com/ipfs/aegir) | [![codecov](https://codecov.io/gh/ipfs/aegir/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipfs/aegir) | [Hugo Dias](mailto:hugomrdias@gmail.com) | +| **libp2p** | +| [`libp2p`](//github.com/libp2p/js-libp2p) | [![npm](https://img.shields.io/npm/v/libp2p.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p/master)](https://travis-ci.com/libp2p/js-libp2p) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`peer-id`](//github.com/libp2p/js-peer-id) | [![npm](https://img.shields.io/npm/v/peer-id.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-peer-id/releases) | [![Deps](https://david-dm.org/libp2p/js-peer-id.svg?style=flat-square)](https://david-dm.org/libp2p/js-peer-id) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-peer-id/master)](https://travis-ci.com/libp2p/js-peer-id) | [![codecov](https://codecov.io/gh/libp2p/js-peer-id/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-peer-id) | [Vasco Santos](mailto:santos.vasco10@gmail.com) | +| [`libp2p-crypto`](//github.com/libp2p/js-libp2p-crypto) | [![npm](https://img.shields.io/npm/v/libp2p-crypto.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-crypto/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-crypto.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-crypto) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-crypto/master)](https://travis-ci.com/libp2p/js-libp2p-crypto) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-crypto/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-crypto) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`libp2p-floodsub`](//github.com/libp2p/js-libp2p-floodsub) | [![npm](https://img.shields.io/npm/v/libp2p-floodsub.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-floodsub/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-floodsub.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-floodsub) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-floodsub/master)](https://travis-ci.com/libp2p/js-libp2p-floodsub) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-floodsub/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-floodsub) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`libp2p-gossipsub`](//github.com/ChainSafe/gossipsub-js) | [![npm](https://img.shields.io/npm/v/libp2p-gossipsub.svg?maxAge=86400&style=flat-square)](//github.com/ChainSafe/gossipsub-js/releases) | [![Deps](https://david-dm.org/ChainSafe/gossipsub-js.svg?style=flat-square)](https://david-dm.org/ChainSafe/gossipsub-js) | [![Travis CI](https://flat.badgen.net/travis/ChainSafe/gossipsub-js/master)](https://travis-ci.com/ChainSafe/gossipsub-js) | [![codecov](https://codecov.io/gh/ChainSafe/gossipsub-js/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ChainSafe/gossipsub-js) | [Cayman Nava](mailto:caymannava@gmail.com) | +| [`libp2p-kad-dht`](//github.com/libp2p/js-libp2p-kad-dht) | [![npm](https://img.shields.io/npm/v/libp2p-kad-dht.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-kad-dht/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-kad-dht.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-kad-dht) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-kad-dht/master)](https://travis-ci.com/libp2p/js-libp2p-kad-dht) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-kad-dht/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-kad-dht) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`libp2p-mdns`](//github.com/libp2p/js-libp2p-mdns) | [![npm](https://img.shields.io/npm/v/libp2p-mdns.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-mdns/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-mdns.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-mdns) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-mdns/master)](https://travis-ci.com/libp2p/js-libp2p-mdns) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-mdns/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-mdns) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`libp2p-bootstrap`](//github.com/libp2p/js-libp2p-bootstrap) | [![npm](https://img.shields.io/npm/v/libp2p-bootstrap.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-bootstrap/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-bootstrap.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-bootstrap) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-bootstrap/master)](https://travis-ci.com/libp2p/js-libp2p-bootstrap) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-bootstrap/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-bootstrap) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`@chainsafe/libp2p-noise`](//github.com/ChainSafe/js-libp2p-noise) | [![npm](https://img.shields.io/npm/v/libp2p-noise.svg?maxAge=86400&style=flat-square)](//github.com/ChainSafe/js-libp2p-noise/releases) | [![Deps](https://david-dm.org/ChainSafe/js-libp2p-noise.svg?style=flat-square)](https://david-dm.org/ChainSafe/js-libp2p-noise) | [![Travis CI](https://flat.badgen.net/travis/ChainSafe/js-libp2p-noise/master)](https://travis-ci.com/ChainSafe/js-libp2p-noise) | [![codecov](https://codecov.io/gh/ChainSafe/js-libp2p-noise/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ChainSafe/js-libp2p-noise) | N/A | +| [`libp2p-tcp`](//github.com/libp2p/js-libp2p-tcp) | [![npm](https://img.shields.io/npm/v/libp2p-tcp.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-tcp/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-tcp.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-tcp) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-tcp/master)](https://travis-ci.com/libp2p/js-libp2p-tcp) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-tcp/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-tcp) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`libp2p-webrtc-star`](//github.com/libp2p/js-libp2p-webrtc-star) | [![npm](https://img.shields.io/npm/v/libp2p-webrtc-star.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-webrtc-star/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-webrtc-star.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-webrtc-star) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-webrtc-star/master)](https://travis-ci.com/libp2p/js-libp2p-webrtc-star) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`libp2p-websockets`](//github.com/libp2p/js-libp2p-websockets) | [![npm](https://img.shields.io/npm/v/libp2p-websockets.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-websockets/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-websockets.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-websockets) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-websockets/master)](https://travis-ci.com/libp2p/js-libp2p-websockets) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-websockets/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-websockets) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`libp2p-mplex`](//github.com/libp2p/js-libp2p-mplex) | [![npm](https://img.shields.io/npm/v/libp2p-mplex.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-mplex/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-mplex.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-mplex) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-mplex/master)](https://travis-ci.com/libp2p/js-libp2p-mplex) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-mplex/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-mplex) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`libp2p-delegated-content-routing`](//github.com/libp2p/js-libp2p-delegated-content-routing) | [![npm](https://img.shields.io/npm/v/libp2p-delegated-content-routing.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-delegated-content-routing/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-delegated-content-routing.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-delegated-content-routing) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-delegated-content-routing/master)](https://travis-ci.com/libp2p/js-libp2p-delegated-content-routing) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-delegated-content-routing/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-delegated-content-routing) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| [`libp2p-delegated-peer-routing`](//github.com/libp2p/js-libp2p-delegated-peer-routing) | [![npm](https://img.shields.io/npm/v/libp2p-delegated-peer-routing.svg?maxAge=86400&style=flat-square)](//github.com/libp2p/js-libp2p-delegated-peer-routing/releases) | [![Deps](https://david-dm.org/libp2p/js-libp2p-delegated-peer-routing.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-delegated-peer-routing) | [![Travis CI](https://flat.badgen.net/travis/libp2p/js-libp2p-delegated-peer-routing/master)](https://travis-ci.com/libp2p/js-libp2p-delegated-peer-routing) | [![codecov](https://codecov.io/gh/libp2p/js-libp2p-delegated-peer-routing/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-delegated-peer-routing) | [Jacob Heun](mailto:jacobheun@gmail.com) | +| **IPLD** | +| [`@ipld/dag-pb`](//github.com/ipld/js-dag-pb) | [![npm](https://img.shields.io/npm/v/@ipld/dag-pb.svg?maxAge=86400&style=flat-square)](//github.com/ipld/js-dag-pb/releases) | [![Deps](https://david-dm.org/ipld/js-dag-pb.svg?style=flat-square)](https://david-dm.org/ipld/js-dag-pb) | [![Travis CI](https://flat.badgen.net/travis/ipld/js-dag-pb/master)](https://travis-ci.com/ipld/js-dag-pb) | [![codecov](https://codecov.io/gh/ipld/js-dag-pb/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipld/js-dag-pb) | N/A | +| [`@ipld/dag-cbor`](//github.com/ipld/js-dag-cbor) | [![npm](https://img.shields.io/npm/v/@ipld/dag-cbor.svg?maxAge=86400&style=flat-square)](//github.com/ipld/js-dag-cbor/releases) | [![Deps](https://david-dm.org/ipld/js-dag-cbor.svg?style=flat-square)](https://david-dm.org/ipld/js-dag-cbor) | [![Travis CI](https://flat.badgen.net/travis/ipld/js-dag-cbor/master)](https://travis-ci.com/ipld/js-dag-cbor) | [![codecov](https://codecov.io/gh/ipld/js-dag-cbor/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/ipld/js-dag-cbor) | N/A | +| **Multiformats** | +| [`multiformats`](//github.com/multiformats/js-multiformats) | [![npm](https://img.shields.io/npm/v/multiformats.svg?maxAge=86400&style=flat-square)](//github.com/multiformats/js-multiformats/releases) | [![Deps](https://david-dm.org/multiformats/js-multiformats.svg?style=flat-square)](https://david-dm.org/multiformats/js-multiformats) | [![Travis CI](https://flat.badgen.net/travis/multiformats/js-multiformats/master)](https://travis-ci.com/multiformats/js-multiformats) | [![codecov](https://codecov.io/gh/multiformats/js-multiformats/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/multiformats/js-multiformats) | N/A | +| [`mafmt`](//github.com/multiformats/js-mafmt) | [![npm](https://img.shields.io/npm/v/mafmt.svg?maxAge=86400&style=flat-square)](//github.com/multiformats/js-mafmt/releases) | [![Deps](https://david-dm.org/multiformats/js-mafmt.svg?style=flat-square)](https://david-dm.org/multiformats/js-mafmt) | [![Travis CI](https://flat.badgen.net/travis/multiformats/js-mafmt/master)](https://travis-ci.com/multiformats/js-mafmt) | [![codecov](https://codecov.io/gh/multiformats/js-mafmt/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/multiformats/js-mafmt) | [Vasco Santos](mailto:vasco.santos@moxy.studio) | +| [`multiaddr`](//github.com/multiformats/js-multiaddr) | [![npm](https://img.shields.io/npm/v/multiaddr.svg?maxAge=86400&style=flat-square)](//github.com/multiformats/js-multiaddr/releases) | [![Deps](https://david-dm.org/multiformats/js-multiaddr.svg?style=flat-square)](https://david-dm.org/multiformats/js-multiaddr) | [![Travis CI](https://flat.badgen.net/travis/multiformats/js-multiaddr/master)](https://travis-ci.com/multiformats/js-multiaddr) | [![codecov](https://codecov.io/gh/multiformats/js-multiaddr/branch/master/graph/badge.svg?style=flat-square)](https://codecov.io/gh/multiformats/js-multiaddr) | [Jacob Heun](mailto:jacobheun@gmail.com) | + ## Hands-on examples ::: callout From fbb8e456e96c7c02ec1751fb5ad665798fac2326 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Tue, 9 Aug 2022 04:04:28 -0400 Subject: [PATCH 13/20] tweaks to content --- docs/basics/js/js-ipfs.md | 54 ++++++++++--------------------- docs/images/jsipfs-add-webui.png | Bin 0 -> 135850 bytes 2 files changed, 17 insertions(+), 37 deletions(-) create mode 100644 docs/images/jsipfs-add-webui.png diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index bbac245f0..bc66f5a4f 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -54,38 +54,6 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf ::: -::: tab ipfs-http-client - -### HTTP client module - -To use the client on your machine, install the `ipfs-http-client` Node.js package: - - ```bash - npm i ipfs-http-client - ``` - -### Build from source - -To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. - -::: - -::: tab ipfs-client - -### HTTP client module - -To use the client on your machine, install the `ipfs-client` Node.js package: - - ```bash - npm i ipfs-client - ``` - -### Build from source - -To build from source, clone the [source package](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) and follow the build instructions. - -::: - :::: ## Spawn a node @@ -264,7 +232,7 @@ file are likely to change. Please reference the ::: tab ipfs-cli -Navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. +In a new session, navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. @@ -282,6 +250,12 @@ The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. +To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) and provide the CID on the search bar. The UI will provide the file contents, similar to the following: + + + +::: + ::: tab ipfs-core To add a file using `ipfs-core`, you can create a test `.txt` file in @@ -318,7 +292,7 @@ The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. -If you take the CID and load it on the gateway, you will see the content: +If you take the CID and load it on the HTTP gateway, you will see the content: > e.g. https://ipfs.io/ipfs/QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk @@ -413,7 +387,13 @@ By default, objects that you retrieve over IPFS are not pinned to your node. If ## Remove a file -Simply removing the content pin will remove a file from IPFS. In this section, we will remove the pinned `test.txt` file we pinned earlier. +::: warning Removing a file from IPFS does not guarantee that is was completely removed from network. + +There is no way to know if someone else has made a copy of the content from when it became available on the network. This is a caveat is also found in regular HTTP networks, as nothing stops users from addressing content and creating a copy once it is pushed to IPFS. + +::: + +Removing the content pin will remove a file from IPFS. In this section, we will remove the pinned `test.txt` file we pinned earlier. :::: tabs @@ -468,9 +448,9 @@ This will output something like: The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. -::: +::: tip -::: tab ipfs-core +Run `jsipfs pin ls` again to confirm that the CID you intended to remove is no longer pinned. ::: diff --git a/docs/images/jsipfs-add-webui.png b/docs/images/jsipfs-add-webui.png new file mode 100644 index 0000000000000000000000000000000000000000..473ace6c71bef4c1c4fb597554728bd72bda6e13 GIT binary patch literal 135850 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 literal 0 HcmV?d00001 From fa4e7bd5ab0b7864e8a8d7913fca5eb3031761aa Mon Sep 17 00:00:00 2001 From: johnnymatthews <9611008+johnnymatthews@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:23:48 -0400 Subject: [PATCH 14/20] Fixes tab switching issue. --- docs/.vuepress/config.js | 4 +- docs/.vuepress/theme/styles/index.styl | 9 +++++ docs/basics/js/js-ipfs.md | 53 ++++++++++---------------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index abf679c30..03b4ec425 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -24,8 +24,8 @@ module.exports = { md.use(require('markdown-it-footnote')) md.use(require('markdown-it-task-lists')) md.use(require('markdown-it-deflist')), - md.use(require('markdown-it-imsize')), - md.use(require('markdown-it-image-lazy-loading')) + md.use(require('markdown-it-imsize')), + md.use(require('markdown-it-image-lazy-loading')) } }, themeConfig: { diff --git a/docs/.vuepress/theme/styles/index.styl b/docs/.vuepress/theme/styles/index.styl index 24225f244..08c64665d 100644 --- a/docs/.vuepress/theme/styles/index.styl +++ b/docs/.vuepress/theme/styles/index.styl @@ -76,3 +76,12 @@ code { --code-bg-color: $codeBgColor; --highlight-color: $highlightColor; } + +section.tabs-component-panel::before { + content: ''; + display: block; + position: relative; + width: 0; + height: 10em; + margin-top: -10em; +} diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index bc66f5a4f..179b948f0 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -1,14 +1,11 @@ --- title: IPFS in JavaScript -description: "A simple walkthrough of how to perform basic IPFS operations using the JS implementation." +description: "A simple walkthrough of how to perform basic IPFS operations using the JavaScript implementation." --- -# JS-IPFS Basics +# IPFS in JavaScript -This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). - -You will learn how install and spawn a node using the available libraries, as well as add, retrieve, -read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). +This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). You will learn how install and spawn a node using the available libraries, as well as add, retrieve, read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). ::: tip Environment @@ -16,13 +13,11 @@ All instructions and examples shown here were performed and tested on an M1 Mac. ::: -There are two main JavaScript libraries for working with IPFS, learn about each library in the [reference section](../reference/js/api). - ## Install JS-IPFS :::: tabs -::: tab ipfs-cli +::: tab ipfs-cli id="install-ipfs-cli" ### JS-IPFS module @@ -38,7 +33,7 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf ::: -::: tab ipfs-core +::: tab ipfs-core id="install-ipfs-core" ### IPFS core API @@ -60,7 +55,7 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf :::: tabs -::: tab ipfs-cli +::: tab ipfs-cli id="spawn-ipfs-cli" To spawn a node using the CLI, simply start the daemon: @@ -99,7 +94,7 @@ jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST ::: -::: tab ipfs-core +::: tab ipfs-core id="spawn-ipfs-core" Create a simple Node.js application to host the logic that will allow you to use the RPC API. You'll also use this Node.js application later on to add and remove files. @@ -143,7 +138,7 @@ To create an IPFS node, add: main(); ``` -This imports IPFS as a dependency and uses the `create()` function to create a node instance. +This imports IPFS as a dependency and uses the `create()` function to create a node instance. To spawn the node, run the application: @@ -169,7 +164,7 @@ The JS-IPFS implementation is split into several Node.js modules. The following :::: tabs -::: tab ipfs-http-client +::: tab ipfs-http-client id="connect-ipfs-http-client" If you have not already installed the client library, add the `ipfs-http-client` module to your project: @@ -185,13 +180,13 @@ Populate your `index.js` file with the following to create an instance of the HT const client = create() // the default API address http://localhost:5001 ``` -This imports the client library and uses the `create()` function to connect to an IPFS API server. +This imports the client library and uses the `create()` function to connect to an IPFS API server. To connect to the API, run the application: ::: -::: tab ipfs-client +::: tab ipfs-client id="connect-ipfs-client" If you have not already installed the client library, add the `ipfs-http-client` module to your project: @@ -222,15 +217,13 @@ Now you can start to add files using JS-IPFS to the IPFS network. ::: warning Section changes coming soon -As the JS-IPFS implementation goes through changes, the steps to add a -file are likely to change. Please reference the -[source packages](https://github.com/ipfs/js-ipfs) for the latest updates. +As the JS-IPFS implementation goes through changes, the steps to add a file are likely to change. Please reference the [source packages](https://github.com/ipfs/js-ipfs) for the latest updates. ::: :::: tabs -::: tab ipfs-cli +::: tab ipfs-cli id="add-ipfs-cli" In a new session, navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. @@ -256,14 +249,11 @@ To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) ::: -::: tab ipfs-core +::: tab ipfs-core id="add-ipfs-core" -To add a file using `ipfs-core`, you can create a test `.txt` file in -your project directory or point to a local file on your machine that you would -like to upload to IPFS. +To add a file using `ipfs-core`, you can create a test `.txt` file in your project directory or point to a local file on your machine that you would like to upload to IPFS. -Then, using `node.add`, add an `await` operator that includes a `path` -and `content` field and an output message in the project's `index.js` file: +Then, using `node.add`, add an `await` operator that includes a `path` and `content` field and an output message in the project's `index.js` file: ```js{6-9,11} import * as IPFS from 'ipfs-core'; @@ -288,11 +278,10 @@ You should obtain an output similar to: Added file: test.txt CID(QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk) ``` -The file has been added to the IPFS network and has given the file a CID. -You can share this CID with anyone, and they can use it on their IPFS node to obtain -the content you uploaded. +The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. If you take the CID and load it on the HTTP gateway, you will see the content: + > e.g. https://ipfs.io/ipfs/QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk @@ -305,7 +294,7 @@ If you take the CID and load it on the HTTP gateway, you will see the content: ::::tabs -::: tab ipfs-cli +::: tab ipfs-cli id="retrieve-ipfs-cli" Navigate to the directory where you wish to save the folder. IPFS will save the folder to whichever directory you are in. Here, we're going to save the file in the ~/Desktop directory: @@ -329,7 +318,7 @@ You will notice a new file in your project directory that is labelled as the CID ::: -::: tab ipfs-core +::: tab ipfs-core id="retrieve-ipfs-core" Continuing with the same Node.js application, retrieving a file from IPFS can be done by using a `cat` call. We will use the CID from the previous section when we added the `test.txt` file by passing `fileAdded.cid` as an argument to `node.cat`: @@ -397,7 +386,7 @@ Removing the content pin will remove a file from IPFS. In this section, we will :::: tabs -::: tab ipfs-cli +::: tab ipfs-cli id="remove-ipfs-cli" If you would like to remove a different piece of content, you can run `jsipfs pin ls` to view a list of pinned content on the local IPFS node: From fb10e02f0944380a3e0b45fb95594c00e4d1fc20 Mon Sep 17 00:00:00 2001 From: johnnymatthews <9611008+johnnymatthews@users.noreply.github.com> Date: Thu, 11 Aug 2022 16:24:04 -0400 Subject: [PATCH 15/20] Cleans up formatting. Minor grammar changes. --- docs/basics/js/js-ipfs.md | 415 ++++++++++++++++++-------------------- 1 file changed, 201 insertions(+), 214 deletions(-) diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index 179b948f0..ad273bd1f 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -5,7 +5,7 @@ description: "A simple walkthrough of how to perform basic IPFS operations using # IPFS in JavaScript -This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). You will learn how install and spawn a node using the available libraries, as well as add, retrieve, read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). +This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). You will learn how to install and spawn a node using the available libraries, as well as add, retrieve, read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). ::: tip Environment @@ -13,6 +13,8 @@ All instructions and examples shown here were performed and tested on an M1 Mac. ::: +There are two ways to work with IPFS using JavaScript; the [JS-IPFS](../../reference/js/api/#js-ipfs) library or the [HTTP client](../../reference/js/api/#http-client). We'll show you how to use both in this guide. + ## Install JS-IPFS :::: tabs @@ -27,9 +29,7 @@ To use the CLI on your machine, globally install the `ipfs` Node.js package: npm i --location=global ipfs ``` -### Build from source - -To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. +Alternatively, you can build the project from source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. ::: @@ -43,9 +43,7 @@ To use the IPFS core API, install the `ipfs-core` Node.js package: npm i ipfs-core ``` -### Build from source - -To build from source, clone the [source packages](https://github.com/ipfs/js-ipfs) and follow the build instructions. +Alternatively, you can build the project from source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. ::: @@ -57,40 +55,40 @@ To build from source, clone the [source packages](https://github.com/ipfs/js-ipf ::: tab ipfs-cli id="spawn-ipfs-cli" -To spawn a node using the CLI, simply start the daemon: +1. To spawn a node using the CLI, simply start the daemon: - ```bash - jsipfs daemon - ``` - -You should see an output similar to: - - ```shell - Initializing IPFS daemon... - System version: arm64/darwin - Node.js version: 16.16.0 - Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - js-ipfs version: 0.15.4 - HTTP API listening on /ip4/127.0.0.1/tcp/5002/http - gRPC listening on /ip4/127.0.0.1/tcp/5003/ws - Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http - Web UI available at http://127.0.0.1:5002/webui - Daemon is ready - ``` + ```bash + jsipfs daemon + ``` + +1. You should see an output similar to: -You should be able to point to the [webpage](http://127.0.0.1:5002/webui): + ```shell + Initializing IPFS daemon... + System version: arm64/darwin + Node.js version: 16.16.0 + Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.2.0.2/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + js-ipfs version: 0.15.4 + HTTP API listening on /ip4/127.0.0.1/tcp/5002/http + gRPC listening on /ip4/127.0.0.1/tcp/5003/ws + Gateway (read only) listening on /ip4/127.0.0.1/tcp/9090/http + Web UI available at http://127.0.0.1:5002/webui + Daemon is ready + ``` - +1. You should be able to point to the [webpage](http://127.0.0.1:5002/webui) using the address output by the terminal `http://127.0.0.1:5002/webui`: -If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: + ![The JS-IPFS daemon showing the web-ui.](../../images/jsipfs-webui.png) -```bash -jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' -jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]' -``` +1. If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: + + ```bash + jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' + jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]' + ``` ::: @@ -98,61 +96,61 @@ jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST Create a simple Node.js application to host the logic that will allow you to use the RPC API. You'll also use this Node.js application later on to add and remove files. -Start by initiating a new project: +1. Start by initiating a new project: - ```bash - npm init -y - ``` + ```bash + npm init -y + ``` -If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: +1. If you have not already installed `ipfs-core`, add the `ipfs-core` module to your project: - ```bash - npm i ipfs-core - ``` + ```bash + npm i ipfs-core + ``` -Create an `index.js` file for the application logic: +1. Create an `index.js` file for the application logic: - ```bash - touch index.js - ``` + ```bash + touch index.js + ``` -Now, populate the `index.js` file by initiating an `async` function: +1. Now, populate the `index.js` file by initiating an `async` function: - ```js - const main = async () => { + ```js + const main = async () => { // "await" logic to spawn a node - } + } - main() - ``` + main() + ``` -To create an IPFS node, add: +1. To create an IPFS node, add: - ```js{1,4} - import * as IPFS from 'ipfs-core'; + ```js{1,4} + import * as IPFS from 'ipfs-core'; - async function main() { + async function main() { const node = await IPFS.create(); - } + } - main(); - ``` + main(); + ``` -This imports IPFS as a dependency and uses the `create()` function to create a node instance. + This imports IPFS as a dependency and uses the `create()` function to create a node instance. -To spawn the node, run the application: +1. To spawn the node, run the application: - ```bash - node index.js - ``` + ```bash + node index.js + ``` -You should see an output similar to: +1. You should see an output similar to: - ```shell - Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 - ``` + ```shell + Swarm listening on /ip4/127.0.0.1/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/10.0.0.25/tcp/4002/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + Swarm listening on /ip4/127.0.0.1/tcp/4003/ws/p2p/12D3KooWMZr34r6FArFH36QxyT25BM4HL4u2WF7jQzwNdg91awB6 + ``` ::: @@ -166,46 +164,45 @@ The JS-IPFS implementation is split into several Node.js modules. The following ::: tab ipfs-http-client id="connect-ipfs-http-client" -If you have not already installed the client library, add the `ipfs-http-client` module to your project: +1. If you have not already installed the client library, add the `ipfs-http-client` module to your project: - ```bash - npm i ipfs-http-client - ``` + ```bash + npm i ipfs-http-client + ``` -Populate your `index.js` file with the following to create an instance of the HTTP API client: +1. Populate your `index.js` file with the following to create an instance of the HTTP API client: - ```js{1,3} - import { create } from 'ipfs-http-client' + ```js{1,3} + import { create } from 'ipfs-http-client' - const client = create() // the default API address http://localhost:5001 - ``` + const client = create() // the default API address http://localhost:5001 + ``` -This imports the client library and uses the `create()` function to connect to an IPFS API server. + This imports the client library and uses the `create()` function to connect to an IPFS API server. -To connect to the API, run the application: +1. To connect to the API, run the application: ::: ::: tab ipfs-client id="connect-ipfs-client" -If you have not already installed the client library, add the `ipfs-http-client` module to your project: +1. If you have not already installed the client library, add the `ipfs-http-client` module to your project: +1. Populate your `index.js` file with the following to create an instance of the HTTP API client: -Populate your `index.js` file with the following to create an instance of the HTTP API client: + ```js{1,3-5} + import { create } from 'ipfs-client' - ```js{1,3-5} - import { create } from 'ipfs-client' - - const client = create({ + const client = create({ grpc: '/ipv4/127.0.0.1/tcp/5003/ws', http: '/ipv4/127.0.0.1/tcp/5002/http' - }) + }) - const id = await client.id() - ``` + const id = await client.id() + ``` -This imports the client library and uses the `create()` function to define the server endpoints. + This imports the client library and uses the `create()` function to define the server endpoints. -To connect to the endpoints, run the application: +1. To connect to the endpoints, run the application: ::: @@ -225,40 +222,35 @@ As the JS-IPFS implementation goes through changes, the steps to add a file are ::: tab ipfs-cli id="add-ipfs-cli" -In a new session, navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. - -The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. - - ```bash - jsipfs add ./test.txt - ``` +1. In a new session, navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. +1. The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. -You should obtain a result that verifies the file was added and returns the CID: + ```bash + jsipfs add ./test.txt + ``` - ```shell - added QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi test.txt - ``` +1. You should obtain a result that verifies the file was added and returns the CID: -The file has been added to the IPFS network and has given the file a CID. -You can share this CID with anyone, and they can use it on their IPFS node to -obtain the content you uploaded. + ```shell + added QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi test.txt + ``` -To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) and provide the CID on the search bar. The UI will provide the file contents, similar to the following: +1. The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. +1. To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) and provide the CID on the search bar. The UI will provide the file contents, similar to the following: - +![](../../images/jsipfs-add-webui.png) ::: ::: tab ipfs-core id="add-ipfs-core" -To add a file using `ipfs-core`, you can create a test `.txt` file in your project directory or point to a local file on your machine that you would like to upload to IPFS. - -Then, using `node.add`, add an `await` operator that includes a `path` and `content` field and an output message in the project's `index.js` file: +1. To add a file using `ipfs-core`, you can create a test `.txt` file in your project directory or point to a local file on your machine that you would like to upload to IPFS. +1. Then, using `node.add`, add an `await` operator that includes a `path` and `content` field and an output message in the project's `index.js` file: - ```js{6-9,11} - import * as IPFS from 'ipfs-core'; + ```js{6-9,11} + import * as IPFS from 'ipfs-core'; - async function main() { + async function main() { const node = await IPFS.create(); const fileAdded = await node.add({ @@ -267,67 +259,62 @@ Then, using `node.add`, add an `await` operator that includes a `path` and `cont }); console.log("Added file:", fileAdded.path, fileAdded.cid); - } - - main(); - ``` - -You should obtain an output similar to: + } - ```shell - Added file: test.txt CID(QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk) - ``` + main(); + ``` -The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. +1. You should obtain an output similar to: -If you take the CID and load it on the HTTP gateway, you will see the content: + ```shell + Added file: test.txt CID(QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk) + ``` -> e.g. https://ipfs.io/ipfs/QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk +1. The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. +1. If you take the CID and load it on the HTTP gateway, you will see the content `https://ipfs.io/ipfs/QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk`: - +![](../../images/jsipfs-add-gateway.png) ::: :::: -## Retrieve a file +## Retrieve a file ::::tabs ::: tab ipfs-cli id="retrieve-ipfs-cli" -Navigate to the directory where you wish to save the folder. IPFS will save the folder to whichever directory you are in. Here, we're going to save the file in the ~/Desktop directory: +1. Navigate to the directory where you wish to save the folder. IPFS will save the folder to whichever directory you are in. Here, we're going to save the file in the ~/Desktop directory: - ```bash - cd ~/Desktop - ``` + ```bash + cd ~/Desktop + ``` -We must specify the CID to the jsipfs daemon to retrieve our desired content. The daemon uses a `GET` method to request data from IPFS; `jsipfs get`. We will use the CID from the previous section when we added the `test.txt` file: +1. We must specify the CID to the jsipfs daemon to retrieve our desired content. The daemon uses a `GET` method to request data from IPFS; `jsipfs get`. We will use the CID from the previous section where we added the `test.txt` file: - ```bash - jsipfs get QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` + ```bash + jsipfs get QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` -You should see an output similar to: +1 You should see an output similar to: - ```bash - Saving file(s) to QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` + ```bash + Saving file(s) to QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` -You will notice a new file in your project directory that is labelled as the CID of the retrieved content. +1. You will notice a new file in your project directory that is labeled as the CID of the retrieved content. ::: ::: tab ipfs-core id="retrieve-ipfs-core" -Continuing with the same Node.js application, retrieving a file from IPFS can be done by using -a `cat` call. We will use the CID from the previous section when we added the `test.txt` file by passing `fileAdded.cid` as an argument to `node.cat`: -> However, you can use the same setup to retrieve any file by defining the CID. +1. Continuing with the same Node.js application, retrieving a file from IPFS can be done by using a `cat` call. We will use the CID from the previous section when we added the `test.txt` file by passing `fileAdded.cid` as an argument to `node.cat`. However, you can use the same setup to retrieve any file by defining the CID. - ```js{13-16,18} - import * as IPFS from 'ipfs-core'; + ```js{13-16,18} + import * as IPFS from 'ipfs-core'; - async function main() { + async function main() { const node = await IPFS.create(); const fileAdded = await node.add({ @@ -343,16 +330,16 @@ a `cat` call. We will use the CID from the previous section when we added the `t } console.log("Retrieved file contents:", chunks.toString()); - } + } - main(); - ``` + main(); + ``` -You should retrieve the file contents: +1. You should retrieve the file contents: - ```shell - Retrieved file contents: Hello IPFS! - ``` + ```shell + Retrieved file contents: Hello IPFS! + ``` :::: @@ -360,25 +347,25 @@ You should retrieve the file contents: Pinning a file will save the file data save to the local IPFS node and ensure data is not lost. -Using the `pin add` method on the daemon, you can pin a file by running: +1. Using the `pin add` method on the daemon, you can pin a file by running: - ```bash - jsipfs pin add QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` + ```bash + jsipfs pin add QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` -The result should be something like: +1. The result should be something like: - ```shell - pinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` + ```shell + pinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` By default, objects that you retrieve over IPFS are not pinned to your node. If you wish to prevent the files from being garbage collected, you need to pin them. You will notice that the pin you just added is a recursive pin, meaning it is a directory containing other objects. Check out the [pinning content](../concepts/persistence/##pinning-in-context) to learn more about pinning. ## Remove a file -::: warning Removing a file from IPFS does not guarantee that is was completely removed from network. +::: warning Removing a file from IPFS does not guarantee that it was completely removed from the network. -There is no way to know if someone else has made a copy of the content from when it became available on the network. This is a caveat is also found in regular HTTP networks, as nothing stops users from addressing content and creating a copy once it is pushed to IPFS. +There is no way to know if someone else has made a copy of the content from when it became available on the network. This caveat is also found in regular HTTP networks, as nothing stops users from addressing content and creating a copy once it is pushed to IPFS. ::: @@ -388,54 +375,54 @@ Removing the content pin will remove a file from IPFS. In this section, we will ::: tab ipfs-cli id="remove-ipfs-cli" -If you would like to remove a different piece of content, you can run `jsipfs pin ls` to view a list of pinned content on the local IPFS node: - - ```shell - QmRaaUwTNfwgFZpeUy8qrZwrp2dY4kCKmmB5xEqvH3vtD1 recursive - QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive - QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi recursive - QmXgZAUWd8yo4tvjBETqzUy3wLx5YRzuDwUQnBwRGrAmAo recursive - QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk recursive - QmSVcZ3G5SFZMMk9egqHBaMch4aKYpaaCnxBAJCQR25Am4 indirect - QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y indirect - QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC indirect - QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT indirect - QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 indirect - QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha indirect - QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB indirect - QmQ5vhrL7uv6tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm indirect - QmV4KrV1DBzTaA5xJWTYNx852YjRsrcTGGsaSR5a7gBzbr indirect - QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs indirect - ``` - -Using the daemon's `pin rm` method, unpin the file: - - ```bash - jsipfs pin rm QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` - -This will output something like: - - ```shell - unpinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi - ``` - -`test.txt` file is now unpinned, but it has not been removed from our node completely. To remove it completely, we need to run the [garbage collection](../../concepts/persistence##garbage-collection). The command will remove everything from your node that does not have a pin: - - ```shell - jsipfs repo gc - ``` - -This will output something like: - - ```shell - removed bafybeif2ewg3nqa33mjokpxii36jj2ywfqjpy3urdh7v6vqyfjoocvgy3a - removed bafkreieceevgg2auxo4u3rjgeiqfr4ccxh6ylkgxt2ss6k2leuad5xckxe - removed bafkreiblcvcr7letdbp2k2thkbjyunznrwq3y6pyoylzaq4epawqcca2my - [...] - ``` - -The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. +1. If you would like to remove a different piece of content, you can run `jsipfs pin ls` to view a list of pinned content on the local IPFS node: + + ```shell + QmRaaUwTNfwgFZpeUy8qrZwrp2dY4kCKmmB5xEqvH3vtD1 recursive + QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive + QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi recursive + QmXgZAUWd8yo4tvjBETqzUy3wLx5YRzuDwUQnBwRGrAmAo recursive + QmYt9ypyGsR1BKdaCGPdwdBgAiuXK5AYN2bGSNZov7YXuk recursive + QmSVcZ3G5SFZMMk9egqHBaMch4aKYpaaCnxBAJCQR25Am4 indirect + QmYCvbfNbCwFR45HiNP45rwJgvatpiW38D961L5qAhUM5Y indirect + QmegvLXxpVKiZ4b57Xs1syfBVRd8CbucVHAp7KpLQdGieC indirect + QmQN88TEidd3RY2u3dpib49fERTDfKtDpvxnvczATNsfKT indirect + QmY5heUM5qgRubMDD1og9fhCPA6QdkMp3QCwd4s7gJsyE7 indirect + QmdncfsVm2h5Kqq9hPmU7oAVX2zTSVP3L869tgTbPYnsha indirect + QmPZ9gcCEpqKTo6aq61g2nXGUhM4iCL3ewB6LDXZCtioEB indirect + QmQ5vhrL7uv6tuoN9KeVBwd4PwfQkXdVVmDLUZuTNxqgvm indirect + QmV4KrV1DBzTaA5xJWTYNx852YjRsrcTGGsaSR5a7gBzbr indirect + QmYE7xo6NxbHEVEHej1yzxijYaNY51BaeKxjXxn6Ssa6Bs indirect + ``` + +1. Using the daemon's `pin rm` method, unpin the file: + + ```bash + jsipfs pin rm QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +1. This will output something like: + + ```shell + unpinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi + ``` + +1. `test.txt` file is now unpinned, but it has not been removed from our node completely. To remove it completely, we need to run the [garbage collection](../../concepts/persistence##garbage-collection). The command will remove everything from your node that does not have a pin: + + ```shell + jsipfs repo gc + ``` + +1. This will output something like: + + ```shell + removed bafybeif2ewg3nqa33mjokpxii36jj2ywfqjpy3urdh7v6vqyfjoocvgy3a + removed bafkreieceevgg2auxo4u3rjgeiqfr4ccxh6ylkgxt2ss6k2leuad5xckxe + removed bafkreiblcvcr7letdbp2k2thkbjyunznrwq3y6pyoylzaq4epawqcca2my + [...] + ``` + +1. The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. ::: tip From dcf6f7765a509664eafd5129788a0b0d4ba5b1cc Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 14 Aug 2022 23:45:43 -0400 Subject: [PATCH 16/20] address pr feedback & tweaks --- docs/basics/js/js-ipfs.md | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index ad273bd1f..ddc315830 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -180,21 +180,32 @@ The JS-IPFS implementation is split into several Node.js modules. The following This imports the client library and uses the `create()` function to connect to an IPFS API server. -1. To connect to the API, run the application: +1. To connect to the API, run the application: + + ```bash + node index.js + ``` + +The library internally detects if your machine is running a local node. ::: ::: tab ipfs-client id="connect-ipfs-client" -1. If you have not already installed the client library, add the `ipfs-http-client` module to your project: -1. Populate your `index.js` file with the following to create an instance of the HTTP API client: +1. If you have not already installed the client library, add the `ipfs-client` module to your project: + + ```bash + npm i ipfs-client + ``` + +2. Populate your `index.js` file with the following to create an instance of the HTTP API client: ```js{1,3-5} import { create } from 'ipfs-client' const client = create({ - grpc: '/ipv4/127.0.0.1/tcp/5003/ws', - http: '/ipv4/127.0.0.1/tcp/5002/http' + grpc: '/ip4/127.0.0.1/tcp/5003/ws', + http: '/ip4/127.0.0.1/tcp/5002/http' }) const id = await client.id() @@ -202,7 +213,13 @@ The JS-IPFS implementation is split into several Node.js modules. The following This imports the client library and uses the `create()` function to define the server endpoints. -1. To connect to the endpoints, run the application: +3. To connect to the endpoints, run the application: + + ```bash + node index.js + ``` + +The library internally detects if your machine is running a local node that leverages the specified connections. ::: From e12a7803754082a6870e93f3418d0a794fc53318 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Sun, 14 Aug 2022 23:51:19 -0400 Subject: [PATCH 17/20] edits --- docs/basics/js/js-ipfs.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/basics/js/js-ipfs.md b/docs/basics/js/js-ipfs.md index ddc315830..a31f859c3 100644 --- a/docs/basics/js/js-ipfs.md +++ b/docs/basics/js/js-ipfs.md @@ -5,11 +5,11 @@ description: "A simple walkthrough of how to perform basic IPFS operations using # IPFS in JavaScript -This guide aims to walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). You will learn how to install and spawn a node using the available libraries, as well as add, retrieve, read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). +This guide will walk you through the basics of using IPFS with JavaScript. JS-IPFS is one of multiple [IPFS implementations](../ipfs-implementations.md). You will learn how to install and spawn a node using the available libraries, and add, retrieve, read, and remove files. If you are unsure about the meaning of some terms, check out the [glossary](../concepts/glossary.md). ::: tip Environment -All instructions and examples shown here were performed and tested on an M1 Mac. However, the IPFS commands are the same on Linux, macOS, and Windows. You will need to know how to navigate your computer's directories from within the CLI. If you're unsure how to use the CLI, we recommend learning how before continuing with this guide. +All instructions and examples shown here were performed and tested on an M1 Mac. However, the IPFS commands are the same on Linux, macOS, and Windows. You will to navigate your computer's directories from within the CLI. If you're unsure how to use the CLI, we recommend learning how before continuing with this guide. ::: @@ -29,7 +29,7 @@ To use the CLI on your machine, globally install the `ipfs` Node.js package: npm i --location=global ipfs ``` -Alternatively, you can build the project from source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. +Alternatively, you can build the project from the source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. ::: @@ -43,7 +43,7 @@ To use the IPFS core API, install the `ipfs-core` Node.js package: npm i ipfs-core ``` -Alternatively, you can build the project from source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. +Alternatively, you can build the project from the source. See the [JS-IPFS GitHub repository](https://github.com/ipfs/js-ipfs) for instructions. ::: @@ -55,13 +55,13 @@ Alternatively, you can build the project from source. See the [JS-IPFS GitHub re ::: tab ipfs-cli id="spawn-ipfs-cli" -1. To spawn a node using the CLI, simply start the daemon: +1. To spawn a node using the CLI, start the daemon: ```bash jsipfs daemon ``` -1. You should see an output similar to: +2. You should see an output similar to: ```shell Initializing IPFS daemon... @@ -79,11 +79,11 @@ Alternatively, you can build the project from source. See the [JS-IPFS GitHub re Daemon is ready ``` -1. You should be able to point to the [webpage](http://127.0.0.1:5002/webui) using the address output by the terminal `http://127.0.0.1:5002/webui`: +3. You should be able to point to the [webpage](http://127.0.0.1:5002/webui) using the address output by the terminal `http://127.0.0.1:5002/webui`: ![The JS-IPFS daemon showing the web-ui.](../../images/jsipfs-webui.png) -1. If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: +4. If you are unable to connect to the API, ensure [cross-origin (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) requests are configured: ```bash jsipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://127.0.0.1:5002", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]' @@ -158,7 +158,7 @@ Create a simple Node.js application to host the logic that will allow you to use ### Connect to IPFS -The JS-IPFS implementation is split into several Node.js modules. The following section shows examples of how you can use the HTTP client to connect to IPFS. For more information on the different modules, examine the [API Packages table](../../reference/js/api.md##packages) +The JS-IPFS implementation is split into several Node.js modules. The following section shows examples of using the HTTP client to connect to IPFS. For more information on the different modules, examine the [API Packages table](../../reference/js/api.md##packages) :::: tabs @@ -198,7 +198,7 @@ The library internally detects if your machine is running a local node. npm i ipfs-client ``` -2. Populate your `index.js` file with the following to create an instance of the HTTP API client: +1. Populate your `index.js` file with the following to create an instance of the HTTP API client: ```js{1,3-5} import { create } from 'ipfs-client' @@ -213,7 +213,7 @@ The library internally detects if your machine is running a local node. This imports the client library and uses the `create()` function to define the server endpoints. -3. To connect to the endpoints, run the application: +1. To connect to the endpoints, run the application: ```bash node index.js @@ -231,7 +231,7 @@ Now you can start to add files using JS-IPFS to the IPFS network. ::: warning Section changes coming soon -As the JS-IPFS implementation goes through changes, the steps to add a file are likely to change. Please reference the [source packages](https://github.com/ipfs/js-ipfs) for the latest updates. +As the JS-IPFS implementation changes, some of these steps should be deemed conditional. Please reference the [source packages](https://github.com/ipfs/js-ipfs) for the latest updates. ::: @@ -239,21 +239,21 @@ As the JS-IPFS implementation goes through changes, the steps to add a file are ::: tab ipfs-cli id="add-ipfs-cli" -1. In a new session, navigate to the directory you wish to add a file from. You can also specify the file path when using the cli to add a file. -1. The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. +1. In a new session, navigate to the directory from which you wish to add a file. You can also specify the file path when using the cli to add a file. +2. The daemon uses an `ADD` method to request data from IPFS; `jsipfs add`. We will use a test file called `test.txt` to add through the jsipfs daemon. ```bash jsipfs add ./test.txt ``` -1. You should obtain a result that verifies the file was added and returns the CID: +3. You should obtain a result that verifies the file was added and returns the CID: ```shell added QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi test.txt ``` -1. The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. -1. To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) and provide the CID on the search bar. The UI will provide the file contents, similar to the following: +4. The file has been added to the IPFS network and has given the file a CID. You can share this CID with anyone, and they can use it on their IPFS node to obtain the content you uploaded. +5. To view the file contents, navigate to the [webui](http://127.0.0.1:5002/webui) and provide the CID on the search bar. The UI will provide the file contents, similar to the following: ![](../../images/jsipfs-add-webui.png) @@ -424,7 +424,7 @@ Removing the content pin will remove a file from IPFS. In this section, we will unpinned QmWcYcWY5vdDzBcAoLo3rYXQ2tLkjzu57vEePCvyhuwZRi ``` -1. `test.txt` file is now unpinned, but it has not been removed from our node completely. To remove it completely, we need to run the [garbage collection](../../concepts/persistence##garbage-collection). The command will remove everything from your node that does not have a pin: +1. `test.txt` file is now unpinned, but it has not been removed from our node completely. To remove it completely, run the [garbage collection](../../concepts/persistence##garbage-collection). The command will remove everything from your node that does not have a pin: ```shell jsipfs repo gc @@ -439,7 +439,7 @@ Removing the content pin will remove a file from IPFS. In this section, we will [...] ``` -1. The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. +2. The target file has now been removed from your IPFS node and other files that were not pinned. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. ::: tip From 60091c91473fe603ed920fdfc545e587b466302c Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Tue, 16 Aug 2022 10:01:33 -0400 Subject: [PATCH 18/20] add context to implementations, address pr feedback --- docs/basics/go/command-line.md | 2 +- docs/reference/js/api.md | 51 +++++++++++++++++----------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/docs/basics/go/command-line.md b/docs/basics/go/command-line.md index 40dd4d2ae..925da4b68 100644 --- a/docs/basics/go/command-line.md +++ b/docs/basics/go/command-line.md @@ -5,7 +5,7 @@ description: "A simple walkthrough of how to perform basic IPFS operations using # Basic CLI Operations -This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). +This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](../ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). You will learn how to add, retrieve, read, and remove files within the CLI. If you are unsure about the meaning of some terms, you can check out the [glossary](../concepts/glossary.md). diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 30428a713..3e41ef7e1 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -7,30 +7,7 @@ description: Developer resources for working in JavaScript with IPFS, the InterP ## JavaScript libraries -There are two main JavaScript libraries for working with IPFS. Both work in Node.js and modern web browsers. -The implementation is split into several modules. - -::: details Node modules - -* [`/packages/interface-ipfs-core`](./packages/interface-ipfs-core) Tests to ensure adherence of an implementation to the spec -* [`/packages/ipfs`](./packages/ipfs) An aggregator module that bundles the core implementation, the CLI, HTTP API server and daemon -* [`/packages/ipfs-cli`](./packages/ipfs-cli) A CLI to the core implementation -* [`/packages/ipfs-core`](./packages/ipfs-core) The core implementation -* [`/packages/ipfs-core-types`](./packages/ipfs-core-types) Typescript definitions for the core API -* [`/packages/ipfs-core-utils`](./packages/ipfs-core-utils) Helpers and utilities common to core and the HTTP RPC API client -* [`/packages/ipfs-daemon`](./packages/ipfs-daemon) Run js-IPFS as a background daemon -* [`/packages/ipfs-grpc-client`](./packages/ipfs-grpc-client) A gRPC client for js-IPFS -* [`/packages/ipfs-grpc-protocol`](./packages/ipfs-grpc-protocol) Shared module between the gRPC client and server -* [`/packages/ipfs-grpc-server`](./packages/ipfs-grpc-server) A gRPC-over-websockets server for js-IPFS -* [`/packages/ipfs-http-client`](./packages/ipfs-http-client) A client for the RPC-over-HTTP API presented by both js-ipfs and go-ipfs -* [`/packages/ipfs-http-server`](./packages/ipfs-http-server) JS implementation of the [Kubo RPC HTTP API](https://docs.ipfs.io/reference/kubo/rpc/) -* [`/packages/ipfs-http-gateway`](./packages/ipfs-http-gateway) JS implementation of the [IPFS HTTP Gateway](https://docs.ipfs.io/concepts/ipfs-gateway/) -* [`/packages/ipfs-http-response`](./packages/ipfs-http-response) Creates a HTTP response for a given IPFS Path -* [`/packages/ipfs-message-port-client`](./packages/ipfs-message-port-client) A client for the RPC-over-message-port API presented by js-ipfs running in a shared worker -* [`/packages/ipfs-message-port-protocol`](./packages/ipfs-message-port-protocol) Code shared by the message port client & server -* [`/packages/ipfs-message-port-server`](./packages/ipfs-message-port-server) The server that receives requests from ipfs-message-port-client - -::: +There are two main JavaScript libraries for working with IPFS, `ipfs` and `ipfs-http-client`. Both work in Node.js and modern web browsers. JS-IPFS in Node.js is long-running and supports transports like TCP and UDP along with WebScoekts and WebRTC, while JS-IPFS in the browser is short-lived and limited to Web APIs available on a web page; it only supports WebSockets and WebRTC as transports. The browser is also resource constrained and does not support all of the interfaces found in the Node.js version. ### JS-IPFS @@ -68,7 +45,31 @@ We recommend the second method (interacting with a separate IPFS node via RPC AP ::: warning Browsers -The `js-ipfs` and `js-ipfs-http-client` libraries work in browsers, but each has special considerations noted in their READMEs. +The `ipfs` and `ipfs-http-client` libraries work in browsers, but each has special considerations noted in their READMEs. + +::: + +The implementation is split into several modules. + +::: details Node modules + +* [`/packages/interface-ipfs-core`](./packages/interface-ipfs-core) Tests to ensure adherence of an implementation to the spec +* [`/packages/ipfs`](./packages/ipfs) An aggregator module that bundles the core implementation, the CLI, HTTP API server and daemon +* [`/packages/ipfs-cli`](./packages/ipfs-cli) A CLI to the core implementation +* [`/packages/ipfs-core`](./packages/ipfs-core) The core implementation +* [`/packages/ipfs-core-types`](./packages/ipfs-core-types) Typescript definitions for the core API +* [`/packages/ipfs-core-utils`](./packages/ipfs-core-utils) Helpers and utilities common to core and the HTTP RPC API client +* [`/packages/ipfs-daemon`](./packages/ipfs-daemon) Run js-IPFS as a background daemon +* [`/packages/ipfs-grpc-client`](./packages/ipfs-grpc-client) A gRPC client for js-IPFS +* [`/packages/ipfs-grpc-protocol`](./packages/ipfs-grpc-protocol) Shared module between the gRPC client and server +* [`/packages/ipfs-grpc-server`](./packages/ipfs-grpc-server) A gRPC-over-websockets server for js-IPFS +* [`/packages/ipfs-http-client`](./packages/ipfs-http-client) A client for the RPC-over-HTTP API presented by both js-ipfs and go-ipfs +* [`/packages/ipfs-http-server`](./packages/ipfs-http-server) JS implementation of the [Kubo RPC HTTP API](https://docs.ipfs.io/reference/kubo/rpc/) +* [`/packages/ipfs-http-gateway`](./packages/ipfs-http-gateway) JS implementation of the [IPFS HTTP Gateway](https://docs.ipfs.io/concepts/ipfs-gateway/) +* [`/packages/ipfs-http-response`](./packages/ipfs-http-response) Creates a HTTP response for a given IPFS Path +* [`/packages/ipfs-message-port-client`](./packages/ipfs-message-port-client) A client for the RPC-over-message-port API presented by js-ipfs running in a shared worker +* [`/packages/ipfs-message-port-protocol`](./packages/ipfs-message-port-protocol) Code shared by the message port client & server +* [`/packages/ipfs-message-port-server`](./packages/ipfs-message-port-server) The server that receives requests from ipfs-message-port-client ::: From be81a920f59b279c29ada1887eb8f8d9c0ef6406 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Wed, 31 Aug 2022 00:48:10 -0400 Subject: [PATCH 19/20] match master --- docs/basics/go/command-line.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/basics/go/command-line.md b/docs/basics/go/command-line.md index 925da4b68..f34569950 100644 --- a/docs/basics/go/command-line.md +++ b/docs/basics/go/command-line.md @@ -1,11 +1,11 @@ --- -title: IPFS in Golang +title: "Command-line" description: "A simple walkthrough of how to perform basic IPFS operations using the Kubo command-line." --- # Basic CLI Operations -This short guide aims to walk you through the **basics of using IPFS with the Kubo CLI**. Kubo is [one of multiple IPFS implementations](../ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). +This short guide aims to walk you through the basics of using IPFS with the Kubo CLI. Kubo is [one of multiple IPFS implementations](ipfs-implementations.md). It is the oldest IPFS implementation and exposes a CLI (among other things). You will learn how to add, retrieve, read, and remove files within the CLI. If you are unsure about the meaning of some terms, you can check out the [glossary](../concepts/glossary.md). @@ -261,4 +261,3 @@ If we decide that we no longer want to host a file, all we have to do is remove ``` The target file has now been fully removed from your IPFS node and any other files that we did not pin. If the content that was just garbage collected was saved to your computer's local storage, it is still there. If you wish to remove the content from your computer's local storage, you will need to find where it is saved and delete it using the normal deletion method. - From b0cc7d45db7c17a2eae2b8edbb14a901d87d6101 Mon Sep 17 00:00:00 2001 From: Danny Salman Date: Wed, 31 Aug 2022 00:56:09 -0400 Subject: [PATCH 20/20] temp rmv go dir to fix conflict + edits --- docs/basics/{go => }/command-line.md | 2 +- docs/reference/js/api.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/basics/{go => }/command-line.md (99%) diff --git a/docs/basics/go/command-line.md b/docs/basics/command-line.md similarity index 99% rename from docs/basics/go/command-line.md rename to docs/basics/command-line.md index f34569950..b9b33482f 100644 --- a/docs/basics/go/command-line.md +++ b/docs/basics/command-line.md @@ -1,5 +1,5 @@ --- -title: "Command-line" +title: IPFS in Golang description: "A simple walkthrough of how to perform basic IPFS operations using the Kubo command-line." --- diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 3e41ef7e1..73f2ca95b 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -7,7 +7,7 @@ description: Developer resources for working in JavaScript with IPFS, the InterP ## JavaScript libraries -There are two main JavaScript libraries for working with IPFS, `ipfs` and `ipfs-http-client`. Both work in Node.js and modern web browsers. JS-IPFS in Node.js is long-running and supports transports like TCP and UDP along with WebScoekts and WebRTC, while JS-IPFS in the browser is short-lived and limited to Web APIs available on a web page; it only supports WebSockets and WebRTC as transports. The browser is also resource constrained and does not support all of the interfaces found in the Node.js version. +There are two main JavaScript libraries for working with IPFS, `ipfs` and `ipfs-http-client`. Both work in Node.js and modern web browsers. JS-IPFS in Node.js serves to be long-running and supports transports like TCP and UDP along with WebScoekts and WebRTC, while JS-IPFS in the browser is short-lived and limited to Web APIs available on a web page; only supports WebSockets and WebRTC as transports. The browser is also resource constrained and does not support all of the interfaces found in the Node.js version. ### JS-IPFS