@norcy/react-native-toolkit 0.2.15 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/ConfigDataModel.js +2 -2
- package/lib/commonjs/ConfigDataModel.js.map +1 -1
- package/lib/commonjs/Notification.js +35 -14
- package/lib/commonjs/Notification.js.map +1 -1
- package/lib/module/ConfigDataModel.js +2 -2
- package/lib/module/ConfigDataModel.js.map +1 -1
- package/lib/module/Notification.js +35 -14
- package/lib/module/Notification.js.map +1 -1
- package/lib/typescript/ConfigDataModel.d.ts.map +1 -1
- package/lib/typescript/Notification.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ConfigDataModel.ts +6 -2
- package/src/Notification.ts +40 -17
|
@@ -35,8 +35,8 @@ const _updateKeyValues = items => {
|
|
|
35
35
|
};
|
|
36
36
|
const handleVersionInfo = () => {
|
|
37
37
|
_VersionManager.VersionManager.init({
|
|
38
|
-
latestAppVersion: ConfigDataModel.get(_reactNative.Platform.OS === 'android' ? 'aov' : 'ov'),
|
|
39
|
-
latestBundleVersion: ConfigDataModel.get(_reactNative.Platform.OS === 'android' ? 'abov' : 'bov')
|
|
38
|
+
latestAppVersion: ConfigDataModel.get(_reactNative.Platform.OS === 'android' ? 'aov' : _reactNative.Platform.OS === 'ios' ? 'ov' : 'hov'),
|
|
39
|
+
latestBundleVersion: ConfigDataModel.get(_reactNative.Platform.OS === 'android' ? 'abov' : _reactNative.Platform.OS === 'ios' ? 'bov' : 'hbov')
|
|
40
40
|
});
|
|
41
41
|
};
|
|
42
42
|
let isDataReady = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","_LoginManager","_Notification","_VersionManager","_VipAndroidManager","EventEmitter","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","VersionManager","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","Platform","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","VipAndroidManager","setOfferings","emitChange","exports","defaultValues","Notification","addListener","isAuto","fetch","query","Query","equalTo","find","then","catch","e","error","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","r","lastChar","LoginManager","currentUser","AVUser","slice","indexOf","toLowerCase"],"sourceRoot":"../../src","sources":["ConfigDataModel.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AAEA,MAAMK,YAAY,GAAGL,OAAO,CAAC,QAAQ,CAAC,CAACK,YAAY;AACnD,MAAMC,YAAY,GAAG,IAAID,YAAY,CAAC,CAAC;AAKvC,IAAIE,OAAoB,GAAG,CAAC,CAAC;AAE7B,MAAMC,EAAE,GAAGR,OAAO,CAAC,mBAAmB,CAAC;AAEvC,MAAMS,gBAAgB,GAAIC,KAAe,IAAK;EAC5C,IAAIC,GAAG,GAAG,EAAE;EACZ,KAAK,MAAMC,IAAI,IAAIF,KAAK,EAAE;IACxB,IACE,CAACG,8BAAc,CAACC,cAAc,CAACF,IAAI,CAACG,GAAG,CAAC,QAAQ,CAAC,EAAEH,IAAI,CAACG,GAAG,CAAC,QAAQ,CAAC,CAAC,EACtE;MACA;IACF;IACAJ,GAAG,CAACK,IAAI,CAACJ,IAAI,CAAC;EAChB;EACA,OAAOD,GAAG;AACZ,CAAC;AAED,MAAMM,gBAAgB,GAAIP,KAAe,IAAK;EAC5C,KAAK,MAAME,IAAI,IAAIF,KAAK,EAAE;IACxB,IAAIQ,KAAK,GAAGN,IAAI,CAACG,GAAG,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAOG,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACAA,KAAK,GAAGA,KAAK,CAACC,IAAI,CAAC,CAAC;IACtB;IACAZ,OAAO,CAACK,IAAI,CAACG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAGG,KAAK;EAClC;AACF,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAM;EAC9BP,8BAAc,CAACQ,IAAI,CAAC;IAClBC,gBAAgB,EAAEC,eAAe,CAACR,GAAG,CACnCS,qBAAQ,CAACC,EAAE,KAAK,SAAS,GAAG,KAAK,GAAG,
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_LoginManager","_Notification","_VersionManager","_VipAndroidManager","EventEmitter","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","VersionManager","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","Platform","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","VipAndroidManager","setOfferings","emitChange","exports","defaultValues","Notification","addListener","isAuto","fetch","query","Query","equalTo","find","then","catch","e","error","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","r","lastChar","LoginManager","currentUser","AVUser","slice","indexOf","toLowerCase"],"sourceRoot":"../../src","sources":["ConfigDataModel.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AAEA,MAAMK,YAAY,GAAGL,OAAO,CAAC,QAAQ,CAAC,CAACK,YAAY;AACnD,MAAMC,YAAY,GAAG,IAAID,YAAY,CAAC,CAAC;AAKvC,IAAIE,OAAoB,GAAG,CAAC,CAAC;AAE7B,MAAMC,EAAE,GAAGR,OAAO,CAAC,mBAAmB,CAAC;AAEvC,MAAMS,gBAAgB,GAAIC,KAAe,IAAK;EAC5C,IAAIC,GAAG,GAAG,EAAE;EACZ,KAAK,MAAMC,IAAI,IAAIF,KAAK,EAAE;IACxB,IACE,CAACG,8BAAc,CAACC,cAAc,CAACF,IAAI,CAACG,GAAG,CAAC,QAAQ,CAAC,EAAEH,IAAI,CAACG,GAAG,CAAC,QAAQ,CAAC,CAAC,EACtE;MACA;IACF;IACAJ,GAAG,CAACK,IAAI,CAACJ,IAAI,CAAC;EAChB;EACA,OAAOD,GAAG;AACZ,CAAC;AAED,MAAMM,gBAAgB,GAAIP,KAAe,IAAK;EAC5C,KAAK,MAAME,IAAI,IAAIF,KAAK,EAAE;IACxB,IAAIQ,KAAK,GAAGN,IAAI,CAACG,GAAG,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAOG,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACAA,KAAK,GAAGA,KAAK,CAACC,IAAI,CAAC,CAAC;IACtB;IACAZ,OAAO,CAACK,IAAI,CAACG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAGG,KAAK;EAClC;AACF,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAM;EAC9BP,8BAAc,CAACQ,IAAI,CAAC;IAClBC,gBAAgB,EAAEC,eAAe,CAACR,GAAG,CACnCS,qBAAQ,CAACC,EAAE,KAAK,SAAS,GAAG,KAAK,GAAGD,qBAAQ,CAACC,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,KACrE,CAAC;IACDC,mBAAmB,EAAEH,eAAe,CAACR,GAAG,CACtCS,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrB,MAAM,GACND,qBAAQ,CAACC,EAAE,KAAK,KAAK,GACnB,KAAK,GACL,MACR;EACF,CAAC,CAAC;AACJ,CAAC;AAED,IAAIE,WAAW,GAAG,KAAK;AACvB,IAAIC,kBAAkB,GAAG,KAAK;AAE9B,MAAMC,eAAe,GAAIC,WAAqB,IAAK;EACjD,IAAI,CAACF,kBAAkB,EAAE;IACvB;EACF;;EAEA;EACA,IAAIlB,KAAK,GAAGD,gBAAgB,CAACqB,WAAW,CAAC;EACzCb,gBAAgB,CAACP,KAAK,CAAC;EACvB;EACAU,iBAAiB,CAAC,CAAC;EACnBW,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC;EAC1BL,WAAW,GAAG,IAAI;EAClBM,oCAAiB,CAACC,YAAY,CAACX,eAAe,CAACR,GAAG,CAAC,uBAAuB,CAAC,CAAC;EAC5EQ,eAAe,CAACY,UAAU,CAAC,CAAC;AAC9B,CAAC;;AAED;AACA,MAAMZ,eAAe,GAAAa,OAAA,CAAAb,eAAA,GAAG;EACtBF,IAAI,EAAGgB,aAA0B,IAAK;IACpC9B,OAAO,GAAG8B,aAAa;IAEvBC,0BAAY,CAACC,WAAW,CACtB,gBAAgB,EAChB,CAAC;MAAEC;IAA+B,CAAC,KAAK;MACtC,IAAI,CAACA,MAAM,EAAE;QACXb,WAAW,GAAG,KAAK;QACnBC,kBAAkB,GAAG,KAAK;QAC1BL,eAAe,CAACkB,KAAK,CAAC,CAAC;MACzB;IACF,CACF,CAAC;;IAED;IACAR,oCAAiB,CAACC,YAAY,CAC5BX,eAAe,CAACR,GAAG,CAAC,uBAAuB,CAC7C,CAAC;IACDQ,eAAe,CAACkB,KAAK,CAAC,CAAC;EACzB,CAAC;EAEDA,KAAK,EAAEA,CAAA,KAAM;IACX;IACA,IAAIb,kBAAkB,EAAE;MACtB;IACF;IAEA,MAAMc,KAAK,GAAG,IAAIlC,EAAE,CAACmC,KAAK,CAAC,SAAS,CAAC;IACrCD,KAAK,CAACE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAACA,OAAO,CAACpB,qBAAQ,CAACC,EAAE,EAAE,IAAI,CAAC;IACvDiB,KAAK,CACFG,IAAI,CAAC,CAAC,CACNC,IAAI,CAAEpC,KAAe,IAAK;MACzBqB,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC;MAC1BJ,kBAAkB,GAAG,IAAI;MACzBC,eAAe,CAACnB,KAAK,CAAC;IACxB,CAAC,CAAC,CACDqC,KAAK,CAAEC,CAAM,IAAK;MACjBjB,OAAO,CAACkB,KAAK,CAACD,CAAC,CAAC;IAClB,CAAC,CAAC;EACN,CAAC;EAEDjC,GAAG,EAAGmC,GAAW,IAAK;IACpB,OAAO3C,OAAO,CAAC2C,GAAG,CAAC;EACrB,CAAC;EAEDf,UAAU,EAAEA,CAAA,KAAM;IAChB7B,YAAY,CAAC6C,IAAI,CAAC,QAAQ,CAAC;EAC7B,CAAC;EAEDC,eAAe,EAAGC,QAAkB,IAAK;IACvC,IAAI1B,WAAW,EAAE;MACf0B,QAAQ,IAAIA,QAAQ,CAAC,CAAC;MACtB;IACF;IACA/C,YAAY,CAACgD,IAAI,CAAC,QAAQ,EAAED,QAAQ,CAAC;EACvC,CAAC;EAEDd,WAAW,EAAGc,QAAkB,IAAK;IACnC,IAAI1B,WAAW,EAAE;MACf0B,QAAQ,IAAIA,QAAQ,CAAC,CAAC;MACtB;IACF;IACA/C,YAAY,CAACiD,EAAE,CAAC,QAAQ,EAAEF,QAAQ,CAAC;EACrC,CAAC;EAEDG,kBAAkB,EAAEA,CAACC,MAAgB,EAAEC,IAAa,KAAK;IACvD,IAAI,CAACD,MAAM,EAAE;MACX,OAAO,KAAK;IACd;IACA;IACA,MAAME,CAAC,GAAGD,IAAI,IAAI,CAAC;IACnB,IAAIC,CAAC,IAAI,CAAC,EAAE;MACV,OAAO,KAAK;IACd;IACA;IACA,MAAMC,QAAQ,GACZC,0BAAY,CAACC,WAAW,CAAC,CAAC,EAAEC,MAAM,EAAEhD,GAAG,CAAC,UAAU,CAAC,EAAEiD,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;IACvE,OAAO,kBAAkB,CAACC,OAAO,CAACL,QAAQ,CAACM,WAAW,CAAC,CAAC,CAAC,GAAGP,CAAC,GAAG,EAAE;EACpE;AACF,CAAC","ignoreList":[]}
|
|
@@ -6,32 +6,53 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.Notification = void 0;
|
|
7
7
|
const EventEmitter = require('events').EventEmitter;
|
|
8
8
|
const eventEmitter = new EventEmitter();
|
|
9
|
-
const
|
|
9
|
+
const callbackToEvent = new WeakMap();
|
|
10
|
+
const isCallbackRegistered = (callback, event) => {
|
|
11
|
+
return eventEmitter.listeners(event).includes(callback);
|
|
12
|
+
};
|
|
10
13
|
const Notification = exports.Notification = {
|
|
11
14
|
addListener: (event, callback, skipCache) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
if (!skipCache) {
|
|
16
|
+
const existingEvent = callbackToEvent.get(callback);
|
|
17
|
+
if (existingEvent && isCallbackRegistered(callback, existingEvent)) {
|
|
18
|
+
if (existingEvent === event) {
|
|
19
|
+
return callback;
|
|
20
|
+
}
|
|
21
|
+
// 本类的设计只允许,同一个 callback 对应一个 eventKey,不允许多个 eventKey 对应同一个 callback
|
|
22
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 成功
|
|
23
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 跳过,返回 callback
|
|
24
|
+
// Notification.addListener('Language_Update', callback); // ❌ 抛错!
|
|
25
|
+
throw new Error(`[Notification] callback 已注册到事件 "${existingEvent}",不能重复注册到 "${event}"`);
|
|
26
|
+
}
|
|
16
27
|
}
|
|
28
|
+
eventEmitter.on(event, callback);
|
|
29
|
+
callbackToEvent.set(callback, event);
|
|
17
30
|
return callback;
|
|
18
31
|
},
|
|
19
32
|
addListenerOnce: (event, callback) => {
|
|
20
33
|
eventEmitter.once(event, callback);
|
|
21
34
|
},
|
|
22
35
|
removeListener: callback => {
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
delete ListenerToEvent[key];
|
|
36
|
+
const event = callbackToEvent.get(callback);
|
|
37
|
+
if (!event) return;
|
|
26
38
|
eventEmitter.removeListener(event, callback);
|
|
39
|
+
callbackToEvent.delete(callback);
|
|
27
40
|
},
|
|
28
41
|
removeAllListeners: event => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
// 只清理 EventEmitter,不清理 callbackToEvent(残留 callback -> event 映射)
|
|
43
|
+
// 不清理原因:WeakMap 无法反向查找,清理需维护额外映射(复杂度高,不值得)
|
|
44
|
+
// 残留无任何影响:
|
|
45
|
+
// 1. 内存:WeakMap 弱引用,callback 被 GC 后自动清理,无泄漏
|
|
46
|
+
// 2. removeListener:即使 eventEmitter 中已无此 callback,removeListener 调用也安全
|
|
47
|
+
// 3. postNotification:真正的 callback 已经从 eventEmitter 中移除,不会被调用
|
|
48
|
+
// 4. 逻辑:addListener 通过 isCallbackRegistered 双重检查,脏数据不影响判断,如下
|
|
49
|
+
// 例:addListener('A', cb) 后调用 removeAllListeners('A')
|
|
50
|
+
// - eventEmitter 中 cb 已被移除
|
|
51
|
+
// - callbackToEvent 仍记录 cb -> 'A'(脏数据)
|
|
52
|
+
//
|
|
53
|
+
// 后续 addListener('A', cb) 时:
|
|
54
|
+
// - callbackToEvent.get(cb) 返回 'A'
|
|
55
|
+
// - isCallbackRegistered(cb, 'A') 检查 eventEmitter.listeners('A'),发现 cb 不在,会重新更新 Map 并注册
|
|
35
56
|
eventEmitter.removeAllListeners(event);
|
|
36
57
|
},
|
|
37
58
|
postNotification: (event, args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EventEmitter","require","eventEmitter","
|
|
1
|
+
{"version":3,"names":["EventEmitter","require","eventEmitter","callbackToEvent","WeakMap","isCallbackRegistered","callback","event","listeners","includes","Notification","exports","addListener","skipCache","existingEvent","get","Error","on","set","addListenerOnce","once","removeListener","delete","removeAllListeners","postNotification","args","emit"],"sourceRoot":"../../src","sources":["Notification.ts"],"mappings":";;;;;;AAAA,MAAMA,YAAY,GAAGC,OAAO,CAAC,QAAQ,CAAC,CAACD,YAAY;AACnD,MAAME,YAAY,GAAG,IAAIF,YAAY,CAAC,CAAC;AAEvC,MAAMG,eAAe,GAAG,IAAIC,OAAO,CAAmB,CAAC;AAEvD,MAAMC,oBAAoB,GAAGA,CAACC,QAAkB,EAAEC,KAAa,KAAc;EAC3E,OAAOL,YAAY,CAACM,SAAS,CAACD,KAAK,CAAC,CAACE,QAAQ,CAACH,QAAQ,CAAC;AACzD,CAAC;AAEM,MAAMI,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG;EAC1BE,WAAW,EAAEA,CAACL,KAAa,EAAED,QAAkB,EAAEO,SAAmB,KAAK;IACvE,IAAI,CAACA,SAAS,EAAE;MACd,MAAMC,aAAa,GAAGX,eAAe,CAACY,GAAG,CAACT,QAAQ,CAAC;MAEnD,IAAIQ,aAAa,IAAIT,oBAAoB,CAACC,QAAQ,EAAEQ,aAAa,CAAC,EAAE;QAClE,IAAIA,aAAa,KAAKP,KAAK,EAAE;UAC3B,OAAOD,QAAQ;QACjB;QACA;QACA;QACA;QACA;QACA,MAAM,IAAIU,KAAK,CACb,mCAAmCF,aAAa,cAAcP,KAAK,GACrE,CAAC;MACH;IACF;IAEAL,YAAY,CAACe,EAAE,CAACV,KAAK,EAAED,QAAQ,CAAC;IAChCH,eAAe,CAACe,GAAG,CAACZ,QAAQ,EAAEC,KAAK,CAAC;IACpC,OAAOD,QAAQ;EACjB,CAAC;EAEDa,eAAe,EAAEA,CAACZ,KAAa,EAAED,QAAkB,KAAK;IACtDJ,YAAY,CAACkB,IAAI,CAACb,KAAK,EAAED,QAAQ,CAAC;EACpC,CAAC;EAEDe,cAAc,EAAGf,QAAkB,IAAK;IACtC,MAAMC,KAAK,GAAGJ,eAAe,CAACY,GAAG,CAACT,QAAQ,CAAC;IAC3C,IAAI,CAACC,KAAK,EAAE;IAEZL,YAAY,CAACmB,cAAc,CAACd,KAAK,EAAED,QAAQ,CAAC;IAC5CH,eAAe,CAACmB,MAAM,CAAChB,QAAQ,CAAC;EAClC,CAAC;EAEDiB,kBAAkB,EAAGhB,KAAa,IAAK;IACrC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACAL,YAAY,CAACqB,kBAAkB,CAAChB,KAAK,CAAC;EACxC,CAAC;EAEDiB,gBAAgB,EAAEA,CAACjB,KAAa,EAAEkB,IAAa,KAAK;IAClDvB,YAAY,CAACwB,IAAI,CAACnB,KAAK,EAAEkB,IAAI,CAAC;EAChC;AACF,CAAC","ignoreList":[]}
|
|
@@ -31,8 +31,8 @@ const _updateKeyValues = items => {
|
|
|
31
31
|
};
|
|
32
32
|
const handleVersionInfo = () => {
|
|
33
33
|
VersionManager.init({
|
|
34
|
-
latestAppVersion: ConfigDataModel.get(Platform.OS === 'android' ? 'aov' : 'ov'),
|
|
35
|
-
latestBundleVersion: ConfigDataModel.get(Platform.OS === 'android' ? 'abov' : 'bov')
|
|
34
|
+
latestAppVersion: ConfigDataModel.get(Platform.OS === 'android' ? 'aov' : Platform.OS === 'ios' ? 'ov' : 'hov'),
|
|
35
|
+
latestBundleVersion: ConfigDataModel.get(Platform.OS === 'android' ? 'abov' : Platform.OS === 'ios' ? 'bov' : 'hbov')
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
38
|
let isDataReady = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Platform","LoginManager","Notification","VersionManager","VipAndroidManager","EventEmitter","require","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","setOfferings","emitChange","defaultValues","addListener","isAuto","fetch","query","Query","equalTo","find","then","catch","e","error","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","r","lastChar","currentUser","AVUser","slice","indexOf","toLowerCase"],"sourceRoot":"../../src","sources":["ConfigDataModel.ts"],"mappings":";;AACA,SAASA,QAAQ,QAAQ,cAAc;AACvC,SAASC,YAAY,QAAgC,gBAAgB;AACrE,SAASC,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,cAAc,QAAQ,kBAAkB;AACjD,SAASC,iBAAiB,QAAQ,qBAAqB;AAEvD,MAAMC,YAAY,GAAGC,OAAO,CAAC,QAAQ,CAAC,CAACD,YAAY;AACnD,MAAME,YAAY,GAAG,IAAIF,YAAY,CAAC,CAAC;AAKvC,IAAIG,OAAoB,GAAG,CAAC,CAAC;AAE7B,MAAMC,EAAE,GAAGH,OAAO,CAAC,mBAAmB,CAAC;AAEvC,MAAMI,gBAAgB,GAAIC,KAAe,IAAK;EAC5C,IAAIC,GAAG,GAAG,EAAE;EACZ,KAAK,MAAMC,IAAI,IAAIF,KAAK,EAAE;IACxB,IACE,CAACR,cAAc,CAACW,cAAc,CAACD,IAAI,CAACE,GAAG,CAAC,QAAQ,CAAC,EAAEF,IAAI,CAACE,GAAG,CAAC,QAAQ,CAAC,CAAC,EACtE;MACA;IACF;IACAH,GAAG,CAACI,IAAI,CAACH,IAAI,CAAC;EAChB;EACA,OAAOD,GAAG;AACZ,CAAC;AAED,MAAMK,gBAAgB,GAAIN,KAAe,IAAK;EAC5C,KAAK,MAAME,IAAI,IAAIF,KAAK,EAAE;IACxB,IAAIO,KAAK,GAAGL,IAAI,CAACE,GAAG,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAOG,KAAK,KAAK,QAAQ,EAAE;MAC7B;MACAA,KAAK,GAAGA,KAAK,CAACC,IAAI,CAAC,CAAC;IACtB;IACAX,OAAO,CAACK,IAAI,CAACE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAGG,KAAK;EAClC;AACF,CAAC;AAED,MAAME,iBAAiB,GAAGA,CAAA,KAAM;EAC9BjB,cAAc,CAACkB,IAAI,CAAC;IAClBC,gBAAgB,EAAEC,eAAe,CAACR,GAAG,CACnCf,QAAQ,CAACwB,EAAE,KAAK,SAAS,GAAG,KAAK,GAAG,
|
|
1
|
+
{"version":3,"names":["Platform","LoginManager","Notification","VersionManager","VipAndroidManager","EventEmitter","require","eventEmitter","MyItems","AV","_filterByVersion","items","ret","item","isValidVersion","get","push","_updateKeyValues","value","trim","handleVersionInfo","init","latestAppVersion","ConfigDataModel","OS","latestBundleVersion","isDataReady","isNetwordDataReady","_handleResponse","OnlineItems","console","log","setOfferings","emitChange","defaultValues","addListener","isAuto","fetch","query","Query","equalTo","find","then","catch","e","error","key","emit","addListenerOnce","callback","once","on","shouldEnableByRate","enable","rate","r","lastChar","currentUser","AVUser","slice","indexOf","toLowerCase"],"sourceRoot":"../../src","sources":["ConfigDataModel.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,32 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
const EventEmitter = require('events').EventEmitter;
|
|
4
4
|
const eventEmitter = new EventEmitter();
|
|
5
|
-
const
|
|
5
|
+
const callbackToEvent = new WeakMap();
|
|
6
|
+
const isCallbackRegistered = (callback, event) => {
|
|
7
|
+
return eventEmitter.listeners(event).includes(callback);
|
|
8
|
+
};
|
|
6
9
|
export const Notification = {
|
|
7
10
|
addListener: (event, callback, skipCache) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
if (!skipCache) {
|
|
12
|
+
const existingEvent = callbackToEvent.get(callback);
|
|
13
|
+
if (existingEvent && isCallbackRegistered(callback, existingEvent)) {
|
|
14
|
+
if (existingEvent === event) {
|
|
15
|
+
return callback;
|
|
16
|
+
}
|
|
17
|
+
// 本类的设计只允许,同一个 callback 对应一个 eventKey,不允许多个 eventKey 对应同一个 callback
|
|
18
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 成功
|
|
19
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 跳过,返回 callback
|
|
20
|
+
// Notification.addListener('Language_Update', callback); // ❌ 抛错!
|
|
21
|
+
throw new Error(`[Notification] callback 已注册到事件 "${existingEvent}",不能重复注册到 "${event}"`);
|
|
22
|
+
}
|
|
12
23
|
}
|
|
24
|
+
eventEmitter.on(event, callback);
|
|
25
|
+
callbackToEvent.set(callback, event);
|
|
13
26
|
return callback;
|
|
14
27
|
},
|
|
15
28
|
addListenerOnce: (event, callback) => {
|
|
16
29
|
eventEmitter.once(event, callback);
|
|
17
30
|
},
|
|
18
31
|
removeListener: callback => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
delete ListenerToEvent[key];
|
|
32
|
+
const event = callbackToEvent.get(callback);
|
|
33
|
+
if (!event) return;
|
|
22
34
|
eventEmitter.removeListener(event, callback);
|
|
35
|
+
callbackToEvent.delete(callback);
|
|
23
36
|
},
|
|
24
37
|
removeAllListeners: event => {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
// 只清理 EventEmitter,不清理 callbackToEvent(残留 callback -> event 映射)
|
|
39
|
+
// 不清理原因:WeakMap 无法反向查找,清理需维护额外映射(复杂度高,不值得)
|
|
40
|
+
// 残留无任何影响:
|
|
41
|
+
// 1. 内存:WeakMap 弱引用,callback 被 GC 后自动清理,无泄漏
|
|
42
|
+
// 2. removeListener:即使 eventEmitter 中已无此 callback,removeListener 调用也安全
|
|
43
|
+
// 3. postNotification:真正的 callback 已经从 eventEmitter 中移除,不会被调用
|
|
44
|
+
// 4. 逻辑:addListener 通过 isCallbackRegistered 双重检查,脏数据不影响判断,如下
|
|
45
|
+
// 例:addListener('A', cb) 后调用 removeAllListeners('A')
|
|
46
|
+
// - eventEmitter 中 cb 已被移除
|
|
47
|
+
// - callbackToEvent 仍记录 cb -> 'A'(脏数据)
|
|
48
|
+
//
|
|
49
|
+
// 后续 addListener('A', cb) 时:
|
|
50
|
+
// - callbackToEvent.get(cb) 返回 'A'
|
|
51
|
+
// - isCallbackRegistered(cb, 'A') 检查 eventEmitter.listeners('A'),发现 cb 不在,会重新更新 Map 并注册
|
|
31
52
|
eventEmitter.removeAllListeners(event);
|
|
32
53
|
},
|
|
33
54
|
postNotification: (event, args) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["EventEmitter","require","eventEmitter","
|
|
1
|
+
{"version":3,"names":["EventEmitter","require","eventEmitter","callbackToEvent","WeakMap","isCallbackRegistered","callback","event","listeners","includes","Notification","addListener","skipCache","existingEvent","get","Error","on","set","addListenerOnce","once","removeListener","delete","removeAllListeners","postNotification","args","emit"],"sourceRoot":"../../src","sources":["Notification.ts"],"mappings":";;AAAA,MAAMA,YAAY,GAAGC,OAAO,CAAC,QAAQ,CAAC,CAACD,YAAY;AACnD,MAAME,YAAY,GAAG,IAAIF,YAAY,CAAC,CAAC;AAEvC,MAAMG,eAAe,GAAG,IAAIC,OAAO,CAAmB,CAAC;AAEvD,MAAMC,oBAAoB,GAAGA,CAACC,QAAkB,EAAEC,KAAa,KAAc;EAC3E,OAAOL,YAAY,CAACM,SAAS,CAACD,KAAK,CAAC,CAACE,QAAQ,CAACH,QAAQ,CAAC;AACzD,CAAC;AAED,OAAO,MAAMI,YAAY,GAAG;EAC1BC,WAAW,EAAEA,CAACJ,KAAa,EAAED,QAAkB,EAAEM,SAAmB,KAAK;IACvE,IAAI,CAACA,SAAS,EAAE;MACd,MAAMC,aAAa,GAAGV,eAAe,CAACW,GAAG,CAACR,QAAQ,CAAC;MAEnD,IAAIO,aAAa,IAAIR,oBAAoB,CAACC,QAAQ,EAAEO,aAAa,CAAC,EAAE;QAClE,IAAIA,aAAa,KAAKN,KAAK,EAAE;UAC3B,OAAOD,QAAQ;QACjB;QACA;QACA;QACA;QACA;QACA,MAAM,IAAIS,KAAK,CACb,mCAAmCF,aAAa,cAAcN,KAAK,GACrE,CAAC;MACH;IACF;IAEAL,YAAY,CAACc,EAAE,CAACT,KAAK,EAAED,QAAQ,CAAC;IAChCH,eAAe,CAACc,GAAG,CAACX,QAAQ,EAAEC,KAAK,CAAC;IACpC,OAAOD,QAAQ;EACjB,CAAC;EAEDY,eAAe,EAAEA,CAACX,KAAa,EAAED,QAAkB,KAAK;IACtDJ,YAAY,CAACiB,IAAI,CAACZ,KAAK,EAAED,QAAQ,CAAC;EACpC,CAAC;EAEDc,cAAc,EAAGd,QAAkB,IAAK;IACtC,MAAMC,KAAK,GAAGJ,eAAe,CAACW,GAAG,CAACR,QAAQ,CAAC;IAC3C,IAAI,CAACC,KAAK,EAAE;IAEZL,YAAY,CAACkB,cAAc,CAACb,KAAK,EAAED,QAAQ,CAAC;IAC5CH,eAAe,CAACkB,MAAM,CAACf,QAAQ,CAAC;EAClC,CAAC;EAEDgB,kBAAkB,EAAGf,KAAa,IAAK;IACrC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACAL,YAAY,CAACoB,kBAAkB,CAACf,KAAK,CAAC;EACxC,CAAC;EAEDgB,gBAAgB,EAAEA,CAAChB,KAAa,EAAEiB,IAAa,KAAK;IAClDtB,YAAY,CAACuB,IAAI,CAAClB,KAAK,EAAEiB,IAAI,CAAC;EAChC;AACF,CAAC","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigDataModel.d.ts","sourceRoot":"","sources":["../../src/ConfigDataModel.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"ConfigDataModel.d.ts","sourceRoot":"","sources":["../../src/ConfigDataModel.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAgED,QAAA,MAAM,eAAe;0BACG,WAAW;;eAyCtB,MAAM;;gCAQW,QAAQ;4BAQZ,QAAQ;kCAQF,OAAO,SAAS,MAAM;CAcrD,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Notification.d.ts","sourceRoot":"","sources":["../../src/Notification.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY;yBACF,MAAM,YAAY,QAAQ,cAAc,OAAO;
|
|
1
|
+
{"version":3,"file":"Notification.d.ts","sourceRoot":"","sources":["../../src/Notification.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY;yBACF,MAAM,YAAY,QAAQ,cAAc,OAAO;6BAuB3C,MAAM,YAAY,QAAQ;+BAIxB,QAAQ;gCAQP,MAAM;8BAkBR,MAAM,SAAS,MAAM;CAGhD,CAAC"}
|
package/package.json
CHANGED
package/src/ConfigDataModel.ts
CHANGED
|
@@ -42,10 +42,14 @@ const _updateKeyValues = (items: Object[]) => {
|
|
|
42
42
|
const handleVersionInfo = () => {
|
|
43
43
|
VersionManager.init({
|
|
44
44
|
latestAppVersion: ConfigDataModel.get(
|
|
45
|
-
Platform.OS === 'android' ? 'aov' : 'ov'
|
|
45
|
+
Platform.OS === 'android' ? 'aov' : Platform.OS === 'ios' ? 'ov' : 'hov'
|
|
46
46
|
),
|
|
47
47
|
latestBundleVersion: ConfigDataModel.get(
|
|
48
|
-
Platform.OS === 'android'
|
|
48
|
+
Platform.OS === 'android'
|
|
49
|
+
? 'abov'
|
|
50
|
+
: Platform.OS === 'ios'
|
|
51
|
+
? 'bov'
|
|
52
|
+
: 'hbov'
|
|
49
53
|
),
|
|
50
54
|
});
|
|
51
55
|
};
|
package/src/Notification.ts
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
const EventEmitter = require('events').EventEmitter;
|
|
2
2
|
const eventEmitter = new EventEmitter();
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
[key: string]: string;
|
|
6
|
-
}
|
|
4
|
+
const callbackToEvent = new WeakMap<Function, string>();
|
|
7
5
|
|
|
8
|
-
const
|
|
6
|
+
const isCallbackRegistered = (callback: Function, event: string): boolean => {
|
|
7
|
+
return eventEmitter.listeners(event).includes(callback);
|
|
8
|
+
};
|
|
9
9
|
|
|
10
10
|
export const Notification = {
|
|
11
11
|
addListener: (event: string, callback: Function, skipCache?: boolean) => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
if (!skipCache) {
|
|
13
|
+
const existingEvent = callbackToEvent.get(callback);
|
|
14
|
+
|
|
15
|
+
if (existingEvent && isCallbackRegistered(callback, existingEvent)) {
|
|
16
|
+
if (existingEvent === event) {
|
|
17
|
+
return callback;
|
|
18
|
+
}
|
|
19
|
+
// 本类的设计只允许,同一个 callback 对应一个 eventKey,不允许多个 eventKey 对应同一个 callback
|
|
20
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 成功
|
|
21
|
+
// Notification.addListener('Theme_Update', callback); // ✅ 跳过,返回 callback
|
|
22
|
+
// Notification.addListener('Language_Update', callback); // ❌ 抛错!
|
|
23
|
+
throw new Error(
|
|
24
|
+
`[Notification] callback 已注册到事件 "${existingEvent}",不能重复注册到 "${event}"`
|
|
25
|
+
);
|
|
26
|
+
}
|
|
16
27
|
}
|
|
28
|
+
|
|
29
|
+
eventEmitter.on(event, callback);
|
|
30
|
+
callbackToEvent.set(callback, event);
|
|
17
31
|
return callback;
|
|
18
32
|
},
|
|
19
33
|
|
|
@@ -22,19 +36,28 @@ export const Notification = {
|
|
|
22
36
|
},
|
|
23
37
|
|
|
24
38
|
removeListener: (callback: Function) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
39
|
+
const event = callbackToEvent.get(callback);
|
|
40
|
+
if (!event) return;
|
|
41
|
+
|
|
28
42
|
eventEmitter.removeListener(event, callback);
|
|
43
|
+
callbackToEvent.delete(callback);
|
|
29
44
|
},
|
|
30
45
|
|
|
31
46
|
removeAllListeners: (event: string) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
// 只清理 EventEmitter,不清理 callbackToEvent(残留 callback -> event 映射)
|
|
48
|
+
// 不清理原因:WeakMap 无法反向查找,清理需维护额外映射(复杂度高,不值得)
|
|
49
|
+
// 残留无任何影响:
|
|
50
|
+
// 1. 内存:WeakMap 弱引用,callback 被 GC 后自动清理,无泄漏
|
|
51
|
+
// 2. removeListener:即使 eventEmitter 中已无此 callback,removeListener 调用也安全
|
|
52
|
+
// 3. postNotification:真正的 callback 已经从 eventEmitter 中移除,不会被调用
|
|
53
|
+
// 4. 逻辑:addListener 通过 isCallbackRegistered 双重检查,脏数据不影响判断,如下
|
|
54
|
+
// 例:addListener('A', cb) 后调用 removeAllListeners('A')
|
|
55
|
+
// - eventEmitter 中 cb 已被移除
|
|
56
|
+
// - callbackToEvent 仍记录 cb -> 'A'(脏数据)
|
|
57
|
+
//
|
|
58
|
+
// 后续 addListener('A', cb) 时:
|
|
59
|
+
// - callbackToEvent.get(cb) 返回 'A'
|
|
60
|
+
// - isCallbackRegistered(cb, 'A') 检查 eventEmitter.listeners('A'),发现 cb 不在,会重新更新 Map 并注册
|
|
38
61
|
eventEmitter.removeAllListeners(event);
|
|
39
62
|
},
|
|
40
63
|
|