koi-net 1.1.0b7__tar.gz → 1.2.0b1__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 (76) hide show
  1. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/.gitignore +4 -2
  2. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/PKG-INFO +7 -3
  3. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/examples/coordinator.py +25 -18
  4. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/examples/partial.py +6 -8
  5. koi_net-1.2.0b1/koi-net-protocol-openapi.json +522 -0
  6. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/pyproject.toml +12 -5
  7. koi_net-1.2.0b1/schemas/bundle.schema.json +16 -0
  8. koi_net-1.2.0b1/schemas/bundles_payload.schema.json +32 -0
  9. koi_net-1.2.0b1/schemas/edge_profile.schema.json +49 -0
  10. koi_net-1.2.0b1/schemas/error_response.schema.json +23 -0
  11. koi_net-1.2.0b1/schemas/event.schema.json +33 -0
  12. koi_net-1.2.0b1/schemas/events_payload.schema.json +20 -0
  13. koi_net-1.2.0b1/schemas/fetch_bundles.schema.json +20 -0
  14. koi_net-1.2.0b1/schemas/fetch_manifests.schema.json +25 -0
  15. koi_net-1.2.0b1/schemas/fetch_rids.schema.json +19 -0
  16. koi_net-1.2.0b1/schemas/manifest.schema.json +21 -0
  17. koi_net-1.2.0b1/schemas/manifests_payload.schema.json +26 -0
  18. koi_net-1.2.0b1/schemas/node_profile.schema.json +51 -0
  19. koi_net-1.2.0b1/schemas/poll_events.schema.json +16 -0
  20. koi_net-1.2.0b1/schemas/rids_payload.schema.json +20 -0
  21. koi_net-1.2.0b1/schemas/signed_envelope.schema.json +33 -0
  22. koi_net-1.2.0b1/schemas/unsigned_envelope.json +29 -0
  23. koi_net-1.2.0b1/src/koi_net/__init__.py +1 -0
  24. koi_net-1.2.0b1/src/koi_net/behaviors.py +51 -0
  25. koi_net-1.2.0b1/src/koi_net/cli/__init__.py +1 -0
  26. koi_net-1.2.0b1/src/koi_net/cli/commands.py +99 -0
  27. koi_net-1.2.0b1/src/koi_net/cli/models.py +41 -0
  28. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/config.py +34 -0
  29. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/context.py +16 -20
  30. koi_net-1.2.0b1/src/koi_net/core.py +233 -0
  31. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/default_actions.py +10 -1
  32. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/effector.py +39 -24
  33. koi_net-1.1.0b7/src/koi_net/network/behavior.py → koi_net-1.2.0b1/src/koi_net/handshaker.py +17 -20
  34. koi_net-1.2.0b1/src/koi_net/kobj_worker.py +45 -0
  35. koi_net-1.2.0b1/src/koi_net/lifecycle.py +133 -0
  36. koi_net-1.2.0b1/src/koi_net/models.py +14 -0
  37. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/error_handler.py +12 -10
  38. koi_net-1.2.0b1/src/koi_net/network/event_queue.py +29 -0
  39. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/graph.py +14 -9
  40. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/request_handler.py +31 -19
  41. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/resolver.py +6 -9
  42. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/response_handler.py +5 -6
  43. koi_net-1.2.0b1/src/koi_net/poll_event_buffer.py +17 -0
  44. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/poller.py +12 -5
  45. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/processor/default_handlers.py +84 -35
  46. koi_net-1.2.0b1/src/koi_net/processor/event_worker.py +121 -0
  47. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/processor/handler.py +4 -2
  48. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/processor/knowledge_object.py +19 -7
  49. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/processor/knowledge_pipeline.py +7 -26
  50. koi_net-1.2.0b1/src/koi_net/processor/kobj_queue.py +51 -0
  51. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/api_models.py +3 -2
  52. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/node.py +3 -3
  53. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/secure.py +28 -8
  54. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/server.py +25 -9
  55. koi_net-1.2.0b1/src/koi_net/utils.py +18 -0
  56. koi_net-1.2.0b1/src/koi_net/worker.py +10 -0
  57. koi_net-1.2.0b1/uv.lock +1386 -0
  58. koi_net-1.1.0b7/src/koi_net/__init__.py +0 -1
  59. koi_net-1.1.0b7/src/koi_net/core.py +0 -196
  60. koi_net-1.1.0b7/src/koi_net/lifecycle.py +0 -103
  61. koi_net-1.1.0b7/src/koi_net/network/event_queue.py +0 -199
  62. koi_net-1.1.0b7/src/koi_net/processor/interface.py +0 -101
  63. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/.github/workflows/publish-to-pypi.yml +0 -0
  64. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/LICENSE +0 -0
  65. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/README.md +0 -0
  66. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/requirements.txt +0 -0
  67. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/identity.py +0 -0
  68. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/network/__init__.py +0 -0
  69. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/processor/__init__.py +0 -0
  70. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/__init__.py +0 -0
  71. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/consts.py +0 -0
  72. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/edge.py +0 -0
  73. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/envelope.py +0 -0
  74. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/errors.py +0 -0
  75. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/event.py +0 -0
  76. {koi_net-1.1.0b7 → koi_net-1.2.0b1}/src/koi_net/protocol/secure.py +0 -0
