logos-storage-js/README.md

520 lines
11 KiB
Markdown
Raw Permalink Normal View History

2024-08-15 12:08:48 +02:00
# Codex SDK
2024-08-15 12:08:15 +02:00
The Codex SDK provides an API for interacting with the Codex decentralized storage network.
2024-08-15 12:08:48 +02:00
The SDK has a small bundle size and support tree shaking.
2024-08-15 12:08:41 +02:00
2024-08-15 12:08:51 +02:00
The SDK is currently under early development and the API can change at any time.
[![License: Apache](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Stability: experimental](https://img.shields.io/badge/stability-experimental-orange.svg)](#stability)
[![CI](https://github.com/codex-storage/codex-js/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/codex-storage/codex-js/actions/workflows/ci.yml?query=branch%3Amaster)
## Breaking changes
- Version 0.1.0 introduces [upload strategy](#upload) to support browser and Node JS.
## Types generation
The types are generated from the openapi.yaml using the commande:
```bash
npx openapi-typescript ./openapi.yaml -o src/openapi.ts --default-non-nullable false
```
## How to use
### Sync api
The easiest way is to use the sync API, but you will not benefit from tree shaking.
2024-08-15 12:08:15 +02:00
```js
import { Codex } from "@codex-storage/sdk-js";
2024-08-15 12:08:15 +02:00
```
2024-08-15 12:08:48 +02:00
or
2024-08-15 12:08:15 +02:00
```js
const { Codex } = require("@codex-storage/sdk-js");
2024-08-15 12:08:15 +02:00
```
To create a Codex instance, provide the REST API url to interact with the Codex client:
```js
const codex = new Codex("http://localhost:8080");
```
Then you can access any module like this:
```js
const marketplace = codex.marketplace;
```
### Async api
```js
import { Codex } from "@codex-storage/sdk-js/async";
```
or
```js
const { Codex } = require("@codex-storage/sdk-js/async");
```
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
To create a Codex instance, provide the REST API url to interact with the Codex client:
2024-08-15 12:08:15 +02:00
```js
const codex = new Codex("http://localhost:8080");
2024-08-15 12:08:15 +02:00
```
2024-08-15 12:08:41 +02:00
To use a module, you need to use the await syntax. If the module is not loaded yet, it will be imported first and then cached in memory.
```js
const marketplace = await codex.marketplace();
2024-08-15 12:08:41 +02:00
```
2025-03-28 09:13:01 +01:00
### Authentication
You can use basic authentication when creating a new Codex object:
```js
const codex = new Codex("http://localhost:8080", {
2025-03-28 09:13:01 +01:00
auth: {
basic: "MY BASIC AUTH SECRET"
}
});
You can obtain your secret using the `btoa` method in the browser or `Buffer.from(string).toString('base64')` in Node.js. The secret is stored in memory only.
```
2024-08-15 12:08:48 +02:00
### Error handling
2024-08-15 12:08:15 +02:00
The SDK provides a type called `SafeValue` for error handling instead of throwing errors. It is inspired by Go's "error as value" concept.
If the value represents an error, `error` is true and `data` will contain the error.
If the value is not an error, `error` is false and `data` will contain the requested data.
2024-08-15 12:08:48 +02:00
The [CodexError](./src/errors/errors.ts#L16) contains a message and 3 optionals properties:
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
- `code`: The (http) code error when it comes from a request
- `errors`: A {ValidationError} array when it comes from an object validation process
- `stack`: The error stack when the CodexError results from a error thrown
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const slots = marketplace.activeSlots();
2024-08-15 12:08:15 +02:00
if (slots.error) {
2024-08-15 12:08:48 +02:00
// Do something to handle the error in slots.data
return;
2024-08-15 12:08:15 +02:00
}
// Access the slots within slots.data.
```
### Compatibility
| SDK version | Codex version | Codex app |
| ----------- | ------------- | --------- |
| latest | master | latest |
2025-02-25 23:18:29 +01:00
| 0.0.22 | Testnet 0.2.0 | 0.0.14 |
| 0.0.16 | Testnet 0.1.9 | 0.0.13 |
2024-08-15 12:08:48 +02:00
### Marketplace
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
The following API assume that you have already a marketplace module loaded, example:
2024-08-15 12:08:41 +02:00
```js
const codex = new Codex("http://localhost:8080");
// When using the async api
2024-08-15 12:08:48 +02:00
const marketplace = await codex.marketplace();
// When using the sync api
2025-03-28 09:13:01 +01:00
const marketplace = codex.marketplace;
2024-08-15 12:08:41 +02:00
```
2024-08-15 12:08:15 +02:00
#### activeSlots()
Returns active slots.
- returns Promise<[CodexSlot](./src/marketplace/types.ts#L7)[]>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const slots = await marketplace.activeSlots();
2024-08-15 12:08:15 +02:00
```
#### activeSlot(slotId)
Returns active slot with id {slotId} for the host.
- slotId (string, required)
- returns Promise<[CodexSlotAgent](./src/marketplace/types.ts#L12)[]>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const slotId = "AB9........";
const slot = await marketplace.activeSlot(slotId);
2024-08-15 12:08:15 +02:00
```
#### availabilities
Returns storage that is for sale.
- returns Promise<[CodexAvailability](./src/marketplace/types.ts#L20)>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const availabilities = await marketplace.availabilities();
2024-08-15 12:08:15 +02:00
```
#### createAvailability
Offers storage for sale.
- input ([CodexCreateAvailabilityInput](./src/marketplace/types.ts#L45), required)
- returns Promise<[CodexAvailability](./src/marketplace/types.ts#L20)[]>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:41 +02:00
const response = await marketplace.createAvailability({
2025-03-04 11:07:05 +01:00
totalCollateral: 1,
2024-08-15 12:08:48 +02:00
totalSize: 3000,
2025-03-04 11:07:05 +01:00
minPricePerBytePerSecond: 100,
2024-08-15 12:08:48 +02:00
duration: 100,
});
2024-08-15 12:08:15 +02:00
```
2024-09-20 10:50:43 +02:00
#### updateAvailability
Updates availability.
- input ([CodexAvailabilityPatchInput](./src/marketplace/types.ts#L66), required)
2024-09-20 10:50:43 +02:00
- returns Promise<"">
Example:
```js
const response = await marketplace.updateAvailability({
id: "0x.....................",
2025-03-04 11:07:05 +01:00
totalCollateral: 1,
2024-09-20 10:50:43 +02:00
totalSize: 3000,
2025-03-04 11:07:05 +01:00
minPricePerBytePerSecond: 100,
2024-09-20 10:50:43 +02:00
duration: 100,
});
```
2024-08-15 12:08:15 +02:00
#### reservations
Return list of reservations for ongoing Storage Requests that the node hosts.
- availabilityId (string, required)
- returns Promise<[CodexReservation](./src/marketplace/types.ts#L83)[]>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const reservations = await marketplace.reservations("Ox...");
2024-08-15 12:08:15 +02:00
```
#### createStorageRequest
Creates a new Request for storage
- input ([CodexCreateStorageRequestInput](./src/marketplace/types.ts#L120), required)
2024-08-30 12:24:00 +02:00
- returns Promise<string>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:41 +02:00
const request = await marketplace.createStorageRequest({
2024-08-15 12:08:48 +02:00
duration: 3000,
pricePerBytePerSecond: 1,
2024-08-15 12:08:48 +02:00
proofProbability: 1,
nodes: 1,
tolerance: 0,
2025-02-10 22:50:06 +01:00
collateralPerByte: 100,
2024-08-15 12:08:48 +02:00
expiry: 3000,
});
2024-08-15 12:08:15 +02:00
```
#### purchaseIds
Returns list of purchase IDs
- returns Promise<string[]>
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const ids = await marketplace.purchaseIds();
2024-08-15 12:08:15 +02:00
```
#### purchaseDetail
Returns purchase details
2024-08-15 12:08:15 +02:00
- purchaseId (string, required)
- returns Promise<[CodexPurchase](./src/marketplace/types.ts#L103)[]>
2024-08-15 12:08:15 +02:00
2024-08-15 12:08:48 +02:00
Example:
2024-08-15 12:08:15 +02:00
```js
2024-08-15 12:08:48 +02:00
const purchaseId = "Ox........";
const purchase = await marketplace.purchaseDetail(purchaseId);
2024-08-15 12:08:15 +02:00
```
2024-08-30 12:24:00 +02:00
### Data
The following API assume that you have already a data module loaded, example:
```js
const codex = new Codex("http://localhost:8080");
// When using the async api
const data = await codex.data();
// When using the sync api
2025-03-28 09:13:01 +01:00
const data = codex.data;
2024-08-30 12:24:00 +02:00
```
#### cids
Returns the manifest stored locally in node.
- returns Promise<[CodexDataItem](./src/data/types.ts#L8)[]>
2024-08-30 12:24:00 +02:00
Example:
```js
const cids = await data.cids();
```
#### space
Returns a summary of the storage space allocation of the node
- returns Promise<[CodexNodeSpace](./src/data/types.ts#L15)[]>
2024-08-30 12:24:00 +02:00
Example:
```js
const space = await data.space();
```
#### upload
Upload a file in a streaming manner
#### Browser
- strategy [BrowserUploadStrategy](./src/data/browser-upload.ts#L5)
- returns [UploadResponse](./src/data/types.ts#L17)
Example:
```js
const file = new File(["foo"], "foo.txt", { type: "text/plain" });
const onProgress = (loaded, total) => {
console.info("Loaded", loaded, "total", total);
};
const metadata = { filename: "foo.xt", mimetype: "text/plain" };
const strategy = new BrowserUploadStrategy(file, onProgress, metadata);
const uploadResponse = data.upload(strategy);
const res = await uploadResponse.result;
if (res.error) {
console.error(res.data);
return;
}
console.info("CID is", res.data);
```
#### Node
- strategy [NodeUploadStrategy](./src/data/node-upload.ts#L9)
- returns [UploadResponse](./src/data/types.ts#L17)
2024-08-30 12:24:00 +02:00
Example:
```js
const strategy = new NodeUploadStrategy("Hello World !");
const uploadResponse = data.upload(strategy);
const res = await uploadResponse.result;
if (res.error) {
console.error(res.data);
return;
2024-11-01 18:02:05 +01:00
}
console.info("CID is", res.data);
2024-08-30 12:24:00 +02:00
```
2024-10-23 16:53:40 +02:00
#### manifest
Download only the dataset manifest from the network to the local node if it's not available locally.
- cid (string, required)
- returns [CodexManifest](./src/data/types.ts#L30)
2024-10-23 16:53:40 +02:00
Example:
```js
const cid = "QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N";
const manifest = await data.fetchManifest(cid);
```
2024-10-25 11:10:13 +02:00
#### networkDownloadStream
Download a file from the network in a streaming manner.
If the file is not available locally, it will be retrieved from other nodes in the network if able.
- cid (string, required)
- returns Response
2024-10-25 11:10:13 +02:00
Example:
```js
const cid = "QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N";
const result = await data.networkDownloadStream(cid);
```
2024-10-25 13:28:27 +02:00
#### localDownload
Download a file from the local node in a streaming manner.
If the file is not available locally, a 404 is returned.
- cid (string, required)
- returns Response
Example:
```js
const cid = "QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N";
const result = await data.localDownload(cid);
```
#### delete
Deletes either a single block or an entire dataset from the local node.
Does nothing if the dataset is not locally available.
- cid (string, required)
- returns ""
Example:
```js
const cid = "QmYyQSo1c1Ym7orWxLYvCrM2EmxFTANf8wXmmE7DWjhx5N";
const result = await data.delete(cid);
```
2024-09-13 19:25:02 +02:00
### Debug
2024-08-30 12:24:00 +02:00
The following API assume that you have already a node module loaded, example:
```js
const codex = new Codex("http://localhost:8080");
// When using the async api
const data = await codex.debug();
// When using the sync api
2025-03-28 09:13:01 +01:00
const data = codex.debug;
2024-08-30 12:24:00 +02:00
```
#### setLogLevel
Set log level at run time.
- level ([CodexLogLevel](./src/debug/types.ts#L7), required)
- returns Promise<"">
2024-08-30 12:24:00 +02:00
Example:
```js
await debug.setLogLevel("DEBUG");
```
#### info
Gets node information
- returns Promise<[CodexDebugInfo](./src/debug/types.ts#L23)>
2024-08-30 12:24:00 +02:00
Example:
```js
const info = await debug.info();
```
2024-09-13 19:25:02 +02:00
### Node
The following API assume that you have already a node module loaded, example:
```js
const codex = new Codex("http://localhost:8080");
// When using the async api
const node = await codex.node();
// When using the sync api
2025-03-28 09:13:01 +01:00
const node = codex.node;
2024-09-13 19:25:02 +02:00
```
#### spr
Get Node's SPR
- returns Promise<[CodexSpr](./src/node/types.ts#L11)>
2024-09-13 19:25:02 +02:00
Example:
```js
const spr = await node.spr();
```
By default, the response will be a json. You can use `text` option to get the string:
#### peeriD
Get Node's peer id
- returns Promise<[CodexPeerId](./src/node/types.ts#L25)>
Example:
```js
const peerId = await node.peerId();
```
By default, the response will be a json. You can use `text` option to get the string:
```js
const peerId = await node.peerId("text");
```
#### connect
Connect to a peer
- returns Promise<string>
Example:
```js
const peerId = "..."
const addrs = [...]
const spr = await node.connect(peerId, addrs);
```