@effect-app/infra 1.23.2 → 1.23.4

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 (93) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/_cjs/api/internal/events.cjs +2 -1
  3. package/_cjs/api/internal/events.cjs.map +1 -1
  4. package/_cjs/api/internal/middlewares.cjs +3 -2
  5. package/_cjs/api/internal/middlewares.cjs.map +1 -1
  6. package/_cjs/api/routing/defaultErrorHandler.cjs +3 -2
  7. package/_cjs/api/routing/defaultErrorHandler.cjs.map +1 -1
  8. package/_cjs/api/routing/makeRequestHandler.cjs +9 -8
  9. package/_cjs/api/routing/makeRequestHandler.cjs.map +1 -1
  10. package/_cjs/errorReporter.cjs +12 -11
  11. package/_cjs/errorReporter.cjs.map +1 -1
  12. package/_cjs/logger.cjs +9 -0
  13. package/_cjs/logger.cjs.map +1 -0
  14. package/_cjs/services/Emailer/Sendgrid.cjs +6 -5
  15. package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -1
  16. package/_cjs/services/Emailer/fake.cjs +3 -2
  17. package/_cjs/services/Emailer/fake.cjs.map +1 -1
  18. package/_cjs/services/QueueMaker/SQLQueue.cjs +7 -6
  19. package/_cjs/services/QueueMaker/SQLQueue.cjs.map +1 -1
  20. package/_cjs/services/QueueMaker/memQueue.cjs +15 -14
  21. package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -1
  22. package/_cjs/services/QueueMaker/sbqueue.cjs +15 -14
  23. package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -1
  24. package/_cjs/services/RepositoryBase.cjs +22 -22
  25. package/_cjs/services/RepositoryBase.cjs.map +1 -1
  26. package/_cjs/services/Store/Cosmos/query.cjs +2 -3
  27. package/_cjs/services/Store/Cosmos/query.cjs.map +1 -1
  28. package/_cjs/services/Store/Cosmos.cjs +24 -23
  29. package/_cjs/services/Store/Cosmos.cjs.map +1 -1
  30. package/_cjs/services/Store/Disk.cjs +6 -6
  31. package/_cjs/services/Store/Disk.cjs.map +1 -1
  32. package/_cjs/services/Store/Memory.cjs +7 -6
  33. package/_cjs/services/Store/Memory.cjs.map +1 -1
  34. package/_cjs/services/Store/utils.cjs +5 -5
  35. package/_cjs/services/Store/utils.cjs.map +1 -1
  36. package/dist/api/internal/events.d.ts.map +1 -1
  37. package/dist/api/internal/events.js +3 -2
  38. package/dist/api/internal/middlewares.d.ts.map +1 -1
  39. package/dist/api/internal/middlewares.js +4 -3
  40. package/dist/api/routing/defaultErrorHandler.d.ts.map +1 -1
  41. package/dist/api/routing/defaultErrorHandler.js +4 -3
  42. package/dist/api/routing/makeRequestHandler.d.ts.map +1 -1
  43. package/dist/api/routing/makeRequestHandler.js +10 -9
  44. package/dist/errorReporter.d.ts +1 -1
  45. package/dist/errorReporter.d.ts.map +1 -1
  46. package/dist/errorReporter.js +12 -11
  47. package/dist/logger.d.ts +8 -0
  48. package/dist/logger.d.ts.map +1 -0
  49. package/dist/logger.js +3 -0
  50. package/dist/services/Emailer/Sendgrid.d.ts.map +1 -1
  51. package/dist/services/Emailer/Sendgrid.js +8 -7
  52. package/dist/services/Emailer/fake.d.ts.map +1 -1
  53. package/dist/services/Emailer/fake.js +5 -4
  54. package/dist/services/QueueMaker/SQLQueue.d.ts.map +1 -1
  55. package/dist/services/QueueMaker/SQLQueue.js +9 -8
  56. package/dist/services/QueueMaker/memQueue.d.ts.map +1 -1
  57. package/dist/services/QueueMaker/memQueue.js +17 -16
  58. package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -1
  59. package/dist/services/QueueMaker/sbqueue.js +17 -16
  60. package/dist/services/RepositoryBase.d.ts.map +1 -1
  61. package/dist/services/RepositoryBase.js +23 -23
  62. package/dist/services/Store/Cosmos/query.d.ts.map +1 -1
  63. package/dist/services/Store/Cosmos/query.js +3 -4
  64. package/dist/services/Store/Cosmos.d.ts.map +1 -1
  65. package/dist/services/Store/Cosmos.js +24 -23
  66. package/dist/services/Store/Disk.d.ts.map +1 -1
  67. package/dist/services/Store/Disk.js +8 -8
  68. package/dist/services/Store/Memory.d.ts.map +1 -1
  69. package/dist/services/Store/Memory.js +8 -7
  70. package/dist/services/Store/utils.d.ts.map +1 -1
  71. package/dist/services/Store/utils.js +5 -5
  72. package/examples/query.ts +3 -3
  73. package/package.json +15 -5
  74. package/src/api/internal/events.ts +2 -1
  75. package/src/api/internal/middlewares.ts +3 -2
  76. package/src/api/routing/defaultErrorHandler.ts +3 -2
  77. package/src/api/routing/makeRequestHandler.ts +9 -8
  78. package/src/api/writeDocs.ts.bak +1 -1
  79. package/src/errorReporter.ts +31 -33
  80. package/src/logger.ts +3 -0
  81. package/src/services/Emailer/Sendgrid.ts +14 -12
  82. package/src/services/Emailer/fake.ts +4 -3
  83. package/src/services/QueueMaker/SQLQueue.ts +18 -19
  84. package/src/services/QueueMaker/memQueue.ts +33 -36
  85. package/src/services/QueueMaker/sbqueue.ts +38 -41
  86. package/src/services/RepositoryBase.ts +40 -43
  87. package/src/services/Store/Cosmos/query.ts +6 -5
  88. package/src/services/Store/Cosmos.ts +75 -90
  89. package/src/services/Store/Disk.ts +12 -14
  90. package/src/services/Store/Memory.ts +7 -6
  91. package/src/services/Store/utils.ts +10 -14
  92. package/test/query.test.ts +56 -61
  93. package/tsconfig.json +0 -1
