@effect-app/infra 0.7.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 (438) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-314902b6271c341511f7398a50469024 +0 -0
  3. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-3f072cc7afa09b6adaead0527ab9df83 +0 -0
  4. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-74c3c295c110fc861b6a4c673afc3e24 +0 -0
  5. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-bf6dae8cb9ea9740ceb39aefaf12716c +0 -0
  6. package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-cf9d1486029526079a5f68f2041dea02 +0 -0
  7. package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-b4710ed9fb3d0757c4bf23045c585670 +0 -0
  8. package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-ee17e5395bb1b7b36a4e2e22a6ae1449 +0 -0
  9. package/.jest-cache/haste-map-7dc16d7fae8c072843ed1c69eae73100-a8a4225b317477b49bca31f54559afb3-c16136699bb7f463be85273162b447c3 +0 -0
  10. package/.jest-cache/haste-map-9aa1e395a82e108eb49698982c574272-e2f1f4b6d87214e3c49442fed31f310c-f7435f46fc41ac5a13d06a49cae9a650 +0 -0
  11. package/.jest-cache/haste-map-9d206b45d610536c9ec65eec263c6964-a8a4225b317477b49bca31f54559afb3-3510506a330b44f1ae629033aac8fbb3 +0 -0
  12. package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-17b550b450b18840c25861aa6e835f0c +0 -0
  13. package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-4dc31290b1efc98335eb4c89167d75c3 +0 -0
  14. package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-997106edf4bbc31567a378146180e45e +0 -0
  15. package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-f0cd25414f9ed16c446940ca3aa23c1b +0 -0
  16. package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-2cac07d09e6384e2d37c49714edad0ba +0 -0
  17. package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-d7967c2976c5feac7161c964f0aa442f +0 -0
  18. package/.jest-cache/haste-map-fb1a173276d25bbff02f815600059283-938122bdc1c8836874b6585d7acb2e99-f705929cca05ce95ceaa6d520b560ce8 +0 -0
  19. package/.prettierignore +6 -0
  20. package/_cjs/_global.cjs +6 -0
  21. package/_cjs/_global.cjs.map +1 -0
  22. package/_cjs/_global.ext.cjs +6 -0
  23. package/_cjs/_global.ext.cjs.map +1 -0
  24. package/_cjs/_global.schema.cjs +5 -0
  25. package/_cjs/_global.schema.cjs.map +1 -0
  26. package/_cjs/errors.cjs +82 -0
  27. package/_cjs/errors.cjs.map +1 -0
  28. package/_cjs/ext.cjs +4 -0
  29. package/_cjs/ext.cjs.map +1 -0
  30. package/_cjs/index.cjs +6 -0
  31. package/_cjs/index.cjs.map +1 -0
  32. package/_cjs/lib/RequestContext.cjs +70 -0
  33. package/_cjs/lib/RequestContext.cjs.map +1 -0
  34. package/_cjs/lib/api/authorization.jwt.cjs +44 -0
  35. package/_cjs/lib/api/authorization.jwt.cjs.map +1 -0
  36. package/_cjs/lib/api/defaultErrorHandler.cjs +45 -0
  37. package/_cjs/lib/api/defaultErrorHandler.cjs.map +1 -0
  38. package/_cjs/lib/api/reportError.cjs +64 -0
  39. package/_cjs/lib/api/reportError.cjs.map +1 -0
  40. package/_cjs/lib/api/routing.cjs +262 -0
  41. package/_cjs/lib/api/routing.cjs.map +1 -0
  42. package/_cjs/lib/api/setupRequest.cjs +35 -0
  43. package/_cjs/lib/api/setupRequest.cjs.map +1 -0
  44. package/_cjs/lib/api/util.cjs +17 -0
  45. package/_cjs/lib/api/util.cjs.map +1 -0
  46. package/_cjs/lib/api/writeDocs.cjs +31 -0
  47. package/_cjs/lib/api/writeDocs.cjs.map +1 -0
  48. package/_cjs/lib/errorReporter.cjs +72 -0
  49. package/_cjs/lib/errorReporter.cjs.map +1 -0
  50. package/_cjs/lib/ext/Array.cjs +30 -0
  51. package/_cjs/lib/ext/Array.cjs.map +1 -0
  52. package/_cjs/lib/fileUtil.cjs +36 -0
  53. package/_cjs/lib/fileUtil.cjs.map +1 -0
  54. package/_cjs/lib/filter/types/errors.cjs +6 -0
  55. package/_cjs/lib/filter/types/errors.cjs.map +1 -0
  56. package/_cjs/lib/filter/types/fields.cjs +6 -0
  57. package/_cjs/lib/filter/types/fields.cjs.map +1 -0
  58. package/_cjs/lib/filter/types/index.cjs +61 -0
  59. package/_cjs/lib/filter/types/index.cjs.map +1 -0
  60. package/_cjs/lib/filter/types/path/common.cjs +6 -0
  61. package/_cjs/lib/filter/types/path/common.cjs.map +1 -0
  62. package/_cjs/lib/filter/types/path/eager.cjs +6 -0
  63. package/_cjs/lib/filter/types/path/eager.cjs.map +1 -0
  64. package/_cjs/lib/filter/types/path/index.cjs +8 -0
  65. package/_cjs/lib/filter/types/path/index.cjs.map +1 -0
  66. package/_cjs/lib/filter/types/utils.cjs +6 -0
  67. package/_cjs/lib/filter/types/utils.cjs.map +1 -0
  68. package/_cjs/lib/filter/types/validator.cjs +6 -0
  69. package/_cjs/lib/filter/types/validator.cjs.map +1 -0
  70. package/_cjs/lib/filter.cjs +238 -0
  71. package/_cjs/lib/filter.cjs.map +1 -0
  72. package/_cjs/lib/instrument.cjs +20 -0
  73. package/_cjs/lib/instrument.cjs.map +1 -0
  74. package/_cjs/lib/rateLimit.cjs +88 -0
  75. package/_cjs/lib/rateLimit.cjs.map +1 -0
  76. package/_cjs/services/CUPS/service.cjs +15 -0
  77. package/_cjs/services/CUPS/service.cjs.map +1 -0
  78. package/_cjs/services/CUPS.cjs +113 -0
  79. package/_cjs/services/CUPS.cjs.map +1 -0
  80. package/_cjs/services/Cache.cjs +39 -0
  81. package/_cjs/services/Cache.cjs.map +1 -0
  82. package/_cjs/services/Emailer/Sendgrid.cjs +112 -0
  83. package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -0
  84. package/_cjs/services/Emailer/fake.cjs +24 -0
  85. package/_cjs/services/Emailer/fake.cjs.map +1 -0
  86. package/_cjs/services/Emailer/service.cjs +12 -0
  87. package/_cjs/services/Emailer/service.cjs.map +1 -0
  88. package/_cjs/services/Emailer.cjs +17 -0
  89. package/_cjs/services/Emailer.cjs.map +1 -0
  90. package/_cjs/services/Repository.cjs +247 -0
  91. package/_cjs/services/Repository.cjs.map +1 -0
  92. package/_cjs/services/ServiceBus.cjs +69 -0
  93. package/_cjs/services/ServiceBus.cjs.map +1 -0
  94. package/_cjs/services/Store/Cosmos.cjs +324 -0
  95. package/_cjs/services/Store/Cosmos.cjs.map +1 -0
  96. package/_cjs/services/Store/Cosmos.test.cjs +59 -0
  97. package/_cjs/services/Store/Cosmos.test.cjs.map +1 -0
  98. package/_cjs/services/Store/Disk.cjs +62 -0
  99. package/_cjs/services/Store/Disk.cjs.map +1 -0
  100. package/_cjs/services/Store/Memory.cjs +70 -0
  101. package/_cjs/services/Store/Memory.cjs.map +1 -0
  102. package/_cjs/services/Store/Redis.cjs +72 -0
  103. package/_cjs/services/Store/Redis.cjs.map +1 -0
  104. package/_cjs/services/Store/codeFilter.test.cjs +61 -0
  105. package/_cjs/services/Store/codeFilter.test.cjs.map +1 -0
  106. package/_cjs/services/Store/index.cjs +72 -0
  107. package/_cjs/services/Store/index.cjs.map +1 -0
  108. package/_cjs/services/Store/service.cjs +72 -0
  109. package/_cjs/services/Store/service.cjs.map +1 -0
  110. package/_cjs/services/Store/utils.cjs +78 -0
  111. package/_cjs/services/Store/utils.cjs.map +1 -0
  112. package/_cjs/services/Store.cjs +17 -0
  113. package/_cjs/services/Store.cjs.map +1 -0
  114. package/_cjs/services/memQueue.cjs +32 -0
  115. package/_cjs/services/memQueue.cjs.map +1 -0
  116. package/_cjs/test.arbs.cjs +32 -0
  117. package/_cjs/test.arbs.cjs.map +1 -0
  118. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +14 -0
  119. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +1 -0
  120. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +29 -0
  121. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +1 -0
  122. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +32 -0
  123. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +1 -0
  124. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +266 -0
  125. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +1 -0
  126. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs +31 -0
  127. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +1 -0
  128. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +67 -0
  129. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +1 -0
  130. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +44 -0
  131. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +1 -0
  132. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +33 -0
  133. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +1 -0
  134. package/_cjs/vendor/Cache/Cache/definition.cjs +13 -0
  135. package/_cjs/vendor/Cache/Cache/definition.cjs.map +1 -0
  136. package/_cjs/vendor/Cache/Cache/operations/make.cjs +20 -0
  137. package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +1 -0
  138. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs +23 -0
  139. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +1 -0
  140. package/_cjs/vendor/Cache/Cache/operations.cjs +28 -0
  141. package/_cjs/vendor/Cache/Cache/operations.cjs.map +1 -0
  142. package/_cjs/vendor/Cache/Cache.cjs +28 -0
  143. package/_cjs/vendor/Cache/Cache.cjs.map +1 -0
  144. package/_cjs/vendor/Cache/CacheStats/definition.cjs +13 -0
  145. package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +1 -0
  146. package/_cjs/vendor/Cache/CacheStats.cjs +17 -0
  147. package/_cjs/vendor/Cache/CacheStats.cjs.map +1 -0
  148. package/_cjs/vendor/Cache/EntryStats/definition.cjs +11 -0
  149. package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +1 -0
  150. package/_cjs/vendor/Cache/EntryStats.cjs +17 -0
  151. package/_cjs/vendor/Cache/EntryStats.cjs.map +1 -0
  152. package/_cjs/vendor/Cache/Lookup/definition.cjs +6 -0
  153. package/_cjs/vendor/Cache/Lookup/definition.cjs.map +1 -0
  154. package/_cjs/vendor/Cache/Lookup.cjs +17 -0
  155. package/_cjs/vendor/Cache/Lookup.cjs.map +1 -0
  156. package/_cjs/vendor/Cache/index.cjs +17 -0
  157. package/_cjs/vendor/Cache/index.cjs.map +1 -0
  158. package/_src/_global.ext.ts +34 -0
  159. package/_src/_global.schema.ts +10 -0
  160. package/_src/_global.ts +14 -0
  161. package/_src/errors.ts +50 -0
  162. package/_src/ext.ts +1 -0
  163. package/_src/index.ts +0 -0
  164. package/_src/lib/RequestContext.ts +132 -0
  165. package/_src/lib/api/authorization.jwt.ts +52 -0
  166. package/_src/lib/api/defaultErrorHandler.ts +92 -0
  167. package/_src/lib/api/reportError.ts +50 -0
  168. package/_src/lib/api/routing.ts +623 -0
  169. package/_src/lib/api/setupRequest.ts +22 -0
  170. package/_src/lib/api/util.ts +14 -0
  171. package/_src/lib/api/writeDocs.ts +26 -0
  172. package/_src/lib/errorReporter.ts +63 -0
  173. package/_src/lib/ext/Array.ts +32 -0
  174. package/_src/lib/fileUtil.ts +56 -0
  175. package/_src/lib/filter/types/errors.ts +47 -0
  176. package/_src/lib/filter/types/fields.ts +50 -0
  177. package/_src/lib/filter/types/index.ts +5 -0
  178. package/_src/lib/filter/types/path/common.ts +404 -0
  179. package/_src/lib/filter/types/path/eager.ts +146 -0
  180. package/_src/lib/filter/types/path/index.ts +14 -0
  181. package/_src/lib/filter/types/utils.ts +106 -0
  182. package/_src/lib/filter/types/validator.ts +46 -0
  183. package/_src/lib/filter.ts +323 -0
  184. package/_src/lib/instrument.ts +9 -0
  185. package/_src/lib/rateLimit.ts +126 -0
  186. package/_src/services/CUPS/service.ts +16 -0
  187. package/_src/services/CUPS.ts +105 -0
  188. package/_src/services/Cache.ts +45 -0
  189. package/_src/services/Emailer/Sendgrid.ts +123 -0
  190. package/_src/services/Emailer/fake.ts +14 -0
  191. package/_src/services/Emailer/service.ts +33 -0
  192. package/_src/services/Emailer.ts +1 -0
  193. package/_src/services/Repository.ts +513 -0
  194. package/_src/services/ServiceBus.ts +111 -0
  195. package/_src/services/Store/Cosmos.test.ts +91 -0
  196. package/_src/services/Store/Cosmos.ts +545 -0
  197. package/_src/services/Store/Disk.ts +81 -0
  198. package/_src/services/Store/Memory.ts +77 -0
  199. package/_src/services/Store/Redis.ts +92 -0
  200. package/_src/services/Store/codeFilter.test.ts +74 -0
  201. package/_src/services/Store/index.test.ts.bak +112 -0
  202. package/_src/services/Store/index.ts +62 -0
  203. package/_src/services/Store/service.ts +174 -0
  204. package/_src/services/Store/utils.ts +126 -0
  205. package/_src/services/Store.ts +1 -0
  206. package/_src/services/memQueue.ts +30 -0
  207. package/_src/test.arbs.ts +27 -0
  208. package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +7 -0
  209. package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +28 -0
  210. package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +30 -0
  211. package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +293 -0
  212. package/_src/vendor/Cache/Cache/_internal/CacheState.ts +56 -0
  213. package/_src/vendor/Cache/Cache/_internal/KeySet.ts +58 -0
  214. package/_src/vendor/Cache/Cache/_internal/MapKey.ts +43 -0
  215. package/_src/vendor/Cache/Cache/_internal/MapValue.ts +39 -0
  216. package/_src/vendor/Cache/Cache/definition.ts +112 -0
  217. package/_src/vendor/Cache/Cache/operations/make.ts +17 -0
  218. package/_src/vendor/Cache/Cache/operations/makeWith.ts +32 -0
  219. package/_src/vendor/Cache/Cache/operations.ts +4 -0
  220. package/_src/vendor/Cache/Cache.ts +4 -0
  221. package/_src/vendor/Cache/CacheStats/definition.ts +23 -0
  222. package/_src/vendor/Cache/CacheStats.ts +3 -0
  223. package/_src/vendor/Cache/EntryStats/definition.ts +19 -0
  224. package/_src/vendor/Cache/EntryStats.ts +3 -0
  225. package/_src/vendor/Cache/Lookup/definition.ts +15 -0
  226. package/_src/vendor/Cache/Lookup.ts +3 -0
  227. package/_src/vendor/Cache/global.ts.bak +23 -0
  228. package/_src/vendor/Cache/index.ts +4 -0
  229. package/dist/_global.d.ts +10 -0
  230. package/dist/_global.d.ts.map +1 -0
  231. package/dist/_global.ext.d.ts +34 -0
  232. package/dist/_global.ext.d.ts.map +1 -0
  233. package/dist/_global.ext.js +2 -0
  234. package/dist/_global.js +12 -0
  235. package/dist/_global.schema.d.ts +6 -0
  236. package/dist/_global.schema.d.ts.map +1 -0
  237. package/dist/_global.schema.js +9 -0
  238. package/dist/errors.d.ts +41 -0
  239. package/dist/errors.d.ts.map +1 -0
  240. package/dist/errors.js +51 -0
  241. package/dist/ext.d.ts +2 -0
  242. package/dist/ext.d.ts.map +1 -0
  243. package/dist/ext.js +2 -0
  244. package/dist/index.d.ts +2 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +2 -0
  247. package/dist/lib/RequestContext.d.ts +122 -0
  248. package/dist/lib/RequestContext.d.ts.map +1 -0
  249. package/dist/lib/RequestContext.js +52 -0
  250. package/dist/lib/api/authorization.jwt.d.ts +7 -0
  251. package/dist/lib/api/authorization.jwt.d.ts.map +1 -0
  252. package/dist/lib/api/authorization.jwt.js +32 -0
  253. package/dist/lib/api/defaultErrorHandler.d.ts +8 -0
  254. package/dist/lib/api/defaultErrorHandler.d.ts.map +1 -0
  255. package/dist/lib/api/defaultErrorHandler.js +37 -0
  256. package/dist/lib/api/reportError.d.ts +32 -0
  257. package/dist/lib/api/reportError.d.ts.map +1 -0
  258. package/dist/lib/api/reportError.js +44 -0
  259. package/dist/lib/api/routing.d.ts +100 -0
  260. package/dist/lib/api/routing.d.ts.map +1 -0
  261. package/dist/lib/api/routing.js +248 -0
  262. package/dist/lib/api/setupRequest.d.ts +13 -0
  263. package/dist/lib/api/setupRequest.d.ts.map +1 -0
  264. package/dist/lib/api/setupRequest.js +25 -0
  265. package/dist/lib/api/util.d.ts +3 -0
  266. package/dist/lib/api/util.d.ts.map +1 -0
  267. package/dist/lib/api/util.js +14 -0
  268. package/dist/lib/api/writeDocs.d.ts +3 -0
  269. package/dist/lib/api/writeDocs.d.ts.map +1 -0
  270. package/dist/lib/api/writeDocs.js +23 -0
  271. package/dist/lib/errorReporter.d.ts +8 -0
  272. package/dist/lib/errorReporter.d.ts.map +1 -0
  273. package/dist/lib/errorReporter.js +45 -0
  274. package/dist/lib/ext/Array.d.ts +19 -0
  275. package/dist/lib/ext/Array.d.ts.map +1 -0
  276. package/dist/lib/ext/Array.js +21 -0
  277. package/dist/lib/fileUtil.d.ts +22 -0
  278. package/dist/lib/fileUtil.d.ts.map +1 -0
  279. package/dist/lib/fileUtil.js +23 -0
  280. package/dist/lib/filter/types/errors.d.ts +30 -0
  281. package/dist/lib/filter/types/errors.d.ts.map +1 -0
  282. package/dist/lib/filter/types/errors.js +2 -0
  283. package/dist/lib/filter/types/fields.d.ts +29 -0
  284. package/dist/lib/filter/types/fields.d.ts.map +1 -0
  285. package/dist/lib/filter/types/fields.js +2 -0
  286. package/dist/lib/filter/types/index.d.ts +6 -0
  287. package/dist/lib/filter/types/index.d.ts.map +1 -0
  288. package/dist/lib/filter/types/index.js +6 -0
  289. package/dist/lib/filter/types/path/common.d.ts +316 -0
  290. package/dist/lib/filter/types/path/common.d.ts.map +1 -0
  291. package/dist/lib/filter/types/path/common.js +2 -0
  292. package/dist/lib/filter/types/path/eager.d.ts +95 -0
  293. package/dist/lib/filter/types/path/eager.d.ts.map +1 -0
  294. package/dist/lib/filter/types/path/eager.js +2 -0
  295. package/dist/lib/filter/types/path/index.d.ts +4 -0
  296. package/dist/lib/filter/types/path/index.d.ts.map +1 -0
  297. package/dist/lib/filter/types/path/index.js +4 -0
  298. package/dist/lib/filter/types/utils.d.ts +68 -0
  299. package/dist/lib/filter/types/utils.d.ts.map +1 -0
  300. package/dist/lib/filter/types/utils.js +2 -0
  301. package/dist/lib/filter/types/validator.d.ts +30 -0
  302. package/dist/lib/filter/types/validator.d.ts.map +1 -0
  303. package/dist/lib/filter/types/validator.js +2 -0
  304. package/dist/lib/filter.d.ts +133 -0
  305. package/dist/lib/filter.d.ts.map +1 -0
  306. package/dist/lib/filter.js +171 -0
  307. package/dist/lib/instrument.d.ts +7 -0
  308. package/dist/lib/instrument.d.ts.map +1 -0
  309. package/dist/lib/instrument.js +12 -0
  310. package/dist/lib/rateLimit.d.ts +43 -0
  311. package/dist/lib/rateLimit.d.ts.map +1 -0
  312. package/dist/lib/rateLimit.js +76 -0
  313. package/dist/services/CUPS/service.d.ts +19 -0
  314. package/dist/services/CUPS/service.d.ts.map +1 -0
  315. package/dist/services/CUPS/service.js +5 -0
  316. package/dist/services/CUPS.d.ts +10 -0
  317. package/dist/services/CUPS.d.ts.map +1 -0
  318. package/dist/services/CUPS.js +89 -0
  319. package/dist/services/Cache.d.ts +28 -0
  320. package/dist/services/Cache.d.ts.map +1 -0
  321. package/dist/services/Cache.js +28 -0
  322. package/dist/services/Emailer/Sendgrid.d.ts +180 -0
  323. package/dist/services/Emailer/Sendgrid.d.ts.map +1 -0
  324. package/dist/services/Emailer/Sendgrid.js +102 -0
  325. package/dist/services/Emailer/fake.d.ts +7 -0
  326. package/dist/services/Emailer/fake.d.ts.map +1 -0
  327. package/dist/services/Emailer/fake.js +15 -0
  328. package/dist/services/Emailer/service.d.ts +41 -0
  329. package/dist/services/Emailer/service.d.ts.map +1 -0
  330. package/dist/services/Emailer/service.js +3 -0
  331. package/dist/services/Emailer.d.ts +2 -0
  332. package/dist/services/Emailer.d.ts.map +1 -0
  333. package/dist/services/Emailer.js +2 -0
  334. package/dist/services/Repository.d.ts +300 -0
  335. package/dist/services/Repository.d.ts.map +1 -0
  336. package/dist/services/Repository.js +193 -0
  337. package/dist/services/ServiceBus.d.ts +26 -0
  338. package/dist/services/ServiceBus.d.ts.map +1 -0
  339. package/dist/services/ServiceBus.js +53 -0
  340. package/dist/services/Store/Cosmos.d.ts +56 -0
  341. package/dist/services/Store/Cosmos.d.ts.map +1 -0
  342. package/dist/services/Store/Cosmos.js +321 -0
  343. package/dist/services/Store/Cosmos.test.d.ts.map +1 -0
  344. package/dist/services/Store/Disk.d.ts +14 -0
  345. package/dist/services/Store/Disk.d.ts.map +1 -0
  346. package/dist/services/Store/Disk.js +52 -0
  347. package/dist/services/Store/Memory.d.ts +17 -0
  348. package/dist/services/Store/Memory.d.ts.map +1 -0
  349. package/dist/services/Store/Memory.js +60 -0
  350. package/dist/services/Store/Redis.d.ts +12 -0
  351. package/dist/services/Store/Redis.d.ts.map +1 -0
  352. package/dist/services/Store/Redis.js +59 -0
  353. package/dist/services/Store/codeFilter.test.d.ts.map +1 -0
  354. package/dist/services/Store/index.d.ts +10 -0
  355. package/dist/services/Store/index.d.ts.map +1 -0
  356. package/dist/services/Store/index.js +52 -0
  357. package/dist/services/Store/service.d.ts +113 -0
  358. package/dist/services/Store/service.d.ts.map +1 -0
  359. package/dist/services/Store/service.js +63 -0
  360. package/dist/services/Store/utils.d.ts +14 -0
  361. package/dist/services/Store/utils.d.ts.map +1 -0
  362. package/dist/services/Store/utils.js +103 -0
  363. package/dist/services/Store.d.ts +2 -0
  364. package/dist/services/Store.d.ts.map +1 -0
  365. package/dist/services/Store.js +2 -0
  366. package/dist/services/memQueue.d.ts +18 -0
  367. package/dist/services/memQueue.d.ts.map +1 -0
  368. package/dist/services/memQueue.js +24 -0
  369. package/dist/test.arbs.d.ts +13 -0
  370. package/dist/test.arbs.d.ts.map +1 -0
  371. package/dist/test.arbs.js +22 -0
  372. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +5 -0
  373. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +1 -0
  374. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +7 -0
  375. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +8 -0
  376. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +1 -0
  377. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +22 -0
  378. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +10 -0
  379. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +1 -0
  380. package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +25 -0
  381. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +51 -0
  382. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +1 -0
  383. package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +253 -0
  384. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +33 -0
  385. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +1 -0
  386. package/dist/vendor/Cache/Cache/_internal/CacheState.js +21 -0
  387. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +20 -0
  388. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +1 -0
  389. package/dist/vendor/Cache/Cache/_internal/KeySet.js +61 -0
  390. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +24 -0
  391. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +1 -0
  392. package/dist/vendor/Cache/Cache/_internal/MapKey.js +37 -0
  393. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +32 -0
  394. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +1 -0
  395. package/dist/vendor/Cache/Cache/_internal/MapValue.js +24 -0
  396. package/dist/vendor/Cache/Cache/definition.d.ts +100 -0
  397. package/dist/vendor/Cache/Cache/definition.d.ts.map +1 -0
  398. package/dist/vendor/Cache/Cache/definition.js +5 -0
  399. package/dist/vendor/Cache/Cache/operations/make.d.ts +12 -0
  400. package/dist/vendor/Cache/Cache/operations/make.d.ts.map +1 -0
  401. package/dist/vendor/Cache/Cache/operations/make.js +12 -0
  402. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +14 -0
  403. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +1 -0
  404. package/dist/vendor/Cache/Cache/operations/makeWith.js +15 -0
  405. package/dist/vendor/Cache/Cache/operations.d.ts +3 -0
  406. package/dist/vendor/Cache/Cache/operations.d.ts.map +1 -0
  407. package/dist/vendor/Cache/Cache/operations.js +4 -0
  408. package/dist/vendor/Cache/Cache.d.ts +3 -0
  409. package/dist/vendor/Cache/Cache.d.ts.map +1 -0
  410. package/dist/vendor/Cache/Cache.js +4 -0
  411. package/dist/vendor/Cache/CacheStats/definition.d.ts +19 -0
  412. package/dist/vendor/Cache/CacheStats/definition.d.ts.map +1 -0
  413. package/dist/vendor/Cache/CacheStats/definition.js +6 -0
  414. package/dist/vendor/Cache/CacheStats.d.ts +2 -0
  415. package/dist/vendor/Cache/CacheStats.d.ts.map +1 -0
  416. package/dist/vendor/Cache/CacheStats.js +3 -0
  417. package/dist/vendor/Cache/EntryStats/definition.d.ts +17 -0
  418. package/dist/vendor/Cache/EntryStats/definition.d.ts.map +1 -0
  419. package/dist/vendor/Cache/EntryStats/definition.js +4 -0
  420. package/dist/vendor/Cache/EntryStats.d.ts +2 -0
  421. package/dist/vendor/Cache/EntryStats.d.ts.map +1 -0
  422. package/dist/vendor/Cache/EntryStats.js +3 -0
  423. package/dist/vendor/Cache/Lookup/definition.d.ts +17 -0
  424. package/dist/vendor/Cache/Lookup/definition.d.ts.map +1 -0
  425. package/dist/vendor/Cache/Lookup/definition.js +2 -0
  426. package/dist/vendor/Cache/Lookup.d.ts +2 -0
  427. package/dist/vendor/Cache/Lookup.d.ts.map +1 -0
  428. package/dist/vendor/Cache/Lookup.js +3 -0
  429. package/dist/vendor/Cache/index.d.ts +5 -0
  430. package/dist/vendor/Cache/index.d.ts.map +1 -0
  431. package/dist/vendor/Cache/index.js +5 -0
  432. package/package.json +756 -0
  433. package/tsconfig.json +107 -0
  434. package/tsconfig.json.bak +47 -0
  435. package/tsplus.config.json +6 -0
  436. package/types/modules.d.ts +1 -0
  437. package/vitest.config.ts +5 -0
  438. package/wallaby.cjs +1 -0
