11import os
2- import redis
32import json
3+ from durable .lang import *
44from durable import engine
5- from durable import interface
6- from werkzeug .routing import Rule
75from werkzeug .wrappers import Request , Response
6+ from werkzeug .routing import Map , Rule
7+ from werkzeug .exceptions import HTTPException , NotFound
88from werkzeug .wsgi import SharedDataMiddleware
9-
9+ from werkzeug . serving import run_simple
1010
1111class Host (engine .Host ):
1212
1313 def __init__ (self ):
1414 super (Host , self ).__init__ ()
15- self ._redis_server = redis .Redis ()
1615
1716 def get_action (self , action_name ):
1817 def print_lamba (c ):
@@ -21,25 +20,57 @@ def print_lamba(c):
2120
2221 return print_lamba ;
2322
24- def load_ruleset (self , ruleset_name ):
25- ruleset_definition = self ._redis_server .hget ('rulesets' , ruleset_name )
26- if ruleset_definition :
27- return json .loads (ruleset_definition )
28- else :
29- raise Exception ('Ruleset with name {0} not found' .format (ruleset_name ))
3023
31- def save_ruleset (self , ruleset_name , ruleset_definition ):
32- print ('save ' + json .dumps (ruleset_definition ))
33- self ._redis_server .hset ('rulesets' , ruleset_name , json .dumps (ruleset_definition ))
24+ class Application (object ):
25+
26+ def __init__ (self ):
27+ self ._url_map = Map ([Rule ('/<ruleset_name>/definition' , endpoint = self ._ruleset_definition_request ),
28+ Rule ('/<ruleset_name>/state/<sid>' , endpoint = self ._state_request ),
29+ Rule ('/<ruleset_name>/events/<sid>' , endpoint = self ._events_request ),
30+ Rule ('/testdynamic.html' , endpoint = self ._dynamic_request ),
31+ Rule ('/durableVisual.js' , endpoint = self ._dynamic_request ),
32+ Rule ('/<ruleset_name>/<sid>/admin.html' , endpoint = self ._admin_request ),
33+ Rule ('/favicon.ico' , endpoint = self ._empty )])
3434
35+ self ._host = Host ();
3536
36- class Application (interface .Application ):
3737
38- def __init__ (self , host ):
39- super (Application , self ).__init__ (host , '127.0.0.1' , 5000 , [Rule ('/testdynamic.html' , endpoint = self ._dynamic_request ),
40- Rule ('/durableVisual.js' , endpoint = self ._dynamic_request ),
41- Rule ('/<ruleset_name>/<sid>/admin.html' , endpoint = self ._admin_request ),
42- Rule ('/favicon.ico' , endpoint = self ._empty )])
38+ def _ruleset_definition_request (self , environ , start_response , ruleset_name ):
39+ def encode_promise (obj ):
40+ if isinstance (obj , engine .Promise ) or hasattr (obj , '__call__' ):
41+ return 'function'
42+ raise TypeError (repr (obj ) + " is not JSON serializable" )
43+
44+ request = Request (environ )
45+ if request .method == 'GET' :
46+ result = self ._host .get_ruleset (ruleset_name )
47+ return Response (json .dumps (result .get_definition (), default = encode_promise ))(environ , start_response )
48+ elif request .method == 'POST' :
49+ ruleset_definition = json .loads (request .stream .read ().decode ('utf-8' ))
50+ self ._host .set_rulesets (ruleset_definition )
51+
52+ return Response ()(environ , start_response )
53+
54+ def _state_request (self , environ , start_response , ruleset_name , sid ):
55+ request = Request (environ )
56+ result = None
57+ if request .method == 'GET' :
58+ result = self ._host .get_state (ruleset_name , sid )
59+ return Response (json .dumps (result ))(environ , start_response )
60+ elif request .method == 'POST' :
61+ message = json .loads (request .stream .read ().decode ('utf-8' ))
62+ message ['sid' ] = sid
63+ result = self ._host .update_state (ruleset_name , message )
64+ return Response (json .dumps ({'outcome' : result }))(environ , start_response )
65+
66+ def _events_request (self , environ , start_response , ruleset_name , sid ):
67+ request = Request (environ )
68+ result = None
69+ if request .method == 'POST' :
70+ message = json .loads (request .stream .read ().decode ('utf-8' ))
71+ message ['sid' ] = sid
72+ result = self ._host .post (ruleset_name , message )
73+ return Response (json .dumps ({'outcome' : result }))(environ , start_response )
4374
4475 def _empty (self , environ , start_response ):
4576 return Response ()(environ , start_response )
@@ -55,8 +86,19 @@ def _admin_request(self, environ, start_response, ruleset_name, sid):
5586 middleware = SharedDataMiddleware (self ._not_found , {'/{0}/{1}/' .format (ruleset_name , sid ): os .path .dirname (__file__ )})
5687 return middleware (environ , start_response )
5788
89+ def __call__ (self , environ , start_response ):
90+ request = Request (environ )
91+ adapter = self ._url_map .bind_to_environ (environ )
92+ try :
93+ endpoint , values = adapter .match ()
94+ return endpoint (environ , start_response , ** values )
95+ except HTTPException as e :
96+ return e
97+
98+ def run (self ):
99+ run_simple ('127.0.0.1' , 5000 , self , threaded = True )
100+
101+
58102if __name__ == '__main__' :
59- main_host = Host ()
60- main_host .run ()
61- main_app = Application (main_host )
103+ main_app = Application ()
62104 main_app .run ()
0 commit comments