@effect-rx/rx-react 0.1.17 → 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;AA2DZ;;;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,23 +89,17 @@ 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());
92
+ const suspenseCache = /*#__PURE__*/(0, _GlobalValue.globalValue)("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
93
+ const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
94
+ unmount();
95
+ });
97
96
  const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
98
97
  const result = get(rx);
99
98
  const value = Result.noWaiting(result);
100
99
  if (value._tag === "Initial") {
101
100
  return {
102
101
  _tag: "Suspended",
103
- promise: new Promise(resolve => {
104
- ctx.addFinalizer(() => {
105
- resolve();
106
- const unmount = suspenseCache.get(rx);
107
- if (unmount) {
108
- unmount();
109
- suspenseCache.delete(rx);
110
- }
111
- });
112
- })
102
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
113
103
  };
114
104
  }
115
105
  const isWaiting = Result.isWaiting(result);
@@ -124,16 +114,7 @@ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) =>
124
114
  if (result._tag === "Waiting" || result._tag === "Initial") {
125
115
  return {
126
116
  _tag: "Suspended",
127
- promise: new Promise(resolve => {
128
- ctx.addFinalizer(() => {
129
- resolve();
130
- const unmount = suspenseCache.get(rx);
131
- if (unmount) {
132
- unmount();
133
- suspenseCache.delete(rx);
134
- }
135
- });
136
- })
117
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
137
118
  };
138
119
  }
139
120
  return {
@@ -152,9 +133,18 @@ const useRxSuspense = (rx, options) => {
152
133
  const result = useRxValue(resultRx);
153
134
  if (result._tag === "Suspended") {
154
135
  if (!suspenseCache.has(resultRx)) {
155
- suspenseCache.set(resultRx, registry.mount(resultRx));
136
+ const unmount = registry.mount(resultRx);
137
+ suspenseCache.set(resultRx, unmount);
138
+ suspenseRegistry.register(resultRx, unmount, resultRx);
156
139
  }
157
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
+ }
158
148
  }
159
149
  return result;
160
150
  };
