Skip to content

Commit c08f7ed

Browse files
refactor(js client): avoid allocating new arrays when converting dates (#395)
1 parent 9024bc9 commit c08f7ed

File tree

5 files changed

+117
-101
lines changed

5 files changed

+117
-101
lines changed

clients/javascript/lib/accountClient.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { AccountResponse } from './gen_types/AccountResponse'
77
import type { AddAccountIntegrationRequestBody } from './gen_types/AddAccountIntegrationRequestBody'
88
import type { CreateAccountRequestBody } from './gen_types/CreateAccountRequestBody'
99
import type { CreateAccountResponseBody } from './gen_types/CreateAccountResponseBody'
10-
import { convertEventDates } from './helpers/datesConverters'
10+
import { replaceEventStringsToDates } from './helpers/datesConverters'
1111

1212
const ACCOUNT_SEARCH_EVENTS_ENDPOINT = '/account/events/search'
1313

@@ -92,8 +92,10 @@ export class NitteiAccountClient extends NitteiBaseClient {
9292
params
9393
)
9494

95-
return {
96-
events: res.events.map(convertEventDates),
95+
for (const event of res.events) {
96+
replaceEventStringsToDates(event)
9797
}
98+
99+
return res
98100
}
99101
}

clients/javascript/lib/calendarClient.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import type { OutlookCalendarAccessRole } from './gen_types/OutlookCalendarAcces
1515
import type { RemoveSyncCalendarPathParams } from './gen_types/RemoveSyncCalendarPathParams'
1616
import type { RemoveSyncCalendarRequestBody } from './gen_types/RemoveSyncCalendarRequestBody'
1717
import {
18-
convertEventDates,
19-
convertInstanceDates,
18+
replaceEventStringsToDates,
19+
replaceInstanceStringsToDates,
2020
} from './helpers/datesConverters'
2121

