WIP: Node.js isolation primitive to run asynchronous worker-like operations without leaking async IO
at main 2.2 kB view raw
1import { beforeAll, afterAll, it, expect } from 'vitest'; 2import { enable, disable, fiber } from '../src/index'; 3 4beforeAll(() => { 5 enable(); 6}); 7 8afterAll(() => { 9 disable(); 10}); 11 12it('prevents async resources from being shared into a fiber (sync)', async () => { 13 const shared = new Promise(resolve => { 14 setImmediate(resolve); 15 }); 16 17 await expect(() => { 18 return fiber(async () => { 19 await shared; 20 }).return; 21 }).rejects.toMatchObject({ 22 code: 'PARENT_ASYNC_TRIGGER', 23 }); 24}); 25 26it('prevents async resources from being shared into a fiber (async)', async () => { 27 const shared = new Promise(resolve => { 28 setImmediate(resolve); 29 }); 30 31 await expect(() => { 32 return fiber(async () => { 33 await Promise.resolve(); 34 await shared; 35 }).return; 36 }).rejects.toMatchObject({ 37 code: 'PARENT_ASYNC_TRIGGER', 38 }); 39}); 40 41it('prevents async resources from being shared across fibers (sync)', async () => { 42 let shared: Promise<unknown>; 43 44 fiber(async () => { 45 shared = new Promise(resolve => { 46 setImmediate(resolve); 47 }); 48 }); 49 50 await expect(() => { 51 return fiber(async () => { 52 await shared; 53 }).return; 54 }).rejects.toMatchObject({ 55 code: 'FOREIGN_ASYNC_TRIGGER', 56 }); 57}); 58 59it('prevents async resources from being shared across fibers (async)', async () => { 60 let shared: Promise<unknown>; 61 62 fiber(async () => { 63 shared = new Promise(resolve => { 64 setImmediate(resolve); 65 }); 66 }); 67 68 await expect(() => { 69 return fiber(async () => { 70 await Promise.resolve(); 71 await shared; 72 }).return; 73 }).rejects.toMatchObject({ 74 code: 'FOREIGN_ASYNC_TRIGGER', 75 }); 76}); 77 78it('prevents `new Promise` stalls from waiting indefinitely (sync)', async () => { 79 await expect(() => { 80 return fiber(async () => { 81 await new Promise(() => { 82 /*noop*/ 83 }); 84 }).return; 85 }).rejects.toMatchObject({ 86 code: 'FIBER_STALL', 87 }); 88}); 89 90it('prevents `new Promise` stalls from waiting indefinitely (async)', async () => { 91 await expect(() => { 92 return fiber(async () => { 93 await Promise.resolve(); 94 await new Promise(() => { 95 /*noop*/ 96 }); 97 }).return; 98 }).rejects.toMatchObject({ 99 code: 'FIBER_STALL', 100 }); 101});