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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/_check.sh +3 -0
  3. package/dist/CUPS.d.ts +22 -12
  4. package/dist/CUPS.d.ts.map +1 -1
  5. package/dist/CUPS.js +28 -29
  6. package/dist/Emailer/Sendgrid.js +13 -12
  7. package/dist/Emailer/service.d.ts +3 -13
  8. package/dist/Emailer/service.d.ts.map +1 -1
  9. package/dist/Emailer/service.js +3 -3
  10. package/dist/MainFiberSet.d.ts +18 -41
  11. package/dist/MainFiberSet.d.ts.map +1 -1
  12. package/dist/MainFiberSet.js +10 -10
  13. package/dist/Model/Repository/ext.d.ts.map +1 -1
  14. package/dist/Model/Repository/ext.js +13 -10
  15. package/dist/Model/Repository/internal/internal.d.ts +5 -5
  16. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  17. package/dist/Model/Repository/internal/internal.js +52 -42
  18. package/dist/Model/Repository/legacy.d.ts +9 -9
  19. package/dist/Model/Repository/legacy.d.ts.map +1 -1
  20. package/dist/Model/Repository/makeRepo.d.ts +4 -4
  21. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  22. package/dist/Model/Repository/makeRepo.js +1 -1
  23. package/dist/Model/Repository/service.d.ts +11 -11
  24. package/dist/Model/Repository/service.d.ts.map +1 -1
  25. package/dist/Model/Repository/validation.d.ts +17 -47
  26. package/dist/Model/Repository/validation.d.ts.map +1 -1
  27. package/dist/Model/Repository/validation.js +2 -2
  28. package/dist/Model/query/dsl.d.ts +22 -22
  29. package/dist/Model/query/dsl.d.ts.map +1 -1
  30. package/dist/Model/query/dsl.js +1 -1
  31. package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
  32. package/dist/Model/query/new-kid-interpreter.js +7 -7
  33. package/dist/Operations.d.ts +22 -63
  34. package/dist/Operations.d.ts.map +1 -1
  35. package/dist/Operations.js +14 -14
  36. package/dist/OperationsRepo.d.ts +23 -7
  37. package/dist/OperationsRepo.d.ts.map +1 -1
  38. package/dist/OperationsRepo.js +4 -5
  39. package/dist/QueueMaker/SQLQueue.d.ts +6 -8
  40. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  41. package/dist/QueueMaker/SQLQueue.js +20 -24
  42. package/dist/QueueMaker/errors.js +1 -1
  43. package/dist/QueueMaker/memQueue.d.ts +2 -5
  44. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  45. package/dist/QueueMaker/memQueue.js +22 -26
  46. package/dist/QueueMaker/sbqueue.d.ts +2 -5
  47. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  48. package/dist/QueueMaker/sbqueue.js +24 -28
  49. package/dist/RequestContext.d.ts +28 -41
  50. package/dist/RequestContext.d.ts.map +1 -1
  51. package/dist/RequestContext.js +4 -4
  52. package/dist/RequestFiberSet.d.ts +23 -50
  53. package/dist/RequestFiberSet.d.ts.map +1 -1
  54. package/dist/RequestFiberSet.js +14 -14
  55. package/dist/Store/ContextMapContainer.d.ts +4 -4
  56. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  57. package/dist/Store/ContextMapContainer.js +5 -5
  58. package/dist/Store/Cosmos.d.ts.map +1 -1
  59. package/dist/Store/Cosmos.js +21 -28
  60. package/dist/Store/Disk.d.ts.map +1 -1
  61. package/dist/Store/Disk.js +12 -16
  62. package/dist/Store/Memory.d.ts +2 -2
  63. package/dist/Store/Memory.d.ts.map +1 -1
  64. package/dist/Store/Memory.js +25 -33
  65. package/dist/Store/index.js +2 -2
  66. package/dist/Store/service.d.ts +9 -34
  67. package/dist/Store/service.d.ts.map +1 -1
  68. package/dist/Store/service.js +4 -4
  69. package/dist/Store/utils.d.ts.map +1 -1
  70. package/dist/Store/utils.js +10 -2
  71. package/dist/adapters/SQL/Model.d.ts +106 -162
  72. package/dist/adapters/SQL/Model.d.ts.map +1 -1
  73. package/dist/adapters/SQL/Model.js +92 -130
  74. package/dist/adapters/ServiceBus.d.ts +13 -44
  75. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  76. package/dist/adapters/ServiceBus.js +13 -15
  77. package/dist/adapters/cosmos-client.d.ts +7 -3
  78. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  79. package/dist/adapters/cosmos-client.js +5 -4
  80. package/dist/adapters/logger.d.ts +1 -1
  81. package/dist/adapters/logger.d.ts.map +1 -1
  82. package/dist/adapters/memQueue.d.ts +8 -21
  83. package/dist/adapters/memQueue.d.ts.map +1 -1
  84. package/dist/adapters/memQueue.js +4 -4
  85. package/dist/adapters/mongo-client.d.ts +6 -6
  86. package/dist/adapters/mongo-client.d.ts.map +1 -1
  87. package/dist/adapters/mongo-client.js +5 -4
  88. package/dist/adapters/redis-client.d.ts +14 -4
  89. package/dist/adapters/redis-client.d.ts.map +1 -1
  90. package/dist/adapters/redis-client.js +19 -18
  91. package/dist/api/ContextProvider.d.ts +10 -15
  92. package/dist/api/ContextProvider.d.ts.map +1 -1
  93. package/dist/api/ContextProvider.js +8 -8
  94. package/dist/api/codec.d.ts +1 -1
  95. package/dist/api/codec.d.ts.map +1 -1
  96. package/dist/api/codec.js +1 -1
  97. package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
  98. package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
  99. package/dist/api/internal/auth.d.ts +3 -3
  100. package/dist/api/internal/auth.d.ts.map +1 -1
  101. package/dist/api/internal/auth.js +8 -8
  102. package/dist/api/internal/events.d.ts +2 -2
  103. package/dist/api/internal/events.d.ts.map +1 -1
  104. package/dist/api/internal/events.js +9 -9
  105. package/dist/api/internal/health.d.ts +1 -1
  106. package/dist/api/internal/health.d.ts.map +1 -1
  107. package/dist/api/internal/health.js +2 -2
  108. package/dist/api/layerUtils.d.ts +14 -14
  109. package/dist/api/layerUtils.d.ts.map +1 -1
  110. package/dist/api/layerUtils.js +5 -5
  111. package/dist/api/middlewares.d.ts +0 -75
  112. package/dist/api/middlewares.d.ts.map +1 -1
  113. package/dist/api/middlewares.js +6 -51
  114. package/dist/api/reportError.js +4 -4
  115. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
  116. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  117. package/dist/api/routing/middleware/middleware.d.ts +6 -7
  118. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  119. package/dist/api/routing/middleware/middleware.js +9 -13
  120. package/dist/api/routing/schema/jwt.d.ts +1 -1
  121. package/dist/api/routing/schema/jwt.d.ts.map +1 -1
  122. package/dist/api/routing/schema/jwt.js +5 -4
  123. package/dist/api/routing/utils.d.ts +2 -2
  124. package/dist/api/routing/utils.d.ts.map +1 -1
  125. package/dist/api/routing/utils.js +10 -8
  126. package/dist/api/routing.d.ts +39 -37
  127. package/dist/api/routing.d.ts.map +1 -1
  128. package/dist/api/routing.js +17 -21
  129. package/dist/api/setupRequest.d.ts +4 -6
  130. package/dist/api/setupRequest.d.ts.map +1 -1
  131. package/dist/api/setupRequest.js +10 -9
  132. package/dist/arbs.d.ts +3 -3
  133. package/dist/arbs.d.ts.map +1 -1
  134. package/dist/arbs.js +2 -2
  135. package/dist/errorReporter.d.ts +1 -1
  136. package/dist/errorReporter.d.ts.map +1 -1
  137. package/dist/errorReporter.js +12 -12
  138. package/dist/fileUtil.d.ts +6 -6
  139. package/dist/fileUtil.d.ts.map +1 -1
  140. package/dist/logger/jsonLogger.d.ts.map +1 -1
  141. package/dist/logger/jsonLogger.js +19 -18
  142. package/dist/logger/logFmtLogger.d.ts.map +1 -1
  143. package/dist/logger/logFmtLogger.js +11 -13
  144. package/dist/logger/shared.d.ts +2 -2
  145. package/dist/logger/shared.d.ts.map +1 -1
  146. package/dist/logger/shared.js +7 -9
  147. package/dist/logger.d.ts +1 -1
  148. package/dist/logger.d.ts.map +1 -1
  149. package/dist/rateLimit.d.ts +2 -2
  150. package/dist/rateLimit.d.ts.map +1 -1
  151. package/dist/rateLimit.js +5 -5
  152. package/dist/test.d.ts +2 -2
  153. package/dist/test.d.ts.map +1 -1
  154. package/dist/test.js +6 -24
  155. package/package.json +24 -27
  156. package/src/CUPS.ts +15 -14
  157. package/src/Emailer/Sendgrid.ts +15 -13
  158. package/src/Emailer/service.ts +3 -3
  159. package/src/MainFiberSet.ts +16 -12
  160. package/src/Model/Repository/ext.ts +18 -16
  161. package/src/Model/Repository/internal/internal.ts +80 -69
  162. package/src/Model/Repository/legacy.ts +9 -9
  163. package/src/Model/Repository/makeRepo.ts +5 -5
  164. package/src/Model/Repository/service.ts +12 -12
  165. package/src/Model/Repository/validation.ts +1 -1
  166. package/src/Model/query/dsl.ts +13 -13
  167. package/src/Model/query/new-kid-interpreter.ts +8 -8
  168. package/src/Operations.ts +17 -14
  169. package/src/OperationsRepo.ts +3 -4
  170. package/src/QueueMaker/SQLQueue.ts +86 -89
  171. package/src/QueueMaker/errors.ts +1 -1
  172. package/src/QueueMaker/memQueue.ts +90 -91
  173. package/src/QueueMaker/sbqueue.ts +90 -92
  174. package/src/RequestContext.ts +3 -3
  175. package/src/RequestFiberSet.ts +17 -15
  176. package/src/Store/ContextMapContainer.ts +4 -4
  177. package/src/Store/Cosmos.ts +20 -27
  178. package/src/Store/Disk.ts +13 -17
  179. package/src/Store/Memory.ts +28 -34
  180. package/src/Store/index.ts +1 -1
  181. package/src/Store/service.ts +4 -4
  182. package/src/Store/utils.ts +9 -5
  183. package/src/adapters/SQL/Model.ts +255 -268
  184. package/src/adapters/ServiceBus.ts +17 -20
  185. package/src/adapters/cosmos-client.ts +5 -5
  186. package/src/adapters/memQueue.ts +3 -3
  187. package/src/adapters/mongo-client.ts +5 -5
  188. package/src/adapters/redis-client.ts +25 -19
  189. package/src/api/ContextProvider.ts +24 -34
  190. package/src/api/codec.ts +1 -1
  191. package/src/api/internal/auth.ts +11 -13
  192. package/src/api/internal/events.ts +11 -11
  193. package/src/api/internal/health.ts +1 -1
  194. package/src/api/layerUtils.ts +20 -20
  195. package/src/api/middlewares.ts +0 -97
  196. package/src/api/reportError.ts +3 -3
  197. package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
  198. package/src/api/routing/middleware/middleware.ts +13 -25
  199. package/src/api/routing/schema/jwt.ts +9 -7
  200. package/src/api/routing/utils.ts +12 -10
  201. package/src/api/routing.ts +77 -79
  202. package/src/api/setupRequest.ts +9 -8
  203. package/src/arbs.ts +3 -3
  204. package/src/errorReporter.ts +12 -12
  205. package/src/logger/jsonLogger.ts +18 -17
  206. package/src/logger/logFmtLogger.ts +10 -12
  207. package/src/logger/shared.ts +6 -8
  208. package/src/rateLimit.ts +7 -7
  209. package/src/test.ts +7 -29
  210. package/test/contextProvider.test.ts +77 -70
  211. package/test/controller.test.ts +51 -39
  212. package/test/dist/contextProvider.test.d.ts.map +1 -1
  213. package/test/dist/controller.test.d.ts.map +1 -1
  214. package/test/dist/fixtures.d.ts +33 -81
  215. package/test/dist/fixtures.d.ts.map +1 -1
  216. package/test/dist/fixtures.js +9 -8
  217. package/test/dist/query.test.d.ts.map +1 -1
  218. package/test/dist/rawQuery.test.d.ts.map +1 -1
  219. package/test/dist/requires.test.d.ts.map +1 -1
  220. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  221. package/test/fixtures.ts +9 -7
  222. package/test/query.test.ts +49 -41
  223. package/test/rawQuery.test.ts +44 -40
  224. package/test/requires.test.ts +40 -31
  225. package/test/rpc-multi-middleware.test.ts +13 -14
  226. package/test/validateSample.test.ts +2 -2
  227. package/tsconfig.json +1 -25
  228. package/dist/api/internal/middlewares.d.ts +0 -15
  229. package/dist/api/internal/middlewares.d.ts.map +0 -1
  230. package/dist/api/internal/middlewares.js +0 -168
  231. package/src/api/internal/middlewares.ts +0 -279
