Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

dev_sto.native.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. var NS = {
  2. // set_msg:"update_query"
  3. UPDATE_QUERY:"set_msg",
  4. // UPDATE_QUERY:"update_query",
  5. JOIN_DB:"connect_jdb",
  6. // JOIN_DB:"update_query",
  7. }
  8. function log_a1(lstr,o={}){
  9. /*
  10. */
  11. try {
  12. // window.tglob_au.run_dev_cbs("sto_log",{lstr,...o})
  13. tglob_z2.run_dev_cbs("sto_log",{lstr,...o})
  14. } catch (err) {
  15. console.log("err:sto_log_dflt",lstr)
  16. }
  17. }
  18. function pfnf(o){
  19. return function(resolve, reject){
  20. o.resolve=resolve
  21. o.reject=reject
  22. // clog(arguments)
  23. }
  24. }
  25. var isProxy = Symbol("isProxy")
  26. var tlu = {
  27. object:"",
  28. string:true,
  29. number:true,
  30. undefined:true,
  31. boolean:true,
  32. }
  33. function arr_match(m,o){
  34. var k,v
  35. var r = 0
  36. for ([k,v] of Object.entries(m || {})){
  37. if (o[k] != v.valueOf()){
  38. r += 1
  39. return !r
  40. }
  41. // for ([k,v] in m){
  42. // case
  43. // dlog(k,v)
  44. }
  45. return !r
  46. }
  47. function type_info(o){
  48. try {
  49. var t
  50. var flags = {
  51. leaf:false,
  52. deep_not_prx:false,
  53. prx:false,
  54. isObj:false,
  55. isArr:false,
  56. els:false,
  57. }
  58. t = typeof(o)
  59. flags.t=t
  60. // window?.glob_mx?.flags?.type_info_dbg ? clog("type_info") : 0
  61. if (!(o === null)){
  62. flags.isArr = Array.isArray(o)
  63. flags.isObj = Object.prototype == o.__proto__
  64. }
  65. if (tlu[t] === true || o === null){
  66. flags.leaf = true
  67. } else if (t == "object" && o.__prx){
  68. flags.prx = true
  69. } else if (t == "object" && (flags.isArr || flags.isObj)){
  70. flags.prx = false
  71. flags.deep_not_prx = true
  72. } else {
  73. clog("ELSE")
  74. flags.els = true
  75. }
  76. return flags
  77. // !window?.glob_mx?.flags?.type_info_dbg ? clog("type_info") : 0
  78. } catch (err){
  79. clog("type_info err:",err,{flags,o})
  80. }
  81. // clog(t,flags)
  82. }
  83. function deep_prop_v0(o,p){
  84. try {
  85. var arr = jc(p)
  86. var ret = o
  87. while (arr.length){
  88. // clog("deep_prop",arr,ret)
  89. ret = ret[arr.shift()]
  90. }
  91. // clog("deep_prop ret",ret)
  92. return ret
  93. } catch(err){console.error("DEEP_PROP ERR:",err)}
  94. }
  95. class Proxy_Factory {
  96. constructor(o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""){
  97. // log_a1("Proxy_Factory")
  98. this.db = o
  99. this.n = n
  100. this.socket_name = socket_name
  101. this.base_n = base_n
  102. this.full_n = full_n
  103. this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy","_sett","_sett2"]
  104. this._pub_cb =[]
  105. this.__prx = true
  106. this.SymPrx = Symbol("SymPrx")
  107. // clog("mx Proxy_Factory")
  108. // clog("pfx",{o,n,that:this})
  109. }
  110. constructor_x(){
  111. // o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""
  112. // this.constructor_m(...arguments)
  113. clog("Proxy_Factory constructor")
  114. Proxy_Factory.prototype.constructor_m.call(this,...arguments)
  115. }
  116. mx1(){
  117. // clog(("mx1: Proxy_Factory"))
  118. }
  119. init(o){
  120. // dlog("BP",this,this.baseProp,this.__proto__.baseProp,window.baseProp)
  121. // clog("pfx init",{o,that:this})
  122. this.root = o
  123. }
  124. sync(o){
  125. this.root = jc(o.root)
  126. o._pub_cb.push(this._set_recv.bind(this))
  127. }
  128. get prxy(){
  129. return this
  130. }
  131. _set(o,k,v,prx,a0){
  132. this.obj[k]=prx
  133. }
  134. _sett(o,k,v,prx,a0){
  135. dlog("_SETT",this,arguments)
  136. }
  137. _sett2(o,k,v,prx,a0){
  138. dlog("_SETT2",this,arguments)
  139. }
  140. set_pub(obj, prop, val,receiver){
  141. // dlog("qia_pub",obj, prop, val,receiver)
  142. // dlog("qia_pub2",this.n,obj.__path_arr, prop, jx(val))
  143. this._set_pub(obj.__path_arr, prop, jx(val))
  144. }
  145. // dev_glob.fns.tmp_send
  146. _connect_db(){
  147. /*
  148. dev_glob.fns.tmp_send({
  149. "key":"connect_jdb",
  150. // ,
  151. init_obj:this.db,
  152. "payload":{},
  153. db_id:this.db_conn.db_id,
  154. },this.socket_name)
  155. // */
  156. this._wssto_send({
  157. // "key":"connect_jdb",
  158. "key":NS.JOIN_DB,
  159. // ,
  160. tx:["abc",,2],
  161. init_obj:this.db,
  162. "payload":{},
  163. })
  164. }
  165. get db_conn(){
  166. return {db_id:{n:this.n,base_n:this.base_n,full_n:this.full_n},socket_name:this.socket_name}
  167. }
  168. // _req_sync(){}
  169. _wssto_send(o){
  170. // clog("wssto: m0")
  171. if (!o.wssto_key){
  172. o.wssto_key = o.key
  173. o.key = "wssto"
  174. }
  175. // o.key = "_wssto_" + o.key
  176. this.send(o)
  177. }
  178. send(o){
  179. // dev_glob.fns.tmp_send({
  180. glob_vhook.fns.tmp_send({
  181. db_id:this.db_conn.db_id,
  182. ...o,
  183. },this.socket_name)
  184. }
  185. send_raw(){
  186. clog("DBQ")
  187. }
  188. _set_pub(path,key,val){
  189. var k,v
  190. // clog("dev_sto","_set_pub")
  191. /*
  192. tmsgx({
  193. "type":"set_msg",
  194. "payload":{path,key,val},
  195. },"code")
  196. // */
  197. //
  198. this._wssto_send({
  199. // "type":"set_msg",
  200. "type":NS.UPDATE_QUERY,
  201. "key":NS.UPDATE_QUERY,
  202. "payload":{path,key,val},
  203. })
  204. /*
  205. dev_glob.fns.tmp_send({
  206. // tmsgx3({
  207. // })
  208. "type":"set_msg",
  209. "key":"set_msg",
  210. db_id:this.db_conn.db_id,
  211. // "payload":{path,key,val,db_id:{n:this.n,base_n:this.base_n}},},this.socket_name
  212. "payload":{path,key,val},},this.socket_name
  213. // window.tmsgx_to || {}
  214. // {to:"nl4qbyiz61z-mce1@specplot.com/FlUkwrLs"},
  215. // {to:"maf@conference.i.specplot.com/0695c1e4"},
  216. // {},
  217. )
  218. */
  219. for (v of this._pub_cb){
  220. v(path,key,val)
  221. }
  222. }
  223. _set_recv(path,prop,val){
  224. // return
  225. var p = path
  226. var nprop = deep_prop_v0(this.root,p)
  227. // clog("_set_recv:",nprop)
  228. var dpth = nprop.__dpth
  229. if (tlu[typeof(val)]){
  230. nprop._set(nprop,prop,val,val)
  231. } else {
  232. nprop._set(nprop,prop,val,new Proxy(val,this))
  233. nprop[prop].add_proxy(nprop,prop,val,dpth+1)
  234. }
  235. // var tf = {}
  236. // this.walker(nprop[prop],tf,dpth+2)
  237. this.walker(nprop[prop],{},dpth+2)
  238. }
  239. set(obj, prop, val,receiver){
  240. // dlog("prx_db set ",this,obj, prop, val,receiver,val.__prx)
  241. // clog("prx_db set ",{that:this,obj, prop, val,receiver},val.__prx)
  242. // clog("prx_db set ",obj.__path_arr)
  243. if (obj[prop] === val){
  244. return Reflect.set(...arguments)
  245. }
  246. this.set_pub(obj, prop, val,receiver)
  247. this.event_proc("set")
  248. if ("__prx" == prop){
  249. this.__prx=val
  250. return this.__prx
  251. }
  252. if (typeof(val) === "object" && val != null && !(val.__prx)){
  253. var ret = Reflect.set(...arguments)
  254. this.set_obj(obj, prop, val,receiver)
  255. return ret
  256. }
  257. return Reflect.set(...arguments)
  258. }
  259. get(obj, prop,receiver){
  260. // dlog("prx_db get ...",prop==isProxy,this,obj, prop,receiver)
  261. if (this.hidden_props.includes(prop)){
  262. switch (prop){
  263. case "add_proxy":
  264. return this.add_proxy.bind(this)
  265. break;
  266. case "prxy":
  267. return this
  268. case "_set":
  269. // dlog("_SET")
  270. // return this._set.bind({this})
  271. return this._set.bind({that:this,obj, prop,receiver})
  272. case "_sett":
  273. return this._sett.bind({that:this,obj, prop,receiver})
  274. case "_sett2":
  275. return this._sett2.bind({that:this})
  276. case "walker_start":
  277. return this.walker_start
  278. case "walker":
  279. return this.walker
  280. break;
  281. }
  282. }
  283. if (isProxy == prop){ return true }
  284. if ("__prx" == prop){ return this.__prx }
  285. return Reflect.get(...arguments)
  286. }
  287. add_proxy(o,k,v,dpth){
  288. // clog("~add_proxy~",o,k,v,dpth)
  289. // clog("~add_proxy~",o.__prx,o,k,v,dpth,xpath)
  290. var xpath = o.__path
  291. var apath = o.__path_arr
  292. this.event_proc("add_proxy")
  293. if (!apath){
  294. apath=[]
  295. }
  296. if (!xpath){
  297. xpath="ROOT!"
  298. }
  299. Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
  300. Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
  301. Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
  302. // Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
  303. }
  304. set_obj(obj, prop, val,receiver){
  305. var dpth = obj.__dpth
  306. var tf = {}
  307. this.walker(receiver,tf,dpth)
  308. }
  309. walker(o,tfo,dpth=0){
  310. // dlog("qia WALK",this)
  311. if (dpth > 7){
  312. console.error("MAX DEPTH")
  313. return
  314. }
  315. var k,v
  316. var tf
  317. for ([k,v] of Object.entries(o)){
  318. tf = type_info(v)
  319. if (tf.deep_not_prx){
  320. o._set(o,k,v,new Proxy(v,this.prxy))
  321. o[k].add_proxy(o,k,v,dpth)
  322. this.walker(o[k],tf,dpth+1)
  323. }
  324. }
  325. }
  326. walker_start(o,dpth){
  327. var tf = type_info(o)
  328. o.add_proxy({},[],o,-1)
  329. this.walker(o,tf,0)
  330. }
  331. event_proc(e){}
  332. }
  333. var permissions_def = {
  334. participants:{
  335. m:["participants"],
  336. fn(set_scope,match){
  337. // clog("FN....",match.fp,match.fp[1] == window.glob_mx.local_id)
  338. return
  339. /*
  340. if (match.fp[1] != window.glob_mx.local_id)
  341. throw "permission err"
  342. return
  343. */
  344. },
  345. }
  346. }
  347. class Proxy_Permissions extends Proxy_Factory {
  348. // constructor_m(a,a1){
  349. constructor(a,a1){
  350. // clog("mx Proxy_Permissions")
  351. super(...arguments)
  352. }
  353. constructor_x(){
  354. // o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""
  355. super.constructor_x(...arguments)
  356. this.constructor_m(...arguments)
  357. // Proxy_Permissions.prototype.constructor_m.call(this,...arguments)
  358. // this.prototype.constructor_m.call(this,...arguments)
  359. }
  360. mx1(){
  361. // clog(("mx1: Proxy_Permissions"))
  362. }
  363. set(obj, prop, val,receiver){
  364. // clog("PRX_PERM",obj.__path_arr,prop)
  365. var k,v
  366. var r
  367. var matched
  368. var fp = obj.__path_arr.concat(prop)
  369. for ([k,v] of Object.entries(permissions_def)){
  370. matched = arr_match(v.m,fp)
  371. if (matched){
  372. r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
  373. }
  374. // if (r.return)
  375. }
  376. // case
  377. // if (obj.__path_arr && obj.__path_arr.length){}
  378. return super.set(obj, prop, val,receiver)
  379. }
  380. _set(){
  381. // clog("Proxy_Permissions _set")
  382. super._set(...arguments)
  383. }
  384. }
  385. function splice_out(arr,elm){
  386. let i = arr.indexOf(elm)
  387. // var r = ""
  388. if (i != -1){
  389. return arr.splice(i,1)
  390. }
  391. // return
  392. }
  393. function gen_sort_attr(attr){
  394. return function gsort(a0,a1){
  395. // clog("z",a0,a1)
  396. if (a0[attr] > a1[attr]){
  397. return 1
  398. } else if (a0[attr] < a1[attr]){
  399. return -1
  400. } else {
  401. return 0
  402. }
  403. }
  404. }
  405. function find_attr(elm,indx,arr){
  406. // this.attr
  407. // this.val
  408. // clog("F",{that:this,elm,indx,arr})
  409. // if ( elm[this.attr] == this.val){
  410. if (elm && elm[this.attr] == this.val){
  411. return 1
  412. }
  413. }
  414. var dflt_opts = {
  415. sort_fn:gen_sort_attr("override_level"),
  416. log_level:0,
  417. // ns:"",
  418. }
  419. class BoundObj{
  420. constructor(){
  421. this.init()
  422. }
  423. init(){
  424. let k,v,i,j
  425. for ([k,v] of Object.entries(Object.getOwnPropertyDescriptors(this.__proto__))){
  426. if (k.endsWith("_ub") && typeof(v.value) == "function"){
  427. // clog("UB",k,k.slice(1,-3))
  428. j = v.value.bind(this)
  429. j.meta_str = "bound_fn"
  430. this[k.slice(1,-3)] = j
  431. }
  432. }
  433. }
  434. /*
  435. mx2_ub(){
  436. clog("Mx2")
  437. }
  438. */
  439. }
  440. // class reg_cb_ord{
  441. class reg_cb_ord extends BoundObj{
  442. // con
  443. constructor(opts){
  444. super()
  445. this.opts = Object.assign({},dflt_opts,opts)
  446. this.r = Object.assign(this,dflt_opts,opts)
  447. // this.sort_fn = this.opts
  448. this.cb_sto = {}
  449. this._orig_opts = opts
  450. clog("v2 ",this)
  451. }
  452. _reg_cb_ub(cb,key_name,cb_name,override_level = 100,push=1){
  453. if (typeof(cb) != "function"){
  454. console.error("callback is not a function. setting push=r","\ncb:",cb)
  455. push = "r"
  456. // console.error("callback:",cb," is not a function")
  457. }
  458. // var this.cb_sto = {}
  459. var cb_sort = nop
  460. if (!this.cb_sto[key_name]){
  461. this.cb_sto[key_name] = []
  462. }
  463. // this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name})
  464. // splice_out_ti(this.cb_sto[key_name],this.cb_sto[key_name].find(find_html_cb,{fn_key:cb_name}))
  465. // var cbo0= this.cb_sto[key_name].find(glob_td.fn.find_html_cb,{fn_key:cb_name})
  466. // var cbo0= this.cb_sto[key_name].find(find_attr,{fn_key:cb_name})
  467. var cbo0= this.cb_sto[key_name].find(find_attr,{attr:"fn_key",val:cb_name})
  468. // clog(cbo0)
  469. splice_out(this.cb_sto[key_name],cbo0)
  470. // tn2t.arr.
  471. // splice_out_cb
  472. let cb_obj = {
  473. cb,
  474. hkey:key_name,
  475. fn_key:cb_name,
  476. override_level,
  477. }
  478. if (push=="r"){
  479. } else if (push){
  480. this.cb_sto[key_name].push(cb_obj)
  481. } else {
  482. this.cb_sto[key_name].unshift(cb_obj)
  483. }
  484. this.cb_sto[key_name].sort(this.sort_fn)
  485. }
  486. _run_cbs_ub(key,arg_obj){
  487. // if (!key in this.cb_sto){return}
  488. // clog("_run_cbs_ub:",key)
  489. var k,v
  490. var o = {
  491. // html_key:key,cbs:glob_mx.html_cb[key],
  492. }
  493. // dlog("RUN_HOOK_CB??",key,glob_mx.hook_cb[key])
  494. try {
  495. this.opts.log_level ? clog("run_cbs",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key]}) : 0
  496. for ([k,v] of Object.entries(this.cb_sto[key]|| {}) ) {
  497. // dlog("RUN_HOOK_CB:",k)
  498. // clog("run_html_cbs:",k,v)
  499. this.opts.log_level > 1 ? clog("run_cbs_e",arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v}) : 0
  500. v.cb(
  501. arg_obj,o,{that:this,hkey:key,cbs:this.cb_sto[key],k,v}
  502. )
  503. // v(o)
  504. }
  505. return {
  506. arg_obj,o,ord_that:{that:this,hkey:key,cbs:this.cb_sto[key],k,v}
  507. }
  508. } catch(err){
  509. console.error("ti_v_cb err:",err)
  510. console.log("ti_v_cb err:",err)
  511. }
  512. }
  513. /* fn1(){
  514. clog("fn1",{that:this,args:[...arguments]})
  515. }*/
  516. }
  517. window.tmp_dev_sto = {
  518. Proxy_Factory,Proxy_Permissions,reg_cb_ord,BoundObj
  519. }
  520. // Proxy_Factory