koi-net 1.1.0__tar.gz → 1.2.0b9__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.
Files changed (99) hide show
  1. {koi_net-1.1.0 → koi_net-1.2.0b9}/.gitignore +5 -2
  2. {koi_net-1.1.0 → koi_net-1.2.0b9}/PKG-INFO +8 -3
  3. koi_net-1.2.0b9/examples/coordinator.py +68 -0
  4. koi_net-1.2.0b9/examples/partial.py +15 -0
  5. koi_net-1.2.0b9/koi-net-protocol-openapi.json +522 -0
  6. koi_net-1.2.0b9/koi-net.config.json +79 -0
  7. {koi_net-1.1.0 → koi_net-1.2.0b9}/pyproject.toml +10 -5
  8. koi_net-1.2.0b9/schemas/bundle.schema.json +16 -0
  9. koi_net-1.2.0b9/schemas/bundles_payload.schema.json +32 -0
  10. koi_net-1.2.0b9/schemas/edge_profile.schema.json +49 -0
  11. koi_net-1.2.0b9/schemas/error_response.schema.json +23 -0
  12. koi_net-1.2.0b9/schemas/event.schema.json +33 -0
  13. koi_net-1.2.0b9/schemas/events_payload.schema.json +20 -0
  14. koi_net-1.2.0b9/schemas/fetch_bundles.schema.json +20 -0
  15. koi_net-1.2.0b9/schemas/fetch_manifests.schema.json +25 -0
  16. koi_net-1.2.0b9/schemas/fetch_rids.schema.json +19 -0
  17. koi_net-1.2.0b9/schemas/manifest.schema.json +21 -0
  18. koi_net-1.2.0b9/schemas/manifests_payload.schema.json +26 -0
  19. koi_net-1.2.0b9/schemas/node_profile.schema.json +51 -0
  20. koi_net-1.2.0b9/schemas/poll_events.schema.json +16 -0
  21. koi_net-1.2.0b9/schemas/rids_payload.schema.json +20 -0
  22. koi_net-1.2.0b9/schemas/signed_envelope.schema.json +33 -0
  23. koi_net-1.2.0b9/schemas/unsigned_envelope.json +29 -0
  24. koi_net-1.2.0b9/src/koi_net/behaviors/handshaker.py +68 -0
  25. koi_net-1.2.0b9/src/koi_net/behaviors/profile_monitor.py +23 -0
  26. koi_net-1.2.0b9/src/koi_net/behaviors/sync_manager.py +68 -0
  27. koi_net-1.2.0b9/src/koi_net/build/artifact.py +205 -0
  28. koi_net-1.2.0b9/src/koi_net/build/assembler.py +57 -0
  29. koi_net-1.2.0b9/src/koi_net/build/comp_order.py +6 -0
  30. koi_net-1.2.0b9/src/koi_net/build/comp_type.py +7 -0
  31. koi_net-1.2.0b9/src/koi_net/build/consts.py +18 -0
  32. koi_net-1.2.0b9/src/koi_net/build/container.py +44 -0
  33. koi_net-1.2.0b9/src/koi_net/cache.py +81 -0
  34. koi_net-1.2.0b9/src/koi_net/config/core.py +113 -0
  35. koi_net-1.2.0b9/src/koi_net/config/full_node.py +45 -0
  36. koi_net-1.2.0b9/src/koi_net/config/loader.py +60 -0
  37. koi_net-1.2.0b9/src/koi_net/config/partial_node.py +26 -0
  38. koi_net-1.2.0b9/src/koi_net/config/proxy.py +20 -0
  39. koi_net-1.2.0b9/src/koi_net/core.py +80 -0
  40. koi_net-1.2.0b9/src/koi_net/effector.py +147 -0
  41. koi_net-1.2.0b9/src/koi_net/entrypoints/__init__.py +2 -0
  42. koi_net-1.2.0b9/src/koi_net/entrypoints/base.py +8 -0
  43. koi_net-1.2.0b9/src/koi_net/entrypoints/poller.py +43 -0
  44. koi_net-1.2.0b9/src/koi_net/entrypoints/server.py +85 -0
  45. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/identity.py +4 -8
  46. koi_net-1.2.0b9/src/koi_net/log_system.py +153 -0
  47. koi_net-1.2.0b9/src/koi_net/network/error_handler.py +63 -0
  48. koi_net-1.2.0b9/src/koi_net/network/event_buffer.py +53 -0
  49. koi_net-1.2.0b9/src/koi_net/network/event_queue.py +31 -0
  50. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/network/graph.py +29 -18
  51. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/network/request_handler.py +77 -75
  52. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/network/resolver.py +52 -43
  53. koi_net-1.2.0b9/src/koi_net/network/response_handler.py +129 -0
  54. koi_net-1.2.0b9/src/koi_net/processor/context.py +55 -0
  55. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/processor/handler.py +18 -12
  56. koi_net-1.2.0b9/src/koi_net/processor/knowledge_handlers.py +295 -0
  57. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/processor/knowledge_object.py +32 -13
  58. koi_net-1.2.0b9/src/koi_net/processor/kobj_queue.py +51 -0
  59. koi_net-1.1.0/src/koi_net/processor/knowledge_pipeline.py → koi_net-1.2.0b9/src/koi_net/processor/pipeline.py +70 -69
  60. koi_net-1.2.0b9/src/koi_net/protocol/__init__.py +0 -0
  61. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/api_models.py +8 -3
  62. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/edge.py +5 -0
  63. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/envelope.py +19 -12
  64. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/errors.py +2 -0
  65. koi_net-1.2.0b9/src/koi_net/protocol/model_map.py +62 -0
  66. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/secure.py +29 -22
  67. koi_net-1.1.0/src/koi_net/secure.py → koi_net-1.2.0b9/src/koi_net/secure_manager.py +36 -38
  68. koi_net-1.2.0b9/src/koi_net/workers/__init__.py +2 -0
  69. koi_net-1.2.0b9/src/koi_net/workers/base.py +26 -0
  70. koi_net-1.2.0b9/src/koi_net/workers/event_worker.py +106 -0
  71. koi_net-1.2.0b9/src/koi_net/workers/kobj_worker.py +51 -0
  72. {koi_net-1.1.0 → koi_net-1.2.0b9}/uv.lock +400 -11
  73. koi_net-1.1.0/examples/coordinator.py +0 -76
  74. koi_net-1.1.0/examples/partial.py +0 -37
  75. koi_net-1.1.0/requirements.txt +0 -9
  76. koi_net-1.1.0/src/koi_net/__init__.py +0 -1
  77. koi_net-1.1.0/src/koi_net/actor.py +0 -60
  78. koi_net-1.1.0/src/koi_net/config.py +0 -127
  79. koi_net-1.1.0/src/koi_net/context.py +0 -63
  80. koi_net-1.1.0/src/koi_net/core.py +0 -194
  81. koi_net-1.1.0/src/koi_net/default_actions.py +0 -15
  82. koi_net-1.1.0/src/koi_net/effector.py +0 -139
  83. koi_net-1.1.0/src/koi_net/lifecycle.py +0 -104
  84. koi_net-1.1.0/src/koi_net/network/error_handler.py +0 -50
  85. koi_net-1.1.0/src/koi_net/network/event_queue.py +0 -199
  86. koi_net-1.1.0/src/koi_net/network/response_handler.py +0 -68
  87. koi_net-1.1.0/src/koi_net/poller.py +0 -40
  88. koi_net-1.1.0/src/koi_net/processor/default_handlers.py +0 -249
  89. koi_net-1.1.0/src/koi_net/processor/interface.py +0 -101
  90. koi_net-1.1.0/src/koi_net/server.py +0 -129
  91. {koi_net-1.1.0 → koi_net-1.2.0b9}/.github/workflows/publish-to-pypi.yml +0 -0
  92. {koi_net-1.1.0 → koi_net-1.2.0b9}/LICENSE +0 -0
  93. {koi_net-1.1.0 → koi_net-1.2.0b9}/README.md +0 -0
  94. {koi_net-1.1.0/src/koi_net/network → koi_net-1.2.0b9/src/koi_net}/__init__.py +0 -0
  95. {koi_net-1.1.0/src/koi_net/processor → koi_net-1.2.0b9/src/koi_net/network}/__init__.py +0 -0
  96. {koi_net-1.1.0/src/koi_net/protocol → koi_net-1.2.0b9/src/koi_net/processor}/__init__.py +0 -0
  97. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/consts.py +0 -0
  98. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/event.py +0 -0
  99. {koi_net-1.1.0 → koi_net-1.2.0b9}/src/koi_net/protocol/node.py +0 -0
