u8-mqtt 0.6.5 → 0.6.7
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/cjs/basic-v4.cjs +16 -11
- package/cjs/basic-v4.cjs.map +1 -1
- package/cjs/basic-v5.cjs +16 -11
- package/cjs/basic-v5.cjs.map +1 -1
- package/cjs/full-v4.cjs +39 -20
- package/cjs/full-v4.cjs.map +1 -1
- package/cjs/full-v5.cjs +39 -20
- package/cjs/full-v5.cjs.map +1 -1
- package/cjs/index.cjs +39 -20
- package/cjs/index.cjs.map +1 -1
- package/cjs/v4.cjs +39 -20
- package/cjs/v4.cjs.map +1 -1
- package/cjs/v5.cjs +39 -20
- package/cjs/v5.cjs.map +1 -1
- package/code/_conn.jsy +5 -4
- package/code/base.jsy +3 -2
- package/code/core.jsy +7 -4
- package/code/router_path.jsy +20 -10
- package/code/with_topic_router.jsy +3 -0
- package/esm/basic-v4.js +16 -11
- package/esm/basic-v4.js.map +1 -1
- package/esm/basic-v5.js +16 -11
- package/esm/basic-v5.js.map +1 -1
- package/esm/deno/basic-v4.js +16 -11
- package/esm/deno/basic-v4.js.map +1 -1
- package/esm/deno/basic-v5.js +16 -11
- package/esm/deno/basic-v5.js.map +1 -1
- package/esm/deno/full-v4.js +39 -20
- package/esm/deno/full-v4.js.map +1 -1
- package/esm/deno/full-v5.js +39 -20
- package/esm/deno/full-v5.js.map +1 -1
- package/esm/deno/index.js +39 -20
- package/esm/deno/index.js.map +1 -1
- package/esm/deno/v4.js +39 -20
- package/esm/deno/v4.js.map +1 -1
- package/esm/deno/v5.js +39 -20
- package/esm/deno/v5.js.map +1 -1
- package/esm/full-v4.js +39 -20
- package/esm/full-v4.js.map +1 -1
- package/esm/full-v5.js +39 -20
- package/esm/full-v5.js.map +1 -1
- package/esm/index.js +39 -20
- package/esm/index.js.map +1 -1
- package/esm/node/basic-v4.js +16 -11
- package/esm/node/basic-v4.js.map +1 -1
- package/esm/node/basic-v4.mjs +16 -11
- package/esm/node/basic-v4.mjs.map +1 -1
- package/esm/node/basic-v5.js +16 -11
- package/esm/node/basic-v5.js.map +1 -1
- package/esm/node/basic-v5.mjs +16 -11
- package/esm/node/basic-v5.mjs.map +1 -1
- package/esm/node/full-v4.js +39 -20
- package/esm/node/full-v4.js.map +1 -1
- package/esm/node/full-v4.mjs +39 -20
- package/esm/node/full-v4.mjs.map +1 -1
- package/esm/node/full-v5.js +39 -20
- package/esm/node/full-v5.js.map +1 -1
- package/esm/node/full-v5.mjs +39 -20
- package/esm/node/full-v5.mjs.map +1 -1
- package/esm/node/index.js +39 -20
- package/esm/node/index.js.map +1 -1
- package/esm/node/index.mjs +39 -20
- package/esm/node/index.mjs.map +1 -1
- package/esm/node/v4.js +39 -20
- package/esm/node/v4.js.map +1 -1
- package/esm/node/v4.mjs +39 -20
- package/esm/node/v4.mjs.map +1 -1
- package/esm/node/v5.js +39 -20
- package/esm/node/v5.js.map +1 -1
- package/esm/node/v5.mjs +39 -20
- package/esm/node/v5.mjs.map +1 -1
- package/esm/v4.js +39 -20
- package/esm/v4.js.map +1 -1
- package/esm/v5.js +39 -20
- package/esm/v5.js.map +1 -1
- package/esm/web/basic-v4.js +16 -11
- package/esm/web/basic-v4.js.map +1 -1
- package/esm/web/basic-v4.min.js +1 -1
- package/esm/web/basic-v4.min.js.br +0 -0
- package/esm/web/basic-v4.min.js.gz +0 -0
- package/esm/web/basic-v5.js +16 -11
- package/esm/web/basic-v5.js.map +1 -1
- package/esm/web/basic-v5.min.js +1 -1
- package/esm/web/basic-v5.min.js.br +0 -0
- package/esm/web/basic-v5.min.js.gz +0 -0
- package/esm/web/full-v4.js +39 -20
- package/esm/web/full-v4.js.map +1 -1
- package/esm/web/full-v4.min.js +1 -1
- package/esm/web/full-v4.min.js.br +0 -0
- package/esm/web/full-v4.min.js.gz +0 -0
- package/esm/web/full-v5.js +39 -20
- package/esm/web/full-v5.js.map +1 -1
- package/esm/web/full-v5.min.js +1 -1
- package/esm/web/full-v5.min.js.br +0 -0
- package/esm/web/full-v5.min.js.gz +0 -0
- package/esm/web/index.js +39 -20
- package/esm/web/index.js.map +1 -1
- package/esm/web/index.min.js +1 -1
- package/esm/web/index.min.js.br +0 -0
- package/esm/web/index.min.js.gz +0 -0
- package/esm/web/v4.js +39 -20
- package/esm/web/v4.js.map +1 -1
- package/esm/web/v4.min.js +1 -1
- package/esm/web/v4.min.js.br +0 -0
- package/esm/web/v4.min.js.gz +0 -0
- package/esm/web/v5.js +39 -20
- package/esm/web/v5.js.map +1 -1
- package/esm/web/v5.min.js +1 -1
- package/esm/web/v5.min.js.br +0 -0
- package/esm/web/v5.min.js.gz +0 -0
- package/package.json +16 -17
package/esm/web/full-v4.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(t,e=[]){for(e.push((t<128?0:128)|127&t);(t>>>=7)>0;)e.push((t<128?0:128)|127&t);return e}class e extends Number{constructor(t,e){super(t),this.reason=`:${(this.ok=t<128)?"ok":"fail"}:${e}`}}function r(t,e){for(let[t,r]of Object.entries(e))e[t]=new Map(r);return class extends t{_reason_for(t,r){return e[r]?.get(t)||e.all.get(t)}warn(t){let e=this.pkt;e.warn?e.warn(t,e):console.warn("[u8-mqtt-packet] "+t)}}}const n=r(class{static for(t,e){return(new this).of(e,{pkt:t})}of(t,e){let r=(t,e)=>(e=0|r.k,r.k=e+t,e);return{__proto__:this,buf:t,step:r,...e}}has_more(){return this.buf.byteLength>(0|this.step.k)}u8(){return this.buf[this.step(1)]}u16(){let{buf:t,step:e}=this,r=e(2);return t[r]<<8|t[r+1]}u32(){let{buf:t,step:e}=this,r=e(4);return t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3]}vint(){let{buf:t,step:e}=this,[r,n,s]=function(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}(t,0|e.k);return e(n-s),r}bin(){let{buf:t,step:e}=this,r=e(2),n=t[r]<<8|t[r+1];return r=e(n),t.subarray(r,r+n)}utf8(){return new TextDecoder("utf-8").decode(this.bin())}pair(){return[this.utf8(),this.utf8()]}flags(t){return new t(this.buf[this.step(1)])}reason(t){let r=this.buf[this.step(1)];if(null!=r)return new e(r,this._reason_for?.(r,t))}flush(){let{buf:t,step:e}=this;return this.step=this.buf=null,t.subarray(0|e.k)}},{connack:[[1,"conn refused: unacceptable protocol version"],[2,"conn refused: identifier rejected"],[3,"conn refused: server unavailable"],[4,"conn refused: bad user name or password"],[5,"conn refused: not authorized"]],suback:[[0,"qos=0"],[1,"qos=1"],[2,"qos=2"]],unsuback:[[17,"no subscription existed"]],puback:[[16,"no matching subscribers"]],all:[[0,""],[128,"unspecified error"],[131,"implementation specific error"],[135,"not authorized"],[143,"topic filter invalid"],[145,"packet identifier in use"],[146,"packet identifier not found"]]});const s={decode_fns:[function(t,e){class r extends Number{get reserved(){return!0&this}get clean_start(){return!0&this}get will_flag(){return!0&this}get will_qos(){return this>>>3&3}get will_retain(){return!0&this}get password(){return!0&this}get username(){return!0&this}}return t[1]=(t,n)=>{let s=e.for(t,n);if("MQTT"!==s.utf8())throw new Error("Invalid mqtt_connect packet");t.__proto__.mqtt_level=t.mqtt_level=s.u8();let o=t.flags=s.flags(r);if(t.keep_alive=s.u16(),5<=t.mqtt_level&&(t.props=s.props()),t.client_id=s.utf8(),o.will_flag){let e=t.will={};5<=t.mqtt_level&&(e.props=s.props()),e.topic=s.utf8(),e.payload=s.bin(),e.qos=o.will_qos,e.retain=o.will_retain}return o.username&&(t.username=s.utf8()),o.password&&(t.password=s.bin()),t}},function(t,e){class r extends Number{get session_present(){return!0&this}}return t[2]=(t,n)=>{let s=e.for(t,n);return t.flags=s.flags(r),t.reason=s.reason(t.type),5<=t.mqtt_level&&(t.props=s.props()),t}},function(t,e){return t[3]=(t,r)=>{let{hdr:n}=t;t.dup=Boolean(8&n),t.retain=Boolean(1&n);let s=t.qos=n>>1&3,o=e.for(t,r);return t.topic=o.utf8(),0!==s&&(t.pkt_id=o.u16()),5<=t.mqtt_level&&(t.props=o.props()),t.payload=o.flush(),t}},function(t,e){return t[4]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.reason=n.reason(t.type),t.props=n.props()),t}},function(t,e){return t[5]=t[6]=t[7]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),t.reason=n.reason("pubxxx",e),5<=t.mqtt_level&&(t.props=n.props()),t}},function(t,e){class r extends Number{get qos(){return 3&this}get retain(){return!0&this}get retain_handling(){return this>>2&3}}return t[8]=(t,n)=>{let s=e.for(t,n);t.pkt_id=s.u16(),5<=t.mqtt_level&&(t.props=s.props());let o,i,u=t.topics=[];for(;s.has_more();)o=s.utf8(),i=s.flags(r),u.push({topic:o,opts:i});return t}},function(t,e){return t[9]=t[11]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.answers=[];for(;n.has_more();)s.push(n.reason(t.type));return t}},function(t,e){return t[10]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.topics=[];for(;n.has_more();)s.push(n.utf8());return t}},function(t){return t[12]=t[13]=t=>t},function(t,e){return t[14]=(t,r)=>{if(r&&5<=t.mqtt_level){let n=e.for(t,r);t.reason=n.reason(t.type),t.props=n.props()}return t}}],mqtt_reader:n,encode_fns:[function(t,e){const r=new Uint8Array([0,4,77,81,84,84]),n=t=>(t.reserved?1:0)|(3&t.will_qos)<<3|(t.clean_start?2:0)|(t.will_flag?4:0)|(t.will_retain?32:0)|(t.password?64:0)|(t.username?128:0);return t.connect=(t,s)=>{let o=e.for(s);o.push(r),o.u8(t);let{will:i,username:u,password:p}=s,a=o.flags(s.flags,n,(u?128:0)|(p?64:0)|(i?(t=>4|(3&t.qos)<<3|(t.retain?32:0))(i):0));return o.u16(s.keep_alive),5<=t&&o.props(s.props),o.utf8(s.client_id),4&a&&(5<=t&&o.props(i.props),o.utf8(i.topic),o.bin(i.payload)),128&a&&o.utf8(u),64&a&&o.bin(p),o.as_pkt(16)}},function(t,e){const r=t=>t.session_present?1:0;return t.connack=(t,n)=>{let s=e.for(n);return s.flags(n.flags,r),5<=t?(s.reason(n.reason),s.props(n.props)):s.reason(n.return_code||n.reason),s.as_pkt(32)}},function(t,e){return t.publish=(t,r)=>{let n=(3&r.qos)<<1,s=e.for(r);return s.utf8(r.topic),0!==n&&s.u16(r.pkt_id),5<=t?(s.props(r.props),s.flush(r.payload)):s.flush(r.payload),s.as_pkt(48|n|(r.dup?8:0)|(r.retain?1:0))}},function(t,e){return t.puback=(t,r)=>{let n=e.for(r);return n.u16(r.pkt_id),5<=t&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(64)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);return s.u16(n.pkt_id),5<=r?(s.props(n.props),s.reason(n.reason)):s.reason(n.return_code||n.reason),s.as_pkt(t)}}t.pubrec=r(80),t.pubrel=r(98),t.pubcomp=r(112)},function(t,e){const r=t=>3&t.qos|(t.retain?4:0)|(3&t.retain_handling)<<2;return t.subscribe=(t,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=t&&s.props(n.props);let o=r(n);for(let t of n.topics)if("string"==typeof t)s.utf8(t),s.u8(o);else{let[e,n]=Array.isArray(t)?t:[t.topic,t.opts];s.utf8(e),void 0===n?s.u8(o):s.flags(n,r)}return s.as_pkt(130)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=r&&s.props(n.props);for(let t of n.answers)s.reason(t);return s.as_pkt(t)}}t.suback=r(144),t.unsuback=r(176)},function(t,e){return t.unsubscribe=(t,r)=>{let n=e.for(r);n.u16(r.pkt_id),5<=t&&n.props(r.props);for(let t of r.topics)n.utf8(t);return n.as_pkt(162)}},function(t){t.pingreq=()=>new Uint8Array([192,0]),t.pingresp=()=>new Uint8Array([208,0])},function(t,e){return t.disconnect=(t,r)=>{let n=e.for(r);return r&&5<=t&&(r.reason||r.props)&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(224)}}],mqtt_writer:class{static for(t){return(new this).of()}of(){return{__proto__:this,$:[]}}static init(){return this}as_pkt(t){return this.pack([t])}push(...t){this.$.push(...t)}pack(e){let r,n,s=0,o=this.$;for(r of(this.$=!1,o))s+=r.length;n=(e=t(s,e)).length;let i=new Uint8Array(n+s);for(r of(i.set(e,0),o))i.set(r,n),n+=r.length;return i}u8(t){this.push([255&t])}u16(t){this.push([t>>>8&255,255&t])}u32(t){this.push([t>>>24&255,t>>>16&255,t>>>8&255,255&t])}vint(e){this.push(t(e))}bin(t){return t?"string"==typeof t?this.utf8(t):(t.length!==t.byteLength&&(t=new Uint8Array(t)),this.u16(t.byteLength),void this.push(t)):this.u16(0)}utf8(t){let e=new TextEncoder("utf-8").encode(t);this.u16(e.byteLength),this.push(e)}pair(t,e){this.utf8(t),this.utf8(e)}flags(t,e,r=0){return void 0!==t&&isNaN(+t)&&(t=e(t,0)),t|=r,this.push([t]),t}reason(t){this.push([0|t])}flush(t){null!=t&&this.push("string"==typeof t?new TextEncoder("utf-8").encode(t):t),this.push=!1}}};const o=t=>"function"==typeof t,i=t=>"string"==typeof t;const u=(t=>e=>class extends e{static _aliases(){return super._aliases()+" sub_topic:subscribe_topic unsub_topic:unsubscribe_topic"}_init_router(e,r,n){this._subs=[];let s=this.router=n.router=t(e,this,n);return s?.invoke}on_sub(t,e){return t.pkt=e,this._subs.push(t),t}subs_settled(){return Promise.allSettled(this._subs.splice(0,1/0))}subscribe_topic(t,...e){let r=this.router;r.add(t,!0,e.pop());let n=r.mqtt_topic(t);return this.subscribe(n,...e),this}unsubscribe_topic(t,...e){let r=this.router,n=e.at(-1)?.call?e.pop():null;r.remove(t,!0,n);let s=r.mqtt_topic(t);return this.unsubscribe(s,...e)}on_topic(...t){return this.router.add(...t),this}})(l),p=t=>t.replace(/[*].*$/,"#").replace(/:\w[^\/]*/g,"+"),a=(t,e)=>(e=1,t.replace(/#$/,"*").replace(/\+/g,(()=>":$"+e++)));function c(t,e,r){r.done=!0}function l(){let t=[[],[]],e=Symbol(),r=e=>function*(t,e){e=e.replace(/^[\/]*/,"/");for(let r of t.flat()){let t=r?.pattern.exec(e);if(t){let e=r.keys;if(e){let n,s=0,o={__proto__:_};for(n of e)o[n]=t[++s];yield[r.tgt,o,r]}else yield[r.tgt,t.groups??t,r]}}}(t,e);return{find:r,mqtt_topic:p,add(e,...r){let n=r.pop(),s=r.pop();if(!o(n)){if(n)throw new TypeError;n=c}let i=function(t,e){if(t instanceof RegExp)return{keys:!1,pattern:t};var r,n,s,o,i=[],u="",p=t.split("/");for(p[0]||p.shift();s=p.shift();)"*"===(r=s[0])?(i.push(r),u+="?"===s[1]?"(?:/(.*))?":"/(.*)"):":"===r?(n=s.indexOf("?",1),o=s.indexOf(".",1),i.push(s.substring(1,~n?n:~o?o:s.length)),u+=~n&&!~o?"(?:/([^/]+?))?":"/([^/]+?)",~o&&(u+=(~n?"?":"")+"\\"+s.substring(o))):u+="/"+s;return{keys:i,pattern:new RegExp("^"+u+(e?"(?=$|/)":"/?$"),"i")}}(a(e));return i.topic=e,i.tgt=n,t[s?0:1].push(i),this},remove(e,...r){let n=t;return"boolean"==typeof r[0]&&(n=[t[r.shift()?0:1]]),"string"==typeof e&&(e={topic:e,tgt:r.pop()}),f(n,e)},clear(e){null==e?t=[[],[]]:t[e?0:1]=[]},async invoke(n,s){s.idx=0,s.rm=e;for(let[o,i,u]of r(n.topic)){let r=await o(n,i,s);if(e===r&&f(t,u),s.done)break;s.idx++}1===n.qos&&await s.mqtt.puback(n)}}}const _={get wild(){return this["*"]},set wild(t){return this["*"]=wild}};function f(t,e){for(let r of t){let t=0;for(let n of r){let s=n===e;s||n.topic!==e.topic||(s=null==e.tgt||n.tgt===e.tgt),s||(r[t++]=n)}r.length=t}return!1}function h(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}function d(t){let e=new Uint8Array(0),r=0;return n=>{e=0===e.byteLength?n:function(t,e){let r=t.byteLength,n=new Uint8Array(r+e.byteLength);return n.set(t,0),n.set(e,r),n}(e,n);let s=[];for(;e.byteLength>=r;){let[n,o]=h(e,1,NaN),i=n+o;if(!(i<=e.byteLength)){r=i||0;break}let u=e[0],p=0===n?null:e.subarray(o,i);e=e.subarray(i);let a=t.decode_pkt(u,p,t);null!=a&&s.push(a)}return s}}const b=["~","connect","connack","publish","puback","pubrec","pubrel","pubcomp","subscribe","suback","unsubscribe","unsuback","pingreq","pingresp","disconnect","auth"];async function g(t,e,r,n){let s=t[`mqtt_${r.type}`]||t.mqtt_pkt;await(s?.call(t,r,n))}function w(t,e,r,n){e(r.type,r),g(t,0,r,n)}function m(t,e,r){e(r.pkt_id,r)}const k=[t=>{},g,w,g,m,m,m,m,g,m,g,m,w,w,g,w];class y extends Error{constructor(t,e=t.reason){super(`[0x${e.toString(16)}] ${e.reason}`),this.mqtt_pkt=t,this.reason=e}}class q{async connect(t={}){let e=t.client_id;i(e)||(t.client_id=e=this.client_id||this.init_client_id(e)),this.client_id=e,null==t.keep_alive&&(t.keep_alive=60);let r=await this._send0("connect",t,"connack");if(0!=r[0].reason)throw new this.MQTTError(r[0]);return this.conn.on_conn(t,r)}async disconnect(t={}){let e=await this._send0("disconnect",t);return this.conn.on_dis(t,e)}async auth(t={}){let e=await this._send0("auth",t,"auth");if(e[0].reason)throw new this.MQTTError(e[0]);return this.conn.on_auth(t,e)}ping(){return this._send("pingreq",null,"pingresp")}puback({pkt_id:t}){return this._send("puback",{pkt_id:t})}subscribe(t,e,r){t=v(t,e,r);let n=this._send("subscribe",t,t);return this.on_sub?.(n,t)??n}unsubscribe(t,e,r){return t=v(t,e,r),this._send("unsubscribe",t,t)}post(t,e,r){return this.pub({topic:t,payload:e,qos:0},r)}send(t,e,r){return this.pub({topic:t,payload:e,qos:1},r)}store(t,e,r){return this.pub({topic:t,payload:e,qos:1,retain:1},r)}obj_post(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:0},r)}obj_send(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1},r)}obj_store(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1,retain:1},r)}async pub(t,e){if(void 0===t.payload){o(e)&&(e={fn_encode:e});let r=t.msg,n=e?.fn_encode;if(null==r||o(r))return r&&(e={...e,fn_encode:r}),r=>this.pub({...t,[t.arg||"payload"]:r},e);t.payload=n?await n(r):JSON.stringify(r)}return e&&(e.props&&(t.props=e.props),e.xform&&(t=e.xform(t)||t)),this._send("publish",t,t.qos?t:null)}_init_dispatch(t){this.constructor?._once_();let e={__proto__:t.on_mqtt_type};return e.mqtt_publish||=this._init_router?.(t,this,e),function(t,e){let r,n=[],s=0,{td:o=1e3,n:u=5}=t?.rotate||{},p=100,a=t=>n[0].set(r,t);return l([]),[l,function(t){return i(t)?r=t:(p=p+1&65535,r=t.pkt_id=p),new Promise(a)}];function c(t,e){for(let r of n){let n=r.get(t);if(n)return r.delete(t),n([e]),!0}return!1}function l(t,r){for(let n of t)k[n.id](e,c,n,r);let i=Date.now();if(i>s)for(s=o+i,n.unshift(new Map);n.length>u;)for(let t of n.pop().values())t([,"expired"])}}(t,e)}static _aliases(){return" publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store"}static _once_(t=this){t._once_=t=>0;var e,r,n=t.prototype;for(e of(n.MQTTError=y,t._aliases().split(/\s+/)))[e,r]=e.split(":"),n[e]=n[r]}}function v(t,e,r){if(e?.trim&&(r=e,e=null),t=t.trim?{topics:[t],...e}:t[Symbol.iterator]?{topics:[...t],...e}:e?{...t,...e}:t,r){let e=t=>t.trim?r+t:t.map(e);t.topics=t.topics.map(e)}return t}const x=t=>(t.p=new Promise(((e,r)=>{t.a=e,t.e=r})),t);function T(t,e,r){let n={set:o},s=async(...t)=>(await n.p)(...t);return o();function o(){return s!==t[e]&&(x(n).p.then(r,(t=>0)),t[e]=s),n}}function j(t,e,[r,n]){let s,o=T(e,"_send0",(t=>e.conn_emit("on_live",p.has_connected))),i=T(e,"_send",(t=>e.conn_emit("on_ready"))),u=function(t){let e;return r=>{if(e=clearInterval(e),r)return e=setInterval(t,1e3*r),e.unref?.(),!0}}((()=>e._send0("pingreq"))),p=Object.create({ping:(t=p.keep_alive)=>u(t),on_conn:(r,n)=>(p.has_connected=!0,p.keep_alive=t.keep_alive||n[0].props?.server_keep_alive||r.keep_alive,e.conn_emit("on_conn"),t.use_auth?n:p.on_auth(null,n)),on_auth:(r,n)=>(i.a(o.p),0!=t.keep_alive&&p.ping(),e.conn_emit("on_auth",!r),n),on_dis:(t,e)=>(p.reset(!1),e),reset(t){t&&o.e(t),s.e(t),delete p.is_set,p.ready=a(),e.conn_emit("on_disconnect",!1===t,t)},abort:()=>(i.e(err),p.reset(err)),async setup(t,s,i){if(p.is_set)throw new Error;p.is_set=!0,await t;let u=e.mqtt_ctx.mqtt_stream();{let t={mqtt:e};i((e=>r(u.decode(e),t)),p)}s=await s,o.a((async(t,e,r)=>{let o=void 0===r||n(r);return await s(u.encode_pkt(t,e)),o}))}});return p.ready=a(),p;async function a(){s=x({}),u(0),o.set(),i.set();try{return e._send0=await Promise.race([o.p,s.p]),e._send=await Promise.race([i.p,s.p]),!0}catch(t){return!1}}}const $={utf8(t){return new TextDecoder("utf-8").decode(t||this.payload)},json(t){return JSON.parse(this.utf8(t)||null)},text(t){return this.utf8(t)}},E={sess_stg:globalThis.sessionStorage};const S="0.6.5-web",A=u(class extends q{constructor(t){t={...E,...t},super(),this.with(t),this.sess_stg=t.sess_stg,this.conn=j(t,this,this._init_dispatch(t))}with(t){for(let[e,r]of Object.entries(t))o(r)&&(this[e]=r);return this}static mqtt_ctx(t,e,r=$){let n=class extends(this){};return n.prototype.mqtt_ctx=function(t,e,r=e.pkt_ctx){let n,s=e=>({__proto__:e,get hdr(){return 15&this.b0},get id(){return this.b0>>>4},get type(){return b[this.b0>>>4]},mqtt_level:t}),o=[],i={};for(n of e.encode_fns)n(i,e.mqtt_writer);for(n of e.decode_fns)n(o,e.mqtt_reader);return{pkt_api:r,pkt_ctx:s(r),encode_pkt:(e,r)=>i[e](t,r),decode_pkt(t,e){if(t.map)return d(this)(t)[0];let r=o[t>>>4]||o[0];return r?.({__proto__:this.pkt_ctx,b0:t},e)},mqtt_stream(t=this.pkt_api){let e={__proto__:this,pkt_ctx:s(t)};return e.decode=d(e),e}}}(t,e,r),n}async conn_emit(t,e,r){this.log_conn?.(t,e,r);try{let n=this[await t];if(n)await n.call(this,this,e,r);else if(r)throw r}catch(e){this.on_error(e,t)}}on_error(t,e){console.warn("[[u8-mqtt error: %s]]",e,t)}log_conn(t,e,r){console.info("[[u8-mqtt conn: %s]]",t,e,r)}init_client_id(t=["u8-mqtt--",""]){let e,r=this.sess_stg,n=r?.getItem(e=t.join(" "));return n||(n=t.join(Math.random().toString(36).slice(2)),r?.setItem(e,n)),n}on_live(t,e){if(e)return t.connect()}on_disconnect(t,e){if(!e)return t.on_reconnect?.()}_use_conn(t){return(this.reconnect=t)?.()}with_autoreconnect(t=2e3){return t.toFixed&&(t={delay:t}),this.with({on_reconnect(){this.delay(t.delay||2e3).then(this.reconnect).then(t.reconnect,t.error)}})}delay(t){return new Promise((e=>setTimeout(e,t)))}with_async_iter(t,e){return this.conn.setup(t,e,(async(e,r)=>{try{t=await t;for await(let r of t)e(r);r.reset()}catch(t){r.reset(t)}})),this}with_stream(t,e){return void 0===e&&(e=t),this.with_async_iter(t,(t=>e.write(t)))}with_websock(t){if(!t?.send)return t=new URL(t||"ws://127.0.0.1:9001"),this._use_conn((()=>this.with_websock(new WebSocket(t,["mqtt"]))));t.binaryType="arraybuffer";let e,r=t.readyState;if(1!==r){if(0!==r)throw new Error("WS readyState");e=new Promise((e=>t.onopen=e))}return this.conn.setup(e,(e=>t.send(e)),((e,r)=>{t.onmessage=t=>e(new Uint8Array(t.data)),t.onclose=t=>{if(!t.wasClean){var e=new Error("websocket close");e.code=t.code,e.reason=t.reason}r.reset(e)}})),this}}.mqtt_ctx(4,s)),L=t=>new A(t);export{A as MQTTClient,A as MQTTClient_v4,L as default,L as mqtt,L as mqtt_v4,S as version};
|
|
1
|
+
function t(t,e=[]){for(e.push((t<128?0:128)|127&t);(t>>>=7)>0;)e.push((t<128?0:128)|127&t);return e}class e extends Number{constructor(t,e){super(t),this.reason=`:${(this.ok=t<128)?"ok":"fail"}:${e}`}}function r(t,e){for(let[t,r]of Object.entries(e))e[t]=new Map(r);return class extends t{_reason_for(t,r){return e[r]?.get(t)||e.all.get(t)}warn(t){let e=this.pkt;e.warn?e.warn(t,e):console.warn("[u8-mqtt-packet] "+t)}}}const n=r(class{static for(t,e){return(new this).of(e,{pkt:t})}of(t,e){let r=(t,e)=>(e=0|r.k,r.k=e+t,e);return{__proto__:this,buf:t,step:r,...e}}has_more(){return this.buf.byteLength>(0|this.step.k)}u8(){return this.buf[this.step(1)]}u16(){let{buf:t,step:e}=this,r=e(2);return t[r]<<8|t[r+1]}u32(){let{buf:t,step:e}=this,r=e(4);return t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3]}vint(){let{buf:t,step:e}=this,[r,n,s]=function(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}(t,0|e.k);return e(n-s),r}bin(){let{buf:t,step:e}=this,r=e(2),n=t[r]<<8|t[r+1];return r=e(n),t.subarray(r,r+n)}utf8(){return new TextDecoder("utf-8").decode(this.bin())}pair(){return[this.utf8(),this.utf8()]}flags(t){return new t(this.buf[this.step(1)])}reason(t){let r=this.buf[this.step(1)];if(null!=r)return new e(r,this._reason_for?.(r,t))}flush(){let{buf:t,step:e}=this;return this.step=this.buf=null,t.subarray(0|e.k)}},{connack:[[1,"conn refused: unacceptable protocol version"],[2,"conn refused: identifier rejected"],[3,"conn refused: server unavailable"],[4,"conn refused: bad user name or password"],[5,"conn refused: not authorized"]],suback:[[0,"qos=0"],[1,"qos=1"],[2,"qos=2"]],unsuback:[[17,"no subscription existed"]],puback:[[16,"no matching subscribers"]],all:[[0,""],[128,"unspecified error"],[131,"implementation specific error"],[135,"not authorized"],[143,"topic filter invalid"],[145,"packet identifier in use"],[146,"packet identifier not found"]]});const s={decode_fns:[function(t,e){class r extends Number{get reserved(){return!0&this}get clean_start(){return!0&this}get will_flag(){return!0&this}get will_qos(){return this>>>3&3}get will_retain(){return!0&this}get password(){return!0&this}get username(){return!0&this}}return t[1]=(t,n)=>{let s=e.for(t,n);if("MQTT"!==s.utf8())throw new Error("Invalid mqtt_connect packet");t.__proto__.mqtt_level=t.mqtt_level=s.u8();let o=t.flags=s.flags(r);if(t.keep_alive=s.u16(),5<=t.mqtt_level&&(t.props=s.props()),t.client_id=s.utf8(),o.will_flag){let e=t.will={};5<=t.mqtt_level&&(e.props=s.props()),e.topic=s.utf8(),e.payload=s.bin(),e.qos=o.will_qos,e.retain=o.will_retain}return o.username&&(t.username=s.utf8()),o.password&&(t.password=s.bin()),t}},function(t,e){class r extends Number{get session_present(){return!0&this}}return t[2]=(t,n)=>{let s=e.for(t,n);return t.flags=s.flags(r),t.reason=s.reason(t.type),5<=t.mqtt_level&&(t.props=s.props()),t}},function(t,e){return t[3]=(t,r)=>{let{hdr:n}=t;t.dup=Boolean(8&n),t.retain=Boolean(1&n);let s=t.qos=n>>1&3,o=e.for(t,r);return t.topic=o.utf8(),0!==s&&(t.pkt_id=o.u16()),5<=t.mqtt_level&&(t.props=o.props()),t.payload=o.flush(),t}},function(t,e){return t[4]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.reason=n.reason(t.type),t.props=n.props()),t}},function(t,e){return t[5]=t[6]=t[7]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),t.reason=n.reason("pubxxx",e),5<=t.mqtt_level&&(t.props=n.props()),t}},function(t,e){class r extends Number{get qos(){return 3&this}get retain(){return!0&this}get retain_handling(){return this>>2&3}}return t[8]=(t,n)=>{let s=e.for(t,n);t.pkt_id=s.u16(),5<=t.mqtt_level&&(t.props=s.props());let o,i,u=t.topics=[];for(;s.has_more();)o=s.utf8(),i=s.flags(r),u.push({topic:o,opts:i});return t}},function(t,e){return t[9]=t[11]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.answers=[];for(;n.has_more();)s.push(n.reason(t.type));return t}},function(t,e){return t[10]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.topics=[];for(;n.has_more();)s.push(n.utf8());return t}},function(t){return t[12]=t[13]=t=>t},function(t,e){return t[14]=(t,r)=>{if(r&&5<=t.mqtt_level){let n=e.for(t,r);t.reason=n.reason(t.type),t.props=n.props()}return t}}],mqtt_reader:n,encode_fns:[function(t,e){const r=new Uint8Array([0,4,77,81,84,84]),n=t=>(t.reserved?1:0)|(3&t.will_qos)<<3|(t.clean_start?2:0)|(t.will_flag?4:0)|(t.will_retain?32:0)|(t.password?64:0)|(t.username?128:0);return t.connect=(t,s)=>{let o=e.for(s);o.push(r),o.u8(t);let{will:i,username:u,password:p}=s,a=o.flags(s.flags,n,(u?128:0)|(p?64:0)|(i?(t=>4|(3&t.qos)<<3|(t.retain?32:0))(i):0));return o.u16(s.keep_alive),5<=t&&o.props(s.props),o.utf8(s.client_id),4&a&&(5<=t&&o.props(i.props),o.utf8(i.topic),o.bin(i.payload)),128&a&&o.utf8(u),64&a&&o.bin(p),o.as_pkt(16)}},function(t,e){const r=t=>t.session_present?1:0;return t.connack=(t,n)=>{let s=e.for(n);return s.flags(n.flags,r),5<=t?(s.reason(n.reason),s.props(n.props)):s.reason(n.return_code||n.reason),s.as_pkt(32)}},function(t,e){return t.publish=(t,r)=>{let n=(3&r.qos)<<1,s=e.for(r);return s.utf8(r.topic),0!==n&&s.u16(r.pkt_id),5<=t?(s.props(r.props),s.flush(r.payload)):s.flush(r.payload),s.as_pkt(48|n|(r.dup?8:0)|(r.retain?1:0))}},function(t,e){return t.puback=(t,r)=>{let n=e.for(r);return n.u16(r.pkt_id),5<=t&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(64)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);return s.u16(n.pkt_id),5<=r?(s.props(n.props),s.reason(n.reason)):s.reason(n.return_code||n.reason),s.as_pkt(t)}}t.pubrec=r(80),t.pubrel=r(98),t.pubcomp=r(112)},function(t,e){const r=t=>3&t.qos|(t.retain?4:0)|(3&t.retain_handling)<<2;return t.subscribe=(t,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=t&&s.props(n.props);let o=r(n);for(let t of n.topics)if("string"==typeof t)s.utf8(t),s.u8(o);else{let[e,n]=Array.isArray(t)?t:[t.topic,t.opts];s.utf8(e),void 0===n?s.u8(o):s.flags(n,r)}return s.as_pkt(130)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=r&&s.props(n.props);for(let t of n.answers)s.reason(t);return s.as_pkt(t)}}t.suback=r(144),t.unsuback=r(176)},function(t,e){return t.unsubscribe=(t,r)=>{let n=e.for(r);n.u16(r.pkt_id),5<=t&&n.props(r.props);for(let t of r.topics)n.utf8(t);return n.as_pkt(162)}},function(t){t.pingreq=()=>new Uint8Array([192,0]),t.pingresp=()=>new Uint8Array([208,0])},function(t,e){return t.disconnect=(t,r)=>{let n=e.for(r);return r&&5<=t&&(r.reason||r.props)&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(224)}}],mqtt_writer:class{static for(t){return(new this).of()}of(){return{__proto__:this,$:[]}}static init(){return this}as_pkt(t){return this.pack([t])}push(...t){this.$.push(...t)}pack(e){let r,n,s=0,o=this.$;for(r of(this.$=!1,o))s+=r.length;n=(e=t(s,e)).length;let i=new Uint8Array(n+s);for(r of(i.set(e,0),o))i.set(r,n),n+=r.length;return i}u8(t){this.push([255&t])}u16(t){this.push([t>>>8&255,255&t])}u32(t){this.push([t>>>24&255,t>>>16&255,t>>>8&255,255&t])}vint(e){this.push(t(e))}bin(t){return t?"string"==typeof t?this.utf8(t):(t.length!==t.byteLength&&(t=new Uint8Array(t)),this.u16(t.byteLength),void this.push(t)):this.u16(0)}utf8(t){let e=new TextEncoder("utf-8").encode(t);this.u16(e.byteLength),this.push(e)}pair(t,e){this.utf8(t),this.utf8(e)}flags(t,e,r=0){return void 0!==t&&isNaN(+t)&&(t=e(t,0)),t|=r,this.push([t]),t}reason(t){this.push([0|t])}flush(t){null!=t&&this.push("string"==typeof t?new TextEncoder("utf-8").encode(t):t),this.push=!1}}};const o=t=>"function"==typeof t,i=t=>"string"==typeof t;const u=(t=>e=>class extends e{static _aliases(){return super._aliases()+" sub_topic:subscribe_topic unsub_topic:unsubscribe_topic"}_init_router(e,r,n){this._subs=[];let s=this.router=n.router=t(e,this,n);return s?.invoke}on_sub(t,e){return t.pkt=e,this._subs.push(t),t}subs_settled(){return Promise.allSettled(this._subs.splice(0,1/0))}subscribe_topic(t,...e){let r=this.router;r.add(t,!0,e.pop());let n=r.mqtt_topic(t);return this.subscribe(n,...e),this}unsubscribe_topic(t,...e){let r=this.router,n=e.at(-1)?.call?e.pop():null;if(r.remove(t,!0,n),0!==r.count(t))return null;let s=r.mqtt_topic(t);return this.unsubscribe(s,...e)}on_topic(...t){return this.router.add(...t),this}})(l),p=t=>t.replace(/[*].*$/,"#").replace(/:\w[^\/]*/g,"+"),a=(t,e)=>(e=1,t.replace(/#$/,"*").replace(/\+/g,(()=>":$"+e++)));function c(t,e,r){r.done=!0}function l(){let t=[[],[]],e=Symbol(),r=e=>function*(t,e){e=e.replace(/^[\/]*/,"/");for(let r of t.flat()){let t=r?.pattern.exec(e);if(t){let e=r.keys;if(e){let n,s=0,o={__proto__:f};for(n of e)o[n]=t[++s];yield[r.tgt,o,r]}else yield[r.tgt,t.groups??t,r]}}}(t,e);return{find:r,mqtt_topic:p,add(e,...r){let n=r.pop(),s=r.pop();if(!o(n)){if(n)throw new TypeError;n=c}let i=function(t){if(t instanceof RegExp)return{keys:!1,pattern:t};var e,r,n,s,o=[],i="",u=t.split("/");for(u[0]||u.shift();n=u.shift();)"*"===(e=n[0])?(o.push(e),i+="?"===n[1]?"(?:/(.*))?":"/(.*)"):":"===e?(r=n.indexOf("?",1),s=n.indexOf(".",1),o.push(n.substring(1,~r?r:~s?s:n.length)),i+=~r&&!~s?"(?:/([^/]+?))?":"/([^/]+?)",~s&&(i+=(~r?"?":"")+"\\"+n.substring(s))):i+="/"+n;return{keys:o,pattern:new RegExp("^"+i+"/?$","i")}}(a(e));return i.topic=e,i.tgt=n,t[s?0:1].push(i),this},remove(e,...r){let n=t;return"boolean"==typeof r[0]&&(n=[t[r.shift()?0:1]]),"string"==typeof e&&(e={topic:e,tgt:r.pop()}),_(n,e)},count(e){if(!e)return t.reduce(((t,e)=>t+e.length),0);let r=0;for(let n of t)for(let t of n)e===t.topic&&r++;return r},clear(e){null==e?t=[[],[]]:t[e?0:1]=[]},async invoke(n,s){s.idx=0,s.rm=e;for(let[o,i,u]of r(n.topic)){let r=await o(n,i,s);if(e===r&&_(t,u),s.done)break;s.idx++}1===n.qos&&await s.mqtt.puback(n)}}}const f={get wild(){return this["*"]},set wild(t){return this["*"]=wild}};function _(t,e){let r=0;for(let n of t){let t=0;for(let s of n)s.topic!==e.topic||null!=e.tgt&&s.tgt!==e.tgt?n[t++]=s:r++;n.length=t}return r}function h(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}function d(t){let e=new Uint8Array(0),r=0;return n=>{e=0===e.byteLength?n:function(t,e){let r=t.byteLength,n=new Uint8Array(r+e.byteLength);return n.set(t,0),n.set(e,r),n}(e,n);let s=[];for(;e.byteLength>=r;){let[n,o]=h(e,1,NaN),i=n+o;if(!(i<=e.byteLength)){r=i||0;break}let u=e[0],p=0===n?null:e.subarray(o,i);e=e.subarray(i);let a=t.decode_pkt(u,p,t);null!=a&&s.push(a)}return s}}const b=["~","connect","connack","publish","puback","pubrec","pubrel","pubcomp","subscribe","suback","unsubscribe","unsuback","pingreq","pingresp","disconnect","auth"];async function g(t,e,r,n){let s=t[`mqtt_${r.type}`]||t.mqtt_pkt;await(s?.call(t,r,n))}function w(t,e,r,n){e(r.type,r),g(t,0,r,n)}function m(t,e,r){e(r.pkt_id,r)}const k=[t=>{},g,w,g,m,m,m,m,g,m,g,m,w,w,g,w];class y extends Error{constructor(t,e=t.reason){super(`[0x${e.toString(16)}] ${e.reason}`),this.mqtt_pkt=t,this.reason=e}}class q{async connect(t={}){let e=t.client_id;i(e)||(t.client_id=e=this.client_id||this.init_client_id(e)),this.client_id=e,null==t.keep_alive&&(t.keep_alive=60);let r=await this._send0("connect",t,"connack");if(0!=r[0].reason)throw new this.MQTTError(r[0]);return this.conn.on_conn(t,r)}async disconnect(t={}){let e=this._send0("disconnect",t);return await this.conn.on_dis(t,e),await e}async auth(t={}){let e=await this._send0("auth",t,"auth");if(e[0].reason)throw new this.MQTTError(e[0]);return this.conn.on_auth(t,e)}ping(){return this._send("pingreq",null,"pingresp")}puback({pkt_id:t}){return this._send("puback",{pkt_id:t})}subscribe(t,e,r){t=v(t,e,r);let n=this._send("subscribe",t,t);return this.on_sub?.(n,t)??n}unsubscribe(t,e,r){return t=v(t,e,r),this._send("unsubscribe",t,t)}post(t,e,r){return this.pub({topic:t,payload:e,qos:0},r)}send(t,e,r){return this.pub({topic:t,payload:e,qos:1},r)}store(t,e,r){return this.pub({topic:t,payload:e,qos:1,retain:1},r)}obj_post(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:0},r)}obj_send(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1},r)}obj_store(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1,retain:1},r)}async pub(t,e){if(void 0===t.payload){o(e)&&(e={fn_encode:e});let r=t.msg,n=e?.fn_encode;if(null==r||o(r))return r&&(e={...e,fn_encode:r}),r=>this.pub({...t,[t.arg||"payload"]:r},e);t.payload=n?await n(r):JSON.stringify(r)}return e&&(e.props&&(t.props=e.props),e.xform&&(t=e.xform(t)||t)),this._send("publish",t,t.qos?t:null)}_init_dispatch(t){this.constructor?._once_();let e={__proto__:t.on_mqtt_type};return e.mqtt_publish||=this._init_router?.(t,this,e),function(t,e){let r,n=[],s=0,{td:o=1e3,n:u=5}=t?.rotate||{},p=100,a=t=>n[0].set(r,t);return l([]),[l,function(t){return i(t)?r=t:(p=p+1&65535,r=t.pkt_id=p),new Promise(a)}];function c(t,e){for(let r of n){let n=r.get(t);if(n)return r.delete(t),n([e]),!0}return!1}function l(t,r){for(let n of t)k[n.id](e,c,n,r);let i=Date.now();if(i>s)for(s=o+i,n.unshift(new Map);n.length>u;)for(let t of n.pop().values())t([,"expired"])}}(t,e)}static _aliases(){return" publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store"}static _once_(t=this){t._once_=t=>0;var e,r,n=t.prototype;for(e of(n.MQTTError=y,t._aliases().split(/\s+/)))[e,r]=e.split(":"),n[e]=n[r]}}function v(t,e,r){if(e?.trim&&(r=e,e=null),t=t.trim?{topics:[t],...e}:t[Symbol.iterator]?{topics:[...t],...e}:e?{...t,...e}:t,r){let e=t=>t.trim?r+t:t.map(e);t.topics=t.topics.map(e)}return t}const x=t=>(t.p=new Promise(((e,r)=>{t.a=e,t.e=r})),t);function T(t,e,r){let n={set:o},s=async(...t)=>(await n.p)(...t);return o();function o(){return s!==t[e]&&(x(n).p.then(r,(t=>0)),t[e]=s),n}}function j(t,e,[r,n]){let s,o=T(e,"_send0",(t=>e.conn_emit("on_live",p.has_connected))),i=T(e,"_send",(t=>e.conn_emit("on_ready"))),u=function(t){let e;return r=>{if(e=clearInterval(e),r)return e=setInterval(t,1e3*r),e.unref?.(),!0}}((()=>e._send0("pingreq"))),p=Object.create({ping:(t=p.keep_alive)=>u(t),on_conn:(r,n)=>(p.has_connected=!0,p.keep_alive=t.keep_alive||n[0].props?.server_keep_alive||r.keep_alive,e.conn_emit("on_conn"),t.use_auth?n:p.on_auth(null,n)),on_auth:(r,n)=>(i.a(o.p),0!=t.keep_alive&&p.ping(),e.conn_emit("on_auth",!r),n),on_dis:(t,e)=>(p.reset(!1),e),reset(t){t&&o.e(t),s.e(t),p.is_set&&(delete p.is_set,p.ready=a(),e.conn_emit("on_disconnect",!1===t,t))},abort:t=>(i.e(t),p.reset(t)),async setup(t,s,i){if(p.is_set)throw new Error;p.is_set=!0,await t;let u=e.mqtt_ctx.mqtt_stream();{let t={mqtt:e};i((e=>r(u.decode(e),t)),p)}s=await s,o.a((async(t,e,r)=>{let o=void 0===r||n(r);return await s(u.encode_pkt(t,e)),o}))}});return p.ready=a(),p;async function a(){s=x({}),u(0),o.set(),i.set();try{return e._send0=await Promise.race([o.p,s.p]),e._send=await Promise.race([i.p,s.p]),!0}catch(t){return!1}}}const E={utf8(t){return new TextDecoder("utf-8").decode(t||this.payload)},json(t){return JSON.parse(this.utf8(t)||null)},text(t){return this.utf8(t)}},$={sess_stg:globalThis.sessionStorage};const S="0.6.7-web",A=u(class extends q{constructor(t){t={...$,...t},super(),this.with(t),this.sess_stg=t.sess_stg,this.conn=j(t,this,this._init_dispatch(t))}with(t){for(let[e,r]of Object.entries(t))o(r)&&(this[e]=r);return this}static mqtt_ctx(t,e,r=E){let n=class extends(this){};return n.prototype.mqtt_ctx=function(t,e,r=e.pkt_ctx){let n,s=e=>({__proto__:e,get hdr(){return 15&this.b0},get id(){return this.b0>>>4},get type(){return b[this.b0>>>4]},mqtt_level:t}),o=[],i={};for(n of e.encode_fns)n(i,e.mqtt_writer);for(n of e.decode_fns)n(o,e.mqtt_reader);return{pkt_api:r,pkt_ctx:s(r),encode_pkt:(e,r)=>i[e](t,r),decode_pkt(t,e){if(t.map)return d(this)(t)[0];let r=o[t>>>4]||o[0];return r?.({__proto__:this.pkt_ctx,b0:t},e)},mqtt_stream(t=this.pkt_api){let e={__proto__:this,pkt_ctx:s(t)};return e.decode=d(e),e}}}(t,e,r),n}async conn_emit(t,e,r){this.log_conn?.(t,e,r);try{let n=this[await t];if(n)await n.call(this,this,e,r);else if(r)throw r}catch(e){this.on_error(e,t)}}on_error(t,e){console.warn("[[u8-mqtt error: %s]]",e,t)}log_conn(t,e,r){console.info("[[u8-mqtt conn: %s]]",t,e,r)}init_client_id(t=["u8-mqtt--",""]){let e,r=this.sess_stg,n=r?.getItem(e=t.join(" "));return n||(n=t.join(Math.random().toString(36).slice(2)),r?.setItem(e,n)),n}on_live(t,e){if(e)return t.connect()}on_disconnect(t,e,r){if(!e)return t.on_reconnect?.()}_use_conn(t){return(this.reconnect=t)?.()}with_autoreconnect(t=2e3){return t.toFixed&&(t={delay:t}),this.with({on_reconnect(){this.delay(t.delay||2e3,t.jitter).then(this.reconnect).then(t.reconnect,t.error)}})}delay(t,e=.2*t){return new Promise((r=>setTimeout(r,0|t+e*Math.random())))}with_async_iter(t,e){return this.conn.setup(t,e,(async(e,r)=>{try{t=await t;for await(let r of t)e(r);r.reset()}catch(t){r.reset(t)}})),this}with_stream(t,e){return void 0===e&&(e=t),this.with_async_iter(t,(t=>e.write(t)))}with_websock(t){if(!t?.send)return t=new URL(t||"ws://127.0.0.1:9001"),this._use_conn((()=>this.with_websock(new WebSocket(t,["mqtt"]))));t.binaryType="arraybuffer";let e,r=t.readyState;if(1!==r){if(0!==r)throw new Error("WS readyState");e=new Promise((e=>t.onopen=e))}return this.conn.setup(e,(e=>t.send(e)),((e,r)=>{t.onmessage=t=>e(new Uint8Array(t.data)),t.onerror=t=>{r.reset(new Error("websocket error"))},t.onclose=t=>{if(!t.wasClean){var e=new Error("websocket close");e.code=t.code,e.reason=t.reason}r.reset(e)}})),this}}.mqtt_ctx(4,s)),L=t=>new A(t);export{A as MQTTClient,A as MQTTClient_v4,L as default,L as mqtt,L as mqtt_v4,S as version};
|
|
Binary file
|
|
Binary file
|
package/esm/web/full-v5.js
CHANGED
|
@@ -868,7 +868,7 @@ function parse(input, loose) {
|
|
|
868
868
|
|
|
869
869
|
return {
|
|
870
870
|
keys: keys,
|
|
871
|
-
pattern: new RegExp('^' + pattern + (
|
|
871
|
+
pattern: new RegExp('^' + pattern + ('\/?$'), 'i')
|
|
872
872
|
};
|
|
873
873
|
}
|
|
874
874
|
|
|
@@ -894,6 +894,7 @@ class AbstractTopicRouter ::
|
|
|
894
894
|
async invoke(pkt, ctx) ::
|
|
895
895
|
add(topic_route, ...args) ::
|
|
896
896
|
remove(topic_route, priority) ::
|
|
897
|
+
count(topic_route) ::
|
|
897
898
|
clear(priority) ::
|
|
898
899
|
find(topic) :: // optional
|
|
899
900
|
mqtt_topic(topic_route)
|
|
@@ -933,6 +934,8 @@ const with_topic_router = mqtt_topic_router =>
|
|
|
933
934
|
|
|
934
935
|
let fn = args.at(-1)?.call ? args.pop() : null;
|
|
935
936
|
router.remove(topic_route, true, fn);
|
|
937
|
+
if (0 !== router.count(topic_route) ) {
|
|
938
|
+
return null}
|
|
936
939
|
|
|
937
940
|
let topic = router.mqtt_topic(topic_route);
|
|
938
941
|
return this.unsubscribe(topic, ...args ) }// topic_prefix
|
|
@@ -1001,6 +1004,17 @@ function mqtt_topic_path_router() {
|
|
|
1001
1004
|
query ={topic: query, tgt: args.pop()}; }
|
|
1002
1005
|
return _route_remove(lst, query)}
|
|
1003
1006
|
|
|
1007
|
+
, count(topic_route) {
|
|
1008
|
+
if (! topic_route) {
|
|
1009
|
+
return pri_lsts.reduce((r,l) => r+l.length, 0)}
|
|
1010
|
+
|
|
1011
|
+
let count = 0;
|
|
1012
|
+
for (let lst of pri_lsts) {
|
|
1013
|
+
for (let route of lst) {
|
|
1014
|
+
if (topic_route === route.topic) {
|
|
1015
|
+
count++;} } }
|
|
1016
|
+
return count}
|
|
1017
|
+
|
|
1004
1018
|
, clear(priority) {
|
|
1005
1019
|
if (null == priority) {
|
|
1006
1020
|
pri_lsts = [[],[]]; }// null clears both lists
|
|
@@ -1044,21 +1058,21 @@ function * _routes_iter(all_route_lists, topic) {
|
|
|
1044
1058
|
|
|
1045
1059
|
|
|
1046
1060
|
function _route_remove(all_route_lists, query) {
|
|
1047
|
-
let
|
|
1061
|
+
let n_removed = 0;
|
|
1048
1062
|
for (let lst of all_route_lists) {
|
|
1049
1063
|
let idx_tip = 0;
|
|
1050
1064
|
for (let route of lst) {
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1065
|
+
if (route.topic === query.topic) {
|
|
1066
|
+
if (null == query.tgt || route.tgt === query.tgt) {
|
|
1067
|
+
// skip matching routes to remove from compacted list
|
|
1068
|
+
n_removed++;
|
|
1069
|
+
continue} }
|
|
1055
1070
|
|
|
1056
|
-
|
|
1071
|
+
lst[idx_tip++] = route;}
|
|
1057
1072
|
|
|
1058
1073
|
// truncate remaining list
|
|
1059
1074
|
lst.length = idx_tip;}
|
|
1060
|
-
|
|
1061
|
-
return ans}
|
|
1075
|
+
return n_removed}
|
|
1062
1076
|
|
|
1063
1077
|
function decode_varint(u8, i0=0, invalid) {
|
|
1064
1078
|
let shift=0, i=i0, b=u8[i++], n=(b & 0x7f);
|
|
@@ -1268,8 +1282,9 @@ class MQTTBase {
|
|
|
1268
1282
|
return this.conn.on_conn(pkt, response)}
|
|
1269
1283
|
|
|
1270
1284
|
async disconnect(pkt={}) {
|
|
1271
|
-
let response =
|
|
1272
|
-
|
|
1285
|
+
let response = this._send0('disconnect', pkt);
|
|
1286
|
+
await this.conn.on_dis(pkt, response);
|
|
1287
|
+
return await response}
|
|
1273
1288
|
|
|
1274
1289
|
async auth(pkt={}) {
|
|
1275
1290
|
let response = await this._send0('auth', pkt, 'auth');
|
|
@@ -1434,11 +1449,12 @@ function _mqtt_conn(opt, client, [on_mqtt, pkt_future]) {
|
|
|
1434
1449
|
_dfn_send0.e(err); }// send error to uses of _send0 (connect, auth)
|
|
1435
1450
|
_abort.e(err); // abort in-progress connections
|
|
1436
1451
|
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1452
|
+
if (conn.is_set) {
|
|
1453
|
+
delete conn.is_set;
|
|
1454
|
+
conn.ready = handshake();
|
|
1455
|
+
client.conn_emit('on_disconnect', false===err, err);} }
|
|
1440
1456
|
|
|
1441
|
-
, abort() {
|
|
1457
|
+
, abort(err) {
|
|
1442
1458
|
_dfn_ready.e(err); // abort all messages awaiting ready state
|
|
1443
1459
|
return conn.reset(err)}
|
|
1444
1460
|
|
|
@@ -1552,7 +1568,7 @@ class MQTTCore extends MQTTBase {
|
|
|
1552
1568
|
|
|
1553
1569
|
// on_ready(client) ::
|
|
1554
1570
|
// on_reconnect(client) ::
|
|
1555
|
-
on_disconnect(client, intentional) {
|
|
1571
|
+
on_disconnect(client, intentional, err) {
|
|
1556
1572
|
if (! intentional) {
|
|
1557
1573
|
return client.on_reconnect?.()} }
|
|
1558
1574
|
|
|
@@ -1562,12 +1578,12 @@ class MQTTCore extends MQTTBase {
|
|
|
1562
1578
|
if (opt.toFixed) {opt ={delay: opt};}
|
|
1563
1579
|
return this.with({
|
|
1564
1580
|
on_reconnect() {
|
|
1565
|
-
this.delay(opt.delay || 2000)
|
|
1581
|
+
this.delay(opt.delay || 2000, opt.jitter)
|
|
1566
1582
|
.then(this.reconnect)
|
|
1567
1583
|
.then(opt.reconnect, opt.error);} }) }
|
|
1568
1584
|
|
|
1569
|
-
delay(ms) {
|
|
1570
|
-
return new Promise(done => setTimeout(done, ms)) }
|
|
1585
|
+
delay(ms, ms_jitter=0.2*ms) {
|
|
1586
|
+
return new Promise(done => setTimeout(done, 0 | (ms + ms_jitter*Math.random()))) }
|
|
1571
1587
|
|
|
1572
1588
|
with_async_iter(async_iter, write_u8_pkt) {
|
|
1573
1589
|
this.conn.setup(async_iter,
|
|
@@ -1663,6 +1679,9 @@ class MQTTCore extends MQTTBase {
|
|
|
1663
1679
|
websock.onmessage = evt =>(
|
|
1664
1680
|
on_mqtt_chunk(new Uint8Array(evt.data)) );
|
|
1665
1681
|
|
|
1682
|
+
websock.onerror = evt => {
|
|
1683
|
+
conn.reset(new Error('websocket error'));};
|
|
1684
|
+
|
|
1666
1685
|
websock.onclose = evt => {
|
|
1667
1686
|
if (! evt.wasClean) {
|
|
1668
1687
|
var err = new Error('websocket close');
|
|
@@ -1673,7 +1692,7 @@ class MQTTCore extends MQTTBase {
|
|
|
1673
1692
|
|
|
1674
1693
|
return this} }
|
|
1675
1694
|
|
|
1676
|
-
const version = '0.6.
|
|
1695
|
+
const version = '0.6.7-web';
|
|
1677
1696
|
|
|
1678
1697
|
const MQTTClient_v4 = /* #__PURE__ */
|
|
1679
1698
|
with_topic_path_router(
|