From f464c78c20deb615dd452905b2d827f437427a1a Mon Sep 17 00:00:00 2001 From: qiang Date: Thu, 12 Sep 2019 11:37:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20App=20=E7=AB=AF=20websocket=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20arraybuffer=EF=BC=8C=E6=94=AF=E6=8C=81=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E5=A4=9A=E4=B8=AA=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app-plus/service/api/network/socket.js | 72 ++++++++++++------- src/platforms/app-plus/service/bridge.js | 9 ++- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/platforms/app-plus/service/api/network/socket.js b/src/platforms/app-plus/service/api/network/socket.js index ee0e4f1a0..dcc411d44 100644 --- a/src/platforms/app-plus/service/api/network/socket.js +++ b/src/platforms/app-plus/service/api/network/socket.js @@ -1,56 +1,69 @@ import { unpack, publish, - requireNativePlugin + requireNativePlugin, + base64ToArrayBuffer, + arrayBufferToBase64 } from '../../bridge' -let socketTaskId = 0 const socketTasks = {} const publishStateChange = (res) => { publish('onSocketTaskStateChange', res) } -const createSocketTaskById = function (socketTaskId, { - url, - data, - header, - method, - protocols -} = {}) { - // fixed by hxy 需要测试是否支持 arraybuffer - const socket = requireNativePlugin('webSocket') - socket.WebSocket(url, Array.isArray(protocols) ? protocols.join(',') : protocols) - // socket.binaryType = 'arraybuffer' - socketTasks[socketTaskId] = socket - +let socket +function getSocket () { + if (socket) { + return socket + } + socket = requireNativePlugin('uni-webSocket') socket.onopen(function (e) { publishStateChange({ - socketTaskId, + socketTaskId: e.id, state: 'open' }) }) socket.onmessage(function (e) { + const data = e.data publishStateChange({ - socketTaskId, + socketTaskId: e.id, state: 'message', - data: e.data + data: typeof data === 'object' ? base64ToArrayBuffer(data.base64) : data }) }) socket.onerror(function (e) { publishStateChange({ - socketTaskId, + socketTaskId: e.id, state: 'error', - errMsg: e.message + errMsg: e.data }) }) socket.onclose(function (e) { + const socketTaskId = e.id delete socketTasks[socketTaskId] publishStateChange({ socketTaskId, state: 'close' }) }) + return socket +} + +const createSocketTaskById = function (socketTaskId, { + url, + data, + header, + method, + protocols +} = {}) { + const socket = getSocket() + socket.WebSocket({ + id: socketTaskId, + url, + protocol: Array.isArray(protocols) ? protocols.join(',') : protocols + }) + socketTasks[socketTaskId] = socket return { socketTaskId, errMsg: 'createSocketTask:ok' @@ -58,13 +71,14 @@ const createSocketTaskById = function (socketTaskId, { } export function createSocketTask (args) { - return createSocketTaskById(++socketTaskId, args) + return createSocketTaskById(String(Date.now()), args) } export function operateSocketTask (args) { const { operationType, code, + reason, data, socketTaskId } = unpack(args) @@ -77,13 +91,23 @@ export function operateSocketTask (args) { switch (operationType) { case 'send': if (data) { - socket.send(data) + socket.send({ + id: socketTaskId, + data: typeof data === 'object' ? { + '@type': 'binary', + base64: arrayBufferToBase64(data) + } : data + }) } return { errMsg: 'operateSocketTask:ok' } case 'close': - socket.close(code) + socket.close({ + id: socketTaskId, + code, + reason + }) delete socketTasks[socketTaskId] return { errMsg: 'operateSocketTask:ok' @@ -92,4 +116,4 @@ export function operateSocketTask (args) { return { errMsg: 'operateSocketTask:fail' } -} +} diff --git a/src/platforms/app-plus/service/bridge.js b/src/platforms/app-plus/service/bridge.js index 0f8db7667..d8012a87b 100644 --- a/src/platforms/app-plus/service/bridge.js +++ b/src/platforms/app-plus/service/bridge.js @@ -1,5 +1,6 @@ import { - decode + decode, + encode } from 'base64-arraybuffer' export { @@ -56,7 +57,7 @@ export function isTabBarPage (path = '') { return false } return page.$page.meta.isTabBar - } + } const route = __uniRoutes.find(route => route.path.slice(1) === path) return route && route.meta.isTabBar } catch (e) { @@ -70,3 +71,7 @@ export function isTabBarPage (path = '') { export function base64ToArrayBuffer (data) { return decode(data) } + +export function arrayBufferToBase64 (data) { + return encode(data) +} -- GitLab