@exodus/atoms 3.6.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.6.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": "9352420baa5144820706bb4d9476f0e7b535a72a"
37
+ "gitHead": "99487e27398623ebf0588233db4f01443c93102d"
38
38
  }
@@ -12,11 +12,7 @@ const withChangeDetection = (listener) => {
12
12
  called = true
13
13
  currentValue = value
14
14
 
15
- try {
16
- await listener(currentValue)
17
- } catch (error) {
18
- console.warn('observer failed', error)
19
- }
15
+ await listener(currentValue)
20
16
  },
21
17
  get called() {
22
18
  return called
@@ -24,7 +20,7 @@ const withChangeDetection = (listener) => {
24
20
  }
25
21
  }
26
22
 
27
- const enforceObservableRules = ({ defaultValue, ...atom }) => {
23
+ const enforceObservableRules = ({ defaultValue, logger, ...atom }) => {
28
24
  // ensure observers get called in series
29
25
  const enqueue = makeConcurrent((fn) => fn(), { concurrency: 1 })
30
26
 
@@ -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,6 +1,6 @@
1
1
  import enforceObservableRules from './enforce-rules'
2
2
 
3
- const fromEventEmitter = ({ emitter, event, get, set, defaultValue }) => {
3
+ const fromEventEmitter = ({ emitter, event, get, set, defaultValue, logger }) => {
4
4
  const observe = (listener) => {
5
5
  emitter.on(event, listener)
6
6
  return () => emitter.removeListener(event, listener)
@@ -11,6 +11,7 @@ const fromEventEmitter = ({ emitter, event, get, set, defaultValue }) => {
11
11
  set,
12
12
  observe,
13
13
  defaultValue,
14
+ logger,
14
15
  })
15
16
  }
16
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 }) =>
6
+ ({ fusion, logger }) =>
7
7
  ({ path, defaultValue }) => {
8
8
  const set = async (value) => {
9
9
  await fusion.mergeProfile(setValueAtPath({}, path, value))
@@ -23,6 +23,7 @@ const createFusionAtomFactory =
23
23
  set,
24
24
  observe,
25
25
  defaultValue,
26
+ logger,
26
27
  })
27
28
  }
28
29
 
@@ -3,6 +3,7 @@ import createSimpleObserver from '../simple-observer'
3
3
 
4
4
  const createKeystoreAtom = ({
5
5
  keystore,
6
+ logger,
6
7
  config: {
7
8
  //
8
9
  key,
@@ -32,6 +33,7 @@ const createKeystoreAtom = ({
32
33
  set,
33
34
  observe,
34
35
  defaultValue,
36
+ logger,
35
37
  })
36
38
  }
37
39
 
@@ -30,7 +30,7 @@ const createAtomMock = (options = {}) => {
30
30
  }
31
31
  }
32
32
 
33
- return fromEventEmitter({ emitter, event: 'data', get, set, defaultValue })
33
+ return fromEventEmitter({ ...options, emitter, event: 'data', get, set })
34
34
  }
35
35
 
36
36
  export default createAtomMock
@@ -2,7 +2,7 @@ import createSimpleObserver from '../simple-observer'
2
2
  import enforceObservableRules from '../enforce-rules'
3
3
 
4
4
  const createStorageAtomFactory =
5
- ({ storage }) =>
5
+ ({ storage, logger }) =>
6
6
  ({ key, defaultValue, isSoleWriter }) => {
7
7
  const { notify, observe } = createSimpleObserver({ enable: isSoleWriter })
8
8
 
@@ -39,6 +39,7 @@ const createStorageAtomFactory =
39
39
  set,
40
40
  observe,
41
41
  defaultValue,
42
+ logger,
42
43
  })
43
44
  }
44
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'