node-mongo-demo

node.js and mongodb demo

git clone https://9o.is/git/node-mongo-demo.git

lucky7-bets.js

(1722B)


      1 import Lucky7Bet from '../models/lucky7-bet.js';
      2 
      3 const users = new Map();
      4 const bets = new Map();
      5 
      6 export const subscribe = (userId, stream) => {
      7     users.set(userId, { stream });
      8 
      9     stream.onClose(() => {
     10         const user = users.get(userId)
     11         if (user?.nextBetTimeoutId) {
     12             clearTimeout(user.nextBetTimeoutId);
     13         }
     14         users.delete(userId);
     15     });
     16 };
     17 
     18 const handleInsert = data => {
     19     const bet = new Lucky7Bet(data.fullDocument);
     20     const user = users.get(bet.userId.toString());
     21 
     22     if (user) {
     23         const id = bet.id.toString();
     24         bets.set(id, bet);
     25 
     26         user.stream.writeJson({
     27             operationType: 'insert',
     28             bet: bet.toRedactedObject(),
     29         });
     30 
     31         user.nextBetTimeoutId = setTimeout(() => {
     32             user.stream.writeJson({
     33                 operationType: 'update',
     34                 bet: bet.toRedactedObject(),
     35             });
     36 
     37             bets.delete(id);
     38             delete user['nextBetTimeoutId'];
     39         }, bet.rollAt - Date.now());
     40     }
     41 };
     42 
     43 const handleUpdate = data => {
     44     const id = data.documentKey._id.toString();
     45     const bet = bets.get(id);
     46     const userId = bet?.userId.toString();
     47     const user = userId ? users.get(userId) : undefined;
     48 
     49     if (bet && user) {
     50         const { lucky } = data.updateDescription.updatedFields;
     51         user.stream.writeJson({
     52             operationType: 'update',
     53             bet: {
     54                 id,
     55                 lucky,
     56                 state: 'pending',
     57             },
     58         });
     59     }
     60 };
     61 
     62 export const onChange = data => {
     63     const { operationType } = data;
     64 
     65     if (operationType === 'insert') handleInsert(data);
     66     if (operationType === 'update') handleUpdate(data);
     67 };