@@ -1,10 +1,13 @@
1
1
  rid-lib
2
2
  __pycache__
3
- *.json
4
3
  *.pem
5
4
  *.yaml
5
+ *.ndjson*
6
6
  venv
7
7
  .env
8
8
  prototypes
9
9
  .vscode
10
- dist/
10
+ dist/
11
+ docs/
12
+ tests/
13
+ .rid_cache/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: koi-net
3
- Version: 1.1.0
3
+ Version: 1.2.0b9
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,19 @@ 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
39
+ Requires-Dist: structlog>=25.4.0
38
40
  Requires-Dist: uvicorn>=0.34.2
39
41
  Provides-Extra: dev
40
42
  Requires-Dist: build; extra == 'dev'
41
43
  Requires-Dist: twine>=6.0; extra == 'dev'
42
- Provides-Extra: examples
43
- Requires-Dist: rich; extra == 'examples'
44
+ Provides-Extra: docs
45
+ Requires-Dist: sphinx; extra == 'docs'
46
+ Requires-Dist: sphinx-autoapi>=3.6.0; extra == 'docs'
47
+ Requires-Dist: sphinx-autodoc-typehints>=3.0.1; extra == 'docs'
48
+ Requires-Dist: sphinx-rtd-theme>=3.0.2; extra == 'docs'
44
49
  Description-Content-Type: text/markdown
