Skip to content

Commit d3cc6a3

Browse files
authored
Merge pull request #610 from TaloDev/develop
Release 0.87.3
2 parents ca3e8bf + bd077d6 commit d3cc6a3

File tree

14 files changed

+79
-23
lines changed

14 files changed

+79
-23
lines changed

package-lock.json

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

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "game-services",
3-
"version": "0.87.2",
3+
"version": "0.87.3",
44
"description": "",
55
"main": "src/index.ts",
66
"scripts": {

src/lib/tracing/enable-tracing.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ if (process.env.NODE_ENV !== 'test' && typeof process.env.HYPERDX_API_KEY === 's
1212
})
1313

1414
const nodeMonitorMeter = metrics.getMeter('node-monitor-meter')
15-
1615
const gauge = nodeMonitorMeter.createObservableGauge(
1716
'process.runtime.nodejs.memory.heap.total',
1817
{

src/middleware/http-tracing-middleware.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,19 @@ export default async function httpTracingMiddleware(ctx: Context, next: Next) {
9696
...buildHeaders('request', ctx.request.headers),
9797
'http.method': ctx.method,
9898
'http.route': ctx.path,
99-
'http.request.body': JSON.stringify(deepFilterData(ctx.request.body, true))
99+
'http.request.body': ctx.request.body
100+
? JSON.stringify(deepFilterData(ctx.request.body, true))
101+
: undefined
100102
})
101103

102104
ctx.res.on('finish', () => {
103105
setTraceAttributes({
104106
...buildHeaders('response', ctx.response.headers),
107+
'http.status': ctx.status,
105108
'http.response_size': ctx.response.length,
106-
'http.response.body': JSON.stringify(deepFilterData(ctx.response.body, true))
109+
'http.response.body': ctx.response.body
110+
? JSON.stringify(deepFilterData(ctx.response.body, true))
111+
: undefined
107112
})
108113
})
109114

src/services/public/user-public.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ export default class UserPublicService extends Service {
288288
const { code, userId } = req.body
289289
const em: EntityManager = req.ctx.em
290290

291-
const user = await em.getRepository(User).findOneOrFail(userId)
291+
const user = await em.repo(User).findOneOrFail(userId, { populate: ['organisation.games'] })
292292

293293
const redis: Redis = req.ctx.redis
294294
const hasSession = (await redis.get(`2fa:${user.id}`)) === 'true'

src/socket/enableSocketTracing.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { metrics } from '@opentelemetry/api'
2+
import { WebSocket } from 'ws'
3+
import Socket from '.'
4+
5+
export function enableSocketTracing(socket: Socket) {
6+
if (process.env.NODE_ENV === 'test') {
7+
return
8+
}
9+
10+
const socketMonitorMeter = metrics.getMeter('socket-monitor-meter')
11+
12+
const openGauge = socketMonitorMeter.createObservableGauge('talo.socket.connections.open')
13+
openGauge.addCallback((result) => {
14+
const allClients = Array.from(socket.getServer().clients.values())
15+
result.observe(allClients.filter((c) => c.readyState === WebSocket.OPEN).length)
16+
})
17+
18+
const closedGauge = socketMonitorMeter.createObservableGauge('talo.socket.connections.not-open')
19+
closedGauge.addCallback((result) => {
20+
const allClients = Array.from(socket.getServer().clients.values())
21+
result.observe(allClients.filter((c) => c.readyState !== WebSocket.OPEN).length)
22+
})
23+
24+
const ticketedGauge = socketMonitorMeter.createObservableGauge('talo.socket.connections.ticketed')
25+
ticketedGauge.addCallback((result) => {
26+
const allClients = socket.findConnections(() => true)
27+
result.observe(allClients.length)
28+
})
29+
}

src/socket/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import SocketTicket from './socketTicket'
1313
import { getSocketTracer } from './socketTracer'
1414
import { FlushSocketEventsQueueHandler } from '../lib/queues/game-metrics/flush-socket-events-queue-handler'
1515
import { v4 } from 'uuid'
16+
import { enableSocketTracing } from './enableSocketTracing'
1617

1718
type CloseConnectionOptions = {
1819
code?: number
@@ -52,6 +53,8 @@ export default class Socket {
5253
})
5354

5455
this.redis = createRedisConnection()
56+
57+
enableSocketTracing(this)
5558
}
5659

5760
getServer(): WebSocketServer {

tests/services/_public/user-public/login.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import request from 'supertest'
22
import UserFactory from '../../../fixtures/UserFactory'
33
import { differenceInMinutes, sub } from 'date-fns'
4+
import createOrganisationAndGame from '../../../utils/createOrganisationAndGame'
45

56
describe('User public service - login', () => {
67
it('should let a user login', async () => {
7-
const user = await new UserFactory().loginable().one()
8-
user.lastSeenAt = new Date(2020, 1, 1)
8+
const [organisation] = await createOrganisationAndGame()
9+
const user = await new UserFactory().loginable().state(() => ({
10+
organisation,
11+
lastSeenAt: new Date(2020, 1, 1)
12+
})).one()
913
await em.persistAndFlush(user)
1014

1115
const res = await request(app)
@@ -16,7 +20,7 @@ describe('User public service - login', () => {
1620
expect(res.body.accessToken).toBeTruthy()
1721
expect(res.body.user).toBeTruthy()
1822
expect(res.body.user.organisation).toBeTruthy()
19-
expect(res.body.user.organisation.games).toEqual([])
23+
expect(res.body.user.organisation.games).toHaveLength(1)
2024
expect(new Date(res.body.user.lastSeenAt).getDay()).toEqual(new Date().getDay())
2125
})
2226

tests/services/_public/user-public/refresh.test.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import request from 'supertest'
22
import UserSession from '../../../../src/entities/user-session'
33
import UserFactory from '../../../fixtures/UserFactory'
4+
import createOrganisationAndGame from '../../../utils/createOrganisationAndGame'
45

56
describe('User public service - refresh', () => {
67
it('should let a user refresh their session if they have one', async () => {
7-
const user = await new UserFactory().one()
8-
user.lastSeenAt = new Date(2020, 1, 1)
8+
const [organisation] = await createOrganisationAndGame()
9+
const user = await new UserFactory().state(() => ({
10+
organisation,
11+
lastSeenAt: new Date(2020, 1, 1)
12+
})).one()
913
const session = new UserSession(user)
1014
await em.persistAndFlush(session)
1115

@@ -17,7 +21,7 @@ describe('User public service - refresh', () => {
1721
expect(res.body.accessToken).toBeTruthy()
1822
expect(res.body.user).toBeTruthy()
1923
expect(res.body.user.organisation).toBeTruthy()
20-
expect(res.body.user.organisation.games).toEqual([])
24+
expect(res.body.user.organisation.games).toHaveLength(1)
2125

2226
expect(new Date(res.body.user.lastSeenAt).getDay()).toEqual(new Date().getDay())
2327
})

tests/services/_public/user-public/use-recovery-code.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import createUserAndToken from '../../../utils/createUserAndToken'
55
import UserTwoFactorAuth from '../../../../src/entities/user-two-factor-auth'
66
import User from '../../../../src/entities/user'
77
import generateRecoveryCodes from '../../../../src/lib/auth/generateRecoveryCodes'
8+
import createOrganisationAndGame from '../../../utils/createOrganisationAndGame'
89

910
async function setTwoFactorAuthSession(user: User) {
1011
await redis.set(`2fa:${user.id}`, 'true')
@@ -15,9 +16,10 @@ async function removeTwoFactorAuthSession(user: User) {
1516
}
1617

1718
async function createUserWithTwoFactorAuth(em: EntityManager): Promise<[string, User]> {
19+
const [organisation] = await createOrganisationAndGame()
1820
const [token, user] = await createUserAndToken({
1921
twoFactorAuth: new UserTwoFactorAuth('blah')
20-
})
22+
}, organisation)
2123

2224
user.twoFactorAuth!.enabled = true
2325
user.recoveryCodes = new Collection<UserRecoveryCode>(user, generateRecoveryCodes(user))
@@ -39,7 +41,7 @@ describe('User public service - use recovery code', () => {
3941

4042
expect(res.body.user).toBeTruthy()
4143
expect(res.body.user.organisation).toBeTruthy()
42-
expect(res.body.user.organisation.games).toEqual([])
44+
expect(res.body.user.organisation.games).toHaveLength(1)
4345

4446
expect(res.body.accessToken).toBeTruthy()
4547
expect(res.body.newRecoveryCodes).toBeUndefined()

0 commit comments

Comments
 (0)