forked from QwikDev/partytown
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain-forward-trigger.ts
61 lines (56 loc) · 1.99 KB
/
main-forward-trigger.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import {
emptyObjectValue,
getOriginalBehavior,
len,
resolvePartytownForwardProperty,
} from '../utils';
import { MainWindow, PartytownWebWorker, WinId, WorkerMessageType } from '../types';
import { serializeForWorker } from './main-serialization';
export const mainForwardTrigger = (worker: PartytownWebWorker, $winId$: WinId, win: MainWindow) => {
let queuedForwardCalls = win._ptf;
let forwards = (win.partytown || {}).forward || [];
let i: number;
let mainForwardFn: typeof win;
let forwardCall = ($forward$: string[], args: any) =>
worker.postMessage([
WorkerMessageType.ForwardMainTrigger,
{
$winId$,
$forward$,
$args$: serializeForWorker($winId$, Array.from(args)),
},
]);
win._ptf = undefined;
forwards.map((forwardProps) => {
const [property, { preserveBehavior }] = resolvePartytownForwardProperty(forwardProps);
mainForwardFn = win;
property.split('.').map((_, i, arr) => {
mainForwardFn = mainForwardFn[arr[i]] =
i + 1 < len(arr)
? mainForwardFn[arr[i]] || emptyObjectValue(arr[i + 1])
: (() => {
let originalFunction: ((...args: any[]) => any) | null = null;
if (preserveBehavior) {
const { methodOrProperty, thisObject } = getOriginalBehavior(win, arr);
if (typeof methodOrProperty === 'function') {
originalFunction = (...args: any[]) =>
methodOrProperty.apply(thisObject, ...args);
}
}
return (...args: any[]) => {
let returnValue: any;
if (originalFunction) {
returnValue = originalFunction(args);
}
forwardCall(arr, args);
return returnValue;
};
})();
});
});
if (queuedForwardCalls) {
for (i = 0; i < len(queuedForwardCalls); i += 2) {
forwardCall(queuedForwardCalls[i], queuedForwardCalls[i + 1]);
}
}
};