-
Notifications
You must be signed in to change notification settings - Fork 0
/
be-invoking.js
68 lines (66 loc) · 2.45 KB
/
be-invoking.js
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
62
63
64
65
66
67
68
// @ts-check
import { BE } from 'be-enhanced/BE.js';
import { propInfo, resolved, rejected } from 'be-enhanced/cc.js';
import { dispatchEvent as de } from 'trans-render/positractions/dispatchEvent.js';
/** @import {BEConfig, IEnhancement, BEAllProps} from './ts-refs/be-enhanced/types.d.ts' */
/** @import {Actions, PAP, AP, BAP, ObservingParameters} from './ts-refs/be-invoking/types' */
class BeInvoking extends BE {
de = de;
/**
* @type {BEConfig<BAP, Actions & IEnhancement, any>}
*/
static config = {
propInfo: {
...propInfo,
parsedStatements: {},
rawStatements: {},
},
actions: {
hydrate: {
ifAllOf: ['parsedStatements']
}
},
positractions: [
resolved, rejected
]
};
#abortControllers = [];
#cache = new Map();
async hydrate(self) {
const { parsedStatements, enhancedElement } = self;
const { nudge } = await import('trans-render/lib/nudge.js');
for (const parsedStatement of parsedStatements) {
let { localEventType } = parsedStatement;
if (localEventType === undefined) {
const { stdEvt } = await import('trans-render/asmr/stdEvt.js');
localEventType = stdEvt(enhancedElement);
}
const ac = new AbortController();
this.#abortControllers.push(ac);
enhancedElement.addEventListener(localEventType, e => {
this.#invokeRemoteMethods(parsedStatement, enhancedElement, e);
}, { signal: ac.signal });
}
nudge(enhancedElement);
return {
resolved: true
};
}
async #invokeRemoteMethods(parsedStatement, enhancedElement, event) {
const { remoteSpecifiers } = parsedStatement;
const { find } = await import('trans-render/dss/find.js');
for (const remoteSpecifier of remoteSpecifiers) {
let remoteTarget = this.#cache.get(remoteSpecifier)?.deref();
if (remoteTarget === undefined) {
remoteTarget = await find(enhancedElement, remoteSpecifier);
if (!remoteTarget)
throw 404;
this.#cache.set(remoteSpecifier, new WeakRef(remoteTarget));
}
const { prop } = remoteSpecifier;
remoteTarget[prop](remoteTarget, event);
}
}
}
await BeInvoking.bootUp();
export { BeInvoking };