Browse Source

demo works for server and client

master
jfinn 10 months ago
parent
commit
2401c04204
45 changed files with 9334 additions and 20 deletions
  1. 12
    0
      Dockerfile
  2. 86
    13
      app.py
  3. 26
    0
      app_socketio.py
  4. 78
    0
      gmod.py
  5. 170
    0
      hot_reload_mod_i2.py
  6. 17
    0
      requirements.old.txt
  7. 1
    6
      requirements.txt
  8. 19
    0
      rld_m0.py
  9. 229
    0
      rld_m1.py
  10. 158
    0
      rld_m2.py
  11. 232
    0
      rld_m3.py
  12. 36
    0
      rld_m4.py
  13. 0
    0
      rld_m5.py
  14. 24
    0
      templates/ev_inc.css
  15. 149
    0
      templates/ev_inc.js
  16. 2
    0
      templates/fj_js.sublime-project
  17. 1839
    0
      templates/fj_js.sublime-workspace
  18. 15
    1
      templates/index.html
  19. 2
    0
      templates/jquery-3.5.1.min.js
  20. 53
    0
      templates/jsync_2nd_db.js
  21. 106
    0
      templates/jsync_demo.css
  22. 120
    0
      templates/jsync_demo.js
  23. 56
    0
      templates/jsync_demo_db_only.js
  24. 113
    0
      templates/jsync_dep.js
  25. 299
    0
      templates/jsync_init.js
  26. 1695
    0
      templates/jsync_lib.js
  27. 1188
    0
      templates/jsync_lib0.js
  28. 35
    0
      templates/jsync_lib_template.js
  29. 217
    0
      templates/jsync_ord.js
  30. 396
    0
      templates/jsync_sto.js
  31. 261
    0
      templates/jsync_test.js
  32. 81
    0
      templates/jsync_test2.js
  33. 290
    0
      templates/jsync_ws.js
  34. 124
    0
      templates/jsyncdb_example_lnk.html
  35. 71
    0
      templates/jsyncdb_index.html
  36. 123
    0
      templates/jsyncdb_index_v1.html
  37. 59
    0
      templates/jsyncdb_index_v2.html
  38. 129
    0
      templates/jsyncdb_index_v3.html
  39. 129
    0
      templates/jsyncdb_index_v3a.html
  40. 151
    0
      templates/jsyncdb_index_v4.html
  41. 102
    0
      templates/jsyncdb_index_v4b.html
  42. 178
    0
      templates/jsyncdb_index_v5.html
  43. 80
    0
      templates/jsyncdb_index_v5b.html
  44. 181
    0
      templates/jsyncdb_index_v5c.html
  45. 2
    0
      templates/shared_libs/jquery-3.5.1.min.js

+ 12
- 0
Dockerfile View File

@@ -0,0 +1,12 @@
1
+# init a base image (Alpine is small Linux distro)
2
+FROM python:3.10-alpine
3
+# update pip to minimize dependency errors 
4
+RUN pip install --upgrade pip
5
+# define the present working directory
6
+WORKDIR /docker-flask-test
7
+# copy the contents into the working dir
8
+ADD . /docker-flask-test
9
+# run pip to install the dependencies of the flask app
10
+RUN pip install -r requirements.txt
11
+# define the command to start the container
12
+CMD ["python","app.py"]

+ 86
- 13
app.py View File

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

+ 26
- 0
app_socketio.py View File

@@ -0,0 +1,26 @@
1
+from flask import Flask, render_template
2
+from flask_socketio import SocketIO
3
+
4
+app = Flask(__name__)
5
+app.config['SECRET_KEY'] = 'your_secret_key'  # Replace with your own secret key
6
+
7
+socketio = SocketIO(app)
8
+
9
+@app.route('/')
10
+def index():
11
+    return render_template('index.html')
12
+
13
+@socketio.on('connect')
14
+def handle_connect():
15
+    print('Client connected')
16
+
17
+@socketio.on('message')
18
+def handle_message(data):
19
+    print('Received message:', data)
20
+    socketio.emit('response', 'Server received your message: ' + data)
21
+
22
+
23
+print("APP_ORIG")
24
+if __name__ == '__main__':
25
+    # socketio.run(app, debug=True)
26
+    socketio.run(app,host='0.0.0.0', debug=True,allow_unsafe_werkzeug=True)

+ 78
- 0
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
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

+ 17
- 0
requirements.old.txt View File

@@ -0,0 +1,17 @@
1
+async-timeout==4.0.3
2
+bidict==0.23.1
3
+blinker==1.7.0
4
+click==8.1.7
5
+colorama==0.4.6
6
+Flask==3.0.3
7
+Flask-SocketIO==5.3.6
8
+h11==0.14.0
9
+itsdangerous==2.1.2
10
+Jinja2==3.1.3
11
+MarkupSafe==2.1.5
12
+python-engineio==4.9.0
13
+python-socketio==5.11.2
14
+redis==5.0.3
15
+simple-websocket==1.0.0
16
+Werkzeug==3.0.2
17
+wsproto==1.2.0

+ 1
- 6
requirements.txt View File

@@ -1,17 +1,12 @@
1
-async-timeout==4.0.3
2
-bidict==0.23.1
3 1
 blinker==1.7.0
4 2
 click==8.1.7
5 3
 colorama==0.4.6
6 4
 Flask==3.0.3
7
-Flask-SocketIO==5.3.6
5
+flask-sock==0.7.0
8 6
 h11==0.14.0
9 7
 itsdangerous==2.1.2
10 8
 Jinja2==3.1.3
11 9
 MarkupSafe==2.1.5
12
-python-engineio==4.9.0
13
-python-socketio==5.11.2
14
-redis==5.0.3
15 10
 simple-websocket==1.0.0
16 11
 Werkzeug==3.0.2
17 12
 wsproto==1.2.0

+ 19
- 0
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
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
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
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"

+ 36
- 0
rld_m4.py View File

@@ -0,0 +1,36 @@
1
+
2
+p=print
3
+# p()
4
+p("RLD_M4")
5
+
6
+
7
+
8
+
9
+def qs_test(s):
10
+	p(s.split("&"))
11
+	p("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
12
+	o={}
13
+	for en in s.split("&"):
14
+		# z = [*en.split("=",1),"NO_ATTR"][:2]
15
+		# z = [*en.split("=",1),"NO_ATTR"]
16
+		z = (*en.split("=",1),"NO_ATTR")
17
+		z = (*en.split("=",1),)
18
+		# p([*en.split("=",1),"NO_ATTR"][:2])
19
+		# o
20
+
21
+		# p(":","|"+en+"|")
22
+		# p("]",z)
23
+		p(":",z[:2])
24
+	return o
25
+	pass
26
+
27
+
28
+
29
+# s = r"room=a&abc=123,a&&&&"
30
+s = r"room=a&abc=123,a&z"
31
+s = r"room=a&abc=123,a&z&&=zs&=12345678===&=p"
32
+
33
+qs_test(s)
34
+
35
+
36
+# p(parse_qs(s))

+ 0
- 0
rld_m5.py View File


+ 24
- 0
templates/ev_inc.css View File

@@ -0,0 +1,24 @@
1
+
2
+textarea{
3
+  display: inline;
4
+  width: 70%;
5
+
6
+
7
+}
8
+.evl_cnt {
9
+  position: relative;
10
+}
11
+
12
+.evl_btn3 {
13
+  margin-top: 1em;
14
+  /*margin-bottom: 1em;*/
15
+}
16
+
17
+
18
+.btn_cnt {
19
+  position: absolute;
20
+  top: 0px;
21
+  display: inline-block;
22
+  background: #eee;
23
+  width: 5em;
24
+}

+ 149
- 0
templates/ev_inc.js View File

@@ -0,0 +1,149 @@
1
+clog=console.log
2
+
3
+
4
+function eval_txtarea(){
5
+	var exe = $(".eval_txt")[0].value
6
+	// if ()
7
+	var is_empty = exe.replace(/\s/g,"")
8
+	if (!is_empty){return}
9
+
10
+	var r = {
11
+		exe
12
+	}
13
+
14
+	// r.exe = exe
15
+    try {
16
+      // eval($(".eval_txt")[0].value)
17
+      r.result = eval(exe)
18
+      r.status = 0
19
+    } catch (err){
20
+    	r.err=err
21
+      r.result = err
22
+      console.error(err)
23
+      // clog(err + "...")
24
+      // $(".eval_result")[0].innerHTML=err+""
25
+      r.status = "error"
26
+    }
27
+    glob_u.data.eval_history.unshift(r)
28
+    $(".eval_txt")[0].value = ""
29
+    glob_u.data.eval_tmp = ""
30
+    glob_u.data.eval_index = -1
31
+    $(".eval_result")[0].innerHTML =r.result
32
+
33
+
34
+}
35
+
36
+function set_text_area(index){
37
+
38
+	if(index == -1){
39
+		$(".eval_txt")[0].value = glob_u.data.eval_tmp 
40
+	} else {
41
+		var o = glob_u.data.eval_history[index]
42
+		$(".eval_txt")[0].value = o.exe
43
+		if (o.status == "err"){
44
+
45
+		} else {
46
+
47
+		}
48
+		$(".eval_result")[0].innerHTML = `[${index}] result when run:\n` + o.result
49
+	}
50
+}
51
+
52
+function mv_eval_index(chr){
53
+	// if (chr == "b")
54
+	var eval_len = glob_u.data.eval_index.length 
55
+  	switch (chr){
56
+  		case "b":
57
+  		if (glob_u.data.eval_index >= eval_len-1){
58
+  			// no_further
59
+  			clog("no_further +")
60
+  		} else if(glob_u.data.eval_index == -1) {
61
+  			glob_u.data.eval_tmp = $(".eval_txt")[0].value
62
+  			glob_u.data.eval_index += 1
63
+  			set_text_area(glob_u.data.eval_index)
64
+
65
+
66
+  		} else {
67
+  			glob_u.data.eval_index += 1
68
+  			set_text_area(glob_u.data.eval_index)
69
+  		}
70
+  		break
71
+  		case "f":
72
+  			if (glob_u.data.eval_index == 0){
73
+  				glob_u.data.eval_index -= 1
74
+  			set_text_area(glob_u.data.eval_index)
75
+  			$(".eval_result")[0].innerHTML = ""
76
+
77
+  			} else if (glob_u.data.eval_index == -1){
78
+  			clog("no_further -")
79
+
80
+  			} else{
81
+  				glob_u.data.eval_index -= 1
82
+  			set_text_area(glob_u.data.eval_index)
83
+
84
+  			}
85
+  		break
86
+  	}
87
+
88
+}
89
+
90
+
91
+  function _evl_btn_h(event,node){
92
+  	clog("_evl_btn_h",event,node,[event,node])
93
+  	// clog(node.dataset.)
94
+  	switch (node.dataset.ev_type){
95
+  		case "b":
96
+  		clog("case b")
97
+  		mv_eval_index(node.dataset.ev_type)
98
+  		break
99
+  		case "f":
100
+  		clog("case f")
101
+  		mv_eval_index(node.dataset.ev_type)
102
+  		break
103
+  		case "e":
104
+  		clog("case e")
105
+  		eval_txtarea()
106
+  		break
107
+  		case "keyup":
108
+  		if (event.keyCode == 13){
109
+  		eval_txtarea()
110
+
111
+  		}
112
+  		clog("case keydown")
113
+  		break
114
+  	}
115
+
116
+  }
117
+  function _eval_h(event,node){
118
+  	clog("_eval_h",event,node)
119
+  }
120
+  function _eval_h2(event,node){
121
+
122
+    clog([event,node,this])
123
+    $(".eval_result")[0].innerHTML +="."
124
+    try {
125
+      // eval($(".eval_txt")[0].value)
126
+      clog("e",eval(node.value))
127
+    } catch (err){
128
+      console.error(err)
129
+      clog(err + "...")
130
+      $(".eval_result")[0].innerHTML=err+""
131
+    }
132
+
133
+   $(".eval_result")[0].innerHTML += event.code+ " : " + (event.shiftKey+0) + " : " + (event.altKey+0)
134
+  }
135
+
136
+
137
+
138
+function add_xtra_shortcut(){
139
+	window.m=msto
140
+}
141
+glob_u.cb.ws.reg_cb(add_xtra_shortcut,"WS_MSTO_INITED","add_xtra_shortcut")
142
+
143
+
144
+
145
+glob_u.data.eval_history = []
146
+
147
+glob_u.data.eval_index = -1
148
+glob_u.data.eval_tmp = ""
149
+

+ 2
- 0
templates/fj_js.sublime-project View File

@@ -0,0 +1,2 @@
1
+{
2
+}

+ 1839
- 0
templates/fj_js.sublime-workspace
File diff suppressed because it is too large
View File


+ 15
- 1
templates/index.html View File

@@ -3,7 +3,21 @@
3 3
 <head>
4 4
     <title>WebSocket Example</title>
5 5
     <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.1.3/socket.io.js"></script>
6
+
7
+<script src="https://rld.jfidev.com/ign/libs/jquery-3.5.1.min.js"></script>
8
+
9
+    <script src="https://rld.jfidev.com/ign/j7/rldjs/rldjs5.js?v=139"></script>
10
+    <script class="rld rrld" src="https://rld.jfidev.com/ign/rls.js?c=00x"></script>
11
+    <script class="rld rrld_u" src="https://rld.jfidev.com/ign/rls_u.js?c=c50fb605ecc3903a40c4b4e8a41ab12c"></script>
12
+
13
+    <script class="rld" src="https://rld.jfidev.com/ign/indx/jsyncdb/qflask/qflask_dev.js?c=00x"></script>
14
+    
6 15
     <script type="text/javascript">
16
+
17
+
18
+
19
+
20
+
7 21
         var socket = io.connect('http://' + document.domain + ':' + location.port);
8 22
 
9 23
 
@@ -46,7 +60,7 @@
46 60
     </script>
47 61
 </head>
48 62
 <body>
49
-    <h1>WebSocket Example</h1>
63
+    <h1>WebSocket Example...~</h1>
50 64
     <input type="text" id="message" placeholder="Type a message">
51 65
     <button onclick="sendMessage()">Send</button>
52 66
 </body>

+ 2
- 0
templates/jquery-3.5.1.min.js
File diff suppressed because it is too large
View File


+ 53
- 0
templates/jsync_2nd_db.js View File

@@ -0,0 +1,53 @@
1
+
2
+clog=console.log
3
+
4
+clog("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
5
+
6
+
7
+function jsyncdb_init_helper_v2(){
8
+	// clog("WS_HELPER")
9
+	var fns = window.glob_u.ws.fns
10
+	var room_name=glob_u.fns.get_room_name()
11
+
12
+	let ws_protocol = "wss:"
13
+	location.protocol == "https:" ?  "was already set to wss:" : ws_protocol = "ws:"
14
+	var o = {
15
+
16
+		include_participants_data:1, 
17
+		include_ws_channel_data:1, // required for participants_data to work
18
+		// msto.participants and msto.ws_channels will be defined in either case so we don't need to handle cases where some users enable this and some don't
19
+		AutoReconnect:false,
20
+
21
+
22
+		// the following options attributes 
23
+
24
+
25
+		url:'wss://' + window.location.hostname  +`/djc_srv/ws/chat/${room_name}`,
26
+		url: `${ws_protocol}//${location.hostname}:5000/echo_c1${location.search}`,
27
+		url: `${ws_protocol}//${location.hostname}:5000/echo_c1?room=a2z`,
28
+
29
+		socket_name:"a2z",
30
+		ord:glob_u.cb.ws,
31
+
32
+
33
+		methods:{
34
+		onmessage:fns.onmessage,
35
+		onclose:fns.onclose,
36
+		onerror:fns.onerror,
37
+		onopen:fns.onopen,
38
+		},
39
+
40
+
41
+		fns:{
42
+
43
+
44
+		},
45
+	}
46
+
47
+
48
+	var socket = window.glob_u.fns.connect_ws(o)
49
+	// clog({socket})
50
+	return socket
51
+}
52
+
53
+	// var socket = new WebSocket(http://127.0.0.1:5000/?room=ax3)

+ 106
- 0
templates/jsync_demo.css View File

@@ -0,0 +1,106 @@
1
+code {
2
+background: #eee;
3
+  font-size: 1.05em;
4
+    white-space: pre-wrap;
5
+}
6
+ul{
7
+    white-space: normal;
8
+
9
+}
10
+
11
+
12
+  .code_container{
13
+    white-space: pre-wrap;
14
+  }
15
+
16
+  a{
17
+    margin-left: .7em;
18
+
19
+  }
20
+  #root_div{
21
+    margin-top: 1.5em;
22
+    margin-left: 1em;
23
+    display: inline-block;
24
+  background: #eef;
25
+  padding: .2em;
26
+  min-width: 10em;
27
+
28
+  }
29
+  #oops_i_lied{
30
+    margin-top: .7em;
31
+    margin-left: 1.5em;
32
+  }
33
+  body {
34
+  font-family:Verdana,sans-serif;
35
+  }
36
+  #templates{
37
+    display: none;
38
+  }
39
+
40
+  .db_desc {
41
+    display: inline-block;
42
+    padding-left: 1em;
43
+    
44
+    /*padding: 5em;*/
45
+    /*padding-left: 1em;*/
46
+    /*margin: 5em;*/
47
+  }
48
+
49
+.hidden-boundary {
50
+  position: absolute;
51
+}
52
+
53
+      .unselectable {
54
+        -webkit-user-select: none;
55
+        -webkit-touch-callout: none;
56
+        -moz-user-select: none;
57
+        -ms-user-select: none;
58
+        user-select: none;
59
+        color: #cc0000;
60
+        position: absolute;
61
+      }
62
+
63
+.jd_state {
64
+  background: #fff;
65
+  font-size: 1.0em;
66
+}
67
+
68
+
69
+.db_disp{
70
+  font-weight: bold;
71
+  background-color: #fff;
72
+  /*background-color: #fefefe;*/
73
+  /*background-color: #fdfdfd;*/
74
+}
75
+
76
+
77
+
78
+
79
+.wperm {
80
+  color: #900;
81
+  color: #008;
82
+  color: #FF8000;
83
+}
84
+
85
+
86
+.wperm2 {
87
+  color: #0a4;
88
+}
89
+
90
+
91
+.hide_demo .color_legend{
92
+  display: none;
93
+  
94
+}
95
+.hide_demo .db_disp{
96
+  display: none;
97
+
98
+}
99
+.hide_demo .demo_hide_btn{
100
+  display: none;
101
+
102
+}
103
+
104
+.show_demo .demo_show_btn{
105
+  display: none;
106
+}

