1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
volcanos/lib/misc.js
2020-12-10 19:08:44 +08:00

210 lines
8.9 KiB
JavaScript

Volcanos("misc", {help: "工具模块",
Message: function(event, can) { var msg = {}
msg.__proto__ = {_event: event, _can: can, _create_time: new Date(),
Option: function(key, val) {
if (key == undefined) { return msg && msg.option || [] }
if (typeof key == "object") { can.core.Item(key, msg.Option) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.option = msg.option || [], can.core.List(msg.option, function(k) { if (k == key) {return k} }).length > 0 || msg.option.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Append: function(key, val) {
if (key == undefined) { return msg && msg.append || [] }
if (typeof key == "object") { can.core.Item(key, msg.Append) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.append = msg.append || [], can.core.List(msg.append, function(k) { if (k == key) {return k} }).length > 0 || msg.append.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Result: function(cb) {
return msg.result && msg.result.join("") || ""
},
Table: function(cb) { if (!msg.append || !msg.append.length || !msg[msg.append[0]]) { return }
var max = "", len = 0; can.core.List(msg.append, function(key, index) {
if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length }
})
return can.core.List(msg[max], function(value, index, array) { var one = {}, res
can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"").trim() })
return typeof cb == "function" && (res = cb(one, index, array)) && res != undefined && res || one
})
},
Clear: function(key) {
switch (key) {
case "append":
case "option":
can.core.List(msg[key], function(item) {
delete(msg[item])
})
default:
msg[key] = []
}
},
Copy: function(res) { if (!res) { return msg }
res.result && (msg.result = (msg.result||[]).concat(res.result))
res.append && (msg.append = res.append) && res.append.forEach(function(item) {
res[item] && (msg[item] = (msg[item]||[]).concat(res[item]))
})
res.option && (msg.option = res.option) && res.option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
return msg
},
Push: function(key, value, detail) { msg.append = msg.append || []
if (typeof key == "object") {
value = value || can.core.Item(key)
can.core.List(value, function(item) {
detail? msg.Push("key", item).Push("value", key[item]||""):
msg.Push(item, key[item]||"")
})
return
}
for (var i = 0; i < msg.append.length; i++) {
if (msg.append[i] == key) {
break
}
}
if (i >= msg.append.length) {msg.append.push(key)}
msg[key] = msg[key] || []
msg[key].push(""+(typeof value == "object"? JSON.stringify(value): value)+"")
return msg
},
Echo: function(res) {msg.result = msg.result || []
msg._hand = true
for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])}
return msg
},
}
return msg
},
POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) {
var xhr = new XMLHttpRequest()
xhr.open("POST", url), xhr.onreadystatechange = function() {
if (xhr.readyState != 4) {return}
switch (xhr.getResponseHeader("content-type")) {
case "image/png":
if (xhr.responseType != "blob") {
msg.responseType = "blob"
can.misc.POST(can, msg, url, form, cb)
return
}
break
default:
try { // 解析响应
var res = JSON.parse(xhr.responseText)
} catch (e) {
var res = {"result": []}
}
}
xhr.status == 200 && typeof cb == "function" && cb(msg.Copy(res))
}
if (msg.upload) {
// 文件参数
var data = new FormData()
can.core.Item(form, function(key, value) {
can.core.List(value, function(item) {data.append(key, item)})
})
data.append("upload", msg.upload)
xhr.upload.onprogress = function(event) {
typeof msg._progress == "function" && msg._progress(event, parseInt(event.loaded/event.total*100), event.total, event.loaded)
}
} else {
// 表单参数
var data = can.core.Items(form, function(value, index, key) {
return key+"="+encodeURIComponent(value)
}).join("&")
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
}
// 发送请求
++arguments.callee.meta.order
xhr.setRequestHeader("Accept", "application/json")
xhr.responseType = msg.responseType || ""
try {
xhr.send(data)
} catch(e) {
console.error(e)
cb == "function" && cb(msg)
}
msg._xhr = xhr
}),
Run: shy("请求后端", {order: 0}, function(event, can, dataset, cmd, cb) { event = event || {}
var msg = (can.request||can.Event)(event)
// 解析参数
var option = {"cmds": cmd||msg.cmd}
msg.option && msg.option.forEach(function(item) {
msg[item] && (option[item] = msg[item])
})
msg.option = can.core.Item(option, function(key, value) {
return msg[key] = value, key
})
msg._hand = true, can.misc.POST(can, msg, can.Conf("iceberg")+(msg.names||dataset.names||event.names||"").toLowerCase()+"?="+event._pane, option, function(msg) {
typeof cb == "function" && cb(msg)
}), delete(event.msg)
}),
WSS: shy("请求后端", {order: 0}, function(can, url, args, cb, onopen, onerror, onclose) {var meta = arguments.callee.meta
if (url.indexOf("ws") == -1) {
url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/" + (url||"")
}
if (url.indexOf("chrome") == 0) {
url = "ws://localhost:9020/space/"
}
if (can._socket) {return can._socket}
args["share"] = can._share || ""
can._socket = new WebSocket(url+"?"+can.base.Args(args))
can._socket.onclose = onclose || function() {if (!can._socket) {return}
console.log("socket close")
delete(can._socket), setTimeout(function() {
// 断线重连
can.misc.WSS(can, url, args, cb, onopen, onerror, onclose)
}, 1000)
}, can._socket.onerror = onerror || function() {if (!can._socket) {return}
console.log("socket error")
can._socket.close(), delete(can._socket), setTimeout(function() {
// 断线重连
can.misc.WSS(can, url, args, cb, onerror, onclose, onopen)
}, 1000)
}, can._socket.onopen = onopen || function() {
}
can._socket.onmessage = function(event) {var order = ++meta.order
try { // 解析命令
var data = JSON.parse(event.data)
} catch (e) {
var data = {"result": [event.data]}
}
var msg = can.request(event); msg.Reply = function() {
// 回复命令
delete(msg._can)
delete(msg._event)
msg.Option("_handle", true)
msg.Option("_target", msg.Option("_source"))
console.log(["wss", order, "result"].concat(msg.result).concat([msg]))
can._socket.send(JSON.stringify(msg))
}, msg.detail = data.detail, msg.Copy(data)
try { // 执行命令
console.log(["wss", order].concat(msg.detail).concat([msg]))
typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) { // 执行失败
console.log(e)
}
}
return can._socket
}),
})