@ad-execute-manager/helper 2.0.0-alpha.1 → 2.0.0-alpha.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 singcl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,115 @@
1
+ # @singcl/helper
2
+
3
+ A collection of utility helper classes for JavaScript applications including EventEmitter, Logger, Storage, CountRecorder, PubSub, and SerializableError.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @singcl/helper
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - **EventEmitter**: A powerful event emitter with support for once events, max listeners, and event queuing
14
+ - **Logger**: A flexible logging utility with multiple log levels and customizable prefixes
15
+ - **Storage**: A storage wrapper with expiration support, including "today" expiration for daily data
16
+ - **CountRecorder**: A utility for tracking and managing counts with expiration
17
+ - **PubSub**: A simple publish-subscribe pattern implementation
18
+ - **SerializableError**: An error class that can be serialized to JSON
19
+
20
+ ## Usage
21
+
22
+ ### EventEmitter
23
+
24
+ ```javascript
25
+ import { EventEmitter } from '@singcl/helper';
26
+
27
+ const emitter = new EventEmitter({ maxListeners: 10 });
28
+
29
+ emitter.on('event', (data) => {
30
+ console.log('Received:', data);
31
+ });
32
+
33
+ emitter.emit('event', { message: 'Hello' });
34
+ ```
35
+
36
+ ### Logger
37
+
38
+ ```javascript
39
+ import { Logger } from '@singcl/helper';
40
+
41
+ const logger = new Logger({ prefix: 'MyApp', level: 'info' });
42
+
43
+ logger.info('Application started');
44
+ logger.error('Something went wrong');
45
+ ```
46
+
47
+ ### Storage
48
+
49
+ ```javascript
50
+ import { Storage } from '@singcl/helper';
51
+
52
+ const storage = new Storage({ prefix: 'myapp_' });
53
+
54
+ // Set data that expires at end of day
55
+ storage.setItem('dailyTask', { completed: false }, 'today');
56
+
57
+ // Set data with custom expiration (2 hours)
58
+ storage.setItem('tempData', { value: 123 }, 2 * 60 * 60 * 1000);
59
+
60
+ // Get data
61
+ const data = storage.getItem('dailyTask');
62
+ ```
63
+
64
+ ### CountRecorder
65
+
66
+ ```javascript
67
+ import { CountRecorder } from '@singcl/helper';
68
+
69
+ const recorder = CountRecorder.new({
70
+ local_sign: 'daily_ads',
71
+ total: 5,
72
+ expire: 'today',
73
+ userId: 'user123'
74
+ });
75
+
76
+ console.log(recorder.remain()); // Remaining count
77
+ recorder.updateToday(); // Increment today's count
78
+ ```
79
+
80
+ ### PubSub
81
+
82
+ ```javascript
83
+ import { PubSub } from '@singcl/helper';
84
+
85
+ const pubsub = new PubSub();
86
+
87
+ const unsubscribe = pubsub.on('topic', (data) => {
88
+ console.log('Received:', data);
89
+ });
90
+
91
+ pubsub.emit('topic', { message: 'Hello' });
92
+
93
+ unsubscribe();
94
+ ```
95
+
96
+ ### SerializableError
97
+
98
+ ```javascript
99
+ import { SerializableError } from '@singcl/helper';
100
+
101
+ const error = new SerializableError('Something went wrong', {
102
+ errorCode: 500,
103
+ errMsg: 'Internal server error'
104
+ });
105
+
106
+ console.log(error.toJSON());
107
+ ```
108
+
109
+ ## API
110
+
111
+ See individual class documentation for detailed API information.
112
+
113
+ ## License
114
+
115
+ MIT
@@ -1,4 +1,4 @@
1
- export default class EventEmitter {
1
+ export default class PubSub {
2
2
  events: {};
3
3
  on(eventName: any, callback: any): () => void;
4
4
  off(eventName: any, callback: any): void;
@@ -1,9 +1,13 @@
1
1
  export class SerializableError extends Error {
2
- constructor(message: any);
2
+ constructor(message: any, options?: {});
3
3
  stack: string;
4
+ errMsg: any;
5
+ errorCode: any;
4
6
  toJSON(): {
5
7
  name: string;
6
8
  message: string;
7
9
  stack: string;
10
+ errMsg: any;
11
+ errorCode: any;
8
12
  };
9
13
  }
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{CountRecorder:()=>CountRecorder,Logger:()=>Logger,EventEmitter:()=>EventEmitter,PubSub:()=>PubSub,SerializableError:()=>SerializableError,Storage:()=>src_Storage});class EventEmitter{constructor(e={}){this.events={},this.queues={},this.onceEvents={},this.maxListeners=e.maxListeners||5,this.maxQueueSize=e.maxQueueSize||1,this.maxOnceEvents=e.maxOnceEvents||5}on(e,t){(this.events[e]||(this.events[e]=[]),this.events[e].length>=this.maxListeners)?console.warn(`EventEmitter: Maximum listeners (${this.maxListeners}) reached for event "${e}". Listener not added.`):(this.events[e].push(t),this.queues[e]&&this.queues[e].length>0&&(this.queues[e].forEach(e=>{t(...e)}),this.queues[e]=[]))}once(e,t){let r=(...s)=>{t(...s),this.off(e,r)};(this.onceEvents[e]||(this.onceEvents[e]=new Set),this.onceEvents[e].size>=this.maxOnceEvents)?console.warn(`EventEmitter: Maximum once events (${this.maxOnceEvents}) reached for event "${e}". Once listener not added.`):(this.onceEvents[e].add(r),this.on(e,r))}emit(e,...t){this.events[e]&&this.events[e].length>0?[...this.events[e]].forEach(e=>{e(...t)}):(this.queues[e]||(this.queues[e]=[]),this.queues[e].length>=this.maxQueueSize&&(console.warn(`EventEmitter: Maximum queue size (${this.maxQueueSize}) reached for event "${e}". Oldest event removed.`),this.queues[e].shift()),this.queues[e].push(t))}off(e,t){if(!t){this.events[e]=[],this.onceEvents[e]=new Set;return}this.events[e]=this.events[e].filter(e=>e!==t),this.onceEvents[e]&&this.onceEvents[e].delete(t)}removeAllListeners(e){e?(delete this.events[e],delete this.queues[e],delete this.onceEvents[e]):(this.events={},this.queues={},this.onceEvents={})}static geInstance(e){return this._instance||(this._instance=new EventEmitter(e)),this._instance}}class Logger{constructor(e={}){const{prefix:t="Logger",level:r="log",enabled:s=!0}=e;this.prefix=t,this.enabled=s,this.levels={error:0,warn:1,info:2,log:3,debug:4},this.currentLevel=this.levels[r]||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 r=new Date,s=`${r.getFullYear()}/${r.getMonth()+1}/${r.getDate()} ${r.getHours()}:${r.getMinutes()}:${r.getSeconds()}`;return`[${s}] [${e.toUpperCase()}] [${this.prefix}] ${t}`}_log(e,t,...r){if(!this.enabled)return;let s=this.levels[e];if(void 0!==s&&this.currentLevel>=s){let s=this.formatMessage(e,t);switch(e){case"error":console.error(s,...r);break;case"warn":console.warn(s,...r);break;case"info":console.info(s,...r);break;case"log":default:console.log(s,...r);break;case"debug":console.debug(s,...r)}}}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 Storage{constructor(e={}){this.config={prefix:"storage_",expire:null,...e},this.logger=new Logger({prefix:"Storage"})}getTodayEndTimestamp(){let e=new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999).getTime()}_setItem(e,t,r){let s=void 0!==r?r:this.config.expire;"today"===s&&(s=this.getTodayEndTimestamp()-Date.now());let i={value:t,expire:s,timestamp:Date.now()};try{tt.setStorageSync(e,JSON.stringify(i))}catch(e){console.error("Storage setItem error:",e)}}_getItem(e){try{let t=tt.getStorageSync(e);if(!t)return null;let r=JSON.parse(t);if(r.expire&&Date.now()-r.timestamp>r.expire)return this.removeItem(e),null;return r.value}catch(e){return console.error("Storage getItem error:",e),null}}setItem(e,t,r){let s=this.config.prefix+e;return this._setItem(s,t,r)}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 r=`${this.config.prefix}_${t}_${e}`;return this._getItem(r)}setUserItem(e,t,r){let s=this.config.userId??"null";if("null"===s)return void this.logger.error("userId is required");let i=`${this.config.prefix}_${s}_${e}`;return this._setItem(i,t,r)}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 r=JSON.parse(tt.getStorageSync(t));(!r.expire||Date.now()-r.timestamp<=r.expire)&&e.push(t.replace(this.config.prefix,""))}}),e}catch(e){return console.error("Storage keys error:",e),[]}}static new(e){return new Storage(e)}}const src_Storage=Storage;class CountRecorder{_total=0;_local_sign="";_expire="today";constructor(e){if(this.storage=src_Storage.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),r=this._safeLocalValue(t);r&&(null==r?void 0:r.total)==e||this.storage.setUserItem(this._local_sign,{total:e,today:(null==r?void 0:r.today)??0},this._expire)}updateToday(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),r=this._safeLocalValue(t),s=(null==r?void 0:r.today)??0;this.storage.setUserItem(this._local_sign,{total:e,today:s+1},this._expire)}remain(){let e=this.storage.getUserItem(this._local_sign),t=this._safeLocalValue(e),r=(null==t?void 0:t.today)??0;return Number((null==t?void 0:t.total)??0)-Number(r)}static new(e){return new CountRecorder(e)}}class PubSub{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(r=>{try{r(...t)}catch(t){console.error(`Error in event listener for ${e}:`,t)}})}once(e,t){let r=(...s)=>{t(...s),this.off(e,r)};this.on(e,r)}listenerCount(e){return this.events[e]?this.events[e].length:0}removeAllListeners(){this.events={}}}class SerializableError 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}}}for(var __rspack_i in exports.CountRecorder=__webpack_exports__.CountRecorder,exports.EventEmitter=__webpack_exports__.EventEmitter,exports.Logger=__webpack_exports__.Logger,exports.PubSub=__webpack_exports__.PubSub,exports.SerializableError=__webpack_exports__.SerializableError,exports.Storage=__webpack_exports__.Storage,__webpack_exports__)-1===["CountRecorder","EventEmitter","Logger","PubSub","SerializableError","Storage"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
package/dist/index.d.ts CHANGED
@@ -1,15 +1,6 @@
1
- export default AdExecuteManager;
2
- import AdExecuteManager from './core/AdExecuteManager';
3
- import RewardAdFather from './ad/RewardAdFather';
4
- import { SerializableError } from './helper/SerializableError';
5
- import { Logger } from './helper/Logger';
6
- import Storage from './helper/Storage';
7
- import { CountRecorder } from './helper/CountRecorder';
8
- import RewardAdGlobalRecorder from './helper/RewardAdGlobalRecorder';
9
- import RewardAdSceneTriggerManager from './helper/RewardAdSceneTriggerManager';
10
- import AdAnalyticsJS from './helper/AdAnalyticsJS';
11
- import RewardAdNovel from './ad/RewardAdNovel';
12
- import InterstitialAdFather from './ad/InterstitialAdFather';
13
- import InterstitialAdNovel from './ad/InterstitialAdNovel';
14
- import PubSub from './helper/PubSub';
15
- export { AdExecuteManager, RewardAdFather, SerializableError, Logger, Storage, CountRecorder, RewardAdGlobalRecorder, RewardAdSceneTriggerManager, AdAnalyticsJS, RewardAdNovel, InterstitialAdFather, InterstitialAdNovel, PubSub };
1
+ export { EventEmitter } from "./EventEmitter.js";
2
+ export { Logger } from "./Logger.js";
3
+ export { CountRecorder } from "./CountRecorder.js";
4
+ export { default as PubSub } from "./PubSub.js";
5
+ export { SerializableError } from "./SerializableError.js";
6
+ export { default as Storage } from "./Storage.js";
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- class e{constructor(e={}){let{prefix:t="Logger",level:s="log",enabled:n=!0}=e;this.prefix=t,this.enabled=n,this.levels={error:0,warn:1,info:2,log:3,debug:4},this.currentLevel=this.levels[s]||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 s=new Date,n=`${s.getFullYear()}/${s.getMonth()+1}/${s.getDate()} ${s.getHours()}:${s.getMinutes()}:${s.getSeconds()}`;return`[${n}] [${e.toUpperCase()}] [${this.prefix}] ${t}`}_log(e,t,...s){if(!this.enabled)return;let n=this.levels[e];if(void 0!==n&&this.currentLevel>=n){let n=this.formatMessage(e,t);switch(e){case"error":console.error(n,...s);break;case"warn":console.warn(n,...s);break;case"info":console.info(n,...s);break;case"log":default:console.log(n,...s);break;case"debug":console.debug(n,...s)}}}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{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,s){let n=void 0!==s?s:this.config.expire;"today"===n&&(n=this.getTodayEndTimestamp()-Date.now());let i={value:t,expire:n,timestamp:Date.now()};try{tt.setStorageSync(e,JSON.stringify(i))}catch(e){console.error("Storage setItem error:",e)}}_getItem(e){try{let t=tt.getStorageSync(e);if(!t)return null;let s=JSON.parse(t);if(s.expire&&Date.now()-s.timestamp>s.expire)return this.removeItem(e),null;return s.value}catch(e){return console.error("Storage getItem error:",e),null}}setItem(e,t,s){let n=this.config.prefix+e;return this._setItem(n,t,s)}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 s=`${this.config.prefix}_${t}_${e}`;return this._getItem(s)}setUserItem(e,t,s){let n=this.config.userId??"null";if("null"===n)return void this.logger.error("userId is required");let i=`${this.config.prefix}_${n}_${e}`;return this._setItem(i,t,s)}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 s=JSON.parse(tt.getStorageSync(t));(!s.expire||Date.now()-s.timestamp<=s.expire)&&e.push(t.replace(this.config.prefix,""))}}),e}catch(e){return console.error("Storage keys error:",e),[]}}static new(e){return new t(e)}}let s=t;class n{_total=0;_local_sign="";_expire="today";constructor(e){if(this.storage=s.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),s=this._safeLocalValue(t);s&&s?.total==e||this.storage.setUserItem(this._local_sign,{total:e,today:s?.today??0},this._expire)}updateToday(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),s=this._safeLocalValue(t),n=s?.today??0;this.storage.setUserItem(this._local_sign,{total:e,today:n+1},this._expire)}remain(){let e=this.storage.getUserItem(this._local_sign),t=this._safeLocalValue(e),s=t?.today??0;return Number(t?.total??0)-Number(s)}static new(e){return new n(e)}}class i extends Error{constructor(e){super(e),this.name=this.constructor.name,this.stack=Error(e).stack,Object.defineProperty(this,"message",{enumerable:!0}),Object.defineProperty(this,"name",{enumerable:!0}),Object.defineProperty(this,"stack",{enumerable:!0})}toJSON(){return{name:this.name,message:this.message,stack:this.stack}}}class r{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(s=>{try{s(...t)}catch(t){console.error(`Error in event listener for ${e}:`,t)}})}once(e,t){let s=(...n)=>{t(...n),this.off(e,s)};this.on(e,s)}listenerCount(e){return this.events[e]?this.events[e].length:0}removeAllListeners(){this.events={}}}class a{constructor(e={}){this.events={},this.queues={},this.onceEvents={},this.maxListeners=e.maxListeners||5,this.maxQueueSize=e.maxQueueSize||1,this.maxOnceEvents=e.maxOnceEvents||5}on(e,t){(this.events[e]||(this.events[e]=[]),this.events[e].length>=this.maxListeners)?console.warn(`EventEmitter: Maximum listeners (${this.maxListeners}) reached for event "${e}". Listener not added.`):(this.events[e].push(t),this.queues[e]&&this.queues[e].length>0&&(this.queues[e].forEach(e=>{t(...e)}),this.queues[e]=[]))}once(e,t){let s=(...n)=>{t(...n),this.off(e,s)};(this.onceEvents[e]||(this.onceEvents[e]=new Set),this.onceEvents[e].size>=this.maxOnceEvents)?console.warn(`EventEmitter: Maximum once events (${this.maxOnceEvents}) reached for event "${e}". Once listener not added.`):(this.onceEvents[e].add(s),this.on(e,s))}emit(e,...t){this.events[e]&&this.events[e].length>0?[...this.events[e]].forEach(e=>{e(...t)}):(this.queues[e]||(this.queues[e]=[]),this.queues[e].length>=this.maxQueueSize&&(console.warn(`EventEmitter: Maximum queue size (${this.maxQueueSize}) reached for event "${e}". Oldest event removed.`),this.queues[e].shift()),this.queues[e].push(t))}off(e,t){if(!t){this.events[e]=[],this.onceEvents[e]=new Set;return}this.events[e]=this.events[e].filter(e=>e!==t),this.onceEvents[e]&&this.onceEvents[e].delete(t)}removeAllListeners(e){e?(delete this.events[e],delete this.queues[e],delete this.onceEvents[e]):(this.events={},this.queues={},this.onceEvents={})}static geInstance(e){return this._instance||(this._instance=new a(e)),this._instance}}class o{static instance=null;_initSign="";_needReport=!1;constructor(e){if(o.instance)return o.instance;this._initSign=e?.sign??"",this._needReport=e?.needReport??!1,this._commonConfig=e?.commonConfig??null,o.instance=this}initialize(e){return this._needReport?e:void console.warn("AdAnalyticsJS needReport is false, do not report")}track(e,t,s){if(!this._needReport)return;if(!e)throw Error("eventName is required");let n=Object.assign({},this.getTrackCommonInfo(),t),i=s?.sign??"track";console.log(`-------------${i}-----------------------:`,e,n),tt.reportAnalytics(e,n)}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 o.instance||(o.instance=new o(e)),o.instance}static getInstance(){if(!o.instance)throw Error("AdAnalyticsJS instance is not init");return o.instance}static new(e){return new o(e)}}let h=o;class l{static instance=null;_initSign="";_dramaDetailData=[];_unlockChapterThreshold=2e3;_unlockChapterNum=30;_unlockChapterWaterLevel=15;_isReachThreshold=!1;_unlockedIdArr=[];constructor(e){this._initSign=e?.sign??"",this._unlockChapterThreshold=e?.unlockChapterThreshold??2e3,this._unlockChapterNum=e?.unlockChapterNum??30,this._unlockChapterWaterLevel=e?.unlockChapterWaterLevel??15}get drama(){return this._dramaDetailData}set drama(e=[]){this._dramaDetailData=e,this._checkReachThreshold(e)}_checkReachThreshold(e=[]){let t=e.filter(e=>1===e.flagTag);this._isReachThreshold=t.length>=this._unlockChapterThreshold}_isUnlockThreshold(){return this._isReachThreshold}_unlockChapterIds(e,t=this._unlockChapterNum){let s=this.drama,n=s.findIndex(t=>t.episodeId===e);if(-1===n)return;let i=n-t,r=Math.max(i,0),a=Math.min(i>=0?n+t:n+t-i,s.length);return s.slice(r,a).map(e=>e.episodeId)}_unlockChapterIdsWithWater(e,t=this._unlockChapterNum){let s=this._unlockChapterIds(e,t),n=s.filter(e=>!this._unlockedIdArr.includes(e));if(n&&n.length>=this._unlockChapterWaterLevel)return this._unlockedIdArr=Array.from(new Set(this._unlockedIdArr.concat(s))),s}ready(e,t,s){if(this._isUnlockThreshold()){let e=this._unlockChapterIdsWithWater(s);e&&e.length>0&&"function"==typeof t&&t(e)}else"function"==typeof e&&e()}onProcessUpdate(e,t){if(this._isUnlockThreshold()){let s=e.chapterId,n=this._unlockChapterIdsWithWater(s);n&&n.length>0&&"function"==typeof t&&t(n)}}onChapterChange(e,t){if(this._isUnlockThreshold()){let s=e.nextChapterId,n=this._unlockChapterIdsWithWater(s);n&&n.length>0&&"function"==typeof t&&t(n)}}unlockAll(){let e=this.drama.map(e=>({...e,flagTag:1}));this.drama=e}static build(e){return l.instance||(l.instance=new l(e)),l.instance}static getInstance(){if(!l.instance)throw Error("LovelUnlockManager instance is not init");return l.instance}static new(e){return new l(e)}}let c=l,u=Object.entries({9999:"inner_default_other"}).reduce((e,[t,s])=>(e[s]=Number(t),e),{});Object.entries({AD_TYPE_REWARD:1,AD_TYPE_INTERSTITIAL:2}).reduce((e,[t,s])=>(e[s]=t,e),{});class d{static instance=null;_initSign="";_halfway=[{scene:u.inner_default_other,count:0}];_finished=[{scene:u.inner_default_other,count:0}];constructor(e){if(d.instance)return d.instance;this._initSign=e?.sign??"",this._halfway=[{scene:u.inner_default_other,count:0}],this._finished=[{scene:u.inner_default_other,count:0}],d.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:u.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:u.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 d.instance||(d.instance=new d(e)),d.instance}static getInstance(){if(!d.instance)throw Error("RewardAdGlobalRecorder instance is not init");return d.instance}}let g=d;class _{static instance=null;_initSign="";_currScene=null;_sceneTypeObj={};constructor(e){if(_.instance)return _.instance;this._initSign=e?.sign??"",this._sceneTypeObj=e?.sceneTypeObj??{},_.instance=this}initialize(e){}addScene(e){return console.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 _.instance||(_.instance=new _(e)),_.instance}static getInstance(){if(!_.instance)throw Error("RewardAdSceneTriggerManager instance is not init");return _.instance}}let f=_;export{h as AdAnalyticsJS,n as CountRecorder,a as EventEmitter,e as Logger,c as LovelUnlockManager,r as PubSub,g as RewardAdGlobalRecorder,f as RewardAdSceneTriggerManager,i as SerializableError,s as Storage};
1
+ class e{constructor(e={}){this.events={},this.queues={},this.onceEvents={},this.maxListeners=e.maxListeners||5,this.maxQueueSize=e.maxQueueSize||1,this.maxOnceEvents=e.maxOnceEvents||5}on(e,t){(this.events[e]||(this.events[e]=[]),this.events[e].length>=this.maxListeners)?console.warn(`EventEmitter: Maximum listeners (${this.maxListeners}) reached for event "${e}". Listener not added.`):(this.events[e].push(t),this.queues[e]&&this.queues[e].length>0&&(this.queues[e].forEach(e=>{t(...e)}),this.queues[e]=[]))}once(e,t){let s=(...r)=>{t(...r),this.off(e,s)};(this.onceEvents[e]||(this.onceEvents[e]=new Set),this.onceEvents[e].size>=this.maxOnceEvents)?console.warn(`EventEmitter: Maximum once events (${this.maxOnceEvents}) reached for event "${e}". Once listener not added.`):(this.onceEvents[e].add(s),this.on(e,s))}emit(e,...t){this.events[e]&&this.events[e].length>0?[...this.events[e]].forEach(e=>{e(...t)}):(this.queues[e]||(this.queues[e]=[]),this.queues[e].length>=this.maxQueueSize&&(console.warn(`EventEmitter: Maximum queue size (${this.maxQueueSize}) reached for event "${e}". Oldest event removed.`),this.queues[e].shift()),this.queues[e].push(t))}off(e,t){if(!t){this.events[e]=[],this.onceEvents[e]=new Set;return}this.events[e]=this.events[e].filter(e=>e!==t),this.onceEvents[e]&&this.onceEvents[e].delete(t)}removeAllListeners(e){e?(delete this.events[e],delete this.queues[e],delete this.onceEvents[e]):(this.events={},this.queues={},this.onceEvents={})}static geInstance(t){return this._instance||(this._instance=new e(t)),this._instance}}class t{constructor(e={}){let{prefix:t="Logger",level:s="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[s]||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 s=new Date,r=`${s.getFullYear()}/${s.getMonth()+1}/${s.getDate()} ${s.getHours()}:${s.getMinutes()}:${s.getSeconds()}`;return`[${r}] [${e.toUpperCase()}] [${this.prefix}] ${t}`}_log(e,t,...s){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,...s);break;case"warn":console.warn(r,...s);break;case"info":console.info(r,...s);break;case"log":default:console.log(r,...s);break;case"debug":console.debug(r,...s)}}}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 s{constructor(e={}){this.config={prefix:"storage_",expire:null,...e},this.logger=new t({prefix:"Storage"})}getTodayEndTimestamp(){let e=new Date;return new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999).getTime()}_setItem(e,t,s){let r=void 0!==s?s:this.config.expire;"today"===r&&(r=this.getTodayEndTimestamp()-Date.now());let i={value:t,expire:r,timestamp:Date.now()};try{tt.setStorageSync(e,JSON.stringify(i))}catch(e){console.error("Storage setItem error:",e)}}_getItem(e){try{let t=tt.getStorageSync(e);if(!t)return null;let s=JSON.parse(t);if(s.expire&&Date.now()-s.timestamp>s.expire)return this.removeItem(e),null;return s.value}catch(e){return console.error("Storage getItem error:",e),null}}setItem(e,t,s){let r=this.config.prefix+e;return this._setItem(r,t,s)}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 s=`${this.config.prefix}_${t}_${e}`;return this._getItem(s)}setUserItem(e,t,s){let r=this.config.userId??"null";if("null"===r)return void this.logger.error("userId is required");let i=`${this.config.prefix}_${r}_${e}`;return this._setItem(i,t,s)}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 s=JSON.parse(tt.getStorageSync(t));(!s.expire||Date.now()-s.timestamp<=s.expire)&&e.push(t.replace(this.config.prefix,""))}}),e}catch(e){return console.error("Storage keys error:",e),[]}}static new(e){return new s(e)}}let r=s;class i{_total=0;_local_sign="";_expire="today";constructor(e){if(this.storage=r.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),s=this._safeLocalValue(t);s&&(null==s?void 0:s.total)==e||this.storage.setUserItem(this._local_sign,{total:e,today:(null==s?void 0:s.today)??0},this._expire)}updateToday(){let e=this._adTimes(),t=this.storage.getUserItem(this._local_sign),s=this._safeLocalValue(t),r=(null==s?void 0:s.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),s=(null==t?void 0:t.today)??0;return Number((null==t?void 0:t.total)??0)-Number(s)}static new(e){return new i(e)}}class n{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(s=>{try{s(...t)}catch(t){console.error(`Error in event listener for ${e}:`,t)}})}once(e,t){let s=(...r)=>{t(...r),this.off(e,s)};this.on(e,s)}listenerCount(e){return this.events[e]?this.events[e].length:0}removeAllListeners(){this.events={}}}class o 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}}}export{i as CountRecorder,e as EventEmitter,t as Logger,n as PubSub,o as SerializableError,r as Storage};
package/package.json CHANGED
@@ -1,13 +1,8 @@
1
1
  {
2
2
  "name": "@ad-execute-manager/helper",
3
- "version": "2.0.0-alpha.1",
3
+ "version": "2.0.0-alpha.2",
4
+ "description": "A collection of utility helper classes for JavaScript applications including EventEmitter, Logger, Storage, CountRecorder, PubSub, and SerializableError.",
4
5
  "type": "module",
5
- "main": "./dist/index.cjs",
6
- "module": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "files": [
9
- "dist"
10
- ],
11
6
  "exports": {
12
7
  ".": {
13
8
  "import": "./dist/index.js",
@@ -15,10 +10,58 @@
15
10
  "types": "./dist/index.d.ts"
16
11
  }
17
12
  },
18
- "author": "singcl",
13
+ "main": "./dist/index.cjs",
14
+ "types": "./dist/index.d.ts",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "author": {
19
+ "name": "singcl",
20
+ "email": "iambabyer@gmail.com",
21
+ "url": "https://github.com/singcl"
22
+ },
19
23
  "license": "MIT",
20
- "homepage": "https://npmjs.com/package/@ad-execute-manager/helper",
21
- "peerDependencies": {
22
- "@singcl/ad-execute-manager": ">=2.0.0"
24
+ "homepage": "https://npmjs.com/package/@singcl/helper",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/singcl/ad-execute-manager.git"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/singcl/ad-execute-manager/issues"
31
+ },
32
+ "engines": {
33
+ "node": ">=14.0.0"
34
+ },
35
+ "keywords": [
36
+ "helper",
37
+ "event-emitter",
38
+ "logger",
39
+ "storage",
40
+ "count-recorder",
41
+ "pubsub",
42
+ "serializable-error",
43
+ "utilities",
44
+ "javascript",
45
+ "nodejs"
46
+ ],
47
+ "scripts": {
48
+ "build": "rslib build && tsc",
49
+ "dev": "rslib build --watch",
50
+ "format": "prettier --write .",
51
+ "lint": "eslint .",
52
+ "test": "rstest",
53
+ "prepublishOnly": "npm run build"
54
+ },
55
+ "devDependencies": {
56
+ "@babel/eslint-parser": "^7.28.5",
57
+ "@babel/preset-env": "^7.28.5",
58
+ "@eslint/js": "^9.39.1",
59
+ "@rslib/core": "^0.18.5",
60
+ "@rstest/core": "^0.7.2",
61
+ "eslint": "^9.39.2",
62
+ "eslint-plugin-import": "^2.32.0",
63
+ "globals": "^16.5.0",
64
+ "prettier": "^3.7.3",
65
+ "typescript": "^5.9.3"
23
66
  }
24
67
  }
@@ -1,131 +0,0 @@
1
- export default InterstitialAdFather;
2
- export type IRewordAdConfig = import("../typings/ad.js").IRewordAdConfig;
3
- export type CallbackCollection = import("../typings/ad.js").CallbackCollection;
4
- export type IConstructArgs = import("../typings/ad.js").IConstructArgs;
5
- export type IRewardedVideoAd = {
6
- /**
7
- * 显示激励视频广告
8
- */
9
- show: () => Promise<void>;
10
- };
11
- /**
12
- * @typedef IRewardedVideoAd
13
- * @property {() => Promise.<void>} show 显示激励视频广告
14
- */
15
- declare class InterstitialAdFather {
16
- /** @type {IRewordAdConfig | null} */
17
- static args: IRewordAdConfig | null;
18
- /**
19
- * @param {IRewordAdConfig} args
20
- */
21
- static buildArgs(args: IRewordAdConfig): void;
22
- /**
23
- * 使用管理器执行广告
24
- * @param {Object} adInstance 广告实例
25
- * @param {Object} ctx 上下文对象,用于传递数据和状态
26
- * @param {Object} ctx.options 广告执行选项
27
- * @param {Object} ctx.options.log 是否打印日志
28
- * @param {Object} ctx.collection 回调集合
29
- * @returns {Promise} 广告执行结果的Promise
30
- */
31
- static executeWithManager(adInstance: any, ctx: {
32
- options: {
33
- log: any;
34
- };
35
- collection: any;
36
- }): Promise<any>;
37
- /**
38
- * @param {IConstructArgs} args
39
- */
40
- constructor(args: IConstructArgs);
41
- _initSign: string;
42
- _preserveOnEnd: boolean;
43
- _interstitialAd: any;
44
- _ttErrorMsgs: string[];
45
- _ttErrorCodes: number[];
46
- _adConfig: {};
47
- /**
48
- * 初始化
49
- * 子类可以选择覆盖此方法,或使用默认实现
50
- * @param {IRewordAdConfig} params
51
- * @param {(v: IRewardedVideoAd) => void} [callback] 初始化成功回调
52
- * @returns {this} 当前实例
53
- */
54
- initialize(params: IRewordAdConfig, callback?: (v: IRewardedVideoAd) => void): this;
55
- initialized(): boolean;
56
- /**
57
- * 执行广告展示
58
- * @abstract
59
- * @param {Object} [ctx] 上下文对象,用于传递数据和状态
60
- * @param {IRewordAdConfig} [ctx.options] 广告执行选项
61
- * @param {CallbackCollection} [ctx.collection] 回调集合
62
- * @param {Function} next 执行下一个任务的回调函数,在洋葱模型中手动调用以继续执行流程
63
- * @returns {Promise<unknown>} 广告执行结果的Promise
64
- * @throws {Error} 子类必须实现此方法
65
- */
66
- ad(ctx?: {
67
- options?: IRewordAdConfig;
68
- collection?: CallbackCollection;
69
- }, next?: Function): Promise<unknown>;
70
- /**
71
- * 确保广告按顺序执行
72
- * @param {Object} [ctx] 上下文对象,用于传递数据和状态
73
- * @param {IRewordAdConfig} [ctx.options] 广告执行选项
74
- * @param {CallbackCollection} [ctx.collection] 回调集合
75
- * @returns {Promise.<unknown>} 广告执行结果的Promise
76
- */
77
- addExecuteManager(ctx?: {
78
- options?: IRewordAdConfig;
79
- collection?: CallbackCollection;
80
- }): Promise<unknown>;
81
- destroy(): void;
82
- /**
83
- * 清理广告实例
84
- * @abstract 清理广告实例,子类必须实现此方法
85
- */
86
- clear(): void;
87
- /**
88
- * 任务执行完成后始终执行的一个方法
89
- * @abstract 任务执行完成后始终执行的一个方法,子类需要用到时实现此方法
90
- * @param {object} [_args] 执行结果信息
91
- */
92
- record(_args?: object): this;
93
- /**
94
- *
95
- * @param {({isEnded: boolean, count: number}) => void} callback
96
- */
97
- onClose(callback: ({ isEnded: boolean, count: number }: any) => void): void;
98
- /**
99
- *
100
- * @param {({isEnded: boolean, count: number}) => void} callback
101
- */
102
- offClose(callback: ({ isEnded: boolean, count: number }: any) => void): void;
103
- /**
104
- * show
105
- * @returns { Promise.<void>}
106
- * @params {{errMsg: string; errCode: number}} err
107
- */
108
- show(): Promise<void>;
109
- /**
110
- * load
111
- * @returns { Promise.<void>}
112
- */
113
- load(): Promise<void>;
114
- /**
115
- *
116
- * @param {({errMsg: string; errCode: number}) => void} callback
117
- */
118
- onError(callback: any): void;
119
- /**
120
- *
121
- * @param {({errMsg: string; errCode: number}) => void} callback
122
- */
123
- offError(callback: any): void;
124
- onLoad(callback: any): void;
125
- offLoad(callback: any): void;
126
- /**
127
- * 站位方法,没有任何左右
128
- * @returns
129
- */
130
- placeholder(): any;
131
- }