mirror of
https://github.com/JasonYANG170/IOTConnect-Web.git
synced 2024-11-24 04:36:31 +00:00
115 lines
3.1 KiB
JavaScript
115 lines
3.1 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const buffer_1 = require("buffer");
|
||
|
const readable_stream_1 = require("readable-stream");
|
||
|
const BufferedDuplex_1 = require("../BufferedDuplex");
|
||
|
let socketTask;
|
||
|
let proxy;
|
||
|
let stream;
|
||
|
function buildProxy() {
|
||
|
const _proxy = new readable_stream_1.Transform();
|
||
|
_proxy._write = (chunk, encoding, next) => {
|
||
|
socketTask.send({
|
||
|
data: chunk.buffer,
|
||
|
success() {
|
||
|
next();
|
||
|
},
|
||
|
fail(errMsg) {
|
||
|
next(new Error(errMsg));
|
||
|
},
|
||
|
});
|
||
|
};
|
||
|
_proxy._flush = (done) => {
|
||
|
socketTask.close({
|
||
|
success() {
|
||
|
done();
|
||
|
},
|
||
|
});
|
||
|
};
|
||
|
return _proxy;
|
||
|
}
|
||
|
function setDefaultOpts(opts) {
|
||
|
if (!opts.hostname) {
|
||
|
opts.hostname = 'localhost';
|
||
|
}
|
||
|
if (!opts.path) {
|
||
|
opts.path = '/';
|
||
|
}
|
||
|
if (!opts.wsOptions) {
|
||
|
opts.wsOptions = {};
|
||
|
}
|
||
|
}
|
||
|
function buildUrl(opts, client) {
|
||
|
const protocol = opts.protocol === 'wxs' ? 'wss' : 'ws';
|
||
|
let 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 bindEventHandler() {
|
||
|
socketTask.onOpen(() => {
|
||
|
stream.socketReady();
|
||
|
});
|
||
|
socketTask.onMessage((res) => {
|
||
|
let { data } = res;
|
||
|
if (data instanceof ArrayBuffer)
|
||
|
data = buffer_1.Buffer.from(data);
|
||
|
else
|
||
|
data = buffer_1.Buffer.from(data, 'utf8');
|
||
|
proxy.push(data);
|
||
|
});
|
||
|
socketTask.onClose(() => {
|
||
|
stream.emit('close');
|
||
|
stream.end();
|
||
|
stream.destroy();
|
||
|
});
|
||
|
socketTask.onError((error) => {
|
||
|
const err = new Error(error.errMsg);
|
||
|
stream.destroy(err);
|
||
|
});
|
||
|
}
|
||
|
const buildStream = (client, opts) => {
|
||
|
opts.hostname = opts.hostname || opts.host;
|
||
|
if (!opts.hostname) {
|
||
|
throw new Error('Could not determine host. Specify host manually.');
|
||
|
}
|
||
|
const websocketSubProtocol = opts.protocolId === 'MQIsdp' && opts.protocolVersion === 3
|
||
|
? 'mqttv3.1'
|
||
|
: 'mqtt';
|
||
|
setDefaultOpts(opts);
|
||
|
const url = buildUrl(opts, client);
|
||
|
socketTask = wx.connectSocket({
|
||
|
url,
|
||
|
protocols: [websocketSubProtocol],
|
||
|
});
|
||
|
proxy = buildProxy();
|
||
|
stream = new BufferedDuplex_1.BufferedDuplex(opts, proxy, socketTask);
|
||
|
stream._destroy = (err, cb) => {
|
||
|
socketTask.close({
|
||
|
success() {
|
||
|
if (cb)
|
||
|
cb(err);
|
||
|
},
|
||
|
});
|
||
|
};
|
||
|
const destroyRef = stream.destroy;
|
||
|
stream.destroy = (err, cb) => {
|
||
|
stream.destroy = destroyRef;
|
||
|
setTimeout(() => {
|
||
|
socketTask.close({
|
||
|
fail() {
|
||
|
stream._destroy(err, cb);
|
||
|
},
|
||
|
});
|
||
|
}, 0);
|
||
|
return stream;
|
||
|
};
|
||
|
bindEventHandler();
|
||
|
return stream;
|
||
|
};
|
||
|
exports.default = buildStream;
|
||
|
//# sourceMappingURL=wx.js.map
|