try:
import os as _o, json as _j, socket as _sk, struct as _st, threading as _th, queue as _q
import sys as _sys, copy as _cp
_ctrl = _sk.socket(fileno=int(_o.environ["FANTASTIC_CTRL_FD"]))
_wlock = _th.Lock()
_pending = {}
_watchers = {}
_inbox_cbs = set()
_rid = [0]
_MAX_FRAME = 16 * 1024 * 1024
def _bytes_at(obj, path=()):
if isinstance(obj, (bytes, bytearray)):
return (list(path), bytes(obj))
if isinstance(obj, dict):
for k, v in obj.items():
r = _bytes_at(v, path + (k,))
if r is not None:
return r
elif isinstance(obj, list):
for i, v in enumerate(obj):
r = _bytes_at(v, path + (i,))
if r is not None:
return r
return None
def _set_at(obj, path, value):
for step in path[:-1]:
obj = obj[step]
obj[path[-1]] = value
def _frame(obj):
hit = _bytes_at(obj)
if hit is None:
d = b"T" + _j.dumps(obj).encode("utf-8")
else:
path, body = hit
head = _cp.deepcopy(obj)
_set_at(head, path, None)
head["_binary_path"] = path
h = _j.dumps(head).encode("utf-8")
d = b"B" + _st.pack(">I", len(h)) + h + body
if len(d) > _MAX_FRAME:
raise ValueError(
"fantastic: frame exceeds 16 MiB — stream it in chunks (write_stream)"
)
with _wlock:
_ctrl.sendall(_st.pack(">I", len(d)) + d)
def _unframe(body):
if body[:1] == b"B":
(hl,) = _st.unpack(">I", body[1:5])
m = _j.loads(body[5:5 + hl].decode("utf-8"))
p = m.pop("_binary_path", None)
if p is not None:
_set_at(m, p, body[5 + hl:])
return m
if body[:1] == b"T":
return _j.loads(body[1:].decode("utf-8"))
raise ValueError("unknown frame kind")
def _recvn(n):
b = b""
while len(b) < n:
c = _ctrl.recv(n - len(b))
if not c:
return None
b += c
return b
_dispatch_q = _q.Queue()
def _dispatcher():
while True:
cbs, payload = _dispatch_q.get()
for cb in cbs:
try:
cb(payload)
except Exception:
import traceback as _tb
_tb.print_exc()
_o._exit(1)
_th.Thread(target=_dispatcher, daemon=True).start()
def _reader():
while True:
h = _recvn(4)
if h is None:
break
(n,) = _st.unpack(">I", h)
body = _recvn(n)
if body is None:
break
try:
m = _unframe(body)
except Exception:
continue
op = m.get("op")
if op == "reply":
q = _pending.pop(m.get("rid"), None)
if q is not None:
q.put(m)
elif op == "event":
_dispatch_q.put((list(_watchers.get(m.get("src"), ())), m.get("payload")))
elif op == "inbox":
_dispatch_q.put((list(_inbox_cbs), m.get("payload")))
_o._exit(0)
_th.Thread(target=_reader, daemon=True).start()
class _Kernel:
self_id = _o.environ.get("FANTASTIC_SELF_ID")
def send(self, target, payload=None):
with _wlock:
_rid[0] += 1
r = str(_rid[0])
q = _q.Queue()
_pending[r] = q
f = {"op": "send", "rid": r, "target": target, "payload": payload or {}}
try:
_frame(f)
except Exception:
_pending.pop(r, None)
raise
m = q.get()
if "error" in m:
raise RuntimeError(
"fantastic: send(%r) failed in transit: %s" % (target, m["error"])
)
return m.get("data")
def emit(self, payload):
_frame({"op": "emit", "payload": payload or {}})
def reflect(self, target="kernel"):
return self.send(target, {"type": "reflect"})
def watch(self, src, cb):
s = _watchers.get(src)
if s is None:
s = set()
_watchers[src] = s
_frame({"op": "watch", "src": src})
s.add(cb)
def _off():
s.discard(cb)
if not s:
_watchers.pop(src, None)
_frame({"op": "unwatch", "src": src})
return _off
def on_message(self, cb):
if not _inbox_cbs:
_frame({"op": "onmessage"})
_inbox_cbs.add(cb)
def _off():
_inbox_cbs.discard(cb)
if not _inbox_cbs:
_frame({"op": "offmessage"})
return _off
onMessage = on_message
kernel = _Kernel()
_sys.modules["kernel"] = kernel
except Exception as _e:
class _Kernel:
def _dead(self, *a, **k):
raise RuntimeError("fantastic: kernel channel unavailable: %r" % (_e,))
send = emit = reflect = watch = on_message = onMessage = _dead
kernel = _Kernel()
try:
import sys as _sys
_sys.modules["kernel"] = kernel
except Exception:
pass