mirror of
https://github.com/logos-storage/bittorrent-codex-docs.git
synced 2026-01-07 15:33:13 +00:00
213 lines
6.2 KiB
Markdown
213 lines
6.2 KiB
Markdown
## Uploading
|
|
|
|
The following setup has been used for testing:
|
|
|
|
```bash
|
|
» tree ./dir
|
|
./dir
|
|
├── dir1
|
|
│ ├── file11.txt # File 11
|
|
│ └── file12.txt # File 12
|
|
├── file1.txt # File 1
|
|
└── file2.txt. # File 2
|
|
|
|
2 directories, 4 files
|
|
```
|
|
|
|
It is included in `tests/fixtures/tarballs/dir`.
|
|
|
|
The content has been archived using `tar`:
|
|
|
|
```bash
|
|
» tar -cf tar -cf testtarball.tar dir
|
|
» tar -tf testtarbar.tar
|
|
dir/
|
|
dir/file2.txt
|
|
dir/file1.txt
|
|
dir/dir1/
|
|
dir/dir1/file11.txt
|
|
dir/dir1/file12.txt
|
|
```
|
|
|
|
A codex node has been started:
|
|
|
|
```bash
|
|
./build/codex --data-dir=./data-1 --listen-addrs=/ip4/127.0.0.1/tcp/8081 --api-port=8001 --nat=none --disc-port=8091 --log-level=TRACE
|
|
```
|
|
|
|
The tarball has been uploaded to codex using new `tar` API (the output shows reponse):
|
|
|
|
```bash
|
|
» curl -X POST http://localhost:8001/api/codex/v1/tar \
|
|
-H 'Content-Type: application/octet-stream' \
|
|
-H 'Content-Disposition: filename="testtarbar.tar"' \
|
|
-w '\n' \
|
|
-T testtarbar.tar | jq
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 6654 100 510 100 6144 53297 627k --:--:-- --:--:-- --:--:-- 722k
|
|
[
|
|
{
|
|
"name": "dir",
|
|
"cid": "zDvZRwzm597U7Bq9rDZ29KpqodiGHfAuLqMTXixujUFT3QYNDjgj",
|
|
"children": [
|
|
{
|
|
"name": "file2.txt",
|
|
"cid": "zDvZRwzm5oLGkg8kW7g6fRZSfmCqqc44JAUivqJ5TwrwZneCh6V5"
|
|
},
|
|
{
|
|
"name": "file1.txt",
|
|
"cid": "zDvZRwzmDJSePX8bskWzKUrQPDutLiFhCuDtenAZDnpMZ52LUCWh"
|
|
},
|
|
{
|
|
"name": "dir1",
|
|
"cid": "zDvZRwzkzNF8iJKdSXGJuoiC2pJ1sfrA9brunjhNTts3PrEQ92fs",
|
|
"children": [
|
|
{
|
|
"name": "file11.txt",
|
|
"cid": "zDvZRwzm8ZuLQB7kG3fcZqqNRPXbhe2d4du6pDC9MyoRRw12GKfS"
|
|
},
|
|
{
|
|
"name": "file12.txt",
|
|
"cid": "zDvZRwzmDd6Mg6E98nrXVkZ7THfK5zyQ6Y3j8fSSavSsAYReteLT"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
```
|
|
|
|
We see that each directory and file gets their separate cids. The cids of the files are regular Codex Manifest cids. The cids for the directories, are cids of *Codex Directory Manifest*. You can retrieve the directory manifest using `dirmanifest` API:
|
|
|
|
```bash
|
|
» curl "http://localhost:8001/api/codex/v1/data/zDvZRwzm597U7Bq9rDZ29KpqodiGHfAuLqMTXixujUFT3QYNDjgj/network/dirmanifest" | jq
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 262 100 262 0 0 154k 0 --:--:-- --:--:-- --:--:-- 255k
|
|
{
|
|
"cid": "zDvZRwzm597U7Bq9rDZ29KpqodiGHfAuLqMTXixujUFT3QYNDjgj",
|
|
"manifest": {
|
|
"name": "dir",
|
|
"cids": [
|
|
"zDvZRwzm5oLGkg8kW7g6fRZSfmCqqc44JAUivqJ5TwrwZneCh6V5",
|
|
"zDvZRwzmDJSePX8bskWzKUrQPDutLiFhCuDtenAZDnpMZ52LUCWh",
|
|
"zDvZRwzkzNF8iJKdSXGJuoiC2pJ1sfrA9brunjhNTts3PrEQ92fs"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
The same for the subdirectory `dir1`:
|
|
|
|
```bash
|
|
» curl "http://localhost:8001/api/codex/v1/data/zDvZRwzkzNF8iJKdSXGJuoiC2pJ1sfrA9brunjhNTts3PrEQ92fs/network/dirmanifest" | jq
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 208 100 208 0 0 155k 0 --:--:-- --:--:-- --:--:-- 203k
|
|
{
|
|
"cid": "zDvZRwzkzNF8iJKdSXGJuoiC2pJ1sfrA9brunjhNTts3PrEQ92fs",
|
|
"manifest": {
|
|
"name": "dir1",
|
|
"cids": [
|
|
"zDvZRwzm8ZuLQB7kG3fcZqqNRPXbhe2d4du6pDC9MyoRRw12GKfS",
|
|
"zDvZRwzmDd6Mg6E98nrXVkZ7THfK5zyQ6Y3j8fSSavSsAYReteLT"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Downloading
|
|
|
|
You can download separate files in the regular way, e.g. for `file11.txt`:
|
|
|
|
```bash
|
|
» curl "http://localhost:8001/api/codex/v1/data/zDvZRwzm8ZuLQB7kG3fcZqqNRPXbhe2d4du6pDC9MyoRRw12GKfS/network/stream" -o "file11.txt"
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 8 100 8 0 0 3188 0 --:--:-- --:--:-- --:--:-- 4000
|
|
» cat file11.txt
|
|
File 11
|
|
```
|
|
|
|
Now, let's download only `dir1`:
|
|
|
|
```bash
|
|
» curl "http://localhost:8001/api/codex/v1/dir/zDvZRwzkzNF8iJKdSXGJuoiC2pJ1sfrA9brunjhNTts3PrEQ92fs/network/stream" -o "dir1.tar"
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 3711 0 3711 0 0 1401k 0 --:--:-- --:--:-- --:--:-- 1812k
|
|
```
|
|
|
|
We can check the contents of `dir1.tar`:
|
|
|
|
```bash
|
|
» tar -tf dir1.tar
|
|
dir1
|
|
dir1/file11.txt
|
|
dir1/file12.txt
|
|
```
|
|
|
|
And we can successfully extract it to see that it has the same content:
|
|
|
|
```bash
|
|
» tar -xf dir1.tar
|
|
» tree ./dir1
|
|
./dir1
|
|
├── file11.txt
|
|
└── file12.txt
|
|
|
|
1 directory, 2 files
|
|
» cat dir1/file11.txt
|
|
File 11
|
|
» cat dir1/file12.txt
|
|
File 12
|
|
```
|
|
|
|
Finally, we can fetch the the whole previously uploaded `dir` directory:
|
|
|
|
```bash
|
|
» curl "http://localhost:8001/api/codex/v1/dir/zDvZRwzm597U7Bq9rDZ29KpqodiGHfAuLqMTXixujUFT3QYNDjgj/network/stream" -o "dir.tar"
|
|
% Total % Received % Xferd Average Speed Time Time Time Current
|
|
Dload Upload Total Spent Left Speed
|
|
100 6271 0 6271 0 0 1955k 0 --:--:-- --:--:-- --:--:-- 2041k
|
|
```
|
|
|
|
And also here, we can check its contents:
|
|
|
|
```bash
|
|
» tar -tf dir.tar
|
|
dir
|
|
dir/file2.txt
|
|
dir/file1.txt
|
|
dir/dir1
|
|
dir/dir1/file11.txt
|
|
dir/dir1/file12.txt
|
|
|
|
» tar -xf dir.tar
|
|
» tree ./dir
|
|
./dir
|
|
├── dir1
|
|
│ ├── file11.txt
|
|
│ └── file12.txt
|
|
├── file1.txt
|
|
└── file2.txt
|
|
|
|
» cat dir/file1.txt
|
|
File 1
|
|
» cat dir/file2.txt
|
|
File 2
|
|
» cat dir/dir1/file11.txt
|
|
File 11
|
|
» cat dir/dir1/file12.txt
|
|
File 12
|
|
```
|
|
|
|
## Next steps
|
|
|
|
This is rough implementation. The most important, missing things are:
|
|
|
|
- while uploading tarballs, actually do streaming - now we are cheating a bit, so the current implementation will not work well on big file. On the other hand, while downloading directories, we are already doing some sort of a streaming while building the resulting tarballs by using unconstrained async queue.
|
|
- make sure we correctly record the permissions and modification timestamps. We have some basic stuff in place, but for the moment we hard-code it.
|
|
|