существует существующая библиотека HTTP/3 и WebTransport, написанная исключительно для node.js с использованием Node-API. Реализация сервера работает с Chromium и Firefox в качестве клиентов. Узел запускает сервер. Bun может запустить сервер, хотя существует с ошибкой
Код: Выделить всё
E0413 22:42:56.932056 82865 quic_connection.cc:2613] quic_bug_12714_21: ProcessUdpPacket must not be called while processing a packet.
terminate called after throwing an instance of 'Napi::Error'
what(): ReadableStream is not readable
Aborted
< /code>
deno
Код: Выделить всё
terminate called after throwing an instance of 'Napi::Error'
what(): this.socketInt.getSendQueueCount is not a function
Aborted
< /code>
Deno's HTTP/3 WebTransport
Так что я выбираю node.js, внедрение узла-API для моих целей, из-за самого широкого досягаемости для использования между Javascript Runtimes. Чтобы преобразовать привязки Node-API в C ++ в WASM (с поддержкой или без WASI) для возможности запустить тот же код сервера с использованием узла , deno , bun и в конечном итоге в Chrome .
Связывание выглядит как
.
Код: Выделить всё
void Http3WTSessionJS::processStream(bool incom, bool bidi, uint64_t sendOrder, uint64_t sendGroupId, Http3WTStream *stream)
{
Napi::HandleScope scope(Env());
Http3Constructors *constr = Env().GetInstanceData();
Napi::Object strobj = constr->stream.New({});
Http3WTStreamJS *strjs = Napi::ObjectWrap::Unwrap(strobj);
strjs->setObj(stream);
if (!stream->gone())
strjs->Ref();
stream->setJS(strjs);
Napi::Object objVal = Value().Get("jsobj").As();
Napi::Object retObj = Napi::Object::New(Env());
retObj.Set("stream", strobj);
retObj.Set("incoming", incom);
retObj.Set("bidirectional", bidi);
retObj.Set("sendOrder", sendOrder);
retObj.Set("sendGroupId", sendGroupId);
objVal.Get("onStream").As().Call(objVal, {retObj});
}
< /code>
and there's a bunch of them
Here are some pointers for http/3: https://github.com/fails-components/webtransport/blob/master/transports/http3-quiche/src/http3wtsessionvisitor.cc
...
all these use NAPI for node binding and would need a replacement, if compiled to wasm. (Including the mechanims for alarams and napialarmfactory and sockerjswriter.cc.
There's a tsconfig.json
Код: Выделить всё
switch (argv[2]) {
case 'prebuild':
try {
await prebuild([
'-t',
'6',
'-r',
'napi',
'--strip',
...pbargspre,
'--backend',
'cmake-js',
'--',
...pbargs
])
} catch (error) {
console.log('prebuild failed')
process.exit(1)
}
break
case 'install':
try {
const pbres = await prebuildInstall([
'-r',
'napi',
'-d',
'-t',
'6',
'--verbose'
])
Если никто не столкнулся с этим случаем и задокументировал их шаги, то ответ по умолчанию - это необходимые конверсии в подготовке к компиляции в Wasm, и в конечном итоге Javascript, используя Biranne's wasm2js , с помощью Любой столкнулся с этим видом выходящего кода и использовал некоторую автоматизированную существующую систему сборки, которая преобразует привязки NAPI , в экспортируемые функции, которые такой инструмент, как Clang wasi-sdk, или даже emscripten; Если да, какая у вас дорожная карта?
Подробнее здесь: https://stackoverflow.com/questions/795 ... ompilation