Работник работает нормально в стандартной среде Node.js, но при выполнении под Next.js Edge Runtime он никогда не отвечает.
middleware.ts
Код: Выделить всё
import { NextResponse } from 'next/server';
export const config = {
matcher: '/api/:path*',
runtime: 'edge',
};
export async function middleware(req: Request) {
const worker = new Worker(new URL('./waiter.js', import.meta.url), { type: 'module' });
worker.postMessage('start');
const result = await new Promise((resolve) => {
worker.onmessage = (e) => resolve(e.data);
});
return NextResponse.json({ message: result });
}
Код: Выделить всё
const buffer = new SharedArrayBuffer(4);
const view = new Int32Array(buffer);
onmessage = async () => {
Atomics.store(view, 0, 0);
await Atomics.waitAsync(view, 0, 0).value; // ← hangs forever in Edge runtime
postMessage('done');
};
Если я удаляю Atomics.waitAsync(), рабочий завершает работу нормально.
Вопрос
Почему использование Atomics.waitAsync() внутри веб-воркера приводит к зависанию Edge Runtime в промежуточном программном обеспечении Next.js 15 на неопределенный срок, и связано ли это с этим в Edge Runtime отсутствует поддержка ожидаемых атомов или как изолят Edge обрабатывает синхронизацию SharedArrayBuffer?
Подробнее здесь: https://stackoverflow.com/questions/798 ... me-in-next
Мобильная версия