+ 120
- 0
templates/jsync_demo.js View File

@@ -0,0 +1,120 @@
1
+function html_info(){
2
+	var get_room_name = window.get_room_name || glob_u.fns.get_room_name
3
+
4
+	window?.rldi?.setint?.(400)
5
+	var domain_prefix = location.hostname.split(".").slice(0,-2).join(".")
6
+	var root_div= document.querySelector("#root_div")
7
+	root_div.innerHTML=""
8
+	var n =document.createElement("SPAN",{})
9
+	n.innerHTML = `<div>${domain_prefix}</div><div>room name: ${get_room_name()}</div>
10
+<div><span>jsyncdb:</span><span id="jsyncdb_state">uninitialized</span></div>
11
+	`
12
+	root_div.append(n)
13
+}
14
+
15
+
16
+function ds_test2(){
17
+	// clog("ds_test2!")
18
+	// window.ds_test ?ds_test():glob_u.fns.ds_test()
19
+	jsyncdb_init_helper()
20
+	// glob_u.fns.ds_test
21
+	// ds_test()
22
+}
23
+
24
+
25
+// 
26
+
27
+
28
+function jsyncdb_init_helper(){
29
+	// clog("WS_HELPER")
30
+	var fns = window.glob_u.ws.fns
31
+	var room_name=glob_u.fns.get_room_name()
32
+	// z2="z"
33
+
34
+	let ws_protocol = "wss:"
35
+	location.protocol == "https:" ?  "was already set to wss:" : ws_protocol = "ws:"
36
+
37
+	// location.protocol ? 
38
+
39
+	var o = {
40
+
41
+		include_participants_data:1, 
42
+		include_ws_channel_data:1, // required for participants_data to work
43
+		// msto.participants and msto.ws_channels will be defined in either case so we don't need to handle cases where some users enable this and some don't
44
+		AutoReconnect:false,
45
+
46
+
47
+		// the following options attributes 
48
+
49
+
50
+		url:'wss://' + window.location.hostname  +`/djc_srv/ws/chat/${room_name}`,
51
+		url: `wss://${location.hostname}:5000/echo_c1${location.search}`,
52
+		url: `${ws_protocol}//${location.hostname}:5000/echo_c1${location.search}`,
53
+		// o.url = 
54
+		socket_name:"ws1",
55
+		ord:glob_u.cb.ws,
56
+
57
+
58
+		methods:{
59
+		onmessage:fns.onmessage,
60
+		onclose:fns.onclose,
61
+		onerror:fns.onerror,
62
+		onopen:fns.onopen,
63
+		},
64
+
65
+
66
+		fns:{
67
+
68
+
69
+		},
70
+	}
71
+
72
+	var socket = window.glob_u.fns.connect_ws(o)
73
+	// clog({socket})
74
+}
75
+
76
+
77
+
78
+
79
+
80
+// if 
81
+
82
+window.dev_flag = 1
83
+addEventListener("load",html_info)
84
+
85
+addEventListener("load",ds_test2)
86
+
87
+
88
+function update_ui(o,scope,info){
89
+	var clog =console.log
90
+	clog("update_ui",{o,scope,info})
91
+	// hard coding stuff that will probably change here
92
+	switch(info.hkey) {
93
+		case "WS_OPEN:":
94
+		$("#jsyncdb_state").text("connecting...")
95
+		break;
96
+		case "WS_CLOSE:":
97
+		$("#jsyncdb_state").text("disconnected")
98
+		break;
99
+		case "WS_MSTO_INITED":
100
+		$("#jsyncdb_state").text("connected")
101
+		break;
102
+		default:
103
+	}
104
+ 
105
+
106
+}
107
+
108
+// function get_room_name() {
109
+// 	// return "room/name"
110
+// 	return "room_name"
111
+// }
112
+
113
+glob_u.cb.ws.reg_cb(update_ui,"WS_OPEN:","update_ui")
114
+glob_u.cb.ws.reg_cb(update_ui,"WS_CLOSE:","update_ui")
115
+glob_u.cb.ws.reg_cb(update_ui,"WS_MSTO_INITED","update_ui")
116
+
117
+// addEventListener("load",db_display)
118
+
119
+// msto.example = {key:"val",z:"undefined"}
120
+// clog("??")

+ 56
- 0
templates/jsync_demo_db_only.js View File

@@ -0,0 +1,56 @@
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+function jsyncdb_init_helper(){
11
+	// clog("WS_HELPER")
12
+	var fns = window.glob_u.ws.fns
13
+	var room_name=glob_u.fns.get_room_name()
14
+	var o = {
15
+
16
+		include_participants_data:1, 
17
+		include_ws_channel_data:1, // required for participants_data to work
18
+		// msto.participants and msto.ws_channels will be defined in either case so we don't need to handle cases where some users enable this and some don't
19
+		AutoReconnect:false,
20
+
21
+
22
+		// the following options attributes 
23
+
24
+		
25
+		url:'wss://' + window.location.hostname  +`/djc_srv/ws/chat/${room_name}`,
26
+		socket_name:"ws1",
27
+		ord:glob_u.cb.ws,
28
+
29
+
30
+		methods:{
31
+		onmessage:fns.onmessage,
32
+		onclose:fns.onclose,
33
+		onerror:fns.onerror,
34
+		onopen:fns.onopen,
35
+		},
36
+
37
+
38
+		fns:{
39
+
40
+
41
+		},
42
+	}
43
+
44
+	var socket = window.glob_u.fns.connect_ws(o)
45
+	// clog({socket})
46
+}
47
+// window.dev_flag = 1
48
+function set_rldi_int(){
49
+	window?.rldi?.setint?.(400)
50
+}
51
+addEventListener("load",set_rldi_int)
52
+jsyncdb_init_helper()
53
+
54
+// window?.rldi?.setint?.(400)
55
+// window.rldi.setint(400)
56
+// clog("????")

+ 113
- 0
templates/jsync_dep.js View File

@@ -0,0 +1,113 @@
1
+
2
+// window.w = window.w || {}
3
+
4
+
5
+// w.clog = console.log
6
+var clog = console.log
7
+// var clog = w.clog
8
+
9
+// clog("??")
10
+function nop(){}
11
+
12
+window.glob_u = window.glob_u || {
13
+	cb:{},
14
+	fns:{},
15
+	cls:{},
16
+	tvar:{},
17
+	data:{},
18
+	prom:{},
19
+	rrefs:{},
20
+	xj:{},
21
+	templates:{},
22
+}
23
+
24
+glob_u.fns.gen_sort_attr = function gen_sort_attr(attr){
25
+	return function gsort(a0,a1){
26
+		if (a0[attr] > a1[attr]){
27
+		return 1
28
+		} else if (a0[attr] < a1[attr]){
29
+		return -1
30
+		} else {
31
+		return 0
32
+		}
33
+	}
34
+}
35
+glob_u.fns.find_attr = function find_attr(elm,indx,arr){
36
+	if (elm && elm[this.attr] == this.val){
37
+		return 1
38
+	}
39
+}
40
+
41
+glob_u.fns.splice_out = function splice_out(arr,elm){
42
+	let i = arr.indexOf(elm)
43
+	if (i != -1){
44
+		return arr.splice(i,1)
45
+	}
46
+}
47
+
48
+
49
+
50
+function jclone(obj){
51
+	return Array.isArray(obj) ?  $.extend(true,[],obj) :  $.extend(true,{},obj)
52
+}
53
+function jx(obj){
54
+	return JSON.parse(JSON.stringify(obj))
55
+}
56
+
57
+function jclone_rval(obj){
58
+	if (typeof(obj) != "object"){
59
+		return obj
60
+	} else if (Array.isArray(obj)) {
61
+		return $.extend(true,[],obj)
62
+	} else {
63
+		return $.extend(true,{},obj)
64
+	}
65
+
66
+}
67
+
68
+// window.jc = jclone
69
+window.jc = jclone_rval
70
+
71
+
72
+
73
+
74
+
75
+// TODO:JFI eventually merge 
76
+// j9\dev_dep\misc_dev.js
77
+
78
+glob_u.fns.gen_ord_decs = function(ord,cb_prefix){
79
+	var reg_cb = function(cb,key_name,cb_name,override_level,push){
80
+		return ord.reg_cb(cb,cb_prefix+key_name,cb_name,override_level,push)
81
+	}
82
+
83
+	var run_cbs_lz = function(key,arg_obj,lazy=1){
84
+		if (lazy && cb_prefix+key in ord.cb_sto){
85
+			return ord.run_cbs(cb_prefix+key,arg_obj)
86
+		}
87
+	}
88
+	var run_cbs = function(key,arg_obj){
89
+			return ord.run_cbs(cb_prefix+key,arg_obj)
90
+		// split out later maybe?
91
+	}
92
+	function req_batch_run(key,arg_obj,combine){
93
+			return ord.req_batch_run(cb_prefix+key,arg_obj)
94
+
95
+	}
96
+
97
+	reg_cb.ord = ord
98
+	reg_cb.cb_prefix = cb_prefix
99
+	run_cbs.ord = ord
100
+	run_cbs.cb_prefix = cb_prefix
101
+
102
+	run_cbs_lz.ord = ord
103
+	run_cbs_lz.cb_prefix = cb_prefix
104
+	return {reg_cb,run_cbs,run_cbs_lz,req_batch_run}
105
+}
106
+
107
+
108
+// duplicated in jdev0
109
+glob_u.fns.merge_partial_template = function merge_partial_template(main,template){
110
+	let t = $.extend(true,{},template,main)
111
+	return $.extend(true,main,t)
112
+}
113
+

+ 299
- 0
templates/jsync_init.js View File

