koi-net 1.1.0b2__tar.gz → 1.1.0b3__tar.gz

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.

Files changed (43) hide show
  1. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/PKG-INFO +1 -1
  2. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/examples/partial.py +2 -2
  3. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/pyproject.toml +1 -1
  4. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/core.py +53 -35
  5. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/response_handler.py +4 -3
  6. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/poller.py +8 -6
  7. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/server.py +4 -4
  8. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/.github/workflows/publish-to-pypi.yml +0 -0
  9. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/.gitignore +0 -0
  10. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/LICENSE +0 -0
  11. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/README.md +0 -0
  12. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/examples/coordinator.py +0 -0
  13. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/requirements.txt +0 -0
  14. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/__init__.py +0 -0
  15. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/config.py +0 -0
  16. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/context.py +0 -0
  17. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/default_actions.py +0 -0
  18. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/effector.py +0 -0
  19. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/identity.py +0 -0
  20. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/lifecycle.py +0 -0
  21. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/__init__.py +0 -0
  22. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/behavior.py +0 -0
  23. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/error_handler.py +0 -0
  24. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/event_queue.py +0 -0
  25. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/graph.py +0 -0
  26. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/request_handler.py +0 -0
  27. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/network/resolver.py +0 -0
  28. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/__init__.py +0 -0
  29. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/default_handlers.py +0 -0
  30. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/handler.py +0 -0
  31. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/interface.py +0 -0
  32. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/knowledge_object.py +0 -0
  33. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/processor/knowledge_pipeline.py +0 -0
  34. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/__init__.py +0 -0
  35. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/api_models.py +0 -0
  36. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/consts.py +0 -0
  37. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/edge.py +0 -0
  38. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/envelope.py +0 -0
  39. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/errors.py +0 -0
  40. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/event.py +0 -0
  41. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/node.py +0 -0
  42. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/protocol/secure.py +0 -0
  43. {koi_net-1.1.0b2 → koi_net-1.1.0b3}/src/koi_net/secure.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: koi-net
3
- Version: 1.1.0b2
3
+ Version: 1.1.0b3
4
4
  Summary: Implementation of KOI-net protocol in Python
5
5
  Project-URL: Homepage, https://github.com/BlockScience/koi-net/
6
6
  Author-email: Luke Miller <luke@block.science>
@@ -17,7 +17,7 @@ logger = logging.getLogger(__name__)
17
17
 
18
18
 
19
19
  class PartialNodeConfig(NodeConfig):
