isomorfeus-redux 4.2.0 → 22.9.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (236) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +176 -0
  3. data/lib/app_state.rb +25 -0
  4. data/lib/isomorfeus/browser_store_api.rb +0 -16
  5. data/lib/isomorfeus/redux/config.rb +97 -14
  6. data/lib/isomorfeus/redux/handler.rb +35 -0
  7. data/lib/isomorfeus/redux/version.rb +5 -0
  8. data/lib/isomorfeus/redux_imports.rb +14 -0
  9. data/lib/{redux/reducers.rb → isomorfeus/redux_reducers.rb} +15 -13
  10. data/lib/isomorfeus-redux.rb +18 -30
  11. data/lib/local_store.rb +27 -30
  12. data/lib/redux/store.rb +156 -120
  13. data/lib/session_store.rb +28 -30
  14. metadata +24 -247
  15. data/lib/app_store.rb +0 -42
  16. data/lib/isomorfeus/core_ext/hash/deep_merge.rb +0 -34
  17. data/lib/isomorfeus/core_ext/kernel.rb +0 -30
  18. data/lib/isomorfeus/execution_environment.rb +0 -67
  19. data/lib/isomorfeus/redux/imports.rb +0 -17
  20. data/lib/redux/version.rb +0 -3
  21. data/lib/redux.rb +0 -118
  22. data/node_modules/.package-lock.json +0 -31
  23. data/node_modules/@babel/runtime/LICENSE +0 -22
  24. data/node_modules/@babel/runtime/README.md +0 -19
  25. data/node_modules/@babel/runtime/helpers/AsyncGenerator.js +0 -99
  26. data/node_modules/@babel/runtime/helpers/AwaitValue.js +0 -6
  27. data/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js +0 -31
  28. data/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +0 -12
  29. data/node_modules/@babel/runtime/helpers/arrayWithHoles.js +0 -6
  30. data/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +0 -8
  31. data/node_modules/@babel/runtime/helpers/assertThisInitialized.js +0 -10
  32. data/node_modules/@babel/runtime/helpers/asyncGeneratorDelegate.js +0 -57
  33. data/node_modules/@babel/runtime/helpers/asyncIterator.js +0 -16
  34. data/node_modules/@babel/runtime/helpers/asyncToGenerator.js +0 -38
  35. data/node_modules/@babel/runtime/helpers/awaitAsyncGenerator.js +0 -8
  36. data/node_modules/@babel/runtime/helpers/checkPrivateRedeclaration.js +0 -8
  37. data/node_modules/@babel/runtime/helpers/classApplyDescriptorDestructureSet.js +0 -23
  38. data/node_modules/@babel/runtime/helpers/classApplyDescriptorGet.js +0 -10
  39. data/node_modules/@babel/runtime/helpers/classApplyDescriptorSet.js +0 -14
  40. data/node_modules/@babel/runtime/helpers/classCallCheck.js +0 -8
  41. data/node_modules/@babel/runtime/helpers/classCheckPrivateStaticAccess.js +0 -8
  42. data/node_modules/@babel/runtime/helpers/classCheckPrivateStaticFieldDescriptor.js +0 -8
  43. data/node_modules/@babel/runtime/helpers/classExtractFieldDescriptor.js +0 -10
  44. data/node_modules/@babel/runtime/helpers/classNameTDZError.js +0 -6
  45. data/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js +0 -11
  46. data/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js +0 -11
  47. data/node_modules/@babel/runtime/helpers/classPrivateFieldInitSpec.js +0 -9
  48. data/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js +0 -10
  49. data/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js +0 -8
  50. data/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js +0 -12
  51. data/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js +0 -10
  52. data/node_modules/@babel/runtime/helpers/classPrivateMethodInitSpec.js +0 -9
  53. data/node_modules/@babel/runtime/helpers/classPrivateMethodSet.js +0 -6
  54. data/node_modules/@babel/runtime/helpers/classStaticPrivateFieldDestructureSet.js +0 -14
  55. data/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js +0 -14
  56. data/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js +0 -15
  57. data/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js +0 -9
  58. data/node_modules/@babel/runtime/helpers/classStaticPrivateMethodSet.js +0 -6
  59. data/node_modules/@babel/runtime/helpers/construct.js +0 -26
  60. data/node_modules/@babel/runtime/helpers/createClass.js +0 -18
  61. data/node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js +0 -61
  62. data/node_modules/@babel/runtime/helpers/createForOfIteratorHelperLoose.js +0 -25
  63. data/node_modules/@babel/runtime/helpers/createSuper.js +0 -25
  64. data/node_modules/@babel/runtime/helpers/decorate.js +0 -401
  65. data/node_modules/@babel/runtime/helpers/defaults.js +0 -17
  66. data/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js +0 -25
  67. data/node_modules/@babel/runtime/helpers/defineProperty.js +0 -17
  68. data/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js +0 -95
  69. data/node_modules/@babel/runtime/helpers/esm/AwaitValue.js +0 -3
  70. data/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js +0 -28
  71. data/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +0 -9
  72. data/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +0 -3
  73. data/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +0 -4
  74. data/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +0 -7
  75. data/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js +0 -54
  76. data/node_modules/@babel/runtime/helpers/esm/asyncIterator.js +0 -13
  77. data/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js +0 -35
  78. data/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js +0 -4
  79. data/node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js +0 -5
  80. data/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorDestructureSet.js +0 -20
  81. data/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js +0 -7
  82. data/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js +0 -11
  83. data/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +0 -5
  84. data/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticAccess.js +0 -5
  85. data/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticFieldDescriptor.js +0 -5
  86. data/node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js +0 -7
  87. data/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js +0 -3
  88. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js +0 -6
  89. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js +0 -6
  90. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js +0 -5
  91. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js +0 -7
  92. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js +0 -4
  93. data/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js +0 -7
  94. data/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js +0 -7
  95. data/node_modules/@babel/runtime/helpers/esm/classPrivateMethodInitSpec.js +0 -5
  96. data/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js +0 -3
  97. data/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldDestructureSet.js +0 -8
  98. data/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js +0 -8
  99. data/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js +0 -9
  100. data/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js +0 -5
  101. data/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js +0 -3
  102. data/node_modules/@babel/runtime/helpers/esm/construct.js +0 -18
  103. data/node_modules/@babel/runtime/helpers/esm/createClass.js +0 -15
  104. data/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js +0 -57
  105. data/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelperLoose.js +0 -21
  106. data/node_modules/@babel/runtime/helpers/esm/createSuper.js +0 -19
  107. data/node_modules/@babel/runtime/helpers/esm/decorate.js +0 -396
  108. data/node_modules/@babel/runtime/helpers/esm/defaults.js +0 -14
  109. data/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js +0 -22
  110. data/node_modules/@babel/runtime/helpers/esm/defineProperty.js +0 -14
  111. data/node_modules/@babel/runtime/helpers/esm/extends.js +0 -17
  112. data/node_modules/@babel/runtime/helpers/esm/get.js +0 -20
  113. data/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +0 -6
  114. data/node_modules/@babel/runtime/helpers/esm/inherits.js +0 -15
  115. data/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +0 -6
  116. data/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js +0 -9
  117. data/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js +0 -3
  118. data/node_modules/@babel/runtime/helpers/esm/instanceof.js +0 -7
  119. data/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js +0 -5
  120. data/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js +0 -51
  121. data/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js +0 -3
  122. data/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +0 -12
  123. data/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +0 -3
  124. data/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +0 -29
  125. data/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js +0 -14
  126. data/node_modules/@babel/runtime/helpers/esm/jsx.js +0 -46
  127. data/node_modules/@babel/runtime/helpers/esm/maybeArrayLike.js +0 -9
  128. data/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js +0 -5
  129. data/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +0 -3
  130. data/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +0 -3
  131. data/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js +0 -3
  132. data/node_modules/@babel/runtime/helpers/esm/objectSpread.js +0 -19
  133. data/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +0 -39
  134. data/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +0 -19
  135. data/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +0 -14
  136. data/node_modules/@babel/runtime/helpers/esm/package.json +0 -3
  137. data/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +0 -11
  138. data/node_modules/@babel/runtime/helpers/esm/readOnlyError.js +0 -3
  139. data/node_modules/@babel/runtime/helpers/esm/set.js +0 -51
  140. data/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +0 -8
  141. data/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js +0 -7
  142. data/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +0 -7
  143. data/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js +0 -7
  144. data/node_modules/@babel/runtime/helpers/esm/superPropBase.js +0 -9
  145. data/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +0 -11
  146. data/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js +0 -8
  147. data/node_modules/@babel/runtime/helpers/esm/tdz.js +0 -3
  148. data/node_modules/@babel/runtime/helpers/esm/temporalRef.js +0 -5
  149. data/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js +0 -1
  150. data/node_modules/@babel/runtime/helpers/esm/toArray.js +0 -7
  151. data/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +0 -7
  152. data/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +0 -13
  153. data/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +0 -6
  154. data/node_modules/@babel/runtime/helpers/esm/typeof.js +0 -15
  155. data/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +0 -9
  156. data/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js +0 -6
  157. data/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js +0 -37
  158. data/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js +0 -65
  159. data/node_modules/@babel/runtime/helpers/esm/writeOnlyError.js +0 -3
  160. data/node_modules/@babel/runtime/helpers/extends.js +0 -21
  161. data/node_modules/@babel/runtime/helpers/get.js +0 -27
  162. data/node_modules/@babel/runtime/helpers/getPrototypeOf.js +0 -10
  163. data/node_modules/@babel/runtime/helpers/inherits.js +0 -19
  164. data/node_modules/@babel/runtime/helpers/inheritsLoose.js +0 -10
  165. data/node_modules/@babel/runtime/helpers/initializerDefineProperty.js +0 -12
  166. data/node_modules/@babel/runtime/helpers/initializerWarningHelper.js +0 -6
  167. data/node_modules/@babel/runtime/helpers/instanceof.js +0 -10
  168. data/node_modules/@babel/runtime/helpers/interopRequireDefault.js +0 -8
  169. data/node_modules/@babel/runtime/helpers/interopRequireWildcard.js +0 -54
  170. data/node_modules/@babel/runtime/helpers/isNativeFunction.js +0 -6
  171. data/node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js +0 -15
  172. data/node_modules/@babel/runtime/helpers/iterableToArray.js +0 -6
  173. data/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js +0 -32
  174. data/node_modules/@babel/runtime/helpers/iterableToArrayLimitLoose.js +0 -17
  175. data/node_modules/@babel/runtime/helpers/jsx.js +0 -50
  176. data/node_modules/@babel/runtime/helpers/maybeArrayLike.js +0 -13
  177. data/node_modules/@babel/runtime/helpers/newArrowCheck.js +0 -8
  178. data/node_modules/@babel/runtime/helpers/nonIterableRest.js +0 -6
  179. data/node_modules/@babel/runtime/helpers/nonIterableSpread.js +0 -6
  180. data/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js +0 -6
  181. data/node_modules/@babel/runtime/helpers/objectSpread.js +0 -23
  182. data/node_modules/@babel/runtime/helpers/objectSpread2.js +0 -42
  183. data/node_modules/@babel/runtime/helpers/objectWithoutProperties.js +0 -23
  184. data/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +0 -17
  185. data/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js +0 -16
  186. data/node_modules/@babel/runtime/helpers/readOnlyError.js +0 -6
  187. data/node_modules/@babel/runtime/helpers/set.js +0 -55
  188. data/node_modules/@babel/runtime/helpers/setPrototypeOf.js +0 -12
  189. data/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js +0 -10
  190. data/node_modules/@babel/runtime/helpers/slicedToArray.js +0 -14
  191. data/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js +0 -14
  192. data/node_modules/@babel/runtime/helpers/superPropBase.js +0 -13
  193. data/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js +0 -14
  194. data/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js +0 -11
  195. data/node_modules/@babel/runtime/helpers/tdz.js +0 -6
  196. data/node_modules/@babel/runtime/helpers/temporalRef.js +0 -10
  197. data/node_modules/@babel/runtime/helpers/temporalUndefined.js +0 -4
  198. data/node_modules/@babel/runtime/helpers/toArray.js +0 -14
  199. data/node_modules/@babel/runtime/helpers/toConsumableArray.js +0 -14
  200. data/node_modules/@babel/runtime/helpers/toPrimitive.js +0 -17
  201. data/node_modules/@babel/runtime/helpers/toPropertyKey.js +0 -11
  202. data/node_modules/@babel/runtime/helpers/typeof.js +0 -22
  203. data/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +0 -13
  204. data/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js +0 -10
  205. data/node_modules/@babel/runtime/helpers/wrapNativeSuper.js +0 -45
  206. data/node_modules/@babel/runtime/helpers/wrapRegExp.js +0 -72
  207. data/node_modules/@babel/runtime/helpers/writeOnlyError.js +0 -6
  208. data/node_modules/@babel/runtime/package.json +0 -848
  209. data/node_modules/@babel/runtime/regenerator/index.js +0 -1
  210. data/node_modules/redux/LICENSE.md +0 -21
  211. data/node_modules/redux/README.md +0 -322
  212. data/node_modules/redux/dist/redux.js +0 -768
  213. data/node_modules/redux/dist/redux.min.js +0 -1
  214. data/node_modules/redux/es/redux.js +0 -716
  215. data/node_modules/redux/es/redux.mjs +0 -1
  216. data/node_modules/redux/index.d.ts +0 -776
  217. data/node_modules/redux/lib/redux.js +0 -730
  218. data/node_modules/redux/package.json +0 -108
  219. data/node_modules/redux/src/applyMiddleware.js +0 -41
  220. data/node_modules/redux/src/bindActionCreators.js +0 -52
  221. data/node_modules/redux/src/combineReducers.js +0 -175
  222. data/node_modules/redux/src/compose.js +0 -22
  223. data/node_modules/redux/src/createStore.js +0 -347
  224. data/node_modules/redux/src/index.js +0 -37
  225. data/node_modules/redux/src/utils/actionTypes.js +0 -17
  226. data/node_modules/redux/src/utils/formatProdErrorMessage.js +0 -15
  227. data/node_modules/redux/src/utils/isPlainObject.js +0 -14
  228. data/node_modules/redux/src/utils/kindOf.js +0 -70
  229. data/node_modules/redux/src/utils/symbol-observable.js +0 -3
  230. data/node_modules/redux/src/utils/warning.js +0 -19
  231. data/node_modules/regenerator-runtime/LICENSE +0 -21
  232. data/node_modules/regenerator-runtime/README.md +0 -31
  233. data/node_modules/regenerator-runtime/package.json +0 -19
  234. data/node_modules/regenerator-runtime/path.js +0 -11
  235. data/node_modules/regenerator-runtime/runtime.js +0 -754
  236. data/package.json +0 -6