@@ -0,0 +1,299 @@
1
+function pfnf(o){
2
+	return  function(resolve, reject){
3
+		o.resolve=resolve
4
+		o.reject=reject
5
+	}
6
+}
7
+
8
+msto_z = {
9
+	conference:{
10
+		events:{},
11
+	},
12
+	participants:{},
13
+	ws_channels:{},
14
+}
15
+
16
+
17
+
18
+
19
+
20
+
21
+var DBL_Proxy0 = {
22
+	set(obj, prop, val,receiver){
23
+		clog({obj, prop, val,receiver})
24
+		// return Reflect.set(...arguments)
25
+	
26
+
27
+		if (Object.getOwnPropertyNames(obj).includes(prop)){
28
+		return Reflect.set(...arguments)
29
+
30
+	} else {
31
+		return obj._wrapped_proxy[prop]=val
32
+		// return Reflect.set(...arguments)
33
+		
34
+	}
35
+
36
+
37
+	},
38
+	get(obj, prop,receiver){
39
+		clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
40
+		if (Object.getOwnPropertyNames(obj).includes(prop)){
41
+		return Reflect.get(...arguments)
42
+
43
+	} else {
44
+		return obj._wrapped_proxy[prop]
45
+		// return Reflect.get(...arguments)
46
+
47
+	}
48
+	},
49
+}
50
+
51
+
52
+
53
+
54
+
55
+
56
+var DBL_Proxy1 = {
57
+	set(obj, prop, val,receiver){
58
+		// clog({obj, prop, val,receiver})
59
+		// return Reflect.set(...arguments)
60
+	
61
+
62
+		if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
63
+		// if (Object.getOwnPropertyNames(obj).includes(prop)){
64
+		return pf.dbl_proxy_obj[prop]=val
65
+
66
+	} else {
67
+		return Reflect.set(...arguments)
68
+		// return Reflect.set(...arguments)
69
+		
70
+	}
71
+
72
+
73
+	},
74
+	get(obj, prop,receiver){
75
+		// clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
76
+		if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
77
+
78
+		return pf.dbl_proxy_obj[prop]
79
+	} else {
80
+		return Reflect.get(...arguments)
81
+		// return Reflect.get(...arguments)
82
+
83
+	}
84
+	},
85
+}
86
+
87
+
88
+
89
+
90
+
91
+var DBL_Proxy = {
92
+	set(obj, prop, val,receiver){
93
+		// clog({obj, prop, val,receiver})
94
+		// return Reflect.set(...arguments)
95
+	
96
+
97
+		if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
98
+		// if (Object.getOwnPropertyNames(obj).includes(prop)){
99
+		return pf.dbl_proxy_obj[prop]=val
100
+
101
+	} else {
102
+		return obj[prop] = val
103
+		// TODO: make sure this proxy doesn't cause other similar bugs
104
+		// return Reflect.set(...arguments)		
105
+	}
106
+
107
+
108
+	},
109
+	getOwnPropertyDescriptor(obj, prop){
110
+		if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
111
+
112
+		return Reflect.getOwnPropertyDescriptor(pf.dbl_proxy_obj, prop)
113
+		} else {
114
+		return Reflect.getOwnPropertyDescriptor(obj, prop)
115
+
116
+		}
117
+	},
118
+	get(obj, prop,receiver){
119
+		// clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
120
+		if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
121
+
122
+		return pf.dbl_proxy_obj[prop]
123
+	} else {
124
+		return Reflect.get(...arguments)
125
+		// return Reflect.get(...arguments)
126
+
127
+	}
128
+	},
129
+  ownKeys(target) {
130
+    var target_keys = Reflect.ownKeys(target);
131
+    var extra_keys = Reflect.ownKeys(pf.dbl_proxy_obj);
132
+    // clog("ownKeys",{target_keys,extra_keys})
133
+  	
134
+    return [...target_keys,...extra_keys]
135
+  },
136
+}
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+function init_db(objx){
146
+	// clog("init_db~")
147
+	trc_sto("init_db",{})
148
+	glob_u.prom.init_db_resolve.resolved=1
149
+	var glob_mx = glob_u.data
150
+		var obj
151
+		// clog("init_dbx",objx,{arguments,that:this})
152
+	if (objx.participants){
153
+		obj = objx
154
+	} else {
155
+		obj = objx.pl
156
+	}
157
+
158
+	// clog("INIT DB...",objx,obj,jc({obj,objx}))
159
+pf = new Proxy_Permissions({},"pf")
160
+msto_prx = new Proxy(obj,pf)
161
+window.msto_prx=msto_prx
162
+// window.msto_prx0 =msto_prx
163
+pf.init(msto_prx)
164
+msto_prx.walker_start(msto_prx)
165
+glob_mx.init_db=true
166
+
167
+// TODO:JFI make msto a class instance maybe
168
+   /*
169
+window.msto = {
170
+	...pf.root,
171
+	// participants:pf.root.participants,
172
+	// conference:pf.root.conference,
173
+	// my_data:pf.root.participants[glob_mx.local_id],
174
+
175
+		get my_channel(){
176
+			return msto.ws_channels[get_ws_channel_name()]
177
+			// my_data("pfx get k1")
178
+		},
179
+		set my_channel(val){
180
+			clog("pfx set my_channel")
181
+			msto.ws_channels[get_ws_channel_name()] = val
182
+		},
183
+
184
+
185
+		get my_data(){
186
+			return msto.participants[get_local_sto_id()]
187
+		},
188
+		set my_data(val){
189
+			clog("pfx set my_data")
190
+			msto.participants[get_local_sto_id()] = val
191
+
192
+		},
193
+
194
+
195
+	private_local:{},
196
+}
197
+     // */
198
+// window.msto
199
+
200
+var dbl_proxy_obj = {
201
+	// _wrapped_proxy:pf.root,
202
+	// _wrapped_proxy2:pf.root,
203
+		get my_channel(){
204
+			return msto.ws_channels[get_ws_channel_name()]
205
+			// my_data("pfx get k1")
206
+		},
207
+		set my_channel(val){
208
+			clog("pfx set my_channel")
209
+			msto.ws_channels[get_ws_channel_name()] = val
210
+		},
211
+
212
+
213
+		get my_data(){
214
+			return msto.participants[get_local_sto_id()]
215
+		},
216
+		set my_data(val){
217
+			clog("pfx set my_data")
218
+			msto.participants[get_local_sto_id()] = val
219
+
220
+		},
221
+		private_local:{},
222
+
223
+
224
+}
225
+pf.dbl_proxy_obj=dbl_proxy_obj
226
+
227
+
228
+// window.dbl_proxy=new Proxy(dbl_proxy_obj, DBL_Proxy)
229
+// window.msto=new Proxy(dbl_proxy_obj, DBL_Proxy)
230
+window.msto=new Proxy(msto_prx, DBL_Proxy)
231
+
232
+
233
+}
234
+
235
+
236
+
237
+
238
+
239
+function handle_pre_init_msgs(){
240
+	// clog("handle_pre_init_msgs")
241
+	var k,v,i
242
+	var _o
243
+	glob_u.prom.init_db_resolve.resolved_inited = 1
244
+	for (v of glob_u.ws.sockets.ws1.pre_init_msgs){
245
+		if (v.data.sto_event_type == "set_msg"){
246
+			msto.my_data.rehandle=1
247
+			_o={...v,data:jc(v.data)}
248
+			mhndlr_rld_2(_o,{type:"rehandle"})
249
+		}
250
+	}
251
+	glob_u.prom.init_db_resolve.resolved_inited = 2
252
+}
253
+
254
+function ws_sto_connected(a,b){
255
+
256
+	glob_u.cb.ws.run_cbs("WS_MSTO_INITED")
257
+
258
+handle_pre_init_msgs()
259
+	// clog("ws_sto_connected",a,b,this)
260
+}
261
+
262
+
263
+function init_mu(){
264
+
265
+	var k,v
266
+
267
+	var rr = {}
268
+	var prom1 = new Promise(pfnf(rr));
269
+	prom1.then(init_db).then(ws_sto_connected)
270
+	glob_u.prom.init_db_resolve_timeout_arg = {aaa:"timedout",pl:msto_z}
271
+
272
+	setTimeout(rr.resolve,5000,glob_u.prom.init_db_resolve_timeout_arg)
273
+	var rn = ((Math.random()+"").replace("0.","") - 0).toString(16)
274
+
275
+	tmsgx4({sto_event_type:"db_sync_request","CLIENT_KEY":"ws_sto",request_rn:rn})
276
+	glob_u.prom.init_db_resolve = rr.resolve
277
+	glob_u.prom.init_db_resolve.rn = rn
278
+
279
+}
280
+
281
+
282
+function ord_init_once(o,scope,info){
283
+	// clog("ord_init_once:",{o,scope,info})
284
+	init_mu()
285
+
286
+	// info.cbs[info.k].remove_after_exe = 1 
287
+}
288
+
289
+glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
290
+function ds_test(){
291
+	glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
292
+	ws_reload()
293
+}
294
+
295
+
296
+
297
+glob_u.fns.ds_test=ds_test
298
+
299
+

+ 1695
- 0
templates/jsync_lib.js
File diff suppressed because it is too large
View File


+ 1188
- 0
templates/jsync_lib0.js
File diff suppressed because it is too large
View File


+ 35
- 0
templates/jsync_lib_template.js View File

@@ -0,0 +1,35 @@
1
+"use strict";
2
+
3
+(function (){
4
+var isProxy,tlu,msto_z
5
+var pf,msto_prx
6
+
7
+
8
+// jsync:dep.js
9
+// ------------------------------------------------------------------------------------------------
10
+{{{jsync_dep}}}
11
+// jsync:ord.js
12
+// ------------------------------------------------------------------------------------------------
13
+{{{jsync_ord}}}
14
+// jsync:ws.js
15
+// ------------------------------------------------------------------------------------------------
16
+{{{jsync_ws}}}
17
+// jsync:sto.js
18
+// ------------------------------------------------------------------------------------------------
19
+{{{jsync_sto}}}
20
+// jsync:init.js
21
+// ------------------------------------------------------------------------------------------------
22
+{{{jsync_init}}}
23
+
24
+// jsync:test.js
25
+// ------------------------------------------------------------------------------------------------
26
+{{{jsync_test}}}
27
+
28
+
29
+
30
+// glob_u.fns.get_room_name=get_room_name
31
+// window.ds_test=ds_test
32
+// glob_u.fns.ds_test=ds_test
33
+// window.msto_prx=msto_prx
34
+
35
+})()

+ 217
- 0
templates/jsync_ord.js View File

@@ -0,0 +1,217 @@
1
+
2
+
3
+{
4
+
5
+
6
+
7
+var dflt_opts = {
8
+	// sort_fn:gen_sort_attr("override_level"),
9
+	sort_fn:glob_u.fns.gen_sort_attr("override_level"),
10
+	log_level:0,
11
+	// ns:"",
12
+}
13
+
14
+
15
+
16
+
17
+
18
+class BoundObj{
19
+	constructor(){
20
+		this.init()
21
+	}
22
+
23
+    init(){
24
+        let k,v,i,j
25
+        for ([k,v] of Object.entries(Object.getOwnPropertyDescriptors(this.__proto__))){
26
+            if (k.endsWith("_ub") && typeof(v.value) == "function"){
27
+                // clog("UB",k,k.slice(1,-3))
28
+                j = v.value.bind(this)
29
+                j.meta_str = "bound_fn"
30
+                this[k.slice(1,-3)] = j
31
+            }
32
+        }
33
+        
34
+
35
+    }
36
+    /*
37
+	mx2_ub(){
38
+		clog("Mx2")
39
+	}
40
+    */
41
+
42
+
43
+}
44
+function resolveNow(){}  
45
+async function resolveSoon(){}  
46
+
47
+
48
+// class reg_cb_ord{
49
+class reg_cb_ord extends BoundObj{
50
+	// con
51
+	constructor(opts){
52
+		super()
53
+		this.opts = Object.assign({},dflt_opts,opts)
54
+		this.r = Object.assign(this,dflt_opts,opts)
55
+
56
+		// this.sort_fn = this.opts
57
+
58
+		this.cb_sto = {}
59
+		this.batch = {}
60
+		this._orig_opts = opts
61
+		// clog("v2 ",this)
62
+	}
63
+
64
+	_promise_test_ub(arg1){
65
+		// clog()
66
+		console.log("promise_test",{that:this,arg1})
67
+		// console.log("promise_test",{that:this,opts:this.opts,arg1})
68
+	}
69
+	promise_test_init(){
70
+		var p = new Promise((resolve,reject)=>{
71
+			resolve("Promise.~")
72
+		})
73
+		p.then(this.promise_test)
74
+
75
+		console.log("promise_test_init",{that:this,opts:this.opts})
76
+
77
+	}
78
+	_batch_run_ub(){
79
+		this.batch.WillRun = false
80
+		var batched_events = this.batch.batched_events
81
+		var i,k,v
82
+		for ([k,v] of Object.entries(batched_events.combinable)){
83
+			this.run_cbs(v.key,v.arg_obj)
84
+		}
85
+		for ([k,v] of Object.entries(batched_events.unique)){
86
+			this.run_cbs(v.key,v.arg_obj)
87
+		}
88
+			this.batch.batched_events = {
89
+				combinable:{},
90
+				unique:[],
91
+			}
92
+	
93
+	}
94
+
95
+	_req_batch_run_ub(key,arg_obj,combine){
96
+		if (this.batch.WillRun != true) {
97
+			this.batch.WillRun = true
98
+			this.batch.batched_events = {
99
+				combinable:{},
100
+				unique:[],
101
+			}
102
+			new Promise((resolve,reject)=>{
103
+				resolve("Promise.~")
104
+			}).then(this.batch_run)
105
+
106
+		}  
107
+		if (this.batch.WillRun == true){
108
+			if (combine){
109
+				this.batch.batched_events.combinable[key] = {key,arg_obj,combine}
110
+			} else {
111
+				this.batch.batched_events.unique.push({key,arg_obj,combine})
112
+	
113
+			}
114
+		}
115
+		if (!(this.batch.WillRun == true ||this.batch.WillRun == false )){
116
+			console.error("::")
117
+			throw "req_batch_run err"
118
+		}
119
+	}
120
+
121
+	_reg_cb_ub(cb,key_name,cb_name,override_level = 100,push=1){
122
+
123
+		if (typeof(cb) != "function"){
124
+			console.error("callback is not a function. setting push=r","\ncb:",cb)
125
+			push = "r"
126
+			// console.error("callback:",cb," is not a function")
127
+		}
128
+		// var this.cb_sto = {}
129
+		var cb_sort = nop
130
+	
131
+		if (!this.cb_sto[key_name]){
132
+			this.cb_sto[key_name] = []
133
+		}
134
+		// this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name})
135
+		// splice_out_ti(this.cb_sto[key_name],this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name}))
136
+		// var cbo0= this.cb_sto[key_name].find(glob_td.fn.find_html_cb,{fn_key:cb_name})
137
+		// var cbo0= this.cb_sto[key_name].find(find_attr,{fn_key:cb_name})
138
+		var cbo0= this.cb_sto[key_name].find(glob_u.fns.find_attr,{attr:"fn_key",val:cb_name})
139
+		// clog(cbo0)
140
+		glob_u.fns.splice_out(this.cb_sto[key_name],cbo0)
141
+		// tn2t.arr.
142
+	
143
+		// splice_out_cb
144
+		let cb_obj = {
145
+			cb,
146
+			hkey:key_name,
147
+			fn_key:cb_name,
148
+			override_level,
149
+		}
150
+		if (push=="r"){
151
+	
152
+		} else if (push){
153
+			this.cb_sto[key_name].push(cb_obj)
154
+		} else {
155
+			this.cb_sto[key_name].unshift(cb_obj)
156
+		}
157
+		this.cb_sto[key_name].sort(this.sort_fn)
158
+
159
+
160
+	}
161
+	_run_cbs_ub(key,arg_obj){
162
+	
163
+		var k,v
164
+		var o = {
165
+			// html_key:key,cbs:glob_mx.html_cb[key],
166
+		}
167
+	
168
+			// dlog("RUN_HOOK_CB??",key,glob_mx.hook_cb[key])
169
+			// clog("ORD:RUN",key,arg_obj)
170
+		try {
171
+	
172
+			this.opts.log_level  ? clog("run_cbs",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}) : 0
173
+			var rmv_fns = []
174
+	
175
+	
176
+		for ([k,v] of Object.entries(this.cb_sto[key]|| {}) ) {
177
+			// dlog("RUN_HOOK_CB:",k)
178
+			// clog("run_html_cbs:",k,v)
179
+
180
+			this.opts.log_level > 1 ? clog("run_cbs_e",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v}) : 0
181
+			v.cb(arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v})
182
+			if (v.remove_after_exe){
183
+				rmv_fns.push(v)
184
+			}
185
+			// v(o)
186
+		}
187
+
188
+		for ([k,v] of Object.entries(rmv_fns|| {}) ) {
189
+			glob_u.fns.splice_out(this.cb_sto[key],v)
190
+		}
191
+
192
+
193
+
194
+
195
+		// return {arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}}
196
+		return {arg_obj,o,info:{that:this,hkey:key,cbs:this.cb_sto[key],rmv_fns}}
197
+		} catch(err){
198
+			console.error("ti_v_cb err:",err)
199
+		}
200
+
201
+	}
202
+
203
+}
204
+
205
+window.glob_u.cls.reg_cb_ord = reg_cb_ord
206
+
207
+
208
+
209
+
210
+
211
+
212
+}
213
+
214
+
215
+
216
+
217
+