@@ -1,10 +1,12 @@
1
1
  rid-lib
2
2
  __pycache__
3
- *.json
4
3
  *.pem
5
4
  *.yaml
6
5
  venv
7
6
  .env
8
7
  prototypes
9
8
  .vscode
10
- dist/
9
+ dist/
10
+ docs/
11
+ tests/
12
+ .rid_cache/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: koi-net
3
- Version: 1.1.0b7
3
+ Version: 1.2.0b1
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>
@@ -33,14 +33,18 @@ Requires-Dist: httpx>=0.28.1
33
33
  Requires-Dist: networkx>=3.4.2
34
34
  Requires-Dist: pydantic>=2.10.6
35
35
  Requires-Dist: python-dotenv>=1.1.0
36
+ Requires-Dist: rich>=14.1.0
36
37
  Requires-Dist: rid-lib>=3.2.7
37
38
  Requires-Dist: ruamel-yaml>=0.18.10
38
39
  Requires-Dist: uvicorn>=0.34.2
39
40
  Provides-Extra: dev
40
41
  Requires-Dist: build; extra == 'dev'
41
42
  Requires-Dist: twine>=6.0; extra == 'dev'
42
- Provides-Extra: examples
43
- Requires-Dist: rich; extra == 'examples'
43
+ Provides-Extra: docs
44
+ Requires-Dist: sphinx; extra == 'docs'
45
+ Requires-Dist: sphinx-autoapi>=3.6.0; extra == 'docs'
46
+ Requires-Dist: sphinx-autodoc-typehints>=3.0.1; extra == 'docs'
47
+ Requires-Dist: sphinx-rtd-theme>=3.0.2; extra == 'docs'
44
48
  Description-Content-Type: text/markdown
45
49
 
46
50
  # KOI-net
@@ -2,11 +2,11 @@ import logging
2
2
  from rich.logging import RichHandler
3
3
  from pydantic import Field
4
4
  from rid_lib.types import KoiNetNode, KoiNetEdge
5
- from koi_net.config import NodeConfig, KoiNetConfig
5
+ from koi_net.config import NodeConfig, KoiNetConfig, ServerConfig
6
+ from koi_net.core import NodeAssembler
6
7
  from koi_net.protocol.node import NodeProfile, NodeProvides, NodeType
7
- from koi_net import NodeInterface
8
8
  from koi_net.context import HandlerContext
9
- from koi_net.processor.handler import HandlerType
9
+ from koi_net.processor.handler import HandlerType, KnowledgeHandler
10
10
  from koi_net.processor.knowledge_object import KnowledgeObject
11
11
  from koi_net.protocol.event import Event, EventType
12
12
  from koi_net.protocol.edge import EdgeType, generate_edge_bundle
@@ -21,7 +21,11 @@ logging.basicConfig(
21
21
  logging.getLogger("koi_net").setLevel(logging.DEBUG)
22
22
  logger = logging.getLogger(__name__)
23
23
 
24
+
24
25
  class CoordinatorConfig(NodeConfig):
26
+ server: ServerConfig = Field(default_factory=lambda:
27
+ ServerConfig(port=8080)
28
+ )
25
29
  koi_net: KoiNetConfig = Field(default_factory = lambda:
26
30
  KoiNetConfig(
27
31
  node_name="coordinator",
@@ -32,18 +36,13 @@ class CoordinatorConfig(NodeConfig):
32
36
  state=[KoiNetNode, KoiNetEdge]
33
37
  )
34
38
  ),
35
- cache_directory_path=".coordinator_rid_cache",
36
- event_queues_path="coordinator_event_queues.json",
37
- private_key_pem_path="coordinator_priv_key.pem"
39
+ rid_types_of_interest=[KoiNetNode, KoiNetEdge]
38
40
  )