20
- koi_net: KoiNetConfig | None = Field(default_factory = lambda:
20
+ koi_net: KoiNetConfig = Field(default_factory = lambda:
21
21
  KoiNetConfig(
22
22
  node_name="partial",
23
23
  node_profile=NodeProfile(
@@ -34,4 +34,4 @@ node = NodeInterface(
34
34
  )
35
35
 
36
36
  if __name__ == "__main__":
37
- node.poller.run()
37
+ node.lifecycle.start()
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "koi-net"
7
- version = "1.1.0-beta.2"
7
+ version = "1.1.0-beta.3"
8
8
  description = "Implementation of KOI-net protocol in Python"
9
9
  authors = [
10
10
  {name = "Luke Miller", email = "luke@block.science"}
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from koi_net.protocol.node import NodeType
2
+ from typing import Generic, TypeVar
3
3
  from rid_lib.ext import Cache
4
4
  from .network.resolver import NetworkResolver
5
5
  from .network.event_queue import NetworkEventQueue
@@ -25,9 +25,10 @@ from . import default_actions
25
25
  logger = logging.getLogger(__name__)
26
26
 
27
27
 
28
+ T = TypeVar("T", bound=NodeConfig)
28
29
 
29
- class NodeInterface:
30
- config: NodeConfig
30
+ class NodeInterface(Generic[T]):
31
+ config: T
31
32
  cache: Cache
32
33
  identity: NodeIdentity
33
34
  resolver: NetworkResolver
@@ -41,58 +42,75 @@ class NodeInterface:
41
42
 
42
43
  def __init__(
43
44
  self,
44
- config: NodeConfig,
45
+ config: T,
45
46
  use_kobj_processor_thread: bool = False,
46
47
  handlers: list[KnowledgeHandler] | None = None,
47
- cache: Cache | None = None,
48
- processor: ProcessorInterface | None = None
48
+
49
+ CacheOverride: type[Cache] | None = None,
50
+ NodeIdentityOverride: type[NodeIdentity] | None = None,
51
+ EffectorOverride: type[Effector] | None = None,
52
+ NetworkGraphOverride: type[NetworkGraph] | None = None,
53
+ SecureOverride: type[Secure] | None = None,
54
+ RequestHandlerOverride: type[RequestHandler] | None = None,
55
+ ResponseHandlerOverride: type[ResponseHandler] | None = None,
56
+ NetworkResolverOverride: type[NetworkResolver] | None = None,
57
+ NetworkEventQueueOverride: type[NetworkEventQueue] | None = None,
58
+ ActorOverride: type[Actor] | None = None,
59
+ ActionContextOverride: type[ActionContext] | None = None,
60
+ HandlerContextOverride: type[HandlerContext] | None = None,
61
+ KnowledgePipelineOverride: type[KnowledgePipeline] | None = None,
62
+ ProcessorInterfaceOverride: type[ProcessorInterface] | None = None,
63
+ ErrorHandlerOverride: type[ErrorHandler] | None = None,
64
+ NodeLifecycleOverride: type[NodeLifecycle] | None = None,
65
+ NodeServerOverride: type[NodeServer] | None = None,
66
+ NodePollerOverride: type[NodePoller] | None = None,
49
67
  ):
50
68
  self.config = config
51
- self.cache = cache or Cache(
69
+ self.cache = (CacheOverride or Cache)(
52
70
  directory_path=self.config.koi_net.cache_directory_path
53
71
  )
54
72
 
55
- self.identity = NodeIdentity(config=self.config)
56
- self.effector = Effector(cache=self.cache)
73
+ self.identity = (NodeIdentityOverride or NodeIdentity)(config=self.config)
74
+ self.effector = (EffectorOverride or Effector)(cache=self.cache)
57
75
 
58
- self.graph = NetworkGraph(
59
- cache=self.cache,
76
+ self.graph = (NetworkGraphOverride or NetworkGraph)(
77
+ cache=self.cache,
60
78
  identity=self.identity
61
79
  )
62
-
63
- self.secure = Secure(
64
- identity=self.identity,
65
- effector=self.effector,
80
+
81
+ self.secure = (SecureOverride or Secure)(
82
+ identity=self.identity,
83
+ effector=self.effector,
66
84
  config=self.config
67
85
  )
68
-
69
- self.request_handler = RequestHandler(
70
- effector=self.effector,
86
+
87
+ self.request_handler = (RequestHandlerOverride or RequestHandler)(
88
+ effector=self.effector,
71
89
  identity=self.identity,
72
90
  secure=self.secure
73
91
  )
74
-
75
- self.response_handler = ResponseHandler(self.cache, self.effector)
76
-
77
- self.resolver = NetworkResolver(
92
+
93
+ self.response_handler = (ResponseHandlerOverride or ResponseHandler)(self.cache, self.effector)
94
+
95
+ self.resolver = (NetworkResolverOverride or NetworkResolver)(
78
96
  config=self.config,
79
- cache=self.cache,
97
+ cache=self.cache,
80
98
  identity=self.identity,
81
99
  graph=self.graph,
82
100
  request_handler=self.request_handler,
83
101
  effector=self.effector
84
102
  )
85
-
86
- self.event_queue = NetworkEventQueue(
103
+
104
+ self.event_queue = (NetworkEventQueueOverride or NetworkEventQueue)(
87
105
  config=self.config,
88
- cache=self.cache,
106
+ cache=self.cache,
89
107
  identity=self.identity,
90
108
  graph=self.graph,
91
109
  request_handler=self.request_handler,
92
110
  effector=self.effector
93
111
  )
94
112
 
95
- self.actor = Actor(
113
+ self.actor = (ActorOverride or Actor)(
96
114
  identity=self.identity,
97
115
  effector=self.effector,
98
116
  event_queue=self.event_queue
@@ -107,12 +125,12 @@ class NodeInterface:
107
125
 
108
126
  self.use_kobj_processor_thread = use_kobj_processor_thread
109
127
 
110
- self.action_context = ActionContext(
128
+ self.action_context = (ActionContextOverride or ActionContext)(
111
129
  identity=self.identity,
112
130
  effector=self.effector
113
131
  )
114
132
 
115
- self.handler_context = HandlerContext(
133
+ self.handler_context = (HandlerContextOverride or HandlerContext)(
116
134
  identity=self.identity,
117
135
  cache=self.cache,
118
136
  event_queue=self.event_queue,
@@ -121,7 +139,7 @@ class NodeInterface:
121
139
  effector=self.effector
122
140
  )
123
141
 
124
- self.pipeline = KnowledgePipeline(
142
+ self.pipeline = (KnowledgePipelineOverride or KnowledgePipeline)(
125
143
  handler_context=self.handler_context,
126
144
  cache=self.cache,
127
145
  request_handler=self.request_handler,
@@ -130,12 +148,12 @@ class NodeInterface:
130
148
  default_handlers=handlers
131
149
  )
132
150
 
133
- self.processor = processor or ProcessorInterface(
151
+ self.processor = (ProcessorInterfaceOverride or ProcessorInterface)(
134
152
  pipeline=self.pipeline,
135
153
  use_kobj_processor_thread=self.use_kobj_processor_thread
136
154
  )
137
155
 
138
- self.error_handler = ErrorHandler(
156
+ self.error_handler = (ErrorHandlerOverride or ErrorHandler)(
139
157
  processor=self.processor,
140
158
  actor=self.actor
141
159
  )
@@ -148,7 +166,7 @@ class NodeInterface:
148
166
  self.effector.set_resolver(self.resolver)
149
167
  self.effector.set_action_context(self.action_context)
150
168
 
151
- self.lifecycle = NodeLifecycle(
169
+ self.lifecycle = (NodeLifecycleOverride or NodeLifecycle)(
152
170
  config=self.config,
153
171
  identity=self.identity,
154
172
  graph=self.graph,
@@ -159,7 +177,7 @@ class NodeInterface:
159
177
  )
160
178
 
161
179
  # if self.config.koi_net.node_profile.node_type == NodeType.FULL:
162
- self.server = NodeServer(
180
+ self.server = (NodeServerOverride or NodeServer)(
163
181
  config=self.config,
164
182
  lifecycle=self.lifecycle,
165
183
  secure=self.secure,
@@ -168,7 +186,7 @@ class NodeInterface:
168
186
  response_handler=self.response_handler
169
187
  )
170
188
 
171
- self.poller = NodePoller(
189
+ self.poller = (NodePollerOverride or NodePoller)(
172
190
  processor=self.processor,
173
191
  lifecycle=self.lifecycle,
174
192
  resolver=self.resolver,
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from rid_lib import RID
3
+ from rid_lib.types import KoiNetNode
3
4
  from rid_lib.ext import Manifest, Cache
4
5
  from rid_lib.ext.bundle import Bundle
5
6
 
@@ -30,13 +31,13 @@ class ResponseHandler:
30
31
  self.cache = cache
31
32
  self.effector = effector
32
33
 
33
- def fetch_rids(self, req: FetchRids) -> RidsPayload:
34
+ def fetch_rids(self, req: FetchRids, source: KoiNetNode) -> RidsPayload:
34
35
  logger.info(f"Request to fetch rids, allowed types {req.rid_types}")
35
36
  rids = self.cache.list_rids(req.rid_types)
36
37
 
37
38
  return RidsPayload(rids=rids)
38
39
 
39
- def fetch_manifests(self, req: FetchManifests) -> ManifestsPayload:
40
+ def fetch_manifests(self, req: FetchManifests, source: KoiNetNode) -> ManifestsPayload:
40
41
  logger.info(f"Request to fetch manifests, allowed types {req.rid_types}, rids {req.rids}")
41
42
 
42
43
  manifests: list[Manifest] = []
@@ -51,7 +52,7 @@ class ResponseHandler:
51
52
 
52
53
  return ManifestsPayload(manifests=manifests, not_found=not_found)
53
54
 
54
- def fetch_bundles(self, req: FetchBundles) -> BundlesPayload:
55
+ def fetch_bundles(self, req: FetchBundles, source: KoiNetNode) -> BundlesPayload:
55
56
  logger.info(f"Request to fetch bundles, requested rids {req.rids}")
56
57
 
57
58
  bundles: list[Bundle] = []
@@ -22,17 +22,19 @@ class NodePoller:
22
22
  self.resolver = resolver
23
23
  self.config = config
24
24
 
25
+ def poll(self):
26
+ neighbors = self.resolver.poll_neighbors()
27
+ for node_rid in neighbors:
28
+ for event in neighbors[node_rid]:
29
+ self.processor.handle(event=event, source=node_rid)
30
+ self.processor.flush_kobj_queue()
31
+
25
32
  def run(self):
26
33
  try:
27
34
  self.lifecycle.start()
28
35
  while True:
29
36
  start_time = time.time()
30
- neighbors = self.resolver.poll_neighbors()
31
- for node_rid in neighbors:
32
- for event in neighbors[node_rid]:
33
- self.processor.handle(event=event, source=node_rid)
34
- self.processor.flush_kobj_queue()
35
-
37
+ self.poll()
36
38
  elapsed = time.time() - start_time
37
39
  sleep_time = self.config.koi_net.polling_interval - elapsed
38
40
  if sleep_time > 0:
@@ -109,20 +109,20 @@ class NodeServer:
109
109
  self, req: SignedEnvelope[PollEvents]
110
110
  ) -> SignedEnvelope[EventsPayload] | ErrorResponse:
111
111
  logger.info(f"Request to {POLL_EVENTS_PATH}")
112
- events = self.event_queue.flush_poll_queue(req.payload.rid)
112
+ events = self.event_queue.flush_poll_queue(req.source_node)
113
113
  return EventsPayload(events=events)
114
114
 
115
115
  async def fetch_rids(
116
116
  self, req: SignedEnvelope[FetchRids]
117
117
  ) -> SignedEnvelope[RidsPayload] | ErrorResponse:
118
- return self.response_handler.fetch_rids(req.payload)
118
+ return self.response_handler.fetch_rids(req.payload, req.source_node)
119
119
 
120
120
  async def fetch_manifests(
121
121
  self, req: SignedEnvelope[FetchManifests]
122
122
  ) -> SignedEnvelope[ManifestsPayload] | ErrorResponse:
123
- return self.response_handler.fetch_manifests(req.payload)
123
+ return self.response_handler.fetch_manifests(req.payload, req.source_node)
124
124
 
125
125
  async def fetch_bundles(
126
126
  self, req: SignedEnvelope[FetchBundles]
127
127
  ) -> SignedEnvelope[BundlesPayload] | ErrorResponse:
128
- return self.response_handler.fetch_bundles(req.payload)
128
+ return self.response_handler.fetch_bundles(req.payload, req.source_node)
File without changes
File without changes
File without changes
File without changes