Skip to content

Commit 43b9fcd

Browse files
authored
Merge pull request #124 from bloock/feature/hot-fix
2 parents d29264a + 9408630 commit 43b9fcd

File tree

73 files changed

+20058
-384
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+20058
-384
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.9.2
1+
2.9.3

bloock-bridge/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bloock_bridge"
3-
version = "2.9.2"
3+
version = "2.9.3"
44
edition = "2021"
55

66
[lib]

bloock-bridge/proto/bloock_availability_entities.proto

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,22 @@ package bloock;
55
option go_package = "github.com/bloock/bloock-sdk-go/v2/internal/bridge/proto";
66
option java_package = "com.bloock.sdk.bridge.proto";
77

8+
import "bloock_keys_entities.proto";
9+
810
enum DataAvailabilityType {
911
HOSTED = 0;
1012
IPFS = 1;
13+
IPNS = 2;
1114
}
1215

1316
message Publisher {
1417
DataAvailabilityType type = 1;
1518
PublisherArgs args = 2;
1619
}
1720

18-
message PublisherArgs {}
21+
message PublisherArgs {
22+
optional IpnsKey ipns_key = 1;
23+
}
1924

2025
message Loader {
2126
DataAvailabilityType type = 1;
@@ -24,4 +29,9 @@ message Loader {
2429

2530
message LoaderArgs {
2631
string id = 1;
32+
}
33+
34+
message IpnsKey {
35+
optional ManagedKey managed_key = 1;
36+
optional ManagedCertificate managed_certificate = 2;
2737
}

bloock-bridge/src/server/availability/server.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use crate::{
22
error::BridgeError,
33
items::{
4-
AvailabilityServiceHandler, DataAvailabilityType, Loader, LoaderArgs, PublishRequest,
5-
PublishResponse, Publisher, Record, RetrieveRequest, RetrieveResponse,
4+
AvailabilityServiceHandler, DataAvailabilityType, IpnsKey, Loader, LoaderArgs, PublishRequest, PublishResponse, Publisher, PublisherArgs, Record, RetrieveRequest, RetrieveResponse
65
},
76
server::response_types::RequestConfigData,
87
};
98
use async_trait::async_trait;
109
use bloock_core::record::entity::record::Record as RecordCore;
10+
use bloock_keys::keys::managed::ManagedKey as ManagedKeyCore;
1111

1212
pub struct AvailabilityServer {}
1313

@@ -35,6 +35,25 @@ impl AvailabilityServiceHandler for AvailabilityServer {
3535
let result = match DataAvailabilityType::from_i32(req_publisher.r#type) {
3636
Some(DataAvailabilityType::Hosted) => service.publish_hosted(record).await,
3737
Some(DataAvailabilityType::Ipfs) => service.publish_ipfs(record).await,
38+
Some(DataAvailabilityType::Ipns) => {
39+
let publisher_args: PublisherArgs = req_publisher
40+
.args
41+
.ok_or_else(|| "invalid publisher provided".to_string())?;
42+
43+
let ipns_key: IpnsKey = publisher_args
44+
.ipns_key
45+
.ok_or_else(|| "invalid IPNS key provided".to_string())?;
46+
47+
let key_id: String = if let Some(managed_key) = ipns_key.managed_key.clone() {
48+
let managed_key_core: ManagedKeyCore = managed_key.into();
49+
managed_key_core.id
50+
} else if let Some(_) = ipns_key.managed_certificate.clone() {
51+
return Err("managed certificate not enabled".to_string());
52+
} else {
53+
return Err("invalid managed key or certificate provided".to_string());
54+
};
55+
service.publish_ipns(record, key_id).await
56+
},
3857
None => return Err("invalid publisher provided".to_string()),
3958
};
4059

@@ -60,6 +79,7 @@ impl AvailabilityServiceHandler for AvailabilityServer {
6079
let result = match DataAvailabilityType::from_i32(req_loader.r#type) {
6180
Some(DataAvailabilityType::Hosted) => service.retrieve_hosted(loader_args.id).await,
6281
Some(DataAvailabilityType::Ipfs) => service.retrieve_ipfs(loader_args.id).await,
82+
Some(DataAvailabilityType::Ipns) => service.retrieve_ipns(loader_args.id).await,
6383
None => return Err("invalid loader provided".to_string()),
6484
};
6585

bloock-bridge/src/server/record/server.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ impl RecordServiceHandler for RecordServer {
215215
let result = match DataAvailabilityType::from_i32(req_loader.r#type) {
216216
Some(DataAvailabilityType::Hosted) => service.retrieve_hosted(loader_args.id).await,
217217
Some(DataAvailabilityType::Ipfs) => service.retrieve_ipfs(loader_args.id).await,
218+
Some(DataAvailabilityType::Ipns) => service.retrieve_ipns(loader_args.id).await,
218219
None => return Err("invalid loader provided".to_string()),
219220
};
220221

bloock-core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bloock-core"
3-
version = "2.9.2"
3+
version = "2.9.3"
44
edition = "2021"
55

66
[lib]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod publish_hosted_response;
22
pub mod publish_ipfs_response;
3+
pub mod publish_ipns_response;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
use serde::Deserialize;
2+
3+
#[derive(Clone, Deserialize)]
4+
pub struct PublishIpnsResponse {
5+
pub id: String,
6+
}

bloock-core/src/availability/service.rs

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
22
entity::{
3-
publish_hosted_response::PublishHostedResponse, publish_ipfs_response::PublishIpfsResponse,
3+
publish_hosted_response::PublishHostedResponse, publish_ipfs_response::PublishIpfsResponse, publish_ipns_response::PublishIpnsResponse,
44
},
55
AvailabilityError,
66
};
@@ -79,6 +79,40 @@ impl<H: Client> AvailabilityService<H> {
7979
.await
8080
.map_err(|e| AvailabilityError::RetrieveError(e.to_string()).into())
8181
}
82+
83+
pub async fn publish_ipns(&self, record: Record, key_id: String) -> BloockResult<String> {
84+
let url = format!(
85+
"{}/hosting/v1/ipns/upload?key={}",
86+
self.config_service.get_api_base_url(),
87+
key_id,
88+
);
89+
90+
let response: PublishIpnsResponse = self
91+
.http
92+
.post_file(
93+
url,
94+
vec![("payload".to_owned(), record.serialize()?.to_vec())],
95+
vec![],
96+
None,
97+
None,
98+
)
99+
.await
100+
.map_err(|e| AvailabilityError::PublishError(e.to_string()))?;
101+
Ok(response.id)
102+
}
103+
104+
pub async fn retrieve_ipns(&self, id: String) -> BloockResult<Vec<u8>> {
105+
let url = format!(
106+
"{}/hosting/v1/ipns/{}",
107+
self.config_service.get_cdn_base_url(),
108+
id
109+
);
110+
111+
self.http
112+
.get(url, None)
113+
.await
114+
.map_err(|e| AvailabilityError::RetrieveError(e.to_string()).into())
115+
}
82116
}
83117

84118
#[cfg(test)]
@@ -88,6 +122,7 @@ mod tests {
88122
use std::sync::Arc;
89123

90124
use crate::availability::entity::publish_ipfs_response::PublishIpfsResponse;
125+
use crate::availability::entity::publish_ipns_response::PublishIpnsResponse;
91126
use crate::availability::{self, entity::publish_hosted_response::PublishHostedResponse};
92127
use crate::record::document::Document;
93128
use crate::record::entity::record::Record;
@@ -217,4 +252,69 @@ mod tests {
217252
"Retrieved payload should match expected"
218253
)
219254
}
255+
256+
#[tokio::test]
257+
async fn ipns_publish_file() {
258+
let payload: Vec<u8> = vec![1, 2, 3, 4, 5];
259+
let response = PublishIpnsResponse {
260+
id: "bafzbeigkhrj52va6uud2eeavfnfsr7zgo6sf7wg6bq76iqf37c274q2dy4".to_owned(),
261+
};
262+
let key_id: String = "b012eaf2-e2ed-4196-8a68-172238852a5f".to_owned();
263+
264+
let mut http = MockClient::default();
265+
let url = format!("https://api.bloock.com/hosting/v1/ipns/upload?key={}", key_id);
266+
http.expect_post_file::<String, PublishIpnsResponse>()
267+
.with(
268+
eq(url.to_owned()),
269+
eq(vec![("payload".to_owned(), payload.to_vec())]),
270+
eq(vec![]),
271+
eq(None),
272+
eq(None),
273+
)
274+
.return_once(|_, _, _, _, _| Ok(response));
275+
276+
let service = availability::configure_test(Arc::new(http));
277+
278+
let record = Record::new(
279+
Document::new(
280+
&payload,
281+
service.config_service.get_api_base_url(),
282+
service.config_service.get_api_key(),
283+
)
284+
.unwrap(),
285+
);
286+
287+
let result = service.publish_ipns(record.unwrap(), key_id).await.unwrap();
288+
289+
assert_eq!(
290+
&result, "bafzbeigkhrj52va6uud2eeavfnfsr7zgo6sf7wg6bq76iqf37c274q2dy4",
291+
"Should not return an empty result"
292+
)
293+
}
294+
295+
#[tokio::test]
296+
async fn ipns_retrieve_file() {
297+
let payload = [1, 2, 3, 4, 5];
298+
let id = "bafzbeigkhrj52va6uud2eeavfnfsr7zgo6sf7wg6bq76iqf37c274q2dy4";
299+
300+
let mut http = MockClient::default();
301+
http.expect_get::<String>()
302+
.with(
303+
eq(format!("https://cdn.bloock.com/hosting/v1/ipns/{id}")),
304+
eq(None),
305+
)
306+
.return_once(move |_, _| Ok(payload.to_vec()));
307+
308+
let service = availability::configure_test(Arc::new(http));
309+
let result = service
310+
.retrieve_ipns("bafzbeigkhrj52va6uud2eeavfnfsr7zgo6sf7wg6bq76iqf37c274q2dy4".to_owned())
311+
.await
312+
.unwrap();
313+
314+
assert_eq!(
315+
payload,
316+
result.as_slice(),
317+
"Retrieved payload should match expected"
318+
)
319+
}
220320
}

0 commit comments

Comments
 (0)