eventbus-grpc 0.38.0__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.
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.4
2
+ Name: eventbus-grpc
3
+ Version: 0.38.0
4
+ Summary: Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime (Python)
5
+ License: Apache-2.0
6
+ Requires-Python: >=3.9
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: grpc-dc>=0.38.0
9
+
10
+ # eventbus-grpc (Python)
11
+
12
+ Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime.
13
+
14
+ Install: `pip install eventbus-grpc` (depends on `grpc-dc`).
@@ -0,0 +1,5 @@
1
+ # eventbus-grpc (Python)
2
+
3
+ Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime.
4
+
5
+ Install: `pip install eventbus-grpc` (depends on `grpc-dc`).
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.4
2
+ Name: eventbus-grpc
3
+ Version: 0.38.0
4
+ Summary: Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime (Python)
5
+ License: Apache-2.0
6
+ Requires-Python: >=3.9
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: grpc-dc>=0.38.0
9
+
10
+ # eventbus-grpc (Python)
11
+
12
+ Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime.
13
+
14
+ Install: `pip install eventbus-grpc` (depends on `grpc-dc`).
@@ -0,0 +1,9 @@
1
+ README.md
2
+ pyproject.toml
3
+ eventbus_grpc.egg-info/PKG-INFO
4
+ eventbus_grpc.egg-info/SOURCES.txt
5
+ eventbus_grpc.egg-info/dependency_links.txt
6
+ eventbus_grpc.egg-info/requires.txt
7
+ eventbus_grpc.egg-info/top_level.txt
8
+ grpcdc/events_grpc_dc.py
9
+ grpcdc/events_pb.py
@@ -0,0 +1 @@
1
+ grpc-dc>=0.38.0
@@ -0,0 +1,162 @@
1
+ # Generated code: use without restriction (see GENERATED-CODE-LICENSE.md).
2
+ # @generated by protoc-gen-grpc-dc-python. DO NOT EDIT.
3
+ # source: events.proto
4
+
5
+ try:
6
+ from . import events_pb
7
+ except ImportError: # direct module load
8
+ import events_pb
9
+
10
+ import grpcdc
11
+
12
+ class _RecvStream:
13
+ """Client receiving stream: recv() raises EOFError at end."""
14
+
15
+ def __init__(self, stream, resp_cls):
16
+ self._stream = stream
17
+ self._resp_cls = resp_cls
18
+
19
+ def recv(self):
20
+ if self._stream is None:
21
+ raise EOFError("stream closed")
22
+ return self._stream.recv(self._resp_cls())
23
+
24
+ def close(self):
25
+ """Abandon the call early: RST so the server stops."""
26
+ stream, self._stream = self._stream, None
27
+ if stream is not None:
28
+ stream.cancel()
29
+
30
+ def __del__(self):
31
+ self.close()
32
+
33
+ def __enter__(self):
34
+ return self
35
+
36
+ def __exit__(self, *exc):
37
+ self.close()
38
+ return False
39
+
40
+ def __iter__(self):
41
+ return self
42
+
43
+ def __next__(self):
44
+ try:
45
+ return self.recv()
46
+ except EOFError:
47
+ raise StopIteration
48
+
49
+
50
+ class _SendStream:
51
+ """Server-streaming sink passed to service implementations."""
52
+
53
+ def __init__(self, ctx, sink):
54
+ self.context = ctx
55
+ self._sink = sink
56
+
57
+ def send(self, resp):
58
+ self._sink.send(resp.marshal_dc())
59
+
60
+
61
+ class _ClientStreamImpl:
62
+ """Client-streaming stream passed to service implementations."""
63
+
64
+ def __init__(self, ctx, reqs, req_cls):
65
+ self.context = ctx
66
+ self._reqs = reqs
67
+ self._req_cls = req_cls
68
+ self.resp = None
69
+
70
+ def recv(self):
71
+ return self._reqs.recv_into(self._req_cls())
72
+
73
+ def send_and_close(self, resp):
74
+ self.resp = resp
75
+
76
+
77
+ class _BidiStream:
78
+ """Bidi stream passed to service implementations."""
79
+
80
+ def __init__(self, ctx, reqs, sink, req_cls):
81
+ self.context = ctx
82
+ self._reqs = reqs
83
+ self._sink = sink
84
+ self._req_cls = req_cls
85
+
86
+ def send(self, resp):
87
+ self._sink.send(resp.marshal_dc())
88
+
89
+ def recv(self):
90
+ return self._reqs.recv_into(self._req_cls())
91
+
92
+
93
+ class _AsyncRecvStream:
94
+ """Async client receiving stream: async-for or await recv()."""
95
+
96
+ def __init__(self, stream, resp_cls):
97
+ self._stream = stream
98
+ self._resp_cls = resp_cls
99
+
100
+ async def recv(self):
101
+ return await self._stream.recv(self._resp_cls())
102
+
103
+ def cancel(self):
104
+ self._stream.cancel()
105
+
106
+ async def aclose(self):
107
+ self.cancel()
108
+
109
+ def __aiter__(self):
110
+ return self
111
+
112
+ async def __anext__(self):
113
+ try:
114
+ return await self.recv()
115
+ except EOFError:
116
+ raise StopAsyncIteration
117
+
118
+
119
+ class EventBusClient:
120
+ def __init__(self, channel):
121
+ self._channel = channel
122
+
123
+ def Publish(self, req, metadata=None, timeout=None):
124
+ return self._channel.unary("/grpcdc.events.v1.EventBus/Publish", req, events_pb.PublishReply(), metadata, timeout)
125
+
126
+ def Subscribe(self, req, metadata=None, timeout=None):
127
+ stream = self._channel.server_stream("/grpcdc.events.v1.EventBus/Subscribe", req, metadata, timeout)
128
+ return _RecvStream(stream, events_pb.Event)
129
+
130
+ class EventBusClientAsync:
131
+ """Asyncio client: wrap a grpcdc.AsyncChannel (a sync Channel is wrapped)."""
132
+
133
+ def __init__(self, channel):
134
+ if isinstance(channel, grpcdc.AsyncChannel):
135
+ self._channel = channel
136
+ else:
137
+ self._channel = grpcdc.AsyncChannel(channel=channel)
138
+
139
+ async def Publish(self, req, metadata=None, timeout=None):
140
+ return await self._channel.unary("/grpcdc.events.v1.EventBus/Publish", req, events_pb.PublishReply(), metadata, timeout)
141
+
142
+ async def Subscribe(self, req, metadata=None, timeout=None):
143
+ stream = await self._channel.server_stream("/grpcdc.events.v1.EventBus/Subscribe", req, metadata, timeout)
144
+ return _AsyncRecvStream(stream, events_pb.Event)
145
+
146
+ def register_event_bus_server(server, impl):
147
+ def _Publish_handler(ctx, reqs, sink):
148
+ req = reqs.recv_into(events_pb.PublishRequest())
149
+ resp = impl.Publish(ctx, req)
150
+ sink.send(resp.marshal_dc())
151
+
152
+ def _Subscribe_handler(ctx, reqs, sink):
153
+ req = reqs.recv_into(events_pb.SubscribeRequest())
154
+ impl.Subscribe(req, _SendStream(ctx, sink))
155
+
156
+ server.register_service(grpcdc.ServiceDesc(
157
+ "grpcdc.events.v1.EventBus",
158
+ [
159
+ grpcdc.Method("Publish", "/grpcdc.events.v1.EventBus/Publish", grpcdc.KIND_UNARY, _Publish_handler),
160
+ grpcdc.Method("Subscribe", "/grpcdc.events.v1.EventBus/Subscribe", grpcdc.KIND_SERVER_STREAMING, _Subscribe_handler),
161
+ ],
162
+ ))
@@ -0,0 +1,383 @@
1
+ # Generated code: use without restriction (see GENERATED-CODE-LICENSE.md).
2
+ # @generated by protoc-gen-grpc-dc-python. DO NOT EDIT.
3
+ # source: events.proto
4
+
5
+ """Generated protobuf messages (dependency-free wire format)."""
6
+
7
+ import struct as _struct
8
+
9
+
10
+ def _append_varint(out, value):
11
+ v = value & 0xFFFFFFFFFFFFFFFF
12
+ while v > 0x7F:
13
+ out.append((v & 0x7F) | 0x80)
14
+ v >>= 7
15
+ out.append(v)
16
+ return out
17
+
18
+
19
+ def _append_tag(out, field, wire):
20
+ return _append_varint(out, (field << 3) | wire)
21
+
22
+
23
+ def _append_varint_field(out, field, value):
24
+ if value == 0:
25
+ return out
26
+ out = _append_tag(out, field, 0)
27
+ return _append_varint(out, value)
28
+
29
+
30
+ def _append_bytes_field(out, field, data):
31
+ out = _append_tag(out, field, 2)
32
+ out = _append_varint(out, len(data))
33
+ out.extend(data)
34
+ return out
35
+
36
+
37
+ def _append_string_field(out, field, value):
38
+ if value == "":
39
+ return out
40
+ return _append_bytes_field(out, field, value.encode("utf-8"))
41
+
42
+
43
+ def _append_fixed_field(out, field, payload):
44
+ out = _append_tag(out, field, 1 if len(payload) == 8 else 5)
45
+ out.extend(payload)
46
+ return out
47
+
48
+
49
+ class _Reader:
50
+ def __init__(self, buf):
51
+ self.buf = bytes(buf)
52
+ self.pos = 0
53
+
54
+ def varint(self):
55
+ result = 0
56
+ shift = 0
57
+ while True:
58
+ if self.pos >= len(self.buf):
59
+ raise ValueError("truncated varint")
60
+ b = self.buf[self.pos]
61
+ self.pos += 1
62
+ result |= (b & 0x7F) << shift
63
+ if not (b & 0x80):
64
+ return result
65
+ shift += 7
66
+ if shift >= 64:
67
+ raise ValueError("varint too long")
68
+
69
+ def take(self, n):
70
+ if self.pos + n > len(self.buf):
71
+ raise ValueError("truncated field")
72
+ value = self.buf[self.pos:self.pos + n]
73
+ self.pos += n
74
+ return value
75
+
76
+ def field(self):
77
+ if self.pos >= len(self.buf):
78
+ return None
79
+ start = self.pos
80
+ tag = self.varint()
81
+ num, wire = tag >> 3, tag & 7
82
+ if wire == 0:
83
+ return num, wire, self.varint(), self.buf[start:self.pos]
84
+ if wire == 2:
85
+ return num, wire, self.take(self.varint()), self.buf[start:self.pos]
86
+ if wire == 1:
87
+ return num, wire, self.take(8), self.buf[start:self.pos]
88
+ if wire == 5:
89
+ return num, wire, self.take(4), self.buf[start:self.pos]
90
+ raise ValueError("bad wire type")
91
+
92
+
93
+ def _as_int32(value):
94
+ return ((value & 0xFFFFFFFF) ^ 0x80000000) - 0x80000000
95
+
96
+
97
+ def _as_int64(value):
98
+ return ((value & 0xFFFFFFFFFFFFFFFF) ^ 0x8000000000000000) - 0x8000000000000000
99
+
100
+
101
+ def _unzz32(value):
102
+ v = value & 0xFFFFFFFF
103
+ return (v >> 1) ^ -(v & 1)
104
+
105
+
106
+ def _unzz64(value):
107
+ v = value & 0xFFFFFFFFFFFFFFFF
108
+ return (v >> 1) ^ -(v & 1)
109
+
110
+
111
+ class Tag:
112
+ """Enum grpcdc.events.v1.Tag."""
113
+ TAG_UNSPECIFIED = 0
114
+ TOPIC = 1
115
+ SOURCE = 2
116
+ KIND = 3
117
+
118
+
119
+ class TagValue:
120
+ """Message grpcdc.events.v1.TagValue."""
121
+
122
+ def __init__(self, tag=0, string_value="", int_value=0, double_value=0.0, bool_value=False, enum_value=0):
123
+ self.tag = tag
124
+ self.string_value = string_value
125
+ self.int_value = int_value
126
+ self.double_value = double_value
127
+ self.bool_value = bool_value
128
+ self.enum_value = enum_value
129
+ self.unknown_fields = b""
130
+
131
+ def marshal_dc(self):
132
+ out = bytearray()
133
+ out = _append_varint_field(out, 1, self.tag)
134
+ if not (self.int_value or self.double_value or self.bool_value or self.enum_value):
135
+ out = _append_string_field(out, 2, self.string_value)
136
+
137
+ if not (self.double_value or self.bool_value or self.enum_value):
138
+ out = _append_varint_field(out, 3, self.int_value)
139
+
140
+ if not (self.bool_value or self.enum_value):
141
+ if self.double_value: out = _append_fixed_field(out, 4, _struct.pack("<d", self.double_value))
142
+
143
+ if not (self.enum_value):
144
+ out = _append_varint_field(out, 5, (1 if self.bool_value else 0))
145
+
146
+ out = _append_varint_field(out, 6, self.enum_value)
147
+ out += self.unknown_fields
148
+ return bytes(out)
149
+
150
+ def unmarshal_dc(self, data):
151
+ self.unknown_fields = b""
152
+ self.tag = 0
153
+ self.string_value = ""
154
+ self.int_value = 0
155
+ self.double_value = 0.0
156
+ self.bool_value = False
157
+ self.enum_value = 0
158
+ reader = _Reader(data)
159
+ while True:
160
+ item = reader.field()
161
+ if item is None:
162
+ return self
163
+ num, wire, value, raw = item
164
+ if num == 1:
165
+ self.tag = _as_int32(value)
166
+ elif num == 2:
167
+ self.int_value = 0
168
+ self.double_value = 0.0
169
+ self.bool_value = False
170
+ self.enum_value = 0
171
+ self.string_value = value.decode("utf-8")
172
+ elif num == 3:
173
+ self.string_value = ""
174
+ self.double_value = 0.0
175
+ self.bool_value = False
176
+ self.enum_value = 0
177
+ self.int_value = _as_int64(value)
178
+ elif num == 4:
179
+ self.string_value = ""
180
+ self.int_value = 0
181
+ self.bool_value = False
182
+ self.enum_value = 0
183
+ self.double_value = _struct.unpack("<d", value)[0]
184
+ elif num == 5:
185
+ self.string_value = ""
186
+ self.int_value = 0
187
+ self.double_value = 0.0
188
+ self.enum_value = 0
189
+ self.bool_value = (value != 0)
190
+ elif num == 6:
191
+ self.string_value = ""
192
+ self.int_value = 0
193
+ self.double_value = 0.0
194
+ self.bool_value = False
195
+ self.enum_value = _as_int32(value)
196
+ else:
197
+ self.unknown_fields = self.unknown_fields + raw
198
+
199
+ def __eq__(self, other):
200
+ return isinstance(other, TagValue) and self.__dict__ == other.__dict__
201
+
202
+ def __repr__(self):
203
+ return f"TagValue(tag={self.tag!r}, string_value={self.string_value!r}, int_value={self.int_value!r}, double_value={self.double_value!r}, bool_value={self.bool_value!r}, enum_value={self.enum_value!r})"
204
+
205
+
206
+ class PublishRequest:
207
+ """Message grpcdc.events.v1.PublishRequest."""
208
+
209
+ def __init__(self, tags=None, payload=b"", publisher_id=""):
210
+ self.tags = list(tags) if tags is not None else []
211
+ self.payload = payload
212
+ self.publisher_id = publisher_id
213
+ self.unknown_fields = b""
214
+
215
+ def marshal_dc(self):
216
+ out = bytearray()
217
+ for v in self.tags:
218
+ out = _append_bytes_field(out, 1, v.marshal_dc())
219
+ if self.payload: out = _append_bytes_field(out, 2, self.payload)
220
+ out = _append_string_field(out, 3, self.publisher_id)
221
+ out += self.unknown_fields
222
+ return bytes(out)
223
+
224
+ def unmarshal_dc(self, data):
225
+ self.unknown_fields = b""
226
+ self.tags = []
227
+ self.payload = b""
228
+ self.publisher_id = ""
229
+ reader = _Reader(data)
230
+ while True:
231
+ item = reader.field()
232
+ if item is None:
233
+ return self
234
+ num, wire, value, raw = item
235
+ if num == 1:
236
+ tmp = TagValue()
237
+ tmp.unmarshal_dc(value)
238
+ tmp2 = tmp
239
+ self.tags.append(tmp2)
240
+ elif num == 2:
241
+ self.payload = bytes(value)
242
+ elif num == 3:
243
+ self.publisher_id = value.decode("utf-8")
244
+ else:
245
+ self.unknown_fields = self.unknown_fields + raw
246
+
247
+ def __eq__(self, other):
248
+ return isinstance(other, PublishRequest) and self.__dict__ == other.__dict__
249
+
250
+ def __repr__(self):
251
+ return f"PublishRequest(tags={self.tags!r}, payload={self.payload!r}, publisher_id={self.publisher_id!r})"
252
+
253
+
254
+ class PublishReply:
255
+ """Message grpcdc.events.v1.PublishReply."""
256
+
257
+ def __init__(self, seq=0):
258
+ self.seq = seq
259
+ self.unknown_fields = b""
260
+
261
+ def marshal_dc(self):
262
+ out = bytearray()
263
+ out = _append_varint_field(out, 1, self.seq)
264
+ out += self.unknown_fields
265
+ return bytes(out)
266
+
267
+ def unmarshal_dc(self, data):
268
+ self.unknown_fields = b""
269
+ self.seq = 0
270
+ reader = _Reader(data)
271
+ while True:
272
+ item = reader.field()
273
+ if item is None:
274
+ return self
275
+ num, wire, value, raw = item
276
+ if num == 1:
277
+ self.seq = value
278
+ else:
279
+ self.unknown_fields = self.unknown_fields + raw
280
+
281
+ def __eq__(self, other):
282
+ return isinstance(other, PublishReply) and self.__dict__ == other.__dict__
283
+
284
+ def __repr__(self):
285
+ return f"PublishReply(seq={self.seq!r})"
286
+
287
+
288
+ class SubscribeRequest:
289
+ """Message grpcdc.events.v1.SubscribeRequest."""
290
+
291
+ def __init__(self, filter=None):
292
+ self.filter = list(filter) if filter is not None else []
293
+ self.unknown_fields = b""
294
+
295
+ def marshal_dc(self):
296
+ out = bytearray()
297
+ for v in self.filter:
298
+ out = _append_bytes_field(out, 1, v.marshal_dc())
299
+ out += self.unknown_fields
300
+ return bytes(out)
301
+
302
+ def unmarshal_dc(self, data):
303
+ self.unknown_fields = b""
304
+ self.filter = []
305
+ reader = _Reader(data)
306
+ while True:
307
+ item = reader.field()
308
+ if item is None:
309
+ return self
310
+ num, wire, value, raw = item
311
+ if num == 1:
312
+ tmp = TagValue()
313
+ tmp.unmarshal_dc(value)
314
+ tmp2 = tmp
315
+ self.filter.append(tmp2)
316
+ else:
317
+ self.unknown_fields = self.unknown_fields + raw
318
+
319
+ def __eq__(self, other):
320
+ return isinstance(other, SubscribeRequest) and self.__dict__ == other.__dict__
321
+
322
+ def __repr__(self):
323
+ return f"SubscribeRequest(filter={self.filter!r})"
324
+
325
+
326
+ class Event:
327
+ """Message grpcdc.events.v1.Event."""
328
+
329
+ def __init__(self, tags=None, payload=b"", seq=0, publisher_id="", timestamp_unix_ms=0):
330
+ self.tags = list(tags) if tags is not None else []
331
+ self.payload = payload
332
+ self.seq = seq
333
+ self.publisher_id = publisher_id
334
+ self.timestamp_unix_ms = timestamp_unix_ms
335
+ self.unknown_fields = b""
336
+
337
+ def marshal_dc(self):
338
+ out = bytearray()
339
+ for v in self.tags:
340
+ out = _append_bytes_field(out, 1, v.marshal_dc())
341
+ if self.payload: out = _append_bytes_field(out, 2, self.payload)
342
+ out = _append_varint_field(out, 3, self.seq)
343
+ out = _append_string_field(out, 4, self.publisher_id)
344
+ out = _append_varint_field(out, 5, self.timestamp_unix_ms)
345
+ out += self.unknown_fields
346
+ return bytes(out)
347
+
348
+ def unmarshal_dc(self, data):
349
+ self.unknown_fields = b""
350
+ self.tags = []
351
+ self.payload = b""
352
+ self.seq = 0
353
+ self.publisher_id = ""
354
+ self.timestamp_unix_ms = 0
355
+ reader = _Reader(data)
356
+ while True:
357
+ item = reader.field()
358
+ if item is None:
359
+ return self
360
+ num, wire, value, raw = item
361
+ if num == 1:
362
+ tmp = TagValue()
363
+ tmp.unmarshal_dc(value)
364
+ tmp2 = tmp
365
+ self.tags.append(tmp2)
366
+ elif num == 2:
367
+ self.payload = bytes(value)
368
+ elif num == 3:
369
+ self.seq = value
370
+ elif num == 4:
371
+ self.publisher_id = value.decode("utf-8")
372
+ elif num == 5:
373
+ self.timestamp_unix_ms = _as_int64(value)
374
+ else:
375
+ self.unknown_fields = self.unknown_fields + raw
376
+
377
+ def __eq__(self, other):
378
+ return isinstance(other, Event) and self.__dict__ == other.__dict__
379
+
380
+ def __repr__(self):
381
+ return f"Event(tags={self.tags!r}, payload={self.payload!r}, seq={self.seq!r}, publisher_id={self.publisher_id!r}, timestamp_unix_ms={self.timestamp_unix_ms!r})"
382
+
383
+
@@ -0,0 +1,15 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "eventbus-grpc"
7
+ version = "0.38.0"
8
+ description = "Event bus over gRPC — generated grpcdc.events.v1 publish/subscribe clients over WebRTC DataChannels, via the grpc-dc runtime (Python)"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = {text = "Apache-2.0"}
12
+ dependencies = ["grpc-dc>=0.38.0"]
13
+
14
+ [tool.setuptools.packages.find]
15
+ include = ["grpcdc*"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+