Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

jsync_ws.js 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. // FILE:WS0
  2. // TODO:JFI this file probably causes memory leaks
  3. window.glob_u.ws = window.glob_u.ws || {
  4. sockets:{},
  5. fns:{},
  6. flags:{},
  7. }
  8. window.glob_u.trc = window.glob_u.trc || {
  9. arr:[],
  10. }
  11. // TODO:JFI I should factor out my development junk
  12. function trc_sto(s,o){
  13. if (!glob_u?.prom?.init_db_resolve?.resolved){
  14. var elm = {name:s,o,timestamp:Date.now()}
  15. glob_u.trc.arr.push(elm)
  16. // clog("_trc:sto",s,o.sto_event_type,elm.timestamp,o)
  17. }
  18. }
  19. window.glob_u.ws.fns.reconnect = function reconnect(o,close_event){
  20. connect_ws(o.params)
  21. }
  22. // TODO:JFI These event handlers are less generic now
  23. window.glob_u.ws.fns.onclose = function onclose(event){
  24. clog("WS_CLOSE",{that:this,readyState:this.readyState,args:[...arguments]})
  25. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_CLOSE:",{event,that:this})
  26. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_CLOSE:",{event,that:this})
  27. setTimeout(this.params.fns.reconnect,1000)
  28. }
  29. window.glob_u.ws.fns.onmessage = function onmessage(event){
  30. // clog("WS_MESSAGE",{that:this,args:[...arguments]})
  31. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
  32. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_MESSAGE:",{event,that:this})
  33. }
  34. window.glob_u.ws.fns.onerror = function onerror(event){
  35. // clog("WS_ERROR",{that:this,args:[...arguments]})
  36. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_ERROR:",{event,that:this})
  37. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_ERROR:",{event,that:this})
  38. }
  39. window.glob_u.ws.fns.onopen = function onopen(event){
  40. // clog("WS_OPEN???",{that:this,args:[...arguments]},{on_open_once:this.on_open_once,on_open_cbs:this.params.on_open_cbs})
  41. // glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_OPEN:",{event,that:this})
  42. glob_u.ws.sockets[this.params.socket_name].params.ord.run_cbs("WS_OPEN:",{event,that:this})
  43. return
  44. var cb
  45. if (this.on_open_once){
  46. for (cb of this.on_open_once){
  47. cb(event,this)
  48. }
  49. if (this?.params?.on_open_cbs){
  50. for (cb of this?.params?.on_open_cbs){
  51. cb(event,this)
  52. }
  53. }
  54. }
  55. }
  56. window.glob_u.ws.fns.ws_fns_factory = function ws_fns_factory(socket_opts){
  57. var socket_name = socket_opts.socket_name
  58. // const sockets =
  59. var v1 = "init"
  60. var fns = {
  61. get_socket(o){
  62. return glob_u.ws.sockets[socket_name]
  63. },
  64. reconnect(){
  65. var socket = fns.get_socket()
  66. clog("RECONNECT",socket_opts,socket,socket?.DoNotReconnect)
  67. // if (socket.DoNotReconnect || socket.params.DoNotReconnect || glob_u.ws?.flags?.DoNotReconnect){
  68. if (socket.DoNotReconnect || !socket.params.AutoReconnect || glob_u.ws?.flags?.DoNotReconnect){
  69. clog("RECONNECTION NOT ATTEMPTED",socket_opts)
  70. return
  71. } else {
  72. }
  73. connect_ws(socket_opts)
  74. },
  75. log_var(o){
  76. clog("var:",v1)
  77. return v1
  78. },
  79. set_var(val){
  80. v1 = val
  81. return v1
  82. },
  83. send_text(o){
  84. var socket = fns.get_socket()
  85. clog("send_text",{that:this,fns})
  86. socket.send(JSON.stringify(o));
  87. },
  88. jsend(o){
  89. var socket = fns.get_socket()
  90. // clog("!!!",{that:this,fns})
  91. socket.send(JSON.stringify(o));
  92. },
  93. }
  94. return fns
  95. }
  96. function connect_ws(o= {}){
  97. // clog("connect_ws:",o,jc(o))
  98. glob_u.fns.merge_partial_template(o,{on_open_cbs:[]})
  99. var sockets = window.glob_u.ws.sockets
  100. var old_socket = sockets[o.socket_name]
  101. if (old_socket && old_socket.readyState == 1){
  102. clog(`WS ${o.socket_name} is already CONNECTED:`,old_socket , o)
  103. return
  104. } else if (old_socket && (old_socket.readyState != 3 && old_socket.readyState != undefined )){
  105. clog(`WS ${o.socket_name} exsists and in not closed:`,old_socket , o)
  106. return
  107. }
  108. var socket = new WebSocket(o.url)
  109. socket.on_open_once = []
  110. socket.pre_init_msgs = []
  111. socket.params = o
  112. // if ()
  113. Object.assign(o.fns, window.glob_u.ws.fns.ws_fns_factory(o))
  114. // Object.assign(o.fns2, window.glob_u.ws.fns.ws_fns_factory(o))
  115. Object.assign(socket,o.methods)
  116. sockets[o.socket_name]=socket
  117. // o.jsend ? socket.jsend = o.jsend: 0
  118. // clog("CONNECTING WS:",{o,socket})
  119. return [socket,old_socket]
  120. }
  121. // FILE:WS1
  122. function create_ws_ord(){
  123. if (!glob_u.cb.ws){
  124. var ord = new glob_u.cls.reg_cb_ord()
  125. glob_u.cb.ws = ord
  126. glob_u.cb.ws.reg_cb = ord.reg_cb
  127. glob_u.cb.ws.run_cbs = ord.run_cbs
  128. glob_u.cb.ws.STO_EVENT = glob_u.fns.gen_ord_decs(glob_u.cb.ws,"STO_EVENT:")
  129. // glob_u.cb.ord_v1.estr = glob_u.fns.gen_ord_decs(glob_u.cb.ord_v1.ord,"")
  130. // glob_u.cb.ord_v1.run_cbs_lz = glob_u.cb.ord_v1.estr.run_cbs_lz
  131. // glob_u.cb.ord_v1.ord.run_cbs_lz = glob_u.cb.ord_v1.run_cbs_lz
  132. }
  133. }
  134. window.glob_u.ws.fns.dispatch = function dispatch(o,obj_x,info){
  135. var event = o.event
  136. // socket = o.that
  137. var data = JSON.parse(event.data)
  138. // clog("WS_dispatch",data,socket.params.ord,data["CLIENT_KEY"])
  139. // clog("trc:sto:ws_rec",data.CLIENT_KEY,data.sto_event_type,data)
  140. trc_sto("ws_rec",data)
  141. glob_u.ws.sockets.ws1.params.ord.run_cbs("WS_MESSAGE:"+data["CLIENT_KEY"],{event,that:this,data})
  142. return
  143. if (e.arguments[0].type == "message"){
  144. var data = JSON.parse(e.arguments[0].data)
  145. if ("type" in data && ws_handlers[data.type]){
  146. ws_handlers[data.type](data,{that:e.that,event:e.arguments[0]})
  147. } else {
  148. clog("NO HANDLER FOR",data.type)
  149. }
  150. clog("~WS",data,e)
  151. } else if (e.arguments[0].type == "open") {
  152. ws_handlers.on_open(e)
  153. }
  154. }
  155. function ws_reload(){
  156. try{
  157. if ((!glob_u.ws.sockets.ws1 || glob_u.ws.sockets.ws1.readyState == 3 || glob_u.ws.sockets.ws1.readyState == undefined)){
  158. ws_helper()
  159. } else {
  160. glob_u.ws.sockets.ws1.close()
  161. clog(glob_u.ws.sockets.ws1,glob_u.ws.sockets.ws1.readyState)
  162. glob_u.ws.sockets.ws1.onclose = ws_helper
  163. }
  164. } catch (err){
  165. clog(err)
  166. }
  167. }
  168. function get_room_name(){
  169. var room_name=location.pathname.match(/\/loc.([^\/]*)\//)
  170. if (room_name){
  171. room_name = room_name[1]
  172. } else {
  173. room_name = location.pathname.split("/").pop()
  174. }
  175. return room_name
  176. }
  177. function ws_helper(){
  178. clog("WS_HELPER")
  179. var fns = window.glob_u.ws.fns
  180. var o = {
  181. include_participants_data:1,
  182. include_ws_channel_data:1, // required for participants_data to work
  183. // msto.participants and masto.ws_channels will be defined in either case so we don't need to handle cases where some users enable this and some don't
  184. AutoReconnect:false,
  185. AutoReconnect:true,
  186. url:'wss://' + window.location.hostname +`/djc_srv/ws/chat/${get_room_name()}`,
  187. socket_name:"ws1",
  188. ord:glob_u.cb.ws,
  189. methods:{
  190. onmessage:fns.dispatch,
  191. onclose:fns.onclose,
  192. onerror:fns.onerror,
  193. onopen:fns.onopen,
  194. },
  195. methods:{
  196. onmessage:fns.onmessage,
  197. onclose:fns.onclose,
  198. onerror:fns.onerror,
  199. onopen:fns.onopen,
  200. },
  201. fns:{
  202. // reconnect:fns.reconnect,
  203. },
  204. }
  205. /*
  206. if (window.glob_u.ws.ws1 && window.glob_u.ws.ws1.readyState == 1){
  207. clog("WS ws1 is CONNECTED:",window.glob_u.ws.ws1)
  208. return
  209. }
  210. */
  211. var socket = connect_ws(o)
  212. // clog({socket})
  213. }
  214. window.glob_u.fns.connect_ws = connect_ws
  215. glob_u.fns.get_room_name=get_room_name
  216. create_ws_ord()
  217. glob_u.cb.ws.reg_cb(window.glob_u.ws.fns.dispatch,"WS_MESSAGE:","WS_MESSAGE")