effect-app 4.0.0-beta.284 → 4.0.0-beta.286
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 +12 -0
- package/dist/DataDependencies.d.ts +252 -23
- package/dist/DataDependencies.d.ts.map +1 -1
- package/dist/DataDependencies.js +40 -20
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +2 -2
- package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
- package/dist/Model/query/new-kid-interpreter.js +2 -2
- package/dist/RequestContext.d.ts +47 -117
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +3 -12
- package/dist/RequestScopedDependencies.d.ts +21 -0
- package/dist/RequestScopedDependencies.d.ts.map +1 -0
- package/dist/RequestScopedDependencies.js +16 -0
- package/dist/Schema/Class.d.ts +1 -1
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +2 -2
- package/dist/Schema/ext.d.ts +1 -1
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +1 -1
- package/dist/Schema/moreStrings.d.ts +1 -1
- package/dist/Schema/moreStrings.d.ts.map +1 -1
- package/dist/Schema/moreStrings.js +1 -1
- package/dist/Schema/numbers.d.ts +1 -1
- package/dist/Schema/numbers.d.ts.map +1 -1
- package/dist/Schema/schema.d.ts +1 -1
- package/dist/Schema/schema.d.ts.map +1 -1
- package/dist/Schema/schema.js +2 -2
- package/dist/Schema/strings.d.ts +1 -1
- package/dist/Schema/strings.d.ts.map +1 -1
- package/dist/Schema.d.ts +1 -1
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +2 -2
- 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 +2 -2
- package/src/DataDependencies.ts +59 -23
- package/src/Model/Repository/internal/internal.ts +1 -1
- package/src/Model/query/new-kid-interpreter.ts +1 -1
- package/src/RequestContext.ts +2 -49
- package/src/RequestScopedDependencies.ts +45 -0
- package/src/Schema/Class.ts +1 -1
- package/src/Schema/ext.ts +1 -1
- package/src/Schema/moreStrings.ts +1 -1
- package/src/Schema/numbers.ts +1 -1
- package/src/Schema/schema.ts +1 -1
- package/src/Schema/strings.ts +1 -1
- package/src/Schema.ts +1 -1
- 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
- package/test/special.test.ts +1 -1
|
@@ -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
|
)
|
package/test/special.test.ts
CHANGED
|
@@ -469,7 +469,7 @@ describe("OpaqueFacade", () => {
|
|
|
469
469
|
})
|
|
470
470
|
|
|
471
471
|
it("keeps generated struct facades decodable with public statics", () => {
|
|
472
|
-
const input: RequestContext.Encoded = {
|
|
472
|
+
const input: typeof RequestContext.Encoded = {
|
|
473
473
|
span: { traceId: "trace", spanId: "span", sampled: true },
|
|
474
474
|
name: "operation",
|
|
475
475
|
locale: "en",
|