@effect-rx/rx-react 0.1.18 → 0.1.19

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/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,kCAA0D,CAAA;AAwBtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAOtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,6DAA4D,IAUhF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,wCAAuC,MAAM,IAKrE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,8FAA6F,IAAI,CAIvG,CAAA;AA+DZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAgB5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAqB5B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["./src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,KAAK,MAAM,MAAM,sBAAsB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,kCAA0D,CAAA;AA8BtF;;;GAGG;AACH,eAAO,MAAM,UAAU,wBAItB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,6DAA4D,IAUhF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,wCAAuC,MAAM,IAKrE,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,8FAA6F,IAAI,CAIvG,CAAA;AA8CZ;;;GAGG;AACH,eAAO,MAAM,aAAa,mDAEd;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CA0B5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDAErB;IAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE;wBAE7B,OAAO;;CAW5B,CAAA"}
package/index.js CHANGED
@@ -28,24 +28,23 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
28
28
  */
29
29
  const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
30
30
  exports.RegistryContext = RegistryContext;
31
+ const storeRegistry = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
31
32
  function makeStore(registry, rx) {
32
- let getter = function () {
33
- return registry.get(rx);
34
- };
35
- function subscribe(f) {
36
- const [get, unmount] = registry.subscribeGetter(rx, f);
37
- getter = get;
38
- return unmount;
39
- }
40
- function snapshot() {
41
- return getter();
33
+ const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
34
+ const store = stores.get(rx);
35
+ if (store) {
36
+ return store;
42
37
  }
43
- return {
44
- rx,
45
- registry,
46
- subscribe,
47
- snapshot
38
+ const newStore = {
39
+ subscribe(f) {
40
+ return registry.subscribe(rx, f);
41
+ },
42
+ snapshot() {
43
+ return registry.get(rx);
44
+ }
48
45
  };
46
+ stores.set(rx, newStore);
47
+ return newStore;
49
48
  }
50
49
  /**
51
50
  * @since 1.0.0
@@ -53,11 +52,8 @@ function makeStore(registry, rx) {
53
52
  */
54
53
  const useRxValue = rx => {
55
54
  const registry = React.useContext(RegistryContext);
56
- const store = React.useRef(undefined);
57
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
58
- store.current = makeStore(registry, rx);
59
- }
60
- return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
55
+ const store = makeStore(registry, rx);
56
+ return React.useSyncExternalStore(store.subscribe, store.snapshot);
61
57
  };
62
58
  /**
63
59
  * @since 1.0.0
@@ -93,61 +89,40 @@ const useRefreshRx = rx => {
93
89
  exports.useRefreshRx = useRefreshRx;
94
90
  const useRx = rx => [useRxValue(rx), useSetRx(rx)];
95
91
  exports.useRx = useRx;
96
- const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new Map());
97
- const suspenseRx = /*#__PURE__*/Rx.family(rx => {
98
- const selfRx = Rx.readable((get, ctx) => {
99
- const result = get(rx);
100
- const value = Result.noWaiting(result);
101
- if (value._tag === "Initial") {
102
- return {
103
- _tag: "Suspended",
104
- promise: new Promise(resolve => {
105
- ctx.addFinalizer(() => {
106
- resolve();
107
- const unmount = suspenseCache.get(selfRx);
108
- if (unmount) {
109
- unmount();
110
- suspenseCache.delete(selfRx);
111
- }
112
- });
113
- })
114
- };
115
- }
116
- const isWaiting = Result.isWaiting(result);
92
+ const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
93
+ const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
94
+ unmount();
95
+ });
96
+ const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
97
+ const result = get(rx);
98
+ const value = Result.noWaiting(result);
99
+ if (value._tag === "Initial") {
117
100
  return {
118
- _tag: "Value",
119
- isWaiting,
120
- value
101
+ _tag: "Suspended",
102
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
121
103
  };
122
- });
123
- return selfRx;
124
- });
125
- const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
126
- const selfRx = Rx.readable((get, ctx) => {
127
- const result = get(rx);
128
- if (result._tag === "Waiting" || result._tag === "Initial") {
129
- return {
130
- _tag: "Suspended",
131
- promise: new Promise(resolve => {
132
- ctx.addFinalizer(() => {
133
- resolve();
134
- const unmount = suspenseCache.get(rx);
135
- if (unmount) {
136
- unmount();
137
- suspenseCache.delete(rx);
138
- }
139
- });
140
- })
141
- };
142
- }
104
+ }
105
+ const isWaiting = Result.isWaiting(result);
106
+ return {
107
+ _tag: "Value",
108
+ isWaiting,
109
+ value
110
+ };
111
+ }));
112
+ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
113
+ const result = get(rx);
114
+ if (result._tag === "Waiting" || result._tag === "Initial") {
143
115
  return {
144
- _tag: "Value",
145
- isWaiting: false,
146
- value: result
116
+ _tag: "Suspended",
117
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
147
118
  };
148
- });
149
- return selfRx;
150
- });
119
+ }
120
+ return {
121
+ _tag: "Value",
122
+ isWaiting: false,
123
+ value: result
124
+ };
125
+ }));
151
126
  /**
152
127
  * @since 1.0.0
153
128
  * @category hooks
@@ -158,9 +133,18 @@ const useRxSuspense = (rx, options) => {
158
133
  const result = useRxValue(resultRx);
159
134
  if (result._tag === "Suspended") {
160
135
  if (!suspenseCache.has(resultRx)) {
161
- suspenseCache.set(resultRx, registry.mount(resultRx));
136
+ const unmount = registry.mount(resultRx);
137
+ suspenseCache.set(resultRx, unmount);
138
+ suspenseRegistry.register(resultRx, unmount, resultRx);
162
139
  }
163
140
  throw result.promise;
141
+ } else if (suspenseCache.has(resultRx)) {
142
+ const unmount = suspenseCache.get(resultRx);
143
+ if (unmount) {
144
+ suspenseCache.delete(resultRx);
145
+ suspenseRegistry.unregister(resultRx);
146
+ unmount();
147
+ }
164
148
  }
165
149
  return result;
166
150
  };
@@ -170,15 +154,8 @@ const useRxSuspense = (rx, options) => {
170
154
  */
