@singcl/ad-execute-manager 2.0.0 → 2.0.2

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.
Files changed (43) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +558 -631
  3. package/dist/ad/{InterstitialAdFather.d.ts → src/InterstitialAdFather.d.ts} +5 -5
  4. package/dist/ad/{InterstitialAdNovel.d.ts → src/InterstitialAdNovel.d.ts} +8 -8
  5. package/dist/ad/{RewardAdFather.d.ts → src/RewardAdFather.d.ts} +6 -6
  6. package/dist/ad/{RewardAdNovel.d.ts → src/RewardAdNovel.d.ts} +65 -36
  7. package/dist/ad/src/index.d.ts +5 -0
  8. package/dist/{typings → ad/src/typings}/ad.d.ts +0 -4
  9. package/dist/analytics/{AdAnalyticsJS.d.ts → src/AdAnalyticsJS.d.ts} +1 -1
  10. package/dist/analytics/src/index.d.ts +1 -0
  11. package/dist/core/{AdExecuteManager.d.ts → src/AdExecuteManager.d.ts} +27 -10
  12. package/dist/core/src/index.d.ts +1 -0
  13. package/dist/core/src/typings/ad.d.ts +208 -0
  14. package/dist/core/typings/ad.d.ts +208 -0
  15. package/dist/helper/{PubSub.d.ts → src/PubSub.d.ts} +1 -1
  16. package/dist/helper/src/index.d.ts +6 -0
  17. package/dist/index.cjs +2 -2
  18. package/dist/index.d.ts +13 -13
  19. package/dist/index.js +2 -2
  20. package/dist/{other → tools/src}/RewardAdGlobalRecorder.d.ts +2 -2
  21. package/dist/{other → tools/src}/RewardAdSceneTriggerManager.d.ts +11 -11
  22. package/dist/tools/src/const.d.ts +3 -0
  23. package/dist/tools/src/index.d.ts +3 -0
  24. package/dist/tools/src/typings/ad.d.ts +208 -0
  25. package/dist/tools/src/typings/common.d.ts +14 -0
  26. package/dist/tools/src/typings/create-interstitial-ad.d.ts +42 -0
  27. package/dist/tools/src/typings/create-rewarded-video-ad.d.ts +42 -0
  28. package/dist/tools/src/typings/tracker.d.ts +1 -0
  29. package/package.json +6 -2
  30. /package/dist/{const → ad/src/const}/const.d.ts +0 -0
  31. /package/dist/{typings → ad/src/typings}/common.d.ts +0 -0
  32. /package/dist/{typings → ad/src/typings}/create-interstitial-ad.d.ts +0 -0
  33. /package/dist/{typings → ad/src/typings}/create-rewarded-video-ad.d.ts +0 -0
  34. /package/dist/{typings → ad/src/typings}/tracker.d.ts +0 -0
  35. /package/dist/{utils → ad/src/utils}/functional.d.ts +0 -0
  36. /package/dist/core/{_util.d.ts → src/_util.d.ts} +0 -0
  37. /package/dist/core/{compose.d.ts → src/compose.d.ts} +0 -0
  38. /package/dist/helper/{CountRecorder.d.ts → src/CountRecorder.d.ts} +0 -0
  39. /package/dist/helper/{EventEmitter.d.ts → src/EventEmitter.d.ts} +0 -0
  40. /package/dist/helper/{Logger.d.ts → src/Logger.d.ts} +0 -0
  41. /package/dist/helper/{SerializableError.d.ts → src/SerializableError.d.ts} +0 -0
  42. /package/dist/helper/{Storage.d.ts → src/Storage.d.ts} +0 -0
  43. /package/dist/{other → tools/src}/LovelUnlockManager.d.ts +0 -0
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- class e{constructor(e={}){let{prefix:t="Logger",level:i="log",enabled:r=!0}=e;this.prefix=t,this.enabled=r,this.levels={error:0,warn:1,info:2,log:3,debug:4},this.currentLevel=this.levels[i]||this.levels.log}enable(){this.enabled=!0}disable(){this.enabled=!1}isEnabled(){return this.enabled}setLevel(e){Object.prototype.hasOwnProperty.call(this.levels,e)&&(this.currentLevel=this.levels[e])}formatMessage(e,t){let i=new Date,r=`${i.getFullYear()}/${i.getMonth()+1}/${i.getDate()} ${i.getHours()}:${i.getMinutes()}:${i.getSeconds()}`;return`[${r}] [${e.toUpperCase()}] [${this.prefix}] ${t}`}_log(e,t,...i){if(!this.enabled)return;let r=this.levels[e];if(void 0!==r&&this.currentLevel>=r){let r=this.formatMessage(e,t);switch(e){case"error":console.error(r,...i);break;case"warn":console.warn(r,...i);break;case"info":console.info(r,...i);break;case"log":default:console.log(r,...i);break;case"debug":console.debug(r,...i)}}}error(e,...t){this._log("error",e,...t)}warn(e,...t){this._log("warn",e,...t)}info(e,...t){this._log("info",e,...t)}log(e,...t){this._log("log",e,...t)}debug(e,...t){this._log("debug",e,...t)}}class t{static _instance=null;_taskStack=[];_currentBatchTasks=[];_isRunning=!1;_currentTask=null;_isForeground=!0;_appShowListener=null;_appHideListener=null;_enableVisibilityListener=!1;_maxRetryCount=1;_retryQueue=[];_errorRetryStrategy={timeout:!0,background:!0};constructor(t){this.logger=new e({prefix:"AdExecuteManager",enabled:!!t?.log}),t?.errorRetryStrategy&&(this._errorRetryStrategy=Object.assign({},this._errorRetryStrategy,t?.errorRetryStrategy)),this._enableVisibilityListener=t?.enableVisibilityListener,this._maxRetryCount=t?.maxRetryCount??1,this._enableVisibilityListener&&this._initVisibilityListener()}initialize(e){return this}static getInstance(e){return t._instance||(t._instance=new t(e)),t._instance}static build(e){return t._instance||(t._instance=new t(e)),t._instance}static new(e){return new t(e)}static getSafeInstance(){return t._instance?t._instance:(this.logger.error("AdExecuteManager实例不存在"),null)}_initVisibilityListener(){!("u"<typeof tt)&&tt.onAppShow&&tt.onAppHide?(this._appShowListener=()=>{this._isForeground=!0,this._handleAppShow()},this._appHideListener=()=>{this._isForeground=!1,this._handleAppHide()},tt.onAppShow(this._appShowListener),tt.onAppHide(this._appHideListener),this.logger.info("前后台监听器已初始化")):this.logger.warn("tt API不可用,无法监听前后台状态")}_handleAppHide(){if(this._isRunning&&this._currentBatchTasks.length>0){let e=this._currentBatchTasks.filter(e=>e.id!==this._currentTask?.id&&!e._isResolved&&!e._isRejected);e.length>0&&(this.logger.info(`将 ${e.length} 个未执行的任务放回任务栈,任务ID: ${e.map(e=>e.id).join(",")}`),this._taskStack=[...e,...this._taskStack],this._currentBatchTasks=this._currentBatchTasks.filter(t=>!e.some(e=>e.id===t.id)))}}_handleAppShow(){this._retryQueue.length>0&&(this.logger.info(`应用进入前台:优先执行重试队列,任务数: ${this._retryQueue.length}, 任务ID: ${this._retryQueue.map(e=>e.id).join(",")}`),this._taskStack=[...this._retryQueue,...this._taskStack],this._retryQueue=[]),this._taskStack.length>0&&!this._isRunning&&(this.logger.info(`应用进入前台:恢复待执行任务数: ${this._taskStack.length}, 任务ID: ${this._taskStack.map(e=>e.id).join(",")}`),this._compose())}destroyVisibilityListener(){this._appShowListener&&"u">typeof tt&&tt.offAppShow&&(tt.offAppShow(this._appShowListener),this._appShowListener=null),this._appHideListener&&"u">typeof tt&&tt.offAppHide&&(tt.offAppHide(this._appHideListener),this._appHideListener=null),this.logger.info("前后台监听器已销毁")}enableVisibilityListener(){this._enableVisibilityListener||(this._enableVisibilityListener=!0,this._initVisibilityListener()),this.logger.info("前后台监听器已启用")}disableVisibilityListener(){this._enableVisibilityListener&&(this._enableVisibilityListener=!1,this.destroyVisibilityListener()),this.logger.info("前后台监听器已禁用")}isVisibilityListenerEnabled(){return this._enableVisibilityListener}addTask(e,t){return e&&"function"==typeof e.ad?new Promise((i,r)=>{let s={adInstance:e,options:t.options??{},callbackCollection:t.collection??{},resolve:i,reject:r,id:`ad_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,_isResolved:!1,_isRejected:!1,_retryCount:0,_retryMsg:"ok"};this._taskStack.push(s),this._isRunning||this._compose()}):(this.logger.error("无效的广告实例 请正确实现.ad方法"),Promise.reject(Error("无效的广告实例")))}_compose(){if(0===this._taskStack.length){this._isRunning=!1,this._currentTask=null;return}if(!this._isForeground){this.logger.info(`应用处于后台,暂停任务执行,任务ID: ${this._taskStack.map(e=>e.id).join(",")}`),this._isRunning=!1;return}this._isRunning=!0;let e=[...this._taskStack];this._taskStack=[],this._currentBatchTasks=e;let t=e.map(e=>async(t,i)=>{let{adInstance:r,options:s,callbackCollection:n,resolve:o,id:l,_retryCount:a,_retryMsg:h}=e,d={count:a,retry:a>0,message:h};if(e._isResolved||e._isRejected)return void await i(t);this._currentTask=e;try{let a=async e=>{await i(Object.assign({},t,e))},h=await r.initialize(s).ad({options:s,collection:n,recovered:d},a),c=Object.assign({id:l,recovered:d},h);if(this.logger.info(`任务执行成功,成功信息:${JSON.stringify(c)}`),function({apiError:e,configuredAdTimeout:t,errorRetryStrategy:i}){return!!(i?.timeout&&e?.errMsg&&"string"==typeof e.errMsg&&e.errMsg.startsWith("ad_show_timeout: normal")&&e?.timeout==t)||!!(i?.background&&e?.errMsg&&"string"==typeof e.errMsg&&(e.errMsg.startsWith("app in background is not support show ad")||e.errMsg.startsWith("other controller is presented")))}({apiError:c?.apiError,configuredAdTimeout:r._adTimeoutTime,errorRetryStrategy:this._errorRetryStrategy})&&!this._isForeground&&e._retryCount<this._maxRetryCount){e._retryCount++,e._retryMsg=c?.apiError?.errMsg||"unknown";let t=`任务 ${l} 在后台失败,加入重试队列 (即将第 ${e._retryCount} 次重试, 最大重试次数 ${this._maxRetryCount}, 重试原因: ${e._retryMsg})`;this.logger.warn(t),c.recovered.retry=!0,c.recovered.count=e._retryCount,c.recovered.message=e._retryMsg,e._isResolved=!1,e._isRejected=!1,this._retryQueue.push(e)}else e._isResolved=!0;o(c),r?.record(c)}catch(n){let s=Object.assign({id:l,apiError:n,recovered:d});this.logger.error(`任务执行失败, 继续下一个任务,错误信息:${JSON.stringify(s)}`),e._isRejected=!0;try{r?.clear()}catch(e){this.logger.error("clear error: ",JSON.stringify(Object.assign({id:l,apiError:e})))}o(s),r?.record(s),await i(t)}}),i={roundTasks:t.length};t.map(e=>(t,i)=>async r=>await e(Object.assign({},t,r),i)).reduce((e,t)=>(i,r)=>e(i,t(i,r)))(i,async e=>{this.logger.info("本轮活动队列已经清空",e),this._taskStack.length>0?Promise.resolve().then(()=>{this._compose()}):(this._isRunning=!1,this._currentTask=null,this._currentBatchTasks=[])})()}clearTasks(){if(this._currentTask){if(this._currentTask._isResolved||this._currentTask._isRejected){this._currentTask=null;return}try{this._currentTask.callbackCollection&&this._currentTask.callbackCollection.onCancel&&this._currentTask.callbackCollection.onCancel(),this._currentTask._isResolved=!0,this._currentTask.resolve()}catch(e){this.logger.error("clear current task error: ",e)}this._currentTask=null}this._currentBatchTasks.length>0&&(this._currentBatchTasks.forEach(e=>{if(e!==this._currentTask&&!e._isResolved&&!e._isRejected)try{e.callbackCollection&&e.callbackCollection.onCancel&&e.callbackCollection.onCancel(),e._isResolved=!0,e.resolve()}catch(e){this.logger.error("clear current batch task error: ",e)}}),this._currentBatchTasks=[]),this._taskStack.forEach(e=>{if(!e._isResolved&&!e._isRejected&&(e._isResolved=!0,e.resolve(),e.callbackCollection&&e.callbackCollection.onCancel))try{e.callbackCollection.onCancel()}catch(e){this.logger.error("clear task error: ",e)}}),this._retryQueue.forEach(e=>{if(!e._isResolved&&!e._isRejected&&(e._isResolved=!0,e.resolve(),e.callbackCollection&&e.callbackCollection.onCancel))try{e.callbackCollection.onCancel()}catch(e){this.logger.error("clear retry task error: ",e)}}),this._taskStack=[],this._retryQueue=[],this._isRunning=!1}getTaskCount(){return this._taskStack.filter(e=>!e._isResolved&&!e._isRejected).length+this._currentBatchTasks.filter(e=>e!==this._currentTask&&!e._isResolved&&!e._isRejected).length+(!this._currentTask||this._currentTask._isResolved||this._currentTask._isRejected?0:1)+this._retryQueue.filter(e=>!e._isResolved&&!e._isRejected).length}isRunning(){return this._isRunning}getCurrentTaskId(){return this._currentTask?.id||null}whenAllTasksComplete(){return new Promise(e=>{let t=null,i=()=>{let r=0===this._taskStack.length,s=!this._isRunning,n=null===this._currentTask,o=0===this._currentBatchTasks.length||this._currentBatchTasks.every(e=>e._isResolved||e._isRejected),l=0===this._retryQueue.length;r&&s&&n&&o&&l?(t&&clearTimeout(t),e()):t=setTimeout(i,500)};i()})}}let i=t;class r extends Error{constructor(e,t={}){super(e),this.name=this.constructor.name,this.stack=Error(e).stack,this.errMsg=t.errMsg,this.errorCode=t.errorCode,Object.defineProperty(this,"message",{enumerable:!0}),Object.defineProperty(this,"name",{enumerable:!0}),Object.defineProperty(this,"stack",{enumerable:!0}),Object.defineProperty(this,"errMsg",{enumerable:!0}),Object.defineProperty(this,"errorCode",{enumerable:!0})}toJSON(){return{name:this.name,message:this.message,stack:this.stack,errMsg:this.errMsg,errorCode:this.errorCode}}}class s{static args=null;_logger=null;_adTimeoutTime=8e3;_initSign="";_preserveOnEnd=!1;_rewardAd=null;__ad__=null;_ttErrorMsgs=["The adUnitId is closed","The adUnitId is prohibit","The adUnitId is invalid","The adUnitId is required","The adUnitId is empty","feature is not supported in app"];_ttErrorCodes=[139902,123302];__bindAdErrorForeverHandler=this.__adErrorForeverHandler.bind(this);constructor(t){this._logger=new e({prefix:"RewardAdFather",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._preserveOnEnd=t?.preserveOnEnd??!1}initialize(e,t){if(this._rewardAd)return this._logger.warn("rewardAd has been initialized"),t?.(this._rewardAd),this;let i=Object.assign({},s.args,this._adConfig,e);if(!i.adUnitId)throw this._logger.error("reward args The adUnitId is required",i),new r("[RewardAdFather] reward args The adUnitId is required",{errMsg:"The adUnitId is required",errorCode:100002});let n=tt.createRewardedVideoAd(i);return this._logger.info("bindAdErrorForeverHandler at initialized:",e?.foreverErrorBind),e?.foreverErrorBind&&(n?.offError(this.__bindAdErrorForeverHandler),n?.onError(this.__bindAdErrorForeverHandler)),this._rewardAd=n,this.__ad__=n,t?.(this._rewardAd),this}initialized(){return!!this._rewardAd}__adErrorForeverHandler(e){this.adErrorForeverHandler(e)}adErrorForeverHandler(e){return null}async ad(e,t=null){throw Error("子类必须实现ad方法")}async addExecuteManager(e){let t=Object.assign({},this._adConfig,e?.options??{});return s.executeWithManager(this,Object.assign({},e,{options:t}))}destroy(){this._rewardAd&&!this._preserveOnEnd&&(this._rewardAd.destroy(),this._rewardAd=null)}clear(){throw Error("子类必须实现clear方法")}record(e){return this}onClose(e){this._rewardAd&&this._rewardAd.onClose(e)}offClose(e){this._rewardAd&&this._rewardAd.offClose(e)}show(){return this._rewardAd?this._rewardAd.show():Promise.reject({errMsg:"[RewardAdFather] can not show,rewardAd is null",errorCode:110001})}load(){return this._rewardAd?this._rewardAd.load():Promise.reject({errMsg:"[RewardAdFather] can not load,rewardAd is null",errorCode:110002})}onError(e){this._rewardAd&&this._rewardAd.onError(e)}offError(e){this._rewardAd&&this._rewardAd.offError(e)}onLoad(e){this._rewardAd&&this._rewardAd.onLoad(e)}offLoad(e){this._rewardAd&&this._rewardAd.offLoad(e)}placeholder(){return null}static buildArgs(t){t?.adUnitId||new e({prefix:"RewardAdFather",enable:!0}).error("RewardParams.adUnitId is required"),s.args=t}static async executeWithManager(t,r){return t&&t instanceof s?i.getInstance().addTask(t,r):(new e({prefix:"RewardAdFather",enable:!0}).error("executeWithManager - 无效的广告实例"),Promise.reject(Error("无效的广告实例")))}}let n=s;function o(e,t){return!!t&&e.some(e=>RegExp(e,"i").test(t))}let l=Object.entries({9999:"inner_default_other"}).reduce((e,[t,i])=>(e[i]=Number(t),e),{}),a={AD_TYPE_REWARD:1,AD_TYPE_INTERSTITIAL:2};Object.entries(a).reduce((e,[t,i])=>(e[i]=t,e),{});class h extends n{_onHalfway=null;_onShow=null;_onFinish=null;_onAlways=null;_onError=null;_logger=null;_initSign="";_alwaysCallback=null;_halfwayCallback=null;_finishedCallback=null;_resolve=null;_next=null;_scene=l.inner_default_other;_adTypeR=a.AD_TYPE_REWARD;_adTimeout=null;_adTimeoutTime=8e3;_adBeforeShowTimer=null;_adBeforeShowTime=300;_adSpeedCloseTimer=null;_adSpeedCloseTime=5e3;_needEndOnTimeout=!0;_needSpeedEndOnTimeout=!1;_proactive=!1;bindAdCloseLister=this.__adCloseLister__.bind(this);bindAdErrorLister=this.adErrorLister.bind(this);bindAdLoadLister=this.adLoadLister.bind(this);bindApiAdErrorLister=this.apiAdErrorLister.bind(this);_bindShiftCloseLister=this._shiftCloseLister.bind(this);_bindShiftErrorLister=this._shiftErrorLister.bind(this);constructor(t){super(t),this._logger=new e({prefix:"RewardAdNovel",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._needEndOnTimeout=t?.needEndOnTimeout??!0,this._proactive=t?.proactive??!1,this._onHalfway=t?.collection?.onHalfway??null,this._onShow=t?.collection?.onShow??null,this._onFinish=t?.collection?.onFinish??null,this._onAlways=t?.collection?.onAlways??null,this._onError=t?.collection?.onError??null}initialize(e,t){return super.initialize(e,t),this._initAdLister(),this._initNovelConfig(e),this}_initAdLister(){this.onClose(this.bindAdCloseLister),this.onError(this.bindAdErrorLister),this.onLoad(this.bindAdLoadLister),tt.onError(this.bindApiAdErrorLister)}_initNovelConfig(e){this.novelConfig=d.new({retry:e?.retry})}_onInnerExecuteBefore(){return null}_onInnerAdShowSuccess(e){return null}_setAdTimeout(e){if(this._needSpeedEndOnTimeout&&(this._adSpeedCloseTimer=setTimeout(()=>{if("ios"==tt.getSystemInfoSync().platform){let t=()=>{tt.offAppShow(t),this._logger.warn("ad_show_timeout: ios platform close ad onAppShow, handling fallback ad case, scene:",e?.scene);let i="ad_show_timeout: ios platform close ad onAppShow";this._adShowFailureAnalytics({scene:e?.scene,msg:i,errorCode:1e5,result:0}),this._adTimeout&&clearTimeout(this._adTimeout),e?.end({resolvedValue:{apiError:{errMsg:i,errorCode:1e5}},nextValue:null})};tt.onAppShow(t)}clearTimeout(this._adSpeedCloseTimer)},this._adSpeedCloseTime)),this._needEndOnTimeout){let t=e?.timeout??this._adTimeoutTime;this._adTimeout=setTimeout(()=>{this._logger.warn("Ad show timeout, handling fallback ad case,",`scene: ${e?.scene},timeout: ${t}`),this._adShowFailureAnalytics({scene:e?.scene,msg:"ad_show_timeout: normal",errorCode:1e5,result:0}),this._adTimeoutBeforeEnd({scene:e?.scene,timeout:t}),e?.end({resolvedValue:{apiError:{errMsg:`ad_show_timeout: normal, reward ad, timeout: ${t}`,errorCode:1e5,timeout:t}},nextValue:null})},t)}}_adTimeoutBeforeEnd(e){return e}_adPreludeInterval(e){e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()}),this._adBeforeShowTimer=setInterval(()=>{e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()})},this._adBeforeShowTime)}_clearAdTimeout(){this._adTimeout&&(clearTimeout(this._adTimeout),this._adTimeout=null),this._adBeforeShowTimer&&(clearInterval(this._adBeforeShowTimer),this._adBeforeShowTimer=null),this._adSpeedCloseTimer&&(clearTimeout(this._adSpeedCloseTimer),this._adSpeedCloseTimer=null)}_adShowBeforeAnalytics(e){return null}_adShowSuccessAnalytics(e){return null}_adShowFailureAnalytics(e){return null}_adLoadSuccessAnalytics(e){return null}_adLoadFailureAnalytics(e){return null}_adCloseSuccessAnalytics(e){return null}get rewardAd(){return this._rewardAd}addExecuteManager(e){return super.addExecuteManager(e)}ad(e,t=null){return this._alwaysCallback=e?.collection?.always,this._halfwayCallback=e?.collection?.halfway,this._finishedCallback=e?.collection?.finished,this._recovered=e?.recovered,this._proactive=e?.options?.proactive??this._proactive,this._onInnerExecuteBefore(),new Promise(i=>{this._adInner({options:{scene:e?.options?.scene,timeout:e?.options?.timeout},collection:{resolve:i,before:e.collection?.before,success:e.collection?.success,prelude:e.collection?.prelude},recovered:e.recovered},t)})}_adInner(e,t=null){let i=e?.collection?.resolve,r=e?.options?.scene??this._scene??l.inner_default_other,s=e?.collection?.before,n=e?.collection?.success,a=e?.collection?.prelude,h=e?.recovered??this._recovered,d=e=>{this._clearAdTimeout(),this.adDestroy(),i?.(Object.assign({scene:r,adTypeR:this._adTypeR},e?.resolvedValue)),t?.(Object.assign({scene:r},e?.nextValue))},c=()=>{this._scene=r,s?.({scene:r}),this._before=s,this._onShow?.({scene:r}),this._adShowBeforeAnalytics({scene:r}),this._resolve=i,this._next=t,this._setAdTimeout({scene:r,end:d,timeout:e?.options?.timeout}),this._adPreludeInterval({scene:r,prelude:a}),this.adShow().then(()=>{this._clearAdTimeout(),n?.({scene:r}),this._success=n,this._adShowSuccessAnalytics({scene:r,result:1,recovered:h}),this._onInnerAdShowSuccess({scene:r,result:1,recovered:h})}).catch(e=>{(this._clearAdTimeout(),this._adShowFailureAnalytics({scene:r,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),o(this._ttErrorMsgs,e?.errMsg)||this._ttErrorCodes.includes(e?.errorCode))?d({scene:r,resolvedValue:{apiError:e},nextValue:null}):0>=this.novelConfig.remain()?d({scene:r,resolvedValue:{apiError:{errMsg:`[RewardAdNovel]: no remain, remain: ${this.novelConfig.remain()}, retry: ${this.novelConfig.frequency.total},
2
- tt: {errMsg: ${e?.errMsg}, errorCode: ${e?.errorCode}}`,errorCode:1e5}},nextValue:null}):(this.novelConfig.updateRetry(),this.adLoad().then(()=>{this._adLoadSuccessAnalytics({scene:r,result:1,frequency:this.novelConfig.frequency}),c()}).catch(e=>{this._adLoadFailureAnalytics({scene:r,msg:e?.errMsg,result:0}),d({scene:r,resolvedValue:{apiError:e},nextValue:null})}))})};c()}adLoad(){return this.load()}adShow(){return this.show()}_outerCloseCallback(e){this._alwaysCallback?.(e)}_outerHalfwayCallback(e){this._halfwayCallback?.(e)}_outerFinishedCallback(e){this._finishedCallback?.(e)}__adCloseLister__(e){this._clearAdTimeout(),this._adCloseSuccessAnalytics({scene:this._scene,ad_is_completed:+!!e.isEnded,ad_count:e.count});let t=Object.assign({},e,{end_type:e.isEnded?"finished":"halfway",scene:this._scene,adTypeR:this._adTypeR}),i=e=>{this.adDestroy(),this._resolve?.(Object.assign({},t,e)),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null},r=e=>{let i=Object.assign({},t,e);i?.isEnded?(this._outerFinishedCallback(i),this._onFinish?.(i)):(this._outerHalfwayCallback(i),this._onHalfway?.(i)),this._outerCloseCallback(i),this._onAlways?.(i)};"function"==typeof this.adCloseLister?(this.adCloseLister(Object.assign({},t,{conn:this._proactive?e=>{r(e)}:null,end:this._proactive?e=>{i(e)}:null})),this._proactive||(r(),i())):(r(),i())}adCloseLister(e){return e}adErrorLister(e){this._clearAdTimeout(),this._logger.error("adErrorLister",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}apiAdErrorLister(e){this._clearAdTimeout(),this._logger.error("API apiAdErrorLister:",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}adLoadLister(e){this._adLoadSuccessAnalytics({scene:this._scene,result:1,msg:e?.errMsg}),this._logger.info("adLoadLister:",JSON.stringify({scene:this._scene,info:e}))}adDestroy(){this.offClose(this.bindAdCloseLister),this.offError(this.bindAdErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.destroy()}clear(){this._clearAdTimeout(),this.offClose(this.bindAdCloseLister),this.offClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.destroy(),this._resolve=null,this._next=null,this._success=null,this._before=null}_shiftCloseLister(e){this._clearAdTimeout(),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.offClose(this._bindShiftCloseLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}_shiftErrorLister(e){this._clearAdTimeout(),this.offClose(this._bindShiftCloseLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.offError(this._bindShiftErrorLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}shift(){this.offClose(this.bindAdCloseLister),this.onClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.onError(this._bindShiftErrorLister)}static build(e){return h.instance||(h.instance=new h(e)),h.instance}static getInstance(){if(!h.instance)throw Error("RewardAdNovel instance is not init");return h.instance}static new(e){return new h(e)}}class d{frequency={total:0,current:0};constructor(e){this._init(e)}_init(e){this._adTimes(e)}_adTimes(e){this.frequency.total=e?.retry??4}reset(){this.frequency.current=0}updateRetry(){this.frequency.current=this.frequency.current+1}remain(){return this.frequency.total-this.frequency.current}static new(e){return new d(e)}}let c=h;class _{static args=null;_logger=null;_initSign="";_preserveOnEnd=!1;_interstitialAd=null;__ad__=null;_ttErrorMsgs=["The adUnitId is closed","The adUnitId is prohibit","The adUnitId is invalid","The adUnitId is required","The adUnitId is empty","feature is not supported in app"];_ttErrorCodes=[139902,123302,140502];constructor(t){this._logger=new e({prefix:"InterstitialAdFather",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._preserveOnEnd=t?.preserveOnEnd??!1}initialize(e,t){if(this._interstitialAd)return this._logger.warn("interstitialAd has been initialized"),t?.(this._interstitialAd),this;let i=Object.assign({},_.args,this._adConfig,e);if(!i.adUnitId)throw this._logger.error("interstitialAd args The adUnitId is required",i),new r("[InterstitialAdFather] interstitialAd args The adUnitId is required",{errMsg:"The adUnitId is required",errorCode:100003});let s=tt.createInterstitialAd(i);return this._interstitialAd=s,this.__ad__=s,t?.(this._interstitialAd),this}initialized(){return!!this._interstitialAd}async ad(e,t=null){throw Error("子类必须实现ad方法")}async addExecuteManager(e){let t=Object.assign({},this._adConfig,e?.options??{});return _.executeWithManager(this,Object.assign({},e,{options:t}))}destroy(){this._interstitialAd&&!this._preserveOnEnd&&(this._interstitialAd.destroy(),this._interstitialAd=null)}clear(){throw Error("子类必须实现clear方法")}record(e){return this}onClose(e){this._interstitialAd&&this._interstitialAd.onClose(e)}offClose(e){this._interstitialAd&&this._interstitialAd.offClose(e)}show(){return this._interstitialAd?this._interstitialAd.show():Promise.reject({errMsg:"[InterstitialAdFather] can not show,interstitialAd is null",errorCode:120001})}load(){return this._interstitialAd?this._interstitialAd.load():Promise.reject({errMsg:"[InterstitialAdFather] can not load,interstitialAd is null",errorCode:120002})}onError(e){this._interstitialAd&&this._interstitialAd.onError(e)}offError(e){this._interstitialAd&&this._interstitialAd.offError(e)}onLoad(e){this._interstitialAd&&this._interstitialAd.onLoad(e)}offLoad(e){this._interstitialAd&&this._interstitialAd.offLoad(e)}placeholder(){return null}static buildArgs(t){t?.adUnitId||new e({prefix:"InterstitialAdFather",enable:!0}).error("interstitialAdParams.adUnitId is required"),_.args=t}static async executeWithManager(t,r){return t&&t instanceof _?i.getInstance().addTask(t,r):(new e({prefix:"InterstitialAdFather",enable:!0}).error("executeWithManager - 无效的广告实例"),Promise.reject(Error("无效的广告实例")))}}let u=_;class f extends u{_onHalfway=null;_onShow=null;_onFinish=null;_onAlways=null;_onError=null;_logger=null;_initSign="";_alwaysCallback=null;_halfwayCallback=null;_finishedCallback=null;_resolve=null;_next=null;_scene=l.inner_default_other;_adTypeR=a.AD_TYPE_INTERSTITIAL;_adTimeout=null;_adTimeoutTime=8e3;_adBeforeShowTimer=null;_adBeforeShowTime=300;_adSpeedCloseTimer=null;_adSpeedCloseTime=5e3;_needEndOnTimeout=!0;_needSpeedEndOnTimeout=!1;bindAdCloseLister=this.adCloseLister.bind(this);bindAdErrorLister=this.adErrorLister.bind(this);bindAdLoadLister=this.adLoadLister.bind(this);bindApiAdErrorLister=this.apiAdErrorLister.bind(this);_bindShiftCloseLister=this._shiftCloseLister.bind(this);_bindShiftErrorLister=this._shiftErrorLister.bind(this);constructor(t){super(t),this._logger=new e({prefix:"InterstitialAdNovel",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._needEndOnTimeout=t?.needEndOnTimeout??!0,this._onHalfway=t?.collection?.onHalfway??null,this._onShow=t?.collection?.onShow??null,this._onFinish=t?.collection?.onFinish??null,this._onAlways=t?.collection?.onAlways??null,this._onError=t?.collection?.onError??null}initialize(e,t){return super.initialize(e,t),this._initAdLister(),this._initNovelConfig(e),this}_initAdLister(){this.onClose(this.bindAdCloseLister),this.onError(this.bindAdErrorLister),this.onLoad(this.bindAdLoadLister),tt.onError(this.bindApiAdErrorLister)}_initNovelConfig(e){this.novelConfig=g.new({retry:e?.retry})}_onInnerExecuteBefore(){return null}_onInnerAdShowSuccess(){return null}_setAdTimeout(e){this._needSpeedEndOnTimeout&&(this._adSpeedCloseTimer=setTimeout(()=>{if("ios"==tt.getSystemInfoSync().platform){let t=()=>{tt.offAppShow(t),this._logger.warn("ad_show_timeout: ios platform close ad onAppShow, handling fallback ad case, scene:",e?.scene);let i="ad_show_timeout: ios platform close ad onAppShow";this._adShowFailureAnalytics({scene:e?.scene,msg:i,errorCode:100001,result:0}),this._adTimeout&&clearTimeout(this._adTimeout),e?.end({resolvedValue:{apiError:{errMsg:i,errorCode:100001}},nextValue:null})};tt.onAppShow(t)}clearTimeout(this._adSpeedCloseTimer)},this._adSpeedCloseTime)),this._needEndOnTimeout&&(this._adTimeout=setTimeout(()=>{this._logger.warn("Ad show timeout, handling fallback ad case, scene:",e?.scene),this._adShowFailureAnalytics({scene:e?.scene,msg:`ad_show_timeout: normal, interstitial ad, timeout: ${this._adTimeoutTime}`,errorCode:100001,result:0}),e?.end({resolvedValue:{apiError:{errMsg:`ad_show_timeout: normal, interstitial ad, timeout: ${this._adTimeoutTime}`,errorCode:100001}},nextValue:null})},this._adTimeoutTime))}_adPreludeInterval(e){e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()}),this._adBeforeShowTimer=setInterval(()=>{e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()})},this._adBeforeShowTime)}_clearAdTimeout(){this._adTimeout&&(clearTimeout(this._adTimeout),this._adTimeout=null),this._adBeforeShowTimer&&(clearTimeout(this._adBeforeShowTimer),this._adBeforeShowTimer=null),this._adSpeedCloseTimer&&(clearTimeout(this._adSpeedCloseTimer),this._adSpeedCloseTimer=null)}_adShowBeforeAnalytics(e){return null}_adShowSuccessAnalytics(e){return null}_adShowFailureAnalytics(e){return null}_adLoadSuccessAnalytics(e){return null}_adLoadFailureAnalytics(e){return null}_adCloseSuccessAnalytics(e){return null}get rewardAd(){return this._rewardAd}addExecuteManager(e){return super.addExecuteManager(e)}ad(e,t=null){return this._alwaysCallback=e?.collection?.always,this._halfwayCallback=e?.collection?.halfway,this._finishedCallback=e?.collection?.finished,this._onInnerExecuteBefore(),new Promise(i=>{this._adInner({options:{scene:e?.options?.scene},collection:{resolve:i,before:e.collection?.before,success:e.collection?.success,prelude:e.collection?.prelude}},t)})}_adInner(e,t=null){let i=e?.collection?.resolve,r=e?.options?.scene??this._scene??l.inner_default_other,s=e?.collection?.before,n=e?.collection?.success,a=e?.collection?.prelude,h=e=>{this._clearAdTimeout(),this.adDestroy(),i?.(Object.assign({scene:r,adTypeR:this._adTypeR},e?.resolvedValue)),t?.(Object.assign({scene:r},e?.nextValue))},d=()=>{this._scene=r,s?.({scene:r}),this._before=s,this._onShow?.({scene:r}),this._adShowBeforeAnalytics({scene:r}),this._resolve=i,this._next=t,this._setAdTimeout({scene:r,end:h}),this._adPreludeInterval({scene:r,prelude:a}),this.adShow().then(()=>{this._clearAdTimeout(),n?.({scene:r}),this._success=n,this._adShowSuccessAnalytics({scene:r,result:1}),this._onInnerAdShowSuccess()}).catch(e=>{(this._clearAdTimeout(),this._adShowFailureAnalytics({scene:r,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),o(this._ttErrorMsgs,e?.errMsg)||this._ttErrorCodes.includes(e?.errorCode))?h({scene:r,resolvedValue:{apiError:e},nextValue:null}):0>=this.novelConfig.remain()?h({scene:r,resolvedValue:null,nextValue:null}):(this.novelConfig.updateRetry(),this.adLoad().then(()=>{this._adLoadSuccessAnalytics({scene:r,result:1}),d()}).catch(e=>{this._adLoadFailureAnalytics({scene:r,msg:e?.errMsg,result:0}),h({scene:r,resolvedValue:{apiError:e},nextValue:null})}))})};d()}adLoad(){return this.load()}adShow(){return this.show()}_outerCloseCallback(e){this._alwaysCallback?.(e)}_outerHalfwayCallback(e){this._halfwayCallback?.(e)}_outerFinishedCallback(e){this._finishedCallback?.(e)}adCloseLister(){this._clearAdTimeout(),this._adCloseSuccessAnalytics({scene:this._scene,ad_is_completed:1});let e={scene:this._scene},t=e=>{this.adDestroy(),this._resolve?.(Object.assign({},{scene:this._scene,adTypeR:this._adTypeR},e)),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null};this._outerFinishedCallback(e),this._onFinish?.(e),this._outerHalfwayCallback(e),this._onHalfway?.(e),this._outerCloseCallback(e),this._onAlways?.(e),t({end_type:"finished"})}adErrorLister(e){this._clearAdTimeout(),this._logger.error("adErrorLister",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this._onError?.(e),0>=this.novelConfig.remain()&&(this.adDestroy(),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null)}apiAdErrorLister(e){this._clearAdTimeout(),this._logger.error("API apiAdErrorLister:",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}adLoadLister(e){this._adLoadSuccessAnalytics({scene:this._scene,result:1,msg:e?.errMsg}),this._logger.info("adLoadLister:",JSON.stringify({scene:this._scene,info:e}))}adDestroy(){this.offClose(this.bindAdCloseLister),this.offError(this.bindAdErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.destroy()}clear(){this._clearAdTimeout(),this.offClose(this.bindAdCloseLister),this.offClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.destroy(),this._resolve=null,this._next=null,this._success=null,this._before=null}_shiftCloseLister(e){this._clearAdTimeout(),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.offClose(this._bindShiftCloseLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}_shiftErrorLister(e){this._clearAdTimeout(),this.offClose(this._bindShiftCloseLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.offError(this._bindShiftErrorLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}shift(){this.offClose(this.bindAdCloseLister),this.onClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.onError(this._bindShiftErrorLister)}static build(e){return f.instance||(f.instance=new f(e)),f.instance}static getInstance(){if(!f.instance)throw Error("InterstitialAdNovel instance is not init");return f.instance}static new(e){return new f(e)}}class g{frequency={total:0,current:0};constructor(e){this._init(e)}_init(e){this._adTimes(e)}_adTimes(e){this.frequency.total=e?.retry??4}reset(){this.frequency.current=0}updateRetry(){this.frequency.current=this.frequency.current+1}remain(){return this.frequency.total-this.frequency.current}static new(e){return new g(e)}}let y=f;class w{constructor(t={}){this.config={prefix:"storage_",expire:null,...t},this.logger=new e({prefix:"Storage"})}getTodayEndTimestamp(){let e=new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999).getTime()}_setItem(e,t,i){let r=void 0!==i?i:this.config.expire;"today"===r&&(r=this.getTodayEndTimestamp()-Date.now());let s={value:t,expire:r,timestamp:Date.now()};try{tt.setStorageSync(e,JSON.stringify(s))}catch(e){console.error("Storage setItem error:",e)}}_getItem(e){try{let t=tt.getStorageSync(e);if(!t)return null;let i=JSON.parse(t);if(i.expire&&Date.now()-i.timestamp>i.expire)return this.removeItem(e),null;return i.value}catch(e){return console.error("Storage getItem error:",e),null}}setItem(e,t,i){let r=this.config.prefix+e;return this._setItem(r,t,i)}getItem(e){let t=this.config.prefix+e;return this._getItem(t)}getUserItem(e){let t=this.config.userId??"null";if("null"===t)return this.logger.error("userId is required"),null;let i=`${this.config.prefix}_${t}_${e}`;return this._getItem(i)}setUserItem(e,t,i){let r=this.config.userId??"null";if("null"===r)return void this.logger.error("userId is required");let s=`${this.config.prefix}_${r}_${e}`;return this._setItem(s,t,i)}removeItem(e){try{tt.removeStorageSync(e)}catch(e){console.error("Storage removeItem error:",e)}}clear(){try{tt.clearStorageSync()}catch(e){console.error("Storage clear error:",e)}}keys(){try{let e=[];return(tt.getStorageInfoSync().keys??[]).forEach(t=>{if(t.startsWith(this.config.prefix)){let i=JSON.parse(tt.getStorageSync(t));(!i.expire||Date.now()-i.timestamp<=i.expire)&&e.push(t.replace(this.config.prefix,""))}}),e}catch(e){return console.error("Storage keys error:",e),[]}}static new(e){return new w(e)}}let p=w;class m{_total=0;_local_sign="";_expire="today";constructor(e){if(this.storage=p.new({userId:e.userId}),!e.local_sign)throw Error("local_sign is required");this._local_sign=e.local_sign,this._total=e.total??0,this._expire=e.expire??"today",this._init()}_init(){this._initLocalTimes()}_adTimes(){return this._total}_safeLocalValue(e){return"object"!=typeof e||null===e?{}:e}_initLocalTimes(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),i=this._safeLocalValue(t);i&&i?.total==e||this.storage.setUserItem(this._local_sign,{total:e,today:i?.today??0},this._expire)}updateToday(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),i=this._safeLocalValue(t),r=i?.today??0;this.storage.setUserItem(this._local_sign,{total:e,today:r+1},this._expire)}remain(){let e=this.storage.getUserItem(this._local_sign),t=this._safeLocalValue(e),i=t?.today??0;return Number(t?.total??0)-Number(i)}static new(e){return new m(e)}}class b{constructor(){this.events={}}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),()=>{this.off(e,t)}}off(e,t){if(this.events[e]){if(!t){this.events[e]=[];return}this.events[e]=this.events[e].filter(e=>e!==t)}}emit(e,...t){this.events[e]&&this.events[e].forEach(i=>{try{i(...t)}catch(t){console.error(`Error in event listener for ${e}:`,t)}})}once(e,t){let i=(...r)=>{t(...r),this.off(e,i)};this.on(e,i)}listenerCount(e){return this.events[e]?this.events[e].length:0}removeAllListeners(){this.events={}}}class A{static instance=null;_logger=null;_initSign="";_needReport=!1;constructor(t){if(A.instance)return A.instance;this._logger=new e({prefix:"AdAnalyticsJS",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._needReport=t?.needReport??!1,this._commonConfig=t?.commonConfig??null,A.instance=this}initialize(e){return this._needReport?e:void this._logger.warn("needReport is false, do not report")}track(e,t,i){if(!this._needReport)return;if(!e)throw Error("eventName is required");let r=Object.assign({},this.getTrackCommonInfo(),t),s=i?.sign??"track";this._logger.log(`---------${s}----------:`,e,r),tt.reportAnalytics(e,r)}getCommonInfo(){return this._commonConfig??{}}getTrackCommonInfo(){return this._commonConfig??{}}identify(e,t){if(!e&&0!==e)throw Error("identify user_id is required");return this._commonConfig=Object.assign({},this._commonConfig,{__user_id:e},t),this}alias(){return null}pages(){return null}page(e,t){this.track(e,t,{sign:"page"})}cpage(e){return this.page("cpage",e)}placeholder(){return null}static build(e){return A.instance||(A.instance=new A(e)),A.instance}static getInstance(){if(!A.instance)throw Error("AdAnalyticsJS instance is not init");return A.instance}static new(e){return new A(e)}}let C=A;class T{static instance=null;_initSign="";_halfway=[{scene:l.inner_default_other,count:0}];_finished=[{scene:l.inner_default_other,count:0}];constructor(e){if(T.instance)return T.instance;this._initSign=e?.sign??"",this._halfway=[{scene:l.inner_default_other,count:0}],this._finished=[{scene:l.inner_default_other,count:0}],T.instance=this}initialize(e){}_halfwayUpdate(e){let t=this._halfway.find(t=>t.scene===e.scene);t?t.count+=1:this._halfway.push({scene:e.scene,count:1})}_halfwayGet(e){let t=e?.scenes??[];return(t.length>0?this._halfway.filter(e=>t.includes(e.scene)):this._halfway).reduce((e,t)=>e+t.count,0)}_halfwayReset(){this._halfway=[{scene:l.inner_default_other,count:0}]}_finishedUpdate(e){let t=this._finished.find(t=>t.scene===e.scene);t?t.count+=1:this._finished.push({scene:e.scene,count:1})}_finishedGet(e){let t=e?.scenes??[];return(t.length>0?this._finished.filter(e=>t.includes(e.scene)):this._finished).reduce((e,t)=>e+t.count,0)}_finishedReset(){this._finished=[{scene:l.inner_default_other,count:0}]}record(e){switch(e.type){case"halfway":this._halfwayUpdate(e);break;case"finished":this._finishedUpdate(e)}}rest(e){switch(e){case"halfway":this._halfwayReset();break;case"finished":this._finishedReset()}}get(e){switch(e.type){case"halfway":return this._halfwayGet(e);case"finished":return this._finishedGet(e);default:return null}}placeholder(){return null}static build(e){return T.instance||(T.instance=new T(e)),T.instance}static getInstance(){if(!T.instance)throw Error("RewardAdGlobalRecorder instance is not init");return T.instance}}let S=T;class E{static instance=null;_logger=null;_initSign="";_currScene=null;_sceneTypeObj={};constructor(t){if(E.instance)return E.instance;this._logger=new e({prefix:"AdSceneTriggerManager",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._sceneTypeObj=t?.sceneTypeObj??{},E.instance=this}initialize(e){}addScene(e){return this._logger.log("----------AD触发场景:---------",e),this._currScene=e,this}addSceneType(e=1){return this.addScene(this._sceneTypeObj[e]),this}getCurrentScene(){return this._currScene}placeholder(){return null}static build(e){return E.instance||(E.instance=new E(e)),E.instance}static getInstance(){if(!E.instance)throw Error("RewardAdSceneTriggerManager instance is not init");return E.instance}}let L=E,k=i;export{C as AdAnalyticsJS,i as AdExecuteManager,m as CountRecorder,y as InterstitialAdDrama,u as InterstitialAdFather,y as InterstitialAdNovel,e as Logger,b as PubSub,c as RewardAdDrama,n as RewardAdFather,S as RewardAdGlobalRecorder,c as RewardAdNovel,L as RewardAdSceneTriggerManager,r as SerializableError,p as Storage,k as default};
1
+ import{Logger as e,SerializableError as t}from"@ad-execute-manager/helper";import{AdExecuteManager as i}from"@ad-execute-manager/core";class r{static _instance=null;_taskStack=[];_currentBatchTasks=[];_isRunning=!1;_currentTask=null;_isForeground=!0;_appShowListener=null;_appHideListener=null;_enableVisibilityListener=!1;_maxRetryCount=1;_retryQueue=[];_errorRetryStrategy={timeout:!0,background:!0};constructor(t){this.logger=new e({prefix:"AdExecuteManager",enabled:!!t?.log}),t?.errorRetryStrategy&&(this._errorRetryStrategy=Object.assign({},this._errorRetryStrategy,t?.errorRetryStrategy)),this._enableVisibilityListener=t?.enableVisibilityListener,this._maxRetryCount=t?.maxRetryCount??1,this._enableVisibilityListener&&this._initVisibilityListener()}initialize(e){return this}static getInstance(e){return r._instance||(r._instance=new r(e)),r._instance}static build(e){return r._instance||(r._instance=new r(e)),r._instance}static new(e){return new r(e)}static getSafeInstance(){return r._instance?r._instance:(this.logger.error("AdExecuteManager实例不存在"),null)}_initVisibilityListener(){!("u"<typeof tt)&&tt.onAppShow&&tt.onAppHide?(this._appShowListener=()=>{this._isForeground=!0,this._handleAppShow()},this._appHideListener=()=>{this._isForeground=!1,this._handleAppHide()},tt.onAppShow(this._appShowListener),tt.onAppHide(this._appHideListener),this.logger.info("前后台监听器已初始化")):this.logger.warn("tt API不可用,无法监听前后台状态")}_handleAppHide(){if(this._isRunning&&this._currentBatchTasks.length>0){let e=this._currentBatchTasks.filter(e=>e.id!==this._currentTask?.id&&!e._isResolved&&!e._isRejected);e.length>0&&(this.logger.info(`将 ${e.length} 个未执行的任务放回任务栈,任务ID: ${e.map(e=>e.id).join(",")}`),this._taskStack=[...e,...this._taskStack],this._currentBatchTasks=this._currentBatchTasks.filter(t=>!e.some(e=>e.id===t.id)))}}_handleAppShow(){this._retryQueue.length>0&&(this.logger.info(`应用进入前台:优先执行重试队列,任务数: ${this._retryQueue.length}, 任务ID: ${this._retryQueue.map(e=>e.id).join(",")}`),this._taskStack=[...this._retryQueue,...this._taskStack],this._retryQueue=[]),this._taskStack.length>0&&!this._isRunning&&(this.logger.info(`应用进入前台:恢复待执行任务数: ${this._taskStack.length}, 任务ID: ${this._taskStack.map(e=>e.id).join(",")}`),this._compose())}destroyVisibilityListener(){this._appShowListener&&"u">typeof tt&&tt.offAppShow&&(tt.offAppShow(this._appShowListener),this._appShowListener=null),this._appHideListener&&"u">typeof tt&&tt.offAppHide&&(tt.offAppHide(this._appHideListener),this._appHideListener=null),this.logger.info("前后台监听器已销毁")}enableVisibilityListener(){this._enableVisibilityListener||(this._enableVisibilityListener=!0,this._initVisibilityListener()),this.logger.info("前后台监听器已启用")}disableVisibilityListener(){this._enableVisibilityListener&&(this._enableVisibilityListener=!1,this.destroyVisibilityListener()),this.logger.info("前后台监听器已禁用")}isVisibilityListenerEnabled(){return this._enableVisibilityListener}addTask(e,t){return e&&"function"==typeof e.ad?new Promise((i,r)=>{let s={adInstance:e,options:t.options??{},callbackCollection:t.collection??{},resolve:i,reject:r,id:`ad_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,_isResolved:!1,_isRejected:!1,_retryCount:0,_retryMsg:"ok"};this._taskStack.push(s),this._isRunning||this._compose()}):(this.logger.error("无效的广告实例 请正确实现.ad方法"),Promise.reject(Error("无效的广告实例")))}_compose(){if(0===this._taskStack.length){this._isRunning=!1,this._currentTask=null;return}if(!this._isForeground){this.logger.info(`应用处于后台,暂停任务执行,任务ID: ${this._taskStack.map(e=>e.id).join(",")}`),this._isRunning=!1;return}this._isRunning=!0;let e=[...this._taskStack];this._taskStack=[],this._currentBatchTasks=e;let t=e.map(e=>async(t,i)=>{let{adInstance:r,options:s,callbackCollection:n,resolve:o,id:l,_retryCount:a,_retryMsg:h}=e,d={count:a,retry:a>0,message:h};if(e._isResolved||e._isRejected)return void await i(t);this._currentTask=e;try{let a=async e=>{await i(Object.assign({},t,e))},h=await r.initialize(s).ad({options:s,collection:n,recovered:d},a),c=Object.assign({id:l,recovered:d},h);if(this.logger.info(`任务执行成功,成功信息:${JSON.stringify(c)}`),function({apiError:e,configuredAdTimeout:t,errorRetryStrategy:i}){return!!(i?.timeout&&e?.errMsg&&"string"==typeof e.errMsg&&e.errMsg.startsWith("ad_show_timeout: normal")&&e?.timeout==t)||!!(i?.background&&e?.errMsg&&"string"==typeof e.errMsg&&(e.errMsg.startsWith("app in background is not support show ad")||e.errMsg.startsWith("other controller is presented")))}({apiError:c?.apiError,configuredAdTimeout:r._adTimeoutTime,errorRetryStrategy:this._errorRetryStrategy})&&!this._isForeground&&e._retryCount<this._maxRetryCount){e._retryCount++,e._retryMsg=c?.apiError?.errMsg||"unknown";let t=`任务 ${l} 在后台失败,加入重试队列 (即将第 ${e._retryCount} 次重试, 最大重试次数 ${this._maxRetryCount}, 重试原因: ${e._retryMsg})`;this.logger.warn(t),c.recovered.retry=!0,c.recovered.count=e._retryCount,c.recovered.message=e._retryMsg,e._isResolved=!1,e._isRejected=!1,this._retryQueue.push(e)}else e._isResolved=!0;o(c),r?.record(c)}catch(n){let s=Object.assign({id:l,apiError:n,recovered:d});this.logger.error(`任务执行失败, 继续下一个任务,错误信息:${JSON.stringify(s)}`),e._isRejected=!0;try{r?.clear()}catch(e){this.logger.error("clear error: ",JSON.stringify(Object.assign({id:l,apiError:e})))}o(s),r?.record(s),await i(t)}}),i={roundTasks:t.length};t.map(e=>(t,i)=>async r=>await e(Object.assign({},t,r),i)).reduce((e,t)=>(i,r)=>e(i,t(i,r)))(i,async e=>{this.logger.info("本轮活动队列已经清空",e),this._taskStack.length>0?Promise.resolve().then(()=>{this._compose()}):(this._isRunning=!1,this._currentTask=null,this._currentBatchTasks=[])})()}clearTasks(){if(this._currentTask){if(this._currentTask._isResolved||this._currentTask._isRejected){this._currentTask=null;return}try{this._currentTask.callbackCollection&&this._currentTask.callbackCollection.onCancel&&this._currentTask.callbackCollection.onCancel(),this._currentTask._isResolved=!0,this._currentTask.resolve()}catch(e){this.logger.error("clear current task error: ",e)}this._currentTask=null}this._currentBatchTasks.length>0&&(this._currentBatchTasks.forEach(e=>{if(e!==this._currentTask&&!e._isResolved&&!e._isRejected)try{e.callbackCollection&&e.callbackCollection.onCancel&&e.callbackCollection.onCancel(),e._isResolved=!0,e.resolve()}catch(e){this.logger.error("clear current batch task error: ",e)}}),this._currentBatchTasks=[]),this._taskStack.forEach(e=>{if(!e._isResolved&&!e._isRejected&&(e._isResolved=!0,e.resolve(),e.callbackCollection&&e.callbackCollection.onCancel))try{e.callbackCollection.onCancel()}catch(e){this.logger.error("clear task error: ",e)}}),this._retryQueue.forEach(e=>{if(!e._isResolved&&!e._isRejected&&(e._isResolved=!0,e.resolve(),e.callbackCollection&&e.callbackCollection.onCancel))try{e.callbackCollection.onCancel()}catch(e){this.logger.error("clear retry task error: ",e)}}),this._taskStack=[],this._retryQueue=[],this._isRunning=!1}getTaskCount(){return this._taskStack.filter(e=>!e._isResolved&&!e._isRejected).length+this._currentBatchTasks.filter(e=>e!==this._currentTask&&!e._isResolved&&!e._isRejected).length+(!this._currentTask||this._currentTask._isResolved||this._currentTask._isRejected?0:1)+this._retryQueue.filter(e=>!e._isResolved&&!e._isRejected).length}isRunning(){return this._isRunning}getCurrentTaskId(){return this._currentTask?.id||null}whenAllTasksComplete(){return new Promise(e=>{let t=null,i=()=>{let r=0===this._taskStack.length,s=!this._isRunning,n=null===this._currentTask,o=0===this._currentBatchTasks.length||this._currentBatchTasks.every(e=>e._isResolved||e._isRejected),l=0===this._retryQueue.length;r&&s&&n&&o&&l?(t&&clearTimeout(t),e()):t=setTimeout(i,500)};i()})}}let s=r;class n{static args=null;_logger=null;_adTimeoutTime=8e3;_initSign="";_preserveOnEnd=!1;_rewardAd=null;__ad__=null;_ttErrorMsgs=["The adUnitId is closed","The adUnitId is prohibit","The adUnitId is invalid","The adUnitId is required","The adUnitId is empty","feature is not supported in app"];_ttErrorCodes=[139902,123302];__bindAdErrorForeverHandler=this.__adErrorForeverHandler.bind(this);constructor(t){this._logger=new e({prefix:"RewardAdFather",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._preserveOnEnd=t?.preserveOnEnd??!1}initialize(e,i){if(this._rewardAd)return this._logger.warn("rewardAd has been initialized"),i?.(this._rewardAd),this;let r=Object.assign({},n.args,this._adConfig,e);if(!r.adUnitId)throw this._logger.error("reward args The adUnitId is required",r),new t("[RewardAdFather] reward args The adUnitId is required",{errMsg:"The adUnitId is required",errorCode:100002});let s=tt.createRewardedVideoAd(r);return this._logger.info("bindAdErrorForeverHandler at initialized:",e?.foreverErrorBind),e?.foreverErrorBind&&(s?.offError(this.__bindAdErrorForeverHandler),s?.onError(this.__bindAdErrorForeverHandler)),this._rewardAd=s,this.__ad__=s,i?.(this._rewardAd),this}initialized(){return!!this._rewardAd}__adErrorForeverHandler(e){this.adErrorForeverHandler(e)}adErrorForeverHandler(e){return null}async ad(e,t=null){throw Error("子类必须实现ad方法")}async addExecuteManager(e){let t=Object.assign({},this._adConfig,e?.options??{});return n.executeWithManager(this,Object.assign({},e,{options:t}))}destroy(){this._rewardAd&&!this._preserveOnEnd&&(this._rewardAd.destroy(),this._rewardAd=null)}clear(){throw Error("子类必须实现clear方法")}record(e){return this}onClose(e){this._rewardAd&&this._rewardAd.onClose(e)}offClose(e){this._rewardAd&&this._rewardAd.offClose(e)}show(){return this._rewardAd?this._rewardAd.show():Promise.reject({errMsg:"[RewardAdFather] can not show,rewardAd is null",errorCode:110001})}load(){return this._rewardAd?this._rewardAd.load():Promise.reject({errMsg:"[RewardAdFather] can not load,rewardAd is null",errorCode:110002})}onError(e){this._rewardAd&&this._rewardAd.onError(e)}offError(e){this._rewardAd&&this._rewardAd.offError(e)}onLoad(e){this._rewardAd&&this._rewardAd.onLoad(e)}offLoad(e){this._rewardAd&&this._rewardAd.offLoad(e)}placeholder(){return null}static buildArgs(t){t?.adUnitId||new e({prefix:"RewardAdFather",enable:!0}).error("RewardParams.adUnitId is required"),n.args=t}static async executeWithManager(t,r){return t&&t instanceof n?i.getInstance().addTask(t,r):(new e({prefix:"RewardAdFather",enable:!0}).error("executeWithManager - 无效的广告实例"),Promise.reject(Error("无效的广告实例")))}}let o=n;function l(e,t){return!!t&&e.some(e=>RegExp(e,"i").test(t))}let a=Object.entries({9999:"inner_default_other"}).reduce((e,[t,i])=>(e[i]=Number(t),e),{}),h={AD_TYPE_REWARD:1,AD_TYPE_INTERSTITIAL:2};Object.entries(h).reduce((e,[t,i])=>(e[i]=t,e),{});class d extends o{_onHalfway=null;_onShow=null;_onFinish=null;_onAlways=null;_onError=null;_logger=null;_initSign="";_alwaysCallback=null;_halfwayCallback=null;_finishedCallback=null;_resolve=null;_next=null;_scene=a.inner_default_other;_adTypeR=h.AD_TYPE_REWARD;_adTimeout=null;_adTimeoutTime=8e3;_adBeforeShowTimer=null;_adBeforeShowTime=300;_adSpeedCloseTimer=null;_adSpeedCloseTime=5e3;_needEndOnTimeout=!0;_needSpeedEndOnTimeout=!1;bindAdCloseLister=this.__adCloseLister__.bind(this);bindAdErrorLister=this.__adErrorLister__.bind(this);bindAdLoadLister=this.__adLoadLister__.bind(this);bindApiAdErrorLister=this.__apiAdErrorLister__.bind(this);_bindShiftCloseLister=this._shiftCloseLister.bind(this);_bindShiftErrorLister=this._shiftErrorLister.bind(this);constructor(t){super(t),this._logger=new e({prefix:"RewardAdNovel",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._needEndOnTimeout=t?.needEndOnTimeout??!0,this._onHalfway=t?.collection?.onHalfway??null,this._onShow=t?.collection?.onShow??null,this._onFinish=t?.collection?.onFinish??null,this._onAlways=t?.collection?.onAlways??null,this._onError=t?.collection?.onError??null}initialize(e,t){return super.initialize(e,t),this._initAdLister(),this._initNovelConfig(e),this}_initAdLister(){this.onClose(this.bindAdCloseLister),this.onError(this.bindAdErrorLister),this.onLoad(this.bindAdLoadLister),tt.onError(this.bindApiAdErrorLister)}_initNovelConfig(e){this.novelConfig=c.new({retry:e?.retry})}_onInnerExecuteBefore(){return null}_onInnerAdShowSuccess(e){return null}_setAdTimeout(e){if(this._needSpeedEndOnTimeout&&(this._adSpeedCloseTimer=setTimeout(()=>{if("ios"==tt.getSystemInfoSync().platform){let t=()=>{tt.offAppShow(t),this._logger.warn("ad_show_timeout: ios platform close ad onAppShow, handling fallback ad case, scene:",e?.scene);let i="ad_show_timeout: ios platform close ad onAppShow";this._adShowFailureAnalytics({scene:e?.scene,msg:i,errorCode:1e5,result:0}),this._adTimeout&&clearTimeout(this._adTimeout),e?.end({resolvedValue:{apiError:{errMsg:i,errorCode:1e5}},nextValue:null})};tt.onAppShow(t)}clearTimeout(this._adSpeedCloseTimer)},this._adSpeedCloseTime)),this._needEndOnTimeout){let t=e?.timeout??this._adTimeoutTime;this._adTimeout=setTimeout(()=>{this._logger.warn("Ad show timeout, handling fallback ad case,",`scene: ${e?.scene},timeout: ${t}`),this._adShowFailureAnalytics({scene:e?.scene,msg:"ad_show_timeout: normal",errorCode:1e5,result:0}),this._adTimeoutBeforeEnd({scene:e?.scene,timeout:t}),e?.end({resolvedValue:{apiError:{errMsg:`ad_show_timeout: normal, reward ad, timeout: ${t}`,errorCode:1e5,timeout:t}},nextValue:null})},t)}}_adTimeoutBeforeEnd(e){return e}_adPreludeInterval(e){e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()}),this._adBeforeShowTimer=setInterval(()=>{e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()})},this._adBeforeShowTime)}_clearAdTimeout(){this._adTimeout&&(clearTimeout(this._adTimeout),this._adTimeout=null),this._adBeforeShowTimer&&(clearInterval(this._adBeforeShowTimer),this._adBeforeShowTimer=null),this._adSpeedCloseTimer&&(clearTimeout(this._adSpeedCloseTimer),this._adSpeedCloseTimer=null)}_adShowBeforeAnalytics(e){return null}_adShowSuccessAnalytics(e){return null}_adShowFailureAnalytics(e){return null}_adLoadSuccessAnalytics(e){return null}_adLoadFailureAnalytics(e){return null}_adCloseSuccessAnalytics(e){return null}get rewardAd(){return this._rewardAd}addExecuteManager(e){return super.addExecuteManager(e)}ad(e,t=null){return this._alwaysCallback=e?.collection?.always,this._halfwayCallback=e?.collection?.halfway,this._finishedCallback=e?.collection?.finished,this._recovered=e?.recovered,this._onInnerExecuteBefore(),new Promise(i=>{this._adInner({options:{scene:e?.options?.scene,timeout:e?.options?.timeout},collection:{resolve:i,before:e.collection?.before,success:e.collection?.success,prelude:e.collection?.prelude},recovered:e.recovered},t)})}_adInner(e,t=null){let i=e?.collection?.resolve,r=e?.options?.scene??this._scene??a.inner_default_other,s=e?.collection?.before,n=e?.collection?.success,o=e?.collection?.prelude,h=e?.recovered??this._recovered,d=e=>{this._clearAdTimeout(),this.adDestroy(),i?.(Object.assign({scene:r,adTypeR:this._adTypeR},e?.resolvedValue)),t?.(Object.assign({scene:r},e?.nextValue))},c=()=>{this._scene=r,s?.({scene:r}),this._before=s,this._onShow?.({scene:r}),this._adShowBeforeAnalytics({scene:r}),this._resolve=i,this._next=t,this._setAdTimeout({scene:r,end:d,timeout:e?.options?.timeout}),this._adPreludeInterval({scene:r,prelude:o}),this.adShow().then(()=>{this._clearAdTimeout(),n?.({scene:r}),this._success=n,this._adShowSuccessAnalytics({scene:r,result:1,recovered:h}),this._onInnerAdShowSuccess({scene:r,result:1,recovered:h})}).catch(e=>{(this._clearAdTimeout(),this._adShowFailureAnalytics({scene:r,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),l(this._ttErrorMsgs,e?.errMsg)||this._ttErrorCodes.includes(e?.errorCode))?d({scene:r,resolvedValue:{apiError:e},nextValue:null}):0>=this.novelConfig.remain()?d({scene:r,resolvedValue:{apiError:{errMsg:`[RewardAdNovel]: no remain, remain: ${this.novelConfig.remain()}, retry: ${this.novelConfig.frequency.total},
2
+ tt: {errMsg: ${e?.errMsg}, errorCode: ${e?.errorCode}}`,errorCode:1e5}},nextValue:null}):(this.novelConfig.updateRetry(),this.adLoad().then(()=>{this._adLoadSuccessAnalytics({scene:r,result:1,frequency:this.novelConfig.frequency}),c()}).catch(e=>{this._adLoadFailureAnalytics({scene:r,msg:e?.errMsg,result:0}),d({scene:r,resolvedValue:{apiError:e},nextValue:null})}))})};c()}adLoad(){return this.load()}adShow(){return this.show()}_outerCloseCallback(e){this._alwaysCallback?.(e)}_outerHalfwayCallback(e){this._halfwayCallback?.(e)}_outerFinishedCallback(e){this._finishedCallback?.(e)}__adCloseLister__(e){this._clearAdTimeout(),this._adCloseSuccessAnalytics({scene:this._scene,ad_is_completed:+!!e.isEnded,ad_count:e.count});let t=Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR,end_type:e.isEnded?"finished":"halfway"}),i=e=>{this.adDestroy(),this._resolve?.(Object.assign({},t,e)),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null},r=e=>{let i=Object.assign({},t,e);i?.isEnded?(this._outerFinishedCallback(i),this._onFinish?.(i)):(this._outerHalfwayCallback(i),this._onHalfway?.(i)),this._outerCloseCallback(i),this._onAlways?.(i)};this.adCloseLister(t,{conn:r,end:i})}adCloseLister(e,t){t?.conn?.(e),t?.end?.(e)}__adErrorLister__(e){this._clearAdTimeout(),this._logger.error("adErrorLister",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.adErrorLister(e),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}adErrorLister(e){return e}__apiAdErrorLister__(e){this._clearAdTimeout(),this._logger.error("API apiAdErrorLister:",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.apiAdErrorLister(e),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}apiAdErrorLister(e){return e}__adLoadLister__(e){this._adLoadSuccessAnalytics({scene:this._scene,result:1,msg:e?.errMsg}),this._logger.info("adLoadLister:",JSON.stringify({scene:this._scene,info:e})),this.adLoadLister(e)}adLoadLister(e){return e}adDestroy(){this.offClose(this.bindAdCloseLister),this.offError(this.bindAdErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.destroy()}clear(){this._clearAdTimeout(),this.offClose(this.bindAdCloseLister),this.offClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.destroy(),this._resolve=null,this._next=null,this._success=null,this._before=null}_shiftCloseLister(e){this._clearAdTimeout(),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.offClose(this._bindShiftCloseLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}_shiftErrorLister(e){this._clearAdTimeout(),this.offClose(this._bindShiftCloseLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this._recovered=null,this.offError(this._bindShiftErrorLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}shift(){this.offClose(this.bindAdCloseLister),this.onClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.onError(this._bindShiftErrorLister)}static build(e){return d.instance||(d.instance=new d(e)),d.instance}static getInstance(){if(!d.instance)throw Error("RewardAdNovel instance is not init");return d.instance}static new(e){return new d(e)}}class c{frequency={total:0,current:0};constructor(e){this._init(e)}_init(e){this._adTimes(e)}_adTimes(e){this.frequency.total=e?.retry??4}reset(){this.frequency.current=0}updateRetry(){this.frequency.current=this.frequency.current+1}remain(){return this.frequency.total-this.frequency.current}static new(e){return new c(e)}}let _=d;class u{static args=null;_logger=null;_initSign="";_preserveOnEnd=!1;_interstitialAd=null;__ad__=null;_ttErrorMsgs=["The adUnitId is closed","The adUnitId is prohibit","The adUnitId is invalid","The adUnitId is required","The adUnitId is empty","feature is not supported in app"];_ttErrorCodes=[139902,123302,140502];constructor(t){this._logger=new e({prefix:"InterstitialAdFather",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._preserveOnEnd=t?.preserveOnEnd??!1}initialize(e,i){if(this._interstitialAd)return this._logger.warn("interstitialAd has been initialized"),i?.(this._interstitialAd),this;let r=Object.assign({},u.args,this._adConfig,e);if(!r.adUnitId)throw this._logger.error("interstitialAd args The adUnitId is required",r),new t("[InterstitialAdFather] interstitialAd args The adUnitId is required",{errMsg:"The adUnitId is required",errorCode:100003});let s=tt.createInterstitialAd(r);return this._interstitialAd=s,this.__ad__=s,i?.(this._interstitialAd),this}initialized(){return!!this._interstitialAd}async ad(e,t=null){throw Error("子类必须实现ad方法")}async addExecuteManager(e){let t=Object.assign({},this._adConfig,e?.options??{});return u.executeWithManager(this,Object.assign({},e,{options:t}))}destroy(){this._interstitialAd&&!this._preserveOnEnd&&(this._interstitialAd.destroy(),this._interstitialAd=null)}clear(){throw Error("子类必须实现clear方法")}record(e){return this}onClose(e){this._interstitialAd&&this._interstitialAd.onClose(e)}offClose(e){this._interstitialAd&&this._interstitialAd.offClose(e)}show(){return this._interstitialAd?this._interstitialAd.show():Promise.reject({errMsg:"[InterstitialAdFather] can not show,interstitialAd is null",errorCode:120001})}load(){return this._interstitialAd?this._interstitialAd.load():Promise.reject({errMsg:"[InterstitialAdFather] can not load,interstitialAd is null",errorCode:120002})}onError(e){this._interstitialAd&&this._interstitialAd.onError(e)}offError(e){this._interstitialAd&&this._interstitialAd.offError(e)}onLoad(e){this._interstitialAd&&this._interstitialAd.onLoad(e)}offLoad(e){this._interstitialAd&&this._interstitialAd.offLoad(e)}placeholder(){return null}static buildArgs(t){t?.adUnitId||new e({prefix:"InterstitialAdFather",enable:!0}).error("interstitialAdParams.adUnitId is required"),u.args=t}static async executeWithManager(t,r){return t&&t instanceof u?i.getInstance().addTask(t,r):(new e({prefix:"InterstitialAdFather",enable:!0}).error("executeWithManager - 无效的广告实例"),Promise.reject(Error("无效的广告实例")))}}let f=u;class g extends f{_onHalfway=null;_onShow=null;_onFinish=null;_onAlways=null;_onError=null;_logger=null;_initSign="";_alwaysCallback=null;_halfwayCallback=null;_finishedCallback=null;_resolve=null;_next=null;_scene=a.inner_default_other;_adTypeR=h.AD_TYPE_INTERSTITIAL;_adTimeout=null;_adTimeoutTime=8e3;_adBeforeShowTimer=null;_adBeforeShowTime=300;_adSpeedCloseTimer=null;_adSpeedCloseTime=5e3;_needEndOnTimeout=!0;_needSpeedEndOnTimeout=!1;bindAdCloseLister=this.adCloseLister.bind(this);bindAdErrorLister=this.adErrorLister.bind(this);bindAdLoadLister=this.adLoadLister.bind(this);bindApiAdErrorLister=this.apiAdErrorLister.bind(this);_bindShiftCloseLister=this._shiftCloseLister.bind(this);_bindShiftErrorLister=this._shiftErrorLister.bind(this);constructor(t){super(t),this._logger=new e({prefix:"InterstitialAdNovel",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._adConfig=t?.adConfig??{},this._needEndOnTimeout=t?.needEndOnTimeout??!0,this._onHalfway=t?.collection?.onHalfway??null,this._onShow=t?.collection?.onShow??null,this._onFinish=t?.collection?.onFinish??null,this._onAlways=t?.collection?.onAlways??null,this._onError=t?.collection?.onError??null}initialize(e,t){return super.initialize(e,t),this._initAdLister(),this._initNovelConfig(e),this}_initAdLister(){this.onClose(this.bindAdCloseLister),this.onError(this.bindAdErrorLister),this.onLoad(this.bindAdLoadLister),tt.onError(this.bindApiAdErrorLister)}_initNovelConfig(e){this.novelConfig=y.new({retry:e?.retry})}_onInnerExecuteBefore(){return null}_onInnerAdShowSuccess(){return null}_setAdTimeout(e){this._needSpeedEndOnTimeout&&(this._adSpeedCloseTimer=setTimeout(()=>{if("ios"==tt.getSystemInfoSync().platform){let t=()=>{tt.offAppShow(t),this._logger.warn("ad_show_timeout: ios platform close ad onAppShow, handling fallback ad case, scene:",e?.scene);let i="ad_show_timeout: ios platform close ad onAppShow";this._adShowFailureAnalytics({scene:e?.scene,msg:i,errorCode:100001,result:0}),this._adTimeout&&clearTimeout(this._adTimeout),e?.end({resolvedValue:{apiError:{errMsg:i,errorCode:100001}},nextValue:null})};tt.onAppShow(t)}clearTimeout(this._adSpeedCloseTimer)},this._adSpeedCloseTime)),this._needEndOnTimeout&&(this._adTimeout=setTimeout(()=>{this._logger.warn("Ad show timeout, handling fallback ad case, scene:",e?.scene),this._adShowFailureAnalytics({scene:e?.scene,msg:`ad_show_timeout: normal, interstitial ad, timeout: ${this._adTimeoutTime}`,errorCode:100001,result:0}),e?.end({resolvedValue:{apiError:{errMsg:`ad_show_timeout: normal, interstitial ad, timeout: ${this._adTimeoutTime}`,errorCode:100001}},nextValue:null})},this._adTimeoutTime))}_adPreludeInterval(e){e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()}),this._adBeforeShowTimer=setInterval(()=>{e.prelude?.({scene:e?.scene,frequency:this._adBeforeShowTime,time:new Date().getTime()})},this._adBeforeShowTime)}_clearAdTimeout(){this._adTimeout&&(clearTimeout(this._adTimeout),this._adTimeout=null),this._adBeforeShowTimer&&(clearTimeout(this._adBeforeShowTimer),this._adBeforeShowTimer=null),this._adSpeedCloseTimer&&(clearTimeout(this._adSpeedCloseTimer),this._adSpeedCloseTimer=null)}_adShowBeforeAnalytics(e){return null}_adShowSuccessAnalytics(e){return null}_adShowFailureAnalytics(e){return null}_adLoadSuccessAnalytics(e){return null}_adLoadFailureAnalytics(e){return null}_adCloseSuccessAnalytics(e){return null}get rewardAd(){return this._rewardAd}addExecuteManager(e){return super.addExecuteManager(e)}ad(e,t=null){return this._alwaysCallback=e?.collection?.always,this._halfwayCallback=e?.collection?.halfway,this._finishedCallback=e?.collection?.finished,this._onInnerExecuteBefore(),new Promise(i=>{this._adInner({options:{scene:e?.options?.scene},collection:{resolve:i,before:e.collection?.before,success:e.collection?.success,prelude:e.collection?.prelude}},t)})}_adInner(e,t=null){let i=e?.collection?.resolve,r=e?.options?.scene??this._scene??a.inner_default_other,s=e?.collection?.before,n=e?.collection?.success,o=e?.collection?.prelude,h=e=>{this._clearAdTimeout(),this.adDestroy(),i?.(Object.assign({scene:r,adTypeR:this._adTypeR},e?.resolvedValue)),t?.(Object.assign({scene:r},e?.nextValue))},d=()=>{this._scene=r,s?.({scene:r}),this._before=s,this._onShow?.({scene:r}),this._adShowBeforeAnalytics({scene:r}),this._resolve=i,this._next=t,this._setAdTimeout({scene:r,end:h}),this._adPreludeInterval({scene:r,prelude:o}),this.adShow().then(()=>{this._clearAdTimeout(),n?.({scene:r}),this._success=n,this._adShowSuccessAnalytics({scene:r,result:1}),this._onInnerAdShowSuccess()}).catch(e=>{(this._clearAdTimeout(),this._adShowFailureAnalytics({scene:r,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),l(this._ttErrorMsgs,e?.errMsg)||this._ttErrorCodes.includes(e?.errorCode))?h({scene:r,resolvedValue:{apiError:e},nextValue:null}):0>=this.novelConfig.remain()?h({scene:r,resolvedValue:null,nextValue:null}):(this.novelConfig.updateRetry(),this.adLoad().then(()=>{this._adLoadSuccessAnalytics({scene:r,result:1}),d()}).catch(e=>{this._adLoadFailureAnalytics({scene:r,msg:e?.errMsg,result:0}),h({scene:r,resolvedValue:{apiError:e},nextValue:null})}))})};d()}adLoad(){return this.load()}adShow(){return this.show()}_outerCloseCallback(e){this._alwaysCallback?.(e)}_outerHalfwayCallback(e){this._halfwayCallback?.(e)}_outerFinishedCallback(e){this._finishedCallback?.(e)}adCloseLister(){this._clearAdTimeout(),this._adCloseSuccessAnalytics({scene:this._scene,ad_is_completed:1});let e={scene:this._scene},t=e=>{this.adDestroy(),this._resolve?.(Object.assign({},{scene:this._scene,adTypeR:this._adTypeR},e)),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null};this._outerFinishedCallback(e),this._onFinish?.(e),this._outerHalfwayCallback(e),this._onHalfway?.(e),this._outerCloseCallback(e),this._onAlways?.(e),t({end_type:"finished"})}adErrorLister(e){this._clearAdTimeout(),this._logger.error("adErrorLister",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this._onError?.(e),0>=this.novelConfig.remain()&&(this.adDestroy(),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null)}apiAdErrorLister(e){this._clearAdTimeout(),this._logger.error("API apiAdErrorLister:",JSON.stringify(e)),this._adShowFailureAnalytics({scene:this._scene,msg:e?.errMsg,errorCode:e?.errorCode,result:0}),this.adDestroy(),this._onError?.(e),this._resolve?.({apiError:e,scene:this._scene,adTypeR:this._adTypeR}),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}adLoadLister(e){this._adLoadSuccessAnalytics({scene:this._scene,result:1,msg:e?.errMsg}),this._logger.info("adLoadLister:",JSON.stringify({scene:this._scene,info:e}))}adDestroy(){this.offClose(this.bindAdCloseLister),this.offError(this.bindAdErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.destroy()}clear(){this._clearAdTimeout(),this.offClose(this.bindAdCloseLister),this.offClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.destroy(),this._resolve=null,this._next=null,this._success=null,this._before=null}_shiftCloseLister(e){this._clearAdTimeout(),this.offError(this._bindShiftErrorLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.offClose(this._bindShiftCloseLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}_shiftErrorLister(e){this._clearAdTimeout(),this.offClose(this._bindShiftCloseLister),this.offLoad(this.bindAdLoadLister),tt.offError(this.bindApiAdErrorLister),this._onHalfway=null,this._onFinish=null,this._onAlways=null,this._onShow=null,this._onError=null,this._alwaysCallback=null,this._halfwayCallback=null,this._finishedCallback=null,this.offError(this._bindShiftErrorLister),this.destroy(),this._resolve?.(Object.assign({},e,{scene:this._scene,adTypeR:this._adTypeR})),this._resolve=null,this._next?.(),this._next=null,this._success=null,this._before=null}shift(){this.offClose(this.bindAdCloseLister),this.onClose(this._bindShiftCloseLister),this.offError(this.bindAdErrorLister),this.onError(this._bindShiftErrorLister)}static build(e){return g.instance||(g.instance=new g(e)),g.instance}static getInstance(){if(!g.instance)throw Error("InterstitialAdNovel instance is not init");return g.instance}static new(e){return new g(e)}}class y{frequency={total:0,current:0};constructor(e){this._init(e)}_init(e){this._adTimes(e)}_adTimes(e){this.frequency.total=e?.retry??4}reset(){this.frequency.current=0}updateRetry(){this.frequency.current=this.frequency.current+1}remain(){return this.frequency.total-this.frequency.current}static new(e){return new y(e)}}let w=g;class p{constructor(e={}){let{prefix:t="Logger",level:i="log",enabled:r=!0}=e;this.prefix=t,this.enabled=r,this.levels={error:0,warn:1,info:2,log:3,debug:4},this.currentLevel=this.levels[i]||this.levels.log}enable(){this.enabled=!0}disable(){this.enabled=!1}isEnabled(){return this.enabled}setLevel(e){Object.prototype.hasOwnProperty.call(this.levels,e)&&(this.currentLevel=this.levels[e])}formatMessage(e,t){let i=new Date,r=`${i.getFullYear()}/${i.getMonth()+1}/${i.getDate()} ${i.getHours()}:${i.getMinutes()}:${i.getSeconds()}`;return`[${r}] [${e.toUpperCase()}] [${this.prefix}] ${t}`}_log(e,t,...i){if(!this.enabled)return;let r=this.levels[e];if(void 0!==r&&this.currentLevel>=r){let r=this.formatMessage(e,t);switch(e){case"error":console.error(r,...i);break;case"warn":console.warn(r,...i);break;case"info":console.info(r,...i);break;case"log":default:console.log(r,...i);break;case"debug":console.debug(r,...i)}}}error(e,...t){this._log("error",e,...t)}warn(e,...t){this._log("warn",e,...t)}info(e,...t){this._log("info",e,...t)}log(e,...t){this._log("log",e,...t)}debug(e,...t){this._log("debug",e,...t)}}class m{constructor(e={}){this.config={prefix:"storage_",expire:null,...e},this.logger=new p({prefix:"Storage"})}getTodayEndTimestamp(){let e=new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999).getTime()}_setItem(e,t,i){let r=void 0!==i?i:this.config.expire;"today"===r&&(r=this.getTodayEndTimestamp()-Date.now());let s={value:t,expire:r,timestamp:Date.now()};try{tt.setStorageSync(e,JSON.stringify(s))}catch(e){console.error("Storage setItem error:",e)}}_getItem(e){try{let t=tt.getStorageSync(e);if(!t)return null;let i=JSON.parse(t);if(i.expire&&Date.now()-i.timestamp>i.expire)return this.removeItem(e),null;return i.value}catch(e){return console.error("Storage getItem error:",e),null}}setItem(e,t,i){let r=this.config.prefix+e;return this._setItem(r,t,i)}getItem(e){let t=this.config.prefix+e;return this._getItem(t)}getUserItem(e){let t=this.config.userId??"null";if("null"===t)return this.logger.error("userId is required"),null;let i=`${this.config.prefix}_${t}_${e}`;return this._getItem(i)}setUserItem(e,t,i){let r=this.config.userId??"null";if("null"===r)return void this.logger.error("userId is required");let s=`${this.config.prefix}_${r}_${e}`;return this._setItem(s,t,i)}removeItem(e){try{tt.removeStorageSync(e)}catch(e){console.error("Storage removeItem error:",e)}}clear(){try{tt.clearStorageSync()}catch(e){console.error("Storage clear error:",e)}}keys(){try{let e=[];return(tt.getStorageInfoSync().keys??[]).forEach(t=>{if(t.startsWith(this.config.prefix)){let i=JSON.parse(tt.getStorageSync(t));(!i.expire||Date.now()-i.timestamp<=i.expire)&&e.push(t.replace(this.config.prefix,""))}}),e}catch(e){return console.error("Storage keys error:",e),[]}}static new(e){return new m(e)}}let A=m;class b{_total=0;_local_sign="";_expire="today";constructor(e){if(this.storage=A.new({userId:e.userId}),!e.local_sign)throw Error("local_sign is required");this._local_sign=e.local_sign,this._total=e.total??0,this._expire=e.expire??"today",this._init()}_init(){this._initLocalTimes()}_adTimes(){return this._total}_safeLocalValue(e){return"object"!=typeof e||null===e?{}:e}_initLocalTimes(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),i=this._safeLocalValue(t);i&&i?.total==e||this.storage.setUserItem(this._local_sign,{total:e,today:i?.today??0},this._expire)}updateToday(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),i=this._safeLocalValue(t),r=i?.today??0;this.storage.setUserItem(this._local_sign,{total:e,today:r+1},this._expire)}remain(){let e=this.storage.getUserItem(this._local_sign),t=this._safeLocalValue(e),i=t?.today??0;return Number(t?.total??0)-Number(i)}static new(e){return new b(e)}}class C extends Error{constructor(e,t={}){super(e),this.name=this.constructor.name,this.stack=Error(e).stack,this.errMsg=t.errMsg,this.errorCode=t.errorCode,Object.defineProperty(this,"message",{enumerable:!0}),Object.defineProperty(this,"name",{enumerable:!0}),Object.defineProperty(this,"stack",{enumerable:!0}),Object.defineProperty(this,"errMsg",{enumerable:!0}),Object.defineProperty(this,"errorCode",{enumerable:!0})}toJSON(){return{name:this.name,message:this.message,stack:this.stack,errMsg:this.errMsg,errorCode:this.errorCode}}}class T{constructor(){this.events={}}on(e,t){return this.events[e]||(this.events[e]=[]),this.events[e].push(t),()=>{this.off(e,t)}}off(e,t){if(this.events[e]){if(!t){this.events[e]=[];return}this.events[e]=this.events[e].filter(e=>e!==t)}}emit(e,...t){this.events[e]&&this.events[e].forEach(i=>{try{i(...t)}catch(t){console.error(`Error in event listener for ${e}:`,t)}})}once(e,t){let i=(...r)=>{t(...r),this.off(e,i)};this.on(e,i)}listenerCount(e){return this.events[e]?this.events[e].length:0}removeAllListeners(){this.events={}}}class S{static instance=null;_logger=null;_initSign="";_needReport=!1;constructor(t){if(S.instance)return S.instance;this._logger=new e({prefix:"AdAnalyticsJS",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._needReport=t?.needReport??!1,this._commonConfig=t?.commonConfig??null,S.instance=this}initialize(e){return this._needReport?e:void this._logger.warn("needReport is false, do not report")}track(e,t,i){if(!this._needReport)return;if(!e)throw Error("eventName is required");let r=Object.assign({},this.getTrackCommonInfo(),t),s=i?.sign??"track";this._logger.log(`---------${s}----------:`,e,r),tt.reportAnalytics(e,r)}getCommonInfo(){return this._commonConfig??{}}getTrackCommonInfo(){return this._commonConfig??{}}identify(e,t){if(!e&&0!==e)throw Error("identify user_id is required");return this._commonConfig=Object.assign({},this._commonConfig,{__user_id:e},t),this}alias(){return null}pages(){return null}page(e,t){this.track(e,t,{sign:"page"})}cpage(e){return this.page("cpage",e)}placeholder(){return null}static build(e){return S.instance||(S.instance=new S(e)),S.instance}static getInstance(){if(!S.instance)throw Error("AdAnalyticsJS instance is not init");return S.instance}static new(e){return new S(e)}}let E=S;class L{static instance=null;_initSign="";_halfway=[{scene:9999,count:0}];_finished=[{scene:9999,count:0}];constructor(e){if(L.instance)return L.instance;this._initSign=e?.sign??"",this._halfway=[{scene:9999,count:0}],this._finished=[{scene:9999,count:0}],L.instance=this}initialize(e){}_halfwayUpdate(e){let t=this._halfway.find(t=>t.scene===e.scene);t?t.count+=1:this._halfway.push({scene:e.scene,count:1})}_halfwayGet(e){let t=e?.scenes??[];return(t.length>0?this._halfway.filter(e=>t.includes(e.scene)):this._halfway).reduce((e,t)=>e+t.count,0)}_halfwayReset(){this._halfway=[{scene:9999,count:0}]}_finishedUpdate(e){let t=this._finished.find(t=>t.scene===e.scene);t?t.count+=1:this._finished.push({scene:e.scene,count:1})}_finishedGet(e){let t=e?.scenes??[];return(t.length>0?this._finished.filter(e=>t.includes(e.scene)):this._finished).reduce((e,t)=>e+t.count,0)}_finishedReset(){this._finished=[{scene:9999,count:0}]}record(e){switch(e.type){case"halfway":this._halfwayUpdate(e);break;case"finished":this._finishedUpdate(e)}}rest(e){switch(e){case"halfway":this._halfwayReset();break;case"finished":this._finishedReset()}}get(e){switch(e.type){case"halfway":return this._halfwayGet(e);case"finished":return this._finishedGet(e);default:return null}}placeholder(){return null}static build(e){return L.instance||(L.instance=new L(e)),L.instance}static getInstance(){if(!L.instance)throw Error("RewardAdGlobalRecorder instance is not init");return L.instance}}let k=L;class v{static instance=null;_logger=null;_initSign="";_currScene=null;_sceneTypeObj={};constructor(t){if(v.instance)return v.instance;this._logger=new e({prefix:"AdSceneTriggerManager",enabled:!!(t?.log??!0)}),this._initSign=t?.sign??"",this._sceneTypeObj=t?.sceneTypeObj??{},v.instance=this}initialize(e){}addScene(e){return this._logger.log("----------AD触发场景:---------",e),this._currScene=e,this}addSceneType(e=1){return this.addScene(this._sceneTypeObj[e]),this}getCurrentScene(){return this._currScene}placeholder(){return null}static build(e){return v.instance||(v.instance=new v(e)),v.instance}static getInstance(){if(!v.instance)throw Error("RewardAdSceneTriggerManager instance is not init");return v.instance}}let R=v,I=s;export{E as AdAnalyticsJS,s as AdExecuteManager,b as CountRecorder,w as InterstitialAdDrama,f as InterstitialAdFather,w as InterstitialAdNovel,p as Logger,T as PubSub,_ as RewardAdDrama,o as RewardAdFather,k as RewardAdGlobalRecorder,_ as RewardAdNovel,R as RewardAdSceneTriggerManager,C as SerializableError,A as Storage,I as default};
@@ -27,8 +27,8 @@ declare class RewardAdGlobalRecorder {
27
27
  sign: string;
28
28
  });
29
29
  _initSign: string;
30
- /** @type {import('../typings/ad.js').SceneTextMap} */
31
- _halfway: import("../typings/ad.js").SceneTextMap;
30
+ /** @type {import('./typings/ad.js').SceneTextMap} */
31
+ _halfway: import("./typings/ad.js").SceneTextMap;
32
32
  _finished: {
33
33
  scene: number;
34
34
  count: number;
@@ -2,10 +2,10 @@ export default RewardAdSceneTriggerManager;
2
2
  /**
3
3
  * 场景值枚举 可持续添加
4
4
  */
5
- export type RewardAdTriggerScene = import("../typings/ad.js").RewardAdTriggerScene;
5
+ export type RewardAdTriggerScene = import("./typings/ad.js").RewardAdTriggerScene;
6
6
  /**
7
7
  * 场景值枚举 可持续添加
8
- * @typedef {import('../typings/ad.js').RewardAdTriggerScene} RewardAdTriggerScene
8
+ * @typedef {import('./typings/ad.js').RewardAdTriggerScene} RewardAdTriggerScene
9
9
  */
10
10
  declare class RewardAdSceneTriggerManager {
11
11
  static instance: any;
@@ -13,12 +13,12 @@ declare class RewardAdSceneTriggerManager {
13
13
  *
14
14
  * @param {object} args
15
15
  * @param {string} args.sign 初始化标识
16
- * @param {import('../typings/ad.js').SceneTypeMap} args.sceneTypeObj 当前场景sceneTypeMap 场景值类型映射表
16
+ * @param {import('./typings/ad.js').SceneTypeMap} args.sceneTypeObj 当前场景sceneTypeMap 场景值类型映射表
17
17
  * @returns {RewardAdSceneTriggerManager}
18
18
  */
19
19
  static build(args: {
20
20
  sign: string;
21
- sceneTypeObj: import("../typings/ad.js").SceneTypeMap;
21
+ sceneTypeObj: import("./typings/ad.js").SceneTypeMap;
22
22
  }): RewardAdSceneTriggerManager;
23
23
  /**
24
24
  *
@@ -29,12 +29,12 @@ declare class RewardAdSceneTriggerManager {
29
29
  * @param {object} args
30
30
  * @param {string} args.sign 初始化标识
31
31
  * @param {boolean=} args.log 是否开启日志
32
- * @param {import('../typings/ad.js').SceneTypeMap} args.sceneTypeObj 当前场景sceneTypeMap 场景值类型映射表
32
+ * @param {import('./typings/ad.js').SceneTypeMap} args.sceneTypeObj 当前场景sceneTypeMap 场景值类型映射表
33
33
  */
34
34
  constructor(args: {
35
35
  sign: string;
36
36
  log?: boolean | undefined;
37
- sceneTypeObj: import("../typings/ad.js").SceneTypeMap;
37
+ sceneTypeObj: import("./typings/ad.js").SceneTypeMap;
38
38
  });
39
39
  /** @private */
40
40
  /** @type {Logger} */
@@ -42,8 +42,8 @@ declare class RewardAdSceneTriggerManager {
42
42
  _initSign: string;
43
43
  /** @type {RewardAdTriggerScene} */
44
44
  _currScene: RewardAdTriggerScene;
45
- /** @type {import('../typings/ad.js').SceneTypeMap} */
46
- _sceneTypeObj: import("../typings/ad.js").SceneTypeMap;
45
+ /** @type {import('./typings/ad.js').SceneTypeMap} */
46
+ _sceneTypeObj: import("./typings/ad.js").SceneTypeMap;
47
47
  /**
48
48
  * @param {object} args
49
49
  * @param {string} args.sign 初始化标识
@@ -59,10 +59,10 @@ declare class RewardAdSceneTriggerManager {
59
59
  addScene(value: RewardAdTriggerScene): this;
60
60
  /**
61
61
  * 获取场景值
62
- * @param {import('../typings/ad.js').RewardAdTriggerSceneType} value 场景值类型
62
+ * @param {import('./typings/ad.js').RewardAdTriggerSceneType} value 场景值类型
63
63
  * @returns
64
64
  */
65
- addSceneType(value?: import("../typings/ad.js").RewardAdTriggerSceneType): this;
65
+ addSceneType(value?: import("./typings/ad.js").RewardAdTriggerSceneType): this;
66
66
  /**
67
67
  * 获取当前场景值
68
68
  * @returns
@@ -74,4 +74,4 @@ declare class RewardAdSceneTriggerManager {
74
74
  */
75
75
  placeholder(): any;
76
76
  }
77
- import { Logger } from '../helper/Logger.js';
77
+ import { Logger } from '@ad-execute-manager/helper';
@@ -0,0 +1,3 @@
1
+ export namespace DEFAULT_SCENT_TEXT_OBJ {
2
+ let inner_default_other: number;
3
+ }
@@ -0,0 +1,3 @@
1
+ export { default as LovelUnlockManager } from "./LovelUnlockManager.js";
2
+ export { default as RewardAdSceneTriggerManager } from "./RewardAdSceneTriggerManager.js";
3
+ export { default as RewardAdGlobalRecorder } from "./RewardAdGlobalRecorder.js";
@@ -0,0 +1,208 @@
1
+ export type IRewordAdConfig = {
2
+ /**
3
+ * 激励视频广告id - 必填
4
+ */
5
+ adUnitId: string;
6
+ /**
7
+ * 是否开启进度提醒。开启时广告文案为「再看 n 个xxx」,关闭时为「再看 1 个xxx」。其中 n 表示用户当前还需额外观看广告的次数
8
+ */
9
+ progressTip?: boolean | undefined;
10
+ /**
11
+ * - 再得广告的奖励文案,用户每看完一个广告都会展示,multiton 为 true 时必填。
12
+ * - 文案完整内容为「再看 1 个xxx」,其中 xxx 是 multitonRewardMsg 配置的文案内容,最大长度为 7,
13
+ * - 文案内容根据 multitonRewardMsg 的配置按顺序展示。若 multitonRewardMsg 长度小于 multitonRewardTimes ,
14
+ * - 则后续的激励再得广告文案取 multitonRewardMsg 数组最后一个。
15
+ */
16
+ multitonRewardMsg?: Array<string> | undefined;
17
+ /**
18
+ * 是否开启激励再得广告
19
+ */
20
+ multiton?: boolean | undefined;
21
+ /**
22
+ * 额外观看广告的次数,合法的数据范围为 1~4,multiton 为 true 时必填
23
+ */
24
+ multitonRewardTimes?: number | undefined;
25
+ /**
26
+ * 场景值 - 自用参数,非tt API要求的参数
27
+ */
28
+ scene?: number | undefined;
29
+ /**
30
+ * 广告超时时间 单位ms - 自用参数,非tt API要求的参数
31
+ */
32
+ timeout?: number | undefined;
33
+ /**
34
+ * 重试次数 - 自用参数 ,非tt API要求的参数
35
+ */
36
+ retry: number;
37
+ /**
38
+ * 是否绑定永远的错误事件 - 自用参数,非tt API要求的参数
39
+ */
40
+ foreverErrorBind?: boolean | undefined;
41
+ };
42
+ export type InterstitialAdConfig = {
43
+ /**
44
+ * 单个广告单元的 id。可从「开放平台控制台-进入对应小程序-运营-商业化变现-广告管理」中获取 - 必填
45
+ */
46
+ adUnitId: string;
47
+ /**
48
+ * 场景值 - 自用参数
49
+ */
50
+ scene?: number | undefined;
51
+ };
52
+ export type IExeCallbackArgs = {
53
+ /**
54
+ * 广告执行场景
55
+ */
56
+ scene: number;
57
+ /**
58
+ * 是否看完
59
+ */
60
+ isEnded: boolean;
61
+ /**
62
+ * 完整观看次数
63
+ */
64
+ count: number;
65
+ /**
66
+ * 剩余观看次数
67
+ */
68
+ remain?: number;
69
+ };
70
+ export type CallbackCollection = {
71
+ /**
72
+ * 每次外部回调
73
+ */
74
+ always?: (ctx?: IExeCallbackArgs) => void;
75
+ /**
76
+ * 完整看完广告外部回调 不管一个还是几个
77
+ */
78
+ finished?: (ctx?: IExeCallbackArgs) => void;
79
+ /**
80
+ * 半途退出广告外部回调
81
+ */
82
+ halfway?: (ctx?: IExeCallbackArgs) => void;
83
+ /**
84
+ * 完成广告外部回调 不管看不看完
85
+ */
86
+ complete?: (ctx?: IExeCallbackArgs) => void;
87
+ /**
88
+ * 取消广告外部回调
89
+ */
90
+ onCancel?: (ctx?: IExeCallbackArgs) => void;
91
+ /**
92
+ * 展示广告外部回调
93
+ */
94
+ before?: (ctx?: IExeCallbackArgs) => void;
95
+ /**
96
+ * 展示广告成功外部回调
97
+ */
98
+ success?: (ctx?: IExeCallbackArgs) => void;
99
+ /**
100
+ * 计时回调
101
+ */
102
+ prelude?: (ctx?: unknown) => void;
103
+ };
104
+ export type RecoveredInfo = {
105
+ /**
106
+ * 恢复重试次数
107
+ */
108
+ count: number;
109
+ /**
110
+ * 是否恢复重试
111
+ */
112
+ retry: boolean;
113
+ /**
114
+ * 恢复重试原因
115
+ */
116
+ message: string;
117
+ };
118
+ export type ICallbackArgs = {
119
+ /**
120
+ * 广告执行场景
121
+ */
122
+ scene: number;
123
+ /**
124
+ * 是否看完
125
+ */
126
+ isEnded: boolean;
127
+ /**
128
+ * 完整观看次数
129
+ */
130
+ count: number;
131
+ /**
132
+ * 剩余观看次数
133
+ */
134
+ remain?: number;
135
+ /**
136
+ * 执行下一个任务的回调函数,手动调用以继续执行流程[end]
137
+ */
138
+ end?: () => void;
139
+ /**
140
+ * 执行下一个任务的回调函数, 手动调用以继续执行流程[circle]
141
+ */
142
+ circle?: (args: {
143
+ ignoreRemain: boolean;
144
+ scene: number;
145
+ }) => void;
146
+ };
147
+ export type IConnection = {
148
+ /**
149
+ * 广告中途退出回调
150
+ */
151
+ onHalfway?: (args: ICallbackArgs) => void;
152
+ /**
153
+ * 广告展示回调
154
+ */
155
+ onShow?: (args: ICallbackArgs) => void;
156
+ /**
157
+ * 广告执行成功回调
158
+ */
159
+ onFinish?: (args: ICallbackArgs) => void;
160
+ /**
161
+ * 广告执行失败回调
162
+ */
163
+ onError?: (e: unknown) => void;
164
+ };
165
+ export type IConstructArgs = {
166
+ /**
167
+ * 初始化标识
168
+ */
169
+ sign: string;
170
+ /**
171
+ * 是否开启日志
172
+ */
173
+ log?: boolean | undefined;
174
+ /**
175
+ * 重试次数
176
+ */
177
+ retry: number;
178
+ /**
179
+ * 是否保留tt激励视频广告实例
180
+ */
181
+ preserveOnEnd: boolean;
182
+ /**
183
+ * 激励视频参数 (可选)
184
+ */
185
+ adConfig?: IRewordAdConfig | undefined;
186
+ /**
187
+ * 回调集合
188
+ */
189
+ collection?: IConnection | undefined;
190
+ };
191
+ /**
192
+ * 广告场景类型映射对象
193
+ */
194
+ export type SceneTypeMap = {
195
+ readonly [x: number]: string;
196
+ };
197
+ /**
198
+ * 广告场景类型文本映射对象(反向映射)
199
+ */
200
+ export type SceneTextMap = { readonly [K in SceneTypeMap[keyof SceneTypeMap]]: { [P in keyof SceneTypeMap]: SceneTypeMap[P] extends K ? P : never; }[keyof SceneTypeMap]; };
201
+ /**
202
+ * 场景值枚举 可持续添加
203
+ */
204
+ export type RewardAdTriggerScene = keyof SceneTextMap;
205
+ /**
206
+ * 场景值枚举 可持续添加
207
+ */
208
+ export type RewardAdTriggerSceneType = keyof SceneTypeMap;
@@ -0,0 +1,14 @@
1
+ export type IAdType = {
2
+ /**
3
+ * 激励视频
4
+ */
5
+ AD_TYPE_REWARD: 1;
6
+ /**
7
+ * 插屏广告
8
+ */
9
+ AD_TYPE_INTERSTITIAL: 2;
10
+ };
11
+ /**
12
+ * 广告场景类型文本映射对象(反向映射)
13
+ */
14
+ export type IAdTypeReverse = { readonly [K in IAdType[keyof IAdType]]: { [P in keyof IAdType]: IAdType[P] extends K ? P : never; }[keyof IAdType]; };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 回调函数类型
3
+ */
4
+ export type Callback = () => any;
5
+ export type InterstitialAd = {
6
+ /**
7
+ * 广告创建后默认是隐藏的,可以通过该方法显示广告
8
+ */
9
+ show: () => Promise<any>;
10
+ /**
11
+ * 当广告素材加载出现错误时,可以通过 load 方法手动加载
12
+ */
13
+ load: () => Promise<any>;
14
+ /**
15
+ * 销毁广告实例
16
+ */
17
+ destroy: () => void;
18
+ /**
19
+ * 绑定广告 load 事件的监听器
20
+ */
21
+ onLoad: (arg0: Callback) => void;
22
+ /**
23
+ * 解除绑定 load 事件的监听器
24
+ */
25
+ offLoad: (arg0: Callback) => void;
26
+ /**
27
+ * 绑定 error 事件的监听器
28
+ */
29
+ onError: (arg0: Callback) => void;
30
+ /**
31
+ * 解除绑定 error 事件的监听器
32
+ */
33
+ offError: (arg0: Callback) => void;
34
+ /**
35
+ * 绑定 close 事件的监听器
36
+ */
37
+ onClose: (arg0: Callback) => void;
38
+ /**
39
+ * 解除绑定 close 事件的监听器
40
+ */
41
+ offClose: (arg0: Callback) => void;
42
+ };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * 回调函数类型
3
+ */
4
+ export type Callback = () => any;
5
+ export type RewardedVideoAd = {
6
+ /**
7
+ * 广告创建后默认是隐藏的,可以通过该方法显示广告
8
+ */
9
+ show: () => Promise<any>;
10
+ /**
11
+ * 当广告素材加载出现错误时,可以通过 load 方法手动加载
12
+ */
13
+ load: () => Promise<any>;
14
+ /**
15
+ * 销毁广告实例
16
+ */
17
+ destroy: () => void;
18
+ /**
19
+ * 绑定广告 load 事件的监听器
20
+ */
21
+ onLoad: (arg0: Callback) => void;
22
+ /**
23
+ * 解除绑定 load 事件的监听器
24
+ */
25
+ offLoad: (arg0: Callback) => void;
26
+ /**
27
+ * 绑定 error 事件的监听器
28
+ */
29
+ onError: (arg0: Callback) => void;
30
+ /**
31
+ * 解除绑定 error 事件的监听器
32
+ */
33
+ offError: (arg0: Callback) => void;
34
+ /**
35
+ * 绑定 close 事件的监听器
36
+ */
37
+ onClose: (arg0: Callback) => void;
38
+ /**
39
+ * 解除绑定 close 事件的监听器
40
+ */
41
+ offClose: (arg0: Callback) => void;
42
+ };
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@singcl/ad-execute-manager",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "A powerful and flexible ad execution management library for handling reward-based ads, interstitial ads, and other advertising formats in JavaScript applications.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -63,5 +63,9 @@
63
63
  "globals": "^16.5.0",
64
64
  "prettier": "^3.7.3",
65
65
  "typescript": "^5.9.3"
66
+ },
67
+ "dependencies": {
68
+ "@ad-execute-manager/core": "^2.0.1",
69
+ "@ad-execute-manager/helper": "^2.0.1"
66
70
  }
67
- }
71
+ }
File without changes
File without changes
File without changes
File without changes
File without changes