DataChannel creation

by ibcaliax

JavaScript

async function run()
{
	const pc1 = new RTCPeerConnection();
	const pc2 = new RTCPeerConnection();

	pc1.createDataChannel('make SDP O/A happy', { negotiated: true, id: 0 });
	pc2.createDataChannel('make SDP O/A happy', { negotiated: true, id: 0 });

	pc1.addEventListener('icecandidate', (event) =>
	{
		const { candidate } = event;

		if (candidate)
			pc2.addIceCandidate(candidate);
	});

	pc2.addEventListener('icecandidate', (event) =>
	{
		const { candidate } = event;

		if (candidate)
			pc1.addIceCandidate(candidate);
	});

	const offer = await pc1.createOffer();

	await pc1.setLocalDescription(offer);
	await pc2.setRemoteDescription(offer);

	const answer = await pc2.createAnswer();

	await pc2.setLocalDescription(answer);
	await pc1.setRemoteDescription(answer);


	pc1.addEventListener('iceconnectionstatechange', () =>
	{
		if (pc1.iceConnectionState === 'connected')
		{
			const dc1s = new Map();
			const dc2s = new Map();

			let id = 1;

			const timer = setInterval(() =>
			{
				console.warn('>>> creating DataChannels with id:%d ...', id);

				try
				{
					const dc1 = pc1.createDataChannel("foo", { negotiated: true, id: id });
					const dc2 = pc2.createDataChannel("foo", { negotiated: true, id: id });

					console.warn('<<< DataChannels with id:%d created', id);

					dc1s.set(id, dc1);
					dc2s.set(id, dc2);

					++id;

					// if (id === 256)
						// clearInterval(timer);
				}
				catch (error)
				{
					console.error('<<< DataChannels with id:%d failed: %o', id, error);

					clearInterval(timer);
				}
			}, 50);	
		}
	});
}

run();