Skip to content

Commit a7552eb

Browse files
committed
Added session management components
1 parent b0ad802 commit a7552eb

15 files changed

+198
-8
lines changed

dist/exceptionless.d.ts

+13
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ export interface IEventQueue {
2828
export interface IEnvironmentInfoCollector {
2929
getEnvironmentInfo(context: EventPluginContext): IEnvironmentInfo;
3030
}
31+
export interface ISessionManager {
32+
getSessionId(identity: string): string;
33+
startSession(identity: string): string;
34+
endSession(sessionId: string): void;
35+
}
3136
export interface IErrorParser {
3237
parse(context: EventPluginContext, exception: Error): IError;
3338
}
@@ -55,6 +60,7 @@ export interface IConfigurationSettings {
5560
apiKey?: string;
5661
serverUrl?: string;
5762
environmentInfoCollector?: IEnvironmentInfoCollector;
63+
sessionManager?: ISessionManager;
5864
errorParser?: IErrorParser;
5965
lastReferenceIdManager?: ILastReferenceIdManager;
6066
log?: ILog;
@@ -137,6 +143,12 @@ export declare class DefaultEventQueue implements IEventQueue {
137143
private processSubmissionResponse(response, events);
138144
private removeEvents(events);
139145
}
146+
export declare class DefaultSessionManager implements ISessionManager {
147+
private sessionMap;
148+
getSessionId(identity: string): string;
149+
startSession(identity: string): string;
150+
endSession(sessionId: string): void;
151+
}
140152
export declare class InMemoryStorage<T> implements IStorage<T> {
141153
private _items;
142154
private _maxItems;
@@ -178,6 +190,7 @@ export declare class Configuration implements IConfigurationSettings {
178190
log: ILog;
179191
moduleCollector: IModuleCollector;
180192
requestInfoCollector: IRequestInfoCollector;
193+
sessionManager: ISessionManager;
181194
submissionBatchSize: number;
182195
submissionAdapter: ISubmissionAdapter;
183196
submissionClient: ISubmissionClient;

dist/exceptionless.js

+29-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.min.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.node.js

+29-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.node.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/configuration/Configuration.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { IEnvironmentInfoCollector } from '../services/IEnvironmentInfoCollector
1616
import { IErrorParser } from '../services/IErrorParser';
1717
import { IModuleCollector } from '../services/IModuleCollector';
1818
import { IRequestInfoCollector } from '../services/IRequestInfoCollector';
19+
import { ISessionManager } from '../services/ISessionManager';
20+
import { DefaultSessionManager } from '../services/DefaultSessionManager';
1921
import { IStorage } from '../storage/IStorage';
2022
import { InMemoryStorage } from '../storage/InMemoryStorage';
2123
import { ISubmissionAdapter } from '../submission/ISubmissionAdapter';
@@ -57,10 +59,11 @@ export class Configuration implements IConfigurationSettings {
5759

5860
public environmentInfoCollector: IEnvironmentInfoCollector;
5961
public errorParser: IErrorParser;
60-
public lastReferenceIdManager: ILastReferenceIdManager = new DefaultLastReferenceIdManager();
62+
public lastReferenceIdManager: ILastReferenceIdManager;
6163
public log: ILog;
6264
public moduleCollector: IModuleCollector;
6365
public requestInfoCollector: IRequestInfoCollector;
66+
public sessionManager: ISessionManager;
6467

6568
/**
6669
* Maximum number of events that should be sent to the server together in a batch. (Defaults to 50)
@@ -98,6 +101,7 @@ export class Configuration implements IConfigurationSettings {
98101
this.serverUrl = configSettings.serverUrl;
99102

100103
this.environmentInfoCollector = inject(configSettings.environmentInfoCollector);
104+
this.sessionManager = inject(configSettings.sessionManager) || new DefaultSessionManager();
101105
this.errorParser = inject(configSettings.errorParser);
102106
this.lastReferenceIdManager = inject(configSettings.lastReferenceIdManager) || new DefaultLastReferenceIdManager();
103107
this.moduleCollector = inject(configSettings.moduleCollector);

src/configuration/IConfigurationSettings.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ILastReferenceIdManager } from '../lastReferenceIdManager/ILastReferenc
22
import { ILog } from '../logging/ILog';
33
import { IEventQueue } from '../queue/IEventQueue';
44
import { IEnvironmentInfoCollector } from '../services/IEnvironmentInfoCollector';
5+
import { ISessionManager } from '../services/ISessionManager';
56
import { IErrorParser } from '../services/IErrorParser';
67
import { IModuleCollector } from '../services/IModuleCollector';
78
import { IRequestInfoCollector } from '../services/IRequestInfoCollector';
@@ -13,6 +14,7 @@ export interface IConfigurationSettings {
1314
apiKey?: string;
1415
serverUrl?: string;
1516
environmentInfoCollector?: IEnvironmentInfoCollector;
17+
sessionManager?: ISessionManager;
1618
errorParser?: IErrorParser;
1719
lastReferenceIdManager?: ILastReferenceIdManager;
1820
log?: ILog;

src/models/ISessionInfo.ts

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface ISessionInfo {
2+
version?: string;
3+
user_id?: string;
4+
ip_address?: string;
5+
machine_id?: string;
6+
install_id?: string;
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { expect } from 'chai';
2+
import { SessionManagerPlugin } from './SessionManagerPlugin';
3+
4+
describe('SessionManagerPlugin', () => {
5+
6+
let target: SessionManagerPlugin;
7+
8+
beforeEach(() => {
9+
target = new SessionManagerPlugin();
10+
});
11+
12+
it('should ignore manual session ids', () => {
13+
expect.fail('TODO');
14+
});
15+
16+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { IEventPlugin } from '../IEventPlugin';
2+
import { EventPluginContext } from '../EventPluginContext';
3+
4+
export class SessionManagerPlugin implements IEventPlugin {
5+
public priority: number = 100;
6+
public name: string = 'SessionManagerPlugin';
7+
8+
public run(context: EventPluginContext, next?: () => void): void {
9+
10+
// only manage session ids if the session id isn't specified manually
11+
if (!context.event.session_id) {
12+
return;
13+
}
14+
15+
// let sessionManager = context.client.config.sessionManager;
16+
17+
}
18+
}
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { expect } from 'chai';
2+
import { DefaultSessionManager } from './DefaultSessionManager';
3+
4+
describe('DefaultSessionManager', () => {
5+
6+
const identity = 'TestIdentity';
7+
8+
let target: DefaultSessionManager;
9+
let sessionId: string;
10+
11+
beforeEach(() => {
12+
target = new DefaultSessionManager();
13+
sessionId = target.startSession(identity);
14+
});
15+
16+
it('should return the existing session', () => {
17+
let result = target.getSessionId(identity);
18+
expect(result).to.equal(sessionId);
19+
});
20+
21+
it('should return null for nonexisting session', () => {
22+
let result = target.getSessionId('InvalidSessionId');
23+
expect(result).to.be.null;
24+
});
25+
26+
it('should return different id for new session', () => {
27+
let result = target.startSession('OtherIdentity');
28+
expect(result).not.to.equal(sessionId);
29+
});
30+
31+
it('should return null after ending session', () => {
32+
target.endSession(sessionId);
33+
let result = target.getSessionId(identity);
34+
expect(result).to.be.null;
35+
});
36+
37+
});

src/services/DefaultSessionManager.ts

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { ISessionManager } from './ISessionManager';
2+
import { Utils } from '../Utils';
3+
4+
export class DefaultSessionManager implements ISessionManager {
5+
6+
private sessionMap: { [identity: string]: string } = {};
7+
8+
public getSessionId(identity: string): string {
9+
if (this.sessionMap.hasOwnProperty(identity)) {
10+
return this.sessionMap[identity];
11+
}
12+
13+
return null;
14+
}
15+
16+
public startSession(identity: string): string {
17+
let sessionId = Utils.guid();
18+
this.sessionMap[identity] = sessionId;
19+
return sessionId;
20+
}
21+
22+
public endSession(sessionId: string): void {
23+
let identities = Object.keys(this.sessionMap);
24+
for (let i = 0; i < identities.length; i++) {
25+
let identity = identities[i];
26+
if (this.sessionMap[identity] === sessionId) {
27+
delete this.sessionMap[identity];
28+
return;
29+
}
30+
}
31+
}
32+
}

src/services/ISessionManager.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface ISessionManager {
2+
getSessionId(identity: string): string;
3+
startSession(identity: string): string;
4+
endSession(sessionId: string): void;
5+
}

0 commit comments

Comments
 (0)