@@ -0,0 +1,27 @@
1
+ // Do not import to frontend
2
+
3
+ import { setFaker } from "@effect-app/prelude/faker"
4
+ import type { Arbitrary } from "@effect-app/prelude/schema"
5
+ import faker from "faker"
6
+ import { Random } from "fast-check"
7
+ import * as fc from "fast-check"
8
+ import * as rand from "pure-rand"
9
+
10
+ const rnd = new Random(rand.congruential32(5))
11
+
12
+ setFaker(faker)
13
+
14
+ /**
15
+ * @tsplus getter FastCheck generate
16
+ */
17
+ export function generate<T>(arb: fc.Arbitrary<T>) {
18
+ return arb.generate(rnd, undefined)
19
+ }
20
+
21
+ /**
22
+ * @tsplus getter ets/Schema/Arbitrary/Gen generate
23
+ */
24
+
25
+ export function generateFromArbitrary<T>(arb: Arbitrary.Gen<T>) {
26
+ return generate(arb(fc))
27
+ }
@@ -0,0 +1,7 @@
1
+ import { AtomicReference } from "./AtomicReference.js"
2
+
3
+ export class AtomicBoolean extends AtomicReference<boolean> {
4
+ constructor(b: boolean) {
5
+ super(b)
6
+ }
7
+ }
@@ -0,0 +1,28 @@
1
+ import { AtomicReference } from "./AtomicReference.js"
2
+
3
+ export class AtomicNumber extends AtomicReference<number> {
4
+ constructor(n: number) {
5
+ super(n)
6
+
7
+ this.incrementAndGet = this.incrementAndGet.bind(this)
8
+ this.decrementAndGet = this.decrementAndGet.bind(this)
9
+ }
10
+
11
+ incrementAndGet() {
12
+ this.set(this.get + 1)
13
+ return this.get
14
+ }
15
+
16
+ decrementAndGet() {
17
+ this.set(this.get - 1)
18
+ return this.get
19
+ }
20
+
21
+ getAndIncrement(): number {
22
+ const ret = this.get
23
+
24
+ this.set(this.get + 1)
25
+
26
+ return ret
27
+ }
28
+ }
@@ -0,0 +1,30 @@
1
+ export class AtomicReference<A> {
2
+ private current: A
3
+
4
+ constructor(readonly initial: A) {
5
+ this.current = initial
6
+ }
7
+
8
+ get get() {
9
+ return this.current
10
+ }
11
+
12
+ getAndSet(value: A) {
13
+ const old = this.current
14
+
15
+ this.set(value)
16
+ return old
17
+ }
18
+
19
+ set(value: A) {
20
+ this.current = value
21
+ }
22
+
23
+ compareAndSet(old: A, value: A) {
24
+ if (this.get === old) {
25
+ this.set(value)
26
+ return true
27
+ }
28
+ return false
29
+ }
30
+ }
@@ -0,0 +1,293 @@
1
+ import type { Clock } from "@effect/io/Clock"
2
+ import { Deferred, done as doneDeferred } from "@effect/io/Deferred"
3
+ import type { FiberId } from "@effect/io/Fiber/Id"
4
+ import { EmptyMutableQueue } from "@fp-ts/data/MutableQueue"
5
+ import { CacheStats } from "../../CacheStats.js"
6
+ import { EntryStats } from "../../EntryStats.js"
7
+ import type { Lookup } from "../../Lookup.js"
8
+ import type { Cache } from "../definition.js"
9
+ import { CacheURI } from "../definition.js"
10
+ import { CacheState } from "./CacheState.js"
11
+ import { MapKey } from "./MapKey.js"
12
+ import type { MapValue } from "./MapValue.js"
13
+ import { Complete, Pending, Refreshing } from "./MapValue.js"
14
+
15
+ export class CacheInternal<Key, Environment, Error, Value> implements Cache<Key, Error, Value> {
16
+ readonly [CacheURI] = {
17
+ _Key: (_: Key) => void 0,
18
+ _Error: (_: never) => _,
19
+ _Value: (_: never) => _
20
+ }
21
+
22
+ private cacheState: CacheState<Key, Error, Value>
23
+
24
+ constructor(
25
+ readonly capacity: number,
26
+ readonly lookup: Lookup<Key, Environment, Error, Value>,
27
+ readonly timeToLive: (exit: Exit<Error, Value>) => DUR,
28
+ readonly clock: Clock,
29
+ readonly environment: Context<Environment>,
30
+ readonly fiberId: FiberId
31
+ ) {
32
+ this.cacheState = CacheState.initial<Key, Error, Value>()
33
+ }
34
+
35
+ get size(): Effect<never, never, number> {
36
+ return Effect(() => this.cacheState.map.size)
37
+ }
38
+
39
+ get entries(): Effect<never, never, Chunk<readonly [Key, Value]>> {
40
+ return Effect(() => {
41
+ const entries: Array<readonly [Key, Value]> = []
42
+ for (const [key, value] of this.cacheState.map) {
43
+ if (value._tag === "Complete" && value.exit.isSuccess()) {
44
+ entries.push([key, value.exit.value] as const)
45
+ }
46
+ }
47
+ return Chunk.fromIterable(entries)
48
+ })
49
+ }
50
+
51
+ get values(): Effect<never, never, Chunk<Value>> {
52
+ return Effect(() => {
53
+ const values: Array<Value> = []
54
+ for (const [_, value] of this.cacheState.map) {
55
+ if (value._tag === "Complete" && value.exit.isSuccess()) {
56
+ values.push(value.exit.value)
57
+ }
58
+ }
59
+ return Chunk.fromIterable(values)
60
+ })
61
+ }
62
+
63
+ get cacheStats(): Effect<never, never, CacheStats> {
64
+ return Effect(CacheStats(
65
+ this.cacheState.hits,
66
+ this.cacheState.misses,
67
+ this.cacheState.map.size
68
+ ))
69
+ }
70
+
71
+ entryStats(k: Key): Effect<never, never, Opt<EntryStats>> {
72
+ return Effect(() => {
73
+ const value = this.cacheState.map.get(k).value
74
+ if (value == null) {
75
+ return Opt.none
76
+ }
77
+ switch (value._tag) {
78
+ case "Pending": {
79
+ return Opt.none
80
+ }
81
+ case "Complete": {
82
+ return Opt(EntryStats(value.entryStats.loadedMillis))
83
+ }
84
+ case "Refreshing": {
85
+ return Opt(EntryStats(value.complete.entryStats.loadedMillis))
86
+ }
87
+ }
88
+ })
89
+ }
90
+
91
+ get(k: Key): Effect<never, Error, Value> {
92
+ return Effect.suspendSucceed(() => {
93
+ let key: MapKey<Key> | undefined = undefined
94
+ let deferred: Deferred<Error, Value> | undefined = undefined
95
+ let value = this.cacheState.map.get(k).value
96
+ if (value == null) {
97
+ deferred = Deferred.unsafeMake<Error, Value>(this.fiberId)
98
+ key = new MapKey(k)
99
+ if (this.cacheState.map.has(k)) {
100
+ value = this.cacheState.map.get(k).value!
101
+ } else {
102
+ this.cacheState.map.set(k, new Pending(key, deferred))
103
+ }
104
+ }
105
+ if (value == null) {
106
+ this.trackAccess(key!)
107
+ this.trackMiss()
108
+ return this.lookupValueOf(k, deferred!)
109
+ }
110
+ switch (value._tag) {
111
+ case "Pending": {
112
+ this.trackAccess(value.key)
113
+ this.trackHit()
114
+ return value.deferred.await
115
+ }
116
+ case "Complete": {
117
+ this.trackAccess(value.key)
118
+ this.trackHit()
119
+ if (this.hasExpired(value.timeToLiveMillis)) {
120
+ const found = this.cacheState.map.get(k).value
121
+ if (Equals.equals(found, value)) {
122
+ this.cacheState.map.remove(k)
123
+ }
124
+ return this.get(k)
125
+ }
126
+ return value.exit.done
127
+ }
128
+ case "Refreshing": {
129
+ this.trackAccess(value.complete.key)
130
+ this.trackHit()
131
+ if (this.hasExpired(value.complete.timeToLiveMillis)) {
132
+ return value.deferred.await
133
+ }
134
+ return value.complete.exit.done
135
+ }
136
+ }
137
+ })
138
+ }
139
+
140
+ set(key: Key, value: Value): Effect<never, never, void> {
141
+ return Effect(() => {
142
+ const now = this.clock.currentTimeMillis().unsafeRunSync
143
+ const lookupResult = Exit.succeed(value)
144
+ this.cacheState.map.set(
145
+ key,
146
+ new Complete(
147
+ new MapKey(key),
148
+ lookupResult,
149
+ EntryStats(now),
150
+ now + this.timeToLive(lookupResult).millis
151
+ )
152
+ )
153
+ })
154
+ }
155
+
156
+ contains(key: Key): Effect<never, never, boolean> {
157
+ return Effect(() => this.cacheState.map.has(key))
158
+ }
159
+
160
+ refresh(k: Key): Effect<never, Error, void> {
161
+ return Effect.suspendSucceed(() => {
162
+ const deferred = Deferred.unsafeMake<Error, Value>(this.fiberId)
163
+ let value = this.cacheState.map.get(k).value
164
+ if (value == null) {
165
+ if (this.cacheState.map.has(k)) {
166
+ value = this.cacheState.map.get(k).value!
167
+ } else {
168
+ this.cacheState.map.set(k, new Pending(new MapKey(k), deferred))
169
+ }
170
+ }
171
+ if (value == null) {
172
+ return this.lookupValueOf(k, deferred).asUnit
173
+ }
174
+ switch (value._tag) {
175
+ case "Pending": {
176
+ return value.deferred.await.asUnit
177
+ }
178
+ case "Complete": {
179
+ if (this.hasExpired(value.timeToLiveMillis)) {
180
+ const found = this.cacheState.map.get(k).value!
181
+ if (Equals.equals(found, value)) {
182
+ this.cacheState.map.remove(k)
183
+ }
184
+ return this.get(k).asUnit
185
+ }
186
+ // Only trigger the lookup if we're still the current value
187
+ return this.lookupValueOf(value.key.value, deferred)
188
+ .when(() => {
189
+ const current = this.cacheState.map.get(k).value
190
+ if (Equals.equals(current, value)) {
191
+ this.cacheState.map.set(
192
+ k,
193
+ new Refreshing(deferred, value as Complete<Key, Error, Value>)
194
+ )
195
+ return true
196
+ }
197
+ return false
198
+ })
199
+ .asUnit
200
+ }
201
+ case "Refreshing": {
202
+ return value.deferred.await.asUnit
203
+ }
204
+ }
205
+ })
206
+ }
207
+
208
+ invalidate(key: Key): Effect<never, never, void> {
209
+ return Effect(() => {
210
+ this.cacheState.map.remove(key)
211
+ })
212
+ }
213
+
214
+ invalidateAll: Effect<never, never, void> = Effect(() => {
215
+ this.cacheState.map = MutableHashMap.empty<Key, MapValue<Key, Error, Value>>()
216
+ })
217
+
218
+ private trackHit(): void {
219
+ this.cacheState.hits = this.cacheState.hits + 1
220
+ }
221
+
222
+ private trackMiss(): void {
223
+ this.cacheState.misses = this.cacheState.misses + 1
224
+ }
225
+
226
+ private trackAccess(key: MapKey<Key>): void {
227
+ this.cacheState.accesses.offer(key)
228
+ if (this.cacheState.updating.compareAndSet(false, true)) {
229
+ let loop = true
230
+ while (loop) {
231
+ const key = this.cacheState.accesses.poll(EmptyMutableQueue)
232
+ if (key === EmptyMutableQueue) {
233
+ loop = false
234
+ } else {
235
+ this.cacheState.keys.add(key)
236
+ }
237
+ }
238
+ let size = this.cacheState.map.size
239
+ loop = size > this.capacity
240
+ while (loop) {
241
+ const key = this.cacheState.keys.remove()
242
+ if (key != null) {
243
+ if (this.cacheState.map.remove(key.value) != null) {
244
+ size = size - 1
245
+ loop = size > this.capacity
246
+ }
247
+ } else {
248
+ loop = false
249
+ }
250
+ }
251
+ this.cacheState.updating.set(false)
252
+ }
253
+ }
254
+
255
+ private lookupValueOf(key: Key, deferred: Deferred<Error, Value>): Effect<never, Error, Value> {
256
+ return this.lookup(key)
257
+ .provideEnvironment(this.environment)
258
+ .exit
259
+ .flatMap(exit => {
260
+ const now = this.clock.currentTimeMillis().unsafeRunSync
261
+ const entryStats = EntryStats(now)
262
+ this.cacheState.map.set(
263
+ key,
264
+ new Complete(
265
+ new MapKey(key),
266
+ exit,
267
+ entryStats,
268
+ now + this.timeToLive(exit).millis
269
+ )
270
+ )
271
+ // TODO: later for updated Deferred handling
272
+ return doneDeferred(deferred)(exit).zipRight(exit.done)
273
+ })
274
+ .onInterrupt(() =>
275
+ deferred.interrupt.zipRight(Effect(() => {
276
+ this.cacheState.map.remove(key)
277
+ }))
278
+ )
279
+ }
280
+
281
+ private hasExpired(timeToLiveMillis: number): boolean {
282
+ return this.clock.currentTimeMillis().unsafeRunSync > timeToLiveMillis
283
+ }
284
+ }
285
+
286
+ /**
287
+ * @tsplus macro remove
288
+ */
289
+ export function concreteCache<Key, Error, Value>(
290
+ _: Cache<Key, Error, Value>
291
+ ): asserts _ is CacheInternal<Key, unknown, Error, Value> {
292
+ //
293
+ }
@@ -0,0 +1,56 @@
1
+ import { AtomicBoolean } from "./AtomicBoolean.js"
2
+ import { KeySet } from "./KeySet.js"
3
+ import type { MapKey } from "./MapKey.js"
4
+ import type { MapValue } from "./MapValue.js"
5
+
6
+ /**
7
+ * The `CacheState` represents the mutable state underlying the cache.
8
+ *
9
+ * @tsplus type effect/cache/Cache/CacheState
10
+ */
11
+ export interface CacheState<Key, Error, Value> {
12
+ map: MutableHashMap<Key, MapValue<Key, Error, Value>>
13
+ keys: KeySet<Key>
14
+ accesses: MutableQueue<MapKey<Key>>
15
+ updating: AtomicBoolean
16
+ hits: number
17
+ misses: number
18
+ }
19
+
20
+ /**
21
+ * @tsplus type effect/cache/Cache/CacheState.Ops
22
+ */
23
+ export interface CacheStateOps {
24
+ <Key, Error, Value>(
25
+ map: MutableHashMap<Key, MapValue<Key, Error, Value>>,
26
+ keys: KeySet<Key>,
27
+ accesses: MutableQueue<MapKey<Key>>,
28
+ updating: AtomicBoolean,
29
+ hits: number,
30
+ misses: number
31
+ ): CacheState<Key, Error, Value>
32
+ }
33
+ export const CacheState: CacheStateOps = (map, keys, accesses, updating, hits, misses) => ({
34
+ map,
35
+ keys,
36
+ accesses,
37
+ updating,
38
+ hits,
39
+ misses
40
+ })
41
+
42
+ /**
43
+ * Constructs an initial cache state.
44
+ *
45
+ * @tsplus static effect/cache/Cache/CacheState.Ops initial
46
+ */
47
+ export function initial<Key, Error, Value>(): CacheState<Key, Error, Value> {
48
+ return CacheState(
49
+ MutableHashMap.empty(),
50
+ new KeySet(),
51
+ MutableQueue.unbounded(),
52
+ new AtomicBoolean(false),
53
+ 0,
54
+ 0
55
+ )
56
+ }
@@ -0,0 +1,58 @@
1
+ import type { MapKey } from "./MapKey.js"
2
+
3
+ /**
4
+ * A `KeySet` is a sorted set of keys in the cache ordered by last access.
5
+ * For efficiency, the set is implemented in terms of a doubly linked list
6
+ * and is not safe for concurrent access.
7
+ */
8
+ export class KeySet<Key> {
9
+ head: MapKey<Key> | undefined = undefined
10
+ tail: MapKey<Key> | undefined = undefined
11
+
12
+ /**
13
+ * Adds the specified key to the set.
14
+ */
15
+ add(key: MapKey<Key>): void {
16
+ if (!Equals.equals(key, this.tail)) {
17
+ if (this.tail != null) {
18
+ const previous = key.previous
19
+ const next = key.next
20
+ if (next != null) {
21
+ key.next = undefined
22
+ if (previous != null) {
23
+ previous.next = next
24
+ next.previous = previous
25
+ } else {
26
+ this.head = next
27
+ this.head.previous = undefined
28
+ }
29
+ }
30
+ this.tail.next = key
31
+ key.previous = this.tail
32
+ this.tail = key
33
+ } else {
34
+ this.head = key
35
+ this.tail = key
36
+ }
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Removes the lowest priority key from the set.
42
+ */
43
+ remove(): MapKey<Key> | undefined {
44
+ const key = this.head
45
+ if (key != null) {
46
+ const next = key.next
47
+ if (next) {
48
+ key.next = undefined
49
+ this.head = next
50
+ this.head.previous = undefined
51
+ } else {
52
+ this.head = undefined
53
+ this.tail = undefined
54
+ }
55
+ }
56
+ return key
57
+ }
58
+ }
@@ -0,0 +1,43 @@
1
+ import { symbolEqual, symbolHash } from "@fp-ts/data/Equal"
2
+
3
+ export const MapKeyURI = Symbol.for("@effect/cache/Cache/MapKey")
4
+ export type MapKeyURI = typeof MapKeyURI
5
+
6
+ /**
7
+ * A `MapKey` represents a key in the cache. It contains mutable references
8
+ * to the previous key and next key in the `KeySet` to support an efficient
9
+ * implementation of a sorted set of keys.
10
+ */
11
+ export class MapKey<Key> implements Equals {
12
+ readonly [MapKeyURI]: MapKeyURI = MapKeyURI
13
+
14
+ previous: MapKey<Key> | undefined = undefined
15
+ next: MapKey<Key> | undefined = undefined
16
+
17
+ constructor(readonly value: Key) {}
18
+
19
+ [symbolHash](): number {
20
+ return Equals.hashCombine(
21
+ Equals.hashCombine(
22
+ Equals.hash(this.next)
23
+ )(Equals.hash(this.previous))
24
+ )(Equals.hash(this.value))
25
+ }
26
+
27
+ [symbolEqual](that: unknown): boolean {
28
+ if (this === that) {
29
+ return true
30
+ }
31
+ return isMapKey(that) &&
32
+ Equals.equals(this.value, that.value) &&
33
+ Equals.equals(this.previous, that.previous) &&
34
+ Equals.equals(this.next, that.next)
35
+ }
36
+ }
37
+
38
+ /**
39
+ * @tsplus static effect/cache/Cache/MapKey.Ops is
40
+ */
41
+ export function isMapKey(u: unknown): u is MapKey<unknown> {
42
+ return typeof u === "object" && u != null && MapKeyURI in u
43
+ }
@@ -0,0 +1,39 @@
1
+ import type { EntryStats } from "../../EntryStats/definition.js"
2
+ import type { MapKey } from "./MapKey.js"
3
+
4
+ /**
5
+ * A `MapValue` represents a value in the cache. A value may either be
6
+ * `Pending` with a `Deferred` that will contain the result of computing the
7
+ * lookup function, when it is available, or `Complete` with an `Exit` value
8
+ * that contains the result of computing the lookup function.
9
+ */
10
+ export type MapValue<Key, Error, Value> =
11
+ | Pending<Key, Error, Value>
12
+ | Complete<Key, Error, Value>
13
+ | Refreshing<Key, Error, Value>
14
+
15
+ export class Pending<Key, Error, Value> {
16
+ readonly _tag = "Pending"
17
+ constructor(
18
+ readonly key: MapKey<Key>,
19
+ readonly deferred: Deferred<Error, Value>
20
+ ) {}
21
+ }
22
+
23
+ export class Complete<Key, Error, Value> {
24
+ readonly _tag = "Complete"
25
+ constructor(
26
+ readonly key: MapKey<Key>,
27
+ readonly exit: Exit<Error, Value>,
28
+ readonly entryStats: EntryStats,
29
+ readonly timeToLiveMillis: number
30
+ ) {}
31
+ }
32
+
33
+ export class Refreshing<Key, Error, Value> {
34
+ readonly _tag = "Refreshing"
35
+ constructor(
36
+ readonly deferred: Deferred<Error, Value>,
37
+ readonly complete: Complete<Key, Error, Value>
38
+ ) {}
39
+ }
@@ -0,0 +1,112 @@
1
+ import type { CacheStats } from "../CacheStats.js"
2
+ import type { EntryStats } from "../EntryStats.js"
3
+
4
+ export const CacheURI = Symbol.for("@effect/cache/Cache")
5
+ export type CacheURI = typeof CacheURI
6
+
7
+ /**
8
+ * A `Cache` is defined in terms of a lookup function that, given a key of
9
+ * type `Key`, can either fail with an error of type `Error` or succeed with a
10
+ * value of type `Value`. Getting a value from the cache will either return
11
+ * the previous result of the lookup function if it is available or else
12
+ * compute a new result with the lookup function, put it in the cache, and
13
+ * return it.
14
+ *
15
+ * A cache also has a specified capacity and time to live. When the cache is
16
+ * at capacity the least recently accessed values in the cache will be
17
+ * removed to make room for new values. Getting a value with a life older than
18
+ * the specified time to live will result in a new value being computed with
19
+ * the lookup function and returned when available.
20
+ *
21
+ * The cache is safe for concurrent access. If multiple fibers attempt to get
22
+ * the same key the lookup function will only be computed once and the result
23
+ * will be returned to all fibers.
24
+ *
25
+ * @tsplus type effect/cache/Cache
26
+ */
27
+ export interface Cache<Key, Error, Value> {
28
+ readonly [CacheURI]: {
29
+ readonly _Key: (_: Key) => void
30
+ readonly _Error: (_: never) => Error
31
+ readonly _Value: (_: never) => Value
32
+ }
33
+
34
+ /**
35
+ * Returns the approximate number of values in the cache.
36
+ */
37
+ readonly size: Effect<never, never, number>
38
+
39
+ /**
40
+ * Returns an approximation of the entries in the cache.
41
+ */
42
+ readonly entries: Effect<never, never, Chunk<readonly [Key, Value]>>
43
+
44
+ /**
45
+ * Returns an approximation of the values in the cache.
46
+ */
47
+ readonly values: Effect<never, never, Chunk<Value>>
48
+
49
+ /**
50
+ * Returns statistics for this cache.
51
+ */
52
+ readonly cacheStats: Effect<never, never, CacheStats>
53
+
54
+ /**
55
+ * Returns statistics for the specified entry, if it exists.
56
+ */
57
+ readonly entryStats: (key: Key) => Effect<never, never, Opt<EntryStats>>
58
+
59
+ /**
60
+ * Retrieves the value associated with the specified key if it exists.
61
+ * Otherwise computes the value with the lookup function, puts it in the
62
+ * cache, and returns it.
63
+ */
64
+ readonly get: (key: Key) => Effect<never, Error, Value>
65
+
66
+ /**
67
+ * Associates the specified value to the specified key in the cache.
68
+ */
69
+ readonly set: (key: Key, value: Value) => Effect<never, never, void>
70
+
71
+ /**
72
+ * Returns whether a value associated with the specified key exists in the
73
+ * cache.
74
+ */
75
+ readonly contains: (key: Key) => Effect<never, never, boolean>
76
+
77
+ /**
78
+ * Computes the value associated with the specified key, with the lookup
79
+ * function, and puts it in the cache. The difference between this and
80
+ * `get` method is that `refresh` triggers (re)computation of the value
81
+ * without invalidating it in the cache, so any request to the associated
82
+ * key can still be served while the value is being re-computed/retrieved
83
+ * by the lookup function. Additionally, `refresh` always triggers the
84
+ * lookup function, disregarding the last `Error`.
85
+ */
86
+ readonly refresh: (key: Key) => Effect<never, Error, void>
87
+
88
+ /**
89
+ * Invalidates the value associated with the specified key.
90
+ */
91
+ readonly invalidate: (key: Key) => Effect<never, never, void>
92
+
93
+ /**
94
+ * Invalidates all values in the cache.
95
+ */
96
+ readonly invalidateAll: Effect<never, never, void>
97
+ }
98
+
99
+ /**
100
+ * @tsplus type effect/cache/Cache.Ops
101
+ */
102
+ export interface CacheOps {
103
+ readonly $: CacheAspects
104
+ }
105
+ export const Cache: CacheOps = {
106
+ $: {}
107
+ }
108
+
109
+ /**
110
+ * @tsplus type effect/cache/Cache.Aspects
111
+ */
112
+ export interface CacheAspects {}