@effect-app/infra 0.7.0 → 0.8.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 (284) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/_cjs/errors.cjs +21 -22
  3. package/_cjs/errors.cjs.map +1 -1
  4. package/_cjs/lib/api/authorization.jwt.cjs +1 -1
  5. package/_cjs/{vendor/Cache/Cache/operations/makeWith.cjs → lib/api/codec.cjs} +16 -13
  6. package/_cjs/lib/api/codec.cjs.map +1 -0
  7. package/_cjs/{services/memQueue.cjs → lib/api/express/makeJsonSchema.cjs} +42 -22
  8. package/_cjs/lib/api/express/makeJsonSchema.cjs.map +1 -0
  9. package/_cjs/lib/api/express/makeOpenApiSpecs.cjs +66 -0
  10. package/_cjs/lib/api/express/makeOpenApiSpecs.cjs.map +1 -0
  11. package/_cjs/lib/api/express/schema/jwt.cjs +43 -0
  12. package/_cjs/lib/api/express/schema/jwt.cjs.map +1 -0
  13. package/_cjs/lib/api/express/schema/requestHandler.cjs +166 -0
  14. package/_cjs/lib/api/express/schema/requestHandler.cjs.map +1 -0
  15. package/_cjs/lib/api/express/schema/routing.cjs +121 -0
  16. package/_cjs/lib/api/express/schema/routing.cjs.map +1 -0
  17. package/_cjs/lib/api/routing.cjs +28 -28
  18. package/_cjs/lib/api/routing.cjs.map +1 -1
  19. package/_cjs/lib/api/writeDocs.cjs +4 -4
  20. package/_cjs/lib/api/writeDocs.cjs.map +1 -1
  21. package/_cjs/services/Store/Disk.cjs +1 -1
  22. package/_cjs/services/simpledb/cosmosdb.cjs +98 -0
  23. package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -0
  24. package/_cjs/services/simpledb/diskdb.cjs +118 -0
  25. package/_cjs/services/simpledb/diskdb.cjs.map +1 -0
  26. package/_cjs/services/simpledb/fileutil.cjs +36 -0
  27. package/_cjs/services/simpledb/fileutil.cjs.map +1 -0
  28. package/_cjs/{vendor/Cache/Cache/_internal/CacheState.cjs → services/simpledb/index.cjs} +31 -24
  29. package/_cjs/services/simpledb/index.cjs.map +1 -0
  30. package/_cjs/services/simpledb/memdb.cjs +74 -0
  31. package/_cjs/services/simpledb/memdb.cjs.map +1 -0
  32. package/_cjs/services/simpledb/mongodb.cjs +86 -0
  33. package/_cjs/services/simpledb/mongodb.cjs.map +1 -0
  34. package/_cjs/services/simpledb/redisdb.cjs +120 -0
  35. package/_cjs/services/simpledb/redisdb.cjs.map +1 -0
  36. package/_cjs/services/simpledb/shared.cjs +80 -0
  37. package/_cjs/services/simpledb/shared.cjs.map +1 -0
  38. package/_cjs/services/simpledb/simpledb.cjs +77 -0
  39. package/_cjs/services/simpledb/simpledb.cjs.map +1 -0
  40. package/_src/_global.ext.ts +1 -1
  41. package/_src/errors.ts +12 -3
  42. package/_src/lib/api/app.ts.bak +125 -0
  43. package/_src/lib/api/authorization.jwt.ts +1 -1
  44. package/_src/lib/api/codec.ts +27 -0
  45. package/_src/lib/api/errors.ts.bak +20 -0
  46. package/_src/lib/api/express/makeJsonSchema.ts +49 -0
  47. package/_src/lib/api/express/makeOpenApiSpecs.ts +60 -0
  48. package/_src/lib/api/express/routing.ts.bak +460 -0
  49. package/_src/lib/api/express/schema/jwt.ts +38 -0
  50. package/_src/lib/api/express/schema/requestHandler.ts +360 -0
  51. package/_src/lib/api/express/schema/routing.ts +202 -0
  52. package/_src/lib/api/routing.ts +5 -10
  53. package/_src/lib/api/writeDocs.ts +4 -5
  54. package/_src/services/Store/Disk.ts +1 -1
  55. package/_src/services/simpledb/cosmosdb.ts +134 -0
  56. package/_src/services/simpledb/diskdb.ts +158 -0
  57. package/_src/services/simpledb/fileutil.ts +28 -0
  58. package/_src/services/simpledb/index.ts +6 -0
  59. package/_src/services/simpledb/memdb.ts +79 -0
  60. package/_src/services/simpledb/mongodb.ts +99 -0
  61. package/_src/services/simpledb/redisdb.ts +182 -0
  62. package/_src/services/simpledb/shared.ts +117 -0
  63. package/_src/services/simpledb/simpledb.ts +117 -0
  64. package/dist/_global.ext.d.ts +1 -1
  65. package/dist/_global.ext.d.ts.map +1 -1
  66. package/dist/errors.d.ts +11 -2
  67. package/dist/errors.d.ts.map +1 -1
  68. package/dist/errors.js +17 -3
  69. package/dist/lib/api/authorization.jwt.d.ts +1 -1
  70. package/dist/lib/api/authorization.jwt.d.ts.map +1 -1
  71. package/dist/lib/api/authorization.jwt.js +2 -2
  72. package/dist/lib/api/codec.d.ts +7 -0
  73. package/dist/lib/api/codec.d.ts.map +1 -0
  74. package/dist/lib/api/codec.js +19 -0
  75. package/dist/lib/api/express/makeJsonSchema.d.ts +30 -0
  76. package/dist/lib/api/express/makeJsonSchema.d.ts.map +1 -0
  77. package/dist/lib/api/express/makeJsonSchema.js +40 -0
  78. package/dist/lib/api/express/makeOpenApiSpecs.d.ts +55 -0
  79. package/dist/lib/api/express/makeOpenApiSpecs.d.ts.map +1 -0
  80. package/dist/lib/api/express/makeOpenApiSpecs.js +56 -0
  81. package/dist/lib/api/express/schema/jwt.d.ts +5 -0
  82. package/dist/lib/api/express/schema/jwt.d.ts.map +1 -0
  83. package/dist/lib/api/express/schema/jwt.js +32 -0
  84. package/dist/lib/api/express/schema/requestHandler.d.ts +71 -0
  85. package/dist/lib/api/express/schema/requestHandler.d.ts.map +1 -0
  86. package/dist/lib/api/express/schema/requestHandler.js +140 -0
  87. package/dist/lib/api/express/schema/routing.d.ts +45 -0
  88. package/dist/lib/api/express/schema/routing.d.ts.map +1 -0
  89. package/dist/lib/api/express/schema/routing.js +95 -0
  90. package/dist/lib/api/routing.d.ts +4 -4
  91. package/dist/lib/api/routing.d.ts.map +1 -1
  92. package/dist/lib/api/routing.js +29 -28
  93. package/dist/lib/api/writeDocs.d.ts +1 -1
  94. package/dist/lib/api/writeDocs.d.ts.map +1 -1
  95. package/dist/lib/api/writeDocs.js +5 -5
  96. package/dist/services/Store/Disk.js +2 -2
  97. package/dist/services/simpledb/cosmosdb.d.ts +13 -0
  98. package/dist/services/simpledb/cosmosdb.d.ts.map +1 -0
  99. package/dist/services/simpledb/cosmosdb.js +88 -0
  100. package/dist/services/simpledb/diskdb.d.ts +12 -0
  101. package/dist/services/simpledb/diskdb.d.ts.map +1 -0
  102. package/dist/services/simpledb/diskdb.js +96 -0
  103. package/dist/services/simpledb/fileutil.d.ts +7 -0
  104. package/dist/services/simpledb/fileutil.d.ts.map +1 -0
  105. package/dist/services/simpledb/fileutil.js +25 -0
  106. package/dist/services/simpledb/index.d.ts +7 -0
  107. package/dist/services/simpledb/index.d.ts.map +1 -0
  108. package/dist/services/simpledb/index.js +7 -0
  109. package/dist/services/simpledb/memdb.d.ts +12 -0
  110. package/dist/services/simpledb/memdb.d.ts.map +1 -0
  111. package/dist/services/simpledb/memdb.js +55 -0
  112. package/dist/services/simpledb/mongodb.d.ts +13 -0
  113. package/dist/services/simpledb/mongodb.d.ts.map +1 -0
  114. package/dist/services/simpledb/mongodb.js +55 -0
  115. package/dist/services/simpledb/redisdb.d.ts +25 -0
  116. package/dist/services/simpledb/redisdb.d.ts.map +1 -0
  117. package/dist/services/simpledb/redisdb.js +105 -0
  118. package/dist/services/simpledb/shared.d.ts +63 -0
  119. package/dist/services/simpledb/shared.d.ts.map +1 -0
  120. package/dist/services/simpledb/shared.js +65 -0
  121. package/dist/services/simpledb/simpledb.d.ts +23 -0
  122. package/dist/services/simpledb/simpledb.d.ts.map +1 -0
  123. package/dist/services/simpledb/simpledb.js +56 -0
  124. package/package.json +126 -238
  125. package/_cjs/ext.cjs +0 -4
  126. package/_cjs/ext.cjs.map +0 -1
  127. package/_cjs/lib/fileUtil.cjs +0 -36
  128. package/_cjs/lib/fileUtil.cjs.map +0 -1
  129. package/_cjs/services/CUPS/service.cjs +0 -15
  130. package/_cjs/services/CUPS/service.cjs.map +0 -1
  131. package/_cjs/services/CUPS.cjs +0 -113
  132. package/_cjs/services/CUPS.cjs.map +0 -1
  133. package/_cjs/services/Cache.cjs +0 -39
  134. package/_cjs/services/Cache.cjs.map +0 -1
  135. package/_cjs/services/ServiceBus.cjs +0 -69
  136. package/_cjs/services/ServiceBus.cjs.map +0 -1
  137. package/_cjs/services/memQueue.cjs.map +0 -1
  138. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +0 -14
  139. package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +0 -1
  140. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +0 -29
  141. package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +0 -1
  142. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +0 -32
  143. package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +0 -1
  144. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +0 -266
  145. package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +0 -1
  146. package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +0 -1
  147. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +0 -67
  148. package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +0 -1
  149. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +0 -44
  150. package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +0 -1
  151. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +0 -33
  152. package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +0 -1
  153. package/_cjs/vendor/Cache/Cache/definition.cjs +0 -13
  154. package/_cjs/vendor/Cache/Cache/definition.cjs.map +0 -1
  155. package/_cjs/vendor/Cache/Cache/operations/make.cjs +0 -20
  156. package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +0 -1
  157. package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +0 -1
  158. package/_cjs/vendor/Cache/Cache/operations.cjs +0 -28
  159. package/_cjs/vendor/Cache/Cache/operations.cjs.map +0 -1
  160. package/_cjs/vendor/Cache/Cache.cjs +0 -28
  161. package/_cjs/vendor/Cache/Cache.cjs.map +0 -1
  162. package/_cjs/vendor/Cache/CacheStats/definition.cjs +0 -13
  163. package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +0 -1
  164. package/_cjs/vendor/Cache/CacheStats.cjs +0 -17
  165. package/_cjs/vendor/Cache/CacheStats.cjs.map +0 -1
  166. package/_cjs/vendor/Cache/EntryStats/definition.cjs +0 -11
  167. package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +0 -1
  168. package/_cjs/vendor/Cache/EntryStats.cjs +0 -17
  169. package/_cjs/vendor/Cache/EntryStats.cjs.map +0 -1
  170. package/_cjs/vendor/Cache/Lookup/definition.cjs +0 -6
  171. package/_cjs/vendor/Cache/Lookup/definition.cjs.map +0 -1
  172. package/_cjs/vendor/Cache/Lookup.cjs +0 -17
  173. package/_cjs/vendor/Cache/Lookup.cjs.map +0 -1
  174. package/_cjs/vendor/Cache/index.cjs +0 -17
  175. package/_cjs/vendor/Cache/index.cjs.map +0 -1
  176. package/_src/ext.ts +0 -1
  177. package/_src/lib/fileUtil.ts +0 -56
  178. package/_src/services/CUPS/service.ts +0 -16
  179. package/_src/services/CUPS.ts +0 -105
  180. package/_src/services/Cache.ts +0 -45
  181. package/_src/services/ServiceBus.ts +0 -111
  182. package/_src/services/memQueue.ts +0 -30
  183. package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +0 -7
  184. package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +0 -28
  185. package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +0 -30
  186. package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +0 -293
  187. package/_src/vendor/Cache/Cache/_internal/CacheState.ts +0 -56
  188. package/_src/vendor/Cache/Cache/_internal/KeySet.ts +0 -58
  189. package/_src/vendor/Cache/Cache/_internal/MapKey.ts +0 -43
  190. package/_src/vendor/Cache/Cache/_internal/MapValue.ts +0 -39
  191. package/_src/vendor/Cache/Cache/definition.ts +0 -112
  192. package/_src/vendor/Cache/Cache/operations/make.ts +0 -17
  193. package/_src/vendor/Cache/Cache/operations/makeWith.ts +0 -32
  194. package/_src/vendor/Cache/Cache/operations.ts +0 -4
  195. package/_src/vendor/Cache/Cache.ts +0 -4
  196. package/_src/vendor/Cache/CacheStats/definition.ts +0 -23
  197. package/_src/vendor/Cache/CacheStats.ts +0 -3
  198. package/_src/vendor/Cache/EntryStats/definition.ts +0 -19
  199. package/_src/vendor/Cache/EntryStats.ts +0 -3
  200. package/_src/vendor/Cache/Lookup/definition.ts +0 -15
  201. package/_src/vendor/Cache/Lookup.ts +0 -3
  202. package/_src/vendor/Cache/global.ts.bak +0 -23
  203. package/_src/vendor/Cache/index.ts +0 -4
  204. package/dist/ext.d.ts +0 -2
  205. package/dist/ext.d.ts.map +0 -1
  206. package/dist/ext.js +0 -2
  207. package/dist/lib/fileUtil.d.ts +0 -22
  208. package/dist/lib/fileUtil.d.ts.map +0 -1
  209. package/dist/lib/fileUtil.js +0 -23
  210. package/dist/services/CUPS/service.d.ts +0 -19
  211. package/dist/services/CUPS/service.d.ts.map +0 -1
  212. package/dist/services/CUPS/service.js +0 -5
  213. package/dist/services/CUPS.d.ts +0 -10
  214. package/dist/services/CUPS.d.ts.map +0 -1
  215. package/dist/services/CUPS.js +0 -89
  216. package/dist/services/Cache.d.ts +0 -28
  217. package/dist/services/Cache.d.ts.map +0 -1
  218. package/dist/services/Cache.js +0 -28
  219. package/dist/services/ServiceBus.d.ts +0 -26
  220. package/dist/services/ServiceBus.d.ts.map +0 -1
  221. package/dist/services/ServiceBus.js +0 -53
  222. package/dist/services/memQueue.d.ts +0 -18
  223. package/dist/services/memQueue.d.ts.map +0 -1
  224. package/dist/services/memQueue.js +0 -24
  225. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +0 -5
  226. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +0 -1
  227. package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +0 -7
  228. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +0 -8
  229. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +0 -1
  230. package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +0 -22
  231. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +0 -10
  232. package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +0 -1
  233. package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +0 -25
  234. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +0 -51
  235. package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +0 -1
  236. package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +0 -253
  237. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +0 -33
  238. package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +0 -1
  239. package/dist/vendor/Cache/Cache/_internal/CacheState.js +0 -21
  240. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +0 -20
  241. package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +0 -1
  242. package/dist/vendor/Cache/Cache/_internal/KeySet.js +0 -61
  243. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +0 -24
  244. package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +0 -1
  245. package/dist/vendor/Cache/Cache/_internal/MapKey.js +0 -37
  246. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +0 -32
  247. package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +0 -1
  248. package/dist/vendor/Cache/Cache/_internal/MapValue.js +0 -24
  249. package/dist/vendor/Cache/Cache/definition.d.ts +0 -100
  250. package/dist/vendor/Cache/Cache/definition.d.ts.map +0 -1
  251. package/dist/vendor/Cache/Cache/definition.js +0 -5
  252. package/dist/vendor/Cache/Cache/operations/make.d.ts +0 -12
  253. package/dist/vendor/Cache/Cache/operations/make.d.ts.map +0 -1
  254. package/dist/vendor/Cache/Cache/operations/make.js +0 -12
  255. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +0 -14
  256. package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +0 -1
  257. package/dist/vendor/Cache/Cache/operations/makeWith.js +0 -15
  258. package/dist/vendor/Cache/Cache/operations.d.ts +0 -3
  259. package/dist/vendor/Cache/Cache/operations.d.ts.map +0 -1
  260. package/dist/vendor/Cache/Cache/operations.js +0 -4
  261. package/dist/vendor/Cache/Cache.d.ts +0 -3
  262. package/dist/vendor/Cache/Cache.d.ts.map +0 -1
  263. package/dist/vendor/Cache/Cache.js +0 -4
  264. package/dist/vendor/Cache/CacheStats/definition.d.ts +0 -19
  265. package/dist/vendor/Cache/CacheStats/definition.d.ts.map +0 -1
  266. package/dist/vendor/Cache/CacheStats/definition.js +0 -6
  267. package/dist/vendor/Cache/CacheStats.d.ts +0 -2
  268. package/dist/vendor/Cache/CacheStats.d.ts.map +0 -1
  269. package/dist/vendor/Cache/CacheStats.js +0 -3
  270. package/dist/vendor/Cache/EntryStats/definition.d.ts +0 -17
  271. package/dist/vendor/Cache/EntryStats/definition.d.ts.map +0 -1
  272. package/dist/vendor/Cache/EntryStats/definition.js +0 -4
  273. package/dist/vendor/Cache/EntryStats.d.ts +0 -2
  274. package/dist/vendor/Cache/EntryStats.d.ts.map +0 -1
  275. package/dist/vendor/Cache/EntryStats.js +0 -3
  276. package/dist/vendor/Cache/Lookup/definition.d.ts +0 -17
  277. package/dist/vendor/Cache/Lookup/definition.d.ts.map +0 -1
  278. package/dist/vendor/Cache/Lookup/definition.js +0 -2
  279. package/dist/vendor/Cache/Lookup.d.ts +0 -2
  280. package/dist/vendor/Cache/Lookup.d.ts.map +0 -1
  281. package/dist/vendor/Cache/Lookup.js +0 -3
  282. package/dist/vendor/Cache/index.d.ts +0 -5
  283. package/dist/vendor/Cache/index.d.ts.map +0 -1
  284. package/dist/vendor/Cache/index.js +0 -5
