@ricsam/isolate 0.1.4 → 0.1.6

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 (80) hide show
  1. package/README.md +45 -2
  2. package/dist/cjs/internal/async-context/index.cjs +401 -0
  3. package/dist/cjs/internal/async-context/index.cjs.map +10 -0
  4. package/dist/cjs/internal/client/connection.cjs +175 -123
  5. package/dist/cjs/internal/client/connection.cjs.map +3 -3
  6. package/dist/cjs/internal/console/index.cjs +2 -2
  7. package/dist/cjs/internal/console/index.cjs.map +2 -2
  8. package/dist/cjs/internal/core/index.cjs +22 -6
  9. package/dist/cjs/internal/core/index.cjs.map +3 -3
  10. package/dist/cjs/internal/crypto/index.cjs +2 -2
  11. package/dist/cjs/internal/crypto/index.cjs.map +2 -2
  12. package/dist/cjs/internal/daemon/connection.cjs +77 -12
  13. package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
  14. package/dist/cjs/internal/encoding/index.cjs.map +1 -1
  15. package/dist/cjs/internal/fetch/index.cjs +119 -18
  16. package/dist/cjs/internal/fetch/index.cjs.map +3 -3
  17. package/dist/cjs/internal/fetch/stream-state.cjs.map +1 -1
  18. package/dist/cjs/internal/fs/index.cjs +2 -2
  19. package/dist/cjs/internal/fs/index.cjs.map +2 -2
  20. package/dist/cjs/internal/module-loader/bundle.cjs +277 -1
  21. package/dist/cjs/internal/module-loader/bundle.cjs.map +3 -3
  22. package/dist/cjs/internal/path/index.cjs.map +1 -1
  23. package/dist/cjs/internal/playwright/index.cjs +2 -2
  24. package/dist/cjs/internal/playwright/index.cjs.map +2 -2
  25. package/dist/cjs/internal/runtime/index.cjs +78 -6
  26. package/dist/cjs/internal/runtime/index.cjs.map +3 -3
  27. package/dist/cjs/internal/test-environment/index.cjs +2 -2
  28. package/dist/cjs/internal/test-environment/index.cjs.map +2 -2
  29. package/dist/cjs/internal/timers/index.cjs +42 -7
  30. package/dist/cjs/internal/timers/index.cjs.map +3 -3
  31. package/dist/cjs/internal/typecheck/isolate-types.cjs +36 -1
  32. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
  33. package/dist/cjs/package.json +1 -1
  34. package/dist/mjs/internal/async-context/index.mjs +361 -0
  35. package/dist/mjs/internal/async-context/index.mjs.map +10 -0
  36. package/dist/mjs/internal/client/connection.mjs +176 -123
  37. package/dist/mjs/internal/client/connection.mjs.map +3 -3
  38. package/dist/mjs/internal/console/index.mjs +2 -2
  39. package/dist/mjs/internal/console/index.mjs.map +2 -2
  40. package/dist/mjs/internal/core/index.mjs +22 -6
  41. package/dist/mjs/internal/core/index.mjs.map +3 -3
  42. package/dist/mjs/internal/crypto/index.mjs +2 -2
  43. package/dist/mjs/internal/crypto/index.mjs.map +2 -2
  44. package/dist/mjs/internal/daemon/connection.mjs +77 -12
  45. package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
  46. package/dist/mjs/internal/encoding/index.mjs.map +1 -1
  47. package/dist/mjs/internal/fetch/index.mjs +119 -18
  48. package/dist/mjs/internal/fetch/index.mjs.map +3 -3
  49. package/dist/mjs/internal/fetch/stream-state.mjs.map +1 -1
  50. package/dist/mjs/internal/fs/index.mjs +2 -2
  51. package/dist/mjs/internal/fs/index.mjs.map +2 -2
  52. package/dist/mjs/internal/module-loader/bundle.mjs +277 -1
  53. package/dist/mjs/internal/module-loader/bundle.mjs.map +3 -3
  54. package/dist/mjs/internal/path/index.mjs.map +1 -1
  55. package/dist/mjs/internal/playwright/index.mjs +2 -2
  56. package/dist/mjs/internal/playwright/index.mjs.map +2 -2
  57. package/dist/mjs/internal/runtime/index.mjs +78 -6
  58. package/dist/mjs/internal/runtime/index.mjs.map +3 -3
  59. package/dist/mjs/internal/test-environment/index.mjs +2 -2
  60. package/dist/mjs/internal/test-environment/index.mjs.map +2 -2
  61. package/dist/mjs/internal/timers/index.mjs +42 -7
  62. package/dist/mjs/internal/timers/index.mjs.map +3 -3
  63. package/dist/mjs/internal/typecheck/isolate-types.mjs +36 -1
  64. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
  65. package/dist/mjs/package.json +1 -1
  66. package/dist/types/internal/async-context/index.d.ts +5 -0
  67. package/dist/types/internal/console/index.d.ts +1 -1
  68. package/dist/types/internal/core/index.d.ts +2 -2
  69. package/dist/types/internal/crypto/index.d.ts +1 -1
  70. package/dist/types/internal/daemon/types.d.ts +1 -0
  71. package/dist/types/internal/encoding/index.d.ts +1 -1
  72. package/dist/types/internal/fetch/index.d.ts +1 -1
  73. package/dist/types/internal/fetch/stream-state.d.ts +1 -1
  74. package/dist/types/internal/fs/index.d.ts +1 -1
  75. package/dist/types/internal/path/index.d.ts +1 -1
  76. package/dist/types/internal/playwright/index.d.ts +1 -1
  77. package/dist/types/internal/test-environment/index.d.ts +1 -1
  78. package/dist/types/internal/timers/index.d.ts +1 -1
  79. package/dist/types/internal/typecheck/isolate-types.d.ts +2 -2
  80. package/package.json +8 -3
