Skip to content

Commit 7da4f60

Browse files
zhu-xiaoweixiaoweii
andauthored
fix: sessionId in first open and session start events (#46)
Co-authored-by: xiaoweii <[email protected]>
1 parent 8dd878a commit 7da4f60

File tree

4 files changed

+50
-16
lines changed

4 files changed

+50
-16
lines changed

src/tracker/Session.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,25 +51,29 @@ export class Session {
5151
this.pauseTime = new Date().getTime();
5252
}
5353

54-
static getCurrentSession(context: ClickstreamContext): Session {
55-
const storedSession = StorageUtil.getSession();
56-
let sessionIndex = 1;
57-
if (storedSession !== null) {
54+
static getCurrentSession(
55+
context: ClickstreamContext,
56+
previousSession: Session = null
57+
): Session {
58+
let session = previousSession;
59+
if (previousSession === null) {
60+
session = StorageUtil.getSession();
61+
}
62+
if (session !== null) {
5863
if (
59-
new Date().getTime() - storedSession.pauseTime <
64+
new Date().getTime() - session.pauseTime <
6065
context.configuration.sessionTimeoutDuration
6166
) {
62-
return new Session(
63-
storedSession.sessionId,
64-
storedSession.sessionIndex,
65-
storedSession.startTime,
66-
storedSession.pauseTime
67-
);
67+
return session;
6868
} else {
69-
sessionIndex = storedSession.sessionIndex + 1;
69+
return Session.createSession(
70+
context.userUniqueId,
71+
session.sessionIndex + 1
72+
);
7073
}
74+
} else {
75+
return Session.createSession(context.userUniqueId, 1);
7176
}
72-
return Session.createSession(context.userUniqueId, sessionIndex);
7377
}
7478

7579
private static getSessionId(uniqueId: string): string {

src/tracker/SessionTracker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ export class SessionTracker extends BaseTracker {
6565
logger.debug('page appear');
6666
const pageViewTracker = this.provider.pageViewTracker;
6767
pageViewTracker.updateLastScreenStartTimestamp();
68-
this.session = Session.getCurrentSession(this.context);
68+
if (!isFirstTime) {
69+
this.session = Session.getCurrentSession(this.context, this.session);
70+
}
6971
if (this.session.isNewSession()) {
7072
pageViewTracker.setIsEntrances();
7173
StorageUtil.clearPageInfo();

src/util/StorageUtil.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,13 @@ export class StorageUtil {
255255
if (sessionStr === null) {
256256
return null;
257257
}
258-
return JSON.parse(sessionStr) as Session;
258+
const sessionObject = JSON.parse(sessionStr);
259+
return new Session(
260+
sessionObject.sessionId,
261+
sessionObject.sessionIndex,
262+
sessionObject.startTime,
263+
sessionObject.pauseTime
264+
);
259265
}
260266

261267
static getIsFirstOpen(): boolean {

test/tracker/SessionTracker.test.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727
Event,
2828
EventRecorder,
2929
} from '../../src/provider';
30-
import { PageViewTracker, SessionTracker } from '../../src/tracker';
30+
import { PageViewTracker, SessionTracker, Session } from '../../src/tracker';
3131
import { StorageUtil } from '../../src/util/StorageUtil';
3232
import { setPerformanceEntries } from '../browser/BrowserUtil';
3333
import { MockObserver } from '../browser/MockObserver';
@@ -96,6 +96,16 @@ describe('SessionTracker test', () => {
9696
expect(session.isNewSession()).toBeTruthy();
9797
});
9898

99+
test('test first open and session start event has the same sessionId', () => {
100+
sessionTracker.setUp();
101+
const allEvents = JSON.parse(StorageUtil.getAllEvents() + ']');
102+
const firstOpenEvent = allEvents[0];
103+
const sessionStartEvent = allEvents[1];
104+
expect(
105+
firstOpenEvent.sessionId === sessionStartEvent.sessionId
106+
).toBeTruthy();
107+
});
108+
99109
test('test enable app start', () => {
100110
provider.configuration.isTrackAppStartEvents = true;
101111
sessionTracker.setUp();
@@ -235,6 +245,18 @@ describe('SessionTracker test', () => {
235245
expect(trackPageViewMock).toBeCalled();
236246
});
237247

248+
test('test launch the app use the stored session', () => {
249+
const session = Session.createSession(context.userUniqueId, 2);
250+
session.pauseTime = new Date().getTime() - 1100;
251+
StorageUtil.saveSession(session);
252+
sessionTracker.setUp();
253+
expect(sessionTracker.session.startTime).toBe(session.startTime);
254+
expect(sessionTracker.session.sessionId).toBe(session.sessionId);
255+
expect(sessionTracker.session.sessionIndex).toBe(session.sessionIndex);
256+
expect(sessionTracker.session.pauseTime > 1000).toBeTruthy();
257+
expect(sessionTracker.session.isNewSession()).toBeFalsy();
258+
});
259+
238260
test('test send event in batch mode when hide page', async () => {
239261
const sendEventBackgroundMock = jest.spyOn(
240262
eventRecorder,

0 commit comments

Comments
 (0)