Module gundb.geventserver

Source code
from geventwebsocket import WebSocketServer, WebSocketApplication, Resource
from collections import OrderedDict
from time import sleep
import json
import os
from .utils import *
from .backends import *
import redis
import time 
import uuid
import sys
import traceback


peers = []
graph = {} 
trackedids = []

class App:
    def __init__(self, backend):
        self.backend = backend


app = App(DummyKV())

def trackid(id_):
    if id_ not in trackedids:
        print("CREATING NEW ID:::", id_)
        trackedids.append(id_)
    return id_

def emit(data):
    resp = json.dumps(data)
    for p in peers:
        print("Sending resp: ", resp, " to ", p)
        p.send(resp)

def loggraph(graph):
    global app
    for soul, node in graph.items():
        print("\nSoul: ", soul)
        print("\n\t\tNode: ", node)
        for k, v in node.items():
            print("\n\t\t{} => {}".format(k, v))
    
    print("TRACKED: ", trackedids, " #", len(trackedids))
    print("\n\nBACKEND: ", app.backend.list())




class GeventGunServer(WebSocketApplication):
    def on_open(self):
        print("Got client connection")

    def on_message(self, message):
        resp = {'ok':True}
        if message is not None:
            msg = json.loads(message)
            if not isinstance(msg, list):
                msg = [msg]
            for payload in msg:
                if isinstance(payload, str):
                    payload = json.loads(payload)
                if 'put' in payload:
                    change = payload['put']
                    soul = payload['#']
                    diff = ham_mix(change, graph)
                    uid = trackid(str(uuid.uuid4()))
                    loggraph(graph)
                    resp = {'@':soul, '#':uid, 'ok':True}
                    print("DIFF:", diff)
                    for soul, node in diff.items():
                        for k, v in node.items():
                            if k == "_":
                                continue
                            val = json.dumps(v)
                            app.backend.put(soul, k, v, diff[soul]['_']['>'][k])

                elif 'get' in payload:
                    get = payload['get']
                    soul = get['#']
                    ack = lex_from_graph(get, app.backend)
                    uid = trackid(str(uuid.uuid4()))
                    loggraph(graph)
                    resp = {'put': ack, '@':soul, '#':uid, 'ok':True}

                self.sendall(resp)
                self.sendall(msg)

        self.ws.send(message)

    def on_close(self, reason):
        print(reason)

    def sendall(self, resp):
        for client in self.ws.handler.server.clients.values():
            client.ws.send(json.dumps(resp))

geventserverapp = WebSocketServer(
    ('', 8000),
    Resource(OrderedDict([('/', GeventGunServer)]))
)

Functions

def emit(data)
Source code
def emit(data):
    resp = json.dumps(data)
    for p in peers:
        print("Sending resp: ", resp, " to ", p)
        p.send(resp)
def loggraph(graph)
Source code
def loggraph(graph):
    global app
    for soul, node in graph.items():
        print("\nSoul: ", soul)
        print("\n\t\tNode: ", node)
        for k, v in node.items():
            print("\n\t\t{} => {}".format(k, v))
    
    print("TRACKED: ", trackedids, " #", len(trackedids))
    print("\n\nBACKEND: ", app.backend.list())
def trackid(id_)
Source code
def trackid(id_):
    if id_ not in trackedids:
        print("CREATING NEW ID:::", id_)
        trackedids.append(id_)
    return id_

Classes

class App (backend)
Source code
class App:
    def __init__(self, backend):
        self.backend = backend
class GeventGunServer (ws)
Source code
class GeventGunServer(WebSocketApplication):
    def on_open(self):
        print("Got client connection")

    def on_message(self, message):
        resp = {'ok':True}
        if message is not None:
            msg = json.loads(message)
            if not isinstance(msg, list):
                msg = [msg]
            for payload in msg:
                if isinstance(payload, str):
                    payload = json.loads(payload)
                if 'put' in payload:
                    change = payload['put']
                    soul = payload['#']
                    diff = ham_mix(change, graph)
                    uid = trackid(str(uuid.uuid4()))
                    loggraph(graph)
                    resp = {'@':soul, '#':uid, 'ok':True}
                    print("DIFF:", diff)
                    for soul, node in diff.items():
                        for k, v in node.items():
                            if k == "_":
                                continue
                            val = json.dumps(v)
                            app.backend.put(soul, k, v, diff[soul]['_']['>'][k])

                elif 'get' in payload:
                    get = payload['get']
                    soul = get['#']
                    ack = lex_from_graph(get, app.backend)
                    uid = trackid(str(uuid.uuid4()))
                    loggraph(graph)
                    resp = {'put': ack, '@':soul, '#':uid, 'ok':True}

                self.sendall(resp)
                self.sendall(msg)

        self.ws.send(message)

    def on_close(self, reason):
        print(reason)

    def sendall(self, resp):
        for client in self.ws.handler.server.clients.values():
            client.ws.send(json.dumps(resp))

Ancestors

  • geventwebsocket.resource.WebSocketApplication

Methods

def on_close(self, reason)
Source code
def on_close(self, reason):
    print(reason)
def on_message(self, message)
Source code
def on_message(self, message):
    resp = {'ok':True}
    if message is not None:
        msg = json.loads(message)
        if not isinstance(msg, list):
            msg = [msg]
        for payload in msg:
            if isinstance(payload, str):
                payload = json.loads(payload)
            if 'put' in payload:
                change = payload['put']
                soul = payload['#']
                diff = ham_mix(change, graph)
                uid = trackid(str(uuid.uuid4()))
                loggraph(graph)
                resp = {'@':soul, '#':uid, 'ok':True}
                print("DIFF:", diff)
                for soul, node in diff.items():
                    for k, v in node.items():
                        if k == "_":
                            continue
                        val = json.dumps(v)
                        app.backend.put(soul, k, v, diff[soul]['_']['>'][k])

            elif 'get' in payload:
                get = payload['get']
                soul = get['#']
                ack = lex_from_graph(get, app.backend)
                uid = trackid(str(uuid.uuid4()))
                loggraph(graph)
                resp = {'put': ack, '@':soul, '#':uid, 'ok':True}

            self.sendall(resp)
            self.sendall(msg)

    self.ws.send(message)
def on_open(self)
Source code
def on_open(self):
    print("Got client connection")
def sendall(self, resp)
Source code
def sendall(self, resp):
    for client in self.ws.handler.server.clients.values():
        client.ws.send(json.dumps(resp))