教程版本V6.10.0
server.js代码如下
var path = require('path');
var url = require('url');
var express = require('express');
var ws = require('ws');
var fs = require('fs');
var https = require('https');
var ws_uri = 'ws://localhost:8888/kurento';
var options =
{
key: fs.readFileSync('keys/server.key'),
cert: fs.readFileSync('keys/server.crt')
};
var app = express();
/*
web服务器
*/
var port = 8443;
var server = https.createServer(options, app).listen(port, function() {
console.log('Kurento Tutorial started');
console.log('Open https://localhost:8443/ with a WebRTC capable browser');
});
var wss = new ws.Server({
server : server,
path : '/helloworld'
});
/*
媒体服务器控制代码
*/
var wsk = new ws.connect(ws_uri, function() {
console.log('Connection to server kurento');
var mediaPipeline = null;
var sessionId = null;
var WebRtcEndpointId = null;
var subscriptionId = null;
wsk.on('message', function(_message) {
var message = JSON.parse(_message);
console.log('Connection received message ', message);
switch(message.id) {
case 1:
mediaPipeline = message.result.value;
sessionId = message.result.sessionId;
wsk.createWebRtcEndpoint();
break;
case 2:
WebRtcEndpointId = message.result.value;
wsk.id = WebRtcEndpointId;
wsk.invokeConnect();
break;
case 3:
break;
case 4:
wsc.send(JSON.stringify({
"id": "startResponse",
"response": "accepted",
"sdpAnswer": message.result.value
}));
wsk.subscribeCandidate();
break;
case 5:
// subscriptionId = message.result.value;
wsk.invokeGatherCandidates();
break;
case 6:
break;
}
});
wsk.createMediaPipeline = function() {
console.log('Kurento Media Server -> createMediaPipeline');
wsk.send(JSON.stringify({
"id": 1,
"method": "create",
"params": {
"type": "MediaPipeline",
},
"jsonrpc": "2.0"
}));
}
wsk.createWebRtcEndpoint = function() {
console.log('Kurento Media Server -> createWebRtcEndpoint');
wsk.send(JSON.stringify({
"id": 2,
"method": "create",
"params": {
"type": "WebRtcEndpoint",
"constructorParams": {"mediaPipeline": mediaPipeline},
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
}
wsk.invokeConnect = function() {
console.log('Kurento Media Server -> invokeConnect');
wsk.send(JSON.stringify({
"id": 3,
"method": "invoke",
"params": {
"object": WebRtcEndpointId,
"operation": "connect",
"operationParams": {"sink": WebRtcEndpointId},
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
}
wsk.invokeProcessOffer = function(sdpOffer) {
console.log('Kurento Media Server -> invokeProcessOffer');
wsk.send(JSON.stringify({
"id": 4,
"method": "invoke",
"params": {
"object": WebRtcEndpointId,
"operation": "processOffer",
"operationParams": {"offer": sdpOffer},
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
}
wsk.subscribeCandidate = function() {
console.log('Kurento Media Server -> subscribeCandidate');
wsk.send(JSON.stringify({
"id": 5,
"method": "subscribe",
"params": {
"object": WebRtcEndpointId,
"type": "OnIceCandidate",
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
}
wsk.invokeGatherCandidates = function() {
console.log('Kurento Media Server -> invokeGatherCandidates');
wsk.send(JSON.stringify({
"id": 6,
"method": "invoke",
"params": {
"object": WebRtcEndpointId,
"operation": "gatherCandidates",
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
}
wsk.invokeAddIceCandidate = function(candidate) {
console.log('Kurento Media Server -> invokeAddIceCandidate');
wsk.send(JSON.stringify({
"id": 7,
"method": "invoke",
"params": {
"object": WebRtcEndpointId,
"operation": "addIceCandidate",
"operationParams": {"candidate": candidate},
"sessionId": sessionId
},
"jsonrpc": "2.0"
}));
};
wsk.on('OnIceCandidate', function(event) {
console.log("wsk.on('OnIceCandidate', function(event)");
wsc.send(JSON.stringify({
"id": "iceCandidate",
"candidate": event.candidate
}));
});
});
/*
客户端响应代码
*/
wss.on('connection', function(ws) {
wsc = ws;
console.log('Connection received with');
wsk.createMediaPipeline();
ws.on('error', function(error) {
console.log('Connection error');
});
ws.on('close', function() {
console.log('Connection closed');
});
ws.on('message', function(_message) {
var message = JSON.parse(_message);
console.log('Connection received message ', message);
switch (message.id) {
case 'start':
wsk.invokeProcessOffer(message.sdpOffer);
break;
case 'onIceCandidate':
wsk.invokeAddIceCandidate(message.candidate);
break;
default:
ws.send(JSON.stringify({
id : 'error',
message : 'Invalid message ' + message
}));
break;
}
});
});
app.use(express.static(path.join(__dirname, 'static')));