diff --git a/src/platforms/app-plus/service/api/network/socket.js b/src/platforms/app-plus/service/api/network/socket.js index ee0e4f1a006a26a34e7f3ef554084ff5bf01f322..dcc411d44fc7a5ea965f7f972895b6492e990b11 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 0f8db7667577426d9e59c92f8d37bfc9299be9e5..d8012a87b7c52372380fa67853b01f0826e13bdb 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) +}