Skip to content

Instantly share code, notes, and snippets.

@koukuko
Created August 30, 2013 11:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koukuko/6388858 to your computer and use it in GitHub Desktop.
Save koukuko/6388858 to your computer and use it in GitHub Desktop.
posted from brackets
/**
* AcFun Kirito (HTML5 Danmaku Player)
* Copyright (c) 2013, acfun.tv, All rights reserved.
*
* @package ki.network
* @author koukuko
* @date 2013/08/28
* @copyright dev.acfun.tv
*/
(function (window) {
// 严格模式
'use strict';
// 定义基本变量
var network = {};
network.package_name = 'network';
network.package_version = '1.0.0';
/**
* Server Cache
*/
network.server = {
// 弹幕文件服务器(HTTP)
'danmaku_file_server': null,
// 弹幕发送服务器(WebSocket)
'danmaku_post_server': null
};
network.status = {
'vid': 0,
'vlength': 0,
'uid': 0,
'uid_ck': 0,
'type': []
};
/**
* Network Package
* @options:
* danmaku_file_server {String} 弹幕文件服务器
* danmaku_post_server {String} 弹幕发送服务器
*
* @test_server:ws://60.195.249.242:443/test
*/
/**
* 初始化NetWork模块
* @param vid {String} 视频vid
* @param uid {String} 用户uid
* @param uid_ck {String} 用户uid对应密钥
* @param callback {Function} 回调
*/
network.init = function (vid, vlength, uid, uid_ck, type, callback) {
network.status = {
'vid': vid,
'vlength': vlength,
'uid': uid,
'uid_ck': uid_ck,
'type': type
};
if (typeof callback === 'function') {
callback(callback);
}
};
/**
* 连接WebSocket
* @access public
* @param server {String} 连接服务器名
* @param callback {Function} 回调
*/
network.connect = function (server, callback) {
// 0.Call
window.D('(process):尝试连接服务器 ' + server);
// 1.判定当前浏览器是否支持WebSocket
if (window.WebSocket === undefined) {
/**
* 采用Flash替代方案
* @package FlashSocket
* @extend SwfObject,jQuery.getScript
*/
window.D('(warn):当前浏览器没有发现WebSocket模块,开始采用Flash WebSocket备用方案。');
window.jQuery.getScript('helper/swfobject.js', function () {
window.jQuery.getScript('helper/flashsocket.min.js', function () {
if (window.FlashSocket !== undefined) {
window.WebSocket = window.FlashSocket;
}
});
});
}
// 2.判定当前连接的服务器的服务器状态
if (network.check(server)) {
window.D('(warn):已有相同的连接正在通讯,取消操作。');
return false;
}
// 3.基于缓存创建连接
network.server[server] = new WebSocket(window.K.option[server]);
// 4.绑定相关事件
var socket = network.server[server];
socket.onmessage = function (d) {
network.handle(d);
};
socket.onclose = function () {
network.connect(server);
};
socket.onopen = function () {
network.action.auth();
};
socket.onerror = function (d) {
window.D('(error):WebSocket Error' + d);
};
return true;
};
/**
* 读取弹幕文件
* @access public
* @param vid {String} 视频id
* @param length {Number} 弹幕文件长度 0:不设上限
* @param type {Mixed} 弹幕池类型
* - all 全部类型
* - coop 合作弹幕池
* - user 注册用户
* - unuser 游客
* 不管使用任何弹幕池类型 都将会载入锁定弹幕池
* 如果在合作弹幕池解锁弹幕 弹幕将会回普通弹幕池而不是合作弹幕池
* @param callback 读取弹幕完成后进行操作
*/
network.read = function (vid, length, type, callback) {
type = (typeof type === 'array') ? type.join('') : type;
// 构建设置
var option = (length) + ((type === 'all') ? '' : ('-' + type));
// 中断上次请求
try {
network.server.danmaku_file_server.abort();
} catch (e) {}
/**
* 发起(跨域)请求
* @extend jQuery.getJson
*/
network.server.danmaku_file_server = window.jQuery.getJSON(window.K.option.danmaku_file_server + '/' + vid + '-' + option + '?callback=?').done(function (d) {
if (typeof callback === 'function') {
callback(d);
}
}).fail(function () {
window.D('(error)读取弹幕文件失败:' + vid + '-' + option);
});
};
/**
* 发送
* @access public
* @param action {String} 发送动作
* @param command {Mixed} 指定内容(如果需要指定的话)
* @param callback {Function} 回调
*/
network.post = function (action, command, callback) {
if (!network.check()) {
window.D('(error)服务器未能成功连接');
return false;
}
var obj = {
'action': action,
'command': command
};
obj = JSON.stringify(obj);
network.server.danmaku_post_server.send(obj);
if (typeof callback === 'function') {
callback(callback);
}
};
/**
* 检查连接状态
* @access public
* @param server {String} 连接服务器名
* @return {Boolean} 服务器当前状态 1:连接中 0:未连接
*/
network.check = function (server) {
if (server !== null && server.URL === window.K.option[server] && server.readtState === 1) {
return true;
} else {
return false;
}
};
/**
* 处理服务器的信息
* @access private
* @param data {Mixed} 服务器端返回信息
* @param callback {Function} 回调
* @return {Object} 处理结果
*/
network.handle = {};
/**
* 进行弹幕的具体操作
* @access public
*/
network.action = {
/**
* 验证身份
* @param username {String} 用户uid
* @param pwd {String} 用户密钥
* @return {Number} 验证是否成功
*/
auth: function () {
// 构建验证信息
var param = {
'vid': network.option.vid,
'vlength': network.option.vlength,
'time': new Date().getTime(),
'uid': network.option.uid,
'uid_ck': network.option.uid_ck
};
// final
network.post('auth', param);
},
/**
* 删除弹幕
* @param id {Mixed} 指定弹幕id或数组
*/
del: function () {},
/**
* 锁定弹幕
* @param id {Mixed} 指定弹幕id或数组
*/
lock: function () {},
/**
* 解锁弹幕
* @param id {Mixed} 指定弹幕id或数组
*/
unlock: function () {},
/**
* 添加过滤关键词
* @param keyword {Mixed} 需要过滤的关键词字符串或数组
*/
addFilter: function () {},
/**
* 移除过滤关键词
* @param keyword {Mixed} 需要解除过滤的关键词或数组
*/
removeFilter: function () {}
};
//导出
network = window.K.$package.network;
}(this));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment