UNPKG

@zeppos/zml

Version:

A Mini Library of ZeppOS MiniApp

9 lines (8 loc) 24.4 kB
function e(){return r()&&n()}function t(){return r()&&s()}function n(){return"undefined"!=typeof hmApp}function s(){return"undefined"!=typeof __$$R$$__}function r(){return n()||s()}let i=null;i="undefined"!=typeof __$$R$$__?__$$R$$__:()=>({});let o=null;e()?o=DeviceRuntimeCore.HmLogger:t()?o=i("@zos/utils").log:"undefined"!=typeof messaging&&"undefined"!=typeof Logger&&(o=Logger);class a{constructor(){this.listeners=new Map}on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){if(e)if(t){const n=this.listeners.get(e);if(!n)return;const s=n.findIndex((e=>e===t));s>=0&&n.splice(s,1)}else this.listeners.delete(e)}emit(e,...t){for(let n of this.listeners.get(e)??[])n&&n(...t)}clear(){this.listeners.clear()}once(e,t){const n=(...s)=>{this.off(e,n),t(...s)};this.on(e,n)}count(e){return(this.listeners.get(e)??[]).length}}const h=setTimeout,c=clearTimeout;var u="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function d(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var l,p={exports:{}},f=(l||(l=1,p.exports=function(){function e(e){return"function"==typeof e}var t=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},n=0,s=void 0,r=void 0,i=function(e,t){p[n]=e,p[n+1]=t,2===(n+=2)&&(r?r(f):v())},o="undefined"!=typeof window?window:void 0,a=o||{},h=a.MutationObserver||a.WebKitMutationObserver,c="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),d="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function l(){var e=setTimeout;return function(){return e(f,1)}}var p=new Array(1e3);function f(){for(var e=0;e<n;e+=2)(0,p[e])(p[e+1]),p[e]=void 0,p[e+1]=void 0;n=0}var y,g,m,I,v=void 0;function b(e,t){var n=this,s=new this.constructor(k);void 0===s[w]&&x(s);var r=n._state;if(r){var o=arguments[r-1];i((function(){return j(r,s,o,n._result)}))}else P(n,s,e,t);return s}function T(e){if(e&&"object"==typeof e&&e.constructor===this)return e;var t=new this(k);return q(t,e),t}v=c?function(){return process.nextTick(f)}:h?(g=0,m=new h(f),I=document.createTextNode(""),m.observe(I,{characterData:!0}),function(){I.data=g=++g%2}):d?((y=new MessageChannel).port1.onmessage=f,function(){return y.port2.postMessage(0)}):void 0===o?function(){try{var e=Function("return this")().require("vertx");return void 0!==(s=e.runOnLoop||e.runOnContext)?function(){s(f)}:l()}catch(e){return l()}}():l();var w=Math.random().toString(36).substring(2);function k(){}var _=void 0,S=1,L=2;function C(t,n,s){n.constructor===t.constructor&&s===b&&n.constructor.resolve===T?function(e,t){t._state===S?E(e,t._result):t._state===L?U(e,t._result):P(t,void 0,(function(t){return q(e,t)}),(function(t){return U(e,t)}))}(t,n):void 0===s?E(t,n):e(s)?function(e,t,n){i((function(e){var s=!1,r=function(n,r){try{n.call(r,(function(n){s||(s=!0,t!==n?q(e,n):E(e,n))}),(function(t){s||(s=!0,U(e,t))}))}catch(e){return e}}(n,t,0,0,e._label);!s&&r&&(s=!0,U(e,r))}),e)}(t,n,s):E(t,n)}function q(e,t){if(e===t)U(e,new TypeError("You cannot resolve a promise with itself"));else if(r=typeof(s=t),null===s||"object"!==r&&"function"!==r)E(e,t);else{var n=void 0;try{n=t.then}catch(t){return void U(e,t)}C(e,t,n)}var s,r}function B(e){e._onerror&&e._onerror(e._result),A(e)}function E(e,t){e._state===_&&(e._result=t,e._state=S,0!==e._subscribers.length&&i(A,e))}function U(e,t){e._state===_&&(e._state=L,e._result=t,i(B,e))}function P(e,t,n,s){var r=e._subscribers,o=r.length;e._onerror=null,r[o]=t,r[o+S]=n,r[o+L]=s,0===o&&e._state&&i(A,e)}function A(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var s=void 0,r=void 0,i=e._result,o=0;o<t.length;o+=3)s=t[o],r=t[o+n],s?j(n,s,r,i):r(i);e._subscribers.length=0}}function j(t,n,s,r){var i=e(s),o=void 0,a=void 0,h=!0;if(i){try{o=s(r)}catch(e){h=!1,a=e}if(n===o)return void U(n,new TypeError("A promises callback cannot return that same promise."))}else o=r;n._state!==_||(i&&h?q(n,o):!1===h?U(n,a):t===S?E(n,o):t===L&&U(n,o))}var M=0;function x(e){e[w]=M++,e._state=void 0,e._result=void 0,e._subscribers=[]}var D=function(){function e(e,n){this._instanceConstructor=e,this.promise=new e(k),this.promise[w]||x(this.promise),t(n)?(this.length=n.length,this._remaining=n.length,this._result=new Array(this.length),0===this.length?E(this.promise,this._result):(this.length=this.length||0,this._enumerate(n),0===this._remaining&&E(this.promise,this._result))):U(this.promise,new Error("Array Methods must be provided an Array"))}return e.prototype._enumerate=function(e){for(var t=0;this._state===_&&t<e.length;t++)this._eachEntry(e[t],t)},e.prototype._eachEntry=function(e,t){var n=this._instanceConstructor,s=n.resolve;if(s===T){var r=void 0,i=void 0,o=!1;try{r=e.then}catch(e){o=!0,i=e}if(r===b&&e._state!==_)this._settledAt(e._state,t,e._result);else if("function"!=typeof r)this._remaining--,this._result[t]=e;else if(n===O){var a=new n(k);o?U(a,i):C(a,e,r),this._willSettleAt(a,t)}else this._willSettleAt(new n((function(t){return t(e)})),t)}else this._willSettleAt(s(e),t)},e.prototype._settledAt=function(e,t,n){var s=this.promise;s._state===_&&(this._remaining--,e===L?U(s,n):this._result[t]=n),0===this._remaining&&E(s,this._result)},e.prototype._willSettleAt=function(e,t){var n=this;P(e,void 0,(function(e){return n._settledAt(S,t,e)}),(function(e){return n._settledAt(L,t,e)}))},e}(),O=function(){function t(e){this[w]=M++,this._result=this._state=void 0,this._subscribers=[],k!==e&&("function"!=typeof e&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof t?function(e,t){try{t((function(t){q(e,t)}),(function(t){U(e,t)}))}catch(t){U(e,t)}}(this,e):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}return t.prototype.catch=function(e){return this.then(null,e)},t.prototype.finally=function(t){var n=this,s=n.constructor;return e(t)?n.then((function(e){return s.resolve(t()).then((function(){return e}))}),(function(e){return s.resolve(t()).then((function(){throw e}))})):n.then(t,t)},t}();return O.prototype.then=b,O.all=function(e){return new D(this,e).promise},O.race=function(e){var n=this;return t(e)?new n((function(t,s){for(var r=e.length,i=0;i<r;i++)n.resolve(e[i]).then(t,s)})):new n((function(e,t){return t(new TypeError("You must pass an array to race."))}))},O.resolve=T,O.reject=function(e){var t=new this(k);return U(t,e),t},O._setScheduler=function(e){r=e},O._setAsap=function(e){i=e},O._asap=i,O.polyfill=function(){var e=void 0;if(void 0!==u)e=u;else if("undefined"!=typeof self)e=self;else try{e=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if("[object Promise]"===n&&!t.cast)return}e.Promise=O},O.Promise=O,O}()),p.exports),y=d(f); /*! * @overview es6-promise - a tiny implementation of Promises/A+. * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) * @license Licensed under MIT license * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE * @version v4.2.8+1e68dce6 */globalThis.Promise=y;const g=y;function m(){const e={canceled:!1};return e.promise=new g((function(t,n){e.resolve=t,e.reject=n})),e.cancel=()=>{e.canceled=!0,e.reject(new Error("Task canceled"))},e}let I=null;e()?I=hmBle:t()&&(I=i("@zos/ble"));let v=Buffer;function b(e){return w(function(e){return JSON.stringify(e)}(e))}function T(e){return t=k(e),JSON.parse(t);var t}function w(e){return v.from(e,"utf-8")}function k(e){return e.toString("utf-8")}function _(e){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}function S(e){return t=function(e){return v.from(e)}(e),t.toString("hex");var t}function L(e){return"object"==typeof e&&!v.isBuffer(e)&&!Array.isArray(e)&&null!==e}const C=r()?o.getLogger("device-message"):o.getLogger("side-message"),q=void 0,B="json",E="text",U="bin";function P(e){switch(e.toLowerCase()){case B:return 2;case E:return 1;case U:return 3;case"empty":return 0;default:return 3}}let A=1e4;function j(){return A++}let M=1e3;function x(){return M++}class D extends a{constructor(e,t,n,s){super(),this.id=e,this.type=t,this.ctx=s,this.chunks=[],this.count=-1,this.finishChunk=null,this.size=n,this.receivedSize=0}addChunk(e){this.receivedSize+=e.payloadLength,1===e.opCode&&(this.count=e.seqId+1,this.finishChunk=e),e.payloadLength===e.payload.byteLength?(this.chunks.push(e),this.checkIfReceiveAllChunks()):this.emit("error",Error(`receive chunk data length error, expect ${e.payloadLength} but ${e.payload.byteLength}`))}checkIfReceiveAllChunks(){if(this.count!==this.chunks.length)return;if(!this.finishChunk)return;if(this.size!==this.receivedSize)return;this.chunks.sort(((e,t)=>e.seqId-t.seqId));let e=[];for(let t=0;t<this.count;t++){const n=this.chunks[t];if(!n||n.seqId!==t)return e=null,this.releaseBuf(),void this.emit("error",Error("receive data error"));e.push(n.payload)}this.chunks=[],this.finishChunk.payload=v.concat(e),e=null,this.finishChunk.payloadLength=this.finishChunk.payload.byteLength,this.finishChunk.totalLength===this.finishChunk.payloadLength?this.emit("data",this.finishChunk):this.emit("error",Error(`receive full data length error, expect ${this.finishChunk.payloadLength} but ${this.finishChunk.payload.byteLength}`))}releaseBuf(){this.chunks=[],this.finishChunk=null,this.count=0,this.size=0,this.receivedSize=0}}class O{constructor(){this.sessions=new Map}key(e){return`${e.id}:${e.type}`}newSession(e,t,n,s){const r=new D(e,t,n,s);return this.sessions.set(this.key(r),r),r}destroy(e){e.releaseBuf(),this.sessions.delete(this.key(e))}has(e,t){return this.sessions.has(this.key({id:e,type:t}))}getById(e,t){return this.sessions.get(this.key({id:e,type:t}))}clear(){this.sessions.clear()}}class $ extends Error{constructor(e,t){super(t),this.code=e,this.reason=t}}class z extends a{constructor({appId:e=0,appDevicePort:t=20,appSidePort:n=0,ble:s=(r()?I:void 0)}={appId:0,appDevicePort:20,appSidePort:0,ble:r()?I:void 0}){super(),this.isDevice=r(),this.isSide=!this.isDevice,this.appId=e,this.appDevicePort=t,this.appSidePort=n,this.ble=s,this.sendMsg=this.getSafeSend(),this.chunkSize=3584,this.handlers=new Map,this.shakeTask=null,this.waitingShakePromise=null,this.shakeStatus=1,this.shakeTimer=0,this.sessionMgr=new O,this.on("response",(e=>{this.onResponse(e)})),s?.addListener((e=>{this.emit("bleStatusChanged",e)})),this.on("bleStatusChanged",(e=>{if(!e){C.error("ble disconnect"),this.shakeTask&&(this.shakeTask.reject(new $(2,"ble disconnect")),this.shakeStatus=4);for(const[e,t]of Object.entries(this.handlers))t.task.reject(new $(2,"ble disconnect"));this.handlers.clear()}}))}fork(e=5e3){if(2===this.shakeStatus)return this.waitingShakePromise;this.shakeTask=m(),this.waitingShakePromise=this.shakeTask.promise,this.shakeStatus=1,this.clearShakeTimer(),this.shakeTimer=h((()=>{this.shakeStatus=4,this.shakeTask.reject(new $(1,"shake timeout"))}),e);try{this.errorIfBleDisconnect()}catch(e){return C.error("error ble disconnect %j",e),this.shakeTask.reject(new $(2,"ble disconnect")),this.shakeStatus=4,this.waitingShakePromise}return this.shakeStatus=2,this.sendShake(),this.waitingShakePromise}clearShakeTimer(){this.shakeTimer&&c(this.shakeTimer),this.shakeTimer=0}getMessageSize(){return 3600}getMessagePayloadSize(){return 3584}getMessageHeaderSize(){return 16}buf2Json(e){return T(e)}json2Buf(e){return b(e)}now(e=Date.now()){return function(e=Date.now()){return e%1e7}(e)}connect(e){this.on("message",(e=>{this.onMessage(e)})),this.ble&&this.ble.createConnect(((e,t,n)=>{this.onFragmentData(t)})),e&&e(this)}disConnect(e){this.sendClose(),this.off("message"),this.handlers.clear(),this.ble&&this.ble.disConnect(),e&&e(this)}listen(e){this.appSidePort=globalThis.getApp().port2,messaging&&messaging.peerSocket.addListener("message",(e=>{this.onMessage(e)})),this.waitingShakePromise=g.resolve(),e&&e(this)}buildBin(e){if(e.payload.byteLength>this.chunkSize)throw new Error(`${e.payload.byteLength} greater than max size of ${this.chunkSize}`);const t=this.getMessageHeaderSize()+e.payload.byteLength;let n=v.alloc(t),s=0;return n.writeUInt8(e.flag,s),s+=1,n.writeUInt8(e.version,s),s+=1,n.writeUInt16LE(e.type,s),s+=2,n.writeUInt16LE(e.port1,s),s+=2,n.writeUInt16LE(e.port2,s),s+=2,n.writeUInt32LE(e.appId,s),s+=4,n.writeUInt32LE(e.extra,s),s+=4,n.fill(e.payload,s,e.payload.byteLength+s),n}buildShake(){return this.buildBin({flag:1,version:1,type:1,port1:this.appDevicePort,port2:this.appSidePort,appId:this.appId,extra:0,payload:v.from([this.appId])})}sendShake(){C.info("shake send");const e=this.buildShake();this.sendMsg(e)}buildClose(){return this.buildBin({flag:1,version:1,type:2,port1:this.appDevicePort,port2:this.appSidePort,appId:this.appId,extra:0,payload:v.from([this.appId])})}sendClose(){const e=this.buildClose();this.sendMsg(e)}readBin(e){const t=v.from(e);let n=0;const s=t.readUInt8(n);n+=1;const r=t.readUInt8(n);n+=1;const i=t.readUInt16LE(n);n+=2;const o=t.readUInt16LE(n);n+=2;const a=t.readUInt16LE(n);n+=2;const h=t.readUInt32LE(n);n+=4;const c=t.readUInt32LE(n);return n+=4,{flag:s,version:r,type:i,port1:o,port2:a,appId:h,extra:c,payload:t.subarray(n)}}buildData(e,t={}){return this.buildBin({flag:1,version:1,type:4,port1:this.appDevicePort,port2:this.appSidePort,appId:this.appId,extra:0,...t,payload:e})}sendBin(e,t=q){if(t&&C.warn("[RAW] [S] send size=%d bin=%s",e.byteLength,S(e.buffer)),!this.ble.send(e.buffer,e.byteLength))throw Error("send message error")}sendBinBySide(e,t=q){t&&C.warn("[RAW] [S] send size=%d bin=%s",e.byteLength,S(e.buffer)),messaging.peerSocket.send(e.buffer)}getSafeSend(){return this.isDevice?this.sendBin.bind(this):this.sendBinBySide.bind(this)}sendHmProtocol({requestId:e,dataBin:t,type:n,contentType:s,dataType:r},{messageType:i=4}={}){const o=3518,a=t.byteLength;let h=0;const c=v.alloc(o),u=e||j(),d=x();let l=0;const p=Math.ceil(a/o);function f(){return l++}for(let e=1;e<=p;e++){if(this.errorIfBleDisconnect(),e===p){const e=a-h,o=v.alloc(0+e);t.copy(o,0,h,h+e),h+=e,this.sendDataWithSession({traceId:u,spanId:d,seqId:f(),payload:o,type:n,opCode:1,totalLength:a,contentType:s,dataType:r},{messageType:i});break}t.copy(c,0,h,h+o),h+=o,this.sendDataWithSession({traceId:u,spanId:d,seqId:f(),payload:c,type:n,opCode:0,totalLength:a,contentType:s,dataType:r},{messageType:i})}}sendJson({requestId:e=0,json:t,type:n=1,contentType:s,dataType:r}){const i=b(t),o=e||j();this.sendHmProtocol({requestId:o,dataBin:i,type:n,contentType:s,dataType:r})}sendBuf({requestId:e=0,buf:t,type:n=1,contentType:s,dataType:r}){const i=e||j();return this.sendHmProtocol({requestId:i,dataBin:t,type:n,contentType:s,dataType:r})}sendText({requestId:e=0,text:t,type:n=1,contentType:s,dataType:r}){const i=w(t),o=e||j();return this.sendHmProtocol({requestId:o,dataBin:i,type:n,contentType:s,dataType:r})}sendDataWithSession({traceId:e,spanId:t,seqId:n,payload:s,type:r,opCode:i,totalLength:o,contentType:a,dataType:h},{messageType:c}){const u=this.buildPayload({traceId:e,spanId:t,seqId:n,totalLength:o,type:r,opCode:i,payload:s,contentType:a,dataType:h});let d=this.isDevice?this.buildData(u,{type:c}):u;this.sendMsg(d)}buildPayload(e){const t=66+e.payload.byteLength;let n=v.alloc(t),s=0;return n.writeUInt32LE(e.traceId,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(e.spanId,s),s+=4,n.writeUInt32LE(e.seqId,s),s+=4,n.writeUInt32LE(e.totalLength,s),s+=4,n.writeUInt32LE(e.payload.byteLength,s),s+=4,n.writeUInt8(e.type,s),s+=1,n.writeUInt8(e.opCode,s),s+=1,n.writeUInt32LE(this.now(),s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.writeUInt8(e.contentType,s),s+=1,n.writeUInt8(e.dataType,s),s+=1,n.writeUInt16LE(0,s),s+=2,n.writeUInt32LE(0,s),s+=4,n.writeUInt32LE(0,s),s+=4,n.fill(e.payload,s,e.payload.byteLength+s),n}readPayload(e){const t=v.from(e);let n=0;const s=t.readUInt32LE(n);n+=4;const r=t.readUInt32LE(n);n+=4;const i=t.readUInt32LE(n);n+=4;const o=t.readUInt32LE(n);n+=4;const a=t.readUInt32LE(n);n+=4;const h=t.readUInt32LE(n);n+=4;const c=t.readUInt8(n);n+=1;const u=t.readUInt8(n);n+=1;const d=t.readUInt32LE(n);n+=4;const l=t.readUInt32LE(n);n+=4;const p=t.readUInt32LE(n);n+=4;const f=t.readUInt32LE(n);n+=4;const y=t.readUInt32LE(n);n+=4;const g=t.readUInt32LE(n);n+=4;const m=t.readUInt32LE(n);n+=4;const I=t.readUInt8(n);n+=1;const b=t.readUInt8(n);n+=1;const T=t.readUInt16LE(n);n+=2;const w=t.readUInt32LE(n);n+=4;const k=t.readUInt32LE(n);return n+=4,{traceId:s,parentId:r,spanId:i,seqId:o,totalLength:a,payloadLength:h,payloadType:c,opCode:u,contentType:I,dataType:b,timestamp1:d,timestamp2:l,timestamp3:p,timestamp4:f,timestamp5:y,timestamp6:g,timestamp7:m,extra1:T,extra2:w,extra3:k,payload:t.subarray(n)}}onFragmentData(e){const t=this.readBin(e);this.emit("raw",e),1===t.flag&&1===t.type?(this.appSidePort=t.port2,C.info("shake success appSidePort=>",t.port2),this.emit("shake:response",t),this.clearShakeTimer(),this.shakeTask.resolve(),this.shakeStatus=3):1===t.flag&&4===t.type||1===t.flag&&5===t.type?(this.emit("message",t.payload),this.emit("read",t)):1===t.flag&&6===t.type?this.emit("log",t.payload):0===t.flag||1===t.flag&&2===t.type&&(this.appSidePort=0)}errorIfBleDisconnect(){if(r()&&!this.ble.connectStatus())throw new $(2,"ble disconnect")}errorIfSideServiceDisconnect(){if(r()&&!this.appSidePort)throw new $(3,"side service is not running")}getRequestCount(){return this.handlers.size}onResponse(e){const t=this.handlers.get(e.traceId).handler;t&&t(e)}onMessage(e){const t=this.readPayload(e);let n=this.sessionMgr.getById(t.traceId,t.payloadType);n||(n=this.sessionMgr.newSession(t.traceId,t.payloadType,t.totalLength,this),n.on("data",(e=>{1===e.opCode&&(1===e.payloadType?this.emit("request",{request:e,response:({data:t,dataType:n})=>{n=void 0!==n?P(n):e.dataType,this.response({requestId:e.traceId,contentType:e.contentType,dataType:n,data:t})}}):2===e.payloadType?this.emit("response",e):3===e.payloadType&&this.emit("call",e),this.emit("data",e),this.sessionMgr.destroy(n))})),n.on("error",(e=>{this.sessionMgr.destroy(n),this.emit("error",e)}))),n.addChunk(t)}request(e,t){try{this.errorIfBleDisconnect()}catch(e){return C.error("error ble disconnect %j",e),g.reject(e)}return this.waitingShakePromise.then((()=>{this.errorIfBleDisconnect(),this.errorIfSideServiceDisconnect();let n=U;"string"==typeof e?n=E:L(e)?n=B:(e instanceof ArrayBuffer||ArrayBuffer.isView(e)||v.isBuffer(e))&&(n=U);const s={timeout:6e4,contentType:n,dataType:n},r=j(),i=m();t=Object.assign(s,t);let o=h((()=>{o=null,i.reject(new $(4,`request id=${r} timeout in ${t.timeout}ms`))}),t.timeout);return this.handlers.set(r,{handler:({traceId:e,payload:t,dataType:n})=>{let s;switch(this.errorIfBleDisconnect(),this.errorIfSideServiceDisconnect(),n){case 1:s=k(t);break;case 3:default:s=t;break;case 2:s=T(t)}C.info("response id=>%d",r),i.resolve(s)},task:i}),C.info("request id=%d",r),v.isBuffer(e)?this.sendBuf({requestId:r,buf:e,type:1,contentType:3,dataType:P(t.dataType)}):e instanceof ArrayBuffer||ArrayBuffer.isView(e)?this.sendBuf({requestId:r,buf:v.from(e),type:1,contentType:3,dataType:P(t.dataType)}):2===P(t.contentType)?this.sendJson({requestId:r,json:e,type:1,contentType:2,dataType:P(t.dataType)}):1===P(t.contentType)?this.sendText({requestId:r,text:e,type:1,contentType:1,dataType:P(t.dataType)}):this.sendBuf({requestId:r,buf:v.from(e),type:1,contentType:3,dataType:P(t.dataType)}),i.promise.catch((e=>{throw C.error("request id=%d %d %j",r,e.code,e.reason),e})).finally((()=>{o&&(c(o),o=null),this.handlers.get(r)?this.handlers.delete(r):C.warn("release request id=>%d error",r)}))}))}response({requestId:e,contentType:t,dataType:n,data:s}){3===n?this.sendBuf({requestId:e,buf:s,type:2,contentType:t,dataType:n}):1===n?this.sendText({requestId:e,text:s,type:2,contentType:t,dataType:n}):2===n?this.sendJson({requestId:e,json:s,type:2,contentType:t,dataType:n}):this.sendBuf({requestId:e,buf:s,type:2,contentType:t,dataType:3})}call(e){let t=2;return"string"==typeof e?t=1:L(e)?t=2:(e instanceof ArrayBuffer||ArrayBuffer.isView(e)||v.isBuffer(e))&&(t=3),this.waitingShakePromise.then((()=>v.isBuffer(e)?this.sendBuf({buf:e,type:3,contentType:3,dataType:0}):e instanceof ArrayBuffer||ArrayBuffer.isView(e)?this.sendBuf({buf:v.from(e),type:3,contentType:3,dataType:0}):2===t?this.sendJson({json:e,type:3,contentType:2,dataType:0}):1===t?this.sendText({text:e,type:3,contentType:1,dataType:0}):this.sendBuf({buf:v.from(e),type:3,contentType:3,dataType:0})))}}class R{constructor(){this.set=new Set}add(e){this.set.add(e)}runAll(...e){this.set.forEach((t=>{t&&t(...e)}))}remove(e){e?this.set.delete(e):this.set.clear()}}o.getLogger("message-builder");const H="hmrpcv1",J=new R,W=new R,F=new R;let V=null;e()?V=hmApp.getPackageInfo:t()&&(V=i("@zos/app").getPackageInfo),e()?hmUI:t()&&i("@zos/ui"),e()?hmSetting:t()&&i("@zos/settings"),e()?px:i("@zos/utils").px,e()?hmSetting.getDeviceInfo:t()&&i("@zos/device").getDeviceInfo,e()?"undefined"!=typeof __$$app$$__&&__$$app$$__:t()&&i("@zos/i18n").getText,e()?hmApp.gotoPage:t()&&i("@zos/router").push;let N=null;function Y(e,t={}){return this.request({method:"http.request",params:e},t)}function K(){let e="";for(let t=0;t<12;t++)e+=0===t?Math.floor(9*Math.random())+1:Math.floor(10*Math.random());return e}function G(e){const t={shakeTimeout:5e3,requestTimeout:6e4,transport:n=new z({appId:V().appId,appDevicePort:20,appSidePort:0}),onCall(e){return e?(J.add(e),this):this},offOnCall(e){return J.remove(e),this},call(e){return r()&&n.fork(this.shakeTimeout),e=L(e)?e.contentType?e:{jsonrpc:H,...e}:e,n.call(e)},onRequest(e){return e?(W.add(e),this):this},initOnCall(){n.on("call",(({contentType:e,payload:t})=>{switch(e){case 2:t=T(t);break;case 1:t=k(t);break;default:t=_(t)}J.runAll(t)}))},initOnRequest(){n.on("request",(e=>{let t=e.request.payload;switch(e.request.contentType){case 2:t=T(t);break;case 1:t=k(t);break;default:t=_(t)}W.runAll(t,((n,s,r={})=>2===e.request.contentType&&t?.jsonrpc===H?n?e.response({data:{jsonrpc:H,error:n}}):e.response({data:{jsonrpc:H,result:s}}):e.response({data:s,...r})))}))},cancelAllRequest(){return n.off("response"),this},offOnRequest(e){return W.remove(e),this},request(e,t={}){return r()&&n.fork(this.shakeTimeout),e=L(e)?t.contentType?e:{jsonrpc:H,...e}:e,n.request(e,{timeout:this.requestTimeout,...t}).then((e=>{if(!L(e)||e.jsonrpc!==H)return e;const{error:t,result:n}=e;if(t)throw t;return n}))},connect(){n.connect((()=>{this.initOnCall(),this.initOnRequest(),this.initOnBleChanged()}))},initOnBleChanged(){return n.on("bleStatusChanged",(e=>{F.runAll(e)})),this},onBleChanged(e){return e?(F.add(e),this):this},offOnBleChanged(e){return F.remove(e),this},disConnect(){return this.cancelAllRequest(),this.offOnRequest(),this.offOnCall(),this.offOnBleChanged(),n.disConnect((()=>{})),this},start(){return n.listen((()=>{this.initOnCall(),this.initOnRequest()})),this},stop(){return this.cancelAllRequest(),this.offOnRequest(),this.offOnCall(),n.disConnect((()=>{})),this}};var n;return{onCreate(){this.messaging=this.globalData.messaging=t,this._onCall=this.onCall?.bind(this),this._onRequest=this.onRequest?.bind(this),this._onBleChanged=this.onBleChanged?.bind(this),this.messaging.onCall(this._onCall).onRequest(this._onRequest).onBleChanged(this._onBleChanged).connect()},onDestroy(){this.messaging.offOnCall().offOnRequest().offOnBleChanged().disConnect()},request(e,t={}){const n=m(),s=K(),r="response:result:"+s,i="response:error:"+s;return N.onMessage(r,(function(e,...t){n.resolve(...t)})),N.onMessage(i,(function(e,...t){n.reject(...t)})),this.messaging.request(e,t).then((e=>{N.postMessage(r,e)})).catch((e=>{N.postMessage(i,e)})).finally((()=>{N.offMessage(r),N.offMessage(i)})),n.promise},call(e){return this.messaging.call(e)},httpRequest:Y}}e()?N=hmApp:t()&&(N=i("@zos/app"));const Q="2.0";export{Q as API_LEVEL,G as appPlugin,K as generateRandom12};