171
155
  exports.useRxSuspense = useRxSuspense;
172
156
  const useRxSuspenseSuccess = (rx, options) => {
173
- const registry = React.useContext(RegistryContext);
174
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
175
- const result = useRxValue(resultRx);
176
- if (result._tag === "Suspended") {
177
- if (!suspenseCache.has(resultRx)) {
178
- suspenseCache.set(resultRx, registry.mount(resultRx));
179
- }
180
- throw result.promise;
181
- } else if (result.value._tag === "Failure") {
157
+ const result = useRxSuspense(rx, options);
158
+ if (result.value._tag === "Failure") {
182
159
  throw Cause.squash(result.value.cause);
183
160
  }
184
161
  return {
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","Result","Result_1","Rx","Rx_1","_GlobalValue","Cause","React","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RegistryContext","createContext","make","makeStore","registry","rx","getter","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","globalValue","Map","suspenseRx","family","selfRx","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,QAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAAkD,IAAAC,UAAA,GAAAH,QAAA;AAAAI,OAAA,CAAAJ,QAAA,GAAAA,QAAA;AAClD,IAAAK,MAAA,gBAAAJ,uBAAA,eAAAC,OAAA;AAA8C,IAAAI,QAAA,GAAAD,MAAA;AAAAD,OAAA,CAAAC,MAAA,GAAAA,MAAA;AAC9C,IAAAE,EAAA,gBAAAN,uBAAA,eAAAC,OAAA;AAAsC,IAAAM,IAAA,GAAAD,EAAA;AAAAH,OAAA,CAAAG,EAAA,GAAAA,EAAA;AACtC,IAAAE,YAAA,gBAAAP,OAAA;AACA,IAAAQ,KAAA,gBAAAT,uBAAA,eAAAC,OAAA;AACA,IAAAS,KAAA,gBAAAV,uBAAA,eAAAC,OAAA;AAA8B,SAAAU,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAZ,wBAAAgB,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAR9B;;;;AAcA;;;;AAIO,MAAMW,eAAe,gBAAGvB,KAAK,CAACwB,aAAa,eAAoBnC,QAAQ,CAACoC,IAAI,EAAE,CAAC;AAAAhC,OAAA,CAAA8B,eAAA,GAAAA,eAAA;AAStF,SAASG,SAASA,CAAIC,QAA2B,EAAEC,EAAY;EAC7D,IAAIC,MAAM,GAAG,SAAAA,CAAA;IACX,OAAOF,QAAQ,CAAChB,GAAG,CAACiB,EAAE,CAAC;EACzB,CAAC;EACD,SAASE,SAASA,CAACC,CAAa;IAC9B,MAAM,CAACpB,GAAG,EAAEqB,OAAO,CAAC,GAAGL,QAAQ,CAACM,eAAe,CAACL,EAAE,EAAEG,CAAC,CAAC;IACtDF,MAAM,GAAGlB,GAAG;IACZ,OAAOqB,OAAO;EAChB;EACA,SAASE,QAAQA,CAAA;IACf,OAAOL,MAAM,EAAE;EACjB;EACA,OAAO;IAAED,EAAE;IAAED,QAAQ;IAAEG,SAAS;IAAEI;EAAQ,CAAE;AAC9C;AAEA;;;;AAIO,MAAMC,UAAU,GAAOP,EAAY,IAAO;EAC/C,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAMc,KAAK,GAAGrC,KAAK,CAACsC,MAAM,CAAaC,SAAgB,CAAC;EACxD,IAAIF,KAAK,CAACG,OAAO,EAAEZ,EAAE,KAAKA,EAAE,IAAIS,KAAK,CAACG,OAAO,EAAEb,QAAQ,KAAKA,QAAQ,EAAE;IACpEU,KAAK,CAACG,OAAO,GAAGd,SAAS,CAACC,QAAQ,EAAEC,EAAE,CAAC;;EAEzC,OAAO5B,KAAK,CAACyC,oBAAoB,CAACJ,KAAK,CAACG,OAAO,CAACV,SAAS,EAAEO,KAAK,CAACG,OAAO,CAACN,QAAQ,CAAC;AACpF,CAAC;AAED;;;;AAAAzC,OAAA,CAAA0C,UAAA,GAAAA,UAAA;AAIO,MAAMO,QAAQ,GAAUd,EAAqB,IAAoC;EACtF,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAAC2C,WAAW,CAAEC,KAAK,IAAI;IACjC,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;MAC/BjB,QAAQ,CAACL,GAAG,CAACM,EAAE,EAAGgB,KAAa,CAACjB,QAAQ,CAAChB,GAAG,CAACiB,EAAE,CAAC,CAAC,CAAC;MAClD;KACD,MAAM;MACLD,QAAQ,CAACL,GAAG,CAACM,EAAE,EAAEgB,KAAK,CAAC;;EAE3B,CAAC,EAAE,CAACjB,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAAnC,OAAA,CAAAiD,QAAA,GAAAA,QAAA;AAIO,MAAMG,YAAY,GAAOjB,EAA6B,IAAgB;EAC3E,MAAMD,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAAC2C,WAAW,CAAC,MAAK;IAC5BhB,QAAQ,CAACmB,OAAO,CAAClB,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAAnC,OAAA,CAAAoD,YAAA,GAAAA,YAAA;AAIO,MAAME,KAAK,GAAUnB,EAAqB,IAC/C,CACEO,UAAU,CAACP,EAAE,CAAC,EACdc,QAAQ,CAACd,EAAE,CAAC,CACJ;AAAAnC,OAAA,CAAAsD,KAAA,GAAAA,KAAA;AAaZ,MAAMC,aAAa,gBAAG,IAAAC,wBAAW,EAAC,mCAAmC,EAAE,MAAM,IAAIC,GAAG,EAA0B,CAAC;AAE/G,MAAMC,UAAU,gBAAGvD,EAAE,CAACwD,MAAM,CAAExB,EAAkC,IAAI;EAClE,MAAMyB,MAAM,GAAGzD,EAAE,CAAC0D,QAAQ,CAAC,CAAC3C,GAAG,EAAE4C,GAAG,KAA8B;IAChE,MAAMC,MAAM,GAAG7C,GAAG,CAACiB,EAAE,CAAC;IACtB,MAAMgB,KAAK,GAAGlD,MAAM,CAAC+D,SAAS,CAACD,MAAM,CAAC;IACtC,IAAIZ,KAAK,CAACc,IAAI,KAAK,SAAS,EAAE;MAC5B,OAAO;QACLA,IAAI,EAAE,WAAW;QACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAI;UACrCN,GAAG,CAACO,YAAY,CAAC,MAAK;YACpBD,OAAO,EAAE;YACT,MAAM7B,OAAO,GAAGgB,aAAa,CAACrC,GAAG,CAAC0C,MAAM,CAAC;YACzC,IAAIrB,OAAO,EAAE;cACXA,OAAO,EAAE;cACTgB,aAAa,CAACe,MAAM,CAACV,MAAM,CAAC;;UAEhC,CAAC,CAAC;QACJ,CAAC;OACO;;IAEZ,MAAMW,SAAS,GAAGtE,MAAM,CAACsE,SAAS,CAACR,MAAM,CAAC;IAC1C,OAAO;MAAEE,IAAI,EAAE,OAAO;MAAEM,SAAS;MAAEpB;IAAK,CAAW;EACrD,CAAC,CAAC;EACF,OAAOS,MAAM;AACf,CAAC,CAAC;AAEF,MAAMY,iBAAiB,gBAAGrE,EAAE,CAACwD,MAAM,CAAExB,EAAkC,IAAI;EACzE,MAAMyB,MAAM,GAAGzD,EAAE,CAAC0D,QAAQ,CAAC,CAAC3C,GAAG,EAAE4C,GAAG,KAA8B;IAChE,MAAMC,MAAM,GAAG7C,GAAG,CAACiB,EAAE,CAAC;IACtB,IAAI4B,MAAM,CAACE,IAAI,KAAK,SAAS,IAAIF,MAAM,CAACE,IAAI,KAAK,SAAS,EAAE;MAC1D,OAAO;QACLA,IAAI,EAAE,WAAW;QACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAI;UACrCN,GAAG,CAACO,YAAY,CAAC,MAAK;YACpBD,OAAO,EAAE;YACT,MAAM7B,OAAO,GAAGgB,aAAa,CAACrC,GAAG,CAACiB,EAAE,CAAC;YACrC,IAAII,OAAO,EAAE;cACXA,OAAO,EAAE;cACTgB,aAAa,CAACe,MAAM,CAACnC,EAAE,CAAC;;UAE5B,CAAC,CAAC;QACJ,CAAC;OACO;;IAEZ,OAAO;MAAE8B,IAAI,EAAE,OAAO;MAAEM,SAAS,EAAE,KAAK;MAAEpB,KAAK,EAAEY;IAAM,CAAW;EACpE,CAAC,CAAC;EACF,OAAOH,MAAM;AACf,CAAC,CAAC;AAEF;;;;AAIO,MAAMa,aAAa,GAAGA,CAC3BtC,EAA8B,EAC9BuC,OAAiD,KAI/C;EACF,MAAMxC,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAM6C,QAAQ,GAAGpE,KAAK,CAACqE,OAAO,CAC5B,MAAOF,OAAO,EAAEG,gBAAgB,GAAGL,iBAAiB,CAACrC,EAAE,CAAC,GAAGuB,UAAU,CAACvB,EAAE,CAAE,EAC1E,CAACuC,OAAO,EAAEG,gBAAgB,EAAE1C,EAAE,CAAC,CAChC;EACD,MAAM4B,MAAM,GAAGrB,UAAU,CAACiC,QAAQ,CAAC;EACnC,IAAIZ,MAAM,CAACE,IAAI,KAAK,WAAW,EAAE;IAC/B,IAAI,CAACV,aAAa,CAACtC,GAAG,CAAC0D,QAAQ,CAAC,EAAE;MAChCpB,aAAa,CAAC1B,GAAG,CAAC8C,QAAQ,EAAEzC,QAAQ,CAAC4C,KAAK,CAACH,QAAQ,CAAC,CAAC;;IAEvD,MAAMZ,MAAM,CAACG,OAAO;;EAEtB,OAAOH,MAAM;AACf,CAAC;AAED;;;;AAAA/D,OAAA,CAAAyE,aAAA,GAAAA,aAAA;AAIO,MAAMM,oBAAoB,GAAGA,CAClC5C,EAA8B,EAC9BuC,OAAiD,KAI/C;EACF,MAAMxC,QAAQ,GAAG3B,KAAK,CAACoC,UAAU,CAACb,eAAe,CAAC;EAClD,MAAM6C,QAAQ,GAAGpE,KAAK,CAACqE,OAAO,CAC5B,MAAOF,OAAO,EAAEG,gBAAgB,GAAGL,iBAAiB,CAACrC,EAAE,CAAC,GAAGuB,UAAU,CAACvB,EAAE,CAAE,EAC1E,CAACuC,OAAO,EAAEG,gBAAgB,EAAE1C,EAAE,CAAC,CAChC;EACD,MAAM4B,MAAM,GAAGrB,UAAU,CAACiC,QAAQ,CAAC;EACnC,IAAIZ,MAAM,CAACE,IAAI,KAAK,WAAW,EAAE;IAC/B,IAAI,CAACV,aAAa,CAACtC,GAAG,CAAC0D,QAAQ,CAAC,EAAE;MAChCpB,aAAa,CAAC1B,GAAG,CAAC8C,QAAQ,EAAEzC,QAAQ,CAAC4C,KAAK,CAACH,QAAQ,CAAC,CAAC;;IAEvD,MAAMZ,MAAM,CAACG,OAAO;GACrB,MAAM,IAAIH,MAAM,CAACZ,KAAK,CAACc,IAAI,KAAK,SAAS,EAAE;IAC1C,MAAM3D,KAAK,CAAC0E,MAAM,CAACjB,MAAM,CAACZ,KAAK,CAAC8B,KAAK,CAAC;;EAExC,OAAO;IACLV,SAAS,EAAER,MAAM,CAACQ,SAAS;IAC3BpB,KAAK,EAAEY,MAAM,CAACZ,KAAK,CAACA;GACrB;AACH,CAAC;AAAAnD,OAAA,CAAA+E,oBAAA,GAAAA,oBAAA"}
1
+ {"version":3,"file":"index.js","names":["Registry","_interopRequireWildcard","require","Registry_1","exports","Result","Result_1","Rx","Rx_1","_GlobalValue","Cause","React","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RegistryContext","createContext","make","storeRegistry","globalValue","makeStore","registry","rx","stores","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["./src/index.ts"],"sourcesContent":[null],"mappings":"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"}
package/mjs/index.mjs CHANGED
@@ -18,24 +18,23 @@ export { Rx_1 as Rx };
18
18
  * @category context
19
19
  */
20
20
  export const RegistryContext = /*#__PURE__*/React.createContext( /*#__PURE__*/Registry.make());
21
+ const storeRegistry = /*#__PURE__*/globalValue("@effect-rx/rx-react/storeRegistry", () => new WeakMap());
21
22
  function makeStore(registry, rx) {
22
- let getter = function () {
23
- return registry.get(rx);
24
- };
25
- function subscribe(f) {
26
- const [get, unmount] = registry.subscribeGetter(rx, f);
27
- getter = get;
28
- return unmount;
29
- }
30
- function snapshot() {
31
- return getter();
23
+ const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry);
24
+ const store = stores.get(rx);
25
+ if (store) {
26
+ return store;
32
27
  }
33
- return {
34
- rx,
35
- registry,
36
- subscribe,
37
- snapshot
28
+ const newStore = {
29
+ subscribe(f) {
30
+ return registry.subscribe(rx, f);
31
+ },
32
+ snapshot() {
33
+ return registry.get(rx);
34
+ }
38
35
  };
36
+ stores.set(rx, newStore);
37
+ return newStore;
39
38
  }
40
39
  /**
41
40
  * @since 1.0.0
@@ -43,11 +42,8 @@ function makeStore(registry, rx) {
43
42
  */
44
43
  export const useRxValue = rx => {
45
44
  const registry = React.useContext(RegistryContext);
46
- const store = React.useRef(undefined);
47
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
48
- store.current = makeStore(registry, rx);
49
- }
50
- return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot);
45
+ const store = makeStore(registry, rx);
46
+ return React.useSyncExternalStore(store.subscribe, store.snapshot);
51
47
  };
52
48
  /**
53
49
  * @since 1.0.0
@@ -79,61 +75,40 @@ export const useRefreshRx = rx => {
79
75
  * @category hooks
80
76
  */
81
77
  export const useRx = rx => [useRxValue(rx), useSetRx(rx)];
82
- const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new Map());
83
- const suspenseRx = /*#__PURE__*/Rx.family(rx => {
84
- const selfRx = Rx.readable((get, ctx) => {
85
- const result = get(rx);
86
- const value = Result.noWaiting(result);
87
- if (value._tag === "Initial") {
88
- return {
89
- _tag: "Suspended",
90
- promise: new Promise(resolve => {
91
- ctx.addFinalizer(() => {
92
- resolve();
93
- const unmount = suspenseCache.get(selfRx);
94
- if (unmount) {
95
- unmount();
96
- suspenseCache.delete(selfRx);
97
- }
98
- });
99
- })
100
- };
101
- }
102
- const isWaiting = Result.isWaiting(result);
78
+ const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
79
+ const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
80
+ unmount();
81
+ });
82
+ const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
83
+ const result = get(rx);
84
+ const value = Result.noWaiting(result);
85
+ if (value._tag === "Initial") {
103
86
  return {
104
- _tag: "Value",
105
- isWaiting,
106
- value
87
+ _tag: "Suspended",
88
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
107
89
  };
108
- });
109
- return selfRx;
110
- });
111
- const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => {
112
- const selfRx = Rx.readable((get, ctx) => {
113
- const result = get(rx);
114
- if (result._tag === "Waiting" || result._tag === "Initial") {
115
- return {
116
- _tag: "Suspended",
117
- promise: new Promise(resolve => {
118
- ctx.addFinalizer(() => {
119
- resolve();
120
- const unmount = suspenseCache.get(rx);
121
- if (unmount) {
122
- unmount();
123
- suspenseCache.delete(rx);
124
- }
125
- });
126
- })
127
- };
128
- }
90
+ }
91
+ const isWaiting = Result.isWaiting(result);
92
+ return {
93
+ _tag: "Value",
94
+ isWaiting,
95
+ value
96
+ };
97
+ }));
98
+ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
99
+ const result = get(rx);
100
+ if (result._tag === "Waiting" || result._tag === "Initial") {
129
101
  return {
130
- _tag: "Value",
131
- isWaiting: false,
132
- value: result
102
+ _tag: "Suspended",
103
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
133
104
  };
134
- });
135
- return selfRx;
136
- });
105
+ }
106
+ return {
107
+ _tag: "Value",
108
+ isWaiting: false,
109
+ value: result
110
+ };
111
+ }));
137
112
  /**
138
113
  * @since 1.0.0
139
114
  * @category hooks
@@ -144,9 +119,18 @@ export const useRxSuspense = (rx, options) => {
144
119
  const result = useRxValue(resultRx);
145
120
  if (result._tag === "Suspended") {
146
121
  if (!suspenseCache.has(resultRx)) {
147
- suspenseCache.set(resultRx, registry.mount(resultRx));
122
+ const unmount = registry.mount(resultRx);
123
+ suspenseCache.set(resultRx, unmount);
124
+ suspenseRegistry.register(resultRx, unmount, resultRx);
148
125
  }
149
126
  throw result.promise;
127
+ } else if (suspenseCache.has(resultRx)) {
128
+ const unmount = suspenseCache.get(resultRx);
129
+ if (unmount) {
130
+ suspenseCache.delete(resultRx);
131
+ suspenseRegistry.unregister(resultRx);
132
+ unmount();
133
+ }
150
134
  }
151
135
  return result;
152
136
  };
@@ -155,15 +139,8 @@ export const useRxSuspense = (rx, options) => {
155
139
  * @category hooks
156
140
  */
