Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/lib/ResourceResponse.ts
1028 views
1
import inspectInstanceProperties from 'awaited-dom/base/inspectInstanceProperties';
2
import StateMachine from 'awaited-dom/base/StateMachine';
3
import IResourceHeaders from '@secret-agent/interfaces/IResourceHeaders';
4
import IResourceResponse from '@secret-agent/interfaces/IResourceResponse';
5
import IHttpResourceLoadDetails from '@secret-agent/interfaces/IHttpResourceLoadDetails';
6
import * as Util from 'util';
7
import CoreTab from './CoreTab';
8
9
const { getState, setState } = StateMachine<ResourceResponse, IState>();
10
11
interface IState {
12
coreTab: Promise<CoreTab>;
13
resourceId: number;
14
}
15
16
const propertyKeys: (keyof ResourceResponse)[] = [
17
'headers',
18
'url',
19
'timestamp',
20
'remoteAddress',
21
'statusCode',
22
'statusMessage',
23
'browserLoadFailure',
24
'browserServedFromCache',
25
'data',
26
];
27
28
export default class ResourceResponse {
29
public get browserServedFromCache(): Promise<
30
null | IHttpResourceLoadDetails['browserServedFromCache']
31
> {
32
return getResponseProperty(this, 'browserServedFromCache');
33
}
34
35
public get browserLoadFailure(): Promise<string> {
36
return getResponseProperty(this, 'browserLoadFailure');
37
}
38
39
public get headers(): Promise<IResourceHeaders> {
40
return getResponseProperty(this, 'headers');
41
}
42
43
public get url(): Promise<string> {
44
return getResponseProperty(this, 'url');
45
}
46
47
public get timestamp(): Promise<Date> {
48
return getResponseProperty(this, 'timestamp').then(x => (x ? new Date(x as number) : null));
49
}
50
51
public get remoteAddress(): Promise<string> {
52
return getResponseProperty(this, 'remoteAddress');
53
}
54
55
public get statusCode(): Promise<number> {
56
return getResponseProperty(this, 'statusCode');
57
}
58
59
public get statusMessage(): Promise<string> {
60
return getResponseProperty(this, 'statusMessage');
61
}
62
63
public get data(): Promise<Buffer> {
64
return getResponseProperty(this, 'data');
65
}
66
67
public text(): Promise<string> {
68
return this.data.then(x => x?.toString());
69
}
70
71
public json(): Promise<any> {
72
return this.text().then(JSON.parse);
73
}
74
75
public [Util.inspect.custom](): any {
76
return inspectInstanceProperties(this, propertyKeys as any);
77
}
78
}
79
80
export function createResourceResponse(
81
coreTab: Promise<CoreTab>,
82
resourceId?: number,
83
): ResourceResponse {
84
const response = new ResourceResponse();
85
setState(response, { coreTab, resourceId });
86
return response;
87
}
88
89
function getResponseProperty<T>(
90
container: ResourceResponse,
91
name: keyof IResourceResponse | 'data',
92
): Promise<T> {
93
const state = getState(container);
94
const id = state.resourceId;
95
return state.coreTab.then(x => x.getResourceProperty<T>(id, `response.${name}`));
96
}
97
98