'use strict' /* global wx */ var socketOpen = false var socketMsgQueue = [] function sendSocketMessage (msg) { if (socketOpen) { wx.sendSocketMessage({ data: msg.buffer || msg }) } else { socketMsgQueue.push(msg) } } function WebSocket (url, protocols) { var ws = { OPEN: 1, CLOSING: 2, CLOSED: 3, readyState: socketOpen ? 1 : 0, send: sendSocketMessage, close: wx.closeSocket, onopen: null, onmessage: null, onclose: null, onerror: null } wx.connectSocket({ url: url, protocols: protocols }) wx.onSocketOpen(function (res) { ws.readyState = ws.OPEN socketOpen = true for (var i = 0; i < socketMsgQueue.length; i++) { sendSocketMessage(socketMsgQueue[i]) } socketMsgQueue = [] ws.onopen && ws.onopen.apply(ws, arguments) }) wx.onSocketMessage(function (res) { ws.onmessage && ws.onmessage.apply(ws, arguments) }) wx.onSocketClose(function () { ws.onclose && ws.onclose.apply(ws, arguments) ws.readyState = ws.CLOSED socketOpen = false }) wx.onSocketError(function () { ws.onerror && ws.onerror.apply(ws, arguments) ws.readyState = ws.CLOSED socketOpen = false }) return ws } var websocket = require('websocket-stream') function buildUrl (opts, client) { var protocol = opts.protocol === 'wxs' ? 'wss' : 'ws' var url = protocol + '://' + opts.hostname + opts.path if (opts.port && opts.port !== 80 && opts.port !== 443) { url = protocol + '://' + opts.hostname + ':' + opts.port + opts.path } if (typeof (opts.transformWsUrl) === 'function') { url = opts.transformWsUrl(url, opts, client) } return url } function setDefaultOpts (opts) { if (!opts.hostname) { opts.hostname = 'localhost' } if (!opts.path) { opts.path = '/' } if (!opts.wsOptions) { opts.wsOptions = {} } } function createWebSocket (client, opts) { var websocketSubProtocol = (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3) ? 'mqttv3.1' : 'mqtt' setDefaultOpts(opts) var url = buildUrl(opts, client) return websocket(WebSocket(url, [websocketSubProtocol])) } function buildBuilder (client, opts) { opts.hostname = opts.hostname || opts.host if (!opts.hostname) { throw new Error('Could not determine host. Specify host manually.') } return createWebSocket(client, opts) } module.exports = buildBuilder