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 };