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 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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 pfnf(o){
  9. return function(resolve, reject){
  10. o.resolve=resolve
  11. o.reject=reject
  12. // clog(arguments)
  13. }
  14. }
  15. function type_info(o){
  16. try {
  17. var t
  18. var flags = {
  19. leaf:false,
  20. deep_not_prx:false,
  21. prx:false,
  22. isObj:false,
  23. isArr:false,
  24. els:false,
  25. }
  26. t = typeof(o)
  27. flags.t=t
  28. // window?.glob_mx?.flags?.type_info_dbg ? clog("type_info") : 0
  29. if (!(o === null)){
  30. flags.isArr = Array.isArray(o)
  31. flags.isObj = Object.prototype == o.__proto__
  32. }
  33. if (tlu[t] === true || o === null){
  34. flags.leaf = true
  35. } else if (t == "object" && o.__prx){
  36. flags.prx = true
  37. } else if (t == "object" && (flags.isArr || flags.isObj)){
  38. flags.prx = false
  39. flags.deep_not_prx = true
  40. } else {
  41. clog("ELSE")
  42. flags.els = true
  43. }
  44. return flags
  45. // !window?.glob_mx?.flags?.type_info_dbg ? clog("type_info") : 0
  46. } catch (err){
  47. clog("type_info err:",err,{flags,o})
  48. }
  49. // clog(t,flags)
  50. }
  51. class Proxy_Factory {
  52. constructor(o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""){
  53. this.db = o
  54. this.n = n
  55. this.socket_name = socket_name
  56. this.base_n = base_n
  57. this.full_n = full_n
  58. this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy","_sett","_sett2"]
  59. this._pub_cb =[]
  60. this.__prx = true
  61. this.SymPrx = Symbol("SymPrx")
  62. clog("mx Proxy_Factory")
  63. // clog("pfx",{o,n,that:this})
  64. }
  65. constructor_x(){
  66. // o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""
  67. // this.constructor_m(...arguments)
  68. clog("Proxy_Factory constructor")
  69. Proxy_Factory.prototype.constructor_m.call(this,...arguments)
  70. }
  71. mx1(){
  72. clog(("mx1: Proxy_Factory"))
  73. }
  74. init(o){
  75. // dlog("BP",this,this.baseProp,this.__proto__.baseProp,window.baseProp)
  76. // clog("pfx init",{o,that:this})
  77. this.root = o
  78. }
  79. sync(o){
  80. this.root = jc(o.root)
  81. o._pub_cb.push(this._set_recv.bind(this))
  82. }
  83. get prxy(){
  84. return this
  85. }
  86. _set(o,k,v,prx,a0){
  87. this.obj[k]=prx
  88. }
  89. _sett(o,k,v,prx,a0){
  90. dlog("_SETT",this,arguments)
  91. }
  92. _sett2(o,k,v,prx,a0){
  93. dlog("_SETT2",this,arguments)
  94. }
  95. set_pub(obj, prop, val,receiver){
  96. // dlog("qia_pub",obj, prop, val,receiver)
  97. // dlog("qia_pub2",this.n,obj.__path_arr, prop, jx(val))
  98. this._set_pub(obj.__path_arr, prop, jx(val))
  99. }
  100. // dev_glob.fns.tmp_send
  101. _connect_db(){
  102. /*
  103. dev_glob.fns.tmp_send({
  104. "key":"connect_jdb",
  105. // ,
  106. init_obj:this.db,
  107. "payload":{},
  108. db_id:this.db_conn.db_id,
  109. },this.socket_name)
  110. // */
  111. this._wssto_send({
  112. // "key":"connect_jdb",
  113. "key":NS.JOIN_DB,
  114. // ,
  115. tx:["abc",,2],
  116. init_obj:this.db,
  117. "payload":{},
  118. })
  119. }
  120. get db_conn(){
  121. return {db_id:{n:this.n,base_n:this.base_n,full_n:this.full_n},socket_name:this.socket_name}
  122. }
  123. // _req_sync(){}
  124. _wssto_send(o){
  125. clog("wssto: m0")
  126. if (!o.wssto_key){
  127. o.wssto_key = o.key
  128. o.key = "wssto"
  129. }
  130. // o.key = "_wssto_" + o.key
  131. this.send(o)
  132. }
  133. send(o){
  134. // dev_glob.fns.tmp_send({
  135. glob_vhook.fns.tmp_send({
  136. db_id:this.db_conn.db_id,
  137. ...o,
  138. },this.socket_name)
  139. }
  140. send_raw(){
  141. clog("DBQ")
  142. }
  143. _set_pub(path,key,val){
  144. var k,v
  145. clog("dev_sto","_set_pub")
  146. /*
  147. tmsgx({
  148. "type":"set_msg",
  149. "payload":{path,key,val},
  150. },"code")
  151. // */
  152. //
  153. this._wssto_send({
  154. // "type":"set_msg",
  155. "type":NS.UPDATE_QUERY,
  156. "key":NS.UPDATE_QUERY,
  157. "payload":{path,key,val},
  158. })
  159. /*
  160. dev_glob.fns.tmp_send({
  161. // tmsgx3({
  162. // })
  163. "type":"set_msg",
  164. "key":"set_msg",
  165. db_id:this.db_conn.db_id,
  166. // "payload":{path,key,val,db_id:{n:this.n,base_n:this.base_n}},},this.socket_name
  167. "payload":{path,key,val},},this.socket_name
  168. // window.tmsgx_to || {}
  169. // {to:"nl4qbyiz61z-mce1@specplot.com/FlUkwrLs"},
  170. // {to:"maf@conference.i.specplot.com/0695c1e4"},
  171. // {},
  172. )
  173. */
  174. for (v of this._pub_cb){
  175. v(path,key,val)
  176. }
  177. }
  178. _set_recv(path,prop,val){
  179. // return
  180. var p = path
  181. var nprop = deep_prop_v0(this.root,p)
  182. clog("_set_recv:",nprop)
  183. var dpth = nprop.__dpth
  184. if (tlu[typeof(val)]){
  185. nprop._set(nprop,prop,val,val)
  186. } else {
  187. nprop._set(nprop,prop,val,new Proxy(val,this))
  188. nprop[prop].add_proxy(nprop,prop,val,dpth+1)
  189. }
  190. // var tf = {}
  191. // this.walker(nprop[prop],tf,dpth+2)
  192. this.walker(nprop[prop],{},dpth+2)
  193. }
  194. set(obj, prop, val,receiver){
  195. // dlog("prx_db set ",this,obj, prop, val,receiver,val.__prx)
  196. // clog("prx_db set ",{that:this,obj, prop, val,receiver},val.__prx)
  197. // clog("prx_db set ",obj.__path_arr)
  198. if (obj[prop] === val){
  199. return Reflect.set(...arguments)
  200. }
  201. this.set_pub(obj, prop, val,receiver)
  202. this.event_proc("set")
  203. if ("__prx" == prop){
  204. this.__prx=val
  205. return this.__prx
  206. }
  207. if (typeof(val) === "object" && val != null && !(val.__prx)){
  208. var ret = Reflect.set(...arguments)
  209. this.set_obj(obj, prop, val,receiver)
  210. return ret
  211. }
  212. return Reflect.set(...arguments)
  213. }
  214. get(obj, prop,receiver){
  215. // dlog("prx_db get ...",prop==isProxy,this,obj, prop,receiver)
  216. if (this.hidden_props.includes(prop)){
  217. switch (prop){
  218. case "add_proxy":
  219. return this.add_proxy.bind(this)
  220. break;
  221. case "prxy":
  222. return this
  223. case "_set":
  224. // dlog("_SET")
  225. // return this._set.bind({this})
  226. return this._set.bind({that:this,obj, prop,receiver})
  227. case "_sett":
  228. return this._sett.bind({that:this,obj, prop,receiver})
  229. case "_sett2":
  230. return this._sett2.bind({that:this})
  231. case "walker_start":
  232. return this.walker_start
  233. case "walker":
  234. return this.walker
  235. break;
  236. }
  237. }
  238. if (isProxy == prop){ return true }
  239. if ("__prx" == prop){ return this.__prx }
  240. return Reflect.get(...arguments)
  241. }
  242. add_proxy(o,k,v,dpth){
  243. // clog("~add_proxy~",o,k,v,dpth)
  244. // clog("~add_proxy~",o.__prx,o,k,v,dpth,xpath)
  245. var xpath = o.__path
  246. var apath = o.__path_arr
  247. this.event_proc("add_proxy")
  248. if (!apath){
  249. apath=[]
  250. }
  251. if (!xpath){
  252. xpath="ROOT!"
  253. }
  254. Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
  255. Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
  256. Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
  257. // Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
  258. }
  259. set_obj(obj, prop, val,receiver){
  260. var dpth = obj.__dpth
  261. var tf = {}
  262. this.walker(receiver,tf,dpth)
  263. }
  264. walker(o,tfo,dpth=0){
  265. // dlog("qia WALK",this)
  266. if (dpth > 7){
  267. console.error("MAX DEPTH")
  268. return
  269. }
  270. var k,v
  271. var tf
  272. for ([k,v] of Object.entries(o)){
  273. tf = type_info(v)
  274. if (tf.deep_not_prx){
  275. o._set(o,k,v,new Proxy(v,this.prxy))
  276. o[k].add_proxy(o,k,v,dpth)
  277. this.walker(o[k],tf,dpth+1)
  278. }
  279. }
  280. }
  281. walker_start(o,dpth){
  282. var tf = type_info(o)
  283. o.add_proxy({},[],o,-1)
  284. this.walker(o,tf,0)
  285. }
  286. event_proc(e){}
  287. }
  288. var permissions_def = {
  289. participants:{
  290. m:["participants"],
  291. fn(set_scope,match){
  292. // clog("FN....",match.fp,match.fp[1] == window.glob_mx.local_id)
  293. return
  294. /*
  295. if (match.fp[1] != window.glob_mx.local_id)
  296. throw "permission err"
  297. return
  298. */
  299. },
  300. }
  301. }
  302. class Proxy_Permissions extends Proxy_Factory {
  303. // constructor_m(a,a1){
  304. constructor(a,a1){
  305. clog("mx Proxy_Permissions")
  306. super(...arguments)
  307. }
  308. constructor_x(){
  309. // o,n="dflt",base_n="dflt",full_n="dflt-dflt",socket_name=""
  310. super.constructor_x(...arguments)
  311. this.constructor_m(...arguments)
  312. // Proxy_Permissions.prototype.constructor_m.call(this,...arguments)
  313. // this.prototype.constructor_m.call(this,...arguments)
  314. }
  315. mx1(){
  316. clog(("mx1: Proxy_Permissions"))
  317. }
  318. set(obj, prop, val,receiver){
  319. // clog("PRX_PERM",obj.__path_arr,prop)
  320. var k,v
  321. var r
  322. var matched
  323. var fp = obj.__path_arr.concat(prop)
  324. for ([k,v] of Object.entries(permissions_def)){
  325. matched = arr_match(v.m,fp)
  326. if (matched){
  327. r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
  328. }
  329. // if (r.return)
  330. }
  331. // case
  332. // if (obj.__path_arr && obj.__path_arr.length){}
  333. return super.set(obj, prop, val,receiver)
  334. }
  335. _set(){
  336. // clog("Proxy_Permissions _set")
  337. super._set(...arguments)
  338. }
  339. }
  340. window.tmp_dev_sto = {
  341. Proxy_Factory,Proxy_Permissions
  342. }
  343. // Proxy_Factory