koi-net 1.0.0b11__py3-none-any.whl → 1.0.0b13__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.
- koi_net/config.py +95 -0
- koi_net/core.py +125 -125
- koi_net/identity.py +41 -69
- koi_net/network/graph.py +127 -127
- koi_net/network/interface.py +275 -275
- koi_net/network/request_handler.py +148 -148
- koi_net/network/response_handler.py +58 -58
- koi_net/processor/default_handlers.py +162 -162
- koi_net/processor/handler.py +59 -59
- koi_net/processor/interface.py +302 -298
- koi_net/processor/knowledge_object.py +122 -122
- koi_net/protocol/api_models.py +46 -46
- koi_net/protocol/consts.py +6 -6
- koi_net/protocol/edge.py +20 -20
- koi_net/protocol/event.py +50 -50
- koi_net/protocol/helpers.py +24 -24
- koi_net/protocol/node.py +16 -16
- {koi_net-1.0.0b11.dist-info → koi_net-1.0.0b13.dist-info}/METADATA +1 -1
- koi_net-1.0.0b13.dist-info/RECORD +25 -0
- {koi_net-1.0.0b11.dist-info → koi_net-1.0.0b13.dist-info}/licenses/LICENSE +21 -21
- koi_net-1.0.0b11.dist-info/RECORD +0 -24
- {koi_net-1.0.0b11.dist-info → koi_net-1.0.0b13.dist-info}/WHEEL +0 -0
|
@@ -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)
|