Skip to content

Commit 66f8418

Browse files
authored
Merge pull request #445 from bertho-zero/cookie-store
use redux-persist with cookie storage
2 parents e28cc8a + 61579a9 commit 66f8418

4 files changed

Lines changed: 122 additions & 32 deletions

File tree

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
"classnames": "^2.2.5",
7474
"compression": "^1.6.2",
7575
"cookie-parser": "^1.4.3",
76+
"cookies": "^0.7.1",
77+
"cookies-js": "^1.2.3",
7678
"express": "^4.15.4",
7779
"express-session": "^1.15.5",
7880
"feathers-authentication-hooks": "^0.2.0",
@@ -111,6 +113,7 @@
111113
"redux-auth-wrapper": "^2.0.2",
112114
"redux-logger": "^3.0.6",
113115
"redux-persist": "^5.3.4",
116+
"redux-persist-cookie-storage": "^1.0.0",
114117
"serialize-javascript": "^1.3.0",
115118
"serve-favicon": "^2.3.2",
116119
"socket.io-client": "^2.0.1"

src/client.js

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* THIS IS THE ENTRY POINT FOR THE CLIENT, JUST LIKE server.js IS THE ENTRY POINT FOR THE SERVER.
33
*/
44
import 'babel-polyfill';
5-
import pick from 'lodash/pick';
65
import React from 'react';
76
import ReactDOM from 'react-dom';
87
import { ConnectedRouter } from 'react-router-redux';
@@ -12,7 +11,8 @@ import createBrowserHistory from 'history/createBrowserHistory';
1211
import Loadable from 'react-loadable';
1312
import { AppContainer as HotEnabler } from 'react-hot-loader';
1413
import { getStoredState } from 'redux-persist';
15-
import localForage from 'localforage';
14+
import { CookieStorage } from 'redux-persist-cookie-storage';
15+
import Cookies from 'cookies-js';
1616
import { socket, createApp } from 'app';
1717
import createStore from 'redux/create';
1818
import apiClient from 'helpers/apiClient';
@@ -22,8 +22,12 @@ import asyncMatchRoutes from 'utils/asyncMatchRoutes';
2222
import { ReduxAsyncConnect, Provider } from 'components';
2323

2424
const persistConfig = {
25-
key: 'primary',
26-
storage: localForage,
25+
key: 'root',
26+
storage: new CookieStorage(Cookies),
27+
stateReconciler(inboundState, originalState) {
28+
// Ignore state from cookies, only use preloadedState from window object
29+
return originalState;
30+
},
2731
whitelist: ['auth', 'info', 'chat']
2832
};
2933

