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.old.js 36KB

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