Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/mitm/lib/Http2SessionBinding.ts
1030 views
1
import { Http2Session } from 'http2';
2
import { Log } from '@secret-agent/commons/Logger';
3
import { IBoundLog } from '@secret-agent/interfaces/ILog';
4
import { IEventSubscriber } from '@secret-agent/interfaces/IRegisteredEventListener';
5
import { bindFunctions } from '@secret-agent/commons/utils';
6
7
export default class Http2SessionBinding {
8
private logger: IBoundLog;
9
10
constructor(
11
readonly clientSession: Http2Session,
12
readonly serverSession: Http2Session,
13
readonly eventSubscriber: IEventSubscriber,
14
logData: { sessionId: string } & any,
15
) {
16
this.logger = new Log(module, logData) as IBoundLog;
17
bindFunctions(this);
18
this.bind();
19
}
20
21
private bind(): void {
22
const clientSession = this.clientSession;
23
const serverSession = this.serverSession;
24
25
if (clientSession) {
26
this.eventSubscriber.on(clientSession, 'ping', this.pingServer);
27
}
28
29
this.eventSubscriber.on(serverSession, 'error', this.onServerError);
30
this.eventSubscriber.on(serverSession, 'close', this.onServerClose);
31
this.eventSubscriber.on(serverSession, 'goaway', this.onServerGoaway);
32
this.eventSubscriber.on(serverSession, 'remoteSettings', remoteSettings => {
33
this.logger.stats('Http2Client.remoteSettings', {
34
settings: remoteSettings,
35
});
36
});
37
this.eventSubscriber.on(serverSession, 'frameError', (frameType, errorCode) => {
38
this.logger.warn('Http2Client.frameError', {
39
frameType,
40
errorCode,
41
});
42
});
43
this.eventSubscriber.on(serverSession, 'altsvc', (alt, altOrigin) => {
44
this.logger.stats('Http2.altsvc', {
45
altOrigin,
46
alt,
47
});
48
});
49
this.eventSubscriber.on(serverSession, 'origin', origins => {
50
this.logger.stats('Http2.origin', {
51
origins,
52
});
53
});
54
}
55
56
private pingServer(bytes: Buffer): void {
57
if (this.serverSession.destroyed) return;
58
this.serverSession.ping(bytes, () => null);
59
}
60
61
private onServerClose(): void {
62
this.logger.info('Http2Client.close');
63
if (!this.clientSession || this.clientSession.destroyed) return;
64
this.clientSession.close();
65
}
66
67
private onServerError(error: Error): void {
68
this.logger.warn('Http2Client.error', {
69
error,
70
});
71
if (!this.clientSession || this.clientSession.destroyed) return;
72
this.clientSession.destroy(error);
73
}
74
75
private onServerGoaway(
76
code: number,
77
lastStreamID?: number,
78
opaqueData?: NodeJS.ArrayBufferView,
79
): void {
80
this.logger.stats('Http2.goaway', {
81
code,
82
lastStreamID,
83
opaqueData,
84
});
85
if (!this.clientSession || this.clientSession.destroyed) return;
86
this.clientSession.goaway(code);
87
}
88
}
89
90