Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
90dba2c
chore: migrate rage clicks to Zen Observable
daniel-graham-amplitude Oct 21, 2025
b86ebcc
chore: fix tests
daniel-graham-amplitude Oct 21, 2025
5a0ed6a
again
daniel-graham-amplitude Oct 21, 2025
0a46b21
add observable.test.ts
daniel-graham-amplitude Oct 21, 2025
83c302b
chore: migrate dead-clicks to zen observable
daniel-graham-amplitude Oct 23, 2025
6eb47ee
again
daniel-graham-amplitude Oct 23, 2025
13c4b14
again
daniel-graham-amplitude Oct 24, 2025
c763b81
again
daniel-graham-amplitude Oct 24, 2025
85b506c
fix premature calculation issue
daniel-graham-amplitude Oct 24, 2025
a7fc4cb
fix issue with unresolved promises
daniel-graham-amplitude Oct 24, 2025
8a47186
lint:fix
daniel-graham-amplitude Oct 24, 2025
31b59ca
again
daniel-graham-amplitude Oct 24, 2025
8837573
Merge branch 'no-ticket-zen-observable' of github.com:amplitude/Ampli…
daniel-graham-amplitude Oct 24, 2025
6c9c1eb
again
daniel-graham-amplitude Oct 24, 2025
4deb9e9
again
daniel-graham-amplitude Oct 24, 2025
7b8e8d3
again
daniel-graham-amplitude Oct 27, 2025
b99fd11
modularize the test
daniel-graham-amplitude Oct 27, 2025
90674ad
again
daniel-graham-amplitude Oct 27, 2025
447ee2c
again
daniel-graham-amplitude Oct 27, 2025
841f1e3
Merge branch 'no-ticket-zen-observable' of github.com:amplitude/Ampli…
daniel-graham-amplitude Oct 28, 2025
133b561
fix tests
daniel-graham-amplitude Oct 29, 2025
da54f95
merge
daniel-graham-amplitude Oct 30, 2025
24b42ea
Merge branch 'zen-observable-migration' of github.com:amplitude/Ampli…
daniel-graham-amplitude Oct 30, 2025
f2cc8b8
fix: test fix
daniel-graham-amplitude Oct 30, 2025
5b8756e
lint fixes
daniel-graham-amplitude Oct 30, 2025
a39f8b4
Update packages/analytics-core/test/utils/observable.test.ts
daniel-graham-amplitude Oct 30, 2025
d9f7e98
Update packages/plugin-autocapture-browser/test/autocapture-plugin/tr…
daniel-graham-amplitude Oct 30, 2025
a009961
Update packages/plugin-autocapture-browser/test/autocapture-plugin/tr…
daniel-graham-amplitude Oct 30, 2025
0761a7c
again
daniel-graham-amplitude Oct 30, 2025
9b6186c
again
daniel-graham-amplitude Oct 30, 2025
759214d
again
daniel-graham-amplitude Oct 30, 2025
cf25cdf
again
daniel-graham-amplitude Oct 30, 2025
d67df59
fix: add multicasting
daniel-graham-amplitude Oct 30, 2025
513f74e
again
daniel-graham-amplitude Oct 30, 2025
3975eed
fix navigate checker
daniel-graham-amplitude Oct 30, 2025
3e3a518
again
daniel-graham-amplitude Oct 30, 2025
0e8ca3c
refactor: migrate rxjs to zen in frustration plugin
daniel-graham-amplitude Oct 30, 2025
af190e5
refactor: track-change use ZenObservable over RxJS
daniel-graham-amplitude Oct 30, 2025
8b5fbae
refactor: clean up change observable
daniel-graham-amplitude Oct 31, 2025
8b0b10d
Merge branch 'zen-observable-migration' of github.com:amplitude/Ampli…
daniel-graham-amplitude Oct 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/analytics-core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,4 +136,4 @@ export {
} from './types/config/react-native-config';
export { ReactNativeClient } from './types/client/react-native-client';

export { Observable, asyncMap, merge, multicast } from './utils/observable';
export { Observable, asyncMap, merge, multicast, Unsubscribable } from './utils/observable';
2 changes: 1 addition & 1 deletion packages/analytics-core/src/utils/observable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,4 @@ function multicast<T>(source: ZenObservable<T>): ZenObservable<T> {
}
}

