@effect-app/infra 0.17.0 → 0.17.2
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.
- package/CHANGELOG.md +12 -0
- package/_cjs/api/routing.cjs +70 -64
- package/_cjs/api/routing.cjs.map +1 -1
- package/_cjs/api/setupRequest.cjs +22 -4
- package/_cjs/api/setupRequest.cjs.map +1 -1
- package/_cjs/services/QueueMaker/errors.cjs +54 -0
- package/_cjs/services/QueueMaker/errors.cjs.map +1 -0
- package/_cjs/services/QueueMaker/memQueue.cjs +79 -0
- package/_cjs/services/QueueMaker/memQueue.cjs.map +1 -0
- package/_cjs/services/QueueMaker/sbqueue.cjs +80 -0
- package/_cjs/services/QueueMaker/sbqueue.cjs.map +1 -0
- package/_cjs/services/QueueMaker/service.cjs +9 -0
- package/_cjs/services/QueueMaker/service.cjs.map +1 -0
- package/_src/_global.ext.ts +4 -0
- package/_src/api/routing.ts +36 -29
- package/_src/api/setupRequest.ts +19 -0
- package/_src/services/QueueMaker/errors.ts +48 -0
- package/_src/services/QueueMaker/memQueue.ts +102 -0
- package/_src/services/QueueMaker/sbqueue.ts +118 -0
- package/_src/services/QueueMaker/service.ts +14 -0
- package/dist/_global.ext.d.ts +4 -0
- package/dist/_global.ext.d.ts.map +1 -1
- package/dist/api/routing.d.ts +4 -1
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +73 -71
- package/dist/api/setupRequest.d.ts +5 -0
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +20 -3
- package/dist/services/QueueMaker/errors.d.ts +24 -0
- package/dist/services/QueueMaker/errors.d.ts.map +1 -0
- package/dist/services/QueueMaker/errors.js +37 -0
- package/dist/services/QueueMaker/memQueue.d.ts +25 -0
- package/dist/services/QueueMaker/memQueue.d.ts.map +1 -0
- package/dist/services/QueueMaker/memQueue.js +60 -0
- package/dist/services/QueueMaker/sbqueue.d.ts +31 -0
- package/dist/services/QueueMaker/sbqueue.d.ts.map +1 -0
- package/dist/services/QueueMaker/sbqueue.js +61 -0
- package/dist/services/QueueMaker/service.d.ts +15 -0
- package/dist/services/QueueMaker/service.d.ts.map +1 -0
- package/dist/services/QueueMaker/service.js +2 -0
- package/package.json +43 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbqueue.cjs","mappings":";;;;;;;;;;;;;;;;AAAA;AASA;AAGA;AAA8C;AAAA;AAG9C;;;AAGM,SAAUA,mBAAmB,CAQjCC,UAAkB,EAClBC,cAAsB,EACtBC,OAAyD,EACzDC,eAAwF,EACxFC,cAEuC,EACvCC,UAGmF;EAEnF,OAAOC,oBAAW,WAAUC,CAAC;IAC3B,MAAMC,CAAC,GAAG,OAAOD,CAAC,yBAACE,kBAAM,EAAQ;IACjC,MAAMC,QAAQ,GAAG,OAAOH,CAAC,yBAACI,oBAAQ,EAAQ;IAC1C,MAAMC,aAAa,GAAGC,8CAAQ,EAAWH,QAAQ,CAAC;IAElD,OAAO;MACLI,KAAK,EAAER,oBAAW,WAAUC,CAAC;QAC3B,MAAMQ,WAAW,GAAG,OAAOR,CAAC,CAACJ,eAAe,CAAC;QAC7C;QACA,SAASa,cAAc,CAACC,WAAgB;UACtC,oDAAOC,mJAAY,MAAMC,IAAI,CAACC,KAAK,CAACH,WAAW,CAAC,CAAC,EACtCI,CAAC,IAAIhB,UAAU,CAACgB,CAAC,CAAC,CAAC,GAEbC,MAAM,CAAC,EACb,CAAC;YAAEC,IAAI;YAAEC;UAAI,CAAE,KAOlBpB,cAAc,CACZqB,8BAAc,CAACC,OAAO,CAACF,IAAI,EAAE;YAC3BG,EAAE,EAAEJ,IAAI,CAACI,EAAE;YACXC,MAAM,EAAE,IAAa;YACrBC,IAAI,EAAEC,gCAAgB,CAACP,IAAI,CAACQ,IAAI;WACjC,CAAC,CACH,CAZLzB,uDAES0B,6BAAoB;YAAET,IAAI,uDAAEA,IAAI,EAAU;YAAEC,IAAI,uDAAEA,IAAI;UAAU,CAAE,CAAC,CAF5ElB,yBACY,OAAOL,cAAc,+BAA+B,CAAC,GAErDc,WAAW,CAACQ,IAAI,CAAC,CAAC,EACbD,MAAM,CAAC,CASrB,CACJ,EACqB,sBAAsB,CAAC;QAGjD;QAEA,OAAO,OAAOf,CAAC,CACbD,0DAAS,EAAC;UACRU,cAAc,EAAEK,CAAC,IAAGf,gCAACU,cAAc,CAACK,CAAC,CAACE,IAAI,CAAC,CAAgB;UAC3DU,YAAY,EAAEC,GAAG,IAAI5B,2BAAO,mCAAgB,EAAC4B,GAAG,CAACC,KAAK,CAAC;SACxD,CAAC,EACkBvB,aAAa,CAAC,CACnC;MACH,CAAC,CAAC;MAEFwB,OAAO,EAAE,CAAC,GAAGC,QAAQ,KACnB/B,oBAAW,WAAUC,CAAC;QACpB,MAAM+B,cAAc,GAAG,OAAO/B,CAAC,8CAA2B;QAC1D,OAAO,OAAOA,CAAC,uCACbD,wBAAe,MACbE,CAAC,CAAC+B,YAAY,CACZF,QAAQ,CAACG,GAAG,CAACnB,CAAC,KAAK;UACjBE,IAAI,EAAEJ,IAAI,CAACsB,SAAS,CAClBvC,OAAO,CAAC;YAAEqB,IAAI,EAAEF,CAAC;YAAEG,IAAI,EAAEc;UAAc,CAAE,CAAC,CAC3C;UACDI,SAAS,EAAErB,CAAC,CAACM,EAAE;UACfgB,WAAW,EAAE;SACd,CAAC,CAAC,CACJ,CACF,EAEF;MACH,CAAC;KAC6B;EACpC,CAAC,CAAC;AACJ;AAEA;;;AAGM,SAAUC,oBAAoB,CAACC,GAAW,EAAEC,SAAiB,EAAE7C,cAAsB;EACzF,+BACK8C,sBAAgC,0BAAU,EAACD,SAAS,CAAC,EAApD,4BAAY,EAAC7C,cAAc,CAAC,EAAyB,CADpD,oCAAoB,EAAC4C,GAAG,CAAC;AAElC;AAEA,SAASvB,MAAM,CAAI0B,KAAe;EAChC,OAAO1C,oBAAW,WAAUC,CAAC;IAC3B,MAAM+B,cAAc,GAAG,OAAO/B,CAAC,8CAA2B;IAC1D,OAAO,6BAAgB,EAACyC,KAAK,EAAE;MAAEV;IAAc,CAAE,CAAC;EACpD,CAAC,CAAC;AACJ","names":["makeServiceBusQueue","_queueName","queueDrainName","encoder","makeHandleEvent","provideContext","parseDrain","tsplus_module_1","$","s","Sender","receiver","Receiver","receiverLayer","tsplus_module_2","drain","handleEvent","processMessage","messageBody","tsplus_module_6","JSON","parse","x","report","body","meta","RequestContext","inherit","id","locale","name","tsplus_module_5","_tag","tsplus_module_4","processError","err","error","publish","messages","requestContext","sendMessages","map","stringify","messageId","contentType","makeServiceBusLayers","url","queueName","tsplus_module_9","cause"],"sourceRoot":"","sources":["../../../_src/services/QueueMaker/sbqueue.ts"],"sourcesContent":[null]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.cjs","mappings":";;;;;;AAaO,MAAMA,UAAU,GAAkB,EAAE;AAAA","names":["QueueMaker"],"sourceRoot":"","sources":["../../../_src/services/QueueMaker/service.ts"],"sourcesContent":[null]}
|
package/_src/_global.ext.ts
CHANGED
|
@@ -10,6 +10,10 @@ import type {} from "@effect-app/infra/services/Emailer/Sendgrid"
|
|
|
10
10
|
* @tsplus global
|
|
11
11
|
*/
|
|
12
12
|
import type {} from "@effect-app/infra/services/Operations/live"
|
|
13
|
+
/**
|
|
14
|
+
* @tsplus global
|
|
15
|
+
*/
|
|
16
|
+
import type {} from "@effect-app/infra/services/QueueMaker/errors"
|
|
13
17
|
/**
|
|
14
18
|
* @tsplus global
|
|
15
19
|
*/
|
package/_src/api/routing.ts
CHANGED
|
@@ -15,7 +15,11 @@ import { parseRequestParams } from "./express/schema/requestHandler.js"
|
|
|
15
15
|
import type { RouteDescriptorAny } from "./express/schema/routing.js"
|
|
16
16
|
import { makeRouteDescriptor } from "./express/schema/routing.js"
|
|
17
17
|
import { reportRequestError } from "./reportError.js"
|
|
18
|
-
import { snipString
|
|
18
|
+
import { snipString } from "./util.js"
|
|
19
|
+
|
|
20
|
+
export const RequestSettings = FiberRef.unsafeMake({
|
|
21
|
+
verbose: false
|
|
22
|
+
})
|
|
19
23
|
|
|
20
24
|
export function makeRequestParsers<
|
|
21
25
|
R,
|
|
@@ -247,20 +251,8 @@ export function makeRequestHandler<
|
|
|
247
251
|
path: req.params,
|
|
248
252
|
query: req.query,
|
|
249
253
|
body: req.body,
|
|
250
|
-
headers: req.headers
|
|
251
|
-
? Object.entries(req.headers).reduce((prev, [key, value]) => {
|
|
252
|
-
prev[key] = snipValue(value)
|
|
253
|
-
return prev
|
|
254
|
-
}, {} as Record<string, any>)
|
|
255
|
-
: req.headers,
|
|
254
|
+
headers: req.headers,
|
|
256
255
|
cookies: req.cookies
|
|
257
|
-
? Object.entries(req.cookies).reduce((prev, [key, value]) => {
|
|
258
|
-
prev[key] = typeof value === "string" || Array.isArray(value)
|
|
259
|
-
? snipValue(value)
|
|
260
|
-
: value
|
|
261
|
-
return prev
|
|
262
|
-
}, {} as Record<string, any>)
|
|
263
|
-
: req.cookies
|
|
264
256
|
}))
|
|
265
257
|
}
|
|
266
258
|
|
|
@@ -314,15 +306,23 @@ export function makeRequestHandler<
|
|
|
314
306
|
pars: getParams(req)
|
|
315
307
|
})
|
|
316
308
|
.flatMap(({ pars, requestContext }) =>
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
309
|
+
RequestSettings.get.flatMap(s =>
|
|
310
|
+
Effect.logInfo("Processing request").apply(
|
|
311
|
+
Effect.logAnnotates({
|
|
312
|
+
method: req.method,
|
|
313
|
+
path: req.originalUrl,
|
|
314
|
+
...s.verbose
|
|
315
|
+
? {
|
|
316
|
+
reqPath: pars.path.$$.pretty,
|
|
317
|
+
reqQuery: pars.query.$$.pretty,
|
|
318
|
+
reqBody: pretty(pars.body),
|
|
319
|
+
reqCookies: pretty(pars.cookies),
|
|
320
|
+
reqHeaders: pars.headers.$$.pretty
|
|
321
|
+
} :
|
|
322
|
+
undefined
|
|
323
|
+
})
|
|
324
|
+
)
|
|
325
|
+
).zipRight(
|
|
326
326
|
Effect.suspendSucceed(() => {
|
|
327
327
|
const handleRequest = parseRequest(req)
|
|
328
328
|
.map(({ body, path, query }) => {
|
|
@@ -370,6 +370,13 @@ export function makeRequestHandler<
|
|
|
370
370
|
method: req.method,
|
|
371
371
|
path: req.originalUrl,
|
|
372
372
|
statusCode: res.statusCode.toString(),
|
|
373
|
+
|
|
374
|
+
reqPath: pars.path.$$.pretty,
|
|
375
|
+
reqQuery: pars.query.$$.pretty,
|
|
376
|
+
reqBody: pretty(pars.body),
|
|
377
|
+
reqCookies: pretty(pars.cookies),
|
|
378
|
+
reqHeaders: pars.headers.$$.pretty,
|
|
379
|
+
|
|
373
380
|
resHeaders: Object.entries(headers).reduce((prev, [key, value]) => {
|
|
374
381
|
prev[key] = value && typeof value === "string" ? snipString(value) : value
|
|
375
382
|
return prev
|
|
@@ -381,17 +388,17 @@ export function makeRequestHandler<
|
|
|
381
388
|
.tapErrorCause(cause => Effect(() => console.error("Error occurred while reporting error", cause)))
|
|
382
389
|
)
|
|
383
390
|
.tap(() =>
|
|
384
|
-
|
|
391
|
+
RequestSettings.get.map(s => {
|
|
385
392
|
const headers = res.getHeaders()
|
|
386
393
|
return Effect.logInfo("Processed request").apply(Effect.logAnnotates({
|
|
387
394
|
method: req.method,
|
|
388
395
|
path: req.originalUrl,
|
|
389
396
|
statusCode: res.statusCode.toString(),
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
397
|
+
...s.verbose
|
|
398
|
+
? {
|
|
399
|
+
resHeaders: headers.$$.pretty
|
|
400
|
+
} :
|
|
401
|
+
undefined
|
|
395
402
|
}))
|
|
396
403
|
})
|
|
397
404
|
)
|
package/_src/api/setupRequest.ts
CHANGED
|
@@ -20,3 +20,22 @@ export function setupRequest<R, E, A>(self: Effect<R, E, A>, requestContext: Req
|
|
|
20
20
|
export function setupRequestFrom<R, E, A>(self: Effect<R, E, A>) {
|
|
21
21
|
return RequestContext.Tag.accessWithEffect(requestContext => self.setupRequest(requestContext))
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @tsplus fluent effect/io/Effect setupRequestFromWith
|
|
26
|
+
*/
|
|
27
|
+
export function setupReq3<R, E, A>(self: Effect<R, E, A>, name: string) {
|
|
28
|
+
return self
|
|
29
|
+
.setupRequestFrom
|
|
30
|
+
.provideService(RequestContext.Tag, makeInternalRequestContext(name))
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function makeInternalRequestContext(name: string) {
|
|
34
|
+
const id = StringId.make()
|
|
35
|
+
return new RequestContext({
|
|
36
|
+
id,
|
|
37
|
+
rootId: id,
|
|
38
|
+
locale: "en",
|
|
39
|
+
name: ReasonableString(name)
|
|
40
|
+
})
|
|
41
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { reportError } from "@effect-app/infra/errorReporter"
|
|
2
|
+
import { CauseException } from "@effect-app/infra/errors"
|
|
3
|
+
import { RequestContext } from "@effect-app/infra/RequestContext"
|
|
4
|
+
|
|
5
|
+
export class MessageException<E> extends CauseException<E> {
|
|
6
|
+
constructor(cause: Cause<E>) {
|
|
7
|
+
super(cause, "Message")
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class FatalQueueException<E> extends CauseException<E> {
|
|
12
|
+
constructor(cause: Cause<E>) {
|
|
13
|
+
super(cause, "Message")
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const reportQueueError_ = reportError(cause => new MessageException(cause))
|
|
18
|
+
|
|
19
|
+
export const reportQueueError = (cause: Cause<unknown>, context?: Record<string, unknown> | undefined) =>
|
|
20
|
+
RequestContext.Tag.accessWithEffect(requestContext =>
|
|
21
|
+
Effect(reportQueueError_(cause, { requestContext, ...context }))
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Forks the effect into a new fiber attached to the global scope. Because the
|
|
26
|
+
* new fiber is attached to the global scope, when the fiber executing the
|
|
27
|
+
* returned effect terminates, the forked fiber will continue running.
|
|
28
|
+
*
|
|
29
|
+
* Reports errors.
|
|
30
|
+
*
|
|
31
|
+
* @tsplus getter effect/io/Effect forkDaemonReportQueue
|
|
32
|
+
*/
|
|
33
|
+
export function forkDaemonReportQueue<R, E, A>(self: Effect<R, E, A>) {
|
|
34
|
+
return self.tapErrorCause(reportQueueError).fork.daemonChildren
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const reportFatalQueueError = reportError(
|
|
38
|
+
cause => new FatalQueueException(cause)
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
export function reportFailure(name: string) {
|
|
42
|
+
return <R, E, A>(self: Effect<R, E, A>) =>
|
|
43
|
+
self.exit.tap(exit =>
|
|
44
|
+
exit._tag === "Failure"
|
|
45
|
+
? reportFatalQueueError(exit.cause, { name })
|
|
46
|
+
: Effect.unit
|
|
47
|
+
)
|
|
48
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { MemQueue } from "@effect-app/infra-adapters/memQueue"
|
|
2
|
+
import { RequestContext } from "@effect-app/infra/RequestContext"
|
|
3
|
+
import type { CustomSchemaException } from "@effect-app/prelude/schema"
|
|
4
|
+
import { reportFailure, reportQueueError } from "./errors.js"
|
|
5
|
+
import type { QueueBase } from "./service.js"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @tsplus static QueueMaker.Ops makeMem
|
|
9
|
+
*/
|
|
10
|
+
export function makeMemQueue<DrainR, Evt, DrainEvt extends { id: StringId; _tag: string }, RContext, EvtE, DrainE>(
|
|
11
|
+
queueName: string,
|
|
12
|
+
queueDrainName: string,
|
|
13
|
+
encoder: (e: { body: Evt; meta: RequestContext }) => EvtE,
|
|
14
|
+
makeHandleEvent: Effect<DrainR, never, (ks: DrainEvt) => Effect<RContext, DrainE, void>>,
|
|
15
|
+
provideContext: (context: RequestContext) => <R, E, A>(
|
|
16
|
+
eff: Effect<RContext | R, E, A>
|
|
17
|
+
) => Effect<Exclude<R, RContext>, E, A>,
|
|
18
|
+
parseDrain: (
|
|
19
|
+
a: unknown,
|
|
20
|
+
env?: Parser.ParserEnv | undefined
|
|
21
|
+
) => Effect<never, CustomSchemaException, { body: DrainEvt; meta: RequestContext }>
|
|
22
|
+
) {
|
|
23
|
+
return Effect.gen(function*($) {
|
|
24
|
+
const mem = yield* $(MemQueue.access)
|
|
25
|
+
const q = yield* $(mem.getOrCreateQueue(queueName))
|
|
26
|
+
const qReply = yield* $(mem.getOrCreateQueue(queueDrainName))
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
publish: (...messages) =>
|
|
30
|
+
Effect.gen(function*($) {
|
|
31
|
+
const requestContext = yield* $(RequestContext.Tag.access)
|
|
32
|
+
return yield* $(
|
|
33
|
+
messages.forEachEffect(m =>
|
|
34
|
+
// we JSON encode, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
35
|
+
Effect(() =>
|
|
36
|
+
JSON.stringify(
|
|
37
|
+
encoder({ body: m, meta: requestContext })
|
|
38
|
+
)
|
|
39
|
+
)
|
|
40
|
+
// .tap((msg) => info("Publishing Mem Message: " + utils.inspect(msg)))
|
|
41
|
+
.flatMap(_ => q.offer(_))
|
|
42
|
+
.asUnit
|
|
43
|
+
)
|
|
44
|
+
.forkDaemonReportQueue
|
|
45
|
+
)
|
|
46
|
+
}),
|
|
47
|
+
drain: Effect.gen(function*($) {
|
|
48
|
+
const handleEvent = yield* $(makeHandleEvent)
|
|
49
|
+
const processMessage = (msg: string) =>
|
|
50
|
+
// we JSON parse, because that is what the wire also does, and it reveals holes in e.g unknown encoders (Date->String)
|
|
51
|
+
Effect(() => JSON.parse(msg))
|
|
52
|
+
.flatMap(parseDrain)
|
|
53
|
+
.orDie
|
|
54
|
+
.flatMap(({ body, meta }) =>
|
|
55
|
+
Effect
|
|
56
|
+
.logDebug(`$$ [${queueDrainName}] Processing incoming message`)
|
|
57
|
+
.apply(Effect.logAnnotates({ body: body.$$.pretty, meta: meta.$$.pretty }))
|
|
58
|
+
.zipRight(silence(handleEvent(body)))
|
|
59
|
+
.apply(
|
|
60
|
+
provideContext(
|
|
61
|
+
RequestContext.inherit(meta, {
|
|
62
|
+
id: body.id,
|
|
63
|
+
locale: "en" as const,
|
|
64
|
+
name: ReasonableString(body._tag)
|
|
65
|
+
})
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
return yield* $(
|
|
70
|
+
qReply.take()
|
|
71
|
+
.flatMap(x => processMessage(x).uninterruptible)
|
|
72
|
+
.forever
|
|
73
|
+
.apply(reportFailure("drain"))
|
|
74
|
+
.setupRequestFromWith("Queue.ReceiveMessage")
|
|
75
|
+
.forkScoped
|
|
76
|
+
)
|
|
77
|
+
})
|
|
78
|
+
} satisfies QueueBase<DrainR, Evt>
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// We want the Queue to continue processing even on errors per messages
|
|
83
|
+
// must make sure that the errors are processed/handled beforehand.
|
|
84
|
+
export function silence<R, E, A>(inp: Effect<R, E, A>) {
|
|
85
|
+
return inp.exit.flatMap(result =>
|
|
86
|
+
Effect.gen(function*($) {
|
|
87
|
+
const requestContext = yield* $(RequestContext.Tag.access)
|
|
88
|
+
return yield* $(
|
|
89
|
+
result.match(
|
|
90
|
+
cause => {
|
|
91
|
+
if (cause.isInterrupted()) {
|
|
92
|
+
return (cause as Cause<never>).failCause
|
|
93
|
+
}
|
|
94
|
+
reportQueueError(cause, { requestContext })
|
|
95
|
+
return Effect.unit
|
|
96
|
+
},
|
|
97
|
+
() => Effect.unit
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
|
+
})
|
|
101
|
+
)
|
|
102
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LiveReceiver,
|
|
3
|
+
LiveSender,
|
|
4
|
+
LiveServiceBusClient,
|
|
5
|
+
Receiver,
|
|
6
|
+
Sender,
|
|
7
|
+
subscribe
|
|
8
|
+
} from "@effect-app/infra-adapters/ServiceBus"
|
|
9
|
+
import type {} from "@azure/service-bus"
|
|
10
|
+
import { captureException } from "@effect-app/infra/errorReporter"
|
|
11
|
+
import { RequestContext } from "@effect-app/infra/RequestContext"
|
|
12
|
+
import type { CustomSchemaException } from "@effect-app/prelude/schema"
|
|
13
|
+
import { reportQueueError } from "./errors.js"
|
|
14
|
+
import type { QueueBase } from "./service.js"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @tsplus static QueueMaker.Ops makeServiceBus
|
|
18
|
+
*/
|
|
19
|
+
export function makeServiceBusQueue<
|
|
20
|
+
DrainR,
|
|
21
|
+
Evt extends { id: StringId; _tag: string },
|
|
22
|
+
DrainEvt extends { id: StringId; _tag: string },
|
|
23
|
+
RContext,
|
|
24
|
+
EvtE,
|
|
25
|
+
DrainE
|
|
26
|
+
>(
|
|
27
|
+
_queueName: string,
|
|
28
|
+
queueDrainName: string,
|
|
29
|
+
encoder: (e: { body: Evt; meta: RequestContext }) => EvtE,
|
|
30
|
+
makeHandleEvent: Effect<DrainR, never, (ks: DrainEvt) => Effect<RContext, DrainE, void>>,
|
|
31
|
+
provideContext: (context: RequestContext) => <R, E, A>(
|
|
32
|
+
eff: Effect<RContext | R, E, A>
|
|
33
|
+
) => Effect<Exclude<R, RContext>, E, A>,
|
|
34
|
+
parseDrain: (
|
|
35
|
+
a: unknown,
|
|
36
|
+
env?: Parser.ParserEnv | undefined
|
|
37
|
+
) => Effect<never, CustomSchemaException, { body: DrainEvt; meta: RequestContext }>
|
|
38
|
+
) {
|
|
39
|
+
return Effect.gen(function*($) {
|
|
40
|
+
const s = yield* $(Sender.access)
|
|
41
|
+
const receiver = yield* $(Receiver.access)
|
|
42
|
+
const receiverLayer = Receiver.makeLayer(receiver)
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
drain: Effect.gen(function*($) {
|
|
46
|
+
const handleEvent = yield* $(makeHandleEvent)
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
48
|
+
function processMessage(messageBody: any) {
|
|
49
|
+
return Effect.sync(() => JSON.parse(messageBody))
|
|
50
|
+
.flatMap(x => parseDrain(x))
|
|
51
|
+
.orDie
|
|
52
|
+
.tapErrorCause(report)
|
|
53
|
+
.flatMap(({ body, meta }) =>
|
|
54
|
+
Effect
|
|
55
|
+
.logDebug(`$$ [${queueDrainName}] Processing incoming message`)
|
|
56
|
+
.apply(Effect.logAnnotates({ body: body.$$.pretty, meta: meta.$$.pretty }))
|
|
57
|
+
.zipRight(handleEvent(body))
|
|
58
|
+
.tapErrorCause(report)
|
|
59
|
+
.apply(
|
|
60
|
+
provideContext(
|
|
61
|
+
RequestContext.inherit(meta, {
|
|
62
|
+
id: body.id,
|
|
63
|
+
locale: "en" as const,
|
|
64
|
+
name: ReasonableString(body._tag)
|
|
65
|
+
})
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
.setupRequestFromWith("Queue.ReceiveMessage")
|
|
70
|
+
.orDie
|
|
71
|
+
.asUnit
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return yield* $(
|
|
75
|
+
subscribe({
|
|
76
|
+
processMessage: x => processMessage(x.body).uninterruptible,
|
|
77
|
+
processError: err => Effect(captureException(err.error))
|
|
78
|
+
})
|
|
79
|
+
.provideSomeLayer(receiverLayer)
|
|
80
|
+
)
|
|
81
|
+
}),
|
|
82
|
+
|
|
83
|
+
publish: (...messages) =>
|
|
84
|
+
Effect.gen(function*($) {
|
|
85
|
+
const requestContext = yield* $(RequestContext.Tag.access)
|
|
86
|
+
return yield* $(
|
|
87
|
+
Effect.promise(() =>
|
|
88
|
+
s.sendMessages(
|
|
89
|
+
messages.map(x => ({
|
|
90
|
+
body: JSON.stringify(
|
|
91
|
+
encoder({ body: x, meta: requestContext })
|
|
92
|
+
),
|
|
93
|
+
messageId: x.id, /* correllationid: requestId */
|
|
94
|
+
contentType: "application/json"
|
|
95
|
+
}))
|
|
96
|
+
)
|
|
97
|
+
)
|
|
98
|
+
.forkDaemonReportQueue
|
|
99
|
+
)
|
|
100
|
+
})
|
|
101
|
+
} satisfies QueueBase<DrainR, Evt>
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @tsplus static QueueMaker.Ops makeServiceBusLayers
|
|
107
|
+
*/
|
|
108
|
+
export function makeServiceBusLayers(url: string, queueName: string, queueDrainName: string) {
|
|
109
|
+
return LiveServiceBusClient(url)
|
|
110
|
+
>> (LiveReceiver(queueDrainName) + LiveSender(queueName))
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function report<E>(cause: Cause<E>) {
|
|
114
|
+
return Effect.gen(function*($) {
|
|
115
|
+
const requestContext = yield* $(RequestContext.Tag.access)
|
|
116
|
+
return reportQueueError(cause, { requestContext })
|
|
117
|
+
})
|
|
118
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RequestContext } from "@effect-app/infra/RequestContext"
|
|
2
|
+
|
|
3
|
+
export interface QueueBase<RContext, Evt> {
|
|
4
|
+
drain: Effect<Scope | RContext, never, void>
|
|
5
|
+
publish: (
|
|
6
|
+
...messages: NonEmptyReadonlyArray<Evt>
|
|
7
|
+
) => Effect<RequestContext, never, void>
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @tsplus type QueueMaker.Ops
|
|
12
|
+
*/
|
|
13
|
+
export interface QueueMakerOps {}
|
|
14
|
+
export const QueueMaker: QueueMakerOps = {}
|
package/dist/_global.ext.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ import type {} from "@effect-app/infra/services/Emailer/Sendgrid";
|
|
|
10
10
|
* @tsplus global
|
|
11
11
|
*/
|
|
12
12
|
import type {} from "@effect-app/infra/services/Operations/live";
|
|
13
|
+
/**
|
|
14
|
+
* @tsplus global
|
|
15
|
+
*/
|
|
16
|
+
import type {} from "@effect-app/infra/services/QueueMaker/errors";
|
|
13
17
|
/**
|
|
14
18
|
* @tsplus global
|
|
15
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_global.ext.d.ts","sourceRoot":"","sources":["../_src/_global.ext.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,yCAAyC,CAAA;AAC7D;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6CAA6C,CAAA;AACjE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,4CAA4C,CAAA;AAChE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAClD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAClD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAExD;;GAEG;AACH,OAAO,EAAE,MAAM,mCAAmC,CAAA"}
|
|
1
|
+
{"version":3,"file":"_global.ext.d.ts","sourceRoot":"","sources":["../_src/_global.ext.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,yCAAyC,CAAA;AAC7D;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6CAA6C,CAAA;AACjE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,4CAA4C,CAAA;AAChE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,8CAA8C,CAAA;AAClE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAClD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAClD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AAEjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAExD;;GAEG;AACH,OAAO,EAAE,MAAM,mCAAmC,CAAA"}
|
package/dist/api/routing.d.ts
CHANGED
|
@@ -11,6 +11,9 @@ import { RequestContext } from "../RequestContext.js";
|
|
|
11
11
|
import type { SupportedErrors } from "./defaultErrorHandler.js";
|
|
12
12
|
import type { Encode, RequestHandler, RequestHandlerOptRes, RequestParsers } from "./express/schema/requestHandler.js";
|
|
13
13
|
import type { RouteDescriptorAny } from "./express/schema/routing.js";
|
|
14
|
+
export declare const RequestSettings: import("@effect/io/FiberRef").FiberRef<{
|
|
15
|
+
verbose: boolean;
|
|
16
|
+
}>;
|
|
14
17
|
export declare function makeRequestParsers<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA extends PathA & QueryA & BodyA, ResA, Errors>(Request: RequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, Errors>["Request"]): RequestParsers<PathA, CookieA, QueryA, BodyA, HeaderA>;
|
|
15
18
|
export type MakeMiddlewareContext<ResE, R2 = never, PR = never> = (req: express.Request, res: express.Response, context: RequestContext) => Effect<R2, ResE, Context<PR>>;
|
|
16
19
|
export type Middleware<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA extends PathA & QueryA & BodyA, ResA, ResE, R2 = never, PR = never> = (handler: RequestHandler<R, PathA, CookieA, QueryA, BodyA, HeaderA, ReqA, ResA, ResE>) => {
|
|
@@ -91,7 +94,7 @@ export interface ReqHandler<Req, R, E, Res, ReqSchema extends MO.SchemaAny, ResS
|
|
|
91
94
|
* })
|
|
92
95
|
* ```
|
|
93
96
|
*/
|
|
94
|
-
export declare function matchResource<TModules extends Record<string, Record<string, any>>>(mod: TModules): <THandlers extends { [K in keyof TModules]: (req: InstanceType<GetRequest<TModules[K]> extends infer T ? T extends GetRequest<TModules[K]> ? T extends new (...args: any[]) => any ? T : never : never : never>) => import("@effect/io/Effect").Effect<any, SupportedErrors, MO.ParsedShapeOf<Extr<GetResponse<TModules[K]>>>>; }>(handlers: THandlers) => { [K_1 in keyof TModules]: ReqHandler<InstanceType<GetRequest<TModules[K_1]> extends infer
|
|
97
|
+
export declare function matchResource<TModules extends Record<string, Record<string, any>>>(mod: TModules): <THandlers extends { [K in keyof TModules]: (req: InstanceType<GetRequest<TModules[K]> extends infer T ? T extends GetRequest<TModules[K]> ? T extends new (...args: any[]) => any ? T : never : never : never>) => import("@effect/io/Effect").Effect<any, SupportedErrors, MO.ParsedShapeOf<Extr<GetResponse<TModules[K]>>>>; }>(handlers: THandlers) => { [K_1 in keyof TModules]: ReqHandler<InstanceType<GetRequest<TModules[K_1]> extends infer T ? T extends GetRequest<TModules[K_1]> ? T extends new (...args: any[]) => any ? T : never : never : never>, _R<ReturnType<THandlers[K_1]>>, _E<ReturnType<THandlers[K_1]>>, MO.ParsedShapeOf<Extr<GetResponse<TModules[K_1]>>>, GetRequest<TModules[K_1]>, GetResponse<TModules[K_1]>, any>; };
|
|
95
98
|
export type ReqFromSchema<ReqSchema> = InstanceType<ReqSchema extends {
|
|
96
99
|
new (...args: any[]): any;
|
|
97
100
|
} ? ReqSchema : never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../_src/api/routing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../_src/api/routing.ts"],"names":[],"mappings":"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"}
|