提交 f8ff71d8 编写于 作者: D DCloud_LXH

fix(App): 修复 socket 回调触发不正确问题

上级 41506284
...@@ -31,14 +31,29 @@ type Socket = { ...@@ -31,14 +31,29 @@ type Socket = {
} }
}) => void }) => void
close: ({ code, reason }: { code?: number; reason?: string }) => void close: ({ code, reason }: { code?: number; reason?: string }) => void
onopen: Function onopen: (cb: (args: { id: string }) => void) => void
onmessage: Function onmessage: (
onerror: Function cb: (args: { id: string; message: string | Object }) => void
onclose: Function ) => void
WebSocket: Function onerror: (cb: (args: { id: string; message: string }) => void) => void
onclose: (
cb: (args: {
id: string
code: number
reason: string
wasClean: boolean
}) => void
) => void
WebSocket: (args: {
id: string
url: string
protocol?: string
header?: any
}) => void
} }
type eventName = keyof WebSocketEventMap type eventName = keyof WebSocketEventMap
const socketTasks: SocketTask[] = [] const socketTasks: SocketTask[] = []
const socketsMap: Record<string, SocketTask> = {}
const globalEvent: Record<eventName, string> = { const globalEvent: Record<eventName, string> = {
open: '', open: '',
close: '', close: '',
...@@ -47,12 +62,13 @@ const globalEvent: Record<eventName, string> = { ...@@ -47,12 +62,13 @@ const globalEvent: Record<eventName, string> = {
} }
let socket: Socket let socket: Socket
export function createSocketTask(args: UniApp.ConnectSocketOption) { function createSocketTask(args: UniApp.ConnectSocketOption) {
const socketId = String(Date.now()) const socketId = String(Date.now())
let errMsg let errMsg
try { try {
if (!socket) { if (!socket) {
socket = requireNativePlugin('uni-webSocket') socket = requireNativePlugin('uni-webSocket')
bindSocketCallBack(socket)
} }
socket.WebSocket({ socket.WebSocket({
id: socketId, id: socketId,
...@@ -68,6 +84,29 @@ export function createSocketTask(args: UniApp.ConnectSocketOption) { ...@@ -68,6 +84,29 @@ export function createSocketTask(args: UniApp.ConnectSocketOption) {
return { socket, socketId, errMsg } return { socket, socketId, errMsg }
} }
function bindSocketCallBack(socket: Socket) {
socket.onopen((e) => {
const curSocket = socketsMap[e.id]
if (!curSocket) return
curSocket._socketOnOpen()
})
socket.onmessage((e) => {
const curSocket = socketsMap[e.id]
if (!curSocket) return
curSocket._socketOnMessage(e)
})
socket.onerror((e) => {
const curSocket = socketsMap[e.id]
if (!curSocket) return
curSocket._socketOnError()
})
socket.onclose((e) => {
const curSocket = socketsMap[e.id]
if (!curSocket) return
curSocket._socketOnClose()
})
}
class SocketTask implements UniApp.SocketTask { class SocketTask implements UniApp.SocketTask {
private _callbacks: { private _callbacks: {
open: Function[] open: Function[]
...@@ -98,31 +137,35 @@ class SocketTask implements UniApp.SocketTask { ...@@ -98,31 +137,35 @@ class SocketTask implements UniApp.SocketTask {
this.readyState = this.CLOSED this.readyState = this.CLOSED
if (!this._socket) return if (!this._socket) return
}
this._socket.onopen(() => { _socketOnOpen() {
this.readyState = this.OPEN this.readyState = this.OPEN
this.socketStateChange('open') this.socketStateChange('open')
}) }
this._socket.onmessage((e: any) => {
this.socketStateChange('message', { _socketOnMessage(e: any) {
data: this.socketStateChange('message', {
typeof e.data === 'object' data:
? base64ToArrayBuffer(e.data.base64) typeof e.data === 'object'
: e.data, ? base64ToArrayBuffer(e.data.base64)
}) : e.data,
})
this._socket.onerror(() => {
this.socketStateChange('error')
this.onErrorOrClose()
})
this._socket.onclose(() => {
this.socketStateChange('close')
this.onErrorOrClose()
}) })
} }
_socketOnError() {
this.socketStateChange('error')
this.onErrorOrClose()
}
_socketOnClose() {
this.socketStateChange('close')
this.onErrorOrClose()
}
onErrorOrClose() { onErrorOrClose() {
this.readyState = this.CLOSED this.readyState = this.CLOSED
delete socketsMap[this.id]
const index = socketTasks.indexOf(this) const index = socketTasks.indexOf(this)
if (index >= 0) { if (index >= 0) {
socketTasks.splice(index, 1) socketTasks.splice(index, 1)
...@@ -130,14 +173,16 @@ class SocketTask implements UniApp.SocketTask { ...@@ -130,14 +173,16 @@ class SocketTask implements UniApp.SocketTask {
} }
socketStateChange(name: eventName, res: Data = {}) { socketStateChange(name: eventName, res: Data = {}) {
const data = name === 'message' ? res : {}
if (this === socketTasks[0] && globalEvent[name]) { if (this === socketTasks[0] && globalEvent[name]) {
UniServiceJSBridge.invokeOnCallback(globalEvent[name], res) UniServiceJSBridge.invokeOnCallback(globalEvent[name], data)
} }
// WYQ fix: App平台修复websocket onOpen时发送数据报错的Bug // WYQ fix: App平台修复websocket onOpen时发送数据报错的Bug
this._callbacks[name].forEach((callback) => { this._callbacks[name].forEach((callback) => {
if (typeof callback === 'function') { if (typeof callback === 'function') {
callback(name === 'message' ? res : {}) callback(data)
} }
}) })
} }
...@@ -211,6 +256,7 @@ export const connectSocket = defineTaskApi<API_TYPE_CONNECT_SOCKET>( ...@@ -211,6 +256,7 @@ export const connectSocket = defineTaskApi<API_TYPE_CONNECT_SOCKET>(
}, 0) }, 0)
} else { } else {
socketTasks.push(socketTask) socketTasks.push(socketTask)
socketsMap[socketId] = socketTask
} }
setTimeout(() => { setTimeout(() => {
resolve() resolve()
...@@ -237,7 +283,7 @@ export const sendSocketMessage = defineAsyncApi<API_TYPE_SEND_SOCKET_MESSAGE>( ...@@ -237,7 +283,7 @@ export const sendSocketMessage = defineAsyncApi<API_TYPE_SEND_SOCKET_MESSAGE>(
export const closeSocket = defineAsyncApi<API_TYPE_CLOSE_SOCKET>( export const closeSocket = defineAsyncApi<API_TYPE_CLOSE_SOCKET>(
API_CLOSE_SOCKET, API_CLOSE_SOCKET,
(args: AsyncApiOptions<API_TYPE_CLOSE_SOCKET>, { resolve, reject }) => { (args, { resolve, reject }) => {
const socketTask = socketTasks[0] const socketTask = socketTasks[0]
if (!socketTask) { if (!socketTask) {
reject('WebSocket is not connected') reject('WebSocket is not connected')
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册