39
41
  )
40
-
41
- node = NodeInterface(
42
- config=CoordinatorConfig.load_from_yaml("coordinator_config.yaml"),
43
- use_kobj_processor_thread=True
44
- )
45
42
 
46
- @node.processor.pipeline.register_handler(HandlerType.Network, rid_types=[KoiNetNode])
43
+ @KnowledgeHandler.create(
44
+ HandlerType.Network,
45
+ rid_types=[KoiNetNode])
47
46
  def handshake_handler(ctx: HandlerContext, kobj: KnowledgeObject):
48
47
  logger.info("Handling node handshake")
49
48
 
@@ -52,11 +51,10 @@ def handshake_handler(ctx: HandlerContext, kobj: KnowledgeObject):
52
51
  return
53
52
 
54
53
  logger.info("Sharing this node's bundle with peer")
55
- identity_bundle = ctx.effector.deref(ctx.identity.rid)
54
+ identity_bundle = ctx.cache.read(ctx.identity.rid)
56
55
  ctx.event_queue.push_event_to(
57
56
  event=Event.from_bundle(EventType.NEW, identity_bundle),
58
- node=kobj.rid,
59
- flush=True
57
+ target=kobj.rid
60
58
  )
61
59
 
62
60
  logger.info("Proposing new edge")
@@ -69,8 +67,17 @@ def handshake_handler(ctx: HandlerContext, kobj: KnowledgeObject):
69
67
  rid_types=[KoiNetNode, KoiNetEdge]
70
68
  )
71
69
 
72
- ctx.handle(rid=edge_bundle.rid, event_type=EventType.FORGET)
73
- ctx.handle(bundle=edge_bundle)
74
-
70
+ ctx.kobj_queue.put_kobj(rid=edge_bundle.rid, event_type=EventType.FORGET)
71
+ ctx.kobj_queue.put_kobj(bundle=edge_bundle)
72
+
73
+ class CoordinatorNodeAssembler(NodeAssembler):
74
+ config = CoordinatorConfig
75
+ knowledge_handlers = [
76
+ *NodeAssembler.knowledge_handlers,
77
+ handshake_handler
78
+ ]
79
+
80
+
75
81
  if __name__ == "__main__":
82
+ node = CoordinatorNodeAssembler.create()
76
83
  node.server.run()
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  from pydantic import Field
3
3
  from rich.logging import RichHandler
4
- from koi_net import NodeInterface
4
+ from koi_net.core import NodeAssembler
5
5
  from koi_net.protocol.node import NodeProfile, NodeType
6
6
  from koi_net.config import NodeConfig, KoiNetConfig
7
7
 
@@ -22,16 +22,14 @@ class PartialNodeConfig(NodeConfig):
22
22
  node_name="partial",
23
23
  node_profile=NodeProfile(
24
24
  node_type=NodeType.PARTIAL
25
- ),
26
- cache_directory_path=".partial_rid_cache",
27
- event_queues_path="partial_event_queues.json",
28
- private_key_pem_path="partial_priv_key.pem"
25
+ )
29
26
  )
30
27
  )
31
28
 
32
- node = NodeInterface(
33
- config=PartialNodeConfig.load_from_yaml("partial_config.yaml")
34
- )
29
+ class PartialNodeAssembler(NodeAssembler):
30
+ config = PartialNodeConfig
31
+
35
32
 
36
33
  if __name__ == "__main__":
34
+ node = PartialNodeAssembler.create()
37
35
  node.poller.run()
