effect-app 4.0.0-beta.283 → 4.0.0-beta.285
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 +8 -0
- package/dist/DataDependencies.d.ts +252 -23
- package/dist/DataDependencies.d.ts.map +1 -1
- package/dist/DataDependencies.js +40 -20
- package/dist/RequestScopedDependencies.d.ts +21 -0
- package/dist/RequestScopedDependencies.d.ts.map +1 -0
- package/dist/RequestScopedDependencies.js +16 -0
- package/dist/Store.d.ts +4 -11
- package/dist/Store.d.ts.map +1 -1
- package/dist/Store.js +4 -12
- package/dist/client/apiClientFactory.d.ts.map +1 -1
- package/dist/client/apiClientFactory.js +49 -39
- package/dist/rpc/Invalidation.d.ts +2319 -591
- package/dist/rpc/Invalidation.d.ts.map +1 -1
- package/dist/rpc/Invalidation.js +5 -2
- package/dist/setupRequest.d.ts +1 -0
- package/dist/setupRequest.d.ts.map +1 -1
- package/dist/setupRequest.js +8 -5
- package/package.json +1 -1
- package/src/DataDependencies.ts +59 -23
- package/src/RequestScopedDependencies.ts +45 -0
- package/src/Store.ts +7 -11
- package/src/client/apiClientFactory.ts +21 -6
- package/src/rpc/Invalidation.ts +4 -1
- package/src/setupRequest.ts +8 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Invalidation.d.ts","sourceRoot":"","sources":["../../src/rpc/Invalidation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,wBAAwB,CAAA;AAC5E,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAA;AAC1D,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAEjC;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAA;AAmBjH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,uCAAS,CAAA;AAC5C,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAEjF,6GAA6G;AAC7G,eAAO,MAAM,eAAe;;;CAAkC,CAAA;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,eAAe,CAAC,CAAA;AAEnE,oFAAoF;AACpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAA2B,CAAA;AACxD,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAErE,wFAAwF;AACxF,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"Invalidation.d.ts","sourceRoot":"","sources":["../../src/rpc/Invalidation.ts"],"names":[],"mappings":"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"}
|
package/dist/rpc/Invalidation.js
CHANGED
|
@@ -30,7 +30,10 @@ export const CommandMetaData = S.Struct({
|
|
|
30
30
|
invalidateQueries: InvalidationKeys,
|
|
31
31
|
dataDependencies: DataDependencies.DataDependencySet
|
|
32
32
|
});
|
|
33
|
-
export const emptyDataDependencies = {
|
|
33
|
+
export const emptyDataDependencies = {
|
|
34
|
+
reads: DataDependencies.empty(),
|
|
35
|
+
writes: DataDependencies.empty()
|
|
36
|
+
};
|
|
34
37
|
export const makeMetaData = (invalidateQueries, dataDependencies = emptyDataDependencies) => ({ invalidateQueries, dataDependencies });
|
|
35
38
|
export const QueryResponseWithMetaData = (success) => S.Struct({ payload: success, metadata: S.Struct({ dataDependencies: DataDependencies.DataDependencySet }) });
|
|
36
39
|
/**
|
|
@@ -172,4 +175,4 @@ export const makeStreamRpc = Rpc.custom(({ defect, error, success }) => ({
|
|
|
172
175
|
error: StreamFailureChunk(error),
|
|
173
176
|
defect
|
|
174
177
|
}));
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JwYy9JbnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUE7QUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3pDLE9BQU8sRUFBeUIsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDNUUsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHdCQUF3QixDQUFBO0FBQzFELE9BQU8sS0FBSyxNQUFNLE1BQU0sY0FBYyxDQUFBO0FBQ3RDLE9BQU8sS0FBSyxDQUFDLE1BQU0sY0FBYyxDQUFBO0FBU2pDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBMkIsRUFBbUIsRUFBRTtJQUNwRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDdEMsTUFBTSxPQUFPLEdBQUcsS0FBbUQsQ0FBQTtJQUNuRSxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQzFHLENBQUMsQ0FBQTtBQUVELDJFQUEyRTtBQUMzRSx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsQ0FDZCxLQUFpRSxFQUNuQixFQUFFLENBQ2hELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENB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
|
package/dist/setupRequest.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare const getRC: Effect.Effect<{
|
|
|
11
11
|
export interface SetupRequestOptions {
|
|
12
12
|
readonly withTransaction?: boolean;
|
|
13
13
|
}
|
|
14
|
+
export declare const requestStateLayer: Layer.Layer<never, never, never>;
|
|
14
15
|
export declare const provideOnRequestScope: <ROut, E2, RIn>(layer: Layer.Layer<ROut, E2, RIn>) => <A, E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, RIn | import("effect/Scope").Scope | Exclude<R, ROut>>;
|
|
15
16
|
export declare const setupRequestContextFromCurrent: (name?: string, options?: Tracer.SpanOptions & SetupRequestOptions) => <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<Exclude<R, Tracer.ParentSpan>, never>>;
|
|
16
17
|
export declare const setupStreamingRequestContextFromCurrent: (name?: string, options?: Tracer.SpanOptions & SetupRequestOptions) => <R, E, A>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E, import("effect/Scope").Scope | Exclude<Exclude<R, Tracer.ParentSpan>, never>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupRequest.d.ts","sourceRoot":"","sources":["../src/setupRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"setupRequest.d.ts","sourceRoot":"","sources":["../src/setupRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAA;AAEnC,OAAO,EAAa,cAAc,EAAkB,MAAM,qBAAqB,CAAA;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAW/C,eAAO,MAAM,iBAAiB,6CAe3B,CAAA;AAEH,eAAO,MAAM,KAAK;;;gBAGhB,CAAA;AAmBF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CACnC;AAED,eAAO,MAAM,iBAAiB,kCAA+E,CAAA;AAM7G,eAAO,MAAM,qBAAqB,GAC/B,IAAI,EAAE,EAAE,EAAE,GAAG,SAAS,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,oFASxF,CAAA;AAEN,eAAO,MAAM,8BAA8B,4BACZ,MAAM,CAAC,WAAW,GAAG,mBAAmB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,uEAM3G,CAAA;AAMP,eAAO,MAAM,uCAAuC,4BACrB,MAAM,CAAC,WAAW,GAAG,mBAAmB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,sGAK7G,CAAA;AAGL,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACzC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5B,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,mBAAmB,sEAa9B;AAED,wBAAgB,iCAAiC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACvD,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC5B,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,CAAC,WAAW,GAAG,mBAAmB,sEAanD"}
|
package/dist/setupRequest.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as Tracer from "effect/Tracer";
|
|
2
2
|
import { SqlClient } from "effect/unstable/sql";
|
|
3
|
+
import { DataDependencyRecorder } from "./DataDependencies.js";
|
|
3
4
|
import * as Effect from "./Effect.js";
|
|
4
5
|
import * as Layer from "./Layer.js";
|
|
5
6
|
import * as Option from "./Option.js";
|
|
6
7
|
import { LocaleRef, RequestContext, spanAttributes } from "./RequestContext.js";
|
|
8
|
+
import * as RequestScopedDependencies from "./RequestScopedDependencies.js";
|
|
7
9
|
import { NonEmptyString255 } from "./Schema.js";
|
|
8
10
|
import { ContextMapContainer, storeId } from "./Store.js";
|
|
9
11
|
const withSqlTransaction = (self) => Effect.serviceOption(SqlClient.SqlClient).pipe(Effect.flatMap(Option.match({
|
|
@@ -35,6 +37,7 @@ const withRequestSpan = (name = "request", options) => (f) => Effect.andThen(get
|
|
|
35
37
|
// TODO: false
|
|
36
38
|
// request context info is picked up directly in the logger for annotations.
|
|
37
39
|
Effect.withLogSpan(name)));
|
|
40
|
+
export const requestStateLayer = RequestScopedDependencies.layer(ContextMapContainer, DataDependencyRecorder);
|
|
38
41
|
// Build `layer` against the ambient (request) scope rather than a sub-scope of the
|
|
39
42
|
// returned Effect. Required when the returned value is a streaming HttpServerResponse:
|
|
40
43
|
// the response body keeps producing chunks (and using layer-provided state) after the
|
|
@@ -49,21 +52,21 @@ export const provideOnRequestScope = (layer) => (self) => Effect.gen(function* (
|
|
|
49
52
|
return yield* Effect.provide(self, ctx);
|
|
50
53
|
});
|
|
51
54
|
export const setupRequestContextFromCurrent = (name = "request", options) => (self) => self
|
|
52
|
-
.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(name, options), Effect.provide(
|
|
55
|
+
.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(name, options), Effect.provide(requestStateLayer, { local: true }));
|
|
53
56
|
// Streaming variant: binds ContextMapContainer to the ambient (request) scope so its
|
|
54
57
|
// finalizer (clear()) runs only after the response body is fully drained, not when the
|
|
55
58
|
// outer Effect returns its HttpServerResponse value. Use for handlers that return a
|
|
56
59
|
// streaming HttpServerResponse (e.g. SSE) — see RequestContextMiddleware for context.
|
|
57
|
-
export const setupStreamingRequestContextFromCurrent = (name = "request", options) => (self) => self.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(name, options), provideOnRequestScope(
|
|
60
|
+
export const setupStreamingRequestContextFromCurrent = (name = "request", options) => (self) => self.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(name, options), provideOnRequestScope(requestStateLayer));
|
|
58
61
|
// TODO: consider integrating Effect.withParentSpan
|
|
59
62
|
export function setupRequestContext(self, requestContext, options) {
|
|
60
|
-
const layer = Layer.mergeAll(
|
|
63
|
+
const layer = Layer.mergeAll(requestStateLayer, Layer.succeed(LocaleRef, requestContext.locale), Layer.succeed(storeId, requestContext.namespace));
|
|
61
64
|
return self
|
|
62
65
|
.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(requestContext.name), Effect.provide(layer, { local: true }));
|
|
63
66
|
}
|
|
64
67
|
export function setupRequestContextWithCustomSpan(self, requestContext, name, options) {
|
|
65
|
-
const layer = Layer.mergeAll(
|
|
68
|
+
const layer = Layer.mergeAll(requestStateLayer, Layer.succeed(LocaleRef, requestContext.locale), Layer.succeed(storeId, requestContext.namespace));
|
|
66
69
|
return self
|
|
67
70
|
.pipe(options?.withTransaction === true ? withSqlTransaction : (_) => _, withRequestSpan(name, options), Effect.provide(layer, { local: true }));
|
|
68
71
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSZXF1ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NldHVwUmVxdWVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDL0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDOUQsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxLQUFLLEtBQUssTUFBTSxZQUFZLENBQUE7QUFDbkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDL0UsT0FBTyxLQUFLLHlCQUF5QixNQUFNLGdDQUFnQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXpELE1BQU0sa0JBQWtCLEdBQUcsQ0FBVSxJQUE0QixFQUEwQixFQUFFLENBQzNGLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzFCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJO0lBQ2xCLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztDQUM5RCxDQUFDLENBQUMsQ0FDSixDQUFBO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsTUFBTTtLQUNw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
|
package/package.json
CHANGED
package/src/DataDependencies.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as Ref from "effect/Ref"
|
|
2
|
-
import * as
|
|
2
|
+
import * as Stream from "effect/Stream"
|
|
3
3
|
import * as Effect from "./Effect.ts"
|
|
4
|
+
import * as RequestScopedDependencies from "./RequestScopedDependencies.ts"
|
|
4
5
|
import * as S from "./Schema.ts"
|
|
5
6
|
|
|
6
7
|
export const DataDependency = S.Struct({
|
|
@@ -9,9 +10,11 @@ export const DataDependency = S.Struct({
|
|
|
9
10
|
})
|
|
10
11
|
export type DataDependency = S.Schema.Type<typeof DataDependency>
|
|
11
12
|
|
|
12
|
-
export const DataDependencies = S.
|
|
13
|
+
export const DataDependencies = S.ReadonlySet(DataDependency)
|
|
13
14
|
export type DataDependencies = S.Schema.Type<typeof DataDependencies>
|
|
14
15
|
|
|
16
|
+
export const empty = (): DataDependencies => new Set()
|
|
17
|
+
|
|
15
18
|
export const DataDependencySet = S.Struct({
|
|
16
19
|
reads: DataDependencies,
|
|
17
20
|
writes: DataDependencies
|
|
@@ -26,26 +29,50 @@ export interface DataDependencyRecorderService {
|
|
|
26
29
|
readonly drainWrites: Effect.Effect<DataDependencies>
|
|
27
30
|
}
|
|
28
31
|
|
|
29
|
-
const containsDependency = (dependencies:
|
|
30
|
-
|
|
32
|
+
const containsDependency = (dependencies: ReadonlySet<DataDependency>, dependency: DataDependency) => {
|
|
33
|
+
for (const _ of dependencies) {
|
|
34
|
+
if (_.type === dependency.type && _.name === dependency.name) return true
|
|
35
|
+
}
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
31
38
|
|
|
32
39
|
const appendDependency = (dependency: DataDependency) => (dependencies: DataDependencies): DataDependencies =>
|
|
33
|
-
containsDependency(dependencies, dependency) ? dependencies : [...dependencies, dependency]
|
|
40
|
+
containsDependency(dependencies, dependency) ? dependencies : new Set([...dependencies, dependency])
|
|
34
41
|
|
|
35
|
-
export const DataDependencyRecorder =
|
|
42
|
+
export const DataDependencyRecorder = RequestScopedDependencies.make(
|
|
36
43
|
"effect-app/DataDependencyRecorder",
|
|
37
|
-
{
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
drain: Effect.succeed({ reads: [], writes: [] }),
|
|
43
|
-
drainWrites: Effect.succeed([])
|
|
44
|
-
})
|
|
45
|
-
}
|
|
44
|
+
Effect.gen(function*() {
|
|
45
|
+
const readsRef = yield* Ref.make(empty())
|
|
46
|
+
const writesRef = yield* Ref.make(empty())
|
|
47
|
+
return makeDataDependencyRecorder(readsRef, writesRef)
|
|
48
|
+
})
|
|
46
49
|
)
|
|
47
50
|
export type DataDependencyRecorder = typeof DataDependencyRecorder
|
|
48
51
|
|
|
52
|
+
export type DataDependencyRecorderNotStartedError = RequestScopedDependencies.RequestScopedDependencyNotStartedError
|
|
53
|
+
|
|
54
|
+
export const getDataDependencyRecorder = DataDependencyRecorder.current
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Guarantee a recorder is in scope for `self`, providing a fresh one per request when none is
|
|
58
|
+
* (e.g. a top-level client call with no parent query/command tracking its dependencies). An
|
|
59
|
+
* existing recorder is inherited, so nested calls forward into their parent rather than shadow it.
|
|
60
|
+
*/
|
|
61
|
+
export const ensureDataDependencyRecorder = <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> =>
|
|
62
|
+
Effect.flatMap(
|
|
63
|
+
DataDependencyRecorder,
|
|
64
|
+
(current) => current === "root" ? Effect.provide(self, DataDependencyRecorder.layer) : self
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
/** Stream variant of {@link ensureDataDependencyRecorder}. */
|
|
68
|
+
export const ensureDataDependencyRecorderStream = <A, E, R>(self: Stream.Stream<A, E, R>): Stream.Stream<A, E, R> =>
|
|
69
|
+
Stream.unwrap(
|
|
70
|
+
Effect.map(
|
|
71
|
+
DataDependencyRecorder,
|
|
72
|
+
(current) => current === "root" ? Stream.provide(self, DataDependencyRecorder.layer) : self
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
|
|
49
76
|
export const makeDataDependencyRecorder = (
|
|
50
77
|
readsRef: Ref.Ref<DataDependencies>,
|
|
51
78
|
writesRef: Ref.Ref<DataDependencies>
|
|
@@ -57,10 +84,10 @@ export const makeDataDependencyRecorder = (
|
|
|
57
84
|
writes: Ref.get(writesRef)
|
|
58
85
|
}),
|
|
59
86
|
drain: Effect.all({
|
|
60
|
-
reads: Ref.getAndSet(readsRef,
|
|
61
|
-
writes: Ref.getAndSet(writesRef,
|
|
87
|
+
reads: Ref.getAndSet(readsRef, empty()),
|
|
88
|
+
writes: Ref.getAndSet(writesRef, empty())
|
|
62
89
|
}),
|
|
63
|
-
drainWrites: Ref.getAndSet(writesRef,
|
|
90
|
+
drainWrites: Ref.getAndSet(writesRef, empty())
|
|
64
91
|
})
|
|
65
92
|
|
|
66
93
|
export const repo = (name: string): DataDependency => ({ type: "repo", name })
|
|
@@ -68,11 +95,20 @@ export const signal = (name: string): DataDependency => ({ type: "signal", name
|
|
|
68
95
|
|
|
69
96
|
export const QueryReadDependenciesMetaKey = "effect-app.query.readDependencies"
|
|
70
97
|
|
|
71
|
-
export const read = (dependency: DataDependency) =>
|
|
98
|
+
export const read = (dependency: DataDependency) =>
|
|
99
|
+
getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.read(dependency)))
|
|
72
100
|
|
|
73
|
-
export const write = (dependency: DataDependency) =>
|
|
101
|
+
export const write = (dependency: DataDependency) =>
|
|
102
|
+
getDataDependencyRecorder.pipe(Effect.flatMap((_) => _.write(dependency)))
|
|
74
103
|
|
|
75
104
|
export const intersects = (
|
|
76
|
-
a:
|
|
77
|
-
b:
|
|
78
|
-
) =>
|
|
105
|
+
a: ReadonlySet<DataDependency>,
|
|
106
|
+
b: ReadonlySet<DataDependency>
|
|
107
|
+
) => {
|
|
108
|
+
for (const dependency of a) {
|
|
109
|
+
if (containsDependency(b, dependency)) return true
|
|
110
|
+
}
|
|
111
|
+
return false
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const isNonEmpty = (dependencies: DataDependencies) => dependencies.size > 0
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as Data from "effect/Data"
|
|
2
|
+
import type * as Scope from "effect/Scope"
|
|
3
|
+
import * as Context from "./Context.ts"
|
|
4
|
+
import * as Effect from "./Effect.ts"
|
|
5
|
+
import * as Layer from "./Layer.ts"
|
|
6
|
+
|
|
7
|
+
export type Root = "root"
|
|
8
|
+
|
|
9
|
+
export class RequestScopedDependencyNotStartedError extends Data.TaggedError(
|
|
10
|
+
"RequestScopedDependencyNotStartedError"
|
|
11
|
+
)<{ readonly key: string }> {}
|
|
12
|
+
|
|
13
|
+
export interface RequestScopedDependency<Service, E = never, R = never> extends Context.Reference<Service | Root> {
|
|
14
|
+
readonly current: Effect.Effect<Service, RequestScopedDependencyNotStartedError>
|
|
15
|
+
readonly layer: Layer.Layer<never, E, R>
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const access = <Service>(
|
|
19
|
+
dependency: Context.Reference<Service | Root>,
|
|
20
|
+
key: string
|
|
21
|
+
): Effect.Effect<Service, RequestScopedDependencyNotStartedError> =>
|
|
22
|
+
dependency.pipe(
|
|
23
|
+
Effect.filterOrFail((_): _ is Service => _ !== "root", () => new RequestScopedDependencyNotStartedError({ key }))
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
export const make = <Service, E = never, R = never>(
|
|
27
|
+
key: string,
|
|
28
|
+
service: Effect.Effect<Service, E, R>
|
|
29
|
+
): RequestScopedDependency<Service, E, Exclude<R, Scope.Scope>> => {
|
|
30
|
+
const dependency = Context.Reference<Service | Root>(key, { defaultValue: () => "root" })
|
|
31
|
+
return Object.assign(dependency, {
|
|
32
|
+
current: access(dependency, key),
|
|
33
|
+
layer: Layer.effect(dependency, service)
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const layer = <
|
|
38
|
+
Deps extends readonly [RequestScopedDependency<any, any, any>, ...Array<RequestScopedDependency<any, any, any>>]
|
|
39
|
+
>(
|
|
40
|
+
...dependencies: Deps
|
|
41
|
+
): Layer.Layer<
|
|
42
|
+
never,
|
|
43
|
+
{ [K in keyof Deps]: Deps[K] extends RequestScopedDependency<any, infer E, any> ? E : never }[number],
|
|
44
|
+
{ [K in keyof Deps]: Deps[K] extends RequestScopedDependency<any, any, infer R> ? R : never }[number]
|
|
45
|
+
> => dependencies.map((_) => _.layer).reduce((acc, l) => Layer.merge(acc, l)) as any
|
package/src/Store.ts
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import * as Data from "effect/Data"
|
|
3
2
|
import type * as Redacted from "effect/Redacted"
|
|
4
3
|
import * as Semaphore from "effect/Semaphore"
|
|
5
4
|
import type { NonEmptyReadonlyArray } from "./Array.ts"
|
|
6
5
|
import type { DatabaseError, OptimisticConcurrencyException } from "./client/errors.ts"
|
|
7
6
|
import * as Context from "./Context.ts"
|
|
8
7
|
import * as Effect from "./Effect.ts"
|
|
9
|
-
import * as Layer from "./Layer.ts"
|
|
10
8
|
import type { FilterResult } from "./Model/filter/filterApi.ts"
|
|
11
9
|
import type { FieldValues } from "./Model/filter/types.ts"
|
|
12
10
|
import type { FieldPath } from "./Model/filter/types/path/index.ts"
|
|
13
11
|
import type { AggregateIrExpression, ComputedProjectionIrExpression, RawQuery } from "./Model/query.ts"
|
|
14
12
|
import type * as Option from "./Option.ts"
|
|
13
|
+
import * as RequestScopedDependencies from "./RequestScopedDependencies.ts"
|
|
15
14
|
import { NonEmptyString255 } from "./Schema.ts"
|
|
16
15
|
|
|
17
16
|
/**
|
|
@@ -235,17 +234,14 @@ const makeMap = Effect.acquireRelease(
|
|
|
235
234
|
export class ContextMap extends Context.Opaque<ContextMap>()("effect-app/ContextMap", { make: makeMap }) {
|
|
236
235
|
}
|
|
237
236
|
|
|
238
|
-
export
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
237
|
+
export const ContextMapContainer = RequestScopedDependencies.make(
|
|
238
|
+
"ContextMapContainer",
|
|
239
|
+
ContextMap.make.pipe(Effect.map(ContextMap.of))
|
|
240
|
+
)
|
|
243
241
|
|
|
244
|
-
export
|
|
242
|
+
export type ContextMapNotStartedError = RequestScopedDependencies.RequestScopedDependencyNotStartedError
|
|
245
243
|
|
|
246
|
-
export const getContextMap = ContextMapContainer.
|
|
247
|
-
Effect.filterOrFail((_) => _ !== "root", () => new ContextMapNotStartedError())
|
|
248
|
-
)
|
|
244
|
+
export const getContextMap = ContextMapContainer.current
|
|
249
245
|
|
|
250
246
|
/**
|
|
251
247
|
* Runs `make` at most once per ContextMap (i.e. per request) and caches the
|
|
@@ -224,7 +224,7 @@ const makeApiClientFactory = Effect
|
|
|
224
224
|
dependencies === undefined
|
|
225
225
|
? Effect.void
|
|
226
226
|
: Effect.gen(function*() {
|
|
227
|
-
const dependencyRecorder = yield* DataDependencies.
|
|
227
|
+
const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
|
|
228
228
|
if (options?.reads) {
|
|
229
229
|
yield* Effect.forEach(dependencies.reads, dependencyRecorder.read, { discard: true })
|
|
230
230
|
}
|
|
@@ -308,11 +308,14 @@ const makeApiClientFactory = Effect
|
|
|
308
308
|
Effect.provide(svcs)
|
|
309
309
|
)
|
|
310
310
|
return isCommand ? unwrapCommand(rpcEffect) : isStream ? rpcEffect : unwrapQuery(rpcEffect)
|
|
311
|
-
})
|
|
311
|
+
}),
|
|
312
|
+
// Forwarding the server's dependency metadata needs a recorder in scope. A parent
|
|
313
|
+
// query/command (vue) provides one; a top-level call gets a fresh per-request one.
|
|
314
|
+
DataDependencies.ensureDataDependencyRecorder
|
|
312
315
|
)
|
|
313
316
|
|
|
314
|
-
const buildStream = (input: any) =>
|
|
315
|
-
Stream.unwrap(
|
|
317
|
+
const buildStream = (input: any) => {
|
|
318
|
+
const stream = Stream.unwrap(
|
|
316
319
|
mr.contextEffect.pipe(
|
|
317
320
|
Effect.flatMap((svcs) =>
|
|
318
321
|
TheClient
|
|
@@ -330,7 +333,7 @@ const makeApiClientFactory = Effect
|
|
|
330
333
|
yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, {
|
|
331
334
|
discard: true
|
|
332
335
|
})
|
|
333
|
-
const dependencyRecorder = yield* DataDependencies.
|
|
336
|
+
const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
|
|
334
337
|
yield* Effect.forEach(
|
|
335
338
|
metadata.dataDependencies.reads,
|
|
336
339
|
dependencyRecorder.read,
|
|
@@ -358,7 +361,7 @@ const makeApiClientFactory = Effect
|
|
|
358
361
|
yield* Effect.forEach(metadata.invalidateQueries, invalidationKeys.add, {
|
|
359
362
|
discard: true
|
|
360
363
|
})
|
|
361
|
-
const dependencyRecorder = yield* DataDependencies.
|
|
364
|
+
const dependencyRecorder = yield* DataDependencies.getDataDependencyRecorder
|
|
362
365
|
yield* Effect.forEach(
|
|
363
366
|
metadata.dataDependencies.writes,
|
|
364
367
|
dependencyRecorder.write,
|
|
@@ -378,6 +381,18 @@ const makeApiClientFactory = Effect
|
|
|
378
381
|
)
|
|
379
382
|
)
|
|
380
383
|
)
|
|
384
|
+
// Forwarding the server's dependency metadata needs a recorder in scope. A parent
|
|
385
|
+
// query/command (vue) provides one; a top-level stream call gets a fresh per-request one.
|
|
386
|
+
return Stream.unwrap(
|
|
387
|
+
Effect.map(
|
|
388
|
+
DataDependencies.DataDependencyRecorder,
|
|
389
|
+
(current) =>
|
|
390
|
+
current === "root"
|
|
391
|
+
? Stream.provide(stream, DataDependencies.DataDependencyRecorder.layer)
|
|
392
|
+
: stream
|
|
393
|
+
)
|
|
394
|
+
)
|
|
395
|
+
}
|
|
381
396
|
|
|
382
397
|
// @ts-expect-error doc
|
|
383
398
|
prev[cur] = Object.keys(fields).length === 0
|
package/src/rpc/Invalidation.ts
CHANGED
|
@@ -53,7 +53,10 @@ export const CommandMetaData = S.Struct({
|
|
|
53
53
|
})
|
|
54
54
|
export type CommandMetaData = S.Schema.Type<typeof CommandMetaData>
|
|
55
55
|
|
|
56
|
-
export const emptyDataDependencies: DataDependencies.DataDependencySet = {
|
|
56
|
+
export const emptyDataDependencies: DataDependencies.DataDependencySet = {
|
|
57
|
+
reads: DataDependencies.empty(),
|
|
58
|
+
writes: DataDependencies.empty()
|
|
59
|
+
}
|
|
57
60
|
|
|
58
61
|
export const makeMetaData = (
|
|
59
62
|
invalidateQueries: InvalidationKeys,
|
package/src/setupRequest.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as Tracer from "effect/Tracer"
|
|
2
2
|
import { SqlClient } from "effect/unstable/sql"
|
|
3
|
+
import { DataDependencyRecorder } from "./DataDependencies.ts"
|
|
3
4
|
import * as Effect from "./Effect.ts"
|
|
4
5
|
import * as Layer from "./Layer.ts"
|
|
5
6
|
import * as Option from "./Option.ts"
|
|
6
7
|
import { LocaleRef, RequestContext, spanAttributes } from "./RequestContext.ts"
|
|
8
|
+
import * as RequestScopedDependencies from "./RequestScopedDependencies.ts"
|
|
7
9
|
import { NonEmptyString255 } from "./Schema.ts"
|
|
8
10
|
import { ContextMapContainer, storeId } from "./Store.ts"
|
|
9
11
|
|
|
@@ -58,6 +60,8 @@ export interface SetupRequestOptions {
|
|
|
58
60
|
readonly withTransaction?: boolean
|
|
59
61
|
}
|
|
60
62
|
|
|
63
|
+
export const requestStateLayer = RequestScopedDependencies.layer(ContextMapContainer, DataDependencyRecorder)
|
|
64
|
+
|
|
61
65
|
// Build `layer` against the ambient (request) scope rather than a sub-scope of the
|
|
62
66
|
// returned Effect. Required when the returned value is a streaming HttpServerResponse:
|
|
63
67
|
// the response body keeps producing chunks (and using layer-provided state) after the
|
|
@@ -80,7 +84,7 @@ export const setupRequestContextFromCurrent =
|
|
|
80
84
|
.pipe(
|
|
81
85
|
options?.withTransaction === true ? withSqlTransaction : (_) => _,
|
|
82
86
|
withRequestSpan(name, options),
|
|
83
|
-
Effect.provide(
|
|
87
|
+
Effect.provide(requestStateLayer, { local: true })
|
|
84
88
|
)
|
|
85
89
|
|
|
86
90
|
// Streaming variant: binds ContextMapContainer to the ambient (request) scope so its
|
|
@@ -92,7 +96,7 @@ export const setupStreamingRequestContextFromCurrent =
|
|
|
92
96
|
self.pipe(
|
|
93
97
|
options?.withTransaction === true ? withSqlTransaction : (_) => _,
|
|
94
98
|
withRequestSpan(name, options),
|
|
95
|
-
provideOnRequestScope(
|
|
99
|
+
provideOnRequestScope(requestStateLayer)
|
|
96
100
|
)
|
|
97
101
|
|
|
98
102
|
// TODO: consider integrating Effect.withParentSpan
|
|
@@ -102,7 +106,7 @@ export function setupRequestContext<R, E, A>(
|
|
|
102
106
|
options?: SetupRequestOptions
|
|
103
107
|
) {
|
|
104
108
|
const layer = Layer.mergeAll(
|
|
105
|
-
|
|
109
|
+
requestStateLayer,
|
|
106
110
|
Layer.succeed(LocaleRef, requestContext.locale),
|
|
107
111
|
Layer.succeed(storeId, requestContext.namespace)
|
|
108
112
|
)
|
|
@@ -121,7 +125,7 @@ export function setupRequestContextWithCustomSpan<R, E, A>(
|
|
|
121
125
|
options?: Tracer.SpanOptions & SetupRequestOptions
|
|
122
126
|
) {
|
|
123
127
|
const layer = Layer.mergeAll(
|
|
124
|
-
|
|
128
|
+
requestStateLayer,
|
|
125
129
|
Layer.succeed(LocaleRef, requestContext.locale),
|
|
126
130
|
Layer.succeed(storeId, requestContext.namespace)
|
|
127
131
|
)
|