157
141
  export const useRxSuspenseSuccess = (rx, options) => {
158
- const registry = React.useContext(RegistryContext);
159
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
160
- const result = useRxValue(resultRx);
161
- if (result._tag === "Suspended") {
162
- if (!suspenseCache.has(resultRx)) {
163
- suspenseCache.set(resultRx, registry.mount(resultRx));
164
- }
165
- throw result.promise;
166
- } else if (result.value._tag === "Failure") {
142
+ const result = useRxSuspense(rx, options);
143
+ if (result.value._tag === "Failure") {
167
144
  throw Cause.squash(result.value.cause);
168
145
  }
169
146
  return {
package/mjs/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","makeStore","registry","rx","getter","get","subscribe","f","unmount","subscribeGetter","snapshot","useRxValue","useContext","store","useRef","undefined","current","useSyncExternalStore","useSetRx","useCallback","value","set","useRefreshRx","refresh","useRx","suspenseCache","Map","suspenseRx","family","selfRx","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","delete","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["Registry","Result","Rx","globalValue","Cause","React","RegistryContext","createContext","make","storeRegistry","WeakMap","makeStore","registry","rx","stores","get","set","store","newStore","subscribe","f","snapshot","useRxValue","useContext","useSyncExternalStore","useSetRx","useCallback","value","useRefreshRx","refresh","useRx","suspenseCache","suspenseRegistry","FinalizationRegistry","unmount","suspenseRx","family","readable","ctx","result","noWaiting","_tag","promise","Promise","resolve","addFinalizer","isWaiting","suspenseRxWaiting","useRxSuspense","options","resultRx","useMemo","suspendOnWaiting","has","mount","register","delete","unregister","useRxSuspenseSuccess","squash","cause"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-rx/rx-react",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "description": "Reactive toolkit for Effect",
5
5
  "license": "MIT",
6
6
  "repository": {
package/src/index.ts CHANGED
@@ -19,25 +19,31 @@ export * as Rx from "@effect-rx/rx/Rx"
19
19
  export const RegistryContext = React.createContext<Registry.Registry>(Registry.make())
20
20
 
21
21
  interface RxStore<A> {
22
- readonly rx: Rx.Rx<A>
23
- readonly registry: Registry.Registry
24
22
  readonly subscribe: (f: () => void) => () => void
25
23
  readonly snapshot: () => A
26
24
  }
27
25
 
26
+ const storeRegistry = globalValue(
27
+ "@effect-rx/rx-react/storeRegistry",
28
+ () => new WeakMap<Registry.Registry, WeakMap<Rx.Rx<any>, RxStore<any>>>()
29
+ )
30
+
28
31
  function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
29
- let getter = function() {
30
- return registry.get(rx)
31
- }
32
- function subscribe(f: () => void): () => void {
33
- const [get, unmount] = registry.subscribeGetter(rx, f)
34
- getter = get
35
- return unmount
32
+ const stores = storeRegistry.get(registry) ?? storeRegistry.set(registry, new WeakMap()).get(registry)!
33
+ const store = stores.get(rx)
34
+ if (store) {
35
+ return store
36
36
  }
37
- function snapshot() {
38
- return getter()
37
+ const newStore: RxStore<A> = {
38
+ subscribe(f) {
39
+ return registry.subscribe(rx, f)
40
+ },
41
+ snapshot() {
42
+ return registry.get(rx)
43
+ }
39
44
  }
40
- return { rx, registry, subscribe, snapshot }
45
+ stores.set(rx, newStore)
46
+ return newStore
41
47
  }
42
48
 
43
49
  /**
@@ -46,11 +52,8 @@ function makeStore<A>(registry: Registry.Registry, rx: Rx.Rx<A>): RxStore<A> {
46
52
  */
47
53
  export const useRxValue = <A>(rx: Rx.Rx<A>): A => {
48
54
  const registry = React.useContext(RegistryContext)
49
- const store = React.useRef<RxStore<A>>(undefined as any)
50
- if (store.current?.rx !== rx || store.current?.registry !== registry) {
51
- store.current = makeStore(registry, rx)
52
- }
53
- return React.useSyncExternalStore(store.current.subscribe, store.current.snapshot)
55
+ const store = makeStore(registry, rx)
56
+ return React.useSyncExternalStore(store.subscribe, store.snapshot)
54
57
  }
55
58
 
56
59
  /**
@@ -101,55 +104,38 @@ type SuspenseResult<E, A> =
101
104
  readonly value: Result.Success<E, A> | Result.Failure<E, A>
102
105
  }
103
106
 
104
- const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new Map<Rx.Rx<any>, () => void>())
107
+ const suspenseCache = globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap<Rx.Rx<any>, () => void>())
108
+ const suspenseRegistry = new FinalizationRegistry((unmount: () => void) => {
109
+ unmount()
110
+ })
105
111
 
106
- const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) => {
107
- const selfRx = Rx.readable((get, ctx): SuspenseResult<any, any> => {
112
+ const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
113
+ Rx.readable((get, ctx): SuspenseResult<any, any> => {
108
114
  const result = get(rx)
109
115
  const value = Result.noWaiting(result)
110
116
  if (value._tag === "Initial") {
111
117
  return {
112
118
  _tag: "Suspended",
113
- promise: new Promise<void>((resolve) => {
114
- ctx.addFinalizer(() => {
115
- resolve()
116
- const unmount = suspenseCache.get(selfRx)
117
- if (unmount) {
118
- unmount()
119
- suspenseCache.delete(selfRx)
120
- }
121
- })
122
- })
119
+ promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
123
120
  } as const
124
121
  }
125
122
  const isWaiting = Result.isWaiting(result)
126
123
  return { _tag: "Value", isWaiting, value } as const
127
124
  })
128
- return selfRx
129
- })
125
+ )
130
126
 
131
- const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) => {
132
- const selfRx = Rx.readable((get, ctx): SuspenseResult<any, any> => {
127
+ const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
128
+ Rx.readable((get, ctx): SuspenseResult<any, any> => {
133
129
  const result = get(rx)
134
130
  if (result._tag === "Waiting" || result._tag === "Initial") {
135
131
  return {
136
132
  _tag: "Suspended",
137
- promise: new Promise<void>((resolve) => {
138
- ctx.addFinalizer(() => {
139
- resolve()
140
- const unmount = suspenseCache.get(rx)
141
- if (unmount) {
142
- unmount()
143
- suspenseCache.delete(rx)
144
- }
145
- })
146
- })
133
+ promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
147
134
  } as const
148
135
  }
149
136
  return { _tag: "Value", isWaiting: false, value: result } as const
150
137
  })
151
- return selfRx
152
- })
138
+ )
153
139
 
154
140
  /**
155
141
  * @since 1.0.0
@@ -170,10 +156,20 @@ export const useRxSuspense = <E, A>(
170
156
  const result = useRxValue(resultRx)
171
157
  if (result._tag === "Suspended") {
172
158
  if (!suspenseCache.has(resultRx)) {
173
- suspenseCache.set(resultRx, registry.mount(resultRx))
159
+ const unmount = registry.mount(resultRx)
160
+ suspenseCache.set(resultRx, unmount)
161
+ suspenseRegistry.register(resultRx, unmount, resultRx)
174
162
  }
175
163
  throw result.promise
164
+ } else if (suspenseCache.has(resultRx)) {
165
+ const unmount = suspenseCache.get(resultRx)
166
+ if (unmount) {
167
+ suspenseCache.delete(resultRx)
168
+ suspenseRegistry.unregister(resultRx)
169
+ unmount()
170
+ }
176
171
  }
172
+
177
173
  return result
178
174
  }
179
175
 
@@ -188,18 +184,8 @@ export const useRxSuspenseSuccess = <E, A>(
188
184
  readonly isWaiting: boolean
189
185
  readonly value: A
190
186
  } => {
191
- const registry = React.useContext(RegistryContext)
192
- const resultRx = React.useMemo(
193
- () => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
194
- [options?.suspendOnWaiting, rx]
195
- )
196
- const result = useRxValue(resultRx)
197
- if (result._tag === "Suspended") {
198
- if (!suspenseCache.has(resultRx)) {
199
- suspenseCache.set(resultRx, registry.mount(resultRx))
200
- }
201
- throw result.promise
202
- } else if (result.value._tag === "Failure") {
187
+ const result = useRxSuspense(rx, options)
188
+ if (result.value._tag === "Failure") {
203
189
  throw Cause.squash(result.value.cause)
204
190
  }
205
191
  return {