Skip to content

Commit ad5ee96

Browse files
authored
Merge pull request #28 from BlockScience/dev
v1.3.0
2 parents 1f5ed97 + 3c7b811 commit ad5ee96

92 files changed

Lines changed: 3231 additions & 2039 deletions

Some content is hidden

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

examples/coordinator.py

Lines changed: 51 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
1+
from dataclasses import dataclass
2+
13
from rid_lib.types import KoiNetNode, KoiNetEdge
2-
import structlog
3-
from koi_net.config.full_node import (
4+
from koi_net.core import FullNode
5+
from koi_net.config import (
46
FullNodeConfig,
57
ServerConfig,
68
KoiNetConfig,
7-
NodeProfile,
9+
FullNodeProfile,
810
NodeProvides
911
)
10-
from koi_net.core import FullNode
11-
from koi_net.processor.context import HandlerContext
12-
from koi_net.processor.handler import HandlerType, KnowledgeHandler
13-
from koi_net.processor.knowledge_object import KnowledgeObject
14-
from koi_net.protocol.event import Event, EventType
15-
from koi_net.protocol.edge import EdgeType, generate_edge_bundle
16-
17-
log = structlog.stdlib.get_logger()
1812

13+
from koi_net.components.interfaces import HandlerType, KnowledgeHandler
14+
from koi_net.components import NodeIdentity, Cache, EventQueue, KobjQueue
15+
from koi_net.protocol import (
16+
KnowledgeObject,
17+
Event,
18+
EventType,
19+
EdgeType,
20+
generate_edge_bundle
21+
)
1922

2023
class CoordinatorConfig(FullNodeConfig):
2124
server: ServerConfig = ServerConfig(port=8080)
2225
koi_net: KoiNetConfig = KoiNetConfig(
2326
node_name="coordinator",
24-
node_profile=NodeProfile(
27+
node_profile=FullNodeProfile(
2528
provides=NodeProvides(
2629
event=[KoiNetNode, KoiNetEdge],
2730
state=[KoiNetNode, KoiNetEdge]
@@ -30,39 +33,48 @@ class CoordinatorConfig(FullNodeConfig):
3033
rid_types_of_interest=[KoiNetNode, KoiNetEdge]
3134
)
3235

33-
@KnowledgeHandler.create(
34-
HandlerType.Network,
35-
rid_types=[KoiNetNode])
36-
def handshake_handler(ctx: HandlerContext, kobj: KnowledgeObject):
37-
log.info("Handling node handshake")
38-
39-
# only respond if node declares itself as NEW
40-
if kobj.event_type != EventType.NEW:
41-
return
42-
43-
log.info("Sharing this node's bundle with peer")
44-
identity_bundle = ctx.cache.read(ctx.identity.rid)
45-
ctx.event_queue.push(
46-
event=Event.from_bundle(EventType.NEW, identity_bundle),
47-
target=kobj.rid
48-
)
36+
@dataclass
37+
class HandshakeHandler(KnowledgeHandler):
38+
identity: NodeIdentity
39+
cache: Cache
40+
event_queue: EventQueue
41+
kobj_queue: KobjQueue
4942

50-
log.info("Proposing new edge")
51-
# defer handling of proposed edge
43+
handler_type = HandlerType.Network
44+
rid_types = (KoiNetNode,)
5245

53-
edge_bundle = generate_edge_bundle(
54-
source=kobj.rid,
55-
target=ctx.identity.rid,
56-
edge_type=EdgeType.WEBHOOK,
57-
rid_types=[KoiNetNode, KoiNetEdge]
58-
)
46+
def handle(self, kobj: KnowledgeObject):
47+
# only respond if node declares itself as NEW
48+
if not (kobj.event_type == EventType.NEW and kobj.source == kobj.rid):
49+
return
50+
51+
self.log.info("Handling node handshake")
52+
53+
self.log.info("Sharing this node's bundle with peer")
54+
identity_bundle = self.cache.read(self.identity.rid)
55+
self.event_queue.push(
56+
event=Event.from_bundle(
57+
event_type=EventType.NEW,
58+
bundle=identity_bundle),
59+
target=kobj.rid
60+
)
61+
62+
self.log.info("Proposing new edge")
63+
# defer handling of proposed edge
5964

60-
ctx.kobj_queue.push(rid=edge_bundle.rid, event_type=EventType.FORGET)
61-
ctx.kobj_queue.push(bundle=edge_bundle)
65+
edge_bundle = generate_edge_bundle(
66+
source=kobj.rid,
67+
target=self.identity.rid,
68+
edge_type=EdgeType.WEBHOOK,
69+
rid_types=[KoiNetNode, KoiNetEdge]
70+
)
71+
72+
self.kobj_queue.push(rid=edge_bundle.rid, event_type=EventType.FORGET)
73+
self.kobj_queue.push(bundle=edge_bundle)
6274

6375
class CoordinatorNode(FullNode):
6476
config_schema = CoordinatorConfig
65-
knowledge_handlers = FullNode.knowledge_handlers + [handshake_handler]
77+
handshake_handler = HandshakeHandler
6678

6779
if __name__ == "__main__":
6880
CoordinatorNode().run()

examples/partial.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
from koi_net.config.partial_node import PartialNodeConfig, KoiNetConfig, NodeProfile
1+
from koi_net.config import PartialNodeConfig, KoiNetConfig, PartialNodeProfile
22
from koi_net.core import PartialNode
33

44

55
class MyPartialNodeConfig(PartialNodeConfig):
66
koi_net: KoiNetConfig = KoiNetConfig(
77
node_name="partial",
8-
node_profile=NodeProfile()
8+
node_profile=PartialNodeProfile()
99
)
1010

1111
class MyPartialNode(PartialNode):

koi-net.config.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@
2222
"suffix": "]"
2323
},
2424
" ",
25+
{
26+
"field": "thread",
27+
"auto-width": true,
28+
"default-value": "",
29+
"prefix": "(",
30+
"suffix": ")"
31+
},
32+
" ",
2533
{
2634
"field": "module",
2735
"min-width": 15,
@@ -43,6 +51,9 @@
4351
},
4452
"module": {
4553
"kind": "string"
54+
},
55+
"thread": {
56+
"kind": "string"
4657
}
4758
},
4859
"highlights": {

pyproject.toml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
1-
[build-system]
2-
requires = ["hatchling"]
3-
build-backend = "hatchling.build"
4-
51
[project]
62
name = "koi-net"
7-
version = "1.2.5"
3+
version = "1.3.0"
84
description = "Implementation of KOI-net protocol in Python"
95
authors = [
106
{name = "Luke Miller", email = "luke@block.science"}
@@ -18,21 +14,26 @@ dependencies = [
1814
"httpx>=0.28.1",
1915
"pydantic>=2.10.6",
2016
"ruamel.yaml>=0.18.10",
21-
"python-dotenv>=1.1.0",
2217
"cryptography>=45.0.3",
2318
"fastapi>=0.115.12",
2419
"uvicorn>=0.34.2",
20+
"rich>=14.1.0",
2521
"structlog>=25.4.0",
22+
"pydantic-settings>=2.12.0",
23+
"jsonpointer>=3.0.0",
24+
"colorama>=0.4.6",
2625
]
2726

2827
[project.optional-dependencies]
29-
dev = ["twine>=6.0", "build"]
3028
docs = [
3129
"sphinx",
3230
"sphinx-autoapi>=3.6.0",
3331
"sphinx-autodoc-typehints>=3.0.1",
3432
"sphinx-rtd-theme>=3.0.2",
3533
]
3634

35+
[project.scripts]
36+
koi-sh = "koi_net.interfaces.shell:run"
37+
3738
[project.urls]
3839
Homepage = "https://github.com/BlockScience/koi-net/"

src/koi_net/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
from . import log_system

src/koi_net/base.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import threading
2+
from logging import Logger
3+
from pathlib import Path
4+
from queue import Queue
5+
6+
import structlog
7+
from structlog.contextvars import bound_contextvars
8+
9+
from .infra import Assembler
10+
from .components import LoggingContext
11+
12+
13+
class BaseAssembly(Assembler):
14+
root_dir: Path
15+
16+
shutdown_signal: threading.Event = threading.Event
17+
exception_queue: Queue[Exception] = lambda: Queue()
18+
19+
log: Logger = lambda root_dir: structlog.stdlib.get_logger().bind(log_dir=root_dir)
20+
logging_context: LoggingContext = LoggingContext
21+
22+
def __new__(cls, *args, root_dir: Path, **kwargs):
23+
cls.root_dir = root_dir
24+
with bound_contextvars(log_dir=root_dir):
25+
return super().__new__(cls, *args, **kwargs)

src/koi_net/behaviors/profile_monitor.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)