@@ -12,6 +12,7 @@ import {
12
12
  IsolateEvents,
13
13
  ClientEvents,
14
14
  marshalValue,
15
+ unmarshalValue,
15
16
  isPromiseRef,
16
17
  isAsyncIteratorRef,
17
18
  serializeResponse,
@@ -30,6 +31,7 @@ async function connect(options = {}) {
30
31
  const state = {
31
32
  socket,
32
33
  pendingRequests: new Map,
34
+ pendingCallbackCalls: new Map,
33
35
  callbacks: new Map,
34
36
  callbacksNeedingRequestId: new Set,
35
37
  nextRequestId: 1,
@@ -62,6 +64,10 @@ async function connect(options = {}) {
62
64
  pending.reject(new Error("Connection closed"));
63
65
  }
64
66
  state.pendingRequests.clear();
67
+ for (const [, pending] of state.pendingCallbackCalls) {
68
+ pending.reject(new Error("Connection closed"));
69
+ }
70
+ state.pendingCallbackCalls.clear();
65
71
  for (const [, receiver] of state.streamResponses) {
66
72
  receiver.state = "errored";
67
73
  receiver.error = new Error("Connection closed");
@@ -259,6 +265,24 @@ function handleMessage(message, state) {
259
265
  handleCallbackInvoke(invoke, state);
260
266
  break;
261
267
  }
268
+ case MessageType.CALLBACK_RESPONSE: {
269
+ const response = message;
270
+ const pending = state.pendingCallbackCalls.get(response.requestId);
271
+ if (pending) {
272
+ state.pendingCallbackCalls.delete(response.requestId);
273
+ if (response.error) {
274
+ const error = new Error(response.error.message);
275
+ error.name = response.error.name;
276
+ if (response.error.stack) {
277
+ error.stack = response.error.stack;
278
+ }
279
+ pending.reject(error);
280
+ } else {
281
+ pending.resolve(response.result);
282
+ }
283
+ }
284
+ break;
285
+ }
262
286
  case MessageType.PONG:
263
287
  break;
264
288
  case MessageType.CALLBACK_STREAM_CANCEL: {
@@ -499,6 +523,27 @@ async function handleCallbackInvoke(invoke, state) {
499
523
  }
500
524
  }
501
525
  }
526
+ function invokeDaemonCallback(state, callbackId, args) {
527
+ if (!state.connected) {
528
+ return Promise.reject(new Error("Not connected"));
529
+ }
530
+ const requestId = state.nextRequestId++;
531
+ const requestContext = getRequestContext();
532
+ const invoke = {
533
+ type: MessageType.CALLBACK_INVOKE,
534
+ requestId,
535
+ callbackId,
536
+ args,
537
+ context: requestContext ? {
538
+ requestId: requestContext.requestId,
539
+ metadata: requestContext.metadata
540
+ } : undefined
541
+ };
542
+ return new Promise((resolve, reject) => {
543
+ state.pendingCallbackCalls.set(requestId, { resolve, reject });
544
+ sendMessage(state.socket, invoke);
545
+ });
546
+ }
502
547
  function sendMessage(socket, message) {
503
548
  const frame = buildFrame(message);
504
549
  socket.write(frame);
@@ -1365,13 +1410,141 @@ var returnedPromiseRegistry = new Map;
1365
1410
  var returnedIteratorRegistry = new Map;
1366
1411
  function registerCustomFunctions(state, customFunctions) {
1367
1412
  const registrations = {};
1413
+ const addCallbackIdsToRefs = (value) => {
1414
+ if (value === null || typeof value !== "object") {
1415
+ return value;
1416
+ }
1417
+ if (isPromiseRef(value)) {
1418
+ const resolveCallbackId = state.nextCallbackId++;
1419
+ state.callbacks.set(resolveCallbackId, async (...args) => {
1420
+ const promiseId = args[0];
1421
+ const promise = returnedPromiseRegistry.get(promiseId);
1422
+ if (!promise) {
1423
+ throw new Error(`Promise ${promiseId} not found`);
1424
+ }
1425
+ const promiseResult = await promise;
1426
+ returnedPromiseRegistry.delete(promiseId);
1427
+ const marshalledResult = await marshalValue(promiseResult, marshalCtx);
1428
+ return addCallbackIdsToRefs(marshalledResult);
1429
+ });
1430
+ return {
1431
+ ...value,
1432
+ __resolveCallbackId: resolveCallbackId
1433
+ };
1434
+ }
1435
+ if (isAsyncIteratorRef(value)) {
1436
+ const nextCallbackId = state.nextCallbackId++;
1437
+ state.callbacks.set(nextCallbackId, async (...args) => {
1438
+ const iteratorId = args[0];
1439
+ const iterator = returnedIteratorRegistry.get(iteratorId);
1440
+ if (!iterator) {
1441
+ throw new Error(`Iterator ${iteratorId} not found`);
1442
+ }
1443
+ const iterResult = await iterator.next();
1444
+ if (iterResult.done) {
1445
+ returnedIteratorRegistry.delete(iteratorId);
1446
+ }
1447
+ const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1448
+ return {
1449
+ done: iterResult.done,
1450
+ value: addCallbackIdsToRefs(marshalledValue)
1451
+ };
1452
+ });
1453
+ const returnCallbackId = state.nextCallbackId++;
1454
+ state.callbacks.set(returnCallbackId, async (...args) => {
1455
+ const iteratorId = args[0];
1456
+ const returnValue = args[1];
1457
+ const iterator = returnedIteratorRegistry.get(iteratorId);
1458
+ returnedIteratorRegistry.delete(iteratorId);
1459
+ if (!iterator || !iterator.return) {
1460
+ return { done: true, value: undefined };
1461
+ }
1462
+ const iterResult = await iterator.return(returnValue);
1463
+ const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1464
+ return {
1465
+ done: true,
1466
+ value: addCallbackIdsToRefs(marshalledValue)
1467
+ };
1468
+ });
1469
+ const throwCallbackId = state.nextCallbackId++;
1470
+ state.callbacks.set(throwCallbackId, async (...args) => {
1471
+ const iteratorId = args[0];
1472
+ const errorValue = args[1];
1473
+ const iterator = returnedIteratorRegistry.get(iteratorId);
1474
+ if (!iterator) {
1475
+ throw new Error(`Iterator ${iteratorId} not found`);
1476
+ }
1477
+ try {
1478
+ if (!iterator.throw) {
1479
+ throw Object.assign(new Error(errorValue?.message ?? "Iterator does not support throw()"), { name: errorValue?.name ?? "Error", stack: errorValue?.stack });
1480
+ }
1481
+ const thrownError = Object.assign(new Error(errorValue?.message ?? "Iterator throw()"), { name: errorValue?.name ?? "Error", stack: errorValue?.stack });
1482
+ const iterResult = await iterator.throw(thrownError);
1483
+ if (iterResult.done) {
1484
+ returnedIteratorRegistry.delete(iteratorId);
1485
+ }
1486
+ const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1487
+ return {
1488
+ done: iterResult.done,
1489
+ value: addCallbackIdsToRefs(marshalledValue)
1490
+ };
1491
+ } catch (error) {
1492
+ returnedIteratorRegistry.delete(iteratorId);
1493
+ throw error;
1494
+ }
1495
+ });
1496
+ return {
1497
+ ...value,
1498
+ __nextCallbackId: nextCallbackId,
1499
+ __returnCallbackId: returnCallbackId,
1500
+ __throwCallbackId: throwCallbackId
1501
+ };
1502
+ }
1503
+ if (Array.isArray(value)) {
1504
+ return value.map((item) => addCallbackIdsToRefs(item));
1505
+ }
1506
+ const objResult = {};
1507
+ for (const key of Object.keys(value)) {
1508
+ objResult[key] = addCallbackIdsToRefs(value[key]);
1509
+ }
1510
+ return objResult;
1511
+ };
1512
+ const marshalCtx = {
1513
+ registerCallback: (fn) => {
1514
+ const returnedCallbackId = state.nextCallbackId++;
1515
+ state.callbacks.set(returnedCallbackId, async (...args) => {
1516
+ const fnResult = await fn(...args);
1517
+ const marshalledResult = await marshalValue(fnResult, marshalCtx);
1518
+ return addCallbackIdsToRefs(marshalledResult);
1519
+ });
1520
+ return returnedCallbackId;
1521
+ },
1522
+ registerPromise: (promise) => {
1523
+ const promiseId = state.nextCallbackId++;
1524
+ returnedPromiseRegistry.set(promiseId, promise);
1525
+ return promiseId;
1526
+ },
1527
+ registerIterator: (iterator) => {
1528
+ const iteratorId = state.nextCallbackId++;
1529
+ returnedIteratorRegistry.set(iteratorId, iterator);
1530
+ return iteratorId;
1531
+ }
1532
+ };
1533
+ const unmarshalCtx = {};
1534
+ unmarshalCtx.getCallback = (callbackId) => {
1535
+ return async (...args) => {
1536
+ const marshalledArgs = await marshalValue(args, marshalCtx);
1537
+ const result = await invokeDaemonCallback(state, callbackId, addCallbackIdsToRefs(marshalledArgs));
1538
+ return unmarshalValue(result, unmarshalCtx);
1539
+ };
1540
+ };
1368
1541
  for (const [name, def] of Object.entries(customFunctions)) {
1369
1542
  if (def.type === "asyncIterator") {
1370
1543
  const startCallbackId = state.nextCallbackId++;
1371
1544
  state.callbacks.set(startCallbackId, async (...args) => {
1372
1545
  try {
1373
1546
  const fn = def.fn;
1374
- const iterator = fn(...args);
1547
+ const iterator = fn(...unmarshalValue(args, unmarshalCtx));
1375
1548
  const iteratorId = nextClientIteratorId++;
1376
1549
  clientIteratorSessions.set(iteratorId, { iterator });
1377
1550
  return { iteratorId };
@@ -1440,127 +1613,7 @@ function registerCustomFunctions(state, customFunctions) {
1440
1613
  } else {
1441
1614
  const callbackId = state.nextCallbackId++;
1442
1615
  state.callbacks.set(callbackId, async (...args) => {
1443
- const result = await def.fn(...args);
1444
- const addCallbackIdsToRefs = (value) => {
1445
- if (value === null || typeof value !== "object") {
1446
- return value;
1447
- }
1448
- if (isPromiseRef(value)) {
1449
- const resolveCallbackId = state.nextCallbackId++;
1450
- state.callbacks.set(resolveCallbackId, async (...args2) => {
1451
- const promiseId = args2[0];
1452
- const promise = returnedPromiseRegistry.get(promiseId);
1453
- if (!promise) {
1454
- throw new Error(`Promise ${promiseId} not found`);
1455
- }
1456
- const promiseResult = await promise;
1457
- returnedPromiseRegistry.delete(promiseId);
1458
- const marshalledResult = await marshalValue(promiseResult, marshalCtx);
1459
- return addCallbackIdsToRefs(marshalledResult);
1460
- });
1461
- return {
1462
- ...value,
1463
- __resolveCallbackId: resolveCallbackId
1464
- };
1465
- }
1466
- if (isAsyncIteratorRef(value)) {
1467
- const nextCallbackId = state.nextCallbackId++;
1468
- state.callbacks.set(nextCallbackId, async (...args2) => {
1469
- const iteratorId = args2[0];
1470
- const iterator = returnedIteratorRegistry.get(iteratorId);
1471
- if (!iterator) {
1472
- throw new Error(`Iterator ${iteratorId} not found`);
1473
- }
1474
- const iterResult = await iterator.next();
1475
- if (iterResult.done) {
1476
- returnedIteratorRegistry.delete(iteratorId);
1477
- }
1478
- const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1479
- return {
1480
- done: iterResult.done,
1481
- value: addCallbackIdsToRefs(marshalledValue)
1482
- };
1483
- });
1484
- const returnCallbackId = state.nextCallbackId++;
1485
- state.callbacks.set(returnCallbackId, async (...args2) => {
1486
- const iteratorId = args2[0];
1487
- const returnValue = args2[1];
1488
- const iterator = returnedIteratorRegistry.get(iteratorId);
1489
- returnedIteratorRegistry.delete(iteratorId);
1490
- if (!iterator || !iterator.return) {
1491
- return { done: true, value: undefined };
1492
- }
1493
- const iterResult = await iterator.return(returnValue);
1494
- const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1495
- return {
1496
- done: true,
1497
- value: addCallbackIdsToRefs(marshalledValue)
1498
- };
1499
- });
1500
- const throwCallbackId = state.nextCallbackId++;
1501
- state.callbacks.set(throwCallbackId, async (...args2) => {
1502
- const iteratorId = args2[0];
1503
- const errorValue = args2[1];
1504
- const iterator = returnedIteratorRegistry.get(iteratorId);
1505
- if (!iterator) {
1506
- throw new Error(`Iterator ${iteratorId} not found`);
1507
- }
1508
- try {
1509
- if (!iterator.throw) {
1510
- throw Object.assign(new Error(errorValue?.message ?? "Iterator does not support throw()"), { name: errorValue?.name ?? "Error", stack: errorValue?.stack });
1511
- }
1512
- const thrownError = Object.assign(new Error(errorValue?.message ?? "Iterator throw()"), { name: errorValue?.name ?? "Error", stack: errorValue?.stack });
1513
- const iterResult = await iterator.throw(thrownError);
1514
- if (iterResult.done) {
1515
- returnedIteratorRegistry.delete(iteratorId);
1516
- }
1517
- const marshalledValue = await marshalValue(iterResult.value, marshalCtx);
1518
- return {
1519
- done: iterResult.done,
1520
- value: addCallbackIdsToRefs(marshalledValue)
1521
- };
1522
- } catch (error) {
1523
- returnedIteratorRegistry.delete(iteratorId);
1524
- throw error;
1525
- }
1526
- });
1527
- return {
1528
- ...value,
1529
- __nextCallbackId: nextCallbackId,
1530
- __returnCallbackId: returnCallbackId,
1531
- __throwCallbackId: throwCallbackId
1532
- };
1533
- }
1534
- if (Array.isArray(value)) {
1535
- return value.map((item) => addCallbackIdsToRefs(item));
1536
- }
1537
- const objResult = {};
1538
- for (const key of Object.keys(value)) {
1539
- objResult[key] = addCallbackIdsToRefs(value[key]);
1540
- }
1541
- return objResult;
1542
- };
1543
- const marshalCtx = {
1544
- registerCallback: (fn) => {
1545
- const returnedCallbackId = state.nextCallbackId++;
1546
- state.callbacks.set(returnedCallbackId, async (...args2) => {
1547
- const fnResult = await fn(...args2);
1548
- const marshalledResult = await marshalValue(fnResult, marshalCtx);
1549
- return addCallbackIdsToRefs(marshalledResult);
1550
- });
1551
- return returnedCallbackId;
1552
- },
1553
- registerPromise: (promise) => {
1554
- const promiseId = state.nextCallbackId++;
1555
- returnedPromiseRegistry.set(promiseId, promise);
1556
- return promiseId;
1557
- },
1558
- registerIterator: (iterator) => {
1559
- const iteratorId = state.nextCallbackId++;
1560
- returnedIteratorRegistry.set(iteratorId, iterator);
1561
- return iteratorId;
1562
- }
1563
- };
1616
+ const result = await def.fn(...unmarshalValue(args, unmarshalCtx));
1564
1617
  const marshalled = await marshalValue(result, marshalCtx);
1565
1618
  const withCallbackIds = addCallbackIdsToRefs(marshalled);
1566
1619
  return withCallbackIds;
@@ -1869,4 +1922,4 @@ export {
1869
1922
  connect
1870
1923
  };
1871
1924
 
1872
- //# debugId=A51B4D1A68FB019F64756E2164756E21
1925
+ //# debugId=2E442D60377D54C564756E2164756E21