@@ -1,111 +0,0 @@
1
- import type {
2
- OperationOptionsBase,
3
- ProcessErrorArgs,
4
- ServiceBusMessage,
5
- ServiceBusMessageBatch,
6
- ServiceBusReceivedMessage,
7
- ServiceBusReceiver,
8
- ServiceBusSender
9
- } from "@azure/service-bus"
10
- import { ServiceBusClient } from "@azure/service-bus"
11
-
12
- function makeClient(url: string) {
13
- return Effect(() => new ServiceBusClient(url)).acquireRelease(
14
- client => Effect.promise(() => client.close())
15
- )
16
- }
17
-
18
- const Client = Tag<ServiceBusClient>()
19
- export const LiveServiceBusClient = (url: string) => makeClient(url).toScopedLayer(Client)
20
-
21
- function makeSender(queueName: string) {
22
- return Effect.gen(function*($) {
23
- const serviceBusClient = yield* $(Client.access)
24
-
25
- return yield* $(
26
- Effect(() => serviceBusClient.createSender(queueName)).acquireRelease(
27
- subscription => Effect.promise(() => subscription.close())
28
- )
29
- )
30
- })
31
- }
32
- export const Sender = Tag<ServiceBusSender>()
33
-
34
- export function LiveSender(queueName: string) {
35
- return makeSender(queueName).toScopedLayer(Sender)
36
- }
37
-
38
- function makeReceiver(queueName: string) {
39
- return Effect.gen(function*($) {
40
- const serviceBusClient = yield* $(Client.access)
41
-
42
- return yield* $(
43
- Effect(() => serviceBusClient.createReceiver(queueName)).acquireRelease(
44
- r => Effect.promise(() => r.close())
45
- )
46
- )
47
- })
48
- }
49
-
50
- export const Receiver = Tag<ServiceBusReceiver>()
51
- export function LiveReceiver(queueName: string) {
52
- return makeReceiver(queueName).toScopedLayer(Receiver)
53
- }
54
-
55
- export function sendMessages(
56
- messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
57
- options?: OperationOptionsBase
58
- ) {
59
- return Effect.gen(function*($) {
60
- const s = yield* $(Sender.access)
61
- return yield* $(Effect.promise(() => s.sendMessages(messages, options)))
62
- })
63
- }
64
-
65
- export function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
66
- return Effect.gen(function*($) {
67
- const r = yield* $(Receiver.access)
68
-
69
- const env = yield* $(Effect.environment<RMsg | RErr>())
70
-
71
- yield* $(
72
- Effect(() =>
73
- r.subscribe({
74
- processError: err =>
75
- hndlr.processError(err)
76
- .provideEnvironment(env)
77
- .unsafeRunPromise
78
- .catch(console.error),
79
- processMessage: msg =>
80
- hndlr.processMessage(msg)
81
- .provideEnvironment(env)
82
- .unsafeRunPromise
83
- // DO NOT CATCH ERRORS here as they should return to the queue!
84
- })
85
- ).acquireRelease(
86
- subscription => Effect.promise(() => subscription.close())
87
- )
88
- )
89
- })
90
- }
91
-
92
- const SubscribeTag = Tag<Effect.Success<ReturnType<typeof subscribe>>>()
93
-
94
- export function Subscription<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
95
- return subscribe(hndlr).toScopedLayer(SubscribeTag)
96
- }
97
-
98
- export interface MessageHandlers<RMsg, RErr> {
99
- /**
100
- * Handler that processes messages from service bus.
101
- *
102
- * @param message - A message received from Service Bus.
103
- */
104
- processMessage(message: ServiceBusReceivedMessage): Effect<RMsg, never, void>
105
- /**
106
- * Handler that processes errors that occur during receiving.
107
- * @param args - The error and additional context to indicate where
108
- * the error originated.
109
- */
110
- processError(args: ProcessErrorArgs): Effect<RErr, never, void>
111
- }
@@ -1,30 +0,0 @@
1
- import { Queue as Q } from "@effect/io/Queue"
2
-
3
- export interface MemQueue {
4
- getOrCreateQueue: (k: string) => Effect<never, never, Queue<string>>
5
- }
6
-
7
- /**
8
- * @tsplus type MemQueue.Ops
9
- */
10
-
11
- export interface MemQueueOps extends Tag<MemQueue> {}
12
- export const MemQueue: MemQueueOps = Tag<MemQueue>()
13
-
14
- /**
15
- * @tsplus static MemQueue.Ops Live
16
- */
17
- export const LiveMemQueue = Effect.gen(function*($) {
18
- const store = yield* $(Effect(new Map<string, Queue<string>>()))
19
-
20
- return {
21
- getOrCreateQueue: (k: string) =>
22
- Effect.gen(function*($) {
23
- const q = store.get(k)
24
- if (q) return q
25
- const newQ = yield* $(Q.unbounded<string>())
26
- store.set(k, newQ)
27
- return newQ
28
- })
29
- }
30
- }).toLayer(MemQueue)
@@ -1,7 +0,0 @@
1
- import { AtomicReference } from "./AtomicReference.js"
2
-
3
- export class AtomicBoolean extends AtomicReference<boolean> {
4
- constructor(b: boolean) {
5
- super(b)
6
- }
7
- }
@@ -1,28 +0,0 @@
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
- }
@@ -1,30 +0,0 @@
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
- }
@@ -1,293 +0,0 @@
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
- }
@@ -1,56 +0,0 @@
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
- }
@@ -1,58 +0,0 @@
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
- }
@@ -1,43 +0,0 @@
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
- }
@@ -1,39 +0,0 @@
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
- }