@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.
@@ -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":"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","ignoreList":[]}
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":"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","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 ListenerToEvent = {};
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
- const key = callback.toString();
13
- if (skipCache || !ListenerToEvent[key]) {
14
- eventEmitter.on(event, callback);
15
- ListenerToEvent[key] = event;
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 key = callback.toString();
24
- const event = ListenerToEvent[key];
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
- const keys = Object.keys(ListenerToEvent);
30
- for (const key of keys) {
31
- if (ListenerToEvent[key] === event) {
32
- delete ListenerToEvent[key];
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","ListenerToEvent","Notification","exports","addListener","event","callback","skipCache","key","toString","on","addListenerOnce","once","removeListener","removeAllListeners","keys","Object","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;AAMvC,MAAMG,eAA6B,GAAG,CAAC,CAAC;AAEjC,MAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG;EAC1BE,WAAW,EAAEA,CAACC,KAAa,EAAEC,QAAkB,EAAEC,SAAmB,KAAK;IACvE,MAAMC,GAAG,GAAGF,QAAQ,CAACG,QAAQ,CAAC,CAAC;IAC/B,IAAIF,SAAS,IAAI,CAACN,eAAe,CAACO,GAAG,CAAC,EAAE;MACtCR,YAAY,CAACU,EAAE,CAACL,KAAK,EAAEC,QAAQ,CAAC;MAChCL,eAAe,CAACO,GAAG,CAAC,GAAGH,KAAK;IAC9B;IACA,OAAOC,QAAQ;EACjB,CAAC;EAEDK,eAAe,EAAEA,CAACN,KAAa,EAAEC,QAAkB,KAAK;IACtDN,YAAY,CAACY,IAAI,CAACP,KAAK,EAAEC,QAAQ,CAAC;EACpC,CAAC;EAEDO,cAAc,EAAGP,QAAkB,IAAK;IACtC,MAAME,GAAG,GAAGF,QAAQ,CAACG,QAAQ,CAAC,CAAC;IAC/B,MAAMJ,KAAK,GAAGJ,eAAe,CAACO,GAAG,CAAC;IAClC,OAAOP,eAAe,CAACO,GAAG,CAAC;IAC3BR,YAAY,CAACa,cAAc,CAACR,KAAK,EAAEC,QAAQ,CAAC;EAC9C,CAAC;EAEDQ,kBAAkB,EAAGT,KAAa,IAAK;IACrC,MAAMU,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACd,eAAe,CAAC;IACzC,KAAK,MAAMO,GAAG,IAAIO,IAAI,EAAE;MACtB,IAAId,eAAe,CAACO,GAAG,CAAC,KAAKH,KAAK,EAAE;QAClC,OAAOJ,eAAe,CAACO,GAAG,CAAC;MAC7B;IACF;IACAR,YAAY,CAACc,kBAAkB,CAACT,KAAK,CAAC;EACxC,CAAC;EAEDY,gBAAgB,EAAEA,CAACZ,KAAa,EAAEa,IAAa,KAAK;IAClDlB,YAAY,CAACmB,IAAI,CAACd,KAAK,EAAEa,IAAI,CAAC;EAChC;AACF,CAAC","ignoreList":[]}
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":"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","ignoreList":[]}
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,GAAGxB,QAAQ,CAACwB,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,KACrE,CAAC;IACDC,mBAAmB,EAAEF,eAAe,CAACR,GAAG,CACtCf,QAAQ,CAACwB,EAAE,KAAK,SAAS,GACrB,MAAM,GACNxB,QAAQ,CAACwB,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,IAAIhB,KAAK,GAAGD,gBAAgB,CAACmB,WAAW,CAAC;EACzCZ,gBAAgB,CAACN,KAAK,CAAC;EACvB;EACAS,iBAAiB,CAAC,CAAC;EACnBU,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC;EAC1BL,WAAW,GAAG,IAAI;EAClBtB,iBAAiB,CAAC4B,YAAY,CAACT,eAAe,CAACR,GAAG,CAAC,uBAAuB,CAAC,CAAC;EAC5EQ,eAAe,CAACU,UAAU,CAAC,CAAC;AAC9B,CAAC;;AAED;AACA,MAAMV,eAAe,GAAG;EACtBF,IAAI,EAAGa,aAA0B,IAAK;IACpC1B,OAAO,GAAG0B,aAAa;IAEvBhC,YAAY,CAACiC,WAAW,CACtB,gBAAgB,EAChB,CAAC;MAAEC;IAA+B,CAAC,KAAK;MACtC,IAAI,CAACA,MAAM,EAAE;QACXV,WAAW,GAAG,KAAK;QACnBC,kBAAkB,GAAG,KAAK;QAC1BJ,eAAe,CAACc,KAAK,CAAC,CAAC;MACzB;IACF,CACF,CAAC;;IAED;IACAjC,iBAAiB,CAAC4B,YAAY,CAC5BT,eAAe,CAACR,GAAG,CAAC,uBAAuB,CAC7C,CAAC;IACDQ,eAAe,CAACc,KAAK,CAAC,CAAC;EACzB,CAAC;EAEDA,KAAK,EAAEA,CAAA,KAAM;IACX;IACA,IAAIV,kBAAkB,EAAE;MACtB;IACF;IAEA,MAAMW,KAAK,GAAG,IAAI7B,EAAE,CAAC8B,KAAK,CAAC,SAAS,CAAC;IACrCD,KAAK,CAACE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAACA,OAAO,CAACxC,QAAQ,CAACwB,EAAE,EAAE,IAAI,CAAC;IACvDc,KAAK,CACFG,IAAI,CAAC,CAAC,CACNC,IAAI,CAAE/B,KAAe,IAAK;MACzBmB,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC;MAC1BJ,kBAAkB,GAAG,IAAI;MACzBC,eAAe,CAACjB,KAAK,CAAC;IACxB,CAAC,CAAC,CACDgC,KAAK,CAAEC,CAAM,IAAK;MACjBd,OAAO,CAACe,KAAK,CAACD,CAAC,CAAC;IAClB,CAAC,CAAC;EACN,CAAC;EAED7B,GAAG,EAAG+B,GAAW,IAAK;IACpB,OAAOtC,OAAO,CAACsC,GAAG,CAAC;EACrB,CAAC;EAEDb,UAAU,EAAEA,CAAA,KAAM;IAChB1B,YAAY,CAACwC,IAAI,CAAC,QAAQ,CAAC;EAC7B,CAAC;EAEDC,eAAe,EAAGC,QAAkB,IAAK;IACvC,IAAIvB,WAAW,EAAE;MACfuB,QAAQ,IAAIA,QAAQ,CAAC,CAAC;MACtB;IACF;IACA1C,YAAY,CAAC2C,IAAI,CAAC,QAAQ,EAAED,QAAQ,CAAC;EACvC,CAAC;EAEDd,WAAW,EAAGc,QAAkB,IAAK;IACnC,IAAIvB,WAAW,EAAE;MACfuB,QAAQ,IAAIA,QAAQ,CAAC,CAAC;MACtB;IACF;IACA1C,YAAY,CAAC4C,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,GACZvD,YAAY,CAACwD,WAAW,CAAC,CAAC,EAAEC,MAAM,EAAE3C,GAAG,CAAC,UAAU,CAAC,EAAE4C,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG;IACvE,OAAO,kBAAkB,CAACC,OAAO,CAACJ,QAAQ,CAACK,WAAW,CAAC,CAAC,CAAC,GAAGN,CAAC,GAAG,EAAE;EACpE;AACF,CAAC;AAED,SAAShC,eAAe","ignoreList":[]}
@@ -2,32 +2,53 @@
2
2
 
3
3
  const EventEmitter = require('events').EventEmitter;
4
4
  const eventEmitter = new EventEmitter();
5
- const ListenerToEvent = {};
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
- const key = callback.toString();
9
- if (skipCache || !ListenerToEvent[key]) {
10
- eventEmitter.on(event, callback);
11
- ListenerToEvent[key] = event;
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 key = callback.toString();
20
- const event = ListenerToEvent[key];
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
- const keys = Object.keys(ListenerToEvent);
26
- for (const key of keys) {
27
- if (ListenerToEvent[key] === event) {
28
- delete ListenerToEvent[key];
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","ListenerToEvent","Notification","addListener","event","callback","skipCache","key","toString","on","addListenerOnce","once","removeListener","removeAllListeners","keys","Object","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;AAMvC,MAAMG,eAA6B,GAAG,CAAC,CAAC;AAExC,OAAO,MAAMC,YAAY,GAAG;EAC1BC,WAAW,EAAEA,CAACC,KAAa,EAAEC,QAAkB,EAAEC,SAAmB,KAAK;IACvE,MAAMC,GAAG,GAAGF,QAAQ,CAACG,QAAQ,CAAC,CAAC;IAC/B,IAAIF,SAAS,IAAI,CAACL,eAAe,CAACM,GAAG,CAAC,EAAE;MACtCP,YAAY,CAACS,EAAE,CAACL,KAAK,EAAEC,QAAQ,CAAC;MAChCJ,eAAe,CAACM,GAAG,CAAC,GAAGH,KAAK;IAC9B;IACA,OAAOC,QAAQ;EACjB,CAAC;EAEDK,eAAe,EAAEA,CAACN,KAAa,EAAEC,QAAkB,KAAK;IACtDL,YAAY,CAACW,IAAI,CAACP,KAAK,EAAEC,QAAQ,CAAC;EACpC,CAAC;EAEDO,cAAc,EAAGP,QAAkB,IAAK;IACtC,MAAME,GAAG,GAAGF,QAAQ,CAACG,QAAQ,CAAC,CAAC;IAC/B,MAAMJ,KAAK,GAAGH,eAAe,CAACM,GAAG,CAAC;IAClC,OAAON,eAAe,CAACM,GAAG,CAAC;IAC3BP,YAAY,CAACY,cAAc,CAACR,KAAK,EAAEC,QAAQ,CAAC;EAC9C,CAAC;EAEDQ,kBAAkB,EAAGT,KAAa,IAAK;IACrC,MAAMU,IAAI,GAAGC,MAAM,CAACD,IAAI,CAACb,eAAe,CAAC;IACzC,KAAK,MAAMM,GAAG,IAAIO,IAAI,EAAE;MACtB,IAAIb,eAAe,CAACM,GAAG,CAAC,KAAKH,KAAK,EAAE;QAClC,OAAOH,eAAe,CAACM,GAAG,CAAC;MAC7B;IACF;IACAP,YAAY,CAACa,kBAAkB,CAACT,KAAK,CAAC;EACxC,CAAC;EAEDY,gBAAgB,EAAEA,CAACZ,KAAa,EAAEa,IAAa,KAAK;IAClDjB,YAAY,CAACkB,IAAI,CAACd,KAAK,EAAEa,IAAI,CAAC;EAChC;AACF,CAAC","ignoreList":[]}
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;AA4DD,QAAA,MAAM,eAAe;0BACG,WAAW;;eAyCtB,MAAM;;gCAQW,QAAQ;4BAQZ,QAAQ;kCAQF,OAAO,SAAS,MAAM;CAcrD,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
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;6BAS3C,MAAM,YAAY,QAAQ;+BAIxB,QAAQ;gCAOP,MAAM;8BAUR,MAAM,SAAS,MAAM;CAGhD,CAAC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@norcy/react-native-toolkit",
3
- "version": "0.2.15",
3
+ "version": "0.2.17",
4
4
  "private": false,
5
5
  "description": "My Toolkit",
6
6
  "main": "lib/commonjs/index",
@@ -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' ? 'abov' : 'bov'
48
+ Platform.OS === 'android'
49
+ ? 'abov'
50
+ : Platform.OS === 'ios'
51
+ ? 'bov'
52
+ : 'hbov'
49
53
  ),
50
54
  });
51
55
  };
@@ -1,19 +1,33 @@
1
1
  const EventEmitter = require('events').EventEmitter;
2
2
  const eventEmitter = new EventEmitter();
3
3
 
4
- interface ListenerType {
5
- [key: string]: string;
6
- }
4
+ const callbackToEvent = new WeakMap<Function, string>();
7
5
 
8
- const ListenerToEvent: ListenerType = {};
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
- const key = callback.toString();
13
- if (skipCache || !ListenerToEvent[key]) {
14
- eventEmitter.on(event, callback);
15
- ListenerToEvent[key] = event;
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 key = callback.toString();
26
- const event = ListenerToEvent[key];
27
- delete ListenerToEvent[key];
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
- const keys = Object.keys(ListenerToEvent);
33
- for (const key of keys) {
34
- if (ListenerToEvent[key] === event) {
35
- delete ListenerToEvent[key];
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