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.

dev_sto.native.js 12KB

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