data/lib/redux/store.rb CHANGED
@@ -1,11 +1,19 @@
1
1
  module Redux
2
2
  class Store
3
- include Native::Wrapper
3
+ ACTIONS = {
4
+ init: "@@redux/INIT#{SecureRandom.hex(8)}",
5
+ replace: "@@redux/REPLACE#{SecureRandom.hex(8)}"
6
+ }
7
+ MIDDLEWARE_WARNING = "Adding middleware after Store initialization may have side effects! Saving state and initializing new store with restored state!"
4
8
 
5
9
  class << self
6
10
  def add_middleware(middleware)
7
11
  if Isomorfeus.store
8
- `console.warning("Adding middleware after Store initialization may have side effects! Saving state and initializing new store with restored state!")`
12
+ if RUBY_ENGINE == 'opal'
13
+ `console.warning(#{MIDDLEWARE_WARNING})`
14
+ else
15
+ STDERR.puts MIDDLEWARE_WARNING
16
+ end
9
17
  middlewares << middleware
10
18
  preloaded_state = Isomorfeus.store.get_state
11
19
  init!
@@ -14,38 +22,19 @@ module Redux
14
22
  end
15
23
  end
16
24
 
17
- def add_reducer(reducer)
18
- if Isomorfeus.store
19
- # if the store has been initalized already, add the reducer to the instance
20
- Isomorfeus.store.add_reducer(reducer)
21
- else
22
- # otherwise just add it to the reducers, so that they will be used when initializing the store
23
- preloaded_state[reducer.keys.first] = {} unless preloaded_state.key?(reducer.keys.first)
24
- reducers.merge!(reducer)
25
- end
26
- end
27
-
28
25
  def add_reducers(new_reducers)
