some backup codes - wookay/BlenderPlot.jl GitHub Wiki

using UUIDs
pkg = Base.PkgId(UUID("bf623aeb-1218-402c-922b-c259951e1c13"), "PushInterface")
sourcepath = Base.locate_package(pkg)
include(normpath(dirname(sourcepath), "..", "examples", "blenderplot", "example.jl"))
include(normpath(dirname(sourcepath), "..", "examples", "pushinterface", "rtmidi", "set_led.jl"))
# ~/blender-build/blender/release/scripts/modules/web.py
import pyuv
import threading
import signal

# code from https://github.com/saghul/pyuv/blob/v1.x/tests/benchmark-tcp.py
RESPONSE = "HTTP/1.1 200 OK\r\n" \
           "Content-Type: text/plain\r\n" \
           "Content-Length: 12\r\n" \
           "\r\n" \
           "hello world\n"

class Server:
    def __init__(self):
        self.clients = []
        loop = pyuv.Loop.default_loop()
        self.ac = pyuv.Async(loop, self.async_close)
        self.signal_h = pyuv.Signal(loop)
        self.signal_h.start(self.signal_cb, signal.SIGINT)

    def start(self, port):
        self.server = pyuv.TCP(self.ac.loop)
        self.server.bind(("0.0.0.0", port))
        self.server.listen(self.on_connection)
        threading.Thread(target=self.ac.loop.run).start()

    def on_client_shutdown(self, client, error):
        client.close()
        self.clients.remove(client)

    def on_read(self, client, data, error):
        if data is None:
            client.close()
            self.clients.remove(client)
            return
        data = data.strip()
        if not data:
            return
        print("on_read", data)
        client.write(bytes(RESPONSE, 'utf-8'))
        client.shutdown(self.on_client_shutdown)

    def on_connection(self, server, error):
        client = pyuv.TCP(self.server.loop)
        server.accept(client)
        self.clients.append(client)
        client.start_read(self.on_read)

    def stop(self):
        self.ac.send()

    def signal_cb(self, handle, signum):
        self.ac.send()

    def async_close(self, ac):
        print("closing...")
        [c.close() for c in self.clients]
        ac.close()
        self.signal_h.close()
        self.server.close()
        ac.loop.stop()


if __name__ == '__main__':
    PORT = 1234
    serv = Server()
    serv.start(PORT)
    print("serv", PORT, "...")
    input(">> ")
    serv.stop()