@@ -0,0 +1,522 @@
1
+ {
2
+ "openapi": "3.1.0",
3
+ "info": {
4
+ "title": "KOI-net Protocol API",
5
+ "version": "1.0.0"
6
+ },
7
+ "paths": {
8
+ "/events/broadcast": {
9
+ "post": {
10
+ "summary": "Broadcast Events",
11
+ "operationId": "broadcast_events_events_broadcast_post",
12
+ "requestBody": {
13
+ "content": {
14
+ "application/json": {
15
+ "schema": {
16
+ "$ref": "#/components/schemas/EventsPayload-Input"
17
+ }
18
+ }
19
+ },
20
+ "required": true
21
+ },
22
+ "responses": {
23
+ "200": {
24
+ "description": "Successful Response",
25
+ "content": {
26
+ "application/json": {
27
+ "schema": {}
28
+ }
29
+ }
30
+ },
31
+ "422": {
32
+ "description": "Validation Error",
33
+ "content": {
34
+ "application/json": {
35
+ "schema": {
36
+ "$ref": "#/components/schemas/HTTPValidationError"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ }
43
+ },
44
+ "/events/poll": {
45
+ "post": {
46
+ "summary": "Poll Events",
47
+ "operationId": "poll_events_events_poll_post",
48
+ "requestBody": {
49
+ "content": {
50
+ "application/json": {
51
+ "schema": {
52
+ "$ref": "#/components/schemas/PollEvents"
53
+ }
54
+ }
55
+ },
56
+ "required": true
57
+ },
58
+ "responses": {
59
+ "200": {
60
+ "description": "Successful Response",
61
+ "content": {
62
+ "application/json": {
63
+ "schema": {
64
+ "$ref": "#/components/schemas/EventsPayload-Output"
65
+ }
66
+ }
67
+ }
68
+ },
69
+ "422": {
70
+ "description": "Validation Error",
71
+ "content": {
72
+ "application/json": {
73
+ "schema": {
74
+ "$ref": "#/components/schemas/HTTPValidationError"
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ },
82
+ "/rids/fetch": {
83
+ "post": {
84
+ "summary": "Fetch Rids",
85
+ "operationId": "fetch_rids_rids_fetch_post",
86
+ "requestBody": {
87
+ "content": {
88
+ "application/json": {
89
+ "schema": {
90
+ "$ref": "#/components/schemas/FetchRids"
91
+ }
92
+ }
93
+ },
94
+ "required": true
95
+ },
96
+ "responses": {
97
+ "200": {
98
+ "description": "Successful Response",
99
+ "content": {
100
+ "application/json": {
101
+ "schema": {
102
+ "$ref": "#/components/schemas/RidsPayload"
103
+ }
104
+ }
105
+ }
106
+ },
107
+ "422": {
108
+ "description": "Validation Error",
109
+ "content": {
110
+ "application/json": {
111
+ "schema": {
112
+ "$ref": "#/components/schemas/HTTPValidationError"
113
+ }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ },
120
+ "/manifests/fetch": {
121
+ "post": {
122
+ "summary": "Fetch Manifests",
123
+ "operationId": "fetch_manifests_manifests_fetch_post",
124
+ "requestBody": {
125
+ "content": {
126
+ "application/json": {
127
+ "schema": {
128
+ "$ref": "#/components/schemas/FetchManifests"
129
+ }
130
+ }
131
+ },
132
+ "required": true
133
+ },
134
+ "responses": {
135
+ "200": {
136
+ "description": "Successful Response",
137
+ "content": {
138
+ "application/json": {
139
+ "schema": {
140
+ "$ref": "#/components/schemas/ManifestsPayload"
141
+ }
142
+ }
143
+ }
144
+ },
145
+ "422": {
146
+ "description": "Validation Error",
147
+ "content": {
148
+ "application/json": {
149
+ "schema": {
150
+ "$ref": "#/components/schemas/HTTPValidationError"
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ },
158
+ "/bundles/fetch": {
159
+ "post": {
160
+ "summary": "Fetch Bundles",
161
+ "operationId": "fetch_bundles_bundles_fetch_post",
162
+ "requestBody": {
163
+ "content": {
164
+ "application/json": {
165
+ "schema": {
166
+ "$ref": "#/components/schemas/FetchBundles"
167
+ }
168
+ }
169
+ },
170
+ "required": true
171
+ },
172
+ "responses": {
173
+ "200": {
174
+ "description": "Successful Response",
175
+ "content": {
176
+ "application/json": {
177
+ "schema": {
178
+ "$ref": "#/components/schemas/BundlesPayload"
179
+ }
180
+ }
181
+ }
182
+ },
183
+ "422": {
184
+ "description": "Validation Error",
185
+ "content": {
186
+ "application/json": {
187
+ "schema": {
188
+ "$ref": "#/components/schemas/HTTPValidationError"
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ }
196
+ },
197
+ "components": {
198
+ "schemas": {
199
+ "Bundle": {
200
+ "properties": {
201
+ "manifest": {
202
+ "$ref": "#/components/schemas/Manifest"
203
+ },
204
+ "contents": {
205
+ "type": "object",
206
+ "title": "Contents"
207
+ }
208
+ },
209
+ "type": "object",
210
+ "required": [
211
+ "manifest",
212
+ "contents"
213
+ ],
214
+ "title": "Bundle",
215
+ "description": "A knowledge bundle composed of a manifest and contents associated with an RIDed object.\n\nActs as a container for the data associated with an RID. It is written to and read from the cache."
216
+ },
217
+ "BundlesPayload": {
218
+ "properties": {
219
+ "bundles": {
220
+ "items": {
221
+ "$ref": "#/components/schemas/Bundle"
222
+ },
223
+ "type": "array",
224
+ "title": "Bundles"
225
+ },
226
+ "not_found": {
227
+ "items": {
228
+ "type": "string",
229
+ "format": "rid"
230
+ },
231
+ "type": "array",
232
+ "title": "Not Found",
233
+ "default": []
234
+ },
235
+ "deferred": {
236
+ "items": {
237
+ "type": "string",
238
+ "format": "rid"
239
+ },
240
+ "type": "array",
241
+ "title": "Deferred",
242
+ "default": []
243
+ }
244
+ },
245
+ "type": "object",
246
+ "required": [
247
+ "bundles"
248
+ ],
249
+ "title": "BundlesPayload"
250
+ },
251
+ "Event": {
252
+ "properties": {
253
+ "rid": {
254
+ "type": "string",
255
+ "format": "rid",
256
+ "title": "Rid"
257
+ },
258
+ "event_type": {
259
+ "$ref": "#/components/schemas/EventType"
260
+ },
261
+ "manifest": {
262
+ "anyOf": [
263
+ {
264
+ "$ref": "#/components/schemas/Manifest"
265
+ },
266
+ {
267
+ "type": "null"
268
+ }
269
+ ]
270
+ },
271
+ "contents": {
272
+ "anyOf": [
273
+ {
274
+ "type": "object"
275
+ },
276
+ {
277
+ "type": "null"
278
+ }
279
+ ],
280
+ "title": "Contents"
281
+ }
282
+ },
283
+ "type": "object",
284
+ "required": [
285
+ "rid",
286
+ "event_type"
287
+ ],
288
+ "title": "Event"
289
+ },
290
+ "EventType": {
291
+ "type": "string",
292
+ "enum": [
293
+ "NEW",
294
+ "UPDATE",
295
+ "FORGET"
296
+ ],
297
+ "title": "EventType"
298
+ },
299
+ "EventsPayload-Input": {
300
+ "properties": {
301
+ "events": {
302
+ "items": {
303
+ "$ref": "#/components/schemas/Event"
304
+ },
305
+ "type": "array",
306
+ "title": "Events"
307
+ }
308
+ },
309
+ "type": "object",
310
+ "required": [
311
+ "events"
312
+ ],
313
+ "title": "EventsPayload"
314
+ },
315
+ "EventsPayload-Output": {
316
+ "properties": {
317
+ "events": {
318
+ "items": {
319
+ "$ref": "#/components/schemas/Event"
320
+ },
321
+ "type": "array",
322
+ "title": "Events"
323
+ }
324
+ },
325
+ "type": "object",
326
+ "required": [
327
+ "events"
328
+ ],
329
+ "title": "EventsPayload"
330
+ },
331
+ "FetchBundles": {
332
+ "properties": {
333
+ "rids": {
334
+ "items": {
335
+ "type": "string",
336
+ "format": "rid"
337
+ },
338
+ "type": "array",
339
+ "title": "Rids"
340
+ }
341
+ },
342
+ "type": "object",
343
+ "required": [
344
+ "rids"
345
+ ],
346
+ "title": "FetchBundles"
347
+ },
348
+ "FetchManifests": {
349
+ "properties": {
350
+ "rid_types": {
351
+ "items": {
352
+ "type": "string",
353
+ "format": "rid-type"
354
+ },
355
+ "type": "array",
356
+ "title": "Rid Types",
357
+ "default": []
358
+ },
359
+ "rids": {
360
+ "items": {
361
+ "type": "string",
362
+ "format": "rid"
363
+ },
364
+ "type": "array",
365
+ "title": "Rids",
366
+ "default": []
367
+ }
368
+ },
369
+ "type": "object",
370
+ "title": "FetchManifests"
371
+ },
372
+ "FetchRids": {
373
+ "properties": {
374
+ "rid_types": {
375
+ "items": {
376
+ "type": "string",
377
+ "format": "rid-type"
378
+ },
379
+ "type": "array",
380
+ "title": "Rid Types",
381
+ "default": []
382
+ }
383
+ },
384
+ "type": "object",
385
+ "title": "FetchRids"
386
+ },
387
+ "HTTPValidationError": {
388
+ "properties": {
389
+ "detail": {
390
+ "items": {
391
+ "$ref": "#/components/schemas/ValidationError"
392
+ },
393
+ "type": "array",
394
+ "title": "Detail"
395
+ }
396
+ },
397
+ "type": "object",
398
+ "title": "HTTPValidationError"
399
+ },
400
+ "Manifest": {
401
+ "properties": {
402
+ "rid": {
403
+ "type": "string",
404
+ "format": "rid",
405
+ "title": "Rid"
406
+ },
407
+ "timestamp": {
408
+ "type": "string",
409
+ "format": "date-time",
410
+ "title": "Timestamp"
411
+ },
412
+ "sha256_hash": {
413
+ "type": "string",
414
+ "title": "Sha256 Hash"
415
+ }
416
+ },
417
+ "type": "object",
418
+ "required": [
419
+ "rid",
420
+ "timestamp",
421
+ "sha256_hash"
422
+ ],
423
+ "title": "Manifest",
424
+ "description": "A portable descriptor of a data object associated with an RID.\n\nComposed of an RID, timestamp, and sha256 hash of the data object."
425
+ },
426
+ "ManifestsPayload": {
427
+ "properties": {
428
+ "manifests": {
429
+ "items": {
430
+ "$ref": "#/components/schemas/Manifest"
431
+ },
432
+ "type": "array",
433
+ "title": "Manifests"
434
+ },
435
+ "not_found": {
436
+ "items": {
437
+ "type": "string",
438
+ "format": "rid"
439
+ },
440
+ "type": "array",
441
+ "title": "Not Found",
442
+ "default": []
443
+ }
444
+ },
445
+ "type": "object",
446
+ "required": [
447
+ "manifests"
448
+ ],
449
+ "title": "ManifestsPayload"
450
+ },
451
+ "PollEvents": {
452
+ "properties": {
453
+ "rid": {
454
+ "type": "string",
455
+ "format": "rid",
456
+ "title": "Rid"
457
+ },
458
+ "limit": {
459
+ "type": "integer",
460
+ "title": "Limit",
461
+ "default": 0
462
+ }
463
+ },
464
+ "type": "object",
465
+ "required": [
466
+ "rid"
467
+ ],
468
+ "title": "PollEvents"
469
+ },
470
+ "RidsPayload": {
471
+ "properties": {
472
+ "rids": {
473
+ "items": {
474
+ "type": "string",
475
+ "format": "rid"
476
+ },
477
+ "type": "array",
478
+ "title": "Rids"
479
+ }
480
+ },
481
+ "type": "object",
482
+ "required": [
483
+ "rids"
484
+ ],
485
+ "title": "RidsPayload"
486
+ },
487
+ "ValidationError": {
488
+ "properties": {
489
+ "loc": {
490
+ "items": {
491
+ "anyOf": [
492
+ {
493
+ "type": "string"
494
+ },
495
+ {
496
+ "type": "integer"
497
+ }
498
+ ]
499
+ },
500
+ "type": "array",
501
+ "title": "Location"
502
+ },
503
+ "msg": {
504
+ "type": "string",
505
+ "title": "Message"
506
+ },
507
+ "type": {
508
+ "type": "string",
509
+ "title": "Error Type"
510
+ }
511
+ },
512
+ "type": "object",
513
+ "required": [
514
+ "loc",
515
+ "msg",
516
+ "type"
517
+ ],
518
+ "title": "ValidationError"
519
+ }
520
+ }
521
+ }
522
+ }