123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- '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
|