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.
Files changed (76) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +71 -44
  3. package/dist/index.d.ts +116 -23
  4. package/dist/quickjs-emscripten-sync.mjs +842 -0
  5. package/dist/quickjs-emscripten-sync.umd.js +64 -2
  6. package/package.json +22 -53
  7. package/src/default.ts +2 -2
  8. package/src/index.test.ts +223 -59
  9. package/src/index.ts +72 -66
  10. package/src/marshal/custom.test.ts +50 -0
  11. package/src/marshal/custom.ts +36 -0
  12. package/src/marshal/function.test.ts +64 -75
  13. package/src/marshal/function.ts +15 -18
  14. package/src/marshal/index.test.ts +122 -77
  15. package/src/marshal/index.ts +19 -15
  16. package/src/marshal/json.test.ts +37 -41
  17. package/src/marshal/json.ts +5 -7
  18. package/src/marshal/object.test.ts +59 -84
  19. package/src/marshal/object.ts +8 -15
  20. package/src/marshal/primitive.test.ts +18 -21
  21. package/src/marshal/primitive.ts +11 -10
  22. package/src/marshal/promise.test.ts +85 -0
  23. package/src/marshal/promise.ts +19 -0
  24. package/src/marshal/properties.test.ts +24 -27
  25. package/src/marshal/properties.ts +15 -17
  26. package/src/unmarshal/custom.test.ts +50 -0
  27. package/src/unmarshal/custom.ts +31 -0
  28. package/src/unmarshal/function.test.ts +63 -86
  29. package/src/unmarshal/function.ts +13 -22
  30. package/src/unmarshal/index.test.ts +114 -109
  31. package/src/unmarshal/index.ts +15 -14
  32. package/src/unmarshal/object.test.ts +42 -46
  33. package/src/unmarshal/object.ts +16 -20
  34. package/src/unmarshal/primitive.test.ts +17 -15
  35. package/src/unmarshal/primitive.ts +11 -18
  36. package/src/unmarshal/promise.test.ts +44 -0
  37. package/src/unmarshal/promise.ts +31 -0
  38. package/src/unmarshal/properties.test.ts +11 -9
  39. package/src/unmarshal/properties.ts +44 -45
  40. package/src/util.test.ts +14 -2
  41. package/src/util.ts +18 -8
  42. package/src/vmmap.test.ts +88 -82
  43. package/src/vmmap.ts +30 -44
  44. package/src/vmutil.test.ts +100 -75
  45. package/src/vmutil.ts +51 -34
  46. package/src/wrapper.test.ts +129 -167
  47. package/src/wrapper.ts +59 -62
  48. package/dist/default.d.ts +0 -4
  49. package/dist/marshal/function.d.ts +0 -2
  50. package/dist/marshal/index.d.ts +0 -11
  51. package/dist/marshal/json.d.ts +0 -2
  52. package/dist/marshal/object.d.ts +0 -2
  53. package/dist/marshal/primitive.d.ts +0 -2
  54. package/dist/marshal/properties.d.ts +0 -2
  55. package/dist/marshal/symbol.d.ts +0 -2
  56. package/dist/quickjs-emscripten-sync.cjs +0 -2
  57. package/dist/quickjs-emscripten-sync.cjs.map +0 -1
  58. package/dist/quickjs-emscripten-sync.modern.js +0 -2
  59. package/dist/quickjs-emscripten-sync.modern.js.map +0 -1
  60. package/dist/quickjs-emscripten-sync.module.js +0 -2
  61. package/dist/quickjs-emscripten-sync.module.js.map +0 -1
  62. package/dist/quickjs-emscripten-sync.umd.js.map +0 -1
  63. package/dist/unmarshal/function.d.ts +0 -2
  64. package/dist/unmarshal/index.d.ts +0 -9
  65. package/dist/unmarshal/object.d.ts +0 -2
  66. package/dist/unmarshal/primitive.d.ts +0 -2
  67. package/dist/unmarshal/properties.d.ts +0 -2
  68. package/dist/unmarshal/symbol.d.ts +0 -2
  69. package/dist/util.d.ts +0 -7
  70. package/dist/vmmap.d.ts +0 -35
  71. package/dist/vmutil.d.ts +0 -11
  72. package/dist/wrapper.d.ts +0 -11
  73. package/src/marshal/symbol.test.ts +0 -22
  74. package/src/marshal/symbol.ts +0 -20
  75. package/src/unmarshal/symbol.test.ts +0 -23
  76. package/src/unmarshal/symbol.ts +0 -12
@@ -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 vm = (await getQuickJS()).createVm();
16
+ const ctx = (await getQuickJS()).newContext();
15
17
  const target = { a: 1 };
16
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
18
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
17
19
  const proxyKeySymbol = Symbol();
