@effect-app/infra 4.0.0-beta.22 → 4.0.0-beta.221

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 (337) hide show
  1. package/CHANGELOG.md +1648 -0
  2. package/_check.sh +1 -1
  3. package/dist/CUPS.d.ts +12 -7
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +16 -12
  6. package/dist/Emailer/Sendgrid.d.ts +15 -15
  7. package/dist/Emailer/Sendgrid.d.ts.map +1 -1
  8. package/dist/Emailer/Sendgrid.js +20 -16
  9. package/dist/Emailer/fake.d.ts +1 -1
  10. package/dist/Emailer/fake.js +2 -2
  11. package/dist/Emailer/service.d.ts +13 -4
  12. package/dist/Emailer/service.d.ts.map +1 -1
  13. package/dist/Emailer/service.js +4 -3
  14. package/dist/Emailer.d.ts +1 -1
  15. package/dist/MainFiberSet.d.ts +12 -9
  16. package/dist/MainFiberSet.d.ts.map +1 -1
  17. package/dist/MainFiberSet.js +7 -3
  18. package/dist/Model/Repository/Registry.d.ts +21 -0
  19. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  20. package/dist/Model/Repository/Registry.js +18 -0
  21. package/dist/Model/Repository/ext.d.ts +35 -16
  22. package/dist/Model/Repository/ext.d.ts.map +1 -1
  23. package/dist/Model/Repository/ext.js +60 -3
  24. package/dist/Model/Repository/internal/internal.d.ts +9 -6
  25. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  26. package/dist/Model/Repository/internal/internal.js +115 -51
  27. package/dist/Model/Repository/legacy.d.ts +4 -2
  28. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  29. package/dist/Model/Repository/makeRepo.d.ts +10 -6
  30. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  31. package/dist/Model/Repository/makeRepo.js +5 -2
  32. package/dist/Model/Repository/service.d.ts +32 -24
  33. package/dist/Model/Repository/service.d.ts.map +1 -1
  34. package/dist/Model/Repository/validation.d.ts +47 -18
  35. package/dist/Model/Repository/validation.d.ts.map +1 -1
  36. package/dist/Model/Repository/validation.js +6 -6
  37. package/dist/Model/Repository.d.ts +2 -1
  38. package/dist/Model/Repository.d.ts.map +1 -1
  39. package/dist/Model/Repository.js +2 -1
  40. package/dist/Model/dsl.d.ts +6 -5
  41. package/dist/Model/dsl.d.ts.map +1 -1
  42. package/dist/Model/dsl.js +2 -3
  43. package/dist/Model/filter/filterApi.d.ts +5 -5
  44. package/dist/Model/filter/filterApi.d.ts.map +1 -1
  45. package/dist/Model/filter/types/errors.d.ts +1 -1
  46. package/dist/Model/filter/types/fields.d.ts +1 -1
  47. package/dist/Model/filter/types/path/common.d.ts +1 -1
  48. package/dist/Model/filter/types/path/eager.d.ts +1 -1
  49. package/dist/Model/filter/types/path/eager.d.ts.map +1 -1
  50. package/dist/Model/filter/types/path/eager.js +1 -1
  51. package/dist/Model/filter/types/path/index.d.ts +1 -1
  52. package/dist/Model/filter/types/utils.d.ts +1 -1
  53. package/dist/Model/filter/types/validator.d.ts +1 -1
  54. package/dist/Model/filter/types.d.ts +1 -1
  55. package/dist/Model/query/dsl.d.ts +142 -17
  56. package/dist/Model/query/dsl.d.ts.map +1 -1
  57. package/dist/Model/query/dsl.js +190 -5
  58. package/dist/Model/query/new-kid-interpreter.d.ts +77 -8
  59. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  60. package/dist/Model/query/new-kid-interpreter.js +127 -6
  61. package/dist/Model/query.d.ts +1 -1
  62. package/dist/Model.d.ts +2 -1
  63. package/dist/Model.d.ts.map +1 -1
  64. package/dist/Model.js +2 -1
  65. package/dist/QueueMaker/SQLQueue.d.ts +7 -8
  66. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  67. package/dist/QueueMaker/SQLQueue.js +135 -117
  68. package/dist/QueueMaker/errors.d.ts +5 -3
  69. package/dist/QueueMaker/errors.d.ts.map +1 -1
  70. package/dist/QueueMaker/errors.js +4 -2
  71. package/dist/QueueMaker/memQueue.d.ts +9 -5
  72. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  73. package/dist/QueueMaker/memQueue.js +81 -65
  74. package/dist/QueueMaker/sbqueue.d.ts +8 -4
  75. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  76. package/dist/QueueMaker/sbqueue.js +57 -55
  77. package/dist/QueueMaker/service.d.ts +4 -2
  78. package/dist/QueueMaker/service.d.ts.map +1 -1
  79. package/dist/QueueMaker/service.js +1 -1
  80. package/dist/RequestContext.d.ts +75 -35
  81. package/dist/RequestContext.d.ts.map +1 -1
  82. package/dist/RequestContext.js +14 -14
  83. package/dist/RequestFiberSet.d.ts +10 -7
  84. package/dist/RequestFiberSet.d.ts.map +1 -1
  85. package/dist/RequestFiberSet.js +8 -3
  86. package/dist/Store/ContextMapContainer.d.ts +22 -3
  87. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  88. package/dist/Store/ContextMapContainer.js +17 -3
  89. package/dist/Store/Cosmos/query.d.ts +7 -2
  90. package/dist/Store/Cosmos/query.d.ts.map +1 -1
  91. package/dist/Store/Cosmos/query.js +115 -35
  92. package/dist/Store/Cosmos.d.ts +2 -2
  93. package/dist/Store/Cosmos.d.ts.map +1 -1
  94. package/dist/Store/Cosmos.js +343 -244
  95. package/dist/Store/Disk.d.ts +3 -3
  96. package/dist/Store/Disk.d.ts.map +1 -1
  97. package/dist/Store/Disk.js +76 -36
  98. package/dist/Store/Memory.d.ts +7 -4
  99. package/dist/Store/Memory.d.ts.map +1 -1
  100. package/dist/Store/Memory.js +251 -58
  101. package/dist/Store/SQL/Pg.d.ts +4 -0
  102. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  103. package/dist/Store/SQL/Pg.js +233 -0
  104. package/dist/Store/SQL/query.d.ts +43 -0
  105. package/dist/Store/SQL/query.d.ts.map +1 -0
  106. package/dist/Store/SQL/query.js +478 -0
  107. package/dist/Store/SQL.d.ts +21 -0
  108. package/dist/Store/SQL.d.ts.map +1 -0
  109. package/dist/Store/SQL.js +450 -0
  110. package/dist/Store/codeFilter.d.ts +2 -2
  111. package/dist/Store/codeFilter.d.ts.map +1 -1
  112. package/dist/Store/codeFilter.js +6 -3
  113. package/dist/Store/index.d.ts +6 -3
  114. package/dist/Store/index.d.ts.map +1 -1
  115. package/dist/Store/index.js +18 -4
  116. package/dist/Store/service.d.ts +26 -8
  117. package/dist/Store/service.d.ts.map +1 -1
  118. package/dist/Store/service.js +25 -6
  119. package/dist/Store/utils.d.ts +3 -2
  120. package/dist/Store/utils.d.ts.map +1 -1
  121. package/dist/Store/utils.js +5 -5
  122. package/dist/Store.d.ts +1 -1
  123. package/dist/adapters/SQL/Model.d.ts +32 -43
  124. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  125. package/dist/adapters/SQL/Model.js +30 -39
  126. package/dist/adapters/SQL.d.ts +1 -1
  127. package/dist/adapters/ServiceBus.d.ts +14 -11
  128. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  129. package/dist/adapters/ServiceBus.js +30 -21
  130. package/dist/adapters/cosmos-client.d.ts +5 -3
  131. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  132. package/dist/adapters/cosmos-client.js +5 -3
  133. package/dist/adapters/index.d.ts +8 -2
  134. package/dist/adapters/index.d.ts.map +1 -1
  135. package/dist/adapters/index.js +8 -2
  136. package/dist/adapters/logger.d.ts +2 -2
  137. package/dist/adapters/logger.d.ts.map +1 -1
  138. package/dist/adapters/memQueue.d.ts +5 -3
  139. package/dist/adapters/memQueue.d.ts.map +1 -1
  140. package/dist/adapters/memQueue.js +6 -5
  141. package/dist/adapters/mongo-client.d.ts +4 -3
  142. package/dist/adapters/mongo-client.d.ts.map +1 -1
  143. package/dist/adapters/mongo-client.js +5 -3
  144. package/dist/adapters/redis-client.d.ts +6 -3
  145. package/dist/adapters/redis-client.d.ts.map +1 -1
  146. package/dist/adapters/redis-client.js +7 -3
  147. package/dist/api/ContextProvider.d.ts +12 -8
  148. package/dist/api/ContextProvider.d.ts.map +1 -1
  149. package/dist/api/ContextProvider.js +9 -7
  150. package/dist/api/codec.d.ts +1 -1
  151. package/dist/api/internal/RequestContextMiddleware.d.ts +3 -3
  152. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  153. package/dist/api/internal/RequestContextMiddleware.js +10 -6
  154. package/dist/api/internal/auth.d.ts +45 -7
  155. package/dist/api/internal/auth.d.ts.map +1 -1
  156. package/dist/api/internal/auth.js +162 -29
  157. package/dist/api/internal/events.d.ts +6 -4
  158. package/dist/api/internal/events.d.ts.map +1 -1
  159. package/dist/api/internal/events.js +16 -9
  160. package/dist/api/internal/health.d.ts +1 -1
  161. package/dist/api/layerUtils.d.ts +10 -6
  162. package/dist/api/layerUtils.d.ts.map +1 -1
  163. package/dist/api/layerUtils.js +7 -6
  164. package/dist/api/middlewares.d.ts +1 -1
  165. package/dist/api/reportError.d.ts +2 -2
  166. package/dist/api/reportError.d.ts.map +1 -1
  167. package/dist/api/reportError.js +3 -2
  168. package/dist/api/routing/middleware/RouterMiddleware.d.ts +5 -4
  169. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  170. package/dist/api/routing/middleware/middleware.d.ts +42 -3
  171. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  172. package/dist/api/routing/middleware/middleware.js +53 -17
  173. package/dist/api/routing/middleware.d.ts +1 -2
  174. package/dist/api/routing/middleware.d.ts.map +1 -1
  175. package/dist/api/routing/middleware.js +1 -2
  176. package/dist/api/routing/schema/jwt.d.ts +1 -1
  177. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  178. package/dist/api/routing/schema/jwt.js +3 -2
  179. package/dist/api/routing/tsort.d.ts +1 -1
  180. package/dist/api/routing/tsort.d.ts.map +1 -1
  181. package/dist/api/routing/utils.d.ts +4 -4
  182. package/dist/api/routing/utils.d.ts.map +1 -1
  183. package/dist/api/routing/utils.js +3 -2
  184. package/dist/api/routing.d.ts +84 -37
  185. package/dist/api/routing.d.ts.map +1 -1
  186. package/dist/api/routing.js +115 -45
  187. package/dist/api/setupRequest.d.ts +10 -6
  188. package/dist/api/setupRequest.d.ts.map +1 -1
  189. package/dist/api/setupRequest.js +15 -7
  190. package/dist/api/util.d.ts +1 -1
  191. package/dist/arbs.d.ts +2 -2
  192. package/dist/arbs.d.ts.map +1 -1
  193. package/dist/arbs.js +5 -3
  194. package/dist/errorReporter.d.ts +7 -5
  195. package/dist/errorReporter.d.ts.map +1 -1
  196. package/dist/errorReporter.js +22 -26
  197. package/dist/errors.d.ts +1 -1
  198. package/dist/fileUtil.d.ts +2 -2
  199. package/dist/fileUtil.d.ts.map +1 -1
  200. package/dist/fileUtil.js +2 -2
  201. package/dist/index.d.ts +1 -1
  202. package/dist/logger/jsonLogger.d.ts +2 -2
  203. package/dist/logger/jsonLogger.d.ts.map +1 -1
  204. package/dist/logger/jsonLogger.js +4 -2
  205. package/dist/logger/logFmtLogger.d.ts +2 -2
  206. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  207. package/dist/logger/logFmtLogger.js +2 -2
  208. package/dist/logger/shared.d.ts +2 -2
  209. package/dist/logger/shared.d.ts.map +1 -1
  210. package/dist/logger/shared.js +3 -3
  211. package/dist/logger.d.ts +1 -1
  212. package/dist/logger.d.ts.map +1 -1
  213. package/dist/otel.d.ts +75 -0
  214. package/dist/otel.d.ts.map +1 -0
  215. package/dist/otel.js +65 -0
  216. package/dist/rateLimit.d.ts +12 -4
  217. package/dist/rateLimit.d.ts.map +1 -1
  218. package/dist/rateLimit.js +7 -12
  219. package/dist/test.d.ts +3 -3
  220. package/dist/test.d.ts.map +1 -1
  221. package/dist/test.js +2 -2
  222. package/dist/vitest.d.ts +1 -1
  223. package/examples/query.ts +46 -38
  224. package/package.json +46 -37
  225. package/src/CUPS.ts +15 -11
  226. package/src/Emailer/Sendgrid.ts +21 -15
  227. package/src/Emailer/fake.ts +1 -1
  228. package/src/Emailer/service.ts +13 -3
  229. package/src/MainFiberSet.ts +9 -6
  230. package/src/Model/Repository/Registry.ts +34 -0
  231. package/src/Model/Repository/ext.ts +103 -11
  232. package/src/Model/Repository/internal/internal.ts +231 -149
  233. package/src/Model/Repository/legacy.ts +3 -1
  234. package/src/Model/Repository/makeRepo.ts +15 -10
  235. package/src/Model/Repository/service.ts +35 -23
  236. package/src/Model/Repository/validation.ts +5 -5
  237. package/src/Model/Repository.ts +1 -0
  238. package/src/Model/dsl.ts +5 -4
  239. package/src/Model/filter/types/path/eager.ts +1 -2
  240. package/src/Model/query/dsl.ts +353 -19
  241. package/src/Model/query/new-kid-interpreter.ts +211 -6
  242. package/src/Model.ts +1 -0
  243. package/src/QueueMaker/SQLQueue.ts +150 -153
  244. package/src/QueueMaker/errors.ts +3 -1
  245. package/src/QueueMaker/memQueue.ts +111 -105
  246. package/src/QueueMaker/sbqueue.ts +76 -88
  247. package/src/QueueMaker/service.ts +3 -1
  248. package/src/RequestContext.ts +15 -16
  249. package/src/RequestFiberSet.ts +8 -2
  250. package/src/Store/ContextMapContainer.ts +45 -2
  251. package/src/Store/Cosmos/query.ts +143 -44
  252. package/src/Store/Cosmos.ts +491 -350
  253. package/src/Store/Disk.ts +106 -66
  254. package/src/Store/Memory.ts +285 -87
  255. package/src/Store/SQL/Pg.ts +364 -0
  256. package/src/Store/SQL/query.ts +540 -0
  257. package/src/Store/SQL.ts +736 -0
  258. package/src/Store/codeFilter.ts +5 -2
  259. package/src/Store/index.ts +20 -3
  260. package/src/Store/service.ts +45 -10
  261. package/src/Store/utils.ts +25 -23
  262. package/src/adapters/SQL/Model.ts +42 -41
  263. package/src/adapters/ServiceBus.ts +131 -121
  264. package/src/adapters/cosmos-client.ts +4 -2
  265. package/src/adapters/index.ts +7 -0
  266. package/src/adapters/memQueue.ts +5 -4
  267. package/src/adapters/mongo-client.ts +4 -2
  268. package/src/adapters/redis-client.ts +6 -2
  269. package/src/api/ContextProvider.ts +17 -13
  270. package/src/api/internal/RequestContextMiddleware.ts +16 -5
  271. package/src/api/internal/auth.ts +248 -44
  272. package/src/api/internal/events.ts +19 -10
  273. package/src/api/layerUtils.ts +12 -8
  274. package/src/api/reportError.ts +2 -1
  275. package/src/api/routing/middleware/RouterMiddleware.ts +5 -4
  276. package/src/api/routing/middleware/middleware.ts +60 -15
  277. package/src/api/routing/middleware.ts +0 -2
  278. package/src/api/routing/schema/jwt.ts +2 -1
  279. package/src/api/routing/utils.ts +2 -1
  280. package/src/api/routing.ts +304 -131
  281. package/src/api/setupRequest.ts +31 -8
  282. package/src/arbs.ts +5 -3
  283. package/src/errorReporter.ts +65 -75
  284. package/src/fileUtil.ts +1 -1
  285. package/src/logger/jsonLogger.ts +3 -1
  286. package/src/logger/logFmtLogger.ts +1 -1
  287. package/src/logger/shared.ts +3 -2
  288. package/src/otel.ts +152 -0
  289. package/src/rateLimit.ts +34 -23
  290. package/src/test.ts +2 -2
  291. package/test/auth.test.ts +101 -0
  292. package/test/contextProvider.test.ts +14 -11
  293. package/test/controller.test.ts +25 -29
  294. package/test/dist/auth.test.d.ts.map +1 -0
  295. package/test/dist/contextProvider.test.d.ts.map +1 -1
  296. package/test/dist/controller.test.d.ts.map +1 -1
  297. package/test/dist/date-query.test.d.ts.map +1 -0
  298. package/test/dist/fixtures.d.ts +30 -12
  299. package/test/dist/fixtures.d.ts.map +1 -1
  300. package/test/dist/fixtures.js +17 -10
  301. package/test/dist/query.test.d.ts.map +1 -1
  302. package/test/dist/rawQuery.test.d.ts.map +1 -1
  303. package/test/dist/repository-ext.test.d.ts.map +1 -0
  304. package/test/dist/requires.test.d.ts.map +1 -1
  305. package/test/dist/router-generator.test.d.ts.map +1 -0
  306. package/test/dist/routing-interruptibility.test.d.ts.map +1 -0
  307. package/test/dist/rpc-e2e-invalidation.test.d.ts.map +1 -0
  308. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  309. package/test/dist/rpc-stream-fullstack.test.d.ts.map +1 -0
  310. package/test/dist/sql-store.test.d.ts.map +1 -0
  311. package/test/fixtures.ts +16 -9
  312. package/test/layerUtils.test.ts +1 -1
  313. package/test/query.test.ts +819 -38
  314. package/test/rawQuery.test.ts +312 -20
  315. package/test/repository-ext.test.ts +62 -0
  316. package/test/requires.test.ts +10 -5
  317. package/test/router-generator.test.ts +187 -0
  318. package/test/routing-interruptibility.test.ts +66 -0
  319. package/test/rpc-e2e-invalidation.test.ts +256 -0
  320. package/test/rpc-multi-middleware.test.ts +84 -9
  321. package/test/rpc-stream-fullstack.test.ts +304 -0
  322. package/test/sql-store.test.ts +1592 -0
  323. package/test/validateSample.test.ts +17 -12
  324. package/tsconfig.examples.json +1 -1
  325. package/tsconfig.json +0 -1
  326. package/tsconfig.json.bak +2 -2
  327. package/tsconfig.src.json +35 -35
  328. package/tsconfig.test.json +2 -2
  329. package/dist/Operations.d.ts +0 -55
  330. package/dist/Operations.d.ts.map +0 -1
  331. package/dist/Operations.js +0 -102
  332. package/dist/OperationsRepo.d.ts +0 -41
  333. package/dist/OperationsRepo.d.ts.map +0 -1
  334. package/dist/OperationsRepo.js +0 -14
  335. package/eslint.config.mjs +0 -24
  336. package/src/Operations.ts +0 -235
  337. package/src/OperationsRepo.ts +0 -16
