@effect-app/infra 4.0.0-beta.245 → 4.0.0-beta.247
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,19 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 4.0.0-beta.247
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [01bab22]
|
|
8
|
+
- effect-app@4.0.0-beta.247
|
|
9
|
+
|
|
10
|
+
## 4.0.0-beta.246
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- f4b58cd: Add `cachedPerRequest` helper to `ContextMapContainer`. Runs a given Effect at most once per ContextMap (i.e. per request) and stores the result in the ContextMap under a fresh symbol, using the ContextMap's shared semaphore for safe single initialization. Use as a building block for any per-request memoized value (request resolver caches, per-request `Cache.make` instances, etc.).
|
|
15
|
+
- effect-app@4.0.0-beta.246
|
|
16
|
+
|
|
3
17
|
## 4.0.0-beta.245
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import * as Context from "effect-app/Context";
|
|
2
2
|
import * as Effect from "effect-app/Effect";
|
|
3
3
|
import * as Layer from "effect-app/Layer";
|
|
4
|
-
import type * as Request from "effect/Request";
|
|
5
|
-
import * as RequestResolver from "effect/RequestResolver";
|
|
6
4
|
import { ContextMap } from "./service.js";
|
|
7
5
|
declare const ContextMapContainer_base: Context.Reference<"root" | ContextMap>;
|
|
8
6
|
export declare class ContextMapContainer extends ContextMapContainer_base {
|
|
@@ -15,19 +13,12 @@ export declare class ContextMapNotStartedError extends ContextMapNotStartedError
|
|
|
15
13
|
}
|
|
16
14
|
export declare const getContextMap: Effect.Effect<ContextMap, ContextMapNotStartedError, never>;
|
|
17
15
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
16
|
+
* Runs `make` at most once per ContextMap (i.e. per request) and caches the
|
|
17
|
+
* resulting value in the ContextMap under a fresh symbol. Subsequent calls of
|
|
18
|
+
* the returned Effect within the same ContextMap return the cached value.
|
|
19
|
+
*
|
|
20
|
+
* Uses the ContextMap's shared semaphore for safe single initialization.
|
|
21
21
|
*/
|
|
22
|
-
export declare const
|
|
23
|
-
<A extends Request.Request<any, any>>(options: {
|
|
24
|
-
readonly capacity: number;
|
|
25
|
-
readonly strategy?: "lru" | "fifo" | undefined;
|
|
26
|
-
}): (self: RequestResolver.RequestResolver<A>) => Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>;
|
|
27
|
-
<A extends Request.Request<any, any>>(self: RequestResolver.RequestResolver<A>, options: {
|
|
28
|
-
readonly capacity: number;
|
|
29
|
-
readonly strategy?: "lru" | "fifo" | undefined;
|
|
30
|
-
}): Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>;
|
|
31
|
-
};
|
|
22
|
+
export declare const cachedPerRequest: <A, E, R>(make: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ContextMapNotStartedError, R>;
|
|
32
23
|
export {};
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1hcENvbnRhaW5lci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL0NvbnRleHRNYXBDb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxvQkFBb0IsQ0FBQTtBQUM3QyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFFekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTs7QUFRekMscUJBQWEsbUJBQW9CLFNBQVEsd0JBRXZDO0lBQ0EsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLG1DQUFzRTtDQUM1Rjs7OztBQUVELHFCQUFhLHlCQUEwQixTQUFRLDhCQUE2QztDQUFHO0FBRS9GLGVBQU8sTUFBTSxhQUFhLDZEQUV6QixDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsZUFBTyxNQUFNLGdCQUFnQixHQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyx5QkFBeUIsRUFBRSxDQUFDLENBS25ELENBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMapContainer.d.ts","sourceRoot":"","sources":["../../src/Store/ContextMapContainer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ContextMapContainer.d.ts","sourceRoot":"","sources":["../../src/Store/ContextMapContainer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;;AAQzC,qBAAa,mBAAoB,SAAQ,wBAEvC;IACA,MAAM,CAAC,QAAQ,CAAC,KAAK,mCAAsE;CAC5F;;;;AAED,qBAAa,yBAA0B,SAAQ,8BAA6C;CAAG;AAE/F,eAAO,MAAM,aAAa,6DAEzB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,yBAAyB,EAAE,CAAC,CAKnD,CAAA"}
|
|
@@ -2,8 +2,6 @@ import * as Context from "effect-app/Context";
|
|
|
2
2
|
import * as Effect from "effect-app/Effect";
|
|
3
3
|
import * as Layer from "effect-app/Layer";
|
|
4
4
|
import * as Data from "effect/Data";
|
|
5
|
-
import { dual } from "effect/Function";
|
|
6
|
-
import * as RequestResolver from "effect/RequestResolver";
|
|
7
5
|
import { ContextMap } from "./service.js";
|
|
8
6
|
// TODO: we have to create a new contextmap on every request.
|
|
9
7
|
// we want to share one map during startup
|
|
@@ -19,12 +17,14 @@ export class ContextMapNotStartedError extends Data.TaggedError("ContextMapNotSt
|
|
|
19
17
|
}
|
|
20
18
|
export const getContextMap = ContextMapContainer.pipe(Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError()));
|
|
21
19
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* Runs `make` at most once per ContextMap (i.e. per request) and caches the
|
|
21
|
+
* resulting value in the ContextMap under a fresh symbol. Subsequent calls of
|
|
22
|
+
* the returned Effect within the same ContextMap return the cached value.
|
|
23
|
+
*
|
|
24
|
+
* Uses the ContextMap's shared semaphore for safe single initialization.
|
|
25
25
|
*/
|
|
26
|
-
export const
|
|
26
|
+
export const cachedPerRequest = (make) => {
|
|
27
27
|
const cacheKey = Symbol();
|
|
28
|
-
return getContextMap.pipe(Effect.flatMap((ctxMap) => ctxMap.getOrCreateStoreEffect(cacheKey,
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
return getContextMap.pipe(Effect.flatMap((ctxMap) => ctxMap.getOrCreateStoreEffect(cacheKey, make)));
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGV4dE1hcENvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TdG9yZS9Db250ZXh0TWFwQ29udGFpbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sb0JBQW9CLENBQUE7QUFDN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sYUFBYSxDQUFBO0FBQ25DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFekMsNkRBQTZEO0FBQzdELDBDQUEwQztBQUMxQyx5RUFBeUU7QUFDekUsNEdBQTRHO0FBQzVHLHlGQUF5RjtBQUV6RixNQUFNLE9BQU8sbUJBQW9CLFNBQVEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRTtJQUNoRixZQUFZLEVBQUUsR0FBd0IsRUFBRSxDQUFDLE1BQU07Q0FDaEQsQ0FBQztJQUNBLE1BQU0sQ0FBVSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0NBQzVGO0FBRUQsTUFBTSxPQUFPLHlCQUEwQixTQUFRLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLENBQUM7Q0FBRztBQUUvRixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUNuRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUkseUJBQXlCLEVBQUUsQ0FBQyxDQUNoRixDQUFBO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FDOUIsSUFBNEIsRUFDd0IsRUFBRTtJQUN0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQTtJQUN6QixPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDMUUsQ0FBQTtBQUNILENBQUMsQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.247",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "8.4.0",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.247"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.3",
|
|
@@ -2,9 +2,6 @@ import * as Context from "effect-app/Context"
|
|
|
2
2
|
import * as Effect from "effect-app/Effect"
|
|
3
3
|
import * as Layer from "effect-app/Layer"
|
|
4
4
|
import * as Data from "effect/Data"
|
|
5
|
-
import { dual } from "effect/Function"
|
|
6
|
-
import type * as Request from "effect/Request"
|
|
7
|
-
import * as RequestResolver from "effect/RequestResolver"
|
|
8
5
|
import { ContextMap } from "./service.js"
|
|
9
6
|
|
|
10
7
|
// TODO: we have to create a new contextmap on every request.
|
|
@@ -26,38 +23,17 @@ export const getContextMap = ContextMapContainer.pipe(
|
|
|
26
23
|
)
|
|
27
24
|
|
|
28
25
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
26
|
+
* Runs `make` at most once per ContextMap (i.e. per request) and caches the
|
|
27
|
+
* resulting value in the ContextMap under a fresh symbol. Subsequent calls of
|
|
28
|
+
* the returned Effect within the same ContextMap return the cached value.
|
|
29
|
+
*
|
|
30
|
+
* Uses the ContextMap's shared semaphore for safe single initialization.
|
|
32
31
|
*/
|
|
33
|
-
export const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
37
|
-
}): (
|
|
38
|
-
self: RequestResolver.RequestResolver<A>
|
|
39
|
-
) => Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>
|
|
40
|
-
<A extends Request.Request<any, any>>(
|
|
41
|
-
self: RequestResolver.RequestResolver<A>,
|
|
42
|
-
options: {
|
|
43
|
-
readonly capacity: number
|
|
44
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
45
|
-
}
|
|
46
|
-
): Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError>
|
|
47
|
-
} = dual(2, <A extends Request.Request<any, any>>(
|
|
48
|
-
self: RequestResolver.RequestResolver<A>,
|
|
49
|
-
options: {
|
|
50
|
-
readonly capacity: number
|
|
51
|
-
readonly strategy?: "lru" | "fifo" | undefined
|
|
52
|
-
}
|
|
53
|
-
): Effect.Effect<RequestResolver.RequestResolver<A>, ContextMapNotStartedError> => {
|
|
32
|
+
export const cachedPerRequest = <A, E, R>(
|
|
33
|
+
make: Effect.Effect<A, E, R>
|
|
34
|
+
): Effect.Effect<A, E | ContextMapNotStartedError, R> => {
|
|
54
35
|
const cacheKey = Symbol()
|
|
55
36
|
return getContextMap.pipe(
|
|
56
|
-
Effect.flatMap((ctxMap) =>
|
|
57
|
-
ctxMap.getOrCreateStoreEffect(
|
|
58
|
-
cacheKey,
|
|
59
|
-
RequestResolver.withCache(self, options)
|
|
60
|
-
)
|
|
61
|
-
)
|
|
37
|
+
Effect.flatMap((ctxMap) => ctxMap.getOrCreateStoreEffect(cacheKey, make))
|
|
62
38
|
)
|
|
63
|
-
}
|
|
39
|
+
}
|