@react-native-firebase/database 18.7.1 → 18.7.3

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [18.7.3](https://github.com/invertase/react-native-firebase/compare/v18.7.2...v18.7.3) (2023-12-13)
7
+
8
+ **Note:** Version bump only for package @react-native-firebase/database
9
+
10
+ ## [18.7.2](https://github.com/invertase/react-native-firebase/compare/v18.7.1...v18.7.2) (2023-12-08)
11
+
12
+ ### Bug Fixes
13
+
14
+ - **database:** react-native 0.73 compatibility ([788cc22](https://github.com/invertase/react-native-firebase/commit/788cc228b7ab34af371bf0c537bbc2033a789b1a))
15
+
6
16
  ## [18.7.1](https://github.com/invertase/react-native-firebase/compare/v18.7.0...v18.7.1) (2023-11-29)
7
17
 
8
18
  **Note:** Version bump only for package @react-native-firebase/database
@@ -26,6 +26,15 @@ class DatabaseSyncTree {
26
26
  this._tree = {};
27
27
  this._reverseLookup = {};
28
28
 
29
+ // we need to be able to register multiple listeners for a single event,
30
+ // *then delete a specific single listener for that event*, so we have to
31
+ // be able to identify specific listeners for removal which means we need
32
+ // to mirror the private registration accounting from upstream EventEmitter
33
+ // so we have access here and can do our single emitter removal
34
+ // This is a map of emitter-key <-> set of listener registrations
35
+ // The listener registrations have { context, listener, remove() }
36
+ this._registry = {};
37
+
29
38
  SharedEventEmitter.addListener('database_sync_event', this._handleSyncEvent.bind(this));
30
39
  }
31
40
 
@@ -33,6 +42,16 @@ class DatabaseSyncTree {
33
42
  return NativeModules.RNFBDatabaseQueryModule;
34
43
  }
35
44
 
45
+ // from upstream EventEmitter: initialize registrations for an emitter key
46
+ _allocate(registry, eventType) {
47
+ let registrations = registry[eventType];
48
+ if (registrations == null) {
49
+ registrations = new Set();
50
+ registry[eventType] = registrations;
51
+ }
52
+ return registrations;
53
+ }
54
+
36
55
  /**
37
56
  * Handles an incoming event from native
38
57
  * @param event
@@ -132,6 +151,13 @@ class DatabaseSyncTree {
132
151
  if (isString(registrations)) {
133
152
  this.removeRegistration(registrations);
134
153
  SharedEventEmitter.removeAllListeners(registrations);
154
+
155
+ // mirror upstream accounting - clear out all registrations for this key
156
+ if (registrations == null) {
157
+ this._registry = {};
158
+ } else {
159
+ delete this._registry[registrations];
160
+ }
135
161
  return 1;
136
162
  }
137
163
 
@@ -141,6 +167,12 @@ class DatabaseSyncTree {
141
167
  for (let i = 0, len = registrations.length; i < len; i++) {
142
168
  this.removeRegistration(registrations[i]);
143
169
  SharedEventEmitter.removeAllListeners(registrations[i]);
170
+ // mirror upstream accounting - clear out all registrations for this key
171
+ if (registrations[i] == null) {
172
+ this._registry = {};
173
+ } else {
174
+ delete this._registry[registrations[i]];
175
+ }
144
176
  }
145
177
 
146
178
  return registrations.length;
@@ -163,15 +195,10 @@ class DatabaseSyncTree {
163
195
  const registration = registrations[i];
164
196
  let subscriptions;
165
197
 
166
- // EventEmitter in react-native < 0.70 had a `_subscriber` property with a method for subscriptions by type...
167
- if (SharedEventEmitter._subscriber) {
168
- subscriptions = SharedEventEmitter._subscriber.getSubscriptionsForType(registration);
169
- } else {
170
- // ...react-native 0.70 now stores subscribers as a map of Sets by type in `_registry`
171
- const registrySubscriptionsSet = SharedEventEmitter._registry[registration];
172
- if (registrySubscriptionsSet) {
173
- subscriptions = Array.from(registrySubscriptionsSet);
174
- }
198
+ // get all registrations for this key so we can find our specific listener
199
+ const registrySubscriptionsSet = this._registry[registration];
200
+ if (registrySubscriptionsSet) {
201
+ subscriptions = Array.from(registrySubscriptionsSet);
175
202
  }
176
203
 
177
204
  if (subscriptions) {
@@ -180,6 +207,7 @@ class DatabaseSyncTree {
180
207
  // The subscription may have been removed during this event loop.
181
208
  // its listener matches the listener in method parameters
182
209
  if (subscription && subscription.listener === listener) {
210
+ this._registry[registration].delete(subscription);
183
211
  subscription.remove();
184
212
  removed.push(registration);
185
213
  this.removeRegistration(registration);
@@ -278,7 +306,12 @@ class DatabaseSyncTree {
278
306
  subscription.remove();
279
307
  });
280
308
  } else {
281
- SharedEventEmitter.addListener(eventRegistrationKey, listener);
309
+ const registration = SharedEventEmitter.addListener(eventRegistrationKey, listener);
310
+
311
+ // add this listener registration info to our emitter-key map
312
+ // in case we need to identify and remove a specific listener later
313
+ const registrations = this._allocate(this._registry, eventRegistrationKey);
314
+ registrations.add(registration);
282
315
  }
283
316
 
284
317
  return eventRegistrationKey;
package/lib/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- module.exports = '18.7.1';
2
+ module.exports = '18.7.3';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-firebase/database",
3
- "version": "18.7.1",
3
+ "version": "18.7.3",
4
4
  "author": "Invertase <oss@invertase.io> (http://invertase.io)",
5
5
  "description": "React Native Firebase - The Firebase Realtime Database is a cloud-hosted database. Data is stored as JSON and synchronized in realtime to every connected client. React Native Firebase provides native integration with the Android & iOS Firebase SDKs, supporting both realtime data sync and offline capabilities.",
6
6
  "main": "lib/index.js",
@@ -25,10 +25,10 @@
25
25
  "realtome database"
26
26
  ],
27
27
  "peerDependencies": {
28
- "@react-native-firebase/app": "18.7.1"
28
+ "@react-native-firebase/app": "18.7.3"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"
32
32
  },
33
- "gitHead": "f8b7794db23185c8a934a3e3623e996ce282c1f7"
33
+ "gitHead": "605a0df8171c451513125629355027bda2ea5e5d"
34
34
  }