+ 396
- 0
templates/jsync_sto.js View File

@@ -0,0 +1,396 @@
1
+// FILE:DS0
2
+var Proxy_Permissions,Proxy_Factory
3
+
4
+function mhndlr_rld_2(_o,scope,info){
5
+	var dlog =nop
6
+	try {
7
+		var parsed = _o.data
8
+		var o = parsed.payload
9
+		// clog("mhndlr_rld",parsed.sto_event_type,parsed,{_o,scope,info})
10
+		if (window.mhndlr_rld_dbg){
11
+			mhndlr_rld_dbg({m,that,n,parsed,ai,o,arguments})
12
+		}	
13
+
14
+		switch (parsed.sto_event_type){
15
+			case "set_msg":
16
+			// if (!glob_u.prom.init_db_resolve.resolved){
17
+			if (!glob_u.prom.init_db_resolve.resolved_inited){
18
+				_o.event.target.pre_init_msgs.push(_o)
19
+			}
20
+				pf._set_recv(o.path,o.key,o.val)
21
+				// clog("msto_evh?ord")
22
+				glob_u.fns.msto_evh ? glob_u.fns.msto_evh(o,parsed) : 0
23
+				
24
+			break;
25
+			case "group_count":
26
+				// clog("mhndlr_rld group_count",parsed)
27
+				if (parsed.group_count < 2){
28
+				// clog("mhndlr_rld group_count RESOLVE")
29
+					glob_u.prom.init_db_resolve(glob_u.prom.init_db_resolve_timeout_arg)
30
+
31
+				}
32
+			break;
33
+			case "event":
34
+			/*
35
+				dlog("~event~",parsed)
36
+				if (window.dispatch_events){
37
+				dispatch_events({parsed,ai,m,that})
38
+				}
39
+			*/
40
+			break;
41
+			case "msg_test":
42
+				dlog("msg_test",parsed)
43
+			break;
44
+			case "db_sync_request":			
45
+				// tmsgx4({sto_event_type:"db_sync_response",payload:pf.root,"CLIENT_KEY":"ws_sto"})
46
+				// if (glob_u.prom.init_db_resolve.resolved){
47
+				if (glob_u.prom.init_db_resolve.resolved_inited == 2){
48
+
49
+				tmsgx4({sto_event_type:"db_sync_response",payload:jc(pf.root),request_from:parsed.from,request_rn_from:parsed.request_rn,"CLIENT_KEY":"ws_sto"})
50
+				}
51
+
52
+			break;
53
+			case "db_sync_response":
54
+
55
+					if (glob_u.prom.init_db_resolve && parsed.request_rn_from  == glob_u.prom.init_db_resolve.rn){
56
+						glob_u.prom.init_db_resolve({aaa:"dsr",pl:parsed.payload})
57
+					}
58
+				// clog("db_sync_response",parsed)
59
+			break;
60
+
61
+		}
62
+	} catch (err) {
63
+		clog("mhndlr err:",err)
64
+	}
65
+}
66
+
67
+
68
+glob_u.fns.msto_evh = function(o,parsed,ai,id){
69
+	// clog("ord_msto_evh")
70
+	if (o.path[0]!="conference" || o.path[1]!="events"){
71
+		return
72
+	}
73
+	glob_u.cb.ws.STO_EVENT.run_cbs(":STO_EVENT",{o,parsed,ai,id})
74
+	if (typeof(o.val) == "object"){
75
+		glob_u.cb.ws.STO_EVENT.run_cbs(o.val.type,{o,parsed,ai,id})
76
+	}
77
+}
78
+
79
+glob_u.cb.ws.reg_cb(mhndlr_rld_2,"WS_MESSAGE:ws_sto","WS_MESSAGE:ws_sto")
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+// FILE:DS1
89
+
90
+
91
+
92
+
93
+
94
+
95
+var dlog = nop
96
+
97
+function tmsgx4(m){
98
+	var socket = glob_u.ws.sockets.ws1
99
+	var jsend = socket.params.fns.jsend
100
+	var t = {
101
+		key:"tmp_dev_sto",
102
+	}
103
+	glob_u.fns.merge_partial_template(m,t)
104
+	// clog("tmsgx4",{key:m.key,sto_event_type:m.sto_event_type,CLIENT_KEY:m.CLIENT_KEY},{m,t})
105
+	trc_sto("tmsgx4",m)
106
+	jsend(m)
107
+}
108
+
109
+
110
+isProxy = Symbol("isProxy")
111
+
112
+
113
+tlu = {
114
+	object:"",
115
+	string:true,
116
+	number:true,
117
+	undefined:true,
118
+	boolean:true,
119
+}
120
+
121
+
122
+
123
+
124
+function type_info(o){
125
+	try {
126
+
127
+	var t
128
+	var flags = {
129
+		leaf:false,
130
+		deep_not_prx:false,
131
+		prx:false,
132
+		isObj:false,
133
+		isArr:false,
134
+		els:false,
135
+	}
136
+	t = typeof(o)
137
+	flags.t=t
138
+	if (!(o === null)){
139
+		flags.isArr = Array.isArray(o)
140
+		flags.isObj = Object.prototype == o.__proto__
141
+	}
142
+
143
+	if (tlu[t] === true || o === null){
144
+		flags.leaf = true
145
+	} else if (t == "object" && o.__prx){
146
+		flags.prx = true
147
+	} else if (t == "object" && (flags.isArr || flags.isObj)){
148
+		flags.prx = false
149
+		flags.deep_not_prx = true
150
+	} else {
151
+		clog("ELSE")
152
+		flags.els = true
153
+	}
154
+	return flags
155
+	} catch (err){
156
+		clog("type_info err:",err,{flags,o})
157
+	}
158
+}
159
+
160
+
161
+function deep_prop_v0(o,p){
162
+	try {
163
+	var arr = jc(p)
164
+	var ret = o
165
+	while (arr.length){
166
+		ret = ret[arr.shift()]
167
+	}
168
+	return ret
169
+	} catch(err){console.error("DEEP_PROP ERR:",err)}
170
+}
171
+
172
+
173
+
174
+
175
+// delete Proxy_Factory
176
+// {
177
+
178
+Proxy_Factory = class Proxy_Factory {
179
+	constructor(o,n="dflt"){
180
+		this.db = o
181
+		this.n = n
182
+		this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy"]
183
+		this._pub_cb =[]
184
+		this.__prx = true
185
+		this.SymPrx = Symbol("SymPrx")
186
+	}
187
+	init(o){
188
+		this.root = o
189
+	}
190
+	sync(o){
191
+		this.root = jc(o.root)
192
+		o._pub_cb.push(this._set_recv.bind(this))
193
+	}
194
+	get prxy(){
195
+		return this
196
+	}
197
+
198
+	_set(o,k,v,prx,a0){
199
+		this.obj[k]=prx
200
+	}
201
+	set_pub(obj, prop, val,receiver){
202
+		this._set_pub(obj.__path_arr, prop, jx(val))
203
+	}
204
+	_set_pub(path,key,val){
205
+		var k,v
206
+			var arg = {
207
+				"CLIENT_KEY":"ws_sto",
208
+				"sto_event_type":"set_msg",
209
+				"payload":{path,key,val},}
210
+
211
+			tmsgx4(arg,
212
+			)
213
+		for (v of this._pub_cb){
214
+			v(path,key,val)
215
+
216
+		}
217
+	}
218
+
219
+	_set_recv(path,prop,val,id){
220
+
221
+		var p = path
222
+		var nprop = deep_prop_v0(this.root,p)
223
+		var dpth = nprop.__dpth
224
+		if (tlu[typeof(val)]){
225
+		nprop._set(nprop,prop,val,val)
226
+		} else {
227
+		nprop._set(nprop,prop,val,new Proxy(val,this))
228
+		nprop[prop].add_proxy(nprop,prop,val,dpth+1)
229
+		}
230
+		this.walker(nprop[prop],{},dpth+2)
231
+	}
232
+
233
+	set(obj, prop, val,receiver){
234
+		if (obj[prop] === val){
235
+			return Reflect.set(...arguments)
236
+		}
237
+
238
+		this.set_pub(obj, prop, val,receiver)
239
+		this.event_proc("set")
240
+
241
+		if ("__prx" == prop){
242
+			this.__prx=val
243
+			return this.__prx
244
+		}
245
+
246
+		if (typeof(val) === "object" && val != null && !(val.__prx)){
247
+			var ret = Reflect.set(...arguments)
248
+			this.set_obj(obj, prop, val,receiver)
249
+			return ret
250
+		}
251
+
252
+		return Reflect.set(...arguments)
253
+	}
254
+	get(obj, prop,receiver){
255
+		if (this.hidden_props.includes(prop)){
256
+			switch (prop){
257
+				case "add_proxy":
258
+				return this.add_proxy.bind(this)
259
+			break;
260
+				case "prxy":
261
+				return this
262
+				case "_set":
263
+				return this._set.bind({that:this,obj, prop,receiver})
264
+				case "walker_start":
265
+				return this.walker_start
266
+				case "walker":
267
+				return this.walker
268
+			break;
269
+			}
270
+		}
271
+
272
+		if (isProxy == prop){ return true }
273
+		if ("__prx" == prop){ return this.__prx }
274
+
275
+		return Reflect.get(...arguments)
276
+	}
277
+	add_proxy(o,k,v,dpth){
278
+		var xpath = o.__path
279
+		var apath = o.__path_arr
280
+		this.event_proc("add_proxy")
281
+		if (!apath){
282
+			apath=[]
283
+		}
284
+
285
+		if (!xpath){
286
+			xpath="ROOT!"
287
+		}
288
+
289
+		Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
290
+		Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
291
+		Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
292
+		// Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
293
+
294
+	}
295
+	set_obj(obj, prop, val,receiver){
296
+		var dpth = obj.__dpth
297
+		var tf = {}
298
+		var dbg_obj = {}
299
+		this.walker(receiver,tf,dpth,dbg_obj)
300
+		if (dbg_obj.depth_err){
301
+			clog("MAX DEPTH?",dbg_obj,{obj, prop, val,receiver})
302
+		}
303
+	}
304
+
305
+	walker(o,tfo,dpth=0,dbg_obj={"t":"unused"}){
306
+		// if (dpth > 7){
307
+		if (dpth > 15){
308
+			dbg_obj.depth_err=1
309
+			console.error("MAX DEPTH",{o,tfo,dpth,dbg_obj})
310
+			return
311
+		}
312
+		var k,v
313
+		var tf
314
+			for ([k,v] of Object.entries(o)){
315
+				tf = type_info(v)
316
+				if (tf.deep_not_prx){
317
+					o._set(o,k,v,new Proxy(v,this.prxy))
318
+					o[k].add_proxy(o,k,v,dpth)
319
+				this.walker(o[k],tf,dpth+1,dbg_obj)
320
+				}
321
+			}
322
+	}
323
+	walker_start(o,dpth){
324
+		var tf = type_info(o)
325
+		o.add_proxy({},[],o,-1)
326
+		this.walker(o,tf,0)
327
+	}
328
+	event_proc(e){}
329
+}
330
+window.Proxy_Factory = Proxy_Factory
331
+
332
+Proxy_Factory.prototype.baseProp={
333
+	writable: true,
334
+	enumerable: false,
335
+	// enumerable: true,
336
+	configurable: true,
337
+	}
338
+// }
339
+
340
+
341
+
342
+
343
+function arr_match(m,o){
344
+	var k,v
345
+	var r = 0
346
+	for ([k,v] of Object.entries(m || {})){
347
+		if (o[k] != v.valueOf()){
348
+			r += 1
349
+			return !r
350
+		}
351
+	}
352
+	return !r
353
+}
354
+
355
+// permissions_def = {
356
+window.permissions_def = window.permissions_def || {
357
+	participants:{
358
+		m:["participants"],
359
+		fn(set_scope,match){
360
+
361
+			if (match.fp[1] == "rejx")
362
+				throw "permission err"
363
+			return
364
+		},
365
+	}
366
+}
367
+
368
+
369
+
370
+// {
371
+Proxy_Permissions = class Proxy_Permissions extends Proxy_Factory {
372
+		constructor(a,a1){
373
+			super(...arguments)
374
+		}
375
+		set(obj, prop, val,receiver){
376
+			var k,v
377
+			var r
378
+			var matched
379
+			var fp = obj.__path_arr.concat(prop)
380
+			for ([k,v] of Object.entries(permissions_def)){
381
+				matched = arr_match(v.m,fp)
382
+				if (matched){
383
+					r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
384
+				}
385
+			}
386
+			return super.set(obj, prop, val,receiver)
387
+		}
388
+		_set(){
389
+			super._set(...arguments)
390
+		}
391
+	}
392
+	window.Proxy_Permissions = Proxy_Permissions
393
+// }
394
+
395
+
396
+// clog("???")

