From e6761ed19c18410a8a1357694d7c069d43757e7c Mon Sep 17 00:00:00 2001 From: Paul D'Ambra Date: Sat, 2 Nov 2024 13:29:27 +0100 Subject: [PATCH] feat: allowd decide to provide script name for recorder --- .../extensions/replay/sessionrecording.test.ts | 9 +++++++++ src/constants.ts | 1 + src/extensions/replay/sessionrecording.ts | 13 +++++++++++-- src/types.ts | 1 + 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/__tests__/extensions/replay/sessionrecording.test.ts b/src/__tests__/extensions/replay/sessionrecording.test.ts index 5ec402e08..9cbdb0a36 100644 --- a/src/__tests__/extensions/replay/sessionrecording.test.ts +++ b/src/__tests__/extensions/replay/sessionrecording.test.ts @@ -475,6 +475,15 @@ describe('SessionRecording', () => { jest.spyOn(sessionRecording, 'startIfEnabledOrStop') }) + it('loads script based on script config', () => { + sessionRecording.afterDecideResponse( + makeDecideResponse({ + sessionRecording: { endpoint: '/s/', scriptConfig: { script: 'experimental-recorder' } }, + }) + ) + expect(loadScriptMock).toHaveBeenCalledWith(posthog, 'experimental-recorder', expect.any(Function)) + }) + it('when the first event is a meta it does not take a manual full snapshot', () => { sessionRecording.startIfEnabledOrStop() expect(loadScriptMock).toHaveBeenCalled() diff --git a/src/constants.ts b/src/constants.ts index b13f15d58..a1b50bf1b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -23,6 +23,7 @@ export const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_net export const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording' export const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate' export const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration' +export const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config' export const SESSION_ID = '$sesid' export const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled' export const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session' diff --git a/src/extensions/replay/sessionrecording.ts b/src/extensions/replay/sessionrecording.ts index f46b64d8f..6a480e4a8 100644 --- a/src/extensions/replay/sessionrecording.ts +++ b/src/extensions/replay/sessionrecording.ts @@ -6,6 +6,7 @@ import { SESSION_RECORDING_MINIMUM_DURATION, SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE, SESSION_RECORDING_SAMPLE_RATE, + SESSION_RECORDING_SCRIPT_CONFIG, SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION, SESSION_RECORDING_URL_TRIGGER_STATUS, } from '../../constants' @@ -37,7 +38,7 @@ import { import { isBoolean, isFunction, isNullish, isNumber, isObject, isString, isUndefined } from '../../utils/type-utils' import { logger } from '../../utils/logger' -import { assignableWindow, document, window } from '../../utils/globals' +import { assignableWindow, document, PostHogExtensionKind, window } from '../../utils/globals' import { buildNetworkRequestOptions } from './config' import { isLocalhost } from '../../utils/request-utils' import { MutationRateLimiter } from './mutation-rate-limiter' @@ -660,6 +661,7 @@ export class SessionRecording { [SESSION_RECORDING_MINIMUM_DURATION]: isUndefined(receivedMinimumDuration) ? null : receivedMinimumDuration, + [SESSION_RECORDING_SCRIPT_CONFIG]: response.sessionRecording?.scriptConfig, }) } @@ -716,7 +718,7 @@ export class SessionRecording { // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is // imported), don't load script. Otherwise, remotely import recorder.js from cdn since it hasn't been loaded. if (!this.rrwebRecord) { - assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this.instance, 'recorder', (err) => { + assignableWindow.__PosthogExtensions__?.loadExternalDependency?.(this.instance, this.scriptName, (err) => { if (err) { return logger.error(LOGGER_PREFIX + ` could not load recorder`, err) } @@ -733,6 +735,13 @@ export class SessionRecording { } } + private get scriptName(): PostHogExtensionKind { + return ( + (this.instance?.persistence?.get_property(SESSION_RECORDING_SCRIPT_CONFIG) + ?.script as PostHogExtensionKind) || 'recorder' + ) + } + private isInteractiveEvent(event: eventWithTime) { return ( event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && diff --git a/src/types.ts b/src/types.ts index 0f6c5cfc9..bbeb44803 100644 --- a/src/types.ts +++ b/src/types.ts @@ -428,6 +428,7 @@ export interface DecideResponse { linkedFlag?: string | FlagVariant | null networkPayloadCapture?: Pick urlTriggers?: SessionRecordingUrlTrigger[] + scriptConfig?: { script?: string | undefined } } surveys?: boolean toolbarParams: ToolbarParams