@@ -15,6 +15,7 @@ import type { HttpServerError } from "effect-app/http"
15
15
  import { HttpBody, HttpRouter, HttpServerRequest, HttpServerResponse } from "effect-app/http"
16
16
  import { NonEmptyString255 } from "effect-app/schema"
17
17
  import type { REST } from "effect-app/schema"
18
+ import { InfraLogger } from "../../logger.js"
18
19
  import { updateRequestContext } from "../setupRequest.js"
19
20
  import { makeRequestParsers, parseRequestParams } from "./base.js"
20
21
  import type { RequestHandler, RequestHandlerBase } from "./base.js"
@@ -170,19 +171,19 @@ export function makeRequestHandler<
170
171
  )
171
172
 
172
173
  return Effect
173
- .gen(function*($) {
174
- const req = yield* $(HttpServerRequest.HttpServerRequest)
174
+ .gen(function*() {
175
+ const req = yield* HttpServerRequest.HttpServerRequest
175
176
  const res = HttpServerResponse
176
177
  .empty()
177
178
  .pipe((_) => req.method === "GET" ? HttpServerResponse.setHeader(_, "Cache-Control", "no-store") : _)
178
179
 
179
- const pars = yield* $(getParams)
180
+ const pars = yield* getParams
180
181
 
181
- const settings = yield* $(FiberRef.get(RequestSettings))
182
+ const settings = yield* FiberRef.get(RequestSettings)
182
183
 
183
184
  const eff =
184
185
  // TODO: we don;t have access to user id here cause context is not yet created
185
- Effect
186
+ InfraLogger
186
187
  .logInfo("Incoming request")
187
188
  .pipe(
188
189
  Effect.annotateLogs({
@@ -281,7 +282,7 @@ export function makeRequestHandler<
281
282
  }),
282
283
  Effect.suspend(() => {
283
284
  const headers = res.headers
284
- return Effect
285
+ return InfraLogger
285
286
  .logError("Finished request", cause)
286
287
  .pipe(Effect.annotateLogs({
287
288
  method: req.method,
@@ -312,7 +313,7 @@ export function makeRequestHandler<
312
313
  ),
313
314
  Effect
314
315
  .tap((res) =>
315
- Effect
316
+ InfraLogger
316
317
  .logInfo("Finished request")
317
318
  .pipe(Effect.annotateLogs({
318
319
  method: req.method,
@@ -327,7 +328,7 @@ export function makeRequestHandler<
327
328
  )
328
329
  )
329
330
 
330
- return yield* $(eff)
331
+ return yield* eff
331
332
  })
332
333
  .pipe((_) =>
333
334
  updateRequestContext(
@@ -27,5 +27,5 @@ export function writeOpenapiDocsI(rdescs: readonly RouteDescriptorAny[]) {
27
27
  ]
28
28
  }))
29
29
  .flatMap((_) => writeTextFile("./openapi.json", JSON.stringify(_, undefined, 2)).orDie)
30
- .flatMap(() => Effect.logDebug("OpenAPI spec written to './openapi.json'"))
30
+ .flatMap(() => InfraLogger.logDebug("OpenAPI spec written to './openapi.json'"))
31
31
  }
@@ -2,6 +2,7 @@ import { dropUndefined } from "@effect-app/core/utils"
2
2
  import * as Sentry from "@sentry/node"
3
3
  import { Cause, Effect, Option } from "effect-app"
4
4
  import { annotateSpanWithError, CauseException, ErrorReported } from "./errors.js"
5
+ import { InfraLogger } from "./logger.js"
5
6
  import { RequestContextContainer } from "./services/RequestContextContainer.js"
6
7
 
7
8
  const tryToJson = <T>(error: CauseException<T>) => {
@@ -24,28 +25,27 @@ export function reportError(
24
25
  name: string
25
26
  ) {
26
27
  return (cause: Cause<unknown>, extras?: Record<string, unknown>) =>
27
- Effect.gen(function*($) {
28
- yield* $(annotateSpanWithError(cause, name))
28
+ Effect.gen(function*() {
29
+ yield* annotateSpanWithError(cause, name)
29
30
  if (Cause.isInterrupted(cause)) {
30
- yield* $(Effect.logDebug("Interrupted").pipe(Effect.annotateLogs("extras", JSON.stringify(extras ?? {}))))
31
+ yield* InfraLogger.logDebug("Interrupted").pipe(Effect.annotateLogs("extras", JSON.stringify(extras ?? {})))
31
32
  return
32
33
  }
33
34
  const error = new CauseException(cause, name)
34
35
 
35
- yield* $(reportSentry(error, extras))
36
- yield* $(
37
- Effect
38
- .logError("Reporting error", cause)
39
- .pipe(
40
- Effect.annotateLogs(dropUndefined({
41
- extras,
42
- __cause__: tryToJson(error),
43
- __error_name__: name
44
- })),
45
- Effect.catchAllCause((cause) => Effect.logError("Failed to log error", cause)),
46
- Effect.catchAllCause(() => Effect.logError("Failed to log error cause"))
47
- )
48
- )
36
+ yield* reportSentry(error, extras)
37
+ yield* InfraLogger
38
+ .logError("Reporting error", cause)
39
+ .pipe(
40
+ Effect.annotateLogs(dropUndefined({
41
+ extras,
42
+ __cause__: tryToJson(error),
43
+ __error_name__: name
44
+ })),
45
+ Effect.catchAllCause((cause) => InfraLogger.logError("Failed to log error", cause)),
46
+ Effect.catchAllCause(() => InfraLogger.logError("Failed to log error cause"))
47
+ )
48
+
49
49
  error[ErrorReported] = true
50
50
  return error
51
51
  })
@@ -69,25 +69,23 @@ export function logError<E>(
69
69
  name: string
70
70
  ) {
71
71
  return (cause: Cause<E>, extras?: Record<string, unknown>) =>
72
- Effect.gen(function*($) {
72
+ Effect.gen(function*() {
73
73
  if (Cause.isInterrupted(cause)) {
74
- yield* $(Effect.logDebug("Interrupted").pipe(Effect.annotateLogs(dropUndefined({ extras }))))
74
+ yield* InfraLogger.logDebug("Interrupted").pipe(Effect.annotateLogs(dropUndefined({ extras })))
75
75
  return
76
76
  }
77
77
  const error = new CauseException(cause, name)
78
- yield* $(
79
- Effect
80
- .logWarning("Logging error", cause)
81
- .pipe(
82
- Effect.annotateLogs(dropUndefined({
83
- extras,
84
- __cause__: tryToJson(error),
85
- __error_name__: name
86
- })),
87
- Effect.catchAllCause((cause) => Effect.logError("Failed to log error", cause)),
88
- Effect.catchAllCause(() => Effect.logError("Failed to log error cause"))
89
- )
90
- )
78
+ yield* InfraLogger
79
+ .logWarning("Logging error", cause)
80
+ .pipe(
81
+ Effect.annotateLogs(dropUndefined({
82
+ extras,
83
+ __cause__: tryToJson(error),
84
+ __error_name__: name
85
+ })),
86
+ Effect.catchAllCause((cause) => InfraLogger.logError("Failed to log error", cause)),
87
+ Effect.catchAllCause(() => InfraLogger.logError("Failed to log error cause"))
88
+ )
91
89
  })
92
90
  }
93
91
 
@@ -96,7 +94,7 @@ export function captureException(error: unknown) {
96
94
  console.error(error)
97
95
  }
98
96
 
99
- export function reportMessage(message: string, extras?: Record<string, unknown> | undefined) {
97
+ export function reportMessage(message: string, extras?: Record<string, unknown>) {
100
98
  return RequestContextContainer.getOption.pipe(Effect.map((ctx) => {
101
99
  const context = Option.getOrUndefined(ctx)
102
100
  const scope = new Sentry.Scope()
package/src/logger.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { makeLog } from "@effect-app/core/utils/logger"
2
+
3
+ export const InfraLogger = makeLog("@effect-app/infra", "info")
@@ -3,6 +3,7 @@ import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
3
3
  import sgMail from "@sendgrid/mail"
4
4
  import { Array, Effect, Equivalence, Secret } from "effect-app"
5
5
  import { inspect } from "util"
6
+ import { InfraLogger } from "../../logger.js"
6
7
  import { Emailer } from "./service.js"
7
8
  import type { EmailMsg, EmailMsgOptionalFrom, SendgridConfig } from "./service.js"
8
9
 
@@ -12,7 +13,7 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
12
13
 
13
14
  return Emailer.of({
14
15
  sendMail(msg_: EmailMsgOptionalFrom) {
15
- return Effect.gen(function*($) {
16
+ return Effect.gen(function*() {
16
17
  const msg: EmailMsg = dropUndefinedT({
17
18
  ...msg_,
18
19
  from: msg_.from ?? defaultFrom,
@@ -22,16 +23,17 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
22
23
 
23
24
  const renderedMsg_ = render(msg)
24
25
  const renderedMsg = { ...renderedMsg_, subject: `${subjectPrefix}${renderedMsg_.subject}` }
25
- yield* $(Effect.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5))))
26
+ yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
26
27
 
27
- const ret = yield* $(
28
- Effect.async<[sgMail.ClientResponse, Record<string, unknown>], Error | sgMail.ResponseError>(
29
- (cb) =>
30
- void sgMail.send(renderedMsg, false, (err, result) =>
31
- err
32
- ? cb(Effect.fail(err))
33
- : cb(Effect.sync(() => result)))
34
- )
28
+ const ret = yield* Effect.async<
29
+ [sgMail.ClientResponse, Record<string, unknown>],
30
+ Error | sgMail.ResponseError
31
+ >(
32
+ (cb) =>
33
+ void sgMail.send(renderedMsg, false, (err, result) =>
34
+ err
35
+ ? cb(Effect.fail(err))
36
+ : cb(Effect.sync(() => result)))
35
37
  )
36
38
 
37
39
  // const event = {
@@ -40,8 +42,8 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
40
42
  // templateId: msg.templateId
41
43
  // }
42
44
  // }
43
- // yield* $(Effect.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty))
44
- // const { trackEvent } = yield* $(AiContextService)
45
+ // yield* InfraLogger.logDebug("Tracking email event").annotateLogs("event", event.$$.pretty)
46
+ // const { trackEvent } = yield* AiContextService
45
47
  // trackEvent(event)
46
48
  return ret
47
49
  })
@@ -1,13 +1,14 @@
1
1
  import { Effect } from "effect-app"
2
2
  import { pretty } from "effect-app/utils"
3
+ import { InfraLogger } from "../../logger.js"
3
4
  import { Emailer } from "./service.js"
4
5
 
5
- const makeFake = Effect
6
- .logDebug("FAKE Emailer Service enabled")
6
+ const makeFake = InfraLogger
7
+ .logInfo("FAKE Emailer Service enabled")
7
8
  .pipe(Effect.map(() =>
8
9
  Emailer.of({
9
10
  sendMail(msg) {
10
- return Effect
11
+ return InfraLogger
11
12
  .logDebug(`Fake send mail`)
12
13
  .pipe(Effect.annotateLogs("msg", pretty(msg)))
13
14
  }
@@ -10,6 +10,7 @@ import { Effect, Fiber, Option, S, Tracer } from "effect-app"
10
10
  import { RequestId } from "effect-app/ids"
11
11
  import { NonEmptyString255 } from "effect-app/schema"
12
12
  import { pretty } from "effect-app/utils"
13
+ import { InfraLogger } from "../../logger.js"
13
14
 
14
15
  export const QueueId = S.Number.pipe(S.brand("QueueId"))
15
16
  export type QueueId = typeof QueueId.Type
@@ -113,23 +114,21 @@ export function makeSQLQueue<
113
114
  return {
114
115
  publish: (...messages) =>
115
116
  Effect
116
- .gen(function*($) {
117
- const requestContext = yield* $(rcc.requestContext)
118
- const span = yield* $(Effect.serviceOption(Tracer.ParentSpan))
119
- return yield* $(
120
- Effect
121
- .forEach(
122
- messages,
123
- (m) =>
124
- q.offer(m, {
125
- requestContext: new RequestContext(requestContext), // workaround Schema expecting exact class
126
- span: Option.getOrUndefined(span)
127
- }),
128
- {
129
- discard: true
130
- }
131
- )
132
- )
117
+ .gen(function*() {
118
+ const requestContext = yield* rcc.requestContext
119
+ const span = yield* Effect.serviceOption(Tracer.ParentSpan)
120
+ return yield* Effect
121
+ .forEach(
122
+ messages,
123
+ (m) =>
124
+ q.offer(m, {
125
+ requestContext: new RequestContext(requestContext), // workaround Schema expecting exact class
126
+ span: Option.getOrUndefined(span)
127
+ }),
128
+ {
129
+ discard: true
130
+ }
131
+ )
133
132
  })
134
133
  .pipe(
135
134
  Effect.withSpan("queue.publish: " + queueName, {
@@ -149,8 +148,8 @@ export function makeSQLQueue<
149
148
  .succeed(msg)
150
149
  .pipe(Effect
151
150
  .flatMap(({ body, meta }) => {
152
- let effect = Effect
153
- .logDebug(`[${queueDrainName}] Processing incoming message`)
151
+ let effect = InfraLogger
152
+ .logInfo(`[${queueDrainName}] Processing incoming message`)
154
153
  .pipe(
155
154
  Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
156
155
  Effect.zipRight(handleEvent(body)),
@@ -6,6 +6,7 @@ import { Effect, Fiber, flow, Option, S } from "effect-app"
6
6
  import { RequestId } from "effect-app/ids"
7
7
  import { pretty } from "effect-app/utils"
8
8
  import { setupRequestContext } from "../../api/setupRequest.js"
9
+ import { InfraLogger } from "../../logger.js"
9
10
  import { RequestContextContainer } from "../RequestContextContainer.js"
10
11
  import { reportNonInterruptedFailure } from "./errors.js"
11
12
  import { type QueueBase, QueueMeta } from "./service.js"
@@ -24,11 +25,11 @@ export function makeMemQueue<
24
25
  schema: S.Schema<Evt, EvtE>,
25
26
  drainSchema: S.Schema<DrainEvt, DrainEvtE>
26
27
  ) {
27
- return Effect.gen(function*($) {
28
- const mem = yield* $(MemQueue)
29
- const q = yield* $(mem.getOrCreateQueue(queueName))
30
- const qDrain = yield* $(mem.getOrCreateQueue(queueDrainName))
31
- const rcc = yield* $(RequestContextContainer)
28
+ return Effect.gen(function*() {
29
+ const mem = yield* MemQueue
30
+ const q = yield* mem.getOrCreateQueue(queueName)
31
+ const qDrain = yield* mem.getOrCreateQueue(queueDrainName)
32
+ const rcc = yield* RequestContextContainer
32
33
 
33
34
  const wireSchema = S.Struct({ body: schema, meta: QueueMeta })
34
35
  const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
@@ -37,21 +38,19 @@ export function makeMemQueue<
37
38
  return {
38
39
  publish: (...messages) =>
39
40
  Effect
40
- .gen(function*($) {
41
- const requestContext = yield* $(rcc.requestContext)
42
- const span = yield* $(Effect.serviceOption(Tracer.ParentSpan))
43
- return yield* $(
44
- Effect
45
- .forEach(messages, (m) =>
46
- // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
47
- S.encode(wireSchema)({ body: m, meta: { requestContext, span: Option.getOrUndefined(span) } }).pipe(
48
- Effect.orDie,
49
- Effect
50
- .andThen(JSON.stringify),
51
- // .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
52
- Effect.flatMap((_) => q.offer(_))
53
- ), { discard: true })
54
- )
41
+ .gen(function*() {
42
+ const requestContext = yield* rcc.requestContext
43
+ const span = yield* Effect.serviceOption(Tracer.ParentSpan)
44
+ return yield* Effect
45
+ .forEach(messages, (m) =>
46
+ // we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
47
+ S.encode(wireSchema)({ body: m, meta: { requestContext, span: Option.getOrUndefined(span) } }).pipe(
48
+ Effect.orDie,
49
+ Effect
50
+ .andThen(JSON.stringify),
51
+ // .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
52
+ Effect.flatMap((_) => q.offer(_))
53
+ ), { discard: true })
55
54
  })
56
55
  .pipe(
57
56
  Effect.withSpan("queue.publish: " + queueName, {
@@ -64,7 +63,7 @@ export function makeMemQueue<
64
63
  handleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>,
65
64
  sessionId?: string
66
65
  ) =>
67
- Effect.gen(function*($) {
66
+ Effect.gen(function*() {
68
67
  const silenceAndReportError = reportNonInterruptedFailure({ name: "MemQueue.drain." + queueDrainName })
69
68
  const processMessage = (msg: string) =>
70
69
  // we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
@@ -75,8 +74,8 @@ export function makeMemQueue<
75
74
  Effect.orDie,
76
75
  Effect
77
76
  .flatMap(({ body, meta }) => {
78
- let effect = Effect
79
- .logDebug(`[${queueDrainName}] Processing incoming message`)
77
+ let effect = InfraLogger
78
+ .logInfo(`[${queueDrainName}] Processing incoming message`)
80
79
  .pipe(
81
80
  Effect.annotateLogs({ body: pretty(body), meta: pretty(meta) }),
82
81
  Effect.zipRight(handleEvent(body)),
@@ -107,19 +106,17 @@ export function makeMemQueue<
107
106
  return effect
108
107
  })
109
108
  )
110
- return yield* $(
111
- qDrain
112
- .take
113
- .pipe(
114
- Effect.flatMap((x) =>
115
- processMessage(x).pipe(Effect.uninterruptible, Effect.fork, Effect.flatMap(Fiber.join))
116
- ),
117
- // TODO: normally a failed item would be returned to the queue and retried up to X times.
118
- // .flatMap(_ => _._tag === "Failure" && !isInterrupted ? qDrain.offer(x) : Effect.unit) // TODO: retry count tracking and max retries.
119
- silenceAndReportError,
120
- Effect.forever
121
- )
122
- )
109
+ return yield* qDrain
110
+ .take
111
+ .pipe(
112
+ Effect.flatMap((x) =>
113
+ processMessage(x).pipe(Effect.uninterruptible, Effect.fork, Effect.flatMap(Fiber.join))
114
+ ),
115
+ // TODO: normally a failed item would be returned to the queue and retried up to X times.
116
+ // .flatMap(_ => _._tag === "Failure" && !isInterrupted ? qDrain.offer(x) : Effect.unit) // TODO: retry count tracking and max retries.
117
+ silenceAndReportError,
118
+ Effect.forever
119
+ )
123
120
  })
124
121
  } satisfies QueueBase<Evt, DrainEvt>
125
122
  })
@@ -14,6 +14,7 @@ import type { StringId } from "effect-app/schema"
14
14
  import { NonEmptyString255 } from "effect-app/schema"
15
15
  import { pretty } from "effect-app/utils"
16
16
  import { setupRequestContext } from "../../api/setupRequest.js"
17
+ import { InfraLogger } from "../../logger.js"
17
18
  import { RequestContextContainer } from "../RequestContextContainer.js"
18
19
  import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
19
20
  import { type QueueBase, QueueMeta } from "./service.js"
@@ -39,16 +40,16 @@ export function makeServiceBusQueue<
39
40
  const drainW = S.Struct({ body: drainSchema, meta: QueueMeta })
40
41
  const parseDrain = flow(S.decodeUnknown(drainW), Effect.orDie)
41
42
 
42
- return Effect.gen(function*($) {
43
- const s = yield* $(Sender)
44
- const receiver = yield* $(ServiceBusReceiverFactory)
43
+ return Effect.gen(function*() {
44
+ const s = yield* Sender
45
+ const receiver = yield* ServiceBusReceiverFactory
45
46
  const silenceAndReportError = reportNonInterruptedFailure({ name: "ServiceBusQueue.drain." + queueDrainName })
46
47
  const reportError = reportNonInterruptedFailureCause({ name: "ServiceBusQueue.drain." + queueDrainName })
47
- const rcc = yield* $(RequestContextContainer)
48
+ const rcc = yield* RequestContextContainer
48
49
 
49
50
  // TODO: or do async?
50
51
  // This will make sure that the host receives the error (MainFiberSet.join), who will then interrupt everything and commence a shutdown and restart of app
51
- // const deferred = yield* $(Deferred.make<never, ServiceBusError | Error>())
52
+ // const deferred = yield* Deferred.make<never, ServiceBusError | Error>()
52
53
 
53
54
  return {
54
55
  drain: <DrainE, DrainR>(
@@ -56,7 +57,7 @@ export function makeServiceBusQueue<
56
57
  sessionId?: string
57
58
  ) =>
58
59
  Effect
59
- .gen(function*($) {
60
+ .gen(function*() {
60
61
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
62
  function processMessage(messageBody: any) {
62
63
  return Effect
@@ -66,8 +67,8 @@ export function makeServiceBusQueue<
66
67
  Effect.orDie,
67
68
  Effect
68
69
  .flatMap(({ body, meta }) => {
69
- let effect = Effect
70
- .logDebug(`[${queueDrainName}] Processing incoming message`)
70
+ let effect = InfraLogger
71
+ .logInfo(`[${queueDrainName}] Processing incoming message`)
71
72
  .pipe(
72
73
  Effect.annotateLogs({
73
74
  body: pretty(body),
@@ -113,46 +114,42 @@ export function makeServiceBusQueue<
113
114
  )
114
115
  }
115
116
 
116
- return yield* $(
117
- subscribe({
118
- processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
119
- processError: (err) => reportQueueError(Cause.fail(err.error))
120
- // Deferred.completeWith(
121
- // deferred,
122
- // reportFatalQueueError(Cause.fail(err.error))
123
- // .pipe(Effect.andThen(Effect.fail(err.error)))
124
- // )
125
- }, sessionId)
126
- .pipe(Effect.provideService(ServiceBusReceiverFactory, receiver))
127
- )
117
+ return yield* subscribe({
118
+ processMessage: (x) => processMessage(x.body).pipe(Effect.uninterruptible),
119
+ processError: (err) => reportQueueError(Cause.fail(err.error))
120
+ // Deferred.completeWith(
121
+ // deferred,
122
+ // reportFatalQueueError(Cause.fail(err.error))
123
+ // .pipe(Effect.andThen(Effect.fail(err.error)))
124
+ // )
125
+ }, sessionId)
126
+ .pipe(Effect.provideService(ServiceBusReceiverFactory, receiver))
128
127
  })
129
128
  // .pipe(Effect.andThen(Deferred.await(deferred).pipe(Effect.orDie))),
130
129
  .pipe(Effect.andThen(Effect.never)),
131
130
 
132
131
  publish: (...messages) =>
133
132
  Effect
134
- .gen(function*($) {
135
- const requestContext = yield* $(rcc.requestContext)
136
- const span = yield* $(Effect.serviceOption(Tracer.ParentSpan))
137
- return yield* $(
138
- Effect
139
- .promise((abortSignal) =>
140
- s.sendMessages(
141
- messages.map((m) => ({
142
- body: JSON.stringify(
143
- S.encodeSync(wireSchema)({
144
- body: m,
145
- meta: { requestContext, span: Option.getOrUndefined(span) }
146
- })
147
- ),
148
- messageId: m.id, /* correllationid: requestId */
149
- contentType: "application/json",
150
- sessionId: "sessionId" in m ? m.sessionId : undefined
151
- })),
152
- { abortSignal }
153
- )
133
+ .gen(function*() {
134
+ const requestContext = yield* rcc.requestContext
135
+ const span = yield* Effect.serviceOption(Tracer.ParentSpan)
136
+ return yield* Effect
137
+ .promise((abortSignal) =>
138
+ s.sendMessages(
139
+ messages.map((m) => ({
140
+ body: JSON.stringify(
141
+ S.encodeSync(wireSchema)({
142
+ body: m,
143
+ meta: { requestContext, span: Option.getOrUndefined(span) }
144
+ })
145
+ ),
146
+ messageId: m.id, /* correllationid: requestId */
147
+ contentType: "application/json",
148
+ sessionId: "sessionId" in m ? m.sessionId : undefined
149
+ })),
150
+ { abortSignal }
154
151
  )
155
- )
152
+ )
156
153
  })
157
154
  .pipe(Effect.withSpan("queue.publish: " + queueName, {
158
155
  captureStackTrace: false,