@@ -51,7 +55,7 @@ function initSocket() {
5155
initSocket();
5256

5357
(async () => {
54-
const storedData = await getStoredState(persistConfig);
58+
const preloadedState = await getStoredState(persistConfig);
5559
const online = window.__data ? true : await isOnline();
5660

5761
if (online) {
@@ -60,17 +64,13 @@ initSocket();
6064
}
6165

6266
const history = createBrowserHistory();
63-
const data = {
64-
...storedData,
65-
...window.__data,
66-
...pick(storedData, [
67-
/* data always from store */
68-
]),
69-
online
70-
};
7167
const store = createStore({
7268
history,
73-
data,
69+
data: {
70+
...preloadedState,
71+
...window.__data,
72+
online
73+
},
7474
helpers: providers,
7575
persistConfig
7676
});

src/server.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import createMemoryHistory from 'history/createMemoryHistory';
1717
import Loadable from 'react-loadable';
1818
import { getBundles } from 'react-loadable/webpack';
1919
import { trigger } from 'redial';
20+
import { getStoredState } from 'redux-persist';
21+
import { CookieStorage, NodeCookiesWrapper } from 'redux-persist-cookie-storage';
22+
import Cookies from 'cookies';
2023
import config from 'config';
2124
import createStore from 'redux/create';
2225
import apiClient from 'helpers/apiClient';
@@ -109,9 +112,27 @@ app.use(async (req, res) => {
109112
client: apiClient(req)
110113
};
111114
const history = createMemoryHistory({ initialEntries: [req.originalUrl] });
115+
116+
const cookieJar = new NodeCookiesWrapper(new Cookies(req, res));
117+
118+
const persistConfig = {
119+
key: 'root',
120+
storage: new CookieStorage(cookieJar),
121+
stateReconciler: (inboundState, originalState) => originalState,
122+
whitelist: ['auth', 'info', 'chat']
123+
};
124+
125+
let preloadedState;
126+
try {
127+
preloadedState = await getStoredState(persistConfig);
128+
} catch (e) {
129+
preloadedState = {};
130+
}
131+
112132
const store = createStore({
113133
history,
114-
helpers: providers
134+
helpers: providers,
135+
data: preloadedState
115136
});
116137

117138
function hydrate() {

yarn.lock

Lines changed: 83 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ abbrev@1:
384384
version "1.1.1"
385385
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
386386

387-
accepts@~1.3.4, accepts@~1.3.5:
387+
accepts@^1.3.4, accepts@~1.3.4, accepts@~1.3.5:
388388
version "1.3.5"
389389
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
390390
dependencies:
@@ -2554,11 +2554,11 @@ contains-path@^0.1.0:
25542554
version "0.1.0"
25552555
resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
25562556

2557-
content-disposition@0.5.2:
2557+
content-disposition@0.5.2, content-disposition@^0.5.2:
25582558
version "0.5.2"
25592559
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
25602560

2561-
content-type@~1.0.4:
2561+
content-type@^1.0.4, content-type@~1.0.4:
25622562
version "1.0.4"
25632563
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
25642564

@@ -2581,10 +2581,25 @@ cookie-signature@1.0.6:
25812581
version "1.0.6"
25822582
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
25832583

2584-
cookie@0.3.1:
2584+
cookie-signature@^1.0.6:
2585+
version "1.1.0"
2586+
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.1.0.tgz#cc94974f91fb9a9c1bb485e95fc2b7f4b120aff2"
2587+
2588+
cookie@0.3.1, cookie@^0.3.1:
25852589
version "0.3.1"
25862590
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
25872591

2592+
cookies-js@^1.2.3:
2593+
version "1.2.3"
2594+
resolved "https://registry.yarnpkg.com/cookies-js/-/cookies-js-1.2.3.tgz#03315049e7c52bee3f73186a69167eab0ddb2d31"
2595+
2596+
cookies@^0.7.1:
2597+
version "0.7.1"
2598+
resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b"
2599+
dependencies:
2600+
depd "~1.1.1"
2601+
keygrip "~1.0.2"
2602+
25882603
copy-concurrently@^1.0.0:
25892604
version "1.0.5"
25902605
resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -3033,7 +3048,7 @@ depd@1.1.1:
30333048
version "1.1.1"
30343049
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
30353050

3036-
depd@~1.1.1, depd@~1.1.2:
3051+
depd@^1.1.1, depd@~1.1.1, depd@~1.1.2:
30373052
version "1.1.2"
30383053
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
30393054

@@ -3377,7 +3392,7 @@ es6-symbol@^3.1.1, es6-symbol@~3.1.1:
33773392
d "1"
33783393
es5-ext "~0.10.14"
33793394

3380-
escape-html@~1.0.3:
3395+
escape-html@^1.0.3, escape-html@~1.0.3:
33813396
version "1.0.3"
33823397
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
33833398

@@ -3569,7 +3584,7 @@ esutils@^2.0.2:
35693584
version "2.0.2"
35703585
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
35713586

3572-
etag@~1.8.1:
3587+
etag@^1.8.1, etag@~1.8.1:
35733588
version "1.8.1"
35743589
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
35753590

@@ -4082,7 +4097,7 @@ fragment-cache@^0.2.1:
40824097
dependencies:
40834098
map-cache "^0.2.2"
40844099

4085-
fresh@0.5.2:
4100+
fresh@0.5.2, fresh@^0.5.2:
40864101
version "0.5.2"
40874102
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
40884103

@@ -6008,6 +6023,10 @@ keycode@^2.1.2:
60086023
version "2.2.0"
60096024
resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
60106025

6026+
keygrip@~1.0.2:
6027+
version "1.0.2"
6028+
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91"
6029+
60116030
keyv@3.0.0:
60126031
version "3.0.0"
60136032
resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
@@ -6882,6 +6901,46 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd
68826901
dependencies:
68836902
minimist "0.0.8"
68846903

6904+
mock-express-request@^0.2.2:
6905+
version "0.2.2"
6906+
resolved "https://registry.yarnpkg.com/mock-express-request/-/mock-express-request-0.2.2.tgz#4bb8a2ea055d1c700013542c2d551c11771733f0"
6907+
dependencies:
6908+
accepts "^1.3.4"
6909+
fresh "^0.5.2"
6910+
lodash "^4.17.4"
6911+
mock-req "^0.2.0"
6912+
parseurl "^1.3.2"
6913+
range-parser "^1.2.0"
6914+
type-is "^1.6.15"
6915+
6916+
mock-express-response@^0.2.2:
6917+
version "0.2.2"
6918+
resolved "https://registry.yarnpkg.com/mock-express-response/-/mock-express-response-0.2.2.tgz#ad309189d8c829988f7b1fbc905e3cddc56e0cee"
6919+
dependencies:
6920+
content-disposition "^0.5.2"
6921+
content-type "^1.0.4"
6922+
cookie "^0.3.1"
6923+
cookie-signature "^1.0.6"
6924+
depd "^1.1.1"
6925+
escape-html "^1.0.3"
6926+
etag "^1.8.1"
6927+
mock-express-request "^0.2.2"
6928+
mock-res "^0.5.0"
6929+
on-finished "^2.3.0"
6930+
proxy-addr "^2.0.2"
6931+
qs "^6.5.1"
6932+
send "^0.16.1"
6933+
utils-merge "^1.0.1"
6934+
vary "^1.1.2"
6935+
6936+
mock-req@^0.2.0:
6937+
version "0.2.0"
6938+
resolved "https://registry.yarnpkg.com/mock-req/-/mock-req-0.2.0.tgz#749446804d2c006169342ee7be6bba1cffd534c2"
6939+
6940+
mock-res@^0.5.0:
6941+
version "0.5.0"
6942+
resolved "https://registry.yarnpkg.com/mock-res/-/mock-res-0.5.0.tgz#98368beb09df753f64f66d94e5536a97b36a2430"
6943+
68856944
morgan@^1.8.1:
68866945
version "1.9.0"
68876946
resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051"
@@ -7291,7 +7350,7 @@ object.pick@^1.3.0:
72917350
dependencies:
72927351
isobject "^3.0.1"
72937352

7294-
on-finished@~2.3.0:
7353+
on-finished@^2.3.0, on-finished@~2.3.0:
72957354
version "2.3.0"
72967355
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
72977356
dependencies:
@@ -7537,7 +7596,7 @@ parseuri@0.0.5:
75377596
dependencies:
75387597
better-assert "~1.0.0"
75397598

7540-
parseurl@~1.3.2:
7599+
parseurl@^1.3.2, parseurl@~1.3.2:
75417600
version "1.3.2"
75427601
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
75437602

@@ -8438,7 +8497,7 @@ prop-types@^15.0.0, prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.5.4,
84388497
loose-envify "^1.3.1"
84398498
object-assign "^4.1.1"
84408499

8441-
proxy-addr@~2.0.3:
8500+
proxy-addr@^2.0.2, proxy-addr@~2.0.3:
84428501
version "2.0.3"
84438502
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341"
84448503
dependencies:
@@ -8506,7 +8565,7 @@ qs@6.5.1:
85068565
version "6.5.1"
85078566
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
85088567

8509-
qs@6.5.2, qs@^6.1.0, qs@^6.5.0, qs@^6.5.2, qs@~6.5.1:
8568+
qs@6.5.2, qs@^6.1.0, qs@^6.5.0, qs@^6.5.1, qs@^6.5.2, qs@~6.5.1:
85108569
version "6.5.2"
85118570
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
85128571

@@ -8570,7 +8629,7 @@ randomfill@^1.0.3:
85708629
randombytes "^2.0.5"
85718630
safe-buffer "^5.1.0"
85728631

8573-
range-parser@^1.0.3, range-parser@~1.2.0:
8632+
range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0:
85748633
version "1.2.0"
85758634
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
85768635

@@ -9021,6 +9080,13 @@ redux-logger@^3.0.6:
90219080
dependencies:
90229081
deep-diff "^0.3.5"
90239082

9083+
redux-persist-cookie-storage@^1.0.0:
9084+
version "1.0.0"
9085+
resolved "https://registry.yarnpkg.com/redux-persist-cookie-storage/-/redux-persist-cookie-storage-1.0.0.tgz#78f96f605d0c3dede53855a49d72d03c5d45834a"
9086+
dependencies:
9087+
mock-express-request "^0.2.2"
9088+
mock-express-response "^0.2.2"
9089+
90249090
redux-persist@^5.3.4:
90259091
version "5.9.1"
90269092
resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-5.9.1.tgz#83bd4abd526ef768f63fceee338fa9d8ed6552d6"
@@ -9519,7 +9585,7 @@ semver@~5.3.0:
95199585
version "5.3.0"
95209586
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
95219587

9522-
send@0.16.2:
9588+
send@0.16.2, send@^0.16.1:
95239589
version "0.16.2"
95249590
resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
95259591
dependencies:
@@ -10378,7 +10444,7 @@ type-detect@^4.0.0:
1037810444
version "4.0.8"
1037910445
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
1038010446

10381-
type-is@~1.6.15, type-is@~1.6.16:
10447+
type-is@^1.6.15, type-is@~1.6.15, type-is@~1.6.16:
1038210448
version "1.6.16"
1038310449
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
1038410450
dependencies:
@@ -10648,7 +10714,7 @@ utila@~0.4:
1064810714
version "0.4.0"
1064910715
resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
1065010716

10651-
utils-merge@1.0.1, utils-merge@1.x.x:
10717+
utils-merge@1.0.1, utils-merge@1.x.x, utils-merge@^1.0.1:
1065210718
version "1.0.1"
1065310719
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1065410720

@@ -10675,7 +10741,7 @@ value-equal@^0.4.0:
1067510741
version "0.4.0"
1067610742
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
1067710743

10678-
vary@~1.1.2:
10744+
vary@^1.1.2, vary@~1.1.2:
1067910745
version "1.1.2"
1068010746
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1068110747

0 commit comments

Comments
 (0)