export { asyncMap, multicast, merge };
export { asyncMap, multicast, merge, Unsubscribable };
39 changes: 24 additions & 15 deletions packages/plugin-autocapture-browser/src/autocapture-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import {
DEFAULT_ACTION_CLICK_ALLOWLIST,
DEFAULT_DATA_ATTRIBUTE_PREFIX,
IDiagnosticsClient,
getGlobalScope,
multicast,
} from '@amplitude/analytics-core';
import { VERSION } from './version';
import * as constants from './constants';
import { fromEvent, map, type Observable, type Subscription, share } from 'rxjs';
import { fromEvent, map, type Observable, share } from 'rxjs';
import {
createShouldTrackEvent,
type ElementBasedTimestampedEvent,
Expand All @@ -31,7 +33,7 @@ import {
groupLabeledEventIdsByEventType,
} from './pageActions/triggers';
import { DataExtractor } from './data-extractor';
import { Observable as ZenObservable } from '@amplitude/analytics-core';
import { Observable as ZenObservable, Unsubscribable } from '@amplitude/analytics-core';

declare global {
interface Window {
Expand Down Expand Up @@ -59,7 +61,7 @@ export enum ObservablesEnum {

export interface AllWindowObservables {
[ObservablesEnum.ClickObservable]: Observable<ElementBasedTimestampedEvent<MouseEvent>>;
[ObservablesEnum.ChangeObservable]: Observable<ElementBasedTimestampedEvent<Event>>;
[ObservablesEnum.ChangeObservable]: ZenObservable<ElementBasedTimestampedEvent<Event>>;
// [ObservablesEnum.ErrorObservable]: Observable<TimestampedEvent<ErrorEvent>>;
[ObservablesEnum.NavigateObservable]: Observable<TimestampedEvent<NavigateEvent>> | undefined;
[ObservablesEnum.MutationObservable]: Observable<TimestampedEvent<MutationRecord[]>>;
Expand Down Expand Up @@ -112,7 +114,7 @@ export const autocapturePlugin = (
const name = constants.PLUGIN_NAME;
const type = 'enrichment';

const subscriptions: Subscription[] = [];
const subscriptions: Unsubscribable[] = [];

// Create data extractor based on options
const dataExtractor = new DataExtractor(options, context);
Expand All @@ -131,16 +133,23 @@ export const autocapturePlugin = (
),
share(),
);
const changeObservable = fromEvent<Event>(document, 'change', { capture: true }).pipe(
map((change) =>
dataExtractor.addAdditionalEventProperties(
change,
'change',
(options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,
dataAttributePrefix,
),
),
share(),

const changeObservable = multicast(
new ZenObservable<ElementBasedTimestampedEvent<Event>>((observer) => {
const handler = (changeEvent: Event) => {
const enrichedChangeEvent = dataExtractor.addAdditionalEventProperties(
changeEvent,
'change',
(options as AutoCaptureOptionsWithDefaults).cssSelectorAllowlist,
dataAttributePrefix,
) as ElementBasedTimestampedEvent<Event>;
observer.next(enrichedChangeEvent);
};
/* istanbul ignore next */
getGlobalScope()?.document.addEventListener('change', handler, { capture: true });
/* istanbul ignore next */
return () => getGlobalScope()?.document.removeEventListener('change', handler);
}),
);

// Create Observable from unhandled errors
Expand Down Expand Up @@ -180,7 +189,7 @@ export const autocapturePlugin = (

return {
[ObservablesEnum.ClickObservable]: clickObservable as Observable<ElementBasedTimestampedEvent<MouseEvent>>,
[ObservablesEnum.ChangeObservable]: changeObservable as Observable<ElementBasedTimestampedEvent<Event>>,
[ObservablesEnum.ChangeObservable]: changeObservable,
// [ObservablesEnum.ErrorObservable]: errorObservable,
[ObservablesEnum.NavigateObservable]: navigateObservable,
[ObservablesEnum.MutationObservable]: mutationObservable,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { AllWindowObservables } from 'src/autocapture-plugin';
import { type evaluateTriggersFn } from 'src/helpers';
import { filter, map } from 'rxjs';
import { ElementBasedTimestampedEvent, type evaluateTriggersFn } from 'src/helpers';
import { BrowserClient, ActionType } from '@amplitude/analytics-core';
import { filterOutNonTrackableEvents, shouldTrackEvent } from '../helpers';
import { AMPLITUDE_ELEMENT_CHANGED_EVENT } from '../constants';
Expand All @@ -20,14 +19,13 @@ export function trackChange({
}) {
const { changeObservable } = allObservables;

const filteredChangeObservable = changeObservable.pipe(
filter(filterOutNonTrackableEvents),
filter((changeEvent) => {
const filteredChangeObservable = changeObservable
.filter(filterOutNonTrackableEvents)
.filter((changeEvent: ElementBasedTimestampedEvent<Event>) => {
// Only track change on elements that should be tracked,
return shouldTrackEvent('change', changeEvent.closestTrackedAncestor);
}),
map((changeEvent) => evaluateTriggers(changeEvent)),
);
})
.map((changeEvent) => evaluateTriggers(changeEvent));

return filteredChangeObservable.subscribe((changeEvent) => {
/* istanbul ignore next */
Expand Down
4 changes: 2 additions & 2 deletions test-server/autocapture/element-interactions.html
Original file line number Diff line number Diff line change
Expand Up @@ -268,9 +268,9 @@ <h2>Content Changing Button</h2>
import.meta.env.VITE_AMPLITUDE_USER_ID || 'amplitude-typescript test user',
{
identify,
fetchRemoteConfig: true,
fetchRemoteConfig: false,
autocapture: {
elementInteractions: false,
elementInteractions: true,
frustrationInteractions,
sessions: true,
},
Expand Down
Loading