@effect-app/infra 0.207.0 → 0.208.1

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.
Files changed (37) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/_cjs/services/QueueMaker/memQueue.cjs +4 -2
  3. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  4. package/_cjs/services/QueueMaker/sbqueue.cjs +2 -2
  5. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  6. package/_cjs/services/QueueMaker/service.cjs.map +1 -1
  7. package/_cjs/services/RepositoryBase.cjs +2 -2
  8. package/_cjs/services/RepositoryBase.cjs.map +1 -1
  9. package/_cjs/services/query/dsl.cjs +3 -4
  10. package/_cjs/services/query/dsl.cjs.map +1 -1
  11. package/_cjs/services/query/new-kid-interpreter.cjs +1 -5
  12. package/_cjs/services/query/new-kid-interpreter.cjs.map +1 -1
  13. package/dist/services/QueueMaker/memQueue.d.ts +3 -3
  14. package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
  15. package/dist/services/QueueMaker/memQueue.js +6 -7
  16. package/dist/services/QueueMaker/sbqueue.d.ts +2 -2
  17. package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
  18. package/dist/services/QueueMaker/sbqueue.js +9 -7
  19. package/dist/services/QueueMaker/service.d.ts +3 -2
  20. package/dist/services/QueueMaker/service.d.ts.map +1 -1
  21. package/dist/services/QueueMaker/service.js +1 -1
  22. package/dist/services/RepositoryBase.d.ts +2 -2
  23. package/dist/services/RepositoryBase.d.ts.map +1 -1
  24. package/dist/services/RepositoryBase.js +8 -4
  25. package/dist/services/query/dsl.d.ts +1 -2
  26. package/dist/services/query/dsl.d.ts.map +1 -1
  27. package/dist/services/query/dsl.js +2 -7
  28. package/dist/services/query/new-kid-interpreter.d.ts +0 -1
  29. package/dist/services/query/new-kid-interpreter.d.ts.map +1 -1
  30. package/dist/services/query/new-kid-interpreter.js +2 -7
  31. package/package.json +3 -3
  32. package/src/services/QueueMaker/memQueue.ts +20 -23
  33. package/src/services/QueueMaker/sbqueue.ts +77 -75
  34. package/src/services/QueueMaker/service.ts +3 -2
  35. package/src/services/RepositoryBase.ts +18 -5
  36. package/src/services/query/dsl.ts +2 -12
  37. package/src/services/query/new-kid-interpreter.ts +1 -6
@@ -17,7 +17,7 @@ import { NonEmptyString255, struct } from "effect-app/schema"
17
17
  import { pretty } from "effect-app/utils"
18
18
  import { setupRequestContext } from "../../api/setupRequest.js"
19
19
  import { RequestContextContainer } from "../RequestContextContainer.js"