45
50
 
46
51
  # KOI-net
@@ -0,0 +1,68 @@
1
+ from rid_lib.types import KoiNetNode, KoiNetEdge
2
+ import structlog
3
+ from koi_net.config.full_node import (
4
+ FullNodeConfig,
5
+ ServerConfig,
6
+ KoiNetConfig,
7
+ NodeProfile,
8
+ NodeProvides
9
+ )
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()
18
+
19
+
20
+ class CoordinatorConfig(FullNodeConfig):
21
+ server: ServerConfig = ServerConfig(port=8080)
22
+ koi_net: KoiNetConfig = KoiNetConfig(
23
+ node_name="coordinator",
24
+ node_profile=NodeProfile(
25
+ provides=NodeProvides(
26
+ event=[KoiNetNode, KoiNetEdge],
27
+ state=[KoiNetNode, KoiNetEdge]
28
+ )
29
+ ),
30
+ rid_types_of_interest=[KoiNetNode, KoiNetEdge]
31
+ )
32
+
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
+ )
49
+
50
+ log.info("Proposing new edge")
51
+ # defer handling of proposed edge
52
+
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
+ )
59
+
60
+ ctx.kobj_queue.push(rid=edge_bundle.rid, event_type=EventType.FORGET)
61
+ ctx.kobj_queue.push(bundle=edge_bundle)
62
+
63
+ class CoordinatorNode(FullNode):
64
+ config_schema = CoordinatorConfig
65
+ knowledge_handlers = FullNode.knowledge_handlers + [handshake_handler]
66
+
67
+ if __name__ == "__main__":
68
+ CoordinatorNode().run()
@@ -0,0 +1,15 @@
1
+ from koi_net.config.partial_node import PartialNodeConfig, KoiNetConfig, NodeProfile
2
+ from koi_net.core import PartialNode
3
+
4
+
5
+ class MyPartialNodeConfig(PartialNodeConfig):
6
+ koi_net: KoiNetConfig = KoiNetConfig(
7
+ node_name="partial",
8
+ node_profile=NodeProfile()
9
+ )
10
+
11
+ class MyPartialNode(PartialNode):
12
+ config_schema = MyPartialNodeConfig
13
+
14
+ if __name__ == "__main__":
15
+ MyPartialNode().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
+ }