effect-app 4.0.0-beta.297 → 4.0.0-beta.299

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @effect-app/prelude
2
2
 
3
+ ## 4.0.0-beta.299
4
+
5
+ ## 4.0.0-beta.298
6
+
7
+ ### Patch Changes
8
+
9
+ - 08d092c: Update Atom query caches in memory and accumulate stream invalidations so live events do not cause repeated RPC refetches.
10
+
3
11
  ## 4.0.0-beta.297
4
12
 
5
13
  ### Patch Changes
@@ -22,8 +22,9 @@ export type InvalidationKeysFromServer = typeof InvalidationKeysFromServer;
22
22
  * Creates a fresh `InvalidationKeysService` implementation backed by a `Ref`.
23
23
  *
24
24
  * @param ref - The `Ref` that stores the accumulated keys.
25
- * @param onAdded - V3: Optional Effect run after a key is added. Use to trigger mid-stream
26
- * query invalidation without waiting for the stream to complete.
25
+ * @param onAdded - V3: Optional Effect run after a distinct key is added. Use to trigger
26
+ * mid-stream query invalidation without waiting for the stream to complete. Repeated keys
27
+ * stay accumulated for the final refresh but do not retrigger the callback.
27
28
  */
28
29
  export declare const makeInvalidationKeysService: (ref: Ref.Ref<ReadonlyArray<InvalidationKey>>, onAdded?: (key: InvalidationKey) => Effect.Effect<void>) => InvalidationKeysService;
29
30
  //# sourceMappingURL=InvalidationKeys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvalidationKeys.d.ts","sourceRoot":"","sources":["../../src/client/InvalidationKeys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D,YAAY,EAAE,eAAe,EAAE,CAAA;AAC/B,4FAA4F;AAC5F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAA;CAC5D;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,4CAQtC,CAAA;AACD,MAAM,MAAM,0BAA0B,GAAG,OAAO,0BAA0B,CAAA;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,QACjC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,YAClC,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KACtD,uBAQD,CAAA"}
