Skip to content
Open
Changes from all commits
Commits
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
28 changes: 21 additions & 7 deletions packages/analytics/modules/analytics/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,10 @@ type AnalyticsMessage = {
[K in keyof Analytics]: {
fn: K;
args: Parameters<Analytics[K]>;
meta: AnalyticsEventMetadata;
};
}[keyof Analytics];

type AnalyticsMethod =
| ((...args: Parameters<Analytics[keyof Analytics]>) => void)
| undefined;

type MethodForwarder = <K extends keyof Analytics>(
fn: K,
) => (...args: Parameters<Analytics[K]>) => Promise<void>;
Expand Down Expand Up @@ -270,8 +267,25 @@ function createBackgroundAnalytics(
// Listen for messages from the rest of the extension
browser.runtime.onConnect.addListener((port) => {
if (port.name === ANALYTICS_PORT) {
port.onMessage.addListener(({ fn, args }: AnalyticsMessage) => {
void (analytics[fn] as AnalyticsMethod)?.(...args);
port.onMessage.addListener((message: AnalyticsMessage) => {
const { meta, fn } = message;
// Pass every argument explicitly, so meta doesn't shift into an omitted optional one
switch (fn) {
case 'identify':
return analytics.identify(message.args[0], message.args[1], meta);
case 'page':
return analytics.page(message.args[0], meta);
case 'track':
return analytics.track(message.args[0], message.args[1], meta);
case 'captureException':
return analytics.captureException(
message.args[0],
message.args[1],
meta,
);
case 'setEnabled':
return analytics.setEnabled(message.args[0]);
}
Comment on lines +270 to +288

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
port.onMessage.addListener((message: AnalyticsMessage) => {
const { meta } = message;
// Pass every argument explicitly, so meta doesn't shift into an omitted optional one
switch (message.fn) {
case 'identify':
return void analytics.identify(
message.args[0],
message.args[1],
meta,
);
case 'page':
return void analytics.page(message.args[0], meta);
case 'track':
return void analytics.track(message.args[0], message.args[1], meta);
case 'captureException':
return void analytics.captureException(
message.args[0],
message.args[1],
meta,
);
case 'setEnabled':
return void analytics.setEnabled(message.args[0]);
}
port.onMessage.addListener((message: AnalyticsMessage) => {
const { meta, fn } = message;
// Pass every argument explicitly, so meta doesn't shift into an omitted optional one
switch (fn) {
case 'identify':
return analytics.identify(
message.args[0],
message.args[1],
meta,
);
case 'page':
return analytics.page(message.args[0], meta);
case 'track':
return analytics.track(message.args[0], message.args[1], meta);
case 'captureException':
return analytics.captureException(
message.args[0],
message.args[1],
meta,
);
case 'setEnabled':
return analytics.setEnabled(message.args[0]);
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, applied your suggestion and fixed the conflict!

Button 1 goes through autoTrack, which always passes properties, so the bug doesn't show there. It only happens when you leave out an optional argument, like the analytics.track('some-event') example from the README.

Try adding void analytics.track('some-event') to the demo popup. Before this PR, the event's properties end up being the popup's metadata and meta.url is background.js. After, it's correct.

Not a breaking change since the public API stays the same. Only the internal message between the popup and the background changes.

});
}
});
Expand Down Expand Up @@ -304,7 +318,7 @@ function createFrontendAnalytics(): Analytics {
const methodForwarder: MethodForwarder =
(fn) =>
(...args) => {
getPort().postMessage({ fn, args: [...args, getFrontendMetadata()] });
getPort().postMessage({ fn, args, meta: getFrontendMetadata() });
return Promise.resolve();
};

Expand Down