@@ -1,67 +1,69 @@
1
1
  /* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
2
2
  import { type OperationOptionsBase, type ProcessErrorArgs, ServiceBusClient, type ServiceBusMessage, type ServiceBusMessageBatch, type ServiceBusReceivedMessage, type ServiceBusReceiver } from "@azure/service-bus"
3
- import { Cause, Effect, Exit, FiberSet, Layer, type Scope, ServiceMap } from "effect-app"
3
+ import * as Context from "effect-app/Context"
4
+ import * as Effect from "effect-app/Effect"
5
+ import * as Layer from "effect-app/Layer"
6
+ import * as Cause from "effect/Cause"
7
+ import * as Exit from "effect/Exit"
8
+ import * as FiberSet from "effect/FiberSet"
9
+ import type * as Scope from "effect/Scope"
4
10
  import { InfraLogger } from "../logger.js"
5
11
 
6
- const withSpanAndLog = (name: string) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
12
+ const logged = (name: string) => <A, E, R>(self: Effect.Effect<A, E, R>) =>
7
13
  Effect.logInfo(name).pipe(
8
14
  Effect.andThen(self),
9
15
  Effect.tap(Effect.logInfo(name + " done")),
10
- Effect.withLogSpan(name),
11
- Effect.withSpan(name)
16
+ Effect.withLogSpan(name)
12
17
  )
13
18
 
14
19
  function makeClient(url: string) {
15
20
  return Effect.acquireRelease(
16
- Effect.sync(() => new ServiceBusClient(url)).pipe(withSpanAndLog("ServiceBus.client.create")),
17
- (client) => Effect.promise(() => client.close()).pipe(withSpanAndLog("ServiceBus.client.close"))
21
+ Effect.sync(() => new ServiceBusClient(url)).pipe(logged("ServiceBus.client.create")),
22
+ (client) => Effect.promise(() => client.close()).pipe(logged("ServiceBus.client.close"))
18
23
  )
19
24
  }
20
25
 
21
26
  export class ServiceBusClientTag
22
- extends ServiceMap.Opaque<ServiceBusClientTag, ServiceBusClient>()("@services/Client", { make: makeClient })
27
+ extends Context.Opaque<ServiceBusClientTag, ServiceBusClient>()("@services/Client", { make: makeClient })
23
28
  {
24
29
  static readonly layer = (url: string) => this.toLayer(this.make(url))
25
30
  }
26
31
 
27
- function makeSender_(queueName: string) {
28
- return Effect.gen(function*() {
29
- const serviceBusClient = yield* ServiceBusClientTag
32
+ const makeSender_ = Effect.fnUntraced(function*(queueName: string) {
33
+ const serviceBusClient = yield* ServiceBusClientTag
30
34
 
31
- return yield* Effect.acquireRelease(
32
- Effect.sync(() => serviceBusClient.createSender(queueName)).pipe(
33
- withSpanAndLog(`ServiceBus.sender.create ${queueName}`)
34
- ),
35
- (sender) => Effect.promise(() => sender.close()).pipe(withSpanAndLog(`ServiceBus.sender.close ${queueName}`))
36
- )
37
- })
38
- }
39
-
40
- const makeSender = (name: string) =>
41
- Effect.gen(function*() {
42
- const sender = yield* makeSender_(name)
43
- const sendMessages = Effect.fnUntraced(function*(
44
- messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
45
- options?: Omit<OperationOptionsBase, "abortSignal">
46
- ) {
47
- return yield* Effect.promise((abortSignal) => sender.sendMessages(messages, { ...options, abortSignal }))
48
- })
35
+ return yield* Effect.acquireRelease(
36
+ Effect.sync(() => serviceBusClient.createSender(queueName)).pipe(
37
+ logged(`ServiceBus.sender.create ${queueName}`)
38
+ ),
39
+ (sender) => Effect.promise(() => sender.close()).pipe(logged(`ServiceBus.sender.close ${queueName}`))
40
+ )
41
+ })
49
42
 
50
- return { name, sendMessages }
43
+ const makeSender = Effect.fnUntraced(function*(name: string) {
44
+ const sender = yield* makeSender_(name)
45
+ const sendMessages = Effect.fnUntraced(function*(
46
+ messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
47
+ options?: Omit<OperationOptionsBase, "abortSignal">
48
+ ) {
49
+ return yield* Effect.promise((abortSignal) => sender.sendMessages(messages, { ...options, abortSignal }))
51
50
  })
52
51
 
53
- export class Sender extends ServiceMap.Opaque<Sender, {
52
+ return { name, sendMessages }
53
+ })
54
+
55
+ export class Sender extends Context.Opaque<Sender, {
54
56
  name: string
55
57
  sendMessages: (
56
58
  messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
57
59
  options?: Omit<OperationOptionsBase, "abortSignal">
58
- ) => Effect.Effect<void, never, never>
60
+ ) => Effect.Effect<void>
59
61
  }>()("Sender", { make: makeSender }) {
60
62
  static readonly layer = (name: string) => this.toLayer(this.make(name))
61
63
  }
62
64
 
63
65
  export const SenderTag = <Id>() => <Key extends string>(queueName: Key) => {
64
- const tag = ServiceMap.Service<Id, Sender>(`ServiceBus.Sender.${queueName}`)
66
+ const tag = Context.Service<Id, Sender>(`ServiceBus.Sender.${queueName}`)
65
67
 
66
68
  return Object.assign(tag, {
67
69
  layer: Layer.effect(
@@ -71,99 +73,107 @@ export const SenderTag = <Id>() => <Key extends string>(queueName: Key) => {
71
73
  })
72
74
  }
73
75
 
74
- const makeReceiver = (name: string) =>
75
- Effect.gen(function*() {
76
- const serviceBusClient = yield* ServiceBusClientTag
77
-
78
- const makeReceiver = Effect.fnUntraced(
79
- function*(queueName: string, waitTillEmpty: Effect.Effect<void>, sessionId?: string) {
80
- return yield* Effect.acquireRelease(
81
- (sessionId
82
- ? Effect.promise(() => serviceBusClient.acceptSession(queueName, sessionId))
83
- : Effect.sync(() => serviceBusClient.createReceiver(queueName)))
84
- .pipe(withSpanAndLog(`ServiceBus.receiver.create ${queueName}.${sessionId}`)),
85
- (r) =>
86
- waitTillEmpty.pipe(
87
- withSpanAndLog(`ServiceBus.receiver.waitTillEmpty ${queueName}.${sessionId}`),
88
- Effect.andThen(
89
- Effect.promise(() => r.close()).pipe(
90
- withSpanAndLog(`ServiceBus.receiver.close ${queueName}.${sessionId}`)
91
- )
92
- ),
93
- withSpanAndLog(`ServiceBus.receiver.release ${queueName}.${sessionId}`)
94
- )
76
+ const makeReceiver = Effect.fnUntraced(function*(name: string) {
77
+ const serviceBusClient = yield* ServiceBusClientTag
78
+
79
+ const makeReceiver = Effect.fnUntraced(
80
+ function*(queueName: string, waitTillEmpty: Effect.Effect<void>, sessionId?: string) {
81
+ const annotate = sessionId !== undefined
82
+ ? Effect.annotateLogs({ "messaging.session.id": sessionId })
83
+ : <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
84
+ return yield* Effect.acquireRelease(
85
+ (sessionId
86
+ ? Effect.promise(() => serviceBusClient.acceptSession(queueName, sessionId))
87
+ : Effect.sync(() => serviceBusClient.createReceiver(queueName)))
88
+ .pipe(logged(`ServiceBus.receiver.create ${queueName}`), annotate),
89
+ (r) =>
90
+ waitTillEmpty.pipe(
91
+ logged(`ServiceBus.receiver.waitTillEmpty ${queueName}`),
92
+ Effect.andThen(
93
+ Effect.promise(() => r.close()).pipe(
94
+ logged(`ServiceBus.receiver.close ${queueName}`)
95
+ )
96
+ ),
97
+ logged(`ServiceBus.receiver.release ${queueName}`),
98
+ annotate
99
+ )
100
+ )
101
+ }
102
+ )
103
+
104
+ const make = (waitTillEmpty: Effect.Effect<void>) => makeReceiver(name, waitTillEmpty)
105
+
106
+ const makeSession = (sessionId: string, waitTillEmpty: Effect.Effect<void>) =>
107
+ makeReceiver(name, waitTillEmpty, sessionId)
108
+
109
+ return {
110
+ name,
111
+ make,
112
+ makeSession,
113
+ subscribe: Effect.fnUntraced(function*<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string) {
114
+ const fs = yield* FiberSet.make()
115
+ const fr = yield* FiberSet.runtime(fs)<RMsg | RErr>()
116
+ const wait = Effect
117
+ .gen(function*() {
118
+ if ((yield* FiberSet.size(fs)) > 0) {
119
+ yield* InfraLogger.logDebug("Waiting ServiceBusFiberSet to be empty: " + (yield* FiberSet.size(fs)))
120
+ }
121
+ while ((yield* FiberSet.size(fs)) > 0) yield* Effect.sleep("250 millis")
122
+ })
123
+ const r = yield* sessionId
124
+ ? makeSession(
125
+ sessionId,
126
+ wait
127
+ )
128
+ : make(wait)
129
+
130
+ const runEffect = <E>(effect: Effect.Effect<void, E, RMsg | RErr>) =>
131
+ new Promise<void>((resolve, reject) =>
132
+ fr(effect)
133
+ .addObserver((exit) => {
134
+ if (Exit.isSuccess(exit)) {
135
+ resolve(exit.value)
136
+ } else {
137
+ // disable @typescript-eslint/prefer-promise-reject-errors
138
+ reject(Cause.pretty(exit.cause))
139
+ }
140
+ })
95
141
  )
96
- }
97
- )
98
142
 
99
- const make = (waitTillEmpty: Effect.Effect<void>) => makeReceiver(name, waitTillEmpty)
100
-
101
- const makeSession = (sessionId: string, waitTillEmpty: Effect.Effect<void>) =>
102
- makeReceiver(name, waitTillEmpty, sessionId)
103
-
104
- return {
105
- name,
106
- make,
107
- makeSession,
108
- subscribe: Effect.fnUntraced(function*<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string) {
109
- const fs = yield* FiberSet.make()
110
- const fr = yield* FiberSet.runtime(fs)<RMsg | RErr>()
111
- const wait = Effect
112
- .gen(function*() {
113
- if ((yield* FiberSet.size(fs)) > 0) {
114
- yield* InfraLogger.logDebug("Waiting ServiceBusFiberSet to be empty: " + (yield* FiberSet.size(fs)))
115
- }
116
- while ((yield* FiberSet.size(fs)) > 0) yield* Effect.sleep("250 millis")
117
- })
118
- const r = yield* sessionId
119
- ? makeSession(
120
- sessionId,
121
- wait
122
- )
123
- : make(wait)
124
-
125
- const runEffect = <E>(effect: Effect.Effect<void, E, RMsg | RErr>) =>
126
- new Promise<void>((resolve, reject) =>
127
- fr(effect)
128
- .addObserver((exit) => {
129
- if (Exit.isSuccess(exit)) {
130
- resolve(exit.value)
131
- } else {
132
- // disable @typescript-eslint/prefer-promise-reject-errors
133
- reject(Cause.pretty(exit.cause))
134
- }
143
+ const annotate = sessionId !== undefined
144
+ ? Effect.annotateLogs({ "messaging.session.id": sessionId })
145
+ : <A, E, R>(self: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> => self
146
+ yield* Effect.acquireRelease(
147
+ Effect
148
+ .sync(() => {
149
+ const s = r
150
+ .subscribe({
151
+ processError: (err) =>
152
+ runEffect(
153
+ hndlr
154
+ .processError(err)
155
+ .pipe(
156
+ Effect.catchCause((cause) => Effect.logError("ServiceBus Error", cause)),
157
+ annotate
158
+ )
159
+ ),
160
+ processMessage: (msg) => runEffect(hndlr.processMessage(msg).pipe(annotate))
161
+ // DO NOT CATCH ERRORS here as they should return to the queue!
135
162
  })
163
+ return { close: Effect.promise(() => s.close()) }
164
+ })
165
+ .pipe(logged("ServiceBus.subscription.create"), annotate),
166
+ (subscription) =>
167
+ subscription.close.pipe(
168
+ logged("ServiceBus.subscription.close"),
169
+ annotate
136
170
  )
171
+ ) as Effect.Effect<void, never, Scope.Scope> // wth is going on here
172
+ })
173
+ }
174
+ })
137
175
 
138
- yield* Effect.acquireRelease(
139
- Effect
140
- .sync(() => {
141
- const s = r
142
- .subscribe({
143
- processError: (err) =>
144
- runEffect(
145
- hndlr
146
- .processError(err)
147
- .pipe(
148
- Effect.catchCause((cause) => Effect.logError(`ServiceBus Error ${sessionId}`, cause))
149
- )
150
- ),
151
- processMessage: (msg) => runEffect(hndlr.processMessage(msg))
152
- // DO NOT CATCH ERRORS here as they should return to the queue!
153
- })
154
- return { close: Effect.promise(() => s.close()) }
155
- })
156
- .pipe(withSpanAndLog(`ServiceBus.subscription.create ${sessionId}`)),
157
- (subscription) =>
158
- subscription.close.pipe(
159
- withSpanAndLog(`ServiceBus.subscription.close ${sessionId}`)
160
- )
161
- ) as Effect.Effect<void, never, Scope.Scope> // wth is going on here
162
- })
163
- }
164
- })
165
-
166
- export class Receiver extends ServiceMap.Opaque<Receiver, {
176
+ export class Receiver extends Context.Opaque<Receiver, {
167
177
  name: string
168
178
  make: (waitTillEmpty: Effect.Effect<void>) => Effect.Effect<ServiceBusReceiver, never, Scope.Scope>
169
179
  makeSession: (
@@ -180,7 +190,7 @@ export class Receiver extends ServiceMap.Opaque<Receiver, {
180
190
  }
181
191
 
182
192
  export const ReceiverTag = <Id>() => <Key extends string>(queueName: Key) => {
183
- const tag = ServiceMap.Service<Id, Receiver>(`ServiceBus.Receiver.${queueName}`)
193
+ const tag = Context.Service<Id, Receiver>(`ServiceBus.Receiver.${queueName}`)
184
194
 
185
195
  return Object.assign(tag, {
186
196
  layer: Layer.effect(
@@ -1,12 +1,14 @@
1
1
  import { CosmosClient as ComosClient_ } from "@azure/cosmos"
2
- import { Effect, Layer, ServiceMap } from "effect-app"
2
+ import * as Context from "effect-app/Context"
3
+ import * as Effect from "effect-app/Effect"
4
+ import * as Layer from "effect-app/Layer"
3
5
 
4
6
  const withClient = (url: string) => Effect.sync(() => new ComosClient_(url))
5
7
 
6
8
  export const makeCosmosClient = (url: string, dbName: string) =>
7
9
  Effect.map(withClient(url), (x) => ({ db: x.database(dbName) }))
8
10
 
9
- export class CosmosClient extends ServiceMap.Service<CosmosClient, {
11
+ export class CosmosClient extends Context.Service<CosmosClient, {
10
12
  readonly db: ReturnType<InstanceType<typeof ComosClient_>["database"]>
11
13
  }>()("@services/CosmosClient") {}
12
14
 
@@ -0,0 +1,7 @@
1
+ export * from "./cosmos-client.js"
2
+ export * from "./logger.js"
3
+ export * from "./memQueue.js"
4
+ export * from "./mongo-client.js"
5
+ export * from "./redis-client.js"
6
+ export * from "./ServiceBus.js"
7
+ export * from "./SQL.js"
@@ -1,5 +1,6 @@
1
- import { Effect, type Queue, ServiceMap } from "effect-app"
2
- import * as Q from "effect/Queue"
1
+ import * as Context from "effect-app/Context"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Queue from "effect/Queue"
3
4
 
4
5
  const make = Effect
5
6
  .gen(function*() {
@@ -9,13 +10,13 @@ const make = Effect
9
10
  getOrCreateQueue: Effect.fnUntraced(function*(k: string) {
10
11
  const q = store.get(k)
11
12
  if (q) return q
12
- const newQ = yield* Q.unbounded<string>()
13
+ const newQ = yield* Queue.unbounded<string>()
13
14
  store.set(k, newQ)
14
15
  return newQ
15
16
  })
16
17
  }
17
18
  })
18
19
 
19
- export class MemQueue extends ServiceMap.Opaque<MemQueue>()("effect-app/MemQueue", { make }) {
20
+ export class MemQueue extends Context.Opaque<MemQueue>()("effect-app/MemQueue", { make }) {
20
21
  static readonly Live = this.toLayer(this.make)
21
22
  }
@@ -1,4 +1,6 @@
1
- import { Effect, Layer, ServiceMap } from "effect-app"
1
+ import * as Context from "effect-app/Context"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Layer from "effect-app/Layer"
2
4
  import { MongoClient as MongoClient_ } from "mongodb"
3
5
 
4
6
  // TODO: we should probably share a single client...
@@ -15,7 +17,7 @@ const withClient = (url: string) =>
15
17
 
16
18
  const makeMongoClient = (url: string, dbName?: string) => Effect.map(withClient(url), (x) => ({ db: x.db(dbName) }))
17
19
 
18
- export class MongoClient extends ServiceMap.Service<MongoClient, {
20
+ export class MongoClient extends Context.Service<MongoClient, {
19
21
  readonly db: ReturnType<InstanceType<typeof MongoClient_>["db"]>
20
22
  }>()("@services/MongoClient") {}
21
23
 
@@ -1,4 +1,8 @@
1
- import { Data, Effect, Layer, Option, ServiceMap } from "effect-app"
1
+ import * as Context from "effect-app/Context"
2
+ import * as Effect from "effect-app/Effect"
3
+ import * as Layer from "effect-app/Layer"
4
+ import * as Option from "effect-app/Option"
5
+ import * as Data from "effect/Data"
2
6
  import type { RedisClient as Client } from "redis"
3
7
  import Redlock from "redlock"
4
8
 
@@ -90,7 +94,7 @@ export const makeRedisClient = (makeClient: () => Client) =>
90
94
  .pipe(Effect.uninterruptible, Effect.orDie)
91
95
  )
92
96
 
93
- export class RedisClient extends ServiceMap.Service<RedisClient, {
97
+ export class RedisClient extends Context.Service<RedisClient, {
94
98
  readonly client: Client
95
99
  readonly lock: Redlock
96
100
  readonly get: (key: string) => Effect.Effect<Option.Option<string>, ConnectionException>
@@ -1,5 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { Effect, Layer, type NonEmptyReadonlyArray, pipe, type Scope, ServiceMap } from "effect-app"
2
+ import type { NonEmptyReadonlyArray } from "effect-app/Array"
3
+ import * as Context from "effect-app/Context"
4
+ import * as Effect from "effect-app/Effect"
5
+ import * as Layer from "effect-app/Layer"
6
+ import { pipe } from "effect/Function"
7
+ import type * as Scope from "effect/Scope"
3
8
 
4
9
  import { type HttpRouter } from "effect-app/http"
5
10
  import { type EffectGenUtils } from "effect-app/utils/gen"
@@ -23,7 +28,7 @@ type TDepsArr<TDeps extends ReadonlyArray<any>> = {
23
28
  // E = never => the context provided cannot trigger errors
24
29
  // TODO: remove HttpLayerRouter.Provided - it's not even relevant outside of Http context, while ContextProviders are for anywhere. Only support Scope.Scope?
25
30
  // _R extends HttpLayerRouter.Provided => the context provided can only have what HttpLayerRouter.Provided provides as requirements
26
- ContextTagWithDefault.Base<Effect.Effect<ServiceMap.ServiceMap<infer _1>, never, infer _R>> // & { _tag: infer _2 }>
31
+ ContextTagWithDefault.Base<Effect.Effect<Context.Context<infer _1>, never, infer _R>> // & { _tag: infer _2 }>
27
32
  ? [_R] extends [HttpRouter.Provided] ? TDeps[K]
28
33
  : `HttpLayerRouter.Provided is the only requirement ${TDeps[K]["Service"][
29
34
  "_tag"
@@ -58,9 +63,9 @@ export const mergeContextProviders = <
58
63
  Effect.Effect<
59
64
  // we need to merge all contexts into one
60
65
  // v4: Service.Shape extracts the service value type (v3's Tag.Identifier)
61
- ServiceMap.ServiceMap<GetContext<EffectGenUtils.Success<ServiceMap.Service.Shape<TDeps[number]>>>>,
66
+ Context.Context<GetContext<EffectGenUtils.Success<Context.Service.Shape<TDeps[number]>>>>,
62
67
  never,
63
- EffectGenUtils.ServiceMap<ServiceMap.Service.Shape<TDeps[number]>>
68
+ EffectGenUtils.Context<Context.Service.Shape<TDeps[number]>>
64
69
  >,
65
70
  LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"] }>,
66
71
  LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
@@ -78,14 +83,14 @@ export const mergeContextProviders = <
78
83
  handle: handle[Symbol.toStringTag] === "GeneratorFunction" ? Effect.fnUntraced(handle)() : handle
79
84
  }
80
85
  ))
81
- // services are effects which return some ServiceMap.ServiceMap<...>
86
+ // services are effects which return some Context.Context<...>
82
87
  const context = yield* mergeContexts(services as any)
83
88
  return context
84
89
  })
85
90
  }) as any
86
91
  })
87
92
 
88
- // Effect Rpc Middleware: for single tag providing, we could use Provides, for providing ServiceMap or Layer (bad boy) we could use Wrap..
93
+ // Effect Rpc Middleware: for single tag providing, we could use Provides, for providing Context or Layer (bad boy) we could use Wrap..
89
94
  export const ContextProvider = <
90
95
  ContextProviderA,
91
96
  MakeContextProviderE,
@@ -98,8 +103,7 @@ export const ContextProvider = <
98
103
  | Effect.Effect<ContextProviderA, never, ContextProviderR>
99
104
  | (() => Generator<
100
105
  Yieldable<any, any, never, ContextProviderR>,
101
- ContextProviderA,
102
- any
106
+ ContextProviderA
103
107
  >),
104
108
  MakeContextProviderE,
105
109
  MakeContextProviderR | Scope.Scope
@@ -107,7 +111,7 @@ export const ContextProvider = <
107
111
  dependencies?: Dependencies
108
112
  }
109
113
  ) => {
110
- const ctx = ServiceMap.Service<
114
+ const ctx = Context.Service<
111
115
  ContextProviderId,
112
116
  Effect.Effect<ContextProviderA, never, ContextProviderR>
113
117
  >(
@@ -146,17 +150,17 @@ export const MergedContextProvider = <
146
150
  Effect.Effect<
147
151
  // we need to merge all contexts into one
148
152
  // v4: Service.Shape extracts the service value type (v3's Tag.Identifier)
149
- ServiceMap.ServiceMap<GetContext<EffectGenUtils.Success<ServiceMap.Service.Shape<TDeps[number]>>>>,
153
+ Context.Context<GetContext<EffectGenUtils.Success<Context.Service.Shape<TDeps[number]>>>>,
150
154
  never,
151
- EffectGenUtils.ServiceMap<ServiceMap.Service.Shape<TDeps[number]>>
155
+ EffectGenUtils.Context<Context.Service.Shape<TDeps[number]>>
152
156
  >,
153
157
  LayerUtils.GetLayersError<{ [K in keyof TDeps]: TDeps[K]["Default"] }>,
154
158
  // v4: Identifier here is correct — it's the nominal service identity for layer provide/exclude
155
159
  | Exclude<
156
- ServiceMap.Service.Identifier<TDeps[number]>,
160
+ Context.Service.Identifier<TDeps[number]>,
157
161
  LayerUtils.GetLayersSuccess<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
158
162
  >
159
163
  | LayerUtils.GetLayersContext<{ [K in keyof TDeps]: TDeps[K]["Default"] }>
160
164
  >
161
165
 
162
- export const EmptyContextProvider = ContextProvider({ effect: Effect.succeed(Effect.succeed(ServiceMap.empty())) })
166
+ export const EmptyContextProvider = ContextProvider({ effect: Effect.succeed(Effect.succeed(Context.empty())) })
@@ -1,8 +1,10 @@
1
- import { Effect } from "effect-app"
1
+ import * as Effect from "effect-app/Effect"
2
2
  import { HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http"
3
+ import * as Layer from "effect-app/Layer"
3
4
  import { NonEmptyString255 } from "effect-app/Schema"
4
- import { Locale, RequestContext } from "../../RequestContext.js"
5
- import { setupRequestContext } from "../setupRequest.js"
5
+ import { Locale, LocaleRef, RequestContext, spanAttributes } from "../../RequestContext.js"
6
+ import { ContextMapContainer } from "../../Store/ContextMapContainer.js"
7
+ import { storeId } from "../../Store/Memory.js"
6
8
 
7
9
  export const RequestContextMiddleware = (defaultLocale: Locale = "en") =>
8
10
  HttpMiddleware.make((app) =>
@@ -21,7 +23,7 @@ export const RequestContextMiddleware = (defaultLocale: Locale = "en") =>
21
23
  const namespace = NonEmptyString255((ns && (Array.isArray(ns) ? ns[0] : ns)) || "primary")
22
24
  const deviceId = req.headers["x-fe-device-id"]
23
25
 
24
- const requestContext = new RequestContext({
26
+ const requestContext = RequestContext.make({
25
27
  span: {
26
28
  traceId: currentSpan.traceId,
27
29
  spanId: currentSpan.spanId,
@@ -32,7 +34,16 @@ export const RequestContextMiddleware = (defaultLocale: Locale = "en") =>
32
34
  namespace,
33
35
  sourceId: deviceId ? NonEmptyString255(deviceId) : undefined
34
36
  })
35
- const res = yield* setupRequestContext(app, requestContext)
37
+ yield* Effect.annotateCurrentSpan(spanAttributes(requestContext))
38
+ const layer = Layer.mergeAll(
39
+ ContextMapContainer.layer,
40
+ Layer.succeed(LocaleRef, requestContext.locale),
41
+ Layer.succeed(storeId, requestContext.namespace)
42
+ )
43
+ const res = yield* app.pipe(
44
+ Effect.withLogSpan(requestContext.name),
45
+ Effect.provide(layer, { local: true })
46
+ )
36
47
 
37
48
  // TODO: how to set also on errors?
38
49
  return HttpServerResponse.setHeaders(res, {