@effect-app/infra 3.10.0 → 4.0.0-beta.0

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 (231) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/_check.sh +3 -0
  3. package/dist/CUPS.d.ts +22 -12
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +28 -29
  6. package/dist/Emailer/Sendgrid.js +13 -12
  7. package/dist/Emailer/service.d.ts +3 -13
  8. package/dist/Emailer/service.d.ts.map +1 -1
  9. package/dist/Emailer/service.js +3 -3
  10. package/dist/MainFiberSet.d.ts +18 -41
  11. package/dist/MainFiberSet.d.ts.map +1 -1
  12. package/dist/MainFiberSet.js +10 -10
  13. package/dist/Model/Repository/ext.d.ts.map +1 -1
  14. package/dist/Model/Repository/ext.js +13 -10
  15. package/dist/Model/Repository/internal/internal.d.ts +5 -5
  16. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  17. package/dist/Model/Repository/internal/internal.js +52 -42
  18. package/dist/Model/Repository/legacy.d.ts +9 -9
  19. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  20. package/dist/Model/Repository/makeRepo.d.ts +4 -4
  21. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  22. package/dist/Model/Repository/makeRepo.js +1 -1
  23. package/dist/Model/Repository/service.d.ts +11 -11
  24. package/dist/Model/Repository/service.d.ts.map +1 -1
  25. package/dist/Model/Repository/validation.d.ts +17 -47
  26. package/dist/Model/Repository/validation.d.ts.map +1 -1
  27. package/dist/Model/Repository/validation.js +2 -2
  28. package/dist/Model/query/dsl.d.ts +22 -22
  29. package/dist/Model/query/dsl.d.ts.map +1 -1
  30. package/dist/Model/query/dsl.js +1 -1
  31. package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
  32. package/dist/Model/query/new-kid-interpreter.js +7 -7
  33. package/dist/Operations.d.ts +22 -63
  34. package/dist/Operations.d.ts.map +1 -1
  35. package/dist/Operations.js +14 -14
  36. package/dist/OperationsRepo.d.ts +23 -7
  37. package/dist/OperationsRepo.d.ts.map +1 -1
  38. package/dist/OperationsRepo.js +4 -5
  39. package/dist/QueueMaker/SQLQueue.d.ts +6 -8
  40. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  41. package/dist/QueueMaker/SQLQueue.js +20 -24
  42. package/dist/QueueMaker/errors.js +1 -1
  43. package/dist/QueueMaker/memQueue.d.ts +2 -5
  44. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  45. package/dist/QueueMaker/memQueue.js +22 -26
  46. package/dist/QueueMaker/sbqueue.d.ts +2 -5
  47. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  48. package/dist/QueueMaker/sbqueue.js +24 -28
  49. package/dist/RequestContext.d.ts +28 -41
  50. package/dist/RequestContext.d.ts.map +1 -1
  51. package/dist/RequestContext.js +4 -4
  52. package/dist/RequestFiberSet.d.ts +23 -50
  53. package/dist/RequestFiberSet.d.ts.map +1 -1
  54. package/dist/RequestFiberSet.js +14 -14
  55. package/dist/Store/ContextMapContainer.d.ts +4 -4
  56. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  57. package/dist/Store/ContextMapContainer.js +5 -5
  58. package/dist/Store/Cosmos.d.ts.map +1 -1
  59. package/dist/Store/Cosmos.js +21 -28
  60. package/dist/Store/Disk.d.ts.map +1 -1
  61. package/dist/Store/Disk.js +12 -16
  62. package/dist/Store/Memory.d.ts +2 -2
  63. package/dist/Store/Memory.d.ts.map +1 -1
  64. package/dist/Store/Memory.js +25 -33
  65. package/dist/Store/index.js +2 -2
  66. package/dist/Store/service.d.ts +9 -34
  67. package/dist/Store/service.d.ts.map +1 -1
  68. package/dist/Store/service.js +4 -4
  69. package/dist/Store/utils.d.ts.map +1 -1
  70. package/dist/Store/utils.js +10 -2
  71. package/dist/adapters/SQL/Model.d.ts +106 -162
  72. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  73. package/dist/adapters/SQL/Model.js +92 -130
  74. package/dist/adapters/ServiceBus.d.ts +13 -44
  75. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  76. package/dist/adapters/ServiceBus.js +13 -15
  77. package/dist/adapters/cosmos-client.d.ts +7 -3
  78. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  79. package/dist/adapters/cosmos-client.js +5 -4
  80. package/dist/adapters/logger.d.ts +1 -1
  81. package/dist/adapters/logger.d.ts.map +1 -1
  82. package/dist/adapters/memQueue.d.ts +8 -21
  83. package/dist/adapters/memQueue.d.ts.map +1 -1
  84. package/dist/adapters/memQueue.js +4 -4
  85. package/dist/adapters/mongo-client.d.ts +6 -6
  86. package/dist/adapters/mongo-client.d.ts.map +1 -1
  87. package/dist/adapters/mongo-client.js +5 -4
  88. package/dist/adapters/redis-client.d.ts +14 -4
  89. package/dist/adapters/redis-client.d.ts.map +1 -1
  90. package/dist/adapters/redis-client.js +19 -18
  91. package/dist/api/ContextProvider.d.ts +10 -15
  92. package/dist/api/ContextProvider.d.ts.map +1 -1
  93. package/dist/api/ContextProvider.js +8 -8
  94. package/dist/api/codec.d.ts +1 -1
  95. package/dist/api/codec.d.ts.map +1 -1
  96. package/dist/api/codec.js +1 -1
  97. package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
  98. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  99. package/dist/api/internal/auth.d.ts +3 -3
  100. package/dist/api/internal/auth.d.ts.map +1 -1
  101. package/dist/api/internal/auth.js +8 -8
  102. package/dist/api/internal/events.d.ts +2 -2
  103. package/dist/api/internal/events.d.ts.map +1 -1
  104. package/dist/api/internal/events.js +9 -9
  105. package/dist/api/internal/health.d.ts +1 -1
  106. package/dist/api/internal/health.d.ts.map +1 -1
  107. package/dist/api/internal/health.js +2 -2
  108. package/dist/api/layerUtils.d.ts +14 -14
  109. package/dist/api/layerUtils.d.ts.map +1 -1
  110. package/dist/api/layerUtils.js +5 -5
  111. package/dist/api/middlewares.d.ts +0 -75
  112. package/dist/api/middlewares.d.ts.map +1 -1
  113. package/dist/api/middlewares.js +6 -51
  114. package/dist/api/reportError.js +4 -4
  115. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
  116. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  117. package/dist/api/routing/middleware/middleware.d.ts +6 -7
  118. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  119. package/dist/api/routing/middleware/middleware.js +9 -13
  120. package/dist/api/routing/schema/jwt.d.ts +1 -1
  121. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  122. package/dist/api/routing/schema/jwt.js +5 -4
  123. package/dist/api/routing/utils.d.ts +2 -2
  124. package/dist/api/routing/utils.d.ts.map +1 -1
  125. package/dist/api/routing/utils.js +10 -8
  126. package/dist/api/routing.d.ts +39 -37
  127. package/dist/api/routing.d.ts.map +1 -1
  128. package/dist/api/routing.js +17 -21
  129. package/dist/api/setupRequest.d.ts +4 -6
  130. package/dist/api/setupRequest.d.ts.map +1 -1
  131. package/dist/api/setupRequest.js +10 -9
  132. package/dist/arbs.d.ts +3 -3
  133. package/dist/arbs.d.ts.map +1 -1
  134. package/dist/arbs.js +2 -2
  135. package/dist/errorReporter.d.ts +1 -1
  136. package/dist/errorReporter.d.ts.map +1 -1
  137. package/dist/errorReporter.js +12 -12
  138. package/dist/fileUtil.d.ts +6 -6
  139. package/dist/fileUtil.d.ts.map +1 -1
  140. package/dist/logger/jsonLogger.d.ts.map +1 -1
  141. package/dist/logger/jsonLogger.js +19 -18
  142. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  143. package/dist/logger/logFmtLogger.js +11 -13
  144. package/dist/logger/shared.d.ts +2 -2
  145. package/dist/logger/shared.d.ts.map +1 -1
  146. package/dist/logger/shared.js +7 -9
  147. package/dist/logger.d.ts +1 -1
  148. package/dist/logger.d.ts.map +1 -1
  149. package/dist/rateLimit.d.ts +2 -2
  150. package/dist/rateLimit.d.ts.map +1 -1
  151. package/dist/rateLimit.js +5 -5
  152. package/dist/test.d.ts +2 -2
  153. package/dist/test.d.ts.map +1 -1
  154. package/dist/test.js +6 -24
  155. package/package.json +19 -22
  156. package/src/CUPS.ts +15 -14
  157. package/src/Emailer/Sendgrid.ts +15 -13
  158. package/src/Emailer/service.ts +3 -3
  159. package/src/MainFiberSet.ts +16 -12
  160. package/src/Model/Repository/ext.ts +18 -16
  161. package/src/Model/Repository/internal/internal.ts +80 -69
  162. package/src/Model/Repository/legacy.ts +9 -9
  163. package/src/Model/Repository/makeRepo.ts +5 -5
  164. package/src/Model/Repository/service.ts +12 -12
  165. package/src/Model/Repository/validation.ts +1 -1
  166. package/src/Model/query/dsl.ts +13 -13
  167. package/src/Model/query/new-kid-interpreter.ts +8 -8
  168. package/src/Operations.ts +17 -14
  169. package/src/OperationsRepo.ts +3 -4
  170. package/src/QueueMaker/SQLQueue.ts +86 -89
  171. package/src/QueueMaker/errors.ts +1 -1
  172. package/src/QueueMaker/memQueue.ts +90 -91
  173. package/src/QueueMaker/sbqueue.ts +90 -92
  174. package/src/RequestContext.ts +3 -3
  175. package/src/RequestFiberSet.ts +17 -15
  176. package/src/Store/ContextMapContainer.ts +4 -4
  177. package/src/Store/Cosmos.ts +20 -27
  178. package/src/Store/Disk.ts +13 -17
  179. package/src/Store/Memory.ts +28 -34
  180. package/src/Store/index.ts +1 -1
  181. package/src/Store/service.ts +4 -4
  182. package/src/Store/utils.ts +9 -5
  183. package/src/adapters/SQL/Model.ts +255 -268
  184. package/src/adapters/ServiceBus.ts +17 -20
  185. package/src/adapters/cosmos-client.ts +5 -5
  186. package/src/adapters/memQueue.ts +3 -3
  187. package/src/adapters/mongo-client.ts +5 -5
  188. package/src/adapters/redis-client.ts +25 -19
  189. package/src/api/ContextProvider.ts +24 -34
  190. package/src/api/codec.ts +1 -1
  191. package/src/api/internal/auth.ts +11 -13
  192. package/src/api/internal/events.ts +11 -11
  193. package/src/api/internal/health.ts +1 -1
  194. package/src/api/layerUtils.ts +20 -20
  195. package/src/api/middlewares.ts +0 -97
  196. package/src/api/reportError.ts +3 -3
  197. package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
  198. package/src/api/routing/middleware/middleware.ts +13 -25
  199. package/src/api/routing/schema/jwt.ts +9 -7
  200. package/src/api/routing/utils.ts +12 -10
  201. package/src/api/routing.ts +77 -79
  202. package/src/api/setupRequest.ts +9 -8
  203. package/src/arbs.ts +3 -3
  204. package/src/errorReporter.ts +12 -12
  205. package/src/logger/jsonLogger.ts +18 -17
  206. package/src/logger/logFmtLogger.ts +10 -12
  207. package/src/logger/shared.ts +6 -8
  208. package/src/rateLimit.ts +7 -7
  209. package/src/test.ts +7 -29
  210. package/test/contextProvider.test.ts +77 -70
  211. package/test/controller.test.ts +51 -39
  212. package/test/dist/contextProvider.test.d.ts.map +1 -1
  213. package/test/dist/controller.test.d.ts.map +1 -1
  214. package/test/dist/fixtures.d.ts +33 -81
  215. package/test/dist/fixtures.d.ts.map +1 -1
  216. package/test/dist/fixtures.js +9 -8
  217. package/test/dist/query.test.d.ts.map +1 -1
  218. package/test/dist/rawQuery.test.d.ts.map +1 -1
  219. package/test/dist/requires.test.d.ts.map +1 -1
  220. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  221. package/test/fixtures.ts +9 -7
  222. package/test/query.test.ts +49 -41
  223. package/test/rawQuery.test.ts +44 -40
  224. package/test/requires.test.ts +40 -31
  225. package/test/rpc-multi-middleware.test.ts +13 -14
  226. package/test/validateSample.test.ts +2 -2
  227. package/tsconfig.json +1 -27
  228. package/dist/api/internal/middlewares.d.ts +0 -15
  229. package/dist/api/internal/middlewares.d.ts.map +0 -1
  230. package/dist/api/internal/middlewares.js +0 -168
  231. package/src/api/internal/middlewares.ts +0 -279