+ 261
- 0
templates/jsync_test.js View File

@@ -0,0 +1,261 @@
1
+
2
+// clog("/////////")
3
+
4
+// msto_sc_proxy
5
+// permissions_def
6
+// connection_info_handler
7
+
8
+//      /*
9
+function get_local_sto_id(){
10
+	return glob_u.data.jsync_local_id
11
+}
12
+function get_session_sto_id(){
13
+	return glob_u.data.jsync_session_id
14
+}
15
+
16
+function get_ws_channel_name(){
17
+	return glob_u.data.channel_name
18
+
19
+}
20
+
21
+function gen_djc_srv_id(){
22
+	// I don't know how often this will generate duplicates
23
+
24
+	var djc_srv_id = localStorage.djc_srv_id
25
+	var djc_srv_id_vers =  localStorage.djc_srv_id_vers
26
+	const current_id_vers = 0.0
27
+	if (Number(djc_srv_id_vers) < current_id_vers || !(djc_srv_id)){
28
+		clog("????")
29
+		localStorage.djc_srv_id = ((Math.random()+"").replace("0.","") - 0).toString(16)
30
+		localStorage.djc_srv_id_vers = current_id_vers
31
+	}
32
+	glob_u.data.djc_srv_id = localStorage.djc_srv_id
33
+	clog("djc_srv_id:",{version:localStorage.djc_srv_id_vers,id:localStorage.djc_srv_id})
34
+
35
+}
36
+
37
+
38
+
39
+function init_msto_user_data(o,scope,info){
40
+	var ws_channel_name = get_ws_channel_name()
41
+
42
+
43
+	var local_sto_id = get_local_sto_id()
44
+	// clog("init_msto_user_data???",{local_sto_id,ws_channel_name,o,scope,info})
45
+	if (!glob_u.ws.sockets.ws1.params.include_ws_channel_data){return}
46
+	msto.ws_channels[ws_channel_name]=msto.ws_channels[ws_channel_name] || {id:local_sto_id}
47
+
48
+
49
+	if (!glob_u.ws.sockets.ws1.params.include_participants_data){return}
50
+	msto.participants[local_sto_id]=msto.participants[local_sto_id] || {}
51
+	// clog("init_msto_user_dataw???")
52
+
53
+
54
+
55
+
56
+}
57
+
58
+glob_u.cb.ws.reg_cb(init_msto_user_data,"WS_MSTO_INITED","init_msto_user_data")
59
+
60
+
61
+window.permissions_def = window.permissions_def || {
62
+	participants:{
63
+		m:["participants"],
64
+		fn(set_scope,match){
65
+
66
+			if (match.fp[1] == "rejx")
67
+				throw "permission err"
68
+			return
69
+		},
70
+	}
71
+}
72
+//     */
73
+// jsync_local_id
74
+// jsync_local_vers
75
+// jsync_session_id
76
+// jsync_session_vers
77
+// jsync_id
78
+// jsync_vers
79
+
80
+
81
+
82
+window.permissions_def = {
83
+	participants:{
84
+		m:["participants"],
85
+		fn(set_scope,match){
86
+			if (match.fp[1] != get_local_sto_id()){
87
+				console.error("permission err:participants",set_scope,match)
88
+				// console.trace("permission err:participants")
89
+				throw "permission err"
90
+			}
91
+			return
92
+		},
93
+	},
94
+	ws_channels:{
95
+		m:["ws_channels"],
96
+
97
+		fn(set_scope,match){
98
+			if (match.fp[1] != get_ws_channel_name()){
99
+				console.error("permission err:ws_channels",set_scope,match)
100
+				throw "permission err"
101
+			}
102
+		}
103
+	},
104
+}
105
+
106
+
107
+
108
+window.permissions_def0 = {
109
+	/*
110
+	ws_channels:{
111
+		m:["ws_channels"],
112
+
113
+		fn(set_scope,match){
114
+			if (match.fp[1] != window.glob_u.data.channel_name){
115
+				console.error("permission err:ws_channels",set_scope,match)
116
+				throw "permission err"
117
+			}
118
+		}
119
+	},
120
+	*/
121
+
122
+	user_channels:{
123
+		m:["user_channels"],
124
+
125
+		fn(set_scope,match){
126
+			if (match.fp[1] != get_ws_channel_name()){
127
+				console.error("permission err:user_channels",set_scope,match)
128
+				throw "permission err"
129
+			}
130
+		}
131
+	},
132
+
133
+
134
+	user_data_sessions:{
135
+		m:["user_data_sessions"],
136
+		fn(set_scope,match){
137
+			if (match.fp[1] != get_session_sto_id()){
138
+				console.error("permission err:user_data_sessions",set_scope,match)
139
+				// console.trace("permission err:participants")
140
+				throw "permission err"
141
+			}
142
+			return
143
+		},
144
+	},
145
+	user_data_local:{
146
+		m:["user_data_local"],
147
+		fn(set_scope,match){
148
+			if (match.fp[1] != get_local_sto_id()){
149
+				console.error("permission err:user_data_local",set_scope,match)
150
+				// console.trace("permission err:participants")
151
+				throw "permission err"
152
+			}
153
+			return
154
+		},
155
+	},
156
+	/*
157
+	participants:{
158
+		m:["participants"],
159
+		fn(set_scope,match){
160
+			if (match.fp[1] != window.glob_u.data.djc_srv_id){
161
+				console.error("permission err:participants",set_scope,match)
162
+				// console.trace("permission err:participants")
163
+				throw "permission err"
164
+			}
165
+			return
166
+		},
167
+	}
168
+	*/
169
+
170
+}
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+function ensure_jsync_id_is_set(storage_,base_name){
179
+	var storage = storage_
180
+	var id_name = base_name + "_id"
181
+	var vers_name = base_name + "_vers"
182
+	var djc_srv_id = storage[id_name]
183
+	var djc_srv_id_vers =  storage[vers_name]
184
+	const current_id_vers = 0.0
185
+	if (Number(djc_srv_id_vers) < current_id_vers || !(djc_srv_id)){
186
+		storage[id_name] = ((Math.random()+"").replace("0.","") - 0).toString(16)
187
+		storage[vers_name] = current_id_vers
188
+	}
189
+	glob_u.data[id_name] = storage[id_name]
190
+	// clog("djc_srv_id:",{version:localStorage.djc_srv_id_vers,id:localStorage.djc_srv_id})
191
+
192
+}
193
+ensure_jsync_id_is_set(localStorage,"jsync_local")
194
+ensure_jsync_id_is_set(sessionStorage,"jsync_session")
195
+
196
+// function user_disconnected_compatibility_handler(o,scope,info){
197
+
198
+
199
+
200
+// TODO:Fix bug caused by a user disconnecting before the connection is properly established
201
+function connection_info_handler(o,scope,info){
202
+	if (o.data.sto_event_type=="connection_info"){
203
+	// clog("connection_info_handler:",o,scope,info)
204
+		glob_u.data.group_name = o.data.group_name
205
+		glob_u.data.channel_name = o.data.channel_name
206
+		clog("jsyncdb connected","room name:",glob_u.data.group_name)
207
+	} else if (o.data.sto_event_type=="user_disconnected"){
208
+	var last_conn =1
209
+	var k,v
210
+	var ws_conn_data = jc(msto.ws_channels[o.data.channel_name])
211
+	delete msto.ws_channels[o.data.channel_name]
212
+		for ([k,v] of Object.entries(msto.ws_channels)){
213
+		if (v.id == ws_conn_data.id){
214
+			last_conn = 0
215
+		}
216
+	}
217
+	if (last_conn){
218
+		// clog("DELlast_conn" ,ws_conn_data.id)
219
+		delete msto.participants[ws_conn_data.id]
220
+	}
221
+		clog("user_disconnected:",o.data.channel_name)
222
+		return
223
+		if (msto.user_channels){
224
+			delete msto.user_channels[o.data.channel_name]
225
+		}
226
+	
227
+
228
+
229
+		if (msto.user_channels){
230
+			for ([k,v] of Object.entries(msto.user_channels)){
231
+				if (v.id == ws_conn_data.id){
232
+					last_conn = 0
233
+				}
234
+			}
235
+		}
236
+	if (last_conn){
237
+		clog("DELlast_conn" ,ws_conn_data.id)
238
+		delete msto.user_data_local[ws_conn_data.id]
239
+	}
240
+
241
+	}
242
+}
243
+
244
+glob_u.cb.ws.reg_cb(connection_info_handler,"WS_MESSAGE:ws_sto","connection_info_handler")
245
+
246
+
247
+
248
+function ds_test3(){
249
+	glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
250
+	ws_reload()
251
+}
252
+
253
+glob_u.fns.get_local_sto_id = get_local_sto_id
254
+glob_u.fns.get_ws_channel_name = get_ws_channel_name
255
+glob_u.fns.get_session_sto_id = get_session_sto_id
256
+
257
+// console.log("??...")
258
+
259
+
260
+// clog("???")
261
+// 

+ 81
- 0
templates/jsync_test2.js View File

