diff --git a/.gitignore b/.gitignore index 13bf881..c30294a 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,3 @@ node_modules .vscode .idea .DS_Store - diff --git a/companion-packages/meteorrn-local/index.js b/companion-packages/meteorrn-local/index.js index fb32b35..111bfeb 100644 --- a/companion-packages/meteorrn-local/index.js +++ b/companion-packages/meteorrn-local/index.js @@ -96,11 +96,12 @@ const Local = { LiveCol.find({}).observe({ added: async (doc) => { - LocalCol._collection.upsert(doc); + LocalCol.insert(doc); storeLocalCol(); }, - changed: async (doc) => { - LocalCol._collection.upsert(doc); + changed: async (changes, oldDoc) => { + delete changes._id; + LocalCol.update(oldDoc._id, { $set: changes }); storeLocalCol(); }, }); diff --git a/companion-packages/meteorrn-local/package.json b/companion-packages/meteorrn-local/package.json index 8318367..ac773d8 100644 --- a/companion-packages/meteorrn-local/package.json +++ b/companion-packages/meteorrn-local/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/local", - "version": "1.0.2", + "version": "1.0.3", "description": "Store data locally", "main": "index.js", "scripts": { diff --git a/docs/api.md b/docs/api.md index 71f4f02..a091c48 100644 --- a/docs/api.md +++ b/docs/api.md @@ -23,6 +23,7 @@ Connect to the Meteor Server - autoReconnect **boolean** [true] whether to try to reconnect to the server when the socket connection closes, unless the closing was initiated by a call to the disconnect method. - reconnectInterval **number** [10000] the interval in ms between reconnection attempts. - AsyncStorage **object** your preferred AsyncStorage. Defaults to `'@react-native-async-storage/async-storage'` as a peer dependency. +- reachabilityUrl **string** ["https://clients3.google.com/generate_204"] server to check internet reachability, used by NetInfo. If not provided, NetInfos default url will be used, which currently is `'https://clients3.google.com/generate_204'` ### `Meteor.disconnect()` diff --git a/lib/ddp.js b/lib/ddp.js index 81d61c8..24a3327 100644 --- a/lib/ddp.js +++ b/lib/ddp.js @@ -1,4 +1,4 @@ -import { EventEmitter } from 'events'; +import EventEmitter from 'eventemitter3'; import Queue from './queue'; import Socket from './socket'; import { uniqueId } from './utils'; @@ -115,6 +115,7 @@ export default class DDP extends EventEmitter { this.socket.on('message:in', (message) => { if (message.msg === 'connected') { this.status = 'connected'; + this._lastSessionId = message.session; this.messageQueue.process(); this.emit('connected'); } else if (message.msg === 'ping') { diff --git a/lib/socket.js b/lib/socket.js index 15afe20..9cb59b7 100644 --- a/lib/socket.js +++ b/lib/socket.js @@ -1,4 +1,4 @@ -import { EventEmitter } from 'events'; +import EventEmitter from 'eventemitter3'; import EJSON from 'ejson'; import './mongo-id'; // Register mongo object ids */ diff --git a/package-lock.json b/package-lock.json index 2b524de..274e9b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.4.0", + "version": "2.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1395,6 +1395,13 @@ "base64-js": "^1.5.1", "eventemitter3": "^1.1.0", "invariant": "^2.1.1" + }, + "dependencies": { + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==" + } } }, "@react-native-async-storage/async-storage": { @@ -2726,9 +2733,9 @@ "dev": true }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "events": { "version": "3.3.0", diff --git a/package.json b/package.json index b405dc1..9c10bb0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@meteorrn/core", - "version": "2.5.1", + "version": "2.6.0", "description": "Full Meteor Client for React Native", "main": "src/index.js", "repository": { @@ -28,7 +28,8 @@ "homepage": "https://github.com/TheRealNate/meteor-react-native#readme", "dependencies": { "@meteorrn/minimongo": "1.0.1", - "ejson": "2.2.3" + "ejson": "2.2.3", + "eventemitter3": "^5.0.1" }, "devDependencies": { "@babel/core": "7.19.6", diff --git a/src/Meteor.js b/src/Meteor.js index 03099f6..15a87a2 100644 --- a/src/Meteor.js +++ b/src/Meteor.js @@ -113,7 +113,16 @@ const Meteor = { try { const NetInfo = require('@react-native-community/netinfo').default; + + if (options.reachabilityUrl) { + NetInfo.configure({ + reachabilityUrl: options.reachabilityUrl, + useNativeReachability: true, + }); + } + // Reconnect if we lose internet + NetInfo.addEventListener( ({ type, isConnected, isInternetReachable, isWifiEnabled }) => { if (isConnected && Data.ddp.autoReconnect) { @@ -160,6 +169,13 @@ const Meteor = { console.info('Disconnected from DDP server.'); } + // Mark subscriptions as ready=false + for (var i in Data.subscriptions) { + const sub = Data.subscriptions[i]; + sub.ready = false; + sub.readyDeps.changed(); + } + if (!Data.ddp.autoReconnect) return; if (!lastDisconnect || new Date() - lastDisconnect > 3000) { diff --git a/src/user/User.js b/src/user/User.js index 50fd1c2..ecda510 100644 --- a/src/user/User.js +++ b/src/user/User.js @@ -177,6 +177,8 @@ const User = { } this._loadInitialUser(); }, time + 100); + } else if (err?.error === 403) { + User.logout(); } else { User._handleLoginCallback(err, result); }