@exodus/atoms 2.0.0 → 2.1.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.
Files changed (2) hide show
  1. package/index.js +39 -27
  2. package/package.json +2 -2
package/index.js CHANGED
@@ -73,19 +73,48 @@ export const createFusionAtomFactory =
73
73
  })
74
74
  }
75
75
 
76
+ const createSimpleObserver = ({ enable = true } = {}) => {
77
+ let listeners = []
78
+ const notify = async (value) => Promise.all(listeners.map((listener) => listener(value)))
79
+
80
+ const observe = (listener) => {
81
+ if (!enable) {
82
+ throw new Error('observe method is not supported')
83
+ }
84
+ listeners.push(listener)
85
+ return () => {
86
+ listeners = listeners.filter((fn) => fn !== listener)
87
+ }
88
+ }
89
+
90
+ return {
91
+ observe,
92
+ notify,
93
+ }
94
+ }
95
+
76
96
  export const createStorageAtomFactory =
77
97
  ({ storage }) =>
78
- ({ key, defaultValue }) => {
79
- const set = async (value) => storage.set(key, value)
98
+ ({ key, defaultValue, isSoleWriter }) => {
99
+ const { notify, observe } = createSimpleObserver({ enable: isSoleWriter })
100
+
101
+ const set = async (value) => {
102
+ if (typeof value === 'undefined') {
103
+ await storage.delete(key)
104
+ } else {
105
+ await storage.set(key, value)
106
+ }
107
+ if (isSoleWriter) {
108
+ await notify(value)
109
+ }
110
+ }
80
111
 
81
112
  const get = () => storage.get(key)
82
113
 
83
114
  return enforceObservableRules({
84
115
  get,
85
116
  set,
86
- observe: async () => {
87
- throw new Error('storage atom does not support observe')
88
- },
117
+ observe,
89
118
  defaultValue,
90
119
  })
91
120
  }
@@ -93,31 +122,14 @@ export const createStorageAtomFactory =
93
122
  export const createRemoteConfigAtomFactory =
94
123
  ({ remoteConfig }) =>
95
124
  ({ path, defaultValue }) => {
96
- const getValue = (remoteConfigJSON) => getValueAtPath(remoteConfigJSON, path)
97
-
98
- let listeners = []
99
-
100
- const notify = async (remoteConfigJSON) => {
101
- const value = getValue(remoteConfigJSON)
102
- return Promise.all(listeners.map((listener) => listener(value)))
103
- }
104
-
105
- const get = async () => {
106
- return remoteConfig.get(path)
107
- }
125
+ const { notify, observe } = createSimpleObserver()
108
126
 
127
+ const get = () => remoteConfig.get(path)
109
128
  const set = async () => {
110
129
  throw new Error('remoteConfig is read-only')
111
130
  }
112
131
 
113
- const observe = (listener) => {
114
- listeners.push(listener)
115
- return () => {
116
- listeners = listeners.filter((fn) => fn !== listener)
117
- }
118
- }
119
-
120
- remoteConfig.on('sync', ({ current }) => notify(current))
132
+ remoteConfig.on('sync', ({ current }) => notify(getValueAtPath(current, path)))
121
133
 
122
134
  return enforceObservableRules({
123
135
  get,
@@ -130,8 +142,8 @@ export const createRemoteConfigAtomFactory =
130
142
  export const createLocalConfigAtomFactory =
131
143
  ({ localConfig }) =>
132
144
  ({ key, defaultValue }) => {
133
- const observe = (listener) =>
134
- localConfig.on(`update:${key}`, ({ current }) => listener(current))
145
+ const { notify, observe } = createSimpleObserver()
146
+ localConfig.on(`update:${key}`, ({ current }) => notify(current))
135
147
 
136
148
  return enforceObservableRules({
137
149
  get: () => localConfig.get(key),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exodus/atoms",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "main": "index.js",
5
5
  "author": "Exodus Movement Inc.",
6
6
  "scripts": {
@@ -29,5 +29,5 @@
29
29
  "@exodus/storage-memory": "^1.0.0",
30
30
  "delay": "^5.0.0"
31
31
  },
32
- "gitHead": "7107d23ea58a8948dbdf7594988941885ddc3b95"
32
+ "gitHead": "231a041f31a91990024a1282067b737a3c9dfe41"
33
33
  }