-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathinstanceProxyHandler.js
More file actions
55 lines (52 loc) · 1.63 KB
/
instanceProxyHandler.js
File metadata and controls
55 lines (52 loc) · 1.63 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
import client from './client'
import context, { generateContext } from './context'
import { generateObjectProxy } from './objectProxyHandler'
export const instanceProxies = new WeakMap()
const instanceProxyHandler = {
get(target, name, receiver) {
if (name === '_isProxy') return true
if (target.constructor[name]?.name === '_invoke') return target.constructor[name].bind(target.constructor)
if (typeof target[name] === 'function' && name !== 'constructor') {
const proxy = instanceProxies.get(target)
if (name.startsWith('_')) {
return target[name].bind(proxy)
}
const { [name]: named } = {
[name]: (args) => {
const scopedContext = generateContext({ ...target._attributes, ...args })
let result
try {
result = target[name].call(proxy, scopedContext)
} catch (error) {
if (context.catch) {
context.catch(error)
} else {
throw error
}
return null
}
if (result instanceof Promise) {
return new Promise((resolve, reject) => {
result.then(resolve).catch((error) => {
context.catch ? context.catch(error) : reject(error)
})
})
}
return result
},
}
return named
}
return Reflect.get(target, name, receiver)
},
set(target, name, value) {
if (!name.startsWith('_')) {
target[name] = generateObjectProxy(name, value)
client.update()
} else {
target[name] = value
}
return true
},
}
export default instanceProxyHandler