@@ -164,15 +154,8 @@ const useRxSuspense = (rx, options) => {
164
154
  */
165
155
  exports.useRxSuspense = useRxSuspense;
166
156
  const useRxSuspenseSuccess = (rx, options) => {
167
- const registry = React.useContext(RegistryContext);
168
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
169
- const result = useRxValue(resultRx);
170
- if (result._tag === "Suspended") {
171
- if (!suspenseCache.has(resultRx)) {
172
- suspenseCache.set(resultRx, registry.mount(resultRx));
173
- }
174
- throw result.promise;
175
- } else if (result.value._tag === "Failure") {
157
+ const result = useRxSuspense(rx, options);
158
+ if (result.value._tag === "Failure") {
176
159
  throw Cause.squash(result.value.cause);
177
160
  }
178
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","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":"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"}
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":";;;;;;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;AAOtF,MAAMG,aAAa,gBAAG,IAAAC,wBAAW,EAC/B,mCAAmC,EACnC,MAAM,IAAIxB,OAAO,EAAwD,CAC1E;AAED,SAASyB,SAASA,CAAIC,QAA2B,EAAEC,EAAY;EAC7D,MAAMC,MAAM,GAAGL,aAAa,CAACf,GAAG,CAACkB,QAAQ,CAAC,IAAIH,aAAa,CAACJ,GAAG,CAACO,QAAQ,EAAE,IAAI1B,OAAO,EAAE,CAAC,CAACQ,GAAG,CAACkB,QAAQ,CAAE;EACvG,MAAMG,KAAK,GAAGD,MAAM,CAACpB,GAAG,CAACmB,EAAE,CAAC;EAC5B,IAAIE,KAAK,EAAE;IACT,OAAOA,KAAK;;EAEd,MAAMC,QAAQ,GAAe;IAC3BC,SAASA,CAACC,CAAC;MACT,OAAON,QAAQ,CAACK,SAAS,CAACJ,EAAE,EAAEK,CAAC,CAAC;IAClC,CAAC;IACDC,QAAQA,CAAA;MACN,OAAOP,QAAQ,CAAClB,GAAG,CAACmB,EAAE,CAAC;IACzB;GACD;EACDC,MAAM,CAACT,GAAG,CAACQ,EAAE,EAAEG,QAAQ,CAAC;EACxB,OAAOA,QAAQ;AACjB;AAEA;;;;AAIO,MAAMI,UAAU,GAAOP,EAAY,IAAO;EAC/C,MAAMD,QAAQ,GAAG7B,KAAK,CAACsC,UAAU,CAACf,eAAe,CAAC;EAClD,MAAMS,KAAK,GAAGJ,SAAS,CAACC,QAAQ,EAAEC,EAAE,CAAC;EACrC,OAAO9B,KAAK,CAACuC,oBAAoB,CAACP,KAAK,CAACE,SAAS,EAAEF,KAAK,CAACI,QAAQ,CAAC;AACpE,CAAC;AAED;;;;AAAA3C,OAAA,CAAA4C,UAAA,GAAAA,UAAA;AAIO,MAAMG,QAAQ,GAAUV,EAAqB,IAAoC;EACtF,MAAMD,QAAQ,GAAG7B,KAAK,CAACsC,UAAU,CAACf,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAACyC,WAAW,CAAEC,KAAK,IAAI;IACjC,IAAI,OAAOA,KAAK,KAAK,UAAU,EAAE;MAC/Bb,QAAQ,CAACP,GAAG,CAACQ,EAAE,EAAGY,KAAa,CAACb,QAAQ,CAAClB,GAAG,CAACmB,EAAE,CAAC,CAAC,CAAC;MAClD;KACD,MAAM;MACLD,QAAQ,CAACP,GAAG,CAACQ,EAAE,EAAEY,KAAK,CAAC;;EAE3B,CAAC,EAAE,CAACb,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAArC,OAAA,CAAA+C,QAAA,GAAAA,QAAA;AAIO,MAAMG,YAAY,GAAOb,EAA6B,IAAgB;EAC3E,MAAMD,QAAQ,GAAG7B,KAAK,CAACsC,UAAU,CAACf,eAAe,CAAC;EAClD,OAAOvB,KAAK,CAACyC,WAAW,CAAC,MAAK;IAC5BZ,QAAQ,CAACe,OAAO,CAACd,EAAE,CAAC;EACtB,CAAC,EAAE,CAACD,QAAQ,EAAEC,EAAE,CAAC,CAAC;AACpB,CAAC;AAED;;;;AAAArC,OAAA,CAAAkD,YAAA,GAAAA,YAAA;AAIO,MAAME,KAAK,GAAUf,EAAqB,IAC/C,CACEO,UAAU,CAACP,EAAE,CAAC,EACdU,QAAQ,CAACV,EAAE,CAAC,CACJ;AAAArC,OAAA,CAAAoD,KAAA,GAAAA,KAAA;AAaZ,MAAMC,aAAa,gBAAG,IAAAnB,wBAAW,EAAC,mCAAmC,EAAE,MAAM,IAAIxB,OAAO,EAA0B,CAAC;AACnH,MAAM4C,gBAAgB,gBAAG,IAAIC,oBAAoB,CAAEC,OAAmB,IAAI;EACxEA,OAAO,EAAE;AACX,CAAC,CAAC;AAEF,MAAMC,UAAU,gBAAGtD,EAAE,CAACuD,MAAM,CAAErB,EAAkC,IAC9DlC,EAAE,CAACwD,QAAQ,CAAC,CAACzC,GAAG,EAAE0C,GAAG,KAA8B;EACjD,MAAMC,MAAM,GAAG3C,GAAG,CAACmB,EAAE,CAAC;EACtB,MAAMY,KAAK,GAAGhD,MAAM,CAAC6D,SAAS,CAACD,MAAM,CAAC;EACtC,IAAIZ,KAAK,CAACc,IAAI,KAAK,SAAS,EAAE;IAC5B,OAAO;MACLA,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAKN,GAAG,CAACO,YAAY,CAACD,OAAO,CAAC;KACzD;;EAEZ,MAAME,SAAS,GAAGnE,MAAM,CAACmE,SAAS,CAACP,MAAM,CAAC;EAC1C,OAAO;IAAEE,IAAI,EAAE,OAAO;IAAEK,SAAS;IAAEnB;EAAK,CAAW;AACrD,CAAC,CAAC,CACH;AAED,MAAMoB,iBAAiB,gBAAGlE,EAAE,CAACuD,MAAM,CAAErB,EAAkC,IACrElC,EAAE,CAACwD,QAAQ,CAAC,CAACzC,GAAG,EAAE0C,GAAG,KAA8B;EACjD,MAAMC,MAAM,GAAG3C,GAAG,CAACmB,EAAE,CAAC;EACtB,IAAIwB,MAAM,CAACE,IAAI,KAAK,SAAS,IAAIF,MAAM,CAACE,IAAI,KAAK,SAAS,EAAE;IAC1D,OAAO;MACLA,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE,IAAIC,OAAO,CAAQC,OAAO,IAAKN,GAAG,CAACO,YAAY,CAACD,OAAO,CAAC;KACzD;;EAEZ,OAAO;IAAEH,IAAI,EAAE,OAAO;IAAEK,SAAS,EAAE,KAAK;IAAEnB,KAAK,EAAEY;EAAM,CAAW;AACpE,CAAC,CAAC,CACH;AAED;;;;AAIO,MAAMS,aAAa,GAAGA,CAC3BjC,EAA8B,EAC9BkC,OAAiD,KAI/C;EACF,MAAMnC,QAAQ,GAAG7B,KAAK,CAACsC,UAAU,CAACf,eAAe,CAAC;EAClD,MAAM0C,QAAQ,GAAGjE,KAAK,CAACkE,OAAO,CAC5B,MAAOF,OAAO,EAAEG,gBAAgB,GAAGL,iBAAiB,CAAChC,EAAE,CAAC,GAAGoB,UAAU,CAACpB,EAAE,CAAE,EAC1E,CAACkC,OAAO,EAAEG,gBAAgB,EAAErC,EAAE,CAAC,CAChC;EACD,MAAMwB,MAAM,GAAGjB,UAAU,CAAC4B,QAAQ,CAAC;EACnC,IAAIX,MAAM,CAACE,IAAI,KAAK,WAAW,EAAE;IAC/B,IAAI,CAACV,aAAa,CAACpC,GAAG,CAACuD,QAAQ,CAAC,EAAE;MAChC,MAAMhB,OAAO,GAAGpB,QAAQ,CAACuC,KAAK,CAACH,QAAQ,CAAC;MACxCnB,aAAa,CAACxB,GAAG,CAAC2C,QAAQ,EAAEhB,OAAO,CAAC;MACpCF,gBAAgB,CAACsB,QAAQ,CAACJ,QAAQ,EAAEhB,OAAO,EAAEgB,QAAQ,CAAC;;IAExD,MAAMX,MAAM,CAACG,OAAO;GACrB,MAAM,IAAIX,aAAa,CAACpC,GAAG,CAACuD,QAAQ,CAAC,EAAE;IACtC,MAAMhB,OAAO,GAAGH,aAAa,CAACnC,GAAG,CAACsD,QAAQ,CAAC;IAC3C,IAAIhB,OAAO,EAAE;MACXH,aAAa,CAACwB,MAAM,CAACL,QAAQ,CAAC;MAC9BlB,gBAAgB,CAACwB,UAAU,CAACN,QAAQ,CAAC;MACrChB,OAAO,EAAE;;;EAIb,OAAOK,MAAM;AACf,CAAC;AAED;;;;AAAA7D,OAAA,CAAAsE,aAAA,GAAAA,aAAA;AAIO,MAAMS,oBAAoB,GAAGA,CAClC1C,EAA8B,EAC9BkC,OAAiD,KAI/C;EACF,MAAMV,MAAM,GAAGS,aAAa,CAACjC,EAAE,EAAEkC,OAAO,CAAC;EACzC,IAAIV,MAAM,CAACZ,KAAK,CAACc,IAAI,KAAK,SAAS,EAAE;IACnC,MAAMzD,KAAK,CAAC0E,MAAM,CAACnB,MAAM,CAACZ,KAAK,CAACgC,KAAK,CAAC;;EAExC,OAAO;IACLb,SAAS,EAAEP,MAAM,CAACO,SAAS;IAC3BnB,KAAK,EAAEY,MAAM,CAACZ,KAAK,CAACA;GACrB;AACH,CAAC;AAAAjD,OAAA,CAAA+E,oBAAA,GAAAA,oBAAA"}
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,23 +75,17 @@ 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());
78
+ const suspenseCache = /*#__PURE__*/globalValue("@effect-rx/rx-react/suspenseCache", () => new WeakMap());
79
+ const suspenseRegistry = /*#__PURE__*/new FinalizationRegistry(unmount => {
80
+ unmount();
81
+ });
83
82
  const suspenseRx = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) => {
84
83
  const result = get(rx);
85
84
  const value = Result.noWaiting(result);
86
85
  if (value._tag === "Initial") {
87
86
  return {
88
87
  _tag: "Suspended",
89
- promise: new Promise(resolve => {
90
- ctx.addFinalizer(() => {
91
- resolve();
92
- const unmount = suspenseCache.get(rx);
93
- if (unmount) {
94
- unmount();
95
- suspenseCache.delete(rx);
96
- }
97
- });
98
- })
88
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
99
89
  };
100
90
  }
101
91
  const isWaiting = Result.isWaiting(result);
@@ -110,16 +100,7 @@ const suspenseRxWaiting = /*#__PURE__*/Rx.family(rx => Rx.readable((get, ctx) =>
110
100
  if (result._tag === "Waiting" || result._tag === "Initial") {
111
101
  return {
112
102
  _tag: "Suspended",
113
- promise: new Promise(resolve => {
114
- ctx.addFinalizer(() => {
115
- resolve();
116
- const unmount = suspenseCache.get(rx);
117
- if (unmount) {
118
- unmount();
119
- suspenseCache.delete(rx);
120
- }
121
- });
122
- })
103
+ promise: new Promise(resolve => ctx.addFinalizer(resolve))
123
104
  };
124
105
  }
125
106
  return {
@@ -138,9 +119,18 @@ export const useRxSuspense = (rx, options) => {
138
119
  const result = useRxValue(resultRx);
139
120
  if (result._tag === "Suspended") {
140
121
  if (!suspenseCache.has(resultRx)) {
141
- suspenseCache.set(resultRx, registry.mount(resultRx));
122
+ const unmount = registry.mount(resultRx);
123
+ suspenseCache.set(resultRx, unmount);
124
+ suspenseRegistry.register(resultRx, unmount, resultRx);
142
125
  }
143
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
+ }
144
134
  }
145
135
  return result;
146
136
  };
@@ -149,15 +139,8 @@ export const useRxSuspense = (rx, options) => {
149
139
  * @category hooks
150
140
  */
151
141
  export const useRxSuspenseSuccess = (rx, options) => {
152
- const registry = React.useContext(RegistryContext);
153
- const resultRx = React.useMemo(() => options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx), [options?.suspendOnWaiting, rx]);
154
- const result = useRxValue(resultRx);
155
- if (result._tag === "Suspended") {
156
- if (!suspenseCache.has(resultRx)) {
157
- suspenseCache.set(resultRx, registry.mount(resultRx));
158
- }
159
- throw result.promise;
160
- } else if (result.value._tag === "Failure") {
142
+ const result = useRxSuspense(rx, options);
143
+ if (result.value._tag === "Failure") {
161
144
  throw Cause.squash(result.value.cause);
162
145
  }
163
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","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.17",
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,7 +104,11 @@ 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
+ })
111
+
105
112
  const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
106
113
  Rx.readable((get, ctx): SuspenseResult<any, any> => {
107
114
  const result = get(rx)
@@ -109,38 +116,21 @@ const suspenseRx = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
109
116
  if (value._tag === "Initial") {
110
117
  return {
111
118
  _tag: "Suspended",
112
- promise: new Promise<void>((resolve) => {
113
- ctx.addFinalizer(() => {
114
- resolve()
115
- const unmount = suspenseCache.get(rx)
116
- if (unmount) {
117
- unmount()
118
- suspenseCache.delete(rx)
119
- }
120
- })
121
- })
119
+ promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
122
120
  } as const
123
121
  }
124
122
  const isWaiting = Result.isWaiting(result)
125
123
  return { _tag: "Value", isWaiting, value } as const
126
124
  })
127
125
  )
126
+
128
127
  const suspenseRxWaiting = Rx.family((rx: Rx.Rx<Result.Result<any, any>>) =>
129
128
  Rx.readable((get, ctx): SuspenseResult<any, any> => {
130
129
  const result = get(rx)
131
130
  if (result._tag === "Waiting" || result._tag === "Initial") {
132
131
  return {
133
132
  _tag: "Suspended",
134
- promise: new Promise<void>((resolve) => {
135
- ctx.addFinalizer(() => {
136
- resolve()
137
- const unmount = suspenseCache.get(rx)
138
- if (unmount) {
139
- unmount()
140
- suspenseCache.delete(rx)
141
- }
142
- })
143
- })
133
+ promise: new Promise<void>((resolve) => ctx.addFinalizer(resolve))
144
134
  } as const
145
135
  }
146
136
  return { _tag: "Value", isWaiting: false, value: result } as const
@@ -166,10 +156,20 @@ export const useRxSuspense = <E, A>(
166
156
  const result = useRxValue(resultRx)
167
157
  if (result._tag === "Suspended") {
168
158
  if (!suspenseCache.has(resultRx)) {
169
- suspenseCache.set(resultRx, registry.mount(resultRx))
159
+ const unmount = registry.mount(resultRx)
160
+ suspenseCache.set(resultRx, unmount)
161
+ suspenseRegistry.register(resultRx, unmount, resultRx)
170
162
  }
171
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
+ }
172
171
  }
172
+
173
173
  return result
174
174
  }
175
175
 
@@ -184,18 +184,8 @@ export const useRxSuspenseSuccess = <E, A>(
184
184
  readonly isWaiting: boolean
185
185
  readonly value: A
186
186
  } => {
187
- const registry = React.useContext(RegistryContext)
188
- const resultRx = React.useMemo(
189
- () => (options?.suspendOnWaiting ? suspenseRxWaiting(rx) : suspenseRx(rx)),
190
- [options?.suspendOnWaiting, rx]
191
- )
192
- const result = useRxValue(resultRx)
193
- if (result._tag === "Suspended") {
194
- if (!suspenseCache.has(resultRx)) {
195
- suspenseCache.set(resultRx, registry.mount(resultRx))
196
- }
197
- throw result.promise
198
- } else if (result.value._tag === "Failure") {
187
+ const result = useRxSuspense(rx, options)
188
+ if (result.value._tag === "Failure") {
199
189
  throw Cause.squash(result.value.cause)
200
190
  }
201
191
  return {