Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/core/models/FrameNavigationsTable.ts
1028 views
1
import { Database as SqliteDatabase } from 'better-sqlite3';
2
import INavigation, { LoadStatus } from '@secret-agent/interfaces/INavigation';
3
import SqliteTable from '@secret-agent/commons/SqliteTable';
4
5
export default class FrameNavigationsTable extends SqliteTable<IFrameNavigationRecord> {
6
private idCounter = 0;
7
8
constructor(readonly db: SqliteDatabase) {
9
super(
10
db,
11
'FrameNavigations',
12
[
13
['id', 'INTEGER', 'NOT NULL PRIMARY KEY'],
14
['frameId', 'INTEGER'],
15
['startCommandId', 'INTEGER'],
16
['requestedUrl', 'TEXT'],
17
['finalUrl', 'TEXT'],
18
['navigationReason', 'TEXT'],
19
['loaderId', 'TEXT'],
20
['initiatedTime', 'INTEGER'],
21
['httpRequestedTime', 'INTEGER'],
22
['httpRespondedTime', 'INTEGER'],
23
['httpRedirectedTime', 'INTEGER'],
24
['domContentLoadedTime', 'INTEGER'],
25
['loadTime', 'INTEGER'],
26
['contentPaintedTime', 'INTEGER'],
27
],
28
true,
29
);
30
this.defaultSortOrder = 'initiatedTime ASC';
31
}
32
33
public insert(navigation: INavigation) {
34
if (!navigation.id) {
35
this.idCounter += 1;
36
navigation.id = this.idCounter;
37
}
38
const record = [
39
navigation.id,
40
navigation.frameId,
41
navigation.startCommandId,
42
navigation.requestedUrl,
43
navigation.finalUrl,
44
navigation.navigationReason,
45
navigation.loaderId,
46
navigation.initiatedTime.getTime(),
47
navigation.stateChanges.get(LoadStatus.HttpRequested)?.getTime(),
48
navigation.stateChanges.get(LoadStatus.HttpResponded)?.getTime(),
49
navigation.stateChanges.get(LoadStatus.HttpRedirected)?.getTime(),
50
navigation.stateChanges.get(LoadStatus.DomContentLoaded)?.getTime(),
51
navigation.stateChanges.get(LoadStatus.Load)?.getTime(),
52
navigation.stateChanges.get(LoadStatus.ContentPaint)?.getTime(),
53
];
54
this.queuePendingInsert(record);
55
}
56
57
public last() {
58
return this.db
59
.prepare(`select * from ${this.tableName} order by initiatedTime desc limit 1`)
60
.get() as IFrameNavigationRecord;
61
}
62
}
63
64
export interface IFrameNavigationRecord {
65
id: number;
66
frameId: number;
67
requestedUrl: string;
68
finalUrl?: string;
69
loaderId: string;
70
startCommandId: number;
71
navigationReason: string;
72
initiatedTime: Date;
73
httpRequestedTime: number;
74
httpRespondedTime: number;
75
httpRedirectedTime?: number;
76
domContentLoadedTime?: number;
77
loadTime?: number;
78
contentPaintedTime?: number;
79
}
80
81