index.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. let socket;
  2. function noPromise(){
  3. let resolve, reject;
  4. let np = new Promise((ok, fail) => {resolve = ok; reject = fail});
  5. np.resolve = resolve;
  6. np.reject = reject;
  7. return np
  8. }
  9. function asynchronize({s, chunkEventName, endEventName}){
  10. return async function* (){
  11. const chunks = {};
  12. const promises = {};
  13. const clear = i => (delete chunks[i], delete promises[i])
  14. let chunkCount = 0;
  15. let promiseCount = 0;
  16. let end = false;
  17. if (!('on' in s)){
  18. s.on = function(eventName, callback){
  19. this['on' + eventName] = callback;
  20. }
  21. }
  22. s.on(chunkEventName, data => {
  23. chunks[chunkCount] = data
  24. if (chunkCount in promises){
  25. promises[chunkCount].resolve(chunks[chunkCount])
  26. clear(chunkCount)
  27. }
  28. chunkCount++
  29. })
  30. s.on(endEventName, () => {
  31. end = true;
  32. for (let i in promises){
  33. promises[i].reject(new Error('End Of S'))
  34. }
  35. })
  36. while (!end){
  37. let p = noPromise()
  38. promises[promiseCount] = p;
  39. if (promiseCount in chunks){
  40. p.resolve(chunks[promiseCount])
  41. clear(promiseCount)
  42. }
  43. promiseCount++
  44. yield p;
  45. }
  46. }
  47. }
  48. function msg2dom({nick, message, timestamp}){
  49. const div = document.createElement('div')
  50. div.innerHTML = `<b>${nick}</b>:${message}`
  51. return div;
  52. }
  53. let RPC = {
  54. addMessage(data){
  55. chat.appendChild(msg2dom(data))
  56. },
  57. getUserCount({value}){
  58. chat.appendChild(msg2dom({nick: 'чатег', message: `${value} user online` , timestamp: (new Date()).getTime()}))
  59. }
  60. };
  61. (async () => {
  62. while (true){
  63. try{
  64. socket = new WebSocket(`ws://${location.host}/`);
  65. let aGena = asynchronize({s: socket, chunkEventName: 'message', endEventName: 'close'});
  66. for await (let msg of aGena()){
  67. let data = JSON.parse(msg.data)
  68. if (data.func in RPC){
  69. RPC[data.func](data)
  70. }
  71. }
  72. }
  73. catch (e){
  74. console.log(e)
  75. }
  76. }
  77. })()
  78. send.onclick = function(){
  79. if (socket && typeof socket.send === 'function')
  80. socket.send(JSON.stringify({func: 'addMessage', nick: nick.value, message: msg.value}))
  81. }