1
+ {"version":3,"file":"InvalidationKeys.d.ts","sourceRoot":"","sources":["../../src/client/InvalidationKeys.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D,YAAY,EAAE,eAAe,EAAE,CAAA;AAC/B,4FAA4F;AAC5F,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAA;CAC5D;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,4CAQtC,CAAA;AACD,MAAM,MAAM,0BAA0B,GAAG,OAAO,0BAA0B,CAAA;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,QACjC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,YAClC,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KACtD,uBAWD,CAAA"}
@@ -1,3 +1,4 @@
1
+ import * as Equal from "effect/Equal";
1
2
  import * as Ref from "effect/Ref";
2
3
  import * as Context from "../Context.js";
3
4
  import * as Effect from "../Effect.js";
@@ -19,15 +20,18 @@ export const InvalidationKeysFromServer = Context.Reference("effect-app/client/I
19
20
  * Creates a fresh `InvalidationKeysService` implementation backed by a `Ref`.
20
21
  *
21
22
  * @param ref - The `Ref` that stores the accumulated keys.
22
- * @param onAdded - V3: Optional Effect run after a key is added. Use to trigger mid-stream
23
- * query invalidation without waiting for the stream to complete.
23
+ * @param onAdded - V3: Optional Effect run after a distinct key is added. Use to trigger
24
+ * mid-stream query invalidation without waiting for the stream to complete. Repeated keys
25
+ * stay accumulated for the final refresh but do not retrigger the callback.
24
26
  */
25
27
  export const makeInvalidationKeysService = (ref, onAdded) => ({
26
- // When onAdded is set, fire it immediately without accumulating in the ref —
27
- // the key is handled on arrival and must not be re-processed at stream end.
28
- add: (key) => onAdded
29
- ? onAdded(key)
30
- : Ref.update(ref, (keys) => [...keys, key]),
28
+ add: (key) => Ref
29
+ .modify(ref, (keys) => {
30
+ if (keys.some((existing) => Equal.equals(existing, key)))
31
+ return [false, keys];
32
+ return [true, [...keys, key]];
33
+ })
34
+ .pipe(Effect.flatMap((added) => added && onAdded ? onAdded(key) : Effect.void)),
31
35
  get: Ref.get(ref)
32
36
  });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52YWxpZGF0aW9uS2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvSW52YWxpZGF0aW9uS2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQTtBQUNqQyxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQVV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FDekQsOENBQThDLEVBQzlDO0lBQ0UsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkIsR0FBRyxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBb0MsQ0FBQztLQUMxRCxDQUFDO0NBQ0gsQ0FDRixDQUFBO0FBR0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsQ0FDekMsR0FBNEMsRUFDNUMsT0FBdUQsRUFDOUIsRUFBRSxDQUFDLENBQUM7SUFDN0IsNkVBQTZFO0lBQzdFLDRFQUE0RTtJQUM1RSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNYLE9BQU87UUFDTCxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNkLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Q0FDbEIsQ0FBQyxDQUFBIn0=
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52YWxpZGF0aW9uS2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGllbnQvSW52YWxpZGF0aW9uS2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNyQyxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQTtBQUNqQyxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQTtBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGNBQWMsQ0FBQTtBQVV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FDekQsOENBQThDLEVBQzlDO0lBQ0UsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbkIsR0FBRyxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBb0MsQ0FBQztLQUMxRCxDQUFDO0NBQ0gsQ0FDRixDQUFBO0FBR0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQTRDLEVBQzVDLE9BQXVELEVBQzlCLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ1gsR0FBRztTQUNBLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM5RSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUMvQixDQUFDLENBQUM7U0FDRCxJQUFJLENBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ3pFO0lBQ0wsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0NBQ2xCLENBQUMsQ0FBQSJ9
package/package.json CHANGED
@@ -1,8 +1,13 @@
1
1
  {
2
2
  "name": "effect-app",
3
- "version": "4.0.0-beta.297",
3
+ "version": "4.0.0-beta.299",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/effect-app/libs.git",
9
+ "directory": "packages/effect-app"
10
+ },
6
11
  "dependencies": {
7
12
  "@tsconfig/strictest": "^2.0.8",
8
13
  "date-fns": "^4.4.0",
@@ -1,3 +1,4 @@
1
+ import * as Equal from "effect/Equal"
1
2
  import * as Ref from "effect/Ref"
2
3
  import * as Context from "../Context.ts"
3
4
  import * as Effect from "../Effect.ts"
@@ -33,18 +34,22 @@ export type InvalidationKeysFromServer = typeof InvalidationKeysFromServer
33
34
  * Creates a fresh `InvalidationKeysService` implementation backed by a `Ref`.
34
35
  *
35
36
  * @param ref - The `Ref` that stores the accumulated keys.
36
- * @param onAdded - V3: Optional Effect run after a key is added. Use to trigger mid-stream
37
- * query invalidation without waiting for the stream to complete.
37
+ * @param onAdded - V3: Optional Effect run after a distinct key is added. Use to trigger
38
+ * mid-stream query invalidation without waiting for the stream to complete. Repeated keys
39
+ * stay accumulated for the final refresh but do not retrigger the callback.
38
40
  */
39
41
  export const makeInvalidationKeysService = (
40
42
  ref: Ref.Ref<ReadonlyArray<InvalidationKey>>,
41
43
  onAdded?: (key: InvalidationKey) => Effect.Effect<void>
42
44
  ): InvalidationKeysService => ({
43
- // When onAdded is set, fire it immediately without accumulating in the ref —
44
- // the key is handled on arrival and must not be re-processed at stream end.
45
45
  add: (key) =>
46
- onAdded
47
- ? onAdded(key)
48
- : Ref.update(ref, (keys) => [...keys, key]),
46
+ Ref
47
+ .modify(ref, (keys) => {
48
+ if (keys.some((existing) => Equal.equals(existing, key))) return [false, keys]
49
+ return [true, [...keys, key]]
50
+ })
51
+ .pipe(
52
+ Effect.flatMap((added) => added && onAdded ? onAdded(key) : Effect.void)
53
+ ),
49
54
  get: Ref.get(ref)
50
55
  })