koi-net 1.0.0b11__py3-none-any.whl → 1.0.0b12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of koi-net might be problematic. Click here for more details.

@@ -1,149 +1,149 @@
1
- import logging
2
- import httpx
3
- from rid_lib import RID
4
- from rid_lib.ext import Cache
5
- from rid_lib.types.koi_net_node import KoiNetNode
6
- from ..protocol.api_models import (
7
- RidsPayload,
8
- ManifestsPayload,
9
- BundlesPayload,
10
- EventsPayload,
11
- FetchRids,
12
- FetchManifests,
13
- FetchBundles,
14
- PollEvents,
15
- RequestModels,
16
- ResponseModels
17
- )
18
- from ..protocol.consts import (
19
- BROADCAST_EVENTS_PATH,
20
- POLL_EVENTS_PATH,
21
- FETCH_RIDS_PATH,
22
- FETCH_MANIFESTS_PATH,
23
- FETCH_BUNDLES_PATH
24
- )
25
- from ..protocol.node import NodeType
26
- from .graph import NetworkGraph
27
-
28
-
29
- logger = logging.getLogger(__name__)
30
-
31
-
32
- class RequestHandler:
33
- """Handles making requests to other KOI nodes."""
34
-
35
- cache: Cache
36
- graph: NetworkGraph
37
-
38
- def __init__(self, cache: Cache, graph: NetworkGraph):
39
- self.cache = cache
40
- self.graph = graph
41
-
42
- def make_request(
43
- self,
44
- url: str,
45
- request: RequestModels,
46
- response_model: type[ResponseModels] | None = None
47
- ) -> ResponseModels | None:
48
- logger.debug(f"Making request to {url}")
49
- resp = httpx.post(
50
- url=url,
51
- data=request.model_dump_json()
52
- )
53
- if response_model:
54
- return response_model.model_validate_json(resp.text)
55
-
56
- def get_url(self, node_rid: KoiNetNode, url: str) -> str:
57
- """Retrieves URL of a node, or returns provided URL."""
58
-
59
- if not node_rid and not url:
60
- raise ValueError("One of 'node_rid' and 'url' must be provided")
61
-
62
- if node_rid:
63
- node_profile = self.graph.get_node_profile(node_rid)
64
- if not node_profile:
65
- raise Exception("Node not found")
66
- if node_profile.node_type != NodeType.FULL:
67
- raise Exception("Can't query partial node")
68
- logger.debug(f"Resolved {node_rid!r} to {node_profile.base_url}")
69
- return node_profile.base_url
70
- else:
71
- return url
72
-
73
- def broadcast_events(
74
- self,
75
- node: RID = None,
76
- url: str = None,
77
- req: EventsPayload | None = None,
78
- **kwargs
79
- ) -> None:
80
- """See protocol.api_models.EventsPayload for available kwargs."""
81
- request = req or EventsPayload.model_validate(kwargs)
82
- self.make_request(
83
- self.get_url(node, url) + BROADCAST_EVENTS_PATH, request
84
- )
85
- logger.info(f"Broadcasted {len(request.events)} event(s) to {node or url!r}")
86
-
87
- def poll_events(
88
- self,
89
- node: RID = None,
90
- url: str = None,
91
- req: PollEvents | None = None,
92
- **kwargs
93
- ) -> EventsPayload:
94
- """See protocol.api_models.PollEvents for available kwargs."""
95
- request = req or PollEvents.model_validate(kwargs)
96
- resp = self.make_request(
97
- self.get_url(node, url) + POLL_EVENTS_PATH, request,
98
- response_model=EventsPayload
99
- )
100
- logger.info(f"Polled {len(resp.events)} events from {node or url!r}")
101
- return resp
102
-
103
- def fetch_rids(
104
- self,
105
- node: RID = None,
106
- url: str = None,
107
- req: FetchRids | None = None,
108
- **kwargs
109
- ) -> RidsPayload:
110
- """See protocol.api_models.FetchRids for available kwargs."""
111
- request = req or FetchRids.model_validate(kwargs)
112
- resp = self.make_request(
113
- self.get_url(node, url) + FETCH_RIDS_PATH, request,
114
- response_model=RidsPayload
115
- )
116
- logger.info(f"Fetched {len(resp.rids)} RID(s) from {node or url!r}")
117
- return resp
118
-
119
- def fetch_manifests(
120
- self,
121
- node: RID = None,
122
- url: str = None,
123
- req: FetchManifests | None = None,
124
- **kwargs
125
- ) -> ManifestsPayload:
126
- """See protocol.api_models.FetchManifests for available kwargs."""
127
- request = req or FetchManifests.model_validate(kwargs)
128
- resp = self.make_request(
129
- self.get_url(node, url) + FETCH_MANIFESTS_PATH, request,
130
- response_model=ManifestsPayload
131
- )
132
- logger.info(f"Fetched {len(resp.manifests)} manifest(s) from {node or url!r}")
133
- return resp
134
-
135
- def fetch_bundles(
136
- self,
137
- node: RID = None,
138
- url: str = None,
139
- req: FetchBundles | None = None,
140
- **kwargs
141
- ) -> BundlesPayload:
142
- """See protocol.api_models.FetchBundles for available kwargs."""
143
- request = req or FetchBundles.model_validate(kwargs)
144
- resp = self.make_request(
145
- self.get_url(node, url) + FETCH_BUNDLES_PATH, request,
146
- response_model=BundlesPayload
147
- )
148
- logger.info(f"Fetched {len(resp.bundles)} bundle(s) from {node or url!r}")
1
+ import logging
2
+ import httpx
3
+ from rid_lib import RID
4
+ from rid_lib.ext import Cache
5
+ from rid_lib.types.koi_net_node import KoiNetNode
6
+ from ..protocol.api_models import (
7
+ RidsPayload,
8
+ ManifestsPayload,
9
+ BundlesPayload,
10
+ EventsPayload,
11
+ FetchRids,
12
+ FetchManifests,
13
+ FetchBundles,
14
+ PollEvents,
15
+ RequestModels,
16
+ ResponseModels
17
+ )
18
+ from ..protocol.consts import (
19
+ BROADCAST_EVENTS_PATH,
20
+ POLL_EVENTS_PATH,
21
+ FETCH_RIDS_PATH,
22
+ FETCH_MANIFESTS_PATH,
23
+ FETCH_BUNDLES_PATH
24
+ )
25
+ from ..protocol.node import NodeType
26
+ from .graph import NetworkGraph
27
+
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+
32
+ class RequestHandler:
33
+ """Handles making requests to other KOI nodes."""
34
+
35
+ cache: Cache
36
+ graph: NetworkGraph
37
+
38
+ def __init__(self, cache: Cache, graph: NetworkGraph):
39
+ self.cache = cache
40
+ self.graph = graph
41
+
42
+ def make_request(
43
+ self,
44
+ url: str,
45
+ request: RequestModels,
46
+ response_model: type[ResponseModels] | None = None
47
+ ) -> ResponseModels | None:
48
+ logger.debug(f"Making request to {url}")
49
+ resp = httpx.post(
50
+ url=url,
51
+ data=request.model_dump_json()
52
+ )
53
+ if response_model:
54
+ return response_model.model_validate_json(resp.text)
55
+
56
+ def get_url(self, node_rid: KoiNetNode, url: str) -> str:
57
+ """Retrieves URL of a node, or returns provided URL."""
58
+
59
+ if not node_rid and not url:
60
+ raise ValueError("One of 'node_rid' and 'url' must be provided")
61
+
62
+ if node_rid:
63
+ node_profile = self.graph.get_node_profile(node_rid)
64
+ if not node_profile:
65
+ raise Exception("Node not found")
66
+ if node_profile.node_type != NodeType.FULL:
67
+ raise Exception("Can't query partial node")
68
+ logger.debug(f"Resolved {node_rid!r} to {node_profile.base_url}")
69
+ return node_profile.base_url
70
+ else:
71
+ return url
72
+
73
+ def broadcast_events(
74
+ self,
75
+ node: RID = None,
76
+ url: str = None,
77
+ req: EventsPayload | None = None,
78
+ **kwargs
79
+ ) -> None:
80
+ """See protocol.api_models.EventsPayload for available kwargs."""
81
+ request = req or EventsPayload.model_validate(kwargs)
82
+ self.make_request(
83
+ self.get_url(node, url) + BROADCAST_EVENTS_PATH, request
84
+ )
85
+ logger.info(f"Broadcasted {len(request.events)} event(s) to {node or url!r}")
86
+
87
+ def poll_events(
88
+ self,
89
+ node: RID = None,
90
+ url: str = None,
91
+ req: PollEvents | None = None,
92
+ **kwargs
93
+ ) -> EventsPayload:
94
+ """See protocol.api_models.PollEvents for available kwargs."""
95
+ request = req or PollEvents.model_validate(kwargs)
96
+ resp = self.make_request(
97
+ self.get_url(node, url) + POLL_EVENTS_PATH, request,
98
+ response_model=EventsPayload
99
+ )
100
+ logger.info(f"Polled {len(resp.events)} events from {node or url!r}")
101
+ return resp
102
+
103
+ def fetch_rids(
104
+ self,
105
+ node: RID = None,
106
+ url: str = None,
107
+ req: FetchRids | None = None,
108
+ **kwargs
109
+ ) -> RidsPayload:
110
+ """See protocol.api_models.FetchRids for available kwargs."""
111
+ request = req or FetchRids.model_validate(kwargs)
112
+ resp = self.make_request(
113
+ self.get_url(node, url) + FETCH_RIDS_PATH, request,
114
+ response_model=RidsPayload
115
+ )
116
+ logger.info(f"Fetched {len(resp.rids)} RID(s) from {node or url!r}")
117
+ return resp
118
+
119
+ def fetch_manifests(
120
+ self,
121
+ node: RID = None,
122
+ url: str = None,
123
+ req: FetchManifests | None = None,
124
+ **kwargs
125
+ ) -> ManifestsPayload:
126
+ """See protocol.api_models.FetchManifests for available kwargs."""
127
+ request = req or FetchManifests.model_validate(kwargs)
128
+ resp = self.make_request(
129
+ self.get_url(node, url) + FETCH_MANIFESTS_PATH, request,
130
+ response_model=ManifestsPayload
131
+ )
132
+ logger.info(f"Fetched {len(resp.manifests)} manifest(s) from {node or url!r}")
133
+ return resp
134
+
135
+ def fetch_bundles(
136
+ self,
137
+ node: RID = None,
138
+ url: str = None,
139
+ req: FetchBundles | None = None,
140
+ **kwargs
141
+ ) -> BundlesPayload:
142
+ """See protocol.api_models.FetchBundles for available kwargs."""
143
+ request = req or FetchBundles.model_validate(kwargs)
144
+ resp = self.make_request(
145
+ self.get_url(node, url) + FETCH_BUNDLES_PATH, request,
146
+ response_model=BundlesPayload
147
+ )
148
+ logger.info(f"Fetched {len(resp.bundles)} bundle(s) from {node or url!r}")
149
149
  return resp
