@effect-app/infra 0.7.0 → 0.8.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 (449) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/_cjs/{lib/RequestContext.cjs → RequestContext.cjs} +0 -0
  3. package/_cjs/{lib/RequestContext.cjs.map → RequestContext.cjs.map} +1 -1
  4. package/_cjs/{lib/api → api}/authorization.jwt.cjs +1 -1
  5. package/_cjs/{lib/api → api}/authorization.jwt.cjs.map +1 -1
  6. package/_cjs/{vendor/Cache/Cache/operations/makeWith.cjs → api/codec.cjs} +16 -13
  7. package/_cjs/api/codec.cjs.map +1 -0
  8. package/_cjs/{lib/api → api}/defaultErrorHandler.cjs +1 -1
  9. package/_cjs/{lib/api → api}/defaultErrorHandler.cjs.map +1 -1
  10. package/_cjs/{services/memQueue.cjs → api/express/makeJsonSchema.cjs} +42 -22
  11. package/_cjs/api/express/makeJsonSchema.cjs.map +1 -0
  12. package/_cjs/api/express/makeOpenApiSpecs.cjs +66 -0
  13. package/_cjs/api/express/makeOpenApiSpecs.cjs.map +1 -0
  14. package/_cjs/api/express/schema/jwt.cjs +43 -0
  15. package/_cjs/api/express/schema/jwt.cjs.map +1 -0
  16. package/_cjs/api/express/schema/requestHandler.cjs +166 -0
  17. package/_cjs/api/express/schema/requestHandler.cjs.map +1 -0
  18. package/_cjs/api/express/schema/routing.cjs +121 -0
  19. package/_cjs/api/express/schema/routing.cjs.map +1 -0
  20. package/_cjs/{lib/api → api}/reportError.cjs +5 -5
  21. package/_cjs/{lib/api → api}/reportError.cjs.map +1 -1
  22. package/_cjs/{lib/api → api}/routing.cjs +32 -32
  23. package/_cjs/{lib/api → api}/routing.cjs.map +1 -1
  24. package/_cjs/{lib/api → api}/setupRequest.cjs +2 -2
  25. package/_cjs/{lib/api → api}/setupRequest.cjs.map +1 -1
  26. package/_cjs/{lib/api → api}/util.cjs +0 -0
  27. package/_cjs/{lib/api → api}/util.cjs.map +1 -1
  28. package/_cjs/{lib/api → api}/writeDocs.cjs +5 -5
  29. package/_cjs/{lib/api → api}/writeDocs.cjs.map +1 -1
  30. package/_cjs/{lib/errorReporter.cjs → errorReporter.cjs} +1 -1
  31. package/_cjs/{lib/errorReporter.cjs.map → errorReporter.cjs.map} +1 -1
  32. package/_cjs/errors.cjs +21 -22
  33. package/_cjs/errors.cjs.map +1 -1
  34. package/_cjs/{lib/ext → ext}/Array.cjs +1 -1
  35. package/_cjs/{lib/ext → ext}/Array.cjs.map +1 -1
  36. package/_cjs/{lib/filter → filter}/types/errors.cjs +0 -0
  37. package/_cjs/{lib/filter → filter}/types/errors.cjs.map +0 -0
  38. package/_cjs/{lib/filter → filter}/types/fields.cjs +0 -0
  39. package/_cjs/{lib/filter → filter}/types/fields.cjs.map +0 -0
  40. package/_cjs/{lib/filter → filter}/types/index.cjs +0 -0
  41. package/_cjs/{lib/filter → filter}/types/index.cjs.map +1 -1
  42. package/_cjs/{lib/filter → filter}/types/path/common.cjs +0 -0
  43. package/_cjs/{lib/filter → filter}/types/path/common.cjs.map +0 -0
  44. package/_cjs/{lib/filter → filter}/types/path/eager.cjs +0 -0
  45. package/_cjs/{lib/filter → filter}/types/path/eager.cjs.map +0 -0
  46. package/_cjs/{lib/filter → filter}/types/path/index.cjs +0 -0
  47. package/_cjs/filter/types/path/index.cjs.map +1 -0
  48. package/_cjs/{lib/filter → filter}/types/utils.cjs +0 -0
  49. package/_cjs/{lib/filter → filter}/types/utils.cjs.map +0 -0
  50. package/_cjs/{lib/filter → filter}/types/validator.cjs +0 -0
  51. package/_cjs/{lib/filter → filter}/types/validator.cjs.map +0 -0
  52. package/_cjs/{lib/filter.cjs → filter.cjs} +0 -0
  53. package/_cjs/{lib/filter.cjs.map → filter.cjs.map} +1 -1
  54. package/_cjs/{lib/instrument.cjs → instrument.cjs} +1 -1
  55. package/_cjs/{lib/instrument.cjs.map → instrument.cjs.map} +1 -1
  56. package/_cjs/{lib/rateLimit.cjs → rateLimit.cjs} +1 -1
  57. package/_cjs/{lib/rateLimit.cjs.map → rateLimit.cjs.map} +1 -1
  58. package/_cjs/services/Emailer/Sendgrid.cjs +1 -1
  59. package/_cjs/services/Emailer/fake.cjs +1 -1
  60. package/_cjs/services/Repository.cjs +1 -1
  61. package/_cjs/services/Store/Cosmos.cjs +2 -2
  62. package/_cjs/services/Store/Cosmos.test.cjs +2 -2
  63. package/_cjs/services/Store/Disk.cjs +2 -2
  64. package/_cjs/services/Store/Memory.cjs +1 -1
  65. package/_cjs/services/Store/Redis.cjs +1 -1
  66. package/_cjs/services/Store/codeFilter.test.cjs +2 -2
  67. package/_cjs/services/Store/index.cjs +1 -1
  68. package/_cjs/services/Store/service.cjs +1 -1
  69. package/_cjs/services/Store/utils.cjs +1 -1
  70. package/_cjs/services/simpledb/cosmosdb.cjs +98 -0
  71. package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -0
  72. package/_cjs/services/simpledb/diskdb.cjs +118 -0
  73. package/_cjs/services/simpledb/diskdb.cjs.map +1 -0
  74. package/_cjs/services/simpledb/fileutil.cjs +36 -0
  75. package/_cjs/services/simpledb/fileutil.cjs.map +1 -0
  76. package/_cjs/{vendor/Cache/Cache/_internal/CacheState.cjs → services/simpledb/index.cjs} +31 -24
  77. package/_cjs/services/simpledb/index.cjs.map +1 -0
  78. package/_cjs/services/simpledb/memdb.cjs +74 -0
  79. package/_cjs/services/simpledb/memdb.cjs.map +1 -0
  80. package/_cjs/services/simpledb/mongodb.cjs +86 -0
  81. package/_cjs/services/simpledb/mongodb.cjs.map +1 -0
  82. package/_cjs/services/simpledb/redisdb.cjs +120 -0
  83. package/_cjs/services/simpledb/redisdb.cjs.map +1 -0
  84. package/_cjs/services/simpledb/shared.cjs +80 -0
  85. package/_cjs/services/simpledb/shared.cjs.map +1 -0
  86. package/_cjs/services/simpledb/simpledb.cjs +77 -0
  87. package/_cjs/services/simpledb/simpledb.cjs.map +1 -0
  88. package/_src/{lib/RequestContext.ts → RequestContext.ts} +0 -0
  89. package/_src/_global.ext.ts +5 -5
  90. package/_src/api/app.ts.bak +125 -0
  91. package/_src/{lib/api → api}/authorization.jwt.ts +1 -1
  92. package/_src/api/codec.ts +27 -0
  93. package/_src/{lib/api → api}/defaultErrorHandler.ts +1 -1
  94. package/_src/api/errors.ts.bak +20 -0
  95. package/_src/api/express/makeJsonSchema.ts +49 -0
  96. package/_src/api/express/makeOpenApiSpecs.ts +60 -0
  97. package/_src/api/express/routing.ts.bak +460 -0
  98. package/_src/api/express/schema/jwt.ts +38 -0
  99. package/_src/api/express/schema/requestHandler.ts +360 -0
  100. package/_src/api/express/schema/routing.ts +202 -0
  101. package/_src/{lib/api → api}/reportError.ts +3 -3
  102. package/_src/{lib/api → api}/routing.ts +7 -12
  103. package/_src/{lib/api → api}/setupRequest.ts +0 -0
  104. package/_src/{lib/api → api}/util.ts +0 -0
  105. package/_src/{lib/api → api}/writeDocs.ts +4 -5
  106. package/_src/{lib/errorReporter.ts → errorReporter.ts} +1 -1
  107. package/_src/errors.ts +12 -3
  108. package/_src/{lib/ext → ext}/Array.ts +1 -1
  109. package/_src/{lib/filter → filter}/types/errors.ts +0 -0
  110. package/_src/{lib/filter → filter}/types/fields.ts +0 -0
  111. package/_src/{lib/filter → filter}/types/index.ts +0 -0
  112. package/_src/{lib/filter → filter}/types/path/common.ts +0 -0
  113. package/_src/{lib/filter → filter}/types/path/eager.ts +0 -0
  114. package/_src/{lib/filter → filter}/types/path/index.ts +0 -0
  115. package/_src/{lib/filter → filter}/types/utils.ts +0 -0
  116. package/_src/{lib/filter → filter}/types/validator.ts +0 -0
  117. package/_src/{lib/filter.ts → filter.ts} +1 -1
  118. package/_src/{lib/instrument.ts → instrument.ts} +0 -0
  119. package/_src/{lib/rateLimit.ts → rateLimit.ts} +0 -0
  120. package/_src/services/Emailer/service.ts +1 -1
  121. package/_src/services/Repository.ts +1 -1
  122. package/_src/services/Store/Cosmos.test.ts +1 -1
  123. package/_src/services/Store/Disk.ts +1 -1
  124. package/_src/services/Store/codeFilter.test.ts +1 -1
  125. package/_src/services/simpledb/cosmosdb.ts +134 -0
  126. package/_src/services/simpledb/diskdb.ts +158 -0
  127. package/_src/services/simpledb/fileutil.ts +28 -0
  128. package/_src/services/simpledb/index.ts +6 -0
  129. package/_src/services/simpledb/memdb.ts +79 -0
  130. package/_src/services/simpledb/mongodb.ts +99 -0
  131. package/_src/services/simpledb/redisdb.ts +182 -0
  132. package/_src/services/simpledb/shared.ts +117 -0
  133. package/_src/services/simpledb/simpledb.ts +117 -0
  134. package/dist/{lib/RequestContext.d.ts → RequestContext.d.ts} +1 -1
  135. package/dist/RequestContext.d.ts.map +1 -0
  136. package/dist/RequestContext.js +52 -0
  137. package/dist/_global.ext.d.ts +5 -5
  138. package/dist/_global.ext.d.ts.map +1 -1
  139. package/dist/{lib/api → api}/authorization.jwt.d.ts +1 -1
  140. package/dist/api/authorization.jwt.d.ts.map +1 -0
  141. package/dist/{lib/api → api}/authorization.jwt.js +2 -2
  142. package/dist/api/codec.d.ts +7 -0
  143. package/dist/api/codec.d.ts.map +1 -0
  144. package/dist/api/codec.js +19 -0
  145. package/dist/{lib/api → api}/defaultErrorHandler.d.ts +1 -1
  146. package/dist/api/defaultErrorHandler.d.ts.map +1 -0
  147. package/dist/{lib/api → api}/defaultErrorHandler.js +2 -2
  148. package/dist/api/express/makeJsonSchema.d.ts +30 -0
  149. package/dist/api/express/makeJsonSchema.d.ts.map +1 -0
  150. package/dist/api/express/makeJsonSchema.js +40 -0
  151. package/dist/api/express/makeOpenApiSpecs.d.ts +55 -0
  152. package/dist/api/express/makeOpenApiSpecs.d.ts.map +1 -0
  153. package/dist/api/express/makeOpenApiSpecs.js +56 -0
  154. package/dist/api/express/schema/jwt.d.ts +5 -0
  155. package/dist/api/express/schema/jwt.d.ts.map +1 -0
  156. package/dist/api/express/schema/jwt.js +32 -0
  157. package/dist/api/express/schema/requestHandler.d.ts +71 -0
  158. package/dist/api/express/schema/requestHandler.d.ts.map +1 -0
  159. package/dist/api/express/schema/requestHandler.js +140 -0
  160. package/dist/api/express/schema/routing.d.ts +45 -0
  161. package/dist/api/express/schema/routing.d.ts.map +1 -0
  162. package/dist/api/express/schema/routing.js +95 -0
  163. package/dist/{lib/api → api}/reportError.d.ts +4 -4
  164. package/dist/api/reportError.d.ts.map +1 -0
  165. package/dist/{lib/api → api}/reportError.js +6 -6
  166. package/dist/{lib/api → api}/routing.d.ts +7 -7
  167. package/dist/api/routing.d.ts.map +1 -0
  168. package/dist/api/routing.js +249 -0
  169. package/dist/{lib/api → api}/setupRequest.d.ts +2 -2
  170. package/dist/api/setupRequest.d.ts.map +1 -0
  171. package/dist/{lib/api → api}/setupRequest.js +3 -3
  172. package/dist/{lib/api → api}/util.d.ts +0 -0
  173. package/dist/api/util.d.ts.map +1 -0
  174. package/dist/api/util.js +14 -0
  175. package/dist/{lib/api → api}/writeDocs.d.ts +1 -1
  176. package/dist/api/writeDocs.d.ts.map +1 -0
  177. package/dist/api/writeDocs.js +23 -0
  178. package/dist/{lib/errorReporter.d.ts → errorReporter.d.ts} +1 -1
  179. package/dist/errorReporter.d.ts.map +1 -0
  180. package/dist/errorReporter.js +45 -0
  181. package/dist/errors.d.ts +11 -2
  182. package/dist/errors.d.ts.map +1 -1
  183. package/dist/errors.js +17 -3
  184. package/dist/{lib/ext → ext}/Array.d.ts +3 -3
  185. package/dist/ext/Array.d.ts.map +1 -0
  186. package/dist/{lib/ext → ext}/Array.js +2 -2
  187. package/dist/{lib/filter → filter}/types/errors.d.ts +0 -0
  188. package/dist/filter/types/errors.d.ts.map +1 -0
  189. package/dist/{lib/filter → filter}/types/errors.js +1 -1
  190. package/dist/{lib/filter → filter}/types/fields.d.ts +0 -0
  191. package/dist/filter/types/fields.d.ts.map +1 -0
  192. package/dist/{lib/filter → filter}/types/fields.js +1 -1
  193. package/dist/{lib/filter → filter}/types/index.d.ts +0 -0
  194. package/dist/filter/types/index.d.ts.map +1 -0
  195. package/dist/{lib/filter → filter}/types/index.js +1 -1
  196. package/dist/{lib/filter → filter}/types/path/common.d.ts +0 -0
  197. package/dist/filter/types/path/common.d.ts.map +1 -0
  198. package/dist/{lib/filter → filter}/types/path/common.js +1 -1
  199. package/dist/{lib/filter → filter}/types/path/eager.d.ts +0 -0
  200. package/dist/filter/types/path/eager.d.ts.map +1 -0
  201. package/dist/{lib/filter → filter}/types/path/eager.js +1 -1
  202. package/dist/{lib/filter → filter}/types/path/index.d.ts +0 -0
  203. package/dist/filter/types/path/index.d.ts.map +1 -0
  204. package/dist/{lib/filter → filter}/types/path/index.js +1 -1
  205. package/dist/{lib/filter → filter}/types/utils.d.ts +0 -0
  206. package/dist/filter/types/utils.d.ts.map +1 -0
  207. package/dist/{lib/filter → filter}/types/utils.js +1 -1
  208. package/dist/{lib/filter → filter}/types/validator.d.ts +0 -0
  209. package/dist/filter/types/validator.d.ts.map +1 -0
  210. package/dist/{lib/filter → filter}/types/validator.js +1 -1
  211. package/dist/{lib/filter.d.ts → filter.d.ts} +9 -9
  212. package/dist/filter.d.ts.map +1 -0
  213. package/dist/filter.js +171 -0
  214. package/dist/{lib/instrument.d.ts → instrument.d.ts} +1 -1
  215. package/dist/instrument.d.ts.map +1 -0
  216. package/dist/{lib/instrument.js → instrument.js} +2 -2
  217. package/dist/{lib/rateLimit.d.ts → rateLimit.d.ts} +5 -5
  218. package/dist/rateLimit.d.ts.map +1 -0
  219. package/dist/{lib/rateLimit.js → rateLimit.js} +2 -2
  220. package/dist/services/Emailer/Sendgrid.js +1 -1
  221. package/dist/services/Emailer/fake.js +1 -1
  222. package/dist/services/Emailer/service.d.ts +1 -1
  223. package/dist/services/Emailer/service.d.ts.map +1 -1
  224. package/dist/services/Repository.d.ts +1 -1
  225. package/dist/services/Repository.d.ts.map +1 -1
  226. package/dist/services/Repository.js +1 -1
  227. package/dist/services/Store/Cosmos.js +2 -2
  228. package/dist/services/Store/Disk.js +3 -3
  229. package/dist/services/Store/Memory.js +1 -1
  230. package/dist/services/Store/Redis.js +1 -1
  231. package/dist/services/Store/index.js +1 -1
  232. package/dist/services/Store/service.js +1 -1
  233. package/dist/services/Store/utils.js +1 -1
  234. package/dist/services/simpledb/cosmosdb.d.ts +13 -0
  235. package/dist/services/simpledb/cosmosdb.d.ts.map +1 -0
  236. package/dist/services/simpledb/cosmosdb.js +88 -0
  237. package/dist/services/simpledb/diskdb.d.ts +12 -0
  238. package/dist/services/simpledb/diskdb.d.ts.map +1 -0
  239. package/dist/services/simpledb/diskdb.js +96 -0
  240. package/dist/services/simpledb/fileutil.d.ts +7 -0
  241. package/dist/services/simpledb/fileutil.d.ts.map +1 -0
  242. package/dist/services/simpledb/fileutil.js +25 -0
  243. package/dist/services/simpledb/index.d.ts +7 -0
  244. package/dist/services/simpledb/index.d.ts.map +1 -0
  245. package/dist/services/simpledb/index.js +7 -0
  246. package/dist/services/simpledb/memdb.d.ts +12 -0
  247. package/dist/services/simpledb/memdb.d.ts.map +1 -0
  248. package/dist/services/simpledb/memdb.js +55 -0
  249. package/dist/services/simpledb/mongodb.d.ts +13 -0
  250. package/dist/services/simpledb/mongodb.d.ts.map +1 -0
  251. package/dist/services/simpledb/mongodb.js +55 -0
  252. package/dist/services/simpledb/redisdb.d.ts +25 -0
  253. package/dist/services/simpledb/redisdb.d.ts.map +1 -0
  254. package/dist/services/simpledb/redisdb.js +105 -0
  255. package/dist/services/simpledb/shared.d.ts +63 -0
  256. package/dist/services/simpledb/shared.d.ts.map +1 -0
  257. package/dist/services/simpledb/shared.js +65 -0
  258. package/dist/services/simpledb/simpledb.d.ts +23 -0
  259. package/dist/services/simpledb/simpledb.d.ts.map +1 -0
  260. package/dist/services/simpledb/simpledb.js +56 -0
  261. package/package.json +216 -328
  262. package/_cjs/ext.cjs +0 -4
  263. package/_cjs/ext.cjs.map +0 -1
  264. package/_cjs/lib/fileUtil.cjs +0 -36
  265. package/_cjs/lib/fileUtil.cjs.map +0 -1
  266. package/_cjs/lib/filter/types/path/index.cjs.map +0 -1
  267. package/_cjs/services/CUPS/service.cjs +0 -15
  268. package/_cjs/services/CUPS/service.cjs.map +0 -1
  269. package/_cjs/services/CUPS.cjs +0 -113
  270. package/_cjs/services/CUPS.cjs.map +0 -1
  271. package/_cjs/services/Cache.cjs +0 -39
  272. package/_cjs/services/Cache.cjs.map +0 -1
  273. package/_cjs/services/ServiceBus.cjs +0 -69
  274. package/_cjs/services/ServiceBus.cjs.map +0 -1
  275. package/_cjs/services/memQueue.cjs.map +0 -1
  276. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +0 -14
  277. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +0 -1
  278. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +0 -29
  279. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +0 -1
  280. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +0 -32
  281. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +0 -1
  282. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +0 -266
  283. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +0 -1
  284. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +0 -1
  285. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +0 -67
  286. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +0 -1
  287. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +0 -44
  288. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +0 -1
  289. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +0 -33
  290. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +0 -1
  291. package/_cjs/vendor/Cache/Cache/definition.cjs +0 -13
  292. package/_cjs/vendor/Cache/Cache/definition.cjs.map +0 -1
  293. package/_cjs/vendor/Cache/Cache/operations/make.cjs +0 -20
  294. package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +0 -1
  295. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +0 -1
  296. package/_cjs/vendor/Cache/Cache/operations.cjs +0 -28
  297. package/_cjs/vendor/Cache/Cache/operations.cjs.map +0 -1
  298. package/_cjs/vendor/Cache/Cache.cjs +0 -28
  299. package/_cjs/vendor/Cache/Cache.cjs.map +0 -1
  300. package/_cjs/vendor/Cache/CacheStats/definition.cjs +0 -13
  301. package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +0 -1
  302. package/_cjs/vendor/Cache/CacheStats.cjs +0 -17
  303. package/_cjs/vendor/Cache/CacheStats.cjs.map +0 -1
  304. package/_cjs/vendor/Cache/EntryStats/definition.cjs +0 -11
  305. package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +0 -1
  306. package/_cjs/vendor/Cache/EntryStats.cjs +0 -17
  307. package/_cjs/vendor/Cache/EntryStats.cjs.map +0 -1
  308. package/_cjs/vendor/Cache/Lookup/definition.cjs +0 -6
  309. package/_cjs/vendor/Cache/Lookup/definition.cjs.map +0 -1
  310. package/_cjs/vendor/Cache/Lookup.cjs +0 -17
  311. package/_cjs/vendor/Cache/Lookup.cjs.map +0 -1
  312. package/_cjs/vendor/Cache/index.cjs +0 -17
  313. package/_cjs/vendor/Cache/index.cjs.map +0 -1
  314. package/_src/ext.ts +0 -1
  315. package/_src/lib/fileUtil.ts +0 -56
  316. package/_src/services/CUPS/service.ts +0 -16
  317. package/_src/services/CUPS.ts +0 -105
  318. package/_src/services/Cache.ts +0 -45
  319. package/_src/services/ServiceBus.ts +0 -111
  320. package/_src/services/memQueue.ts +0 -30
  321. package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +0 -7
  322. package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +0 -28
  323. package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +0 -30
  324. package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +0 -293
  325. package/_src/vendor/Cache/Cache/_internal/CacheState.ts +0 -56
  326. package/_src/vendor/Cache/Cache/_internal/KeySet.ts +0 -58
  327. package/_src/vendor/Cache/Cache/_internal/MapKey.ts +0 -43
  328. package/_src/vendor/Cache/Cache/_internal/MapValue.ts +0 -39
  329. package/_src/vendor/Cache/Cache/definition.ts +0 -112
  330. package/_src/vendor/Cache/Cache/operations/make.ts +0 -17
  331. package/_src/vendor/Cache/Cache/operations/makeWith.ts +0 -32
  332. package/_src/vendor/Cache/Cache/operations.ts +0 -4
  333. package/_src/vendor/Cache/Cache.ts +0 -4
  334. package/_src/vendor/Cache/CacheStats/definition.ts +0 -23
  335. package/_src/vendor/Cache/CacheStats.ts +0 -3
  336. package/_src/vendor/Cache/EntryStats/definition.ts +0 -19
  337. package/_src/vendor/Cache/EntryStats.ts +0 -3
  338. package/_src/vendor/Cache/Lookup/definition.ts +0 -15
  339. package/_src/vendor/Cache/Lookup.ts +0 -3
  340. package/_src/vendor/Cache/global.ts.bak +0 -23
  341. package/_src/vendor/Cache/index.ts +0 -4
  342. package/dist/ext.d.ts +0 -2
  343. package/dist/ext.d.ts.map +0 -1
  344. package/dist/ext.js +0 -2
  345. package/dist/lib/RequestContext.d.ts.map +0 -1
  346. package/dist/lib/RequestContext.js +0 -52
  347. package/dist/lib/api/authorization.jwt.d.ts.map +0 -1
  348. package/dist/lib/api/defaultErrorHandler.d.ts.map +0 -1
  349. package/dist/lib/api/reportError.d.ts.map +0 -1
  350. package/dist/lib/api/routing.d.ts.map +0 -1
  351. package/dist/lib/api/routing.js +0 -248
  352. package/dist/lib/api/setupRequest.d.ts.map +0 -1
  353. package/dist/lib/api/util.d.ts.map +0 -1
  354. package/dist/lib/api/util.js +0 -14
  355. package/dist/lib/api/writeDocs.d.ts.map +0 -1
  356. package/dist/lib/api/writeDocs.js +0 -23
  357. package/dist/lib/errorReporter.d.ts.map +0 -1
  358. package/dist/lib/errorReporter.js +0 -45
  359. package/dist/lib/ext/Array.d.ts.map +0 -1
  360. package/dist/lib/fileUtil.d.ts +0 -22
  361. package/dist/lib/fileUtil.d.ts.map +0 -1
  362. package/dist/lib/fileUtil.js +0 -23
  363. package/dist/lib/filter/types/errors.d.ts.map +0 -1
  364. package/dist/lib/filter/types/fields.d.ts.map +0 -1
  365. package/dist/lib/filter/types/index.d.ts.map +0 -1
  366. package/dist/lib/filter/types/path/common.d.ts.map +0 -1
  367. package/dist/lib/filter/types/path/eager.d.ts.map +0 -1
  368. package/dist/lib/filter/types/path/index.d.ts.map +0 -1
  369. package/dist/lib/filter/types/utils.d.ts.map +0 -1
  370. package/dist/lib/filter/types/validator.d.ts.map +0 -1
  371. package/dist/lib/filter.d.ts.map +0 -1
  372. package/dist/lib/filter.js +0 -171
  373. package/dist/lib/instrument.d.ts.map +0 -1
  374. package/dist/lib/rateLimit.d.ts.map +0 -1
  375. package/dist/services/CUPS/service.d.ts +0 -19
  376. package/dist/services/CUPS/service.d.ts.map +0 -1
  377. package/dist/services/CUPS/service.js +0 -5
  378. package/dist/services/CUPS.d.ts +0 -10
  379. package/dist/services/CUPS.d.ts.map +0 -1
  380. package/dist/services/CUPS.js +0 -89
  381. package/dist/services/Cache.d.ts +0 -28
  382. package/dist/services/Cache.d.ts.map +0 -1
  383. package/dist/services/Cache.js +0 -28
  384. package/dist/services/ServiceBus.d.ts +0 -26
  385. package/dist/services/ServiceBus.d.ts.map +0 -1
  386. package/dist/services/ServiceBus.js +0 -53
  387. package/dist/services/memQueue.d.ts +0 -18
  388. package/dist/services/memQueue.d.ts.map +0 -1
  389. package/dist/services/memQueue.js +0 -24
  390. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +0 -5
  391. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +0 -1
  392. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +0 -7
  393. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +0 -8
  394. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +0 -1
  395. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +0 -22
  396. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +0 -10
  397. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +0 -1
  398. package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +0 -25
  399. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +0 -51
  400. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +0 -1
  401. package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +0 -253
  402. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +0 -33
  403. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +0 -1
  404. package/dist/vendor/Cache/Cache/_internal/CacheState.js +0 -21
  405. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +0 -20
  406. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +0 -1
  407. package/dist/vendor/Cache/Cache/_internal/KeySet.js +0 -61
  408. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +0 -24
  409. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +0 -1
  410. package/dist/vendor/Cache/Cache/_internal/MapKey.js +0 -37
  411. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +0 -32
  412. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +0 -1
  413. package/dist/vendor/Cache/Cache/_internal/MapValue.js +0 -24
  414. package/dist/vendor/Cache/Cache/definition.d.ts +0 -100
  415. package/dist/vendor/Cache/Cache/definition.d.ts.map +0 -1
  416. package/dist/vendor/Cache/Cache/definition.js +0 -5
  417. package/dist/vendor/Cache/Cache/operations/make.d.ts +0 -12
  418. package/dist/vendor/Cache/Cache/operations/make.d.ts.map +0 -1
  419. package/dist/vendor/Cache/Cache/operations/make.js +0 -12
  420. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +0 -14
  421. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +0 -1
  422. package/dist/vendor/Cache/Cache/operations/makeWith.js +0 -15
  423. package/dist/vendor/Cache/Cache/operations.d.ts +0 -3
  424. package/dist/vendor/Cache/Cache/operations.d.ts.map +0 -1
  425. package/dist/vendor/Cache/Cache/operations.js +0 -4
  426. package/dist/vendor/Cache/Cache.d.ts +0 -3
  427. package/dist/vendor/Cache/Cache.d.ts.map +0 -1
  428. package/dist/vendor/Cache/Cache.js +0 -4
  429. package/dist/vendor/Cache/CacheStats/definition.d.ts +0 -19
  430. package/dist/vendor/Cache/CacheStats/definition.d.ts.map +0 -1
  431. package/dist/vendor/Cache/CacheStats/definition.js +0 -6
  432. package/dist/vendor/Cache/CacheStats.d.ts +0 -2
  433. package/dist/vendor/Cache/CacheStats.d.ts.map +0 -1
  434. package/dist/vendor/Cache/CacheStats.js +0 -3
  435. package/dist/vendor/Cache/EntryStats/definition.d.ts +0 -17
  436. package/dist/vendor/Cache/EntryStats/definition.d.ts.map +0 -1
  437. package/dist/vendor/Cache/EntryStats/definition.js +0 -4
  438. package/dist/vendor/Cache/EntryStats.d.ts +0 -2
  439. package/dist/vendor/Cache/EntryStats.d.ts.map +0 -1
  440. package/dist/vendor/Cache/EntryStats.js +0 -3
  441. package/dist/vendor/Cache/Lookup/definition.d.ts +0 -17
  442. package/dist/vendor/Cache/Lookup/definition.d.ts.map +0 -1
  443. package/dist/vendor/Cache/Lookup/definition.js +0 -2
  444. package/dist/vendor/Cache/Lookup.d.ts +0 -2
  445. package/dist/vendor/Cache/Lookup.d.ts.map +0 -1
  446. package/dist/vendor/Cache/Lookup.js +0 -3
  447. package/dist/vendor/Cache/index.d.ts +0 -5
  448. package/dist/vendor/Cache/index.d.ts.map +0 -1
  449. package/dist/vendor/Cache/index.js +0 -5
