Skip to content

Commit 4bb3f21

Browse files
author
Uros Marolt
authored
Enhancement/websockets (#413)
1 parent 02cc997 commit 4bb3f21

31 files changed

Lines changed: 903 additions & 80 deletions

backend/package-lock.json

Lines changed: 201 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
"sanitize-html": "^2.7.1",
9696
"sequelize": "6.21.2",
9797
"sequelize-cli-typescript": "^3.2.0-c",
98+
"socket.io": "^4.5.4",
9899
"stripe": "10.0.0",
99100
"superagent": "^8.0.0",
100101
"swagger-ui-dist": "4.1.3",

backend/src/api/auth/authMe.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Error403 from '../../errors/Error403'
2-
import { RedisCache } from '../../utils/redis'
2+
import { RedisCache } from '../../utils/redis/redisCache'
33

44
export default async (req, res) => {
55
if (!req.currentUser || !req.currentUser.id) {

backend/src/api/index.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import cors from 'cors'
33
import helmet from 'helmet'
44
import bunyanMiddleware from 'bunyan-middleware'
55
import { PostHog } from 'posthog-node'
6+
import * as http from 'http'
67
import { authMiddleware } from '../middlewares/authMiddleware'
78
import { tenantMiddleware } from '../middlewares/tenantMiddleware'
89
import { databaseMiddleware } from '../middlewares/databaseMiddleware'
@@ -16,16 +17,41 @@ import { responseHandlerMiddleware } from '../middlewares/responseHandlerMiddlew
1617
import { errorMiddleware } from '../middlewares/errorMiddleware'
1718
import { passportStrategyMiddleware } from '../middlewares/passportStrategyMiddleware'
1819
import { redisMiddleware } from '../middlewares/redisMiddleware'
19-
import { createRedisClient } from '../utils/redis'
2020
import { POSTHOG_CONFIG } from '../config'
21+
import { createRedisClient, createRedisPubSubPair } from '../utils/redis'
22+
import WebSockets from './websockets'
23+
import RedisPubSubReceiver from '../utils/redis/pubSubReceiver'
24+
import { ApiWebsocketMessage } from '../types/mq/apiWebsocketMessage'
2125

2226
const serviceLogger = createServiceLogger()
2327

2428
const app = express()
2529

30+
const server = http.createServer(app)
31+
2632
setImmediate(async () => {
2733
const redis = await createRedisClient(true)
2834

35+
const redisPubSubPair = await createRedisPubSubPair()
36+
const userNamespace = await WebSockets.initialize(server)
37+
38+
const pubSubReceiver = new RedisPubSubReceiver('api-pubsub', redisPubSubPair.subClient, (err) => {
39+
serviceLogger.error(err, 'Error while listening to Redis Pub/Sub api-ws channel!')
40+
process.exit(1)
41+
})
42+
43+
pubSubReceiver.subscribe('user', async (message) => {
44+
const data = message as ApiWebsocketMessage
45+
46+
if (data.tenantId) {
47+
await userNamespace.emitForTenant(data.tenantId, data.event, data.data)
48+
} else if (data.userId) {
49+
userNamespace.emitToUserRoom(data.userId, data.event, data.data)
50+
} else {
51+
serviceLogger.error({ type: data.type }, 'Received invalid websocket message!')
52+
}
53+
})
54+
2955
let posthog = null
3056

3157
if (POSTHOG_CONFIG.apiKey) {
@@ -151,4 +177,4 @@ setImmediate(async () => {
151177
app.use(io.expressErrorHandler())
152178
})
153179

154-
export default app
180+
export default server

backend/src/api/member/memberExport.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import identifyTenant from '../../segment/identifyTenant'
44
import track from '../../segment/track'
55
import MemberService from '../../services/memberService'
66
import PermissionChecker from '../../services/user/permissionChecker'
7-
import { RedisCache } from '../../utils/redis'
7+
import { RedisCache } from '../../utils/redis/redisCache'
88

99
/**
1010
* POST /tenant/{tenantId}/member/export

0 commit comments

Comments
 (0)