@@ -9,6 +9,21 @@ if (typeof globalThis === 'undefined') {
9
9
10
10
const harden = ( globalThis . SES && globalThis . SES . harden ) || Object . freeze ;
11
11
12
+ const readOnlyProxy = {
13
+ set ( _target , _prop , _value ) {
14
+ return false ;
15
+ } ,
16
+ isExtensible ( _target ) {
17
+ return false ;
18
+ } ,
19
+ setPrototypeOf ( _target , _value ) {
20
+ return false ;
21
+ } ,
22
+ deleteProperty ( _target , _prop ) {
23
+ return false ;
24
+ } ,
25
+ } ;
26
+
12
27
/**
13
28
* A Proxy handler for E(x).
14
29
*
@@ -17,6 +32,7 @@ const harden = (globalThis.SES && globalThis.SES.harden) || Object.freeze;
17
32
*/
18
33
function EProxyHandler ( x , HandledPromise ) {
19
34
return harden ( {
35
+ ...readOnlyProxy ,
20
36
get ( _target , p , _receiver ) {
21
37
if ( `${ p } ` !== p ) {
22
38
return undefined ;
@@ -28,14 +44,8 @@ function EProxyHandler(x, HandledPromise) {
28
44
// #95 for details.
29
45
return ( ...args ) => harden ( HandledPromise . applyMethod ( x , p , args ) ) ;
30
46
} ,
31
- deleteProperty ( _target , p ) {
32
- return harden ( HandledPromise . delete ( x , p ) ) ;
33
- } ,
34
- set ( _target , p , value , _receiver ) {
35
- return harden ( HandledPromise . set ( x , p , value ) ) ;
36
- } ,
37
47
apply ( _target , _thisArg , argArray = [ ] ) {
38
- return harden ( HandledPromise . apply ( x , argArray ) ) ;
48
+ return harden ( HandledPromise . applyFunction ( x , argArray ) ) ;
39
49
} ,
40
50
has ( _target , _p ) {
41
51
// We just pretend everything exists.
@@ -50,74 +60,97 @@ export default function makeE(HandledPromise) {
50
60
return harden ( new Proxy ( { } , handler ) ) ;
51
61
}
52
62
53
- const EChain = x => {
54
- return harden ( {
63
+ const makeEGetterProxy = ( x , wrap = o => o ) =>
64
+ new Proxy (
65
+ Object . create ( null ) ,
66
+ {
67
+ ...readOnlyProxy ,
68
+ has ( _target , _prop ) {
69
+ return true ;
70
+ } ,
71
+ get ( _target , prop ) {
72
+ return wrap ( HandledPromise . get ( x , prop ) ) ;
73
+ } ,
74
+ } ,
75
+ ) ;
76
+
77
+
78
+ const makeEDeleterProxy = ( x , wrap = o => o ) =>
79
+ new Proxy (
80
+ Object . create ( null ) ,
81
+ {
82
+ ...readOnlyProxy ,
83
+ has ( _target , _prop ) {
84
+ return true ;
85
+ } ,
86
+ get ( _target , prop ) {
87
+ return wrap ( HandledPromise . delete ( x , prop ) ) ;
88
+ } ,
89
+ } ,
90
+ ) ;
91
+
92
+ const makeESetterProxy = ( x , wrap = o => o ) =>
93
+ new Proxy (
94
+ Object . create ( null ) ,
95
+ {
96
+ ...readOnlyProxy ,
97
+ has ( _target , _prop ) {
98
+ return true ;
99
+ } ,
100
+ get ( _target , prop ) {
101
+ return harden ( value =>
102
+ wrap ( HandledPromise . set ( x , prop , value ) ) ,
103
+ ) ;
104
+ } ,
105
+ } ,
106
+ ) ;
107
+
108
+ const makeEMethodProxy = ( x , wrap = o => o ) =>
109
+ new Proxy (
110
+ ( ..._args ) => { } ,
111
+ {
112
+ ...readOnlyProxy ,
113
+ has ( _target , _prop ) {
114
+ return true ;
115
+ } ,
116
+ get ( _target , prop ) {
117
+ return harden ( ( ...args ) =>
118
+ wrap ( HandledPromise . applyMethod ( x , prop , args ) ) ,
119
+ ) ;
120
+ } ,
121
+ apply ( _target , _thisArg , args = [ ] ) {
122
+ return wrap ( HandledPromise . applyFunction ( x , args ) ) ;
123
+ } ,
124
+ } ) ;
125
+
126
+ E . G = makeEGetterProxy ;
127
+ E . D = makeEDeleterProxy ;
128
+ E . S = makeESetterProxy ;
129
+ E . M = makeEMethodProxy ;
130
+
131
+ const EChain = x =>
132
+ harden ( {
55
133
get G ( ) {
56
134
// Return getter.
57
- return new Proxy (
58
- { EChain : 'getter' } ,
59
- {
60
- has ( _target , _prop ) {
61
- return true ;
62
- } ,
63
- get ( _target , prop ) {
64
- return EChain ( HandledPromise . get ( x , prop ) ) ;
65
- } ,
66
- } ,
67
- ) ;
135
+ return makeEGetterProxy ( x , EChain ) ;
68
136
} ,
69
137
get D ( ) {
70
138
// Return deleter.
71
- return new Proxy (
72
- { EChain : 'deleter' } ,
73
- {
74
- has ( _target , _prop ) {
75
- return true ;
76
- } ,
77
- get ( _target , prop ) {
78
- return EChain ( HandledPromise . delete ( x , prop ) ) ;
79
- } ,
80
- } ,
81
- ) ;
139
+ return makeEDeleterProxy ( x , EChain ) ;
82
140
} ,
83
141
get S ( ) {
84
142
// Return setter.
85
- return new Proxy (
86
- { EChain : 'setter' } ,
87
- {
88
- has ( _target , _prop ) {
89
- return true ;
90
- } ,
91
- get ( _target , prop ) {
92
- return harden ( value =>
93
- EChain ( HandledPromise . set ( x , prop , value ) ) ,
94
- ) ;
95
- } ,
96
- } ,
97
- ) ;
143
+ return makeESetterProxy ( x , EChain ) ;
98
144
} ,
99
145
get M ( ) {
100
146
// Return method-caller.
101
- return new Proxy ( ( ..._args ) => { } , {
102
- has ( _target , _prop ) {
103
- return true ;
104
- } ,
105
- get ( _target , prop ) {
106
- return harden ( ( ...args ) =>
107
- EChain ( HandledPromise . applyMethod ( x , prop , args ) ) ,
108
- ) ;
109
- } ,
110
- apply ( _target , _thisArg , args = [ ] ) {
111
- return EChain ( HandledPromise . applyFunction ( x , args ) ) ;
112
- } ,
113
- } ) ;
147
+ return makeEMethodProxy ( x , EChain ) ;
114
148
} ,
115
149
get P ( ) {
116
150
// Return as promise.
117
151
return Promise . resolve ( x ) ;
118
152
} ,
119
153
} ) ;
120
- } ;
121
154
122
155
E . C = EChain ;
123
156
return harden ( E ) ;
0 commit comments