Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 98 additions & 0 deletions examples/rtc_demo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
const qiniu = require('../index.js')

// ak, sk 获取参考 https://developer.qiniu.com/dora/kb/3702/QiniuToken
var ACCESS_KEY = 'ak'
var SECRET_KEY = 'sk'
var credentials = new qiniu.Credentials(ACCESS_KEY, SECRET_KEY)

// 参考 https://github.com/pili-engineering/QNRTC-Server/blob/master/docs/api.md

var data = {
'hub': 'your hub',
'title': 'your title',
'maxUsers': 10,
'noAutoKickUser': true
}

qiniu.app.createApp(data, credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

qiniu.app.getApp('appId', credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

qiniu.app.deleteApp('appId', credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

var data1 = {
'hub': 'your hub',
'title': 'your title',
'maxUsers': 10,
'noAutoKickUser': true,
'mergePublishRtmp': {
'enable': true,
'audioOnly': true,
'height': 1920,
'width': 1080,
'fps': 60,
'kbps': 1000,
'url': 'rtmp://xxx.example.com/test',
'streamTitle': 'meeting'
}
}
qiniu.app.updateApp('appId', data1, credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})
qiniu.room.listUser('appId', 'roomName', credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

qiniu.room.kickUser('appId', 'roomName', 'userId', credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

// type of(offset limit) = Num such as 5 10
qiniu.room.listActiveRoom('appId', 'prefix', 'offset', 'limit', credentials, function (err, res) {
if (err) {
console.log(err)
} else {
console.log(res)
}
})

// expireAt = 1524128577 or empty
var roomAccess = {
'appId': 'your appId',
'roomName': 'your roomName',
'userId': 'userId',
'expireAt': 1524128577,
'permission': 'admin'
}

console.log(qiniu.room.roomToken(roomAccess, credentials))
9 changes: 6 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ module.exports = {
auth: {
digest: require(libPath + '/auth' + '/digest.js')
},
cdn: require(libPath + "/cdn.js"),
cdn: require(libPath + '/cdn.js'),
form_up: require(libPath + '/storage/form.js'),
resume_up: require(libPath + '/storage/resume.js'),
rs: require(libPath + '/storage/rs.js'),
fop: require(libPath + '/fop.js'),
conf: require(libPath + '/conf.js'),
rpc: require(libPath + '/rpc.js'),
util: require(libPath + '/util.js'),
zone: require(libPath + '/zone.js')
};
zone: require(libPath + '/zone.js'),
app: require(libPath + '/rtc/app.js'),
room: require(libPath + '/rtc/room.js'),
Credentials: require(libPath + '/rtc/credentials.js')
}
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@
"devDependencies": {
"@types/node": "^8.0.3",
"blanket": "*",
"eslint": "^5.0.0-alpha.2",
"eslint-config-standard": "^12.0.0-alpha.0",
"eslint-plugin-import": "^2.11.0",
"eslint-plugin-node": "^6.0.1",
"eslint-plugin-promise": "^3.7.0",
"eslint-plugin-standard": "^3.1.0",
"mocha": "*",
"pedding": "*",
"should": "1.2.2",
Expand Down
128 changes: 128 additions & 0 deletions qiniu/rtc/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
var http = require('http')

const host = 'rtc.qiniuapi.com'
const headers = {
'Content-Type': 'application/json',
};

function get(credentials, options, fn){
options.headers['Authorization'] = credentials.generateAccessToken(options, null);

var req = http.request(options, function(res) {
res.setEncoding('utf-8');

var responseString = '';

res.on('data', function(data) {
responseString += data;
});

res.on('end', function() {
//var resultObject = JSON.parse(responseString);

if (res.statusCode != 200) {
var result = {
code: res.statusCode,
message: res.statusMessage
}
fn(result, null);
} else {
result = {
code: res.statusCode,
message: res.statusMessage
}
fn(null, result);
}
});
});

req.on('error', function(e) {
fn(e, null);
});

req.end();
}


function post(credentials, options, data, fn) {
var dataString = JSON.stringify(data);

options.headers['Authorization'] = credentials.generateAccessToken(options, dataString);

var req = http.request(options, function(res) {
res.setEncoding('utf-8');

var responseString = '';

res.on('data', function(data) {
responseString += data;
});

res.on('end', function() {
var resultObject = JSON.parse(responseString);

if (res.statusCode != 200) {
var result = {
code: res.statusCode,
message: res.statusMessage
}
fn(result, null);
} else {
fn(null, resultObject);
}
});
});
req.on('error', function(e) {
fn(e, null);
});

req.write(dataString);

req.end();
};


exports.createApp = function(app, credentials ,fn) {
var options = {
host: host,
port: 80,
path: '/v3/apps',
method: 'POST',
headers: headers
};
post(credentials, options, app, fn)
}

exports.getApp = function (appId, credentials, fn) {
var options = {
host: host,
port: 80,
path: '/v3/apps/' + appId,
method: 'GET',
headers: headers
};
get(credentials, options, fn)
}

exports.deleteApp = function (appId, credentials, fn) {
var options = {
host: host,
port: 80,
path: '/v3/apps/' + appId,
method: 'DELETE',
headers: headers
};
get(credentials, options, fn)
}

exports.updateApp = function (appId, app, credentials, fn) {
var options = {
host: host,
port: 80,
path: '/v3/apps/' + appId,
method: 'POST',
headers: headers
};
post(credentials, options, app, fn)
}

61 changes: 61 additions & 0 deletions qiniu/rtc/credentials.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
var util = require('./util');

function Credentials(accessKey, secretKey) {
this.accessKey = accessKey;
this.secretKey = secretKey;
}

Credentials.prototype.generateAccessToken = function(options, data) {
var sign = this._signRequest(options, data);
var token = 'Qiniu' + ' ' + this.accessKey + ':' + sign;

return token;
}

Credentials.prototype._signRequest = function(options, body) {
var contentType = options.headers['Content-Type'];

var host = options.host;
if (options.port && options.port != 80) {
host = host + ':' + options.port;
}

var data = options.method + ' ' + options.path;
data += '\nHost: ' + host;
if (contentType) {
data += '\nContent-Type: ' + contentType;
}
data += '\n\n';

if (body && contentType && contentType != 'application/octet-stream') {
data += body;
}


var digest = util.hmacSha1(data, this.secretKey);


var sageDigest = util.base64ToUrlSafe(digest);

return sageDigest;
}

Credentials.prototype.sign = function(data) {
var digest = util.hmacSha1(data, this.secretKey);
var sageDigest = util.base64ToUrlSafe(digest);
return this.accessKey + ":" + sageDigest;

}

Credentials.prototype.signJson = function(opt) {

var str = JSON.stringify(opt);
var encodedStr = util.urlsafeBase64Encode(str);
var sign = util.hmacSha1(encodedStr, this.secretKey);
var encodedSign = util.base64ToUrlSafe(sign);

var token = this.accessKey + ':' + encodedSign + ':' + encodedStr;
return token;
}

module.exports = exports = Credentials;
Loading