2222
/**
@@ -173,13 +173,14 @@ export class NitteiCalendarClient extends NitteiBaseClient {
173173
}
174174
)
175175

176-
return {
177-
calendar: res.calendar,
178-
events: res.events?.map(event => ({
179-
event: convertEventDates(event.event),
180-
instances: event.instances?.map(convertInstanceDates),
181-
})),
176+
for (const event of res.events) {
177+
replaceEventStringsToDates(event.event)
178+
for (const instance of event.instances) {
179+
replaceInstanceStringsToDates(instance)
180+
}
182181
}
182+
183+
return res
183184
}
184185

185186
/**
@@ -311,12 +312,13 @@ export class NitteiCalendarUserClient extends NitteiBaseClient {
311312
}
312313
)
313314

314-
return {
315-
calendar: res.calendar,
316-
events: res.events.map(event => ({
317-
event: convertEventDates(event.event),
318-
instances: event.instances.map(convertInstanceDates),
319-
})),
315+
for (const event of res.events) {
316+
replaceEventStringsToDates(event.event)
317+
for (const instance of event.instances) {
318+
replaceInstanceStringsToDates(instance)
319+
}
320320
}
321+
322+
return res
321323
}
322324
}

clients/javascript/lib/eventClient.ts

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import type { GetEventInstancesAPIResponse } from './gen_types/GetEventInstances
1616
import type { ID } from './gen_types/ID'
1717
import type { UpdateEventRequestBody } from './gen_types/UpdateEventRequestBody'
1818
import {
19-
convertEventDates,
20-
convertInstanceDates,
19+
replaceEventStringsToDates,
20+
replaceInstanceStringsToDates,
2121
} from './helpers/datesConverters'
2222

2323
/**
@@ -49,10 +49,9 @@ export class NitteiEventClient extends NitteiBaseClient {
4949
`/user/events/${eventId}`,
5050
data
5151
)
52+
replaceEventStringsToDates(res.event)
5253

53-
return {
54-
event: convertEventDates(res.event),
55-
}
54+
return res
5655
}
5756

5857
/**
@@ -70,9 +69,9 @@ export class NitteiEventClient extends NitteiBaseClient {
7069
data
7170
)
7271

73-
return {
74-
event: convertEventDates(res.event),
75-
}
72+
replaceEventStringsToDates(res.event)
73+
74+
return res
7675
}
7776

7877
/**
@@ -91,9 +90,11 @@ export class NitteiEventClient extends NitteiBaseClient {
9190
data
9291
)
9392

94-
return {
95-
events: res.events.map(convertEventDates),
93+
for (const event of res.events) {
94+
replaceEventStringsToDates(event)
9695
}
96+
97+
return res
9798
}
9899

99100
/**
@@ -104,9 +105,9 @@ export class NitteiEventClient extends NitteiBaseClient {
104105
public async getById(eventId: ID): Promise<CalendarEventResponse> {
105106
const res = await this.get<CalendarEventResponse>(`/user/events/${eventId}`)
106107

107-
return {
108-
event: convertEventDates(res.event),
109-
}
108+
replaceEventStringsToDates(res.event)
109+
110+
return res
110111
}
111112

112113
/**
@@ -123,9 +124,11 @@ export class NitteiEventClient extends NitteiBaseClient {
123124
`/user/events/external_id/${externalId}`
124125
)
125126

126-
return {
127-
events: res.events.map(convertEventDates),
127+
for (const event of res.events) {
128+
replaceEventStringsToDates(event)
128129
}
130+
131+
return res
129132
}
130133

131134
/**
@@ -142,9 +145,11 @@ export class NitteiEventClient extends NitteiBaseClient {
142145
options
143146
)
144147

145-
return {
146-
events: res.events.map(convertEventDates),
148+
for (const event of res.events) {
149+
replaceEventStringsToDates(event)
147150
}
151+
152+
return res
148153
}
149154

150155
/**
@@ -162,12 +167,14 @@ export class NitteiEventClient extends NitteiBaseClient {
162167
body
163168
)
164169

165-
return {
166-
events: res.events.map(e => ({
167-
event: convertEventDates(e.event),
168-
instances: e.instances.map(convertInstanceDates),
169-
})),
170+
for (const event of res.events) {
171+
replaceEventStringsToDates(event.event)
172+
for (const instance of event.instances) {
173+
replaceInstanceStringsToDates(instance)
174+
}
170175
}
176+
177+
return res
171178
}
172179

173180
public async findByMeta(
@@ -185,9 +192,11 @@ export class NitteiEventClient extends NitteiBaseClient {
185192
value: meta.value,
186193
})
187194

188-
return {
189-
events: res.events.map(convertEventDates),
195+
for (const event of res.events) {
196+
replaceEventStringsToDates(event)
190197
}
198+
199+
return res
191200
}
192201

193202
public async remove(eventId: ID) {
@@ -216,10 +225,12 @@ export class NitteiEventClient extends NitteiBaseClient {
216225
}
217226
)
218227

219-
return {
220-
event: convertEventDates(res.event),
221-
instances: res.instances.map(convertInstanceDates),
228+
replaceEventStringsToDates(res.event)
229+
for (const instance of res.instances) {
230+
replaceInstanceStringsToDates(instance)
222231
}
232+
233+
return res
223234
}
224235
}
225236

@@ -243,9 +254,9 @@ export class NitteiEventUserClient extends NitteiBaseClient {
243254
data
244255
)
245256

246-
return {
247-
event: convertEventDates(res.event),
248-
}
257+
replaceEventStringsToDates(res.event)
258+
259+
return res
249260
}
250261

251262
/**
@@ -263,27 +274,27 @@ export class NitteiEventUserClient extends NitteiBaseClient {
263274
data
264275
)
265276

266-
return {
267-
event: convertEventDates(res.event),
268-
}
277+
replaceEventStringsToDates(res.event)
278+
279+
return res
269280
}
270281

271282
public async create(
272283
data: CreateEventRequestBody
273284
): Promise<CalendarEventResponse> {
274285
const res = await this.post<CalendarEventResponse>('/events', data)
275286

276-
return {
277-
event: convertEventDates(res.event),
278-
}
287+
replaceEventStringsToDates(res.event)
288+
289+
return res
279290
}
280291

281292
public async findById(eventId: ID): Promise<CalendarEventResponse> {
282293
const res = await this.get<CalendarEventResponse>(`/events/${eventId}`)
283294

284-
return {
285-
event: convertEventDates(res.event),
286-
}
295+
replaceEventStringsToDates(res.event)
296+
297+
return res
287298
}
288299

289300
public async remove(eventId: ID) {
@@ -302,9 +313,11 @@ export class NitteiEventUserClient extends NitteiBaseClient {
302313
}
303314
)
304315

305-
return {
306-
event: convertEventDates(res.event),
307-
instances: res.instances.map(convertInstanceDates),
316+
replaceEventStringsToDates(res.event)
317+
for (const instance of res.instances) {
318+
replaceInstanceStringsToDates(instance)
308319
}
320+
321+
return res
309322
}
310323
}

clients/javascript/lib/helpers/datesConverters.ts

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,37 @@ import type { CalendarEventDTO } from '../gen_types/CalendarEventDTO'
22
import type { EventInstance } from '../gen_types/EventInstance'
33

44
/**
5-
* Convert the dates inside an event to Date objects
6-
* @param event - event to convert
7-
* @returns event with dates converted to Date objects
5+
* Change in place the dates inside an event to Date objects
6+
* @param event - event to change in place
7+
* @returns nothing
88
*/
9-
export function convertEventDates(event: CalendarEventDTO): CalendarEventDTO {
9+
export function replaceEventStringsToDates(event: CalendarEventDTO): void {
1010
if (!event) {
11-
return event
12-
}
13-
return {
14-
...event,
15-
startTime: new Date(event.startTime),
16-
endTime: new Date(event.endTime),
17-
created: new Date(event.created),
18-
updated: new Date(event.updated),
19-
originalStartTime: event.originalStartTime
20-
? new Date(event.originalStartTime)
21-
: event.originalStartTime,
22-
recurringUntil: event.recurringUntil
23-
? new Date(event.recurringUntil)
24-
: event.recurringUntil,
25-
exdates: event.exdates?.map(date => new Date(date)),
11+
return
2612
}
13+
14+
event.startTime = new Date(event.startTime)
15+
event.endTime = new Date(event.endTime)
16+
event.created = new Date(event.created)
17+
event.updated = new Date(event.updated)
18+
event.originalStartTime = event.originalStartTime
19+
? new Date(event.originalStartTime)
20+
: event.originalStartTime
21+
event.recurringUntil = event.recurringUntil
22+
? new Date(event.recurringUntil)
23+
: event.recurringUntil
24+
event.exdates = event.exdates?.map(date => new Date(date))
2725
}
2826

2927
/**
30-
* Convert the dates inside an instance to Date objects
31-
* @param instance - instance to convert
32-
* @returns instance with dates converted to Date objects
28+
* Change in place the dates inside an instance to Date objects
29+
* @param instance - instance to change in place
30+
* @returns nothing
3331
*/
34-
export function convertInstanceDates(instance: EventInstance): EventInstance {
32+
export function replaceInstanceStringsToDates(instance: EventInstance): void {
3533
if (!instance) {
36-
return instance
37-
}
38-
return {
39-
...instance,
40-
startTime: new Date(instance.startTime),
41-
endTime: new Date(instance.endTime),
34+
return
4235
}
36+
instance.startTime = new Date(instance.startTime)
37+
instance.endTime = new Date(instance.endTime)
4338
}

0 commit comments

Comments
 (0)