File without changes
@@ -2,7 +2,7 @@ import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
2
2
  import type { ResponseError } from "@sendgrid/mail"
3
3
  import type sgMail from "@sendgrid/mail"
4
4
 
5
- import type { RequestContext } from "../../lib/RequestContext.js"
5
+ import type { RequestContext } from "../../RequestContext.js"
6
6
 
7
7
  export interface Emailer {
8
8
  sendMail: (msg: EmailMsgOptionalFrom) => Effect<RequestContext, Error | ResponseError, void>
@@ -2,7 +2,7 @@
2
2
  // Modify = Must `set` updated items, and can return anything.
3
3
  import type { InvalidStateError, OptimisticConcurrencyException } from "../errors.js"
4
4
  import { NotFoundError } from "../errors.js"
5
- import type { RequestContext } from "../lib/RequestContext.js"
5
+ import type { RequestContext } from "../RequestContext.js"
6
6
  import { ContextMap} from "../services/Store.js";
7
7
  import type { Filter } from "../services/Store.js"
8
8
  import type { FixEnv, PureLogT} from "@effect-app/prelude/_ext/Pure";
@@ -1,6 +1,6 @@
1
1
  import type { StoreWhereFilter, Where } from "@effect-app/infra/services/Store"
2
2
  import { expect, test } from "vitest"
3
- import { makeFilters } from "../../lib/filter.js"
3
+ import { makeFilters } from "../../filter.js"
4
4
  import { buildWhereCosmosQuery } from "./Cosmos.js"
5
5
 
6
6
  const f_ = makeFilters<Something>()
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import * as fu from "@effect-app/infra-adapters/simpledb/fileutil"
2
+ import * as fu from "../simpledb/fileutil.js"
3
3
 
4
4
  import fs from "fs"
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { expect, test } from "vitest"
2
2
  import type { StoreWhereFilter, Where } from "@effect-app/infra/services/Store"
3
- import { makeFilters } from "../../lib/filter.js"
3
+ import { makeFilters } from "../../filter.js"
4
4
  import { codeFilter } from "./utils.js"
5
5
 
6
6
 
@@ -0,0 +1,134 @@
1
+ import type { IndexingPolicy } from "@azure/cosmos"
2
+ import { typedKeysOf } from "@effect-app/core/utils"
3
+
4
+ import * as Cosmos from "@effect-app/infra-adapters/cosmos-client"
5
+ import type { CachedRecord, DBRecord } from "./shared.js"
6
+ import { OptimisticLockException } from "./shared.js"
7
+ import * as simpledb from "./simpledb.js"
8
+ import type { Version } from "./simpledb.js"
9
+
10
+ class CosmosDbOperationError {
11
+ constructor(readonly message: string) {}
12
+ }
13
+
14
+ const setup = (type: string, indexingPolicy: IndexingPolicy) =>
15
+ Cosmos.db.tap(db =>
16
+ Effect.tryPromise(() =>
17
+ db.containers
18
+ .create({ id: type, indexingPolicy })
19
+ .catch(err => console.warn(err))
20
+ )
21
+ )
22
+ // TODO: Error if current indexingPolicy does not match
23
+ // Effect.flatMap((db) => Effect.tryPromise(() => db.container(type).(indexes)))
24
+ export function createContext<TKey extends string, EA, A extends DBRecord<TKey>>() {
25
+ return <REncode, RDecode, EDecode>(
26
+ type: string,
27
+ encode: (record: A) => Effect<REncode, never, EA>,
28
+ decode: (d: EA) => Effect<RDecode, EDecode, A>,
29
+ // schemaVersion: string,
30
+ indexes: IndexingPolicy
31
+ ) => {
32
+ return setup(type, indexes).map(() => ({
33
+ find: simpledb.find(find, decode, type),
34
+ findBy,
35
+ save: simpledb.storeDirectly(store, type)
36
+ }))
37
+
38
+ function find(id: string) {
39
+ return Cosmos.db
40
+ .flatMap(db => Effect.tryPromise(() => db.container(type).item(id).read<{ data: EA }>()))
41
+ .map(i => Opt.fromNullable(i.resource))
42
+ .map(
43
+ _ =>
44
+ _.map(
45
+ ({ _etag, data }) => ({ version: _etag, data } as CachedRecord<EA>)
46
+ )
47
+ )
48
+ }
49
+
50
+ function findBy(parameters: Record<string, string>) {
51
+ return Cosmos.db
52
+ .flatMap(db =>
53
+ Effect.tryPromise(() =>
54
+ db
55
+ .container(type)
56
+ .items.query({
57
+ query: `
58
+ SELECT TOP 1 ${type}.id
59
+ FROM ${type} i
60
+ WHERE (
61
+ ${
62
+ typedKeysOf(parameters)
63
+ .map(k => `i.${k} = @${k}`)
64
+ .join(" and ")
65
+ }
66
+ )
67
+ `,
68
+ parameters: typedKeysOf(parameters).map(p => ({
69
+ name: `@${p}`,
70
+ value: parameters[p]!
71
+ }))
72
+ })
73
+ .fetchAll()
74
+ )
75
+ )
76
+ .map(x => x.resources.head)
77
+ .map(_ => _.map(_ => _.id))
78
+ }
79
+
80
+ function store(record: A, currentVersion: Opt<Version>) {
81
+ return Effect.gen(function*($) {
82
+ const version = "_etag" // we get this from the etag anyway.
83
+
84
+ const db = yield* $(Cosmos.db)
85
+ const data = yield* $(encode(record))
86
+
87
+ yield* $(
88
+ currentVersion.match(
89
+ () =>
90
+ Effect.tryPromise(() =>
91
+ db.container(type).items.create({
92
+ id: record.id,
93
+ timestamp: new Date(),
94
+ data
95
+ })
96
+ ).asUnit.orDie,
97
+ currentVersion =>
98
+ Effect.tryPromise(() =>
99
+ db
100
+ .container(type)
101
+ .item(record.id)
102
+ .replace(
103
+ {
104
+ id: record.id,
105
+ timestamp: new Date(),
106
+ data
107
+ },
108
+ {
109
+ accessCondition: {
110
+ type: "IfMatch",
111
+ condition: currentVersion
112
+ }
113
+ }
114
+ )
115
+ ).orDie.flatMap(x => {
116
+ if (x.statusCode === 412) {
117
+ return Effect.fail(new OptimisticLockException(type, record.id))
118
+ }
119
+ if (x.statusCode > 299 || x.statusCode < 200) {
120
+ return Effect.die(
121
+ new CosmosDbOperationError(
122
+ "not able to update record: " + x.statusCode
123
+ )
124
+ )
125
+ }
126
+ return Effect.unit
127
+ })
128
+ )
129
+ )
130
+ return { version, data: record } as CachedRecord<A>
131
+ })
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,158 @@
1
+ import { flow, pipe } from "@effect-app/core/Function"
2
+ import fs from "fs"
3
+ import * as PLF from "proper-lockfile"
4
+
5
+ import { pretty } from "@effect-app/core/utils"
6
+ import * as fu from "./fileutil.js"
7
+ import type { CachedRecord, DBRecord, Index } from "./shared.js"
8
+ import { ConnectionException, CouldNotAquireDbLockException, getIndexName, getRecordName } from "./shared.js"
9
+ import * as simpledb from "./simpledb.js"
10
+ import type { Version } from "./simpledb.js"
11
+
12
+ export function createContext<TKey extends string, EA, A extends DBRecord<TKey>>() {
13
+ return <REncode, RDecode, EDecode>(
14
+ type: string,
15
+ encode: (record: A) => Effect<REncode, never, EA>,
16
+ decode: (d: EA) => Effect<RDecode, EDecode, A>,
17
+ schemaVersion: string,
18
+ makeIndexKey: (r: A) => Index,
19
+ dir = "./data.js"
20
+ ) => {
21
+ initialise(dir)
22
+ const globalLock = "global.lock"
23
+ const typeLockKey = getIdxName(type, globalLock)
24
+ if (!fs.existsSync(typeLockKey)) {
25
+ fs.writeFileSync(typeLockKey, "", "utf-8")
26
+ }
27
+
28
+ return {
29
+ find: simpledb.find(find(type), decode, type),
30
+ findByIndex: getIdx,
31
+ save: simpledb.store(find(type), store, lockRecordOnDisk(type), type)
32
+ }
33
+
34
+ function store(record: A, currentVersion: Opt<Version>) {
35
+ const version = currentVersion
36
+ .map(cv => (parseInt(cv) + 1).toString())
37
+ .getOrElse(() => "1")
38
+ const getData = flow(
39
+ encode,
40
+ _ => _.map(data => pretty({ version, timestamp: new Date(), data }))
41
+ )
42
+
43
+ const idx = makeIndexKey(record)
44
+ return currentVersion.isSome()
45
+ ? lockIndex(record)
46
+ .zipRight(
47
+ readIndex(idx).flatMap(x =>
48
+ x[record.id]
49
+ ? Effect.fail(() => new Error("Combination already exists, abort"))
50
+ : getData(record)
51
+ .flatMap(serialised => fu.writeTextFile(getFilename(type, record.id), serialised))
52
+ .zipRight(writeIndex(idx, { ...x, [idx.key]: record.id }))
53
+ ).orDie
54
+ )
55
+ .scoped.map(() => ({ version, data: record } as CachedRecord<A>))
56
+ : getData(record)
57
+ .flatMap(serialised => fu.writeTextFile(getFilename(type, record.id), serialised))
58
+ .map(() => ({ version, data: record } as CachedRecord<A>))
59
+ }
60
+
61
+ function lockIndex(record: A) {
62
+ const index = makeIndexKey(record)
63
+ return lockDiskIndex(index)
64
+ }
65
+
66
+ function lockDiskIndex(_: Index) {
67
+ /*
68
+ Disk index locks require a file to exist already, hence for now we use a global index lock.
69
+ */
70
+ // const lockKey = getIdxKey(index)
71
+ const lockKey = globalLock
72
+ return lockIndexOnDisk(type)(lockKey)
73
+ }
74
+
75
+ function lockRecordOnDisk(type: string) {
76
+ return (id: string) =>
77
+ lockFile(getFilename(type, id)).mapBoth(
78
+ err => new CouldNotAquireDbLockException(type, id, err as Error),
79
+ release => ({ release })
80
+ ).acquireRelease(
81
+ l => l.release
82
+ )
83
+ }
84
+
85
+ function lockIndexOnDisk(type: string) {
86
+ return (id: string) =>
87
+ lockFile(getIdxName(type, id)).mapBoth(
88
+ err => new CouldNotAquireDbLockException(type, id, err as Error),
89
+ release => ({ release })
90
+ ).acquireRelease(
91
+ l => l.release
92
+ )
93
+ }
94
+
95
+ function readFile(filePath: string) {
96
+ return fu
97
+ .readTextFile(filePath)
98
+ .catchAll(err => Effect.die(new ConnectionException(err as Error)))
99
+ }
100
+
101
+ function find(type: string) {
102
+ return (id: string) => {
103
+ return tryRead(getFilename(type, id)).map(
104
+ _ => _.map(s => JSON.parse(s) as CachedRecord<EA>)
105
+ )
106
+ }
107
+ }
108
+
109
+ function getIdx(index: Index) {
110
+ return readIndex(index).map(idx => Opt.fromNullable(idx[index.key]))
111
+ }
112
+
113
+ function readIndex(index: Index) {
114
+ return tryRead(getIdxName(type, index.doc)).map(
115
+ _ =>
116
+ _.match(
117
+ () => ({} as Record<string, TKey>),
118
+ x => JSON.parse(x) as Record<string, TKey>
119
+ )
120
+ )
121
+ }
122
+
123
+ function writeIndex(index: Index, content: Record<string, TKey>) {
124
+ return pipe(JSON.stringify(content), serialised => fu.writeTextFile(getIdxName(type, index.doc), serialised))
125
+ }
126
+
127
+ function tryRead(filePath: string) {
128
+ return fu
129
+ .fileExists(filePath)
130
+ .flatMap(exists => !exists ? Effect(Opt.none) : readFile(filePath).map(Opt.some))
131
+ }
132
+
133
+ function getFilename(type: string, id: string) {
134
+ return `${dir}/v${schemaVersion}.${getRecordName(type, id)}.json`
135
+ }
136
+
137
+ function getIdxName(type: string, id: string) {
138
+ return `${dir}/v${schemaVersion}.${getIndexName(type, id)}.json`
139
+ }
140
+ }
141
+ }
142
+
143
+ function lockFile(fileName: string) {
144
+ return Effect.tryPromise(() => PLF.lock(fileName).then(flow(Effect.tryPromise, _ => _.orDie)))
145
+ }
146
+
147
+ // TODO: ugh.
148
+ let initialised = false
149
+ export function initialise(dir: string) {
150
+ if (initialised) {
151
+ return
152
+ }
153
+
154
+ if (!fs.existsSync(dir)) {
155
+ fs.mkdirSync(dir)
156
+ }
157
+ initialised = true
158
+ }
@@ -0,0 +1,28 @@
1
+ import fs from "fs"
2
+ import { promisify } from "util"
3
+
4
+ const readFile = promisify(fs.readFile)
5
+ const writeFile = promisify(fs.writeFile)
6
+ const rename = promisify(fs.rename)
7
+ const exists = promisify(fs.exists)
8
+ // const mkdir = promisify(fs.mkdir)
9
+ // const unlinkFile = promisify(fs.unlink)
10
+
11
+ /**
12
+ * Safe write file to .tmp and then rename
13
+ */
14
+ export function writeTextFile(fileName: string, content: string) {
15
+ const tmp = fileName + ".tmp"
16
+ return (
17
+ Effect.tryPromise(() => writeFile(tmp, content, "utf-8")) >
18
+ Effect.tryPromise(() => rename(tmp, fileName))
19
+ ).orDie
20
+ }
21
+
22
+ export function fileExists(fileName: string) {
23
+ return Effect.tryPromise(() => exists(fileName)).orDie
24
+ }
25
+
26
+ export function readTextFile(fileName: string) {
27
+ return Effect.tryPromise(() => readFile(fileName, "utf-8"))
28
+ }
@@ -0,0 +1,6 @@
1
+ export * as disk from "./diskdb.js"
2
+ export * as mem from "./memdb.js"
3
+ export * as mongo from "./mongodb.js"
4
+ export * as redis from "./redisdb.js"
5
+ export * from "./shared.js"
6
+ export * as SDB from "./simpledb.js"
@@ -0,0 +1,79 @@
1
+ import { flow } from "@effect-app/core/Function"
2
+ import * as MO from "@effect-app/schema"
3
+ import type * as Eq from "@effect-ts/core/Equal"
4
+
5
+ import type { CachedRecord, DBRecord } from "./shared.js"
6
+ import { getRecordName, makeMap, SerializedDBRecord } from "./shared.js"
7
+ import * as simpledb from "./simpledb.js"
8
+ import type { Version } from "./simpledb.js"
9
+
10
+ // When we are in-process, we want to share the same Storage
11
+ // Do not try this at home.
12
+ const storage = makeMap<string, string>()
13
+
14
+ const parseSDB = SerializedDBRecord.Parser >= MO.condemnFail
15
+
16
+ export function createContext<TKey extends string, EA, A extends DBRecord<TKey>>() {
17
+ return <REncode, RDecode, EDecode>(
18
+ type: string,
19
+ encode: (record: A) => Effect<REncode, never, EA>,
20
+ decode: (d: EA) => Effect<RDecode, EDecode, A>
21
+ ) => {
22
+ return {
23
+ find: simpledb.find(find, decode, type),
24
+ findBy,
25
+ save: simpledb.store(find, store, bogusLock, type)
26
+ }
27
+
28
+ function find(id: string) {
29
+ return storage
30
+ .find(getRecordName(type, id))
31
+ .map(_ => _.map(s => JSON.parse(s) as unknown))
32
+ .flatMapOpt(parseSDB)
33
+ .mapOpt(({ data, version }) => ({
34
+ data: JSON.parse(data) as EA,
35
+ version
36
+ }))
37
+ }
38
+
39
+ function findBy<V extends Partial<A>>(keys: V, eq: Eq.Equal<V>) {
40
+ // Naive implementation, fine for in memory testing purposes.
41
+ return Effect.gen(function*($) {
42
+ for (const [, value] of storage) {
43
+ const sdb_ = JSON.parse(value) as unknown
44
+ const sdb = yield* $(parseSDB(sdb_))
45
+ const cr = { data: JSON.parse(sdb.data) as EA, version: sdb.version }
46
+ const r = yield* $(
47
+ decode(cr.data).flatMap(d =>
48
+ eq.equals(keys, d as unknown as V)
49
+ ? Effect(d)
50
+ : Effect.fail("not equals")
51
+ ).exit
52
+ )
53
+ if (r.isSuccess()) {
54
+ return r.value
55
+ }
56
+ }
57
+ return null
58
+ }).map(Opt.fromNullable)
59
+ }
60
+
61
+ function store(record: A, currentVersion: Opt<Version>) {
62
+ const version = currentVersion
63
+ .map(cv => (parseInt(cv) + 1).toString())
64
+ .getOrElse(() => "1")
65
+
66
+ const getData = flow(
67
+ encode,
68
+ _ => _.map(JSON.stringify).map(data => JSON.stringify({ version, timestamp: new Date(), data }))
69
+ )
70
+ return getData(record)
71
+ .flatMap(serialised => storage.set(getRecordName(type, record.id), serialised))
72
+ .map(() => ({ version, data: record } as CachedRecord<A>))
73
+ }
74
+ }
75
+ }
76
+
77
+ function bogusLock() {
78
+ return Effect.unit.acquireRelease(() => Effect.unit)
79
+ }
@@ -0,0 +1,99 @@
1
+ import type { IndexDescription, InsertOneOptions } from "mongodb"
2
+
3
+ import * as Mongo from "@effect-app/infra-adapters/mongo-client"
4
+ import type { CachedRecord, DBRecord } from "./shared.js"
5
+ import { OptimisticLockException } from "./shared.js"
6
+ import * as simpledb from "./simpledb.js"
7
+ import type { Version } from "./simpledb.js"
8
+
9
+ // const makeFromIndexKeys = (indexKeys: string[], unique: boolean) => indexKeys.reduce((prev, cur) => {
10
+ // prev[cur] = 1
11
+ // return prev
12
+ // }, {} as Record<string, number>)
13
+
14
+ const setup = (type: string, indexes: IndexDescription[]) =>
15
+ Mongo.db
16
+ .tap(db => Effect.tryPromise(() => db.createCollection(type).catch(err => console.warn(err))))
17
+ .flatMap(db => Effect.tryPromise(() => db.collection(type).createIndexes(indexes)))
18
+
19
+ export function createContext<TKey extends string, EA, A extends DBRecord<TKey>>() {
20
+ return <REncode, RDecode, EDecode>(
21
+ type: string,
22
+ encode: (record: A) => Effect<REncode, never, EA>,
23
+ decode: (d: EA) => Effect<RDecode, EDecode, A>,
24
+ // schemaVersion: string,
25
+ indexes: IndexDescription[]
26
+ ) => {
27
+ return setup(type, indexes).map(() => ({
28
+ find: simpledb.find(find, decode, type),
29
+ findBy,
30
+ save: simpledb.storeDirectly(store, type)
31
+ }))
32
+
33
+ function find(id: string) {
34
+ return Mongo.db
35
+ .flatMap(db =>
36
+ Effect.tryPromise(() =>
37
+ db
38
+ .collection(type)
39
+ .findOne<{ _id: TKey; version: Version; data: EA }>({ _id: id })
40
+ )
41
+ )
42
+ .map(Opt.fromNullable)
43
+ .mapOpt(({ data, version }) => ({ version, data } as CachedRecord<EA>))
44
+ }
45
+
46
+ function findBy(keys: Record<string, string>) {
47
+ return Mongo.db
48
+ .flatMap(db =>
49
+ Effect.tryPromise(() => db.collection(type).findOne<{ _id: TKey }>(keys, { projection: { _id: 1 } }))
50
+ )
51
+ .map(Opt.fromNullable)
52
+ .mapOpt(({ _id }) => _id)
53
+ }
54
+
55
+ function store(record: A, currentVersion: Opt<Version>) {
56
+ return Effect.gen(function*($) {
57
+ const version = currentVersion
58
+ .map(cv => (parseInt(cv) + 1).toString())
59
+ .getOrElse(() => "1")
60
+
61
+ const db = yield* $(Mongo.db)
62
+ const data = yield* $(encode(record))
63
+ yield* $(
64
+ currentVersion.match(
65
+ () =>
66
+ Effect.tryPromise(() =>
67
+ db
68
+ .collection(type)
69
+ .insertOne(
70
+ { _id: record.id as any, version, timestamp: new Date(), data },
71
+ {
72
+ checkKeys: false // support for keys with `.` and `$`. NOTE: you can write them, read them, but NOT query for them.
73
+ } as InsertOneOptions
74
+ )
75
+ ).asUnit.orDie,
76
+ currentVersion =>
77
+ Effect.tryPromise(() =>
78
+ db.collection(type).replaceOne(
79
+ { _id: record.id, version: currentVersion },
80
+ {
81
+ version,
82
+ timestamp: new Date(),
83
+ data
84
+ },
85
+ { upsert: false }
86
+ )
87
+ ).orDie.flatMap(x => {
88
+ if (!x.modifiedCount) {
89
+ return Effect.fail(new OptimisticLockException(type, record.id))
90
+ }
91
+ return Effect.unit
92
+ })
93
+ )
94
+ )
95
+ return { version, data: record } as CachedRecord<A>
96
+ })
97
+ }
98
+ }
99
+ }