koi-net 1.1.0b8__py3-none-any.whl → 1.2.0b1__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/__init__.py +1 -1
- koi_net/behaviors.py +51 -0
- koi_net/cli/__init__.py +1 -0
- koi_net/cli/commands.py +99 -0
- koi_net/cli/models.py +41 -0
- koi_net/config.py +34 -0
- koi_net/context.py +12 -21
- koi_net/core.py +209 -170
- koi_net/default_actions.py +10 -1
- koi_net/effector.py +39 -24
- koi_net/handshaker.py +39 -0
- koi_net/kobj_worker.py +45 -0
- koi_net/lifecycle.py +67 -38
- koi_net/models.py +14 -0
- koi_net/network/error_handler.py +12 -10
- koi_net/network/event_queue.py +14 -184
- koi_net/network/graph.py +7 -2
- koi_net/network/request_handler.py +31 -19
- koi_net/network/resolver.py +5 -8
- koi_net/network/response_handler.py +5 -6
- koi_net/poll_event_buffer.py +17 -0
- koi_net/poller.py +12 -5
- koi_net/processor/default_handlers.py +84 -35
- koi_net/processor/event_worker.py +121 -0
- koi_net/processor/handler.py +4 -2
- koi_net/processor/knowledge_object.py +19 -7
- koi_net/processor/knowledge_pipeline.py +7 -26
- koi_net/processor/kobj_queue.py +51 -0
- koi_net/protocol/api_models.py +3 -2
- koi_net/protocol/node.py +3 -3
- koi_net/secure.py +28 -8
- koi_net/server.py +25 -9
- koi_net/utils.py +18 -0
- koi_net/worker.py +10 -0
- {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/METADATA +7 -3
- koi_net-1.2.0b1.dist-info/RECORD +49 -0
- koi_net-1.2.0b1.dist-info/entry_points.txt +2 -0
- koi_net/actor.py +0 -60
- koi_net/processor/interface.py +0 -101
- koi_net-1.1.0b8.dist-info/RECORD +0 -38
- {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/WHEEL +0 -0
- {koi_net-1.1.0b8.dist-info → koi_net-1.2.0b1.dist-info}/licenses/LICENSE +0 -0
koi_net/core.py
CHANGED
|
@@ -1,194 +1,233 @@
|
|
|
1
|
-
import
|
|
2
|
-
from typing import Generic, TypeVar
|
|
1
|
+
from dataclasses import dataclass
|
|
3
2
|
from rid_lib.ext import Cache
|
|
4
|
-
from .
|
|
5
|
-
from .
|
|
6
|
-
from .
|
|
7
|
-
from .
|
|
8
|
-
from .
|
|
9
|
-
from .
|
|
10
|
-
from .
|
|
11
|
-
from .
|
|
12
|
-
from .
|
|
13
|
-
from .
|
|
14
|
-
from .
|
|
15
|
-
from .
|
|
16
|
-
from .
|
|
17
|
-
from .
|
|
18
|
-
from .
|
|
19
|
-
from .
|
|
20
|
-
from .
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
3
|
+
from koi_net.behaviors import Behaviors
|
|
4
|
+
from koi_net.config import NodeConfig
|
|
5
|
+
from koi_net.context import ActionContext, HandlerContext
|
|
6
|
+
from koi_net.effector import Effector
|
|
7
|
+
from koi_net.handshaker import Handshaker
|
|
8
|
+
from koi_net.identity import NodeIdentity
|
|
9
|
+
from koi_net.kobj_worker import KnowledgeProcessingWorker
|
|
10
|
+
from koi_net.lifecycle import NodeLifecycle
|
|
11
|
+
from koi_net.network.error_handler import ErrorHandler
|
|
12
|
+
from koi_net.network.event_queue import EventQueue
|
|
13
|
+
from koi_net.network.graph import NetworkGraph
|
|
14
|
+
from koi_net.network.request_handler import RequestHandler
|
|
15
|
+
from koi_net.network.resolver import NetworkResolver
|
|
16
|
+
from koi_net.network.response_handler import ResponseHandler
|
|
17
|
+
from koi_net.poll_event_buffer import PollEventBuffer
|
|
18
|
+
from koi_net.poller import NodePoller
|
|
19
|
+
from koi_net.processor.default_handlers import (
|
|
20
|
+
basic_manifest_handler,
|
|
21
|
+
basic_network_output_filter,
|
|
22
|
+
basic_rid_handler,
|
|
23
|
+
node_contact_handler,
|
|
24
|
+
edge_negotiation_handler,
|
|
25
|
+
forget_edge_on_node_deletion,
|
|
26
|
+
secure_profile_handler
|
|
27
|
+
)
|
|
28
|
+
from koi_net.processor.event_worker import EventProcessingWorker
|
|
29
|
+
from koi_net.processor.knowledge_pipeline import KnowledgePipeline
|
|
30
|
+
from koi_net.processor.kobj_queue import KobjQueue
|
|
31
|
+
from koi_net.secure import Secure
|
|
32
|
+
from koi_net.server import NodeServer
|
|
24
33
|
|
|
25
|
-
logger = logging.getLogger(__name__)
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
35
|
+
@dataclass
|
|
36
|
+
class NodeContainer:
|
|
37
|
+
poll_event_buf: PollEventBuffer
|
|
38
|
+
kobj_queue: KobjQueue
|
|
39
|
+
event_queue: EventQueue
|
|
40
|
+
config: NodeConfig
|
|
32
41
|
cache: Cache
|
|
33
42
|
identity: NodeIdentity
|
|
34
|
-
resolver: NetworkResolver
|
|
35
|
-
event_queue: NetworkEventQueue
|
|
36
43
|
graph: NetworkGraph
|
|
37
|
-
processor: ProcessorInterface
|
|
38
44
|
secure: Secure
|
|
45
|
+
request_handler: RequestHandler
|
|
46
|
+
response_handler: ResponseHandler
|
|
47
|
+
resolver: NetworkResolver
|
|
48
|
+
handler_context: HandlerContext
|
|
49
|
+
behaviors: Behaviors
|
|
50
|
+
pipeline: KnowledgePipeline
|
|
51
|
+
kobj_worker: KnowledgeProcessingWorker
|
|
52
|
+
event_worker: EventProcessingWorker
|
|
53
|
+
error_handler: ErrorHandler
|
|
54
|
+
lifecycle: NodeLifecycle
|
|
39
55
|
server: NodeServer
|
|
56
|
+
poller: NodePoller
|
|
40
57
|
|
|
41
|
-
|
|
58
|
+
|
|
59
|
+
class NodeAssembler:
|
|
60
|
+
poll_event_buf = PollEventBuffer
|
|
61
|
+
kobj_queue = KobjQueue
|
|
62
|
+
event_queue = EventQueue
|
|
63
|
+
config = NodeConfig
|
|
64
|
+
cache = Cache
|
|
65
|
+
identity = NodeIdentity
|
|
66
|
+
graph = NetworkGraph
|
|
67
|
+
secure = Secure
|
|
68
|
+
handshaker = Handshaker
|
|
69
|
+
request_handler = RequestHandler
|
|
70
|
+
response_handler = ResponseHandler
|
|
71
|
+
resolver = NetworkResolver
|
|
72
|
+
knowledge_handlers = [
|
|
73
|
+
basic_rid_handler,
|
|
74
|
+
basic_manifest_handler,
|
|
75
|
+
secure_profile_handler,
|
|
76
|
+
edge_negotiation_handler,
|
|
77
|
+
node_contact_handler,
|
|
78
|
+
basic_network_output_filter,
|
|
79
|
+
forget_edge_on_node_deletion
|
|
80
|
+
]
|
|
81
|
+
handler_context = HandlerContext
|
|
82
|
+
action_context = ActionContext
|
|
83
|
+
effector = Effector
|
|
84
|
+
behaviors = Behaviors
|
|
85
|
+
pipeline = KnowledgePipeline
|
|
86
|
+
kobj_worker = KnowledgeProcessingWorker
|
|
87
|
+
event_worker = EventProcessingWorker
|
|
88
|
+
error_handler = ErrorHandler
|
|
89
|
+
lifecycle = NodeLifecycle
|
|
90
|
+
server = NodeServer
|
|
91
|
+
poller = NodePoller
|
|
42
92
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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,
|
|
67
|
-
):
|
|
68
|
-
self.config = config
|
|
69
|
-
self.cache = (CacheOverride or Cache)(
|
|
70
|
-
directory_path=self.config.koi_net.cache_directory_path
|
|
93
|
+
@classmethod
|
|
94
|
+
def create(cls) -> NodeContainer:
|
|
95
|
+
poll_event_buffer = cls.poll_event_buf()
|
|
96
|
+
kobj_queue = cls.kobj_queue()
|
|
97
|
+
event_queue = cls.event_queue()
|
|
98
|
+
config = cls.config.load_from_yaml()
|
|
99
|
+
cache = cls.cache(
|
|
100
|
+
directory_path=config.koi_net.cache_directory_path
|
|
71
101
|
)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
self.effector = (EffectorOverride or Effector)(cache=self.cache)
|
|
75
|
-
|
|
76
|
-
self.graph = (NetworkGraphOverride or NetworkGraph)(
|
|
77
|
-
cache=self.cache,
|
|
78
|
-
identity=self.identity
|
|
102
|
+
identity = cls.identity(
|
|
103
|
+
config=config
|
|
79
104
|
)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
identity=
|
|
83
|
-
effector=self.effector,
|
|
84
|
-
config=self.config
|
|
105
|
+
graph = cls.graph(
|
|
106
|
+
cache=cache,
|
|
107
|
+
identity=identity
|
|
85
108
|
)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
secure=self.secure
|
|
109
|
+
secure = cls.secure(
|
|
110
|
+
identity=identity,
|
|
111
|
+
cache=cache,
|
|
112
|
+
config=config
|
|
91
113
|
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
config=self.config,
|
|
97
|
-
cache=self.cache,
|
|
98
|
-
identity=self.identity,
|
|
99
|
-
graph=self.graph,
|
|
100
|
-
request_handler=self.request_handler,
|
|
101
|
-
effector=self.effector
|
|
114
|
+
handshaker = cls.handshaker(
|
|
115
|
+
cache=cache,
|
|
116
|
+
identity=identity,
|
|
117
|
+
event_queue=event_queue
|
|
102
118
|
)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
cache=self.cache,
|
|
107
|
-
identity=self.identity,
|
|
108
|
-
graph=self.graph,
|
|
109
|
-
request_handler=self.request_handler,
|
|
110
|
-
effector=self.effector
|
|
119
|
+
error_handler = cls.error_handler(
|
|
120
|
+
kobj_queue=kobj_queue,
|
|
121
|
+
handshaker=handshaker
|
|
111
122
|
)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
handlers = [
|
|
118
|
-
obj for obj in vars(default_handlers).values()
|
|
119
|
-
if isinstance(obj, KnowledgeHandler)
|
|
120
|
-
]
|
|
121
|
-
|
|
122
|
-
self.use_kobj_processor_thread = use_kobj_processor_thread
|
|
123
|
-
|
|
124
|
-
self.action_context = (ActionContextOverride or ActionContext)(
|
|
125
|
-
identity=self.identity,
|
|
126
|
-
effector=self.effector
|
|
123
|
+
request_handler = cls.request_handler(
|
|
124
|
+
cache=cache,
|
|
125
|
+
identity=identity,
|
|
126
|
+
secure=secure,
|
|
127
|
+
error_handler=error_handler
|
|
127
128
|
)
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
identity=self.identity,
|
|
131
|
-
config=self.config,
|
|
132
|
-
cache=self.cache,
|
|
133
|
-
event_queue=self.event_queue,
|
|
134
|
-
graph=self.graph,
|
|
135
|
-
request_handler=self.request_handler,
|
|
136
|
-
resolver=self.resolver,
|
|
137
|
-
effector=self.effector
|
|
129
|
+
response_handler = cls.response_handler(
|
|
130
|
+
cache=cache
|
|
138
131
|
)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
graph=self.graph,
|
|
146
|
-
default_handlers=handlers
|
|
132
|
+
resolver = cls.resolver(
|
|
133
|
+
config=config,
|
|
134
|
+
cache=cache,
|
|
135
|
+
identity=identity,
|
|
136
|
+
graph=graph,
|
|
137
|
+
request_handler=request_handler
|
|
147
138
|
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
139
|
+
handler_context = cls.handler_context(
|
|
140
|
+
identity=identity,
|
|
141
|
+
config=config,
|
|
142
|
+
cache=cache,
|
|
143
|
+
event_queue=event_queue,
|
|
144
|
+
kobj_queue=kobj_queue,
|
|
145
|
+
graph=graph,
|
|
146
|
+
request_handler=request_handler,
|
|
147
|
+
resolver=resolver
|
|
152
148
|
)
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
processor=self.processor,
|
|
156
|
-
actor=self.actor
|
|
149
|
+
action_context = cls.action_context(
|
|
150
|
+
identity=identity
|
|
157
151
|
)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
self.effector.set_processor(self.processor)
|
|
164
|
-
self.effector.set_resolver(self.resolver)
|
|
165
|
-
self.effector.set_action_context(self.action_context)
|
|
166
|
-
|
|
167
|
-
self.actor.set_ctx(self.handler_context)
|
|
168
|
-
|
|
169
|
-
self.lifecycle = (NodeLifecycleOverride or NodeLifecycle)(
|
|
170
|
-
config=self.config,
|
|
171
|
-
identity=self.identity,
|
|
172
|
-
graph=self.graph,
|
|
173
|
-
processor=self.processor,
|
|
174
|
-
effector=self.effector,
|
|
175
|
-
actor=self.actor,
|
|
176
|
-
use_kobj_processor_thread=use_kobj_processor_thread
|
|
152
|
+
effector = cls.effector(
|
|
153
|
+
cache=cache,
|
|
154
|
+
resolver=resolver,
|
|
155
|
+
kobj_queue=kobj_queue,
|
|
156
|
+
action_context=action_context
|
|
177
157
|
)
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
event_queue=self.event_queue,
|
|
186
|
-
response_handler=self.response_handler
|
|
158
|
+
behaviors = cls.behaviors(
|
|
159
|
+
cache=cache,
|
|
160
|
+
identity=identity,
|
|
161
|
+
event_queue=event_queue,
|
|
162
|
+
resolver=resolver,
|
|
163
|
+
request_handler=request_handler,
|
|
164
|
+
kobj_queue=kobj_queue
|
|
187
165
|
)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
166
|
+
pipeline = cls.pipeline(
|
|
167
|
+
handler_context=handler_context,
|
|
168
|
+
cache=cache,
|
|
169
|
+
request_handler=request_handler,
|
|
170
|
+
event_queue=event_queue,
|
|
171
|
+
graph=graph,
|
|
172
|
+
knowledge_handlers=cls.knowledge_handlers
|
|
173
|
+
)
|
|
174
|
+
kobj_worker = cls.kobj_worker(
|
|
175
|
+
kobj_queue=kobj_queue,
|
|
176
|
+
pipeline=pipeline
|
|
177
|
+
)
|
|
178
|
+
event_worker = cls.event_worker(
|
|
179
|
+
config=config,
|
|
180
|
+
cache=cache,
|
|
181
|
+
event_queue=event_queue,
|
|
182
|
+
request_handler=request_handler,
|
|
183
|
+
poll_event_buf=poll_event_buffer
|
|
194
184
|
)
|
|
185
|
+
lifecycle = cls.lifecycle(
|
|
186
|
+
config=config,
|
|
187
|
+
identity=identity,
|
|
188
|
+
graph=graph,
|
|
189
|
+
kobj_queue=kobj_queue,
|
|
190
|
+
kobj_worker=kobj_worker,
|
|
191
|
+
event_queue=event_queue,
|
|
192
|
+
event_worker=event_worker,
|
|
193
|
+
cache=cache,
|
|
194
|
+
handshaker=handshaker,
|
|
195
|
+
behaviors=behaviors
|
|
196
|
+
)
|
|
197
|
+
server = cls.server(
|
|
198
|
+
config=config,
|
|
199
|
+
lifecycle=lifecycle,
|
|
200
|
+
secure=secure,
|
|
201
|
+
kobj_queue=kobj_queue,
|
|
202
|
+
response_handler=response_handler,
|
|
203
|
+
poll_event_buf=poll_event_buffer
|
|
204
|
+
)
|
|
205
|
+
poller = cls.poller(
|
|
206
|
+
kobj_queue=kobj_queue,
|
|
207
|
+
lifecycle=lifecycle,
|
|
208
|
+
resolver=resolver,
|
|
209
|
+
config=config
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
return NodeContainer(
|
|
213
|
+
poll_event_buf=poll_event_buffer,
|
|
214
|
+
kobj_queue=kobj_queue,
|
|
215
|
+
event_queue=event_queue,
|
|
216
|
+
config=config,
|
|
217
|
+
cache=cache,
|
|
218
|
+
identity=identity,
|
|
219
|
+
graph=graph,
|
|
220
|
+
secure=secure,
|
|
221
|
+
request_handler=request_handler,
|
|
222
|
+
response_handler=response_handler,
|
|
223
|
+
resolver=resolver,
|
|
224
|
+
handler_context=handler_context,
|
|
225
|
+
behaviors=behaviors,
|
|
226
|
+
pipeline=pipeline,
|
|
227
|
+
kobj_worker=kobj_worker,
|
|
228
|
+
event_worker=event_worker,
|
|
229
|
+
error_handler=error_handler,
|
|
230
|
+
lifecycle=lifecycle,
|
|
231
|
+
server=server,
|
|
232
|
+
poller=poller
|
|
233
|
+
)
|
koi_net/default_actions.py
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
"""Implementations of default dereference actions."""
|
|
2
|
+
|
|
1
3
|
from .context import ActionContext
|
|
2
4
|
from rid_lib.types import KoiNetNode
|
|
3
5
|
from rid_lib.ext import Bundle
|
|
@@ -5,7 +7,14 @@ from .effector import Effector
|
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
@Effector.register_default_action(KoiNetNode)
|
|
8
|
-
def dereference_koi_node(
|
|
10
|
+
def dereference_koi_node(
|
|
11
|
+
ctx: ActionContext, rid: KoiNetNode
|
|
12
|
+
) -> Bundle | None:
|
|
13
|
+
"""Dereference function for this KOI node.
|
|
14
|
+
|
|
15
|
+
Generates a bundle from this node's profile data in the config.
|
|
16
|
+
"""
|
|
17
|
+
|
|
9
18
|
if rid != ctx.identity.rid:
|
|
10
19
|
return
|
|
11
20
|
|
koi_net/effector.py
CHANGED
|
@@ -4,13 +4,9 @@ from enum import StrEnum
|
|
|
4
4
|
from rid_lib.ext import Cache, Bundle
|
|
5
5
|
from rid_lib.core import RID, RIDType
|
|
6
6
|
from rid_lib.types import KoiNetNode
|
|
7
|
-
|
|
8
|
-
from
|
|
9
|
-
|
|
10
|
-
if TYPE_CHECKING:
|
|
11
|
-
from .network.resolver import NetworkResolver
|
|
12
|
-
from .processor.interface import ProcessorInterface
|
|
13
|
-
from .context import ActionContext
|
|
7
|
+
from .network.resolver import NetworkResolver
|
|
8
|
+
from .processor.kobj_queue import KobjQueue
|
|
9
|
+
from .context import ActionContext
|
|
14
10
|
|
|
15
11
|
logger = logging.getLogger(__name__)
|
|
16
12
|
|
|
@@ -20,14 +16,16 @@ class BundleSource(StrEnum):
|
|
|
20
16
|
ACTION = "ACTION"
|
|
21
17
|
|
|
22
18
|
class Effector:
|
|
19
|
+
"""Subsystem for dereferencing RIDs."""
|
|
20
|
+
|
|
23
21
|
cache: Cache
|
|
24
|
-
resolver:
|
|
25
|
-
|
|
26
|
-
action_context:
|
|
22
|
+
resolver: NetworkResolver
|
|
23
|
+
kobj_queue: KobjQueue | None
|
|
24
|
+
action_context: ActionContext | None
|
|
27
25
|
_action_table: dict[
|
|
28
26
|
type[RID],
|
|
29
27
|
Callable[
|
|
30
|
-
[
|
|
28
|
+
[ActionContext, RID],
|
|
31
29
|
Bundle | None
|
|
32
30
|
]
|
|
33
31
|
] = dict()
|
|
@@ -35,22 +33,16 @@ class Effector:
|
|
|
35
33
|
def __init__(
|
|
36
34
|
self,
|
|
37
35
|
cache: Cache,
|
|
36
|
+
resolver: NetworkResolver,
|
|
37
|
+
kobj_queue: KobjQueue,
|
|
38
|
+
action_context: ActionContext
|
|
38
39
|
):
|
|
39
40
|
self.cache = cache
|
|
40
|
-
self.resolver = None
|
|
41
|
-
self.processor = None
|
|
42
|
-
self.action_context = None
|
|
43
|
-
self._action_table = self.__class__._action_table.copy()
|
|
44
|
-
|
|
45
|
-
def set_processor(self, processor: "ProcessorInterface"):
|
|
46
|
-
self.processor = processor
|
|
47
|
-
|
|
48
|
-
def set_resolver(self, resolver: "NetworkResolver"):
|
|
49
41
|
self.resolver = resolver
|
|
50
|
-
|
|
51
|
-
def set_action_context(self, action_context: "ActionContext"):
|
|
42
|
+
self.kobj_queue = kobj_queue
|
|
52
43
|
self.action_context = action_context
|
|
53
|
-
|
|
44
|
+
self._action_table = self.__class__._action_table.copy()
|
|
45
|
+
|
|
54
46
|
@classmethod
|
|
55
47
|
def register_default_action(cls, rid_type: RIDType):
|
|
56
48
|
def decorator(func: Callable) -> Callable:
|
|
@@ -59,6 +51,16 @@ class Effector:
|
|
|
59
51
|
return decorator
|
|
60
52
|
|
|
61
53
|
def register_action(self, rid_type: RIDType):
|
|
54
|
+
"""Registers a new dereference action for an RID type.
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
This function should be used as a decorator on an action function::
|
|
58
|
+
|
|
59
|
+
@node.register_action(KoiNetNode)
|
|
60
|
+
def deref_koi_net_node(ctx: ActionContext, rid: KoiNetNode):
|
|
61
|
+
# return a Bundle or None
|
|
62
|
+
return
|
|
63
|
+
"""
|
|
62
64
|
def decorator(func: Callable) -> Callable:
|
|
63
65
|
self._action_table[rid_type] = func
|
|
64
66
|
return func
|
|
@@ -112,6 +114,19 @@ class Effector:
|
|
|
112
114
|
use_network: bool = False,
|
|
113
115
|
handle_result: bool = True
|
|
114
116
|
) -> Bundle | None:
|
|
117
|
+
"""Dereferences an RID.
|
|
118
|
+
|
|
119
|
+
Attempts to dereference an RID by (in order) reading the cache,
|
|
120
|
+
calling a bound action, or fetching from other nodes in the
|
|
121
|
+
newtork.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
rid: RID to dereference
|
|
125
|
+
refresh_cache: skips cache read when `True`
|
|
126
|
+
use_network: enables fetching from other nodes when `True`
|
|
127
|
+
handle_result: handles resulting bundle with knowledge pipeline when `True`
|
|
128
|
+
"""
|
|
129
|
+
|
|
115
130
|
logger.debug(f"Dereferencing {rid!r}")
|
|
116
131
|
|
|
117
132
|
bundle, source = (
|
|
@@ -128,7 +143,7 @@ class Effector:
|
|
|
128
143
|
and bundle is not None
|
|
129
144
|
and source != BundleSource.CACHE
|
|
130
145
|
):
|
|
131
|
-
self.
|
|
146
|
+
self.kobj_queue.put_kobj(
|
|
132
147
|
bundle=bundle,
|
|
133
148
|
source=source if type(source) is KoiNetNode else None
|
|
134
149
|
)
|
koi_net/handshaker.py
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from logging import getLogger
|
|
2
|
+
from rid_lib.ext import Cache
|
|
3
|
+
from rid_lib.types import KoiNetNode
|
|
4
|
+
from koi_net.identity import NodeIdentity
|
|
5
|
+
from koi_net.network.event_queue import EventQueue
|
|
6
|
+
from .protocol.event import Event, EventType
|
|
7
|
+
|
|
8
|
+
logger = getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Handshaker:
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
cache: Cache,
|
|
15
|
+
identity: NodeIdentity,
|
|
16
|
+
event_queue: EventQueue
|
|
17
|
+
):
|
|
18
|
+
self.cache = cache
|
|
19
|
+
self.identity = identity
|
|
20
|
+
self.event_queue = event_queue
|
|
21
|
+
|
|
22
|
+
def handshake_with(self, target: KoiNetNode):
|
|
23
|
+
"""Initiates a handshake with target node.
|
|
24
|
+
Pushes successive `FORGET` and `NEW` events to target node to
|
|
25
|
+
reset the target's cache in case it already knew this node.
|
|
26
|
+
"""
|
|
27
|
+
logger.debug(f"Initiating handshake with {target}")
|
|
28
|
+
self.event_queue.push_event_to(
|
|
29
|
+
Event.from_rid(
|
|
30
|
+
event_type=EventType.FORGET,
|
|
31
|
+
rid=self.identity.rid),
|
|
32
|
+
target=target
|
|
33
|
+
)
|
|
34
|
+
self.event_queue.push_event_to(
|
|
35
|
+
event=Event.from_bundle(
|
|
36
|
+
event_type=EventType.NEW,
|
|
37
|
+
bundle=self.cache.read(self.identity.rid)),
|
|
38
|
+
target=target
|
|
39
|
+
)
|
koi_net/kobj_worker.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import queue
|
|
2
|
+
import traceback
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
from koi_net.models import END
|
|
6
|
+
from koi_net.processor.knowledge_pipeline import KnowledgePipeline
|
|
7
|
+
from koi_net.processor.kobj_queue import KobjQueue
|
|
8
|
+
from koi_net.worker import ThreadWorker
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class KnowledgeProcessingWorker(ThreadWorker):
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
kobj_queue: KobjQueue,
|
|
17
|
+
pipeline: KnowledgePipeline,
|
|
18
|
+
timeout: float = 0.1
|
|
19
|
+
):
|
|
20
|
+
self.kobj_queue = kobj_queue
|
|
21
|
+
self.pipeline = pipeline
|
|
22
|
+
self.timeout = timeout
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
def run(self):
|
|
26
|
+
logger.info("Started kobj worker")
|
|
27
|
+
while True:
|
|
28
|
+
try:
|
|
29
|
+
item = self.kobj_queue.q.get(timeout=self.timeout)
|
|
30
|
+
try:
|
|
31
|
+
if item is END:
|
|
32
|
+
logger.info("Received 'END' signal, shutting down...")
|
|
33
|
+
return
|
|
34
|
+
|
|
35
|
+
logger.info(f"Dequeued {item!r}")
|
|
36
|
+
|
|
37
|
+
self.pipeline.process(item)
|
|
38
|
+
finally:
|
|
39
|
+
self.kobj_queue.q.task_done()
|
|
40
|
+
|
|
41
|
+
except queue.Empty:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
except Exception as e:
|
|
45
|
+
traceback.print_exc()
|