Describe the bug
Electron has dropped support for external buffers. Thus some methods that this quic library uses are not working in such environment.
Error: Create external arraybuffer failed
at get connectionId (/Users/lukas.rakauskas/dev/electron-js-quic-reproduce/node_modules/@matrixai/quic/dist/QUICConnection.js:326:36)
at QUICClient.createQUICClient (/Users/lukas.rakauskas/dev/electron-js-quic-reproduce/node_modules/@matrixai/quic/dist/QUICClient.js:148:45)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
code: 'Unknown'
}
To Reproduce
I've made a reproduce repo. To reproduce pull it run npm install and npm run start
https://github.com/lukasrakauskas/electron-js-quic-reproduce
Expected behavior
QUIC client should be able to connect to a server, read and write to streams when created within electron.
Platform
- Device: Macbook M1 Pro
- OS: macOS Sonoma 14.5
Possible fix
The failing point is reading source ID in javascript, converting Uint8array to external vec seems to solve the external array buffer problem.
// src/native/napi/connection.rs
#[napi]
pub fn source_id(&self) -> External<Vec<u8>> {
let source_id = self.0.source_id();
let bytes = source_id.as_ref().to_vec();
External::new(bytes)
}
After this, the js fails to read header dcid property that also is Uint8array. To solve this, I've added get_dcid method to Header struct to be used instead of reading dcid directly.
// src/native/napi/packet.rs
#[napi]
pub fn get_dcid(&self) -> External<Vec<u8>> {
External::new(self.dcid.to_vec())
}
Finally the library started to work for my use case
Describe the bug
Electron has dropped support for external buffers. Thus some methods that this quic library uses are not working in such environment.
To Reproduce
I've made a reproduce repo. To reproduce pull it run
npm installandnpm run starthttps://github.com/lukasrakauskas/electron-js-quic-reproduce
Expected behavior
QUIC client should be able to connect to a server, read and write to streams when created within electron.
Platform
Possible fix
The failing point is reading source ID in javascript, converting Uint8array to external vec seems to solve the external array buffer problem.
After this, the js fails to read header dcid property that also is Uint8array. To solve this, I've added get_dcid method to Header struct to be used instead of reading dcid directly.
Finally the library started to work for my use case