@@ -1,279 +0,0 @@
1
- /**
2
- * Mechanism for extendning behaviour of all handlers on the server.
3
- *
4
- * @since 1.0.0
5
- */
6
- import * as crypto from "crypto"
7
-
8
- import { NotLoggedInError } from "@effect-app/infra/errors"
9
- import * as Middleware from "@effect/platform/HttpMiddleware"
10
- import * as HttpServerRequest from "@effect/platform/HttpServerRequest"
11
- import * as ServerResponse from "@effect/platform/HttpServerResponse"
12
- import { Effect } from "effect-app"
13
- import { HttpBody, HttpHeaders, HttpServerResponse } from "effect-app/http"
14
- import { dropUndefined } from "effect-app/utils"
15
- import * as Either from "effect/Either"
16
- import * as FiberRef from "effect/FiberRef"
17
- import { pipe } from "effect/Function"
18
- import * as HashMap from "effect/HashMap"
19
- import * as Metric from "effect/Metric"
20
- import { InfraLogger } from "../../logger.js"
21
- import type * as Middlewares from "../middlewares.js"
22
-
23
- export const accessLog = (level: "Info" | "Warning" | "Debug" = "Info") =>
24
- Middleware.make((app) =>
25
- pipe(
26
- HttpServerRequest.HttpServerRequest,
27
- Effect.flatMap((request) => Effect[`log${level}`](`${request.method} ${request.url}`)),
28
- Effect.flatMap(() => app)
29
- )
30
- )
31
-
32
- export const uuidLogAnnotation = (logAnnotationKey = "requestId") =>
33
- Middleware.make((app) =>
34
- pipe(
35
- Effect.sync(() => crypto.randomUUID()),
36
- Effect.flatMap((uuid) =>
37
- FiberRef.update(
38
- FiberRef.currentLogAnnotations,
39
- HashMap.set<string, unknown>(logAnnotationKey, uuid)
40
- )
41
- ),
42
- Effect.flatMap(() => app)
43
- )
44
- )
45
-
46
- export const endpointCallsMetric = () => {
47
- const endpointCalledCounter = Metric.counter("server.endpoint_calls")
48
-
49
- return Middleware.make((app) =>
50
- Effect.gen(function*() {
51
- const request = yield* (HttpServerRequest.HttpServerRequest)
52
-
53
- yield* pipe(
54
- Metric.increment(endpointCalledCounter),
55
- Effect.tagMetrics("path", request.url)
56
- )
57
-
58
- return yield* app
59
- })
60
- )
61
- }
62
-
63
- export const errorLog = Middleware.make((app) =>
64
- Effect.gen(function*() {
65
- const request = yield* HttpServerRequest.HttpServerRequest
66
-
67
- const response = yield* app
68
-
69
- if (response.status >= 400 && response.status < 500) {
70
- yield* InfraLogger.logWarning(
71
- `${request.method.toUpperCase()} ${request.url} client error ${response.status}`
72
- )
73
- } else if (response.status >= 500) {
74
- yield* InfraLogger.logError(
75
- `${request.method.toUpperCase()} ${request.url} server error ${response.status}`
76
- )
77
- }
78
-
79
- return response
80
- })
81
- )
82
-
83
- const toServerResponse = (err: NotLoggedInError) =>
84
- HttpServerResponse.empty().pipe(
85
- HttpServerResponse.setStatus(401),
86
- HttpServerResponse.setBody(HttpBody.unsafeJson({ message: err.message }))
87
- )
88
-
89
- export const basicAuth = <_, R>(
90
- checkCredentials: (
91
- credentials: Middlewares.BasicAuthCredentials
92
- ) => Effect.Effect<_, NotLoggedInError, R>,
93
- options?: Partial<{
94
- headerName: string
95
- skipPaths: readonly string[]
96
- }>
97
- ) =>
98
- Middleware.make((app) =>
99
- Effect.gen(function*() {
100
- const headerName = options?.headerName ?? "Authorization"
101
- const skippedPaths = options?.skipPaths ?? []
102
- const request = yield* HttpServerRequest.HttpServerRequest
103
-
104
- if (skippedPaths.includes(request.url)) {
105
- return yield* app
106
- }
107
-
108
- const authHeader = request.headers[headerName.toLowerCase()]
109
-
110
- if (authHeader === undefined) {
111
- return toServerResponse(
112
- new NotLoggedInError(
113
- `Expected header ${headerName}`
114
- )
115
- )
116
- }
117
-
118
- const authorizationParts = authHeader.split(" ")
119
-
120
- if (authorizationParts.length !== 2) {
121
- return toServerResponse(
122
- new NotLoggedInError(
123
- "Incorrect auhorization scheme. Expected \"Basic <credentials>\""
124
- )
125
- )
126
- }
127
-
128
- if (authorizationParts[0] !== "Basic") {
129
- return toServerResponse(
130
- new NotLoggedInError(
131
- `Incorrect auhorization type. Expected "Basic", got "${authorizationParts[0]}"`
132
- )
133
- )
134
- }
135
-
136
- const credentialsBuffer = Buffer.from(authorizationParts[1]!, "base64")
137
- const credentialsText = credentialsBuffer.toString("utf-8")
138
- const credentialsParts = credentialsText.split(":")
139
-
140
- if (credentialsParts.length !== 2) {
141
- return toServerResponse(
142
- new NotLoggedInError(
143
- "Incorrect basic auth credentials format. Expected base64 encoded \"<user>:<pass>\"."
144
- )
145
- )
146
- }
147
-
148
- const check = yield* Effect.either(checkCredentials({
149
- user: credentialsParts[0],
150
- password: credentialsParts[1]!
151
- }))
152
-
153
- if (Either.isLeft(check)) {
154
- return toServerResponse(check.left)
155
- }
156
-
157
- return yield* app
158
- })
159
- )
160
-
161
- export const cors = (_options?: Partial<Middlewares.CorsOptions>) => {
162
- const DEFAULTS = {
163
- allowedOrigins: ["*"],
164
- allowedMethods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"],
165
- allowedHeaders: [],
166
- exposedHeaders: [],
167
- credentials: false
168
- } as const
169
-
170
- const options = { ...DEFAULTS, ..._options }
171
-
172
- const isAllowedOrigin = (origin: string) => {
173
- return options.allowedOrigins.includes(origin)
174
- }
175
-
176
- const allowOrigin = (originHeader: string) => {
177
- if (options.allowedOrigins.includes("*")) {
178
- return { "Access-Control-Allow-Origin": "*" }
179
- }
180
-
181
- if (options.allowedOrigins.length === 0) {
182
- return { "Access-Control-Allow-Origin": "*" }
183
- }
184
-
185
- if (isAllowedOrigin(originHeader)) {
186
- return {
187
- "Access-Control-Allow-Origin": originHeader,
188
- Vary: "Origin"
189
- }
190
- }
191
-
192
- return undefined
193
- }
194
-
195
- const allowMethods = (() => {
196
- if (options.allowedMethods.length > 0) {
197
- return {
198
- "Access-Control-Allow-Methods": options.allowedMethods.join(", ")
199
- }
200
- }
201
-
202
- return undefined
203
- })()
204
-
205
- const allowCredentials = (() => {
206
- if (options.credentials) {
207
- return { "Access-Control-Allow-Credentials": "true" }
208
- }
209
-
210
- return undefined
211
- })()
212
-
213
- const allowHeaders = (accessControlRequestHeaders: string | undefined) => {
214
- if (!options.allowedOrigins) return undefined
215
-
216
- if (options.allowedHeaders.length === 0 && accessControlRequestHeaders) {
217
- return {
218
- Vary: "Access-Control-Request-Headers",
219
- "Access-Control-Allow-Headers": accessControlRequestHeaders
220
- }
221
- }
222
-
223
- if (options.allowedHeaders.length) {
224
- return {
225
- "Access-Control-Allow-Headers": options.allowedHeaders.join(",")
226
- }
227
- }
228
-
229
- return undefined
230
- }
231
-
232
- const exposeHeaders = (() => {
233
- if (options.exposedHeaders.length > 0) {
234
- return {
235
- "Access-Control-Expose-Headers": options.exposedHeaders.join(",")
236
- }
237
- }
238
-
239
- return undefined
240
- })()
241
-
242
- const maxAge = (() => {
243
- if (options.maxAge) {
244
- return { "Access-Control-Max-Age": options.maxAge.toString() }
245
- }
246
-
247
- return undefined
248
- })()
249
-
250
- return Middleware.make((app) =>
251
- Effect.gen(function*() {
252
- const request = yield* HttpServerRequest.HttpServerRequest
253
-
254
- const origin = request.headers["origin"]
255
- const accessControlRequestHeaders = request.headers["access-control-request-headers"]
256
-
257
- let corsHeaders = {
258
- ...allowOrigin(origin ?? ""),
259
- ...allowCredentials,
260
- ...exposeHeaders
261
- }
262
-
263
- if (request.method === "OPTIONS") {
264
- corsHeaders = {
265
- ...corsHeaders,
266
- ...allowMethods,
267
- ...allowHeaders(accessControlRequestHeaders),
268
- ...maxAge
269
- }
270
-
271
- return ServerResponse.empty({ status: 204, headers: HttpHeaders.fromInput(dropUndefined(corsHeaders)) })
272
- }
273
-
274
- const response = yield* app
275
-
276
- return response.pipe(ServerResponse.setHeaders(dropUndefined(corsHeaders)))
277
- })
278
- )
279
- }