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.4KB

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