Skip to content

Commit 90b915a

Browse files
authored
node: add configurable request timeout (#702)
1 parent ef5cd39 commit 90b915a

File tree

12 files changed

+482
-114
lines changed

12 files changed

+482
-114
lines changed

.changeset/empty-pets-behave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@segment/analytics-core': patch
3+
---
4+
5+
EventFactory should filter out option keys with undefined values

packages/core/src/events/__tests__/index.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EventFactory } from '..'
22
import { User } from '../../user'
33
import { CoreSegmentEvent } from '../..'
4+
import { isDate } from 'lodash'
45

56
describe('Event Factory', () => {
67
let factory: EventFactory
@@ -379,4 +380,15 @@ describe('Event Factory', () => {
379380
})
380381
})
381382
})
383+
384+
it('should ignore undefined options', () => {
385+
const event = factory.track(
386+
'Order Completed',
387+
{ ...shoes },
388+
{ timestamp: undefined, traits: { foo: 123 } }
389+
)
390+
391+
expect(typeof event.timestamp).toBe('object')
392+
expect(isDate(event.timestamp)).toBeTruthy()
393+
})
382394
})

packages/core/src/events/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
CoreSegmentEvent,
99
CoreOptions,
1010
} from './interfaces'
11+
import { pickBy } from '../utils/pick'
1112
import { validateEvent } from '../validation/assertions'
1213

1314
interface EventFactorySettings {
@@ -222,6 +223,11 @@ export class EventFactory {
222223
{} as Record<string, boolean>
223224
)
224225

226+
// filter out any undefined options
227+
event.options = pickBy(event.options || {}, (_, value) => {
228+
return value !== undefined
229+
})
230+
225231
// This is pretty trippy, but here's what's going on:
226232
// - a) We don't pass initial integration options as part of the event, only if they're true or false
227233
// - b) We do accept per integration overrides (like integrations.Amplitude.sessionId) at the event level

packages/core/src/utils/pick.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export const pickBy = <T, K extends keyof T>(
2+
obj: T,
3+
fn: (key: K, v: T[K]) => boolean
4+
) => {
5+
return (Object.keys(obj) as K[])
6+
.filter((k) => fn(k, obj[k]))
7+
.reduce((acc, key) => ((acc[key] = obj[key]), acc), {} as Partial<T>)
8+
}

packages/node/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
},
4141
"devDependencies": {
4242
"@internal/config": "0.0.0",
43-
"@types/node": "^14"
43+
"@types/node": "^14",
44+
"nock": "^13.2.9"
4445
},
4546
"packageManager": "yarn@3.2.1"
4647
}

0 commit comments

Comments
 (0)