29
26
  if Isomorfeus.store
30
27
  # if the store has been initalized already, add the reducer to the instance
31
28
  Isomorfeus.store.add_reducers(new_reducers)
32
29
  else
33
30
  # otherwise just add it to the reducers, so that they will be used when initializing the store
34
- new_reducers.each do |key, value|
35
- add_reducer(key => value)
36
- end
31
+ reducers.merge!(new_reducers)
37
32
  end
38
33
  end
39
34
 
40
35
  # called from Isomorfeus.init
41
36
  def init!
42
- next_reducer = Redux.combine_reducers(@reducers)
43
- if middlewares.any?
44
- enhancer = Redux.apply_middleware(middlewares)
45
- Redux::Store.new(next_reducer, preloaded_state, enhancer)
46
- else
47
- Redux::Store.new(next_reducer, preloaded_state)
48
- end
37
+ Redux::Store.new(reducers, preloaded_state, middlewares)
49
38
  end
50
39
 
51
40
  def middlewares
@@ -69,69 +58,71 @@ module Redux
69
58
  end
70
59
  end
71
60
 
72
- def initialize(reducer, preloaded_state = nil, enhancer = nil)
73
- @deferred_actions = {}
74
- @deferred_dispatcher = nil
75
- @last_dispatch_time = Time.now
76
- %x{
77
- var ogre = Opal.global.Redux;
78
- var compose = (typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || ogre.compose;
79
- if (enhancer == nil) { enhancer = null; }
80
- if (typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION__) {
81
- var devext_enhance = window.__REDUX_DEVTOOLS_EXTENSION__();
82
- if (enhancer) { enhancer = compose([enhancer, devext_enhance]); }
83
- else { enhancer = devext_enhance; }
84
- }
85
- if (preloaded_state == nil) {
86
- preloaded_state = null;
87
- } else if (typeof preloaded_state.$class === "function" && preloaded_state.$class() == "Hash") {
88
- if (preloaded_state.$size() == 0) {
89
- preloaded_state = null;
90
- } else {
91
- preloaded_state = preloaded_state.$to_n();
92
- }
93
- }
94
- if (enhancer && preloaded_state) {
95
- this.native = ogre.legacy_createStore(reducer, preloaded_state, enhancer);
96
- } else if (preloaded_state) {
97
- this.native = ogre.legacy_createStore(reducer, preloaded_state);
98
- } else if (enhancer) {
99
- this.native = ogre.legacy_createStore(reducer, enhancer);
100
- } else {
101
- this.native = ogre.legacy_createStore(reducer);
102
- }
103
- }
104
- end
105
-
106
- def add_reducer(reducer)
107
- self.class.reducers.merge!(reducer)
108
- next_reducer = Redux.combine_reducers(self.class.reducers)
109
- replace_reducer(next_reducer)
61
+ def initialize(reducers, preloaded_state = nil, middleware = nil)
62
+ @deferred_actions = []
63
+ @listeners = {}
64
+ @key = 0
65
+ @is_dispatching = false
66
+ @preloaded_state = preloaded_state
67
+ @current_state = @preloaded_state.deep_dup
68
+ @current_state = {} unless @current_state
69
+ init_reducers(reducers)
70
+ @middleware = middleware.dup
71
+ @middleware = [] unless middleware
72
+ if @middleware.empty?
73
+ @middleware = method(:reduce)
74
+ else
75
+ @middleware << proc { |action, _next_pr| reduce(action) }
76
+ @middleware = @middleware.reverse.reduce do |pr, next_pr|
77
+ proc do |action|
78
+ next_pr.call(action, pr)
79
+ end
80
+ end
81
+ end
82
+ @current_state_dup = @current_state.deep_dup
83
+ dispatch({ type: ACTIONS[:init] })
84
+ end
85
+
86
+ def clear!
87
+ @current_state = @preloaded_state.deep_dup
88
+ @current_state_dup = @current_state.deep_dup
89
+ @listeners = {}
90
+ nil
110
91
  end
111
92
 
112
93
  def add_reducers(new_reducers)
113
- self.class.reducers.merge!(new_reducers)
114
- next_reducer = Redux.combine_reducers(self.class.reducers)
115
- replace_reducer(next_reducer)
94
+ if @reducers
95
+ @reducers.merge!(new_reducers)
96
+ elsif @reducer
97
+ @current_state = { state: @current_state }
98
+ init_reducers({ state: @reducer }.merge!(new_reducers))
99
+ end
100
+ nil
101
+ end
102
+
103
+ def multi_dispatch(actions)
104
+ actions.each do |action|
105
+ single_dispatch(action)
106
+ end
107
+ @listeners.dup.each_value { |listener| listener.call }
108
+ actions
116
109
  end
117
110
 
118
111
  def dispatch(action)
119
- %x{
120
- if (typeof action.$class === "function" && action.$class() == "Hash") {
121
- action = action.$to_n();
122
- }
123
- this.native.dispatch(action);
124
- }
112
+ single_dispatch(action)
113
+ @listeners.dup.each_value { |listener| listener.call }
114
+ action
125
115
  end
126
116
 
127
117
  def get_state
128
- %x{
129
- let res = this.native.getState();
130
- if (typeof(res) === 'object' && !Array.isArray(res) && res !== null) {
131
- return Opal.Hash.$new(res);
132
- }
133
- return res;
134
- }
118
+ if @is_dispatching
119
+ raise <<-MSG
120
+ You may not call store.get_state while the reducer is executing.
121
+ The reducer has already received the state as an argument.
122
+ Pass it down from the top reducer instead of reading it from the store."
123
+ MSG
124
+ end
125
+ return @current_state_dup
135
126
  end
136
127
 
137
128
  def recently_dispatched?
@@ -140,60 +131,105 @@ module Redux
140
131
  res
141
132
  end
142
133
 
143
- def collect_and_defer_dispatch(action)
144
- if !Isomorfeus.on_ssr?
145
- type = action.delete(:type)
146
- @deferred_actions[type] = [] unless @deferred_actions.key?(type)
147
- @deferred_actions[type].push(action)
148
- @last_dispatch_time = `Date.now()`
149
- # `console.log(#@last_dispatch_time)`
150
- deferred_dispatcher(`Date.now()`) unless @deferred_dispatcher
151
- else
152
- @dispatched = true
134
+ if RUBY_ENGINE == 'opal'
135
+ def deferred_dispatch(action)
136
+ @deferred_actions.push(action)
137
+ if @deferred_actions.length == 1
138
+ after(0) do
139
+ acts = @deferred_actions
140
+ @deferred_actions = []
141
+ multi_dispatch(acts)
142
+ end
143
+ end
144
+ nil
145
+ end
146
+ else # RUBY_ENGINE
147
+ def deferred_dispatch(action)
148
+ Isomorfeus.reset_something_loading
153
149
  dispatch(action)
150
+ nil
151
+ end
152
+ end # RUBY_ENGINE
153
+
154
+ def replace_reducer(next_reducer)
155
+ init_reducers(next_reducer)
156
+ dispatch({ type: ACTIONS[:replace] })
157
+ end
158
+
159
+ # returns key needed to unsubscribe the listener
160
+ def subscribe(listen_proc = nil, &listen_block)
161
+ if @is_dispatching
162
+ raise <<-MSG
163
+ You may not call store.subscribe while the reducer is executing.
164
+ If you would like to be notified after the store has been updated,
165
+ subscribe from a component and invoke store.get_state in the callback to access the latest state.
166
+ MSG
154
167
  end
168
+ listener = listen_proc || listen_block
169
+ raise "a block or proc must be given to subscribe" unless listener
170
+ @key += 1
171
+ @listeners[@key] = listener
172
+ @key
173
+ end
174
+
175
+ def unsubscribe(key)
176
+ return unless @listeners.key?(key)
177
+ if @is_dispatching
178
+ raise "You may not unsubscribe from a store listener while the reducer is executing."
179
+ end
180
+ @listeners.delete(key)
155
181
  nil
156
182
  end
157
183
 
158
- def replace_reducer(next_reducer)
159
- `this.native.replaceReducer(next_reducer)`
184
+ def dig(*path)
185
+ @current_state_dup.dig(*path)
160
186
  end
161
187
 
162
- # returns function needed to unsubscribe the listener
163
- def subscribe(&listener)
164
- `this.native.subscribe(function() { return listener.$call(); })`
188
+ if RUBY_ENGINE == 'opal'
189
+ def promise_action(action)
190
+ Isomorfeus::Transport.promise_send_action(action).then do |agent|
191
+ agent&.process do
192
+ Isomorfeus.reset_something_loading
193
+ Isomorfeus.store.dispatch(type: 'REDUX_MERGE', state: agent.full_response[:state])
194
+ end
195
+ end
196
+ end
165
197
  end
166
198
 
167
199
  private
168
200
 
169
- def deferred_dispatcher(first)
170
- @deferred_dispatcher = true
171
- %x{
172
- setTimeout(function() {
173
- if (#{wait_longer?(first)}) { #{deferred_dispatcher(first)} }
174
- else { #{dispatch_deferred_dispatches} }
175
- }, 10)
176
- }
177
- end
178
-
179
- def dispatch_deferred_dispatches
180
- # `console.log(Date.now())`
181
- @deferred_dispatcher = false
182
- actions = @deferred_actions
183
- @deferred_actions = {}
184
- actions.each do |type, data|
185
- dispatch(type: type, collected: data)
186
- end
187
- end
188
-
189
- def wait_longer?(first)
190
- t = `Date.now()`
191
- time_since_first = `t - first`
192
- # `console.log('delta', time_since_first)`
193
- return true if `typeof Opal.Preact !== 'undefined' && typeof Opal.Preact.render_buffer !== 'undefined' && Opal.Preact.render_buffer.length > 0 && time_since_first < 1000`
194
- return false if time_since_first > 100 # ms
195
- return false if (`t - #@last_dispatch_time`) > 9 # ms
196
- return true
201
+ def single_dispatch(action)
202
+ raise "Actions must be plain Hashes. Instead, the actual type was: '#{action.class}'." unless action.class == Hash
203
+ raise "Actions must have a :type key." unless action.key?(:type)
204
+ raise "Reducers may not dispatch actions." if @is_dispatching
205
+
206
+ begin
207
+ @is_dispatching = true
208
+ @middleware.call(action)
209
+ ensure
210
+ @is_dispatching = false
211
+ end
212
+
213
+ @current_state_dup = @current_state.deep_dup # duplicate state for get_state/dig until later on maybe we can #freeze
214
+ end
215
+
216
+ def init_reducers(reducers)
217
+ if reducers.is_a?(Hash) && reducers.any?
218
+ @reducers = reducers
219
+ @reducers.each do |key, red|
220
+ raise "reducer for :#{key} is not a proc" unless red.is_a?(Proc)
221
+ @current_state[key] = nil unless @current_state.key?(key)
222
+ end
223
+ else
224
+ raise "no reducer defined"
225
+ end
226
+ end
227
+
228
+ def reduce(action)
229
+ @reducers.each do |key, reducer|
230
+ @current_state[key] = reducer.call(@current_state_dup[key], action)
231
+ end
232
+ action
197
233
  end
198
234
  end
199
235
  end
data/lib/session_store.rb CHANGED
@@ -2,40 +2,38 @@ class SessionStore
2
2
  extend Isomorfeus::BrowserStoreApi
3
3
 
4
4
  class << self
5
- def method_missing(key, *args, &block)
6
- if Isomorfeus.on_browser?
7
- if `args.length > 0`
8
- key = `key.endsWith('=')` ? key.chop : key
9
- value = args[0]
10
- `Opal.global.sessionStorage.setItem(key, value)`
11
- notify_subscribers
12
- value
13
- else
14
- # check store for value
15
- value = `Opal.global.sessionStorage.getItem(key)`
16
- return value if value
17
- end
5
+ if RUBY_ENGINE == 'opal'
6
+ def [](key)
7
+ # check store for value
8
+ value = `Opal.global.sessionStorage.getItem(key)`
9
+ return nil if `value == null`
10
+ value
18
11
  end
19
- # otherwise return nil
20
- return nil
21
- end
22
-
23
- alias [] method_missing
24
- alias []= method_missing
25
12
 
26
- alias get method_missing
27
- alias set method_missing
13
+ def []=(key, value)
14
+ `Opal.global.sessionStorage.setItem(key, value)`
15
+ notify_subscribers
16
+ value
17
+ end
28
18
 
29
- def delete(key)
30
- `Opal.global.sessionStorage.removeItem(key)`
31
- notify_subscribers
32
- nil
33
- end
19
+ def delete(key)
20
+ `Opal.global.sessionStorage.removeItem(key)`
21
+ notify_subscribers
22
+ nil
23
+ end
34
24
 
35
- def clear
36
- `Opal.global.sessionStorage.clear()`
37
- notify_subscribers
38
- nil
25
+ def clear
26
+ `Opal.global.sessionStorage.clear()`
27
+ notify_subscribers
28
+ nil
29
+ end
30
+ else
31
+ def [](key); end
32
+ def []=(key, value); end
33
+ def delete(key); end
34
+ def clear; end
39
35
  end
36
+ alias get []
37
+ alias set []=
40
38
  end
41
39
  end