Skip to content

Commit bbf89bf

Browse files
committed
refactor: convert listen and splitData functions to use object parameters
1 parent 23eae51 commit bbf89bf

File tree

5 files changed

+55
-37
lines changed

5 files changed

+55
-37
lines changed

backend/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ server.listen(port, () => {
9494
logger.debug(`🚀 Server is running on port ${port}`)
9595
console.log(`🚀 Server is running on port ${port}`)
9696
})
97-
webSocketListen(server, '/ws')
97+
webSocketListen({ server, path: '/ws' })
9898

9999
let shutdownInProgress = false
100100
// Graceful shutdown handler for both SIGTERM and SIGINT

backend/src/util/__tests__/split-data.test.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ import { splitData } from '../split-data'
44

55
describe('splitData - base cases', () => {
66
it('returns primitive as-is in an array', () => {
7-
expect(splitData(42)).toEqual([42])
8-
expect(splitData('hello')).toEqual(['hello'])
9-
expect(splitData(null)).toEqual([null])
10-
expect(splitData(undefined)).toEqual([undefined])
7+
expect(splitData({ data: 42 })).toEqual([42])
8+
expect(splitData({ data: 'hello' })).toEqual(['hello'])
9+
expect(splitData({ data: null })).toEqual([null])
10+
expect(splitData({ data: undefined })).toEqual([undefined])
1111
})
1212

1313
it('returns non-plain objects as-is', () => {
1414
const date = new Date()
1515
const regex = /abc/
1616

17-
expect(splitData(date)).toEqual([date])
18-
expect(splitData(regex)).toEqual([regex])
17+
expect(splitData({ data: date })).toEqual([date])
18+
expect(splitData({ data: regex })).toEqual([regex])
1919
})
2020

2121
it('splits short strings when maxChunkSize is small', () => {
2222
const input = { msg: 'abcdef'.repeat(10) } // 60 chars
2323

24-
const chunks = splitData(input, 30)
24+
const chunks = splitData({ data: input, maxChunkSize: 30 })
2525

2626
expect(chunks.length).toBeGreaterThan(1)
2727
const combined = chunks.map((c) => c.msg).join('')
@@ -32,7 +32,7 @@ describe('splitData - base cases', () => {
3232
it('splits deeply nested strings with small maxChunkSize', () => {
3333
const input = { a: { b: { c: 'xyz123'.repeat(10) } } }
3434

35-
const chunks = splitData(input, 50)
35+
const chunks = splitData({ data: input, maxChunkSize: 50 })
3636

3737
expect(chunks.length).toBeGreaterThan(1)
3838
const reconstructed = chunks.map((c) => c.a?.b?.c ?? '').join('')
@@ -41,7 +41,7 @@ describe('splitData - base cases', () => {
4141

4242
it('handles arrays with long values', () => {
4343
const input = ['abcde'.repeat(5), '12345'.repeat(5)]
44-
const chunks = splitData(input, 40)
44+
const chunks = splitData({ data: input, maxChunkSize: 40 })
4545

4646
const combined = chunks
4747
.flat()
@@ -60,7 +60,7 @@ describe('splitData - base cases', () => {
6060
str: 'hello world'.repeat(5),
6161
}
6262

63-
const chunks = splitData(input, 50)
63+
const chunks = splitData({ data: input, maxChunkSize: 50 })
6464

6565
expect(chunks.length).toBeGreaterThan(1)
6666
expect(chunks.every((c) => JSON.stringify(c).length <= 50)).toBe(true)
@@ -74,7 +74,7 @@ describe('splitData - base cases', () => {
7474
a: 'A'.repeat(20),
7575
b: 'B'.repeat(20),
7676
}
77-
const chunks = splitData(input, 30)
77+
const chunks = splitData({ data: input, maxChunkSize: 30 })
7878

7979
expect(chunks.length).toBeGreaterThan(1)
8080

@@ -89,7 +89,7 @@ describe('splitData - base cases', () => {
8989
describe('splitData - array and string-specific splitting', () => {
9090
it('splits long strings into smaller string chunks', () => {
9191
const input = '12345678901234567890'
92-
const chunks = splitData(input, 5)
92+
const chunks = splitData({ data: input, maxChunkSize: 5 })
9393

9494
expect(Array.isArray(chunks)).toBe(true)
9595
chunks.forEach((chunk) => {
@@ -103,7 +103,7 @@ describe('splitData - array and string-specific splitting', () => {
103103
it('splits arrays into smaller arrays with sliced strings', () => {
104104
const input = ['1', '2', '3333333333', '4', '5']
105105
const maxSize = 15
106-
const chunks = splitData(input, maxSize)
106+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
107107

108108
expect(Array.isArray(chunks)).toBe(true)
109109
chunks.forEach((chunk) => {
@@ -121,7 +121,7 @@ describe('splitData - array and string-specific splitting', () => {
121121
b: 'bbb'.repeat(10),
122122
}
123123
const maxSize = 40
124-
const chunks = splitData(input, maxSize)
124+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
125125

126126
expect(Array.isArray(chunks)).toBe(true)
127127
chunks.forEach((chunk) => {
@@ -139,7 +139,7 @@ describe('splitData - array and string-specific splitting', () => {
139139
const input = ['x'.repeat(20), 123, false, 'y'.repeat(10)]
140140
const maxSize = 20
141141

142-
const chunks = splitData(input, maxSize)
142+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
143143

144144
expect(Array.isArray(chunks)).toBe(true)
145145
chunks.forEach((chunk) => {
@@ -162,7 +162,7 @@ describe('splitData - array and string-specific splitting', () => {
162162
]
163163
const maxSize = 30
164164

165-
const chunks = splitData(input, maxSize)
165+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
166166

167167
expect(Array.isArray(chunks)).toBe(true)
168168
chunks.forEach((chunk) => {
@@ -192,7 +192,7 @@ describe('splitData - array and string-specific splitting', () => {
192192
]
193193
const maxSize = 50
194194

195-
const chunks = splitData(input, maxSize)
195+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
196196

197197
expect(chunks).toEqual([
198198
['short', 'strings', 'that', 'can', 'fit', 'together'],
@@ -220,7 +220,7 @@ describe('splitData - array and string-specific splitting', () => {
220220
}
221221
const maxSize = 75
222222

223-
const chunks = splitData(input, maxSize)
223+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
224224

225225
expect(chunks).toEqual([
226226
{
@@ -244,7 +244,7 @@ describe('splitData - array and string-specific splitting', () => {
244244
const input = 'testing"testing'
245245
const maxSize = 10
246246

247-
const chunks = splitData(input, maxSize)
247+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
248248

249249
expect(chunks).toEqual([
250250
'testing', // only length 9, but testing" would be 11
@@ -269,7 +269,7 @@ describe('splitData - nested object splitting', () => {
269269
}
270270
const maxSize = 50
271271

272-
const chunks = splitData(input, maxSize)
272+
const chunks = splitData({ data: input, maxChunkSize: maxSize })
273273

274274
expect(chunks).toEqual([
275275
{

backend/src/util/logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function splitAndLog(
7676
const availableDataLimit = MAX_LENGTH - BUFFER - formattedMsg.length
7777

7878
// split data recursively into chunks small enough to log
79-
const processedData: any[] = splitData(data, availableDataLimit)
79+
const processedData: any[] = splitData({ data, maxChunkSize: availableDataLimit })
8080

8181
if (processedData.length === 1) {
8282
pinoLogger[level](processedData[0], msg, ...args)

backend/src/util/split-data.ts

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ function getJsonSize(data: any): number {
2121
return size
2222
}
2323

24-
function splitString(data: string, maxSize: number): Chunk<string>[] {
24+
function splitString(params: {
25+
data: string
26+
maxSize: number
27+
}): Chunk<string>[] {
28+
const { data, maxSize } = params
2529
if (data === '') {
2630
return [{ data: '', length: 2 }]
2731
}
@@ -62,7 +66,11 @@ function splitString(data: string, maxSize: number): Chunk<string>[] {
6266
return chunks
6367
}
6468

65-
function splitObject(obj: PlainObject, maxSize: number): Chunk<PlainObject>[] {
69+
function splitObject(params: {
70+
obj: PlainObject
71+
maxSize: number
72+
}): Chunk<PlainObject>[] {
73+
const { obj, maxSize } = params
6674
const chunks: Chunk<PlainObject>[] = []
6775

6876
let currentChunk: Chunk<PlainObject> = {
@@ -79,10 +87,10 @@ function splitObject(obj: PlainObject, maxSize: number): Chunk<PlainObject>[] {
7987
if (standaloneEntry.length > maxSize) {
8088
const overhead = getJsonSize({ [key]: '' }) - 2
8189

82-
const items = splitDataWithLengths(
83-
value,
84-
maxSize - (getJsonSize({ [key]: '' }) - 2),
85-
)
90+
const items = splitDataWithLengths({
91+
data: value,
92+
maxChunkSize: maxSize - (getJsonSize({ [key]: '' }) - 2),
93+
})
8694

8795
for (const [index, item] of items.entries()) {
8896
const itemWithKey: Chunk<any> = {
@@ -147,7 +155,8 @@ function splitObject(obj: PlainObject, maxSize: number): Chunk<PlainObject>[] {
147155
return chunks
148156
}
149157

150-
function splitArray(arr: any[], maxSize: number): Chunk<any[]>[] {
158+
function splitArray(params: { arr: any[]; maxSize: number }): Chunk<any[]>[] {
159+
const { arr, maxSize } = params
151160
const chunks: Chunk<any[]>[] = []
152161
let currentChunk: Chunk<any[]> = { data: [], length: 2 }
153162

@@ -163,7 +172,7 @@ function splitArray(arr: any[], maxSize: number): Chunk<any[]>[] {
163172
chunks.push(currentChunk)
164173
}
165174

166-
const items = splitDataWithLengths(element, maxSize - 2)
175+
const items = splitDataWithLengths({ data: element, maxChunkSize: maxSize - 2 })
167176

168177
for (const [index, item] of items.entries()) {
169178
if (index < items.length - 1) {
@@ -211,11 +220,15 @@ function splitArray(arr: any[], maxSize: number): Chunk<any[]>[] {
211220
return chunks
212221
}
213222

214-
function splitDataWithLengths(data: any, maxChunkSize: number): Chunk<any>[] {
223+
function splitDataWithLengths(params: {
224+
data: any
225+
maxChunkSize: number
226+
}): Chunk<any>[] {
227+
const { data, maxChunkSize } = params
215228
// Handle primitives
216229
if (typeof data !== 'object' || data === null) {
217230
if (typeof data === 'string') {
218-
const result = splitString(data, maxChunkSize)
231+
const result = splitString({ data, maxSize: maxChunkSize })
219232
return result
220233
}
221234
return [{ data, length: getJsonSize(data) }]
@@ -228,15 +241,19 @@ function splitDataWithLengths(data: any, maxChunkSize: number): Chunk<any>[] {
228241

229242
// Arrays
230243
if (Array.isArray(data)) {
231-
const result = splitArray(data, maxChunkSize)
244+
const result = splitArray({ arr: data, maxSize: maxChunkSize })
232245
return result
233246
}
234247

235248
// Plain objects
236-
const result = splitObject(data, maxChunkSize)
249+
const result = splitObject({ obj: data, maxSize: maxChunkSize })
237250
return result
238251
}
239252

240-
export function splitData(data: any, maxChunkSize: number = 99_000): any[] {
241-
return splitDataWithLengths(data, maxChunkSize).map((cwjl) => cwjl.data)
253+
export function splitData(params: {
254+
data: any
255+
maxChunkSize?: number
256+
}): any[] {
257+
const { data, maxChunkSize = 99_000 } = params
258+
return splitDataWithLengths({ data, maxChunkSize }).map((cwjl) => cwjl.data)
242259
}

backend/src/websockets/server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ async function processMessage(
8080
}
8181
}
8282

83-
export function listen(server: HttpServer, path: string) {
83+
export function listen(params: { server: HttpServer; path: string }) {
84+
const { server, path } = params
8485
const wss = new WebSocketServer({ server, path })
8586
let deadConnectionCleaner: NodeJS.Timeout | undefined
8687
wss.on('listening', () => {

0 commit comments

Comments
 (0)