18
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
19
- const marshal = jest.fn();
20
- const syncMode = jest.fn();
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(vm, wrapped, proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode)
41
- ).toBe(wrapped);
38
+ wrap(ctx, Promise.resolve(1), proxyKeySymbol, proxyKeySymbolHandle, marshal, syncMode),
39
+ ).toBeUndefined();
42
40
 
43
41
  proxyKeySymbolHandle.dispose();
44
42
  handle.dispose();
45
- vm.dispose();
43
+ ctx.dispose();
46
44
  });
47
45
 
48
46
  test("wrap without sync", async () => {
49
- const vm = (await getQuickJS()).createVm();
47
+ const ctx = (await getQuickJS()).newContext();
50
48
  const target = { a: 1 };
51
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
49
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
52
50
  const proxyKeySymbol = Symbol();
53
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
54
- const marshal = jest.fn();
55
- const syncMode = jest.fn();
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(vm.dump(vm.getProp(handle, "a"))).toBe(1); // not synced
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
- vm.dispose();
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 vm = (await getQuickJS()).createVm();
78
+ const ctx = (await getQuickJS()).newContext();
88
79
  const target = { a: 1 } as { a?: number };
89
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
80
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
90
81
  const proxyKeySymbol = Symbol();
91
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
92
- const marshal = jest.fn((t: any): [QuickJSHandle, boolean] => [
93
- t === wrapped ? handle : json(vm, t),
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 = jest.fn((): SyncMode => "both");
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(vm.dump(vm.getProp(handle, "a"))).toBe(2); // synced
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(vm.dump(vm.getProp(handle, "a"))).toBe(undefined); // synced
107
+ expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined); // synced
124
108
 
125
109
  proxyKeySymbolHandle.dispose();
126
110
  handle.dispose();
127
- vm.dispose();
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 vm = (await getQuickJS()).createVm();
118
+ const ctx = (await getQuickJS()).newContext();
135
119
  const target = { a: 1 } as { a?: number };
136
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
120
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
137
121
  const proxyKeySymbol = Symbol();
138
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
139
- const marshal = jest.fn((t: any): [QuickJSHandle, boolean] => [
140
- t === wrapped ? handle : json(vm, t),
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 = jest.fn((): SyncMode => "vm");
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(vm.dump(vm.getProp(handle, "a"))).toBe(2); // synced
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(vm.dump(vm.getProp(handle, "a"))).toBe(undefined); // synced
147
+ expect(ctx.dump(ctx.getProp(handle, "a"))).toBe(undefined); // synced
171
148
 
172
149
  proxyKeySymbolHandle.dispose();
173
150
  handle.dispose();
174
- vm.dispose();
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 vm = (await getQuickJS()).createVm();
158
+ const ctx = (await getQuickJS()).newContext();
182
159
  const target = { a: 1 };
183
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
160
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
184
161
  const proxyKeySymbol = Symbol();
185
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
186
- const unmarshal = jest.fn();
187
- const syncMode = jest.fn();
162
+ const proxyKeySymbolHandle = ctx.unwrapResult(ctx.evalCode(`Symbol()`));
163
+ const unmarshal = vi.fn();
164
+ const syncMode = vi.fn();
188
165
 
189
- expect(isHandleWrapped(vm, handle, proxyKeySymbolHandle)).toBe(false);
190
- expect(unwrapHandle(vm, handle, proxyKeySymbolHandle)).toEqual([
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
- vm,
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(vm.dump(wrapped)).toEqual(target); // vm.dump does not support proxies
206
- expect(vm.dump(vm.getProp(wrapped, "a"))).toBe(1);
207
- expect(isHandleWrapped(vm, wrapped, proxyKeySymbolHandle)).toBe(true);
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(vm, wrapped, proxyKeySymbolHandle);
183
+ const [handle2, unwrapped2] = unwrapHandle(ctx, wrapped, proxyKeySymbolHandle);
210
184
  expect(unwrapped2).toBe(true);
211
- handle2.consume((h) => {
212
- expect(eq(vm, handle, h)).toBe(true);
185
+ handle2.consume(h => {
186
+ expect(eq(ctx, handle, h)).toBe(true);
213
187
  });
214
188
 
215
189
  const [wrapped2] = wrapHandle(
216
- vm,
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
- vm.dispose();
207
+ ctx.dispose();
229
208
  });
230
209
 
231
210
  test("wrapHandle without sync", async () => {
232
- const vm = (await getQuickJS()).createVm();
211
+ const ctx = (await getQuickJS()).newContext();
233
212
  const target = { a: 1 };
234
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
213
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
235
214
  const proxyKeySymbol = Symbol();
236
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
237
- const unmarshal = jest.fn((h: QuickJSHandle) =>
238
- wrapped && eq(vm, h, wrapped) ? target : vm.dump(h)
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 = jest.fn();
219
+ const syncMode = vi.fn();
241
220
 
242
221
  const [wrapped, w] = wrapHandle(
243
- vm,
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(vm, `a => a.a = 2`, undefined, wrapped);
234
+ call(ctx, `a => a.a = 2`, undefined, wrapped);
256
235
 
257
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(2);
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
- vm.dispose();
246
+ ctx.dispose();
268
247
  });
269
248
 
270
249
  test("wrapHandle with both sync", async () => {
271
- const vm = (await getQuickJS()).createVm();
250
+ const ctx = (await getQuickJS()).newContext();
272
251
  const target = { a: 1 };
273
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
252
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
274
253
  const proxyKeySymbol = Symbol();
275
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
276
- const unmarshal = jest.fn((h: QuickJSHandle) => {
277
- return wrapped && eq(vm, h, wrapped) ? target : vm.dump(h);
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 = jest.fn((): SyncMode => "both");
258
+ const syncMode = vi.fn((): SyncMode => "both");
280
259
 
281
260
  const [wrapped, w] = wrapHandle(
282
- vm,
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(vm, `a => a.a = 2`, undefined, wrapped);
273
+ call(ctx, `a => a.a = 2`, undefined, wrapped);
295
274
 
296
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(2);
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(vm, `a => { delete a.a; }`, undefined, wrapped);
306
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(undefined);
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(vm, `a => { a.__proto__ = null; }`, undefined, wrapped);
311
- expect(vm.dump(call(vm, `Object.getPrototypeOf`, undefined, handle))).toBe(
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
- vm.dispose();
296
+ ctx.dispose();
320
297
  });
321
298
 
322
299
  test("wrapHandle with host sync", async () => {
323
- const vm = (await getQuickJS()).createVm();
300
+ const ctx = (await getQuickJS()).newContext();
324
301
  const target = { a: 1 };
325
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
302
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
326
303
  const proxyKeySymbol = Symbol();
327
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
328
- const unmarshal = jest.fn((handle: QuickJSHandle) =>
329
- wrapped && eq(vm, handle, wrapped) ? target : vm.dump(handle)
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 = jest.fn((): SyncMode => "host");
308
+ const syncMode = vi.fn((): SyncMode => "host");
332
309
 
333
310
  const [wrapped, w] = wrapHandle(
334
- vm,
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(vm, `a => a.a = 2`, undefined, wrapped);
323
+ call(ctx, `a => a.a = 2`, undefined, wrapped);
347
324
 
348
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(1); // not set
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(vm, `a => delete a.a`, undefined, handle);
358
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(undefined);
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
- vm.dispose();
341
+ ctx.dispose();
365
342
  });
366
343
 
367
344
  test("wrap and wrapHandle", async () => {
368
- const vm = (await getQuickJS()).createVm();
345
+ const ctx = (await getQuickJS()).newContext();
369
346
  const target = { a: 1 };
370
- const handle = vm.unwrapResult(vm.evalCode(`({ a: 1 })`));
347
+ const handle = ctx.unwrapResult(ctx.evalCode(`({ a: 1 })`));
371
348
  const proxyKeySymbol = Symbol();
372
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
373
- const marshal = jest.fn((t: any): [QuickJSHandle, boolean] => [
374
- wrappedHandle && t === wrapped ? wrappedHandle : json(vm, t),
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 = jest.fn((handle: QuickJSHandle) =>
378
- wrappedHandle && eq(vm, handle, wrappedHandle) ? wrapped : vm.dump(handle)
354
+ const unmarshal = vi.fn((handle: QuickJSHandle) =>
355
+ wrappedHandle && eq(ctx, handle, wrappedHandle) ? wrapped : ctx.dump(handle),
379
356
  );
380
- const syncMode = jest.fn((): SyncMode => "both");
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
- vm,
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(vm, `a => a.a = 2`, undefined, wrappedHandle);
371
+ call(ctx, `a => a.a = 2`, undefined, wrappedHandle);
402
372
 
403
- expect(vm.dump(vm.getProp(handle, "a"))).toBe(2);
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(vm.dump(vm.getProp(handle, "a"))).toBe(3);
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
- vm.dispose();
397
+ ctx.dispose();
428
398
  });
429
399
 
430
400
  test("non object", async () => {
431
- const vm = (await getQuickJS()).createVm();
401
+ const ctx = (await getQuickJS()).newContext();
432
402
  const target = 1;
433
- const handle = vm.newNumber(1);
403
+ const handle = ctx.newNumber(1);
434
404
  const proxyKeySymbol = Symbol();
435
- const proxyKeySymbolHandle = vm.unwrapResult(vm.evalCode(`Symbol()`));
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
- wrapHandle(
443
- vm,
444
- handle,
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
- vm.dispose();
415
+ ctx.dispose();
454
416
  });