New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Question: What about for support WorkingThreads on WRTC addon? #623
Comments
Thanks, @nick-erm — I haven't looked into context-aware addons very closely, but I don't think we are context-aware. I believe we would need to update (at least) all the instances where we have static Napi::FunctionReference& constructor(); on a class (probably these need to become synchronized maps from context to constructor) as well as all the instances where we have, e.g., static ::node_webrtc::Wrap <
RTCDtlsTransport*,
rtc::scoped_refptr<webrtc::DtlsTransportInterface>,
PeerConnectionFactory*
> * wrap(); The Wrap class would also need to take context into account. Also, PeerConnectionFactory's defaulting behavior would need to be made context aware: /**
* Get or create the default PeerConnectionFactory. The default uses
* webrtc::AudioDeviceModule::AudioLayer::kDummyAudio. Call {@link Release} when done.
*/
static PeerConnectionFactory* GetOrCreateDefault(); |
@nick-erm OTOH, if I read Node's documentation for Worker support, just below the context-aware information you shared, it claims that
As of 0.4.x, node-webrtc is indeed an N-API addon. It's unclear to me if that's actually sufficient… Can you please share a minimal reproduction example that demonstrates the Handle issue? Can you also share Node and node-webrtc versions? |
Versions and Error stack: package.json 2020-05-05 13:01:17.105 New workerThread Created |
May be this wrong for my realisation: Also generating Warning when compile: |
Reflections on the topic: |
Error stack with new version of WRTC: |
...For every next RTCPConnection Nodejs creates 7 child processes. |
Greetings, @markandrus!
when only Datachannel - incorrect Wrap? and uv_poll_stop -
when WorkerThread exit - exception when Delete(RefBase* reference) in `anonymous-namespace'
In ..\node\sources\src\js_native_api_v8.cc
Call stack -
|
Part two:
Is it true that _signalingThread is Main thread for _workerThread and other transport threads (dtls,sctp, ice) ? |
I've written up a little RTCDataChannel-based worker script for testing with. It's useful for reproducing at least some of the issues described, such as destructor issues:
'use strict';
const { RTCPeerConnection } = require('.');
const {
Worker,
isMainThread,
parentPort,
workerData
} = require('worker_threads');
const TIMEOUT = 10 * 1000;
if (isMainThread) {
const worker = new Worker(__filename);
startOfferer(worker);
} else {
startAnswerer(parentPort);
}
async function startOfferer(worker) {
const { pc, dc } = await createOfferer();
const timeout = setTimeout(() => {
console.log('Timed out! Stopping...');
pc.close();
process.exit(1);
}, TIMEOUT);
const offer = pc.localDescription;
console.log('Offerer sending offer:\n', offer);
worker.postMessage(JSON.stringify(offer));
const answer = JSON.parse(await getMessage(worker));
console.log('Offerer received answer:\n', answer);
try {
await pc.setRemoteDescription(answer);
} catch (error) {
pc.close();
throw error;
}
dc.addEventListener('message', ({ data: message }) => {
console.log('Offerer received message:\n', message);
if (message === 'pong') {
console.log('Success! Stopping...');
clearTimeout(timeout);
pc.close();
}
});
await dataChannelIsOpen(dc);
dc.send('ping');
}
async function startAnswerer(parentPort) {
const offer = JSON.parse(await getMessage(parentPort));
console.log('Answerer received offer:\n', offer);
const { pc, dcPromise } = await createAnswerer(offer);
const answer = pc.localDescription;
console.log('Answerer sending answer:\n', answer);
parentPort.postMessage(JSON.stringify(answer));
const dc = await dcPromise;
console.log('Answerer received RTCDataChannel:\n', dc);
dc.addEventListener('message', ({ data: message }) => {
console.log('Answerer received message:\n', message);
if (message === 'ping') {
dc.send('pong');
}
});
}
async function createOfferer() {
const pc = new RTCPeerConnection();
try {
const dc = pc.createDataChannel('foo');
console.log('Offerer created RTCDataChannel:\n', dc);
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
await iceGatheringIsComplete(pc);
return {
pc,
dc
}
} catch (error) {
pc.close();
throw error;
}
}
async function createAnswerer(offer) {
const pc = new RTCPeerConnection();
const dcPromise = getDataChannel(pc);
try {
await pc.setRemoteDescription(offer);
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
return {
pc,
dcPromise
};
} catch (error) {
pc.close();
throw error;
}
}
async function iceGatheringIsComplete(pc) {
if (pc.iceGatheringState === 'complete') {
return null;
}
return new Promise(resolve => pc.addEventListener('icecandidate', ({ candidate }) => {
if (!candidate) {
resolve(null);
}
}));
}
function getDataChannel(pc) {
return new Promise(resolve => pc.addEventListener('datachannel', ({ channel }) => resolve(channel)));
}
async function dataChannelIsOpen(dc) {
if (dc.readyState === 'open') {
return null;
}
return new Promise(resolve => dc.addEventListener('open', () => resolve(null)));
}
function getMessage(parentPortOrWorker) {
return new Promise(resolve => parentPortOrWorker.once('message', resolve));
} |
Hmm..., Thanks, @markandrus !
will see a new behavior... If TURN/STUN is set then wrtc normally finished:
But exception on exit still staying:
|
And more, more docs, and more, more bugs...) |
Hello, thank you for your amazing work ! |
Hello, as I see in https://github.com/nodejs/node/pull/34093-03 a new version of NodeJS (v14.5.0) with the necessary updates #nodejs/node#33508 plans to release 30.06.2020. |
I'm getting this error when i try to use NodeJs 16.10 with WorkerThreads, and doesn't works
|
I'm trying to create workertread's with new wrtc.RTCPeerConnection object in ever thread and in second created thread NodeJS throw the error: "HandleScope::HandleScope Entering the V8 API without proper locking in place". Not shure, but, in my opinion, this error throw because wrtc addon not context-aware addon. Maybe I'm wrong... Thank you in advance for reply.
The text was updated successfully, but these errors were encountered: