Browse Source

initial commit jsyncdb monorepo

master
jfinn 10 months ago
commit
6bf16049ed

+ 1
- 0
.gitignore View File

@@ -0,0 +1 @@
1
+*.pyc

+ 9
- 0
README.md View File

@@ -0,0 +1,9 @@
1
+# <p align="center">jsyncdb</p>
2
+
3
+Jsyncdb synchronizes json compatable javascript objects
4
+This will be a mono repo for jsyncdb clients and servers
5
+
6
+**Author:** 
7
+[Joseph Innace](https://github.com/JInnace)
8
+
9
+> Written with [StackEdit](https://stackedit.io/).

+ 106
- 0
flask_server/app.py View File

@@ -0,0 +1,106 @@
1
+from flask import Flask, render_template
2
+from flask_sock import Sock
3
+import flask
4
+import hot_reload_mod_i2
5
+import gmod
6
+
7
+# app = Flask(__name__)
8
+app = Flask(__name__,template_folder = r"../js_client")
9
+
10
+
11
+sock = Sock(app)
12
+
13
+
14
+
15
+
16
+gmod.glob["sock"] = sock
17
+gmod.glob["app"] = app
18
+
19
+class Eobj():
20
+	pass
21
+
22
+eobj = Eobj()
23
+gmod.gx =eobj
24
+
25
+import rld_m0
26
+import rld_m1
27
+import rld_m2
28
+import rld_m3
29
+# import rld_m4
30
+# import rld_m5
31
+
32
+p=print
33
+
34
+
35
+@app.route('/')
36
+def index():
37
+	print("::::::::::::::;")
38
+	# return render_template('jsyncdb_index_v5.html')
39
+	return render_template('index.html')
40
+
41
+# r'''
42
+@app.route('/shared_libs/<path:path>')
43
+def send_report2(path):
44
+	return flask.send_file('templates/jquery-3.5.1.min.js')
45
+
46
+@app.route('/<path:path>')
47
+def send_report(path):
48
+	return flask.send_from_directory('templates', path)
49
+	# return flask.send_from_directory('./', path)
50
+# '''
51
+
52
+
53
+@sock.route('/echo')
54
+def echo(sock):
55
+	while True:
56
+		data = sock.receive()
57
+		sock.send(data)
58
+
59
+
60
+
61
+# @sock.route('/echo_c1')
62
+# def echo_coll(sock):
63
+# 	p("echo_coll app")
64
+# 	while True:
65
+# 		data = sock.receive()
66
+# 		sock.send(data)
67
+
68
+
69
+
70
+
71
+
72
+# @sock.route('/<path:path>')
73
+# def echo23(sock,*a,**kw):
74
+#	 p("E2",a,kw)
75
+#	 while True:
76
+#		 data = sock.receive()
77
+#		 sock.send(data)
78
+#		 for en in dir(sock):
79
+#			 p(en)
80
+# p("echo23",echo23)
81
+
82
+
83
+# p("~83293298383838383")
84
+r'''
85
+for en in dir(sock):
86
+	print(".",en)
87
+
88
+for en in dir(app):
89
+	print("~",en)
90
+'''
91
+
92
+
93
+
94
+import inspect
95
+print("APP_ORIG",sock.route)
96
+print("APP_ORIG",app.route)
97
+print("APP_ORIG",inspect.getfile(app.route))
98
+print("APP_ORIG",app.url_map)
99
+if __name__ == '__main__':
100
+	pass
101
+	# socketio.run(app, debug=True)
102
+	app.run(debug=True,host='0.0.0.0')
103
+	# sock.run(app,host='0.0.0.0', debug=True,allow_unsafe_werkzeug=True)
104
+
105
+
106
+

+ 78
- 0
flask_server/gmod.py View File

@@ -0,0 +1,78 @@
1
+# import gmod2
2
+
3
+
4
+print("===========================================================================================================================================")
5
+
6
+
7
+OKBLUE = '\033[94m'
8
+ENDC = '\033[0m'
9
+
10
+# print("GLOBA_REINIT" ,OKBLUE,"###################################################################",ENDC)
11
+
12
+glob = {}
13
+dbg_glob = {}
14
+
15
+
16
+
17
+
18
+
19
+glob["WSGI_RLD_HANDLERS"] = []
20
+def before_mod_rld(mod,*a,**kw):
21
+	h = getattr(mod,"MOD_RLD_HANDLERS",None)
22
+	print("before_mod_rld:",mod,h)
23
+	cnt=0
24
+	while h:
25
+		fn=h.pop()
26
+		print(cnt)
27
+		cnt+=1
28
+
29
+		fn()
30
+
31
+def reg_mod_rld_handler(mod,fn,*a,**kw):
32
+	h = getattr(mod,"MOD_RLD_HANDLERS",None)
33
+	if h is None:
34
+		mod.MOD_RLD_HANDLERS = []
35
+		h= mod.MOD_RLD_HANDLERS
36
+	h.append(fn)
37
+	print("reg_mod_rld_handler:",h,mod)
38
+
39
+
40
+
41
+def unreg_rld_handler(fn,*a,**kw):
42
+	if fn in glob["WSGI_RLD_HANDLERS"]:
43
+		print("unreg_rld_handler",fn)
44
+		glob["WSGI_RLD_HANDLERS"].remove(fn)
45
+	else:
46
+		print("unreg_rld_handler~~~",fn)
47
+		# print()
48
+
49
+
50
+def reg_rld_handler(fn,*a,**kw):
51
+	glob["WSGI_RLD_HANDLERS"].append(fn)
52
+def before_wsgi_rld(s=""):
53
+	print("before_wsgi_rld:",s)
54
+	cnt=0
55
+	while glob["WSGI_RLD_HANDLERS"]:
56
+		fn=glob["WSGI_RLD_HANDLERS"].pop()
57
+		print(cnt)
58
+		cnt+=1
59
+
60
+		fn()
61
+
62
+
63
+
64
+
65
+
66
+
67
+# or should we do import
68
+# is this better or the worst way we shall find out
69
+def W():
70
+	return glob
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+

+ 170
- 0
flask_server/hot_reload_mod_i2.py View File

@@ -0,0 +1,170 @@
1
+
2
+
3
+from werkzeug import _reloader
4
+p=print
5
+
6
+import typing as t
7
+import threading
8
+
9
+import sys
10
+import os
11
+import importlib
12
+import traceback
13
+
14
+
15
+custom_rld_substr = "rld"
16
+custom_rld_list = []
17
+mscope={
18
+	"ReloaderLoop_trigger_reload": _reloader.ReloaderLoop.trigger_reload,
19
+	"WatchdogReloaderLoop_trigger_reload": _reloader.WatchdogReloaderLoop.trigger_reload,
20
+}
21
+
22
+def reset_mtime(reloader,file_path):
23
+		old_time = reloader.mtimes.get(file_path)
24
+		mtime = os.stat(file_path).st_mtime
25
+		reloader.mtimes[file_path]=mtime
26
+
27
+		return {
28
+			"old_time":old_time,
29
+			"new_time":mtime,
30
+		}
31
+
32
+
33
+def search_for_mod_by_path(file_path):
34
+	# for module in list(sys.modules.values()):
35
+	for mod_name,module in list(sys.modules.items()):
36
+		mod_path = getattr(module, "__file__", None) 
37
+		if file_path == mod_path:
38
+			return module
39
+		# if not module:
40
+			# p("iojdwoqjdqoidjqwoidj")
41
+		# if not name:
42
+			# p(mod_name,module,type(module))
43
+		# p("~",name)
44
+
45
+
46
+
47
+
48
+def path_match_rld_mod(file_path):
49
+	if file_path is None:
50
+		return file_path
51
+	return file_path in custom_rld_list or custom_rld_substr in file_path
52
+def maybe_custom_reload(reloader,file_path):
53
+
54
+	# if file_path in custom_rld_list or custom_rld_substr in file_path:
55
+	if path_match_rld_mod(file_path):
56
+
57
+		# p(dir(reloader))
58
+		st= reset_mtime(reloader,file_path)
59
+		mod = search_for_mod_by_path(file_path)
60
+
61
+		#TODO: this is the important part refactor out later
62
+		if mod:
63
+			# gmod.before_mod_rld(mod)
64
+			# reimp = importlib.reload(mod)
65
+			try:
66
+				pass
67
+				reimp = importlib.reload(mod)
68
+			except Exception as E:
69
+				p("EXC@@@@@@@@@@@@")
70
+				print(traceback.format_exc())
71
+
72
+		else:
73
+			reimp="~~"
74
+			p("module not found with path:",file_path)
75
+		# importlib.reload(None)
76
+		# module==type(sys.modules["rld_m1"])
77
+		# p(type(sys.modules["rld_m1"]),)
78
+
79
+		# p("maybe_custom_reload!!!",st,reimp)
80
+		return 1
81
+		
82
+
83
+	r'''
84
+	try:
85
+		cnt=0
86
+		while gmod.glob["on_before_app_reload"]:
87
+			gmod.glob["on_before_app_reload"].pop()()
88
+			print("BEFORE RELOAD,,",cnt,OKBLUE3,"###################################################################",ENDC)
89
+		pass
90
+	except Exception as E:
91
+		print("I WOULD PANIC BUT PANIC HAS NOT BEEN IMPLIMENTED",E)
92
+
93
+	pass
94
+	# '''
95
+
96
+
97
+
98
+def t_rld1(self,file_path,*args,**kwargs):
99
+	# p("extra_files",args[0].extra_files)
100
+
101
+	p("t_rld1",self,file_path,args,kwargs)
102
+	p("```````````````````````````````````````")
103
+	p()
104
+	# if (file_path == r"C:\ws\repos\flask_apps\flask_example\rld_m2.py"):
105
+		# p("~~~%%%%%%%%%%%%%%%%%%%%%%5")
106
+		# return
107
+
108
+
109
+	if maybe_custom_reload(self,file_path):
110
+		pass
111
+	else:
112
+		# gmod.before_wsgi_rld("will rld")
113
+		p("...................")
114
+		mscope["ReloaderLoop_trigger_reload"](self,file_path,*args,**kwargs)
115
+		p("...................>")
116
+	# p("exclude_patterns",args[0].exclude_patterns)
117
+
118
+
119
+	
120
+def t_rld2(*args,**kwargs):
121
+	p("t_rld2",args,kwargs)
122
+	mscope["WatchdogReloaderLoop_trigger_reload"](*args,**kwargs)
123
+
124
+_reloader.ReloaderLoop.trigger_reload = t_rld1
125
+_reloader.WatchdogReloaderLoop.trigger_reload = t_rld2
126
+
127
+
128
+def run_with_reloader2(
129
+	main_func: t.Callable[[], None],
130
+	extra_files: t.Iterable[str] | None = None,
131
+	exclude_patterns: t.Iterable[str] | None = None,
132
+	interval: int | float = 1,
133
+	reloader_type: str = "auto",
134
+) -> None:
135
+	"""Run the given function in an independent Python interpreter."""
136
+	import signal
137
+	import os
138
+	print("")
139
+	print("")
140
+	print("")
141
+	print("")
142
+	print("run_with_reloader2!")
143
+	print("RLDI",main_func,extra_files,exclude_patterns,interval,reloader_type)
144
+
145
+	signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
146
+	reloader = _reloader.reloader_loops[reloader_type](
147
+		extra_files=extra_files, exclude_patterns=exclude_patterns, interval=interval
148
+	)
149
+	mscope["reloader"]=reloader
150
+
151
+	try:
152
+		if os.environ.get("WERKZEUG_RUN_MAIN") == "true":
153
+			_reloader.ensure_echo_on()
154
+			t = threading.Thread(target=main_func, args=())
155
+			t.daemon = True
156
+
157
+			# Enter the reloader to set up initial state, then start
158
+			# the app thread and reloader update loop.
159
+			with reloader:
160
+				t.start()
161
+				reloader.run()
162
+		else:
163
+			# gmod.before_wsgi_rld("restart_with_reloader")
164
+			sys.exit(reloader.restart_with_reloader())
165
+	except KeyboardInterrupt:
166
+		# gmod.before_wsgi_rld("um actually exiting")
167
+		pass
168
+
169
+
170
+_reloader.run_with_reloader = run_with_reloader2

+ 19
- 0
flask_server/rld_m0.py View File

@@ -0,0 +1,19 @@
1
+
2
+from simple_websocket import Server
3
+from simple_websocket.ws import Base
4
+
5
+
6
+p=print
7
+
8
+
9
+
10
+def _srv_rec(self,msg,*a,**kw):
11
+	# print("QQQQQQQQQQQQQQQQQQQQQQQQQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK")
12
+	# p("_srv_rec","FROM_GROUPFROM_GROUPFROM_GROUPFROM_GROUP",self.connected,a,kw)
13
+	# p("_srv_rec","FROM_GROUPFROM_GROUPFROM_GROUPFROM_GROUP",self.connected,msg)
14
+	# self.send("FROM_GROUP")
15
+	self.send(msg[1])
16
+
17
+
18
+
19
+Server._srv_rec =_srv_rec

+ 229
- 0
flask_server/rld_m1.py View File

@@ -0,0 +1,229 @@
1
+
2
+
3
+import gmod
4
+
5
+import inspect
6
+import flask.sansio.scaffold
7
+
8
+print(",,,")
9
+
10
+p=print
11
+
12
+sock = gmod.glob["sock"] 
13
+app = gmod.glob["app"] 
14
+
15
+# if not "" in gmod.glob
16
+
17
+OKBLUE = '\033[94m'
18
+ENDC = '\033[0m'
19
+
20
+gx = gmod.gx
21
+
22
+def um_info(o):
23
+	p()
24
+	# return
25
+	for en in dir(o):
26
+		# if "url" not in en:continue
27
+		attr = getattr(o,en,"NO ATTR")
28
+		p(OKBLUE,en,ENDC)
29
+		p(attr)
30
+	p()
31
+	# for r in app.url_map.iter_rules:
32
+		# p(:)
33
+	# for en in o:
34
+		# p(en)
35
+
36
+def what(*a,**kw):
37
+	p("WHAT",a,kw)
38
+
39
+def what2(*a,**kw):
40
+	p("WHAT2",a,kw)
41
+
42
+def route_or_replace_v0(*a,**kw):
43
+	o ={
44
+	"rld":0
45
+	}
46
+	p("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ.")
47
+	def dec(fn):
48
+		p("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ")
49
+		p(fn.__name__,fn)
50
+		p(inspect.getsource(fn))
51
+		# if app._got_first_request or fn.__name__ in app.view_functions:
52
+		if fn.__name__ in app.view_functions:
53
+			o["rld"]=1
54
+			# if started and not app.view_functions no real change??
55
+			p("...fr 0",fn,a,kw)
56
+
57
+			# app.view_functions[fn.__name__] = fn
58
+			app.view_functions[fn.__name__] = flask.sansio.scaffold.setupmethod(what2)
59
+			return fn
60
+		else:
61
+			return sock.route(*a,**kw)(fn)
62
+			pass
63
+	if o["rld"]:
64
+		return what
65
+	else:
66
+		return dec
67
+
68
+# def 
69
+
70
+
71
+
72
+
73
+
74
+def route_or_replace(path,*a,**kw):
75
+	o = {"rld":0}
76
+	def dec(fn):
77
+		if fn.__name__ in app.view_functions:
78
+			o["rld"]=1
79
+			p("RLD!!!")
80
+		else:
81
+			return sock.route(path,*a,**kw)(fn)
82
+	p("route_or_replace",o,path,a,kw)
83
+	if o["rld"]:
84
+		return what
85
+	else:
86
+		return dec
87
+
88
+
89
+
90
+
91
+def sinfo(o):
92
+	for en in dir(o):
93
+		attr = getattr(o,en,"NO ATTR")
94
+		p(OKBLUE,en,ENDC)
95
+		# p("\033[48;5;57m",en,ENDC)
96
+		# p("\033[36m",en,ENDC)
97
+		p(attr)		
98
+		# p(en)
99
+
100
+def oinfo(o,n="!"):
101
+	for en in dir(o):
102
+		attr = getattr(o,en,"NO ATTR")
103
+		p('\033[33m',en,ENDC,sep='')
104
+		p(attr)		
105
+		# p(en)
106
+# @sock.route('/echo_c1')
107
+
108
+
109
+def gmod_once():
110
+	if not app._got_first_request:
111
+		gmod.glob["all_ws_conn"] = set()
112
+		gmod.glob["groups"] = {}
113
+
114
+gmod_once()
115
+
116
+p()
117
+
118
+
119
+p("app._got_first_request",app._got_first_request)
120
+
121
+
122
+# um_info(app)
123
+
124
+# p(app.view_functions)
125
+
126
+
127
+
128
+def echo_coll(sock,*a,**kw):
129
+	p("echo_coll m7",sock,sock.connected,a,kw)
130
+	gmod.gx.ws_conn(sock,*a,**kw)
131
+	# sinfo(sock.sock)
132
+	# gmod.glob["all_ws_conn"].add(sock)
133
+	# gx.add_to_channel(sock,"N1")
134
+	# gx.add_to_channel(sock,"N4")
135
+	# gmod.glob["all_ws_conn"].add(sock)
136
+	# p(type(sock))
137
+
138
+	# p(inspect.getsource(sock.accept))
139
+	# p(inspect.getsource(sock.sock.send))
140
+	# p(inspect.getsource(sock.sock.__class__))
141
+	# p(inspect.getfile(sock.sock.__class__))
142
+	# p(sock.sock.send)
143
+	# oinfo(sock.sock)
144
+	while True:
145
+		data = sock.receive()
146
+		gx.handle_msg(sock,data,z=[a,kw])
147
+		# p(inspect.getfile(sock.__class__),data)
148
+		# p(":",inspect.getfile(sock.receive),data)
149
+		if data == "throw_err":
150
+			p("throwing_err")
151
+			raise data
152
+		elif data == "s2":
153
+			p("::::s2...")
154
+			# cls_abc.abc123()
155
+		sock.send(data)
156
+	p("ENDIIII")
157
+
158
+
159
+app.config['SOCK_SERVER_OPTIONS'] = {'ping_interval': 10}
160
+# r'''
161
+@route_or_replace('/echo_c1')
162
+def _echo_coll(*a,**kw):
163
+	# p("_echo_coll")
164
+	return echo_coll(*a,**kw)
165
+	# p("echo_coll m1")
166
+	# while True:
167
+	# 	data = sock.receive()
168
+	# 	sock.send(data)
169
+
170
+# '''
171
+for en,fn in app.view_functions.items():
172
+	p(en,"\n\t.",fn)
173
+
174
+
175
+
176
+r'''
177
+
178
+# def echo234(*a,**kw):
179
+# @route_or_replace('/<path:path>')
180
+
181
+
182
+
183
+@sock.route('/<path:path>')
184
+def echo234(sock,*a,**kw):
185
+	p("E2.2sa2............................",a,kw)
186
+	# return
187
+	while True:
188
+		data = sock.receive()
189
+		sock.send(data)
190
+		for en in dir(sock):
191
+			p(en)
192
+
193
+gmod.glob["echo234"]  = app.view_functions["echo234"]
194
+# '''
195
+
196
+
197
+
198
+
199
+r'''
200
+def echo2345(*a,**kw):
201
+	try:
202
+		p("zzz",__class__)
203
+	except Exception as E:
204
+		p(":",E)
205
+	p("E2.2sa2...........................?",sock,a,kw)
206
+	# return
207
+	while True:
208
+		data = sock.receive()
209
+		sock.send(data)
210
+		for en in dir(sock):
211
+			p(en)
212
+
213
+
214
+# p(gmod.glob["echo234"])
215
+p("***********************************************************")
216
+p(inspect.getsource(app.view_functions["echo234"]))
217
+p("***********************************************************..............")
218
+
219
+# app.view_functions["echo234"] = gmod.glob["echo234"]
220
+app.view_functions["echo234"] = echo2345
221
+# '''
222
+
223
+# p(inspect.getsource(echo234))
224
+# p(echo234)
225
+
226
+
227
+# um_info(app.url_map)
228
+# p(app.url_map)
229
+# p(app.url_map.iter_rules)

+ 158
- 0
flask_server/rld_m2.py View File

@@ -0,0 +1,158 @@
1
+
2
+
3
+import gmod
4
+
5
+import inspect
6
+import flask.sansio.scaffold
7
+
8
+import threading
9
+import base64
10
+
11
+print(",,,")
12
+
13
+p=print
14
+
15
+sock = gmod.glob["sock"] 
16
+app = gmod.glob["app"] 
17
+
18
+
19
+def um_info(o):
20
+	p()
21
+	# return
22
+	for en in dir(o):
23
+		# if "url" not in en:continue
24
+		p(en)
25
+	p()
26
+	# for en in o:
27
+		# p(en)
28
+
29
+r'''
30
+@sock.route('/<path:path>')
31
+def echo2345(sock,*a,**kw):
32
+	p("E2..",a,kw)
33
+	while True:
34
+		data = sock.receive()
35
+		sock.send(data)
36
+		for en in dir(sock):
37
+			p(en)
38
+# '''
39
+import json
40
+def group_jsend(group,o,sender):
41
+	# if type(sender=="")
42
+		# sock.slf["channel_id"]
43
+	slf = getattr(sender,"slf",None)
44
+	_from = "IDK"
45
+	if slf:
46
+		_from= slf["channel_name"]
47
+	# _from = "IDK"
48
+	# slf["group"]
49
+	o["from"]=_from
50
+	p("SLF:",slf,sender)
51
+	msg = json.dumps(o)
52
+	send_to_channel(group,msg,sender)
53
+
54
+def send_to_channel(name,message,sender):
55
+	group = gmod.glob["groups"].get(name,set())
56
+
57
+	for en in group:
58
+		pass
59
+		p("....",en._srv_rec)
60
+		# en._group_send(name,message)
61
+		# en._srv_rec(name,message)
62
+		en._srv_rec([name,message,sender])
63
+		# en.(name,message)
64
+
65
+
66
+
67
+
68
+
69
+def add_to_channel(sock,name):
70
+	pass
71
+	gmod.glob["groups"].setdefault(name,set())
72
+	group = gmod.glob["groups"].get(name)
73
+	old_group_size = len(group)
74
+	group.add(sock)
75
+	return old_group_size
76
+
77
+	# gmod.glob["groups"].setdefault
78
+
79
+def dicard_on_close(sock):
80
+	gmod.glob["all_ws_conn"].discard(sock)
81
+	for name,group in gmod.glob["groups"].items():
82
+		group.discard(sock)
83
+def discard_closed():
84
+	cnt = 0
85
+	doomed = []
86
+	p("~~~~~~~~~~~~~~~~~~~~~~~~~~")
87
+	p(gmod.glob["all_ws_conn"])
88
+	for en in gmod.glob["all_ws_conn"]:
89
+		cnt +=1
90
+		if not en.connected:
91
+			# doomed.append(en)
92
+			doomed += (en,)
93
+		p(en,cnt,en.connected)
94
+		# gmod.glob["all_ws_conn"].discard(en)
95
+	gmod.glob["all_ws_conn"].difference_update(doomed)
96
+	doomed_groups = []
97
+	groups = gmod.glob["groups"]
98
+	for name,group in groups.items():
99
+		group.difference_update(doomed)
100
+		if not len(group):
101
+			doomed_groups.append(name)
102
+	for name in doomed_groups:
103
+		print("EMPTY:",name)
104
+		del groups[name]
105
+
106
+	p(doomed)
107
+def runinfo():
108
+	# gmod.glob["groups"]={}
109
+	
110
+	# p("..",gmod.glob["groups"])
111
+
112
+	# return
113
+	# p("Q",gmod.glob["groups"])
114
+	for name,group in gmod.glob["groups"].items():
115
+		p(name,":::",len(group))
116
+	if app._got_first_request:
117
+		p(len(gmod.glob["all_ws_conn"]))
118
+		for en in gmod.glob["all_ws_conn"]:
119
+			p(en,en.connected)
120
+			p(hash(1),hash(2),hash(en))
121
+		# for e2 in dir(en):
122
+			# p(e2)
123
+		discard_closed()
124
+
125
+# empty str if no =
126
+# overwrites for multiple vals
127
+def parse_qs(s):
128
+	o={}
129
+	for param in s.split("&"):
130
+		kv = (*param.split("=",1),"")
131
+		o[kv[0]]=kv[1]
132
+	return o
133
+
134
+try:
135
+	runinfo()
136
+except Exception as E:
137
+	p("ERR:",E)
138
+
139
+class cls_abc:
140
+	def abc123(*a,**kw):
141
+		p("abc123",a,kw)
142
+
143
+gmod.gx.group_jsend = group_jsend
144
+gmod.gx.send_to_channel = send_to_channel
145
+gmod.gx.add_to_channel = add_to_channel
146
+gmod.gx.dicard_on_close = dicard_on_close
147
+gmod.gx.discard_closed = discard_closed
148
+gmod.gx.parse_qs = parse_qs
149
+
150
+
151
+
152
+# class flask_channels
153
+
154
+
155
+cnt=0
156
+for thread in threading.enumerate(): 
157
+	print(cnt,thread.name)
158
+	cnt+=1

+ 232
- 0
flask_server/rld_m3.py View File

@@ -0,0 +1,232 @@
1
+import gmod
2
+p=print
3
+
4
+
5
+# should this really be a class
6
+# class Eobj:pass
7
+
8
+
9
+gx = gmod.gx
10
+import json
11
+
12
+from simple_websocket import Server
13
+from simple_websocket.ws import Base
14
+
15
+import base64
16
+
17
+OKBLUE = '\033[94m'
18
+ENDC = '\033[0m'
19
+
20
+import inspect
21
+
22
+def ws_disconn(sock,*a,**kw):
23
+	gx.dicard_on_close(sock)
24
+	ending = json.dumps({
25
+			"type":"jm_tmp_dev_sto_rec","from":"self.channel_name",
26
+			"CLIENT_KEY":"ws_sto",
27
+			"sto_event_type": "user_disconnected",
28
+			"group_name":sock.slf["channel_name"],
29
+			"from????":sock.slf["channel_name"],
30
+			# "group_name":"self.group_name",
31
+			"channel_name":sock.slf["channel_name"],
32
+
33
+			})
34
+
35
+	p("ending:::::::::::::::::::::::::")
36
+	p(ending)
37
+
38
+
39
+	# gx.send_to_channel("all_groups",ending,"SENED")
40
+	gx.send_to_channel(sock.slf["group_name"],ending,"SENED")
41
+
42
+		# await self.channel_layer.group_send(self.group_name,)
43
+
44
+	# sock.send(json.dumps({"type":"jm_tmp_dev_sto_rec","from":"self.channel_name",
45
+	# gx.send_to_channel("all_groups",json.dumps({"type":"jm_tmp_dev_sto_rec","from":"self.channel_name",
46
+	# 		"CLIENT_KEY":"ws_sto",
47
+	# 		"sto_event_type": "user_disconnected",
48
+	# 		"group_name":"self.group_name",
49
+	# 		"channel_name":"self.channel_name",
50
+
51
+	# 		}),"sender")
52
+
53
+	# p("DISCONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN",a,kw)
54
+	
55
+
56
+	pass
57
+
58
+
59
+
60
+
61
+def ws_conn(sock,*a,**kw):
62
+
63
+	# return
64
+
65
+	sock.slf = {}
66
+	sock.slf["channel_id"] = hash(sock)
67
+	sock.slf["channel_name"] = str(sock.slf["channel_id"])
68
+	sock.slf["group_name"] =  gx.parse_qs(sock.environ["QUERY_STRING"]).get("room","NO_ROOM")
69
+
70
+	gmod.glob["all_ws_conn"].add(sock)
71
+	
72
+	# gx.parse_qs
73
+
74
+	gx.add_to_channel(sock,"all_groups")
75
+	old_group_size = gx.add_to_channel(sock,sock.slf["group_name"])
76
+
77
+	p(OKBLUE,"ws_conn",a,kw,ENDC)
78
+	# return
79
+	sock_info(sock)
80
+	# my_int = sock.slf["channel_id"]
81
+
82
+
83
+	# p(struct.pack("<i",my_int))
84
+	# p(base64.b64encode(bytes(str(sock.slf["channel_id"]),"ascii")))
85
+	# p(sock.slf["channel_id"].to_bytes(8,"big"))
86
+	# p(base64.b64encode(bytes(sock.slf["channel_id"])))
87
+	# p(base64.b64encode((sock.slf["channel_id"]).to_bytes(1)))
88
+	p(sock.slf)
89
+	p()
90
+	p()
91
+
92
+
93
+
94
+	sock.send(json.dumps({
95
+		"CLIENT_KEY":"ws_sto",
96
+		"sto_event_type": "connection_info",
97
+		"channel_name":sock.slf["channel_name"],
98
+		"group_name":"group_name",
99
+		"z":"z",
100
+	}))
101
+
102
+
103
+	# r'''
104
+	sock.send(json.dumps(
105
+		{
106
+		"CLIENT_KEY": "ws_sto",
107
+		"group_count": old_group_size+1,
108
+		"sto_event_type": "group_count",
109
+		# "ws_conn":"???",
110
+
111
+
112
+		}))
113
+	# '''
114
+	# r'''
115
+
116
+	# '''
117
+# _check_sendfile_params
118
+# OKBLUE = '\033[94m'
119
+# ENDC = '\033[0m'
120
+c2 =  '\033[34m'
121
+c1 =  '\033[32m'
122
+def oinfo(o):
123
+	p(o)
124
+
125
+	for en in dir(o):
126
+		if en[:2]=="__":continue
127
+		attr=getattr(o,en,"NO ATTR")
128
+		p((en + "\t").expandtabs(21),c1,type(attr),"'\033[0m'")
129
+		# p(en)
130
+	p()
131
+def sock_info(sock):
132
+	p('\033[31m',"sock_info",ENDC)
133
+	p("[[")
134
+	oinfo(sock)
135
+	oinfo(sock.sock)
136
+	p("]]")
137
+	p(sock.environ)
138
+	for k,v in sock.environ.items():
139
+		p(k)
140
+		# p(c2,k,ENDC)
141
+		p(c2,v,ENDC)
142
+		# p(v)
143
+	p(sock.environ["QUERY_STRING"])
144
+	p(gx.parse_qs(sock.environ["QUERY_STRING"]).get("room","NO_ROOM"))
145
+	p(type(sock),"....")
146
+
147
+	for en in dir(sock):
148
+
149
+		# p(en)
150
+		# p("\033[36m",type(attr),ENDC,sep="")
151
+		attr=getattr(sock,en,"NO ATTR")
152
+		sock.sock.__class__
153
+
154
+		# p()
155
+
156
+	# p("WS.",inspect.getfile(sock.ws.__class__))
157
+	# p("SOCK.",inspect.getfile(sock.sock.__class__))
158
+	# p("SOCK.",inspect.getfile(sock.sock.send))
159
+
160
+def handle_msg(sock,txt_msg,*a,**kw):
161
+	# [a,kw]
162
+	# p(":::::",sock.environ)
163
+	# p("handle_msg!!!!!!!!!!!!!!!!!!",sock,txt_msg)
164
+	# sock_info(sock)
165
+	# gx.send_to_channel("all_groups",txt_msg,"sender")
166
+	try:
167
+		data = json.loads(txt_msg)
168
+		# gx.send_to_channel("all_groups",txt_msg,"sender")
169
+		# gx.group_jsend("",data,sock)
170
+
171
+
172
+		gx.group_jsend(sock.slf["group_name"],data,sock)
173
+		# gx.send_to_channel(sock.slf["group_name"],txt_msg,"sender")
174
+		
175
+
176
+
177
+		# p("J",type(data),data)
178
+	except Exception as Err:
179
+		p("handle_msg ERR:",Err)
180
+
181
+
182
+
183
+
184
+
185
+# def _custom_close(*a,**kw):
186
+def _custom_close(self,reason=None, message=None):
187
+	p("_custom_close",reason,message)
188
+	if True:
189
+		gx.ws_disconn(self,reason=reason, message=message)
190
+		Base.close(self,reason=reason, message=message)
191
+	# try:
192
+	# except Exception as E:
193
+		# p("_custom_close EXCEPTION!",E)
194
+
195
+	# p(Base.close)
196
+	# p(super().close(*a,**kw))
197
+# Base.close("self",reason="reason?", message="..message")
198
+Server.close =_custom_close
199
+
200
+
201
+
202
+
203
+def msgtest():
204
+	p("msgtest")
205
+	p(len(gmod.glob["all_ws_conn"]))
206
+	for en in gmod.glob["all_ws_conn"]:
207
+		p(en)
208
+		# en.close()
209
+		p(en.sock)
210
+		for en2 in dir(en.sock):pass
211
+			# p(en2)
212
+			# en.send("::CLOSE::")
213
+		en.send("::CLOSE::")
214
+
215
+		# p(inspect.getsource(en.sock.close))
216
+		# p(inspect.getfile(en.sock.close))
217
+
218
+		# en.sock.close()
219
+		# en.connected =0
220
+
221
+
222
+
223
+msgtest()
224
+
225
+gmod.gx.ws_disconn = ws_disconn
226
+gmod.gx.ws_conn = ws_conn
227
+gmod.gx.handle_msg = handle_msg
228
+
229
+
230
+# _group_msg("ZZZ",1,2,3,4,5,6)
231
+
232
+# msg="q"

+ 1
- 0
js_client/index.html View File

@@ -0,0 +1 @@
1
+jsyncdb client demo will go here

Loading…
Cancel
Save