20
- import { forkDaemonReportQueue, reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
20
+ import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
21
21
  import { type QueueBase, QueueMeta } from "./service.js"
22
22
 
23
23
  /**
@@ -53,85 +53,87 @@ export function makeServiceBusQueue<
53
53
  makeDrain: <DrainE, DrainR>(
54
54
  handleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>
55
55
  ) =>
56
- Effect.gen(function*($) {
57
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
- function processMessage(messageBody: any) {
59
- return Effect
60
- .sync(() => JSON.parse(messageBody))
61
- .pipe(
62
- Effect.flatMap((x) => parseDrain(x)),
63
- Effect.orDie,
64
- Effect
65
- .flatMap(({ body, meta }) =>
66
- Effect
67
- .logDebug(`$$ [${queueDrainName}] Processing incoming message`)
68
- .pipe(
69
- Effect.annotateLogs({
70
- body: pretty(body),
71
- meta: pretty(meta)
72
- }),
73
- Effect
74
- .zipRight(handleEvent(body)),
75
- Effect
76
- .orDie
77
- )
78
- // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
79
- .pipe(
80
- silenceAndReportError,
81
- (_) =>
82
- setupRequestContext(
83
- _,
84
- RequestContext.inherit(meta.requestContext, {
85
- id: RequestId(body.id),
86
- locale: "en" as const,
87
- name: NonEmptyString255(body._tag)
56
+ Effect
57
+ .gen(function*($) {
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ function processMessage(messageBody: any) {
60
+ return Effect
61
+ .sync(() => JSON.parse(messageBody))
62
+ .pipe(
63
+ Effect.flatMap((x) => parseDrain(x)),
64
+ Effect.orDie,
65
+ Effect
66
+ .flatMap(({ body, meta }) =>
67
+ Effect
68
+ .logDebug(`$$ [${queueDrainName}] Processing incoming message`)
69
+ .pipe(
70
+ Effect.annotateLogs({
71
+ body: pretty(body),
72
+ meta: pretty(meta)
73
+ }),
74
+ Effect
75
+ .zipRight(handleEvent(body)),
76
+ Effect
77
+ .orDie
78
+ )
79
+ // we silenceAndReportError here, so that the error is reported, and moves into the Exit.
80
+ .pipe(
81
+ silenceAndReportError,
82
+ (_) =>
83
+ setupRequestContext(
84
+ _,
85
+ RequestContext.inherit(meta.requestContext, {
86
+ id: RequestId(body.id),
87
+ locale: "en" as const,
88
+ name: NonEmptyString255(body._tag)
89
+ })
90
+ ),
91
+ Effect
92
+ .withSpan("queue.drain", {
93
+ attributes: { "queue.name": queueDrainName },
94
+ parent: meta.span
95
+ ? Tracer.externalSpan(meta.span)
96
+ : undefined
88
97
  })
89
- ),
90
- Effect
91
- .withSpan("queue.drain", {
92
- attributes: { "queue.name": queueDrainName },
93
- parent: meta.span
94
- ? Tracer.externalSpan(meta.span)
95
- : undefined
96
- })
97
- )
98
- ),
99
- Effect
100
- // we reportError here, so that we report the error only, and keep flowing
101
- .tapErrorCause(reportError)
102
- )
103
- }
98
+ )
99
+ ),
100
+ Effect
101
+ // we reportError here, so that we report the error only, and keep flowing
102
+ .tapErrorCause(reportError)
103
+ )
104
+ }
104
105
 
105
- return yield* $(
106
- subscribe({
107
- processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
108
- processError: (err) => Effect.sync(() => captureException(err.error))
109
- })
110
- .pipe(Effect.provide(receiverLayer))
111
- )
112
- }),
106
+ return yield* $(
107
+ subscribe({
108
+ processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
109
+ processError: (err) => Effect.sync(() => captureException(err.error))
110
+ })
111
+ .pipe(Effect.provide(receiverLayer))
112
+ )
113
+ })
114
+ .pipe(Effect.andThen(Effect.never)),
113
115
 
114
116
  publish: (...messages) =>
115
- Effect.gen(function*($) {
116
- const requestContext = yield* $(rcc.requestContext)
117
- const currentSpan = yield* $(Effect.currentSpan.pipe(Effect.orDie))
118
- const span = Tracer.externalSpan(currentSpan)
119
- return yield* $(
120
- Effect
121
- .promise(() =>
122
- s.sendMessages(
123
- messages.map((m) => ({
124
- body: JSON.stringify(
125
- S.encodeSync(wireSchema)({ body: m, meta: { requestContext, span } })
126
- ),
127
- messageId: m.id, /* correllationid: requestId */
128
- contentType: "application/json"
129
- }))
117
+ Effect
118
+ .gen(function*($) {
119
+ const requestContext = yield* $(rcc.requestContext)
120
+ const currentSpan = yield* $(Effect.currentSpan.pipe(Effect.orDie))
121
+ const span = Tracer.externalSpan(currentSpan)
122
+ return yield* $(
123
+ Effect
124
+ .promise(() =>
125
+ s.sendMessages(
126
+ messages.map((m) => ({
127
+ body: JSON.stringify(
128
+ S.encodeSync(wireSchema)({ body: m, meta: { requestContext, span } })
129
+ ),
130
+ messageId: m.id, /* correllationid: requestId */
131
+ contentType: "application/json"
132
+ }))
133
+ )
130
134
  )
131
- )
132
- .pipe(forkDaemonReportQueue)
133
- )
134
- })
135
+ )
136
+ })
135
137
  } satisfies QueueBase<Evt, DrainEvt>
136
138
  })
137
139
  }
@@ -1,5 +1,6 @@
1
1
  import { struct } from "@effect-app/schema"
2
- import { type Effect, type NonEmptyReadonlyArray, S, type Scope } from "effect-app"
2
+ import { S } from "effect-app"
3
+ import type { Effect, NonEmptyReadonlyArray, Scope } from "effect-app"
3
4
  import { RequestContext } from "../../RequestContext.js"
4
5
  import type { RequestContextContainer } from "../RequestContextContainer.js"
5
6
  import type { ContextMapContainer } from "../Store/ContextMapContainer.js"
@@ -7,7 +8,7 @@ import type { ContextMapContainer } from "../Store/ContextMapContainer.js"
7
8
  export interface QueueBase<Evt, DrainEvt> {
8
9
  makeDrain: <DrainE, DrainR>(
9
10
  makeHandleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>
10
- ) => Effect<void, never, Scope | RequestContextContainer | ContextMapContainer | DrainR>
11
+ ) => Effect<never, never, Scope | RequestContextContainer | ContextMapContainer | DrainR>
11
12
  publish: (
12
13
  ...messages: NonEmptyReadonlyArray<Evt>
13
14
  ) => Effect<void>
@@ -87,8 +87,7 @@ export abstract class RepositoryBaseC<
87
87
  parseMany: (a: readonly PM[]) => Effect<readonly T[]>
88
88
  parseMany2: <A, R>(
89
89
  a: readonly PM[],
90
- schema: S.Schema<A, Omit<PM, "_etag">, R>,
91
- batch?: boolean | "inherit" | undefined
90
+ schema: S.Schema<A, Omit<PM, "_etag">, R>
92
91
  ) => Effect<readonly A[], S.ParseResult.ParseError, R>
