You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jsync_lib.js 35KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658
  1. "use strict";
  2. // makestache template info
  3. // the following string tells my make scripts its fine to overwtite this the library would have had a template str in the middle of the str
  4. // BUILT_FILE_OVERWRITE_ALLOWED
  5. // ... C:\ws\repos\jitsi_main\jsync\jsyncdb\js_client\jsync_lib.js
  6. // /* */
  7. (function (){
  8. var isProxy,tlu,msto_z
  9. var pf,msto_prx
  10. // jsync:dep.js
  11. // ------------------------------------------------------------------------------------------------
  12. // window.w = window.w || {}
  13. // w.clog = console.log
  14. var clog = console.log
  15. // var clog = w.clog
  16. // clog("??")
  17. function nop(){}
  18. window.glob_u = window.glob_u || {
  19. cb:{},
  20. fns:{},
  21. cls:{},
  22. tvar:{},
  23. data:{},
  24. prom:{},
  25. rrefs:{},
  26. xj:{},
  27. templates:{},
  28. }
  29. glob_u.fns.gen_sort_attr = function gen_sort_attr(attr){
  30. return function gsort(a0,a1){
  31. if (a0[attr] > a1[attr]){
  32. return 1
  33. } else if (a0[attr] < a1[attr]){
  34. return -1
  35. } else {
  36. return 0
  37. }
  38. }
  39. }
  40. glob_u.fns.find_attr = function find_attr(elm,indx,arr){
  41. if (elm && elm[this.attr] == this.val){
  42. return 1
  43. }
  44. }
  45. glob_u.fns.splice_out = function splice_out(arr,elm){
  46. let i = arr.indexOf(elm)
  47. if (i != -1){
  48. return arr.splice(i,1)
  49. }
  50. }
  51. function jclone(obj){
  52. return Array.isArray(obj) ? $.extend(true,[],obj) : $.extend(true,{},obj)
  53. }
  54. function jx(obj){
  55. return JSON.parse(JSON.stringify(obj))
  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. // window.jc = jclone
  67. window.jc = jclone_rval
  68. // TODO:JFI eventually merge
  69. // j9\dev_dep\misc_dev.js
  70. glob_u.fns.gen_ord_decs = function(ord,cb_prefix){
  71. var reg_cb = function(cb,key_name,cb_name,override_level,push){
  72. return ord.reg_cb(cb,cb_prefix+key_name,cb_name,override_level,push)
  73. }
  74. var run_cbs_lz = function(key,arg_obj,lazy=1){
  75. if (lazy && cb_prefix+key in ord.cb_sto){
  76. return ord.run_cbs(cb_prefix+key,arg_obj)
  77. }
  78. }
  79. var run_cbs = function(key,arg_obj){
  80. return ord.run_cbs(cb_prefix+key,arg_obj)
  81. // split out later maybe?
  82. }
  83. function req_batch_run(key,arg_obj,combine){
  84. return ord.req_batch_run(cb_prefix+key,arg_obj)
  85. }
  86. reg_cb.ord = ord
  87. reg_cb.cb_prefix = cb_prefix
  88. run_cbs.ord = ord
  89. run_cbs.cb_prefix = cb_prefix
  90. run_cbs_lz.ord = ord
  91. run_cbs_lz.cb_prefix = cb_prefix
  92. return {reg_cb,run_cbs,run_cbs_lz,req_batch_run}
  93. }
  94. // duplicated in jdev0
  95. glob_u.fns.merge_partial_template = function merge_partial_template(main,template){
  96. let t = $.extend(true,{},template,main)
  97. return $.extend(true,main,t)
  98. }
  99. // jsync:ord.js
  100. // ------------------------------------------------------------------------------------------------
  101. {
  102. var dflt_opts = {
  103. // sort_fn:gen_sort_attr("override_level"),
  104. sort_fn:glob_u.fns.gen_sort_attr("override_level"),
  105. log_level:0,
  106. // ns:"",
  107. }
  108. class BoundObj{
  109. constructor(){
  110. this.init()
  111. }
  112. init(){
  113. let k,v,i,j
  114. for ([k,v] of Object.entries(Object.getOwnPropertyDescriptors(this.__proto__))){
  115. if (k.endsWith("_ub") && typeof(v.value) == "function"){
  116. // clog("UB",k,k.slice(1,-3))
  117. j = v.value.bind(this)
  118. j.meta_str = "bound_fn"
  119. this[k.slice(1,-3)] = j
  120. }
  121. }
  122. }
  123. /*
  124. mx2_ub(){
  125. clog("Mx2")
  126. }
  127. */
  128. }
  129. function resolveNow(){}
  130. async function resolveSoon(){}
  131. // class reg_cb_ord{
  132. class reg_cb_ord extends BoundObj{
  133. // con
  134. constructor(opts){
  135. super()
  136. this.opts = Object.assign({},dflt_opts,opts)
  137. this.r = Object.assign(this,dflt_opts,opts)
  138. // this.sort_fn = this.opts
  139. this.cb_sto = {}
  140. this.batch = {}
  141. this._orig_opts = opts
  142. // clog("v2 ",this)
  143. }
  144. _promise_test_ub(arg1){
  145. // clog()
  146. console.log("promise_test",{that:this,arg1})
  147. // console.log("promise_test",{that:this,opts:this.opts,arg1})
  148. }
  149. promise_test_init(){
  150. var p = new Promise((resolve,reject)=>{
  151. resolve("Promise.~")
  152. })
  153. p.then(this.promise_test)
  154. console.log("promise_test_init",{that:this,opts:this.opts})
  155. }
  156. _batch_run_ub(){
  157. this.batch.WillRun = false
  158. var batched_events = this.batch.batched_events
  159. var i,k,v
  160. for ([k,v] of Object.entries(batched_events.combinable)){
  161. this.run_cbs(v.key,v.arg_obj)
  162. }
  163. for ([k,v] of Object.entries(batched_events.unique)){
  164. this.run_cbs(v.key,v.arg_obj)
  165. }
  166. this.batch.batched_events = {
  167. combinable:{},
  168. unique:[],
  169. }
  170. }
  171. _req_batch_run_ub(key,arg_obj,combine){
  172. if (this.batch.WillRun != true) {
  173. this.batch.WillRun = true
  174. this.batch.batched_events = {
  175. combinable:{},
  176. unique:[],
  177. }
  178. new Promise((resolve,reject)=>{
  179. resolve("Promise.~")
  180. }).then(this.batch_run)
  181. }
  182. if (this.batch.WillRun == true){
  183. if (combine){
  184. this.batch.batched_events.combinable[key] = {key,arg_obj,combine}
  185. } else {
  186. this.batch.batched_events.unique.push({key,arg_obj,combine})
  187. }
  188. }
  189. if (!(this.batch.WillRun == true ||this.batch.WillRun == false )){
  190. console.error("::")
  191. throw "req_batch_run err"
  192. }
  193. }
  194. _reg_cb_ub(cb,key_name,cb_name,override_level = 100,push=1){
  195. if (typeof(cb) != "function"){
  196. console.error("callback is not a function. setting push=r","\ncb:",cb)
  197. push = "r"
  198. // console.error("callback:",cb," is not a function")
  199. }
  200. // var this.cb_sto = {}
  201. var cb_sort = nop
  202. if (!this.cb_sto[key_name]){
  203. this.cb_sto[key_name] = []
  204. }
  205. // this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name})
  206. // splice_out_ti(this.cb_sto[key_name],this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name}))
  207. // var cbo0= this.cb_sto[key_name].find(glob_td.fn.find_html_cb,{fn_key:cb_name})
  208. // var cbo0= this.cb_sto[key_name].find(find_attr,{fn_key:cb_name})
  209. var cbo0= this.cb_sto[key_name].find(glob_u.fns.find_attr,{attr:"fn_key",val:cb_name})
  210. // clog(cbo0)
  211. glob_u.fns.splice_out(this.cb_sto[key_name],cbo0)
  212. // tn2t.arr.
  213. // splice_out_cb
  214. let cb_obj = {
  215. cb,
  216. hkey:key_name,
  217. fn_key:cb_name,
  218. override_level,
  219. }
  220. if (push=="r"){
  221. } else if (push){
  222. this.cb_sto[key_name].push(cb_obj)
  223. } else {
  224. this.cb_sto[key_name].unshift(cb_obj)
  225. }
  226. this.cb_sto[key_name].sort(this.sort_fn)
  227. }
  228. _run_cbs_ub(key,arg_obj){
  229. var k,v
  230. var o = {
  231. // html_key:key,cbs:glob_mx.html_cb[key],
  232. }
  233. // dlog("RUN_HOOK_CB??",key,glob_mx.hook_cb[key])
  234. // clog("ORD:RUN",key,arg_obj)
  235. try {
  236. this.opts.log_level ? clog("run_cbs",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}) : 0
  237. var rmv_fns = []
  238. for ([k,v] of Object.entries(this.cb_sto[key]|| {}) ) {
  239. // dlog("RUN_HOOK_CB:",k)
  240. // clog("run_html_cbs:",k,v)
  241. this.opts.log_level > 1 ? clog("run_cbs_e",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v}) : 0
  242. v.cb(arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v})
  243. if (v.remove_after_exe){
  244. rmv_fns.push(v)
  245. }
  246. // v(o)
  247. }
  248. for ([k,v] of Object.entries(rmv_fns|| {}) ) {
  249. glob_u.fns.splice_out(this.cb_sto[key],v)
  250. }
  251. // return {arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}}
  252. return {arg_obj,o,info:{that:this,hkey:key,cbs:this.cb_sto[key],rmv_fns}}
  253. } catch(err){
  254. console.error("ti_v_cb err:",err)
  255. }
  256. }
  257. }
  258. window.glob_u.cls.reg_cb_ord = reg_cb_ord
  259. }
  260. // jsync:ws.js
  261. // ------------------------------------------------------------------------------------------------
  262. // FILE:WS0
  263. // TODO:JFI this file probably causes memory leaks
  264. window.glob_u.ws = window.glob_u.ws || {
  265. sockets:{},
  266. fns:{},
  267. flags:{},
  268. }
  269. window.glob_u.trc = window.glob_u.trc || {
  270. arr:[],
  271. }
  272. // TODO:JFI I should factor out my development junk
  273. function trc_sto(s,o){
  274. if (!glob_u?.prom?.init_db_resolve?.resolved){
  275. var elm = {name:s,o,timestamp:Date.now()}
  276. glob_u.trc.arr.push(elm)
  277. // clog("_trc:sto",s,o.sto_event_type,elm.timestamp,o)
  278. }
  279. }
  280. window.glob_u.ws.fns.reconnect = function reconnect(o,close_event){
  281. connect_ws(o.params)
  282. }
  283. // TODO:JFI These event handlers are less generic now
  284. window.glob_u.ws.fns.onclose = function onclose(event){
  285. clog("WS_CLOSE",{that:this,readyState:this.readyState,args:[...arguments]})
  286. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_CLOSE:",{event,that:this})
  287. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_CLOSE:",{event,that:this})
  288. // setTimeout(this.params.fns.reconnect,1000)
  289. let timeout0 = this.params.timeout0 || 100
  290. let timeout_multi = this.params.timeout_multi || 3000
  291. let t =timeout_multi
  292. // let now = Date.now()
  293. if (this.params.HAS_OPENED && timeout_multi<Date.now()-this.params.OPEN_TIME){
  294. t=timeout0
  295. }
  296. // clog(":TIME:",now,this.params.OPEN_TIME,now-this.params.OPEN_TIME)
  297. this.params.HAS_OPENED = 0
  298. setTimeout(this.params.fns.reconnect,t)
  299. }
  300. window.glob_u.ws.fns.onmessage = function onmessage(event){
  301. // clog("WS_MESSAGE",{that:this,args:[...arguments]})
  302. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
  303. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
  304. }
  305. window.glob_u.ws.fns.onerror = function onerror(event){
  306. // clog("WS_ERROR",{that:this,args:[...arguments]})
  307. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_ERROR:",{event,that:this})
  308. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_ERROR:",{event,that:this})
  309. }
  310. window.glob_u.ws.fns.onopen = function onopen(event){
  311. this.params.HAS_OPENED = 1
  312. this.params.OPEN_TIME = Date.now()
  313. // clog("WS_OPEN???",{that:this,args:[...arguments]},{on_open_once:this.on_open_once,on_open_cbs:this.params.on_open_cbs})
  314. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_OPEN:",{event,that:this})
  315. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_OPEN:",{event,that:this})
  316. return
  317. var cb
  318. if (this.on_open_once){
  319. for (cb of this.on_open_once){
  320. cb(event,this)
  321. }
  322. if (this?.params?.on_open_cbs){
  323. for (cb of this?.params?.on_open_cbs){
  324. cb(event,this)
  325. }
  326. }
  327. }
  328. }
  329. window.glob_u.ws.fns.ws_fns_factory = function ws_fns_factory(socket_opts){
  330. var socket_name = socket_opts.socket_name
  331. // const sockets =
  332. var v1 = "init"
  333. var fns = {
  334. get_socket(o){
  335. return glob_u.ws.sockets[socket_name]
  336. },
  337. reconnect(){
  338. var socket = fns.get_socket()
  339. clog("RECONNECT",socket_opts,socket,socket?.DoNotReconnect)
  340. // if (socket.DoNotReconnect || socket.params.DoNotReconnect || glob_u.ws?.flags?.DoNotReconnect){
  341. if (socket.DoNotReconnect || !socket.params.AutoReconnect || glob_u.ws?.flags?.DoNotReconnect){
  342. clog("RECONNECTION NOT ATTEMPTED",socket_opts)
  343. return
  344. } else {
  345. }
  346. connect_ws(socket_opts)
  347. },
  348. log_var(o){
  349. clog("var:",v1)
  350. return v1
  351. },
  352. set_var(val){
  353. v1 = val
  354. return v1
  355. },
  356. send_text(o){
  357. var socket = fns.get_socket()
  358. clog("send_text",{that:this,fns})
  359. socket.send(JSON.stringify(o));
  360. },
  361. jsend(o){
  362. var socket = fns.get_socket()
  363. // clog("!!!",{that:this,fns})
  364. socket.send(JSON.stringify(o));
  365. },
  366. }
  367. return fns
  368. }
  369. function connect_ws(o= {}){
  370. // clog("connect_ws:",o,jc(o))
  371. glob_u.fns.merge_partial_template(o,{on_open_cbs:[]})
  372. var sockets = window.glob_u.ws.sockets
  373. var old_socket = sockets[o.socket_name]
  374. if (old_socket && old_socket.readyState == 1){
  375. clog(`WS ${o.socket_name} is already CONNECTED:`,old_socket , o)
  376. return
  377. } else if (old_socket && (old_socket.readyState != 3 && old_socket.readyState != undefined )){
  378. clog(`WS ${o.socket_name} exsists and in not closed:`,old_socket , o)
  379. return
  380. }
  381. var socket = new WebSocket(o.url)
  382. socket.on_open_once = []
  383. socket.pre_init_msgs = []
  384. socket.params = o
  385. // if ()
  386. Object.assign(o.fns, window.glob_u.ws.fns.ws_fns_factory(o))
  387. // Object.assign(o.fns2, window.glob_u.ws.fns.ws_fns_factory(o))
  388. Object.assign(socket,o.methods)
  389. sockets[o.socket_name]=socket
  390. // o.jsend ? socket.jsend = o.jsend: 0
  391. // clog("CONNECTING WS:",{o,socket})
  392. return [socket,old_socket]
  393. }
  394. // FILE:WS1
  395. function create_ws_ord(){
  396. if (!glob_u.cb.ws){
  397. var ord = new glob_u.cls.reg_cb_ord()
  398. glob_u.cb.ws = ord
  399. glob_u.cb.ws.reg_cb = ord.reg_cb
  400. glob_u.cb.ws.run_cbs = ord.run_cbs
  401. glob_u.cb.ws.STO_EVENT = glob_u.fns.gen_ord_decs(glob_u.cb.ws,"STO_EVENT:")
  402. // glob_u.cb.ord_v1.estr = glob_u.fns.gen_ord_decs(glob_u.cb.ord_v1.ord,"")
  403. // glob_u.cb.ord_v1.run_cbs_lz = glob_u.cb.ord_v1.estr.run_cbs_lz
  404. // glob_u.cb.ord_v1.ord.run_cbs_lz = glob_u.cb.ord_v1.run_cbs_lz
  405. }
  406. }
  407. window.glob_u.ws.fns.dispatch = function dispatch(o,obj_x,info){
  408. var event = o.event
  409. // socket = o.that
  410. var data = JSON.parse(event.data)
  411. // clog("WS_dispatch",data,socket.params.ord,data["CLIENT_KEY"])
  412. // clog("trc:sto:ws_rec",data.CLIENT_KEY,data.sto_event_type,data)
  413. trc_sto("ws_rec",data)
  414. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:"+data["CLIENT_KEY"],{event,that:this,data})
  415. return
  416. if (e.arguments[0].type == "message"){
  417. var data = JSON.parse(e.arguments[0].data)
  418. if ("type" in data && ws_handlers[data.type]){
  419. ws_handlers[data.type](data,{that:e.that,event:e.arguments[0]})
  420. } else {
  421. clog("NO HANDLER FOR",data.type)
  422. }
  423. clog("~WS",data,e)
  424. } else if (e.arguments[0].type == "open") {
  425. ws_handlers.on_open(e)
  426. }
  427. }
  428. function ws_reload(){
  429. try{
  430. if ((!glob_u.ws.sockets.ws1 || glob_u.ws.sockets.ws1.readyState == 3 || glob_u.ws.sockets.ws1.readyState == undefined)){
  431. ws_helper()
  432. } else {
  433. glob_u.ws.sockets.ws1.close()
  434. clog(glob_u.ws.sockets.ws1,glob_u.ws.sockets.ws1.readyState)
  435. glob_u.ws.sockets.ws1.onclose = ws_helper
  436. }
  437. } catch (err){
  438. clog(err)
  439. }
  440. }
  441. function get_room_name(){
  442. // return
  443. var s=location.search
  444. // if s[0]=="?"){}
  445. s[0]=="?" ? s = s.slice(1):0
  446. var param
  447. for (param of s.split("&")){
  448. let kv = param.split("=")
  449. if (kv[0]=="room"){
  450. return kv[1]
  451. }
  452. clog("::",param,kv)
  453. // clog("::",param,kv,"")
  454. }
  455. // var
  456. return "room_name"
  457. var room_name=location.pathname.match(/\/loc.([^\/]*)\//)
  458. if (room_name){
  459. room_name = room_name[1]
  460. } else {
  461. room_name = location.pathname.split("/").pop()
  462. }
  463. return room_name
  464. }
  465. // function get_room_name(){
  466. function get_room_name_old(){
  467. var room_name=location.pathname.match(/\/loc.([^\/]*)\//)
  468. if (room_name){
  469. room_name = room_name[1]
  470. } else {
  471. room_name = location.pathname.split("/").pop()
  472. }
  473. return room_name
  474. }
  475. function ws_helper(){
  476. clog("WS_HELPER")
  477. var fns = window.glob_u.ws.fns
  478. var o = {
  479. include_participants_data:1,
  480. include_ws_channel_data:1, // required for participants_data to work
  481. // 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
  482. AutoReconnect:false,
  483. AutoReconnect:true,
  484. url:'wss://' + window.location.hostname +`/djc_srv/ws/chat/${get_room_name()}`,
  485. socket_name:"ws1",
  486. ord:glob_u.cb.ws,
  487. methods:{
  488. onmessage:fns.dispatch,
  489. onclose:fns.onclose,
  490. onerror:fns.onerror,
  491. onopen:fns.onopen,
  492. },
  493. methods:{
  494. onmessage:fns.onmessage,
  495. onclose:fns.onclose,
  496. onerror:fns.onerror,
  497. onopen:fns.onopen,
  498. },
  499. fns:{
  500. // reconnect:fns.reconnect,
  501. },
  502. }
  503. /*
  504. if (window.glob_u.ws.ws1 && window.glob_u.ws.ws1.readyState == 1){
  505. clog("WS ws1 is CONNECTED:",window.glob_u.ws.ws1)
  506. return
  507. }
  508. */
  509. var socket = connect_ws(o)
  510. // clog({socket})
  511. }
  512. window.glob_u.fns.connect_ws = connect_ws
  513. glob_u.fns.get_room_name=get_room_name
  514. create_ws_ord()
  515. glob_u.cb.ws.reg_cb(window.glob_u.ws.fns.dispatch,"WS_MESSAGE:","WS_MESSAGE")
  516. // jsync:sto.js
  517. // ------------------------------------------------------------------------------------------------
  518. // FILE:DS0
  519. var Proxy_Permissions,Proxy_Factory
  520. function mhndlr_rld_2(_o,scope,info){
  521. var dlog =nop
  522. try {
  523. var parsed = _o.data
  524. var o = parsed.payload
  525. // clog("mhndlr_rld",parsed.sto_event_type,parsed,{_o,scope,info})
  526. if (window.mhndlr_rld_dbg){
  527. mhndlr_rld_dbg({m,that,n,parsed,ai,o,arguments})
  528. }
  529. switch (parsed.sto_event_type){
  530. case "set_msg":
  531. // if (!glob_u.prom.init_db_resolve.resolved){
  532. if (!glob_u.prom.init_db_resolve.resolved_inited){
  533. _o.event.target.pre_init_msgs.push(_o)
  534. }
  535. pf._set_recv(o.path,o.key,o.val)
  536. // clog("msto_evh?ord")
  537. glob_u.fns.msto_evh ? glob_u.fns.msto_evh(o,parsed) : 0
  538. break;
  539. case "group_count":
  540. // clog("mhndlr_rld group_count",parsed)
  541. if (parsed.group_count < 2){
  542. // clog("mhndlr_rld group_count RESOLVE")
  543. glob_u.prom.init_db_resolve(glob_u.prom.init_db_resolve_timeout_arg)
  544. }
  545. break;
  546. case "event":
  547. /*
  548. dlog("~event~",parsed)
  549. if (window.dispatch_events){
  550. dispatch_events({parsed,ai,m,that})
  551. }
  552. */
  553. break;
  554. case "msg_test":
  555. dlog("msg_test",parsed)
  556. break;
  557. case "db_sync_request":
  558. // tmsgx4({sto_event_type:"db_sync_response",payload:pf.root,"CLIENT_KEY":"ws_sto"})
  559. // if (glob_u.prom.init_db_resolve.resolved){
  560. if (glob_u.prom.init_db_resolve.resolved_inited == 2){
  561. 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"})
  562. }
  563. break;
  564. case "db_sync_response":
  565. if (glob_u.prom.init_db_resolve && parsed.request_rn_from == glob_u.prom.init_db_resolve.rn){
  566. glob_u.prom.init_db_resolve({aaa:"dsr",pl:parsed.payload})
  567. }
  568. // clog("db_sync_response",parsed)
  569. break;
  570. }
  571. } catch (err) {
  572. clog("mhndlr err:",err)
  573. }
  574. }
  575. glob_u.fns.msto_evh = function(o,parsed,ai,id){
  576. // clog("ord_msto_evh")
  577. if (o.path[0]!="conference" || o.path[1]!="events"){
  578. return
  579. }
  580. glob_u.cb.ws.STO_EVENT.run_cbs(":STO_EVENT",{o,parsed,ai,id})
  581. if (typeof(o.val) == "object"){
  582. glob_u.cb.ws.STO_EVENT.run_cbs(o.val.type,{o,parsed,ai,id})
  583. }
  584. }
  585. glob_u.cb.ws.reg_cb(mhndlr_rld_2,"WS_MESSAGE:ws_sto","WS_MESSAGE:ws_sto")
  586. // FILE:DS1
  587. var dlog = nop
  588. function tmsgx4(m){
  589. var socket = glob_u.ws.sockets.ws1
  590. var jsend = socket.params.fns.jsend
  591. var t = {
  592. key:"tmp_dev_sto",
  593. }
  594. glob_u.fns.merge_partial_template(m,t)
  595. // clog("tmsgx4",{key:m.key,sto_event_type:m.sto_event_type,CLIENT_KEY:m.CLIENT_KEY},{m,t})
  596. trc_sto("tmsgx4",m)
  597. jsend(m)
  598. }
  599. isProxy = Symbol("isProxy")
  600. tlu = {
  601. object:"",
  602. string:true,
  603. number:true,
  604. undefined:true,
  605. boolean:true,
  606. }
  607. function type_info(o){
  608. try {
  609. var t
  610. var flags = {
  611. leaf:false,
  612. deep_not_prx:false,
  613. prx:false,
  614. isObj:false,
  615. isArr:false,
  616. els:false,
  617. }
  618. t = typeof(o)
  619. flags.t=t
  620. if (!(o === null)){
  621. flags.isArr = Array.isArray(o)
  622. flags.isObj = Object.prototype == o.__proto__
  623. }
  624. if (tlu[t] === true || o === null){
  625. flags.leaf = true
  626. } else if (t == "object" && o.__prx){
  627. flags.prx = true
  628. } else if (t == "object" && (flags.isArr || flags.isObj)){
  629. flags.prx = false
  630. flags.deep_not_prx = true
  631. } else {
  632. clog("ELSE")
  633. flags.els = true
  634. }
  635. return flags
  636. } catch (err){
  637. clog("type_info err:",err,{flags,o})
  638. }
  639. }
  640. function deep_prop_v0(o,p){
  641. try {
  642. var arr = jc(p)
  643. var ret = o
  644. while (arr.length){
  645. ret = ret[arr.shift()]
  646. }
  647. return ret
  648. } catch(err){console.error("DEEP_PROP ERR:",err)}
  649. }
  650. // delete Proxy_Factory
  651. // {
  652. Proxy_Factory = class Proxy_Factory {
  653. constructor(o,n="dflt"){
  654. this.db = o
  655. this.n = n
  656. this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy"]
  657. this._pub_cb =[]
  658. this.__prx = true
  659. this.SymPrx = Symbol("SymPrx")
  660. }
  661. init(o){
  662. this.root = o
  663. }
  664. sync(o){
  665. this.root = jc(o.root)
  666. o._pub_cb.push(this._set_recv.bind(this))
  667. }
  668. get prxy(){
  669. return this
  670. }
  671. _set(o,k,v,prx,a0){
  672. this.obj[k]=prx
  673. }
  674. set_pub(obj, prop, val,receiver){
  675. this._set_pub(obj.__path_arr, prop, jx(val))
  676. }
  677. _set_pub(path,key,val){
  678. var k,v
  679. var arg = {
  680. "CLIENT_KEY":"ws_sto",
  681. "sto_event_type":"set_msg",
  682. "payload":{path,key,val},}
  683. tmsgx4(arg,
  684. )
  685. for (v of this._pub_cb){
  686. v(path,key,val)
  687. }
  688. }
  689. _set_recv(path,prop,val,id){
  690. var p = path
  691. var nprop = deep_prop_v0(this.root,p)
  692. var dpth = nprop.__dpth
  693. if (tlu[typeof(val)]){
  694. nprop._set(nprop,prop,val,val)
  695. } else {
  696. nprop._set(nprop,prop,val,new Proxy(val,this))
  697. nprop[prop].add_proxy(nprop,prop,val,dpth+1)
  698. }
  699. this.walker(nprop[prop],{},dpth+2)
  700. }
  701. set(obj, prop, val,receiver){
  702. if (obj[prop] === val){
  703. return Reflect.set(...arguments)
  704. }
  705. this.set_pub(obj, prop, val,receiver)
  706. this.event_proc("set")
  707. if ("__prx" == prop){
  708. this.__prx=val
  709. return this.__prx
  710. }
  711. if (typeof(val) === "object" && val != null && !(val.__prx)){
  712. var ret = Reflect.set(...arguments)
  713. this.set_obj(obj, prop, val,receiver)
  714. return ret
  715. }
  716. return Reflect.set(...arguments)
  717. }
  718. get(obj, prop,receiver){
  719. if (this.hidden_props.includes(prop)){
  720. switch (prop){
  721. case "add_proxy":
  722. return this.add_proxy.bind(this)
  723. break;
  724. case "prxy":
  725. return this
  726. case "_set":
  727. return this._set.bind({that:this,obj, prop,receiver})
  728. case "walker_start":
  729. return this.walker_start
  730. case "walker":
  731. return this.walker
  732. break;
  733. }
  734. }
  735. if (isProxy == prop){ return true }
  736. if ("__prx" == prop){ return this.__prx }
  737. return Reflect.get(...arguments)
  738. }
  739. add_proxy(o,k,v,dpth){
  740. var xpath = o.__path
  741. var apath = o.__path_arr
  742. this.event_proc("add_proxy")
  743. if (!apath){
  744. apath=[]
  745. }
  746. if (!xpath){
  747. xpath="ROOT!"
  748. }
  749. Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
  750. Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
  751. Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
  752. // Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
  753. }
  754. set_obj(obj, prop, val,receiver){
  755. var dpth = obj.__dpth
  756. var tf = {}
  757. var dbg_obj = {}
  758. this.walker(receiver,tf,dpth,dbg_obj)
  759. if (dbg_obj.depth_err){
  760. clog("MAX DEPTH?",dbg_obj,{obj, prop, val,receiver})
  761. }
  762. }
  763. walker(o,tfo,dpth=0,dbg_obj={"t":"unused"}){
  764. // if (dpth > 7){
  765. if (dpth > 15){
  766. dbg_obj.depth_err=1
  767. console.error("MAX DEPTH",{o,tfo,dpth,dbg_obj})
  768. return
  769. }
  770. var k,v
  771. var tf
  772. for ([k,v] of Object.entries(o)){
  773. tf = type_info(v)
  774. if (tf.deep_not_prx){
  775. o._set(o,k,v,new Proxy(v,this.prxy))
  776. o[k].add_proxy(o,k,v,dpth)
  777. this.walker(o[k],tf,dpth+1,dbg_obj)
  778. }
  779. }
  780. }
  781. walker_start(o,dpth){
  782. var tf = type_info(o)
  783. o.add_proxy({},[],o,-1)
  784. this.walker(o,tf,0)
  785. }
  786. event_proc(e){}
  787. }
  788. window.Proxy_Factory = Proxy_Factory
  789. Proxy_Factory.prototype.baseProp={
  790. writable: true,
  791. enumerable: false,
  792. // enumerable: true,
  793. configurable: true,
  794. }
  795. // }
  796. function arr_match(m,o){
  797. var k,v
  798. var r = 0
  799. for ([k,v] of Object.entries(m || {})){
  800. if (o[k] != v.valueOf()){
  801. r += 1
  802. return !r
  803. }
  804. }
  805. return !r
  806. }
  807. // permissions_def = {
  808. window.permissions_def = window.permissions_def || {
  809. participants:{
  810. m:["participants"],
  811. fn(set_scope,match){
  812. if (match.fp[1] == "rejx")
  813. throw "permission err"
  814. return
  815. },
  816. }
  817. }
  818. // {
  819. Proxy_Permissions = class Proxy_Permissions extends Proxy_Factory {
  820. constructor(a,a1){
  821. super(...arguments)
  822. }
  823. set(obj, prop, val,receiver){
  824. var k,v
  825. var r
  826. var matched
  827. var fp = obj.__path_arr.concat(prop)
  828. for ([k,v] of Object.entries(permissions_def)){
  829. matched = arr_match(v.m,fp)
  830. if (matched){
  831. r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
  832. }
  833. }
  834. return super.set(obj, prop, val,receiver)
  835. }
  836. _set(){
  837. super._set(...arguments)
  838. }
  839. }
  840. window.Proxy_Permissions = Proxy_Permissions
  841. // }
  842. // clog("???")
  843. // jsync:init.js
  844. // ------------------------------------------------------------------------------------------------
  845. function pfnf(o){
  846. return function(resolve, reject){
  847. o.resolve=resolve
  848. o.reject=reject
  849. }
  850. }
  851. msto_z = {
  852. conference:{
  853. events:{},
  854. },
  855. participants:{},
  856. ws_channels:{},
  857. }
  858. var DBL_Proxy0 = {
  859. set(obj, prop, val,receiver){
  860. clog({obj, prop, val,receiver})
  861. // return Reflect.set(...arguments)
  862. if (Object.getOwnPropertyNames(obj).includes(prop)){
  863. return Reflect.set(...arguments)
  864. } else {
  865. return obj._wrapped_proxy[prop]=val
  866. // return Reflect.set(...arguments)
  867. }
  868. },
  869. get(obj, prop,receiver){
  870. clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
  871. if (Object.getOwnPropertyNames(obj).includes(prop)){
  872. return Reflect.get(...arguments)
  873. } else {
  874. return obj._wrapped_proxy[prop]
  875. // return Reflect.get(...arguments)
  876. }
  877. },
  878. }
  879. var DBL_Proxy1 = {
  880. set(obj, prop, val,receiver){
  881. // clog({obj, prop, val,receiver})
  882. // return Reflect.set(...arguments)
  883. if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
  884. // if (Object.getOwnPropertyNames(obj).includes(prop)){
  885. return pf.dbl_proxy_obj[prop]=val
  886. } else {
  887. return Reflect.set(...arguments)
  888. // return Reflect.set(...arguments)
  889. }
  890. },
  891. get(obj, prop,receiver){
  892. // clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
  893. if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
  894. return pf.dbl_proxy_obj[prop]
  895. } else {
  896. return Reflect.get(...arguments)
  897. // return Reflect.get(...arguments)
  898. }
  899. },
  900. }
  901. var DBL_Proxy = {
  902. set(obj, prop, val,receiver){
  903. // clog({obj, prop, val,receiver})
  904. // return Reflect.set(...arguments)
  905. if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
  906. // if (Object.getOwnPropertyNames(obj).includes(prop)){
  907. return pf.dbl_proxy_obj[prop]=val
  908. } else {
  909. return obj[prop] = val
  910. // TODO: make sure this proxy doesn't cause other similar bugs
  911. // return Reflect.set(...arguments)
  912. }
  913. },
  914. getOwnPropertyDescriptor(obj, prop){
  915. if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
  916. return Reflect.getOwnPropertyDescriptor(pf.dbl_proxy_obj, prop)
  917. } else {
  918. return Reflect.getOwnPropertyDescriptor(obj, prop)
  919. }
  920. },
  921. get(obj, prop,receiver){
  922. // clog({obj, prop,receiver},Object.getOwnPropertyNames(obj))
  923. if (Object.getOwnPropertyNames(pf.dbl_proxy_obj).includes(prop)){
  924. return pf.dbl_proxy_obj[prop]
  925. } else {
  926. return Reflect.get(...arguments)
  927. // return Reflect.get(...arguments)
  928. }
  929. },
  930. ownKeys(target) {
  931. var target_keys = Reflect.ownKeys(target);
  932. var extra_keys = Reflect.ownKeys(pf.dbl_proxy_obj);
  933. // clog("ownKeys",{target_keys,extra_keys})
  934. return [...target_keys,...extra_keys]
  935. },
  936. }
  937. function init_db(objx){
  938. // clog("init_db~")
  939. trc_sto("init_db",{})
  940. glob_u.prom.init_db_resolve.resolved=1
  941. var glob_mx = glob_u.data
  942. var obj
  943. // clog("init_dbx",objx,{arguments,that:this})
  944. if (objx.participants){
  945. obj = objx
  946. } else {
  947. obj = objx.pl
  948. }
  949. // clog("INIT DB...",objx,obj,jc({obj,objx}))
  950. pf = new Proxy_Permissions({},"pf")
  951. msto_prx = new Proxy(obj,pf)
  952. window.msto_prx=msto_prx
  953. // window.msto_prx0 =msto_prx
  954. pf.init(msto_prx)
  955. msto_prx.walker_start(msto_prx)
  956. glob_mx.init_db=true
  957. // TODO:JFI make msto a class instance maybe
  958. /*
  959. window.msto = {
  960. ...pf.root,
  961. // participants:pf.root.participants,
  962. // conference:pf.root.conference,
  963. // my_data:pf.root.participants[glob_mx.local_id],
  964. get my_channel(){
  965. return msto.ws_channels[get_ws_channel_name()]
  966. // my_data("pfx get k1")
  967. },
  968. set my_channel(val){
  969. clog("pfx set my_channel")
  970. msto.ws_channels[get_ws_channel_name()] = val
  971. },
  972. get my_data(){
  973. return msto.participants[get_local_sto_id()]
  974. },
  975. set my_data(val){
  976. clog("pfx set my_data")
  977. msto.participants[get_local_sto_id()] = val
  978. },
  979. private_local:{},
  980. }
  981. // */
  982. // window.msto
  983. var dbl_proxy_obj = {
  984. // _wrapped_proxy:pf.root,
  985. // _wrapped_proxy2:pf.root,
  986. get my_channel(){
  987. return msto.ws_channels[get_ws_channel_name()]
  988. // my_data("pfx get k1")
  989. },
  990. set my_channel(val){
  991. clog("pfx set my_channel")
  992. msto.ws_channels[get_ws_channel_name()] = val
  993. },
  994. get my_data(){
  995. return msto.participants[get_local_sto_id()]
  996. },
  997. set my_data(val){
  998. clog("pfx set my_data")
  999. msto.participants[get_local_sto_id()] = val
  1000. },
  1001. private_local:{},
  1002. }
  1003. pf.dbl_proxy_obj=dbl_proxy_obj
  1004. // window.dbl_proxy=new Proxy(dbl_proxy_obj, DBL_Proxy)
  1005. // window.msto=new Proxy(dbl_proxy_obj, DBL_Proxy)
  1006. window.msto=new Proxy(msto_prx, DBL_Proxy)
  1007. }
  1008. function handle_pre_init_msgs(){
  1009. // clog("handle_pre_init_msgs")
  1010. var k,v,i
  1011. var _o
  1012. glob_u.prom.init_db_resolve.resolved_inited = 1
  1013. for (v of glob_u.ws.sockets.ws1.pre_init_msgs){
  1014. if (v.data.sto_event_type == "set_msg"){
  1015. msto.my_data.rehandle=1
  1016. _o={...v,data:jc(v.data)}
  1017. mhndlr_rld_2(_o,{type:"rehandle"})
  1018. }
  1019. }
  1020. glob_u.prom.init_db_resolve.resolved_inited = 2
  1021. }
  1022. function ws_sto_connected(a,b){
  1023. glob_u.cb.ws.run_cbs("WS_MSTO_INITED")
  1024. handle_pre_init_msgs()
  1025. // clog("ws_sto_connected",a,b,this)
  1026. }
  1027. function init_mu(){
  1028. var k,v
  1029. var rr = {}
  1030. var prom1 = new Promise(pfnf(rr));
  1031. prom1.then(init_db).then(ws_sto_connected)
  1032. glob_u.prom.init_db_resolve_timeout_arg = {aaa:"timedout",pl:msto_z}
  1033. setTimeout(rr.resolve,5000,glob_u.prom.init_db_resolve_timeout_arg)
  1034. var rn = ((Math.random()+"").replace("0.","") - 0).toString(16)
  1035. tmsgx4({sto_event_type:"db_sync_request","CLIENT_KEY":"ws_sto",request_rn:rn})
  1036. glob_u.prom.init_db_resolve = rr.resolve
  1037. glob_u.prom.init_db_resolve.rn = rn
  1038. }
  1039. function ord_init_once(o,scope,info){
  1040. // clog("ord_init_once:",{o,scope,info})
  1041. init_mu()
  1042. // info.cbs[info.k].remove_after_exe = 1
  1043. }
  1044. glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
  1045. function ds_test(){
  1046. glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
  1047. ws_reload()
  1048. }
  1049. glob_u.fns.ds_test=ds_test
  1050. // jsync:test.js
  1051. // ------------------------------------------------------------------------------------------------
  1052. // clog("/////////")
  1053. // msto_sc_proxy
  1054. // permissions_def
  1055. // connection_info_handler
  1056. // /*
  1057. function get_local_sto_id(){
  1058. return glob_u.data.jsync_local_id
  1059. }
  1060. function get_session_sto_id(){
  1061. return glob_u.data.jsync_session_id
  1062. }
  1063. function get_ws_channel_name(){
  1064. return glob_u.data.channel_name
  1065. }
  1066. function gen_djc_srv_id(){
  1067. // I don't know how often this will generate duplicates
  1068. var djc_srv_id = localStorage.djc_srv_id
  1069. var djc_srv_id_vers = localStorage.djc_srv_id_vers
  1070. const current_id_vers = 0.0
  1071. if (Number(djc_srv_id_vers) < current_id_vers || !(djc_srv_id)){
  1072. clog("????")
  1073. localStorage.djc_srv_id = ((Math.random()+"").replace("0.","") - 0).toString(16)
  1074. localStorage.djc_srv_id_vers = current_id_vers
  1075. }
  1076. glob_u.data.djc_srv_id = localStorage.djc_srv_id
  1077. clog("djc_srv_id:",{version:localStorage.djc_srv_id_vers,id:localStorage.djc_srv_id})
  1078. }
  1079. function init_msto_user_data(o,scope,info){
  1080. var ws_channel_name = get_ws_channel_name()
  1081. var local_sto_id = get_local_sto_id()
  1082. // clog("init_msto_user_data???",{local_sto_id,ws_channel_name,o,scope,info})
  1083. if (!glob_u.ws.sockets.ws1.params.include_ws_channel_data){return}
  1084. msto.ws_channels[ws_channel_name]=msto.ws_channels[ws_channel_name] || {id:local_sto_id}
  1085. if (!glob_u.ws.sockets.ws1.params.include_participants_data){return}
  1086. msto.participants[local_sto_id]=msto.participants[local_sto_id] || {}
  1087. // clog("init_msto_user_dataw???")
  1088. }
  1089. glob_u.cb.ws.reg_cb(init_msto_user_data,"WS_MSTO_INITED","init_msto_user_data")
  1090. window.permissions_def = window.permissions_def || {
  1091. participants:{
  1092. m:["participants"],
  1093. fn(set_scope,match){
  1094. if (match.fp[1] == "rejx")
  1095. throw "permission err"
  1096. return
  1097. },
  1098. }
  1099. }
  1100. // */
  1101. // jsync_local_id
  1102. // jsync_local_vers
  1103. // jsync_session_id
  1104. // jsync_session_vers
  1105. // jsync_id
  1106. // jsync_vers
  1107. window.permissions_def = {
  1108. participants:{
  1109. m:["participants"],
  1110. fn(set_scope,match){
  1111. if (match.fp[1] != get_local_sto_id()){
  1112. console.error("permission err:participants",set_scope,match)
  1113. // console.trace("permission err:participants")
  1114. throw "permission err"
  1115. }
  1116. return
  1117. },
  1118. },
  1119. ws_channels:{
  1120. m:["ws_channels"],
  1121. fn(set_scope,match){
  1122. if (match.fp[1] != get_ws_channel_name()){
  1123. console.error("permission err:ws_channels",set_scope,match)
  1124. throw "permission err"
  1125. }
  1126. }
  1127. },
  1128. }
  1129. window.permissions_def0 = {
  1130. /*
  1131. ws_channels:{
  1132. m:["ws_channels"],
  1133. fn(set_scope,match){
  1134. if (match.fp[1] != window.glob_u.data.channel_name){
  1135. console.error("permission err:ws_channels",set_scope,match)
  1136. throw "permission err"
  1137. }
  1138. }
  1139. },
  1140. */
  1141. user_channels:{
  1142. m:["user_channels"],
  1143. fn(set_scope,match){
  1144. if (match.fp[1] != get_ws_channel_name()){
  1145. console.error("permission err:user_channels",set_scope,match)
  1146. throw "permission err"
  1147. }
  1148. }
  1149. },
  1150. user_data_sessions:{
  1151. m:["user_data_sessions"],
  1152. fn(set_scope,match){
  1153. if (match.fp[1] != get_session_sto_id()){
  1154. console.error("permission err:user_data_sessions",set_scope,match)
  1155. // console.trace("permission err:participants")
  1156. throw "permission err"
  1157. }
  1158. return
  1159. },
  1160. },
  1161. user_data_local:{
  1162. m:["user_data_local"],
  1163. fn(set_scope,match){
  1164. if (match.fp[1] != get_local_sto_id()){
  1165. console.error("permission err:user_data_local",set_scope,match)
  1166. // console.trace("permission err:participants")
  1167. throw "permission err"
  1168. }
  1169. return
  1170. },
  1171. },
  1172. /*
  1173. participants:{
  1174. m:["participants"],
  1175. fn(set_scope,match){
  1176. if (match.fp[1] != window.glob_u.data.djc_srv_id){
  1177. console.error("permission err:participants",set_scope,match)
  1178. // console.trace("permission err:participants")
  1179. throw "permission err"
  1180. }
  1181. return
  1182. },
  1183. }
  1184. */
  1185. }
  1186. function ensure_jsync_id_is_set(storage_,base_name){
  1187. var storage = storage_
  1188. var id_name = base_name + "_id"
  1189. var vers_name = base_name + "_vers"
  1190. var djc_srv_id = storage[id_name]
  1191. var djc_srv_id_vers = storage[vers_name]
  1192. const current_id_vers = 0.0
  1193. if (Number(djc_srv_id_vers) < current_id_vers || !(djc_srv_id)){
  1194. storage[id_name] = ((Math.random()+"").replace("0.","") - 0).toString(16)
  1195. storage[vers_name] = current_id_vers
  1196. }
  1197. glob_u.data[id_name] = storage[id_name]
  1198. // clog("djc_srv_id:",{version:localStorage.djc_srv_id_vers,id:localStorage.djc_srv_id})
  1199. }
  1200. ensure_jsync_id_is_set(localStorage,"jsync_local")
  1201. ensure_jsync_id_is_set(sessionStorage,"jsync_session")
  1202. // function user_disconnected_compatibility_handler(o,scope,info){
  1203. // TODO:Fix bug caused by a user disconnecting before the connection is properly established
  1204. function connection_info_handler(o,scope,info){
  1205. if (o.data.sto_event_type=="connection_info"){
  1206. // clog("connection_info_handler:",o,scope,info)
  1207. glob_u.data.group_name = o.data.group_name
  1208. glob_u.data.channel_name = o.data.channel_name
  1209. clog("jsyncdb connected","room name:",glob_u.data.group_name)
  1210. } else if (o.data.sto_event_type=="user_disconnected"){
  1211. var last_conn =1
  1212. var k,v
  1213. var ws_conn_data = jc(msto.ws_channels[o.data.channel_name])
  1214. delete msto.ws_channels[o.data.channel_name]
  1215. for ([k,v] of Object.entries(msto.ws_channels)){
  1216. if (v.id == ws_conn_data.id){
  1217. last_conn = 0
  1218. }
  1219. }
  1220. if (last_conn){
  1221. // clog("DELlast_conn" ,ws_conn_data.id)
  1222. delete msto.participants[ws_conn_data.id]
  1223. }
  1224. clog("user_disconnected:",o.data.channel_name)
  1225. return
  1226. if (msto.user_channels){
  1227. delete msto.user_channels[o.data.channel_name]
  1228. }
  1229. if (msto.user_channels){
  1230. for ([k,v] of Object.entries(msto.user_channels)){
  1231. if (v.id == ws_conn_data.id){
  1232. last_conn = 0
  1233. }
  1234. }
  1235. }
  1236. if (last_conn){
  1237. clog("DELlast_conn" ,ws_conn_data.id)
  1238. delete msto.user_data_local[ws_conn_data.id]
  1239. }
  1240. }
  1241. }
  1242. glob_u.cb.ws.reg_cb(connection_info_handler,"WS_MESSAGE:ws_sto","connection_info_handler")
  1243. function ds_test3(){
  1244. glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
  1245. ws_reload()
  1246. }
  1247. glob_u.fns.get_local_sto_id = get_local_sto_id
  1248. glob_u.fns.get_ws_channel_name = get_ws_channel_name
  1249. glob_u.fns.get_session_sto_id = get_session_sto_id
  1250. // console.log("??...")
  1251. // clog("???")
  1252. //
  1253. // glob_u.fns.get_room_name=get_room_name
  1254. // window.ds_test=ds_test
  1255. // glob_u.fns.ds_test=ds_test
  1256. // window.msto_prx=msto_prx
  1257. })()