package/src/CUPS.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type FileOptions, tempFile } from "@effect-app/infra/fileUtil"
2
2
  import cp from "child_process"
3
- import { Config, Effect, Layer, Predicate, S } from "effect-app"
3
+ import { Config, Effect, Layer, Option, Predicate, S, ServiceMap } from "effect-app"
4
4
  import { pretty } from "effect-app/utils"
5
5
  import fs from "fs"
6
6
  import os from "os"
@@ -79,7 +79,7 @@ function getAvailablePrinters(host?: string) {
79
79
  const { stdout } = yield* exec(["lpstat", ...buildListArgs({ host }), "-s"].join(" "))
80
80
  return [...stdout.matchAll(/device for (\w+):/g)]
81
81
  .map((_) => _[1])
82
- .filter(Predicate.isNotNullable)
82
+ .filter(Predicate.isNotNullish)
83
83
  .map((_) => S.NonEmptyString255(_))
84
84
  })
85
85
  }
@@ -100,13 +100,14 @@ export const CUPSConfig = Config.all({
100
100
  )
101
101
  })
102
102
 
103
- export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
104
- effect: Effect.gen(function*() {
103
+ export class CUPS extends ServiceMap.Service<CUPS>()("effect-app/CUPS", {
104
+ make: Effect.gen(function*() {
105
105
  const config = yield* CUPSConfig
106
+ const serverUrl = Option.getOrUndefined(config.server)
106
107
  function print(buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) {
107
108
  const _print = printBuffer({
108
109
  id: printerId,
109
- url: config.server.value
110
+ url: serverUrl
110
111
  }, options)
111
112
  return _print(buffer)
112
113
  }
@@ -115,21 +116,21 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
115
116
  printFile: (filePath: string, printerId: PrinterId, ...options: string[]) =>
116
117
  printFile({
117
118
  id: printerId,
118
- url: config.server.value
119
+ url: serverUrl
119
120
  }, options)(filePath),
120
- getAvailablePrinters: getAvailablePrinters(config.server.value?.host)
121
+ getAvailablePrinters: getAvailablePrinters(serverUrl?.host)
121
122
  }
122
123
  })
123
124
  }) {
124
125
  static readonly Fake = Layer.effect(
125
126
  this,
126
- Effect.sync(() => {
127
- return this.make({
128
- print: (buffer, printerId, ...options) =>
127
+ Effect.sync(() =>
128
+ CUPS.of({
129
+ print: (buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) =>
129
130
  InfraLogger
130
131
  .logInfo("Printing to fake printer")
131
132
  .pipe(
132
- Effect.zipRight(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
133
+ Effect.andThen(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
133
134
  Effect
134
135
  .annotateLogs({
135
136
  printerId,
@@ -137,11 +138,11 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
137
138
  "bufferSize": buffer.byteLength.toString()
138
139
  })
139
140
  ),
140
- printFile: (filePath, printerId, ...options) =>
141
+ printFile: (filePath: string, printerId: PrinterId, ...options: string[]) =>
141
142
  InfraLogger
142
143
  .logInfo("Printing to fake printer")
143
144
  .pipe(
144
- Effect.zipRight(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
145
+ Effect.andThen(Effect.sync(() => ({ stdout: "fake", stderr: "" }))),
145
146
  Effect
146
147
  .annotateLogs({
147
148
  printerId,
@@ -151,6 +152,6 @@ export class CUPS extends Effect.Service<CUPS>()("effect-app/CUPS", {
151
152
  ),
152
153
  getAvailablePrinters: Effect.sync(() => [])
153
154
  })
154
- })
155
+ )
155
156
  )
156
157
  }
@@ -31,18 +31,18 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
31
31
  yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
32
32
 
33
33
  const ret = yield* Effect
34
- .async<
34
+ .callback<
35
35
  [sgMail.ClientResponse, Record<string, unknown>],
36
36
  Error | sgMail.ResponseError
37
37
  >(
38
- (cb) =>
38
+ (resume) =>
39
39
  void sgMail.send(
40
40
  renderedMsg as any, // sue me
41
41
  msg.isMultiple ?? true,
42
42
  (err, result) =>
43
43
  err
44
- ? cb(Effect.fail(err))
45
- : cb(Effect.sync(() => result))
44
+ ? resume(Effect.fail(err))
45
+ : resume(Effect.sync(() => result!))
46
46
  )
47
47
  )
48
48
  .pipe(Effect.mapError((raw) => new SendMailError({ raw })))
@@ -107,26 +107,28 @@ function renderFake(addr: EmailData | readonly EmailData[], makeId: () => number
107
107
  }
108
108
  }
109
109
  const eq = Equivalence.mapInput(
110
- Equivalence.string,
110
+ Equivalence.String,
111
111
  (to: { name?: string; email: string } | string) => typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase()
112
112
  )
113
113
 
114
+ function isEmailDataArray(md: EmailData | readonly EmailData[]): md is readonly EmailData[] {
115
+ return globalThis.Array.isArray(md)
116
+ }
117
+
114
118
  // TODO: should just not add any already added email address
115
119
  // https://stackoverflow.com/a/53603076/11595834
116
120
  function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeId: () => number) {
117
- return Array.isArray(addr)
118
- ? Array.dedupeWith(
119
- addr
120
- .map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
121
+ if (isEmailDataArray(addr)) {
122
+ return Array.dedupeWith(
123
+ addr.map((x) => (isTestAddress(x) ? renderFake(x, makeId) : x)),
121
124
  eq
122
125
  )
123
- : isTestAddress(addr)
124
- ? renderFake(addr, makeId)
125
- : addr
126
+ }
127
+ return isTestAddress(addr) ? renderFake(addr, makeId) : addr
126
128
  }
127
129
 
128
130
  function renderMailData(md: EmailData | readonly EmailData[]): string {
129
- if (Array.isArray(md)) {
131
+ if (isEmailDataArray(md)) {
130
132
  return md.map(renderMailData).join(", ")
131
133
  }
132
134
  if (typeof md === "string") {
@@ -1,15 +1,15 @@
1
1
  import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
2
2
  import type { ResponseError } from "@sendgrid/mail"
3
- import { Context, Data, type Effect, type NonEmptyReadonlyArray, type Redacted } from "effect-app"
3
+ import { Data, type Effect, type NonEmptyReadonlyArray, type Redacted, ServiceMap } from "effect-app"
4
4
  import type { Email } from "effect-app/Schema"
5
5
 
6
6
  export class SendMailError extends Data.TaggedError("SendMailError")<{
7
7
  readonly raw: Error | ResponseError
8
8
  }> {}
9
9
 
10
- export class Emailer extends Context.TagId("effect-app/Emailer")<Emailer, {
10
+ export class Emailer extends ServiceMap.Opaque<Emailer, {
11
11
  sendMail: (msg: EmailMsgOptionalFrom) => Effect.Effect<void, SendMailError>
12
- }>() {}
12
+ }>()("effect-app/Emailer") {}
13
13
 
14
14
  export type EmailData = Email | {
15
15
  name?: string
@@ -1,16 +1,15 @@
1
- import { Context, Effect, Fiber, FiberSet, Layer } from "effect-app"
1
+ import { Effect, Fiber, FiberSet, Layer, ServiceMap } from "effect-app"
2
2
  import type {} from "effect/Scope"
3
- import type {} from "effect/Context"
4
3
  import { InfraLogger } from "./logger.js"
5
4
  import { reportNonInterruptedFailureCause } from "./QueueMaker/errors.js"
6
5
  import { setRootParentSpan } from "./RequestFiberSet.js"
7
6
 
8
7
  const make = Effect.gen(function*() {
9
8
  const set = yield* FiberSet.make<unknown, never>()
10
- const add = (...fibers: Fiber.RuntimeFiber<never, never>[]) =>
11
- Effect.sync(() => fibers.forEach((_) => FiberSet.unsafeAdd(set, _)))
12
- const addAll = (fibers: readonly Fiber.RuntimeFiber<never, never>[]) =>
13
- Effect.sync(() => fibers.forEach((_) => FiberSet.unsafeAdd(set, _)))
9
+ const add = (...fibers: Fiber.Fiber<never, never>[]) =>
10
+ Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
11
+ const addAll = (fibers: readonly Fiber.Fiber<never, never>[]) =>
12
+ Effect.sync(() => fibers.forEach((_) => FiberSet.addUnsafe(set, _)))
14
13
  const join = FiberSet.size(set).pipe(
15
14
  Effect.andThen((count) => InfraLogger.logDebug(`Joining ${count} current fibers on the MainFiberSet`)),
16
15
  Effect.andThen(FiberSet.join(set))
@@ -42,7 +41,7 @@ const make = Effect.gen(function*() {
42
41
  function forkDaemonReport<A, E, R>(self: Effect.Effect<A, E, R>) {
43
42
  return self.pipe(
44
43
  Effect.asVoid,
45
- Effect.catchAllCause(reportNonInterruptedFailureCause({})),
44
+ Effect.catchCause(reportNonInterruptedFailureCause({})),
46
45
  setRootParentSpan,
47
46
  Effect.uninterruptible,
48
47
  run
@@ -63,10 +62,15 @@ const make = Effect.gen(function*() {
63
62
  * you should register these long running fibers in a FiberSet, and join them at the end of your main program.
64
63
  * This way any errors will blow up the main program instead of fibers dying unknowingly.
65
64
  */
66
- export class MainFiberSet extends Context.TagMakeId("MainFiberSet", make)<MainFiberSet>() {
67
- static readonly Live = this.toLayerScoped()
68
- static readonly JoinLive = this.pipe(Effect.andThen((_) => _.join), Layer.effectDiscard, Layer.provide(this.Live))
69
- static readonly run = <A, R>(self: Effect.Effect<A, never, R>) => this.use((_) => _.run(self))
65
+ export class MainFiberSet extends ServiceMap.Service<MainFiberSet>()("MainFiberSet", { make }) {
66
+ static readonly Live = Layer.effect(this, this.make)
67
+ static readonly JoinLive = this.asEffect().pipe(
68
+ Effect.andThen((_) => _.join),
69
+ Layer.effectDiscard,
70
+ Layer.provide(this.Live)
71
+ )
72
+ static readonly run = <A, R>(self: Effect.Effect<A, never, R>) =>
73
+ this.asEffect().pipe(Effect.andThen((_) => _.run(self)))
70
74
  static readonly forkDaemonReport = <A, E, R>(self: Effect.Effect<A, E, R>) =>
71
- this.use((_) => _.forkDaemonReport(self))
75
+ this.asEffect().pipe(Effect.andThen((_) => _.forkDaemonReport(self)))
72
76
  }
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-return */
3
- import { Array, Effect, Exit, type NonEmptyArray, type NonEmptyReadonlyArray, Option, Request, RequestResolver } from "effect-app"
3
+ import { Array, Effect, Exit, type NonEmptyArray, Option, Request, RequestResolver } from "effect-app"
4
4
  import { type InvalidStateError, NotFoundError, type OptimisticConcurrencyException } from "effect-app/client/errors"
5
5
  import { type FixEnv, type PureEnv, runTerm } from "effect-app/Pure"
6
6
  import { AnyPureDSL } from "../dsl.js"
@@ -21,9 +21,11 @@ export const extendRepo = <
21
21
  repo: Repository<T, Encoded, Evt, ItemType, IdKey, RSchema, RPublish>
22
22
  ) => {
23
23
  const get = (id: T[IdKey]) =>
24
- Effect.flatMap(
25
- repo.find(id),
26
- (_) => Effect.mapError(_, () => new NotFoundError<ItemType>({ type: repo.itemType, id }))
24
+ repo.find(id).pipe(
25
+ Effect.flatMap(Option.match({
26
+ onNone: () => Effect.fail(new NotFoundError<ItemType>({ type: repo.itemType, id })),
27
+ onSome: Effect.succeed
28
+ }))
27
29
  )
28
30
  function saveManyWithPure_<
29
31
  R,
@@ -80,7 +82,7 @@ export const extendRepo = <
80
82
  batchSize = 100
81
83
  ) {
82
84
  return Effect.forEach(
83
- Array.chunk_(items, batchSize),
85
+ Array.chunksOf(items, batchSize),
84
86
  (batch) =>
85
87
  saveAllWithEffectInt(
86
88
  runTerm(pure, batch)
@@ -176,7 +178,7 @@ export const extendRepo = <
176
178
  } = (items, pure, batch?: "batched" | number) =>
177
179
  batch
178
180
  ? Effect.forEach(
179
- Array.chunk_(items, batch === "batched" ? 100 : batch),
181
+ Array.chunksOf(items, batch === "batched" ? 100 : batch),
180
182
  (batch) =>
181
183
  saveAllWithEffectInt(
182
184
  runTerm(pure, batch)
@@ -207,30 +209,30 @@ export const extendRepo = <
207
209
  const _request = Request.tagged<Req>(`Get${repo.itemType}`)
208
210
 
209
211
  const requestResolver = RequestResolver
210
- .makeBatched((
211
- requests: NonEmptyReadonlyArray<Req>
212
+ .make((
213
+ entries: NonEmptyArray<Request.Entry<Req>>,
214
+ _key: unknown
212
215
  ) =>
213
- (repo.query(Q.where(repo.idKey as any, "in" as any, requests.map((_) => _.id)) as any) as Effect.Effect<
216
+ (repo.query(Q.where(repo.idKey as any, "in" as any, entries.map((_) => _.request.id)) as any) as Effect.Effect<
214
217
  readonly T[],
215
218
  never
216
219
  >)
217
220
  // TODO
218
221
  .pipe(
219
222
  Effect.andThen((items) =>
220
- Effect.forEach(requests, (r) =>
223
+ Effect.forEach(entries, (entry) =>
221
224
  Request.complete(
222
- r,
223
225
  Array
224
- .findFirst(items, (_) => _[repo.idKey] === r.id)
226
+ .findFirst(items, (_) => _[repo.idKey] === entry.request.id)
225
227
  .pipe(Option.match({
226
- onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: r.id })),
228
+ onNone: () => Exit.fail(new NotFoundError({ type: repo.itemType, id: entry.request.id })),
227
229
  onSome: Exit.succeed
228
230
  }))
229
- ), { discard: true })
231
+ )(entry), { discard: true })
230
232
  ),
231
233
  Effect
232
- .catchAllCause((cause) =>
233
- Effect.forEach(requests, Request.complete(Exit.failCause(cause)), { discard: true })
234
+ .catchCause((cause) =>
235
+ Effect.forEach(entries, (entry) => Request.complete(Exit.failCause(cause))(entry), { discard: true })
234
236
  )
235
237
  )
236
238
  )