Ivan Asmer vor 5 Jahren
Ursprung
Commit
9457098217
4 geänderte Dateien mit 41 neuen und 16 gelöschten Zeilen
  1. 2 0
      index.js
  2. 14 0
      package-lock.json
  3. 1 0
      package.json
  4. 24 16
      public/index.js

+ 2 - 0
index.js

@@ -1,6 +1,7 @@
 const express = require('express');
 const http    = require( 'http');
 const WebSocket  = require('ws');
+const cors       = require('cors');
 
 const app = express();
 
@@ -179,6 +180,7 @@ wss.on('connection', async ws => {
 });
 
 app.use(express.static('public'));
+app.use(cors());
 
 //start our server
 server.listen(process.env.PORT || 8999, () => {

+ 14 - 0
package-lock.json

@@ -65,6 +65,15 @@
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
     },
+    "cors": {
+      "version": "2.8.5",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+      "requires": {
+        "object-assign": "^4",
+        "vary": "^1"
+      }
+    },
     "debug": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -236,6 +245,11 @@
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
       "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
     },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
     "on-finished": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
   "author": "",
   "license": "ISC",
   "dependencies": {
+    "cors": "^2.8.5",
     "express": "^4.16.4",
     "ws": "^6.1.2"
   }

+ 24 - 16
public/index.js

@@ -1,6 +1,6 @@
 let socket;
 
-function noPromise(){
+function openPromise(){
     let resolve, reject;
 
     let np = new Promise((ok, fail) => {resolve = ok; reject = fail});
@@ -23,19 +23,24 @@ function asynchronize({s, chunkEventName, endEventName}){
         let   promiseCount  = 0;
         let   end           = false;
 
-        if (!('on' in s)){
-            s.on = function(eventName, callback){
+        if (!('on' in s)){ //no on method in browser
+            s.on = function(eventName, callback){ //polyfill
                 this['on' + eventName] = callback;
             }
         }
 
+
+        //check availability of chunk and promise. If any, resolve promise, and clear both from queue 
+        const chunkAndPromise = i  =>   (i in chunks) && 
+                                        (i in promises) && (
+                                            promises[i].resolve(chunks[i]),
+                                            clear(i))
+
         s.on(chunkEventName, data => {
             chunks[chunkCount] = data
 
-            if (chunkCount in promises){
-                promises[chunkCount].resolve(chunks[chunkCount])
-                clear(chunkCount)
-            }
+            chunkAndPromise(chunkCount)
+
             chunkCount++
         })
 
@@ -48,17 +53,14 @@ function asynchronize({s, chunkEventName, endEventName}){
         })
 
         while (!end){
-            let p = noPromise()
-            promises[promiseCount] = p;
 
-            if (promiseCount in chunks){
-                p.resolve(chunks[promiseCount])
-                clear(promiseCount)
-            }
+            let p;
+            promises[promiseCount] = p = openPromise();
 
-            promiseCount++
+            chunkAndPromise(promiseCount)
 
-            yield p;
+            promiseCount++;
+            yield p; //yield promise outside
         }
     }
 }
@@ -69,13 +71,19 @@ function msg2dom({nick, message, timestamp}){
     return div;
 }
 
+function userCount2dom({value}){
+    const div = document.createElement('div')
+    div.innerHTML = `<b>${nick}</b>:${message}`
+    return div;
+}
+
 let RPC = {
     addMessage(data){
         chat.appendChild(msg2dom(data))
     },
 
     getUserCount({value}){
-        chat.appendChild(msg2dom({nick: 'чатег', message: `${value} user online` , timestamp: (new Date()).getTime()}))
+        chat.appendChild(userCount2dom({value}))
     }
 };