WIP: Node.js isolation primitive to run asynchronous worker-like operations without leaking async IO

fix: [init] (#1)

* Add missing toJSON

* Fix init event and rename to _onInit

* Fix typo preventing root fiber node from becoming active again

* Add simple tests

* Add changeset

+5
.changeset/six-chicken-float.md
···
+
---
+
'fiber-dev': patch
+
---
+
+
Prevent typos causing accidental state tracking issues
+3
.github/workflows/ci.yml
···
- name: Install Dependencies
run: pnpm install --frozen-lockfile --prefer-offline
+
- name: Unit Tests
+
run: pnpm run test
+
- name: Type checks
run: pnpm run check
-1
.gitignore
···
node_modules
dist
-
test
+12 -2
package.json
···
"dist/"
],
"scripts": {
+
"test": "vitest run",
"build": "rollup -c ./scripts/rollup.config.mjs",
"postbuild": "tsc --noEmit ./dist/fiber-dev.d.ts",
"check": "tsc --noEmit",
"clean": "rimraf dist node_modules/.cache",
-
"prepublishOnly": "run-s clean build check",
+
"prepublishOnly": "run-s clean build check test",
"prepare": "node ./scripts/prepare.js || true",
"changeset:version": "changeset version && pnpm install --lockfile-only",
"changeset:publish": "changeset publish"
···
"rollup": "^4.32.1",
"rollup-plugin-cjs-check": "^1.0.3",
"rollup-plugin-dts": "^6.1.1",
-
"typescript": "^5.7.3"
+
"typescript": "^5.7.3",
+
"vitest": "^3.0.8"
},
"publishConfig": {
"access": "public",
"provenance": true
+
},
+
"pnpm": {
+
"ignoredBuiltDependencies": [
+
"esbuild"
+
],
+
"onlyBuiltDependencies": [
+
"esbuild"
+
]
}
}
+619
pnpm-lock.yaml
···
typescript:
specifier: ^5.7.3
version: 5.7.3
+
vitest:
+
specifier: ^3.0.8
+
version: 3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)
packages:
···
'@changesets/write@0.4.0':
resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==}
+
'@esbuild/aix-ppc64@0.25.1':
+
resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [aix]
+
+
'@esbuild/android-arm64@0.25.1':
+
resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [android]
+
+
'@esbuild/android-arm@0.25.1':
+
resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [android]
+
+
'@esbuild/android-x64@0.25.1':
+
resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [android]
+
+
'@esbuild/darwin-arm64@0.25.1':
+
resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [darwin]
+
+
'@esbuild/darwin-x64@0.25.1':
+
resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [darwin]
+
+
'@esbuild/freebsd-arm64@0.25.1':
+
resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [freebsd]
+
+
'@esbuild/freebsd-x64@0.25.1':
+
resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [freebsd]
+
+
'@esbuild/linux-arm64@0.25.1':
+
resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [linux]
+
+
'@esbuild/linux-arm@0.25.1':
+
resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==}
+
engines: {node: '>=18'}
+
cpu: [arm]
+
os: [linux]
+
+
'@esbuild/linux-ia32@0.25.1':
+
resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [linux]
+
+
'@esbuild/linux-loong64@0.25.1':
+
resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==}
+
engines: {node: '>=18'}
+
cpu: [loong64]
+
os: [linux]
+
+
'@esbuild/linux-mips64el@0.25.1':
+
resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==}
+
engines: {node: '>=18'}
+
cpu: [mips64el]
+
os: [linux]
+
+
'@esbuild/linux-ppc64@0.25.1':
+
resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==}
+
engines: {node: '>=18'}
+
cpu: [ppc64]
+
os: [linux]
+
+
'@esbuild/linux-riscv64@0.25.1':
+
resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==}
+
engines: {node: '>=18'}
+
cpu: [riscv64]
+
os: [linux]
+
+
'@esbuild/linux-s390x@0.25.1':
+
resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==}
+
engines: {node: '>=18'}
+
cpu: [s390x]
+
os: [linux]
+
+
'@esbuild/linux-x64@0.25.1':
+
resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [linux]
+
+
'@esbuild/netbsd-arm64@0.25.1':
+
resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [netbsd]
+
+
'@esbuild/netbsd-x64@0.25.1':
+
resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [netbsd]
+
+
'@esbuild/openbsd-arm64@0.25.1':
+
resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [openbsd]
+
+
'@esbuild/openbsd-x64@0.25.1':
+
resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [openbsd]
+
+
'@esbuild/sunos-x64@0.25.1':
+
resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [sunos]
+
+
'@esbuild/win32-arm64@0.25.1':
+
resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==}
+
engines: {node: '>=18'}
+
cpu: [arm64]
+
os: [win32]
+
+
'@esbuild/win32-ia32@0.25.1':
+
resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==}
+
engines: {node: '>=18'}
+
cpu: [ia32]
+
os: [win32]
+
+
'@esbuild/win32-x64@0.25.1':
+
resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==}
+
engines: {node: '>=18'}
+
cpu: [x64]
+
os: [win32]
+
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
···
'@types/resolve@1.20.2':
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
+
'@vitest/expect@3.0.8':
+
resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==}
+
+
'@vitest/mocker@3.0.8':
+
resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==}
+
peerDependencies:
+
msw: ^2.4.9
+
vite: ^5.0.0 || ^6.0.0
+
peerDependenciesMeta:
+
msw:
+
optional: true
+
vite:
+
optional: true
+
+
'@vitest/pretty-format@3.0.8':
+
resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==}
+
+
'@vitest/runner@3.0.8':
+
resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==}
+
+
'@vitest/snapshot@3.0.8':
+
resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==}
+
+
'@vitest/spy@3.0.8':
+
resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==}
+
+
'@vitest/utils@3.0.8':
+
resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==}
+
acorn@8.14.1:
resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
engines: {node: '>=0.4.0'}
···
resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
engines: {node: '>= 0.4'}
+
assertion-error@2.0.1:
+
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+
engines: {node: '>=12'}
+
async-function@1.0.0:
resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
engines: {node: '>= 0.4'}
···
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
cac@6.7.14:
+
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+
engines: {node: '>=8'}
+
call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
engines: {node: '>= 0.4'}
···
caniuse-lite@1.0.30001703:
resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==}
+
+
chai@5.2.0:
+
resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
+
engines: {node: '>=12'}
chalk@2.4.2:
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
···
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
check-error@2.1.1:
+
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+
engines: {node: '>= 16'}
+
ci-info@3.9.0:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
···
supports-color:
optional: true
+
deep-eql@5.0.2:
+
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+
engines: {node: '>=6'}
+
deepmerge@4.3.1:
resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
engines: {node: '>=0.10.0'}
···
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
+
es-module-lexer@1.6.0:
+
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
···
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
+
esbuild@0.25.1:
+
resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==}
+
engines: {node: '>=18'}
+
hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
···
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
estree-walker@3.0.3:
+
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
···
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
+
expect-type@1.2.0:
+
resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==}
+
engines: {node: '>=12.0.0'}
+
extendable-error@0.1.7:
resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
···
resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
engines: {node: '>=18'}
+
loupe@3.1.3:
+
resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==}
+
lru-cache@11.0.2:
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
engines: {node: 20 || >=22}
···
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+
nanoid@3.3.9:
+
resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==}
+
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+
hasBin: true
nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
···
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
+
pathe@2.0.3:
+
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+
pathval@2.0.0:
+
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+
engines: {node: '>= 14.16'}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
···
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
+
postcss@8.5.3:
+
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+
engines: {node: ^10 || ^12 || >=14}
+
prettier@2.8.8:
resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
engines: {node: '>=10.13.0'}
···
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
+
siginfo@2.0.0:
+
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
···
smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
+
+
source-map-js@1.2.1:
+
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+
engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
···
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+
stackback@0.0.2:
+
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+
std-env@3.8.1:
+
resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
string-argv@0.3.2:
resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
···
engines: {node: '>=10'}
hasBin: true
+
tinybench@2.9.0:
+
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+
tinyexec@0.3.2:
+
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+
tinypool@1.0.2:
+
resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+
engines: {node: ^18.0.0 || >=20.0.0}
+
+
tinyrainbow@2.0.0:
+
resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+
engines: {node: '>=14.0.0'}
+
+
tinyspy@3.0.2:
+
resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+
engines: {node: '>=14.0.0'}
+
tmp@0.0.33:
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
engines: {node: '>=0.6.0'}
···
validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
vite-node@3.0.8:
+
resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
+
vite@6.2.1:
+
resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
peerDependencies:
+
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+
jiti: '>=1.21.0'
+
less: '*'
+
lightningcss: ^1.21.0
+
sass: '*'
+
sass-embedded: '*'
+
stylus: '*'
+
sugarss: '*'
+
terser: ^5.16.0
+
tsx: ^4.8.1
+
yaml: ^2.4.2
+
peerDependenciesMeta:
+
'@types/node':
+
optional: true
+
jiti:
+
optional: true
+
less:
+
optional: true
+
lightningcss:
+
optional: true
+
sass:
+
optional: true
+
sass-embedded:
+
optional: true
+
stylus:
+
optional: true
+
sugarss:
+
optional: true
+
terser:
+
optional: true
+
tsx:
+
optional: true
+
yaml:
+
optional: true
+
+
vitest@3.0.8:
+
resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==}
+
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+
hasBin: true
+
peerDependencies:
+
'@edge-runtime/vm': '*'
+
'@types/debug': ^4.1.12
+
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+
'@vitest/browser': 3.0.8
+
'@vitest/ui': 3.0.8
+
happy-dom: '*'
+
jsdom: '*'
+
peerDependenciesMeta:
+
'@edge-runtime/vm':
+
optional: true
+
'@types/debug':
+
optional: true
+
'@types/node':
+
optional: true
+
'@vitest/browser':
+
optional: true
+
'@vitest/ui':
+
optional: true
+
happy-dom:
+
optional: true
+
jsdom:
+
optional: true
+
webidl-conversions@3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
···
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
+
hasBin: true
+
+
why-is-node-running@2.3.0:
+
resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+
engines: {node: '>=8'}
hasBin: true
wrap-ansi@7.0.0:
···
human-id: 4.1.1
prettier: 2.8.8
+
'@esbuild/aix-ppc64@0.25.1':
+
optional: true
+
+
'@esbuild/android-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/android-arm@0.25.1':
+
optional: true
+
+
'@esbuild/android-x64@0.25.1':
+
optional: true
+
+
'@esbuild/darwin-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/darwin-x64@0.25.1':
+
optional: true
+
+
'@esbuild/freebsd-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/freebsd-x64@0.25.1':
+
optional: true
+
+
'@esbuild/linux-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/linux-arm@0.25.1':
+
optional: true
+
+
'@esbuild/linux-ia32@0.25.1':
+
optional: true
+
+
'@esbuild/linux-loong64@0.25.1':
+
optional: true
+
+
'@esbuild/linux-mips64el@0.25.1':
+
optional: true
+
+
'@esbuild/linux-ppc64@0.25.1':
+
optional: true
+
+
'@esbuild/linux-riscv64@0.25.1':
+
optional: true
+
+
'@esbuild/linux-s390x@0.25.1':
+
optional: true
+
+
'@esbuild/linux-x64@0.25.1':
+
optional: true
+
+
'@esbuild/netbsd-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/netbsd-x64@0.25.1':
+
optional: true
+
+
'@esbuild/openbsd-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/openbsd-x64@0.25.1':
+
optional: true
+
+
'@esbuild/sunos-x64@0.25.1':
+
optional: true
+
+
'@esbuild/win32-arm64@0.25.1':
+
optional: true
+
+
'@esbuild/win32-ia32@0.25.1':
+
optional: true
+
+
'@esbuild/win32-x64@0.25.1':
+
optional: true
+
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
···
'@types/resolve@1.20.2': {}
+
'@vitest/expect@3.0.8':
+
dependencies:
+
'@vitest/spy': 3.0.8
+
'@vitest/utils': 3.0.8
+
chai: 5.2.0
+
tinyrainbow: 2.0.0
+
+
'@vitest/mocker@3.0.8(vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0))':
+
dependencies:
+
'@vitest/spy': 3.0.8
+
estree-walker: 3.0.3
+
magic-string: 0.30.17
+
optionalDependencies:
+
vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)
+
+
'@vitest/pretty-format@3.0.8':
+
dependencies:
+
tinyrainbow: 2.0.0
+
+
'@vitest/runner@3.0.8':
+
dependencies:
+
'@vitest/utils': 3.0.8
+
pathe: 2.0.3
+
+
'@vitest/snapshot@3.0.8':
+
dependencies:
+
'@vitest/pretty-format': 3.0.8
+
magic-string: 0.30.17
+
pathe: 2.0.3
+
+
'@vitest/spy@3.0.8':
+
dependencies:
+
tinyspy: 3.0.2
+
+
'@vitest/utils@3.0.8':
+
dependencies:
+
'@vitest/pretty-format': 3.0.8
+
loupe: 3.1.3
+
tinyrainbow: 2.0.0
+
acorn@8.14.1: {}
ansi-colors@4.1.3: {}
···
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
+
assertion-error@2.0.1: {}
+
async-function@1.0.0: {}
available-typed-arrays@1.0.7:
···
buffer-from@1.1.2: {}
+
cac@6.7.14: {}
+
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
···
caniuse-lite@1.0.30001703: {}
+
chai@5.2.0:
+
dependencies:
+
assertion-error: 2.0.1
+
check-error: 2.1.1
+
deep-eql: 5.0.2
+
loupe: 3.1.3
+
pathval: 2.0.0
+
chalk@2.4.2:
dependencies:
ansi-styles: 3.2.1
···
chalk@5.4.1: {}
chardet@0.7.0: {}
+
+
check-error@2.1.1: {}
ci-info@3.9.0: {}
···
dependencies:
ms: 2.1.3
+
deep-eql@5.0.2: {}
+
deepmerge@4.3.1: {}
define-data-property@1.1.4:
···
es-errors@1.3.0: {}
+
es-module-lexer@1.6.0: {}
+
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
···
is-date-object: 1.1.0
is-symbol: 1.1.1
+
esbuild@0.25.1:
+
optionalDependencies:
+
'@esbuild/aix-ppc64': 0.25.1
+
'@esbuild/android-arm': 0.25.1
+
'@esbuild/android-arm64': 0.25.1
+
'@esbuild/android-x64': 0.25.1
+
'@esbuild/darwin-arm64': 0.25.1
+
'@esbuild/darwin-x64': 0.25.1
+
'@esbuild/freebsd-arm64': 0.25.1
+
'@esbuild/freebsd-x64': 0.25.1
+
'@esbuild/linux-arm': 0.25.1
+
'@esbuild/linux-arm64': 0.25.1
+
'@esbuild/linux-ia32': 0.25.1
+
'@esbuild/linux-loong64': 0.25.1
+
'@esbuild/linux-mips64el': 0.25.1
+
'@esbuild/linux-ppc64': 0.25.1
+
'@esbuild/linux-riscv64': 0.25.1
+
'@esbuild/linux-s390x': 0.25.1
+
'@esbuild/linux-x64': 0.25.1
+
'@esbuild/netbsd-arm64': 0.25.1
+
'@esbuild/netbsd-x64': 0.25.1
+
'@esbuild/openbsd-arm64': 0.25.1
+
'@esbuild/openbsd-x64': 0.25.1
+
'@esbuild/sunos-x64': 0.25.1
+
'@esbuild/win32-arm64': 0.25.1
+
'@esbuild/win32-ia32': 0.25.1
+
'@esbuild/win32-x64': 0.25.1
+
escalade@3.2.0: {}
escape-string-regexp@1.0.5: {}
···
estree-walker@2.0.2: {}
+
estree-walker@3.0.3:
+
dependencies:
+
'@types/estree': 1.0.6
+
eventemitter3@5.0.1: {}
execa@8.0.1:
···
onetime: 6.0.0
signal-exit: 4.1.0
strip-final-newline: 3.0.0
+
+
expect-type@1.2.0: {}
extendable-error@0.1.7: {}
···
strip-ansi: 7.1.0
wrap-ansi: 9.0.0
+
loupe@3.1.3: {}
+
lru-cache@11.0.2: {}
lru-cache@5.1.1:
···
mri@1.2.0: {}
ms@2.1.3: {}
+
+
nanoid@3.3.9: {}
nice-try@1.0.5: {}
···
path-type@4.0.0: {}
+
pathe@2.0.3: {}
+
+
pathval@2.0.0: {}
+
picocolors@1.1.1: {}
picomatch@2.3.1: {}
···
possible-typed-array-names@1.1.0: {}
+
postcss@8.5.3:
+
dependencies:
+
nanoid: 3.3.9
+
picocolors: 1.1.1
+
source-map-js: 1.2.1
+
prettier@2.8.8: {}
prettier@3.5.3: {}
···
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
+
siginfo@2.0.0: {}
+
signal-exit@4.1.0: {}
slash@3.0.0: {}
···
is-fullwidth-code-point: 5.0.0
smob@1.5.0: {}
+
+
source-map-js@1.2.1: {}
source-map-support@0.5.21:
dependencies:
···
spdx-license-ids@3.0.21: {}
sprintf-js@1.0.3: {}
+
+
stackback@0.0.2: {}
+
+
std-env@3.8.1: {}
string-argv@0.3.2: {}
···
commander: 2.20.3
source-map-support: 0.5.21
+
tinybench@2.9.0: {}
+
+
tinyexec@0.3.2: {}
+
+
tinypool@1.0.2: {}
+
+
tinyrainbow@2.0.0: {}
+
+
tinyspy@3.0.2: {}
+
tmp@0.0.33:
dependencies:
os-tmpdir: 1.0.2
···
spdx-correct: 3.2.0
spdx-expression-parse: 3.0.1
+
vite-node@3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0):
+
dependencies:
+
cac: 6.7.14
+
debug: 4.4.0
+
es-module-lexer: 1.6.0
+
pathe: 2.0.3
+
vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)
+
transitivePeerDependencies:
+
- '@types/node'
+
- jiti
+
- less
+
- lightningcss
+
- sass
+
- sass-embedded
+
- stylus
+
- sugarss
+
- supports-color
+
- terser
+
- tsx
+
- yaml
+
+
vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0):
+
dependencies:
+
esbuild: 0.25.1
+
postcss: 8.5.3
+
rollup: 4.34.9
+
optionalDependencies:
+
'@types/node': 18.19.76
+
fsevents: 2.3.3
+
terser: 5.39.0
+
yaml: 2.7.0
+
+
vitest@3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0):
+
dependencies:
+
'@vitest/expect': 3.0.8
+
'@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0))
+
'@vitest/pretty-format': 3.0.8
+
'@vitest/runner': 3.0.8
+
'@vitest/snapshot': 3.0.8
+
'@vitest/spy': 3.0.8
+
'@vitest/utils': 3.0.8
+
chai: 5.2.0
+
debug: 4.4.0
+
expect-type: 1.2.0
+
magic-string: 0.30.17
+
pathe: 2.0.3
+
std-env: 3.8.1
+
tinybench: 2.9.0
+
tinyexec: 0.3.2
+
tinypool: 1.0.2
+
tinyrainbow: 2.0.0
+
vite: 6.2.1(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)
+
vite-node: 3.0.8(@types/node@18.19.76)(terser@5.39.0)(yaml@2.7.0)
+
why-is-node-running: 2.3.0
+
optionalDependencies:
+
'@types/node': 18.19.76
+
transitivePeerDependencies:
+
- jiti
+
- less
+
- lightningcss
+
- msw
+
- sass
+
- sass-embedded
+
- stylus
+
- sugarss
+
- supports-color
+
- terser
+
- tsx
+
- yaml
+
webidl-conversions@3.0.1: {}
whatwg-url@5.0.0:
···
which@2.0.2:
dependencies:
isexe: 2.0.0
+
+
why-is-node-running@2.3.0:
+
dependencies:
+
siginfo: 2.0.0
+
stackback: 0.0.2
wrap-ansi@7.0.0:
dependencies:
+8 -5
src/asyncResourceGraph.ts
···
this.callback = callback;
}
-
_onExecute(executionNode: AsyncResourceNode, node: AsyncResourceNode) {
-
this.callback(AsyncResourceFlags.INIT, executionNode);
+
_onInit(node: AsyncResourceNode) {
+
this.callback(AsyncResourceFlags.INIT, node);
if (node.fiberId === this.fiberId) {
this.observe(node);
}
···
triggerNode.triggerTargets.set(asyncId, node);
}
if (this.notifyObserver) {
-
this.notifyObserver._onExecute(this, node);
+
this.notifyObserver._onInit(node);
}
}
···
}
toString() {
-
return `[async ${this.type || `Fiber: ${this.fiberId}`}]`;
+
const name = this.type
+
? `${this.type}(${this.asyncId})`
+
: `Fiber: ${this.fiberId}`;
+
return `[async ${name}]`;
}
}
···
return watchdogResult.promise;
} finally {
-
fiber.root.active = false;
+
fiber.root.active = true;
}
}
+4
src/errors.ts
···
toString() {
return `${this.message.trim()}\n\n${this.trace}`;
}
+
+
toJSON() {
+
return this.toString();
+
}
}
+101
test/isolation.spec.ts
···
+
import { beforeAll, afterAll, it, expect } from 'vitest';
+
import { enable, disable, fiber } from '../src/index';
+
+
beforeAll(() => {
+
enable();
+
});
+
+
afterAll(() => {
+
disable();
+
});
+
+
it('prevents async resources from being shared into a fiber (sync)', async () => {
+
const shared = new Promise(resolve => {
+
setImmediate(resolve);
+
});
+
+
await expect(() => {
+
return fiber(async () => {
+
await shared;
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'PARENT_ASYNC_TRIGGER',
+
});
+
});
+
+
it('prevents async resources from being shared into a fiber (async)', async () => {
+
const shared = new Promise(resolve => {
+
setImmediate(resolve);
+
});
+
+
await expect(() => {
+
return fiber(async () => {
+
await Promise.resolve();
+
await shared;
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'PARENT_ASYNC_TRIGGER',
+
});
+
});
+
+
it('prevents async resources from being shared across fibers (sync)', async () => {
+
let shared: Promise<unknown>;
+
+
fiber(async () => {
+
shared = new Promise(resolve => {
+
setImmediate(resolve);
+
});
+
});
+
+
await expect(() => {
+
return fiber(async () => {
+
await shared;
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'FOREIGN_ASYNC_TRIGGER',
+
});
+
});
+
+
it('prevents async resources from being shared across fibers (async)', async () => {
+
let shared: Promise<unknown>;
+
+
fiber(async () => {
+
shared = new Promise(resolve => {
+
setImmediate(resolve);
+
});
+
});
+
+
await expect(() => {
+
return fiber(async () => {
+
await Promise.resolve();
+
await shared;
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'FOREIGN_ASYNC_TRIGGER',
+
});
+
});
+
+
it('prevents `new Promise` stalls from waiting indefinitely (sync)', async () => {
+
await expect(() => {
+
return fiber(async () => {
+
await new Promise(() => {
+
/*noop*/
+
});
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'FIBER_STALL',
+
});
+
});
+
+
it('prevents `new Promise` stalls from waiting indefinitely (async)', async () => {
+
await expect(() => {
+
return fiber(async () => {
+
await Promise.resolve();
+
await new Promise(() => {
+
/*noop*/
+
});
+
}).return;
+
}).rejects.toMatchObject({
+
code: 'FIBER_STALL',
+
});
+
});