@@ -0,0 +1,81 @@
1
+function db_display(){
2
+
3
+
4
+	if(!window.msto_prx){
5
+		return
6
+	}	
7
+
8
+	var db = jc(msto_prx)
9
+
10
+	var k,v
11
+	var pretty = {}
12
+	var ws_channel = glob_u.fns.get_ws_channel_name()
13
+	var id = glob_u.fns.get_local_sto_id()
14
+	for ([k,v] of Object.entries(db)){
15
+		if (k == "ws_channels"){
16
+			pretty["SPAN_OPEN"]="1"
17
+		}
18
+		if (k == "participants"){
19
+			pretty["SPAN_A2"]="1"
20
+		}
21
+		pretty[k] = v
22
+		
23
+		if (k == "ws_channels"){
24
+			pretty["SPAN_CLOSE"]="1"
25
+		}
26
+		if (k == "participants"){
27
+			pretty["SPAN_B2"]="1"
28
+		}
29
+
30
+
31
+	}
32
+	db = jc(pretty)
33
+	pretty.participants = {}
34
+	pretty.ws_channels = {}
35
+	
36
+	for ([k,v] of Object.entries(db.participants)){
37
+		if (k == id){
38
+			pretty.participants["SPAN_2"]="1"
39
+		}
40
+		pretty.participants[k] = v
41
+		if (k == id){
42
+			pretty.participants["SPAN_C2"]="1"
43
+		}
44
+	} 
45
+	for ([k,v] of Object.entries(db.ws_channels)){
46
+		if (k == ws_channel){
47
+			pretty.ws_channels["SPAN_2"]="1"
48
+		}
49
+		pretty.ws_channels[k] = v
50
+		if (k == ws_channel){
51
+			pretty.ws_channels["SPAN_C2"]="1"
52
+		}
53
+	} 
54
+	
55
+
56
+	var json_str = JSON.stringify(pretty,"","   ")
57
+	json_str = json_str.replaceAll(/\s+"SPAN_OPEN[^\n<]*/g,'<span class="wperm">')
58
+	json_str = json_str.replaceAll(/\s+"SPAN_A2[^\n<]*/g,'<span class="wperm">')
59
+	json_str = json_str.replaceAll(/\s+"SPAN_CLOSE[^\n<]*/g,"</span>")
60
+	json_str = json_str.replaceAll(/\s+"SPAN_B2[^\n<]*/g,"</span>")
61
+
62
+
63
+	json_str = json_str.replaceAll(/\s+"SPAN_2.*/g,'<span class="wperm2">')
64
+	json_str = json_str.replaceAll(/\s+"SPAN_C2.*/g,"</span>")
65
+	// clog(json_str)
66
+	$(".db_disp")[0].innerHTML = json_str
67
+}
68
+
69
+// glob_u.fns.get_ws_channel_name
70
+
71
+window.nginx_v1_t2 = {
72
+	"target_server_name":`<!--#echo var="target_server_name"-->`,
73
+	"ssl_server_name":`<!--#echo var="ssl_server_name"-->`,
74
+
75
+    ssl_certificate: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/fullchain.pem`,
76
+    ssl_certificate_key: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/privkey.pem`,
77
+
78
+}
79
+
80
+glob_u.cb.ws.reg_cb(db_display,"WS_MESSAGE:","db_display",101)
81
+db_display()

+ 290
- 0
templates/jsync_ws.js View File

@@ -0,0 +1,290 @@
1
+// FILE:WS0
2
+
3
+// TODO:JFI this file probably causes memory leaks
4
+
5
+
6
+window.glob_u.ws = window.glob_u.ws || {
7
+	sockets:{},
8
+	fns:{},
9
+	flags:{},
10
+} 
11
+
12
+window.glob_u.trc = window.glob_u.trc || {
13
+	arr:[],
14
+}
15
+
16
+
17
+
18
+// TODO:JFI I should factor out my development junk
19
+function trc_sto(s,o){
20
+	if (!glob_u?.prom?.init_db_resolve?.resolved){
21
+	var elm = {name:s,o,timestamp:Date.now()}
22
+	glob_u.trc.arr.push(elm)
23
+	// clog("_trc:sto",s,o.sto_event_type,elm.timestamp,o)
24
+	}	
25
+}
26
+
27
+
28
+
29
+window.glob_u.ws.fns.reconnect = function reconnect(o,close_event){
30
+	connect_ws(o.params)
31
+}
32
+
33
+
34
+// TODO:JFI These event handlers are less generic now
35
+
36
+
37
+window.glob_u.ws.fns.onclose = function onclose(event){
38
+	clog("WS_CLOSE",{that:this,readyState:this.readyState,args:[...arguments]})
39
+	// glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_CLOSE:",{event,that:this})
40
+	glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_CLOSE:",{event,that:this})
41
+	setTimeout(this.params.fns.reconnect,1000)
42
+}
43
+
44
+window.glob_u.ws.fns.onmessage = function onmessage(event){
45
+	// clog("WS_MESSAGE",{that:this,args:[...arguments]})
46
+	// glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
47
+	glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
48
+}
49
+
50
+window.glob_u.ws.fns.onerror = function onerror(event){
51
+	// clog("WS_ERROR",{that:this,args:[...arguments]})
52
+	// glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_ERROR:",{event,that:this})
53
+	glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_ERROR:",{event,that:this})
54
+
55
+
56
+}
57
+window.glob_u.ws.fns.onopen = function onopen(event){
58
+
59
+	// clog("WS_OPEN???",{that:this,args:[...arguments]},{on_open_once:this.on_open_once,on_open_cbs:this.params.on_open_cbs})
60
+	// glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_OPEN:",{event,that:this})
61
+	glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_OPEN:",{event,that:this})
62
+	return
63
+		var cb
64
+	if (this.on_open_once){
65
+		for (cb of this.on_open_once){
66
+			cb(event,this)
67
+		}
68
+	if (this?.params?.on_open_cbs){
69
+		for (cb of this?.params?.on_open_cbs){
70
+			cb(event,this)
71
+		}
72
+	}
73
+}
74
+}
75
+
76
+
77
+window.glob_u.ws.fns.ws_fns_factory = function ws_fns_factory(socket_opts){
78
+	var socket_name = socket_opts.socket_name
79
+	// const sockets = 
80
+	var v1 = "init"
81
+	var fns = {
82
+		get_socket(o){
83
+			return glob_u.ws.sockets[socket_name]
84
+		},
85
+		reconnect(){
86
+			var socket = fns.get_socket()
87
+			clog("RECONNECT",socket_opts,socket,socket?.DoNotReconnect)
88
+			// if (socket.DoNotReconnect || socket.params.DoNotReconnect || glob_u.ws?.flags?.DoNotReconnect){
89
+			if (socket.DoNotReconnect || !socket.params.AutoReconnect || glob_u.ws?.flags?.DoNotReconnect){
90
+				clog("RECONNECTION NOT ATTEMPTED",socket_opts)
91
+				return
92
+			} else {
93
+
94
+			}
95
+
96
+			connect_ws(socket_opts)
97
+		},
98
+		log_var(o){
99
+			clog("var:",v1)
100
+			return v1
101
+		},
102
+		set_var(val){
103
+			v1 = val
104
+			return v1
105
+		},
106
+		send_text(o){
107
+			var socket = fns.get_socket()
108
+			clog("send_text",{that:this,fns})
109
+			socket.send(JSON.stringify(o));
110
+		},
111
+		jsend(o){
112
+			var socket = fns.get_socket()
113
+			// clog("!!!",{that:this,fns})
114
+			socket.send(JSON.stringify(o));
115
+		},
116
+	} 
117
+	return fns
118
+}
119
+
120
+
121
+function connect_ws(o= {}){
122
+	// clog("connect_ws:",o,jc(o))
123
+	glob_u.fns.merge_partial_template(o,{on_open_cbs:[]})
124
+	var sockets = window.glob_u.ws.sockets
125
+	var old_socket = sockets[o.socket_name]
126
+	if (old_socket && old_socket.readyState == 1){
127
+		clog(`WS ${o.socket_name} is already CONNECTED:`,old_socket , o)
128
+		return
129
+
130
+	} else if (old_socket && (old_socket.readyState != 3 && old_socket.readyState != undefined )){
131
+		clog(`WS ${o.socket_name} exsists and in not closed:`,old_socket , o)
132
+		return
133
+
134
+	}
135
+
136
+	var socket = new WebSocket(o.url)
137
+	socket.on_open_once = []
138
+	socket.pre_init_msgs = []
139
+	socket.params = o
140
+	// if ()
141
+	Object.assign(o.fns, window.glob_u.ws.fns.ws_fns_factory(o))
142
+	// Object.assign(o.fns2, window.glob_u.ws.fns.ws_fns_factory(o))
143
+
144
+	Object.assign(socket,o.methods)
145
+
146
+	sockets[o.socket_name]=socket
147
+	// o.jsend ?    socket.jsend = o.jsend: 0
148
+	// clog("CONNECTING WS:",{o,socket})
149
+	return [socket,old_socket]
150
+}
151
+
152
+
153
+
154
+
155
+
156
+// FILE:WS1
157
+
158
+
159
+
160
+
161
+
162
+function create_ws_ord(){
163
+	if (!glob_u.cb.ws){
164
+
165
+	var ord = new glob_u.cls.reg_cb_ord()
166
+	glob_u.cb.ws = ord
167
+	glob_u.cb.ws.reg_cb = ord.reg_cb
168
+	glob_u.cb.ws.run_cbs = ord.run_cbs
169
+
170
+		glob_u.cb.ws.STO_EVENT =  glob_u.fns.gen_ord_decs(glob_u.cb.ws,"STO_EVENT:")
171
+
172
+	// glob_u.cb.ord_v1.estr =  glob_u.fns.gen_ord_decs(glob_u.cb.ord_v1.ord,"")
173
+	// glob_u.cb.ord_v1.run_cbs_lz = glob_u.cb.ord_v1.estr.run_cbs_lz
174
+	// glob_u.cb.ord_v1.ord.run_cbs_lz = glob_u.cb.ord_v1.run_cbs_lz
175
+
176
+
177
+
178
+	}
179
+}
180
+
181
+
182
+window.glob_u.ws.fns.dispatch = function dispatch(o,obj_x,info){
183
+	var event = o.event
184
+	// socket = o.that
185
+	var data = JSON.parse(event.data)
186
+	// clog("WS_dispatch",data,socket.params.ord,data["CLIENT_KEY"])
187
+	// clog("trc:sto:ws_rec",data.CLIENT_KEY,data.sto_event_type,data)
188
+
189
+	trc_sto("ws_rec",data)
190
+	glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:"+data["CLIENT_KEY"],{event,that:this,data})
191
+		return
192
+	if (e.arguments[0].type == "message"){
193
+
194
+	var data = JSON.parse(e.arguments[0].data)
195
+
196
+    if ("type" in data && ws_handlers[data.type]){
197
+		ws_handlers[data.type](data,{that:e.that,event:e.arguments[0]})
198
+    } else {
199
+    	clog("NO HANDLER FOR",data.type)
200
+    }
201
+
202
+	clog("~WS",data,e)
203
+	} else if  (e.arguments[0].type == "open") {
204
+		ws_handlers.on_open(e)
205
+	}
206
+
207
+}
208
+
209
+
210
+function ws_reload(){
211
+	try{
212
+		if ((!glob_u.ws.sockets.ws1 || glob_u.ws.sockets.ws1.readyState == 3 || glob_u.ws.sockets.ws1.readyState == undefined)){
213
+			ws_helper()
214
+		} else {
215
+		glob_u.ws.sockets.ws1.close()
216
+		clog(glob_u.ws.sockets.ws1,glob_u.ws.sockets.ws1.readyState)
217
+		glob_u.ws.sockets.ws1.onclose = ws_helper
218
+		}
219
+
220
+	} catch (err){
221
+		clog(err)
222
+	}
223
+}
224
+
225
+
226
+function get_room_name(){
227
+
228
+	var room_name=location.pathname.match(/\/loc.([^\/]*)\//)
229
+	if (room_name){
230
+		room_name = room_name[1]
231
+	} else {
232
+	room_name = location.pathname.split("/").pop()
233
+
234
+	}
235
+	return room_name
236
+
237
+}
238
+
239
+
240
+
241
+
242
+function ws_helper(){
243
+	clog("WS_HELPER")
244
+	var fns = window.glob_u.ws.fns
245
+	var o = {
246
+		include_participants_data:1, 
247
+		include_ws_channel_data:1, // required for participants_data to work
248
+		// msto.participants and masto.ws_channels will be defined in either case so we don't need to handle cases where some users enable this and some don't
249
+		AutoReconnect:false,
250
+		AutoReconnect:true,
251
+		url:'wss://' + window.location.hostname  +`/djc_srv/ws/chat/${get_room_name()}`,
252
+		socket_name:"ws1",
253
+		ord:glob_u.cb.ws,
254
+
255
+		methods:{
256
+		onmessage:fns.dispatch,
257
+		onclose:fns.onclose,
258
+		onerror:fns.onerror,
259
+		onopen:fns.onopen,
260
+		},
261
+
262
+
263
+
264
+		methods:{
265
+		onmessage:fns.onmessage,
266
+		onclose:fns.onclose,
267
+		onerror:fns.onerror,
268
+		onopen:fns.onopen,
269
+		},
270
+
271
+
272
+		fns:{
273
+
274
+
275
+		// reconnect:fns.reconnect,
276
+		},
277
+	}
278
+	/*
279
+	if (window.glob_u.ws.ws1 && window.glob_u.ws.ws1.readyState == 1){
280
+		clog("WS ws1 is CONNECTED:",window.glob_u.ws.ws1)
281
+		return
282
+	}
283
+	*/
284
+	var socket = connect_ws(o)
285
+	// clog({socket})
286
+}
287
+window.glob_u.fns.connect_ws = connect_ws
288
+glob_u.fns.get_room_name=get_room_name
289
+create_ws_ord()
290
+glob_u.cb.ws.reg_cb(window.glob_u.ws.fns.dispatch,"WS_MESSAGE:","WS_MESSAGE")

+ 124
- 0
templates/jsyncdb_example_lnk.html View File

@@ -0,0 +1,124 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+<style type="text/css">
7
+  h4{
8
+        margin-block-end: .5em;
9
+  }
10
+  .w_pre{
11
+
12
+    white-space: pre;
13
+  }
14
+  .code_container{
15
+    white-space: pre;
16
+  }
17
+  code{
18
+    white-space: pre;
19
+  }
20
+  a{
21
+    margin-left: .7em;
22
+
23
+  }
24
+  #root_div{
25
+    margin-top: 2em;
26
+    margin-left: 1em;
27
+  }
28
+  body {
29
+	font-size: larger;
30
+  }
31
+  #templates{
32
+  	display: none;
33
+  }
34
+
35
+
36
+</style>
37
+<script type="text/javascript">
38
+
39
+  function generate_name(){
40
+
41
+    var room_name = "room_" +Math.floor(Math.random() * 1000)
42
+    document.querySelector(".room_name").value = room_name
43
+    update_links()
44
+  
45
+  }
46
+  function update_links(){
47
+    console.log(">>>>>")
48
+    // document.querySelector(".user_1")
49
+    var domain_prefix
50
+    // var domain_name =  location.host.split(".").slice(-2).join(".") +"/ign/indx/jsyncdb"
51
+    var domain_name =  location.host.split(".").slice(-2).join(".") 
52
+    // +"/ign/indx/jsyncdb"
53
+    var room_name = "Room_1"
54
+    var room_name = document.querySelector(".room_name").value
55
+    // document.querySelector(".user_1").innerHTML = `${domain_prefix}<a href="https://${domain_prefix}.${domain_name}/${room_name}">user_1.jsyncdb.com/${room_name}</a>`
56
+    domain_prefix ="user_1"
57
+    document.querySelector("."+domain_prefix).innerHTML = `${domain_prefix}: <a href="https://${domain_prefix}.${domain_name}/${room_name}">${domain_prefix}.jsyncdb.com/${room_name}</a>`
58
+    domain_prefix ="user_2"
59
+    document.querySelector("."+domain_prefix).innerHTML = `${domain_prefix}: <a href="https://${domain_prefix}.${domain_name}/${room_name}">${domain_prefix}.jsyncdb.com/${room_name}</a>`
60
+    domain_prefix ="user_3"
61
+    document.querySelector("."+domain_prefix).innerHTML = `${domain_prefix}: <a href="https://${domain_prefix}.${domain_name}/${room_name}">${domain_prefix}.jsyncdb.com/${room_name}</a>`
62
+  }
63
+
64
+
65
+</script>
66
+</head>
67
+<body>
68
+<div id="templates">
69
+  
70
+<div class="ws_sto_lnk user_1a">
71
+user_1<a href="https://${domain_prefix}.${domain_name}/${room_name}">user_1.jsyncdb.com/${room_name}</a>
72
+</div>
73
+<div class="ws_sto_lnk user_2a">
74
+user_2<a href="https://${domain_prefix}.${domain_name}/${room_name}">user_1.jsyncdb.com/${room_name}</a>
75
+</div>
76
+<div class="ws_sto_lnk user_3a">
77
+user_3<a href="https://${domain_prefix}.${domain_name}/${room_name}">user_1.jsyncdb.com/${room_name}</a>
78
+</div>
79
+
80
+
81
+</div>
82
+
83
+<div id="root_div">
84
+
85
+<div class="">
86
+  <!-- Generate  -->
87
+<h4>
88
+  Jsyncdb
89
+</h4>
90
+
91
+<a href="https://jsyncdb.com/sto_demo"><h4>jsync main demo here</h4></a>
92
+
93
+git repos for the client and server will be added soon
94
+<div class="w_pre">
95
+Enter a room name <input type="text" class="room_name" oninput="update_links()"><button onclick="generate_name()">generate name</button>
96
+
97
+</div>
98
+the pages below will connect to the same database instance<br>
99
+to begin open two of devtools in two of these pages 
100
+<br>
101
+this demo assumes you are on a <b>desktop browser</b>
102
+<br>
103
+
104
+</div>
105
+<br>
106
+
107
+<div class="ws_sto_lnk user_1">
108
+user_1: <a href="">enter a room name first</a>
109
+</div>
110
+<div class="ws_sto_lnk user_2">
111
+user_2: <a href="">enter a room name first</a>
112
+</div>
113
+<div class="ws_sto_lnk user_3">
114
+user_3: <a href="">enter a room name first</a>
115
+<!-- user_3<a href="">enter a room name first</a> -->
116
+</div>
117
+
118
+
119
+
120
+
121
+</body>
122
+
123
+
124
+</html>

+ 71
- 0
templates/jsyncdb_index.html View File

@@ -0,0 +1,71 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script>
8
+
9
+
10
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
11
+
12
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+
47
+
48
+
49
+
50
+
51
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
52
+
53
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
54
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
55
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
56
+<!-- 
57
+ -->
58
+
59
+<!-- <script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script> -->
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+
62
+</head>
63
+<body>
64
+<div id="root_div">
65
+  <span class="iblock_2"></span>
66
+  <span class="iblock_1"></span>
67
+</div>
68
+
69
+
70
+</body>
71
+</html>

+ 123
- 0
templates/jsyncdb_index_v1.html View File

@@ -0,0 +1,123 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script>
8
+
9
+
10
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
11
+
12
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+
47
+
48
+
49
+
50
+
51
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
52
+
53
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
54
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
55
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
56
+<!-- 
57
+ -->
58
+
59
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+
62
+
63
+<style type="text/css">
64
+
65
+
66
+</style>
67
+ <link  class="rld" rel="stylesheet" href="/ign/indx/jsyncdb/jsync_demo.css">
68
+
69
+</head>
70
+<body>
71
+
72
+<div id="root_div">
73
+  <span class="iblock_2"></span>
74
+  <span class="iblock_1"></span>
75
+</div>
76
+<div id="oops_i_lied"><div class="code_container">
77
+  in this demo the global variable msto_prx is the root of the database.
78
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
79
+
80
+<b>open devtools on two pages connected to the same database to begin</b>
81
+to get a copy of the datastructure without the Proxies:
82
+<code>jc(msto)
83
+
84
+</code> set values<code>
85
+
86
+msto.key = "value"
87
+
88
+  msto.example = {
89
+    str:"these are supported data types",
90
+    number:12.7,
91
+    arr:["val0",1,{z:1},["a","b"]],
92
+    obj:{d:"there is a max depth of 15"},
93
+    str2:"null isn't fully supported yet and can break things",
94
+  }
95
+</code>
96
+  you can paste this shorter statement to avoid newlines in your devtools history :)
97
+
98
+<code>msto.example = {str:"str_val",number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth of 2?"},str2:"yet another string",}</code>
99
+
100
+  get values
101
+  <code>
102
+msto.example.arr[0]
103
+// "val0"
104
+
105
+msto.example.arr[2]
106
+// {z:2}</code>
107
+the datastructure should have syncronized msto & msto_prx on both webpages 
108
+<span class="db_desc">
109
+values can be strings,numbers,objects or arrays
110
+null and undefined are not supported yet
111
+local changes are immediate
112
+and deletes are local only (for now)
113
+after a value is set is pushed to everyone else who is connected
114
+
115
+msto.ws_channels and msto.participants are write protected 
116
+msto.my_data links to the path you have write access to as does msto.my_channel
117
+participants and channels write only data are automatically deleted after they leave
118
+the data is not persistent it exists in the webpages of those connected
119
+if everyone leaves a room the datastructure is destroyed
120
+</span></div></div>
121
+
122
+</body>
123
+</html>

+ 59
- 0
templates/jsyncdb_index_v2.html View File

@@ -0,0 +1,59 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script>
8
+
9
+
10
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
11
+
12
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+
32
+<script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script>
33
+
34
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
35
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
36
+
37
+
38
+
39
+
40
+
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
42
+
43
+<!-- 
44
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
45
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
46
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
47
+ -->
48
+
49
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
50
+
51
+</head>
52
+<body>
53
+<div id="root_div">
54
+  <span class="iblock_2"></span>
55
+  <span class="iblock_1"></span>
56
+</div>
57
+
58
+</body>
59
+</html>

+ 129
- 0
templates/jsyncdb_index_v3.html View File

@@ -0,0 +1,129 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<!-- <script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script> -->
8
+
9
+
10
+<script src="/jquery-3.5.1.min.js"></script>
11
+
12
+<!-- <script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> -->
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+<!-- 
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+ -->
47
+
48
+
49
+
50
+
51
+
52
+
53
+<!-- 
54
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
55
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
56
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
57
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
58
+
59
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+ -->
62
+
63
+<!-- <script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script> -->
64
+<script class="rld" src="/jsync_lib.js"></script>
65
+<script class="rld" src="/jsync_demo.js"></script>
66
+
67
+
68
+
69
+<style type="text/css">
70
+
71
+
72
+</style>
73
+ <link  class="rld" rel="stylesheet" href="/jsync_demo.css">
74
+
75
+</head>
76
+<body>
77
+
78
+<div id="root_div">
79
+  <span class="iblock_2"></span>
80
+  <span class="iblock_1"></span>
81
+</div>
82
+<div id="oops_i_lied"><div class="code_container">
83
+  in this demo the global variable msto_prx is the root of the database.
84
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
85
+
86
+<b>open devtools on two pages connected to the same database to begin</b>
87
+to get a copy of the datastructure without the Proxies:
88
+<code>jc(msto)
89
+
90
+</code> set values<code>
91
+
92
+msto.key = "value"
93
+
94
+  msto.example = {
95
+    str:"these are supported data types",
96
+    number:12.7,
97
+    arr:["val0",1,{z:1},["a","b"]],
98
+    obj:{d:"there is a max depth of 15"},
99
+    str2:"null isn't fully supported yet and can break things",
100
+  }
101
+</code>
102
+  you can paste this shorter statement to avoid newlines in your devtools history :)
103
+
104
+<code>msto.example = {str:"str_val",number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth of 2?"},str2:"yet another string",}</code>
105
+
106
+  get values
107
+  <code>
108
+msto.example.arr[0]
109
+// "val0"
110
+
111
+msto.example.arr[2]
112
+// {z:2}</code>
113
+the datastructure should have syncronized msto & msto_prx on both webpages 
114
+<span class="db_desc">
115
+values can be strings,numbers,objects or arrays
116
+null and undefined are not supported yet
117
+local changes are immediate
118
+and deletes are local only (for now)
119
+after a value is set is pushed to everyone else who is connected
120
+
121
+msto.ws_channels and msto.participants are write protected 
122
+msto.my_data links to the path you have write access to as does msto.my_channel
123
+participants and channels write only data are automatically deleted after they leave
124
+the data is not persistent it exists in the webpages of those connected
125
+if everyone leaves a room the datastructure is destroyed
126
+</span></div></div>
127
+
128
+</body>
129
+</html>

+ 129
- 0
templates/jsyncdb_index_v3a.html View File

@@ -0,0 +1,129 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<!-- <script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script> -->
8
+
9
+
10
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
11
+
12
+<!-- <script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> -->
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+<!-- 
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+ -->
47
+
48
+
49
+
50
+
51
+
52
+
53
+<!-- 
54
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
55
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
56
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
57
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
58
+
59
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+ -->
62
+
63
+<!-- <script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script> -->
64
+<script class="rld" src="/ign/indx/jsyncdb/jsync_lib.js"></script>
65
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
66
+
67
+
68
+
69
+<style type="text/css">
70
+
71
+
72
+</style>
73
+ <link  class="rld" rel="stylesheet" href="/ign/indx/jsyncdb/jsync_demo.css">
74
+
75
+</head>
76
+<body>
77
+
78
+<div id="root_div">
79
+  <span class="iblock_2"></span>
80
+  <span class="iblock_1"></span>
81
+</div>
82
+<div id="oops_i_lied"><div class="code_container">
83
+  in this demo the global variable msto_prx is the root of the database.
84
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
85
+
86
+<b>open devtools on two pages connected to the same database to begin</b>
87
+to get a copy of the datastructure without the Proxies:
88
+<code>jc(msto)
89
+
90
+</code> set values<code>
91
+
92
+msto.key = "value"
93
+
94
+  msto.example = {
95
+    str:"these are supported data types",
96
+    number:12.7,
97
+    arr:["val0",1,{z:1},["a","b"]],
98
+    obj:{d:"there is a max depth of 15"},
99
+    str2:"null isn't fully supported yet and can break things",
100
+  }
101
+</code>
102
+  you can paste this shorter statement to avoid newlines in your devtools history :)
103
+
104
+<code>msto.example = {str:"str_val",number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth of 2?"},str2:"yet another string",}</code>
105
+
106
+  get values
107
+  <code>
108
+msto.example.arr[0]
109
+// "val0"
110
+
111
+msto.example.arr[2]
112
+// {z:2}</code>
113
+the datastructure should have syncronized msto & msto_prx on both webpages 
114
+<span class="db_desc">
115
+values can be strings,numbers,objects or arrays
116
+null and undefined are not supported yet
117
+local changes are immediate
118
+and deletes are local only (for now)
119
+after a value is set is pushed to everyone else who is connected
120
+
121
+msto.ws_channels and msto.participants are write protected 
122
+msto.my_data links to the path you have write access to as does msto.my_channel
123
+participants and channels write only data are automatically deleted after they leave
124
+the data is not persistent it exists in the webpages of those connected
125
+if everyone leaves a room the datastructure is destroyed
126
+</span></div></div>
127
+
128
+</body>
129
+</html>

+ 151
- 0
templates/jsyncdb_index_v4.html View File

@@ -0,0 +1,151 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+
8
+
9
+
10
+<script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script>
11
+
12
+
13
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
14
+
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+
17
+
18
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
20
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
22
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
24
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
26
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
27
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
28
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
29
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
30
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
31
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
42
+<!-- 
43
+ -->
44
+
45
+<!-- <script class="rld" src="/jsync_lib.js"></script> -->
46
+<!-- <script class="rld" src="/jsync_demo.js"></script> -->
47
+<!-- <script class="rld z1" src="jsync_demo.js"></script> -->
48
+
49
+
50
+
51
+<style type="text/css">
52
+
53
+
54
+</style>
55
+ <!-- <link  class="rld" rel="stylesheet" href="/jsync_demo.css"> -->
56
+ <!-- <link  class="rld" rel="stylesheet" href="jsync_demo.css"> -->
57
+ <link  class="rld" rel="stylesheet" href="/ign/indx/jsyncdb/jsync_demo.css">
58
+
59
+
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
62
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
63
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
64
+
65
+<script type="text/javascript">
66
+
67
+window.nginx_v1 = {
68
+  "target_server_name":`<!--#echo var="target_server_name"-->`,
69
+  "ssl_server_name":`<!--#echo var="ssl_server_name"-->`,
70
+
71
+    ssl_certificate: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/fullchain.pem`,
72
+    ssl_certificate_key: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/privkey.pem`,
73
+
74
+}
75
+
76
+
77
+  function hide_demo(argument) {
78
+    clog("hide_demo")
79
+    $(".show_demo").removeClass("show_demo").addClass("hide_demo")
80
+
81
+  }
82
+  function show_demo(argument) {
83
+    clog("show_demo")
84
+    // body...
85
+    $(".hide_demo").removeClass("hide_demo").addClass("show_demo")
86
+  }
87
+</script>
88
+
89
+</head>
90
+<body>
91
+
92
+<div id="root_div">
93
+  <span class="iblock_2"></span>
94
+  <span class="iblock_1"></span>
95
+</div>
96
+<div class="json_container hide_demo">
97
+  <button class="demo_hide_btn" onclick="hide_demo()">hide demo</button>
98
+  <button class="demo_show_btn" onclick="show_demo()">show demo</button><br>
99
+  <!-- <div class="db_disp"></div> -->
100
+  <code class="db_disp"></code>
101
+</div>
102
+<div id="oops_i_lied"><div class="code_container">
103
+in this demo the global variable msto_prx is the root of the database.
104
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
105
+
106
+<b>open devtools on two pages connected to the same database to begin</b>
107
+to get a copy of the datastructure without the Proxies:
108
+<code>jc(msto)</code><div class="hidden-boundary"></div>
109
+
110
+ set values<code>
111
+
112
+msto.key = "value"<div class="hidden-boundary"></div>
113
+
114
+  msto.example = {
115
+    str:"these are supported data types",
116
+    number:12.7,
117
+    bool:true,
118
+    arr:["val0",1,{z:1},["a","b"]],
119
+    obj:{d:"there is a max depth of 15"},
120
+    str2:"null isn't fully supported yet and can break things",
121
+  }
122
+</code>
123
+  you can paste this shorter statement to avoid newlines in your devtools history :)
124
+
125
+<code>msto.example={str:"str_val",bool:true,number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth 2?"},str2:"another string"}</code><div class="hidden-boundary"></div>
126
+get values
127
+  <code>
128
+msto.example.arr[0]<div class="hidden-boundary"></div>
129
+// "val0"
130
+
131
+msto.example.arr[2]<div class="hidden-boundary"></div>
132
+// {z:2}</code>
133
+the datastructure should have syncronized msto & msto_prx on both webpages 
134
+<span class="db_desc">
135
+values can be strings, numbers, booleans, objects or arrays
136
+null and undefined are not supported yet
137
+local changes are immediate
138
+and deletes are local only (for now)
139
+after a value is set is pushed to everyone else who is connected
140
+
141
+msto.ws_channels and msto.participants are write protected 
142
+msto.my_data links to the path you have write access to as does msto.my_channel
143
+participants and channels write only data are automatically deleted after they leave
144
+the data is not persistent it exists in the webpages of those connected
145
+if everyone leaves a room the datastructure is destroyed
146
+
147
+
148
+</span></div></div>
149
+
150
+</body>
151
+</html>

+ 102
- 0
templates/jsyncdb_index_v4b.html View File

@@ -0,0 +1,102 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+
8
+
9
+
10
+<script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script>
11
+
12
+
13
+<script src="/ign/libs/jquery-3.5.1.min.js"></script>
14
+
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+
17
+
18
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
20
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
22
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
24
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
26
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
27
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
28
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
29
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> 
30
+
31
+
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo_db_only.js"></script>
33
+
34
+<!-- 
35
+
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
47
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
48
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
49
+ -->
50
+<!-- 
51
+ -->
52
+
53
+<!-- <script class="rld" src="/jsync_lib.js"></script> -->
54
+<!-- <script class="rld" src="/jsync_demo.js"></script> -->
55
+<!-- <script class="rld z1" src="jsync_demo.js"></script> -->
56
+
57
+
58
+
59
+<style type="text/css">
60
+
61
+
62
+</style>
63
+ <!-- <link  class="rld" rel="stylesheet" href="/jsync_demo.css"> -->
64
+ <!-- <link  class="rld" rel="stylesheet" href="jsync_demo.css"> -->
65
+ <link  class="rld" rel="stylesheet" href="/ign/indx/jsyncdb/jsync_demo.css">
66
+
67
+
68
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
69
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
70
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
71
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
72
+
73
+<script type="text/javascript">
74
+
75
+window.nginx_v1 = {
76
+  "target_server_name":`<!--#echo var="target_server_name"-->`,
77
+  "ssl_server_name":`<!--#echo var="ssl_server_name"-->`,
78
+
79
+    ssl_certificate: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/fullchain.pem`,
80
+    ssl_certificate_key: `/etc/letsencrypt/live/<!--#echo var="target_server_name"-->/privkey.pem`,
81
+
82
+}
83
+
84
+
85
+  function hide_demo(argument) {
86
+    clog("hide_demo")
87
+    $(".show_demo").removeClass("show_demo").addClass("hide_demo")
88
+
89
+  }
90
+  function show_demo(argument) {
91
+    clog("show_demo")
92
+    // body...
93
+    $(".hide_demo").removeClass("hide_demo").addClass("show_demo")
94
+  }
95
+</script>
96
+
97
+</head>
98
+<body>
99
+
100
+
101
+</body>
102
+</html>

+ 178
- 0
templates/jsyncdb_index_v5.html View File

@@ -0,0 +1,178 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<!-- <script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script> -->
8
+
9
+
10
+<script src="/shared_libs/jquery-3.5.1.min.js"></script>
11
+
12
+<!-- <script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> -->
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+<!-- 
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+ -->
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+<!-- <script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script> -->
55
+<script class="rld" src="/jsync_lib.js"></script>
56
+<script class="rld" src="/jsync_demo.js"></script>
57
+<script class="rld" src="/jsync_2nd_db.js"></script>
58
+<script class="rld" src="/jsync_test2.js"></script>
59
+<script class="rld" src="/ev_inc.js"></script>
60
+
61
+
62
+<style type="text/css">
63
+
64
+
65
+</style>
66
+ <link  class="rld" rel="stylesheet" href="/jsync_demo.css">
67
+  <link  class="rld" rel="stylesheet" href="/ev_inc.css">
68
+
69
+
70
+<script type="text/javascript">
71
+  function hide_demo(argument) {
72
+    // clog("hide_demo")
73
+    $(".show_demo").removeClass("show_demo").addClass("hide_demo")
74
+
75
+  }
76
+  function show_demo(argument) {
77
+    // clog("show_demo")
78
+    // body...
79
+    $(".hide_demo").removeClass("hide_demo").addClass("show_demo")
80
+  }
81
+
82
+function evl_btn_h(event,node){
83
+  _evl_btn_h(...arguments)
84
+
85
+}
86
+function eval_h(event,node){
87
+  _eval_h(...arguments)
88
+}
89
+
90
+
91
+</script>
92
+
93
+
94
+</head>
95
+
96
+<body>
97
+
98
+<div id="root_div">
99
+  <span class="iblock_2"></span>
100
+  <span class="iblock_1"></span>
101
+</div>
102
+<div class="json_container show_demo">
103
+  <button class="demo_hide_btn" onclick="hide_demo()">hide demo</button>
104
+  <button class="demo_show_btn" onclick="show_demo()">show demo</button><br>
105
+  <span class="color_legend">
106
+    
107
+  <span class="wperm2">green: </span>you have write access<br>
108
+  <span class="wperm">orange: </span>you don't have write access<br>
109
+  <span >black: </span>everyone has write access<br>
110
+  </span>
111
+  <!-- <div class="db_disp"></div> -->
112
+  <code class="db_disp"></code>
113
+&#8595; eval m.a={} {enter} &#8595;
114
+<!-- <br>  <textarea class="eval_txt" onkeypress="eval_h(event,this)"></textarea> -->
115
+<span class="evl_cnt">
116
+  
117
+<br>  <textarea class="eval_txt" onkeyup="evl_btn_h(event,this)" data-ev_type="keyup"></textarea> 
118
+<span class="btn_cnt">
119
+  
120
+<button class="evl_btn evl_btn1" data-ev_type="b" data-btn-type="b" onclick="evl_btn_h(event,this)"><</button>
121
+<button class="evl_btn evl_btn2" data-ev_type="f" data-btn-type="f" onclick="evl_btn_h(event,this)">></button>
122
+<button class="evl_btn evl_btn3" data-ev_type="e" data-btn-type="e" onclick="evl_btn_h(event,this)">eval</button>
123
+</span>
124
+</span>
125
+<br>
126
+<code class="eval_result"></code>
127
+
128
+</div>
129
+<div id="oops_i_lied"><div class="code_container">
130
+  in this demo the global variable msto_prx is the root of the database.
131
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
132
+
133
+<b>open devtools on two pages connected to the same database to begin</b>
134
+to get a copy of the datastructure without the Proxies:
135
+<code>jc(msto)</code><div class="hidden-boundary"></div>
136
+
137
+ set values<code>
138
+
139
+msto.key = "value"<div class="hidden-boundary"></div>
140
+
141
+  msto.example = {
142
+    str:"these are supported data types",
143
+    number:12.7,
144
+    bool:true,
145
+    arr:["val0",1,{z:1},["a","b"]],
146
+    obj:{d:"there is a max depth of 15"},
147
+    str2:"null isn't fully supported yet and can break things",
148
+  }
149
+</code>
150
+  you can paste this shorter statement to avoid newlines in your devtools history :)
151
+
152
+<code>msto.example={str:"str_val",bool:true,number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth 2?"},str2:"another string"}</code><div class="hidden-boundary"></div>
153
+get values
154
+  <code>
155
+msto.example.arr[0]<div class="hidden-boundary"></div>
156
+// "val0"
157
+
158
+msto.example.arr[2]<div class="hidden-boundary"></div>
159
+// {z:2}</code>
160
+the datastructure should have syncronized msto & msto_prx on both webpages 
161
+<span class="db_desc">
162
+values can be strings, numbers, booleans, objects or arrays
163
+null and undefined are not supported yet
164
+local changes are immediate
165
+and deletes are local only (for now)
166
+after a value is set is pushed to everyone else who is connected
167
+
168
+msto.ws_channels and msto.participants are write protected 
169
+msto.my_data links to the path you have write access to as does msto.my_channel
170
+participants and channels write only data are automatically deleted after they leave
171
+the data is not persistent it exists in the webpages of those connected
172
+if everyone leaves a room the datastructure is destroyed
173
+
174
+
175
+</span></div></div>
176
+
177
+</body>
178
+</html>

+ 80
- 0
templates/jsyncdb_index_v5b.html View File

@@ -0,0 +1,80 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<!-- <script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script> -->
8
+
9
+
10
+<script src="/shared_libs/jquery-3.5.1.min.js"></script>
11
+
12
+<!-- <script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> -->
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+<!-- 
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+ -->
47
+
48
+
49
+
50
+
51
+
52
+
53
+<!-- 
54
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
55
+<script src="/ign/j7/rldjs/rldjs5.js?v=139"></script>
56
+<script class="rld rrld" src="/ign/rls.js?<!--#echo var='rtqs'-->"></script>
57
+<script class="rld rrld_u" src="/ign/rls_u.js?<!--#echo var='rtqs'-->"></script>
58
+
59
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test2.js"></script>
60
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
61
+ -->
62
+
63
+<!-- <script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script> -->
64
+<script class="rld" src="/jsync_lib.js"></script>
65
+<script class="rld" src="/jsync_demo_db_only.js"></script>
66
+<!-- <script class="rld" src="/jsync_demo.js"></script> -->
67
+<!-- <script class="rld" src="/jsync_test2.js"></script> -->
68
+
69
+
70
+
71
+ <link  class="rld" rel="stylesheet" href="/jsync_demo.css">
72
+
73
+
74
+
75
+</head>
76
+
77
+<body>
78
+jsyncdb
79
+</body>
80
+</html>

+ 181
- 0
templates/jsyncdb_index_v5c.html View File

@@ -0,0 +1,181 @@
1
+<html itemscope itemtype="http://schema.org/Product" prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/html">
2
+  <head>
3
+
4
+<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
5
+
6
+
7
+<!-- <script class="win_keys2 win_keys_glob_attrs" src="/ign/j9/dbg/glob_attrs.js?c=00x"></script> -->
8
+
9
+
10
+<script src="/shared_libs/jquery-3.5.1.min.js"></script>
11
+
12
+<!-- <script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script> -->
13
+<!-- 
14
+<script class="rld" src="jsync_dep.js"></script>
15
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
16
+<script class="rld" src="jsync_ord.js"></script>
17
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
18
+<script class="rld" src="jsync_ws.js"></script>
19
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
20
+<script class="rld" src="jsync_sto.js"></script>
21
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
22
+<script class="rld" src="jsync_init.js"></script>
23
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
24
+<script class="rld" src="jsync_test.js"></script>
25
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>
26
+<script class="rld" src="jsync_demo.js"></script>
27
+ -->
28
+
29
+
30
+
31
+<!-- 
32
+<script class="rld" src="/ign/indx/jsyncdb/jsync_dep.js"></script>
33
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
34
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ord.js"></script>
35
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
36
+<script class="rld" src="/ign/indx/jsyncdb/jsync_ws.js"></script>
37
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
38
+<script class="rld" src="/ign/indx/jsyncdb/jsync_sto.js"></script>
39
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
40
+<script class="rld" src="/ign/indx/jsyncdb/jsync_init.js"></script>
41
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
42
+<script class="rld" src="/ign/indx/jsyncdb/jsync_test.js"></script>
43
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
44
+<script class="rld" src="/ign/indx/jsyncdb/jsync_demo.js"></script>
45
+<script class="win_keys" src="/ign/j9/dbg/win_keys.js?c=00x"></script>                             
46
+ -->
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+<!-- <script class="rld" type="module" src="/ign/indx/jsyncdb/jsync_lib.js"></script> -->
55
+<script class="rld" src="/jsync_lib.js"></script>
56
+<!-- 
57
+<script class="rld" src="/jsync_demo.js"></script>
58
+<script class="rld" src="/jsync_2nd_db.js"></script>
59
+<script class="rld" src="/jsync_test2.js"></script>
60
+<script class="rld" src="/ev_inc.js"></script>
61
+ -->
62
+
63
+
64
+<style type="text/css">
65
+
66
+
67
+</style>
68
+ <link  class="rld" rel="stylesheet" href="/jsync_demo.css">
69
+  <link  class="rld" rel="stylesheet" href="/ev_inc.css">
70
+
71
+<!-- 
72
+<script type="text/javascript">
73
+  function hide_demo(argument) {
74
+    // clog("hide_demo")
75
+    $(".show_demo").removeClass("show_demo").addClass("hide_demo")
76
+
77
+  }
78
+  function show_demo(argument) {
79
+    // clog("show_demo")
80
+    // body...
81
+    $(".hide_demo").removeClass("hide_demo").addClass("show_demo")
82
+  }
83
+
84
+function evl_btn_h(event,node){
85
+  _evl_btn_h(...arguments)
86
+
87
+}
88
+function eval_h(event,node){
89
+  _eval_h(...arguments)
90
+}
91
+
92
+
93
+</script>
94
+ -->
95
+
96
+
97
+</head>
98
+
99
+<body>
100
+
101
+<div id="root_div">
102
+  <span class="iblock_2"></span>
103
+  <span class="iblock_1"></span>
104
+</div>
105
+<div class="json_container show_demo">
106
+  <button class="demo_hide_btn" onclick="hide_demo()">hide demo</button>
107
+  <button class="demo_show_btn" onclick="show_demo()">show demo</button><br>
108
+  <span class="color_legend">
109
+    
110
+  <span class="wperm2">green: </span>you have write access<br>
111
+  <span class="wperm">orange: </span>you don't have write access<br>
112
+  <span >black: </span>everyone has write access<br>
113
+  </span>
114
+  <!-- <div class="db_disp"></div> -->
115
+  <code class="db_disp"></code>
116
+&#8595; eval m.a={} {enter} &#8595;
117
+<!-- <br>  <textarea class="eval_txt" onkeypress="eval_h(event,this)"></textarea> -->
118
+<span class="evl_cnt">
119
+  
120
+<br>  <textarea class="eval_txt" onkeyup="evl_btn_h(event,this)" data-ev_type="keyup"></textarea> 
121
+<span class="btn_cnt">
122
+  
123
+<button class="evl_btn evl_btn1" data-ev_type="b" data-btn-type="b" onclick="evl_btn_h(event,this)"><</button>
124
+<button class="evl_btn evl_btn2" data-ev_type="f" data-btn-type="f" onclick="evl_btn_h(event,this)">></button>
125
+<button class="evl_btn evl_btn3" data-ev_type="e" data-btn-type="e" onclick="evl_btn_h(event,this)">eval</button>
126
+</span>
127
+</span>
128
+<br>
129
+<code class="eval_result"></code>
130
+
131
+</div>
132
+<div id="oops_i_lied"><div class="code_container">
133
+  in this demo the global variable msto_prx is the root of the database.
134
+we will use the global variable msto because it is a little nicer (has shortcuts to the parts you have exclusive write permissions to).
135
+
136
+<b>open devtools on two pages connected to the same database to begin</b>
137
+to get a copy of the datastructure without the Proxies:
138
+<code>jc(msto)</code><div class="hidden-boundary"></div>
139
+
140
+ set values<code>
141
+
142
+msto.key = "value"<div class="hidden-boundary"></div>
143
+
144
+  msto.example = {
145
+    str:"these are supported data types",
146
+    number:12.7,
147
+    bool:true,
148
+    arr:["val0",1,{z:1},["a","b"]],
149
+    obj:{d:"there is a max depth of 15"},
150
+    str2:"null isn't fully supported yet and can break things",
151
+  }
152
+</code>
153
+  you can paste this shorter statement to avoid newlines in your devtools history :)
154
+
155
+<code>msto.example={str:"str_val",bool:true,number:12.7,arr:["val0",1,{z:2},["a","b"]],obj:{d:"depth 2?"},str2:"another string"}</code><div class="hidden-boundary"></div>
156
+get values
157
+  <code>
158
+msto.example.arr[0]<div class="hidden-boundary"></div>
159
+// "val0"
160
+
161
+msto.example.arr[2]<div class="hidden-boundary"></div>
162
+// {z:2}</code>
163
+the datastructure should have syncronized msto & msto_prx on both webpages 
164
+<span class="db_desc">
165
+values can be strings, numbers, booleans, objects or arrays
166
+null and undefined are not supported yet
167
+local changes are immediate
168
+and deletes are local only (for now)
169
+after a value is set is pushed to everyone else who is connected
170
+
171
+msto.ws_channels and msto.participants are write protected 
172
+msto.my_data links to the path you have write access to as does msto.my_channel
173
+participants and channels write only data are automatically deleted after they leave
174
+the data is not persistent it exists in the webpages of those connected
175
+if everyone leaves a room the datastructure is destroyed
176
+
177
+
178
+</span></div></div>
179
+
180
+</body>
181
+</html>

+ 2
- 0
templates/shared_libs/jquery-3.5.1.min.js
File diff suppressed because it is too large
View File


Loading…
Cancel
Save