Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

jsync_sto.js 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. // FILE:DS0
  2. var Proxy_Permissions,Proxy_Factory
  3. function mhndlr_rld_2(_o,scope,info){
  4. var dlog =nop
  5. try {
  6. var parsed = _o.data
  7. var o = parsed.payload
  8. // clog("mhndlr_rld",parsed.sto_event_type,parsed,{_o,scope,info})
  9. if (window.mhndlr_rld_dbg){
  10. mhndlr_rld_dbg({m,that,n,parsed,ai,o,arguments})
  11. }
  12. switch (parsed.sto_event_type){
  13. case "set_msg":
  14. // if (!glob_u.prom.init_db_resolve.resolved){
  15. if (!glob_u.prom.init_db_resolve.resolved_inited){
  16. _o.event.target.pre_init_msgs.push(_o)
  17. }
  18. pf._set_recv(o.path,o.key,o.val)
  19. // clog("msto_evh?ord")
  20. glob_u.fns.msto_evh ? glob_u.fns.msto_evh(o,parsed) : 0
  21. break;
  22. case "group_count":
  23. // clog("mhndlr_rld group_count",parsed)
  24. if (parsed.group_count < 2){
  25. // clog("mhndlr_rld group_count RESOLVE")
  26. glob_u.prom.init_db_resolve(glob_u.prom.init_db_resolve_timeout_arg)
  27. }
  28. break;
  29. case "event":
  30. /*
  31. dlog("~event~",parsed)
  32. if (window.dispatch_events){
  33. dispatch_events({parsed,ai,m,that})
  34. }
  35. */
  36. break;
  37. case "msg_test":
  38. dlog("msg_test",parsed)
  39. break;
  40. case "db_sync_request":
  41. // tmsgx4({sto_event_type:"db_sync_response",payload:pf.root,"CLIENT_KEY":"ws_sto"})
  42. // if (glob_u.prom.init_db_resolve.resolved){
  43. if (glob_u.prom.init_db_resolve.resolved_inited == 2){
  44. 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"})
  45. }
  46. break;
  47. case "db_sync_response":
  48. if (glob_u.prom.init_db_resolve && parsed.request_rn_from == glob_u.prom.init_db_resolve.rn){
  49. glob_u.prom.init_db_resolve({aaa:"dsr",pl:parsed.payload})
  50. }
  51. // clog("db_sync_response",parsed)
  52. break;
  53. }
  54. } catch (err) {
  55. clog("mhndlr err:",err)
  56. }
  57. }
  58. glob_u.fns.msto_evh = function(o,parsed,ai,id){
  59. // clog("ord_msto_evh")
  60. if (o.path[0]!="conference" || o.path[1]!="events"){
  61. return
  62. }
  63. glob_u.cb.ws.STO_EVENT.run_cbs(":STO_EVENT",{o,parsed,ai,id})
  64. if (typeof(o.val) == "object"){
  65. glob_u.cb.ws.STO_EVENT.run_cbs(o.val.type,{o,parsed,ai,id})
  66. }
  67. }
  68. glob_u.cb.ws.reg_cb(mhndlr_rld_2,"WS_MESSAGE:ws_sto","WS_MESSAGE:ws_sto")
  69. // FILE:DS1
  70. var dlog = nop
  71. function tmsgx4(m){
  72. var socket = glob_u.ws.sockets.ws1
  73. var jsend = socket.params.fns.jsend
  74. var t = {
  75. key:"tmp_dev_sto",
  76. }
  77. glob_u.fns.merge_partial_template(m,t)
  78. // clog("tmsgx4",{key:m.key,sto_event_type:m.sto_event_type,CLIENT_KEY:m.CLIENT_KEY},{m,t})
  79. trc_sto("tmsgx4",m)
  80. jsend(m)
  81. }
  82. isProxy = Symbol("isProxy")
  83. tlu = {
  84. object:"",
  85. string:true,
  86. number:true,
  87. undefined:true,
  88. boolean:true,
  89. }
  90. function type_info(o){
  91. try {
  92. var t
  93. var flags = {
  94. leaf:false,
  95. deep_not_prx:false,
  96. prx:false,
  97. isObj:false,
  98. isArr:false,
  99. els:false,
  100. }
  101. t = typeof(o)
  102. flags.t=t
  103. if (!(o === null)){
  104. flags.isArr = Array.isArray(o)
  105. flags.isObj = Object.prototype == o.__proto__
  106. }
  107. if (tlu[t] === true || o === null){
  108. flags.leaf = true
  109. } else if (t == "object" && o.__prx){
  110. flags.prx = true
  111. } else if (t == "object" && (flags.isArr || flags.isObj)){
  112. flags.prx = false
  113. flags.deep_not_prx = true
  114. } else {
  115. clog("ELSE")
  116. flags.els = true
  117. }
  118. return flags
  119. } catch (err){
  120. clog("type_info err:",err,{flags,o})
  121. }
  122. }
  123. function deep_prop_v0(o,p){
  124. try {
  125. var arr = jc(p)
  126. var ret = o
  127. while (arr.length){
  128. ret = ret[arr.shift()]
  129. }
  130. return ret
  131. } catch(err){console.error("DEEP_PROP ERR:",err)}
  132. }
  133. // delete Proxy_Factory
  134. // {
  135. Proxy_Factory = class Proxy_Factory {
  136. constructor(o,n="dflt"){
  137. this.db = o
  138. this.n = n
  139. this.hidden_props = ["add_proxy","_set","walker","walker_start","prxy"]
  140. this._pub_cb =[]
  141. this.__prx = true
  142. this.SymPrx = Symbol("SymPrx")
  143. }
  144. init(o){
  145. this.root = o
  146. }
  147. sync(o){
  148. this.root = jc(o.root)
  149. o._pub_cb.push(this._set_recv.bind(this))
  150. }
  151. get prxy(){
  152. return this
  153. }
  154. _set(o,k,v,prx,a0){
  155. this.obj[k]=prx
  156. }
  157. set_pub(obj, prop, val,receiver){
  158. this._set_pub(obj.__path_arr, prop, jx(val))
  159. }
  160. _set_pub(path,key,val){
  161. var k,v
  162. var arg = {
  163. "CLIENT_KEY":"ws_sto",
  164. "sto_event_type":"set_msg",
  165. "payload":{path,key,val},}
  166. tmsgx4(arg,
  167. )
  168. for (v of this._pub_cb){
  169. v(path,key,val)
  170. }
  171. }
  172. _set_recv(path,prop,val,id){
  173. var p = path
  174. var nprop = deep_prop_v0(this.root,p)
  175. var dpth = nprop.__dpth
  176. if (tlu[typeof(val)]){
  177. nprop._set(nprop,prop,val,val)
  178. } else {
  179. nprop._set(nprop,prop,val,new Proxy(val,this))
  180. nprop[prop].add_proxy(nprop,prop,val,dpth+1)
  181. }
  182. this.walker(nprop[prop],{},dpth+2)
  183. }
  184. set(obj, prop, val,receiver){
  185. if (obj[prop] === val){
  186. return Reflect.set(...arguments)
  187. }
  188. this.set_pub(obj, prop, val,receiver)
  189. this.event_proc("set")
  190. if ("__prx" == prop){
  191. this.__prx=val
  192. return this.__prx
  193. }
  194. if (typeof(val) === "object" && val != null && !(val.__prx)){
  195. var ret = Reflect.set(...arguments)
  196. this.set_obj(obj, prop, val,receiver)
  197. return ret
  198. }
  199. return Reflect.set(...arguments)
  200. }
  201. get(obj, prop,receiver){
  202. if (this.hidden_props.includes(prop)){
  203. switch (prop){
  204. case "add_proxy":
  205. return this.add_proxy.bind(this)
  206. break;
  207. case "prxy":
  208. return this
  209. case "_set":
  210. return this._set.bind({that:this,obj, prop,receiver})
  211. case "walker_start":
  212. return this.walker_start
  213. case "walker":
  214. return this.walker
  215. break;
  216. }
  217. }
  218. if (isProxy == prop){ return true }
  219. if ("__prx" == prop){ return this.__prx }
  220. return Reflect.get(...arguments)
  221. }
  222. add_proxy(o,k,v,dpth){
  223. var xpath = o.__path
  224. var apath = o.__path_arr
  225. this.event_proc("add_proxy")
  226. if (!apath){
  227. apath=[]
  228. }
  229. if (!xpath){
  230. xpath="ROOT!"
  231. }
  232. Object.defineProperty(v,"__path_arr",Object.assign({value:apath.concat(k),},this.baseProp))
  233. Object.defineProperty(v,"__path",Object.assign({value:xpath+":"+k,},this.baseProp))
  234. Object.defineProperty(v,"__dpth",Object.assign({value:dpth,},this.baseProp))
  235. // Object.defineProperty(v,"__dbg",Object.assign({value:{},},this.baseProp))
  236. }
  237. set_obj(obj, prop, val,receiver){
  238. var dpth = obj.__dpth
  239. var tf = {}
  240. var dbg_obj = {}
  241. this.walker(receiver,tf,dpth,dbg_obj)
  242. if (dbg_obj.depth_err){
  243. clog("MAX DEPTH?",dbg_obj,{obj, prop, val,receiver})
  244. }
  245. }
  246. walker(o,tfo,dpth=0,dbg_obj={"t":"unused"}){
  247. // if (dpth > 7){
  248. if (dpth > 15){
  249. dbg_obj.depth_err=1
  250. console.error("MAX DEPTH",{o,tfo,dpth,dbg_obj})
  251. return
  252. }
  253. var k,v
  254. var tf
  255. for ([k,v] of Object.entries(o)){
  256. tf = type_info(v)
  257. if (tf.deep_not_prx){
  258. o._set(o,k,v,new Proxy(v,this.prxy))
  259. o[k].add_proxy(o,k,v,dpth)
  260. this.walker(o[k],tf,dpth+1,dbg_obj)
  261. }
  262. }
  263. }
  264. walker_start(o,dpth){
  265. var tf = type_info(o)
  266. o.add_proxy({},[],o,-1)
  267. this.walker(o,tf,0)
  268. }
  269. event_proc(e){}
  270. }
  271. window.Proxy_Factory = Proxy_Factory
  272. Proxy_Factory.prototype.baseProp={
  273. writable: true,
  274. enumerable: false,
  275. // enumerable: true,
  276. configurable: true,
  277. }
  278. // }
  279. function arr_match(m,o){
  280. var k,v
  281. var r = 0
  282. for ([k,v] of Object.entries(m || {})){
  283. if (o[k] != v.valueOf()){
  284. r += 1
  285. return !r
  286. }
  287. }
  288. return !r
  289. }
  290. // permissions_def = {
  291. window.permissions_def = window.permissions_def || {
  292. participants:{
  293. m:["participants"],
  294. fn(set_scope,match){
  295. if (match.fp[1] == "rejx")
  296. throw "permission err"
  297. return
  298. },
  299. }
  300. }
  301. // {
  302. Proxy_Permissions = class Proxy_Permissions extends Proxy_Factory {
  303. constructor(a,a1){
  304. super(...arguments)
  305. }
  306. set(obj, prop, val,receiver){
  307. var k,v
  308. var r
  309. var matched
  310. var fp = obj.__path_arr.concat(prop)
  311. for ([k,v] of Object.entries(permissions_def)){
  312. matched = arr_match(v.m,fp)
  313. if (matched){
  314. r = v.fn({that:this,obj, prop, val,receiver},{fp,k,v}) || {}
  315. }
  316. }
  317. return super.set(obj, prop, val,receiver)
  318. }
  319. _set(){
  320. super._set(...arguments)
  321. }
  322. }
  323. window.Proxy_Permissions = Proxy_Permissions
  324. // }
  325. // clog("???")