Created
August 30, 2013 11:15
-
-
Save koukuko/6388858 to your computer and use it in GitHub Desktop.
posted from brackets
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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