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_lib0.js 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188
  1. // jsync:dep.js
  2. "use strict";
  3. // window.w = window.w || {}
  4. (function (){
  5. window.clog = console.log
  6. var isProxy,tlu,msto_z
  7. var pf,msto_prx
  8. // clog("??")
  9. function nop(){}
  10. window.glob_u = window.glob_u || {
  11. cb:{},
  12. fns:{},
  13. cls:{},
  14. tvar:{},
  15. data:{},
  16. prom:{},
  17. rrefs:{},
  18. xj:{},
  19. templates:{},
  20. }
  21. glob_u.fns.gen_sort_attr = function gen_sort_attr(attr){
  22. return function gsort(a0,a1){
  23. if (a0[attr] > a1[attr]){
  24. return 1
  25. } else if (a0[attr] < a1[attr]){
  26. return -1
  27. } else {
  28. return 0
  29. }
  30. }
  31. }
  32. glob_u.fns.find_attr = function find_attr(elm,indx,arr){
  33. if (elm && elm[this.attr] == this.val){
  34. return 1
  35. }
  36. }
  37. glob_u.fns.splice_out = function splice_out(arr,elm){
  38. let i = arr.indexOf(elm)
  39. if (i != -1){
  40. return arr.splice(i,1)
  41. }
  42. }
  43. function jclone(obj){
  44. return Array.isArray(obj) ? $.extend(true,[],obj) : $.extend(true,{},obj)
  45. }
  46. function jx(obj){
  47. return JSON.parse(JSON.stringify(obj))
  48. }
  49. function jclone_rval(obj){
  50. if (typeof(obj) != "object"){
  51. return obj
  52. } else if (Array.isArray(obj)) {
  53. return $.extend(true,[],obj)
  54. } else {
  55. return $.extend(true,{},obj)
  56. }
  57. }
  58. // window.jc = jclone
  59. window.jc = jclone_rval
  60. // TODO:JFI eventually merge
  61. // j9\dev_dep\misc_dev.js
  62. glob_u.fns.gen_ord_decs = function(ord,cb_prefix){
  63. var reg_cb = function(cb,key_name,cb_name,override_level,push){
  64. return ord.reg_cb(cb,cb_prefix+key_name,cb_name,override_level,push)
  65. }
  66. var run_cbs_lz = function(key,arg_obj,lazy=1){
  67. if (lazy && cb_prefix+key in ord.cb_sto){
  68. return ord.run_cbs(cb_prefix+key,arg_obj)
  69. }
  70. }
  71. var run_cbs = function(key,arg_obj){
  72. return ord.run_cbs(cb_prefix+key,arg_obj)
  73. // split out later maybe?
  74. }
  75. function req_batch_run(key,arg_obj,combine){
  76. return ord.req_batch_run(cb_prefix+key,arg_obj)
  77. }
  78. reg_cb.ord = ord
  79. reg_cb.cb_prefix = cb_prefix
  80. run_cbs.ord = ord
  81. run_cbs.cb_prefix = cb_prefix
  82. run_cbs_lz.ord = ord
  83. run_cbs_lz.cb_prefix = cb_prefix
  84. return {reg_cb,run_cbs,run_cbs_lz,req_batch_run}
  85. }
  86. // duplicated in jdev0
  87. glob_u.fns.merge_partial_template = function merge_partial_template(main,template){
  88. let t = $.extend(true,{},template,main)
  89. return $.extend(true,main,t)
  90. }
  91. // ------------------------------------------------------------------------------------------------
  92. // jsync:ord.js
  93. {
  94. // clog(":cb_ord:")
  95. // class gen_cb_ord{
  96. var dflt_opts = {
  97. // sort_fn:gen_sort_attr("override_level"),
  98. sort_fn:glob_u.fns.gen_sort_attr("override_level"),
  99. log_level:0,
  100. // ns:"",
  101. }
  102. class BoundObj{
  103. constructor(){
  104. this.init()
  105. }
  106. init(){
  107. let k,v,i,j
  108. for ([k,v] of Object.entries(Object.getOwnPropertyDescriptors(this.__proto__))){
  109. if (k.endsWith("_ub") && typeof(v.value) == "function"){
  110. // clog("UB",k,k.slice(1,-3))
  111. j = v.value.bind(this)
  112. j.meta_str = "bound_fn"
  113. this[k.slice(1,-3)] = j
  114. }
  115. }
  116. }
  117. /*
  118. mx2_ub(){
  119. clog("Mx2")
  120. }
  121. */
  122. }
  123. function resolveNow(){}
  124. async function resolveSoon(){}
  125. // class reg_cb_ord{
  126. class reg_cb_ord extends BoundObj{
  127. // con
  128. constructor(opts){
  129. super()
  130. this.opts = Object.assign({},dflt_opts,opts)
  131. this.r = Object.assign(this,dflt_opts,opts)
  132. // this.sort_fn = this.opts
  133. this.cb_sto = {}
  134. this.batch = {}
  135. this._orig_opts = opts
  136. // clog("v2 ",this)
  137. }
  138. _promise_test_ub(arg1){
  139. // clog()
  140. console.log("promise_test",{that:this,arg1})
  141. // console.log("promise_test",{that:this,opts:this.opts,arg1})
  142. }
  143. promise_test_init(){
  144. var p = new Promise((resolve,reject)=>{
  145. resolve("Promise.~")
  146. })
  147. p.then(this.promise_test)
  148. console.log("promise_test_init",{that:this,opts:this.opts})
  149. }
  150. _batch_run_ub(){
  151. this.batch.WillRun = false
  152. var batched_events = this.batch.batched_events
  153. var i,k,v
  154. for ([k,v] of Object.entries(batched_events.combinable)){
  155. this.run_cbs(v.key,v.arg_obj)
  156. }
  157. for ([k,v] of Object.entries(batched_events.unique)){
  158. this.run_cbs(v.key,v.arg_obj)
  159. }
  160. this.batch.batched_events = {
  161. combinable:{},
  162. unique:[],
  163. }
  164. }
  165. _req_batch_run_ub(key,arg_obj,combine){
  166. if (this.batch.WillRun != true) {
  167. this.batch.WillRun = true
  168. this.batch.batched_events = {
  169. combinable:{},
  170. unique:[],
  171. }
  172. new Promise((resolve,reject)=>{
  173. resolve("Promise.~")
  174. }).then(this.batch_run)
  175. }
  176. if (this.batch.WillRun == true){
  177. if (combine){
  178. this.batch.batched_events.combinable[key] = {key,arg_obj,combine}
  179. } else {
  180. this.batch.batched_events.unique.push({key,arg_obj,combine})
  181. }
  182. }
  183. if (!(this.batch.WillRun == true ||this.batch.WillRun == false )){
  184. console.error("::")
  185. throw "req_batch_run err"
  186. }
  187. }
  188. _reg_cb_ub(cb,key_name,cb_name,override_level = 100,push=1){
  189. if (typeof(cb) != "function"){
  190. console.error("callback is not a function. setting push=r","\ncb:",cb)
  191. push = "r"
  192. // console.error("callback:",cb," is not a function")
  193. }
  194. // var this.cb_sto = {}
  195. var cb_sort = nop
  196. if (!this.cb_sto[key_name]){
  197. this.cb_sto[key_name] = []
  198. }
  199. // this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name})
  200. // splice_out_ti(this.cb_sto[key_name],this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name}))
  201. // var cbo0= this.cb_sto[key_name].find(glob_td.fn.find_html_cb,{fn_key:cb_name})
  202. // var cbo0= this.cb_sto[key_name].find(find_attr,{fn_key:cb_name})
  203. var cbo0= this.cb_sto[key_name].find(glob_u.fns.find_attr,{attr:"fn_key",val:cb_name})
  204. // clog(cbo0)
  205. glob_u.fns.splice_out(this.cb_sto[key_name],cbo0)
  206. // tn2t.arr.
  207. // splice_out_cb
  208. let cb_obj = {
  209. cb,
  210. hkey:key_name,
  211. fn_key:cb_name,
  212. override_level,
  213. }
  214. if (push=="r"){
  215. } else if (push){
  216. this.cb_sto[key_name].push(cb_obj)
  217. } else {
  218. this.cb_sto[key_name].unshift(cb_obj)
  219. }
  220. this.cb_sto[key_name].sort(this.sort_fn)
  221. }
  222. _run_cbs_ub(key,arg_obj){
  223. var k,v
  224. var o = {
  225. // html_key:key,cbs:glob_mx.html_cb[key],
  226. }
  227. // dlog("RUN_HOOK_CB??",key,glob_mx.hook_cb[key])
  228. try {
  229. this.opts.log_level ? clog("run_cbs",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}) : 0
  230. var rmv_fns = []
  231. for ([k,v] of Object.entries(this.cb_sto[key]|| {}) ) {
  232. // dlog("RUN_HOOK_CB:",k)
  233. // clog("run_html_cbs:",k,v)
  234. this.opts.log_level > 1 ? clog("run_cbs_e",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v}) : 0
  235. v.cb(arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v})
  236. if (v.remove_after_exe){
  237. rmv_fns.push(v)
  238. }
  239. // v(o)
  240. }
  241. for ([k,v] of Object.entries(rmv_fns|| {}) ) {
  242. glob_u.fns.splice_out(this.cb_sto[key],v)
  243. }
  244. // return {arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}}
  245. return {arg_obj,o,info:{that:this,hkey:key,cbs:this.cb_sto[key],rmv_fns}}
  246. } catch(err){
  247. console.error("ti_v_cb err:",err)
  248. }
  249. }
  250. }
  251. window.glob_u.cls.reg_cb_ord = reg_cb_ord
  252. }
  253. // jsync:ws.js
  254. // ------------------------------------------------------------------------------------------------
  255. // FILE:WS0
  256. // TODO:JFI this file probably causes memory leaks
  257. window.glob_u.ws = window.glob_u.ws || {
  258. sockets:{},
  259. fns:{},
  260. flags:{},
  261. }
  262. window.glob_u.trc = window.glob_u.trc || {
  263. arr:[],
  264. }
  265. // TODO:JFI I should factor out my development junk
  266. function trc_sto(s,o){
  267. if (!glob_u?.prom?.init_db_resolve?.resolved){
  268. var elm = {name:s,o,timestamp:Date.now()}
  269. glob_u.trc.arr.push(elm)
  270. // clog("_trc:sto",s,o.sto_event_type,elm.timestamp,o)
  271. }
  272. }
  273. window.glob_u.ws.fns.reconnect = function reconnect(o,close_event){
  274. connect_ws(o.params)
  275. }
  276. // TODO:JFI These event handlers are less generic now
  277. window.glob_u.ws.fns.onclose = function onclose(event){
  278. clog("WS_CLOSE",{that:this,readyState:this.readyState,args:[...arguments]})
  279. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_CLOSE:",{event,that:this})
  280. setTimeout(this.params.fns.reconnect,1000)
  281. }
  282. window.glob_u.ws.fns.onmessage = function onmessage(event){
  283. // clog("WS_MESSAGE",{that:this,args:[...arguments]})
  284. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
  285. }
  286. window.glob_u.ws.fns.onerror = function onerror(event){
  287. // clog("WS_ERROR",{that:this,args:[...arguments]})
  288. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_ERROR:",{event,that:this})
  289. }
  290. window.glob_u.ws.fns.onopen = function onopen(event){
  291. // clog("WS_OPEN???",{that:this,args:[...arguments]},{on_open_once:this.on_open_once,on_open_cbs:this.params.on_open_cbs})
  292. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_OPEN:",{event,that:this})
  293. return
  294. var cb
  295. if (this.on_open_once){
  296. for (cb of this.on_open_once){
  297. cb(event,this)
  298. }
  299. if (this?.params?.on_open_cbs){
  300. for (cb of this?.params?.on_open_cbs){
  301. cb(event,this)
  302. }
  303. }
  304. }
  305. }
  306. window.glob_u.ws.fns.ws_fns_factory = function ws_fns_factory(socket_opts){
  307. var socket_name = socket_opts.socket_name
  308. // const sockets =
  309. var v1 = "init"
  310. var fns = {
  311. get_socket(o){
  312. return glob_u.ws.sockets[socket_name]
  313. },
  314. reconnect(){
  315. var socket = fns.get_socket()
  316. clog("RECONNECT",socket_opts,socket,socket?.DoNotReconnect)
  317. if (socket.DoNotReconnect || glob_u.ws?.flags?.DoNotReconnect){
  318. clog("RECONNECTION NOT ATTEMPTED",socket_opts)
  319. return
  320. } else {
  321. }
  322. connect_ws(socket_opts)
  323. },
  324. log_var(o){
  325. clog("var:",v1)
  326. return v1
  327. },
  328. set_var(val){
  329. v1 = val
  330. return v1
  331. },
  332. send_text(o){
  333. var socket = fns.get_socket()
  334. clog("send_text",{that:this,fns})
  335. socket.send(JSON.stringify(o));
  336. },
  337. jsend(o){
  338. var socket = fns.get_socket()
  339. // clog("!!!",{that:this,fns})
  340. socket.send(JSON.stringify(o));
  341. },
  342. }
  343. return fns
  344. }
  345. function connect_ws(o= {}){
  346. // clog("connect_ws:",o,jc(o))
  347. glob_u.fns.merge_partial_template(o,{on_open_cbs:[]})
  348. var sockets = window.glob_u.ws.sockets
  349. var old_socket = sockets[o.socket_name]
  350. if (old_socket && old_socket.readyState == 1){
  351. clog(`WS ${o.socket_name} is already CONNECTED:`,old_socket , o)
  352. return
  353. } else if (old_socket && (old_socket.readyState != 3 && old_socket.readyState != undefined )){
  354. clog(`WS ${o.socket_name} exsists and in not closed:`,old_socket , o)
  355. return
  356. }
  357. var socket = new WebSocket(o.url)
  358. socket.on_open_once = []
  359. socket.pre_init_msgs = []
  360. socket.params = o
  361. // if ()
  362. Object.assign(o.fns, window.glob_u.ws.fns.ws_fns_factory(o))
  363. // Object.assign(o.fns2, window.glob_u.ws.fns.ws_fns_factory(o))
  364. Object.assign(socket,o.methods)
  365. sockets[o.socket_name]=socket
  366. // o.jsend ? socket.jsend = o.jsend: 0
  367. // clog("CONNECTING WS:",{o,socket})
  368. return [socket,old_socket]
  369. }
  370. // FILE:WS1
  371. function create_ws_ord(){
  372. if (!glob_u.cb.ws){
  373. var ord = new glob_u.cls.reg_cb_ord()
  374. glob_u.cb.ws = ord
  375. glob_u.cb.ws.reg_cb = ord.reg_cb
  376. glob_u.cb.ws.run_cbs = ord.run_cbs
  377. glob_u.cb.ws.STO_EVENT = glob_u.fns.gen_ord_decs(glob_u.cb.ws,"STO_EVENT:")
  378. // glob_u.cb.ord_v1.estr = glob_u.fns.gen_ord_decs(glob_u.cb.ord_v1.ord,"")
  379. // glob_u.cb.ord_v1.run_cbs_lz = glob_u.cb.ord_v1.estr.run_cbs_lz
  380. // glob_u.cb.ord_v1.ord.run_cbs_lz = glob_u.cb.ord_v1.run_cbs_lz
  381. }
  382. }
  383. window.glob_u.ws.fns.dispatch = function dispatch(o,obj_x,info){
  384. var event = o.event
  385. // socket = o.that
  386. var data = JSON.parse(event.data)
  387. // clog("WS_dispatch",data,socket.params.ord,data["CLIENT_KEY"])
  388. // clog("trc:sto:ws_rec",data.CLIENT_KEY,data.sto_event_type,data)
  389. trc_sto("ws_rec",data)
  390. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:"+data["CLIENT_KEY"],{event,that:this,data})
  391. return
  392. if (e.arguments[0].type == "message"){
  393. var data = JSON.parse(e.arguments[0].data)
  394. if ("type" in data && ws_handlers[data.type]){
  395. ws_handlers[data.type](data,{that:e.that,event:e.arguments[0]})
  396. } else {
  397. clog("NO HANDLER FOR",data.type)
  398. }
  399. clog("~WS",data,e)
  400. } else if (e.arguments[0].type == "open") {
  401. ws_handlers.on_open(e)
  402. }
  403. }
  404. function ws_reload(){
  405. try{
  406. if ((!glob_u.ws.sockets.ws1 || glob_u.ws.sockets.ws1.readyState == 3 || glob_u.ws.sockets.ws1.readyState == undefined)){
  407. ws_helper()
  408. } else {
  409. glob_u.ws.sockets.ws1.close()
  410. clog(glob_u.ws.sockets.ws1,glob_u.ws.sockets.ws1.readyState)
  411. glob_u.ws.sockets.ws1.onclose = ws_helper
  412. }
  413. } catch (err){
  414. clog(err)
  415. }
  416. }
  417. function get_room_name(){
  418. var room_name=location.pathname.match(/\/loc.([^\/]*)\//)
  419. if (room_name){
  420. room_name = room_name[1]
  421. } else {
  422. room_name = location.pathname.split("/").pop()
  423. }
  424. return room_name
  425. }
  426. function ws_helper(){
  427. // clog("WS_HELPER")
  428. var fns = window.glob_u.ws.fns
  429. var o = {
  430. url:'wss://' + window.location.hostname +`/djc_srv/ws/chat/${get_room_name()}?zzz=1`,
  431. socket_name:"ws1",
  432. ord:glob_u.cb.ws,
  433. methods:{
  434. onmessage:fns.dispatch,
  435. onclose:fns.onclose,
  436. onerror:fns.onerror,
  437. onopen:fns.onopen,
  438. },
  439. methods:{
  440. onmessage:fns.onmessage,
  441. onclose:fns.onclose,
  442. onerror:fns.onerror,
  443. onopen:fns.onopen,
  444. },
  445. fns:{
  446. // reconnect:fns.reconnect,
  447. },
  448. }
  449. /*
  450. if (window.glob_u.ws.ws1 && window.glob_u.ws.ws1.readyState == 1){
  451. clog("WS ws1 is CONNECTED:",window.glob_u.ws.ws1)
  452. return
  453. }
  454. */
  455. var socket = connect_ws(o)
  456. // clog({socket})
  457. }
  458. create_ws_ord()
  459. glob_u.cb.ws.reg_cb(window.glob_u.ws.fns.dispatch,"WS_MESSAGE:","WS_MESSAGE")
  460. // jsync:sto.js
  461. // ------------------------------------------------------------------------------------------------
  462. // FILE:DS0
  463. function mhndlr_rld_2(_o,scope,info){
  464. var dlog =nop
  465. try {
  466. var parsed = _o.data
  467. var o = parsed.payload
  468. // clog("mhndlr_rld",parsed.sto_event_type,parsed,{_o,scope,info})
  469. if (window.mhndlr_rld_dbg){
  470. mhndlr_rld_dbg({m,that,n,parsed,ai,o,arguments})
  471. }
  472. switch (parsed.sto_event_type){
  473. case "set_msg":
  474. // if (!glob_u.prom.init_db_resolve.resolved){
  475. if (!glob_u.prom.init_db_resolve.resolved_inited){
  476. _o.event.target.pre_init_msgs.push(_o)
  477. }
  478. pf._set_recv(o.path,o.key,o.val)
  479. // clog("msto_evh?ord")
  480. glob_u.fns.msto_evh ? glob_u.fns.msto_evh(o,parsed) : 0
  481. break;
  482. case "group_count":
  483. // clog("mhndlr_rld group_count",parsed)
  484. if (parsed.group_count < 2){
  485. // clog("mhndlr_rld group_count RESOLVE")
  486. glob_u.prom.init_db_resolve(glob_u.prom.init_db_resolve_timeout_arg)
  487. }
  488. break;
  489. case "event":
  490. /*
  491. dlog("~event~",parsed)
  492. if (window.dispatch_events){
  493. dispatch_events({parsed,ai,m,that})
  494. }
  495. */
  496. break;
  497. case "msg_test":
  498. dlog("msg_test",parsed)
  499. break;
  500. case "db_sync_request":
  501. // tmsgx4({sto_event_type:"db_sync_response",payload:pf.root,"CLIENT_KEY":"ws_sto"})
  502. // if (glob_u.prom.init_db_resolve.resolved){
  503. if (glob_u.prom.init_db_resolve.resolved_inited == 2){
  504. 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"})
  505. }
  506. break;
  507. case "db_sync_response":
  508. if (glob_u.prom.init_db_resolve && parsed.request_rn_from == glob_u.prom.init_db_resolve.rn){
  509. glob_u.prom.init_db_resolve({aaa:"dsr",pl:parsed.payload})
  510. }
  511. // clog("db_sync_response",parsed)
  512. break;
  513. }
  514. } catch (err) {
  515. clog("mhndlr err:",err)
  516. }
  517. }
  518. glob_u.fns.msto_evh = function(o,parsed,ai,id){
  519. // clog("ord_msto_evh")
  520. if (o.path[0]!="conference" || o.path[1]!="events"){
  521. return
  522. }
  523. glob_u.cb.ws.STO_EVENT.run_cbs(":STO_EVENT",{o,parsed,ai,id})
  524. if (typeof(o.val) == "object"){
  525. glob_u.cb.ws.STO_EVENT.run_cbs(o.val.type,{o,parsed,ai,id})
  526. }
  527. }
  528. glob_u.cb.ws.reg_cb(mhndlr_rld_2,"WS_MESSAGE:ws_sto","WS_MESSAGE:ws_sto")
  529. // FILE:DS1
  530. var dlog = nop
  531. function tmsgx4(m){
  532. var socket = glob_u.ws.sockets.ws1
  533. var jsend = socket.params.fns.jsend
  534. var t = {
  535. key:"tmp_dev_sto",
  536. }
  537. glob_u.fns.merge_partial_template(m,t)
  538. // clog("tmsgx4",{key:m.key,sto_event_type:m.sto_event_type,CLIENT_KEY:m.CLIENT_KEY},{m,t})
  539. trc_sto("tmsgx4",m)
  540. jsend(m)
  541. }
  542. isProxy = Symbol("isProxy")
  543. tlu = {
  544. object:"",
  545. string:true,
  546. number:true,
  547. undefined:true,
  548. boolean:true,
  549. }
  550. function type_info(o){
  551. try {
  552. var t
  553. var flags = {
  554. leaf:false,
  555. deep_not_prx:false,
  556. prx:false,
  557. isObj:false,
  558. isArr:false,
  559. els:false,
  560. }
  561. t = typeof(o)
  562. flags.t=t
  563. if (!(o === null)){
  564. flags.isArr = Array.isArray(o)
  565. flags.isObj = Object.prototype == o.__proto__
  566. }
  567. if (tlu[t] === true || o === null){
  568. flags.leaf = true
  569. } else if (t == "object" && o.__prx){
  570. flags.prx = true
  571. } else if (t == "object" && (flags.isArr || flags.isObj)){
  572. flags.prx = false
  573. flags.deep_not_prx = true
  574. } else {
  575. clog("ELSE")
  576. flags.els = true
  577. }
  578. return flags
  579. } catch (err){
  580. clog("type_info err:",err,{flags,o})
  581. }
  582. }
  583. function deep_prop_v0(o,p){
  584. try {
  585. var arr = jc(p)
  586. var ret = o
  587. while (arr.length){
  588. ret = ret[arr.shift()]
  589. }
  590. return ret
  591. } catch(err){console.error("DEEP_PROP ERR:",err)}
  592. }
  593. // delete Proxy_Factory
  594. // {
  595. class Proxy_Factory {
  596. constructor(o,n="dflt"){
  597. this.db = o
  598. this.n = n
  599. this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy"]
  600. this._pub_cb =[]
  601. this.__prx = true
  602. this.SymPrx = Symbol("SymPrx")
  603. }
  604. init(o){
  605. this.root = o
  606. }
  607. sync(o){
  608. this.root = jc(o.root)
  609. o._pub_cb.push(this._set_recv.bind(this))
  610. }
  611. get prxy(){
  612. return this
  613. }
  614. _set(o,k,v,prx,a0){
  615. this.obj[k]=prx
  616. }
  617. set_pub(obj, prop, val,receiver){
  618. this._set_pub(obj.__path_arr, prop, jx(val))
  619. }
  620. _set_pub(path,key,val){
  621. var k,v
  622. var arg = {
  623. "CLIENT_KEY":"ws_sto",
  624. "sto_event_type":"set_msg",
  625. "payload":{path,key,val},}
  626. tmsgx4(arg,
  627. )
  628. for (v of this._pub_cb){
  629. v(path,key,val)
  630. }
  631. }
  632. _set_recv(path,prop,val,id){
  633. var p = path
  634. var nprop = deep_prop_v0(this.root,p)
  635. var dpth = nprop.__dpth
  636. if (tlu[typeof(val)]){
  637. nprop._set(nprop,prop,val,val)
  638. } else {
  639. nprop._set(nprop,prop,val,new Proxy(val,this))
  640. nprop[prop].add_proxy(nprop,prop,val,dpth+1)
  641. }
  642. this.walker(nprop[prop],{},dpth+2)
  643. }
  644. set(obj, prop, val,receiver){
  645. if (obj[prop] === val){
  646. return Reflect.set(...arguments)
  647. }
  648. this.set_pub(obj, prop, val,receiver)
  649. this.event_proc("set")
  650. if ("__prx" == prop){
  651. this.__prx=val
  652. return this.__prx
  653. }
  654. if (typeof(val) === "object" && val != null && !(val.__prx)){
  655. var ret = Reflect.set(...arguments)
  656. this.set_obj(obj, prop, val,receiver)
  657. return ret
  658. }
  659. return Reflect.set(...arguments)
  660. }
  661. get(obj, prop,receiver){
  662. if (this.hidden_props.includes(prop)){
  663. switch (prop){
  664. case "add_proxy":
  665. return this.add_proxy.bind(this)
  666. break;
  667. case "prxy":
  668. return this
  669. case "_set":
  670. return this._set.bind({that:this,obj, prop,receiver})
  671. case "walker_start":
  672. return this.walker_start
  673. case "walker":
  674. return this.walker
  675. break;
  676. }
  677. }
  678. if (isProxy == prop){ return true }
  679. if ("__prx" == prop){ return this.__prx }
  680. return Reflect.get(...arguments)
  681. }
  682. add_proxy(o,k,v,dpth){
  683. var xpath = o.__path
  684. var apath = o.__path_arr
  685. this.event_proc("add_proxy")
  686. if (!apath){
  687. apath=[]
  688. }
  689. if (!xpath){
  690. xpath="ROOT!"
  691. }
  692. Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
  693. Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
  694. Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
  695. // Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
  696. }
  697. set_obj(obj, prop, val,receiver){
  698. var dpth = obj.__dpth
  699. var tf = {}
  700. var dbg_obj = {}
  701. this.walker(receiver,tf,dpth,dbg_obj)
  702. if (dbg_obj.depth_err){
  703. clog("MAX DEPTH?",dbg_obj,{obj, prop, val,receiver})
  704. }
  705. }
  706. walker(o,tfo,dpth=0,dbg_obj={"t":"unused"}){
  707. // if (dpth > 7){
  708. if (dpth > 15){
  709. dbg_obj.depth_err=1
  710. console.error("MAX DEPTH",{o,tfo,dpth,dbg_obj})
  711. return
  712. }
  713. var k,v
  714. var tf
  715. for ([k,v] of Object.entries(o)){
  716. tf = type_info(v)
  717. if (tf.deep_not_prx){
  718. o._set(o,k,v,new Proxy(v,this.prxy))
  719. o[k].add_proxy(o,k,v,dpth)
  720. this.walker(o[k],tf,dpth+1,dbg_obj)
  721. }
  722. }
  723. }
  724. walker_start(o,dpth){
  725. var tf = type_info(o)
  726. o.add_proxy({},[],o,-1)
  727. this.walker(o,tf,0)
  728. }
  729. event_proc(e){}
  730. }
  731. // window.Proxy_Factory = Proxy_Factory
  732. Proxy_Factory.prototype.baseProp={
  733. writable: true,
  734. enumerable: false,
  735. // enumerable: true,
  736. configurable: true,
  737. }
  738. // }
  739. function arr_match(m,o){
  740. var k,v
  741. var r = 0
  742. for ([k,v] of Object.entries(m || {})){
  743. if (o[k] != v.valueOf()){
  744. r += 1
  745. return !r
  746. }
  747. }
  748. return !r
  749. }
  750. // permissions_def = {
  751. window.permissions_def = window.permissions_def || {
  752. participants:{
  753. m:["participants"],
  754. fn(set_scope,match){
  755. if (match.fp[1] == "rejx")
  756. throw "permission err"
  757. return
  758. },
  759. }
  760. }
  761. {
  762. class Proxy_Permissions extends Proxy_Factory {
  763. constructor(a,a1){
  764. super(...arguments)
  765. }
  766. set(obj, prop, val,receiver){
  767. var k,v
  768. var r
  769. var matched
  770. var fp = obj.__path_arr.concat(prop)
  771. for ([k,v] of Object.entries(permissions_def)){
  772. matched = arr_match(v.m,fp)
  773. if (matched){
  774. r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
  775. }
  776. }
  777. return super.set(obj, prop, val,receiver)
  778. }
  779. _set(){
  780. super._set(...arguments)
  781. }
  782. }
  783. window.Proxy_Permissions = Proxy_Permissions
  784. }
  785. // jsync:init.js
  786. // ------------------------------------------------------------------------------------------------
  787. function pfnf(o){
  788. return function(resolve, reject){
  789. o.resolve=resolve
  790. o.reject=reject
  791. }
  792. }
  793. msto_z = {
  794. conference:{
  795. events:{},
  796. },
  797. participants:{},
  798. ws_channels:{},
  799. }
  800. function init_db(objx){
  801. trc_sto("init_db",{})
  802. glob_u.prom.init_db_resolve.resolved=1
  803. var glob_mx = glob_u.data
  804. var obj
  805. // clog("init_dbx",objx,{arguments,that:this})
  806. if (objx.participants){
  807. obj = objx
  808. } else {
  809. obj = objx.pl
  810. }
  811. // clog("INIT DB...",objx,obj,jc({obj,objx}))
  812. pf = new Proxy_Permissions({},"pf")
  813. msto_prx = new Proxy(obj,pf)
  814. // window.msto_prx0 =msto_prx
  815. pf.init(msto_prx)
  816. msto_prx.walker_start(msto_prx)
  817. glob_mx.init_db=true
  818. // TODO:JFI make msto a class instance maybe
  819. window.msto = {
  820. ...pf.root,
  821. // participants:pf.root.participants,
  822. // conference:pf.root.conference,
  823. // my_data:pf.root.participants[glob_mx.local_id],
  824. get my_channel(){
  825. return msto.ws_channels[get_ws_channel_name()]
  826. // my_data("pfx get k1")
  827. },
  828. set my_channel(val){
  829. clog("pfx set my_channel")
  830. msto.ws_channels[get_ws_channel_name()] = val
  831. },
  832. get my_data(){
  833. return msto.participants[get_local_sto_id()]
  834. },
  835. set my_data(val){
  836. clog("pfx set my_data")
  837. msto.participants[get_local_sto_id()] = val
  838. },
  839. private_local:{},
  840. }
  841. }
  842. function handle_pre_init_msgs(){
  843. var k,v,i
  844. var _o
  845. glob_u.prom.init_db_resolve.resolved_inited = 1
  846. for (v of glob_u.ws.sockets.ws1.pre_init_msgs){
  847. if (v.data.sto_event_type == "set_msg"){
  848. msto.my_data.rehandle=1
  849. _o={...v,data:jc(v.data)}
  850. mhndlr_rld_2(_o,{type:"rehandle"})
  851. }
  852. }
  853. glob_u.prom.init_db_resolve.resolved_inited = 2
  854. }
  855. function ws_sto_connected(a,b){
  856. glob_u.cb.ws.run_cbs("WS_MSTO_INITED")
  857. handle_pre_init_msgs()
  858. // clog("ws_sto_connected",a,b,this)
  859. }
  860. function init_mu(){
  861. var k,v
  862. var rr = {}
  863. var prom1 = new Promise(pfnf(rr));
  864. prom1.then(init_db).then(ws_sto_connected)
  865. glob_u.prom.init_db_resolve_timeout_arg = {aaa:"timedout",pl:msto_z}
  866. setTimeout(rr.resolve,5000,glob_u.prom.init_db_resolve_timeout_arg)
  867. var rn = ((Math.random()+"").replace("0.","") - 0).toString(16)
  868. tmsgx4({sto_event_type:"db_sync_request","CLIENT_KEY":"ws_sto",request_rn:rn})
  869. glob_u.prom.init_db_resolve = rr.resolve
  870. glob_u.prom.init_db_resolve.rn = rn
  871. }
  872. function ord_init_once(o,scope,info){
  873. // clog("ord_init_once:",{o,scope,info})
  874. init_mu()
  875. info.cbs[info.k].remove_after_exe = 1
  876. }
  877. function ds_test(){
  878. glob_u.cb.ws.reg_cb(ord_init_once,"WS_OPEN:","ord_init_once")
  879. ws_reload()
  880. }
  881. // jsync:demo.js
  882. // ------------------------------------------------------------------------------------------------
  883. glob_u.fns.get_room_name=get_room_name
  884. // window.ds_test=ds_test
  885. glob_u.fns.ds_test=ds_test
  886. window.msto_prx=msto_prx
  887. })()