From 19ea35d02c6099a9cdbd767d57f9520d767e30df Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 15:08:14 -0400 Subject: [PATCH 01/10] Change callbacks to promises --- RealmPersistInterface.js | 123 +++++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 57 deletions(-) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index aed99c4..16a46c0 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -16,73 +16,82 @@ class RealmPersistInterface { this.items = this.realm.objects('Item'); } - getItem = (key, callback) => { - try { - const matches = this.items.filtered(`name = "${key}"`); + getItem = (key) => { + return new Promise((resolve, reject) => { + try { + const matches = this.items.filtered(`name = "${key}"`); - if (matches.length > 0 && matches[0]) { - callback(null, matches[0].content); - } else { - throw new Error(`Could not get item with key: '${key}'`); - } - } catch (error) { - callback(error); - } + if (matches.length > 0 && matches[0]) { + resolve(null, matches[0].content); + } else { + reject(new Erro(`Could not get item with key: '${key}'`)); + } + } catch (error) { + reject(error); + } + }) }; - setItem = (key, value, callback) => { - try { - this.getItem(key, (error) => { - this.realm.write(() => { - if (error) { - this.realm.create( - 'Item', - { - name: key, - content: value, - } - ); - } else { - this.realm.create( - 'Item', - { - name: key, - content: value, - }, - true - ); - } + setItem = (key, value) => { + return new Promise((resolve, reject) => { + try { + this.getItem(key, (error) => { + this.realm.write(() => { + if (error) { + this.realm.create( + 'Item', + { + name: key, + content: value, + } + ); + } else { + this.realm.create( + 'Item', + { + name: key, + content: value, + }, + true + ); + } - callback(); - }); - }); - } catch (error) { - callback(error); - } + resolve(); + }); + }); + } catch (error) { + reject(error); + } + }) }; - removeItem = (key, callback) => { - try { - this.realm.write(() => { - const item = this.items.filtered(`name = "${key}"`); + removeItem = (key) => { + return new Promise((resolve, reject) => { + try { + this.realm.write(() => { + const item = this.items.filtered(`name = "${key}"`); - this.realm.delete(item); - }); - } catch (error) { - callback(error); - } + this.realm.delete(item); + }); + resolve(); + } catch (error) { + reject(error); + } + }) }; - getAllKeys = (callback) => { - try { - const keys = this.items.map( - (item) => item.name - ); + getAllKeys = () => { + return new Promise((resolve, reject) => { + try { + const keys = this.items.map( + (item) => item.name + ); - callback(null, keys); - } catch (error) { - callback(error); - } + resolve(null, keys); + } catch (error) { + reject(error); + } + }) }; } From 6f9860c42363a485fcce3d5a42cdf2033aa88f7a Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 17:24:35 -0400 Subject: [PATCH 02/10] Fix Error typo --- RealmPersistInterface.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index 16a46c0..c963350 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -24,7 +24,7 @@ class RealmPersistInterface { if (matches.length > 0 && matches[0]) { resolve(null, matches[0].content); } else { - reject(new Erro(`Could not get item with key: '${key}'`)); + reject(new Error(`Could not get item with key: '${key}'`)); } } catch (error) { reject(error); From 2f73e8cd832bb5274068c3cf593454cb06160db0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 18:22:37 -0400 Subject: [PATCH 03/10] Fix write and read --- RealmPersistInterface.js | 159 +++++++++++++++++++-------------------- 1 file changed, 76 insertions(+), 83 deletions(-) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index c963350..2546d6e 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -1,98 +1,91 @@ import Realm from 'realm'; class RealmPersistInterface { - constructor() { - this.realm = new Realm({ - schema: [{ - name: 'Item', - primaryKey: 'name', - properties: { - name: 'string', - content: 'string', - }, - }], - }); + constructor() { + this.realm = Realm.open({ + schema: [ + { + name: 'Item', + primaryKey: 'name', + properties: { + name: 'string', + content: 'string' + } + } + ] + }); + } - this.items = this.realm.objects('Item'); - } + check = async () => { + if (!this.items) { + this.realm = await this.realm; + this.items = this.realm.objects('Item'); + } + }; - getItem = (key) => { - return new Promise((resolve, reject) => { - try { - const matches = this.items.filtered(`name = "${key}"`); + getItem = async key => { + await this.check(); - if (matches.length > 0 && matches[0]) { - resolve(null, matches[0].content); - } else { - reject(new Error(`Could not get item with key: '${key}'`)); - } - } catch (error) { - reject(error); - } - }) - }; + return new Promise((resolve, reject) => { + try { + const matches = this.items.filtered(`name = "${key}"`); - setItem = (key, value) => { - return new Promise((resolve, reject) => { - try { - this.getItem(key, (error) => { - this.realm.write(() => { - if (error) { - this.realm.create( - 'Item', - { - name: key, - content: value, - } - ); - } else { - this.realm.create( - 'Item', - { - name: key, - content: value, - }, - true - ); - } + if (matches.length > 0 && matches[0]) { + resolve(null, matches[0].content); + } else { + reject(new Error(`Could not get item with key: '${key}'`)); + } + } catch (error) { + reject(error); + } + }); + }; - resolve(); - }); - }); - } catch (error) { - reject(error); - } - }) - }; + setItem = async (key, value) => { + await this.check(); - removeItem = (key) => { - return new Promise((resolve, reject) => { - try { - this.realm.write(() => { - const item = this.items.filtered(`name = "${key}"`); + return new Promise((resolve, reject) => { + try { + this.realm.write(() => { + this.realm.create('Item', { name: key, content: value }, true); + resolve(); + }); + } catch (error) { + reject(error); + } + }); + }; - this.realm.delete(item); - }); - resolve(); - } catch (error) { - reject(error); - } - }) - }; + removeItem = async key => { + await this.check(); - getAllKeys = () => { - return new Promise((resolve, reject) => { - try { - const keys = this.items.map( - (item) => item.name - ); + return new Promise((resolve, reject) => { + try { + this.realm.write(() => { + const item = this.items.filtered(`name = "${key}"`); - resolve(null, keys); - } catch (error) { - reject(error); - } - }) - }; + this.realm.delete(item); + }); + resolve(); + } catch (error) { + reject(error); + } + }); + }; + + getAllKeys = async () => { + await this.check(); + + return new Promise((resolve, reject) => { + try { + const keys = this.items.map(item => item.name); + + resolve(null, keys); + } catch (error) { + reject(error); + } + }); + }; } const singleton = new RealmPersistInterface(); From 7937c260d4e4232d4eac7363dc27736f380f3fb8 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 20:26:21 -0400 Subject: [PATCH 04/10] dependencies --- package.json | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d74259c..40b8b09 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redux-persist-realm", - "version": "0.1.0", + "version": "0.2.0", "description": "A Realmjs interface for redux-persist", "main": "RealmPersistInterface.js", "scripts": { @@ -24,7 +24,12 @@ }, "homepage": "https://github.com/Osedea/redux-persist-realm#readme", "peerDependencies": { - "realm": "^1.8.3", - "redux-persist": "^4.0.0" + "realm": "2.x", + "redux-persist": "5.x" + }, + "devDependencies": { + "realm": "^2.0.12", + "redux-persist": "^5.4.0", + "redux": "^3.7.2" } } From 42c9830f5466bc2287783abe2b2e1167eb36a3d2 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 21:18:29 -0400 Subject: [PATCH 05/10] gitignore --- .gitignore | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5d64756 --- /dev/null +++ b/.gitignore @@ -0,0 +1,56 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +*/fastlane/report.xml +*/fastlane/Preview.html +*/fastlane/screenshots + +# Bundle artifact +*.jsbundle From 7ead354bf61b880508af46a4585829f5aa1b2e62 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 21:19:27 -0400 Subject: [PATCH 06/10] fix not loading --- RealmPersistInterface.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index 2546d6e..3398787 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -31,7 +31,7 @@ class RealmPersistInterface { const matches = this.items.filtered(`name = "${key}"`); if (matches.length > 0 && matches[0]) { - resolve(null, matches[0].content); + resolve(matches[0].content); } else { reject(new Error(`Could not get item with key: '${key}'`)); } @@ -79,8 +79,7 @@ class RealmPersistInterface { return new Promise((resolve, reject) => { try { const keys = this.items.map(item => item.name); - - resolve(null, keys); + resolve(keys); } catch (error) { reject(error); } From 768c0dee6a87c32325fcbcd61a5f96b80d38e255 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 2 Jun 2018 21:25:56 -0400 Subject: [PATCH 07/10] es6 symbol singleton --- README.md | 6 +++--- RealmPersistInterface.js | 41 +++++++++++++++++++++++++++++----------- package.json | 3 ++- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d850fae..ca7e7f8 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ react-native link realm ```diff import {compose, applyMiddleware, createStore} from 'redux' import {persistStore, autoRehydrate} from 'redux-persist' -+ import realmPersistInterface from 'redux-persist-realm' ++ import RealmPersistInterface from 'redux-persist-realm' ++ const storage = RealmPersistInterface.instance; // add `autoRehydrate` as an enhancer to your store (note: `autoRehydrate` is not a middleware) const store = createStore( @@ -44,7 +45,7 @@ const store = createStore( ) + const config = { -+ storage: realmPersistInterface ++ storage + } // begin periodically persisting the store @@ -53,4 +54,3 @@ const store = createStore( ``` Don't hesitate to publish [Issues](https://github.com/Osedea/redux-persist-realm/issues) if you see something missing! - diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index 3398787..67c159a 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -1,7 +1,18 @@ import Realm from 'realm'; -class RealmPersistInterface { - constructor() { +var Symbol = require('es6-symbol/polyfill'); + +const singleton = Symbol(); +const singletonEnforcer = Symbol(); + +export default class RealmPersistInterface { + constructor(enforcer) { + if (enforcer !== singletonEnforcer) { + throw new Error('Cannot construct singleton'); + } + + this._type = 'RealmPersistInterface'; + this.realm = Realm.open({ schema: [ { @@ -16,14 +27,26 @@ class RealmPersistInterface { }); } - check = async () => { + static get instance() { + if (!this[singleton]) { + this[singleton] = new RealmPersistInterface(singletonEnforcer); + } + + return this[singleton]; + } + + get type() { + return this._type; + } + + async check() { if (!this.items) { this.realm = await this.realm; this.items = this.realm.objects('Item'); } }; - getItem = async key => { + async getItem(key) { await this.check(); return new Promise((resolve, reject) => { @@ -41,7 +64,7 @@ class RealmPersistInterface { }); }; - setItem = async (key, value) => { + async setItem(key, value) { await this.check(); return new Promise((resolve, reject) => { @@ -56,7 +79,7 @@ class RealmPersistInterface { }); }; - removeItem = async key => { + async removeItem(key) { await this.check(); return new Promise((resolve, reject) => { @@ -73,7 +96,7 @@ class RealmPersistInterface { }); }; - getAllKeys = async () => { + async getAllKeys() { await this.check(); return new Promise((resolve, reject) => { @@ -86,7 +109,3 @@ class RealmPersistInterface { }); }; } - -const singleton = new RealmPersistInterface(); - -export default singleton; diff --git a/package.json b/package.json index 40b8b09..8d5b20d 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "devDependencies": { "realm": "^2.0.12", "redux-persist": "^5.4.0", - "redux": "^3.7.2" + "redux": "^3.7.2", + "es6-symbol": "^3.1.1" } } From 47efef3aa30f30c2fdf2510563dec637636ffc7f Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 5 Jun 2018 16:58:59 -0400 Subject: [PATCH 08/10] order --- RealmPersistInterface.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index 67c159a..13e077c 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -44,7 +44,7 @@ export default class RealmPersistInterface { this.realm = await this.realm; this.items = this.realm.objects('Item'); } - }; + } async getItem(key) { await this.check(); @@ -86,10 +86,9 @@ export default class RealmPersistInterface { try { this.realm.write(() => { const item = this.items.filtered(`name = "${key}"`); - this.realm.delete(item); + resolve(); }); - resolve(); } catch (error) { reject(error); } From 1c4a02252e70f1f295f2e55bd9608969d974237e Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 6 Jun 2018 11:51:13 -0400 Subject: [PATCH 09/10] Avoid other instance of realms trying to use the default realm file --- RealmPersistInterface.js | 1 + 1 file changed, 1 insertion(+) diff --git a/RealmPersistInterface.js b/RealmPersistInterface.js index 13e077c..14f9f0a 100644 --- a/RealmPersistInterface.js +++ b/RealmPersistInterface.js @@ -14,6 +14,7 @@ export default class RealmPersistInterface { this._type = 'RealmPersistInterface'; this.realm = Realm.open({ + path: 'redux.realm', schema: [ { name: 'Item', From 3edb7bf3bdcefa54aaa26aeb431bc82a81b0eb08 Mon Sep 17 00:00:00 2001 From: Alberto Palumbo Date: Sat, 1 Feb 2020 01:25:23 -0300 Subject: [PATCH 10/10] Update package.json --- package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8d5b20d..e227ea8 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,9 @@ "url": "https://github.com/Osedea/redux-persist-realm/issues" }, "homepage": "https://github.com/Osedea/redux-persist-realm#readme", + "dependencies": { + "es6-symbol": "^3.1.1" + }, "peerDependencies": { "realm": "2.x", "redux-persist": "5.x" @@ -30,7 +33,6 @@ "devDependencies": { "realm": "^2.0.12", "redux-persist": "^5.4.0", - "redux": "^3.7.2", - "es6-symbol": "^3.1.1" + "redux": "^3.7.2" } }