Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/lib/Request.ts
1028 views
1
import FetchRequest from 'awaited-dom/impl/official-klasses/Request';
2
import AwaitedPath from 'awaited-dom/base/AwaitedPath';
3
import StateMachine from 'awaited-dom/base/StateMachine';
4
import { IRequestInfo, IRequestInit } from 'awaited-dom/base/interfaces/official';
5
import INodePointer from 'awaited-dom/base/INodePointer';
6
import CoreFrameEnvironment from './CoreFrameEnvironment';
7
8
interface IState {
9
awaitedPath: AwaitedPath;
10
nodePointer: INodePointer;
11
remoteInitializerPromise: Promise<void>;
12
coreFrame: Promise<CoreFrameEnvironment>;
13
}
14
15
const { getState, setState } = StateMachine<FetchRequest, IState>();
16
17
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
18
export default function RequestGenerator(coreFrame: Promise<CoreFrameEnvironment>) {
19
// eslint-disable-next-line @typescript-eslint/no-unused-vars
20
return class Request extends FetchRequest {
21
constructor(input: IRequestInfo, init?: IRequestInit) {
22
super(input, init);
23
24
setState(this, {
25
coreFrame,
26
remoteInitializerPromise: createRemoteInitializer(this, coreFrame, input, init),
27
});
28
}
29
};
30
}
31
32
async function createRemoteInitializer(
33
instance: FetchRequest,
34
coreFramePromise: Promise<CoreFrameEnvironment>,
35
input: IRequestInfo,
36
init?: IRequestInit,
37
): Promise<void> {
38
const requestInput = await getRequestIdOrUrl(input);
39
const coreFrame = await coreFramePromise;
40
const nodePointer = await coreFrame.createRequest(requestInput, init);
41
const awaitedPath = new AwaitedPath(null).withNodeId(null, nodePointer.id);
42
setState(instance, {
43
nodePointer,
44
awaitedPath,
45
});
46
}
47
48
export async function getRequestIdOrUrl(input: IRequestInfo): Promise<number | string> {
49
let requestInput: number | string;
50
if (typeof input === 'string') {
51
requestInput = input;
52
} else {
53
// wait for request being cloned if needed
54
await getState(input).remoteInitializerPromise;
55
const awaitedPath = getState(input).awaitedPath as AwaitedPath;
56
requestInput = awaitedPath.toJSON()[0] as number;
57
}
58
return requestInput;
59
}
60
61