quickjs-emscripten-sync 1.2.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +71 -44
- package/dist/index.d.ts +116 -23
- package/dist/quickjs-emscripten-sync.mjs +842 -0
- package/dist/quickjs-emscripten-sync.umd.js +64 -2
- package/package.json +22 -53
- package/src/default.ts +2 -2
- package/src/index.test.ts +223 -59
- package/src/index.ts +72 -66
- package/src/marshal/custom.test.ts +50 -0
- package/src/marshal/custom.ts +36 -0
- package/src/marshal/function.test.ts +64 -75
- package/src/marshal/function.ts +15 -18
- package/src/marshal/index.test.ts +122 -77
- package/src/marshal/index.ts +19 -15
- package/src/marshal/json.test.ts +37 -41
- package/src/marshal/json.ts +5 -7
- package/src/marshal/object.test.ts +59 -84
- package/src/marshal/object.ts +8 -15
- package/src/marshal/primitive.test.ts +18 -21
- package/src/marshal/primitive.ts +11 -10
- package/src/marshal/promise.test.ts +85 -0
- package/src/marshal/promise.ts +19 -0
- package/src/marshal/properties.test.ts +24 -27
- package/src/marshal/properties.ts +15 -17
- package/src/unmarshal/custom.test.ts +50 -0
- package/src/unmarshal/custom.ts +31 -0
- package/src/unmarshal/function.test.ts +63 -86
- package/src/unmarshal/function.ts +13 -22
- package/src/unmarshal/index.test.ts +114 -109
- package/src/unmarshal/index.ts +15 -14
- package/src/unmarshal/object.test.ts +42 -46
- package/src/unmarshal/object.ts +16 -20
- package/src/unmarshal/primitive.test.ts +17 -15
- package/src/unmarshal/primitive.ts +11 -18
- package/src/unmarshal/promise.test.ts +44 -0
- package/src/unmarshal/promise.ts +31 -0
- package/src/unmarshal/properties.test.ts +11 -9
- package/src/unmarshal/properties.ts +44 -45
- package/src/util.test.ts +14 -2
- package/src/util.ts +18 -8
- package/src/vmmap.test.ts +88 -82
- package/src/vmmap.ts +30 -44
- package/src/vmutil.test.ts +100 -75
- package/src/vmutil.ts +51 -34
- package/src/wrapper.test.ts +129 -167
- package/src/wrapper.ts +59 -62
- package/dist/default.d.ts +0 -4
- package/dist/marshal/function.d.ts +0 -2
- package/dist/marshal/index.d.ts +0 -11
- package/dist/marshal/json.d.ts +0 -2
- package/dist/marshal/object.d.ts +0 -2
- package/dist/marshal/primitive.d.ts +0 -2
- package/dist/marshal/properties.d.ts +0 -2
- package/dist/marshal/symbol.d.ts +0 -2
- package/dist/quickjs-emscripten-sync.cjs +0 -2
- package/dist/quickjs-emscripten-sync.cjs.map +0 -1
- package/dist/quickjs-emscripten-sync.modern.js +0 -2
- package/dist/quickjs-emscripten-sync.modern.js.map +0 -1
- package/dist/quickjs-emscripten-sync.module.js +0 -2
- package/dist/quickjs-emscripten-sync.module.js.map +0 -1
- package/dist/quickjs-emscripten-sync.umd.js.map +0 -1
- package/dist/unmarshal/function.d.ts +0 -2
- package/dist/unmarshal/index.d.ts +0 -9
- package/dist/unmarshal/object.d.ts +0 -2
- package/dist/unmarshal/primitive.d.ts +0 -2
- package/dist/unmarshal/properties.d.ts +0 -2
- package/dist/unmarshal/symbol.d.ts +0 -2
- package/dist/util.d.ts +0 -7
- package/dist/vmmap.d.ts +0 -35
- package/dist/vmutil.d.ts +0 -11
- package/dist/wrapper.d.ts +0 -11
- package/src/marshal/symbol.test.ts +0 -22
- package/src/marshal/symbol.ts +0 -20
- package/src/unmarshal/symbol.test.ts +0 -23
- package/src/unmarshal/symbol.ts +0 -12
package/src/wrapper.test.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { QuickJSHandle, getQuickJS } from "quickjs-emscripten";
|
|
2
|
+
import { expect, test, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { call, eq, json } from "./vmutil";
|
|
2
5
|
import {
|
|
3
6
|
wrap,
|
|
4
7
|
unwrap,
|
|
@@ -8,60 +11,48 @@ import {
|
|
|
8
11
|
isHandleWrapped,
|
|
9
12
|
SyncMode,
|
|
10
13
|
} from "./wrapper";
|
|
11
|
-
import { call, eq, json } from "./vmutil";
|
|
12
14
|
|
|
13
15
|
test("wrap, unwrap, isWrapped", async () => {
|
|
14
|
-
const
|
|
16
|
+
const ctx = (await getQuickJS()).newContext();
|
|
15
17
|
const target = { a: 1 };
|
|
16
|
-
const handle =
|
|
18
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
17
19
|
const proxyKeySymbol = Symbol();
|
|
18
|
-
const proxyKeySymbolHandle =
|
|
19
|
-
const marshal =
|
|
20
|
-
const syncMode =
|
|
20
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
21
|
+
const marshal = vi.fn();
|
|
22
|
+
const syncMode = vi.fn();
|
|
21
23
|
|
|
22
24
|
expect(isWrapped(target, proxyKeySymbol)).toBe(false);
|
|
23
25
|
expect(unwrap(target, proxyKeySymbol)).toBe(target);
|
|
24
26
|
|
|
25
|
-
const wrapped = wrap(
|
|
26
|
-
vm,
|
|
27
|
-
target,
|
|
28
|
-
proxyKeySymbol,
|
|
29
|
-
proxyKeySymbolHandle,
|
|
30
|
-
marshal,
|
|
31
|
-
syncMode
|
|
32
|
-
);
|
|
27
|
+
const wrapped = wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode);
|
|
33
28
|
if (!wrapped) throw new Error("wrapped is undefined");
|
|
34
29
|
|
|
35
30
|
expect(wrapped).toEqual(target);
|
|
36
31
|
expect(isWrapped(wrapped, proxyKeySymbol)).toBe(true);
|
|
37
32
|
expect(unwrap(wrapped, proxyKeySymbol)).toBe(target);
|
|
38
33
|
|
|
34
|
+
expect(wrap(ctx, wrapped, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode)).toBe(wrapped);
|
|
35
|
+
|
|
36
|
+
// promise cannot be wrapped
|
|
39
37
|
expect(
|
|
40
|
-
wrap(
|
|
41
|
-
).
|
|
38
|
+
wrap(ctx, Promise.resolve(1), proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode),
|
|
39
|
+
).toBeUndefined();
|
|
42
40
|
|
|
43
41
|
proxyKeySymbolHandle.dispose();
|
|
44
42
|
handle.dispose();
|
|
45
|
-
|
|
43
|
+
ctx.dispose();
|
|
46
44
|
});
|
|
47
45
|
|
|
48
46
|
test("wrap without sync", async () => {
|
|
49
|
-
const
|
|
47
|
+
const ctx = (await getQuickJS()).newContext();
|
|
50
48
|
const target = { a: 1 };
|
|
51
|
-
const handle =
|
|
49
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
52
50
|
const proxyKeySymbol = Symbol();
|
|
53
|
-
const proxyKeySymbolHandle =
|
|
54
|
-
const marshal =
|
|
55
|
-
const syncMode =
|
|
51
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
52
|
+
const marshal = vi.fn();
|
|
53
|
+
const syncMode = vi.fn();
|
|
56
54
|
|
|
57
|
-
const wrapped = wrap(
|
|
58
|
-
vm,
|
|
59
|
-
target,
|
|
60
|
-
proxyKeySymbol,
|
|
61
|
-
proxyKeySymbolHandle,
|
|
62
|
-
marshal,
|
|
63
|
-
syncMode
|
|
64
|
-
);
|
|
55
|
+
const wrapped = wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode);
|
|
65
56
|
if (!wrapped) throw new Error("wrapped is undefined");
|
|
66
57
|
|
|
67
58
|
expect(marshal).toBeCalledTimes(0);
|
|
@@ -70,39 +61,32 @@ test("wrap without sync", async () => {
|
|
|
70
61
|
wrapped.a = 2;
|
|
71
62
|
|
|
72
63
|
expect(target.a).toBe(2);
|
|
73
|
-
expect(
|
|
64
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(1); // not synced
|
|
74
65
|
expect(marshal).toBeCalledTimes(0);
|
|
75
66
|
expect(syncMode).toBeCalledTimes(1);
|
|
76
67
|
expect(syncMode).toBeCalledWith(wrapped);
|
|
77
68
|
|
|
78
69
|
proxyKeySymbolHandle.dispose();
|
|
79
70
|
handle.dispose();
|
|
80
|
-
|
|
71
|
+
ctx.dispose();
|
|
81
72
|
|
|
82
73
|
wrapped.a = 3; // no error even if vm is disposed
|
|
83
74
|
expect(wrapped.a).toBe(3);
|
|
84
75
|
});
|
|
85
76
|
|
|
86
77
|
test("wrap with both sync", async () => {
|
|
87
|
-
const
|
|
78
|
+
const ctx = (await getQuickJS()).newContext();
|
|
88
79
|
const target = { a: 1 } as { a?: number };
|
|
89
|
-
const handle =
|
|
80
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
90
81
|
const proxyKeySymbol = Symbol();
|
|
91
|
-
const proxyKeySymbolHandle =
|
|
92
|
-
const marshal =
|
|
93
|
-
t === wrapped ? handle : json(
|
|
82
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
83
|
+
const marshal = vi.fn((t: any): [QuickJSHandle, boolean] => [
|
|
84
|
+
t === wrapped ? handle : json(ctx, t),
|
|
94
85
|
false,
|
|
95
86
|
]);
|
|
96
|
-
const syncMode =
|
|
87
|
+
const syncMode = vi.fn((): SyncMode => "both");
|
|
97
88
|
|
|
98
|
-
const wrapped = wrap(
|
|
99
|
-
vm,
|
|
100
|
-
target,
|
|
101
|
-
proxyKeySymbol,
|
|
102
|
-
proxyKeySymbolHandle,
|
|
103
|
-
marshal,
|
|
104
|
-
syncMode
|
|
105
|
-
);
|
|
89
|
+
const wrapped = wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode);
|
|
106
90
|
if (!wrapped) throw new Error("wrapped is undefined");
|
|
107
91
|
|
|
108
92
|
expect(marshal).toBeCalledTimes(0);
|
|
@@ -111,7 +95,7 @@ test("wrap with both sync", async () => {
|
|
|
111
95
|
wrapped.a = 2;
|
|
112
96
|
|
|
113
97
|
expect(target.a).toBe(2);
|
|
114
|
-
expect(
|
|
98
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(2); // synced
|
|
115
99
|
expect(marshal).toBeCalledTimes(3);
|
|
116
100
|
expect(marshal).toBeCalledWith(2);
|
|
117
101
|
expect(marshal).toBeCalledWith("a");
|
|
@@ -120,36 +104,29 @@ test("wrap with both sync", async () => {
|
|
|
120
104
|
|
|
121
105
|
delete wrapped.a;
|
|
122
106
|
expect(target.a).toBe(undefined);
|
|
123
|
-
expect(
|
|
107
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined); // synced
|
|
124
108
|
|
|
125
109
|
proxyKeySymbolHandle.dispose();
|
|
126
110
|
handle.dispose();
|
|
127
|
-
|
|
111
|
+
ctx.dispose();
|
|
128
112
|
|
|
129
113
|
wrapped.a = 3; // no error even if vm is disposed
|
|
130
114
|
expect(wrapped.a).toBe(3);
|
|
131
115
|
});
|
|
132
116
|
|
|
133
117
|
test("wrap with vm sync", async () => {
|
|
134
|
-
const
|
|
118
|
+
const ctx = (await getQuickJS()).newContext();
|
|
135
119
|
const target = { a: 1 } as { a?: number };
|
|
136
|
-
const handle =
|
|
120
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
137
121
|
const proxyKeySymbol = Symbol();
|
|
138
|
-
const proxyKeySymbolHandle =
|
|
139
|
-
const marshal =
|
|
140
|
-
t === wrapped ? handle : json(
|
|
122
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
123
|
+
const marshal = vi.fn((t: any): [QuickJSHandle, boolean] => [
|
|
124
|
+
t === wrapped ? handle : json(ctx, t),
|
|
141
125
|
false,
|
|
142
126
|
]);
|
|
143
|
-
const syncMode =
|
|
127
|
+
const syncMode = vi.fn((): SyncMode => "vm");
|
|
144
128
|
|
|
145
|
-
const wrapped = wrap(
|
|
146
|
-
vm,
|
|
147
|
-
target,
|
|
148
|
-
proxyKeySymbol,
|
|
149
|
-
proxyKeySymbolHandle,
|
|
150
|
-
marshal,
|
|
151
|
-
syncMode
|
|
152
|
-
);
|
|
129
|
+
const wrapped = wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode);
|
|
153
130
|
if (!wrapped) throw new Error("wrapped is undefined");
|
|
154
131
|
|
|
155
132
|
expect(marshal).toBeCalledTimes(0);
|
|
@@ -158,7 +135,7 @@ test("wrap with vm sync", async () => {
|
|
|
158
135
|
wrapped.a = 2;
|
|
159
136
|
|
|
160
137
|
expect(target.a).toBe(1); // not set
|
|
161
|
-
expect(
|
|
138
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(2); // synced
|
|
162
139
|
expect(marshal).toBeCalledTimes(3);
|
|
163
140
|
expect(marshal).toBeCalledWith(2);
|
|
164
141
|
expect(marshal).toBeCalledWith("a");
|
|
@@ -167,94 +144,96 @@ test("wrap with vm sync", async () => {
|
|
|
167
144
|
|
|
168
145
|
delete wrapped.a;
|
|
169
146
|
expect(target.a).toBe(1); // not deleted
|
|
170
|
-
expect(
|
|
147
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined); // synced
|
|
171
148
|
|
|
172
149
|
proxyKeySymbolHandle.dispose();
|
|
173
150
|
handle.dispose();
|
|
174
|
-
|
|
151
|
+
ctx.dispose();
|
|
175
152
|
|
|
176
153
|
wrapped.a = 3; // no error even after vm is disposed
|
|
177
154
|
expect(wrapped.a).toBe(1); // vm mode cannot modify obj in host
|
|
178
155
|
});
|
|
179
156
|
|
|
180
157
|
test("wrapHandle, unwrapHandle, isHandleWrapped", async () => {
|
|
181
|
-
const
|
|
158
|
+
const ctx = (await getQuickJS()).newContext();
|
|
182
159
|
const target = { a: 1 };
|
|
183
|
-
const handle =
|
|
160
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
184
161
|
const proxyKeySymbol = Symbol();
|
|
185
|
-
const proxyKeySymbolHandle =
|
|
186
|
-
const unmarshal =
|
|
187
|
-
const syncMode =
|
|
162
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
163
|
+
const unmarshal = vi.fn();
|
|
164
|
+
const syncMode = vi.fn();
|
|
188
165
|
|
|
189
|
-
expect(isHandleWrapped(
|
|
190
|
-
expect(unwrapHandle(
|
|
191
|
-
handle,
|
|
192
|
-
false,
|
|
193
|
-
]);
|
|
166
|
+
expect(isHandleWrapped(ctx, handle, proxyKeySymbolHandle)).toBe(false);
|
|
167
|
+
expect(unwrapHandle(ctx, handle, proxyKeySymbolHandle)).toEqual([handle, false]);
|
|
194
168
|
|
|
195
169
|
const [wrapped, w] = wrapHandle(
|
|
196
|
-
|
|
170
|
+
ctx,
|
|
197
171
|
handle,
|
|
198
172
|
proxyKeySymbol,
|
|
199
173
|
proxyKeySymbolHandle,
|
|
200
174
|
unmarshal,
|
|
201
|
-
syncMode
|
|
175
|
+
syncMode,
|
|
202
176
|
);
|
|
203
177
|
if (!wrapped || !w) throw new Error("wrapped is undefined");
|
|
204
178
|
|
|
205
|
-
expect(
|
|
206
|
-
expect(
|
|
207
|
-
expect(isHandleWrapped(
|
|
179
|
+
expect(ctx.dump(wrapped)).toEqual(target); // vm.dump does not support proxies
|
|
180
|
+
expect(ctx.dump(ctx.getProp(wrapped, "a"))).toBe(1);
|
|
181
|
+
expect(isHandleWrapped(ctx, wrapped, proxyKeySymbolHandle)).toBe(true);
|
|
208
182
|
|
|
209
|
-
const [handle2, unwrapped2] = unwrapHandle(
|
|
183
|
+
const [handle2, unwrapped2] = unwrapHandle(ctx, wrapped, proxyKeySymbolHandle);
|
|
210
184
|
expect(unwrapped2).toBe(true);
|
|
211
|
-
handle2.consume(
|
|
212
|
-
expect(eq(
|
|
185
|
+
handle2.consume(h => {
|
|
186
|
+
expect(eq(ctx, handle, h)).toBe(true);
|
|
213
187
|
});
|
|
214
188
|
|
|
215
189
|
const [wrapped2] = wrapHandle(
|
|
216
|
-
|
|
190
|
+
ctx,
|
|
217
191
|
wrapped,
|
|
218
192
|
proxyKeySymbol,
|
|
219
193
|
proxyKeySymbolHandle,
|
|
220
194
|
unmarshal,
|
|
221
|
-
syncMode
|
|
195
|
+
syncMode,
|
|
222
196
|
);
|
|
223
197
|
expect(wrapped2 === wrapped).toBe(true);
|
|
224
198
|
|
|
199
|
+
// promise cannot be wrapped
|
|
200
|
+
const deferred = ctx.newPromise();
|
|
201
|
+
expect(isHandleWrapped(ctx, deferred.handle, proxyKeySymbolHandle)).toBe(true);
|
|
202
|
+
|
|
203
|
+
deferred.dispose();
|
|
225
204
|
wrapped.dispose();
|
|
226
205
|
handle.dispose();
|
|
227
206
|
proxyKeySymbolHandle.dispose();
|
|
228
|
-
|
|
207
|
+
ctx.dispose();
|
|
229
208
|
});
|
|
230
209
|
|
|
231
210
|
test("wrapHandle without sync", async () => {
|
|
232
|
-
const
|
|
211
|
+
const ctx = (await getQuickJS()).newContext();
|
|
233
212
|
const target = { a: 1 };
|
|
234
|
-
const handle =
|
|
213
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
235
214
|
const proxyKeySymbol = Symbol();
|
|
236
|
-
const proxyKeySymbolHandle =
|
|
237
|
-
const unmarshal =
|
|
238
|
-
wrapped && eq(
|
|
215
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
216
|
+
const unmarshal = vi.fn((h: QuickJSHandle) =>
|
|
217
|
+
wrapped && eq(ctx, h, wrapped) ? target : ctx.dump(h),
|
|
239
218
|
);
|
|
240
|
-
const syncMode =
|
|
219
|
+
const syncMode = vi.fn();
|
|
241
220
|
|
|
242
221
|
const [wrapped, w] = wrapHandle(
|
|
243
|
-
|
|
222
|
+
ctx,
|
|
244
223
|
handle,
|
|
245
224
|
proxyKeySymbol,
|
|
246
225
|
proxyKeySymbolHandle,
|
|
247
226
|
unmarshal,
|
|
248
|
-
syncMode
|
|
227
|
+
syncMode,
|
|
249
228
|
);
|
|
250
229
|
if (!wrapped || !w) throw new Error("wrapped is undefined");
|
|
251
230
|
|
|
252
231
|
expect(unmarshal).toBeCalledTimes(0);
|
|
253
232
|
expect(syncMode).toBeCalledTimes(0);
|
|
254
233
|
|
|
255
|
-
call(
|
|
234
|
+
call(ctx, `a => a.a = 2`, undefined, wrapped);
|
|
256
235
|
|
|
257
|
-
expect(
|
|
236
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(2);
|
|
258
237
|
expect(target.a).toBe(1); // not synced
|
|
259
238
|
expect(unmarshal).toBeCalledTimes(1);
|
|
260
239
|
expect(unmarshal).toReturnWith(target);
|
|
@@ -264,36 +243,36 @@ test("wrapHandle without sync", async () => {
|
|
|
264
243
|
wrapped.dispose();
|
|
265
244
|
handle.dispose();
|
|
266
245
|
proxyKeySymbolHandle.dispose();
|
|
267
|
-
|
|
246
|
+
ctx.dispose();
|
|
268
247
|
});
|
|
269
248
|
|
|
270
249
|
test("wrapHandle with both sync", async () => {
|
|
271
|
-
const
|
|
250
|
+
const ctx = (await getQuickJS()).newContext();
|
|
272
251
|
const target = { a: 1 };
|
|
273
|
-
const handle =
|
|
252
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
274
253
|
const proxyKeySymbol = Symbol();
|
|
275
|
-
const proxyKeySymbolHandle =
|
|
276
|
-
const unmarshal =
|
|
277
|
-
return wrapped && eq(
|
|
254
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
255
|
+
const unmarshal = vi.fn((h: QuickJSHandle) => {
|
|
256
|
+
return wrapped && eq(ctx, h, wrapped) ? target : ctx.dump(h);
|
|
278
257
|
});
|
|
279
|
-
const syncMode =
|
|
258
|
+
const syncMode = vi.fn((): SyncMode => "both");
|
|
280
259
|
|
|
281
260
|
const [wrapped, w] = wrapHandle(
|
|
282
|
-
|
|
261
|
+
ctx,
|
|
283
262
|
handle,
|
|
284
263
|
proxyKeySymbol,
|
|
285
264
|
proxyKeySymbolHandle,
|
|
286
265
|
unmarshal,
|
|
287
|
-
syncMode
|
|
266
|
+
syncMode,
|
|
288
267
|
);
|
|
289
268
|
if (!wrapped || !w) throw new Error("wrapped is undefined");
|
|
290
269
|
|
|
291
270
|
expect(unmarshal).toBeCalledTimes(0);
|
|
292
271
|
expect(syncMode).toBeCalledTimes(0);
|
|
293
272
|
|
|
294
|
-
call(
|
|
273
|
+
call(ctx, `a => a.a = 2`, undefined, wrapped);
|
|
295
274
|
|
|
296
|
-
expect(
|
|
275
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(2);
|
|
297
276
|
expect(target.a).toBe(2); // synced
|
|
298
277
|
expect(unmarshal).toBeCalledTimes(4);
|
|
299
278
|
expect(unmarshal).toReturnWith(target); // twice
|
|
@@ -302,50 +281,48 @@ test("wrapHandle with both sync", async () => {
|
|
|
302
281
|
expect(syncMode).toBeCalledTimes(1);
|
|
303
282
|
expect(syncMode).toBeCalledWith(target);
|
|
304
283
|
|
|
305
|
-
call(
|
|
306
|
-
expect(
|
|
284
|
+
call(ctx, `a => { delete a.a; }`, undefined, wrapped);
|
|
285
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined);
|
|
307
286
|
expect(target.a).toBe(undefined); // synced
|
|
308
287
|
|
|
309
288
|
// changing __proto__ will be blocked
|
|
310
|
-
call(
|
|
311
|
-
expect(
|
|
312
|
-
null
|
|
313
|
-
);
|
|
289
|
+
call(ctx, `a => { a.__proto__ = null; }`, undefined, wrapped);
|
|
290
|
+
expect(ctx.dump(call(ctx, `Object.getPrototypeOf`, undefined, handle))).toBe(null);
|
|
314
291
|
expect(Object.getPrototypeOf(target)).toBe(Object.prototype); // not changed
|
|
315
292
|
|
|
316
293
|
wrapped.dispose();
|
|
317
294
|
handle.dispose();
|
|
318
295
|
proxyKeySymbolHandle.dispose();
|
|
319
|
-
|
|
296
|
+
ctx.dispose();
|
|
320
297
|
});
|
|
321
298
|
|
|
322
299
|
test("wrapHandle with host sync", async () => {
|
|
323
|
-
const
|
|
300
|
+
const ctx = (await getQuickJS()).newContext();
|
|
324
301
|
const target = { a: 1 };
|
|
325
|
-
const handle =
|
|
302
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
326
303
|
const proxyKeySymbol = Symbol();
|
|
327
|
-
const proxyKeySymbolHandle =
|
|
328
|
-
const unmarshal =
|
|
329
|
-
wrapped && eq(
|
|
304
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
305
|
+
const unmarshal = vi.fn((handle: QuickJSHandle) =>
|
|
306
|
+
wrapped && eq(ctx, handle, wrapped) ? target : ctx.dump(handle),
|
|
330
307
|
);
|
|
331
|
-
const syncMode =
|
|
308
|
+
const syncMode = vi.fn((): SyncMode => "host");
|
|
332
309
|
|
|
333
310
|
const [wrapped, w] = wrapHandle(
|
|
334
|
-
|
|
311
|
+
ctx,
|
|
335
312
|
handle,
|
|
336
313
|
proxyKeySymbol,
|
|
337
314
|
proxyKeySymbolHandle,
|
|
338
315
|
unmarshal,
|
|
339
|
-
syncMode
|
|
316
|
+
syncMode,
|
|
340
317
|
);
|
|
341
318
|
if (!wrapped || !w) throw new Error("wrapped is undefined");
|
|
342
319
|
|
|
343
320
|
expect(unmarshal).toBeCalledTimes(0);
|
|
344
321
|
expect(syncMode).toBeCalledTimes(0);
|
|
345
322
|
|
|
346
|
-
call(
|
|
323
|
+
call(ctx, `a => a.a = 2`, undefined, wrapped);
|
|
347
324
|
|
|
348
|
-
expect(
|
|
325
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(1); // not set
|
|
349
326
|
expect(target.a).toBe(2); // synced
|
|
350
327
|
expect(unmarshal).toBeCalledTimes(4);
|
|
351
328
|
expect(unmarshal).toReturnWith(target); // twice
|
|
@@ -354,53 +331,46 @@ test("wrapHandle with host sync", async () => {
|
|
|
354
331
|
expect(syncMode).toBeCalledTimes(1);
|
|
355
332
|
expect(syncMode).toBeCalledWith(target);
|
|
356
333
|
|
|
357
|
-
call(
|
|
358
|
-
expect(
|
|
334
|
+
call(ctx, `a => delete a.a`, undefined, handle);
|
|
335
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined);
|
|
359
336
|
expect(target.a).toBe(2); // not synced
|
|
360
337
|
|
|
361
338
|
wrapped.dispose();
|
|
362
339
|
handle.dispose();
|
|
363
340
|
proxyKeySymbolHandle.dispose();
|
|
364
|
-
|
|
341
|
+
ctx.dispose();
|
|
365
342
|
});
|
|
366
343
|
|
|
367
344
|
test("wrap and wrapHandle", async () => {
|
|
368
|
-
const
|
|
345
|
+
const ctx = (await getQuickJS()).newContext();
|
|
369
346
|
const target = { a: 1 };
|
|
370
|
-
const handle =
|
|
347
|
+
const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
|
|
371
348
|
const proxyKeySymbol = Symbol();
|
|
372
|
-
const proxyKeySymbolHandle =
|
|
373
|
-
const marshal =
|
|
374
|
-
wrappedHandle && t === wrapped ? wrappedHandle : json(
|
|
349
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
350
|
+
const marshal = vi.fn((t: any): [QuickJSHandle, boolean] => [
|
|
351
|
+
wrappedHandle && t === wrapped ? wrappedHandle : json(ctx, t),
|
|
375
352
|
false,
|
|
376
353
|
]);
|
|
377
|
-
const unmarshal =
|
|
378
|
-
wrappedHandle && eq(
|
|
354
|
+
const unmarshal = vi.fn((handle: QuickJSHandle) =>
|
|
355
|
+
wrappedHandle && eq(ctx, handle, wrappedHandle) ? wrapped : ctx.dump(handle),
|
|
379
356
|
);
|
|
380
|
-
const syncMode =
|
|
357
|
+
const syncMode = vi.fn((): SyncMode => "both");
|
|
381
358
|
|
|
382
|
-
const wrapped = wrap(
|
|
383
|
-
vm,
|
|
384
|
-
target,
|
|
385
|
-
proxyKeySymbol,
|
|
386
|
-
proxyKeySymbolHandle,
|
|
387
|
-
marshal,
|
|
388
|
-
syncMode
|
|
389
|
-
);
|
|
359
|
+
const wrapped = wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode);
|
|
390
360
|
if (!wrapped) throw new Error("wrapped is undefined");
|
|
391
361
|
const [wrappedHandle, w] = wrapHandle(
|
|
392
|
-
|
|
362
|
+
ctx,
|
|
393
363
|
handle,
|
|
394
364
|
proxyKeySymbol,
|
|
395
365
|
proxyKeySymbolHandle,
|
|
396
366
|
unmarshal,
|
|
397
|
-
syncMode
|
|
367
|
+
syncMode,
|
|
398
368
|
);
|
|
399
369
|
if (!wrappedHandle || !w) throw new Error("wrappedHandle is undefined");
|
|
400
370
|
|
|
401
|
-
call(
|
|
371
|
+
call(ctx, `a => a.a = 2`, undefined, wrappedHandle);
|
|
402
372
|
|
|
403
|
-
expect(
|
|
373
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(2);
|
|
404
374
|
expect(target.a).toBe(2);
|
|
405
375
|
expect(marshal).toBeCalledTimes(0);
|
|
406
376
|
expect(unmarshal).toBeCalledTimes(4);
|
|
@@ -413,7 +383,7 @@ test("wrap and wrapHandle", async () => {
|
|
|
413
383
|
|
|
414
384
|
wrapped.a = 3;
|
|
415
385
|
|
|
416
|
-
expect(
|
|
386
|
+
expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(3);
|
|
417
387
|
expect(target.a).toBe(3);
|
|
418
388
|
expect(marshal).toBeCalledTimes(3);
|
|
419
389
|
expect(marshal).toBeCalledWith(wrapped);
|
|
@@ -424,31 +394,23 @@ test("wrap and wrapHandle", async () => {
|
|
|
424
394
|
wrappedHandle.dispose();
|
|
425
395
|
handle.dispose();
|
|
426
396
|
proxyKeySymbolHandle.dispose();
|
|
427
|
-
|
|
397
|
+
ctx.dispose();
|
|
428
398
|
});
|
|
429
399
|
|
|
430
400
|
test("non object", async () => {
|
|
431
|
-
const
|
|
401
|
+
const ctx = (await getQuickJS()).newContext();
|
|
432
402
|
const target = 1;
|
|
433
|
-
const handle =
|
|
403
|
+
const handle = ctx.newNumber(1);
|
|
434
404
|
const proxyKeySymbol = Symbol();
|
|
435
|
-
const proxyKeySymbolHandle =
|
|
405
|
+
const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
|
|
436
406
|
|
|
437
|
-
expect(
|
|
438
|
-
wrap(vm, target, proxyKeySymbol, proxyKeySymbolHandle, jest.fn(), jest.fn())
|
|
439
|
-
).toBe(undefined);
|
|
407
|
+
expect(wrap(ctx, target, proxyKeySymbol, proxyKeySymbolHandle, vi.fn(), vi.fn())).toBe(undefined);
|
|
440
408
|
|
|
441
|
-
expect(
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
proxyKeySymbol,
|
|
446
|
-
proxyKeySymbolHandle,
|
|
447
|
-
jest.fn(),
|
|
448
|
-
jest.fn()
|
|
449
|
-
)
|
|
450
|
-
).toEqual([undefined, false]);
|
|
409
|
+
expect(wrapHandle(ctx, handle, proxyKeySymbol, proxyKeySymbolHandle, vi.fn(), vi.fn())).toEqual([
|
|
410
|
+
undefined,
|
|
411
|
+
false,
|
|
412
|
+
]);
|
|
451
413
|
|
|
452
414
|
proxyKeySymbolHandle.dispose();
|
|
453
|
-
|
|
415
|
+
ctx.dispose();
|
|
454
416
|
});
|