@jolibox/implement 1.1.4-beta.16 → 1.1.4-beta.17
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/.rush/temp/package-deps_build.json +14 -14
- package/dist/common/ads/channel-policy.d.ts +24 -2
- package/dist/common/ads/index.d.ts +1 -0
- package/dist/common/context/index.d.ts +1 -0
- package/dist/common/report/base-tracker.d.ts +9 -0
- package/dist/common/report/errors/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/index.native.js +3 -3
- package/dist/native/network/index.d.ts +0 -3
- package/implement.build.log +2 -2
- package/package.json +3 -3
- package/src/common/ads/channel-policy.ts +49 -4
- package/src/common/ads/index.ts +6 -4
- package/src/common/api-factory/index.ts +3 -3
- package/src/common/context/index.ts +3 -0
- package/src/common/report/base-tracker.ts +40 -0
- package/src/common/report/errors/index.ts +3 -3
- package/src/common/report/errors/report/listeners.ts +0 -2
- package/src/common/report/track.ts +2 -2
- package/src/h5/http/index.ts +1 -2
- package/src/h5/report/index.ts +1 -1
- package/src/native/api/ads.ts +6 -2
- package/src/native/network/index.ts +11 -4
- package/src/native/types/native-method-map.d.ts +11 -0
package/dist/index.native.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var gn=Object.create;var Jt=Object.defineProperty;var vn=Object.getOwnPropertyDescriptor;var yn=Object.getOwnPropertyNames;var bn=Object.getPrototypeOf,Tn=Object.prototype.hasOwnProperty;var h=(e,t)=>()=>(e&&(t=e(e=0)),t);var kn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var En=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of yn(t))!Tn.call(e,s)&&s!==r&&Jt(e,s,{get:()=>t[s],enumerable:!(n=vn(t,s))||n.enumerable});return e};var Sn=(e,t,r)=>(r=e!=null?gn(bn(e)):{},En(t||!e||!e.__esModule?Jt(r,"default",{value:e,enumerable:!0}):r,e));function In(e){return!!e?.__nativeBuffers__}function de(e){if(typeof e=="string")try{e=JSON.parse(e)}catch{return{}}if(typeof e!="object"||e===null)return{};if(!In(e))return e;let t=e.__nativeBuffers__;if(delete e.__nativeBuffers__,t)for(let r=0;r<t.length;r++){let n=t[r];if(n){let s;n.value?s=n.value:n.base64&&(s=wn(n.base64)),typeof s<"u"&&s instanceof ArrayBuffer&&(e[n.key]=s)}}return e}function $t(e={},t=!1){let r=e,n=[];for(let[s,o]of Object.entries(r))if(o!==void 0&&o instanceof ArrayBuffer&&o.byteLength!==void 0){let i=t?{value:o,key:s}:{base64:_n(o),key:s};n.push(i),delete r[s]}return n.length>0&&(r.__nativeBuffers__=n),r}var wn,_n,st=h(()=>{"use strict";wn=e=>{let t=atob(e),r=t.length,n=new Uint8Array(r);for(let s=0;s<r;s++)n[s]=t.charCodeAt(s);return n.buffer};_n=e=>{let t="",r=new Uint8Array(e),n=r.byteLength;for(let s=0;s<n;s++)t+=String.fromCharCode(r[s]);return btoa(t)}});function xn(e){return new Promise(t=>{setTimeout(()=>{t()},e)})}function te(e){return typeof e=="string"}function P(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof RegExp)&&!(e instanceof Date)}function qt(e){return typeof e=="object"&&Array.isArray(e)}function Pn(e){return typeof e>"u"}function Cn(e){return Pn(e)||e===null}function Gt(e){return typeof e=="function"}function zt(e){return P(e)&&Gt(e.then)}function Wt(e){let t=e,r=null,n=function(...s){return r||(r=new t(...s)),r};return n.prototype=t.prototype,n}function Yt(e,t,r){if(typeof r!="function")throw new Error("[Jolibox SDK]Customizer must be a function");function n(s,o){for(let i in o)if(Object.prototype.hasOwnProperty.call(o,i)){let a=s[i],d=o[i],l=r(a,d,i,s,o);l!==void 0?s[i]=l:Ht(d)&&Ht(a)?s[i]=n({...a},d):Array.isArray(d)&&Array.isArray(a)?s[i]=[...a,...d]:s[i]=d}return s}return n(e,t)}function Ht(e){return e&&typeof e=="object"&&e.constructor===Object}function Qt(e,t){if(Array.isArray(e))return e.concat(t)}function pe(e,t,r={}){let n=null,s,o,i,{leading:a=!1,trailing:d=!0}=r,l=()=>(i=e.apply(o,s),s=void 0,o=void 0,i),u=function(...p){s=p,o=this;let m=a&&!n;if(n&&clearTimeout(n),n=setTimeout(()=>{n=null,d&&!m&&l()},t),m)return l()};return u.cancel=()=>{n&&clearTimeout(n),n=null,s=o=void 0},u.flush=()=>{if(n)return clearTimeout(n),n=null,l()},u}function Fn(e,t){return(...r)=>t(e,...r)}function ke(e){return t=>Fn(t,function(r,...n){if(typeof r=="function")try{return r.apply(this,n)}catch(s){e(new dt(`${s}`))}})}function ue(e){return(...t)=>{(globalThis.VConsole?.[e]??globalThis.console[e])(...t)}}function zn(e){return new Promise(t=>ir(e)(t))}function ir(e){return(t,r=null)=>{let n=!1;return e(s=>{if(!n)return n=!0,t.call(r,s)},null)}}function Wn(e,t){return(r=>{let n,s={onWillAddFirstListener(){n=r(o.fire,o)}},o=new me(s);return o.event})((r,n=null)=>e(s=>t(s)&&r.call(n,s),null))}function Qn(e,t){let r=Math.min(e.length,t.length);for(let n=0;n<r;n++)Xn(e[n],t[n])}function Xn(e,t){if(te(t)){if(typeof e!==t)throw new Error(`argument does not match constraint: typeof ${t}`)}else if(Gt(t)){try{if(e instanceof t)return}catch{}if(!Cn(e)&&e.constructor===t||t.length===1&&t.call(void 0,e)===!0)return;throw new Error("[Jolibox SDK]argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true")}}function I(){if(globalThis[it])return globalThis[it];let e=new be,t=new ct,r={registerCommand(n,s,o){e.registerCommand({id:n,handler:s,metadata:o})},executeCommand(n,...s){return t.executeCommand(n,...s)},excuteCommandSync(n,...s){return t.executeCommandThowErr(n,...s)}};return globalThis[it]=r,r}var Vt,Rn,An,Kt,Y,Nn,lt,re,On,dt,Xt,Zt,er,tr,rr,fe,Te,ut,C,nr,Dn,mt,Un,pt,Mn,Ln,ge,Bn,jn,Jn,sr,ft,$n,Hn,Vn,or,T,Kn,qn,ve,me,Q,at,Gn,ot,Yn,V,be,ct,it,v=h(()=>{"use strict";Vt=Object.defineProperty,Rn=Object.getOwnPropertyDescriptor,An=(e,t)=>{for(var r in t)Vt(e,r,{get:t[r],enumerable:!0})},Kt=(e,t,r,n)=>{for(var s=n>1?void 0:n?Rn(t,r):t,o=e.length-1,i;o>=0;o--)(i=e[o])&&(s=(n?i(t,r,s):i(s))||s);return n&&s&&Vt(t,r,s),s};Y=class{constructor(){this.state="pending",this.promise=new Promise((e,t)=>{this.resolve=r=>{this.state==="pending"&&(this.state="fulfilled",e(r))},this.reject=r=>{this.state==="pending"&&(this.state="rejected",t(r))}})}};Nn=(e=>(e[e.DEVELOPER_FILE_NOT_FOUND=0]="DEVELOPER_FILE_NOT_FOUND",e[e.INTERNAL_IOS_CAN_NOT_FOUND_PKG=1]="INTERNAL_IOS_CAN_NOT_FOUND_PKG",e[e.USER_IOS_LOAD_TIMEOUT=2]="USER_IOS_LOAD_TIMEOUT",e[e.INTERNAL_IOS_PKG_LOAD_ERROR=3]="INTERNAL_IOS_PKG_LOAD_ERROR",e[e.INTERNAL_IOS_PKG_PARSE_FAIL=4]="INTERNAL_IOS_PKG_PARSE_FAIL",e[e.USER_IOS_GET_EMPTY_DATA=5]="USER_IOS_GET_EMPTY_DATA",e[e.USER_ANDROID_GET_PKG_FAIL=6]="USER_ANDROID_GET_PKG_FAIL",e[e.DEVELOPER_ANDROID_PACKAGE_FILE_UNEXPECTED_REQUIRE=7]="DEVELOPER_ANDROID_PACKAGE_FILE_UNEXPECTED_REQUIRE",e))(Nn||{}),lt=class extends Error{constructor(e){if(typeof e=="string"){super(e),this.priority="P1";return}super(e.message),this.priority="P1",this.stack=e.stack,this.raw=e}},re=class extends lt{constructor(){super(...arguments),this.kind="INTERNAL_ERROR"}},On=class extends lt{constructor(){super(...arguments),this.kind="USER_ERROR"}},dt=class extends On{constructor(e,t,r){super(e),this.message=e,this.errNo=t,this.name="USER_CUSTOM_ERROR",this.errMsg=e,r&&(this.extra=Object.assign({},this.extra,r))}},Xt=class extends re{constructor(){super(...arguments),this.name="INTERNAL_SCHEMA_PARSE_ERROR",this.priority="P0"}},Zt=class extends re{constructor(){super(...arguments),this.name="INTERNAL_INVOKE_NATIVE_ERROR"}},er=class extends re{constructor(e,t,r,n){super(e),this.errNo=t,this.name="INTERNAL_APPLY_NATIVE_ERROR",this.errorType=r,this.errorCode=n}},tr=class extends re{constructor(){super(...arguments),this.name="INTERNAL_JSCORE_ERROR",this.priority="P0"}},rr=class extends re{constructor(e,t){super(e),this.message=e,this.name="INTERNAL_CONTEXT_ERROR",this.property=t}},fe=class extends lt{constructor(e,t,r,n,s){super(e),this.message=e,this.code=t,this.kind="API_ERROR",this.name="API_ERROR",r&&(this.errorType=r),n!==void 0&&(this.stack=n),s&&(this.priority=s)}toJSON(){return{message:this.message,stack:this.stack,name:this.name,code:this.code,errorType:this.errorType}}},Te=class extends re{constructor(){super(...arguments),this.name="INTERNAL_METRIC_REPORT_ERROR"}},ut=class extends re{constructor(){super(...arguments),this.name="INTERNAL_REPORTER_ERROR"}};C={log:ue("log"),warn:ue("warn"),info:ue("info"),error:ue("error"),debug:ue("debug")};Object.assign(globalThis,{logger:C});nr=Symbol.for("Jolibox.canIUseMap"),Dn={};globalThis[nr]=Dn;mt={get config(){return globalThis[nr]}},Un=(e=>(e[e.System=1e3]="System",e[e.ErrorTrace=1001]="ErrorTrace",e[e.UserDefined=1002]="UserDefined",e))(Un||{}),pt=(e=>(e.MiniGame="mini-game",e.MiniDrama="mini-drama",e.App="app",e.WebSDK="web-sdk",e.AppSDK="app-sdk",e))(pt||{}),Mn=(e=>(e[e.App=0]="App",e[e.H5=1]="H5",e[e.Weapp=2]="Weapp",e[e.Alipay=3]="Alipay",e[e.Gcash=4]="Gcash",e[e.Dana=5]="Dana",e[e.Umma=6]="Umma",e[e.WebSDK=1e3]="WebSDK",e[e.AppSDK=1001]="AppSDK",e[e.Other=9999]="Other",e))(Mn||{}),Ln=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)}),ge={isiOS:navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPod")||navigator.userAgent.includes("iPad")||navigator.userAgent.includes("iPhone OS"),iosVersion:()=>{let e=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3]||"0",10)]},isAndroid:navigator.userAgent.includes("Android"),isMac:navigator.userAgent.includes("Mac"),isFacebook:navigator.userAgent.includes("FB_IAB"),isPC:!navigator.userAgent.includes("iPhone")&&!navigator.userAgent.includes("Android")},Bn=()=>ge.isiOS?"iOS":ge.isAndroid?"Android":ge.isMac?"Mac":ge.isFacebook?"Facebook":"PC",jn="device_id",Jn="advertising_id",sr=e=>(localStorage.getItem(e)||localStorage.setItem(e,Ln()),localStorage.getItem(e)),ft=()=>sr(jn),$n=()=>sr(Jn),Hn=e=>e.charAt(0).toUpperCase()+e.slice(1),Vn=()=>{let e=new URLSearchParams(window.location.search);return Hn(e.get("utm_source")??"")||"JoliboxSDK"},or=e=>{let t="JoliboxWebSDK",r=Bn(),n=navigator.language,s=ft(),o=$n();return`${t} (${Vn()}${r}; UnknownModel; UnknownSystemVersion; ${n}) uuid/${s} adid/${o} version/${e||""}`},T=class ye{static{this.Undefined=new ye(void 0)}constructor(t){this.element=t,this.next=ye.Undefined,this.prev=ye.Undefined}},Kn=class{constructor(){this._first=T.Undefined,this._last=T.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===T.Undefined}clear(){let e=this._first;for(;e!==T.Undefined;){let t=e.next;e.prev=T.Undefined,e.next=T.Undefined,e=t}this._first=T.Undefined,this._last=T.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){let r=new T(e);if(this._first===T.Undefined)this._first=r,this._last=r;else if(t){let s=this._last;this._last=r,r.prev=s,s.next=r}else{let s=this._first;this._first=r,r.next=s,s.prev=r}this._size+=1;let n=!1;return()=>{n||(n=!0,this._remove(r))}}shift(){if(this._first!==T.Undefined){let e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==T.Undefined){let e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==T.Undefined&&e.next!==T.Undefined){let t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===T.Undefined&&e.next===T.Undefined?(this._first=T.Undefined,this._last=T.Undefined):e.next===T.Undefined?(this._last=this._last.prev,this._last.next=T.Undefined):e.prev===T.Undefined&&(this._first=this._first.next,this._first.prev=T.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==T.Undefined;)yield e.element,e=e.next}},qn=0,ve=class{constructor(e){this.value=e,this.id=qn++}},me=class{constructor(e){this.options=e,this._size=0}dispose(e){this._disposed||(this._disposed=!0,this._listeners&&(e?(this._listeners instanceof ve&&(this._listeners=[this._listeners]),this._listeners=this._listeners.filter(t=>t?.value===e)):(this._listeners=void 0,this._size=0)),this.options?.onDidRemoveLastListener?.())}get event(){return this._event??=(e,t)=>{if(this._disposed)return()=>{console.info("[Jolibox SDK] Emitter is _disposed")};t&&(e=e.bind(t));let r=new ve(e);this._listeners?this._listeners instanceof ve?this._listeners=[this._listeners,r]:this._listeners.push(r):(this.options?.onWillAddFirstListener?.(this),this._listeners=r,this.options?.onDidFirstListener?.(this)),this.options?.onDidAddListener?.(this),this._size++},this._event}_deliver(e,t){if(!e)return;let r=this.options?.onListenerError||Error.constructor;if(!r){e.value(t);return}try{e.value(t)}catch(n){r(n)}}fire(e){this._listeners&&(this._listeners instanceof ve?this._deliver(this._listeners,e):this._listeners.forEach(t=>this._deliver(t,e)))}hasListeners(){return this._size>0}},Q=class{constructor(){this.listeners=new Map,this.listerHandlerMap=new WeakMap,this.cachedEventQueue=new Map}on(e,t){let r=this.listeners.get(e)??new me,n=o=>t(...o.args);this.listerHandlerMap.set(t,n),r.event(n),this.listeners.set(e,r);let s=this.cachedEventQueue.get(e);if(s)for(;s.size>0;)r.fire({event:e,...s.shift()})}off(e,t){let r=this.listeners.get(e);if(r){let n=this.listerHandlerMap.get(t);r.dispose(n)}}emit(e,...t){let r=this.listeners.get(e);if(r)r.fire({event:e,args:t});else{let n=this.cachedEventQueue.get(e);n||(n=new Kn,this.cachedEventQueue.set(e,n)),n.push({args:t})}}},at={};An(at,{None:()=>Gn,filter:()=>Wn,once:()=>ir,toPromise:()=>zn});Gn=()=>{console.log("[Jolibox SDK] None Event")};ot=Symbol.for("Jolibox.hostEmitter"),Yn=()=>{let e=new Q;return globalThis[ot]||(globalThis[ot]={on:e.on.bind(e),off:e.off.bind(e),emit:e.emit.bind(e)}),globalThis[ot]},V=Yn();be=class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new me,this.onDidRegisterCommand=this._onDidRegisterCommand.event,console.log("[Jolibox SDK] command registry")}registerCommand(e){if(!e)throw new Error("invalid command");if(e.metadata&&Array.isArray(e.metadata.args)){let r=[];for(let s of e.metadata.args)r.push(s.constraint);let n=e.handler;e.handler=function(...s){return Qn(s,r),n(...s)}}let{id:t}=e;this._commands.get(t)&&console.info(`[Jolibox SDK] duplicated command is registered ${t}`),this._commands.set(t,e),this._onDidRegisterCommand.fire(t)}getCommand(e){return this._commands.get(e)}getCommands(){let e=new Map;for(let t of this._commands.keys()){let r=this.getCommand(t);r&&e.set(t,r)}return e}};be=Kt([Wt],be);ct=class{constructor(){this._onWillExecuteCommand=new me,this.onWillExecuteCommand=this._onWillExecuteCommand.event,this._onDidExecuteCommand=new me,this.onDidExecuteCommand=this._onDidExecuteCommand.event,this.registry=new be,this._starActivation=null}_activateStar(){return this._starActivation||(this._starActivation=xn(3e4)),this._starActivation}async executeCommand(e,...t){return this.registry.getCommand(e)?this._tryExecuteCommand(e,t):(await Promise.all([Promise.race([this._activateStar(),at.toPromise(at.filter(this.registry.onDidRegisterCommand,r=>r===e))])]),this._tryExecuteCommand(e,t))}executeCommandThowErr(e,...t){if(!this.registry.getCommand(e))throw new Error(`command '${e}' not found`);let r=this.registry.getCommand(e);this._onWillExecuteCommand.fire({commandId:e,args:t});let n=this.invokeFunction(r.handler,...t);return this._onDidExecuteCommand.fire({commandId:e,args:t}),n}_tryExecuteCommand(e,t){let r=this.registry.getCommand(e);if(!r)return Promise.reject(new Error(`command '${e}' not found`));try{this._onWillExecuteCommand.fire({commandId:e,args:t});let n=this.invokeFunction(r.handler,...t);return this._onDidExecuteCommand.fire({commandId:e,args:t}),Promise.resolve(n)}catch(n){return Promise.reject(n)}}invokeFunction(e,...t){let r=!1;try{return e(...t)}finally{r=!0}}};ct=Kt([Wt],ct);it=Symbol.for("Jolibox.commands")});function R(e,t={}){ht.emit("ERROR_REPORT",{error:e,options:t})}var ht,ne,M=h(()=>{"use strict";v();v();ht=new Q,ne=new Q;R.debounce=pe(R,50,{leading:!0})});function Ee(e,t){return`[${e}]:${t}`}var se,gt,X=h(()=>{"use strict";M();v();M();se=(e,t)=>new fe(t?.errMsg??e.msg??"",e.code,e.type),gt=e=>new dt(e)});var ar,cr,lr,dr=h(()=>{"use strict";ar=[],cr=[],lr=["env","createRequestTask","login"]});function mr(e,t){ur||(vt=new oe({eventName:"jolibox_invoke",tagNameOrder:["status","method","errNo","errMsg","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),yt=new oe({eventName:"jolibox_invoke_js2native",tagNameOrder:["status","method","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),bt=new oe({eventName:"jolibox_invoke_native2js",tagNameOrder:["status","method","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),t("onJoliboxEnterBackground",()=>{vt.flush(),yt.flush(),bt.flush()}),ur=!0);function r(s){let{method:o,args:i,startTime:a,isForeground:d,errMsg:l=`${o}:fail no errMsg`,errNo:u=0,__timing:p={receiveJSInvoke:0,invokeCallback:0}}=s,{receiveJSInvoke:m,invokeCallback:f}=p,b=l.match(/\S:(\S+)\s?/)?.[1]??"fail";vt.report({status:b,method:n(o,i),errNo:`${u}`,errMsg:l,isForeground:d,duration:Date.now()-a}),a&&m&&f&&(yt.report({status:b,method:o,isForeground:d,duration:Number((m-a).toFixed(3))}),bt.report({status:b,method:o,isForeground:d,duration:Number((Date.now()-f).toFixed(3))}))}function n(s,o){return(s==="callHostMethod"||s==="callHostMethodSync")&&o?.method?`${s}-${o.method}`:s}return r}var Zn,oe,ur,vt,yt,bt,Tt=h(()=>{"use strict";v();Zn=e=>e==="pv"?e:"default",oe=class{constructor(t){this.interval=30;this.lastReportTime=0;this.cache={};let{reporter:r,interval:n=30,eventName:s,tagNameOrder:o,metricName:i,type:a}=t;this.reporter=r,this.interval=n,this.eventName=s,this.tagNameOrder=o,this.metricName=i,this.type=Zn(a)}report(t){this.type==="pv"?this.addPVPoint(t):this.addPoint(t),this.tryReport(!1)}flush(){this.tryReport(!0)}tryReport(t){if(Object.keys(this.cache).length){if(t){this.reporter(this.processPoints(this.cache)),this.clearPoints();return}this.lastReportTime=this.lastReportTime||Date.now(),Date.now()-this.lastReportTime>=this.interval*1e3&&(this.reporter(this.processPoints(this.cache)),this.clearPoints(),this.lastReportTime=Date.now())}}addPoint(t){let r=(n,s,o,i)=>{let a=s.shift();if(a){let d=i[a];n[d]||(n[d]={}),r(n[d],s,o,i)}else n[o]||(n[o]=[]),n[o].push(i[o])};r(this.cache,[...this.tagNameOrder],this.metricName,t)}addPVPoint(t){let r=(s,o,i,a)=>{let d=o.shift();if(!d&&P(a))throw new Te(`report value failed to match tagNameOrder, ${JSON.stringify(n)}`);if(d){let l=[];if(P(a))l.push(...Object.keys(a));else if(te(a)){if(o.length>0)throw new Te(`report value failed to match tagNameOrder, ${JSON.stringify(n)}`);l.push(a)}else throw new Te(`expected metric value to be a string, but got a(n) ${typeof a}, ${JSON.stringify(n)}`);l.forEach(u=>{s[u]||(s[u]={});let p=P(a)?a[u]:a;r(s[u],[...o],i,p)})}else s[i]?s[i]++:s[i]=1},n={point:t,metricName:this.metricName,tagNameOrder:this.tagNameOrder};r(this.cache,[...this.tagNameOrder],this.metricName,t)}processPoints(t){return{eventName:this.eventName,tagNameOrder:this.tagNameOrder,metricName:this.metricName,metricAggregateType:this.type==="pv"?"itoa":"arr",data:t}}clearPoints(){this.cache={}}},ur=!1});function fr(e,t){let r=0,n=!0,s=new Map,o=mr(e,t);t("onJoliboxEnterBackground",()=>{n=!1}),t("onJoliboxEnterForeground",()=>{n=!0,kt.forEach(async({method:l,args:u,resolve:p})=>{let m=await a(l,u);p(m)}),kt.length=0});let i=(l,u)=>{C.info("----resolveId",l,u);let p=s.get(Number(l));if(!p)return;let m=de(u);p(m),s.delete(Number(l))},a=(l,u)=>{let p=Date.now(),m=`${n}`;r+=1;let f=new Y;if(s.set(r,f.resolve),!n&&cr.includes(l))return new Promise(x=>{kt.push({method:l,args:u,resolve:x})});let _={...{method:l,startTime:p,args:u,isForeground:m},invokeType:"js-bridge"},N=!es&&ar.includes(l),z=$t(u,N),W=N?z:JSON.stringify(z),k;if(l.endsWith("Sync")||lr.includes(l)?k=e.call?.(l,z,r):typeof W=="string"?(console.log("-----params",l,r),k=e.invoke(l,W,r)):k=e.call?.(l,W,r),k){try{typeof k=="string"&&(k=JSON.parse(k)),k=de(k)}catch(x){C.error(x)}return s.delete(r),k.errorCode&&(k.errorCode=Ee(l,k.errorCode)),o({..._,...k}),k}return l.endsWith("Sync")&&s.delete(r),f.promise.then(x=>(x.errorCode&&(x.errorCode=Ee(l,x.errorCode)),o({..._,...x}),x))};return{invokeNative:a,applyNative:(l,u)=>{let p=a(l,u);return zt(p)?p.then(m=>pr(l,m)):pr(l,p)},invokeHandler:i}}function pr(e,t){if(!P(t)){C.warn(`[Jolibox SDK]${e} no response value`);return}let{errMsg:r,errNo:n,errorType:s,errorCode:o,...i}=t;if(r&&r!==`${e}:ok`)throw new er(r,n,s,o);return i}var kt,es,hr=h(()=>{"use strict";st();v();X();dr();Tt();kt=[],es=!1});function gr(e){let t=new Q,r=new oe({eventName:"jolibox_publish",tagNameOrder:["type","event"],metricName:"duration",reporter(n){e.invoke("track",JSON.stringify({event:"reportMetrics",data:n}),-1)}});return t.on("onJoliboxEnterBackground",()=>{r.flush()}),{onNative:t.on.bind(t),offNative:t.off.bind(t),subscribeHandler(n,s,o){let i=de(s),a;if(i.__extra){a=i.params;let{type:d,startTime:l}=i.__extra;r.report({type:d,event:n,duration:Date.now()-l})}else a=i;t.emit(n,a,o)}}}var vr=h(()=>{"use strict";v();st();Tt()});function Et(e){let{subscribeHandler:t,onNative:r,offNative:n}=gr(e),{invokeNative:s,invokeHandler:o,applyNative:i}=fr(e,r);return{invokeHandler:o,subscribeHandler:t,applyNative:i,invokeNative:s,onNative:r,offNative:n}}var yr=h(()=>{"use strict";hr();vr()});var br=h(()=>{"use strict"});var Tr=h(()=>{"use strict";yr();br()});var Z,L,kr,Er=h(()=>{"use strict";v();M();L={trigger(){},exit(){return!1},onReady(e){L.trigger=e},doExit(e){L.exit=e}},kr=()=>{let e=window.prompt("invoke",JSON.stringify({event:"envSync",paramsString:JSON.stringify({})}));if(!e)R(new Zt("native env failed"));else{let{data:t}=JSON.parse(e);return t??void 0}};if(window.webkit){let e=window.webkit.messageHandlers,t=(s="")=>{L.trigger(),e.onDocumentReady.postMessage({path:s})};Z={onDocumentReady:t,doExit:s=>{let o=L.exit();e.doExit.postMessage({uuid:s,shouldInterrupt:o})},invoke(s,o,i){e.invoke.postMessage({event:s,paramsString:o,callbackId:i})},call(s,o,i){let a=window.prompt("invoke",JSON.stringify({event:s,paramsString:JSON.stringify(o),callbackId:i}));if(a)return JSON.parse(a)}};let n={onDocumentReady:t,env:kr};globalThis.joliboxJSCore={...n}}if(window.JoliAndroidSDKBridge){let e=window.JoliAndroidSDKBridge,t=(s="")=>{L.trigger(),e.onDocumentReady(JSON.stringify({path:s}))};Z={onDocumentReady:t,invoke(s,o,i){e.invoke(JSON.stringify({event:s,paramsString:o,callbackId:i}))},doExit:s=>{let o=L.exit();e.doExit(JSON.stringify({uuid:s,shouldInterrupt:o}))},call(s,o,i){let a=window.prompt("invoke",JSON.stringify({event:s,paramsString:JSON.stringify(o),callbackId:i}));if(a)return JSON.parse(a)}};let n={onDocumentReady:t,env:kr};globalThis.joliboxJSCore={...n}}});function St(e,t){return{params:e,__extra:{startTime:Date.now(),type:t}}}var It=h(()=>{"use strict"});function wt(){globalThis.onmessage=function(e){e.data==="msg:setup"&&([ie]=e.ports,ie.onmessage=function(t){let r=JSON.parse(t.data);r[0]==="publish"?globalThis.ttJSBridge.subscribeHandler(r[1],r[2]):r[0]==="invoke"&&globalThis.ttJSBridge.invokeHandler(r[1],r[2])},ie.publish=function(t,r){let n=St(r,"messagePort");ie.postMessage(JSON.stringify(["publish",t,JSON.stringify(n)]))},ie.postMessage("msg:setup:ok"))}}var ie,Sr=h(()=>{"use strict";It()});var Se=h(()=>{"use strict";Er();Sr();It()});var wr,ts,_r,Ir,O,A,J,yi,rs,B=h(()=>{"use strict";Tr();Se();X();v();Se();wr=Z;if(!wr)throw new tr("No joliboxJScore is found, native bridge not found.");wt();ts={...wr},_r=Et(ts),{invokeHandler:Ir}=_r,{applyNative:O,invokeNative:A,onNative:J,offNative:yi,subscribeHandler:rs}=_r;globalThis.joliboxJSBridge={callHandler:Ir,invokeHandler:Ir,subscribeHandler:rs}});var _t,Rr,Ar=h(()=>{"use strict";v();M();_t=e=>{let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.length%4===0?"":"=".repeat(4-t.length%4),n=atob(t+r);try{return JSON.parse(n)}catch{return{}}},Rr=e=>{try{let n=new URL(e).searchParams.get("joliSource")?.split(".");if(n?.length){let[s,o,i]=n;return{headerJson:_t(s),payloadJson:_t(o),signature:_t(i)}}else throw"joli_source is missing"}catch(t){return R(new Xt(`${e} not a valid schema: ${t}`)),{headerJson:{},payloadJson:{},signature:{}}}}});var ns,Ie,xr,Rt=h(()=>{"use strict";v();ns="1.1.4-beta.16",Ie=()=>ns,xr=()=>{let e=Ie();return`${or(e)}`}});var ss,os,D,is,y,$=h(()=>{"use strict";v();Ar();Rt();v();ss={deviceInfo:{brand:"UnknownBrand",model:"UnknownModel",did:ft(),pixelRatio:window.devicePixelRatio||1,platform:"h5",system:"UnknownSystemVersion",lang:"zh"},sdkInfo:{nativeSDKVersion:"",jssdkVersion:Ie()},schema:window.location.href,platform:"h5"},os=globalThis.joliboxJSCore?.env,D=Object.assign({},os?.()??ss),is=()=>{let{payloadJson:e,headerJson:t}=D.schema.length?Rr(D.schema):{},r=`${D.deviceInfo.did}-${new Date().getTime()}`,s=new URL(D.schema.length?D.schema:window.location.href).searchParams,o=s.get("mpId")??s.get("appId")??s.get("gameId")??"",i=e?.sessionId??s.get("sessionId")??r,a=!!(e?.testAdsMode??s.get("testAdsMode")==="true"),d=e?.joliboxEnv??s.get("joliboxEnv")??"production",l=d==="staging",u=t?.channel;return{get testMode(){return l},get testAdsMode(){return a},get joliboxEnv(){return d},get mpId(){return o??e?.id??""},get mpVersion(){return t?.ver??Ie()},get platform(){return D.platform},get deviceInfo(){return D.deviceInfo},get sdkInfo(){return D.sdkInfo},get hostInfo(){return D.hostInfo},get hostUserInfo(){return D.hostUserInfo},get sessionId(){return D.clientSessionId??i??r},get channel(){return u},onEnvConfigChanged:p=>{Yt(D,p,Qt)}}},y=is()});var At,Cr,as,cs,Pr,ls,Nr=h(()=>{"use strict";v();M();$();v();At=!1,Cr=(e,t)=>e==null?!1:t in e,as=e=>Cr(e,"kind"),cs=e=>{let t=e.toLowerCase().split("_");return t[0]+t.slice(1).map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join("")},Pr=(e,t={},r)=>{let n=e.priority??"P1",o={...{user_id:y.hostUserInfo?.uid??"",device_id:y.deviceInfo.did??"",timestamp:Date.now(),tag:cs(e.name)},env:t.environment,isFromUser:r};r?ne.emit("GLOBAL_USER_ERROR",e,o):ne.emit("GLOBAL_ERROR",e,o)},ls=e=>Cr(e,"kind")&&e.kind==="USER_ERROR";ht.on("ERROR_REPORT",({error:e,options:t})=>{if(At)return;At=!0;let r=as(e)&&e.raw?e.raw:e;try{let n=ls(e);Pr(e,t,n)}catch(n){let s=n instanceof Error?n.message:String(n),o=new ut(`${s}, origin error: ${r.message}`);C.error(o),Pr(new ut(o.message),{environment:t.environment},!1)}finally{At=!1}})});var Or=h(()=>{"use strict";Nr();X();v();B();ne.on("GLOBAL_ERROR",(e,t)=>{let r={message:e.message,stack:e.stack??"",errorType:e.name,source:0};A("trackAsync",{event:"reportJsError",data:r})});ne.on("GLOBAL_USER_ERROR",(e,t)=>{C.log("UserError",e,t)})});var xt=h(()=>{"use strict"});function Fr(e,t){let r=(n,s,o)=>{let i={tag:n,...t,extra:{...s}};n=="globalJsError"?R(new rr(JSON.stringify(i),"P0")):e("systemLog",i,o)};return r.debounce=pe(r,500,{leading:!0}),r}function Dr(e){let t=(r,n,s)=>{let o=(s&&JSON.stringify(s))??0,i={speed_value_type:r,total_duration:n};o&&Object.assign(i,{extra:o}),e("joliboxSpeedAnalysis",i)};return t.debounce=pe(t,500,{leading:!0}),t}var Ur=h(()=>{"use strict";v();v();M()});function Mr(e,t){let r=Fr(e,t),n=Dr(r);return{track:r,trackPerformance:n}}var Lr=h(()=>{"use strict";Ur()});var Br=h(()=>{"use strict";$();v();v()});var jr=h(()=>{"use strict";Lr();xt();Br()});var we,Jr=h(()=>{"use strict";we=class{constructor(t,r){this.eventEmitter=t;this.lastReportTime=0;this.visible=!0;this.timer=this.createRAFTimer(t=>{this.reporter({event:"PLAY_GAME",params:{duration:t}}),this.tracker("PlayGame",{duration:t})});this.interval=r??5*1e3,t.on("visible",n=>{this.visible=n})}start(t){this.reporter({event:"OPEN_GAME",params:{timestamp:Date.now(),duration:t??0}}),this.tracker("OpenGame",{duration:t??0}),this.timer.start()}close(t){this.reporter({event:"CLOSE_GAME",params:{timestamp:Date.now(),duration:t}}),this.tracker("CloseGame",{duration:t}),this.timer.stop()}createRAFTimer(t){let r=Date.now(),n,s,o=!1,i=0,a=()=>{if(!o)return;let f=Date.now(),b=f-r;b>=this.interval&&(this.visible&&(i+=b,t(i)),r=f),n=requestAnimationFrame(a)},d=()=>{u(),r=Date.now(),s=window.setInterval(()=>{if(!o)return;let f=Date.now();f-r>=this.interval&&(r=f)},this.interval)},l=()=>{p(),r=Date.now(),n=requestAnimationFrame(a)},u=()=>{n&&(cancelAnimationFrame(n),n=0)},p=()=>{s&&(clearInterval(s),s=0)};this.eventEmitter.on("visible",f=>{o&&(console.log("visible",f),f?l():d())});let m=this.visible;return{start(){o||(o=!0,m?l():d())},stop(){o=!1,u(),p()}}}}});var Pt=h(()=>{"use strict"});function Hr(e,t,r){let{response:n,startTime:s,endTime:o,requestFrom:i}=r,{errMsg:a="",profile:d={}}=n,u={duration:o-s,request_type:e,url:t.split("?")[0],result:r.state,error_msg:r.state==="fail"?a:"",socket_reused:d.socketReused?1:0,request_from:i};(i==="public"&&$r<us||i==="inner")&&(u.joli_request_number=$r++,setTimeout(()=>{U("joliboxNetRequestResult",u)},500))}var $r,us,Vr=h(()=>{"use strict";Pt();ee();$r=0,us=10});function _e(e,t,r){let n=new Map,s=r?.baseUrl??"https://api.jolibox.com",o=r?.type??"public",i=r?.defaultHeaders??{};return J("onRequestTaskStateChange",d=>{if(typeof d.requestTaskId!="string")return;let l=n.get(d.requestTaskId);if(l)if(d.state==="success"){let{requestTaskId:u,state:p,...m}=d;l.resolve(m),n.delete(u)}else if(d.state==="fail"){let{requestTaskId:u,state:p,...m}=d;l.reject(m),n.delete(u)}else C.warn("onRequestTaskStateChange unknown event",d)}),V.on("onLoginComplete",({isLogin:d,token:l})=>{d&&l&&(i["X-JOLI-TOKEN"]=l)}),async(d,l={})=>{let u=Date.now(),p=ms(d,{...l,baseUrl:s}),{method:m="GET",responseType:f="text",dataType:b="json",timeout:_,enableCache:N=!1,appendHostCookie:z=!0}=l,W=Object.assign({"content-type":"application/json"},i,l.header),k={url:p,method:m,header:W,enableCache:N,responseType:f,appendHostCookie:z};if(m=="POST"||m=="PUT"){let j=fs(l.data,W["content-type"]);k.data=j}_&&Object.assign(k,{timeout:_});let{data:{requestTaskId:x}}=A(e,k);if(typeof x!="string")throw se({code:-1,msg:"requestTaskId is not a string"});let le=(j,H)=>{Hr("request",p,{state:j,startTime:u,endTime:Date.now(),params:k,response:H,requestId:x,requestFrom:o=="public"?"public":"inner"})},{resolve:nt,reject:un,promise:mn}=new Y;n.set(x,{resolve:nt,reject:un});try{let j=await mn;le("success",j);let{data:H}=j;return b==="json"&&typeof H=="string"&&(H=ps(H)),{url:p,timeout:_,method:m,response:{...j,data:H}}}catch(j){let H=j;if(P(H)){let{errMsg:he,prefetchDetail:pn,isPrefetch:fn,errNo:hn}=H;te(he)&&(le("fail",{errMsg:he,isPrefetch:fn,prefetchDetail:pn}),R(se({code:-1,msg:he},{errNo:hn,errMsg:he})))}throw j}}}function ps(e){try{return JSON.parse(e.trim())}catch{return e}}function fs(e,t="application/json"){let r=t.toLowerCase();return e===void 0?"":typeof e=="string"||e instanceof ArrayBuffer?e:r.includes("application/x-www-form-urlencoded")||r.includes("application/json")||typeof e=="object"?JSON.stringify(e):String(e)}var ms,Ct=h(()=>{"use strict";v();Vr();Pt();B();M();X();ms=(e,t)=>{if(/^https?:\/\//.test(e))return e;let r=t?.query,s=new URLSearchParams(r).toString();return t?.baseUrl?`${t.baseUrl}${e}${s?`?${s}`:""}`:`${e}${s?`?${s}`:""}`}});var K,Re=h(()=>{"use strict";Rt();Ct();$();K=_e("createRequestTaskSync","operateRequestTaskSync",{type:"inner",baseUrl:y.testMode?"https://stg-api.jolibox.com":"https://api.jolibox.com",defaultHeaders:{"x-user-agent":xr(),"X-JOLI-TOKEN":y.hostUserInfo?.token??""}})});var Ae,Kr=h(()=>{"use strict";$();Jr();Re();B();Ae=class extends we{constructor(t,r,n){super(r,n),this.gameId=y.mpId,this.sessionId=y.sessionId,this.track=t}async reporter(t){let{event:r,params:n}=t,s=[];s.push(K("/api/base/app-event",{method:"POST",data:{eventType:r,gameInfo:{gameId:this.gameId,sessionId:this.sessionId,...n}}})),await Promise.all(s)}async reportToNative(t){let{event:r,params:n}=t;await O("userTrackAsync",{event:r,params:{...n},gameId:this.gameId})}tracker(t,r=null){this.track(t,r)}}});var hs,U,gs,qr,xe,F,ee=h(()=>{"use strict";Or();v();xt();jr();$();Kr();B();hs=(e,t,r)=>{let n=t,o={...P(n.extra)?n.extra:te(n.extra)?JSON.parse(n.extra):{},mp_id:n.mp_id??"",mp_version:n.mp_version??""};A("trackAsync",{event:e,data:o,webviewId:r})},{track:U,trackPerformance:gs}=Mr(hs,{type:pt.AppSDK,platform:"native",jssdk_version:y.sdkInfo?.jssdkVersion??"1.0.0",mp_id:y.mpId,mp_version:y.mpVersion}),qr=I();qr.registerCommand("ReportSDK.traceSystemTimeline",({event:e,duration:t})=>{gs(e,t)});qr.registerCommand("ReportSDK.traceSystem",({event:e,info:t})=>{U(e,t)});xe=new Q,F=new Ae(U,xe)});function zr(e){let t=mt.config[e];return t||(t={},mt.config[e]=t),(r,n)=>{if(t[r]){C.warn(`[can i use] ${r} already registered`);return}t[r]={...n}}}var Wr=h(()=>{"use strict";v()});function Nt(e){Yr=e}function Ce(e){return e===null||typeof e!="object"?e:Array.isArray(e)?e.map(t=>Ce(t)):Object.keys(e).reduce((t,r)=>(t[r]=Ce(e[r]),t),{})}function q(e){return typeof e=="number"}function Ot(e){let t=Ft(e);switch(t){case"string":return`"${e}"`;case"number":case"boolean":case"null":case"undefined":return String(e);default:return`a(n) ${t}`}}function Ft(e){return typeof e=="function"?"function":Object.prototype.toString.call(e).slice(8).slice(0,-1).toLowerCase()}var Yr,E,Ne,Oe,Fe,De,ae,Ue,Me,Le,Be,je,Je,$e,He,Ve,Ke,qe,Ge,Dt=h(()=>{"use strict";Yr=!1;E=class{constructor(){this.errors=[];this.hasFallback=!1;this.hasDefault=!1;this._optional=!1}fail(t){if(Yr)if(typeof t=="string")this.errors.push(t);else{let r=`${this.path} should be ${t.expect}`;this._optional&&t.expect!=="undefined"?r+=" or undefined, ":r+=", ",r+=`but got ${Ot(t.actual)}`,this.errors.push(r)}return!1}fallback(t){return this.hasFallback=!0,this._fallback=t,this}get fallbackValue(){return Ce(this._fallback)}default(t){return this.hasDefault=!0,this._default=t,this}get defaultValue(){return typeof this._default=="function"?this._default:Ce(this._default)}optional(){return this._optional=!0,this}};Ne=class extends E{validate(t){return this._optional&&t===void 0?!0:q(t)?q(this._min)&&t<this._min?this.fail(`the value of ${this.path} should be greater than or equal to ${this._min}`):q(this._max)&&t>this._max?this.fail(`the value of ${this.path} should be less than or equal to ${this._max}`):q(this._greater)&&t<=this._greater?this.fail(`the value of ${this.path} should be greater than ${this._greater}`):this._isInt&&t!==Math.floor(t)?this.fail(`the value of ${this.path} should be integer but got ${t}`):!0:this.fail({expect:"number",actual:t})}min(t){return this._min=t,this}max(t){return this._max=t,this}isInt(t){return this._isInt=t,this}greater(t){return this._greater=t,this}},Oe=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="boolean"?this.fail({expect:"boolean",actual:t}):!0}},Fe=class extends E{validate(t){if(this._optional&&t===void 0)return!0;if(typeof t!="string")return this.fail({expect:"string",actual:t});if(q(this._maxLength)&&t.length>this._maxLength)return this.fail(`the length of ${this.path} should be less than or equal to ${this._maxLength}`);if(q(this._minLength)&&t.length<this._minLength)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minLength}`);if(typeof this._pattern=="string"){if(!new RegExp(this._pattern).test(t))return this.fail(`${this.path} should match pattern "${this._pattern}"`)}else if(this._pattern&&!this._pattern.test(t))return this.fail(`${this.path} should match pattern "${this._pattern.toString()}"`);return!0}minLength(t){return this._minLength=t,this}maxLength(t){return this._maxLength=t,this}pattern(t){return this._pattern=t,this}},De=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="symbol"?this.fail({expect:"symbol",actual:t}):!0}},ae=class extends E{validate(t){return!0}},Ue=class extends E{validate(t){return t!==void 0?this.fail({expect:"undefined",actual:t}):!0}},Me=class extends E{validate(t){return this._optional&&t===void 0?!0:t!==null?this.fail({expect:"null",actual:t}):!0}},Le=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="function"?this.fail({expect:"function",actual:t}):!0}},Be=class extends E{constructor(...t){super(),this._items=t}validate(t){if(this._optional&&t===void 0)return!0;if(!this._items.includes(t)){let r=this._items.map(n=>JSON.stringify(n)).join(", ");return this.fail(`expect ${this.path} to be one of ${r}, but got ${Ot(t)}`)}return!0}},je=class extends E{constructor(r){super();this._item=r}validate(r){if(this._optional&&r===void 0)return!0;if(!Array.isArray(r))return this.fail({expect:"array",actual:r});if(q(this._minItems)&&r.length<this._minItems)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minItems}`);if(q(this._maxItems)&&r.length>this._maxItems)return this.fail(`the length of ${this.path} should be less than or equal to ${this._maxItems}`);if(q(this._length)&&r.length!==this._length)return this.fail(`the length of ${this.path} should be equal to ${this._length}`);let n=this._item;if(!n)return!0;let s=!0;if(r.forEach((o,i)=>{if(n.path=`${this.path}[${i}]`,n.errors=this.errors,o===void 0&&n.hasDefault){r[i]=n.defaultValue;return}n.validate(o)||(n.hasFallback?r[i]=n.fallbackValue:s=!1)}),this._uniqueItems){let o=new Map;for(let i in r)o.has(r[i])?s=this.fail(`${this.path} should NOT have duplicate items (${this.path}[${o.get(r[i])}] and ${this.path}[${i}] are identical)`):o.set(r[i],i)}return s}minItems(r){return this._minItems=r,this}maxItems(r){return this._maxItems=r,this}uniqueItems(){return this._uniqueItems=!0,this}length(r){return this._length=r,this}},Je=class extends E{constructor(r){super();this._value=r}validate(r){if(this._optional&&r===void 0)return!0;if(Ft(r)!=="object")return this.fail({expect:"object",actual:r});let s=r,o=this._value;o.errors=this.errors;let i=!0;for(let a in s){let d=s[a];if(/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/.test(a)?o.path=`${this.path}.${a}`:o.path=`${this.path}["${a}"]`,!(d===void 0&&o._optional)){if(d===void 0&&o.hasDefault){s[a]=o.defaultValue;continue}o.validate(d)||(o.hasFallback?s[a]=o.fallbackValue:i=!1)}}return i}},$e=class extends E{constructor(r={}){super();this._object=r}validate(r){if(this._optional&&r===void 0)return!0;if(Ft(r)!=="object")return this.fail({expect:"object",actual:r});let n=r,s=!0;for(let o in this._object){let i=n[o],a=this._object[o];if(a.errors=this.errors,/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/.test(o)?a.path=`${this.path}.${o}`:a.path=`${this.path}["${o}"]`,!(a._optional&&i===void 0)){if(i===void 0&&a.hasDefault){n[o]=a.defaultValue;continue}a.validate(i)||(a.hasFallback?n[o]=a.fallbackValue:s=!1)}}return s}},He=class extends E{constructor(r){super();this.value=r}validate(r){return r===void 0&&this._optional?!0:r!==this.value?this.fail({expect:Ot(this.value),actual:r}):!0}},Ve=class extends E{constructor(...t){super(),this._items=t}validate(t){if(t===void 0&&this._optional)return!0;let r=[],n=!1,s=this._items.length;for(let o=0;o<s;o++){let i=this._items[o];if(i.errors=[],i.path=this.path,!i.validate(t))r.push(i.errors.join("; "));else if(!n){n=!0;break}}if(!n){let o=r.join(`
|
|
2
|
-
or `);this.errors.push(o)}return n}},Ke=class extends E{constructor(...t){super(),this._items=t;let r=0,n=t.length-1;for(;n>=0;n--){let s=t[n];if(s._optional||s.hasDefault)r+=1;else break}this._minItems=t.length-r}validate(t){if(t===void 0&&this._optional)return!0;if(!Array.isArray(t))return this.fail({expect:"array",actual:t});if(t.length<this._minItems)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minItems}`);let r=!0;return this._items.forEach((n,s)=>{if(n.path=`${this.path}[${s}]`,n.errors=this.errors,t[s]===void 0&&n.hasDefault){t[s]=n.defaultValue;return}n.validate(t[s])||(n.hasFallback?t[s]=n._fallback:r=!1)}),r}},qe=class extends E{validate(t){return t===void 0&&this._optional||t instanceof ArrayBuffer?!0:this.fail({expect:"arraybuffer",actual:t})}},Ge=class extends E{constructor(t){super(),this._ctor=t}validate(t){return t===void 0&&this._optional||t instanceof this._ctor?!0:this.fail({expect:`typedarray of ${this._ctor.name}`,actual:t})}}});function
|
|
3
|
-
`);throw e.errors.length=0,Nt(!1),new TypeError(n)}}var c,Mt=h(()=>{"use strict";Dt();Dt();c={object(e){return new $e(e)},array(e){return new je(e)},tuple(...e){return new Ke(...e)},literal(e){return new He(e)},or(...e){return new Ve(...e)},symbol(){return new De},record(e){return new Je(e)},function(){return new Le},boolean(){return new Oe},string(){return new Fe},number(){return new Ne},undefined(){return new Ue},null(){return new Me},unknown(){return new ae},any(){return new ae},as(){return new ae},arraybuffer(){return new qe},enum(...e){return new Be(...e)},typedarray(e){return new Ge(e)}}});var ze,Qr,Xr=h(()=>{"use strict";v();M();Mt();X();ze=1,Qr=e=>{function t(n,s){return(...o)=>{let i=Date.now(),a={method:n,trace_id:ze};ze+=1;let d="SUCCESS",l=`${n}:ok`,u=0;try{if(s.paramsSchema)try{Ut(s.paramsSchema,o,"params")}catch(b){throw gt(`${n}:fail ${b.message}`)}let p=s.implement(...o),m=p,f=`${n}:ok`;if(p&&"code"in p){let{code:b,data:_,message:N}=p;d=b,m=_,f=N}return{code:d,message:f,data:m}}catch(p){let m=p;u=m.code??m.errNo??2e3,d="FAILURE";let f=m.message??m.errMsg??`${p}`;return l=`${n}:${d} ${f.replace(/^\S+:(fail|cancel)\s?/,"")}`,R(new fe(l,u)),{code:d,message:l}}finally{let p=Date.now()-i;e("apiInvoked",{...a,duration:p,status:d})}}}function r(n,s){return async(...o)=>{let i=qt(o)?o:[o],a=Date.now(),d={method:n,trace_id:ze};ze+=1;let l=`${n}:ok`,u="SUCCESS",p={code:u,message:l};try{if(s.paramsSchema)try{Ut(s.paramsSchema,i,"params")}catch(b){throw gt(b.message)}let f=await s.implement(...i);if(f&&"code"in f){let{code:b,data:_,message:N}=f;u=b,l=N,f=_}return Object.assign(p,{code:u,message:l,data:f}),p}catch(m){let f=m,b=f.code??f.errNo??2e3;u="FAILURE";let _=f.message??f.errMsg??`${m}`,N=`${n}:${u} ${_.replace(/^\S+:(fail|cancel)\s?/,"")}`;return Object.assign(p,{code:u,message:N}),R(new fe(N,b)),p}finally{let m=Date.now()-a;e("apiInvoked",{...d,duration:m,status:u})}}}return{createAPI:r,createSyncAPI:t}}});var S,w,g,G=h(()=>{"use strict";Wr();ee();Xr();Mt();({createAPI:S,createSyncAPI:w}=Qr(U)),g=zr("native")});var tn=kn(en=>{"use strict";v();G();M();B();ee();var Is="exitGame",ws="onReady",_s="onJoliboxShow",Rs="onJoliboxHide",We=I(),Ye=ke(R),As=S(Is,{paramsSchema:c.tuple(c.function()),implement:async e=>{Ye(e).call(en),await O("exitAppAsync")}}),xs=w(_s,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);J("onJoliboxEnterForeground",()=>{t.call(this),xe.emit("visible",!0)})}}),Ps=w(Rs,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);J("onJoliboxEnterBackground",()=>{t.call(this),xe.emit("visible",!1)})}}),Cs=w(ws,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);V.on("LifecycleEvent.onReady",r=>{t(r)})}});We.registerCommand("LifecycleSDK.exit",As);We.registerCommand("LifecycleSDK.onReady",Cs);We.registerCommand("LifecycleSDK.onJoliboxShow",xs);We.registerCommand("LifecycleSDK.onJoliboxHide",Ps);g("lifeCycle.exit",{version:"1.0.0"});g("lifeCycle.onReady",{version:"1.0.0"});g("lifeCycle.onJoliboxShow",{version:"1.0.0"});g("lifeCycle.onJoliboxHide",{version:"1.0.0"})});B();Se();$();v();ee();L.onReady(()=>{});L.doExit(()=>(U("onBeforeExit",{timestamp:Date.now()}),F.close(Date.now()-Pe),!1));function vs(){V.on("onDocumentReady",()=>{Z?.onDocumentReady(window.location.href),U("onDocumentReady",{start_timestamp:Pe,timestamp:Date.now()})})}function ys(){J("onJoliboxServiceReady",({runtimeInfo:e,loadDuration:t})=>{e&&y.onEnvConfigChanged({hostUserInfo:e}),V.emit("LifecycleEvent.onReady",{...y.hostUserInfo?y.hostUserInfo:{isLogin:!1}}),U("joliboxServiceReady",{start_timestamp:Pe,timestamp:Date.now()}),F.start(t)}),J("onBeforeExit",({uuid:e})=>{Z?.doExit(e)})}var Pe;function Gr(){Pe=Date.now(),ys(),vs()}v();G();B();var Zr=I(),Ts="env",ks="getSystemInfoSync",Es=w(ks,{implement:()=>{let e=A("envSync"),{data:t}=e;return{system:t.deviceInfo.system,platform:t.deviceInfo.platform,version:t.sdkInfo.jssdkVersion,pixelRatio:t.deviceInfo.pixelRatio,language:t.deviceInfo.lang,brand:t.deviceInfo.brand,appName:t.hostInfo?.appName,SDKVersion:t.sdkInfo.jssdkVersion}}}),Ss=w(Ts,{implement:()=>A("envSync")?.data??void 0});Zr.registerCommand("API.getSystemInfoSync",Es);Zr.registerCommand("API.env",Ss);g("env",{version:"1.0.0"});g("getSystemInfoSync",{version:"1.0.0"});var bl=Sn(tn());X();Ct();G();v();function rn(e){let t={};if(!P(e))return t;for(let[r,n]of Object.entries(e)){let s=r.toLocaleLowerCase();n?typeof n=="object"?t[s]=Object.prototype.toString.call(n):t[s]=String(n):t[s]=""}return t}function nn(e="GET"){if(e==="")return"POST";let t=e.toUpperCase();return["GET","OPTIONS","HEAD","POST","PUT","DELETE","TRACE","CONNECT","PATCH"].includes(t)?t:"GET"}function sn(e,t=!1){if(e)return t||e>0&&e<=6e4?Math.ceil(e):6e4}function on(e,t,r){if(["POST","PUT","PATCH"].includes(t)||!P(r))return e;let[n,s=""]=e.split("?"),o=JSON.stringify({...JSON.parse(s),...r});return`${n}?${o}`}v();M();var Ns=15,Os=_e("createRequestTaskSync","operateRequestTaskSync",{type:"public"}),Lt=0,Bt=[],an=ke(R),Fs=(e,t)=>{let r=e.filter(t),n=e.filter(s=>!t(s));return e.length=0,e.push(...n),r},Ds=e=>{let t=new Y,r=()=>{};return S("request",{paramsSchema:c.tuple(c.object({url:c.string(),method:c.string(),header:c.object(),data:c.object().optional(),query:c.object().optional(),dataType:c.string().default("json"),responseType:c.string().default("text"),enableCache:c.boolean().default(!1),appendHostCookie:c.boolean().default(!0),timeout:c.number().default(3e4),success:c.function(),fail:c.function()})),implement(s){let o=async()=>{let i=an(s.fail);try{if(Lt+=1,t.state!=="pending")return;let{data:a,dataType:d,responseType:l,enableCache:u,appendHostCookie:p}=s,m=rn(s.header),f=nn(s.method),b=sn(s.timeout),_=on(s.url,f,a),N=an(s.success),z=Object.assign({},s,{method:f,header:m,data:f==="GET"||f==="HEAD"?void 0:a,enableCache:u,query:s.query??{},dataType:d,responseType:l,appendHostCookie:p});b&&(z.timeout=b);let W=Os(_,z);{let{response:k}=await W,{code:x,data:le,message:nt}=k;t.resolve({code:x??"SUCCESS",data:le,message:nt??"request:ok"}),N({code:"SUCCESS",message:"request:ok",data:le})}}catch(a){t.reject(a),i({code:"FAILURE",message:"httpRequst: failed"})}finally{Lt-=1,Bt.shift()?.()}};return Lt>=Ns?(r=()=>{Fs(Bt,i=>i===o)},Bt.push(o)):o(),t.promise}})(e),{abort(){t.reject(se({code:-1,msg:"request:fail abort"})),r()}}},Us=I();Us.registerCommand("HttpSDK.request",Ds);g("request",{version:"1.0.0"});G();B();v();Re();$();var Qe=I(),Ms=S("getLocalStorage",{paramsSchema:c.tuple(c.string()),async implement(e){let{response:t}=await K(`/api/games/user-storage/${y.mpId}`,{method:"GET",responseType:"json",appendHostCookie:!0,query:{key:e}}),{data:{code:r,message:n,data:s}}=await t;if(r==="SUCCESS")return{code:r,message:n,data:s?.value};try{let{data:{data:o,dataType:i}}=await O("getLocalStorageAsync",{key:e}),a=Hs(o,i);return{code:r,message:`${n}. fallback to native`,data:a}}catch{return{code:"INTERNAL_ERROR",message:"[Jolibox SDK] get local storage failed",data:null}}}});Qe.registerCommand("StorageSDK.getItem",Ms);g("storage.getItem",{version:"1.0.0",properties:{key:"1.0.0",value:"1.0.0"}});var Ls=S("setStorage",{paramsSchema:c.tuple(c.string(),c.or(c.string(),c.boolean(),c.number())),async implement(e,t){let r=y.mpId,n=typeof t=="string"?t:String(t),{response:s}=await K(`/api/games/user-storage/${r}`,{method:"POST",responseType:"json",appendHostCookie:!0,data:{key:e,value:n}}),{data:{code:o,message:i}}=s,a=$s(t),d=Vs(t,a);return await O("setLocalStorageAsync",{key:e,data:d,dataType:a}),o=="SUCCESS"?{code:o,message:i}:{code:o,message:`${i}. fallback to native`}}});Qe.registerCommand("StorageSDK.setItem",Ls);g("storage.setItem",{version:"1.0.0",properties:{key:"1.0.0",value:"1.0.0"}});var Bs=S("removeStorage",{paramsSchema:c.tuple(c.string()),async implement(e){let t=y.mpId,{response:r}=await K(`/api/games/user-storage/${t}/remove`,{method:"POST",responseType:"json",appendHostCookie:!0,data:{key:e}}),{data:{code:n,message:s}}=r;return await O("removeLocalStorageAsync",{key:e}),n==="SUCCESS"?{code:n,message:s}:{code:n,message:"[Jolibox SDK] remove item succ"}}});Qe.registerCommand("StorageSDK.removeItem",Bs);g("storage.removeItem",{version:"1.0.0",properties:{key:"1.0.0"}});var js=S("clearStorage",{async implement(){let e=y.mpId,{response:t}=await K(`/api/games/user-storage/${e}/clear`,{method:"POST",appendHostCookie:!0});O("clearLocalStorageAsync");let{data:{code:r,message:n}}=t;return r==="SUCCESS"?{code:r,message:n}:{code:r,message:`${n}.fallback to native`}}});Qe.registerCommand("StorageSDK.clear",js);g("storage.clear",{version:"1.0.0"});var Mc=S("getStorageInfo",{async implement(){let{data:e}=await O("getStorageInfoAsync");return e}});g("getStorageInfo",{version:"1.0.0",success:{keys:"1.0.0",currentSize:"1.0.0",limitSize:"1.0.0"}});var Lc=w("getStorageInfoSync",{implement(){return A("getStorageInfoSync")}}),Js=["string","number","boolean","object",""];function $s(e){let t=Object.prototype.toString.call(e).split(" ")[1].split("]")[0].toLocaleLowerCase();return Js.includes(t)?t:""}function Hs(e,t){try{switch(t){case"string":return e;case"object":return JSON.parse(e);case"number":return parseFloat(e);case"boolean":return e==="true";default:return""}}catch{return""}}function Vs(e,t){try{switch(t){case"string":case"number":case"boolean":return`${e}`;case"object":return JSON.stringify(e);default:return""}}catch{return""}}v();B();G();var Ks=w("showKeyboard",{paramsSchema:c.tuple(c.object({defaultValue:c.string().optional().default(""),multiple:c.boolean().optional().default(!1),maxLength:c.unknown().optional().default(1e5)})),implement(e){let t=Math.floor(Number(e.maxLength)??1e5),{defaultValue:r}=e;r&&t&&(r=r.slice(0,t)),A("showKeyboardSync",{...e,defaultValue:r,maxLength:t})}});g("keyboard.showKeyboard",{version:"1.0.0",properties:{params:{defaultValue:"1.0.0",multiple:"1.0.0",confirmHold:"1.0.0",confirmType:"1.0.0",maxLength:"1.0.0"}},success:{errMsg:"1.0.0"}});var qs=w("updateKeyboard",{paramsSchema:c.tuple(c.object({value:c.string()})),implement(e){A("updateKeyboardSync",e)}});g("keyboard.updateKeyboard",{version:"1.0.0",properties:{params:{value:"1.0.0"}}});var Gs=w("hideKeyboard",{implement(){A("hideKeyboardSync")}});g("keyboard.hideKeyboard",{version:"1.0.0"});var jt=I();jt.registerCommand("KeyboardSDK.showKeyboard",Ks);jt.registerCommand("KeyboardSDK.updateKeyboard",qs);jt.registerCommand("KeyboardSDK.hideKeyboard",Gs);v();G();ee();var ce=I(),zs=S("levelFinished",{paramsSchema:c.tuple(c.string(),c.object({result:c.boolean(),duration:c.number()})),implement:async(e,t)=>{let{result:r,duration:n}=t,s=[];s.push(F.tracker("LevelFinished",{levelId:e,result:r,duration:n})),s.push(F.reporter({event:"COMPLETE_GAME_LEVEL"})),await Promise.all(s)}}),Ws=S("taskFinished",{paramsSchema:c.tuple(c.string(),c.object({duration:c.number()})),implement:async(e,t)=>{let{duration:r}=t;return await F.reportToNative({event:"TaskFinished",params:{duration:r,taskId:e}})}}),Ys=S("levelUpgrade",{paramsSchema:c.tuple(c.string(),c.string()),implement:async(e,t)=>{let r=[];r.push(F.reportToNative({event:"LevelUpgrade",params:{name:t,levelId:e}})),await Promise.all(r)}}),Qs=S("onHistoryUserLevel",{paramsSchema:c.tuple(c.number()),implement:async e=>await F.reportToNative({event:"HistoryUserLevel",params:{level:e}})}),Xs=S("onHistoryUserScore",{paramsSchema:c.tuple(c.number()),implement:async e=>await F.reportToNative({event:"HistoryUserScore",params:{score:e}})}),Zs=S("taskEvent",{paramsSchema:c.tuple(c.string(),c.object({tools:c.array(c.object({id:c.string(),name:c.string(),count:c.number(),description:c.string().optional(),price:c.object({amount:c.number(),unit:c.string()}).optional()})).optional(),awards:c.array(c.object({id:c.string(),name:c.string()})).optional()})),implement:async(e,t)=>{let r=[];r.push(F.reportToNative({event:"TaskEvent",params:{taskId:e,...t}})),(t.tools?.length??!1)&&(r.push(F.reporter({event:"USE_GAME_ITEM"})),r.push(F.reportToNative({event:"UseGameItem",params:{taskId:e,...t}}))),await Promise.all(r)}});ce.registerCommand("TaskTrackerSDK.levelFinished",zs);ce.registerCommand("TaskTrackerSDK.taskFinished",Ws);ce.registerCommand("TaskTrackerSDK.levelUpgrade",Ys);ce.registerCommand("TaskTrackerSDK.historyUserLevel",Qs);ce.registerCommand("TaskTrackerSDK.historyUserScore",Xs);ce.registerCommand("TaskTrackerSDK.taskEvent",Zs);g("TaskTrackerSDK.onLevelFinished",{version:"1.0.0",properties:{levelId:"1.0.0",params:{result:"1.0.0",duration:"1.0.0"}}});g("TaskTrackerSDK.onTaskFinished",{version:"1.0.0",properties:{taskId:"1.0.0",duration:"1.0.0"}});g("TaskTrackerSDK.onLevelUpgrade",{version:"1.0.0",properties:{levelId:"1.0.0",name:"1.0.0"}});g("TaskTrackerSDK.onHistoryUserLevel",{version:"1.0.0",properties:{level:"1.0.0"}});g("TaskTrackerSDK.onHistoryUserScore",{version:"1.0.0",properties:{score:"1.0.0"}});g("TaskTrackerSDK.onTaskEvent",{version:"1.0.0",properties:{taskId:"1.0.0",params:{tools:{id:"1.0.0",name:"1.0.0",count:"1.0.0",description:"1.0.0",price:{amount:"1.0.0",unit:"1.0.0"}},awards:{id:"1.0.0",name:"1.0.0"}}}});$();B();G();v();X();g("login",{version:"1.0.0",properties:{force:"1.0.0"},success:{errMsg:"1.0.0",code:"1.0.0",token:"1.0.0",isLogin:"1.0.0"}});g("checkSession",{version:"1.0.0",success:{errMsg:"1.0.0"}});var eo=S("login",{async implement(){let{data:{isLogin:e}}=await O("checkLoginAsync");if(e)return{isLogin:!0,token:y.hostUserInfo?.token};J("onLoginStateChange",({isLogin:i,token:a,uuid:d})=>{d==r&&s({isLogin:i,token:a})});let t=A("loginSync"),{data:{uuid:r}}=t;if(!r)throw se({code:-1,msg:"login failed"});let{promise:n,resolve:s}=new Y,o=await n;return y.onEnvConfigChanged({hostUserInfo:o}),V.emit("onLoginComplete",o),o}}),to=S("checkSession",{async implement(){let{data:{isLogin:e}}=await O("checkLoginAsync");return{isLogin:e}}}),cn=I();cn.registerCommand("API.login",eo);cn.registerCommand("API.checkSession",to);v();G();var Xe=class{constructor(t){this.track=t;this.adBreakIsShowing=!1;this.reportPageJumpOut=()=>{this.track("AdBreakJumpOut",{context:"AdsActionDetection"})};this.reportPageHide=()=>{this.track("AdBreakHide",{context:"AdsActionDetection"})};window.addEventListener("visibilitychange",()=>{document.hidden&&this.adBreakIsShowing&&this.reportPageHide()}),window.addEventListener("beforeunload",r=>{this.adBreakIsShowing&&this.reportPageJumpOut()})}};var ln="jolibox-sdk-ads-callbreak-timestamps",Ze=class{constructor(t,r){this.checkNetwork=t;this.maxAllowedAdsForTime=8;this.bannedForTimeThreshold=6e4;this.bannedReleaseTime=6e4;this.isBanningForTime=!1;this.releaseBannedForTimeTimeout=null;this.maxAllowedAdsForSession=200;this.bannedForSessionThreshold=6e5;this.isBanningForSession=!1;this.initialThreshold=2e3;this._callAdsTimestampsForTime=[];this.callAdsTimestampsForSession=[];this.initTimestamp=0;this.initCallAdsTimestampsForTime=()=>{try{let t=JSON.parse(window.localStorage.getItem(ln)??"[]");Array.isArray(t)?this._callAdsTimestampsForTime=t:this._callAdsTimestampsForTime=[]}catch{this._callAdsTimestampsForTime=[]}};this.setReleaseBannedForTime=()=>{this.releaseBannedForTimeTimeout&&(window.clearTimeout(this.releaseBannedForTimeTimeout),this.releaseBannedForTimeTimeout=null),this.releaseBannedForTimeTimeout=window.setTimeout(()=>{this.isBanningForTime=!1,this.releaseBannedForTimeTimeout=null},this.bannedReleaseTime)};this.checkShouldBannedInitial=()=>{if(Date.now()-this.initTimestamp<=this.initialThreshold)return"BLOCK_INITIAL"};this.checkShouldBannedForSession=t=>{if(this.isBanningForSession)return"BANNED_FOR_SESSION";let r=Date.now();if(this.callAdsTimestampsForSession=this.callAdsTimestampsForSession.concat({timestamp:r,type:t}),this.callAdsTimestampsForSession.length!==1&&(this.callAdsTimestampsForSession.length>this.maxAllowedAdsForSession&&(this.callAdsTimestampsForSession=this.callAdsTimestampsForSession.slice(-this.maxAllowedAdsForSession)),this.callAdsTimestampsForSession.length===this.maxAllowedAdsForSession&&r-this.callAdsTimestampsForSession[0].timestamp<=this.bannedForSessionThreshold))return this.isBanningForSession=!0,"BANNED_FOR_SESSION"};this.checkShouldBannedForTime=t=>{if(this.isBanningForTime)return"WAITING_BANNED_RELEASE";let r=Date.now();if(this.callAdsTimestampsForTime=this.callAdsTimestampsForTime.concat({timestamp:r,type:t}),this.callAdsTimestampsForTime.length!==1&&(this.callAdsTimestampsForTime.length>this.maxAllowedAdsForTime&&(this.callAdsTimestampsForTime=this.callAdsTimestampsForTime.slice(-this.maxAllowedAdsForTime)),this.callAdsTimestampsForTime.length===this.maxAllowedAdsForTime&&r-this.callAdsTimestampsForTime[0].timestamp<=this.bannedForTimeThreshold))return this.isBanningForTime=!0,this.setReleaseBannedForTime(),"BANNED_FOR_TIME"};this.checkAdsDisplayPermission=t=>{if(!this.checkNetwork())return"NETWORK_NOT_OK";let r=this.checkShouldBannedInitial();if(r)return r;let n=this.checkShouldBannedForSession(t);if(n)return n;let s=this.checkShouldBannedForTime(t);return s||"ALLOWED"};if(this.maxAllowedAdsForTime=r?.maxAllowedAdsForTime??8,this.bannedForTimeThreshold=r?.bannedForTimeThreshold??6e4,this.bannedReleaseTime=r?.bannedReleaseTime??6e4,this.maxAllowedAdsForSession=r?.maxAllowedAdsForSession??200,this.bannedForSessionThreshold=r?.bannedForSessionThreshold??6e5,this.initialThreshold=r?.initialThreshold??2e3,this.maxAllowedAdsForTime<=1)throw new Error("maxAllowedAdsForTime must be greater than 1");if(this.bannedForTimeThreshold<0)throw new Error("bannedForTimeThreshold must be greater than or equal to 0");if(this.bannedReleaseTime<this.bannedForTimeThreshold)throw new Error("bannedReleaseTime must be greater than or equal to bannedForTimeThreshold");if(this.initialThreshold<0)throw new Error("initialThreshold must be greater than or equal to 0");this.initCallAdsTimestampsForTime(),this.initTimestamp=Date.now()}get callAdsTimestampsForTime(){return this._callAdsTimestampsForTime}set callAdsTimestampsForTime(t){try{window.localStorage.setItem(ln,JSON.stringify(t))}catch{console.error("Failed to save timestamps")}this._callAdsTimestampsForTime=t}};$();var dn={ISXT6:{skipInterstitials:!0}};var et=class{constructor(t,r,n){this.track=t;this.httpClient=r;this.checkNetwork=n;this.configured=!1;this.config={};this.getGameId=()=>y.mpId;this.getTestAdsMode=()=>y.testAdsMode;this.asyncLoad=async()=>{let t="ca-pub-7171363994453626",r,n,s=window.encodeURIComponent(window.btoa(this.getGameId()??"")),o=this.getTestAdsMode()??!1;try{let i=await this.httpClient.get("/public/ads",{query:{objectId:s,testAdsMode:`${o}`}});t=i.data?.clientId,r=i.data?.channelId,n=i.data?.unitId}catch(i){console.error("Failed to fetch client info",i)}this.clientId=t,this.channelId=r,this.unitId=n};this.asyncInit=async t=>{if(typeof window>"u")return;await this.asyncLoad();let r="google-adsense",n=this.getTestAdsMode()??!1;if(!document.getElementById(r)&&this.clientId){let s=document.createElement("script");s.id=r,s.async=!0,s.crossOrigin="anonymous",s.src=`https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${this.clientId}`,n&&s.setAttribute("data-adbreak-test","on"),this.channelId&&s.setAttribute("data-ad-channel",this.channelId),document.head.appendChild(s),this.track("LoadAdsenseCompleted",null)}};this.push=(t={})=>{window.adsbygoogle.push(t)};this.adConfig=t=>{let{onReady:r,...n}=t;this.track("CallAdConfig",n),this.configured?console.warn("Ad config already set, skipping"):(this.configured=!0,this.push(t))};this.adBreak=t=>{if(!this.getGameId()){console.warn("Game ID is not set, skip calling adBreak");return}if(t.type!=="reward"&&(dn[y.channel??""]?.skipInterstitials??!1)){t.adBreakDone?.({breakType:t.type,breakName:"skipInterstitials",breakFormat:"interstitial",breakStatus:"viewed"});return}let r=this.antiCheating.checkAdsDisplayPermission(t.type==="reward"?"reward":"interstitial");switch(r){case"NETWORK_NOT_OK":case"BANNED_FOR_SESSION":console.warn("Ads not allowed",r),t.adBreakDone?.({breakType:t.type,breakName:r,breakFormat:t.type==="reward"?"reward":"interstitial",breakStatus:"noAdPreloaded"}),this.track("PreventAdsCheating",{reason:r});return;case"BLOCK_INITIAL":case"BANNED_FOR_TIME":case"WAITING_BANNED_RELEASE":console.warn("Ads not allowed",r),t.adBreakDone?.({breakType:t.type,breakFormat:t.type==="reward"?"reward":"interstitial",breakStatus:"viewed"}),this.track("PreventAdsCheating",{reason:r});return;default:break}let n=t.type,s=t.adBreakDone,o=a=>{this.adsActionDetection.adBreakIsShowing=!1,this.track("CallAdBreakDone",{breakType:a.breakType,breakName:a.breakName??"",breakFormat:a.breakFormat,breakStatus:a.breakStatus}),s&&s(a)};if(t.adBreakDone=o,t.type==="reward"){let a=t.beforeReward,d=u=>()=>{this.track("CallShowAdFn",null),u()},l=u=>{a&&a(d(u))};t.beforeReward=l}let i;switch(n){case"preroll":i={type:n};break;case"start":case"pause":case"next":case"browse":case"reward":i={type:n,name:t.name??""};break}this.adsActionDetection.adBreakIsShowing=!0,this.track("CallAdBreak",i),this.push(t),window.JoliTesterBridge&&console.log("joli-fullscreen-ad-show")};this.adUnit=async t=>{if(this.track("CallAdUnit",{adFormat:t.adFormat?.toString()??null,fullWidthResponsive:t.fullWidthResponsive??null}),this.clientId||await this.asyncLoad(),document.querySelector("#jolibox-ads")){console.warn("Ad unit already set, skipping");return}let{el:r,slot:n,adFormat:s,fullWidthResponsive:o,style:i}=t,a;if(!r)throw new Error("targeting element is required");if(typeof r=="string"?a=document.querySelector(r):a=r,!a)throw new Error("targeting element not found");let d=n;if(d||(d=this.unitId),!d)throw new Error("slot is required");let l=typeof s=="object"&&Array.isArray(s)?s.join(", "):s,u=document.createElement("ins");if(u.className="adsbygoogle",u.id="jolibox-ads",u.style.display="block",u.setAttribute("data-ad-client",this.clientId),u.setAttribute("data-ad-slot",d),l&&u.setAttribute("data-ad-format",l),o&&u.setAttribute("data-full-width-responsive",o),i&&u.setAttribute("style",i),this.getTestAdsMode()??!1){let m=document.createElement("div");m.style.position="absolute",m.style.top="0",m.style.left="0",m.style.width="100%",m.style.height="100%",m.style.display="flex",m.style.justifyContent="center",m.style.alignItems="center",m.style.backgroundColor="rgba(0, 0, 0, 0.5)",m.style.color="white",m.innerHTML="Test Ad",u.style.position="relative",a.appendChild(u),u.appendChild(m)}else a.appendChild(u),new MutationObserver(f=>{f.forEach(b=>{if(b.type==="attributes"&&b.attributeName==="data-ad-status"){let _=u.getAttribute("data-ad-status");this.track("AdSenseUnitStatusChanged",{status:_??"null"})}})}).observe(u,{attributes:!0,attributeFilter:["data-ad-status"]}),this.push({})};this.antiCheating=new Ze(n),this.adsActionDetection=new Xe(this.track)}init(t){this.track("CallAdsInit",null),!(typeof window>"u")&&(this.config=t??{},window.adsbygoogle=window.adsbygoogle||[],this.asyncInit(t))}};ee();Re();var tt=I(),rt=new et(U,{get:(e,t)=>K(e,{method:"GET",responseType:"json",appendHostCookie:!0,...t}).then(r=>r.response.data)},()=>!0),ro=w("adInit",{implement:e=>{rt.init(e)}}),no=w("adConfig",{implement:e=>{rt.adConfig(e)}}),so=w("adBreak",{implement:e=>{rt.adBreak(e)}}),oo=w("adUnit",{implement:e=>{rt.adUnit(e)}});tt.registerCommand("AdsSDK.init",ro);tt.registerCommand("AdsSDK.adConfig",no);tt.registerCommand("AdsSDK.adBreak",so);tt.registerCommand("AdsSDK.adUnit",oo);g("AdsSDK.init",{version:"1.0.0"});g("AdsSDK.adConfig",{version:"1.0.0"});g("AdsSDK.adBreak",{version:"1.0.0"});g("AdsSDK.adUnit",{version:"1.0.0"});ee();Gr();
|
|
1
|
+
var yn=Object.create;var Vt=Object.defineProperty;var bn=Object.getOwnPropertyDescriptor;var Tn=Object.getOwnPropertyNames;var kn=Object.getPrototypeOf,En=Object.prototype.hasOwnProperty;var h=(e,t)=>()=>(e&&(t=e(e=0)),t);var Sn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var In=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Tn(t))!En.call(e,s)&&s!==r&&Vt(e,s,{get:()=>t[s],enumerable:!(n=bn(t,s))||n.enumerable});return e};var wn=(e,t,r)=>(r=e!=null?yn(kn(e)):{},In(t||!e||!e.__esModule?Vt(r,"default",{value:e,enumerable:!0}):r,e));function _n(e){return!!e?.__nativeBuffers__}function de(e){if(typeof e=="string")try{e=JSON.parse(e)}catch{return{}}if(typeof e!="object"||e===null)return{};if(!_n(e))return e;let t=e.__nativeBuffers__;if(delete e.__nativeBuffers__,t)for(let r=0;r<t.length;r++){let n=t[r];if(n){let s;n.value?s=n.value:n.base64&&(s=Rn(n.base64)),typeof s<"u"&&s instanceof ArrayBuffer&&(e[n.key]=s)}}return e}function $t(e={},t=!1){let r=e,n=[];for(let[s,o]of Object.entries(r))if(o!==void 0&&o instanceof ArrayBuffer&&o.byteLength!==void 0){let i=t?{value:o,key:s}:{base64:An(o),key:s};n.push(i),delete r[s]}return n.length>0&&(r.__nativeBuffers__=n),r}var Rn,An,ot=h(()=>{"use strict";Rn=e=>{let t=atob(e),r=t.length,n=new Uint8Array(r);for(let s=0;s<r;s++)n[s]=t.charCodeAt(s);return n.buffer};An=e=>{let t="",r=new Uint8Array(e),n=r.byteLength;for(let s=0;s<n;s++)t+=String.fromCharCode(r[s]);return btoa(t)}});function Pn(e){return new Promise(t=>{setTimeout(()=>{t()},e)})}function te(e){return typeof e=="string"}function C(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof RegExp)&&!(e instanceof Date)}function Gt(e){return typeof e=="object"&&Array.isArray(e)}function Nn(e){return typeof e>"u"}function On(e){return Nn(e)||e===null}function zt(e){return typeof e=="function"}function Wt(e){return C(e)&&zt(e.then)}function Yt(e){let t=e,r=null,n=function(...s){return r||(r=new t(...s)),r};return n.prototype=t.prototype,n}function Qt(e,t,r){if(typeof r!="function")throw new Error("[Jolibox SDK]Customizer must be a function");function n(s,o){for(let i in o)if(Object.prototype.hasOwnProperty.call(o,i)){let a=s[i],d=o[i],l=r(a,d,i,s,o);l!==void 0?s[i]=l:Ht(d)&&Ht(a)?s[i]=n({...a},d):Array.isArray(d)&&Array.isArray(a)?s[i]=[...a,...d]:s[i]=d}return s}return n(e,t)}function Ht(e){return e&&typeof e=="object"&&e.constructor===Object}function Xt(e,t){if(Array.isArray(e))return e.concat(t)}function pe(e,t,r={}){let n=null,s,o,i,{leading:a=!1,trailing:d=!0}=r,l=()=>(i=e.apply(o,s),s=void 0,o=void 0,i),u=function(...p){s=p,o=this;let m=a&&!n;if(n&&clearTimeout(n),n=setTimeout(()=>{n=null,d&&!m&&l()},t),m)return l()};return u.cancel=()=>{n&&clearTimeout(n),n=null,s=o=void 0},u.flush=()=>{if(n)return clearTimeout(n),n=null,l()},u}function Un(e,t){return(...r)=>t(e,...r)}function ke(e){return t=>Un(t,function(r,...n){if(typeof r=="function")try{return r.apply(this,n)}catch(s){e(new Dn(`${s}`))}})}function ue(e){return(...t)=>{(globalThis.VConsole?.[e]??globalThis.console[e])(...t)}}function Yn(e){return new Promise(t=>lr(e)(t))}function lr(e){return(t,r=null)=>{let n=!1;return e(s=>{if(!n)return n=!0,t.call(r,s)},null)}}function Qn(e,t){return(r=>{let n,s={onWillAddFirstListener(){n=r(o.fire,o)}},o=new me(s);return o.event})((r,n=null)=>e(s=>t(s)&&r.call(n,s),null))}function Zn(e,t){let r=Math.min(e.length,t.length);for(let n=0;n<r;n++)es(e[n],t[n])}function es(e,t){if(te(t)){if(typeof e!==t)throw new Error(`argument does not match constraint: typeof ${t}`)}else if(zt(t)){try{if(e instanceof t)return}catch{}if(!On(e)&&e.constructor===t||t.length===1&&t.call(void 0,e)===!0)return;throw new Error("[Jolibox SDK]argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true")}}function w(){if(globalThis[at])return globalThis[at];let e=new be,t=new lt,r={registerCommand(n,s,o){e.registerCommand({id:n,handler:s,metadata:o})},executeCommand(n,...s){return t.executeCommand(n,...s)},excuteCommandSync(n,...s){return t.executeCommandThowErr(n,...s)}};return globalThis[at]=r,r}var Kt,xn,Cn,qt,Y,Fn,dt,re,Zt,er,Dn,tr,rr,nr,sr,or,fe,Te,ut,P,ir,Mn,mt,Ln,pt,jn,Bn,ge,Jn,Vn,$n,ar,ft,Hn,Kn,qn,cr,T,Gn,zn,ve,me,Q,ct,Wn,it,Xn,H,be,lt,at,v=h(()=>{"use strict";Kt=Object.defineProperty,xn=Object.getOwnPropertyDescriptor,Cn=(e,t)=>{for(var r in t)Kt(e,r,{get:t[r],enumerable:!0})},qt=(e,t,r,n)=>{for(var s=n>1?void 0:n?xn(t,r):t,o=e.length-1,i;o>=0;o--)(i=e[o])&&(s=(n?i(t,r,s):i(s))||s);return n&&s&&Kt(t,r,s),s};Y=class{constructor(){this.state="pending",this.promise=new Promise((e,t)=>{this.resolve=r=>{this.state==="pending"&&(this.state="fulfilled",e(r))},this.reject=r=>{this.state==="pending"&&(this.state="rejected",t(r))}})}};Fn=(e=>(e[e.DEVELOPER_FILE_NOT_FOUND=0]="DEVELOPER_FILE_NOT_FOUND",e[e.INTERNAL_IOS_CAN_NOT_FOUND_PKG=1]="INTERNAL_IOS_CAN_NOT_FOUND_PKG",e[e.USER_IOS_LOAD_TIMEOUT=2]="USER_IOS_LOAD_TIMEOUT",e[e.INTERNAL_IOS_PKG_LOAD_ERROR=3]="INTERNAL_IOS_PKG_LOAD_ERROR",e[e.INTERNAL_IOS_PKG_PARSE_FAIL=4]="INTERNAL_IOS_PKG_PARSE_FAIL",e[e.USER_IOS_GET_EMPTY_DATA=5]="USER_IOS_GET_EMPTY_DATA",e[e.USER_ANDROID_GET_PKG_FAIL=6]="USER_ANDROID_GET_PKG_FAIL",e[e.DEVELOPER_ANDROID_PACKAGE_FILE_UNEXPECTED_REQUIRE=7]="DEVELOPER_ANDROID_PACKAGE_FILE_UNEXPECTED_REQUIRE",e))(Fn||{}),dt=class extends Error{constructor(e){if(typeof e=="string"){super(e),this.priority="P1";return}super(e.message),this.priority="P1",this.stack=e.stack,this.raw=e}},re=class extends dt{constructor(){super(...arguments),this.kind="INTERNAL_ERROR"}},Zt=class extends dt{constructor(){super(...arguments),this.kind="USER_ERROR"}},er=class extends Zt{constructor(){super(...arguments),this.name="USER_VALIDATE_ERROR"}},Dn=class extends Zt{constructor(e,t,r){super(e),this.message=e,this.errNo=t,this.name="USER_CUSTOM_ERROR",this.errMsg=e,r&&(this.extra=Object.assign({},this.extra,r))}},tr=class extends re{constructor(){super(...arguments),this.name="INTERNAL_SCHEMA_PARSE_ERROR",this.priority="P0"}},rr=class extends re{constructor(){super(...arguments),this.name="INTERNAL_INVOKE_NATIVE_ERROR"}},nr=class extends re{constructor(e,t,r,n){super(e),this.errNo=t,this.name="INTERNAL_APPLY_NATIVE_ERROR",this.errorType=r,this.errorCode=n}},sr=class extends re{constructor(){super(...arguments),this.name="INTERNAL_JSCORE_ERROR",this.priority="P0"}},or=class extends re{constructor(){super(...arguments),this.name="INTERNAL_GLOBAL_JS_ERROR",this.priority="P1"}},fe=class extends dt{constructor(e,t,r,n,s){super(e),this.message=e,this.code=t,this.kind="API_ERROR",this.name="API_ERROR",r&&(this.errorType=r),n!==void 0&&(this.stack=n),s&&(this.priority=s)}toJSON(){return{message:this.message,stack:this.stack,name:this.name,code:this.code,errorType:this.errorType}}},Te=class extends re{constructor(){super(...arguments),this.name="INTERNAL_METRIC_REPORT_ERROR"}},ut=class extends re{constructor(){super(...arguments),this.name="INTERNAL_REPORTER_ERROR"}};P={log:ue("log"),warn:ue("warn"),info:ue("info"),error:ue("error"),debug:ue("debug")};Object.assign(globalThis,{logger:P});ir=Symbol.for("Jolibox.canIUseMap"),Mn={};globalThis[ir]=Mn;mt={get config(){return globalThis[ir]}},Ln=(e=>(e[e.System=1e3]="System",e[e.ErrorTrace=1001]="ErrorTrace",e[e.UserDefined=1002]="UserDefined",e))(Ln||{}),pt=(e=>(e.MiniGame="mini-game",e.MiniDrama="mini-drama",e.App="app",e.WebSDK="web-sdk",e.AppSDK="app-sdk",e))(pt||{}),jn=(e=>(e[e.App=0]="App",e[e.H5=1]="H5",e[e.Weapp=2]="Weapp",e[e.Alipay=3]="Alipay",e[e.Gcash=4]="Gcash",e[e.Dana=5]="Dana",e[e.Umma=6]="Umma",e[e.WebSDK=1e3]="WebSDK",e[e.AppSDK=1001]="AppSDK",e[e.Other=9999]="Other",e))(jn||{}),Bn=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)}),ge={isiOS:navigator.userAgent.includes("iPhone")||navigator.userAgent.includes("iPod")||navigator.userAgent.includes("iPad")||navigator.userAgent.includes("iPhone OS"),iosVersion:()=>{let e=navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/);return[parseInt(e[1],10),parseInt(e[2],10),parseInt(e[3]||"0",10)]},isAndroid:navigator.userAgent.includes("Android"),isMac:navigator.userAgent.includes("Mac"),isFacebook:navigator.userAgent.includes("FB_IAB"),isPC:!navigator.userAgent.includes("iPhone")&&!navigator.userAgent.includes("Android")},Jn=()=>ge.isiOS?"iOS":ge.isAndroid?"Android":ge.isMac?"Mac":ge.isFacebook?"Facebook":"PC",Vn="device_id",$n="advertising_id",ar=e=>(localStorage.getItem(e)||localStorage.setItem(e,Bn()),localStorage.getItem(e)),ft=()=>ar(Vn),Hn=()=>ar($n),Kn=e=>e.charAt(0).toUpperCase()+e.slice(1),qn=()=>{let e=new URLSearchParams(window.location.search);return Kn(e.get("utm_source")??"")||"JoliboxSDK"},cr=e=>{let t="JoliboxWebSDK",r=Jn(),n=navigator.language,s=ft(),o=Hn();return`${t} (${qn()}${r}; UnknownModel; UnknownSystemVersion; ${n}) uuid/${s} adid/${o} version/${e||""}`},T=class ye{static{this.Undefined=new ye(void 0)}constructor(t){this.element=t,this.next=ye.Undefined,this.prev=ye.Undefined}},Gn=class{constructor(){this._first=T.Undefined,this._last=T.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===T.Undefined}clear(){let e=this._first;for(;e!==T.Undefined;){let t=e.next;e.prev=T.Undefined,e.next=T.Undefined,e=t}this._first=T.Undefined,this._last=T.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){let r=new T(e);if(this._first===T.Undefined)this._first=r,this._last=r;else if(t){let s=this._last;this._last=r,r.prev=s,s.next=r}else{let s=this._first;this._first=r,r.next=s,s.prev=r}this._size+=1;let n=!1;return()=>{n||(n=!0,this._remove(r))}}shift(){if(this._first!==T.Undefined){let e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==T.Undefined){let e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==T.Undefined&&e.next!==T.Undefined){let t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===T.Undefined&&e.next===T.Undefined?(this._first=T.Undefined,this._last=T.Undefined):e.next===T.Undefined?(this._last=this._last.prev,this._last.next=T.Undefined):e.prev===T.Undefined&&(this._first=this._first.next,this._first.prev=T.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==T.Undefined;)yield e.element,e=e.next}},zn=0,ve=class{constructor(e){this.value=e,this.id=zn++}},me=class{constructor(e){this.options=e,this._size=0}dispose(e){this._disposed||(this._disposed=!0,this._listeners&&(e?(this._listeners instanceof ve&&(this._listeners=[this._listeners]),this._listeners=this._listeners.filter(t=>t?.value===e)):(this._listeners=void 0,this._size=0)),this.options?.onDidRemoveLastListener?.())}get event(){return this._event??=(e,t)=>{if(this._disposed)return()=>{console.info("[Jolibox SDK] Emitter is _disposed")};t&&(e=e.bind(t));let r=new ve(e);this._listeners?this._listeners instanceof ve?this._listeners=[this._listeners,r]:this._listeners.push(r):(this.options?.onWillAddFirstListener?.(this),this._listeners=r,this.options?.onDidFirstListener?.(this)),this.options?.onDidAddListener?.(this),this._size++},this._event}_deliver(e,t){if(!e)return;let r=this.options?.onListenerError||Error.constructor;if(!r){e.value(t);return}try{e.value(t)}catch(n){r(n)}}fire(e){this._listeners&&(this._listeners instanceof ve?this._deliver(this._listeners,e):this._listeners.forEach(t=>this._deliver(t,e)))}hasListeners(){return this._size>0}},Q=class{constructor(){this.listeners=new Map,this.listerHandlerMap=new WeakMap,this.cachedEventQueue=new Map}on(e,t){let r=this.listeners.get(e)??new me,n=o=>t(...o.args);this.listerHandlerMap.set(t,n),r.event(n),this.listeners.set(e,r);let s=this.cachedEventQueue.get(e);if(s)for(;s.size>0;)r.fire({event:e,...s.shift()})}off(e,t){let r=this.listeners.get(e);if(r){let n=this.listerHandlerMap.get(t);r.dispose(n)}}emit(e,...t){let r=this.listeners.get(e);if(r)r.fire({event:e,args:t});else{let n=this.cachedEventQueue.get(e);n||(n=new Gn,this.cachedEventQueue.set(e,n)),n.push({args:t})}}},ct={};Cn(ct,{None:()=>Wn,filter:()=>Qn,once:()=>lr,toPromise:()=>Yn});Wn=()=>{console.log("[Jolibox SDK] None Event")};it=Symbol.for("Jolibox.hostEmitter"),Xn=()=>{let e=new Q;return globalThis[it]||(globalThis[it]={on:e.on.bind(e),off:e.off.bind(e),emit:e.emit.bind(e)}),globalThis[it]},H=Xn();be=class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new me,this.onDidRegisterCommand=this._onDidRegisterCommand.event,console.log("[Jolibox SDK] command registry")}registerCommand(e){if(!e)throw new Error("invalid command");if(e.metadata&&Array.isArray(e.metadata.args)){let r=[];for(let s of e.metadata.args)r.push(s.constraint);let n=e.handler;e.handler=function(...s){return Zn(s,r),n(...s)}}let{id:t}=e;this._commands.get(t)&&console.info(`[Jolibox SDK] duplicated command is registered ${t}`),this._commands.set(t,e),this._onDidRegisterCommand.fire(t)}getCommand(e){return this._commands.get(e)}getCommands(){let e=new Map;for(let t of this._commands.keys()){let r=this.getCommand(t);r&&e.set(t,r)}return e}};be=qt([Yt],be);lt=class{constructor(){this._onWillExecuteCommand=new me,this.onWillExecuteCommand=this._onWillExecuteCommand.event,this._onDidExecuteCommand=new me,this.onDidExecuteCommand=this._onDidExecuteCommand.event,this.registry=new be,this._starActivation=null}_activateStar(){return this._starActivation||(this._starActivation=Pn(3e4)),this._starActivation}async executeCommand(e,...t){return this.registry.getCommand(e)?this._tryExecuteCommand(e,t):(await Promise.all([Promise.race([this._activateStar(),ct.toPromise(ct.filter(this.registry.onDidRegisterCommand,r=>r===e))])]),this._tryExecuteCommand(e,t))}executeCommandThowErr(e,...t){if(!this.registry.getCommand(e))throw new Error(`command '${e}' not found`);let r=this.registry.getCommand(e);this._onWillExecuteCommand.fire({commandId:e,args:t});let n=this.invokeFunction(r.handler,...t);return this._onDidExecuteCommand.fire({commandId:e,args:t}),n}_tryExecuteCommand(e,t){let r=this.registry.getCommand(e);if(!r)return Promise.reject(new Error(`command '${e}' not found`));try{this._onWillExecuteCommand.fire({commandId:e,args:t});let n=this.invokeFunction(r.handler,...t);return this._onDidExecuteCommand.fire({commandId:e,args:t}),Promise.resolve(n)}catch(n){return Promise.reject(n)}}invokeFunction(e,...t){let r=!1;try{return e(...t)}finally{r=!0}}};lt=qt([Yt],lt);at=Symbol.for("Jolibox.commands")});function A(e,t={}){ht.emit("ERROR_REPORT",{error:e,options:t})}var ht,ne,L=h(()=>{"use strict";v();v();ht=new Q,ne=new Q;A.debounce=pe(A,50,{leading:!0})});function Ee(e,t){return`[${e}]:${t}`}var se,gt,X=h(()=>{"use strict";L();v();L();se=(e,t)=>new fe(t?.errMsg??e.msg??"",e.code,e.type),gt=e=>new er(e)});var dr,ur,mr,pr=h(()=>{"use strict";dr=[],ur=[],mr=["env","createRequestTask","login"]});function hr(e,t){fr||(vt=new oe({eventName:"jolibox_invoke",tagNameOrder:["status","method","errNo","errMsg","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),yt=new oe({eventName:"jolibox_invoke_js2native",tagNameOrder:["status","method","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),bt=new oe({eventName:"jolibox_invoke_native2js",tagNameOrder:["status","method","isForeground"],metricName:"duration",reporter(s){e.invoke("track",JSON.stringify({event:"reportMetrics",data:s}),-1)}}),t("onJoliboxEnterBackground",()=>{vt.flush(),yt.flush(),bt.flush()}),fr=!0);function r(s){let{method:o,args:i,startTime:a,isForeground:d,errMsg:l=`${o}:fail no errMsg`,errNo:u=0,__timing:p={receiveJSInvoke:0,invokeCallback:0}}=s,{receiveJSInvoke:m,invokeCallback:f}=p,b=l.match(/\S:(\S+)\s?/)?.[1]??"fail";vt.report({status:b,method:n(o,i),errNo:`${u}`,errMsg:l,isForeground:d,duration:Date.now()-a}),a&&m&&f&&(yt.report({status:b,method:o,isForeground:d,duration:Number((m-a).toFixed(3))}),bt.report({status:b,method:o,isForeground:d,duration:Number((Date.now()-f).toFixed(3))}))}function n(s,o){return(s==="callHostMethod"||s==="callHostMethodSync")&&o?.method?`${s}-${o.method}`:s}return r}var ts,oe,fr,vt,yt,bt,Tt=h(()=>{"use strict";v();ts=e=>e==="pv"?e:"default",oe=class{constructor(t){this.interval=30;this.lastReportTime=0;this.cache={};let{reporter:r,interval:n=30,eventName:s,tagNameOrder:o,metricName:i,type:a}=t;this.reporter=r,this.interval=n,this.eventName=s,this.tagNameOrder=o,this.metricName=i,this.type=ts(a)}report(t){this.type==="pv"?this.addPVPoint(t):this.addPoint(t),this.tryReport(!1)}flush(){this.tryReport(!0)}tryReport(t){if(Object.keys(this.cache).length){if(t){this.reporter(this.processPoints(this.cache)),this.clearPoints();return}this.lastReportTime=this.lastReportTime||Date.now(),Date.now()-this.lastReportTime>=this.interval*1e3&&(this.reporter(this.processPoints(this.cache)),this.clearPoints(),this.lastReportTime=Date.now())}}addPoint(t){let r=(n,s,o,i)=>{let a=s.shift();if(a){let d=i[a];n[d]||(n[d]={}),r(n[d],s,o,i)}else n[o]||(n[o]=[]),n[o].push(i[o])};r(this.cache,[...this.tagNameOrder],this.metricName,t)}addPVPoint(t){let r=(s,o,i,a)=>{let d=o.shift();if(!d&&C(a))throw new Te(`report value failed to match tagNameOrder, ${JSON.stringify(n)}`);if(d){let l=[];if(C(a))l.push(...Object.keys(a));else if(te(a)){if(o.length>0)throw new Te(`report value failed to match tagNameOrder, ${JSON.stringify(n)}`);l.push(a)}else throw new Te(`expected metric value to be a string, but got a(n) ${typeof a}, ${JSON.stringify(n)}`);l.forEach(u=>{s[u]||(s[u]={});let p=C(a)?a[u]:a;r(s[u],[...o],i,p)})}else s[i]?s[i]++:s[i]=1},n={point:t,metricName:this.metricName,tagNameOrder:this.tagNameOrder};r(this.cache,[...this.tagNameOrder],this.metricName,t)}processPoints(t){return{eventName:this.eventName,tagNameOrder:this.tagNameOrder,metricName:this.metricName,metricAggregateType:this.type==="pv"?"itoa":"arr",data:t}}clearPoints(){this.cache={}}},fr=!1});function vr(e,t){let r=0,n=!0,s=new Map,o=hr(e,t);t("onJoliboxEnterBackground",()=>{n=!1}),t("onJoliboxEnterForeground",()=>{n=!0,kt.forEach(async({method:l,args:u,resolve:p})=>{let m=await a(l,u);p(m)}),kt.length=0});let i=(l,u)=>{P.info("----resolveId",l,u);let p=s.get(Number(l));if(!p)return;let m=de(u);p(m),s.delete(Number(l))},a=(l,u)=>{let p=Date.now(),m=`${n}`;r+=1;let f=new Y;if(s.set(r,f.resolve),!n&&ur.includes(l))return new Promise(x=>{kt.push({method:l,args:u,resolve:x})});let R={...{method:l,startTime:p,args:u,isForeground:m},invokeType:"js-bridge"},N=!rs&&dr.includes(l),z=$t(u,N),W=N?z:JSON.stringify(z),k;if(l.endsWith("Sync")||mr.includes(l)?k=e.call?.(l,z,r):typeof W=="string"?(console.log("-----params",l,r),k=e.invoke(l,W,r)):k=e.call?.(l,W,r),k){try{typeof k=="string"&&(k=JSON.parse(k)),k=de(k)}catch(x){P.error(x)}return s.delete(r),k.errorCode&&(k.errorCode=Ee(l,k.errorCode)),o({...R,...k}),k}return l.endsWith("Sync")&&s.delete(r),f.promise.then(x=>(x.errorCode&&(x.errorCode=Ee(l,x.errorCode)),o({...R,...x}),x))};return{invokeNative:a,applyNative:(l,u)=>{let p=a(l,u);return Wt(p)?p.then(m=>gr(l,m)):gr(l,p)},invokeHandler:i}}function gr(e,t){if(!C(t)){P.warn(`[Jolibox SDK]${e} no response value`);return}let{errMsg:r,errNo:n,errorType:s,errorCode:o,...i}=t;if(r&&r!==`${e}:ok`)throw new nr(r,n,s,o);return i}var kt,rs,yr=h(()=>{"use strict";ot();v();X();pr();Tt();kt=[],rs=!1});function br(e){let t=new Q,r=new oe({eventName:"jolibox_publish",tagNameOrder:["type","event"],metricName:"duration",reporter(n){e.invoke("track",JSON.stringify({event:"reportMetrics",data:n}),-1)}});return t.on("onJoliboxEnterBackground",()=>{r.flush()}),{onNative:t.on.bind(t),offNative:t.off.bind(t),subscribeHandler(n,s,o){let i=de(s),a;if(i.__extra){a=i.params;let{type:d,startTime:l}=i.__extra;r.report({type:d,event:n,duration:Date.now()-l})}else a=i;t.emit(n,a,o)}}}var Tr=h(()=>{"use strict";v();ot();Tt()});function Et(e){let{subscribeHandler:t,onNative:r,offNative:n}=br(e),{invokeNative:s,invokeHandler:o,applyNative:i}=vr(e,r);return{invokeHandler:o,subscribeHandler:t,applyNative:i,invokeNative:s,onNative:r,offNative:n}}var kr=h(()=>{"use strict";yr();Tr()});var Er=h(()=>{"use strict"});var Sr=h(()=>{"use strict";kr();Er()});var Z,j,Ir,wr=h(()=>{"use strict";v();L();j={trigger(){},exit(){return!1},onReady(e){j.trigger=e},doExit(e){j.exit=e}},Ir=()=>{let e=window.prompt("invoke",JSON.stringify({event:"envSync",paramsString:JSON.stringify({})}));if(!e)A(new rr("native env failed"));else{let{data:t}=JSON.parse(e);return t??void 0}};if(window.webkit){let e=window.webkit.messageHandlers,t=(s="")=>{j.trigger(),e.onDocumentReady.postMessage({path:s})};Z={onDocumentReady:t,doExit:s=>{let o=j.exit();e.doExit.postMessage({uuid:s,shouldInterrupt:o})},invoke(s,o,i){e.invoke.postMessage({event:s,paramsString:o,callbackId:i})},call(s,o,i){let a=window.prompt("invoke",JSON.stringify({event:s,paramsString:JSON.stringify(o),callbackId:i}));if(a)return JSON.parse(a)}};let n={onDocumentReady:t,env:Ir};globalThis.joliboxJSCore={...n}}if(window.JoliAndroidSDKBridge){let e=window.JoliAndroidSDKBridge,t=(s="")=>{j.trigger(),e.onDocumentReady(JSON.stringify({path:s}))};Z={onDocumentReady:t,invoke(s,o,i){e.invoke(JSON.stringify({event:s,paramsString:o,callbackId:i}))},doExit:s=>{let o=j.exit();e.doExit(JSON.stringify({uuid:s,shouldInterrupt:o}))},call(s,o,i){let a=window.prompt("invoke",JSON.stringify({event:s,paramsString:JSON.stringify(o),callbackId:i}));if(a)return JSON.parse(a)}};let n={onDocumentReady:t,env:Ir};globalThis.joliboxJSCore={...n}}});function St(e,t){return{params:e,__extra:{startTime:Date.now(),type:t}}}var It=h(()=>{"use strict"});function wt(){globalThis.onmessage=function(e){e.data==="msg:setup"&&([ie]=e.ports,ie.onmessage=function(t){let r=JSON.parse(t.data);r[0]==="publish"?globalThis.ttJSBridge.subscribeHandler(r[1],r[2]):r[0]==="invoke"&&globalThis.ttJSBridge.invokeHandler(r[1],r[2])},ie.publish=function(t,r){let n=St(r,"messagePort");ie.postMessage(JSON.stringify(["publish",t,JSON.stringify(n)]))},ie.postMessage("msg:setup:ok"))}}var ie,_r=h(()=>{"use strict";It()});var Se=h(()=>{"use strict";wr();_r();It()});var Ar,ns,xr,Rr,O,I,V,Ei,ss,D=h(()=>{"use strict";Sr();Se();X();v();Se();Ar=Z;if(!Ar)throw new sr("No joliboxJScore is found, native bridge not found.");wt();ns={...Ar},xr=Et(ns),{invokeHandler:Rr}=xr,{applyNative:O,invokeNative:I,onNative:V,offNative:Ei,subscribeHandler:ss}=xr;globalThis.joliboxJSBridge={callHandler:Rr,invokeHandler:Rr,subscribeHandler:ss}});var _t,Cr,Pr=h(()=>{"use strict";v();L();_t=e=>{let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.length%4===0?"":"=".repeat(4-t.length%4),n=atob(t+r);try{return JSON.parse(n)}catch{return{}}},Cr=e=>{try{let n=new URL(e).searchParams.get("joliSource")?.split(".");if(n?.length){let[s,o,i]=n;return{headerJson:_t(s),payloadJson:_t(o),signature:_t(i)}}else throw"joli_source is missing"}catch(t){return A(new tr(`${e} not a valid schema: ${t}`)),{headerJson:{},payloadJson:{},signature:{}}}}});var os,Ie,Nr,Rt=h(()=>{"use strict";v();os="1.1.4-beta.17",Ie=()=>os,Nr=()=>{let e=Ie();return`${cr(e)}`}});var is,as,U,cs,y,B=h(()=>{"use strict";v();Pr();Rt();v();is={deviceInfo:{brand:"UnknownBrand",model:"UnknownModel",did:ft(),pixelRatio:window.devicePixelRatio||1,platform:"h5",system:"UnknownSystemVersion",lang:"zh"},sdkInfo:{nativeSDKVersion:"",jssdkVersion:Ie()},schema:window.location.href,platform:"h5"},as=globalThis.joliboxJSCore?.env,U=Object.assign({},as?.()??is),cs=()=>{let{payloadJson:e,headerJson:t}=U.schema.length?Cr(U.schema):{},r=`${U.deviceInfo.did}-${new Date().getTime()}`,s=new URL(U.schema.length?U.schema:window.location.href).searchParams,o=s.get("mpId")??s.get("appId")??s.get("gameId")??"",i=e?.sessionId??s.get("sessionId")??r,a=!!(e?.testAdsMode??s.get("testAdsMode")==="true"),d=e?.joliboxEnv??s.get("joliboxEnv")??"production",l=d==="staging",u=t?.channel;return{get testMode(){return l},get testAdsMode(){return a},get joliboxEnv(){return d},get joliSource(){return s.get("joliSource")??null},get mpId(){return o??e?.id??""},get mpVersion(){return t?.ver??Ie()},get platform(){return U.platform},get deviceInfo(){return U.deviceInfo},get sdkInfo(){return U.sdkInfo},get hostInfo(){return U.hostInfo},get hostUserInfo(){return U.hostUserInfo},get sessionId(){return U.clientSessionId??i??r},get channel(){return u},onEnvConfigChanged:p=>{Qt(U,p,Xt)}}},y=cs()});var At,Fr,ls,ds,Or,us,Dr=h(()=>{"use strict";v();L();B();v();At=!1,Fr=(e,t)=>e==null?!1:t in e,ls=e=>Fr(e,"kind"),ds=e=>{let t=e.toLowerCase().split("_");return t[0]+t.slice(1).map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join("")},Or=(e,t={},r)=>{let s={...{user_id:y.hostUserInfo?.uid??"",device_id:y.deviceInfo.did??"",timestamp:Date.now(),tag:ds(e.name)},env:t.environment,isFromUser:r};r?ne.emit("GLOBAL_USER_ERROR",e,s):ne.emit("GLOBAL_ERROR",e,s)},us=e=>Fr(e,"kind")&&e.kind==="USER_ERROR";ht.on("ERROR_REPORT",({error:e,options:t})=>{if(At)return;At=!0;let r=ls(e)&&e.raw?e.raw:e;try{let n=us(e);Or(e,t,n)}catch(n){let s=n instanceof Error?n.message:String(n),o=new ut(`${s}, origin error: ${r.message}`);P.error(o),Or(new ut(o.message),{environment:t.environment},!1)}finally{At=!1}})});var Ur=h(()=>{"use strict";Dr();X();v();D();ne.on("GLOBAL_ERROR",(e,t)=>{let r={message:e.message,stack:e.stack??"",errorType:e.name,source:0};I("trackAsync",{event:"reportJsError",data:r})});ne.on("GLOBAL_USER_ERROR",(e,t)=>{P.log("UserError",e,t)})});var xt=h(()=>{"use strict"});function Mr(e,t){let r=(n,s,o)=>{let i={tag:n,...t,extra:{...s}};n=="globalJsError"?A(new or(JSON.stringify(i))):e("systemLog",i,o)};return r.debounce=pe(r,500,{leading:!0}),r}function Lr(e){let t=(r,n,s)=>{let o=(s&&JSON.stringify(s))??0,i={speed_value_type:r,total_duration:n};o&&Object.assign(i,{extra:o}),e("joliboxSpeedAnalysis",i)};return t.debounce=pe(t,500,{leading:!0}),t}var jr=h(()=>{"use strict";v();v();L()});function Br(e,t){let r=Mr(e,t),n=Lr(r);return{track:r,trackPerformance:n}}var Jr=h(()=>{"use strict";jr()});var Vr=h(()=>{"use strict";B();v();v()});var $r=h(()=>{"use strict";Jr();xt();Vr()});var we,Hr=h(()=>{"use strict";we=class{constructor(t,r){this.eventEmitter=t;this.lastReportTime=0;this.visible=!0;this.timer=this.createRAFTimer(t=>{this.reporter({event:"PLAY_GAME",params:{duration:t}}),this.tracker("PlayGame",{duration:t})});this.interval=r??5*1e3,t.on("visible",n=>{this.visible=n})}start(t){this.reporter({event:"OPEN_GAME",params:{timestamp:Date.now(),duration:t??0}}),this.tracker("OpenGame",{duration:t??0}),this.timer.start()}close(t){this.reporter({event:"CLOSE_GAME",params:{timestamp:Date.now(),duration:t}}),this.tracker("CloseGame",{duration:t}),this.timer.stop()}createRAFTimer(t){let r=Date.now(),n,s,o=!1,i=0,a=()=>{if(!o)return;let f=Date.now(),b=f-r;b>=this.interval&&(this.visible&&(i+=b,t(i)),r=f),n=requestAnimationFrame(a)},d=()=>{u(),r=Date.now(),s=window.setInterval(()=>{if(!o)return;let f=Date.now();f-r>=this.interval&&(r=f)},this.interval)},l=()=>{p(),r=Date.now(),n=requestAnimationFrame(a)},u=()=>{n&&(cancelAnimationFrame(n),n=0)},p=()=>{s&&(clearInterval(s),s=0)};this.eventEmitter.on("visible",f=>{o&&(console.log("visible",f),f?l():d())});let m=this.visible;return{start(){o||(o=!0,m?l():d())},stop(){o=!1,u(),p()}}}}});var Ct=h(()=>{"use strict"});function qr(e,t,r){let{response:n,startTime:s,endTime:o,requestFrom:i}=r,{errMsg:a="",profile:d={}}=n,u={duration:o-s,request_type:e,url:t.split("?")[0],result:r.state,error_msg:r.state==="fail"?a:"",socket_reused:d.socketReused?1:0,request_from:i};(i==="public"&&Kr<ps||i==="inner")&&(u.joli_request_number=Kr++,setTimeout(()=>{M("joliboxNetRequestResult",u)},500))}var Kr,ps,Gr=h(()=>{"use strict";Ct();ee();Kr=0,ps=10});function _e(e,t,r){let n=new Map,s=r?.baseUrl??"https://api.jolibox.com",o=r?.type??"public",i=r?.defaultHeaders??{};return V("onRequestTaskStateChange",d=>{if(typeof d.requestTaskId!="string")return;let l=n.get(d.requestTaskId);if(l)if(d.state==="success"){let{requestTaskId:u,state:p,...m}=d;l.resolve(m),n.delete(u)}else if(d.state==="fail"){let{requestTaskId:u,state:p,...m}=d;l.reject(m),n.delete(u)}else P.warn("onRequestTaskStateChange unknown event",d)}),H.on("onLoginComplete",({isLogin:d,token:l})=>{d&&l&&(i["X-JOLI-TOKEN"]=l)}),async(d,l={})=>{let u=Date.now(),p=fs(d,{...l,baseUrl:s}),{method:m="GET",responseType:f="text",dataType:b="json",timeout:R,enableCache:N=!1,appendHostCookie:z=!0}=l,W=Object.assign({"content-type":"application/json"},i,l.header),k={url:p,method:m,header:W,enableCache:N,responseType:f,appendHostCookie:z};if(m=="POST"||m=="PUT"){let J=gs(l.data,W["content-type"]);k.data=J}R&&Object.assign(k,{timeout:R});let{data:{requestTaskId:x}}=I(e,k);if(typeof x!="string")throw se({code:-1,msg:"requestTaskId is not a string"});let le=(J,$)=>{qr("request",p,{state:J,startTime:u,endTime:Date.now(),params:k,response:$,requestId:x,requestFrom:o=="public"?"public":"inner"})},{resolve:st,reject:pn,promise:fn}=new Y;n.set(x,{resolve:st,reject:pn});try{let J=await fn;le("success",J);let{data:$}=J;return b==="json"&&typeof $=="string"&&($=hs($)),{url:p,timeout:R,method:m,response:{...J,data:$}}}catch(J){let $=J;if(C($)){let{errMsg:he,prefetchDetail:hn,isPrefetch:gn,errNo:vn}=$;te(he)&&(le("fail",{errMsg:he,isPrefetch:gn,prefetchDetail:hn}),A(se({code:-1,msg:he},{errNo:vn,errMsg:he})))}throw J}}}function hs(e){try{return JSON.parse(e.trim())}catch{return e}}function gs(e,t="application/json"){let r=t.toLowerCase();return e===void 0?"":typeof e=="string"||e instanceof ArrayBuffer?e:r.includes("application/x-www-form-urlencoded")||r.includes("application/json")||typeof e=="object"?JSON.stringify(e):String(e)}var fs,Pt=h(()=>{"use strict";v();Gr();Ct();D();L();X();fs=(e,t)=>{if(/^https?:\/\//.test(e))return e;let r=t?.query,s=new URLSearchParams(r).toString();return t?.baseUrl?`${t.baseUrl}${e}${s?`?${s}`:""}`:`${e}${s?`?${s}`:""}`}});var Nt,K,Re=h(()=>{"use strict";Rt();Pt();B();Nt={"x-user-agent":Nr()};y.hostUserInfo?.token&&(Nt["x-joli-token"]=y.hostUserInfo.token);y.joliSource&&(Nt["x-joli-source"]=y.joliSource);K=_e("createRequestTaskSync","operateRequestTaskSync",{type:"inner",baseUrl:y.testMode?"https://stg-api.jolibox.com":"https://api.jolibox.com",defaultHeaders:Nt})});var Ae,zr=h(()=>{"use strict";B();Hr();Re();D();Ae=class extends we{constructor(t,r,n){super(r,n),this.gameId=y.mpId,this.sessionId=y.sessionId,this.track=t}async reporter(t){let{event:r,params:n}=t,s=[];s.push(K("/api/base/app-event",{method:"POST",data:{eventType:r,gameInfo:{gameId:this.gameId,sessionId:this.sessionId,...n}}})),await Promise.all(s)}async reportToNative(t){let{event:r,params:n}=t;await O("userTrackAsync",{event:r,params:{...n},gameId:this.gameId})}tracker(t,r=null){this.track(t,r)}}});var vs,M,ys,Wr,xe,F,ee=h(()=>{"use strict";Ur();v();xt();$r();B();zr();D();vs=(e,t,r)=>{let n=t,o={...C(n.extra)?n.extra:te(n.extra)?JSON.parse(n.extra):{},mp_id:n.mp_id??"",mp_version:n.mp_version??""};I("trackAsync",{event:e,data:o,webviewId:r})},{track:M,trackPerformance:ys}=Br(vs,{type:pt.AppSDK,platform:"native",jssdk_version:y.sdkInfo?.jssdkVersion??"1.0.0",mp_id:y.mpId,mp_version:y.mpVersion}),Wr=w();Wr.registerCommand("ReportSDK.traceSystemTimeline",({event:e,duration:t})=>{ys(e,t)});Wr.registerCommand("ReportSDK.traceSystem",({event:e,info:t})=>{M(e,t)});xe=new Q,F=new Ae(M,xe)});function Qr(e){let t=mt.config[e];return t||(t={},mt.config[e]=t),(r,n)=>{if(t[r]){P.warn(`[can i use] ${r} already registered`);return}t[r]={...n}}}var Xr=h(()=>{"use strict";v()});function Ot(e){Zr=e}function Pe(e){return e===null||typeof e!="object"?e:Array.isArray(e)?e.map(t=>Pe(t)):Object.keys(e).reduce((t,r)=>(t[r]=Pe(e[r]),t),{})}function q(e){return typeof e=="number"}function Ft(e){let t=Dt(e);switch(t){case"string":return`"${e}"`;case"number":case"boolean":case"null":case"undefined":return String(e);default:return`a(n) ${t}`}}function Dt(e){return typeof e=="function"?"function":Object.prototype.toString.call(e).slice(8).slice(0,-1).toLowerCase()}var Zr,E,Ne,Oe,Fe,De,ae,Ue,Me,Le,je,Be,Je,Ve,$e,He,Ke,qe,Ge,Ut=h(()=>{"use strict";Zr=!1;E=class{constructor(){this.errors=[];this.hasFallback=!1;this.hasDefault=!1;this._optional=!1}fail(t){if(Zr)if(typeof t=="string")this.errors.push(t);else{let r=`${this.path} should be ${t.expect}`;this._optional&&t.expect!=="undefined"?r+=" or undefined, ":r+=", ",r+=`but got ${Ft(t.actual)}`,this.errors.push(r)}return!1}fallback(t){return this.hasFallback=!0,this._fallback=t,this}get fallbackValue(){return Pe(this._fallback)}default(t){return this.hasDefault=!0,this._default=t,this}get defaultValue(){return typeof this._default=="function"?this._default:Pe(this._default)}optional(){return this._optional=!0,this}};Ne=class extends E{validate(t){return this._optional&&t===void 0?!0:q(t)?q(this._min)&&t<this._min?this.fail(`the value of ${this.path} should be greater than or equal to ${this._min}`):q(this._max)&&t>this._max?this.fail(`the value of ${this.path} should be less than or equal to ${this._max}`):q(this._greater)&&t<=this._greater?this.fail(`the value of ${this.path} should be greater than ${this._greater}`):this._isInt&&t!==Math.floor(t)?this.fail(`the value of ${this.path} should be integer but got ${t}`):!0:this.fail({expect:"number",actual:t})}min(t){return this._min=t,this}max(t){return this._max=t,this}isInt(t){return this._isInt=t,this}greater(t){return this._greater=t,this}},Oe=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="boolean"?this.fail({expect:"boolean",actual:t}):!0}},Fe=class extends E{validate(t){if(this._optional&&t===void 0)return!0;if(typeof t!="string")return this.fail({expect:"string",actual:t});if(q(this._maxLength)&&t.length>this._maxLength)return this.fail(`the length of ${this.path} should be less than or equal to ${this._maxLength}`);if(q(this._minLength)&&t.length<this._minLength)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minLength}`);if(typeof this._pattern=="string"){if(!new RegExp(this._pattern).test(t))return this.fail(`${this.path} should match pattern "${this._pattern}"`)}else if(this._pattern&&!this._pattern.test(t))return this.fail(`${this.path} should match pattern "${this._pattern.toString()}"`);return!0}minLength(t){return this._minLength=t,this}maxLength(t){return this._maxLength=t,this}pattern(t){return this._pattern=t,this}},De=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="symbol"?this.fail({expect:"symbol",actual:t}):!0}},ae=class extends E{validate(t){return!0}},Ue=class extends E{validate(t){return t!==void 0?this.fail({expect:"undefined",actual:t}):!0}},Me=class extends E{validate(t){return this._optional&&t===void 0?!0:t!==null?this.fail({expect:"null",actual:t}):!0}},Le=class extends E{validate(t){return this._optional&&t===void 0?!0:typeof t!="function"?this.fail({expect:"function",actual:t}):!0}},je=class extends E{constructor(...t){super(),this._items=t}validate(t){if(this._optional&&t===void 0)return!0;if(!this._items.includes(t)){let r=this._items.map(n=>JSON.stringify(n)).join(", ");return this.fail(`expect ${this.path} to be one of ${r}, but got ${Ft(t)}`)}return!0}},Be=class extends E{constructor(r){super();this._item=r}validate(r){if(this._optional&&r===void 0)return!0;if(!Array.isArray(r))return this.fail({expect:"array",actual:r});if(q(this._minItems)&&r.length<this._minItems)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minItems}`);if(q(this._maxItems)&&r.length>this._maxItems)return this.fail(`the length of ${this.path} should be less than or equal to ${this._maxItems}`);if(q(this._length)&&r.length!==this._length)return this.fail(`the length of ${this.path} should be equal to ${this._length}`);let n=this._item;if(!n)return!0;let s=!0;if(r.forEach((o,i)=>{if(n.path=`${this.path}[${i}]`,n.errors=this.errors,o===void 0&&n.hasDefault){r[i]=n.defaultValue;return}n.validate(o)||(n.hasFallback?r[i]=n.fallbackValue:s=!1)}),this._uniqueItems){let o=new Map;for(let i in r)o.has(r[i])?s=this.fail(`${this.path} should NOT have duplicate items (${this.path}[${o.get(r[i])}] and ${this.path}[${i}] are identical)`):o.set(r[i],i)}return s}minItems(r){return this._minItems=r,this}maxItems(r){return this._maxItems=r,this}uniqueItems(){return this._uniqueItems=!0,this}length(r){return this._length=r,this}},Je=class extends E{constructor(r){super();this._value=r}validate(r){if(this._optional&&r===void 0)return!0;if(Dt(r)!=="object")return this.fail({expect:"object",actual:r});let s=r,o=this._value;o.errors=this.errors;let i=!0;for(let a in s){let d=s[a];if(/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/.test(a)?o.path=`${this.path}.${a}`:o.path=`${this.path}["${a}"]`,!(d===void 0&&o._optional)){if(d===void 0&&o.hasDefault){s[a]=o.defaultValue;continue}o.validate(d)||(o.hasFallback?s[a]=o.fallbackValue:i=!1)}}return i}},Ve=class extends E{constructor(r={}){super();this._object=r}validate(r){if(this._optional&&r===void 0)return!0;if(Dt(r)!=="object")return this.fail({expect:"object",actual:r});let n=r,s=!0;for(let o in this._object){let i=n[o],a=this._object[o];if(a.errors=this.errors,/^[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*$/.test(o)?a.path=`${this.path}.${o}`:a.path=`${this.path}["${o}"]`,!(a._optional&&i===void 0)){if(i===void 0&&a.hasDefault){n[o]=a.defaultValue;continue}a.validate(i)||(a.hasFallback?n[o]=a.fallbackValue:s=!1)}}return s}},$e=class extends E{constructor(r){super();this.value=r}validate(r){return r===void 0&&this._optional?!0:r!==this.value?this.fail({expect:Ft(this.value),actual:r}):!0}},He=class extends E{constructor(...t){super(),this._items=t}validate(t){if(t===void 0&&this._optional)return!0;let r=[],n=!1,s=this._items.length;for(let o=0;o<s;o++){let i=this._items[o];if(i.errors=[],i.path=this.path,!i.validate(t))r.push(i.errors.join("; "));else if(!n){n=!0;break}}if(!n){let o=r.join(`
|
|
2
|
+
or `);this.errors.push(o)}return n}},Ke=class extends E{constructor(...t){super(),this._items=t;let r=0,n=t.length-1;for(;n>=0;n--){let s=t[n];if(s._optional||s.hasDefault)r+=1;else break}this._minItems=t.length-r}validate(t){if(t===void 0&&this._optional)return!0;if(!Array.isArray(t))return this.fail({expect:"array",actual:t});if(t.length<this._minItems)return this.fail(`the length of ${this.path} should be greater than or equal to ${this._minItems}`);let r=!0;return this._items.forEach((n,s)=>{if(n.path=`${this.path}[${s}]`,n.errors=this.errors,t[s]===void 0&&n.hasDefault){t[s]=n.defaultValue;return}n.validate(t[s])||(n.hasFallback?t[s]=n._fallback:r=!1)}),r}},qe=class extends E{validate(t){return t===void 0&&this._optional||t instanceof ArrayBuffer?!0:this.fail({expect:"arraybuffer",actual:t})}},Ge=class extends E{constructor(t){super(),this._ctor=t}validate(t){return t===void 0&&this._optional||t instanceof this._ctor?!0:this.fail({expect:`typedarray of ${this._ctor.name}`,actual:t})}}});function Mt(e,t,r="param"){if(e.errors=[],e.path=r,Ot(!0),!e.validate(t)){let n=e.errors.join(`
|
|
3
|
+
`);throw e.errors.length=0,Ot(!1),new TypeError(n)}}var c,Lt=h(()=>{"use strict";Ut();Ut();c={object(e){return new Ve(e)},array(e){return new Be(e)},tuple(...e){return new Ke(...e)},literal(e){return new $e(e)},or(...e){return new He(...e)},symbol(){return new De},record(e){return new Je(e)},function(){return new Le},boolean(){return new Oe},string(){return new Fe},number(){return new Ne},undefined(){return new Ue},null(){return new Me},unknown(){return new ae},any(){return new ae},as(){return new ae},arraybuffer(){return new qe},enum(...e){return new je(...e)},typedarray(e){return new Ge(e)}}});var ze,en,tn=h(()=>{"use strict";v();L();Lt();X();ze=1,en=e=>{function t(n,s){return(...o)=>{let i=Date.now(),a={method:n,trace_id:ze};ze+=1;let d="SUCCESS",l=`${n}:ok`,u=0;try{if(s.paramsSchema)try{Mt(s.paramsSchema,o,"params")}catch(b){throw gt(`${n}:fail ${b.message}`)}let p=s.implement(...o),m=p,f=`${n}:ok`;if(p&&"code"in p){let{code:b,data:R,message:N}=p;d=b,m=R,f=N}return{code:d,message:f,data:m}}catch(p){let m=p;u=m.code??m.errNo??2e3,d="FAILURE";let f=m.message??m.errMsg??`${p}`;return l=`${n}:${d} ${f.replace(/^\S+:(fail|cancel)\s?/,"")}`,A(new fe(l,u)),{code:d,message:l}}finally{let p=Date.now()-i;e("apiInvoked",{...a,duration:p,status:d})}}}function r(n,s){return async(...o)=>{let i=Gt(o)?o:[o],a=Date.now(),d={method:n,trace_id:ze};ze+=1;let l=`${n}:ok`,u="SUCCESS",p={code:u,message:l};try{if(s.paramsSchema)try{Mt(s.paramsSchema,i,"params")}catch(b){throw gt(b.message)}let f=await s.implement(...i);if(f&&"code"in f){let{code:b,data:R,message:N}=f;u=b,l=N,f=R}return Object.assign(p,{code:u,message:l,data:f}),p}catch(m){let f=m,b=f.code??f.errNo??2e3;u="FAILURE";let R=f.message??f.errMsg??`${m}`,N=`${n}:${u} ${R.replace(/^\S+:(fail|cancel)\s?/,"")}`;return Object.assign(p,{code:u,message:N}),A(new fe(N,b)),p}finally{let m=Date.now()-a;e("apiInvoked",{...d,duration:m,status:u})}}}return{createAPI:r,createSyncAPI:t}}});var S,_,g,G=h(()=>{"use strict";Xr();ee();tn();Lt();({createAPI:S,createSyncAPI:_}=en(M)),g=Qr("native")});var sn=Sn(nn=>{"use strict";v();G();L();D();ee();var _s="exitGame",Rs="onReady",As="onJoliboxShow",xs="onJoliboxHide",We=w(),Ye=ke(A),Cs=S(_s,{paramsSchema:c.tuple(c.function()),implement:async e=>{Ye(e).call(nn),await O("exitAppAsync")}}),Ps=_(As,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);V("onJoliboxEnterForeground",()=>{t.call(this),xe.emit("visible",!0)})}}),Ns=_(xs,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);V("onJoliboxEnterBackground",()=>{t.call(this),xe.emit("visible",!1)})}}),Os=_(Rs,{paramsSchema:c.tuple(c.function()),implement(e){let t=Ye(e);H.on("LifecycleEvent.onReady",r=>{t(r)})}});We.registerCommand("LifecycleSDK.exit",Cs);We.registerCommand("LifecycleSDK.onReady",Os);We.registerCommand("LifecycleSDK.onJoliboxShow",Ps);We.registerCommand("LifecycleSDK.onJoliboxHide",Ns);g("lifeCycle.exit",{version:"1.0.0"});g("lifeCycle.onReady",{version:"1.0.0"});g("lifeCycle.onJoliboxShow",{version:"1.0.0"});g("lifeCycle.onJoliboxHide",{version:"1.0.0"})});D();Se();B();v();ee();j.onReady(()=>{});j.doExit(()=>(M("onBeforeExit",{timestamp:Date.now()}),F.close(Date.now()-Ce),!1));function bs(){H.on("onDocumentReady",()=>{Z?.onDocumentReady(window.location.href),M("onDocumentReady",{start_timestamp:Ce,timestamp:Date.now()})})}function Ts(){V("onJoliboxServiceReady",({runtimeInfo:e,loadDuration:t})=>{e&&y.onEnvConfigChanged({hostUserInfo:e}),H.emit("LifecycleEvent.onReady",{...y.hostUserInfo?y.hostUserInfo:{isLogin:!1}}),M("joliboxServiceReady",{start_timestamp:Ce,timestamp:Date.now()}),F.start(t)}),V("onBeforeExit",({uuid:e})=>{Z?.doExit(e)})}var Ce;function Yr(){Ce=Date.now(),Ts(),bs()}v();G();D();var rn=w(),Es="env",Ss="getSystemInfoSync",Is=_(Ss,{implement:()=>{let e=I("envSync"),{data:t}=e;return{system:t.deviceInfo.system,platform:t.deviceInfo.platform,version:t.sdkInfo.jssdkVersion,pixelRatio:t.deviceInfo.pixelRatio,language:t.deviceInfo.lang,brand:t.deviceInfo.brand,appName:t.hostInfo?.appName,SDKVersion:t.sdkInfo.jssdkVersion}}}),ws=_(Es,{implement:()=>I("envSync")?.data??void 0});rn.registerCommand("API.getSystemInfoSync",Is);rn.registerCommand("API.env",ws);g("env",{version:"1.0.0"});g("getSystemInfoSync",{version:"1.0.0"});var Il=wn(sn());X();Pt();G();v();function on(e){let t={};if(!C(e))return t;for(let[r,n]of Object.entries(e)){let s=r.toLocaleLowerCase();n?typeof n=="object"?t[s]=Object.prototype.toString.call(n):t[s]=String(n):t[s]=""}return t}function an(e="GET"){if(e==="")return"POST";let t=e.toUpperCase();return["GET","OPTIONS","HEAD","POST","PUT","DELETE","TRACE","CONNECT","PATCH"].includes(t)?t:"GET"}function cn(e,t=!1){if(e)return t||e>0&&e<=6e4?Math.ceil(e):6e4}function ln(e,t,r){if(["POST","PUT","PATCH"].includes(t)||!C(r))return e;let[n,s=""]=e.split("?"),o=JSON.stringify({...JSON.parse(s),...r});return`${n}?${o}`}v();L();var Fs=15,Ds=_e("createRequestTaskSync","operateRequestTaskSync",{type:"public"}),jt=0,Bt=[],dn=ke(A),Us=(e,t)=>{let r=e.filter(t),n=e.filter(s=>!t(s));return e.length=0,e.push(...n),r},Ms=e=>{let t=new Y,r=()=>{};return S("request",{paramsSchema:c.tuple(c.object({url:c.string(),method:c.string(),header:c.object(),data:c.object().optional(),query:c.object().optional(),dataType:c.string().default("json"),responseType:c.string().default("text"),enableCache:c.boolean().default(!1),appendHostCookie:c.boolean().default(!0),timeout:c.number().default(3e4),success:c.function(),fail:c.function()})),implement(s){let o=async()=>{let i=dn(s.fail);try{if(jt+=1,t.state!=="pending")return;let{data:a,dataType:d,responseType:l,enableCache:u,appendHostCookie:p}=s,m=on(s.header),f=an(s.method),b=cn(s.timeout),R=ln(s.url,f,a),N=dn(s.success),z=Object.assign({},s,{method:f,header:m,data:f==="GET"||f==="HEAD"?void 0:a,enableCache:u,query:s.query??{},dataType:d,responseType:l,appendHostCookie:p});b&&(z.timeout=b);let W=Ds(R,z);{let{response:k}=await W,{code:x,data:le,message:st}=k;t.resolve({code:x??"SUCCESS",data:le,message:st??"request:ok"}),N({code:"SUCCESS",message:"request:ok",data:le})}}catch(a){t.reject(a),i({code:"FAILURE",message:"httpRequst: failed"})}finally{jt-=1,Bt.shift()?.()}};return jt>=Fs?(r=()=>{Us(Bt,i=>i===o)},Bt.push(o)):o(),t.promise}})(e),{abort(){t.reject(se({code:-1,msg:"request:fail abort"})),r()}}},Ls=w();Ls.registerCommand("HttpSDK.request",Ms);g("request",{version:"1.0.0"});G();D();v();Re();B();var Qe=w(),js=S("getLocalStorage",{paramsSchema:c.tuple(c.string()),async implement(e){let{response:t}=await K(`/api/games/user-storage/${y.mpId}`,{method:"GET",responseType:"json",appendHostCookie:!0,query:{key:e}}),{data:{code:r,message:n,data:s}}=await t;if(r==="SUCCESS")return{code:r,message:n,data:s?.value};try{let{data:{data:o,dataType:i}}=await O("getLocalStorageAsync",{key:e}),a=Ks(o,i);return{code:r,message:`${n}. fallback to native`,data:a}}catch{return{code:"INTERNAL_ERROR",message:"[Jolibox SDK] get local storage failed",data:null}}}});Qe.registerCommand("StorageSDK.getItem",js);g("storage.getItem",{version:"1.0.0",properties:{key:"1.0.0",value:"1.0.0"}});var Bs=S("setStorage",{paramsSchema:c.tuple(c.string(),c.or(c.string(),c.boolean(),c.number())),async implement(e,t){let r=y.mpId,n=typeof t=="string"?t:String(t),{response:s}=await K(`/api/games/user-storage/${r}`,{method:"POST",responseType:"json",appendHostCookie:!0,data:{key:e,value:n}}),{data:{code:o,message:i}}=s,a=Hs(t),d=qs(t,a);return await O("setLocalStorageAsync",{key:e,data:d,dataType:a}),o=="SUCCESS"?{code:o,message:i}:{code:o,message:`${i}. fallback to native`}}});Qe.registerCommand("StorageSDK.setItem",Bs);g("storage.setItem",{version:"1.0.0",properties:{key:"1.0.0",value:"1.0.0"}});var Js=S("removeStorage",{paramsSchema:c.tuple(c.string()),async implement(e){let t=y.mpId,{response:r}=await K(`/api/games/user-storage/${t}/remove`,{method:"POST",responseType:"json",appendHostCookie:!0,data:{key:e}}),{data:{code:n,message:s}}=r;return await O("removeLocalStorageAsync",{key:e}),n==="SUCCESS"?{code:n,message:s}:{code:n,message:"[Jolibox SDK] remove item succ"}}});Qe.registerCommand("StorageSDK.removeItem",Js);g("storage.removeItem",{version:"1.0.0",properties:{key:"1.0.0"}});var Vs=S("clearStorage",{async implement(){let e=y.mpId,{response:t}=await K(`/api/games/user-storage/${e}/clear`,{method:"POST",appendHostCookie:!0});O("clearLocalStorageAsync");let{data:{code:r,message:n}}=t;return r==="SUCCESS"?{code:r,message:n}:{code:r,message:`${n}.fallback to native`}}});Qe.registerCommand("StorageSDK.clear",Vs);g("storage.clear",{version:"1.0.0"});var Bc=S("getStorageInfo",{async implement(){let{data:e}=await O("getStorageInfoAsync");return e}});g("getStorageInfo",{version:"1.0.0",success:{keys:"1.0.0",currentSize:"1.0.0",limitSize:"1.0.0"}});var Jc=_("getStorageInfoSync",{implement(){return I("getStorageInfoSync")}}),$s=["string","number","boolean","object",""];function Hs(e){let t=Object.prototype.toString.call(e).split(" ")[1].split("]")[0].toLocaleLowerCase();return $s.includes(t)?t:""}function Ks(e,t){try{switch(t){case"string":return e;case"object":return JSON.parse(e);case"number":return parseFloat(e);case"boolean":return e==="true";default:return""}}catch{return""}}function qs(e,t){try{switch(t){case"string":case"number":case"boolean":return`${e}`;case"object":return JSON.stringify(e);default:return""}}catch{return""}}v();D();G();var Gs=_("showKeyboard",{paramsSchema:c.tuple(c.object({defaultValue:c.string().optional().default(""),multiple:c.boolean().optional().default(!1),maxLength:c.unknown().optional().default(1e5)})),implement(e){let t=Math.floor(Number(e.maxLength)??1e5),{defaultValue:r}=e;r&&t&&(r=r.slice(0,t)),I("showKeyboardSync",{...e,defaultValue:r,maxLength:t})}});g("keyboard.showKeyboard",{version:"1.0.0",properties:{params:{defaultValue:"1.0.0",multiple:"1.0.0",confirmHold:"1.0.0",confirmType:"1.0.0",maxLength:"1.0.0"}},success:{errMsg:"1.0.0"}});var zs=_("updateKeyboard",{paramsSchema:c.tuple(c.object({value:c.string()})),implement(e){I("updateKeyboardSync",e)}});g("keyboard.updateKeyboard",{version:"1.0.0",properties:{params:{value:"1.0.0"}}});var Ws=_("hideKeyboard",{implement(){I("hideKeyboardSync")}});g("keyboard.hideKeyboard",{version:"1.0.0"});var Jt=w();Jt.registerCommand("KeyboardSDK.showKeyboard",Gs);Jt.registerCommand("KeyboardSDK.updateKeyboard",zs);Jt.registerCommand("KeyboardSDK.hideKeyboard",Ws);v();G();ee();var ce=w(),Ys=S("levelFinished",{paramsSchema:c.tuple(c.string(),c.object({result:c.boolean(),duration:c.number()})),implement:async(e,t)=>{let{result:r,duration:n}=t,s=[];s.push(F.tracker("LevelFinished",{levelId:e,result:r,duration:n})),s.push(F.reporter({event:"COMPLETE_GAME_LEVEL"})),await Promise.all(s)}}),Qs=S("taskFinished",{paramsSchema:c.tuple(c.string(),c.object({duration:c.number()})),implement:async(e,t)=>{let{duration:r}=t;return await F.reportToNative({event:"TaskFinished",params:{duration:r,taskId:e}})}}),Xs=S("levelUpgrade",{paramsSchema:c.tuple(c.string(),c.string()),implement:async(e,t)=>{let r=[];r.push(F.reportToNative({event:"LevelUpgrade",params:{name:t,levelId:e}})),await Promise.all(r)}}),Zs=S("onHistoryUserLevel",{paramsSchema:c.tuple(c.number()),implement:async e=>await F.reportToNative({event:"HistoryUserLevel",params:{level:e}})}),eo=S("onHistoryUserScore",{paramsSchema:c.tuple(c.number()),implement:async e=>await F.reportToNative({event:"HistoryUserScore",params:{score:e}})}),to=S("taskEvent",{paramsSchema:c.tuple(c.string(),c.object({tools:c.array(c.object({id:c.string(),name:c.string(),count:c.number(),description:c.string().optional(),price:c.object({amount:c.number(),unit:c.string()}).optional()})).optional(),awards:c.array(c.object({id:c.string(),name:c.string()})).optional()})),implement:async(e,t)=>{let r=[];r.push(F.reportToNative({event:"TaskEvent",params:{taskId:e,...t}})),(t.tools?.length??!1)&&(r.push(F.reporter({event:"USE_GAME_ITEM"})),r.push(F.reportToNative({event:"UseGameItem",params:{taskId:e,...t}}))),await Promise.all(r)}});ce.registerCommand("TaskTrackerSDK.levelFinished",Ys);ce.registerCommand("TaskTrackerSDK.taskFinished",Qs);ce.registerCommand("TaskTrackerSDK.levelUpgrade",Xs);ce.registerCommand("TaskTrackerSDK.historyUserLevel",Zs);ce.registerCommand("TaskTrackerSDK.historyUserScore",eo);ce.registerCommand("TaskTrackerSDK.taskEvent",to);g("TaskTrackerSDK.onLevelFinished",{version:"1.0.0",properties:{levelId:"1.0.0",params:{result:"1.0.0",duration:"1.0.0"}}});g("TaskTrackerSDK.onTaskFinished",{version:"1.0.0",properties:{taskId:"1.0.0",duration:"1.0.0"}});g("TaskTrackerSDK.onLevelUpgrade",{version:"1.0.0",properties:{levelId:"1.0.0",name:"1.0.0"}});g("TaskTrackerSDK.onHistoryUserLevel",{version:"1.0.0",properties:{level:"1.0.0"}});g("TaskTrackerSDK.onHistoryUserScore",{version:"1.0.0",properties:{score:"1.0.0"}});g("TaskTrackerSDK.onTaskEvent",{version:"1.0.0",properties:{taskId:"1.0.0",params:{tools:{id:"1.0.0",name:"1.0.0",count:"1.0.0",description:"1.0.0",price:{amount:"1.0.0",unit:"1.0.0"}},awards:{id:"1.0.0",name:"1.0.0"}}}});B();D();G();v();X();g("login",{version:"1.0.0",properties:{force:"1.0.0"},success:{errMsg:"1.0.0",code:"1.0.0",token:"1.0.0",isLogin:"1.0.0"}});g("checkSession",{version:"1.0.0",success:{errMsg:"1.0.0"}});var ro=S("login",{async implement(){let{data:{isLogin:e}}=await O("checkLoginAsync");if(e)return{isLogin:!0,token:y.hostUserInfo?.token};V("onLoginStateChange",({isLogin:i,token:a,uuid:d})=>{d==r&&s({isLogin:i,token:a})});let t=I("loginSync"),{data:{uuid:r}}=t;if(!r)throw se({code:-1,msg:"login failed"});let{promise:n,resolve:s}=new Y,o=await n;return y.onEnvConfigChanged({hostUserInfo:o}),H.emit("onLoginComplete",o),o}}),no=S("checkSession",{async implement(){let{data:{isLogin:e}}=await O("checkLoginAsync");return{isLogin:e}}}),un=w();un.registerCommand("API.login",ro);un.registerCommand("API.checkSession",no);v();G();var Xe=class{constructor(t){this.track=t;this.adBreakIsShowing=!1;this.reportPageJumpOut=()=>{this.track("AdBreakJumpOut",{context:"AdsActionDetection"})};this.reportPageHide=()=>{this.track("AdBreakHide",{context:"AdsActionDetection"})};window.addEventListener("visibilitychange",()=>{document.hidden&&this.adBreakIsShowing&&this.reportPageHide()}),window.addEventListener("beforeunload",r=>{this.adBreakIsShowing&&this.reportPageJumpOut()})}};var mn="jolibox-sdk-ads-callbreak-timestamps",Ze=class{constructor(t,r){this.checkNetwork=t;this.maxAllowedAdsForTime=8;this.bannedForTimeThreshold=6e4;this.bannedReleaseTime=6e4;this.isBanningForTime=!1;this.releaseBannedForTimeTimeout=null;this.maxAllowedAdsForSession=200;this.bannedForSessionThreshold=6e5;this.isBanningForSession=!1;this.initialThreshold=2e3;this._callAdsTimestampsForTime=[];this.callAdsTimestampsForSession=[];this.initTimestamp=0;this.initCallAdsTimestampsForTime=()=>{try{let t=JSON.parse(window.localStorage.getItem(mn)??"[]");Array.isArray(t)?this._callAdsTimestampsForTime=t:this._callAdsTimestampsForTime=[]}catch{this._callAdsTimestampsForTime=[]}};this.setReleaseBannedForTime=()=>{this.releaseBannedForTimeTimeout&&(window.clearTimeout(this.releaseBannedForTimeTimeout),this.releaseBannedForTimeTimeout=null),this.releaseBannedForTimeTimeout=window.setTimeout(()=>{this.isBanningForTime=!1,this.releaseBannedForTimeTimeout=null},this.bannedReleaseTime)};this.checkShouldBannedInitial=()=>{if(Date.now()-this.initTimestamp<=this.initialThreshold)return"BLOCK_INITIAL"};this.checkShouldBannedForSession=t=>{if(this.isBanningForSession)return"BANNED_FOR_SESSION";let r=Date.now();if(this.callAdsTimestampsForSession=this.callAdsTimestampsForSession.concat({timestamp:r,type:t}),this.callAdsTimestampsForSession.length!==1&&(this.callAdsTimestampsForSession.length>this.maxAllowedAdsForSession&&(this.callAdsTimestampsForSession=this.callAdsTimestampsForSession.slice(-this.maxAllowedAdsForSession)),this.callAdsTimestampsForSession.length===this.maxAllowedAdsForSession&&r-this.callAdsTimestampsForSession[0].timestamp<=this.bannedForSessionThreshold))return this.isBanningForSession=!0,"BANNED_FOR_SESSION"};this.checkShouldBannedForTime=t=>{if(this.isBanningForTime)return"WAITING_BANNED_RELEASE";let r=Date.now();if(this.callAdsTimestampsForTime=this.callAdsTimestampsForTime.concat({timestamp:r,type:t}),this.callAdsTimestampsForTime.length!==1&&(this.callAdsTimestampsForTime.length>this.maxAllowedAdsForTime&&(this.callAdsTimestampsForTime=this.callAdsTimestampsForTime.slice(-this.maxAllowedAdsForTime)),this.callAdsTimestampsForTime.length===this.maxAllowedAdsForTime&&r-this.callAdsTimestampsForTime[0].timestamp<=this.bannedForTimeThreshold))return this.isBanningForTime=!0,this.setReleaseBannedForTime(),"BANNED_FOR_TIME"};this.checkAdsDisplayPermission=t=>{if(!this.checkNetwork())return"NETWORK_NOT_OK";let r=this.checkShouldBannedInitial();if(r)return r;let n=this.checkShouldBannedForSession(t);if(n)return n;let s=this.checkShouldBannedForTime(t);return s||"ALLOWED"};if(this.maxAllowedAdsForTime=r?.maxAllowedAdsForTime??8,this.bannedForTimeThreshold=r?.bannedForTimeThreshold??6e4,this.bannedReleaseTime=r?.bannedReleaseTime??6e4,this.maxAllowedAdsForSession=r?.maxAllowedAdsForSession??200,this.bannedForSessionThreshold=r?.bannedForSessionThreshold??6e5,this.initialThreshold=r?.initialThreshold??2e3,this.maxAllowedAdsForTime<=1)throw new Error("maxAllowedAdsForTime must be greater than 1");if(this.bannedForTimeThreshold<0)throw new Error("bannedForTimeThreshold must be greater than or equal to 0");if(this.bannedReleaseTime<this.bannedForTimeThreshold)throw new Error("bannedReleaseTime must be greater than or equal to bannedForTimeThreshold");if(this.initialThreshold<0)throw new Error("initialThreshold must be greater than or equal to 0");this.initCallAdsTimestampsForTime(),this.initTimestamp=Date.now()}get callAdsTimestampsForTime(){return this._callAdsTimestampsForTime}set callAdsTimestampsForTime(t){try{window.localStorage.setItem(mn,JSON.stringify(t))}catch{console.error("Failed to save timestamps")}this._callAdsTimestampsForTime=t}};B();B();var et=class{constructor(t){this.httpClient=t;this.configs=null;this.firstRun=!0;this.init()}async init(){try{this.configs=await this.httpClient.get("/api/fe-configs/js-sdk/ads-channel-config")}catch{}}shouldBypassCallingInterstitial(){let t;if(!this.configs)this.init(),t=!this.firstRun;else{let r=y.channel??"",s=this.configs[r]?.interstitialRate??1;t=Math.random()<s}return this.firstRun=!1,t}};var tt=class{constructor(t,r,n){this.track=t;this.httpClient=r;this.checkNetwork=n;this.configured=!1;this.config={};this.getGameId=()=>y.mpId;this.getTestAdsMode=()=>y.testAdsMode;this.asyncLoad=async()=>{let t="ca-pub-7171363994453626",r,n,s=window.encodeURIComponent(window.btoa(this.getGameId()??"")),o=this.getTestAdsMode()??!1;try{let i=await this.httpClient.get("/public/ads",{query:{objectId:s,testAdsMode:`${o}`}});t=i.data?.clientId,r=i.data?.channelId,n=i.data?.unitId}catch(i){console.error("Failed to fetch client info",i)}this.clientId=t,this.channelId=r,this.unitId=n};this.asyncInit=async t=>{if(typeof window>"u")return;await this.asyncLoad();let r="google-adsense",n=this.getTestAdsMode()??!1;if(!document.getElementById(r)&&this.clientId){let s=document.createElement("script");s.id=r,s.async=!0,s.crossOrigin="anonymous",s.src=`https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${this.clientId}`,n&&s.setAttribute("data-adbreak-test","on"),this.channelId&&s.setAttribute("data-ad-channel",this.channelId),document.head.appendChild(s),this.track("LoadAdsenseCompleted",null)}};this.push=(t={})=>{window.adsbygoogle.push(t)};this.adConfig=t=>{let{onReady:r,...n}=t;this.track("CallAdConfig",n),this.configured?console.warn("Ad config already set, skipping"):(this.configured=!0,this.push(t))};this.adBreak=t=>{if(!this.getGameId()){console.warn("Game ID is not set, skip calling adBreak");return}if(t.type!=="reward"&&!this.channelPolicy.shouldBypassCallingInterstitial()){t.adBreakDone?.({breakType:t.type,breakName:"skipInterstitials",breakFormat:"interstitial",breakStatus:"viewed"});return}let r=this.antiCheating.checkAdsDisplayPermission(t.type==="reward"?"reward":"interstitial");switch(r){case"NETWORK_NOT_OK":case"BANNED_FOR_SESSION":console.warn("Ads not allowed",r),t.adBreakDone?.({breakType:t.type,breakName:r,breakFormat:t.type==="reward"?"reward":"interstitial",breakStatus:"noAdPreloaded"}),this.track("PreventAdsCheating",{reason:r});return;case"BLOCK_INITIAL":case"BANNED_FOR_TIME":case"WAITING_BANNED_RELEASE":console.warn("Ads not allowed",r),t.adBreakDone?.({breakType:t.type,breakFormat:t.type==="reward"?"reward":"interstitial",breakStatus:"viewed"}),this.track("PreventAdsCheating",{reason:r});return;default:break}let n=t.type,s=t.adBreakDone,o=a=>{this.adsActionDetection.adBreakIsShowing=!1,this.track("CallAdBreakDone",{breakType:a.breakType,breakName:a.breakName??"",breakFormat:a.breakFormat,breakStatus:a.breakStatus}),s&&s(a)};if(t.adBreakDone=o,t.type==="reward"){let a=t.beforeReward,d=u=>()=>{this.track("CallShowAdFn",null),u()},l=u=>{a&&a(d(u))};t.beforeReward=l}let i;switch(n){case"preroll":i={type:n};break;case"start":case"pause":case"next":case"browse":case"reward":i={type:n,name:t.name??""};break}this.adsActionDetection.adBreakIsShowing=!0,this.track("CallAdBreak",i),this.push(t),window.JoliTesterBridge&&console.log("joli-fullscreen-ad-show")};this.adUnit=async t=>{if(this.track("CallAdUnit",{adFormat:t.adFormat?.toString()??null,fullWidthResponsive:t.fullWidthResponsive??null}),this.clientId||await this.asyncLoad(),document.querySelector("#jolibox-ads")){console.warn("Ad unit already set, skipping");return}let{el:r,slot:n,adFormat:s,fullWidthResponsive:o,style:i}=t,a;if(!r)throw new Error("targeting element is required");if(typeof r=="string"?a=document.querySelector(r):a=r,!a)throw new Error("targeting element not found");let d=n;if(d||(d=this.unitId),!d)throw new Error("slot is required");let l=typeof s=="object"&&Array.isArray(s)?s.join(", "):s,u=document.createElement("ins");if(u.className="adsbygoogle",u.id="jolibox-ads",u.style.display="block",u.setAttribute("data-ad-client",this.clientId),u.setAttribute("data-ad-slot",d),l&&u.setAttribute("data-ad-format",l),o&&u.setAttribute("data-full-width-responsive",o),i&&u.setAttribute("style",i),this.getTestAdsMode()??!1){let m=document.createElement("div");m.style.position="absolute",m.style.top="0",m.style.left="0",m.style.width="100%",m.style.height="100%",m.style.display="flex",m.style.justifyContent="center",m.style.alignItems="center",m.style.backgroundColor="rgba(0, 0, 0, 0.5)",m.style.color="white",m.innerHTML="Test Ad",u.style.position="relative",a.appendChild(u),u.appendChild(m)}else a.appendChild(u),new MutationObserver(f=>{f.forEach(b=>{if(b.type==="attributes"&&b.attributeName==="data-ad-status"){let R=u.getAttribute("data-ad-status");this.track("AdSenseUnitStatusChanged",{status:R??"null"})}})}).observe(u,{attributes:!0,attributeFilter:["data-ad-status"]}),this.push({})};this.antiCheating=new Ze(n),this.adsActionDetection=new Xe(this.track),this.channelPolicy=new et(r)}init(t){this.track("CallAdsInit",null),!(typeof window>"u")&&(this.config=t??{},window.adsbygoogle=window.adsbygoogle||[],this.asyncInit(t))}};ee();Re();D();var rt=w(),so=()=>{let{data:e}=I("getNetworkStatusSync");return!!e?.isConnected},nt=new tt(M,{get:(e,t)=>K(e,{method:"GET",responseType:"json",appendHostCookie:!0,...t}).then(r=>r.response.data)},so),oo=_("adInit",{implement:e=>{nt.init(e)}}),io=_("adConfig",{implement:e=>{nt.adConfig(e)}}),ao=_("adBreak",{implement:e=>{nt.adBreak(e)}}),co=_("adUnit",{implement:e=>{nt.adUnit(e)}});rt.registerCommand("AdsSDK.init",oo);rt.registerCommand("AdsSDK.adConfig",io);rt.registerCommand("AdsSDK.adBreak",ao);rt.registerCommand("AdsSDK.adUnit",co);g("AdsSDK.init",{version:"1.0.0"});g("AdsSDK.adConfig",{version:"1.0.0"});g("AdsSDK.adBreak",{version:"1.0.0"});g("AdsSDK.adUnit",{version:"1.0.0"});ee();Yr();
|
package/implement.build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Invoking: npm run clean && npm run build:esm && tsc
|
|
2
2
|
|
|
3
|
-
> @jolibox/implement@1.1.4-beta.
|
|
3
|
+
> @jolibox/implement@1.1.4-beta.17 clean
|
|
4
4
|
> rimraf ./dist
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
> @jolibox/implement@1.1.4-beta.
|
|
7
|
+
> @jolibox/implement@1.1.4-beta.17 build:esm
|
|
8
8
|
> BUILD_VERSION=$(node -p "require('./package.json').version") node esbuild.config.js --format=esm
|
|
9
9
|
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jolibox/implement",
|
|
3
3
|
"description": "This project is Jolibox JS-SDk implement for Native && H5",
|
|
4
|
-
"version": "1.1.4-beta.
|
|
4
|
+
"version": "1.1.4-beta.17",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@jolibox/common": "1.1.4-beta.
|
|
10
|
-
"@jolibox/types": "1.1.4-beta.
|
|
9
|
+
"@jolibox/common": "1.1.4-beta.17",
|
|
10
|
+
"@jolibox/types": "1.1.4-beta.17",
|
|
11
11
|
"localforage": "1.10.0"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
@@ -1,7 +1,52 @@
|
|
|
1
|
+
import { context } from '../context';
|
|
2
|
+
|
|
1
3
|
export interface IChannelPolicy {
|
|
2
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The rate at which interstitial ads should be shown.
|
|
6
|
+
* A value of 1 means always bypass interstitials call, while a value of 0 means always forbid calling interstitials.
|
|
7
|
+
* A value between 0 and 1 means the interstitial call will be bypassed with a probability of `rate`.
|
|
8
|
+
*/
|
|
9
|
+
interstitialRate?: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface HttpClient {
|
|
13
|
+
get<T>(url: string, options?: { query?: Record<string, string> }): Promise<T>;
|
|
3
14
|
}
|
|
4
15
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
16
|
+
export class ChannelPolicy {
|
|
17
|
+
private configs: Record<string, IChannelPolicy> | null = null;
|
|
18
|
+
private firstRun = true;
|
|
19
|
+
|
|
20
|
+
constructor(readonly httpClient: HttpClient) {
|
|
21
|
+
this.init();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private async init() {
|
|
25
|
+
try {
|
|
26
|
+
this.configs = await this.httpClient.get<Record<string, IChannelPolicy>>(
|
|
27
|
+
'/api/fe-configs/js-sdk/ads-channel-config'
|
|
28
|
+
);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
// no-op
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Should bypass calling interstitial based on the channel policy.
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
shouldBypassCallingInterstitial() {
|
|
39
|
+
let result;
|
|
40
|
+
if (!this.configs) {
|
|
41
|
+
this.init();
|
|
42
|
+
result = !this.firstRun; // If configs are not loaded yet, should forbid calling interstitial on first run.
|
|
43
|
+
} else {
|
|
44
|
+
const channel = context.channel ?? '';
|
|
45
|
+
const policy: IChannelPolicy | undefined = this.configs[channel];
|
|
46
|
+
const rate = policy?.interstitialRate ?? 1;
|
|
47
|
+
result = Math.random() < rate; // Bypass interstitial calling with the given rate.
|
|
48
|
+
}
|
|
49
|
+
this.firstRun = false;
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
}
|
package/src/common/ads/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AdsActionDetection } from './ads-action-detection';
|
|
2
2
|
import { AdsAntiCheating } from './anti-cheating';
|
|
3
|
-
import { Track
|
|
3
|
+
import { Track } from '../report';
|
|
4
4
|
import { context } from '../context';
|
|
5
|
-
import {
|
|
5
|
+
import { ChannelPolicy } from './channel-policy';
|
|
6
6
|
|
|
7
7
|
declare global {
|
|
8
8
|
interface Window {
|
|
@@ -269,6 +269,7 @@ export class JoliboxAdsImpl {
|
|
|
269
269
|
|
|
270
270
|
private antiCheating: AdsAntiCheating;
|
|
271
271
|
private adsActionDetection: AdsActionDetection;
|
|
272
|
+
private channelPolicy: ChannelPolicy;
|
|
272
273
|
|
|
273
274
|
/**
|
|
274
275
|
* Internal constructor, should not be called directly
|
|
@@ -276,6 +277,7 @@ export class JoliboxAdsImpl {
|
|
|
276
277
|
constructor(readonly track: Track, readonly httpClient: HttpClient, readonly checkNetwork: () => boolean) {
|
|
277
278
|
this.antiCheating = new AdsAntiCheating(checkNetwork);
|
|
278
279
|
this.adsActionDetection = new AdsActionDetection(this.track);
|
|
280
|
+
this.channelPolicy = new ChannelPolicy(httpClient);
|
|
279
281
|
}
|
|
280
282
|
|
|
281
283
|
/**
|
|
@@ -417,8 +419,8 @@ export class JoliboxAdsImpl {
|
|
|
417
419
|
}
|
|
418
420
|
|
|
419
421
|
if (params.type !== 'reward') {
|
|
420
|
-
const
|
|
421
|
-
if (
|
|
422
|
+
const shouldBypassCallingInterstitial = this.channelPolicy.shouldBypassCallingInterstitial();
|
|
423
|
+
if (!shouldBypassCallingInterstitial) {
|
|
422
424
|
params.adBreakDone?.({
|
|
423
425
|
breakType: params.type,
|
|
424
426
|
breakName: 'skipInterstitials',
|
|
@@ -4,7 +4,7 @@ import { ResponseType, StandardResponse } from '@jolibox/types';
|
|
|
4
4
|
import { Track } from '../report';
|
|
5
5
|
import { reportError } from '../report/errors/report';
|
|
6
6
|
import { Type, typeAsserts, Validator } from './validator';
|
|
7
|
-
import {
|
|
7
|
+
import { createUserValidateAPIError } from '../report/errors';
|
|
8
8
|
|
|
9
9
|
let traceId = 1;
|
|
10
10
|
|
|
@@ -65,7 +65,7 @@ export const createAPIFactory = (track: Track) => {
|
|
|
65
65
|
typeAsserts(config.paramsSchema, inputs, 'params');
|
|
66
66
|
} catch (err: unknown) {
|
|
67
67
|
const error = err as { message: string };
|
|
68
|
-
throw
|
|
68
|
+
throw createUserValidateAPIError(`${method}:fail ${error.message}`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
const res = config.implement(...inputs);
|
|
@@ -142,7 +142,7 @@ export const createAPIFactory = (track: Track) => {
|
|
|
142
142
|
try {
|
|
143
143
|
typeAsserts(config.paramsSchema, inputs, 'params');
|
|
144
144
|
} catch (error) {
|
|
145
|
-
throw
|
|
145
|
+
throw createUserValidateAPIError((error as Error).message);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
|
|
@@ -2,6 +2,17 @@ import { context } from '@/common/context';
|
|
|
2
2
|
import { logger } from '@jolibox/common';
|
|
3
3
|
import { IDevice, IPage, IEventPackage, IEvent, EProject, serializeEventPackage } from '@jolibox/common';
|
|
4
4
|
|
|
5
|
+
interface ISamplesConfig {
|
|
6
|
+
samples: {
|
|
7
|
+
[sampleRate: number]: string[];
|
|
8
|
+
};
|
|
9
|
+
cluster: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Base class for event tracker, all the event tracker should inherit from this class
|
|
13
|
+
* Send event to oss reporter
|
|
14
|
+
* @abstract
|
|
15
|
+
*/
|
|
5
16
|
export abstract class EventTracker {
|
|
6
17
|
deviceInfo: IDevice | null = null;
|
|
7
18
|
|
|
@@ -10,6 +21,7 @@ export abstract class EventTracker {
|
|
|
10
21
|
abstract doReport<T extends Record<string, unknown>>(event: unknown[], extra?: T): void;
|
|
11
22
|
|
|
12
23
|
private pastTrackings: boolean[] = [];
|
|
24
|
+
private samplesConfig: ISamplesConfig | null = null;
|
|
13
25
|
|
|
14
26
|
private pushPastTracking = (tracking: boolean) => {
|
|
15
27
|
this.pastTrackings.push(tracking);
|
|
@@ -18,6 +30,10 @@ export abstract class EventTracker {
|
|
|
18
30
|
}
|
|
19
31
|
};
|
|
20
32
|
|
|
33
|
+
constructor() {
|
|
34
|
+
this.fetchSamplesConfig();
|
|
35
|
+
}
|
|
36
|
+
|
|
21
37
|
public get networkIsOk() {
|
|
22
38
|
// in the past 10 trackings, at least 60% of them are successful
|
|
23
39
|
return (
|
|
@@ -26,6 +42,26 @@ export abstract class EventTracker {
|
|
|
26
42
|
);
|
|
27
43
|
}
|
|
28
44
|
|
|
45
|
+
private async fetchSamplesConfig() {
|
|
46
|
+
const host = context.testMode ? 'https://stg-api.jolibox.com' : 'https://api.jolibox.com';
|
|
47
|
+
const path = `${host}/api/fe-configs/js-sdk/samples-config`;
|
|
48
|
+
const samplesConfig = (await (await fetch(path)).json()) as ISamplesConfig;
|
|
49
|
+
this.samplesConfig = samplesConfig;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private checkIsSampled(event: IEvent) {
|
|
53
|
+
if (!this.samplesConfig) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const { samples } = this.samplesConfig;
|
|
57
|
+
for (const [sampleRate, events] of Object.entries(samples)) {
|
|
58
|
+
if (events.includes(event.name)) {
|
|
59
|
+
return Math.floor(Math.random() * 101) < parseFloat(sampleRate);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
29
65
|
getDevice(): IDevice {
|
|
30
66
|
const { nativeSDKVersion, jssdkVersion } = context.sdkInfo;
|
|
31
67
|
return {
|
|
@@ -54,6 +90,10 @@ export abstract class EventTracker {
|
|
|
54
90
|
}
|
|
55
91
|
|
|
56
92
|
async trackEvent(event: IEvent, project: EProject, extraInfo?: Record<string, unknown>) {
|
|
93
|
+
// check if the event is sampled
|
|
94
|
+
if (this.checkIsSampled(event)) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
57
97
|
const location = event.location ? event.location : await this.getLocation();
|
|
58
98
|
const target = event.target || null;
|
|
59
99
|
const extra = event.extra || null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import './report';
|
|
2
|
-
import { APIError,
|
|
2
|
+
import { APIError, UserValidateError } from '@jolibox/common';
|
|
3
3
|
|
|
4
4
|
export function formatErrorCode(method: string, code?: number) {
|
|
5
5
|
return `[${method}]:${code}`;
|
|
@@ -13,8 +13,8 @@ export const createAPIError = (
|
|
|
13
13
|
return new APIError(params?.errMsg ?? error.msg ?? '', error.code, error.type);
|
|
14
14
|
};
|
|
15
15
|
|
|
16
|
-
export const
|
|
17
|
-
return new
|
|
16
|
+
export const createUserValidateAPIError = (msg: string) => {
|
|
17
|
+
return new UserValidateError(msg);
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
export { errorReportEmitter, ErrorData } from './report';
|
|
@@ -30,8 +30,6 @@ const innerErrorReport = (
|
|
|
30
30
|
options: ErrorOptions | GlobalErrorOptions = {},
|
|
31
31
|
isFromUser: boolean
|
|
32
32
|
) => {
|
|
33
|
-
const priority = (error as BaseError).priority ?? 'P1';
|
|
34
|
-
|
|
35
33
|
const common = {
|
|
36
34
|
user_id: context.hostUserInfo?.uid ?? '',
|
|
37
35
|
device_id: context.deviceInfo.did ?? '',
|