@exodus/atoms 3.7.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/atoms",
3
- "version": "3.7.0",
3
+ "version": "4.0.0",
4
4
  "main": "src/index.js",
5
5
  "author": "Exodus Movement Inc.",
6
6
  "scripts": {
@@ -34,5 +34,5 @@
34
34
  "eslint": "^8.33.0",
35
35
  "jest": "^29.1.2"
36
36
  },
37
- "gitHead": "de75a59d866ea737d6d1698c3c1edd7a44af0295"
37
+ "gitHead": "99487e27398623ebf0588233db4f01443c93102d"
38
38
  }
@@ -1,7 +1,5 @@
1
1
  import makeConcurrent from 'make-concurrent'
2
2
  import proxyFreeze from 'proxy-freeze'
3
- import { isEqual } from 'lodash'
4
- import assert from 'minimalistic-assert'
5
3
 
6
4
  const withChangeDetection = (listener) => {
7
5
  let currentValue
@@ -14,11 +12,7 @@ const withChangeDetection = (listener) => {
14
12
  called = true
15
13
  currentValue = value
16
14
 
17
- try {
18
- await listener(currentValue)
19
- } catch (error) {
20
- console.warn('observer failed', error)
21
- }
15
+ await listener(currentValue)
22
16
  },
23
17
  get called() {
24
18
  return called
@@ -26,9 +20,7 @@ const withChangeDetection = (listener) => {
26
20
  }
27
21
  }
28
22
 
29
- const enforceObservableRules = ({ defaultValue, logger, warnOnSameValueSet = false, ...atom }) => {
30
- assert(!warnOnSameValueSet || logger, 'warnOnSameValueSet specified but no logger supplied')
31
-
23
+ const enforceObservableRules = ({ defaultValue, logger, ...atom }) => {
32
24
  // ensure observers get called in series
33
25
  const enqueue = makeConcurrent((fn) => fn(), { concurrency: 1 })
34
26
 
@@ -51,12 +43,6 @@ const enforceObservableRules = ({ defaultValue, logger, warnOnSameValueSet = fal
51
43
  // support a function a la React's setState(oldState => newState)
52
44
  if (typeof value === 'function') value = await value(await get())
53
45
 
54
- if (warnOnSameValueSet && isEqual(value, await get())) {
55
- logger.warn(
56
- `Atom was called with the same value it currently holds: ${JSON.stringify(value)}`
57
- )
58
- }
59
-
60
46
  await atom.set(value)
61
47
  }
62
48
 
@@ -0,0 +1,16 @@
1
+ import enforceObservableRules from '../enforce-rules'
2
+
3
+ const swallowObserverErrors = ({ atom, logger }) => {
4
+ const observe = (observer) =>
5
+ atom.observe(async (...args) => {
6
+ try {
7
+ await observer(...args)
8
+ } catch (err) {
9
+ logger.error('Observer threw error', err)
10
+ }
11
+ })
12
+
13
+ return enforceObservableRules({ ...atom, observe })
14
+ }
15
+
16
+ export default swallowObserverErrors
@@ -0,0 +1,19 @@
1
+ import delay from 'delay'
2
+ import enforceObservableRules from '../enforce-rules'
3
+
4
+ const timeoutObservers = ({ atom, logger, timeout }) => {
5
+ const observe = (observer) =>
6
+ atom.observe(async (...args) =>
7
+ Promise.race([
8
+ //
9
+ observer(...args),
10
+ delay.reject(timeout, {
11
+ value: new Error('Observer timed out!'),
12
+ }),
13
+ ])
14
+ )
15
+
16
+ return enforceObservableRules({ ...atom, observe })
17
+ }
18
+
19
+ export default timeoutObservers
@@ -0,0 +1,18 @@
1
+ import { isEqual as deepEqual } from 'lodash'
2
+ import enforceObservableRules from '../enforce-rules'
3
+
4
+ const warnOnSameValueSet = ({ atom, isEqual = deepEqual, logger }) => {
5
+ const set = async (value) => {
6
+ if (isEqual(value, await atom.get())) {
7
+ logger.warn(
8
+ `Atom was called with the same value it currently holds: ${JSON.stringify(value)}`
9
+ )
10
+ }
11
+
12
+ await atom.set(value)
13
+ }
14
+
15
+ return enforceObservableRules({ ...atom, set })
16
+ }
17
+
18
+ export default warnOnSameValueSet
@@ -1,14 +1,6 @@
1
1
  import enforceObservableRules from './enforce-rules'
2
2
 
3
- const fromEventEmitter = ({
4
- emitter,
5
- event,
6
- get,
7
- set,
8
- defaultValue,
9
- logger,
10
- warnOnSameValueSet,
11
- }) => {
3
+ const fromEventEmitter = ({ emitter, event, get, set, defaultValue, logger }) => {
12
4
  const observe = (listener) => {
13
5
  emitter.on(event, listener)
14
6
  return () => emitter.removeListener(event, listener)
@@ -20,7 +12,6 @@ const fromEventEmitter = ({
20
12
  observe,
21
13
  defaultValue,
22
14
  logger,
23
- warnOnSameValueSet,
24
15
  })
25
16
  }
26
17
 
@@ -3,7 +3,7 @@ import { get as getValueAtPath, set as setValueAtPath } from 'lodash'
3
3
  import enforceObservableRules from '../enforce-rules'
4
4
 
5
5
  const createFusionAtomFactory =
6
- ({ fusion, logger, warnOnSameValueSet }) =>
6
+ ({ fusion, logger }) =>
7
7
  ({ path, defaultValue }) => {
8
8
  const set = async (value) => {
9
9
  await fusion.mergeProfile(setValueAtPath({}, path, value))
@@ -24,7 +24,6 @@ const createFusionAtomFactory =
24
24
  observe,
25
25
  defaultValue,
26
26
  logger,
27
- warnOnSameValueSet,
28
27
  })
29
28
  }
30
29
 
@@ -12,7 +12,6 @@ const createKeystoreAtom = ({
12
12
  getOpts,
13
13
  setOpts,
14
14
  deleteOpts,
15
- warnOnSameValueSet,
16
15
  },
17
16
  }) => {
18
17
  const { notify, observe } = createSimpleObserver({ enable: isSoleWriter })
@@ -35,7 +34,6 @@ const createKeystoreAtom = ({
35
34
  observe,
36
35
  defaultValue,
37
36
  logger,
38
- warnOnSameValueSet,
39
37
  })
40
38
  }
41
39
 
@@ -2,7 +2,7 @@ import createSimpleObserver from '../simple-observer'
2
2
  import enforceObservableRules from '../enforce-rules'
3
3
 
4
4
  const createStorageAtomFactory =
5
- ({ storage, logger, warnOnSameValueSet }) =>
5
+ ({ storage, logger }) =>
6
6
  ({ key, defaultValue, isSoleWriter }) => {
7
7
  const { notify, observe } = createSimpleObserver({ enable: isSoleWriter })
8
8
 
@@ -40,7 +40,6 @@ const createStorageAtomFactory =
40
40
  observe,
41
41
  defaultValue,
42
42
  logger,
43
- warnOnSameValueSet,
44
43
  })
45
44
  }
46
45
 
package/src/index.js CHANGED
@@ -13,4 +13,7 @@ export { default as difference } from './enhancers/difference'
13
13
  export { default as withSerialization } from './enhancers/with-serialization'
14
14
  export { default as combine } from './enhancers/combine'
15
15
  export { default as readOnly } from './enhancers/read-only'
16
+ export { default as warnOnSameValueSet } from './enhancers/warn-on-same-value-set'
17
+ export { default as swallowObserverErrors } from './enhancers/swallow-observer-errors'
18
+ export { default as timeoutObservers } from './enhancers/timeout-observers'
16
19
  export { default as enforceObservableRules } from './enforce-rules'