Skip to content

Commit

Permalink
more control from server
Browse files Browse the repository at this point in the history
  • Loading branch information
pauldambra committed Nov 13, 2023
1 parent 84b073b commit 7f3bb46
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 10 deletions.
30 changes: 27 additions & 3 deletions src/__tests__/extensions/replay/config.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,32 @@ import { buildNetworkRequestOptions } from '../../../extensions/replay/config'
describe('config', () => {
describe('network request options', () => {
describe('maskRequestFn', () => {
it('can enable header recording remotely', () => {
const networkOptions = buildNetworkRequestOptions(defaultConfig(), { recordHeaders: true })
expect(networkOptions.recordHeaders).toBe(true)
expect(networkOptions.recordBody).toBe(undefined)
})

it('can enable body recording remotely', () => {
const networkOptions = buildNetworkRequestOptions(defaultConfig(), { recordBody: true })
expect(networkOptions.recordHeaders).toBe(undefined)
expect(networkOptions.recordBody).toBe(true)
})

it('client can force disable recording', () => {
const posthogConfig = defaultConfig()
posthogConfig.session_recording.recordHeaders = false
posthogConfig.session_recording.recordBody = false
const networkOptions = buildNetworkRequestOptions(posthogConfig, {
recordHeaders: true,
recordBody: true,
})
expect(networkOptions.recordHeaders).toBe(false)
expect(networkOptions.recordBody).toBe(false)
})

it('should remove the Authorization header from requests even if no other config is set', () => {
const networkOptions = buildNetworkRequestOptions(defaultConfig())
const networkOptions = buildNetworkRequestOptions(defaultConfig(), {})
const cleaned = networkOptions.maskRequestFn!({
url: 'something',
requestHeaders: {
Expand All @@ -19,7 +43,7 @@ describe('config', () => {
})

it('should cope with no headers when even if no other config is set', () => {
const networkOptions = buildNetworkRequestOptions(defaultConfig())
const networkOptions = buildNetworkRequestOptions(defaultConfig(), {})
const cleaned = networkOptions.maskRequestFn!({
url: 'something',
requestHeaders: undefined,
Expand All @@ -38,7 +62,7 @@ describe('config', () => {
},
}
}
const networkOptions = buildNetworkRequestOptions(posthogConfig)
const networkOptions = buildNetworkRequestOptions(posthogConfig, {})

const cleaned = networkOptions.maskRequestFn!({
url: 'something',
Expand Down
11 changes: 10 additions & 1 deletion src/extensions/replay/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,15 @@ const removeAuthorizationHeader = (data: NetworkRequest): NetworkRequest => {
* we _never_ want to record that header by accident
* if someone complains then we'll add an opt-in to let them override it
*/
export const buildNetworkRequestOptions = (instanceConfig: PostHogConfig): NetworkRecordOptions => {
export const buildNetworkRequestOptions = (
instanceConfig: PostHogConfig,
remoteNetworkOptions: Pick<NetworkRecordOptions, 'recordHeaders' | 'recordBody'>
): NetworkRecordOptions => {
const config = instanceConfig.session_recording as NetworkRecordOptions
// client can always disable despite remote options
const canRecordHeaders = config.recordHeaders === false ? false : remoteNetworkOptions.recordHeaders
const canRecordBody = config.recordBody === false ? false : remoteNetworkOptions.recordBody

config.maskRequestFn = _isFunction(instanceConfig.session_recording.maskNetworkRequestFn)
? (data) => {
const cleanedRequest = removeAuthorizationHeader(data)
Expand All @@ -58,5 +65,7 @@ export const buildNetworkRequestOptions = (instanceConfig: PostHogConfig): Netwo
return {
...defaultNetworkOptions,
...config,
recordHeaders: canRecordHeaders,
recordBody: canRecordBody,
}
}
13 changes: 8 additions & 5 deletions src/extensions/replay/sessionrecording.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
truncateLargeConsoleLogs,
} from './sessionrecording-utils'
import { PostHog } from '../../posthog-core'
import { DecideResponse, NetworkRequest, Properties } from '../../types'
import { DecideResponse, NetworkRecordOptions, NetworkRequest, Properties } from '../../types'
import { EventType, type eventWithTime, type listenerHandler } from '@rrweb/types'
import Config from '../../config'
import { _timestamp, loadScript } from '../../utils'
Expand Down Expand Up @@ -92,7 +92,7 @@ export class SessionRecording {
private receivedDecide: boolean
private rrwebRecord: rrwebRecord | undefined
private isIdle = false
private _captureNetworkPayloads: boolean | undefined
private _captureNetworkPayloads: Pick<NetworkRecordOptions, 'recordHeaders' | 'recordBody'> | undefined = undefined

private _linkedFlagSeen: boolean = false
private _lastActivityTimestamp: number = Date.now()
Expand Down Expand Up @@ -255,8 +255,7 @@ export class SessionRecording {
})
}

this._captureNetworkPayloads =
response.capturePerformance && response.sessionRecording?.networkPayloadCaptureEnabled
this._captureNetworkPayloads = response.sessionRecording?.networkPayloadCaptureEnabled

const receivedSampleRate = response.sessionRecording?.sampleRate
this._sampleRate =
Expand Down Expand Up @@ -475,7 +474,11 @@ export class SessionRecording {
}
if (this._captureNetworkPayloads) {
if (_isFunction((window as any).getRecordNetworkPlugin)) {
plugins.push((window as any).getRecordNetworkPlugin(buildNetworkRequestOptions(this.instance.config)))
plugins.push(
(window as any).getRecordNetworkPlugin(
buildNetworkRequestOptions(this.instance.config, this._captureNetworkPayloads)
)
)
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ export interface DecideResponse {
sampleRate?: string | null
minimumDurationMilliseconds?: number
linkedFlag?: string | null
networkPayloadCaptureEnabled?: boolean
networkPayloadCaptureEnabled?: Pick<NetworkRecordOptions, 'recordBody' | 'recordHeaders'>
}
surveys?: boolean
toolbarParams: ToolbarParams
Expand Down

0 comments on commit 7f3bb46

Please sign in to comment.