@ray-js/wechat-mqtt 0.3.25-beta-1 → 0.3.26-beta-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -1 +1 @@
1
- import{createMQTT as e}from"@ray-js/wechat-mqtt-core";import{createEmitter as t}from"@ray-js/wechat-event";import{hex as o}from"js-md5";import{AES_ECB as n,AES_GCM as c}from"@ray-js/wechat-tycrypto";import{bytesToString as i,hexToBytes as r,stringToBytes as s,bytesToInt as a,CRC32 as l,bytesToHex as d,randomBytes as p,getGlobal as u,BaseApi as g,sleep as v}from"@ray-js/wechat-helper";import{Base64 as f}from"js-base64";import{useTag as h}from"@ray-js/wechat-debug";function y(e,t,o,n){return new(o||(o=Promise))((function(c,i){function r(e){try{a(n.next(e))}catch(e){i(e)}}function s(e){try{a(n.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?c(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(r,s)}a((n=n.apply(e,t||[])).next())}))}const m=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const c=n.join("||");return o(c)},T=(e,t)=>{const{sign:o}=e,n=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var c=0;for(n=Object.getOwnPropertySymbols(e);c<n.length;c++)t.indexOf(n[c])<0&&Object.prototype.propertyIsEnumerable.call(e,n[c])&&(o[n[c]]=e[n[c]])}return o}(e,["sign"]);return m(n,t)===o},C={"2.0":(e,t)=>{const{localKey:o}=t,c=JSON.parse(i(e));if(16===c.protocol)return c;if(T(c,o)){const e=r(c.data),t=i(n.decrypt(e,s(o),!0)),a=JSON.parse(t);return Object.assign(Object.assign({},c),{data:a})}throw Error("check sign invalid")},2.1:(e,t)=>{const{localKey:o}=t,c=i(e.slice(0,3)),r=i(e.slice(3,19)),a=f.toUint8Array(i(e.slice(19)));if(r===m({data:a,pv:c},o).slice(8,24)){const e=i(n.decrypt(a,s(o),!0)),t=JSON.parse(e);return Object.assign({pv:c},t)}throw Error("check sign invalid")},2.2:(e,t)=>{const{localKey:o}=t,c=i(e.slice(0,3)),r=a(e.slice(3,7)),d=a(e.slice(7,11)),p=a(e.slice(11,15)),u=e.slice(15);if(l(e.slice(7))===r){const e=i(n.decrypt(u,s(o),!0)),t=JSON.parse(e);return Object.assign({pv:c,sn:d,source:p},t)}throw Error("check crc32 invalid")},2.3:(e,t)=>{const{localKey:o}=t,n=i(e.slice(0,3)),r=a(e.slice(3,7)),l=a(e.slice(7,11)),d=e.slice(12,24),p=e.slice(24),u=e.slice(0,12),g=i(c.decrypt(p,s(o),d,u)),v=JSON.parse(g);return Object.assign({pv:n,sn:r,source:l},v)}},O=e=>(e||(e=+new Date),e.toString().length>10?Math.floor(e/1e3):e),b={"2.0":(e,t)=>{const{localKey:o}=t,c=n.encrypt(s(JSON.stringify(e.data)),s(o),!0),i={protocol:e.protocol,pv:"2.0",t:O(e.time),data:d(c),gwId:e.devId};return i.sign=m(i,o),s(JSON.stringify(i))},2.1:(e,t)=>{const{localKey:o}=t,c={protocol:e.protocol,t:O(e.time),data:e.data},i=f.fromUint8Array(n.encrypt(s(JSON.stringify(c)),s(o),!0)),r=m({data:i,pv:"2.1"},o).slice(8,24);return s(`2.1${r}${i}`)},2.2:(e,t)=>{var o,c;const{localKey:i}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(c=e.source)&&void 0!==c?c:0,d={protocol:e.protocol,t:O(e.time),data:e.data},p=n.encrypt(s(JSON.stringify(d)),s(i),!0),u=new Uint8Array(15+p.length),g=new DataView(u.buffer);u.set(s("2.2"),0),g.setInt32(7,r),g.setInt32(11,a),u.set(p,15);const v=l(u.slice(7));return g.setInt32(3,v),u},2.3:(e,t)=>{var o,n;const{localKey:i}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(n=e.source)&&void 0!==n?n:0,l={protocol:e.protocol,t:O(e.time),data:e.data,gwId:t.devId},d=p(12),u=new Uint8Array(12),g=new DataView(u.buffer);u.set(s("2.3"),0),g.setInt32(3,r),g.setInt32(7,a),u[11]=0;const v=c.encrypt(s(JSON.stringify(l)),s(i),d,u),f=new Uint8Array(24+v.length);return f.set(u,0),f.set(d,12),f.set(v,24),f}},w=t({globalKey:"__mqttEvent"}),I=h("MQTT",{needProcess:!1});I.start();var N;!function(e){e[e.CONNECT_BREAK=0]="CONNECT_BREAK",e[e.CONNECTED=1]="CONNECTED",e[e.CONNECTING=2]="CONNECTING"}(N||(N={}));const E=u();E.mqttData||(E.mqttData={client:null,reconnectCount:0,reconnectEnabled:!0,isConnecting:!1,needManualReconnect:!1,currentOptions:{},topicData:{homeIds:new Map,deviceIds:new Set,devices:new Map},mqttType:"standard"});const S=E.mqttData;let j=()=>{};const D=(e,t)=>{if("standard"===S.mqttType)if(S.topicData.devices.has(e)){const o=S.topicData.devices.get(e);try{const n=((e,t)=>{let o="2.0";if("{"!==i(e.slice(0,1))&&(o=i(e.slice(0,3)),/\d\.\d/.test(o)||(o="2.0")),C[o])return C[o](e,t);throw new Error(`Not suppport pv ${o}`)})(t,o);n.t&&10===n.t.toString().length&&(n.t*=1e3),I.log("Receive MQTT Message",e,n.protocol,n.t),w.emit("message",{topic:e,payload:Object.assign({gwId:o.devId},n),mqttType:S.mqttType})}catch(e){I.log("decrypt error: ",e)}}else S.topicData.homeIds.has(e)&&w.emit("message",{topic:e,payload:JSON.parse(i(t)),mqttType:S.mqttType});else w.emit("message",{topic:e,payload:JSON.parse(i(t)),mqttType:S.mqttType})},M=()=>y(void 0,void 0,void 0,(function*(){if(I.log("Reconnect"),S.isConnecting)I.log("Has one Connecting");else if(S.needManualReconnect)I.log("Requires manual reconnection");else if(S.reconnectEnabled){S.reconnectCount++;const e=()=>y(void 0,void 0,void 0,(function*(){try{const e={homeIds:[],devices:[]};S.topicData.homeIds.forEach((t=>{e.homeIds.push(t.homeId)})),S.topicData.devices.forEach((t=>{e.devices.push(t)})),yield A({needReopen:!0,loadMQTTConfig:j}),K(e,!0)}catch(e){if(6e4===e.code||6e4===e.errCode||63021===e.errCode)return;M()}}));S.reconnectCount<=3?e():(_(),setTimeout((()=>{S.client||e()}),2e3*(S.reconnectCount-3)))}}));let q=0;const A=t=>y(void 0,void 0,void 0,(function*(){var o,n;if(S.isConnecting){I.log("Has one Connecting"),yield v(3e3,(()=>!!S.client&&S.client.getStatus()>0));const e=null===(o=S.client)||void 0===o?void 0:o.getStatus();if(1==e)return;if(2===e)throw{code:63008,errMsg:"MQTT connect failure"};if(S.isConnecting)return A(t)}if(S.needManualReconnect=!1,t.needReopen)S.client&&(I.log("Need destroy old one"),_());else if(S.client){if(1===S.client.getStatus())return void I.log("Already connected")}I.log("Start connecting"),S.isConnecting=!0,w.emit("stateChange",N.CONNECTING);const c=++q;try{const o=null!==(n=t.mqttType)&&void 0!==n?n:"standard";if(I.log("Get config"),!t.loadMQTTConfig)throw{errCode:63021,errMsg:"loadMQTTConfig callback function not set"};j=t.loadMQTTConfig;const i=yield j();I.log("Get config clientId:",i.clientId),S.currentOptions=i,I.log("Connecting MQTT"),S.client=yield e(Object.assign({},i)),I.log("Connected"),S.mqttType=o,S.client.onMessage((({topic:e,payload:t})=>{c===q&&D(e,t)})),S.client.onClose((e=>{c===q&&(I.log("Connect closed",e),w.emit("stateChange",N.CONNECT_BREAK),S.client&&M())})),w.emit("stateChange",N.CONNECTED),S.isConnecting=!1,S.reconnectCount=0}catch(e){throw I.error("Connect Failure",e),S.isConnecting=!1,e}})),K=(e,t)=>y(void 0,void 0,void 0,(function*(){var o,n;if(I.log("Will subscribe data"),S.client){const{topicData:{homeIds:c,devices:i},currentOptions:{homeTopicTpl:r,deviceSubscribeTopicTpl:s}}=S,a=[];if(null===(o=e.homeIds)||void 0===o||o.forEach((e=>{const o=r.replace("{ownerId}",e.toString());!t&&c.has(o)||a.push({homeId:e,topic:o})})),null===(n=e.devices)||void 0===n||n.forEach((e=>{const o=s.replace("{devId}",e.devId);!t&&i.has(o)||a.push(Object.assign(Object.assign({},e),{topic:o}))})),I.log("Will subscribe topics",a.map((e=>e.topic))),a.length)for(let e=0;e<a.length;e+=10){const t=a.slice(e,e+10),o=yield S.client.subscribe(t);o.err?I.warn("subscribe topic error",o):t.forEach((e=>{e.homeId?!c.has(e.topic)&&c.set(e.topic,e):e.devId&&!i.has(e.topic)&&i.set(e.topic,e)}))}}})),J=e=>K(e),R=()=>y(void 0,void 0,void 0,(function*(){if(I.log("Clear topics"),S.client)try{const{topicData:{homeIds:e,devices:t},currentOptions:{homeTopicTpl:o,deviceSubscribeTopicTpl:n}}=S,c=[];t.forEach((e=>{c.push(n.replace("{devId}",e.devId))})),e.forEach((e=>{c.push(o.replace("{ownerId}",e.toString()))}));for(let e=0;e<c.length;e+=10)yield S.client.unsubscribe(c.slice(e,e+10))}catch(e){I.error("Clear topics error",e)}S.topicData={homeIds:new Map,devices:new Map}})),Q=e=>y(void 0,void 0,void 0,(function*(){var t,o;if(I.log("unsubscribe topics:",e),S.client){const{topicData:{homeIds:n,devices:c},currentOptions:{homeTopicTpl:i,deviceSubscribeTopicTpl:r}}=S,s=[];null===(t=e.homeIds)||void 0===t||t.forEach((e=>{const t=i.replace("{ownerId}",e.toString());n.has(t)&&(s.push(t),n.delete(t))})),null===(o=e.deviceIds)||void 0===o||o.forEach((e=>{const t=r.replace("{devId}",e);c.has(t)&&(s.push(t),c.delete(t))}));for(let e=0;e<s.length;e+=10)yield S.client.unsubscribe(s.slice(e,e+10))}})),$=e=>{if(S.client&&G()){const{topicData:{devices:t},currentOptions:{deviceSubscribeTopicTpl:o}}=S,n=o.replace("{devId}",e);return t.has(n)}return!1},_=()=>{var e,t;1===(null===(e=S.client)||void 0===e?void 0:e.getStatus())&&(w.emit("stateChange",N.CONNECT_BREAK),null===(t=S.client)||void 0===t||t.disconnect()),S.client=null},k=e=>{w.on("message",e)},B=e=>{w.off("message",e)},U=e=>{w.on("stateChange",e)},x=e=>{w.off("stateChange",e)},G=()=>!!S.client&&1===S.client.getStatus(),P=e=>{const t=S.currentOptions.password.substring(8,24),c=s(t),{protocol:i,data:r,deviceId:a}=e;if(a){const e=n.encrypt(s(JSON.stringify(r)),c,!0),l={protocol:i,pv:"2.0",t:+new Date,data:f.fromUint8Array(e),client_id:S.currentOptions.clientId,sign:""};return l.sign=((e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const c=n.join("||");return o(c)})(l,t),S.client&&S.client.publish(S.currentOptions.deviceSendTopicTpl.replace("{devId}",a||""),JSON.stringify(l))}throw new Error("Not support this protocol")},H=e=>{const{protocol:t,data:o,deviceId:n,localKey:c,pv:i="2.0"}=e;if(n&&c){const e=((e,t,o)=>{if(b[o])return b[o](e,t);throw new Error(`Not suppport pv ${o}`)})({protocol:t,data:o,devId:n},{devId:n,localKey:c,pv:i},i);return S.client&&S.client.publish(S.currentOptions.deviceSendTopicTpl.replace("{devId}",n),e)}throw new Error("Not support this protocol")},V=e=>{if(I.log("Send message:",e),S.client)return"open"===S.mqttType?P(e):H(e);throw{errCode:60002,errMsg:"MQTT not connected"}};let W=!1,F=+new Date;g.hasBaseApi("onAppShow")&&g.onAppShow((()=>{if(!W)return;S.reconnectEnabled=!0,S.reconnectCount=0,W=!1;if(+new Date-F>3e3)M();else if(S.client)if(1===S.client.getStatus()){const e=()=>{B(e),clearTimeout(t)},t=setTimeout((()=>{B(e),M()}),6e4);k(e)}else M()})),g.hasBaseApi("onAppHide")&&g.onAppHide((()=>{W=!0,S.reconnectEnabled=!1,F=+new Date}));const z=()=>y(void 0,void 0,void 0,(function*(){I.log("Manual disconnect"),S.needManualReconnect=!0,yield R(),_()}));export{$ as checkSubscribeDevice,R as clearTopics,A as connect,z as destroy,G as getState,B as offMessage,x as offStateChange,k as onMessage,U as onStateChange,V as publish,J as subscribeTopics,Q as unsubscribeTopics};
1
+ import{createMQTT as e}from"@ray-js/wechat-mqtt-core";import{createEmitter as t}from"@ray-js/wechat-event";import{hex as o}from"js-md5";import{AES_ECB as n,AES_GCM as c}from"@ray-js/wechat-tycrypto";import{bytesToString as i,hexToBytes as r,stringToBytes as s,bytesToInt as a,CRC32 as l,bytesToHex as d,randomBytes as p,getGlobal as u,BaseApi as g,sleep as v}from"@ray-js/wechat-helper";import{Base64 as f}from"js-base64";import{useTag as h}from"@ray-js/wechat-debug";function y(e,t,o,n){return new(o||(o=Promise))((function(c,i){function r(e){try{a(n.next(e))}catch(e){i(e)}}function s(e){try{a(n.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?c(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(r,s)}a((n=n.apply(e,t||[])).next())}))}const m=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const c=n.join("||");return o(c)},T=(e,t)=>{const{sign:o}=e,n=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var c=0;for(n=Object.getOwnPropertySymbols(e);c<n.length;c++)t.indexOf(n[c])<0&&Object.prototype.propertyIsEnumerable.call(e,n[c])&&(o[n[c]]=e[n[c]])}return o}(e,["sign"]);return m(n,t)===o},C={"2.0":(e,t)=>{const{localKey:o}=t,c=JSON.parse(i(e));if(16===c.protocol)return c;if(T(c,o)){const e=r(c.data),t=i(n.decrypt(e,s(o),!0)),a=JSON.parse(t);return Object.assign(Object.assign({},c),{data:a})}throw Error("check sign invalid")},2.1:(e,t)=>{const{localKey:o}=t,c=i(e.slice(0,3)),r=i(e.slice(3,19)),a=f.toUint8Array(i(e.slice(19)));if(r===m({data:a,pv:c},o).slice(8,24)){const e=i(n.decrypt(a,s(o),!0)),t=JSON.parse(e);return Object.assign({pv:c},t)}throw Error("check sign invalid")},2.2:(e,t)=>{const{localKey:o}=t,c=i(e.slice(0,3)),r=a(e.slice(3,7)),d=a(e.slice(7,11)),p=a(e.slice(11,15)),u=e.slice(15);if(l(e.slice(7))===r){const e=i(n.decrypt(u,s(o),!0)),t=JSON.parse(e);return Object.assign({pv:c,sn:d,source:p},t)}throw Error("check crc32 invalid")},2.3:(e,t)=>{const{localKey:o}=t,n=i(e.slice(0,3)),r=a(e.slice(3,7)),l=a(e.slice(7,11)),d=e.slice(12,24),p=e.slice(24),u=e.slice(0,12),g=i(c.decrypt(p,s(o),d,u)),v=JSON.parse(g);return Object.assign({pv:n,sn:r,source:l},v)}},O=e=>(e||(e=+new Date),e.toString().length>10?Math.floor(e/1e3):e),b={"2.0":(e,t)=>{const{localKey:o}=t,c=n.encrypt(s(JSON.stringify(e.data)),s(o),!0),i={protocol:e.protocol,pv:"2.0",t:O(e.time),data:d(c),gwId:e.devId};return i.sign=m(i,o),s(JSON.stringify(i))},2.1:(e,t)=>{const{localKey:o}=t,c={protocol:e.protocol,t:O(e.time),data:e.data},i=f.fromUint8Array(n.encrypt(s(JSON.stringify(c)),s(o),!0)),r=m({data:i,pv:"2.1"},o).slice(8,24);return s(`2.1${r}${i}`)},2.2:(e,t)=>{var o,c;const{localKey:i}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(c=e.source)&&void 0!==c?c:0,d={protocol:e.protocol,t:O(e.time),data:e.data},p=n.encrypt(s(JSON.stringify(d)),s(i),!0),u=new Uint8Array(15+p.length),g=new DataView(u.buffer);u.set(s("2.2"),0),g.setInt32(7,r),g.setInt32(11,a),u.set(p,15);const v=l(u.slice(7));return g.setInt32(3,v),u},2.3:(e,t)=>{var o,n;const{localKey:i}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(n=e.source)&&void 0!==n?n:0,l={protocol:e.protocol,t:O(e.time),data:e.data,gwId:t.devId},d=p(12),u=new Uint8Array(12),g=new DataView(u.buffer);u.set(s("2.3"),0),g.setInt32(3,r),g.setInt32(7,a),u[11]=0;const v=c.encrypt(s(JSON.stringify(l)),s(i),d,u),f=new Uint8Array(24+v.length);return f.set(u,0),f.set(d,12),f.set(v,24),f}},w=t({globalKey:"__mqttEvent"}),I=h("MQTT",{needProcess:!1});I.start();var N;!function(e){e[e.CONNECT_BREAK=0]="CONNECT_BREAK",e[e.CONNECTED=1]="CONNECTED",e[e.CONNECTING=2]="CONNECTING"}(N||(N={}));const E=u();E.mqttData||(E.mqttData={client:null,reconnectCount:0,reconnectEnabled:!0,isConnecting:!1,needManualReconnect:!1,currentOptions:{},topicData:{homeIds:new Map,deviceIds:new Set,devices:new Map},mqttType:"standard"});const S=E.mqttData;let j=()=>{};const D=(e,t)=>{if("standard"===S.mqttType)if(S.topicData.devices.has(e)){const o=S.topicData.devices.get(e);try{const n=((e,t)=>{let o="2.0";if("{"!==i(e.slice(0,1))&&(o=i(e.slice(0,3)),/\d\.\d/.test(o)||(o="2.0")),C[o])return C[o](e,t);throw new Error(`Not suppport pv ${o}`)})(t,o);n.t&&10===n.t.toString().length&&(n.t*=1e3),I.log("Receive MQTT Message",e,n.protocol,n.t),w.emit("message",{topic:e,payload:Object.assign({gwId:o.devId},n),mqttType:S.mqttType})}catch(e){I.log("decrypt error: ",e)}}else S.topicData.homeIds.has(e)&&w.emit("message",{topic:e,payload:JSON.parse(i(t)),mqttType:S.mqttType});else w.emit("message",{topic:e,payload:JSON.parse(i(t)),mqttType:S.mqttType})},M=()=>y(void 0,void 0,void 0,(function*(){if(I.log("Reconnect"),S.isConnecting)I.log("Has one Connecting");else if(S.needManualReconnect)I.log("Requires manual reconnection");else if(S.reconnectEnabled){S.reconnectCount++;const e=()=>y(void 0,void 0,void 0,(function*(){try{const e={homeIds:[],devices:[]};S.topicData.homeIds.forEach((t=>{e.homeIds.push(t.homeId)})),S.topicData.devices.forEach((t=>{e.devices.push(t)})),yield A({needReopen:!0,loadMQTTConfig:j}),K(e,!0)}catch(e){if(6e4===e.code||6e4===e.errCode||63021===e.errCode)return;M()}}));S.reconnectCount<=3?e():(_(),setTimeout((()=>{S.client||e()}),3e3))}}));let q=0;const A=t=>y(void 0,void 0,void 0,(function*(){var o,n;if(S.isConnecting){I.log("Has one Connecting"),yield v(3e3,(()=>!!S.client&&S.client.getStatus()>0));const e=null===(o=S.client)||void 0===o?void 0:o.getStatus();if(1==e)return;if(2===e)throw{code:63008,errMsg:"MQTT connect failure"};if(S.isConnecting)return A(t)}if(S.needManualReconnect=!1,t.needReopen)S.client&&(I.log("Need destroy old one"),_());else if(S.client){if(1===S.client.getStatus())return void I.log("Already connected")}I.log("Start connecting"),S.isConnecting=!0,w.emit("stateChange",N.CONNECTING);const c=++q;try{const o=null!==(n=t.mqttType)&&void 0!==n?n:"standard";if(I.log("Get config"),!t.loadMQTTConfig)throw{errCode:63021,errMsg:"loadMQTTConfig callback function not set"};j=t.loadMQTTConfig;const i=yield j();I.log("Get config clientId:",i.clientId),S.currentOptions=i,I.log("Connecting MQTT"),S.client=yield e(Object.assign({},i)),I.log("Connected"),S.mqttType=o,S.client.onMessage((({topic:e,payload:t})=>{c===q&&D(e,t)})),S.client.onClose((e=>{c===q&&(I.log("Connect closed",e),w.emit("stateChange",N.CONNECT_BREAK),S.client&&M())})),w.emit("stateChange",N.CONNECTED),S.isConnecting=!1,S.reconnectCount=0}catch(e){throw I.error("Connect Failure",e),S.isConnecting=!1,e}})),K=(e,t)=>y(void 0,void 0,void 0,(function*(){var o,n;if(I.log("Will subscribe data"),S.client){const{topicData:{homeIds:c,devices:i},currentOptions:{homeTopicTpl:r,deviceSubscribeTopicTpl:s}}=S,a=[];if(null===(o=e.homeIds)||void 0===o||o.forEach((e=>{const o=r.replace("{ownerId}",e.toString());!t&&c.has(o)||a.push({homeId:e,topic:o})})),null===(n=e.devices)||void 0===n||n.forEach((e=>{const o=s.replace("{devId}",e.devId);!t&&i.has(o)||a.push(Object.assign(Object.assign({},e),{topic:o}))})),I.log("Will subscribe topics",a.map((e=>e.topic))),a.length)for(let e=0;e<a.length;e+=10){const t=a.slice(e,e+10),o=yield S.client.subscribe(t);o.err?I.warn("subscribe topic error",o):t.forEach((e=>{e.homeId?!c.has(e.topic)&&c.set(e.topic,e):e.devId&&!i.has(e.topic)&&i.set(e.topic,e)}))}}})),J=e=>K(e),R=()=>y(void 0,void 0,void 0,(function*(){if(I.log("Clear topics"),S.client)try{const{topicData:{homeIds:e,devices:t},currentOptions:{homeTopicTpl:o,deviceSubscribeTopicTpl:n}}=S,c=[];t.forEach((e=>{c.push(n.replace("{devId}",e.devId))})),e.forEach((e=>{c.push(o.replace("{ownerId}",e.toString()))}));for(let e=0;e<c.length;e+=10)yield S.client.unsubscribe(c.slice(e,e+10))}catch(e){I.error("Clear topics error",e)}S.topicData={homeIds:new Map,devices:new Map}})),Q=e=>y(void 0,void 0,void 0,(function*(){var t,o;if(I.log("unsubscribe topics:",e),S.client){const{topicData:{homeIds:n,devices:c},currentOptions:{homeTopicTpl:i,deviceSubscribeTopicTpl:r}}=S,s=[];null===(t=e.homeIds)||void 0===t||t.forEach((e=>{const t=i.replace("{ownerId}",e.toString());n.has(t)&&(s.push(t),n.delete(t))})),null===(o=e.deviceIds)||void 0===o||o.forEach((e=>{const t=r.replace("{devId}",e);c.has(t)&&(s.push(t),c.delete(t))}));for(let e=0;e<s.length;e+=10)yield S.client.unsubscribe(s.slice(e,e+10))}})),$=e=>{if(S.client&&G()){const{topicData:{devices:t},currentOptions:{deviceSubscribeTopicTpl:o}}=S,n=o.replace("{devId}",e);return t.has(n)}return!1},_=()=>{var e,t;1===(null===(e=S.client)||void 0===e?void 0:e.getStatus())&&(w.emit("stateChange",N.CONNECT_BREAK),null===(t=S.client)||void 0===t||t.disconnect()),S.client=null},k=e=>{w.on("message",e)},B=e=>{w.off("message",e)},U=e=>{w.on("stateChange",e)},x=e=>{w.off("stateChange",e)},G=()=>!!S.client&&1===S.client.getStatus(),P=e=>{const t=S.currentOptions.password.substring(8,24),c=s(t),{protocol:i,data:r,deviceId:a}=e;if(a){const e=n.encrypt(s(JSON.stringify(r)),c,!0),l={protocol:i,pv:"2.0",t:+new Date,data:f.fromUint8Array(e),client_id:S.currentOptions.clientId,sign:""};return l.sign=((e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const c=n.join("||");return o(c)})(l,t),S.client&&S.client.publish(S.currentOptions.deviceSendTopicTpl.replace("{devId}",a||""),JSON.stringify(l))}throw new Error("Not support this protocol")},H=e=>{const{protocol:t,data:o,deviceId:n,localKey:c,pv:i="2.0"}=e;if(n&&c){const e=((e,t,o)=>{if(b[o])return b[o](e,t);throw new Error(`Not suppport pv ${o}`)})({protocol:t,data:o,devId:n},{devId:n,localKey:c,pv:i},i);return S.client&&S.client.publish(S.currentOptions.deviceSendTopicTpl.replace("{devId}",n),e)}throw new Error("Not support this protocol")},V=e=>{if(I.log("Send message:",e),S.client)return"open"===S.mqttType?P(e):H(e);throw{errCode:60002,errMsg:"MQTT not connected"}};let W=!1,F=+new Date;g.hasBaseApi("onAppShow")&&g.onAppShow((()=>{if(!W)return;S.reconnectEnabled=!0,S.reconnectCount=0,W=!1;if(+new Date-F>3e3)M();else if(S.client)if(1===S.client.getStatus()){const e=()=>{B(e),clearTimeout(t)},t=setTimeout((()=>{B(e),M()}),6e4);k(e)}else M()})),g.hasBaseApi("onAppHide")&&g.onAppHide((()=>{W=!0,S.reconnectEnabled=!1,F=+new Date}));const z=()=>y(void 0,void 0,void 0,(function*(){I.log("Manual disconnect"),S.needManualReconnect=!0,yield R(),_()}));export{$ as checkSubscribeDevice,R as clearTopics,A as connect,z as destroy,G as getState,B as offMessage,x as offStateChange,k as onMessage,U as onStateChange,V as publish,J as subscribeTopics,Q as unsubscribeTopics};
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@ray-js/wechat-mqtt-core"),t=require("@ray-js/wechat-event"),o=require("js-md5"),n=require("@ray-js/wechat-tycrypto"),i=require("@ray-js/wechat-helper"),s=require("js-base64"),c=require("@ray-js/wechat-debug");function r(e,t,o,n){return new(o||(o=Promise))((function(i,s){function c(e){try{a(n.next(e))}catch(e){s(e)}}function r(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(c,r)}a((n=n.apply(e,t||[])).next())}))}const a=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const i=n.join("||");return o.hex(i)},l=(e,t)=>{const{sign:o}=e,n=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(o[n[i]]=e[n[i]])}return o}(e,["sign"]);return a(n,t)===o},d={"2.0":(e,t)=>{const{localKey:o}=t,s=JSON.parse(i.bytesToString(e));if(16===s.protocol)return s;if(l(s,o)){const e=i.hexToBytes(s.data),t=i.bytesToString(n.AES_ECB.decrypt(e,i.stringToBytes(o),!0)),c=JSON.parse(t);return Object.assign(Object.assign({},s),{data:c})}throw Error("check sign invalid")},2.1:(e,t)=>{const{localKey:o}=t,c=i.bytesToString(e.slice(0,3)),r=i.bytesToString(e.slice(3,19)),l=s.Base64.toUint8Array(i.bytesToString(e.slice(19)));if(r===a({data:l,pv:c},o).slice(8,24)){const e=i.bytesToString(n.AES_ECB.decrypt(l,i.stringToBytes(o),!0)),t=JSON.parse(e);return Object.assign({pv:c},t)}throw Error("check sign invalid")},2.2:(e,t)=>{const{localKey:o}=t,s=i.bytesToString(e.slice(0,3)),c=i.bytesToInt(e.slice(3,7)),r=i.bytesToInt(e.slice(7,11)),a=i.bytesToInt(e.slice(11,15)),l=e.slice(15);if(i.CRC32(e.slice(7))===c){const e=i.bytesToString(n.AES_ECB.decrypt(l,i.stringToBytes(o),!0)),t=JSON.parse(e);return Object.assign({pv:s,sn:r,source:a},t)}throw Error("check crc32 invalid")},2.3:(e,t)=>{const{localKey:o}=t,s=i.bytesToString(e.slice(0,3)),c=i.bytesToInt(e.slice(3,7)),r=i.bytesToInt(e.slice(7,11)),a=e.slice(12,24),l=e.slice(24),d=e.slice(0,12),p=i.bytesToString(n.AES_GCM.decrypt(l,i.stringToBytes(o),a,d)),u=JSON.parse(p);return Object.assign({pv:s,sn:c,source:r},u)}},p=e=>(e||(e=+new Date),e.toString().length>10?Math.floor(e/1e3):e),u={"2.0":(e,t)=>{const{localKey:o}=t,s=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(e.data)),i.stringToBytes(o),!0),c={protocol:e.protocol,pv:"2.0",t:p(e.time),data:i.bytesToHex(s),gwId:e.devId};return c.sign=a(c,o),i.stringToBytes(JSON.stringify(c))},2.1:(e,t)=>{const{localKey:o}=t,c={protocol:e.protocol,t:p(e.time),data:e.data},r=s.Base64.fromUint8Array(n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(c)),i.stringToBytes(o),!0)),l=a({data:r,pv:"2.1"},o).slice(8,24);return i.stringToBytes(`2.1${l}${r}`)},2.2:(e,t)=>{var o,s;const{localKey:c}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(s=e.source)&&void 0!==s?s:0,l={protocol:e.protocol,t:p(e.time),data:e.data},d=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(l)),i.stringToBytes(c),!0),u=new Uint8Array(15+d.length),g=new DataView(u.buffer);u.set(i.stringToBytes("2.2"),0),g.setInt32(7,r),g.setInt32(11,a),u.set(d,15);const y=i.CRC32(u.slice(7));return g.setInt32(3,y),u},2.3:(e,t)=>{var o,s;const{localKey:c}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(s=e.source)&&void 0!==s?s:0,l={protocol:e.protocol,t:p(e.time),data:e.data,gwId:t.devId},d=i.randomBytes(12),u=new Uint8Array(12),g=new DataView(u.buffer);u.set(i.stringToBytes("2.3"),0),g.setInt32(3,r),g.setInt32(7,a),u[11]=0;const y=n.AES_GCM.encrypt(i.stringToBytes(JSON.stringify(l)),i.stringToBytes(c),d,u),h=new Uint8Array(24+y.length);return h.set(u,0),h.set(d,12),h.set(y,24),h}},g=t.createEmitter({globalKey:"__mqttEvent"}),y=c.useTag("MQTT",{needProcess:!1});y.start();var h;!function(e){e[e.CONNECT_BREAK=0]="CONNECT_BREAK",e[e.CONNECTED=1]="CONNECTED",e[e.CONNECTING=2]="CONNECTING"}(h||(h={}));const v=i.getGlobal();v.mqttData||(v.mqttData={client:null,reconnectCount:0,reconnectEnabled:!0,isConnecting:!1,needManualReconnect:!1,currentOptions:{},topicData:{homeIds:new Map,deviceIds:new Set,devices:new Map},mqttType:"standard"});const T=v.mqttData;let f=()=>{};const b=(e,t)=>{if("standard"===T.mqttType)if(T.topicData.devices.has(e)){const o=T.topicData.devices.get(e);try{const n=((e,t)=>{let o="2.0";if("{"!==i.bytesToString(e.slice(0,1))&&(o=i.bytesToString(e.slice(0,3)),/\d\.\d/.test(o)||(o="2.0")),d[o])return d[o](e,t);throw new Error(`Not suppport pv ${o}`)})(t,o);n.t&&10===n.t.toString().length&&(n.t*=1e3),y.log("Receive MQTT Message",e,n.protocol,n.t),g.emit("message",{topic:e,payload:Object.assign({gwId:o.devId},n),mqttType:T.mqttType})}catch(e){y.log("decrypt error: ",e)}}else T.topicData.homeIds.has(e)&&g.emit("message",{topic:e,payload:JSON.parse(i.bytesToString(t)),mqttType:T.mqttType});else g.emit("message",{topic:e,payload:JSON.parse(i.bytesToString(t)),mqttType:T.mqttType})},C=()=>r(void 0,void 0,void 0,(function*(){if(y.log("Reconnect"),T.isConnecting)y.log("Has one Connecting");else if(T.needManualReconnect)y.log("Requires manual reconnection");else if(T.reconnectEnabled){T.reconnectCount++;const e=()=>r(void 0,void 0,void 0,(function*(){try{const e={homeIds:[],devices:[]};T.topicData.homeIds.forEach((t=>{e.homeIds.push(t.homeId)})),T.topicData.devices.forEach((t=>{e.devices.push(t)})),yield m({needReopen:!0,loadMQTTConfig:f}),E(e,!0)}catch(e){if(6e4===e.code||6e4===e.errCode||63021===e.errCode)return;C()}}));T.reconnectCount<=3?e():(O(),setTimeout((()=>{T.client||e()}),2e3*(T.reconnectCount-3)))}}));let S=0;const m=t=>r(void 0,void 0,void 0,(function*(){var o,n;if(T.isConnecting){y.log("Has one Connecting"),yield i.sleep(3e3,(()=>!!T.client&&T.client.getStatus()>0));const e=null===(o=T.client)||void 0===o?void 0:o.getStatus();if(1==e)return;if(2===e)throw{code:63008,errMsg:"MQTT connect failure"};if(T.isConnecting)return m(t)}if(T.needManualReconnect=!1,t.needReopen)T.client&&(y.log("Need destroy old one"),O());else if(T.client){if(1===T.client.getStatus())return void y.log("Already connected")}y.log("Start connecting"),T.isConnecting=!0,g.emit("stateChange",h.CONNECTING);const s=++S;try{const o=null!==(n=t.mqttType)&&void 0!==n?n:"standard";if(y.log("Get config"),!t.loadMQTTConfig)throw{errCode:63021,errMsg:"loadMQTTConfig callback function not set"};f=t.loadMQTTConfig;const i=yield f();y.log("Get config clientId:",i.clientId),T.currentOptions=i,y.log("Connecting MQTT"),T.client=yield e.createMQTT(Object.assign({},i)),y.log("Connected"),T.mqttType=o,T.client.onMessage((({topic:e,payload:t})=>{s===S&&b(e,t)})),T.client.onClose((e=>{s===S&&(y.log("Connect closed",e),g.emit("stateChange",h.CONNECT_BREAK),T.client&&C())})),g.emit("stateChange",h.CONNECTED),T.isConnecting=!1,T.reconnectCount=0}catch(e){throw y.error("Connect Failure",e),T.isConnecting=!1,e}})),E=(e,t)=>r(void 0,void 0,void 0,(function*(){var o,n;if(y.log("Will subscribe data"),T.client){const{topicData:{homeIds:i,devices:s},currentOptions:{homeTopicTpl:c,deviceSubscribeTopicTpl:r}}=T,a=[];if(null===(o=e.homeIds)||void 0===o||o.forEach((e=>{const o=c.replace("{ownerId}",e.toString());!t&&i.has(o)||a.push({homeId:e,topic:o})})),null===(n=e.devices)||void 0===n||n.forEach((e=>{const o=r.replace("{devId}",e.devId);!t&&s.has(o)||a.push(Object.assign(Object.assign({},e),{topic:o}))})),y.log("Will subscribe topics",a.map((e=>e.topic))),a.length)for(let e=0;e<a.length;e+=10){const t=a.slice(e,e+10),o=yield T.client.subscribe(t);o.err?y.warn("subscribe topic error",o):t.forEach((e=>{e.homeId?!i.has(e.topic)&&i.set(e.topic,e):e.devId&&!s.has(e.topic)&&s.set(e.topic,e)}))}}})),I=()=>r(void 0,void 0,void 0,(function*(){if(y.log("Clear topics"),T.client)try{const{topicData:{homeIds:e,devices:t},currentOptions:{homeTopicTpl:o,deviceSubscribeTopicTpl:n}}=T,i=[];t.forEach((e=>{i.push(n.replace("{devId}",e.devId))})),e.forEach((e=>{i.push(o.replace("{ownerId}",e.toString()))}));for(let e=0;e<i.length;e+=10)yield T.client.unsubscribe(i.slice(e,e+10))}catch(e){y.error("Clear topics error",e)}T.topicData={homeIds:new Map,devices:new Map}})),O=()=>{var e,t;1===(null===(e=T.client)||void 0===e?void 0:e.getStatus())&&(g.emit("stateChange",h.CONNECT_BREAK),null===(t=T.client)||void 0===t||t.disconnect()),T.client=null},w=e=>{g.on("message",e)},N=e=>{g.off("message",e)},B=()=>!!T.client&&1===T.client.getStatus(),A=e=>{const t=T.currentOptions.password.substring(8,24),c=i.stringToBytes(t),{protocol:r,data:a,deviceId:l}=e;if(l){const e=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(a)),c,!0),d={protocol:r,pv:"2.0",t:+new Date,data:s.Base64.fromUint8Array(e),client_id:T.currentOptions.clientId,sign:""};return d.sign=((e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const i=n.join("||");return o.hex(i)})(d,t),T.client&&T.client.publish(T.currentOptions.deviceSendTopicTpl.replace("{devId}",l||""),JSON.stringify(d))}throw new Error("Not support this protocol")},M=e=>{const{protocol:t,data:o,deviceId:n,localKey:i,pv:s="2.0"}=e;if(n&&i){const e=((e,t,o)=>{if(u[o])return u[o](e,t);throw new Error(`Not suppport pv ${o}`)})({protocol:t,data:o,devId:n},{devId:n,localKey:i,pv:s},s);return T.client&&T.client.publish(T.currentOptions.deviceSendTopicTpl.replace("{devId}",n),e)}throw new Error("Not support this protocol")};let j=!1,D=+new Date;i.BaseApi.hasBaseApi("onAppShow")&&i.BaseApi.onAppShow((()=>{if(!j)return;T.reconnectEnabled=!0,T.reconnectCount=0,j=!1;if(+new Date-D>3e3)C();else if(T.client)if(1===T.client.getStatus()){const e=()=>{N(e),clearTimeout(t)},t=setTimeout((()=>{N(e),C()}),6e4);w(e)}else C()})),i.BaseApi.hasBaseApi("onAppHide")&&i.BaseApi.onAppHide((()=>{j=!0,T.reconnectEnabled=!1,D=+new Date}));exports.checkSubscribeDevice=e=>{if(T.client&&B()){const{topicData:{devices:t},currentOptions:{deviceSubscribeTopicTpl:o}}=T,n=o.replace("{devId}",e);return t.has(n)}return!1},exports.clearTopics=I,exports.connect=m,exports.destroy=()=>r(void 0,void 0,void 0,(function*(){y.log("Manual disconnect"),T.needManualReconnect=!0,yield I(),O()})),exports.getState=B,exports.offMessage=N,exports.offStateChange=e=>{g.off("stateChange",e)},exports.onMessage=w,exports.onStateChange=e=>{g.on("stateChange",e)},exports.publish=e=>{if(y.log("Send message:",e),T.client)return"open"===T.mqttType?A(e):M(e);throw{errCode:60002,errMsg:"MQTT not connected"}},exports.subscribeTopics=e=>E(e),exports.unsubscribeTopics=e=>r(void 0,void 0,void 0,(function*(){var t,o;if(y.log("unsubscribe topics:",e),T.client){const{topicData:{homeIds:n,devices:i},currentOptions:{homeTopicTpl:s,deviceSubscribeTopicTpl:c}}=T,r=[];null===(t=e.homeIds)||void 0===t||t.forEach((e=>{const t=s.replace("{ownerId}",e.toString());n.has(t)&&(r.push(t),n.delete(t))})),null===(o=e.deviceIds)||void 0===o||o.forEach((e=>{const t=c.replace("{devId}",e);i.has(t)&&(r.push(t),i.delete(t))}));for(let e=0;e<r.length;e+=10)yield T.client.unsubscribe(r.slice(e,e+10))}}));
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@ray-js/wechat-mqtt-core"),t=require("@ray-js/wechat-event"),o=require("js-md5"),n=require("@ray-js/wechat-tycrypto"),i=require("@ray-js/wechat-helper"),s=require("js-base64"),c=require("@ray-js/wechat-debug");function r(e,t,o,n){return new(o||(o=Promise))((function(i,s){function c(e){try{a(n.next(e))}catch(e){s(e)}}function r(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(c,r)}a((n=n.apply(e,t||[])).next())}))}const a=(e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const i=n.join("||");return o.hex(i)},l=(e,t)=>{const{sign:o}=e,n=function(e,t){var o={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(o[n[i]]=e[n[i]])}return o}(e,["sign"]);return a(n,t)===o},d={"2.0":(e,t)=>{const{localKey:o}=t,s=JSON.parse(i.bytesToString(e));if(16===s.protocol)return s;if(l(s,o)){const e=i.hexToBytes(s.data),t=i.bytesToString(n.AES_ECB.decrypt(e,i.stringToBytes(o),!0)),c=JSON.parse(t);return Object.assign(Object.assign({},s),{data:c})}throw Error("check sign invalid")},2.1:(e,t)=>{const{localKey:o}=t,c=i.bytesToString(e.slice(0,3)),r=i.bytesToString(e.slice(3,19)),l=s.Base64.toUint8Array(i.bytesToString(e.slice(19)));if(r===a({data:l,pv:c},o).slice(8,24)){const e=i.bytesToString(n.AES_ECB.decrypt(l,i.stringToBytes(o),!0)),t=JSON.parse(e);return Object.assign({pv:c},t)}throw Error("check sign invalid")},2.2:(e,t)=>{const{localKey:o}=t,s=i.bytesToString(e.slice(0,3)),c=i.bytesToInt(e.slice(3,7)),r=i.bytesToInt(e.slice(7,11)),a=i.bytesToInt(e.slice(11,15)),l=e.slice(15);if(i.CRC32(e.slice(7))===c){const e=i.bytesToString(n.AES_ECB.decrypt(l,i.stringToBytes(o),!0)),t=JSON.parse(e);return Object.assign({pv:s,sn:r,source:a},t)}throw Error("check crc32 invalid")},2.3:(e,t)=>{const{localKey:o}=t,s=i.bytesToString(e.slice(0,3)),c=i.bytesToInt(e.slice(3,7)),r=i.bytesToInt(e.slice(7,11)),a=e.slice(12,24),l=e.slice(24),d=e.slice(0,12),p=i.bytesToString(n.AES_GCM.decrypt(l,i.stringToBytes(o),a,d)),u=JSON.parse(p);return Object.assign({pv:s,sn:c,source:r},u)}},p=e=>(e||(e=+new Date),e.toString().length>10?Math.floor(e/1e3):e),u={"2.0":(e,t)=>{const{localKey:o}=t,s=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(e.data)),i.stringToBytes(o),!0),c={protocol:e.protocol,pv:"2.0",t:p(e.time),data:i.bytesToHex(s),gwId:e.devId};return c.sign=a(c,o),i.stringToBytes(JSON.stringify(c))},2.1:(e,t)=>{const{localKey:o}=t,c={protocol:e.protocol,t:p(e.time),data:e.data},r=s.Base64.fromUint8Array(n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(c)),i.stringToBytes(o),!0)),l=a({data:r,pv:"2.1"},o).slice(8,24);return i.stringToBytes(`2.1${l}${r}`)},2.2:(e,t)=>{var o,s;const{localKey:c}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(s=e.source)&&void 0!==s?s:0,l={protocol:e.protocol,t:p(e.time),data:e.data},d=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(l)),i.stringToBytes(c),!0),u=new Uint8Array(15+d.length),g=new DataView(u.buffer);u.set(i.stringToBytes("2.2"),0),g.setInt32(7,r),g.setInt32(11,a),u.set(d,15);const y=i.CRC32(u.slice(7));return g.setInt32(3,y),u},2.3:(e,t)=>{var o,s;const{localKey:c}=t,r=null!==(o=e.sn)&&void 0!==o?o:0,a=null!==(s=e.source)&&void 0!==s?s:0,l={protocol:e.protocol,t:p(e.time),data:e.data,gwId:t.devId},d=i.randomBytes(12),u=new Uint8Array(12),g=new DataView(u.buffer);u.set(i.stringToBytes("2.3"),0),g.setInt32(3,r),g.setInt32(7,a),u[11]=0;const y=n.AES_GCM.encrypt(i.stringToBytes(JSON.stringify(l)),i.stringToBytes(c),d,u),h=new Uint8Array(24+y.length);return h.set(u,0),h.set(d,12),h.set(y,24),h}},g=t.createEmitter({globalKey:"__mqttEvent"}),y=c.useTag("MQTT",{needProcess:!1});y.start();var h;!function(e){e[e.CONNECT_BREAK=0]="CONNECT_BREAK",e[e.CONNECTED=1]="CONNECTED",e[e.CONNECTING=2]="CONNECTING"}(h||(h={}));const v=i.getGlobal();v.mqttData||(v.mqttData={client:null,reconnectCount:0,reconnectEnabled:!0,isConnecting:!1,needManualReconnect:!1,currentOptions:{},topicData:{homeIds:new Map,deviceIds:new Set,devices:new Map},mqttType:"standard"});const T=v.mqttData;let f=()=>{};const b=(e,t)=>{if("standard"===T.mqttType)if(T.topicData.devices.has(e)){const o=T.topicData.devices.get(e);try{const n=((e,t)=>{let o="2.0";if("{"!==i.bytesToString(e.slice(0,1))&&(o=i.bytesToString(e.slice(0,3)),/\d\.\d/.test(o)||(o="2.0")),d[o])return d[o](e,t);throw new Error(`Not suppport pv ${o}`)})(t,o);n.t&&10===n.t.toString().length&&(n.t*=1e3),y.log("Receive MQTT Message",e,n.protocol,n.t),g.emit("message",{topic:e,payload:Object.assign({gwId:o.devId},n),mqttType:T.mqttType})}catch(e){y.log("decrypt error: ",e)}}else T.topicData.homeIds.has(e)&&g.emit("message",{topic:e,payload:JSON.parse(i.bytesToString(t)),mqttType:T.mqttType});else g.emit("message",{topic:e,payload:JSON.parse(i.bytesToString(t)),mqttType:T.mqttType})},C=()=>r(void 0,void 0,void 0,(function*(){if(y.log("Reconnect"),T.isConnecting)y.log("Has one Connecting");else if(T.needManualReconnect)y.log("Requires manual reconnection");else if(T.reconnectEnabled){T.reconnectCount++;const e=()=>r(void 0,void 0,void 0,(function*(){try{const e={homeIds:[],devices:[]};T.topicData.homeIds.forEach((t=>{e.homeIds.push(t.homeId)})),T.topicData.devices.forEach((t=>{e.devices.push(t)})),yield m({needReopen:!0,loadMQTTConfig:f}),E(e,!0)}catch(e){if(6e4===e.code||6e4===e.errCode||63021===e.errCode)return;C()}}));T.reconnectCount<=3?e():(O(),setTimeout((()=>{T.client||e()}),3e3))}}));let S=0;const m=t=>r(void 0,void 0,void 0,(function*(){var o,n;if(T.isConnecting){y.log("Has one Connecting"),yield i.sleep(3e3,(()=>!!T.client&&T.client.getStatus()>0));const e=null===(o=T.client)||void 0===o?void 0:o.getStatus();if(1==e)return;if(2===e)throw{code:63008,errMsg:"MQTT connect failure"};if(T.isConnecting)return m(t)}if(T.needManualReconnect=!1,t.needReopen)T.client&&(y.log("Need destroy old one"),O());else if(T.client){if(1===T.client.getStatus())return void y.log("Already connected")}y.log("Start connecting"),T.isConnecting=!0,g.emit("stateChange",h.CONNECTING);const s=++S;try{const o=null!==(n=t.mqttType)&&void 0!==n?n:"standard";if(y.log("Get config"),!t.loadMQTTConfig)throw{errCode:63021,errMsg:"loadMQTTConfig callback function not set"};f=t.loadMQTTConfig;const i=yield f();y.log("Get config clientId:",i.clientId),T.currentOptions=i,y.log("Connecting MQTT"),T.client=yield e.createMQTT(Object.assign({},i)),y.log("Connected"),T.mqttType=o,T.client.onMessage((({topic:e,payload:t})=>{s===S&&b(e,t)})),T.client.onClose((e=>{s===S&&(y.log("Connect closed",e),g.emit("stateChange",h.CONNECT_BREAK),T.client&&C())})),g.emit("stateChange",h.CONNECTED),T.isConnecting=!1,T.reconnectCount=0}catch(e){throw y.error("Connect Failure",e),T.isConnecting=!1,e}})),E=(e,t)=>r(void 0,void 0,void 0,(function*(){var o,n;if(y.log("Will subscribe data"),T.client){const{topicData:{homeIds:i,devices:s},currentOptions:{homeTopicTpl:c,deviceSubscribeTopicTpl:r}}=T,a=[];if(null===(o=e.homeIds)||void 0===o||o.forEach((e=>{const o=c.replace("{ownerId}",e.toString());!t&&i.has(o)||a.push({homeId:e,topic:o})})),null===(n=e.devices)||void 0===n||n.forEach((e=>{const o=r.replace("{devId}",e.devId);!t&&s.has(o)||a.push(Object.assign(Object.assign({},e),{topic:o}))})),y.log("Will subscribe topics",a.map((e=>e.topic))),a.length)for(let e=0;e<a.length;e+=10){const t=a.slice(e,e+10),o=yield T.client.subscribe(t);o.err?y.warn("subscribe topic error",o):t.forEach((e=>{e.homeId?!i.has(e.topic)&&i.set(e.topic,e):e.devId&&!s.has(e.topic)&&s.set(e.topic,e)}))}}})),I=()=>r(void 0,void 0,void 0,(function*(){if(y.log("Clear topics"),T.client)try{const{topicData:{homeIds:e,devices:t},currentOptions:{homeTopicTpl:o,deviceSubscribeTopicTpl:n}}=T,i=[];t.forEach((e=>{i.push(n.replace("{devId}",e.devId))})),e.forEach((e=>{i.push(o.replace("{ownerId}",e.toString()))}));for(let e=0;e<i.length;e+=10)yield T.client.unsubscribe(i.slice(e,e+10))}catch(e){y.error("Clear topics error",e)}T.topicData={homeIds:new Map,devices:new Map}})),O=()=>{var e,t;1===(null===(e=T.client)||void 0===e?void 0:e.getStatus())&&(g.emit("stateChange",h.CONNECT_BREAK),null===(t=T.client)||void 0===t||t.disconnect()),T.client=null},w=e=>{g.on("message",e)},N=e=>{g.off("message",e)},B=()=>!!T.client&&1===T.client.getStatus(),A=e=>{const t=T.currentOptions.password.substring(8,24),c=i.stringToBytes(t),{protocol:r,data:a,deviceId:l}=e;if(l){const e=n.AES_ECB.encrypt(i.stringToBytes(JSON.stringify(a)),c,!0),d={protocol:r,pv:"2.0",t:+new Date,data:s.Base64.fromUint8Array(e),client_id:T.currentOptions.clientId,sign:""};return d.sign=((e,t)=>{const n=Object.keys(e).sort(((e,t)=>e<t?-1:1)).reduce(((t,o)=>e[o]||0===e[o]?t.concat(`${o}=${e[o]}`):t),[]);n.push(t);const i=n.join("||");return o.hex(i)})(d,t),T.client&&T.client.publish(T.currentOptions.deviceSendTopicTpl.replace("{devId}",l||""),JSON.stringify(d))}throw new Error("Not support this protocol")},M=e=>{const{protocol:t,data:o,deviceId:n,localKey:i,pv:s="2.0"}=e;if(n&&i){const e=((e,t,o)=>{if(u[o])return u[o](e,t);throw new Error(`Not suppport pv ${o}`)})({protocol:t,data:o,devId:n},{devId:n,localKey:i,pv:s},s);return T.client&&T.client.publish(T.currentOptions.deviceSendTopicTpl.replace("{devId}",n),e)}throw new Error("Not support this protocol")};let j=!1,D=+new Date;i.BaseApi.hasBaseApi("onAppShow")&&i.BaseApi.onAppShow((()=>{if(!j)return;T.reconnectEnabled=!0,T.reconnectCount=0,j=!1;if(+new Date-D>3e3)C();else if(T.client)if(1===T.client.getStatus()){const e=()=>{N(e),clearTimeout(t)},t=setTimeout((()=>{N(e),C()}),6e4);w(e)}else C()})),i.BaseApi.hasBaseApi("onAppHide")&&i.BaseApi.onAppHide((()=>{j=!0,T.reconnectEnabled=!1,D=+new Date}));exports.checkSubscribeDevice=e=>{if(T.client&&B()){const{topicData:{devices:t},currentOptions:{deviceSubscribeTopicTpl:o}}=T,n=o.replace("{devId}",e);return t.has(n)}return!1},exports.clearTopics=I,exports.connect=m,exports.destroy=()=>r(void 0,void 0,void 0,(function*(){y.log("Manual disconnect"),T.needManualReconnect=!0,yield I(),O()})),exports.getState=B,exports.offMessage=N,exports.offStateChange=e=>{g.off("stateChange",e)},exports.onMessage=w,exports.onStateChange=e=>{g.on("stateChange",e)},exports.publish=e=>{if(y.log("Send message:",e),T.client)return"open"===T.mqttType?A(e):M(e);throw{errCode:60002,errMsg:"MQTT not connected"}},exports.subscribeTopics=e=>E(e),exports.unsubscribeTopics=e=>r(void 0,void 0,void 0,(function*(){var t,o;if(y.log("unsubscribe topics:",e),T.client){const{topicData:{homeIds:n,devices:i},currentOptions:{homeTopicTpl:s,deviceSubscribeTopicTpl:c}}=T,r=[];null===(t=e.homeIds)||void 0===t||t.forEach((e=>{const t=s.replace("{ownerId}",e.toString());n.has(t)&&(r.push(t),n.delete(t))})),null===(o=e.deviceIds)||void 0===o||o.forEach((e=>{const t=c.replace("{devId}",e);i.has(t)&&(r.push(t),i.delete(t))}));for(let e=0;e<r.length;e+=10)yield T.client.unsubscribe(r.slice(e,e+10))}}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ray-js/wechat-mqtt",
3
- "version": "0.3.25-beta-1",
3
+ "version": "0.3.26-beta-1",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -23,13 +23,13 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@ray-js/wechat-helper": "^0.3.25-beta-1",
27
- "@ray-js/wechat-tycrypto": "^0.3.25-beta-1",
26
+ "@ray-js/wechat-helper": "^0.3.26-beta-1",
27
+ "@ray-js/wechat-tycrypto": "^0.3.26-beta-1",
28
28
  "js-base64": "^3.7.2",
29
- "@ray-js/wechat-mqtt-core": "^0.3.25-beta-1",
30
- "@ray-js/wechat-event": "^0.3.25-beta-1",
29
+ "@ray-js/wechat-mqtt-core": "^0.3.26-beta-1",
30
+ "@ray-js/wechat-event": "^0.3.26-beta-1",
31
31
  "js-md5": "^0.7.3",
32
- "@ray-js/wechat-debug": "^0.3.25-beta-1"
32
+ "@ray-js/wechat-debug": "^0.3.26-beta-1"
33
33
  },
34
34
  "peerDependencies": {}
35
35
  }