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
|
|
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":"
|
|
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
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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,
|
|
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.
|
|
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
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
})
|