Skip to content

Commit

Permalink
Allow collecting signals even if edge function is not defined. (#1112)
Browse files Browse the repository at this point in the history
  • Loading branch information
silesky authored Jul 18, 2024
1 parent 44b5d06 commit 1f68f0e
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/yellow-camels-kiss.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@segment/analytics-signals': patch
---

Allow collecting signals from sources without an edge function written yet
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { SandboxSettings, SandboxSettingsConfig } from '../sandbox'

describe(SandboxSettings, () => {
const edgeFnResponseBody = `function processSignal() { console.log('hello world') }`
const baseSettings: SandboxSettingsConfig = {
functionHost: undefined,
processSignal: undefined,
edgeFnDownloadURL: 'http://example.com/download',
edgeFnFetchClient: jest.fn().mockReturnValue(
Promise.resolve({
text: () => edgeFnResponseBody,
})
),
}
test('initializes with provided settings', async () => {
const sandboxSettings = new SandboxSettings({ ...baseSettings })
expect(baseSettings.edgeFnFetchClient).toHaveBeenCalledWith(
baseSettings.edgeFnDownloadURL
)
expect(await sandboxSettings.processSignal).toEqual(edgeFnResponseBody)
})

test('normalizes edgeFnDownloadURL when functionHost is provided', async () => {
const settings: SandboxSettingsConfig = {
...baseSettings,
processSignal: undefined,
functionHost: 'newHost.com',
edgeFnDownloadURL: 'https://original.com/download',
}
new SandboxSettings(settings)
expect(baseSettings.edgeFnFetchClient).toHaveBeenCalledWith(
'https://newHost.com/download'
)
})

test('creates default processSignal when parameters are missing', async () => {
const consoleWarnSpy = jest
.spyOn(console, 'warn')
.mockImplementation(() => {})
const settings: SandboxSettingsConfig = {
...baseSettings,
processSignal: undefined,
edgeFnDownloadURL: undefined,
}
const sandboxSettings = new SandboxSettings(settings)
expect(await sandboxSettings.processSignal).toEqual(
'globalThis.processSignal = function processSignal() {}'
)
expect(baseSettings.edgeFnFetchClient).not.toHaveBeenCalled()
expect(consoleWarnSpy).toHaveBeenCalledWith(
expect.stringContaining('processSignal')
)
})
})
9 changes: 8 additions & 1 deletion packages/signals/signals/src/core/processor/sandbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,14 @@ export class SandboxSettings {
: settings.edgeFnDownloadURL

if (!edgeFnDownloadURLNormalized && !settings.processSignal) {
throw new Error('edgeFnDownloadURL or processSignal must be defined')
// user may be onboarding and not have written a signal -- so do a noop so we can collect signals
this.processSignal = Promise.resolve(
`globalThis.processSignal = function processSignal() {}`
)
console.warn(
`No processSignal function found. Have you written a processSignal function on app.segment.com?`
)
return
}

const fetch = settings.edgeFnFetchClient ?? globalThis.fetch
Expand Down

0 comments on commit 1f68f0e

Please sign in to comment.