-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathdevtoolsRuntime.ts
More file actions
108 lines (94 loc) · 2.11 KB
/
devtoolsRuntime.ts
File metadata and controls
108 lines (94 loc) · 2.11 KB
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// const domainDispatchers = new Map<string, any>();
export function DomainDispatcher(domain: string): ClassDecorator {
return (klass) => {
__registerDomainDispatcher(domain, klass);
// if (!domainDispatchers.has(domain)) {
// domainDispatchers.set(domain, klass);
// } else {
// console.trace(`Domain dispatcher for ${domain} already registered!`);
// }
};
}
interface ProtocolMessage<T = any> {
id: number;
method: string;
params: T;
}
export class ProtocolWrapper {
constructor() {
return ProtocolWrapper.wrap(this);
}
protected enabled: boolean = false;
enable() {
this.enabled = true;
}
disable() {
this.enabled = false;
}
// private _enabled: boolean = false;
// get enabled() {
// return this._enabled;
// }
// enable() {
// console.log(this.constructor.name, 'enable!');
// this._enabled = true;
// }
// disable() {
// this._enabled = false;
// }
public emit(name: string, params: any) {
try {
// console.info('[emit]', { method: name, params });
__inspectorSendEvent(
JSON.stringify({
method: name,
params,
}),
);
} catch (err) {
console.error(err);
}
}
public timestamp(): number {
return __inspectorTimestamp();
}
private static async sendResponseToDevtools<T = any>(id: number, data: T) {
try {
const result = await data;
if (result) {
// console.info('[sendResponseToDevtools]', { id, result });
__inspectorSendEvent(
JSON.stringify({
id,
result,
}),
);
}
} catch (err) {
console.error(err);
}
}
private static wrap<T extends Object>(handler: T): T {
return new Proxy(handler, {
get(target, prop) {
if (typeof target[prop] === 'function') {
return (params, message: ProtocolMessage) => {
try {
// console.warn('[incoming]', {
// id: message.id,
// method: message.method,
// params,
// message,
// });
const res = target[prop](params, message);
ProtocolWrapper.sendResponseToDevtools(message.id, res);
return res;
} catch (err) {
console.error(err);
}
};
}
},
}) as T;
}
}