93
92
  all: Effect<PM[]>
94
93
  filter: FilterFunc<PM>
@@ -566,7 +565,10 @@ export function makeRepo<
566
565
  Unify
567
566
  .unify(
568
567
  a.schema
569
- ? r.utils.parseMany2(_, a.schema as any, a.batch)
568
+ ? r.utils.parseMany2(
569
+ _,
570
+ a.schema as any
571
+ )
570
572
  : r.utils.parseMany(_)
571
573
  )
572
574
  )
@@ -604,11 +606,22 @@ export function makeRepo<
604
606
  .flatMap(cms, (cm) =>
605
607
  decodeMany(items.map((_) => mapReverse(_, cm.set)))
606
608
  .pipe(Effect.orDie, Effect.withSpan("parseMany"))),
607
- parseMany2: (items, schema, batch) =>
609
+ parseMany2: (items, schema) =>
608
610
  Effect
609
611
  .flatMap(cms, (cm) =>
610
612
  S
611
- .decode(S.array(schema).pipe(S.batching(batch)))(
613
+ .decode(
614
+ S.array(schema).pipe(S.batching(
615
+ S
616
+ .AST
617
+ .getBatchingAnnotation(schema.ast)
618
+ .pipe(Option.getOrUndefined)
619
+ ?.valueOf() as
620
+ | boolean
621
+ | "inherit" // somehow otherwise inefers as string ?
622
+ | undefined
623
+ ))
624
+ )(
612
625
  items.map((_) => mapReverse(_, cm.set) as unknown as Omit<PM, "_etag">)
613
626
  )
614
627
  .pipe(Effect.orDie, Effect.withSpan("parseMany2"))),
@@ -134,7 +134,6 @@ export class Project<A, TFieldValues extends FieldValues, R, TType extends "one"
134
134
  current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues, TType>
135
135
  schema: S.Schema<A, TFieldValues, R>
136
136
  mode: "raw" | "transform"
137
- batch?: boolean | "inherit" | undefined
138
137
  }>
139
138
  implements QueryProjection<TFieldValues, A, R>
140
139
  {
@@ -210,20 +209,11 @@ export const project: {
210
209
  R = never,
211
210
  TType extends "one" | "many" = "many"
212
211
  >(
213
- schema: S.Schema<A, TFieldValues, R>,
214
- batch?: boolean | "inherit" | undefined
212
+ schema: S.Schema<A, TFieldValues, R>
215
213
  ): (
216
214
  current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues, TType>
217
215
  ) => QueryProjection<TFieldValues, A, R, TType>
218
- } = (schema: any, batchOrMode) => (current: any) =>
219
- new Project(
220
- {
221
- current,
222
- schema,
223
- mode: batchOrMode === "raw" ? batchOrMode : "transform",
224
- batch: batchOrMode !== "raw" ? batchOrMode : undefined
225
- } as any
226
- )
216
+ } = (schema: any, mode = "transform") => (current: any) => new Project({ current, /* TODO: why */ schema, mode } as any)
227
217
 
228
218
  export type FilterWheres = {
229
219
  <
@@ -16,7 +16,6 @@ type Result<TFieldValues extends FieldValues, A = TFieldValues, R = never> = {
16
16
  order: { key: FieldPath<TFieldValues>; direction: "ASC" | "DESC" }[]
17
17
  ttype: "one" | "many" | "count" | undefined
18
18
  mode: "raw" | "transform" | undefined
19
- batch: boolean | "inherit" | undefined
20
19
  }
21
20
 
22
21
  const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never>(_: QAll<TFieldValues, A, R>) => {
@@ -29,8 +28,7 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
29
28
  skip: undefined,
30
29
  order: [],
31
30
  ttype: undefined,
32
- mode: undefined,
33
- batch: undefined
31
+ mode: undefined
34
32
  }
35
33
 
36
34
  const upd = (
@@ -43,7 +41,6 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
43
41
  if (v.ttype !== undefined) data.ttype = v.ttype
44
42
  if (v.schema !== undefined) data.schema = v.schema
45
43
  if (v.mode !== undefined) data.mode = v.mode
46
- if (v.batch !== undefined) data.batch = v.batch
47
44
  }
48
45
 
49
46
  pipe(
@@ -120,7 +117,6 @@ const interpret = <TFieldValues extends FieldValues, A = TFieldValues, R = never
120
117
  upd(interpret(v.current))
121
118
  data.schema = v.schema
122
119
  data.mode = v.mode
123
- data.batch = v.batch
124
120
  }
125
121
  })
126
122
  )
@@ -155,7 +151,6 @@ export const toFilter = <
155
151
  schema,
156
152
  order: Option.getOrUndefined(toNonEmptyArray(a.order)),
157
153
  ttype: a.ttype,
158
- batch: a.batch,
159
154
  mode: a.mode ?? "transform",
160
155
  filter: a.filter.length
161
156
  ? {