|  |  | @@ -7,6 +7,21 @@ function uuidv4() { | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function rpcStatusCheck() { | 
		
	
		
			
			|  |  |  | console.table(Object.values(allRPCs).map(({target, kind, rpc}) => | 
		
	
		
			
			|  |  |  | ({target, kind, status: rpc.iceConnectionState}) | 
		
	
		
			
			|  |  |  | )) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | function rpcCleanUp(kind, target) { | 
		
	
		
			
			|  |  |  | for([uid, info] of Object.entries(allRPCs)) { | 
		
	
		
			
			|  |  |  | if(info.kind === kind && info.target === target) { | 
		
	
		
			
			|  |  |  | info.rpc.close() | 
		
	
		
			
			|  |  |  | delete allRPCs[uid] | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | addEventListener('rpc-needed', ({detail}) => { | 
		
	
		
			
			|  |  |  | const {kind, target} = detail.value | 
		
	
		
			
			|  |  |  | const isInitiatedLocally = !detail.source | 
		
	
	
		
			
			|  |  | @@ -19,18 +34,19 @@ addEventListener('rpc-needed', ({detail}) => { | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | rpc.ontrack = ({streams: [stream]}) => { | 
		
	
		
			
			|  |  |  | stream.getTracks().forEach(track => | 
		
	
		
			
			|  |  |  | stream.getTracks().forEach(track => { | 
		
	
		
			
			|  |  |  | allRPCs[uid].receiver.addTrack(track, stream) | 
		
	
		
			
			|  |  |  | ) | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | rpc.oniceconnectionstatechange = (e) => { | 
		
	
		
			
			|  |  |  | console.log(rpc.iceConnectionState) | 
		
	
		
			
			|  |  |  | console.log(`${target} ${kind} ${rpc.iceConnectionState}`) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | rpc.onnegotiationneeded = (e) => { | 
		
	
		
			
			|  |  |  | // if(isInitiatedLocally) { | 
		
	
		
			
			|  |  |  | // signal({kind: 'rpc-initiate', value: {uid}}) | 
		
	
		
			
			|  |  |  | // } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | rpcCleanUp(kind, target) | 
		
	
		
			
			|  |  |  | allRPCs[uid] = {kind, target, rpc, isInitiatedLocally} | 
		
	
		
			
			|  |  |  | signal({kind: 'rpc-new', value: {kind, target, uid}}) | 
		
	
		
			
			|  |  |  | if(isInitiatedLocally) { | 
		
	
	
		
			
			|  |  | @@ -40,16 +56,20 @@ addEventListener('rpc-needed', ({detail}) => { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | addEventListener('rpc-setup', async ({detail}) => { | 
		
	
		
			
			|  |  |  | const {uid, sender, receiver} = detail.value | 
		
	
		
			
			|  |  |  | const {rpc, isInitiatedLocally, hasOffer} = allRPCs[uid] | 
		
	
		
			
			|  |  |  | allRPCs[uid].sender = sender | 
		
	
		
			
			|  |  |  | allRPCs[uid].receiver = receiver | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(sender) { | 
		
	
		
			
			|  |  |  | sender.getTracks().forEach(tr => allRPCs[uid].rpc.addTrack(tr, sender)) | 
		
	
		
			
			|  |  |  | sender.getTracks().forEach(tr => rpc.addTrack(tr, sender)) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | allRPCs[uid].isSetup = true | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(allRPCs[uid].isInitiatedLocally) { | 
		
	
		
			
			|  |  |  | if(isInitiatedLocally) { | 
		
	
		
			
			|  |  |  | signal({kind: 'rpc-initiate', value: {uid}}) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | else if(hasOffer) { | 
		
	
		
			
			|  |  |  | signal({kind: 'rpc-respond', value: {uid}}) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | addEventListener('rpc-initiate', async({detail}) => { | 
		
	
	
		
			
			|  |  | @@ -64,9 +84,20 @@ addEventListener('rpc-initiate', async({detail}) => { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | addEventListener('rpc-offer', async ({detail}) => { | 
		
	
		
			
			|  |  |  | const {uid} = detail.value | 
		
	
		
			
			|  |  |  | const {rpc, target} = allRPCs[uid] | 
		
	
		
			
			|  |  |  | const {rpc, isSetup} = allRPCs[uid] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | await rpc.setRemoteDescription(detail.value) | 
		
	
		
			
			|  |  |  | allRPCs[uid].hasOffer = true | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(isSetup) { | 
		
	
		
			
			|  |  |  | signal({kind: 'rpc-respond', value: {uid}}) | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | }) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | addEventListener('rpc-respond', async({detail}) => { | 
		
	
		
			
			|  |  |  | const {uid} = detail.value | 
		
	
		
			
			|  |  |  | const {rpc, target} = allRPCs[uid] | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | const localAnswer = await rpc.createAnswer() | 
		
	
		
			
			|  |  |  | await rpc.setLocalDescription(localAnswer) | 
		
	
		
			
			|  |  |  | 
 |