Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/lib/WebsocketResource.ts
1028 views
1
import inspectInstanceProperties from 'awaited-dom/base/inspectInstanceProperties';
2
import StateMachine from 'awaited-dom/base/StateMachine';
3
import AwaitedPath from 'awaited-dom/base/AwaitedPath';
4
import IWebsocketMessage from '@secret-agent/interfaces/IWebsocketMessage';
5
import IResourceMeta from '@secret-agent/interfaces/IResourceMeta';
6
import ResourceType from '@secret-agent/interfaces/ResourceType';
7
import * as Util from 'util';
8
import CoreTab from './CoreTab';
9
import ResourceRequest, { createResourceRequest } from './ResourceRequest';
10
import ResourceResponse, { createResourceResponse } from './ResourceResponse';
11
import AwaitedEventTarget from './AwaitedEventTarget';
12
13
const { getState, setState } = StateMachine<WebsocketResource, IState>();
14
15
interface IState {
16
resource: IResourceMeta;
17
request: ResourceRequest;
18
response: ResourceResponse;
19
coreTab: Promise<CoreTab>;
20
awaitedPath: AwaitedPath;
21
}
22
23
interface IEventType {
24
message: IWebsocketMessage;
25
}
26
27
const propertyKeys: (keyof WebsocketResource)[] = ['url', 'request', 'response'];
28
29
const subscribeErrorMessage = `Websocket responses do not have a body. To retrieve messages, subscribe to events: on('message', ...)`;
30
31
export default class WebsocketResource extends AwaitedEventTarget<IEventType> {
32
constructor() {
33
super(() => {
34
const state = getState(this);
35
return {
36
target: state.coreTab,
37
jsPath: state.awaitedPath.toJSON(),
38
};
39
});
40
}
41
42
public get request(): ResourceRequest {
43
return getState(this).request;
44
}
45
46
public get response(): ResourceResponse {
47
return getState(this).response;
48
}
49
50
public get url(): string {
51
return getState(this).resource.url;
52
}
53
54
public get documentUrl(): string {
55
return getState(this).resource.documentUrl;
56
}
57
58
public get type(): ResourceType {
59
return 'Websocket';
60
}
61
62
public get isRedirect(): boolean {
63
return getState(this).resource.isRedirect ?? false;
64
}
65
66
public get data(): Promise<Buffer> {
67
throw new Error(subscribeErrorMessage);
68
}
69
70
public text(): Promise<string> {
71
throw new Error(subscribeErrorMessage);
72
}
73
74
public json(): Promise<any> {
75
throw new Error(subscribeErrorMessage);
76
}
77
78
public [Util.inspect.custom](): any {
79
return inspectInstanceProperties(this, propertyKeys as any);
80
}
81
}
82
83
export function createWebsocketResource(
84
resourceMeta: IResourceMeta,
85
coreTab: Promise<CoreTab>,
86
): WebsocketResource {
87
const resource = new WebsocketResource();
88
const request = createResourceRequest(coreTab, resourceMeta.id);
89
const response = createResourceResponse(coreTab, resourceMeta.id);
90
const awaitedPath = new AwaitedPath(null, 'resources', String(resourceMeta.id));
91
setState(resource, { coreTab, resource: resourceMeta, request, response, awaitedPath });
92
return resource;
93
}
94
95