@@ -1,59 +1,59 @@
1
- import logging
2
- from rid_lib import RID
3
- from rid_lib.ext import Manifest, Cache
4
- from rid_lib.ext.bundle import Bundle
5
- from ..protocol.api_models import (
6
- RidsPayload,
7
- ManifestsPayload,
8
- BundlesPayload,
9
- FetchRids,
10
- FetchManifests,
11
- FetchBundles,
12
- )
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
-
17
- class ResponseHandler:
18
- """Handles generating responses to requests from other KOI nodes."""
19
-
20
- cache: Cache
21
-
22
- def __init__(self, cache: Cache):
23
- self.cache = cache
24
-
25
- def fetch_rids(self, req: FetchRids) -> RidsPayload:
26
- logger.info(f"Request to fetch rids, allowed types {req.rid_types}")
27
- rids = self.cache.list_rids(req.rid_types)
28
-
29
- return RidsPayload(rids=rids)
30
-
31
- def fetch_manifests(self, req: FetchManifests) -> ManifestsPayload:
32
- logger.info(f"Request to fetch manifests, allowed types {req.rid_types}, rids {req.rids}")
33
-
34
- manifests: list[Manifest] = []
35
- not_found: list[RID] = []
36
-
37
- for rid in (req.rids or self.cache.list_rids(req.rid_types)):
38
- bundle = self.cache.read(rid)
39
- if bundle:
40
- manifests.append(bundle.manifest)
41
- else:
42
- not_found.append(rid)
43
-
44
- return ManifestsPayload(manifests=manifests, not_found=not_found)
45
-
46
- def fetch_bundles(self, req: FetchBundles) -> BundlesPayload:
47
- logger.info(f"Request to fetch bundles, requested rids {req.rids}")
48
-
49
- bundles: list[Bundle] = []
50
- not_found: list[RID] = []
51
-
52
- for rid in req.rids:
53
- bundle = self.cache.read(rid)
54
- if bundle:
55
- bundles.append(bundle)
56
- else:
57
- not_found.append(rid)
58
-
1
+ import logging
2
+ from rid_lib import RID
3
+ from rid_lib.ext import Manifest, Cache
4
+ from rid_lib.ext.bundle import Bundle
5
+ from ..protocol.api_models import (
6
+ RidsPayload,
7
+ ManifestsPayload,
8
+ BundlesPayload,
9
+ FetchRids,
10
+ FetchManifests,
11
+ FetchBundles,
12
+ )
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class ResponseHandler:
18
+ """Handles generating responses to requests from other KOI nodes."""
19
+
20
+ cache: Cache
21
+
22
+ def __init__(self, cache: Cache):
23
+ self.cache = cache
24
+
25
+ def fetch_rids(self, req: FetchRids) -> RidsPayload:
26
+ logger.info(f"Request to fetch rids, allowed types {req.rid_types}")
27
+ rids = self.cache.list_rids(req.rid_types)
28
+
29
+ return RidsPayload(rids=rids)
30
+
31
+ def fetch_manifests(self, req: FetchManifests) -> ManifestsPayload:
32
+ logger.info(f"Request to fetch manifests, allowed types {req.rid_types}, rids {req.rids}")
33
+
34
+ manifests: list[Manifest] = []
35
+ not_found: list[RID] = []
36
+
37
+ for rid in (req.rids or self.cache.list_rids(req.rid_types)):
38
+ bundle = self.cache.read(rid)
39
+ if bundle:
40
+ manifests.append(bundle.manifest)
41
+ else:
42
+ not_found.append(rid)
43
+
44
+ return ManifestsPayload(manifests=manifests, not_found=not_found)
45
+
46
+ def fetch_bundles(self, req: FetchBundles) -> BundlesPayload:
47
+ logger.info(f"Request to fetch bundles, requested rids {req.rids}")
48
+
49
+ bundles: list[Bundle] = []
50
+ not_found: list[RID] = []
51
+
52
+ for rid in req.rids:
53
+ bundle = self.cache.read(rid)
54
+ if bundle:
55
+ bundles.append(bundle)
56
+ else:
57
+ not_found.append(rid)
58
+
59
59
  return BundlesPayload(bundles=bundles, not_found=not_found)